diff --git a/Assets/Quiz/Animations/UC.meta b/Assets/Quiz/Animations/UC.meta new file mode 100644 index 0000000..fe3fe6f --- /dev/null +++ b/Assets/Quiz/Animations/UC.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8f9541893598e2543b4e954acd7f8193 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Animations/UC/Lower.anim b/Assets/Quiz/Animations/UC/Lower.anim new file mode 100644 index 0000000..7c1f6ee --- /dev/null +++ b/Assets/Quiz/Animations/UC/Lower.anim @@ -0,0 +1,525 @@ +%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: Lower + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 9.016666 + value: {x: 0, y: 180, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 11 + value: {x: 33.904, y: 180, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: TurretBase + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 13 + value: {x: 0, y: 360, z: -63.119} + inSlope: {x: 0, y: 0, z: -10.284192} + outSlope: {x: 0, y: 0, z: -10.284192} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33853412} + - serializedVersion: 3 + time: 18.016666 + value: {x: 0, y: 360, z: 7200} + inSlope: {x: 0, y: 0, z: 4094.8352} + outSlope: {x: 0, y: 0, z: 4094.8352} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.076140076} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: TurretBase/TurretBarrel + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: -21.12902, y: 7.55, z: -37.39493} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 8.016666 + value: {x: -21.12902, y: 4.207, z: -37.39493} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: + m_ScaleCurves: [] + m_FloatCurves: [] + 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: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1768606100 + attribute: 4 + script: {fileID: 0} + typeID: 4 + customType: 4 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 770234991 + attribute: 4 + script: {fileID: 0} + typeID: 4 + customType: 4 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 18.016666 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + 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: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -21.12902 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 8.016666 + value: -21.12902 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 7.55 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 8.016666 + value: 4.207 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -37.39493 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 8.016666 + value: -37.39493 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 9.016666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 11 + value: 33.904 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.x + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 9.016666 + value: 180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 11 + value: 180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.y + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 9.016666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 11 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.z + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 13 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 18.016666 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.x + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 13 + value: 360 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 18.016666 + value: 360 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.y + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 13 + value: -63.119 + inSlope: -10.284192 + outSlope: -10.284192 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33853412 + - serializedVersion: 3 + time: 18.016666 + value: 7200 + inSlope: 4094.8352 + outSlope: 4094.8352 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.076140076 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.z + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 16 + m_EulerEditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 0 + m_HasGenericRootTransform: 1 + m_HasMotionFloatCurves: 0 + m_Events: + - time: 0 + functionName: SendCustomEvent + data: PlayGunLower1 + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 9.016666 + functionName: SendCustomEvent + data: PlayGunLower2 + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 13.2 + functionName: SendCustomEvent + data: PlayGunSpinUp + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 17 + functionName: SendCustomEvent + data: PlaySteamBlast + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 diff --git a/Assets/Quiz/Animations/UC/Lower.anim.meta b/Assets/Quiz/Animations/UC/Lower.anim.meta new file mode 100644 index 0000000..f19f891 --- /dev/null +++ b/Assets/Quiz/Animations/UC/Lower.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1925426c99f982745b0fd8f57982003a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Animations/UC/Raise.anim b/Assets/Quiz/Animations/UC/Raise.anim new file mode 100644 index 0000000..83e072c --- /dev/null +++ b/Assets/Quiz/Animations/UC/Raise.anim @@ -0,0 +1,518 @@ +%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: Raise + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 3 + value: {x: 33.904, y: 180, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 5 + value: {x: 0, y: 180, z: 0} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: TurretBase + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: {x: 0, y: 360, z: 7200} + inSlope: {x: 0, y: 0, z: -11567.277} + outSlope: {x: 0, y: 0, z: -11567.277} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.076140076} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.11446829} + - serializedVersion: 3 + time: 2 + value: {x: 0, y: 360, z: -63.119} + inSlope: {x: 0, y: 0, z: -187.27513} + outSlope: {x: 0, y: 0, z: 40.216915} + tangentMode: 0 + weightedMode: 1 + inWeight: {x: 0.33333334, y: 0.33333334, z: 1} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33853412} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: TurretBase/TurretBarrel + m_PositionCurves: + - curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 6 + value: {x: -21.12902, y: 4.207, z: -37.39493} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + - serializedVersion: 3 + time: 14 + value: {x: -21.12902, y: 7.55, z: -37.39493} + inSlope: {x: 0, y: 0, z: 0} + outSlope: {x: 0, y: 0, z: 0} + tangentMode: 0 + weightedMode: 0 + inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334} + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + path: + m_ScaleCurves: [] + m_FloatCurves: [] + 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: 0 + attribute: 1 + script: {fileID: 0} + typeID: 4 + customType: 0 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 1768606100 + attribute: 4 + script: {fileID: 0} + typeID: 4 + customType: 4 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + - serializedVersion: 2 + path: 770234991 + attribute: 4 + script: {fileID: 0} + typeID: 4 + customType: 4 + isPPtrCurve: 0 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 14 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + 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: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 6 + value: -21.12902 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 14 + value: -21.12902 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.x + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 6 + value: 4.207 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 14 + value: 7.55 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.y + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 6 + value: -37.39493 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 14 + value: -37.39493 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalPosition.z + path: + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 3 + value: 33.904 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 5 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.x + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 3 + value: 180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 5 + value: 180 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.y + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 3 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 5 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 136 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.z + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 2 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.x + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 360 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 2 + value: 360 + inSlope: 0 + outSlope: 0 + tangentMode: 34 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.y + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 16 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 7200 + inSlope: -11567.277 + outSlope: -11567.277 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.076140076 + outWeight: 0.11446829 + - serializedVersion: 3 + time: 2 + value: -63.119 + inSlope: -187.27513 + outSlope: 40.216915 + tangentMode: 1 + weightedMode: 1 + inWeight: 1 + outWeight: 0.33853412 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: localEulerAnglesRaw.z + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 16 + m_EulerEditorCurves: + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: TurretBase + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.x + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.y + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 0 + - serializedVersion: 2 + curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + attribute: m_LocalEulerAngles.z + path: TurretBase/TurretBarrel + classID: 4 + script: {fileID: 0} + flags: 0 + m_HasGenericRootTransform: 1 + m_HasMotionFloatCurves: 0 + m_Events: + - time: 2 + functionName: SendCustomEvent + data: StopSteamBlast + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 3.0166667 + functionName: SendCustomEvent + data: PlayGunLower2 + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 + - time: 6.016667 + functionName: SendCustomEvent + data: PlayGunLower1 + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 diff --git a/Assets/Quiz/Animations/UC/Raise.anim.meta b/Assets/Quiz/Animations/UC/Raise.anim.meta new file mode 100644 index 0000000..b21a373 --- /dev/null +++ b/Assets/Quiz/Animations/UC/Raise.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2b93302913ef5a94aaa8100d822e17a8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Animations/UC/TurretArm.controller b/Assets/Quiz/Animations/UC/TurretArm.controller new file mode 100644 index 0000000..ea63ae0 --- /dev/null +++ b/Assets/Quiz/Animations/UC/TurretArm.controller @@ -0,0 +1,208 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1107 &-6565629782291031424 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 5314743410550942043} + m_Position: {x: 530, y: 110, z: 0} + - serializedVersion: 1 + m_State: {fileID: -5847248208355875261} + m_Position: {x: 280, y: 110, z: 0} + - serializedVersion: 1 + m_State: {fileID: -5585614577296819603} + m_Position: {x: 480, y: 220, 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: -5847248208355875261} +--- !u!1102 &-5847248208355875261 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: New State + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 2975449323635530732} + 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: 0} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-5585614577296819603 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Raise + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 3078138811863892414} + 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: 2b93302913ef5a94aaa8100d822e17a8, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-4172773625609228379 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -5585614577296819603} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.986124 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: TurretArm + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: StartGunLower + m_Type: 9 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -6565629782291031424} + 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!1101 &2975449323635530732 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: StartGunLower + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5314743410550942043} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 0 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &3078138811863892414 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -5847248208355875261} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.98214287 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &5314743410550942043 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Lower + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4172773625609228379} + 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: 1925426c99f982745b0fd8f57982003a, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Assets/Quiz/Animations/UC/TurretArm.controller.meta b/Assets/Quiz/Animations/UC/TurretArm.controller.meta new file mode 100644 index 0000000..d2f61f6 --- /dev/null +++ b/Assets/Quiz/Animations/UC/TurretArm.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fa0b5baa794724b4e98ac64450013638 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/SFX/Alarm1.ogg b/Assets/Quiz/Audio/SFX/Alarm1.ogg new file mode 100644 index 0000000..df94c8d Binary files /dev/null and b/Assets/Quiz/Audio/SFX/Alarm1.ogg differ diff --git a/Assets/Quiz/Audio/SFX/Alarm1.ogg.meta b/Assets/Quiz/Audio/SFX/Alarm1.ogg.meta new file mode 100644 index 0000000..3e08cfa --- /dev/null +++ b/Assets/Quiz/Audio/SFX/Alarm1.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 4b0ae256de1a30843a2ad8d4ea54d4cc +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/UC/GunLower1.ogg b/Assets/Quiz/Audio/UC/GunLower1.ogg new file mode 100644 index 0000000..3a5241c Binary files /dev/null and b/Assets/Quiz/Audio/UC/GunLower1.ogg differ diff --git a/Assets/Quiz/Audio/UC/GunLower1.ogg.meta b/Assets/Quiz/Audio/UC/GunLower1.ogg.meta new file mode 100644 index 0000000..53f2724 --- /dev/null +++ b/Assets/Quiz/Audio/UC/GunLower1.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: c538b7c238b16f14e9b89ca88c05cc6a +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/UC/GunLower2.ogg b/Assets/Quiz/Audio/UC/GunLower2.ogg new file mode 100644 index 0000000..8c4541f Binary files /dev/null and b/Assets/Quiz/Audio/UC/GunLower2.ogg differ diff --git a/Assets/Quiz/Audio/UC/GunLower2.ogg.meta b/Assets/Quiz/Audio/UC/GunLower2.ogg.meta new file mode 100644 index 0000000..e35d611 --- /dev/null +++ b/Assets/Quiz/Audio/UC/GunLower2.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 8b16f017db990654295fbc0f4c58935c +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/UC/GunRev.ogg b/Assets/Quiz/Audio/UC/GunRev.ogg new file mode 100644 index 0000000..f3ab69f Binary files /dev/null and b/Assets/Quiz/Audio/UC/GunRev.ogg differ diff --git a/Assets/Quiz/Audio/UC/GunRev.ogg.meta b/Assets/Quiz/Audio/UC/GunRev.ogg.meta new file mode 100644 index 0000000..9d0f403 --- /dev/null +++ b/Assets/Quiz/Audio/UC/GunRev.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 461afdcfdc292a84997e8417bbed3c09 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Audio/UC/SteamBlat.ogg b/Assets/Quiz/Audio/UC/SteamBlat.ogg new file mode 100644 index 0000000..4f807b8 Binary files /dev/null and b/Assets/Quiz/Audio/UC/SteamBlat.ogg differ diff --git a/Assets/Quiz/Audio/UC/SteamBlat.ogg.meta b/Assets/Quiz/Audio/UC/SteamBlat.ogg.meta new file mode 100644 index 0000000..7332005 --- /dev/null +++ b/Assets/Quiz/Audio/UC/SteamBlat.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: e1f55bc72a7596149b8ea53245b221dd +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/OptimizedShaders/WarningLight.meta b/Assets/Quiz/Materials/OptimizedShaders/WarningLight.meta new file mode 100644 index 0000000..4af7b21 --- /dev/null +++ b/Assets/Quiz/Materials/OptimizedShaders/WarningLight.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bfc5d2c75312db54c9abd557a40ea273 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/OptimizedShaders/WarningLight/Poiyomi Pro World.shader b/Assets/Quiz/Materials/OptimizedShaders/WarningLight/Poiyomi Pro World.shader new file mode 100644 index 0000000..40c4429 --- /dev/null +++ b/Assets/Quiz/Materials/OptimizedShaders/WarningLight/Poiyomi Pro World.shader @@ -0,0 +1,12790 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/840bcb10a024ade40964d286b99b9498" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_start_brdf (" Reflections & Specular--{reference_property:_MochieBRDF,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/reflections-and-specular},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(MOCHIE_PBR)]_MochieBRDF ("Enable", Float) = 0 + _MochieMetallicMultiplier ("Metallic", Range(0, 1)) = 0 + _MochieRoughnessMultiplier ("Smoothness", Range(0, 1)) = 1 + _MochieReflectionTint ("Reflection Tint--{reference_property:_MochieReflectionTintThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _MochieReflectionTintThemeIndex ("", Int) = 0 + _MochieSpecularTint ("Specular Tint--{reference_property:_MochieSpecularTintThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _MochieSpecularTintThemeIndex ("", Int) = 0 + [sRGBWarning][ThryRGBAPacker(R Metallic Map, G Smoothness Map, B Reflection Mask, A Specular Mask, linear, false)]_MochieMetallicMaps ("Packed Maps [Click to Expand]--{reference_properties:[_MochieMetallicMapsPan, _MochieMetallicMapsUV, _MochieMetallicMapsStochastic, _MochieMetallicMapsMetallicChannel, _MochieMetallicMapsRoughnessChannel, _MochieMetallicMapsReflectionMaskChannel, _MochieMetallicMapsSpecularMaskChannel, _MochieMetallicMapInvert, _MochieRoughnessMapInvert, _MochieReflectionMaskInvert, _MochieSpecularMaskInvert]}", 2D) = "white" { } + [HideInInspector][Vector2]_MochieMetallicMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)]_MochieMetallicMapsUV ("UV", Int) = 0 + [HideInInspector][ToggleUI]_MochieMetallicMapsStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsMetallicChannel ("Metallic Channel", Float) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsRoughnessChannel ("Smoothness Channel", Float) = 1 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsReflectionMaskChannel ("Reflection Mask Channel", Float) = 2 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3, White, 4)]_MochieMetallicMapsSpecularMaskChannel ("Specular Mask Channel", Float) = 3 + [HideInInspector][ToggleUI]_MochieMetallicMapInvert ("Invert Metallic", Float) = 0 + [HideInInspector][ToggleUI]_MochieRoughnessMapInvert ("Invert Smoothness", Float) = 0 + [HideInInspector][ToggleUI]_MochieReflectionMaskInvert ("Invert Reflection Mask", Float) = 0 + [HideInInspector][ToggleUI]_MochieSpecularMaskInvert ("Invert Specular Mask", Float) = 0 + [Space(10)] + _MochieReflectionStrength ("Reflection Visibility", Range(0, 1)) = 1 + _MochieSpecularStrength ("Specular Visibility", Range(0, 5)) = 1 + _RefSpecFresnelStrength ("Fresnel Strength", Range(0, 1)) = .5 + _SFExposureOcclusion ("Exposure Occlusion", Range(0, 1)) = 0 + [Space(10)] + [ThryTexture][NoScaleOffset]_MochieReflCube ("Cubemap", Cube) = "" { } + [ToggleUI]_MochieForceFallback ("Force Fallback", Int) = 0 + [HideInInspector] s_start_BRDFTPSMaskGroup ("TPS--{condition_showS:(_TPSPenetratorEnabled==1)}", Float) = 0 + [ThryToggleUI(true)] _BRDFTPSDepthEnabled (" TPS Depth Enabled", Float) = 0 + _BRDFTPSReflectionMaskStrength ("Reflection Mask Strength--{condition_showS:(_BRDFTPSDepthEnabled==1)}", Range(0, 1)) = 1 + _BRDFTPSSpecularMaskStrength ("Specular Mask Strength--{condition_showS:(_BRDFTPSDepthEnabled==1)}", Range(0, 1)) = 1 + [HideInInspector] s_end_BRDFTPSMaskGroup ("", Float) = 0 + [HideInInspector] s_start_ggxanisotropics(" Anisotropics--{reference_property:_GGXAnisotropics,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ThryToggle(GGX_ANISOTROPICS)]_GGXAnisotropics ("Enable", Float) = 0 + [sRGBWarning]_AnisotropyMap("Anisotropy Map--{reference_properties:[_AnisotropyMapPan, _AnisotropyMapUV, _AnisotropyMapChannel]}", 2D) = "bump" { } + [HideInInspector][Vector2]_AnisotropyMapPan("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AnisotropyMapUV ("UV", Int) = 0 + [HideInInspector][Enum(R, 0, G, 1, B, 2, A, 3)]_AnisotropyMapChannel ("Channel", Float) = 0 + _Anisotropy ("Anisotropy", Range(-1, 1)) = 0 + _ReflectionAnisotropicStretch("Reflection Stretch", Range(1, 5)) = 1 + _RoughnessAnisotropy("Roughness Anisotropy", Range(0, 1)) = 1 + [HideInInspector] s_end_ggxanisotropics ("", Float) = 0 + [HideInInspector] s_start_PBRSecondSpecular ("2nd Specular--{reference_property:_Specular2ndLayer,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ToggleUI]_Specular2ndLayer ("2nd Specular", Float) = 0 + _MochieSpecularStrength2 ("Visibility", Range(0, 5)) = 1 + _MochieRoughnessMultiplier2 ("Smoothness", Range(0, 1)) = 1 + [HideInInspector] s_end_PBRSecondSpecular ("Name", Float) = 0 + [HideInInspector] s_start_PBRSplitMaskSample ("Split Mask Sampling--{reference_property:_PBRSplitMaskSample,persistent_expand:true,default_expand:false}", Float) = 0 + [HideInInspector][ToggleUI]_PBRSplitMaskSample ("Split Mask Sampling", Float) = 0 + [VectorLabel(tX, tY, oX, oY)]_PBRMaskScaleTiling ("Tiling/Offset", Vector) = (1, 1, 0, 0) + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)]_MochieMetallicMasksUV ("UV", Int) = 0 + [ToggleUI]_PBRSplitMaskStochastic ("Stochastic Sampling", Float) = 0 + [Vector2]_MochieMetallicMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector] s_end_PBRSplitMaskSample ("Split Mask Sampling", Float) = 0 + [HideInInspector] s_start_brdfadvanced ("GSAA & Advanced Controls--{persistent_expand:true,default_expand:false}", Float) = 0 + [ToggleUI]_MochieLitFallback ("Lit Fallback", Float) = 1 + [ToggleUI]_IgnoreCastedShadows ("Ignore Casted Shadows", Float) = 0 + _PBRNormalSelect ("Pixel Normal Mix", Range(0, 1)) = 1 + [ThryToggleUI(true)]_MochieGSAAEnabled (" GSAA", Float) = 1 + _PoiGSAAVariance ("GSAA Variance--{condition_showS:(_MochieGSAAEnabled==1)}", Range(0, 1)) = 0.15 + _PoiGSAAThreshold ("GSAA Threshold--{condition_showS:(_MochieGSAAEnabled==1)}", Range(0, 1)) = 0.1 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieMetallicGlobalMask ("Metallic--{reference_property:_MochieMetallicGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieMetallicGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieSmoothnessGlobalMask ("Smoothness--{reference_property:_MochieSmoothnessGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieSmoothnessGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieReflectionStrengthGlobalMask ("Reflection Strength--{reference_property:_MochieReflectionStrengthGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieReflectionStrengthGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _MochieSpecularStrengthGlobalMask ("Specular Strength--{reference_property:_MochieSpecularStrengthGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _MochieSpecularStrengthGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_brdfadvanced ("", Float) = 0 + [HideInInspector] m_end_brdf ("", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + #ifdef MOCHIE_PBR + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + Texture2D _MochieMetallicMaps; + float _PBRMapsStochastic; + #endif + float4 _MochieMetallicMaps_ST; + float2 _MochieMetallicMapsPan; + float _MochieMetallicMapsUV; + float _MochieMetallicMapsStochastic; + float _MochieMetallicMapInvert; + float _MochieRoughnessMapInvert; + float _MochieReflectionMaskInvert; + float _MochieSpecularMaskInvert; + float _MochieMetallicMapsMetallicChannel; + float _MochieMetallicMapsRoughnessChannel; + float _MochieMetallicMapsReflectionMaskChannel; + float _MochieMetallicMapsSpecularMaskChannel; + float _PBRNormalSelect; + float _MochieReflectionTintThemeIndex; + float _MochieSpecularTintThemeIndex; + float _MochieRoughnessMultiplier; + float _MochieMetallicMultiplier; + float _MochieReflectionStrength; + float _MochieSpecularStrength; + float4 _MochieSpecularTint; + float4 _MochieReflectionTint; + float _MochieLitFallback; + float _IgnoreCastedShadows; + float _PBRSplitMaskSample; + float _PBRSplitMaskStochastic; + float4 _PBRMaskScaleTiling; + float _MochieMetallicMasksUV; + float4 _MochieMetallicMasksPan; + float _Specular2ndLayer; + float _MochieSpecularStrength2; + float _MochieRoughnessMultiplier2; + float _RefSpecFresnelStrength; + float _SFExposureOcclusion; + TextureCube _MochieReflCube; + float4 _MochieReflCube_HDR; + float _MochieForceFallback; + float _MochieGSAAEnabled; + float _PoiGSAAVariance; + float _PoiGSAAThreshold; + float _BRDFTPSReflectionMaskStrength; + float _BRDFTPSSpecularMaskStrength; + float _BRDFTPSDepthEnabled; + float _MochieMetallicGlobalMask; + float _MochieMetallicGlobalMaskBlendType; + float _MochieSmoothnessGlobalMask; + float _MochieSmoothnessGlobalMaskBlendType; + float _MochieReflectionStrengthGlobalMask; + float _MochieReflectionStrengthGlobalMaskBlendType; + float _MochieSpecularStrengthGlobalMask; + float _MochieSpecularStrengthGlobalMaskBlendType; + #endif + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #if defined(MOCHIE_PBR) || defined(POI_CLEARCOAT) + float GSAA_Filament(float3 worldNormal, float perceptualRoughness, float gsaaVariance, float gsaaThreshold) + { + float3 du = ddx(worldNormal); + float3 dv = ddy(worldNormal); + float variance = gsaaVariance * (dot(du, du) + dot(dv, dv)); + float roughness = perceptualRoughness * perceptualRoughness; + float kernelRoughness = min(2.0 * variance, gsaaThreshold); + float squareRoughness = saturate(roughness * roughness + kernelRoughness); + return sqrt(sqrt(squareRoughness)); + } + float3 GetWorldReflections(float3 reflDir, float3 worldPos, float roughness) + { + float3 baseReflDir = reflDir; + reflDir = BoxProjection(reflDir, worldPos, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); + float4 envSample0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflDir, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p0 = DecodeHDR(envSample0, unity_SpecCube0_HDR); + float interpolator = unity_SpecCube0_BoxMin.w; + + if (interpolator < 0.99999) + { + float3 refDirBlend = BoxProjection(baseReflDir, worldPos, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); + float4 envSample1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, refDirBlend, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p1 = DecodeHDR(envSample1, unity_SpecCube1_HDR); + p0 = lerp(p1, p0, interpolator); + } + return p0; + } + float3 GetReflections(in PoiCam poiCam, in PoiLight pl, in PoiMesh poiMesh, float roughness, float ForceFallback, float LightFallback, TextureCube reflectionCube, float4 hdrData, float3 reflectionDir) + { + float3 reflections = 0; + float3 lighting = pl.finalLighting; + if (ForceFallback == 0) + { + + if (SceneHasReflections()) + { + #ifdef UNITY_PASS_FORWARDBASE + reflections = GetWorldReflections(reflectionDir, poiMesh.worldPos.xyz, roughness); + #endif + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + reflections *= pl.occlusion; + return reflections; + } + float GetGGXTerm(float nDotL, float nDotV, float nDotH, float roughness) + { + float visibilityTerm = 0; + if (nDotL > 0) + { + float lambdaV = nDotL * (nDotV * (1 - roughness) + roughness); + float lambdaL = nDotV * (nDotL * (1 - roughness) + roughness); + visibilityTerm = 0.5f / (lambdaV + lambdaL + 1e-5f); + float a = nDotH * roughness; + float k = roughness / (1.0 - nDotH * nDotH + a * a+ 1e-5f); + float dotTerm = k * k * UNITY_INV_PI; + visibilityTerm *= dotTerm; + } + return visibilityTerm; + } + void GetSpecFresTerm(float nDotL, float nDotV, float nDotH, float lDotH, inout float3 specularTerm, inout float3 fresnelTerm, float3 specCol, float roughness) + { + specularTerm = GetGGXTerm(nDotL, nDotV, nDotH, roughness); + fresnelTerm = FresnelTerm(specCol, lDotH); + specularTerm = max(0, specularTerm * max(0.00001, nDotL)); + } + float GetRoughness(float smoothness) + { + float rough = 1 - smoothness; + rough *= 1.7 - 0.7 * rough; + return rough; + } + float SFVisibility(float brdfRoughness, float3 directColor, float NDotV, float ExposureOcclusion) + { + float Visibility = saturate(length(directColor + EPSILON) * (1.0/(ExposureOcclusion))); //Using direct color because I think it should be generally more forgiving + return saturate(pow(NDotV + Visibility, exp2(-16.0 * brdfRoughness - 1.0)) - 1.0 + Visibility); + } + #endif + #ifdef MOCHIE_PBR + void MetallicAndSpecularFragDataInit(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods) + { + float smoothness = 1.0; + float smoothness2 = 1.0; + float metallic = 0.0; + float specularMask = 1; + float reflectionMask = 1; + smoothness *= poiFragData.smoothness; + smoothness2 *= poiFragData.smoothness2; + metallic *= poiFragData.metallic; + specularMask *= poiFragData.specularMask; + reflectionMask *= poiFragData.reflectionMask; + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + float4 PBRMaps = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), 0.0); + + if (0.0) + { + float4 PBRSplitMask = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy, 0.0); + assignValueToVectorFromIndex(PBRMaps, 2.0, PBRSplitMask[2.0]); + assignValueToVectorFromIndex(PBRMaps, 3.0, PBRSplitMask[3.0]); + } + if (0.0 < 4) + { + metallic *= PBRMaps[0.0]; + } + if (1.0 < 4) + { + smoothness *= PBRMaps[1.0]; + smoothness2 *= PBRMaps[1.0]; + } + if (2.0 < 4) + { + reflectionMask *= PBRMaps[2.0]; + } + if (3.0 < 4) + { + specularMask *= PBRMaps[3.0]; + } + #endif + reflectionMask *= 1.0; + specularMask *= 1.0; + if (0.0) + { + metallic = 1 - metallic; + } + if (0.0) + { + smoothness = 1 - smoothness; + smoothness2 = 1 - smoothness2; + } + if (0.0) + { + reflectionMask = 1 - reflectionMask; + } + if (0.0) + { + specularMask = 1 - specularMask; + } + poiFragData.smoothness *= smoothness; + poiFragData.smoothness2 *= smoothness2; + poiFragData.metallic *= metallic; + poiFragData.specularMask *= specularMask; + poiFragData.reflectionMask *= reflectionMask; + } + void MochieBRDF(inout PoiFragData poiFragData, in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, inout PoiMods poiMods) + { + float smoothness = poiFragData.smoothness; + float smoothness2 = poiFragData.smoothness2; + float metallic = poiFragData.metallic; + float specularMask = poiFragData.specularMask; + float reflectionMask = poiFragData.reflectionMask; + if (0.0 > 0) + { + metallic = customBlend(metallic, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + smoothness = customBlend(smoothness, poiMods.globalMask[0.0 - 1], 2.0); + smoothness2 = customBlend(smoothness2, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + reflectionMask = customBlend(reflectionMask, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + specularMask = customBlend(specularMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef TPS_Penetrator + if (0.0) + { + reflectionMask = lerp(0, reflectionMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + specularMask = lerp(0, specularMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + } + #endif + float roughness = GetRoughness(smoothness); + float roughness2 = GetRoughness(smoothness2); + float3 specCol = lerp(unity_ColorSpaceDielectricSpec.rgb, poiFragData.baseColor, metallic); + float omr = unity_ColorSpaceDielectricSpec.a - metallic * unity_ColorSpaceDielectricSpec.a; + float percepRough = 1 - smoothness; + float percepRough2 = 1 - smoothness2; + + if (1.0) + { + float3 normals = lerp(poiMesh.normals[0], poiMesh.normals[1], 1.0); + percepRough = GSAA_Filament(normals, percepRough, 0.15, 0.1); + if (0.0 == 1 && 1.0 > 0) + { + percepRough2 = GSAA_Filament(normals, percepRough2, 0.15, 0.1); + } + } + float brdfRoughness = percepRough * percepRough; + brdfRoughness = max(brdfRoughness, 0.002); + float brdfRoughness2 = percepRough2 * percepRough2; + brdfRoughness2 = max(brdfRoughness2, 0.002); + float3 diffuse = poiFragData.baseColor; + float3 specular = 0; + float3 specular2 = 0; + float3 vSpecular = 0; + float3 vSpecular2 = 0; + float3 reflections = 0; + float3 environment = 0; + #if defined(POINT) || defined(SPOT) + float attenuation = lerp(poiLight.additiveShadow, 1, 0.0); + #else + float attenuation = min(poiLight.nDotLSaturated, lerp(poiLight.attenuation, 1, 0.0)); + #endif + float3 fresnelTerm = 1; + float3 specularTerm = 1; + float pbrNDotL = lerp(poiLight.vertexNDotL, poiLight.nDotL, 1.0); + float pbrNDotV = lerp(poiLight.vertexNDotV, poiLight.nDotV, 1.0); + float pbrNDotH = lerp(poiLight.vertexNDotH, poiLight.nDotH, 1.0); + float3 pbrReflectionDir = lerp(poiCam.vertexReflectionDir, poiCam.reflectionDir, 1.0); + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness); + specular = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness); + vSpecular += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion; + } + #endif + } + if (0.0 == 1) + { + float3 fresnelTerm = 1; + float3 specularTerm = 1; + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness2); + specular2 = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation * 1.0; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness2); + vSpecular2 += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * 1.0; + } + #endif + } + } + float surfaceReduction = (1.0 / (brdfRoughness * brdfRoughness + 1.0)); + float grazingTerm = saturate(smoothness + (1 - omr)); + float3 reflCol = GetReflections(poiCam, poiLight, poiMesh, roughness, 0.0, 1.0, _MochieReflCube, _MochieReflCube_HDR, pbrReflectionDir); + reflections = surfaceReduction * reflCol * FresnelLerp(specCol, specCol + lerp(specCol, 1, 0.5) * 0.5, pbrNDotV) * SFVisibility(brdfRoughness, poiLight.directColor, pbrNDotV, 0.0); + reflections *= poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + reflections *= reflectionMask; + diffuse = lerp(diffuse, diffuse * omr, reflectionMask); + environment = max(specular + vSpecular, specular2 + vSpecular2); + environment += reflections; + diffuse *= poiLight.finalLighting; + poiFragData.finalColor = diffuse; + poiLight.finalLightAdd += environment; + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #if defined(MOCHIE_PBR) + MetallicAndSpecularFragDataInit(poiFragData, poiMesh, poiMods); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #ifdef MOCHIE_PBR + MochieBRDF(poiFragData, poiCam, poiLight, poiMesh, poiMods); + #endif + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 0.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (9.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.01); + if (9.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + #ifdef MOCHIE_PBR + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + Texture2D _MochieMetallicMaps; + float _PBRMapsStochastic; + #endif + float4 _MochieMetallicMaps_ST; + float2 _MochieMetallicMapsPan; + float _MochieMetallicMapsUV; + float _MochieMetallicMapsStochastic; + float _MochieMetallicMapInvert; + float _MochieRoughnessMapInvert; + float _MochieReflectionMaskInvert; + float _MochieSpecularMaskInvert; + float _MochieMetallicMapsMetallicChannel; + float _MochieMetallicMapsRoughnessChannel; + float _MochieMetallicMapsReflectionMaskChannel; + float _MochieMetallicMapsSpecularMaskChannel; + float _PBRNormalSelect; + float _MochieReflectionTintThemeIndex; + float _MochieSpecularTintThemeIndex; + float _MochieRoughnessMultiplier; + float _MochieMetallicMultiplier; + float _MochieReflectionStrength; + float _MochieSpecularStrength; + float4 _MochieSpecularTint; + float4 _MochieReflectionTint; + float _MochieLitFallback; + float _IgnoreCastedShadows; + float _PBRSplitMaskSample; + float _PBRSplitMaskStochastic; + float4 _PBRMaskScaleTiling; + float _MochieMetallicMasksUV; + float4 _MochieMetallicMasksPan; + float _Specular2ndLayer; + float _MochieSpecularStrength2; + float _MochieRoughnessMultiplier2; + float _RefSpecFresnelStrength; + float _SFExposureOcclusion; + TextureCube _MochieReflCube; + float4 _MochieReflCube_HDR; + float _MochieForceFallback; + float _MochieGSAAEnabled; + float _PoiGSAAVariance; + float _PoiGSAAThreshold; + float _BRDFTPSReflectionMaskStrength; + float _BRDFTPSSpecularMaskStrength; + float _BRDFTPSDepthEnabled; + float _MochieMetallicGlobalMask; + float _MochieMetallicGlobalMaskBlendType; + float _MochieSmoothnessGlobalMask; + float _MochieSmoothnessGlobalMaskBlendType; + float _MochieReflectionStrengthGlobalMask; + float _MochieReflectionStrengthGlobalMaskBlendType; + float _MochieSpecularStrengthGlobalMask; + float _MochieSpecularStrengthGlobalMaskBlendType; + #endif + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + #if defined(MOCHIE_PBR) || defined(POI_CLEARCOAT) + float GSAA_Filament(float3 worldNormal, float perceptualRoughness, float gsaaVariance, float gsaaThreshold) + { + float3 du = ddx(worldNormal); + float3 dv = ddy(worldNormal); + float variance = gsaaVariance * (dot(du, du) + dot(dv, dv)); + float roughness = perceptualRoughness * perceptualRoughness; + float kernelRoughness = min(2.0 * variance, gsaaThreshold); + float squareRoughness = saturate(roughness * roughness + kernelRoughness); + return sqrt(sqrt(squareRoughness)); + } + float3 GetWorldReflections(float3 reflDir, float3 worldPos, float roughness) + { + float3 baseReflDir = reflDir; + reflDir = BoxProjection(reflDir, worldPos, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax); + float4 envSample0 = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, reflDir, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p0 = DecodeHDR(envSample0, unity_SpecCube0_HDR); + float interpolator = unity_SpecCube0_BoxMin.w; + + if (interpolator < 0.99999) + { + float3 refDirBlend = BoxProjection(baseReflDir, worldPos, unity_SpecCube1_ProbePosition, unity_SpecCube1_BoxMin, unity_SpecCube1_BoxMax); + float4 envSample1 = UNITY_SAMPLE_TEXCUBE_SAMPLER_LOD(unity_SpecCube1, unity_SpecCube0, refDirBlend, roughness * UNITY_SPECCUBE_LOD_STEPS); + float3 p1 = DecodeHDR(envSample1, unity_SpecCube1_HDR); + p0 = lerp(p1, p0, interpolator); + } + return p0; + } + float3 GetReflections(in PoiCam poiCam, in PoiLight pl, in PoiMesh poiMesh, float roughness, float ForceFallback, float LightFallback, TextureCube reflectionCube, float4 hdrData, float3 reflectionDir) + { + float3 reflections = 0; + float3 lighting = pl.finalLighting; + if (ForceFallback == 0) + { + + if (SceneHasReflections()) + { + #ifdef UNITY_PASS_FORWARDBASE + reflections = GetWorldReflections(reflectionDir, poiMesh.worldPos.xyz, roughness); + #endif + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + } + else + { + #ifdef UNITY_PASS_FORWARDBASE + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * lerp(1, pl.finalLighting, LightFallback); + #endif + #ifdef POI_PASS_ADD + if (LightFallback) + { + float mipLevel = roughness * UNITY_SPECCUBE_LOD_STEPS; + reflections = reflectionCube.SampleLevel(sampler_linear_clamp, reflectionDir, mipLevel); + reflections = DecodeHDR(float4(reflections, 1), hdrData) * pl.finalLighting; + } + #endif + } + reflections *= pl.occlusion; + return reflections; + } + float GetGGXTerm(float nDotL, float nDotV, float nDotH, float roughness) + { + float visibilityTerm = 0; + if (nDotL > 0) + { + float lambdaV = nDotL * (nDotV * (1 - roughness) + roughness); + float lambdaL = nDotV * (nDotL * (1 - roughness) + roughness); + visibilityTerm = 0.5f / (lambdaV + lambdaL + 1e-5f); + float a = nDotH * roughness; + float k = roughness / (1.0 - nDotH * nDotH + a * a+ 1e-5f); + float dotTerm = k * k * UNITY_INV_PI; + visibilityTerm *= dotTerm; + } + return visibilityTerm; + } + void GetSpecFresTerm(float nDotL, float nDotV, float nDotH, float lDotH, inout float3 specularTerm, inout float3 fresnelTerm, float3 specCol, float roughness) + { + specularTerm = GetGGXTerm(nDotL, nDotV, nDotH, roughness); + fresnelTerm = FresnelTerm(specCol, lDotH); + specularTerm = max(0, specularTerm * max(0.00001, nDotL)); + } + float GetRoughness(float smoothness) + { + float rough = 1 - smoothness; + rough *= 1.7 - 0.7 * rough; + return rough; + } + float SFVisibility(float brdfRoughness, float3 directColor, float NDotV, float ExposureOcclusion) + { + float Visibility = saturate(length(directColor + EPSILON) * (1.0/(ExposureOcclusion))); //Using direct color because I think it should be generally more forgiving + return saturate(pow(NDotV + Visibility, exp2(-16.0 * brdfRoughness - 1.0)) - 1.0 + Visibility); + } + #endif + #ifdef MOCHIE_PBR + void MetallicAndSpecularFragDataInit(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiMods poiMods) + { + float smoothness = 1.0; + float smoothness2 = 1.0; + float metallic = 0.0; + float specularMask = 1; + float reflectionMask = 1; + smoothness *= poiFragData.smoothness; + smoothness2 *= poiFragData.smoothness2; + metallic *= poiFragData.metallic; + specularMask *= poiFragData.specularMask; + reflectionMask *= poiFragData.reflectionMask; + #if defined(PROP_MOCHIEMETALLICMAPS) || !defined(OPTIMIZER_ENABLED) + float4 PBRMaps = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), 0.0); + + if (0.0) + { + float4 PBRSplitMask = POI2D_SAMPLER_PAN_STOCHASTIC(_MochieMetallicMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy, 0.0); + assignValueToVectorFromIndex(PBRMaps, 2.0, PBRSplitMask[2.0]); + assignValueToVectorFromIndex(PBRMaps, 3.0, PBRSplitMask[3.0]); + } + if (0.0 < 4) + { + metallic *= PBRMaps[0.0]; + } + if (1.0 < 4) + { + smoothness *= PBRMaps[1.0]; + smoothness2 *= PBRMaps[1.0]; + } + if (2.0 < 4) + { + reflectionMask *= PBRMaps[2.0]; + } + if (3.0 < 4) + { + specularMask *= PBRMaps[3.0]; + } + #endif + reflectionMask *= 1.0; + specularMask *= 1.0; + if (0.0) + { + metallic = 1 - metallic; + } + if (0.0) + { + smoothness = 1 - smoothness; + smoothness2 = 1 - smoothness2; + } + if (0.0) + { + reflectionMask = 1 - reflectionMask; + } + if (0.0) + { + specularMask = 1 - specularMask; + } + poiFragData.smoothness *= smoothness; + poiFragData.smoothness2 *= smoothness2; + poiFragData.metallic *= metallic; + poiFragData.specularMask *= specularMask; + poiFragData.reflectionMask *= reflectionMask; + } + void MochieBRDF(inout PoiFragData poiFragData, in PoiCam poiCam, inout PoiLight poiLight, in PoiMesh poiMesh, inout PoiMods poiMods) + { + float smoothness = poiFragData.smoothness; + float smoothness2 = poiFragData.smoothness2; + float metallic = poiFragData.metallic; + float specularMask = poiFragData.specularMask; + float reflectionMask = poiFragData.reflectionMask; + if (0.0 > 0) + { + metallic = customBlend(metallic, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + smoothness = customBlend(smoothness, poiMods.globalMask[0.0 - 1], 2.0); + smoothness2 = customBlend(smoothness2, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + reflectionMask = customBlend(reflectionMask, poiMods.globalMask[0.0 - 1], 2.0); + } + if (0.0 > 0) + { + specularMask = customBlend(specularMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef TPS_Penetrator + if (0.0) + { + reflectionMask = lerp(0, reflectionMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + specularMask = lerp(0, specularMask * TPSBufferedDepth(poiMesh.localPos, poiMesh.vertexColor), 1.0); + } + #endif + float roughness = GetRoughness(smoothness); + float roughness2 = GetRoughness(smoothness2); + float3 specCol = lerp(unity_ColorSpaceDielectricSpec.rgb, poiFragData.baseColor, metallic); + float omr = unity_ColorSpaceDielectricSpec.a - metallic * unity_ColorSpaceDielectricSpec.a; + float percepRough = 1 - smoothness; + float percepRough2 = 1 - smoothness2; + + if (1.0) + { + float3 normals = lerp(poiMesh.normals[0], poiMesh.normals[1], 1.0); + percepRough = GSAA_Filament(normals, percepRough, 0.15, 0.1); + if (0.0 == 1 && 1.0 > 0) + { + percepRough2 = GSAA_Filament(normals, percepRough2, 0.15, 0.1); + } + } + float brdfRoughness = percepRough * percepRough; + brdfRoughness = max(brdfRoughness, 0.002); + float brdfRoughness2 = percepRough2 * percepRough2; + brdfRoughness2 = max(brdfRoughness2, 0.002); + float3 diffuse = poiFragData.baseColor; + float3 specular = 0; + float3 specular2 = 0; + float3 vSpecular = 0; + float3 vSpecular2 = 0; + float3 reflections = 0; + float3 environment = 0; + #if defined(POINT) || defined(SPOT) + float attenuation = lerp(poiLight.additiveShadow, 1, 0.0); + #else + float attenuation = min(poiLight.nDotLSaturated, lerp(poiLight.attenuation, 1, 0.0)); + #endif + float3 fresnelTerm = 1; + float3 specularTerm = 1; + float pbrNDotL = lerp(poiLight.vertexNDotL, poiLight.nDotL, 1.0); + float pbrNDotV = lerp(poiLight.vertexNDotV, poiLight.nDotV, 1.0); + float pbrNDotH = lerp(poiLight.vertexNDotH, poiLight.nDotH, 1.0); + float3 pbrReflectionDir = lerp(poiCam.vertexReflectionDir, poiCam.reflectionDir, 1.0); + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness); + specular = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness); + vSpecular += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion; + } + #endif + } + if (0.0 == 1) + { + float3 fresnelTerm = 1; + float3 specularTerm = 1; + GetSpecFresTerm(pbrNDotL, pbrNDotV, pbrNDotH, poiLight.lDotH, specularTerm, fresnelTerm, specCol, brdfRoughness2); + specular2 = poiLight.directColor * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * attenuation * 1.0; + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + for (int index = 0; index < 4; index++) + { + fresnelTerm = 1; + specularTerm = 1; + float pbrVDotNL = lerp(poiLight.vertexVDotNL[index], poiLight.vDotNL[index], 1.0); + float pbrVDotNH = lerp(poiLight.vertexVDotNH[index], poiLight.vDotNH[index], 1.0); + GetSpecFresTerm(pbrVDotNL, pbrNDotV, pbrVDotNH, poiLight.vDotLH[index], specularTerm, fresnelTerm, specCol, brdfRoughness2); + vSpecular2 += poiLight.vColor[index] * specularTerm * fresnelTerm * specularMask * poiThemeColor(poiMods, float4(1,1,1,1), 0.0) * poiLight.occlusion * 1.0; + } + #endif + } + } + float surfaceReduction = (1.0 / (brdfRoughness * brdfRoughness + 1.0)); + float grazingTerm = saturate(smoothness + (1 - omr)); + float3 reflCol = GetReflections(poiCam, poiLight, poiMesh, roughness, 0.0, 1.0, _MochieReflCube, _MochieReflCube_HDR, pbrReflectionDir); + reflections = surfaceReduction * reflCol * FresnelLerp(specCol, specCol + lerp(specCol, 1, 0.5) * 0.5, pbrNDotV) * SFVisibility(brdfRoughness, poiLight.directColor, pbrNDotV, 0.0); + reflections *= poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + reflections *= reflectionMask; + diffuse = lerp(diffuse, diffuse * omr, reflectionMask); + environment = max(specular + vSpecular, specular2 + vSpecular2); + environment += reflections; + diffuse *= poiLight.finalLighting; + poiFragData.finalColor = diffuse; + poiLight.finalLightAdd += environment; + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #if defined(MOCHIE_PBR) + MetallicAndSpecularFragDataInit(poiFragData, poiMesh, poiMods); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #ifdef MOCHIE_PBR + MochieBRDF(poiFragData, poiCam, poiLight, poiMesh, poiMods); + #endif + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 0.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (9.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.01); + if (9.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (9.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 0.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (9.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.01); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define MOCHIE_PBR + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define PROP_MOCHIEMETALLICMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 0.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (9.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.01); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/OptimizedShaders/WarningLight/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/OptimizedShaders/WarningLight/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..80ffa96 --- /dev/null +++ b/Assets/Quiz/Materials/OptimizedShaders/WarningLight/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a77ee57d86877744b9bce1b6181f7aba +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/UC/GunTurret.mat b/Assets/Quiz/Materials/UC/GunTurret.mat new file mode 100644 index 0000000..716ce49 --- /dev/null +++ b/Assets/Quiz/Materials/UC/GunTurret.mat @@ -0,0 +1,3789 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: GunTurret + m_Shader: {fileID: 4800000, guid: d8c6e72afe44b50449702b2e6d19d2bd, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - PROP_LIGHTINGAOMAPS + - VIGNETTE_MASKED + - _LIGHTINGMODE_REALISTIC + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + AllLockedGUIDS: 6de578af1c253b9429e499e26a698144 + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT PROP_LIGHTINGAOMAPS VIGNETTE_MASKED + _LIGHTINGMODE_REALISTIC _RIM2STYLE_POIYOMI _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: Opaque + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__MochieMetallicMaps: e8291f76219d1c147bfbddcacb64d704 + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: f91deecf74361794e90d0a3e3371bb31, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 2800000, guid: 9f84994a45601c2419691869458f1207, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 245d598d0afeeec4abe88c9a2b31a95b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 1 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 1 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 0 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.5 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 0 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.1 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 0.5 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0 + - _DissolveToTextureUV: 0 + - _DissolveType: 1 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 0 + - _DstBlendAlpha: 10 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 0 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 6 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 0 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 0 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 0 + - _OutlineDstBlendAlpha: 0 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 1 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 1 + - m_mainCategory: 1 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 0 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 0 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 1 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 0 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 1 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 0 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 0 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 0 + - s_start_EdgeMenu: 0 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 0 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveEndPoint: {r: 0, g: 1, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/UC/GunTurret.mat.meta b/Assets/Quiz/Materials/UC/GunTurret.mat.meta new file mode 100644 index 0000000..b5957ac --- /dev/null +++ b/Assets/Quiz/Materials/UC/GunTurret.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6de578af1c253b9429e499e26a698144 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret.meta b/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret.meta new file mode 100644 index 0000000..7b36c96 --- /dev/null +++ b/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dff93652532abc44292173381cef1462 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret/Poiyomi Pro World.shader b/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret/Poiyomi Pro World.shader new file mode 100644 index 0000000..2edb0e6 --- /dev/null +++ b/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret/Poiyomi Pro World.shader @@ -0,0 +1,11996 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/6de578af1c253b9429e499e26a698144" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (0.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (0.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..ae5ff5f --- /dev/null +++ b/Assets/Quiz/Materials/UC/OptimizedShaders/GunTurret/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d8c6e72afe44b50449702b2e6d19d2bd +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm.meta b/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm.meta new file mode 100644 index 0000000..fdd3ab3 --- /dev/null +++ b/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62a97a03527a31040ab0df56dbd8b77c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm/Poiyomi Pro World.shader b/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm/Poiyomi Pro World.shader new file mode 100644 index 0000000..26be4b2 --- /dev/null +++ b/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm/Poiyomi Pro World.shader @@ -0,0 +1,11996 @@ +Shader "Hidden/Locked/.poiyomi/Poiyomi Pro World/487478f4e1c54324b8c767e8b689f6d4" +{ + Properties + { + [HideInInspector] shader_master_label ("Poiyomi 9.3.48", Float) = 0 + [HideInInspector] shader_is_using_thry_editor ("", Float) = 0 + [HideInInspector] shader_locale ("0db0b86376c3dca4b9a6828ef8615fe0", Float) = 0 + [HideInInspector] footer_website ("{texture:{name:icon-poilogo,height:24},action:{type:URL,data:https://www.poiyomi.com},hover:WEBSITE}", Float) = 0 + [HideInInspector] footer_discord ("{texture:{name:icon-discord,height:24},action:{type:URL,data:https://discord.gg/Ays52PY},hover:DISCORD}", Float) = 0 + [HideInInspector] footer_patreon ("{texture:{name:icon-patreon-new,height:24},action:{type:URL,data:https://www.patreon.com/poiyomi},hover:PATREON}", Float) = 0 + [HideInInspector] footer_youtube ("{texture:{name:icon-youtube,height:24},action:{type:URL,data:https://www.youtube.com/poiyomi},hover:YOUTUBE}", Float) = 0 + [HideInInspector] footer_github ("{texture:{name:icon-github,height:24},action:{type:URL,data:https://github.com/poiyomi/PoiyomiToonShader},hover:GITHUB}", Float) = 0 + [HideInInspector] footer_bluesky ("{texture:{name:icon-bluesky,height:24},action:{type:URL,data:https://bsky.app/profile/poiyomi.com},hover:BLUESKY}", Float) = 0 + [HideInInspector] footer_twitter ("{texture:{name:icon-twitter,height:24},action:{type:URL,data:https://x.com/poiyomi},hover:X}", Float) = 0 + [Header(POIYOMI SHADER UI FAILED TO LOAD)] + [Header(. This is caused by scripts failing to compile. It can be fixed.)] + [Header(. The inspector will look broken and will not work properly until fixed.)] + [Header(. Please check your console for script errors.)] + [Header(. You can filter by errors in the console window.)] + [Header(. Often the topmost error points to the erroring script.)] + [Space(30)][Header(Common Error Causes)] + [Header(. Installing multiple Poiyomi Shader packages)] + [Header(. Make sure to delete the Poiyomi shader folder before you update Poiyomi.)] + [Header(. If a package came with Poiyomi this is bad practice and can cause issues.)] + [Header(. Delete the package and import it without any Poiyomi components.)] + [Header(. Bad VRCSDK installation (e.g. Both VCC and Standalone))] + [Header(. Delete the VRCSDK Folder in Assets if you are using the VCC.)] + [Header(. Avoid using third party SDKs. They can cause incompatibility.)] + [Header(. Script Errors in other scripts)] + [Header(. Outdated tools or prefabs can cause this.)] + [Header(. Update things that are throwing errors or move them outside the project.)] + [Space(30)][Header(Visit Our Discord to Ask For Help)] + [Space(5)]_ShaderUIWarning0 (" → discord.gg/poiyomi ← We can help you get it fixed! --{condition_showS:(0==1)}", Int) = -0 + [Space(1400)][Header(POIYOMI SHADER UI FAILED TO LOAD)] + _ShaderUIWarning1 ("Please scroll up for more information! --{condition_showS:(0==1)}", Int) = -0 + [HideInInspector] _ForgotToLockMaterial (";;YOU_FORGOT_TO_LOCK_THIS_MATERIAL;", Int) = 1 + [ThryShaderOptimizerLockButton] _ShaderOptimizerEnabled ("", Int) = 1 + [HideInInspector] GeometryShader_Enabled("GEOMETRY SHADER ENABLED", Float) = 1 + [HideInInspector] Tessellation_Enabled("TESSELLATION ENABLED", Float) = 1 + [ThryWideEnum(Opaque, 0, Cutout, 1, TransClipping, 9, Fade, 2, Transparent, 3, Additive, 4, Soft Additive, 5, Multiplicative, 6, 2x Multiplicative, 7)]_Mode("Rendering Preset--{on_value_actions:[ + {value:0,actions:[{type:SET_PROPERTY,data:render_queue=2000},{type:SET_PROPERTY,data:_AlphaForceOpaque=1}, {type:SET_PROPERTY,data:render_type=Opaque}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=0}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:1,actions:[{type:SET_PROPERTY,data:render_queue=2450},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=.5}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:9,actions:[{type:SET_PROPERTY,data:render_queue=2460},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=TransparentCutout}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.01}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=1}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:2,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0.002}, {type:SET_PROPERTY,data:_SrcBlend=5}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=5}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=5}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:3,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=10}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=1}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=10}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:4,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=1}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=1}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=1}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:5,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=4}, {type:SET_PROPERTY,data:_DstBlend=1}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=4}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=4}, {type:SET_PROPERTY,data:_OutlineDstBlend=1}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:6,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=0}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=0}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]}, + {value:7,actions:[{type:SET_PROPERTY,data:render_queue=3000},{type:SET_PROPERTY,data:_AlphaForceOpaque=0}, {type:SET_PROPERTY,data:render_type=Transparent}, {type:SET_PROPERTY,data:_BlendOp=0}, {type:SET_PROPERTY,data:_BlendOpAlpha=4}, {type:SET_PROPERTY,data:_Cutoff=0}, {type:SET_PROPERTY,data:_SrcBlend=2}, {type:SET_PROPERTY,data:_DstBlend=3}, {type:SET_PROPERTY,data:_SrcBlendAlpha=1}, {type:SET_PROPERTY,data:_DstBlendAlpha=1}, {type:SET_PROPERTY,data:_AddSrcBlend=2}, {type:SET_PROPERTY,data:_AddDstBlend=1}, {type:SET_PROPERTY,data:_AddSrcBlendAlpha=0}, {type:SET_PROPERTY,data:_AddDstBlendAlpha=1}, {type:SET_PROPERTY,data:_AlphaToCoverage=0}, {type:SET_PROPERTY,data:_ZWrite=0}, {type:SET_PROPERTY,data:_ZTest=4}, {type:SET_PROPERTY,data:_AlphaPremultiply=0}, {type:SET_PROPERTY,data:_OutlineSrcBlend=2}, {type:SET_PROPERTY,data:_OutlineDstBlend=3}, {type:SET_PROPERTY,data:_OutlineSrcBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineDstBlendAlpha=1}, {type:SET_PROPERTY,data:_OutlineBlendOp=0}, {type:SET_PROPERTY,data:_OutlineBlendOpAlpha=4}]} + }]}]}", Int) = 0 + [HideInInspector] m_mainCategory ("Color & Normals--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/main},hover:Documentation}}", Float) = 0 + _Color ("Color & Alpha--{reference_property:_ColorThemeIndex}", Color) = (1, 1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _ColorThemeIndex ("", Int) = 0 + [sRGBWarning(true)]_MainTex ("Texture--{reference_properties:[_MainTexPan, _MainTexUV, _MainPixelMode, _MainTexStochastic, _MainIgnoreTexAlpha]}", 2D) = "white" { } + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _MainTexUV ("UV", Int) = 0 + [HideInInspector][Vector2]_MainTexPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ToggleUI]_MainPixelMode ("Pixel Mode", Float) = 0 + [HideInInspector][ToggleUI]_MainTexStochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector][ToggleUI]_MainIgnoreTexAlpha ("Ignore Alpha", Float) = 0 + [Normal]_BumpMap ("Normal Map--{reference_properties:[_BumpMapPan, _BumpMapUV, _BumpScale, _BumpMapStochastic]}", 2D) = "bump" { } + [HideInInspector][Vector2]_BumpMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _BumpMapUV ("UV", Int) = 0 + [HideInInspector]_BumpScale ("Intensity", Range(0, 10)) = 1 + [HideInInspector][ToggleUI]_BumpMapStochastic ("Stochastic Sampling", Float) = 0 + [sRGBWarning]_AlphaMask ("Alpha Map--{reference_properties:[_AlphaMaskPan, _AlphaMaskUV, _AlphaMaskInvert, _MainAlphaMaskMode, _AlphaMaskBlendStrength, _AlphaMaskValue], alts:[_AlphaMap]}", 2D) = "white" { } + [HideInInspector][Vector2]_AlphaMaskPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _AlphaMaskUV ("UV", Int) = 0 + [HideInInspector][ThryWideEnum(Off, 0, Replace, 1, Multiply, 2, Add, 3, Subtract, 4)]_MainAlphaMaskMode ("Blend Mode", Int) = 2 + [HideInInspector]_AlphaMaskBlendStrength ("Blend Strength", Float) = 1 + [HideInInspector]_AlphaMaskValue ("Blend Offset", Float) = 0 + [HideInInspector][ToggleUI]_AlphaMaskInvert ("Invert", Float) = 0 + _Cutoff ("Alpha Cutoff", Range(0, 1.001)) = 0.5 + [HideInInspector] m_start_Alpha ("Alpha Options--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/alpha-options},hover:Documentation}}", Float) = 0 + [ToggleUI]_AlphaForceOpaque ("Force Opaque", Float) = 1 + _AlphaMod ("Alpha Mod", Range(-1, 1)) = 0.0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _AlphaGlobalMask ("Global Mask--{reference_property:_AlphaGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _AlphaGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] m_end_Alpha ("Alpha Options", Float) = 0 + [HideInInspector] m_lightingCategory ("Shading", Float) = 0 + [HideInInspector] m_start_PoiLightData ("Light Data--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/light-data},hover:Documentation}}", Float) = 0 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingAOMaps ("AO Maps (expand)--{reference_properties:[_LightingAOMapsPan, _LightingAOMapsUV,_LightDataAOStrengthR,_LightDataAOStrengthG,_LightDataAOStrengthB,_LightDataAOStrengthA, _LightDataAOGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingAOMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingAOMapsUV ("UV", Int) = 0 + [HideInInspector]_LightDataAOStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightDataAOStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightDataAOStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataAOGlobalMaskR ("Global Mask--{reference_property:_LightDataAOGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataAOGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingDetailShadowMaps ("Shadow Map (expand)--{reference_properties:[_LightingDetailShadowMapsPan, _LightingDetailShadowMapsUV,_LightingDetailShadowStrengthR,_LightingDetailShadowStrengthG,_LightingDetailShadowStrengthB,_LightingDetailShadowStrengthA,_LightingAddDetailShadowStrengthR,_LightingAddDetailShadowStrengthG,_LightingAddDetailShadowStrengthB,_LightingAddDetailShadowStrengthA, _LightDataDetailShadowGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingDetailShadowMapsPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingDetailShadowMapsUV ("UV", Int) = 0 + [HideInInspector]_LightingDetailShadowStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingDetailShadowStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingDetailShadowStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthR ("Additive R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingAddDetailShadowStrengthG ("Additive G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthB ("Additive B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingAddDetailShadowStrengthA ("Additive A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataDetailShadowGlobalMaskR ("Global Mask--{reference_property:_LightDataDetailShadowGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataDetailShadowGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, B, A, Linear, false)]_LightingShadowMasks ("Shadow Masks (expand)--{reference_properties:[_LightingShadowMasksPan, _LightingShadowMasksUV,_LightingShadowMaskStrengthR,_LightingShadowMaskStrengthG,_LightingShadowMaskStrengthB,_LightingShadowMaskStrengthA, _LightDataShadowMaskGlobalMaskR]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightingShadowMasksPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightingShadowMasksUV ("UV", Int) = 0 + [HideInInspector]_LightingShadowMaskStrengthR ("R Strength", Range(0, 1)) = 1 + [HideInInspector]_LightingShadowMaskStrengthG ("G Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthB ("B Strength", Range(0, 1)) = 0 + [HideInInspector]_LightingShadowMaskStrengthA ("A Strength", Range(0, 1)) = 0 + [HideInInspector][ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _LightDataShadowMaskGlobalMaskR ("Global Mask--{reference_property:_LightDataShadowMaskGlobalMaskBlendTypeR}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _LightDataShadowMaskGlobalMaskBlendTypeR ("Blending", Range(0, 1)) = 2 + [HideInInspector] s_start_LightDataBasePass ("Base Pass (Directional & Baked Lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [Enum(Poi Custom, 0, Standard, 1, UTS2, 2, OpenLit(lil toon), 3)] _LightingColorMode ("Light Color Mode", Int) = 0 + [Enum(Poi Custom, 0, Normalized NDotL, 1, Saturated NDotL, 2, Casted Shadows Only, 3, SDF, 4)] _LightingMapMode ("Light Map Mode", Int) = 0 + [HideInInspector] s_start_LightDataSDF ("Signed Distance fields--{persistent_expand:true,default_expand:true, condition_showS:(_LightingMapMode==4)}", Float) = 1 + [TextureKeyword][sRGBWarning][ThryRGBAPacker(R, G, Nothing, Nothing, Linear, false)]_LightDataSDFMap ("SDF Map (expand)--{reference_properties:[_LightDataSDFMapPan, _LightDataSDFMapUV]}", 2D) = "white" { } + [HideInInspector][Vector2]_LightDataSDFMapPan ("Panning", Vector) = (0, 0, 0, 0) + [HideInInspector][ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8, Polar UV, 6, Distorted UV, 7, Matcap, 9)] _LightDataSDFMapUV ("UV", Int) = 0 + _LightDataSDFMapLOD ("LOD", Range(0, 1)) = 0 + _LightDataSDFBlendY ("Blend Y Direction", Range(0.001, 2)) = 1 + [HideInInspector] s_end_LightDataSDF ("Signed Distance fields", Float) = 1 + [Enum(Poi Custom, 0, Forced Local Direction, 1, Forced World Direction, 2, UTS2, 3, OpenLit(lil toon), 4, View Direction, 5)] _LightingDirectionMode ("Light Direction Mode", Int) = 0 + [Vector3]_LightngForcedDirection ("Forced Direction--{condition_showS:(_LightingDirectionMode==1 || _LightingDirectionMode==2)}", Vector) = (0, 0, 0) + _LightingViewDirOffsetPitch ("View Dir Offset Pitch--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + _LightingViewDirOffsetYaw ("View Dir Offset Yaw--{condition_showS:_LightingDirectionMode==5}", Range(-90, 90)) = 0 + [ToggleUI]_LightingForceColorEnabled ("Force Light Color", Float) = 0 + _LightingForcedColor ("Forced Color--{condition_showS:(_LightingForceColorEnabled==1), reference_property:_LightingForcedColorThemeIndex}", Color) = (1, 1, 1) + [HideInInspector][ThryWideEnum(Off, 0, Theme Color 0, 1, Theme Color 1, 2, Theme Color 2, 3, Theme Color 3, 4, ColorChord 0, 5, ColorChord 1, 6, ColorChord 2, 7, ColorChord 3, 8, AL Theme 0, 9, AL Theme 1, 10, AL Theme 2, 11, AL Theme 3, 12)] _LightingForcedColorThemeIndex ("", Int) = 0 + _Unlit_Intensity ("Unlit_Intensity--{condition_showS:(_LightingColorMode==2)}", Range(0.001, 4)) = 1 + [DoNotLock][ToggleUI]_LightingCapEnabled ("Limit Brightness", Float) = 1 + [DoNotLock]_LightingCap ("Max Brightness--{condition_showS:(_LightingCapEnabled==1)}", Range(0, 10)) = 1 + [DoNotLock]_LightingMinLightBrightness ("Min Brightness", Range(0, 1)) = 0 + _LightingIndirectUsesNormals ("Indirect Uses Normals--{condition_showS:(_LightingColorMode==0)}", Range(0, 1)) = 0 + _LightingCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 0 + [DoNotLock]_LightingMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + [ToggleUI]_LightingVertexLightingEnabled ("Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingMirrorVertexLightingEnabled ("Mirror Vertex lights (Non-Important)", Float) = 1 + [ToggleUI]_LightingEnableLightVolumes ("Light Volumes", Float) = 1 + [HideInInspector] s_end_LightDataBasePass ("Base Pass", Float) = 1 + [HideInInspector] s_start_LightDataAddPass ("Add Pass (Point & Spot lights)--{persistent_expand:true,default_expand:true}", Float) = 1 + [ToggleUI]_LightingAdditiveEnable ("Pixel lights (Important)", Float) = 1 + [ToggleUI]_DisableDirectionalInAdd ("Ignore Directional Lights--{condition_showS:(_LightingAdditiveEnable==1)}", Float) = 1 + [ToggleUI]_LightingAdditiveLimited ("Limit Brightness", Float) = 1 + _LightingAdditiveLimit ("Max Brightness--{condition_showS:(_LightingAdditiveLimited==1)}", Range(0, 10)) = 1 + _LightingAdditiveCastedShadows ("Receive Casted Shadows", Range(0, 1)) = 1 + _LightingAdditiveMonochromatic ("Grayscale Lighting", Range(0, 1)) = 0 + _LightingAdditivePassthrough ("Point Light Passthrough--{condition_showS:(_LightingAdditiveEnable==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_LightDataAddPass ("Add Pass", Float) = 1 + [HideInInspector] s_start_LightDataDebug ("Debug / Data Visualizations--{reference_property:_LightDataDebugEnabled,persistent_expand:true}", Float) = 0 + [HideInInspector][DoNotAnimate][ThryToggleUI(false)]_LightDataDebugEnabled ("Debug", Float) = 0 + [ThryWideEnum(Direct Color, 0, Indirect Color, 1, Light Map, 2, Attenuation, 3, N Dot L, 4, Half Dir, 5, Direction, 6, Add Color, 7, Add Attenuation, 8, Add Shadow, 9, Add N Dot L, 10)] _LightingDebugVisualize ("Visualize", Int) = 0 + [HideInInspector] s_end_LightDataDebug ("Debug", Float) = 0 + [HideInInspector] m_end_PoiLightData ("Light Data", Float) = 0 + [HideInInspector] m_start_bakedLighting ("Baked Lighting", Float) = 0 + _GIEmissionMultiplier ("GI Emission Multiplier", Float) = 1 + [HideInInspector] DSGI ("DSGI", Float) = 0 //add this property for double sided illumination settings to be shown + [HideInInspector] LightmapFlags ("Lightmap Flags", Float) = 0 //add this property for lightmap flags settings to be shown + [HideInInspector] m_end_bakedLighting ("Baked Lighting", Float) = 0 + [HideInInspector] m_start_PoiShading (" Shading--{reference_property:_ShadingEnabled,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/shading/main},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(VIGNETTE_MASKED)]_ShadingEnabled ("Enable Shading", Float) = 1 + [DoNotAnimate][KeywordEnum(TextureRamp, Multilayer Math, Wrapped, Skin, ShadeMap, Flat, Realistic, Cloth, SDF)] _LightingMode ("Lighting Type", Float) = 5 + _LightingShadowColor ("Shadow Tint--{condition_showS:(_LightingMode!=4 && _LightingMode!=1 && _LightingMode!=5)}", Color) = (1, 1, 1) + _ShadowStrength ("Shadow Strength--{condition_showS:(_LightingMode<=4 || _LightingMode==8)}", Range(0, 1)) = 1 + _LightingIgnoreAmbientColor ("Ignore Indirect Shadow Color--{condition_showS:(_LightingMode<=3 || _LightingMode==8)}", Range(0, 1)) = 1 + [Space(15)] + [HideInInspector] s_start_ShadingAddPass ("Add Pass (Point & Spot Lights)--{persistent_expand:true,default_expand:false}", Float) = 0 + [Enum(Realistic, 0, Toon, 1, Same as Base Pass, 3)] _LightingAdditiveType ("Lighting Type", Int) = 3 + _LightingAdditiveGradientStart ("Gradient Start--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = 0 + _LightingAdditiveGradientEnd ("Gradient End--{condition_showS:(_LightingAdditiveType==1)}", Range(0, 1)) = .5 + [HideInInspector] s_end_ShadingAddPass ("Add Pass", Float) = 0 + [HideInInspector] s_start_ShadingGlobalMask ("Global Masks--{persistent_expand:true,default_expand:false}", Float) = 0 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapApplyGlobalMaskIndex ("LightMap to Global Mask--{reference_property:_ShadingRampedLightMapApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapApplyGlobalMaskBlendType ("Blending", Int) = 2 + [ThryWideEnum(Off, 0, 1R, 1, 1G, 2, 1B, 3, 1A, 4, 2R, 5, 2G, 6, 2B, 7, 2A, 8, 3R, 9, 3G, 10, 3B, 11, 3A, 12, 4R, 13, 4G, 14, 4B, 15, 4A, 16)] _ShadingRampedLightMapInverseApplyGlobalMaskIndex ("Inversed LightMap to Global Mask--{reference_property:_ShadingRampedLightMapInverseApplyGlobalMaskBlendType}", Int) = 0 + [HideInInspector][ThryWideEnum(Add, 7, Subtract, 1, Multiply, 2, Divide, 3, Min, 4, Max, 5, Average, 6, Replace, 0)] _ShadingRampedLightMapInverseApplyGlobalMaskBlendType ("Blending", Int) = 2 + [HideInInspector] s_end_ShadingGlobalMask ("Global Masks", Float) = 0 + [HideInInspector] m_end_PoiShading ("Shading", Float) = 0 + [HideInInspector] m_OutlineCategory (" Outlines--{reference_property:_EnableOutlines,button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/outlines/main},hover:Documentation}}", Float) = 0 + [HideInInspector] m_specialFXCategory ("Special FX", Float) = 0 + [HideInInspector] m_vertexCategory ("Vertex Options", Float) = 0 + [HideInInspector] m_start_Uzumore (" View Clip Prevention (Uzumore)--{reference_property:_UzumoreCategoryToggle,button_author:{text:sigmal00,action:{type:URL,data:https://github.com/sigmal00},hover:GitHub}}, button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/vertex-options/view-clip-prevention},hover:Documentation}}", Float) = 0 + [HideInInspector][ThryToggle(POI_UZUMORE)] _UzumoreCategoryToggle (" View Clip Prevention (Uzumore)", Float) = 0 + [ToggleUI] _UzumoreEnabled ("Animation Toggle", Float) = 1 + _UzumoreAmount ("Push Amount (m)", Float) = 0.1 + _UzumoreBias ("Push Bias", Float) = 0.001 + [sRGBWarning]_UzumoreMask ("Push Mask (A)", 2D) = "white" { } + [ThryWideEnum(R, 0, G, 1, B, 2, A, 3)] _UzumoreMaskUV ("Push Mask Channel", Float) = 3 + [HideInInspector] m_end_Uzumore ("Camera Push Back", Float) = 0 + [HideInInspector] m_modifierCategory ("Global Modifiers & Data", Float) = 0 + [HideInInspector] m_start_PoiGlobalCategory ("Global Data and Masks", Float) = 0 + [HideInInspector] m_start_GlobalThemes ("Global Themes--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/color-and-normals/global-themes},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HDR]_GlobalThemeColor0 ("Theme Color 0", Color ) = (1, 1, 1, 1) + _GlobalThemeHue0 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed0 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation0 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue0 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor0 ("Theme Color 0", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HDR]_GlobalThemeColor1 ("Theme Color 1", Color ) = (1, 1, 1, 1) + _GlobalThemeHue1 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed1 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation1 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue1 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor1 ("Theme Color 1", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HDR]_GlobalThemeColor2 ("Theme Color 2", Color ) = (1, 1, 1, 1) + _GlobalThemeHue2 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed2 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation2 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue2 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor2 ("Theme Color 2", Float) = 0 + [HideInInspector] m_start_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HDR]_GlobalThemeColor3 ("Theme Color 3", Color ) = (1, 1, 1, 1) + _GlobalThemeHue3 ("Hue Adjust", Range( 0, 1)) = 0 + _GlobalThemeHueSpeed3 ("Hue Adjust Speed", Float ) = 0 + _GlobalThemeSaturation3 ("Saturation Adjust", Range(-1, 1)) = 0 + _GlobalThemeValue3 ("Value Adjust", Range(-1, 1)) = 0 + [HideInInspector] m_end_GlobalThemeColor3 ("Theme Color 3", Float) = 0 + [HideInInspector] m_end_GlobalThemes ("Global Themes", Float ) = 0 + [HideInInspector] m_start_GlobalMask ("Global Mask--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/global-masks},hover:Documentation}}", Float) = 0 + [HideInInspector] m_start_GlobalMaskModifiers ("Modifiers", Float) = 0 + [HideInInspector] m_end_GlobalMaskModifiers ("", Float) = 0 + [HideInInspector] m_end_GlobalMask ("Global Mask", Float) = 0 + [HideInInspector] m_end_PoiGlobalCategory ("Global Data and Masks ", Float) = 0 + [HideInInspector] m_start_PoiUVCategory ("UVs", Float) = 0 + [HideInInspector] m_start_Stochastic ("Stochastic Sampling--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/stochastic-sampling},hover:Documentation}}", Float) = 0 + [KeywordEnum(Deliot Heitz, Hextile, None)] _StochasticMode ("Sampling Mode", Float) = 0 + [HideInInspector] s_start_deliot ("Deliot Heitz--{persistent_expand:true,default_expand:false,condition_show:_StochasticMode==0}", Float) = 0 + _StochasticDeliotHeitzDensity ("Detiling Density", Range(0.1, 10)) = 1 + [HideInInspector] s_end_deliot ("Deliot Heitz", Float) = 0 + [HideInInspector] m_end_Stochastic ("Stochastic Sampling", Float) = 0 + [HideInInspector] m_start_uvLocalWorld ("Local World UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/local-world-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos0 ("Local X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3, VColor R, 4, VColor G, 5, VColor B, 6, VColor A, 7)] _UVModLocalPos1 ("Local Y", Int) = 1 + [Space(10)] + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos0 ("World X", Int) = 0 + [ThryWideEnum(X, 0, Y, 1, Z, 2, Zero, 3)] _UVModWorldPos1 ("World Y", Int) = 2 + [HideInInspector] m_end_uvLocalWorld ("Local World UV", Float) = 0 + [HideInInspector] m_start_uvPanosphere ("Panosphere UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/panosphere-uv},hover:Documentation}}", Float) = 0 + [ToggleUI] _StereoEnabled ("Stereo Enabled", Float) = 0 + [ToggleUI] _PanoUseBothEyes ("Perspective Correct (VR)", Float) = 1 + [HideInInspector] m_end_uvPanosphere ("Panosphere UV", Float) = 0 + [HideInInspector] m_start_uvPolar ("Polar UV--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/modifiers/uvs/polar-uv},hover:Documentation}}", Float) = 0 + [ThryWideEnum(UV0, 0, UV1, 1, UV2, 2, UV3, 3, Panosphere, 4, World Pos, 5, Local Pos, 8)] _PolarUV ("UV", Int) = 0 + [Vector2]_PolarCenter ("Center Coordinate", Vector) = (.5, .5, 0, 0) + _PolarRadialScale ("Radial Scale", Float) = 1 + _PolarLengthScale ("Length Scale", Float) = 1 + _PolarSpiralPower ("Spiral Power", Float) = 0 + [HideInInspector] m_end_uvPolar ("Polar UV", Float) = 0 + [HideInInspector] m_end_PoiUVCategory ("UVs ", Float) = 0 + [HideInInspector] m_start_PoiPostProcessingCategory ("Post Processing", Float) = 0 + [HideInInspector] m_start_PPAnimations ("PP Animations--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/post-processing/pp-animations},hover:Documentation}}", Float) = 0 + [Helpbox(1)] _PPHelp ("This section meant for real time adjustments through animations and not to be changed in unity", Int) = 0 + _PPLightingMultiplier ("Lighting Mulitplier", Float) = 1 + _PPLightingAddition ("Lighting Add", Float) = 0 + _PPEmissionMultiplier ("Emission Multiplier", Float) = 1 + _PPFinalColorMultiplier ("Final Color Multiplier", Float) = 1 + [HideInInspector] m_end_PPAnimations ("PP Animations ", Float) = 0 + [HideInInspector] m_end_PoiPostProcessingCategory ("Post Processing ", Float) = 0 + [HideInInspector] m_thirdpartyCategory ("Third Party", Float) = 0 + [HideInInspector] m_renderingCategory ("Rendering--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/main},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 + [DoNotAnimate][Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 4 + [DoNotAnimate][Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Int) = 1 + [DoNotAnimate][ThryMask(Thry.ColorMaskFlags)] _ColorMask ("Color Mask", Int) = 15 + [DoNotAnimate] _OffsetFactor ("Offset Factor", Float) = 0.0 + [DoNotAnimate] _OffsetUnits ("Offset Units", Float) = 0.0 + [DoNotAnimate][ToggleUI] _RenderingReduceClipDistance ("Reduce Clip Distance", Float) = 0 + [DoNotAnimate][ToggleUI] _ZClip ("Z Clip", Float) = 1 + [DoNotAnimate][ToggleUI] _IgnoreFog ("Ignore Fog", Float) = 0 + [DoNotAnimate][ToggleUI]_FlipBackfaceNormals ("Flip Backface Normals", Int) = 1 + [DoNotAnimate][HideInInspector] Instancing ("Instancing", Float) = 0 //add this property for instancing variants settings to be shown + [ToggleUI] _RenderingEarlyZEnabled ("Early Z", Float) = 0 + [HideInInspector] m_start_blending ("Blending--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/blending},hover:Documentation}}", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOp ("RGB Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("RGB Destination Blend", Int) = 0 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOp ("RGB Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlend ("RGB Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlend ("RGB Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_start_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [DoNotAnimate][Enum(Thry.BlendOp)] _BlendOpAlpha ("Alpha Blend Op", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha ("Alpha Source Blend", Int) = 1 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha ("Alpha Destination Blend", Int) = 10 + [DoNotAnimate][Space][ThryHeaderLabel(Additive Blending, 13)] + [DoNotAnimate][Enum(Thry.BlendOp)] _AddBlendOpAlpha ("Alpha Blend Op", Int) = 4 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddSrcBlendAlpha ("Alpha Source Blend", Int) = 0 + [DoNotAnimate][Enum(UnityEngine.Rendering.BlendMode)] _AddDstBlendAlpha ("Alpha Destination Blend", Int) = 1 + [DoNotAnimate][HideInInspector] m_end_alphaBlending ("Advanced Alpha Blending", Float) = 0 + [HideInInspector] m_end_blending ("Blending", Float) = 0 + [HideInInspector] m_start_StencilPassOptions ("Stencil--{button_help:{text:Tutorial,action:{type:URL,data:https://www.poiyomi.com/rendering/stencil},hover:Documentation}}", Float) = 0 + [ThryWideEnum(Simple, 0, Front Face vs Back Face, 1)] _StencilType ("Stencil Type", Float) = 0 + [IntRange] _StencilRef ("Stencil Reference Value", Range(0, 255)) = 0 + [IntRange] _StencilReadMask ("Stencil ReadMask Value", Range(0, 255)) = 255 + [IntRange] _StencilWriteMask ("Stencil WriteMask Value", Range(0, 255)) = 255 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilPassOp ("Stencil Pass Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFailOp ("Stencil Fail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilZFailOp ("Stencil ZFail Op--{condition_showS:(_StencilType==0)}", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilCompareFunction ("Stencil Compare Function--{condition_showS:(_StencilType==0)}", Float) = 8 + [HideInInspector] m_start_StencilPassBackOptions("Back--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp0 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackPassOp ("Back Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackFailOp ("Back Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilBackZFailOp ("Back ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilBackCompareFunction ("Back Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassBackOptions("Back", Float) = 0 + [HideInInspector] m_start_StencilPassFrontOptions("Front--{condition_showS:(_StencilType==1)}", Float) = 0 + [Helpbox(1)] _FFBFStencilHelp1 ("Front Face and Back Face Stencils only work when locked in due to Unity's Stencil managment", Int) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontPassOp ("Front Pass Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontFailOp ("Front Fail Op", Float) = 0 + [Enum(UnityEngine.Rendering.StencilOp)] _StencilFrontZFailOp ("Front ZFail Op", Float) = 0 + [Enum(UnityEngine.Rendering.CompareFunction)] _StencilFrontCompareFunction ("Front Compare Function", Float) = 8 + [HideInInspector] m_end_StencilPassFrontOptions("Front", Float) = 0 + [HideInInspector] m_end_StencilPassOptions ("Stencil", Float) = 0 + } + SubShader + { + Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "VRCFallback" = "Standard" } + Pass + { + Name "Base" + Tags { "LightMode" = "ForwardBase" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdbase + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_BASE + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + float _PPLightingMultiplier; + float _PPLightingAddition; + float _PPEmissionMultiplier; + float _PPFinalColorMultiplier; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + #ifdef UNITY_PASS_FORWARDBASE + poiFragData.emission = max(poiFragData.emission * 1.0, 0); + poiFragData.finalColor = max(poiFragData.finalColor * 1.0, 0); + #endif + if (0.0 == POI_MODE_OPAQUE) + { + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "Add" + Tags { "LightMode" = "ForwardAdd" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite Off + Cull Back + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_AddBlendOp], [_AddBlendOpAlpha] + Blend [_AddSrcBlend] [_AddDstBlend], [_AddSrcBlendAlpha] [_AddDstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_fwdadd_fullshadows + #pragma multi_compile_instancing + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_ADD + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + #if defined(PROP_LIGHTINGAOMAPS) + Texture2D _LightingAOMaps; + #endif + float4 _LightingAOMaps_ST; + float2 _LightingAOMapsPan; + float _LightingAOMapsUV; + float _LightDataAOStrengthR; + float _LightDataAOStrengthG; + float _LightDataAOStrengthB; + float _LightDataAOStrengthA; + float _LightDataAOGlobalMaskR; + float _LightDataAOGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + Texture2D _LightingDetailShadowMaps; + #endif + float4 _LightingDetailShadowMaps_ST; + float2 _LightingDetailShadowMapsPan; + float _LightingDetailShadowMapsUV; + float _LightingDetailShadowStrengthR; + float _LightingDetailShadowStrengthG; + float _LightingDetailShadowStrengthB; + float _LightingDetailShadowStrengthA; + float _LightingAddDetailShadowStrengthR; + float _LightingAddDetailShadowStrengthG; + float _LightingAddDetailShadowStrengthB; + float _LightingAddDetailShadowStrengthA; + float _LightDataDetailShadowGlobalMaskR; + float _LightDataDetailShadowGlobalMaskBlendTypeR; + #if defined(PROP_LIGHTINGSHADOWMASKS) + Texture2D _LightingShadowMasks; + #endif + float4 _LightingShadowMasks_ST; + float2 _LightingShadowMasksPan; + float _LightingShadowMasksUV; + float _LightingShadowMaskStrengthR; + float _LightingShadowMaskStrengthG; + float _LightingShadowMaskStrengthB; + float _LightingShadowMaskStrengthA; + float _LightDataShadowMaskGlobalMaskR; + float _LightDataShadowMaskGlobalMaskBlendTypeR; + float _Unlit_Intensity; + float _LightingColorMode; + float _LightingMapMode; + #if defined(PROP_LIGHTDATASDFMAP) + Texture2D _LightDataSDFMap; + float4 _LightDataSDFMap_ST; + float2 _LightDataSDFMapPan; + float _LightDataSDFMapUV; + float _LightDataSDFMapLOD; + float _LightDataSDFBlendY; + #endif + float _LightingDirectionMode; + float3 _LightngForcedDirection; + float _LightingViewDirOffsetPitch; + float _LightingViewDirOffsetYaw; + float _LightingIndirectUsesNormals; + float _LightingCapEnabled; + float _LightingCap; + float _LightingForceColorEnabled; + float3 _LightingForcedColor; + float _LightingForcedColorThemeIndex; + float _LightingCastedShadows; + float _LightingMonochromatic; + float _LightingMinLightBrightness; + float _LightingAdditiveEnable; + float _LightingAdditiveLimited; + float _LightingAdditiveLimit; + float _LightingAdditiveCastedShadows; + float _LightingAdditiveMonochromatic; + float _LightingAdditivePassthrough; + float _DisableDirectionalInAdd; + float _LightingVertexLightingEnabled; + float _LightingMirrorVertexLightingEnabled; + float _LightingEnableLightVolumes; + float _LightDataDebugEnabled; + float _LightingDebugVisualize; + uint _UdonForceSceneLighting; + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + float _ShadowStrength; + float _LightingIgnoreAmbientColor; + float3 _LightingShadowColor; + float _ShadingRampedLightMapApplyGlobalMaskIndex; + float _ShadingRampedLightMapApplyGlobalMaskBlendType; + float _ShadingRampedLightMapInverseApplyGlobalMaskIndex; + float _ShadingRampedLightMapInverseApplyGlobalMaskBlendType; + float _LightingAdditiveType; + float _LightingAdditiveGradientStart; + float _LightingAdditiveGradientEnd; + float _LightingAdditiveDetailStrength; + struct MatcapAudioLinkData + { + float matcapALEnabled; + float matcapALAlphaAddBand; + float4 matcapALAlphaAdd; + float matcapALEmissionAddBand; + float4 matcapALEmissionAdd; + float matcapALIntensityAddBand; + float4 matcapALIntensityAdd; + float matcapALChronoPanType; + float matcapALChronoPanBand; + float matcapALChronoPanSpeed; + }; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + #ifdef VIGNETTE_MASKED + #ifdef _LIGHTINGMODE_REALISTIC + #if defined(LIGHTMAP_ON) && defined(SHADOWS_SCREEN) + #if defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) + #define SUBTRACTIVE_LIGHTING 1 + #endif + #endif + float FadeShadows(float attenuation, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if HANDLE_SHADOWS_BLENDING_IN_GI || ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + #if ADDITIONAL_MASKED_DIRECTIONAL_SHADOWS + attenuation = poiLight.attenuation; + #endif + float viewZ = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float shadowFadeDistance = UnityComputeShadowFadeDistance(poiMesh.worldPos, viewZ); + float shadowFade = UnityComputeShadowFade(shadowFadeDistance); + float bakedAttenuation = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, shadowFade); + #endif + return attenuation; + } + void ApplySubtractiveLighting(inout UnityIndirect indirectLight, inout PoiLight poiLight, in PoiMesh poiMesh, in PoiCam poiCam) + { + #if SUBTRACTIVE_LIGHTING + poiLight.attenuation = FadeShadows(poiLight.attenuation, poiLight, poiMesh, poiCam); + float ndotl = saturate(dot(poiMesh.normals[0], _WorldSpaceLightPos0.xyz)); + float3 shadowedLightEstimate = ndotl * (1 - poiLight.attenuation) * _LightColor0.rgb; + float3 subtractedLight = indirectLight.diffuse - shadowedLightEstimate; + subtractedLight = max(subtractedLight, unity_ShadowColor.rgb); + subtractedLight = lerp(subtractedLight, indirectLight.diffuse, _LightShadowData.x); + indirectLight.diffuse = min(subtractedLight, indirectLight.diffuse); + #endif + } + UnityIndirect CreateIndirectLight(in PoiMesh poiMesh, in PoiCam poiCam, in PoiLight poiLight) + { + UnityIndirect indirectLight; + indirectLight.diffuse = 0; + indirectLight.specular = 0; + #if defined(LIGHTMAP_ON) + indirectLight.diffuse = DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, poiMesh.lightmapUV.xy)); + #if defined(DIRLIGHTMAP_COMBINED) + float4 lightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd, unity_Lightmap, poiMesh.lightmapUV.xy); + indirectLight.diffuse = DecodeDirectionalLightmap(indirectLight.diffuse, lightmapDirection, poiMesh.normals[1]); + #endif + ApplySubtractiveLighting(indirectLight, poiLight, poiMesh, poiCam); + #endif + #if defined(DYNAMICLIGHTMAP_ON) + float3 dynamicLightDiffuse = DecodeRealtimeLightmap( + UNITY_SAMPLE_TEX2D(unity_DynamicLightmap, poiMesh.lightmapUV.zw) + ); + #if defined(DIRLIGHTMAP_COMBINED) + float4 dynamicLightmapDirection = UNITY_SAMPLE_TEX2D_SAMPLER(unity_DynamicDirectionality, unity_DynamicLightmap, poiMesh.lightmapUV.zw); + indirectLight.diffuse += DecodeDirectionalLightmap(dynamicLightDiffuse, dynamicLightmapDirection, poiMesh.normals[1]); + #else + indirectLight.diffuse += dynamicLightDiffuse; + #endif + #endif + #if !defined(LIGHTMAP_ON) && !defined(DYNAMICLIGHTMAP_ON) + #if UNITY_LIGHT_PROBE_PROXY_VOLUME + if (unity_ProbeVolumeParams.x == 1) + { + indirectLight.diffuse = SHEvalLinearL0L1_SampleProbeVolume( + float4(poiMesh.normals[1], 1), poiMesh.worldPos + ); + indirectLight.diffuse = max(0, indirectLight.diffuse); + #if defined(UNITY_COLORSPACE_GAMMA) + indirectLight.diffuse = LinearToGammaSpace(indirectLight.diffuse); + #endif + } + else + { + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + } + #else + indirectLight.diffuse += max(0, PoiShadeSH9(float4(poiMesh.normals[1], 1))); + #endif + #endif + indirectLight.diffuse *= poiLight.occlusion; + return indirectLight; + } + #endif + float GetRemapMinValue(float scale, float offset) + { + return clamp(-offset / scale, -0.01f, 1.01f); // Remap min + } + float GetRemapMaxValue(float scale, float offset) + { + return clamp((1.0f - offset) / scale, -0.01f, 1.01f); // Remap Max + } + sampler2D_float unity_NHxRoughness; + half3 BRDF3_Direct(half3 diffColor, half3 specColor, half rlPow4, half smoothness) + { + half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp + half specular = tex2D(unity_NHxRoughness, half2(rlPow4, 1 - smoothness)).r * LUT_RANGE; + #if defined(_SPECULARHIGHLIGHTS_OFF) + specular = 0.0; + #endif + return diffColor + specular * specColor; + } + half3 BRDF3_Indirect(half3 diffColor, half3 specColor, UnityIndirect indirect, half grazingTerm, half fresnelTerm) + { + half3 c = indirect.diffuse * diffColor; + c += indirect.specular * lerp(specColor, grazingTerm, fresnelTerm); + return c; + } + half4 POI_BRDF_PBS(half3 diffColor, half3 specColor, half oneMinusReflectivity, half smoothness, float3 normal, float3 viewDir, UnityLight light, UnityIndirect gi) + { + float3 reflDir = reflect(viewDir, normal); + half nl = saturate(dot(normal, light.dir)); + half nv = saturate(dot(normal, viewDir)); + half2 rlPow4AndFresnelTerm = Pow4(float2(dot(reflDir, light.dir), 1 - nv)); // use R.L instead of N.H to save couple of instructions + half rlPow4 = rlPow4AndFresnelTerm.x; // power exponent must match kHorizontalWarpExp in NHxRoughness() function in GeneratedTextures.cpp + half fresnelTerm = rlPow4AndFresnelTerm.y; + half grazingTerm = saturate(smoothness + (1 - oneMinusReflectivity)); + half3 color = BRDF3_Direct(diffColor, specColor, rlPow4, smoothness); + color *= light.color * nl; + color += BRDF3_Indirect(diffColor, specColor, gi, grazingTerm, fresnelTerm); + return half4(color, 1); + } + void calculateShading(inout PoiLight poiLight, inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam) + { + float shadowAttenuation = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + float attenuation = 1; + #if defined(POINT) || defined(SPOT) + shadowAttenuation = lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + #ifdef POI_PASS_ADD + if (3.0 == 3) + { + #if defined(POINT) || defined(SPOT) + #if defined(_LIGHTINGMODE_REALISTIC) || defined(_LIGHTINGMODE_CLOTH) || defined(_LIGHTINGMODE_WRAPPED) + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + #endif + #endif + } + if (3.0 == 0) + { + poiLight.rampedLightMap = max(0, poiLight.nDotL); + poiLight.finalLighting = poiLight.directColor * attenuation * max(0, poiLight.nDotL) * poiLight.detailShadow * shadowAttenuation; + return; + } + if (3.0 == 1) + { + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + float passthrough = 0; + #else + float passthrough = 0.5; + #endif + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + poiLight.rampedLightMap = smoothstep(ToonAddGradient.y, ToonAddGradient.x, 1 - (.5 * poiLight.nDotL + .5)); + #if defined(POINT) || defined(SPOT) + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.additiveShadow, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #else + poiLight.finalLighting = lerp(poiLight.directColor * max(min(poiLight.attenuation, poiLight.detailShadow), passthrough), poiLight.indirectColor, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.nDotL + .5))); + #endif + return; + } + #endif + float shadowStrength = 1.0 * poiLight.shadowMask; + #ifdef POI_PASS_OUTLINE + shadowStrength = lerp(0, shadowStrength, 0.0); + #endif + #ifdef _LIGHTINGMODE_REALISTIC + UnityLight light; + light.dir = poiLight.direction; + light.color = max(0, _LightColor0.rgb) * saturate(shadowAttenuation * attenuation * poiLight.detailShadow); + light.ndotl = poiLight.nDotLSaturated; + UnityIndirect indirectLight = (UnityIndirect)0; + #ifdef UNITY_PASS_FORWARDBASE + indirectLight = CreateIndirectLight(poiMesh, poiCam, poiLight); + #endif + #ifdef UNITY_PASS_FORWARDBASE + light.color = max(light.color * 1.0, 0); + light.color = max(light.color + 0.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse * 1.0, 0); + indirectLight.diffuse = max(indirectLight.diffuse + 0.0, 0); + #endif + poiLight.rampedLightMap = poiLight.nDotLSaturated; + poiLight.finalLighting = max(POI_BRDF_PBS(1, 0, 0, 0, poiMesh.normals[1], poiCam.viewDir, light, indirectLight).xyz, _LightingMinLightBrightness); + #ifdef UNITY_PASS_FORWARDBASE + if (_UdonLightVolumeEnabled && 1.0) + { + float3 L0 = 0; + float3 L1r = 0; + float3 L1g = 0; + float3 L1b = 0; + #ifdef LIGHTMAP_ON + LightVolumeAdditiveSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + poiLight.finalLighting += clamp(LightVolumeEvaluate(poiMesh.normals[1], L0, L1r, L1g, L1b), _LightingMinLightBrightness, _LightingCap); + #endif + } + #endif + #endif + if (poiFragData.toggleVertexLights) + { + #if defined(VERTEXLIGHT_ON) + float3 vertexLighting = float3(0, 0, 0); + for (int index = 0; index < 4; index++) + { + float lightingMode = 3.0; + if (lightingMode == 3) + { + #if defined(_LIGHTINGMODE_REALISTIC) + lightingMode = 0; + #else + lightingMode = 1; + #endif + } + if (lightingMode == 0) + { + vertexLighting = max(vertexLighting, poiLight.vColor[index] * poiLight.vSaturatedDotNL[index] * poiLight.detailShadow); // Realistic + } + if (lightingMode == 1) + { + float2 ToonAddGradient = float2(0.0, 0.5); + if (ToonAddGradient.x == ToonAddGradient.y) ToonAddGradient.y += 0.0001; + vertexLighting = max(vertexLighting, lerp(poiLight.vColor[index], poiLight.vColor[index] * 0.5, smoothstep(ToonAddGradient.x, ToonAddGradient.y, 1 - (.5 * poiLight.vDotNL[index] + .5))) * poiLight.detailShadow); + } + } + float3 mixedLight = poiLight.finalLighting; + poiLight.finalLighting = max(vertexLighting, poiLight.finalLighting); + #endif + } + } + #endif + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + if (_UdonForceSceneLighting) + { + _LightingMinLightBrightness = 0; + _LightingCapEnabled = 0; + _LightingMonochromatic = 0; + } + poiLight.finalLightAdd = 0; + #ifdef UNITY_PASS_FORWARDBASE + float3 L0 = float3(0, 0, 0); + float3 L1r = float3(0, 0, 0); + float3 L1g = float3(0, 0, 0); + float3 L1b = float3(0, 0, 0); + if (_UdonLightVolumeEnabled && 1.0) + { + LightVolumeSH(poiMesh.worldPos, L0, L1r, L1g, L1b); + PoiSHAr = float4(L1r, L0.r); + PoiSHAg = float4(L1g, L0.g); + PoiSHAb = float4(L1b, L0.b); + PoiSHBr = 0; + PoiSHBg = 0; + PoiSHBb = 0; + PoiSHC = 0; + } + #endif + #if defined(PROP_LIGHTINGAOMAPS) + float4 AOMaps = POI2D_SAMPLER_PAN(_LightingAOMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.occlusion = min(min(min(lerp(1, AOMaps.r, 1.0), lerp(1, AOMaps.g, 0.0)), lerp(1, AOMaps.b, 0.0)), lerp(1, AOMaps.a, 0.0)); + #else + poiLight.occlusion = 1; + #endif + if (0.0 > 0) + { + poiLight.occlusion = maskBlend(poiLight.occlusion, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGDETAILSHADOWMAPS) + float4 DetailShadows = POI2D_SAMPLER_PAN(_LightingDetailShadowMaps, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + #ifndef POI_PASS_ADD + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #else + poiLight.detailShadow = lerp(1, DetailShadows.r, 1.0) * lerp(1, DetailShadows.g, 0.0) * lerp(1, DetailShadows.b, 0.0) * lerp(1, DetailShadows.a, 0.0); + #endif + #else + poiLight.detailShadow = 1; + #endif + if (0.0 > 0) + { + poiLight.detailShadow = maskBlend(poiLight.detailShadow, poiMods.globalMask[0.0 - 1], 2.0); + } + #if defined(PROP_LIGHTINGSHADOWMASKS) + float4 ShadowMasks = POI2D_SAMPLER_PAN(_LightingShadowMasks, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)); + poiLight.shadowMask = lerp(1, ShadowMasks.r, 1.0) * lerp(1, ShadowMasks.g, 0.0) * lerp(1, ShadowMasks.b, 0.0) * lerp(1, ShadowMasks.a, 0.0); + #else + poiLight.shadowMask = 1; + #endif + if (0.0 > 0) + { + poiLight.shadowMask = maskBlend(poiLight.shadowMask, poiMods.globalMask[0.0 - 1], 2.0); + } + #ifdef UNITY_PASS_FORWARDBASE + bool lightExists = false; + if (any(_LightColor0.rgb >= 0.002)) + { + lightExists = true; + } + if (1.0) + { + poiFragData.toggleVertexLights = 1; + } + if (IsInMirror() && 1.0 == 0) + { + poiFragData.toggleVertexLights = 0; + } + if (1.0) + { + #if defined(VERTEXLIGHT_ON) + float4 toLightX = unity_4LightPosX0 - i.worldPos.x; + float4 toLightY = unity_4LightPosY0 - i.worldPos.y; + float4 toLightZ = unity_4LightPosZ0 - i.worldPos.z; + float4 lengthSq = 0; + lengthSq += toLightX * toLightX; + lengthSq += toLightY * toLightY; + lengthSq += toLightZ * toLightZ; + float4 lightAttenSq = unity_4LightAtten0; + float4 atten = 1.0 / (1.0 + lengthSq * lightAttenSq); + float4 vLightWeight = saturate(1 - (lengthSq * lightAttenSq / 25)); + poiLight.vAttenuation = min(atten, vLightWeight * vLightWeight); + poiLight.vDotNL = 0; + poiLight.vDotNL += toLightX * poiMesh.normals[1].x; + poiLight.vDotNL += toLightY * poiMesh.normals[1].y; + poiLight.vDotNL += toLightZ * poiMesh.normals[1].z; + float4 corr = rsqrt(lengthSq); + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vertexVDotNL = 0; + poiLight.vertexVDotNL += toLightX * poiMesh.normals[0].x; + poiLight.vertexVDotNL += toLightY * poiMesh.normals[0].y; + poiLight.vertexVDotNL += toLightZ * poiMesh.normals[0].z; + poiLight.vertexVDotNL = max(0, poiLight.vDotNL * corr); + poiLight.vSaturatedDotNL = saturate(poiLight.vDotNL); + [unroll] + for (int index = 0; index < 4; index++) + { + poiLight.vPosition[index] = float3(unity_4LightPosX0[index], unity_4LightPosY0[index], unity_4LightPosZ0[index]); + float3 vertexToLightSource = poiLight.vPosition[index] - poiMesh.worldPos; + poiLight.vDirection[index] = normalize(vertexToLightSource); + poiLight.vColor[index] = 1.0 ? MaxLuminance(unity_LightColor[index].rgb * poiLight.vAttenuation[index], 1.0) : unity_LightColor[index].rgb * poiLight.vAttenuation[index]; + poiLight.vColor[index] = lerp(poiLight.vColor[index], dot(poiLight.vColor[index], float3(0.299, 0.587, 0.114)), 0.0); + poiLight.vHalfDir[index] = Unity_SafeNormalize(poiLight.vDirection[index] + poiCam.viewDir); + poiLight.vDotNL[index] = dot(poiMesh.normals[1], poiLight.vDirection[index]); + poiLight.vCorrectedDotNL[index] = .5 * (poiLight.vDotNL[index] + 1); + poiLight.vDotLH[index] = saturate(dot(poiLight.vDirection[index], poiLight.vHalfDir[index])); + poiLight.vDotNH[index] = dot(poiMesh.normals[1], poiLight.vHalfDir[index]); + poiLight.vertexVDotNH[index] = saturate(dot(poiMesh.normals[0], poiLight.vHalfDir[index])); + } + #endif + } + if (0.0 == 0) // Poi Custom Light Color + { + float3 magic = max(BetterSH9(normalize(PoiSHAr + PoiSHAg + PoiSHAb)), 0); + float3 normalLight = _LightColor0.rgb + BetterSH9(float4(0, 0, 0, 1)); + float magiLumi = calculateluminance(magic); + float normaLumi = calculateluminance(normalLight); + float maginormalumi = magiLumi + normaLumi; + float magiratio = magiLumi / maginormalumi; + float normaRatio = normaLumi / maginormalumi; + float target = calculateluminance(magic * magiratio + normalLight * normaRatio); + float3 properLightColor = magic + normalLight; + float properLuminance = calculateluminance(magic + normalLight); + poiLight.directColor = properLightColor * max(0.0001, (target / properLuminance)); + poiLight.indirectColor = BetterSH9(float4(lerp(0, poiMesh.normals[1], 0.0), 1)); + } + if (0.0 == 1) // More standard approach to light color + { + float3 indirectColor = BetterSH9(float4(poiMesh.normals[1], 1)); + if (lightExists) + { + poiLight.directColor = _LightColor0.rgb; + poiLight.indirectColor = indirectColor; + } + else + { + poiLight.directColor = indirectColor * 0.6; + poiLight.indirectColor = indirectColor * 0.5; + } + } + if (0.0 == 2) // UTS style + { + poiLight.indirectColor = saturate(max(half3(0.05, 0.05, 0.05) * 1.0, max(PoiShadeSH9(half4(0.0, 0.0, 0.0, 1.0)), PoiShadeSH9(half4(0.0, -1.0, 0.0, 1.0)).rgb) * 1.0)); + poiLight.directColor = max(poiLight.indirectColor, _LightColor0.rgb); + } + if (0.0 == 3) // OpenLit + { + float3 lightDirectionForSH9 = OpenLitLightingDirectionForSH9(); + OpenLitShadeSH9ToonDouble(lightDirectionForSH9, poiLight.directColor, poiLight.indirectColor); + poiLight.directColor += _LightColor0.rgb; + } + float lightMapMode = 0.0; + if (0.0 == 0) + { + poiLight.direction = calculateluminance(_LightColor0.rgb) * _WorldSpaceLightPos0.xyz + 0.2 * PoiSHAr.xyz + 0.333333 * PoiSHAg.xyz + 0.333333 * PoiSHAb.xyz + 0.333333; + } + if (0.0 == 1 || 0.0 == 2) + { + if (0.0 == 1) + { + poiLight.direction = mul(unity_ObjectToWorld, float4(0,0,0,1)).xyz;; + } + if (0.0 == 2) + { + poiLight.direction = float4(0,0,0,1); + } + if (lightMapMode == 0) + { + lightMapMode = 1; + } + } + if (0.0 == 3) // UTS + { + float3 defaultLightDirection = normalize(UNITY_MATRIX_V[2].xyz + UNITY_MATRIX_V[1].xyz); + float3 lightDirection = normalize(lerp(defaultLightDirection, _WorldSpaceLightPos0.xyz, any(_WorldSpaceLightPos0.xyz))); + poiLight.direction = lightDirection; + } + if (0.0 == 4) // OpenLit + { + poiLight.direction = OpenLitLightingDirection(); // float4 customDir = 0; // Do we want to give users to alter this (OpenLit always does!)? + } + if (0.0 == 5) // View Direction + { + float3 upViewDir = normalize(UNITY_MATRIX_V[1].xyz); + float3 rightViewDir = normalize(UNITY_MATRIX_V[0].xyz); + float yawOffset_Rads = radians(!IsInMirror() ? - 0.0 : 0.0); + float3 rotatedViewYaw = normalize(RotateAroundAxis(rightViewDir, upViewDir, yawOffset_Rads)); + float3 rotatedViewCameraMeshOffset = RotateAroundAxis((getCameraPosition() - (poiMesh.worldPos)), upViewDir, yawOffset_Rads); + float pitchOffset_Rads = radians(!IsInMirror() ? 0.0 : - 0.0); + float3 rotatedViewPitch = RotateAroundAxis(rotatedViewCameraMeshOffset, rotatedViewYaw, pitchOffset_Rads); + poiLight.direction = normalize(rotatedViewPitch); + } + if (!any(poiLight.direction)) + { + poiLight.direction = float3(.4, 1, .4); + } + poiLight.direction = normalize(poiLight.direction); + poiLight.attenuationStrength = 0.0; + poiLight.attenuation = 1; + if (!all(_LightColor0.rgb == 0.0)) + { + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation *= attenuation; + } + #if defined(HANDLE_SHADOWS_BLENDING_IN_GI) + half bakedAtten = UnitySampleBakedOcclusion(poiMesh.lightmapUV.xy, poiMesh.worldPos); + float zDist = dot(_WorldSpaceCameraPos - poiMesh.worldPos, UNITY_MATRIX_V[2].xyz); + float fadeDist = UnityComputeShadowFadeDistance(poiMesh.worldPos, zDist); + poiLight.attenuation = UnityMixRealtimeAndBakedShadows(poiLight.attenuation, bakedAtten, UnityComputeShadowFade(fadeDist)); + #endif + #ifdef RALIV_PENETRATION + if (0.0 || 0.0) + { + if (1.0) + { + poiLight.attenuation = 1; + } + } + #endif + if (!any(poiLight.directColor) && !any(poiLight.indirectColor) && lightMapMode == 0) + { + lightMapMode = 1; + if (0.0 == 0) + { + poiLight.direction = normalize(float3(.4, 1, .4)); + } + } + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotVCentered = abs(dot(poiMesh.normals[1], normalize(getCameraPosition() - i.worldPos.xyz))); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = max(0.00001, dot(poiLight.direction, poiLight.halfDir)); + if (lightMapMode == 0) + { + float3 ShadeSH9Plus = GetSHLength(); + float3 ShadeSH9Minus = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + float3 greyScaleVector = float3(.33333, .33333, .33333); + float bw_lightColor = dot(poiLight.directColor, greyScaleVector); + float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, poiLight.attenuationStrength)) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_directLightingNoAtten = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor) + dot(PoiShadeSH9(float4(poiMesh.normals[1], 1)), greyScaleVector)); + float bw_bottomIndirectLighting = dot(ShadeSH9Minus, greyScaleVector); + float bw_topIndirectLighting = dot(ShadeSH9Plus, greyScaleVector); + float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting); + poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting); + poiLight.lightMapNoAttenuation = smoothstep(0, lightDifference, bw_directLightingNoAtten - bw_bottomIndirectLighting); + } + if (lightMapMode == 1) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 2) + { + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + poiLight.lightMap = poiLight.nDotLSaturated * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 3) + { + poiLight.lightMapNoAttenuation = 1; + poiLight.lightMap = lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + } + if (lightMapMode == 4) + { + #if defined(PROP_LIGHTDATASDFMAP) + float2 lightDataSDFMap = 1; + if (0.0 > 0) + { + float sdfLod = pow(0.0, 4.0); + lightDataSDFMap = POI2D_SAMPLER_PANGRAD(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0), max(poiMesh.dx, sdfLod), max(poiMesh.dy, sdfLod)).rg; + } + else + { + lightDataSDFMap = POI2D_SAMPLER_PAN(_LightDataSDFMap, _linear_repeat, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0)).rg; + } + poiLight.lightMapNoAttenuation = poiLight.nDotLSaturated; + float3 faceR = mul((float3x3)unity_ObjectToWorld, float3(-1.0, 0.0, 0.0)); + float LdotR = dot(poiLight.direction.xz, faceR.xz); + float sdf = LdotR < 0 ? lightDataSDFMap.g : lightDataSDFMap.r; + float3 faceF = mul((float3x3)unity_ObjectToWorld, float3(0.0, 0.0, 1.0)).xyz; + faceF.y *= 1.0; + faceF = dot(faceF, faceF) == 0 ? 0 : normalize(faceF); + float3 faceL = poiLight.direction; + faceL.y *= 1.0; + faceL = dot(faceL, faceL) == 0 ? 0 : normalize(faceL); + float lnSDF = dot(faceL, faceF); + poiLight.lightMapNoAttenuation = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25); + poiLight.lightMap = saturate(lnSDF * 0.5 + sdf * 0.5 + 0.25) * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #else + poiLight.lightMapNoAttenuation = poiLight.nDotLNormalized; + poiLight.lightMap = poiLight.nDotLNormalized * lerp(1, poiLight.attenuation, poiLight.attenuationStrength); + #endif + } + poiLight.lightMapNoAttenuation *= poiLight.detailShadow; + poiLight.lightMap *= poiLight.detailShadow; + poiLight.directColor = max(poiLight.directColor, 0.0001); + poiLight.indirectColor = max(poiLight.indirectColor, 0.0001); + if (0.0 == 3) + { + poiLight.directColor = max(poiLight.directColor, _LightingMinLightBrightness); + } + else + { + poiLight.directColor = max(poiLight.directColor, poiLight.directColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.directColor))))); + poiLight.indirectColor = max(poiLight.indirectColor, poiLight.indirectColor * min(10000, (_LightingMinLightBrightness * rcp(calculateluminance(poiLight.indirectColor))))); + } + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), _LightingMonochromatic); + if (_LightingCapEnabled) + { + poiLight.directColor = min(poiLight.directColor, _LightingCap); + poiLight.indirectColor = min(poiLight.indirectColor, _LightingCap); + } + if (0.0) + { + poiLight.directColor = poiThemeColor(poiMods, float4(1,1,1,1), 0.0); + } + #ifdef UNITY_PASS_FORWARDBASE + poiLight.directColor = max(poiLight.directColor * 1.0, 0); + poiLight.directColor = max(poiLight.directColor + 0.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor * 1.0, 0); + poiLight.indirectColor = max(poiLight.indirectColor + 0.0, 0); + #endif + #endif + #ifdef POI_PASS_ADD + if (!1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #if defined(DIRECTIONAL) + if (1.0) + { + return float4(mainTexture.rgb * .0001, 1); + } + #endif + poiLight.direction = normalize(_WorldSpaceLightPos0.xyz - i.worldPos.xyz * _WorldSpaceLightPos0.w); + #if defined(POINT) || defined(SPOT) + #ifdef POINT + unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)).xyz; + poiLight.attenuation = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r; + #endif + #ifdef SPOT + unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(poiMesh.worldPos, 1)); + poiLight.attenuation = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz); + #endif + #else + UNITY_LIGHT_ATTENUATION(attenuation, i, poiMesh.worldPos) + poiLight.attenuation = attenuation; + #endif + poiLight.additiveShadow = UNITY_SHADOW_ATTENUATION(i, poiMesh.worldPos); + poiLight.attenuationStrength = 1.0; + poiLight.directColor = 1.0 ? MaxLuminance(_LightColor0.rgb * poiLight.attenuation, 1.0) : _LightColor0.rgb * poiLight.attenuation; + #if defined(POINT_COOKIE) || defined(DIRECTIONAL_COOKIE) + poiLight.indirectColor = 0; + #else + poiLight.indirectColor = lerp(0, poiLight.directColor, 0.5); + poiLight.indirectColor = 1.0 ? MaxLuminance(poiLight.indirectColor, 1.0) : poiLight.indirectColor; + #endif + poiLight.directColor = lerp(poiLight.directColor, dot(poiLight.directColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.indirectColor = lerp(poiLight.indirectColor, dot(poiLight.indirectColor, float3(0.299, 0.587, 0.114)), 0.0); + poiLight.halfDir = normalize(poiLight.direction + poiCam.viewDir); + poiLight.nDotL = dot(poiMesh.normals[1], poiLight.direction); + poiLight.nDotLSaturated = saturate(poiLight.nDotL); + poiLight.nDotLNormalized = (poiLight.nDotL + 1) * 0.5; + poiLight.nDotV = abs(dot(poiMesh.normals[1], poiCam.viewDir)); + poiLight.nDotH = dot(poiMesh.normals[1], poiLight.halfDir); + poiLight.lDotv = dot(poiLight.direction, poiCam.viewDir); + poiLight.lDotH = dot(poiLight.direction, poiLight.halfDir); + poiLight.vertexNDotL = dot(poiMesh.normals[0], poiLight.direction); + poiLight.vertexNDotV = abs(dot(poiMesh.normals[0], poiCam.viewDir)); + poiLight.vertexNDotH = max(0.00001, dot(poiMesh.normals[0], poiLight.halfDir)); + if (0.0 == 0 || 0.0 == 1 || 0.0 == 2) + { + poiLight.lightMap = poiLight.nDotLNormalized; + } + if (0.0 == 3) + { + poiLight.lightMap = 1; + } + poiLight.lightMap *= poiLight.detailShadow; + poiLight.lightMapNoAttenuation = poiLight.lightMap; + poiLight.lightMap *= lerp(1, poiLight.additiveShadow, poiLight.attenuationStrength); + #endif + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + #if defined(_LIGHTINGMODE_SHADEMAP) && defined(VIGNETTE_MASKED) + #ifndef POI_PASS_OUTLINE + #endif + #endif + #ifdef VIGNETTE_MASKED + #ifdef POI_PASS_OUTLINE + if (1.0) + { + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + } + else + { + poiLight.finalLighting = 1; + } + #else + calculateShading(poiLight, poiFragData, poiMesh, poiCam); + #endif + #else + poiLight.finalLighting = 1; + poiLight.rampedLightMap = poiEdgeNonLinear(poiLight.nDotL, 0.1, .1); + #endif + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, poiLight.rampedLightMap); + } + if (0.0 > 0) + { + applyToGlobalMask(poiMods, 0.0 - 1, 2.0, 1 - poiLight.rampedLightMap); + } + poiLight.directLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.indirectLuminance = dot(poiLight.directColor, float3(0.299, 0.587, 0.114)); + poiLight.finalLuminance = dot(poiLight.finalLighting, float3(0.299, 0.587, 0.114)); + #ifdef POI_GRABPASS + poiLight.finalLighting = max(poiLight.finalLighting, 0.0001); + #endif + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + poiFragData.finalColor = poiFragData.baseColor * poiLight.finalLighting; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + if (0.0 == POI_MODE_CUTOUT && !0.0) + { + poiFragData.alpha = 1; + } + if (4.0 == 4) + { + poiFragData.alpha = saturate(poiFragData.alpha * 10.0); + } + if (0.0 != POI_MODE_TRANSPARENT) + { + poiFragData.finalColor *= poiFragData.alpha; + } + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "ShadowCaster" + Tags { "LightMode" = "ShadowCaster" } + Stencil + { + Ref [_StencilRef] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + Comp [_StencilCompareFunction] + Pass [_StencilPassOp] + Fail [_StencilFailOp] + ZFail [_StencilZFailOp] + } + ZWrite [_ZWrite] + Cull Back + AlphaToMask Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_shadowcaster + #pragma multi_compile_vertex _ FOG_EXP2 + #define POI_PASS_SHADOW + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + Pass + { + Name "META" + Tags { "LightMode" = "Meta" } + ZWrite [_ZWrite] + Cull Off + ZTest [_ZTest] + ColorMask RGBA + Offset [_OffsetFactor], [_OffsetUnits] + BlendOp [_BlendOp], [_BlendOpAlpha] + Blend [_SrcBlend] [_DstBlend], [_SrcBlendAlpha] [_DstBlendAlpha] + CGPROGRAM + #define PROP_LIGHTINGAOMAPS + #define VIGNETTE_MASKED + #define _LIGHTINGMODE_REALISTIC + #define _STOCHASTICMODE_DELIOT_HEITZ + #define PROP_BUMPMAP + #define PROP_LIGHTINGAOMAPS + #define OPTIMIZER_ENABLED + #pragma target 5.0 + #pragma multi_compile_instancing + #pragma multi_compile_fragment _ VERTEXLIGHT_ON + #define POI_PASS_META + #define POI_WORLD + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + #include "AutoLight.cginc" + #include "UnityMetaPass.cginc" + #ifndef VRC_LIGHT_VOLUMES_INCLUDED + #define VRC_LIGHT_VOLUMES_INCLUDED + #define VRCLV_VERSION 2 + #define VRCLV_MAX_VOLUMES_COUNT 32 + #define VRCLV_MAX_LIGHTS_COUNT 128 + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + cbuffer LightVolumeUniforms { + #endif + uniform float _UdonLightVolumeEnabled; + uniform float _UdonLightVolumeVersion; + uniform float _UdonLightVolumeCount; + uniform float _UdonLightVolumeAdditiveMaxOverdraw; + uniform float _UdonLightVolumeAdditiveCount; + uniform float _UdonLightVolumeProbesBlend; + uniform float _UdonLightVolumeSharpBounds; + uniform float4x4 _UdonLightVolumeInvWorldMatrix[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeRotation[VRCLV_MAX_VOLUMES_COUNT * 2]; // Legacy! Used in this version to have back compatibility with older worlds. Array commented above will be used in future releases! Legacy! + uniform float3 _UdonLightVolumeInvLocalEdgeSmooth[VRCLV_MAX_VOLUMES_COUNT]; + uniform float3 _UdonLightVolumeUvw[VRCLV_MAX_VOLUMES_COUNT * 6]; // Legacy! AABB Bounds of islands on the 3D Texture atlas. Array commented above will be used in future releases! Legacy! + uniform float4 _UdonLightVolumeOcclusionUvw[VRCLV_MAX_VOLUMES_COUNT]; + uniform float4 _UdonLightVolumeColor[VRCLV_MAX_VOLUMES_COUNT]; + uniform float _UdonPointLightVolumeCount; + uniform float _UdonPointLightVolumeCubeCount; + uniform float4 _UdonPointLightVolumePosition[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeColor[VRCLV_MAX_LIGHTS_COUNT]; + uniform float4 _UdonPointLightVolumeDirection[VRCLV_MAX_LIGHTS_COUNT]; + uniform float3 _UdonPointLightVolumeCustomID[VRCLV_MAX_LIGHTS_COUNT]; + uniform float _UdonLightBrightnessCutoff; + uniform float _UdonLightVolumeOcclusionCount; + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + } + #endif + #ifndef SHADER_TARGET_SURFACE_ANALYSIS + uniform Texture3D _UdonLightVolume; + uniform SamplerState sampler_UdonLightVolume; + uniform Texture2DArray _UdonPointLightVolumeTexture; + #define LV_SAMPLE(tex, uvw) tex.SampleLevel(sampler_UdonLightVolume, uvw, 0) + #else + #define LV_SAMPLE(tex, uvw) float4(0,0,0,0) + #endif + #define LV_PI 3.141592653589793f + #define LV_PI2 6.283185307179586f + float LV_Smoothstep01(float x) { + return x * x * (3 - 2 * x); + } + float3 LV_MultiplyVectorByQuaternion(float3 v, float4 q) { + float3 t = 2.0 * cross(q.xyz, v); + return v + q.w * t + cross(q.xyz, t); + } + float3 LV_MultiplyVectorByMatrix2x3(float3 v, float3 r0, float3 r1) { + float3 r2 = cross(r0, r1); + return float3(dot(v, r0), dot(v, r1), dot(v, r2)); + } + float LV_FastAcos(float x) { + float absX = abs(x); + float res = -0.156583f * absX + LV_PI * 0.5f; + res *= sqrt(1.0f - absX); + return (x >= 0) ? res : (LV_PI - res); + } + float LV_DistributionGGX(float NoH, float roughness) { + float f = (roughness - 1) * ((roughness + 1) * (NoH * NoH)) + 1; + return (roughness * roughness) / ((float) LV_PI * f * f); + } + bool LV_PointLocalAABB(float3 localUVW) { + return all(abs(localUVW) <= 0.5); + } + float3 LV_LocalFromVolume(uint volumeID, float3 worldPos) { + return mul(_UdonLightVolumeInvWorldMatrix[volumeID], float4(worldPos, 1.0)).xyz; + } + float LV_EvaluateSH(float L0, float3 L1, float3 n) { + return L0 + dot(L1, n); + } + float4 LV_SampleCubemapArray(uint id, float3 dir) { + float3 absDir = abs(dir); + float2 uv; + uint face; + if (absDir.x >= absDir.y && absDir.x >= absDir.z) { + face = dir.x > 0 ? 0 : 1; + uv = float2((dir.x > 0 ? -dir.z : dir.z), -dir.y) * rcp(absDir.x); + } else if (absDir.y >= absDir.z) { + face = dir.y > 0 ? 2 : 3; + uv = float2(dir.x, (dir.y > 0 ? dir.z : -dir.z)) * rcp(absDir.y); + } else { + face = dir.z > 0 ? 4 : 5; + uv = float2((dir.z > 0 ? dir.x : -dir.x), -dir.y) * rcp(absDir.z); + } + float3 uvid = float3(uv * 0.5 + 0.5, id * 6 + face); + return LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + } + float4 LV_ProjectQuadLightIrradianceSH(float3 shadingPosition, float3 lightVertices[4]) { + [unroll] for (uint edge0 = 0; edge0 < 4; edge0++) { + lightVertices[edge0] = normalize(lightVertices[edge0] - shadingPosition); + } + const float3 zhDir0 = float3(0.866025, -0.500001, -0.000004); + const float3 zhDir1 = float3(-0.759553, 0.438522, -0.480394); + const float3 zhDir2 = float3(-0.000002, 0.638694, 0.769461); + const float3 zhWeightL1y = float3(2.1995339f, 2.50785367f, 1.56572711f); + const float3 zhWeightL1z = float3(-1.82572523f, -2.08165037f, 0.00000000f); + const float3 zhWeightL1x = float3(2.42459869f, 1.44790525f, 0.90397552f); + float solidAngle = 0.0; + float3 surfaceIntegral = 0.0; + [loop] for (uint edge1 = 0; edge1 < 4; edge1++) { + uint next = (edge1 + 1) % 4; + uint prev = (edge1 + 4 - 1) % 4; + float3 prevVert = lightVertices[prev]; + float3 thisVert = lightVertices[edge1]; + float3 nextVert = lightVertices[next]; + float3 a = cross(thisVert, prevVert); + float3 b = cross(thisVert, nextVert); + float lenA = length(a); + float lenB = length(b); + solidAngle += LV_FastAcos(clamp(dot(a, b) / (lenA * lenB), -1, 1)); + float3 mu = b * rcp(lenB); + float cosGamma = dot(thisVert, nextVert); + float gamma = LV_FastAcos(clamp(cosGamma, -1, 1)); + surfaceIntegral.x += gamma * dot(zhDir0, mu); + surfaceIntegral.y += gamma * dot(zhDir1, mu); + surfaceIntegral.z += gamma * dot(zhDir2, mu); + } + solidAngle = solidAngle - LV_PI2; + surfaceIntegral *= 0.5; + const float normalizationL0 = 0.5f * sqrt(1.0f / LV_PI); + float l0 = normalizationL0 * solidAngle; + float l1y = dot(zhWeightL1y, surfaceIntegral); + float l1z = dot(zhWeightL1z, surfaceIntegral); + float l1x = dot(zhWeightL1x, surfaceIntegral); + const float cosineKernelL0 = LV_PI; // (1) + const float cosineKernelL1 = LV_PI2 / 3.0f; // (1) + const float oneOverPi = 1.0f / LV_PI; // (2) + const float normalizationL1 = 0.5f * sqrt(3.0f / LV_PI); // (3) + const float weightL0 = cosineKernelL0 * normalizationL0 * oneOverPi; // (1), (2), (3) + const float weightL1 = cosineKernelL1 * normalizationL1 * oneOverPi; // (1), (2), (3) + l0 *= weightL0; + l1y *= weightL1; + l1z *= weightL1; + l1x *= weightL1; + return float4(l1x, l1y, l1z, l0); + } + void LV_QuadLight(float3 worldPos, float3 centroidPos, float4 rotationQuat, float2 size, float3 color, float sqMaxDist, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 lightToWorldPos = worldPos - centroidPos; + float3 normal = LV_MultiplyVectorByQuaternion(float3(0, 0, 1), rotationQuat); + if (dot(normal, lightToWorldPos) < 0.0) return; + float sqCutoffDist = sqMaxDist - dot(lightToWorldPos, lightToWorldPos); + color.rgb *= saturate(sqCutoffDist / sqMaxDist) * LV_PI * occlusion; + float2 halfSize = size * 0.5f; + float3 xAxis = LV_MultiplyVectorByQuaternion(float3(1, 0, 0), rotationQuat); + float3 yAxis = cross(normal, xAxis); + float3 verts[4]; + verts[0] = centroidPos + (-halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[1] = centroidPos + ( halfSize.x * xAxis) + ( halfSize.y * yAxis); + verts[2] = centroidPos + ( halfSize.x * xAxis) + (-halfSize.y * yAxis); + verts[3] = centroidPos + (-halfSize.x * xAxis) + (-halfSize.y * yAxis); + float4 areaLightSH = LV_ProjectQuadLightIrradianceSH(worldPos, verts); + float lenL1 = length(areaLightSH.xyz); + if (lenL1 > areaLightSH.w) areaLightSH.xyz *= areaLightSH.w / lenL1; + L0 += areaLightSH.w * color.rgb; + L1r += areaLightSH.xyz * color.r; + L1g += areaLightSH.xyz * color.g; + L1b += areaLightSH.xyz * color.b; + count++; + } + float3 LV_PointLightAttenuation(float sqdist, float sqlightSize, float3 color, float brightnessCutoff, float sqMaxDist) { + float mask = saturate(1 - sqdist / sqMaxDist); + return mask * mask * color * sqlightSize / (sqdist + sqlightSize); + } + float LV_PointLightSolidAngle(float sqdist, float sqlightSize) { + return saturate(sqrt(sqdist / (sqlightSize + sqdist))); + } + void LV_SphereLight(float sqdist, float3 dirN, float sqlightSize, float3 color, float occlusion, float sqMaxDist, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 att = LV_PointLightAttenuation(sqdist, sqlightSize, color, _UdonLightBrightnessCutoff, sqMaxDist); + float3 l0 = att * occlusion; + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLight(float sqdist, float3 dirN, float sqlightSize, float3 att, float spotMask, float cosAngle, float coneFalloff, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float smoothedCone = LV_Smoothstep01(saturate(spotMask * coneFalloff)); + float3 l0 = att * (occlusion * smoothedCone); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * saturate(1 - cosAngle)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightCookie(float sqdist, float3 dirN, float sqlightSize, float3 att, float4 lightRot, float tanAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 localDir = LV_MultiplyVectorByQuaternion(-dirN, lightRot); + float2 uv = localDir.xy * rcp(localDir.z * tanAngle); + if ( + localDir.z <= 0.0 || // Culling by direction + abs(uv.x) > 1.0 || abs(uv.y) > 1.0 // Culling by UV + ) return; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 - customId - 1; + float3 uvid = float3(uv * 0.5 + 0.5, id); + float angleSize = saturate(rsqrt(1 + tanAngle * tanAngle)); + float4 cookie = LV_SAMPLE(_UdonPointLightVolumeTexture, uvid); + float3 l0 = att * cookie.rgb * (cookie.a * occlusion); + float3 l1 = dirN * LV_PointLightSolidAngle(sqdist, sqlightSize * (1 - angleSize)); + L0 += l0; + L1r += l0.r * l1; + L1g += l0.g * l1; + L1b += l0.b * l1; + count++; + } + void LV_SphereSpotLightAttenuationLUT(float sqdist, float3 dirN, float sqlightSize, float3 color, float spotMask, float cosAngle, uint customId, float occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float dirRadius = sqdist * abs(sqlightSize); + float spot = 1 - saturate(spotMask * rcp(1 - cosAngle)); + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId - 1; + float3 uvid = float3(sqrt(float2(spot, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * occlusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } + void LV_PointLight(uint id, float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, inout uint count) { + float3 customID_data = _UdonPointLightVolumeCustomID[id]; + int shadowId = (int) customID_data.y; // Shadowmask id + int customId = (int) customID_data.x; // Custom Texture ID + float sqrRange = customID_data.z; // Squared culling distance + float4 pos = _UdonPointLightVolumePosition[id]; // Light position and inversed squared range + float3 dir = pos.xyz - worldPos; + float sqlen = max(dot(dir, dir), 1e-6); + if (sqlen > sqrRange) return; // Early distance based culling + float3 dirN = dir * rsqrt(sqlen); + float lightOcclusion = 1; + if (_UdonLightVolumeOcclusionCount != 0 && shadowId >= 0) { + lightOcclusion = dot(occlusion, float4(shadowId == 0, shadowId == 1, shadowId == 2, shadowId == 3)); + } + float4 color = _UdonPointLightVolumeColor[id]; // Color, angle + float4 ldir = _UdonPointLightVolumeDirection[id]; // Dir + falloff or Rotation + if (pos.w < 0) { // It is a spot light + float angle = color.w; + float spotMask = dot(ldir.xyz, -dirN) - angle; + if(customId >= 0 && spotMask < 0) return; // Spot cone based culling + if (customId > 0) { // If it uses Attenuation LUT + LV_SphereSpotLightAttenuationLUT(sqlen, dirN, -pos.w, color.rgb, spotMask, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + float3 att = LV_PointLightAttenuation(sqlen, -pos.w, color.rgb, _UdonLightBrightnessCutoff, sqrRange); + if (customId < 0) { // If uses cookie + LV_SphereSpotLightCookie(sqlen, dirN, -pos.w, att, ldir, angle, customId, lightOcclusion, L0, L1r, L1g, L1b, count); + } else { // If it uses default parametric attenuation + LV_SphereSpotLight(sqlen, dirN, -pos.w, att, spotMask, angle, ldir.w, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + } else if (color.w <= 1.5f) { // It is a point light + if (customId > 0) { // Using LUT + float invSqRange = abs(pos.w); // Sign of range defines if it's point light (positive) or a spot light (negative) + float dirRadius = sqlen * invSqRange; + uint id = (uint) _UdonPointLightVolumeCubeCount * 5 + customId; + float3 uvid = float3(sqrt(float2(0, dirRadius)), id); + float3 att = color.rgb * LV_SAMPLE(_UdonPointLightVolumeTexture, uvid).xyz * lightOcclusion; + L0 += att; + L1r += dirN * att.r; + L1g += dirN * att.g; + L1b += dirN * att.b; + count++; + } else { // If it uses default parametric attenuation + float3 l0 = 0, l1r = 0, l1g = 0, l1b = 0; + LV_SphereLight(sqlen, dirN, pos.w, color.rgb, lightOcclusion, sqrRange, l0, l1r, l1g, l1b, count); + float3 cubeColor = 1; + if (customId < 0) { // If it uses a cubemap + uint id = -customId - 1; // Cubemap ID starts from zero and should not take in count texture array slices count. + cubeColor = LV_SampleCubemapArray(id, LV_MultiplyVectorByQuaternion(dirN, ldir)).xyz; + } + L0 += l0 * cubeColor; + L1r += l1r * cubeColor.r; + L1g += l1g * cubeColor.g; + L1b += l1b * cubeColor.b; + } + } else { // It is an area light + LV_QuadLight(worldPos, pos.xyz, ldir, float2(pos.w, color.w - 2.0f), color.rgb, sqrRange, lightOcclusion, L0, L1r, L1g, L1b, count); + } + } + void LV_SampleLightVolumeTex(float3 uvw0, float3 uvw1, float3 uvw2, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b) { + float4 tex0 = LV_SAMPLE(_UdonLightVolume, uvw0); + float4 tex1 = LV_SAMPLE(_UdonLightVolume, uvw1); + float4 tex2 = LV_SAMPLE(_UdonLightVolume, uvw2); + L0 = tex0.rgb; + L1r = float3(tex1.r, tex2.r, tex0.a); + L1g = float3(tex1.g, tex2.g, tex1.a); + L1b = float3(tex1.b, tex2.b, tex2.a); + } + float LV_BoundsMask(float3 localUVW, float3 invLocalEdgeSmooth) { + float3 distToMin = (localUVW + 0.5) * invLocalEdgeSmooth; + float3 distToMax = (0.5 - localUVW) * invLocalEdgeSmooth; + float3 fade = saturate(min(distToMin, distToMax)); + return fade.x * fade.y * fade.z; + } + void LV_SampleLightProbe(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz; + L1g += unity_SHAg.xyz; + L1b += unity_SHAb.xyz; + } + void LV_SampleLightProbeDering(inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + L0 += float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + L1r += unity_SHAr.xyz * 0.565f; + L1g += unity_SHAg.xyz * 0.565f; + L1b += unity_SHAb.xyz * 0.565f; + } + void LV_SampleVolume(uint id, float3 localUVW, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + float3 uvw0 = uvwScaled + _UdonLightVolumeUvw[uvwID].xyz; + float3 uvw1 = uvwScaled + _UdonLightVolumeUvw[uvwID + 2].xyz; + float3 uvw2 = uvwScaled + _UdonLightVolumeUvw[uvwID + 4].xyz; + float3 l0, l1r, l1g, l1b; + LV_SampleLightVolumeTex(uvw0, uvw1, uvw2, l0, l1r, l1g, l1b); + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + occlusion = 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + occlusion = 1; + } + float4 color = _UdonLightVolumeColor[id]; + L0 += l0 * color.rgb; + l1r *= color.r; + l1g *= color.g; + l1b *= color.b; + if (color.a != 0) { + float3 r0 = _UdonLightVolumeRotation[id * 2].xyz; + float3 r1 = _UdonLightVolumeRotation[id * 2 + 1].xyz; + L1r += LV_MultiplyVectorByMatrix2x3(l1r, r0, r1); + L1g += LV_MultiplyVectorByMatrix2x3(l1g, r0, r1); + L1b += LV_MultiplyVectorByMatrix2x3(l1b, r0, r1); + } else { + L1r += l1r; + L1g += l1g; + L1b += l1b; + } + } + float4 LV_SampleVolumeOcclusion(uint id, float3 localUVW) { + float4 uvwOcclusion = _UdonLightVolumeOcclusionUvw[id]; + if (uvwOcclusion.x >= 0) { + uint uvwID = id * 6; + float3 uvwScaled = saturate(localUVW + 0.5) * (_UdonLightVolumeUvw[uvwID + 1].xyz - _UdonLightVolumeUvw[uvwID].xyz); + return 1.0f - LV_SAMPLE(_UdonLightVolume, uvwOcclusion.xyz + uvwScaled * uvwOcclusion.w); + } else { + return 1; + } + } + void LV_PointLightVolumeSH(float3 worldPos, float4 occlusion, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b) { + uint pointCount = min((uint) _UdonPointLightVolumeCount, VRCLV_MAX_LIGHTS_COUNT); + if (pointCount == 0) return; + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_LIGHTS_COUNT); + uint pcount = 0; // Point lights counter + [loop] for (uint pid = 0; pid < pointCount && pcount < maxOverdraw; pid++) { + LV_PointLight(pid, worldPos, occlusion, L0, L1r, L1g, L1b, pcount); + } + } + void LV_LightVolumeSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + if (volumesCount == 0) { // Legacy! Fallback to default light probes if Light Volume are not enabled or a version is too old to have a support. Legacy! + LV_SampleLightProbe(L0, L1r, L1g, L1b); + return; + } + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + bool lightProbesBlend = _UdonLightVolumeProbesBlend; + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + [loop] for (uint id = 0; id < volumesCount; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA && lightProbesBlend) { + LV_SampleLightProbe(L0, L1r, L1g, L1b); + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + float3 L0_A = 0; + float3 L1r_A = 0; + float3 L1g_A = 0; + float3 L1b_A = 0; + float4 occlusion_A = 1; + LV_SampleVolume(volumeID_A, localUVW_A, L0_A, L1r_A, L1g_A, L1b_A, occlusion_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || isNoA || (_UdonLightVolumeSharpBounds && isNoB)) { // Returning SH A result if it's the center of mask or out of bounds + L0 += L0_A; + L1r += L1r_A; + L1g += L1g_A; + L1b += L1b_A; + occlusion = occlusion_A; + occlusion *= mOcclusion; + return; + } + float3 L0_B = 0; + float3 L1r_B = 0; + float3 L1g_B = 0; + float3 L1b_B = 0; + float4 occlusion_B = 1; + if (isNoB && lightProbesBlend) { // No Volume found and light volumes blending enabled + LV_SampleLightProbe(L0_B, L1r_B, L1g_B, L1b_B); + } else { // Blending Volume A and Volume B + localUVW_B = isNoB ? localUVW : localUVW_B; + volumeID_B = isNoB ? volumesCount - 1 : volumeID_B; + LV_SampleVolume(volumeID_B, localUVW_B, L0_B, L1r_B, L1g_B, L1b_B, occlusion_B); + } + occlusion = lerp(occlusion_B, occlusion_A, mask); + occlusion *= mOcclusion; + L0 += lerp(L0_B, L0_A, mask); + L1r += lerp(L1r_B, L1r_A, mask); + L1g += lerp(L1g_B, L1g_A, mask); + L1b += lerp(L1b_B, L1b_A, mask); + } + void LV_LightVolumeAdditiveSH(float3 worldPos, inout float3 L0, inout float3 L1r, inout float3 L1g, inout float3 L1b, out float4 occlusion) { + occlusion = 1; + float4 mOcclusion = 1; // Multiplicative occlusion. Applies on top of regular occlusion + uint additiveCount = min((uint) _UdonLightVolumeAdditiveCount, VRCLV_MAX_VOLUMES_COUNT); + if (additiveCount == 0 && (uint) _UdonPointLightVolumeCount == 0) return; // Legacy! + uint volumesCount = min((uint) _UdonLightVolumeCount, VRCLV_MAX_VOLUMES_COUNT); + uint maxOverdraw = min((uint) _UdonLightVolumeAdditiveMaxOverdraw, VRCLV_MAX_VOLUMES_COUNT); + uint volumeID_A = -1; // Main, dominant volume ID + uint volumeID_B = -1; // Secondary volume ID to blend main with + float3 localUVW = 0; // Last local UVW to use in disabled Light Probes mode + float3 localUVW_A = 0; // Main local UVW for Y Axis and Free rotations + float3 localUVW_B = 0; // Secondary local UVW + bool isNoA = true; + bool isNoB = true; + uint addVolumesCount = 0; + uint count = min(_UdonLightVolumeOcclusionCount == 0 ? additiveCount : volumesCount, VRCLV_MAX_VOLUMES_COUNT); // Only use all volumes if occlusion volumes are enabled + [loop] for (uint id = 0; id < count; id++) { + localUVW = LV_LocalFromVolume(id, worldPos); + if (LV_PointLocalAABB(localUVW)) { // Intersection test + if (id < additiveCount) { // Sampling additive volumes + if (addVolumesCount < maxOverdraw) { + float4 occ; // Multiplicative occlusion + LV_SampleVolume(id, localUVW, L0, L1r, L1g, L1b, occ); + mOcclusion *= occ; + addVolumesCount++; + } + } else if (isNoA) { // First, searching for volume A + volumeID_A = id; + localUVW_A = localUVW; + isNoA = false; + } else { // Next, searching for volume B if A found + volumeID_B = id; + localUVW_B = localUVW; + isNoB = false; + break; + } + } + } + if (isNoA || _UdonLightVolumeOcclusionCount == 0) { + occlusion *= mOcclusion; + return; + } + localUVW_A = isNoA ? localUVW : localUVW_A; + volumeID_A = isNoA ? volumesCount - 1 : volumeID_A; + occlusion = LV_SampleVolumeOcclusion(volumeID_A, localUVW_A); + float mask = LV_BoundsMask(localUVW_A, _UdonLightVolumeInvLocalEdgeSmooth[volumeID_A]); + if (mask == 1 || (_UdonLightVolumeSharpBounds && isNoB)) { + occlusion *= mOcclusion; + return; // Returning A result if it's the center of mask or out of bounds + } + if (isNoB) occlusion = lerp(1, occlusion, mask); + else occlusion = lerp(LV_SampleVolumeOcclusion(volumeID_B, localUVW_B), occlusion, mask); + occlusion *= mOcclusion; + } + float3 LightVolumeSpecular(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specColor = max(float3(dot(reflect(-L1r, worldNormal), viewDir), dot(reflect(-L1g, worldNormal), viewDir), dot(reflect(-L1b, worldNormal), viewDir)), 0); + float3 rDir = normalize(normalize(L1r) + viewDir); + float3 gDir = normalize(normalize(L1g) + viewDir); + float3 bDir = normalize(normalize(L1b) + viewDir); + float rNh = saturate(dot(worldNormal, rDir)); + float gNh = saturate(dot(worldNormal, gDir)); + float bNh = saturate(dot(worldNormal, bDir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float rSpec = LV_DistributionGGX(rNh, roughExp); + float gSpec = LV_DistributionGGX(gNh, roughExp); + float bSpec = LV_DistributionGGX(bNh, roughExp); + float3 specs = (rSpec + gSpec + bSpec) * f0; + float3 coloredSpecs = specs * specColor; + float3 a = coloredSpecs + specs * L0; + float3 b = coloredSpecs * 3; + return max(lerp(a, b, smoothness) * 0.5f, 0.0); + } + float3 LightVolumeSpecular(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecular(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeSpecularDominant(float3 f0, float smoothness, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 dominantDir = L1r + L1g + L1b; + float3 dir = normalize(normalize(dominantDir) + viewDir); + float nh = saturate(dot(worldNormal, dir)); + float roughness = 1 - smoothness * 0.9f; + float roughExp = roughness * roughness; + float spec = LV_DistributionGGX(nh, roughExp); + return max(spec * L0 * f0, 0.0) * 1.5f; + } + float3 LightVolumeSpecularDominant(float3 albedo, float smoothness, float metallic, float3 worldNormal, float3 viewDir, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + float3 specularf0 = lerp(0.04f, albedo, metallic); + return LightVolumeSpecularDominant(specularf0, smoothness, worldNormal, viewDir, L0, L1r, L1g, L1b); + } + float3 LightVolumeEvaluate(float3 worldNormal, float3 L0, float3 L1r, float3 L1g, float3 L1b) { + return float3(LV_EvaluateSH(L0.r, L1r, worldNormal), LV_EvaluateSH(L0.g, L1g, worldNormal), LV_EvaluateSH(L0.b, L1b, worldNormal)); + } + void LightVolumeSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled == 0) { + LV_SampleLightProbeDering(L0, L1r, L1g, L1b); + } else { + float4 occlusion = 1; + LV_LightVolumeSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + void LightVolumeAdditiveSH(float3 worldPos, out float3 L0, out float3 L1r, out float3 L1g, out float3 L1b, float3 worldPosOffset = 0) { + L0 = 0; L1r = 0; L1g = 0; L1b = 0; + if (_UdonLightVolumeEnabled != 0) { + float4 occlusion = 1; + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, L1r, L1g, L1b, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, L1r, L1g, L1b); + } + } + float3 LightVolumeSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return float3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w); + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float3 LightVolumeAdditiveSH_L0(float3 worldPos, float3 worldPosOffset = 0) { + if (_UdonLightVolumeEnabled == 0) { + return 0; + } else { + float3 L0 = 0; float4 occlusion = 1; + float3 unused_L1; // Let's just pray that compiler will strip everything x.x + LV_LightVolumeAdditiveSH(worldPos + worldPosOffset, L0, unused_L1, unused_L1, unused_L1, occlusion); + LV_PointLightVolumeSH(worldPos, occlusion, L0, unused_L1, unused_L1, unused_L1); + return L0; + } + } + float LightVolumesEnabled() { + return _UdonLightVolumeEnabled; + } + float LightVolumesVersion() { + return _UdonLightVolumeVersion == 0 ? _UdonLightVolumeEnabled : _UdonLightVolumeVersion; + } + #endif + SamplerState sampler_linear_clamp; + SamplerState sampler_linear_repeat; + SamplerState sampler_trilinear_clamp; + SamplerState sampler_trilinear_repeat; + SamplerState sampler_point_clamp; + SamplerState sampler_point_repeat; + #define DielectricSpec float4(0.04, 0.04, 0.04, 1.0 - 0.04) + #define HALF_PI float(1.5707964) + #define PI float(3.14159265359) + #define TWO_PI float(6.28318530718) + #define PI_OVER_2 1.5707963f + #define PI_OVER_4 0.785398f + #define EPSILON 0.000001f + #define POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, samplertex, coord, dx, dy) tex.SampleGrad(sampler##samplertex, coord, dx, dy) + #define POI2D_SAMPLE_TEX2D_SAMPLERGRADD(tex, samp, uv, pan, dx, dy) tex.SampleGrad(samp, POI_PAN_UV(uv, pan), dx, dy) + #define POI_PAN_UV(uv, pan) (uv + _Time.x * pan) + #define POI2D_SAMPLER_PAN(tex, texSampler, uv, pan) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, POI_PAN_UV(uv, pan))) + #define POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, POI_PAN_UV(uv, pan), dx, dy)) + #define POI2D_SAMPLER(tex, texSampler, uv) (UNITY_SAMPLE_TEX2D_SAMPLER(tex, texSampler, uv)) + #define POI_SAMPLE_1D_X(tex, samp, uv) tex.Sample(samp, float2(uv, 0.5)) + #define POI2D_SAMPLER_GRAD(tex, texSampler, uv, dx, dy) (POI2D_SAMPLE_TEX2D_SAMPLERGRAD(tex, texSampler, uv, dx, dy)) + #define POI2D_SAMPLER_GRADD(tex, texSampler, uv, dx, dy) tex.SampleGrad(texSampler, uv, dx, dy) + #define POI2D_PAN(tex, uv, pan) (tex2D(tex, POI_PAN_UV(uv, pan))) + #define POI2D(tex, uv) (tex2D(tex, uv)) + #define POI_SAMPLE_TEX2D(tex, uv) (UNITY_SAMPLE_TEX2D(tex, uv)) + #define POI_SAMPLE_TEX2D_PAN(tex, uv, pan) (UNITY_SAMPLE_TEX2D(tex, POI_PAN_UV(uv, pan))) + #define POI_SAMPLE_CUBE_LOD(tex, sampler, coord, lod) tex.SampleLevel(sampler, coord, lod) + #if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED) + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, float3(uv, unity_StereoEyeIndex)) + #else + #define POI_SAMPLE_SCREEN(tex, samp, uv) tex.Sample(samp, uv) + #endif + #define POI_SAFE_RGB0 float4(mainTexture.rgb * .0001, 0) + #define POI_SAFE_RGB1 float4(mainTexture.rgb * .0001, 1) + #define POI_SAFE_RGBA mainTexture + #if defined(UNITY_COMPILER_HLSL) + #define PoiInitStruct(type, name) name = (type)0; + #else + #define PoiInitStruct(type, name) + #endif + #define POI_ERROR(poiMesh, gridSize) lerp(float3(1, 0, 1), float3(0, 0, 0), fmod(floor((poiMesh.worldPos.x) * gridSize) + floor((poiMesh.worldPos.y) * gridSize) + floor((poiMesh.worldPos.z) * gridSize), 2) == 0) + #define POI_NAN (asfloat(-1)) + #define POI_MODE_OPAQUE 0 + #define POI_MODE_CUTOUT 1 + #define POI_MODE_FADE 2 + #define POI_MODE_TRANSPARENT 3 + #define POI_MODE_ADDITIVE 4 + #define POI_MODE_SOFTADDITIVE 5 + #define POI_MODE_MULTIPLICATIVE 6 + #define POI_MODE_2XMULTIPLICATIVE 7 + #define POI_MODE_TRANSCLIPPING 9 + #ifndef UNITY_SPECCUBE_LOD_STEPS + #define UNITY_SPECCUBE_LOD_STEPS (6) + #endif + #ifndef UNITY_LIGHTING_COMMON_INCLUDED + #define UNITY_LIGHTING_COMMON_INCLUDED + fixed4 _LightColor0; + fixed4 _SpecColor; + struct UnityLight + { + half3 color; + half3 dir; + half ndotl; + }; + struct UnityIndirect + { + half3 diffuse; + half3 specular; + }; + struct UnityGI + { + UnityLight light; + UnityIndirect indirect; + }; + struct UnityGIInput + { + UnityLight light; + float3 worldPos; + half3 worldViewDir; + half atten; + half3 ambient; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) || defined(UNITY_ENABLE_REFLECTION_BUFFERS) + float4 boxMin[2]; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + float4 boxMax[2]; + float4 probePosition[2]; + #endif + float4 probeHDR[2]; + }; + #endif + float _GrabMode; + float _Mode; + struct Unity_GlossyEnvironmentData + { + half roughness; + half3 reflUVW; + }; + #ifndef _STOCHASTICMODE_NONE + #ifdef _STOCHASTICMODE_DELIOT_HEITZ + float _StochasticDeliotHeitzDensity; + #endif + #endif + float4 _Color; + float _ColorThemeIndex; + UNITY_DECLARE_TEX2D(_MainTex); + #ifdef UNITY_STEREO_INSTANCING_ENABLED + #define STEREO_UV(uv) float3(uv, unity_StereoEyeIndex) + Texture2DArray _CameraDepthTexture; + #else + #define STEREO_UV(uv) uv + Texture2D _CameraDepthTexture; + #endif + float SampleScreenDepth(float2 uv) + { + uv.y = _ProjectionParams.x * 0.5 + 0.5 - uv.y * _ProjectionParams.x; + return _CameraDepthTexture.SampleLevel(sampler_point_clamp, STEREO_UV(uv), 0); + } + bool DepthTextureExists() + { + #ifdef UNITY_STEREO_INSTANCING_ENABLED + float3 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y, dTexDim.z); + #else + float2 dTexDim; + _CameraDepthTexture.GetDimensions(dTexDim.x, dTexDim.y); + #endif + return dTexDim.x > 16; + } + float _MainPixelMode; + float4 _MainTex_ST; + float2 _MainTexPan; + float _MainTexUV; + float4 _MainTex_TexelSize; + float _MainTexStochastic; + float _MainIgnoreTexAlpha; + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + Texture2D _BumpMap; + #endif + float4 _BumpMap_ST; + float2 _BumpMapPan; + float _BumpMapUV; + float _BumpScale; + float _BumpMapStochastic; + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + Texture2D _AlphaMask; + #endif + float4 _AlphaMask_ST; + float2 _AlphaMaskPan; + float _AlphaMaskUV; + float _AlphaMaskInvert; + float _MainAlphaMaskMode; + float _AlphaMaskBlendStrength; + float _AlphaMaskValue; + float _Cutoff; + float _AlphaForceOpaque; + float _AlphaMod; + float _AlphaPremultiply; + float _AlphaBoostFA; + float _AlphaGlobalMask; + float _AlphaGlobalMaskBlendType; + float _IgnoreFog; + float _RenderingReduceClipDistance; + int _FlipBackfaceNormals; + float _AddBlendOp; + float _Cull; + float _GIEmissionMultiplier; + float4 _GlobalThemeColor0; + float4 _GlobalThemeColor1; + float4 _GlobalThemeColor2; + float4 _GlobalThemeColor3; + float _GlobalThemeHue0; + float _GlobalThemeHue1; + float _GlobalThemeHue2; + float _GlobalThemeHue3; + float _GlobalThemeHueSpeed0; + float _GlobalThemeHueSpeed1; + float _GlobalThemeHueSpeed2; + float _GlobalThemeHueSpeed3; + float _GlobalThemeSaturation0; + float _GlobalThemeSaturation1; + float _GlobalThemeSaturation2; + float _GlobalThemeSaturation3; + float _GlobalThemeValue0; + float _GlobalThemeValue1; + float _GlobalThemeValue2; + float _GlobalThemeValue3; + int _GlobalMaskVertexColorLinearSpace; + float _StereoEnabled; + float _PolarUV; + float2 _PolarCenter; + float _PolarRadialScale; + float _PolarLengthScale; + float _PolarSpiralPower; + float _PanoUseBothEyes; + float _UVModWorldPos0; + float _UVModWorldPos1; + float _UVModLocalPos0; + float _UVModLocalPos1; + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float4 color : COLOR; + float2 uv0 : TEXCOORD0; + float2 uv1 : TEXCOORD1; + float2 uv2 : TEXCOORD2; + float2 uv3 : TEXCOORD3; + #ifndef POI_TESSELLATED + uint vertexId : SV_VertexID; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct VertexOut + { + float4 pos : SV_POSITION; + float4 uv[2] : TEXCOORD0; + float3 normal : TEXCOORD2; + float4 tangent : TEXCOORD3; + float4 worldPos : TEXCOORD4; + float4 localPos : TEXCOORD5; + float4 vertexColor : TEXCOORD6; + float4 lightmapUV : TEXCOORD7; + float worldDir : TEXCOORD8; + float2 fogData: TEXCOORD10; + UNITY_SHADOW_COORDS(12) + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + struct PoiMesh + { + float3 normals[2]; + float3 objNormal; + float3 tangentSpaceNormal; + float3 binormal[2]; + float3 tangent[2]; + float3 worldPos; + float3 localPos; + float3 objectPosition; + float isFrontFace; + float4 vertexColor; + float4 lightmapUV; + float2 uv[10]; + float2 parallaxUV; + float2 dx; + float2 dy; + uint isRightHand; + }; + struct PoiCam + { + float3 viewDir; + float3 forwardDir; + float3 worldPos; + float distanceToVert; + float4 clipPos; + float4 screenSpacePosition; + float3 reflectionDir; + float3 vertexReflectionDir; + float3 tangentViewDir; + float4 posScreenSpace; + float2 posScreenPixels; + float2 screenUV; + float vDotN; + float4 worldDirection; + }; + struct PoiMods + { + float4 Mask; + float audioLink[5]; + float audioLinkAvailable; + float audioLinkVersion; + float4 audioLinkTexture; + float2 detailMask; + float2 backFaceDetailIntensity; + float globalEmission; + float4 globalColorTheme[12]; + float globalMask[16]; + float ALTime[8]; + }; + struct PoiLight + { + float3 direction; + float nDotVCentered; + float attenuation; + float attenuationStrength; + float3 directColor; + float3 indirectColor; + float occlusion; + float shadowMask; + float detailShadow; + float3 halfDir; + float lightMap; + float lightMapNoAttenuation; + float3 rampedLightMap; + float vertexNDotL; + float nDotL; + float nDotV; + float vertexNDotV; + float nDotH; + float vertexNDotH; + float lDotv; + float lDotH; + float nDotLSaturated; + float nDotLNormalized; + #ifdef POI_PASS_ADD + float additiveShadow; + #endif + float3 finalLighting; + float3 finalLightAdd; + float3 LTCGISpecular; + float3 LTCGIDiffuse; + float directLuminance; + float indirectLuminance; + float finalLuminance; + #if defined(VERTEXLIGHT_ON) + float4 vDotNL; + float4 vertexVDotNL; + float3 vColor[4]; + float4 vCorrectedDotNL; + float4 vAttenuation; + float4 vSaturatedDotNL; + float3 vPosition[4]; + float3 vDirection[4]; + float3 vFinalLighting; + float3 vHalfDir[4]; + half4 vDotNH; + half4 vertexVDotNH; + half4 vDotLH; + #endif + }; + struct PoiVertexLights + { + float3 direction; + float3 color; + float attenuation; + }; + struct PoiFragData + { + float smoothness; + float smoothness2; + float metallic; + float specularMask; + float reflectionMask; + float3 baseColor; + float3 finalColor; + float alpha; + float3 emission; + float toggleVertexLights; + }; + float4 poiTransformClipSpacetoScreenSpaceFrag(float4 clipPos) + { + float4 positionSS = float4(clipPos.xyz * clipPos.w, clipPos.w); + positionSS.xy = positionSS.xy / _ScreenParams.xy; + return positionSS; + } + static float4 PoiSHAr = 0; + static float4 PoiSHAg = 0; + static float4 PoiSHAb = 0; + static float4 PoiSHBr = 0; + static float4 PoiSHBg = 0; + static float4 PoiSHBb = 0; + static float4 PoiSHC = 0; + half3 PoiSHEval_L0L1(half4 normal) + { + half3 x; + x.r = dot(PoiSHAr, normal); + x.g = dot(PoiSHAg, normal); + x.b = dot(PoiSHAb, normal); + return x; + } + half3 PoiSHEval_L2(half4 normal) + { + half3 x1, x2; + half4 vB = normal.xyzz * normal.yzzx; + x1.r = dot(PoiSHBr, vB); + x1.g = dot(PoiSHBg, vB); + x1.b = dot(PoiSHBb, vB); + half vC = normal.x*normal.x - normal.y*normal.y; + x2 = PoiSHC.rgb * vC; + return x1 + x2; + } + half3 PoiShadeSH9 (half4 normal) + { + half3 res = PoiSHEval_L0L1(normal); + res += PoiSHEval_L2(normal); + #ifdef UNITY_COLORSPACE_GAMMA + res = LinearToGammaSpace(res); + #endif + return res; + } + inline half4 Pow5(half4 x) + { + return x * x * x * x * x; + } + inline half3 FresnelLerp(half3 F0, half3 F90, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return lerp(F0, F90, t); + } + inline half3 FresnelTerm(half3 F0, half cosA) + { + half t = Pow5(1 - cosA); // ala Schlick interpoliation + return F0 + (1 - F0) * t; + } + half perceptualRoughnessToMipmapLevel(half perceptualRoughness) + { + return perceptualRoughness * UNITY_SPECCUBE_LOD_STEPS; + } + half3 Unity_GlossyEnvironment(UNITY_ARGS_TEXCUBE(tex), half4 hdr, Unity_GlossyEnvironmentData glossIn) + { + half perceptualRoughness = glossIn.roughness /* perceptualRoughness */ ; + #if 0 + float m = PerceptualRoughnessToRoughness(perceptualRoughness); // m is the real roughness parameter + const float fEps = 1.192092896e-07F; // smallest such that 1.0+FLT_EPSILON != 1.0 (+1e-4h is NOT good here. is visibly very wrong) + float n = (2.0 / max(fEps, m * m)) - 2.0; // remap to spec power. See eq. 21 in --> https://dl.dropboxusercontent.com/u/55891920/papers/mm_brdf.pdf + n /= 4; // remap from n_dot_h formulatino to n_dot_r. See section "Pre-convolved Cube Maps vs Path Tracers" --> https://s3.amazonaws.com/docs.knaldtech.com/knald/1.0.0/lys_power_drops.html + perceptualRoughness = pow(2 / (n + 2), 0.25); // remap back to square root of real roughness (0.25 include both the sqrt root of the conversion and sqrt for going from roughness to perceptualRoughness) + #else + perceptualRoughness = perceptualRoughness * (1.7 - 0.7 * perceptualRoughness); + #endif + half mip = perceptualRoughnessToMipmapLevel(perceptualRoughness); + half3 R = glossIn.reflUVW; + half4 rgbm = UNITY_SAMPLE_TEXCUBE_LOD(tex, R, mip); + return DecodeHDR(rgbm, hdr); + } + half3 UnpackScaleNormalDXT5nm(half4 packednormal, half bumpScale) + { + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + } + half3 LerpWhiteTo(half3 b, half t) + { + half oneMinusT = 1 - t; + return half3(oneMinusT, oneMinusT, oneMinusT) + b * t; + } + inline float GGXTerm(float NdotH, float roughness) + { + float a2 = roughness * roughness; + float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad + return UNITY_INV_PI * a2 / (d * d + 1e-7f); // This function is not intended to be running on Mobile, + } + Unity_GlossyEnvironmentData UnityGlossyEnvironmentSetup(half Smoothness, half3 worldViewDir, half3 Normal, half3 fresnel0) + { + Unity_GlossyEnvironmentData g; + g.roughness /* perceptualRoughness */ = 1 - Smoothness; + g.reflUVW = reflect(-worldViewDir, Normal); + return g; + } + half3 UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale) + { + #if defined(UNITY_NO_DXT5nm) + half3 normal = packednormal.xyz * 2 - 1; + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + return normal; + #elif defined(UNITY_ASTC_NORMALMAP_ENCODING) + half3 normal; + normal.xy = (packednormal.wy * 2 - 1); + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + normal.xy *= bumpScale; + return normal; + #else + packednormal.x *= packednormal.w; + half3 normal; + normal.xy = (packednormal.xy * 2 - 1); + #if (SHADER_TARGET >= 30) + normal.xy *= bumpScale; + #endif + normal.z = sqrt(1.0 - saturate(dot(normal.xy, normal.xy))); + return normal; + #endif + } + half3 UnpackScaleNormal(half4 packednormal, half bumpScale) + { + return UnpackScaleNormalRGorAG(packednormal, bumpScale); + } + half3 BlendNormals(half3 n1, half3 n2) + { + return normalize(half3(n1.xy + n2.xy, n1.z * n2.z)); + } + inline float2 Pow4(float2 x) + { + return x * x * x * x; + } + inline float3 Unity_SafeNormalize(float3 inVec) + { + float dp3 = max(0.001f, dot(inVec, inVec)); + return inVec * rsqrt(dp3); + } + inline float3 BoxProjectedCubemapDirection(float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax) + { + + if (cubemapCenter.w > 0.0) + { + float3 nrdir = normalize(worldRefl); + #if 1 + float3 rbmax = (boxMax.xyz - worldPos) / nrdir; + float3 rbmin = (boxMin.xyz - worldPos) / nrdir; + float3 rbminmax = (nrdir > 0.0f) ? rbmax : rbmin; + #else // Optimized version + float3 rbmax = (boxMax.xyz - worldPos); + float3 rbmin = (boxMin.xyz - worldPos); + float3 select = step(float3(0, 0, 0), nrdir); + float3 rbminmax = lerp(rbmax, rbmin, select); + rbminmax /= nrdir; + #endif + float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z); + worldPos -= cubemapCenter.xyz; + worldRefl = worldPos + nrdir * fa; + } + return worldRefl; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, Unity_GlossyEnvironmentData glossIn) + { + half3 specular; + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + half3 originalReflUVW = glossIn.reflUVW; + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[0], data.boxMin[0], data.boxMax[0]); + #endif + #ifdef _GLOSSYREFLECTIONS_OFF + specular = unity_IndirectSpecColor.rgb; + #else + half3 env0 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE(unity_SpecCube0), data.probeHDR[0], glossIn); + #ifdef UNITY_SPECCUBE_BLENDING + const float kBlendFactor = 0.99999; + float blendLerp = data.boxMin[0].w; + + if (blendLerp < kBlendFactor) + { + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + glossIn.reflUVW = BoxProjectedCubemapDirection(originalReflUVW, data.worldPos, data.probePosition[1], data.boxMin[1], data.boxMax[1]); + #endif + half3 env1 = Unity_GlossyEnvironment(UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1, unity_SpecCube0), data.probeHDR[1], glossIn); + specular = lerp(env1, env0, blendLerp); + } + else + { + specular = env0; + } + #else + specular = env0; + #endif + #endif + return specular * occlusion; + } + inline half3 UnityGI_IndirectSpecular(UnityGIInput data, half occlusion, half3 normalWorld, Unity_GlossyEnvironmentData glossIn) + { + return UnityGI_IndirectSpecular(data, occlusion, glossIn); + } + #ifndef glsl_mod + #define glsl_mod(x, y) (((x) - (y) * floor((x) / (y)))) + #endif + uniform float random_uniform_float_only_used_to_stop_compiler_warnings = 0.0f; + float2 poiUV(float2 uv, float4 tex_st) + { + return uv * tex_st.xy + tex_st.zw; + } + float2 vertexUV(in VertexOut o, int index) + { + switch(index) + { + case 0: + return o.uv[0].xy; + case 1: + return o.uv[0].zw; + case 2: + return o.uv[1].xy; + case 3: + return o.uv[1].zw; + default: + return o.uv[0].xy; + } + } + float2 vertexUV(in appdata v, int index) + { + switch(index) + { + case 0: + return v.uv0.xy; + case 1: + return v.uv1.xy; + case 2: + return v.uv2.xy; + case 3: + return v.uv3.xy; + default: + return v.uv0.xy; + } + } + float calculateluminance(float3 color) + { + return color.r * 0.299 + color.g * 0.587 + color.b * 0.114; + } + float dotToDegrees(float dot) + { + dot = clamp(dot, -1.0, 1.0); + return degrees(acos(dot)); + } + float dotToDegrees(float3 a, float3 b) + { + return dotToDegrees(dot(normalize(a), normalize(b))); + } + float _VRChatCameraMode; + float _VRChatMirrorMode; + float VRCCameraMode() + { + return _VRChatCameraMode; + } + float VRCMirrorMode() + { + return _VRChatMirrorMode; + } + bool IsInMirror() + { + return unity_CameraProjection[2][0] != 0.f || unity_CameraProjection[2][1] != 0.f; + } + bool IsOrthographicCamera() + { + return unity_OrthoParams.w == 1 || UNITY_MATRIX_P[3][3] == 1; + } + float shEvaluateDiffuseL1Geomerics_local(float L0, float3 L1, float3 n) + { + float R0 = max(0, L0); + float3 R1 = 0.5f * L1; + float lenR1 = length(R1); + float q = dot(normalize(R1), n) * 0.5 + 0.5; + q = saturate(q); // Thanks to ScruffyRuffles for the bug identity. + float p = 1.0f + 2.0f * lenR1 / R0; + float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); + return R0 * (a + (1.0f - a) * (p + 1.0f) * pow(q, p)); + } + half3 BetterSH9(half4 normal) + { + float3 indirect; + float3 L0 = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w) + float3(PoiSHBr.z, PoiSHBg.z, PoiSHBb.z) / 3.0; + indirect.r = shEvaluateDiffuseL1Geomerics_local(L0.r, PoiSHAr.xyz, normal.xyz); + indirect.g = shEvaluateDiffuseL1Geomerics_local(L0.g, PoiSHAg.xyz, normal.xyz); + indirect.b = shEvaluateDiffuseL1Geomerics_local(L0.b, PoiSHAb.xyz, normal.xyz); + indirect = max(0, indirect); + indirect += SHEvalLinearL2(normal); + return indirect; + } + float3 getCameraForward() + { + #if UNITY_SINGLE_PASS_STEREO + float3 p1 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 1, 1)); + float3 p2 = mul(unity_StereoCameraToWorld[0], float4(0, 0, 0, 1)); + #else + float3 p1 = mul(unity_CameraToWorld, float4(0, 0, 1, 1)).xyz; + float3 p2 = mul(unity_CameraToWorld, float4(0, 0, 0, 1)).xyz; + #endif + return normalize(p2 - p1); + } + half3 GetSHLength() + { + half3 x, x1; + x.r = length(PoiSHAr); + x.g = length(PoiSHAg); + x.b = length(PoiSHAb); + x1.r = length(PoiSHBr); + x1.g = length(PoiSHBg); + x1.b = length(PoiSHBb); + return x + x1; + } + float3 BoxProjection(float3 direction, float3 position, float4 cubemapPosition, float3 boxMin, float3 boxMax) + { + #if UNITY_SPECCUBE_BOX_PROJECTION + if (cubemapPosition.w > 0) + { + float3 factors = ((direction > 0 ? boxMax : boxMin) - position) / direction; + float scalar = min(min(factors.x, factors.y), factors.z); + direction = direction * scalar + (position - cubemapPosition.xyz); + } + #endif + return direction; + } + float poiMax(float2 i) + { + return max(i.x, i.y); + } + float poiMax(float3 i) + { + return max(max(i.x, i.y), i.z); + } + float poiMax(float4 i) + { + return max(max(max(i.x, i.y), i.z), i.w); + } + float3 calculateNormal(in float3 baseNormal, in PoiMesh poiMesh, in Texture2D normalTexture, in float4 normal_ST, in float2 normalPan, in float normalUV, in float normalIntensity) + { + float3 normal = UnpackScaleNormal(POI2D_SAMPLER_PAN(normalTexture, _MainTex, poiUV(poiMesh.uv[normalUV], normal_ST), normalPan), normalIntensity); + return normalize( + normal.x * poiMesh.tangent[0] + + normal.y * poiMesh.binormal[0] + + normal.z * baseNormal + ); + } + float remap(float x, float minOld, float maxOld, float minNew = 0, float maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float2 remap(float2 x, float2 minOld, float2 maxOld, float2 minNew = 0, float2 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float3 remap(float3 x, float3 minOld, float3 maxOld, float3 minNew = 0, float3 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float4 remap(float4 x, float4 minOld, float4 maxOld, float4 minNew = 0, float4 maxNew = 1) + { + return minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld); + } + float remapClamped(float minOld, float maxOld, float x, float minNew = 0, float maxNew = 1) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 remapClamped(float2 minOld, float2 maxOld, float2 x, float2 minNew, float2 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float3 remapClamped(float3 minOld, float3 maxOld, float3 x, float3 minNew, float3 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float4 remapClamped(float4 minOld, float4 maxOld, float4 x, float4 minNew, float4 maxNew) + { + return clamp(minNew + (x - minOld) * (maxNew - minNew) / (maxOld - minOld), minNew, maxNew); + } + float2 calcParallax(in float height, in PoiCam poiCam) + { + return ((height * - 1) + 1) * (poiCam.tangentViewDir.xy / poiCam.tangentViewDir.z); + } + float4 poiBlend(const float sourceFactor, const float4 sourceColor, const float destinationFactor, const float4 destinationColor, const float4 blendFactor) + { + float4 sA = 1 - blendFactor; + const float4 blendData[11] = { + float4(0.0, 0.0, 0.0, 0.0), + float4(1.0, 1.0, 1.0, 1.0), + destinationColor, + sourceColor, + float4(1.0, 1.0, 1.0, 1.0) - destinationColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sourceColor, + sA, + float4(1.0, 1.0, 1.0, 1.0) - sA, + saturate(sourceColor.aaaa), + 1 - sA, + }; + return lerp(blendData[sourceFactor] * sourceColor + blendData[destinationFactor] * destinationColor, sourceColor, sA); + } + float blendColorBurn(float base, float blend) + { + return (blend == 0.0) ? blend : max((1.0 - ((1.0 - base) * rcp(random_uniform_float_only_used_to_stop_compiler_warnings + blend))), 0.0); + } + float3 blendColorBurn(float3 base, float3 blend) + { + return float3(blendColorBurn(base.r, blend.r), blendColorBurn(base.g, blend.g), blendColorBurn(base.b, blend.b)); + } + float blendColorDodge(float base, float blend) + { + return (blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0); + } + float3 blendColorDodge(float3 base, float3 blend) + { + return float3(blendColorDodge(base.r, blend.r), blendColorDodge(base.g, blend.g), blendColorDodge(base.b, blend.b)); + } + float blendDarken(float base, float blend) + { + return min(blend, base); + } + float3 blendDarken(float3 base, float3 blend) + { + return float3(blendDarken(base.r, blend.r), blendDarken(base.g, blend.g), blendDarken(base.b, blend.b)); + } + float blendOverlay(float base, float blend) + { + return base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)); + } + float3 blendOverlay(float3 base, float3 blend) + { + return float3(blendOverlay(base.r, blend.r), blendOverlay(base.g, blend.g), blendOverlay(base.b, blend.b)); + } + float blendLighten(float base, float blend) + { + return max(blend, base); + } + float3 blendLighten(float3 base, float3 blend) + { + return float3(blendLighten(base.r, blend.r), blendLighten(base.g, blend.g), blendLighten(base.b, blend.b)); + } + float blendLinearDodge(float base, float blend) + { + return min(base + blend, 1.0); + } + float3 blendLinearDodge(float3 base, float3 blend) + { + return base + blend; + } + float blendMultiply(float base, float blend) + { + return base * blend; + } + float3 blendMultiply(float3 base, float3 blend) + { + return base * blend; + } + float blendNormal(float base, float blend) + { + return blend; + } + float3 blendNormal(float3 base, float3 blend) + { + return blend; + } + float blendScreen(float base, float blend) + { + return 1.0 - ((1.0 - base) * (1.0 - blend)); + } + float3 blendScreen(float3 base, float3 blend) + { + return float3(blendScreen(base.r, blend.r), blendScreen(base.g, blend.g), blendScreen(base.b, blend.b)); + } + float blendSubtract(float base, float blend) + { + return max(base - blend, 0.0); + } + float3 blendSubtract(float3 base, float3 blend) + { + return max(base - blend, 0.0); + } + float blendMixed(float base, float blend) + { + return base + base * blend; + } + float3 blendMixed(float3 base, float3 blend) + { + return base + base * blend; + } + float3 customBlend(float3 base, float3 blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 1: output = lerp(base, blendDarken(base, blend), alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + float3 customBlend(float base, float blend, float blendType, float alpha = 1) + { + float3 output = base; + switch(blendType) + { + case 0: output = lerp(base, blend, alpha); break; + case 2: output = base * lerp(1, blend, alpha); break; + case 5: output = lerp(base, blendLighten(base, blend), alpha); break; + case 6: output = lerp(base, blendScreen(base, blend), alpha); break; + case 7: output = blendSubtract(base, blend * alpha); break; + case 8: output = lerp(base, blendLinearDodge(base, blend), alpha); break; + case 9: output = lerp(base, blendOverlay(base, blend), alpha); break; + case 20: output = lerp(base, blendMixed(base, blend), alpha); break; + default: output = 0; break; + } + return output; + } + #define REPLACE 0 + #define SUBSTRACT 1 + #define MULTIPLY 2 + #define DIVIDE 3 + #define MIN 4 + #define MAX 5 + #define AVERAGE 6 + #define ADD 7 + float maskBlend(float baseMask, float blendMask, float blendType) + { + float output = 0; + switch(blendType) + { + case REPLACE: output = blendMask; break; + case SUBSTRACT: output = baseMask - blendMask; break; + case MULTIPLY: output = baseMask * blendMask; break; + case DIVIDE: output = baseMask / blendMask; break; + case MIN: output = min(baseMask, blendMask); break; + case MAX: output = max(baseMask, blendMask); break; + case AVERAGE: output = (baseMask + blendMask) * 0.5; break; + case ADD: output = baseMask + blendMask; break; + } + return saturate(output); + } + float globalMaskBlend(float baseMask, float globalMaskIndex, float blendType, PoiMods poiMods) + { + if (globalMaskIndex == 0) + { + return baseMask; + } + else + { + return maskBlend(baseMask, poiMods.globalMask[globalMaskIndex - 1], blendType); + } + } + inline float poiRand(float2 co) + { + float3 p3 = frac(float3(co.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.x + p3.y) * p3.z); + } + inline float4 poiRand4(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + float2 a = frac((p3.xx + p3.yz) * p3.zy); + float2 s2 = seed + 37.0; + float3 q3 = frac(float3(s2.xyx) * 0.1031); + q3 += dot(q3, q3.yzx + 33.33); + float2 b = frac((q3.xx + q3.yz) * q3.zy); + return float4(a, b); + } + inline float2 poiRand2(float seed) + { + float2 x = float2(seed, seed * 1.3); + float3 p3 = frac(float3(x.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float2 poiRand2(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xx + p3.yz) * p3.zy); + } + inline float poiRand3(float seed) + { + float p = frac(seed * 0.1031); + p *= p + 33.33; + p *= p + p; + return frac(p); + } + inline float3 poiRand3(float2 seed) + { + float3 p3 = frac(float3(seed.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3(float3 seed) + { + float3 p3 = frac(seed * 0.1031); + p3 += dot(p3, p3.zyx + 31.32); + return frac((p3.xxy + p3.yzz) * p3.zyx); + } + inline float3 poiRand3Range(float2 Seed, float Range) + { + float3 r = poiRand3(Seed); + return (r * 2.0 - 1.0) * Range; + } + float3 randomFloat3WiggleRange(float2 Seed, float Range, float wiggleSpeed, float timeOffset) + { + float3 rando = (float3( + frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), + frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) + ) * 2 - 1); + float speed = 1 + wiggleSpeed; + return float3(sin(((_Time.x + timeOffset) + rando.x * PI) * speed), sin(((_Time.x + timeOffset) + rando.y * PI) * speed), sin(((_Time.x + timeOffset) + rando.z * PI) * speed)) * Range; + } + static const float3 HCYwts = float3(0.299, 0.587, 0.114); + static const float HCLgamma = 3; + static const float HCLy0 = 100; + static const float HCLmaxL = 0.530454533953517; // == exp(HCLgamma / HCLy0) - 0.5 + static const float3 wref = float3(1.0, 1.0, 1.0); + #define TAU 6.28318531 + float3 HUEtoRGB(in float H) + { + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); + return saturate(float3(R, G, B)); + } + float3 RGBtoHCV(in float3 RGB) + { + float4 P = (RGB.g < RGB.b) ? float4(RGB.bg, -1.0, 2.0 / 3.0) : float4(RGB.gb, 0.0, -1.0 / 3.0); + float4 Q = (RGB.r < P.x) ? float4(P.xyw, RGB.r) : float4(RGB.r, P.yzx); + float C = Q.x - min(Q.w, Q.y); + float H = abs((Q.w - Q.y) / (6 * C + EPSILON) + Q.z); + return float3(H, C, Q.x); + } + float3 RGBtoHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + float3 HSVtoRGB(float3 c) + { + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + void DecomposeHDRColor(in float3 linearColorHDR, out float3 baseLinearColor, out float exposure) + { + float maxColorComponent = max(linearColorHDR.r, max(linearColorHDR.g, linearColorHDR.b)); + bool isSDR = maxColorComponent <= 1.0; + float scaleFactor = isSDR ? 1.0 : (1.0 / maxColorComponent); + exposure = isSDR ? 0.0 : log(maxColorComponent) * 1.44269504089; // ln(2) + baseLinearColor = scaleFactor * linearColorHDR; + } + float3 ApplyHDRExposure(float3 linearColor, float exposure) + { + return linearColor * pow(2, exposure); + } + float3 ModifyViaHSV(float3 color, float h, float s, float v) + { + float3 colorHSV = RGBtoHSV(color); + colorHSV.x = frac(colorHSV.x + h); + colorHSV.y = saturate(colorHSV.y + s); + colorHSV.z = saturate(colorHSV.z + v); + return HSVtoRGB(colorHSV); + } + float3 ModifyViaHSV(float3 color, float3 HSVMod) + { + return ModifyViaHSV(color, HSVMod.x, HSVMod.y, HSVMod.z); + } + float4x4 brightnessMatrix(float brightness) + { + return float4x4( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + brightness, brightness, brightness, 1 + ); + } + float4x4 contrastMatrix(float contrast) + { + float t = (1.0 - contrast) / 2.0; + return float4x4( + contrast, 0, 0, 0, + 0, contrast, 0, 0, + 0, 0, contrast, 0, + t, t, t, 1 + ); + } + float4x4 saturationMatrix(float saturation) + { + float3 luminance = float3(0.3086, 0.6094, 0.0820); + float oneMinusSat = 1.0 - saturation; + float3 red = luminance.x * oneMinusSat; + red += float3(saturation, 0, 0); + float3 green = luminance.y * oneMinusSat; + green += float3(0, saturation, 0); + float3 blue = luminance.z * oneMinusSat; + blue += float3(0, 0, saturation); + return float4x4( + red, 0, + green, 0, + blue, 0, + 0, 0, 0, 1 + ); + } + float4 PoiColorBCS(float4 color, float brightness, float contrast, float saturation) + { + return mul(color, mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))); + } + float3 PoiColorBCS(float3 color, float brightness, float contrast, float saturation) + { + return mul(float4(color, 1), mul(brightnessMatrix(brightness), mul(contrastMatrix(contrast), saturationMatrix(saturation)))).rgb; + } + float3 linear_srgb_to_oklab(float3 c) + { + float l = 0.4122214708 * c.x + 0.5363325363 * c.y + 0.0514459929 * c.z; + float m = 0.2119034982 * c.x + 0.6806995451 * c.y + 0.1073969566 * c.z; + float s = 0.0883024619 * c.x + 0.2817188376 * c.y + 0.6299787005 * c.z; + float l_ = pow(l, 1.0 / 3.0); + float m_ = pow(m, 1.0 / 3.0); + float s_ = pow(s, 1.0 / 3.0); + return float3( + 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_, + 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_, + 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ + ); + } + float3 oklab_to_linear_srgb(float3 c) + { + float l_ = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z; + float m_ = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z; + float s_ = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z; + float l = l_ * l_ * l_; + float m = m_ * m_ * m_; + float s = s_ * s_ * s_; + return float3( + + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + - 1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + - 0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s + ); + } + float3 hueShiftOKLab(float3 color, float shift, float selectOrShift) + { + float3 oklab = linear_srgb_to_oklab(color); + float chroma = length(oklab.yz); + if (chroma < 1e-5) + { + return color; + } + float hue = atan2(oklab.z, oklab.y); + hue = shift * TWO_PI + hue * selectOrShift; // Add the hue shift + oklab.y = cos(hue) * chroma; + oklab.z = sin(hue) * chroma; + return oklab_to_linear_srgb(oklab); + } + float3 hueShiftHSV(float3 color, float hueOffset, float selectOrShift) + { + float3 hsvCol = RGBtoHSV(color); + hsvCol.x = hsvCol.x * selectOrShift + hueOffset; + return HSVtoRGB(hsvCol); + } + float3 hueShift(float3 color, float shift, float ColorSpace, float selectOrShift) + { + switch(ColorSpace) + { + case 0.0: + return hueShiftOKLab(color, shift, selectOrShift); + case 1.0: + return hueShiftHSV(color, shift, selectOrShift); + default: + return float3(1.0, 0.0, 0.0); + } + } + float4 hueShift(float4 color, float shift, float ColorSpace, float selectOrShift) + { + return float4(hueShift(color.rgb, shift, ColorSpace, selectOrShift), color.a); + } + float4x4 poiRotationMatrixFromAngles(float x, float y, float z) + { + float angleX = radians(x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float4x4 poiRotationMatrixFromAngles(float3 angles) + { + float angleX = radians(angles.x); + float c = cos(angleX); + float s = sin(angleX); + float4x4 rotateXMatrix = float4x4(1, 0, 0, 0, + 0, c, -s, 0, + 0, s, c, 0, + 0, 0, 0, 1); + float angleY = radians(angles.y); + c = cos(angleY); + s = sin(angleY); + float4x4 rotateYMatrix = float4x4(c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1); + float angleZ = radians(angles.z); + c = cos(angleZ); + s = sin(angleZ); + float4x4 rotateZMatrix = float4x4(c, -s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + return mul(mul(rotateXMatrix, rotateYMatrix), rotateZMatrix); + } + float3 _VRChatMirrorCameraPos; + float3 getCameraPosition() + { + #ifdef USING_STEREO_MATRICES + return unity_StereoWorldSpaceCameraPos[0] * .5 + unity_StereoWorldSpaceCameraPos[1] * .5; + #endif + return _VRChatMirrorMode == 1 ? _VRChatMirrorCameraPos : _WorldSpaceCameraPos; + } + #ifdef POI_AUDIOLINK + inline int poiALBandPass(int bandIdx) + { + bandIdx = clamp(bandIdx, 0, 3); + return bandIdx == 0 ? ALPASS_AUDIOBASS : bandIdx == 1 ? ALPASS_AUDIOLOWMIDS : bandIdx == 2 ? ALPASS_AUDIOHIGHMIDS : ALPASS_AUDIOTREBLE; + } + #endif + float2 calcPixelScreenUVs(half4 grabPos) + { + half2 uv = grabPos.xy / (grabPos.w + 0.0000000001); + #if UNITY_SINGLE_PASS_STEREO + uv.xy *= half2(_ScreenParams.x * 2, _ScreenParams.y); + #else + uv.xy *= _ScreenParams.xy; + #endif + return uv; + } + float CalcMipLevel(float2 texture_coord) + { + float2 dx = ddx(texture_coord); + float2 dy = ddy(texture_coord); + float delta_max_sqr = max(dot(dx, dx), dot(dy, dy)); + return 0.5 * log2(delta_max_sqr); + } + float inverseLerp(float A, float B, float T) + { + return (T - A) / (B - A); + } + float inverseLerp2(float2 a, float2 b, float2 value) + { + float2 AB = b - a; + float2 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp3(float3 a, float3 b, float3 value) + { + float3 AB = b - a; + float3 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float inverseLerp4(float4 a, float4 b, float4 value) + { + float4 AB = b - a; + float4 AV = value - a; + return dot(AV, AB) / dot(AB, AB); + } + float4 QuaternionFromMatrix( + float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + float4 q; + float trace = m00 + m11 + m22; + if (trace > 0) + { + float s = sqrt(trace + 1) * 2; + q.w = 0.25 * s; + q.x = (m21 - m12) / s; + q.y = (m02 - m20) / s; + q.z = (m10 - m01) / s; + } + else if (m00 > m11 && m00 > m22) + { + float s = sqrt(1 + m00 - m11 - m22) * 2; + q.w = (m21 - m12) / s; + q.x = 0.25 * s; + q.y = (m01 + m10) / s; + q.z = (m02 + m20) / s; + } + else if (m11 > m22) + { + float s = sqrt(1 + m11 - m00 - m22) * 2; + q.w = (m02 - m20) / s; + q.x = (m01 + m10) / s; + q.y = 0.25 * s; + q.z = (m12 + m21) / s; + } + else + { + float s = sqrt(1 + m22 - m00 - m11) * 2; + q.w = (m10 - m01) / s; + q.x = (m02 + m20) / s; + q.y = (m12 + m21) / s; + q.z = 0.25 * s; + } + return q; + } + float4 MulQuat(float4 a, float4 b) + { + return float4( + a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, + a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, + a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w, + a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z + ); + } + float4 QuaternionFromBasis(float3 sx, float3 sy, float3 sz) + { + return QuaternionFromMatrix( + sx.x, sy.x, sz.x, + sx.y, sy.y, sz.y, + sx.z, sy.z, sz.z + ); + } + float4 BuildQuatFromForwardUp(float3 forward, float3 up) + { + float3 f = normalize(forward); + float3 u = normalize(up); + float3 x = normalize(cross(u, f)); + float3 y = cross(f, x); + return QuaternionFromBasis(x, y, f); + } + float3 QuaternionToEuler(float4 q) + { + float3 euler; + float sinr_cosp = 2 * (q.w * q.z + q.x * q.y); + float cosr_cosp = 1 - 2 * (q.z * q.z + q.x * q.x); + euler.z = atan2(sinr_cosp, cosr_cosp) * 57.2958; + float sinp = 2 * (q.w * q.x - q.y * q.z); + if (abs(sinp) >= 1) + euler.x = (sinp >= 0 ? 1 : - 1) * 90; + else + euler.x = asin(sinp) * 57.2958; + float siny_cosp = 2 * (q.w * q.y + q.z * q.x); + float cosy_cosp = 1 - 2 * (q.x * q.x + q.y * q.y); + euler.y = atan2(siny_cosp, cosy_cosp) * 57.2958; + return euler; + } + float4 EulerToQuaternion(float3 euler) + { + float3 eulerRad = euler * 0.0174533; + float cx = cos(eulerRad.x * 0.5); + float sx = sin(eulerRad.x * 0.5); + float cy = cos(eulerRad.y * 0.5); + float sy = sin(eulerRad.y * 0.5); + float cz = cos(eulerRad.z * 0.5); + float sz = sin(eulerRad.z * 0.5); + float4 q; + q.w = cx * cy * cz + sx * sy * sz; + q.x = sx * cy * cz - cx * sy * sz; + q.y = cx * sy * cz + sx * cy * sz; + q.z = cx * cy * sz - sx * sy * cz; + return q; + } + float4 quaternion_conjugate(float4 v) + { + return float4( + v.x, -v.yzw + ); + } + float4 quaternion_mul(float4 v1, float4 v2) + { + float4 result1 = (v1.x * v2 + v1 * v2.x); + float4 result2 = float4( + - dot(v1.yzw, v2.yzw), + cross(v1.yzw, v2.yzw) + ); + return float4(result1 + result2); + } + float4 get_quaternion_from_angle(float3 axis, float angle) + { + float sn = sin(angle * 0.5); + float cs = cos(angle * 0.5); + return float4(axis * sn, cs); + } + float4 quaternion_from_vector(float3 inVec) + { + return float4(0.0, inVec); + } + float degree_to_radius(float degree) + { + return ( + degree / 180.0 * PI + ); + } + float3 rotate_with_quaternion(float3 inVec, float3 rotation) + { + float4 qx = get_quaternion_from_angle(float3(1, 0, 0), radians(rotation.x)); + float4 qy = get_quaternion_from_angle(float3(0, 1, 0), radians(rotation.y)); + float4 qz = get_quaternion_from_angle(float3(0, 0, 1), radians(rotation.z)); + #define MUL3(A, B, C) quaternion_mul(quaternion_mul((A), (B)), (C)) + float4 quaternion = normalize(MUL3(qx, qy, qz)); + float4 conjugate = quaternion_conjugate(quaternion); + float4 inVecQ = quaternion_from_vector(inVec); + float3 rotated = ( + MUL3(quaternion, inVecQ, conjugate) + ).yzw; + return rotated; + } + float3 RotateByQuaternion(float4 q, float3 v) + { + float3 u = q.xyz; + float s = q.w; + return 2.0 * dot(u, v) * u + + (s * s - dot(u, u)) * v + + 2.0 * s * cross(u, v); + } + float4 SlerpQuaternion(float4 qa, float4 qb, float t) + { + float cosHalfTheta = dot(qa, qb); + if (cosHalfTheta < 0.0) + { + qb = -qb; + cosHalfTheta = -cosHalfTheta; + } + if (cosHalfTheta > 0.9995) + { + float4 qr = normalize(qa * (1 - t) + qb * t); + return qr; + } + float halfTheta = acos(cosHalfTheta); + float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta); + float a = sin((1 - t) * halfTheta) / sinHalfTheta; + float b = sin(t * halfTheta) / sinHalfTheta; + return qa * a + qb * b; + } + float4 transform(float4 input, float4 pos, float4 rotation, float4 scale) + { + input.rgb *= (scale.xyz * scale.w); + input = float4(rotate_with_quaternion(input.xyz, rotation.xyz * rotation.w) + (pos.xyz * pos.w), input.w); + return input; + } + float2 RotateUV(float2 _uv, float _radian, float2 _piv, float _time) + { + float RotateUV_ang = _radian; + float RotateUV_cos = cos(_time * RotateUV_ang); + float RotateUV_sin = sin(_time * RotateUV_ang); + return (mul(_uv - _piv, float2x2(RotateUV_cos, -RotateUV_sin, RotateUV_sin, RotateUV_cos)) + _piv); + } + float3 RotateAroundAxis(float3 original, float3 axis, float radian) + { + float s = sin(radian); + float c = cos(radian); + float one_minus_c = 1.0 - c; + axis = normalize(axis); + float3x3 rot_mat = { + one_minus_c * axis.x * axis.x + c, one_minus_c * axis.x * axis.y - axis.z * s, one_minus_c * axis.z * axis.x + axis.y * s, + one_minus_c * axis.x * axis.y + axis.z * s, one_minus_c * axis.y * axis.y + c, one_minus_c * axis.y * axis.z - axis.x * s, + one_minus_c * axis.z * axis.x - axis.y * s, one_minus_c * axis.y * axis.z + axis.x * s, one_minus_c * axis.z * axis.z + c + }; + return mul(rot_mat, original); + } + float3 poiThemeColor(in PoiMods poiMods, in float3 srcColor, in float themeIndex) + { + float3 outputColor = srcColor; + if (themeIndex != 0) + { + themeIndex = max(themeIndex - 1, 0); + if (themeIndex <= 3) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + else + { + #ifdef POI_AUDIOLINK + if (poiMods.audioLinkAvailable) + { + outputColor = poiMods.globalColorTheme[themeIndex]; + } + #endif + } + } + return outputColor; + } + float3 lilToneCorrection(float3 c, float4 hsvg) + { + c = pow(abs(c), hsvg.w); + float4 p = (c.b > c.g) ? float4(c.bg, -1.0, 2.0 / 3.0) : float4(c.gb, 0.0, -1.0 / 3.0); + float4 q = (p.x > c.r) ? float4(p.xyw, c.r) : float4(c.r, p.yzx); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + float3 hsv = float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + hsv = float3(hsv.x + hsvg.x, saturate(hsv.y * hsvg.y), saturate(hsv.z * hsvg.z)); + return hsv.z - hsv.z * hsv.y + hsv.z * hsv.y * saturate(abs(frac(hsv.x + float3(1.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0) - 1.0); + } + float3 lilBlendColor(float3 dstCol, float3 srcCol, float3 srcA, int blendMode) + { + float3 ad = dstCol + srcCol; + float3 mu = dstCol * srcCol; + float3 outCol = float3(0, 0, 0); + if (blendMode == 0) outCol = srcCol; // Normal + if (blendMode == 1) outCol = ad; // Add + if (blendMode == 2) outCol = max(ad - mu, dstCol); // Screen + if (blendMode == 3) outCol = mu; // Multiply + return lerp(dstCol, outCol, srcA); + } + float lilIsIn0to1(float f) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, 1.0)); + } + float lilIsIn0to1(float f, float nv) + { + float value = 0.5 - abs(f - 0.5); + return saturate(value / clamp(fwidth(value), 0.0001, nv)); + } + float poiEdgeLinearNoSaturate(float value, float border) + { + return (value - border) / clamp(fwidth(value), 0.0001, 1.0); + } + float3 poiEdgeLinearNoSaturate(float value, float3 border) + { + return float3( + (value - border.x) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.y) / clamp(fwidth(value), 0.0001, 1.0), + (value - border.z) / clamp(fwidth(value), 0.0001, 1.0) + ); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur) + { + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return (value - borderMin) / max(saturate(borderMax - borderMin + fwidth(value)), .0001); + } + float poiEdgeNonLinearNoSaturate(float value, float border) + { + float fwidthValue = fwidth(value); + return smoothstep(border - fwidthValue, border + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinearNoSaturate(float value, float border, float blur, float borderRange) + { + float fwidthValue = fwidth(value); + float borderMin = saturate(border - blur * 0.5 - borderRange); + float borderMax = saturate(border + blur * 0.5); + return smoothstep(borderMin - fwidthValue, borderMax + fwidthValue, value); + } + float poiEdgeNonLinear(float value, float border) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border)); + } + float poiEdgeNonLinear(float value, float border, float blur) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur)); + } + float poiEdgeNonLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeNonLinearNoSaturate(value, border, blur, borderRange)); + } + float poiEdgeLinear(float value, float border) + { + return saturate(poiEdgeLinearNoSaturate(value, border)); + } + float poiEdgeLinear(float value, float border, float blur) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur)); + } + float poiEdgeLinear(float value, float border, float blur, float borderRange) + { + return saturate(poiEdgeLinearNoSaturate(value, border, blur, borderRange)); + } + float3 OpenLitLinearToSRGB(float3 col) + { + return LinearToGammaSpace(col); + } + float3 OpenLitSRGBToLinear(float3 col) + { + return GammaToLinearSpace(col); + } + float OpenLitLuminance(float3 rgb) + { + #if defined(UNITY_COLORSPACE_GAMMA) + return dot(rgb, float3(0.22, 0.707, 0.071)); + #else + return dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + } + float3 AdjustLitLuminance(float3 rgb, float targetLuminance) + { + float currentLuminance; + #if defined(UNITY_COLORSPACE_GAMMA) + currentLuminance = dot(rgb, float3(0.22, 0.707, 0.071)); + #else + currentLuminance = dot(rgb, float3(0.0396819152, 0.458021790, 0.00609653955)); + #endif + float luminanceRatio = targetLuminance / currentLuminance; + return rgb * luminanceRatio; + } + float3 ClampLuminance(float3 rgb, float minLuminance, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float minRatio = (currentLuminance != 0) ? minLuminance / currentLuminance : 1.0; + float maxRatio = (currentLuminance != 0) ? maxLuminance / currentLuminance : 1.0; + float luminanceRatio = clamp(min(maxRatio, max(minRatio, 1.0)), 0.0, 1.0); + return lerp(rgb, rgb * luminanceRatio, luminanceRatio < 1.0); + } + float3 MaxLuminance(float3 rgb, float maxLuminance) + { + float currentLuminance = dot(rgb, float3(0.299, 0.587, 0.114)); + float luminanceRatio = (currentLuminance != 0) ? maxLuminance / max(currentLuminance, 0.00001) : 1.0; + return lerp(rgb, rgb * luminanceRatio, currentLuminance > maxLuminance); + } + float OpenLitGray(float3 rgb) + { + return dot(rgb, float3(1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0)); + } + void OpenLitShadeSH9ToonDouble(float3 lightDirection, out float3 shMax, out float3 shMin) + { + #if !defined(LIGHTMAP_ON) + float3 N = lightDirection * 0.666666; + float4 vB = N.xyzz * N.yzzx; + float3 res = float3(PoiSHAr.w, PoiSHAg.w, PoiSHAb.w); + res.r += dot(PoiSHBr, vB); + res.g += dot(PoiSHBg, vB); + res.b += dot(PoiSHBb, vB); + res += PoiSHC.rgb * (N.x * N.x - N.y * N.y); + float3 l1; + l1.r = dot(PoiSHAr.rgb, N); + l1.g = dot(PoiSHAg.rgb, N); + l1.b = dot(PoiSHAb.rgb, N); + shMax = res + l1; + shMin = res - l1; + #if defined(UNITY_COLORSPACE_GAMMA) + shMax = OpenLitLinearToSRGB(shMax); + shMin = OpenLitLinearToSRGB(shMin); + #endif + #else + shMax = 0.0; + shMin = 0.0; + #endif + } + float3 OpenLitComputeCustomLightDirection(float4 lightDirectionOverride) + { + float3 customDir = length(lightDirectionOverride.xyz) * normalize(mul((float3x3)unity_ObjectToWorld, lightDirectionOverride.xyz)); + return lightDirectionOverride.w ? customDir : lightDirectionOverride.xyz; // .w isn't doc'd anywhere and is always 0 unless end user changes it + } + float3 OpenLitLightingDirectionForSH9() + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 lightDirectionForSH9 = sh9Dir + mainDir; + lightDirectionForSH9 = dot(lightDirectionForSH9, lightDirectionForSH9) < 0.000001 ? 0 : normalize(lightDirectionForSH9); + return lightDirectionForSH9; + } + float3 OpenLitLightingDirection(float4 lightDirectionOverride) + { + float3 mainDir = _WorldSpaceLightPos0.xyz * OpenLitLuminance(_LightColor0.rgb); + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + float3 sh9Dir = PoiSHAr.xyz * 0.333333 + PoiSHAg.xyz * 0.333333 + PoiSHAb.xyz * 0.333333; + float3 sh9DirAbs = float3(sh9Dir.x, abs(sh9Dir.y), sh9Dir.z); + #else + float3 sh9Dir = 0; + float3 sh9DirAbs = 0; + #endif + float3 customDir = OpenLitComputeCustomLightDirection(lightDirectionOverride); + return normalize(sh9DirAbs + mainDir + customDir); + } + float3 OpenLitLightingDirection() + { + float4 customDir = float4(0.001, 0.002, 0.001, 0.0); + return OpenLitLightingDirection(customDir); + } + inline float4 CalculateFrustumCorrection() + { + float x1 = -UNITY_MATRIX_P._31 / (UNITY_MATRIX_P._11 * UNITY_MATRIX_P._34); + float x2 = -UNITY_MATRIX_P._32 / (UNITY_MATRIX_P._22 * UNITY_MATRIX_P._34); + return float4(x1, x2, 0, UNITY_MATRIX_P._33 / UNITY_MATRIX_P._34 + x1 * UNITY_MATRIX_P._13 + x2 * UNITY_MATRIX_P._23); + } + inline float CorrectedLinearEyeDepth(float z, float correctionFactor) + { + return 1.f / (z / UNITY_MATRIX_P._34 + correctionFactor); + } + float evalRamp4(float time, float4 ramp) + { + return lerp(ramp.x, ramp.y, smoothstep(ramp.z, ramp.w, time)); + } + float2 sharpSample(float4 texelSize, float2 p) + { + p = p * texelSize.zw; + float2 c = max(0.0, fwidth(p)); + p = floor(p) + saturate(frac(p) / c); + p = (p - 0.5) * texelSize.xy; + return p; + } + void applyToGlobalMask(inout PoiMods poiMods, int index, int blendType, float val) + { + float valBlended = saturate(maskBlend(poiMods.globalMask[index], val, blendType)); + switch(index) + { + case 0: poiMods.globalMask[0] = valBlended; break; + case 1: poiMods.globalMask[1] = valBlended; break; + case 2: poiMods.globalMask[2] = valBlended; break; + case 3: poiMods.globalMask[3] = valBlended; break; + case 4: poiMods.globalMask[4] = valBlended; break; + case 5: poiMods.globalMask[5] = valBlended; break; + case 6: poiMods.globalMask[6] = valBlended; break; + case 7: poiMods.globalMask[7] = valBlended; break; + case 8: poiMods.globalMask[8] = valBlended; break; + case 9: poiMods.globalMask[9] = valBlended; break; + case 10: poiMods.globalMask[10] = valBlended; break; + case 11: poiMods.globalMask[11] = valBlended; break; + case 12: poiMods.globalMask[12] = valBlended; break; + case 13: poiMods.globalMask[13] = valBlended; break; + case 14: poiMods.globalMask[14] = valBlended; break; + case 15: poiMods.globalMask[15] = valBlended; break; + } + } + void assignValueToVectorFromIndex(inout float4 vec, int index, float value) + { + switch(index) + { + case 0: vec[0] = value; break; + case 1: vec[1] = value; break; + case 2: vec[2] = value; break; + case 3: vec[3] = value; break; + } + } + float3 mod289(float3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float2 mod289(float2 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + float3 permute(float3 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + float snoise(float2 v) + { + const float4 C = float4(0.211324865405187, // (3.0 - sqrt(3.0)) / 6.0 + 0.366025403784439, // 0.5 * (sqrt(3.0) - 1.0) + - 0.577350269189626, // - 1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + float2 i = floor(v + dot(v, C.yy)); + float2 x0 = v - i + dot(i, C.xx); + float2 i1; + i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod289(i); // Avoid truncation effects in permutation + float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + + i.x + float3(0.0, i1.x, 1.0)); + float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); + m = m * m ; + m = m * m ; + float3 x = 2.0 * frac(p * C.www) - 1.0; + float3 h = abs(x) - 0.5; + float3 ox = floor(x + 0.5); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); + } + float poiInvertToggle(in float value, in float toggle) + { + return (toggle == 0 ? value : 1 - value); + } + float3 PoiBlendNormal(float3 dstNormal, float3 srcNormal) + { + return float3(dstNormal.xy + srcNormal.xy, dstNormal.z * srcNormal.z); + } + float3 lilTransformDirOStoWS(float3 directionOS, bool doNormalize) + { + if (doNormalize) return normalize(mul((float3x3)unity_ObjectToWorld, directionOS)); + else return mul((float3x3)unity_ObjectToWorld, directionOS); + } + float2 poiGetWidthAndHeight(Texture2D tex) + { + uint width, height; + tex.GetDimensions(width, height); + return float2(width, height); + } + float2 poiGetWidthAndHeight(Texture2DArray tex) + { + uint width, height, element; + tex.GetDimensions(width, height, element); + return float2(width, height); + } + bool SceneHasReflections() + { + float width, height; + unity_SpecCube0.GetDimensions(width, height); + return !(width * height < 2); + } + void applyUnityFog(inout float3 col, float2 fogData) + { + float fogFactor = 1.0; + float depth = UNITY_Z_0_FAR_FROM_CLIPSPACE(fogData.x); + if (unity_FogParams.z != unity_FogParams.w) + { + fogFactor = depth * unity_FogParams.z + unity_FogParams.w; + } + else if (fogData.y) + { + float exponent_val = unity_FogParams.x * depth; + fogFactor = exp2(-exponent_val * exponent_val); + } + else if (unity_FogParams.y != 0.0f) + { + float exponent = unity_FogParams.y * depth; + fogFactor = exp2(-exponent); + } + fixed3 appliedFogColor = unity_FogColor.rgb; + #if defined(UNITY_PASS_FORWARDADD) + appliedFogColor = fixed3(0, 0, 0); + #endif + col.rgb = lerp(appliedFogColor, col.rgb, saturate(fogFactor)); + } + void applyReducedRenderClipDistance(inout VertexOut o) + { + if (o.pos.w < _ProjectionParams.y * 1.01 && o.pos.w > 0) + { + #if defined(UNITY_REVERSED_Z) // DirectX + o.pos.z = o.pos.z * 0.0001 + o.pos.w * 0.999; + #else // OpenGL + o.pos.z = o.pos.z * 0.0001 - o.pos.w * 0.999; + #endif + } + } + VertexOut vert(appdata v) + { + UNITY_SETUP_INSTANCE_ID(v); + VertexOut o; + PoiInitStruct(VertexOut, o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + #ifdef POI_TESSELLATED + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(v); + #endif + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + #ifdef POI_AUDIOLINK + float vertexAudioLink[5]; + vertexAudioLink[0] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 0))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 0))[0]; + vertexAudioLink[1] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 1))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 1))[0]; + vertexAudioLink[2] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 2))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 2))[0]; + vertexAudioLink[3] = 0.0 == 0 ? AudioLinkData(ALPASS_AUDIOLINK + float2(0, 3))[0] : AudioLinkData(ALPASS_FILTEREDAUDIOLINK + float2((1 - 0.0) * 15.95, 3))[0]; + vertexAudioLink[4] = AudioLinkData(ALPASS_GENERALVU + float2(8, 0))[0]; + #endif + o.normal = UnityObjectToWorldNormal(v.normal); + o.tangent.xyz = UnityObjectToWorldDir(v.tangent); + o.tangent.w = v.tangent.w; + o.vertexColor = v.color; + o.uv[0] = float4(v.uv0.xy, v.uv1.xy); + o.uv[1] = float4(v.uv2.xy, v.uv3.xy); + #if defined(LIGHTMAP_ON) + o.lightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + #ifdef DYNAMICLIGHTMAP_ON + o.lightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + o.localPos = v.vertex; + o.worldPos = mul(unity_ObjectToWorld, o.localPos); + float3 localOffset = float3(0, 0, 0); + float3 worldOffset = float3(0, 0, 0); + o.localPos.rgb += localOffset; + o.worldPos.rgb += worldOffset; + o.pos = UnityObjectToClipPos(o.localPos); + o.fogData.x = o.pos.z; // This is used for fog calculations, so we need to ensure it's in clip space + #ifdef FOG_EXP2 + o.fogData.y = 1; + #else + o.fogData.y = 0; + #endif + #ifndef FORWARD_META_PASS + #if !defined(UNITY_PASS_SHADOWCASTER) + UNITY_TRANSFER_SHADOW(o, o.uv[0].xy); + #else + v.vertex.xyz = o.localPos.xyz; + TRANSFER_SHADOW_CASTER_NOPOS(o, o.pos); + #endif + #endif + o.worldDir = dot(o.pos, CalculateFrustumCorrection()); + if (0.0) + { + applyReducedRenderClipDistance(o); + } + #ifdef POI_PASS_META + o.pos = UnityMetaVertexPosition(v.vertex, v.uv1.xy, v.uv2.xy, unity_LightmapST, unity_DynamicLightmapST); + #endif + #ifdef POI_PASS_LILFUR + #endif + return o; + } + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + #define POI2D_SAMPLER_STOCHASTIC(tex, texSampler, uv, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, uv) : POI2D_SAMPLER(tex, texSampler, uv)) + #define POI2D_SAMPLER_PAN_STOCHASTIC(tex, texSampler, uv, pan, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan)) : POI2D_SAMPLER_PAN(tex, texSampler, uv, pan)) + #define POI2D_SAMPLER_PANGRAD_STOCHASTIC(tex, texSampler, uv, pan, dx, dy, useStochastic) (useStochastic ? DeliotHeitzSampleTexture(tex, sampler##texSampler, POI_PAN_UV(uv, pan), dx, dy) : POI2D_SAMPLER_PANGRAD(tex, texSampler, uv, pan, dx, dy)) + #endif + #if !defined(_STOCHASTICMODE_NONE) + float2 StochasticHash2D2D(float2 s) + { + return frac(sin(glsl_mod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453); + } + #endif + #if defined(_STOCHASTICMODE_DELIOT_HEITZ) + float3x3 DeliotHeitzStochasticUVBW(float2 uv) + { + const float2x2 stochasticSkewedGrid = float2x2(1.0, -0.57735027, 0.0, 1.15470054); + float2 skewUV = mul(stochasticSkewedGrid, uv * 3.4641 * 1.0); + float2 vxID = floor(skewUV); + float3 bary = float3(frac(skewUV), 0); + bary.z = 1.0 - bary.x - bary.y; + float3x3 pos = float3x3( + float3(vxID, bary.z), + float3(vxID + float2(0, 1), bary.y), + float3(vxID + float2(1, 0), bary.x) + ); + float3x3 neg = float3x3( + float3(vxID + float2(1, 1), -bary.z), + float3(vxID + float2(1, 0), 1.0 - bary.y), + float3(vxID + float2(0, 1), 1.0 - bary.x) + ); + return (bary.z > 0) ? pos : neg; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv, float2 dx, float2 dy) + { + float3x3 UVBW = DeliotHeitzStochasticUVBW(uv); + return mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[0].xy), dx, dy), UVBW[0].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[1].xy), dx, dy), UVBW[1].z) + + mul(tex.SampleGrad(texSampler, uv + StochasticHash2D2D(UVBW[2].xy), dx, dy), UVBW[2].z) ; + } + float4 DeliotHeitzSampleTexture(Texture2D tex, SamplerState texSampler, float2 uv) + { + float2 dx = ddx(uv), dy = ddy(uv); + return DeliotHeitzSampleTexture(tex, texSampler, uv, dx, dy); + } + #endif // defined(_STOCHASTICMODE_DELIOT_HEITZ) + void applyAlphaOptions(inout PoiFragData poiFragData, in PoiMesh poiMesh, in PoiCam poiCam, in PoiMods poiMods) + { + poiFragData.alpha = saturate(poiFragData.alpha + 0.0); + if (0.0 > 0) + { + poiFragData.alpha = maskBlend(poiFragData.alpha, poiMods.globalMask[0.0 - 1], 2.0); + } + } + void calculateGlobalThemes(inout PoiMods poiMods) + { + float4 themeColorExposures = 0; + float4 themeColor0, themeColor1, themeColor2, themeColor3 = 0; + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor0.rgb, themeColorExposures.x); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor1.rgb, themeColorExposures.y); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor2.rgb, themeColorExposures.z); + DecomposeHDRColor(float4(1,1,1,1).rgb, themeColor3.rgb, themeColorExposures.w); + poiMods.globalColorTheme[0] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor0.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.x), float4(1,1,1,1).a); + poiMods.globalColorTheme[1] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor1.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.y), float4(1,1,1,1).a); + poiMods.globalColorTheme[2] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor2.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.z), float4(1,1,1,1).a); + poiMods.globalColorTheme[3] = float4(ApplyHDRExposure(ModifyViaHSV(themeColor3.rgb, frac(0.0 + 0.0 * _Time.x), 0.0, 0.0), themeColorExposures.w), float4(1,1,1,1).a); + } + void ApplyGlobalMaskModifiers(in PoiMesh poiMesh, inout PoiMods poiMods, in PoiCam poiCam) + { + } + float2 calculatePolarCoordinate(in PoiMesh poiMesh) + { + float2 delta = poiMesh.uv[0.0] - float4(0.5,0.5,0,0); + float radius = length(delta) * 2 * 1.0; + float angle = atan2(delta.x, delta.y); + float phi = angle / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + angle = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + angle *= 1.0; + return float2(radius, angle + distance(poiMesh.uv[0.0], float4(0.5,0.5,0,0)) * 0.0); + } + float2 MonoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(1.0, 1.0 / UNITY_PI); + sphereCoords = float2(1.0, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 1.0).zw; + } + float2 StereoPanoProjection(float3 coords) + { + float3 normalizedCoords = normalize(coords); + float latitude = acos(normalizedCoords.y); + float longitude = atan2(normalizedCoords.z, normalizedCoords.x); + float phi = longitude / (UNITY_PI * 2.0); + float phi_frac = frac(phi); + longitude = fwidth(phi) - 0.0001 < fwidth(phi_frac) ? phi : phi_frac; + longitude *= 2; + float2 sphereCoords = float2(longitude, latitude) * float2(0.5, 1.0 / UNITY_PI); + sphereCoords = float2(0.5, 1.0) - sphereCoords; + return (sphereCoords + float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).xy) * float4(0, 1 - unity_StereoEyeIndex, 1, 0.5).zw; + } + float2 calculateWorldUV(in PoiMesh poiMesh) + { + return float2(0.0 != 3 ? poiMesh.worldPos[ 0.0] : 0.0f, 2.0 != 3 ? poiMesh.worldPos[2.0] : 0.0f); + } + float2 calculatelocalUV(in PoiMesh poiMesh) + { + float localUVs[8]; + localUVs[0] = poiMesh.localPos.x; + localUVs[1] = poiMesh.localPos.y; + localUVs[2] = poiMesh.localPos.z; + localUVs[3] = 0; + localUVs[4] = poiMesh.vertexColor.r; + localUVs[5] = poiMesh.vertexColor.g; + localUVs[6] = poiMesh.vertexColor.b; + localUVs[7] = poiMesh.vertexColor.a; + return float2(localUVs[0.0],localUVs[1.0]); + } + float2 calculatePanosphereUV(in PoiMesh poiMesh) + { + float3 viewDirection = normalize(lerp(getCameraPosition().xyz, _WorldSpaceCameraPos.xyz, 1.0) - poiMesh.worldPos.xyz) * - 1; + return lerp(MonoPanoProjection(viewDirection), StereoPanoProjection(viewDirection), 0.0); + } + float4 frag(VertexOut i, uint facing : SV_IsFrontFace) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + PoiSHAr = unity_SHAr; + PoiSHAg = unity_SHAg; + PoiSHAb = unity_SHAb; + PoiSHBr = unity_SHBr; + PoiSHBg = unity_SHBg; + PoiSHBb = unity_SHBb; + PoiSHC = unity_SHC; + PoiMesh poiMesh; + PoiInitStruct(PoiMesh, poiMesh); + PoiLight poiLight; + PoiInitStruct(PoiLight, poiLight); + PoiVertexLights poiVertexLights; + PoiInitStruct(PoiVertexLights, poiVertexLights); + PoiCam poiCam; + PoiInitStruct(PoiCam, poiCam); + PoiMods poiMods; + PoiInitStruct(PoiMods, poiMods); + poiMods.globalEmission = 1; + PoiFragData poiFragData; + poiFragData.smoothness = 1; + poiFragData.smoothness2 = 1; + poiFragData.metallic = 1; + poiFragData.specularMask = 1; + poiFragData.reflectionMask = 1; + poiFragData.emission = 0; + poiFragData.baseColor = float3(0, 0, 0); + poiFragData.finalColor = float3(0, 0, 0); + poiFragData.alpha = 1; + poiFragData.toggleVertexLights = 0; + #ifdef POI_UDIMDISCARD + applyUDIMDiscard(i, facing); + #endif + poiMesh.objectPosition = mul(unity_ObjectToWorld, float4(0, 0, 0, 1)).xyz; + poiMesh.objNormal = mul(unity_WorldToObject, i.normal); + poiMesh.normals[0] = i.normal; + poiMesh.tangent[0] = i.tangent.xyz; + poiMesh.binormal[0] = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w); + poiMesh.worldPos = i.worldPos.xyz; + poiMesh.localPos = i.localPos.xyz; + poiMesh.vertexColor = i.vertexColor; + poiMesh.isFrontFace = facing; + poiMesh.dx = ddx(poiMesh.uv[0]); + poiMesh.dy = ddy(poiMesh.uv[0]); + poiMesh.isRightHand = i.tangent.w > 0.0; + #ifndef POI_PASS_OUTLINE + if (!poiMesh.isFrontFace && 1) + { + poiMesh.normals[0] *= -1; + poiMesh.tangent[0] *= -1; + poiMesh.binormal[0] *= -1; + } + #endif + poiCam.viewDir = !IsOrthographicCamera() ? normalize(_WorldSpaceCameraPos - i.worldPos.xyz) : normalize(UNITY_MATRIX_I_V._m02_m12_m22); + float3 tanToWorld0 = float3(poiMesh.tangent[0].x, poiMesh.binormal[0].x, poiMesh.normals[0].x); + float3 tanToWorld1 = float3(poiMesh.tangent[0].y, poiMesh.binormal[0].y, poiMesh.normals[0].y); + float3 tanToWorld2 = float3(poiMesh.tangent[0].z, poiMesh.binormal[0].z, poiMesh.normals[0].z); + float3 ase_tanViewDir = tanToWorld0 * poiCam.viewDir.x + tanToWorld1 * poiCam.viewDir.y + tanToWorld2 * poiCam.viewDir.z; + poiCam.tangentViewDir = normalize(ase_tanViewDir); + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + poiMesh.lightmapUV = i.lightmapUV; + #endif + poiMesh.parallaxUV = poiCam.tangentViewDir.xy / max(poiCam.tangentViewDir.z, 0.0001); + poiMesh.uv[0] = i.uv[0].xy; + poiMesh.uv[1] = i.uv[0].zw; + poiMesh.uv[2] = i.uv[1].xy; + poiMesh.uv[3] = i.uv[1].zw; + poiMesh.uv[4] = poiMesh.uv[0]; + poiMesh.uv[5] = poiMesh.uv[0]; + poiMesh.uv[6] = poiMesh.uv[0]; + poiMesh.uv[7] = poiMesh.uv[0]; + poiMesh.uv[8] = poiMesh.uv[0]; + poiMesh.uv[4] = calculatePanosphereUV(poiMesh); + poiMesh.uv[5] = calculateWorldUV(poiMesh); + poiMesh.uv[6] = calculatePolarCoordinate(poiMesh); + poiMesh.uv[8] = calculatelocalUV(poiMesh); + float3 worldViewUp = normalize(float3(0, 1, 0) - poiCam.viewDir * dot(poiCam.viewDir, float3(0, 1, 0))); + float3 worldViewRight = normalize(cross(poiCam.viewDir, worldViewUp)); + poiMesh.uv[9] = float2(dot(worldViewRight, poiMesh.normals[0]), dot(worldViewUp, poiMesh.normals[0])) * 0.5 + 0.5; + poiMods.globalMask[0] = 1; + poiMods.globalMask[1] = 1; + poiMods.globalMask[2] = 1; + poiMods.globalMask[3] = 1; + poiMods.globalMask[4] = 1; + poiMods.globalMask[5] = 1; + poiMods.globalMask[6] = 1; + poiMods.globalMask[7] = 1; + poiMods.globalMask[8] = 1; + poiMods.globalMask[9] = 1; + poiMods.globalMask[10] = 1; + poiMods.globalMask[11] = 1; + poiMods.globalMask[12] = 1; + poiMods.globalMask[13] = 1; + poiMods.globalMask[14] = 1; + poiMods.globalMask[15] = 1; + ApplyGlobalMaskModifiers(poiMesh, poiMods, poiCam); + float2 mainUV = poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)); + if (0.0) + { + mainUV = sharpSample(float4(0.0004882813,0.0004882813,2048,2048), mainUV); + } + float4 mainTexture = POI2D_SAMPLER_PAN_STOCHASTIC(_MainTex, _MainTex, mainUV, float4(0,0,0,0), 0.0); + mainTexture.a = max(mainTexture.a, 0.0); + #if defined(PROP_BUMPMAP) || !defined(OPTIMIZER_ENABLED) + poiMesh.tangentSpaceNormal = UnpackScaleNormal(POI2D_SAMPLER_PAN_STOCHASTIC(_BumpMap, _MainTex, poiUV(poiMesh.uv[0.0].xy, float4(1,1,0,0)), float4(0,0,0,0), 0.0), 1.0); + #else + poiMesh.tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + #endif + float3 tangentSpaceNormal = UnpackNormal(float4(0.5, 0.5, 1, 1)); + poiMesh.normals[0] = normalize( + tangentSpaceNormal.x * poiMesh.tangent[0] + + tangentSpaceNormal.y * poiMesh.binormal[0] + + tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.normals[1] = normalize( + poiMesh.tangentSpaceNormal.x * poiMesh.tangent[0] + + poiMesh.tangentSpaceNormal.y * poiMesh.binormal[0] + + poiMesh.tangentSpaceNormal.z * poiMesh.normals[0] + ); + poiMesh.tangent[1] = cross(poiMesh.binormal[0], -poiMesh.normals[1]); + poiMesh.binormal[1] = cross(-poiMesh.normals[1], poiMesh.tangent[0]); + poiCam.forwardDir = getCameraForward(); + poiCam.worldPos = _WorldSpaceCameraPos; + poiCam.reflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[1]); + poiCam.vertexReflectionDir = reflect(-poiCam.viewDir, poiMesh.normals[0]); + poiCam.clipPos = i.pos; + poiCam.distanceToVert = distance(poiMesh.worldPos, poiCam.worldPos); + poiCam.posScreenSpace = poiTransformClipSpacetoScreenSpaceFrag(poiCam.clipPos); + #if defined(POI_GRABPASS) && defined(POI_PASS_BASE) + poiCam.screenUV = poiCam.clipPos.xy / poiGetWidthAndHeight(_PoiGrab2); + #else + poiCam.screenUV = poiCam.clipPos.xy / _ScreenParams.xy; + #endif + #ifdef UNITY_SINGLE_PASS_STEREO + poiCam.posScreenSpace.x = poiCam.posScreenSpace.x * 0.5; + #endif + poiCam.posScreenPixels = calcPixelScreenUVs(poiCam.posScreenSpace); + poiCam.vDotN = abs(dot(poiCam.viewDir, poiMesh.normals[1])); + poiCam.worldDirection.xyz = poiMesh.worldPos.xyz - poiCam.worldPos; + poiCam.worldDirection.w = i.worldDir; + calculateGlobalThemes(poiMods); + poiFragData.baseColor = mainTexture.rgb; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.baseColor *= poiThemeColor(poiMods, float4(1,1,1,1).rgb, 0.0); + poiFragData.alpha = mainTexture.a * float4(1,1,1,1).a; + #else + poiFragData.baseColor *= poiThemeColor(poiMods, _TwoPassColor.rgb, _TwoPassColorThemeIndex); + poiFragData.alpha = mainTexture.a * _TwoPassColor.a; + #endif + if (2.0) + { + #if defined(PROP_ALPHAMASK) || !defined(OPTIMIZER_ENABLED) + float alphaMask = POI2D_SAMPLER_PAN(_AlphaMask, _MainTex, poiUV(poiMesh.uv[0.0], float4(1,1,0,0)), float4(0,0,0,0).xy).r; + #else + float alphaMask = 1; + #endif + alphaMask = saturate(alphaMask * 1.0 + (0.0 ? 0.0 * - 1 : 0.0)); + if (0.0) alphaMask = 1 - alphaMask; + if (2.0 == 1) poiFragData.alpha = alphaMask; + if (2.0 == 2) poiFragData.alpha = poiFragData.alpha * alphaMask; + if (2.0 == 3) poiFragData.alpha = saturate(poiFragData.alpha + alphaMask); + if (2.0 == 4) poiFragData.alpha = saturate(poiFragData.alpha - alphaMask); + } + applyAlphaOptions(poiFragData, poiMesh, poiCam, poiMods); + + if (0.0) + { + poiFragData.baseColor *= saturate(poiFragData.alpha); + } + poiFragData.finalColor = poiFragData.baseColor; + #if !defined(POI_PASS_BASETWO) && !defined(POI_PASS_ADDTWO) + poiFragData.alpha = 1.0 ? 1 : poiFragData.alpha; + #else + poiFragData.alpha = _AlphaForceOpaque2 ? 1 : poiFragData.alpha; + #endif + poiFragData.finalColor += poiLight.finalLightAdd; + if (0.0 == POI_MODE_OPAQUE) + { + poiFragData.alpha = 1; + } + clip(poiFragData.alpha - 0.5); + #ifdef POI_PASS_META + UnityMetaInput meta; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, meta); + meta.Emission = poiFragData.emission * 1.0 * poiMods.globalEmission; + meta.Albedo = saturate(poiFragData.finalColor.rgb); + meta.SpecularColor = poiLight.finalLightAdd; + return UnityMetaFragment(meta) + POI_SAFE_RGB0; + #endif + poiFragData.finalColor += poiFragData.emission * poiMods.globalEmission; + applyUnityFog(poiFragData.finalColor, i.fogData); + return float4(poiFragData.finalColor, poiFragData.alpha) + POI_SAFE_RGB0; + } + ENDCG + } + } + CustomEditor "Thry.ShaderEditor" +} diff --git a/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm/Poiyomi Pro World.shader.meta b/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm/Poiyomi Pro World.shader.meta new file mode 100644 index 0000000..42293ae --- /dev/null +++ b/Assets/Quiz/Materials/UC/OptimizedShaders/TurretArm/Poiyomi Pro World.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 94460e43f4abdba4bbf388c6d298ebc8 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/UC/TurretArm.mat b/Assets/Quiz/Materials/UC/TurretArm.mat new file mode 100644 index 0000000..267edb2 --- /dev/null +++ b/Assets/Quiz/Materials/UC/TurretArm.mat @@ -0,0 +1,3789 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: TurretArm + m_Shader: {fileID: 4800000, guid: 94460e43f4abdba4bbf388c6d298ebc8, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - PROP_LIGHTINGAOMAPS + - VIGNETTE_MASKED + - _LIGHTINGMODE_REALISTIC + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2000 + stringTagMap: + AllLockedGUIDS: 487478f4e1c54324b8c767e8b689f6d4 + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT PROP_LIGHTINGAOMAPS VIGNETTE_MASKED + _LIGHTINGMODE_REALISTIC _RIM2STYLE_POIYOMI _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: Opaque + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__MochieMetallicMaps: 6f5dacfa607fc25409fa478ed20223d0 + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 44e07cad3ef7a3847bf7cfa758ff14d7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 2800000, guid: 516526b3f3ac61b49aae5ef6fa9f2d2c, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: d8154662965aecb4e9b1228056ecc22f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 1 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 1 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 0 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.5 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 0 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.1 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 0.5 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0 + - _DissolveToTextureUV: 0 + - _DissolveType: 1 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 0 + - _DstBlendAlpha: 10 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 0 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 6 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 0 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 0 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 0 + - _OutlineDstBlendAlpha: 0 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 1 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 1 + - m_mainCategory: 1 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 0 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 0 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 1 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 0 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 1 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 0 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 0 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 0 + - s_start_EdgeMenu: 0 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 0 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveEndPoint: {r: 0, g: 1, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/UC/TurretArm.mat.meta b/Assets/Quiz/Materials/UC/TurretArm.mat.meta new file mode 100644 index 0000000..656e212 --- /dev/null +++ b/Assets/Quiz/Materials/UC/TurretArm.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 487478f4e1c54324b8c767e8b689f6d4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Materials/WarningLight.mat b/Assets/Quiz/Materials/WarningLight.mat new file mode 100644 index 0000000..7a19632 --- /dev/null +++ b/Assets/Quiz/Materials/WarningLight.mat @@ -0,0 +1,3801 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: WarningLight + m_Shader: {fileID: 4800000, guid: a77ee57d86877744b9bce1b6181f7aba, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: + - BSSBLOOMFOGTYPE_HEIGHT + - MOCHIE_PBR + - PROP_LIGHTINGAOMAPS + - VIGNETTE_MASKED + - _LIGHTINGMODE_REALISTIC + - _RIM2STYLE_POIYOMI + - _RIMSTYLE_POIYOMI + - _STOCHASTICMODE_DELIOT_HEITZ + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2460 + stringTagMap: + AllLockedGUIDS: 840bcb10a024ade40964d286b99b9498 + OriginalKeywords: BSSBLOOMFOGTYPE_HEIGHT MOCHIE_PBR PROP_LIGHTINGAOMAPS VIGNETTE_MASKED + _LIGHTINGMODE_REALISTIC _RIM2STYLE_POIYOMI _RIMSTYLE_POIYOMI _STOCHASTICMODE_DELIOT_HEITZ + OriginalShader: .poiyomi/Poiyomi Pro World + OriginalShaderGUID: a11582d439d5e494986c4b421999c03a + RenderType: TransparentCutout + _stripped_tex__ClothDFG: 76d65cbce584df7449699fb8406f60ea + _stripped_tex__SkinLUT: d13510bb2be49aa40a66a0101efb6a36 + _stripped_tex__ToonRamp: 61bd594533da4fc42bd46ef93ba5a4f6 + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _AnisotropyMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: c1e5d23b508aa30488c8840686833e53, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightDataSDFMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingAOMaps: + m_Texture: {fileID: 2800000, guid: 544f60ae72ba4544f8d1c01f34ceb00e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingDetailShadowMaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LightingShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 1364651b6d5b1164983190585596fdba, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MochieMetallicMaps: + m_Texture: {fileID: 2800000, guid: f808388bc4582d649a96e42f3277deb5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MochieReflCube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UzumoreMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - DSGI: 0 + - GeometryShader_Enabled: 1 + - Instancing: 0 + - LightmapFlags: 0 + - Tessellation_Enabled: 1 + - VertexBasicsMaskUV: 0 + - _1st2nd_Shades_Feather: 0.0001 + - _1stShadeMapMask_Inverse: 0 + - _1st_ShadeMapUV: 0 + - _2ndShadeMapMask_Inverse: 0 + - _2nd_ShadeMapUV: 0 + - _ALDecalBandClipMax: 1 + - _ALDecalBandClipMin: 0 + - _ALDecalBandStep: 0 + - _ALDecalBaseBoost: 5 + - _ALDecalBlendAlpha: 1 + - _ALDecalBlendType: 0 + - _ALDecalColorMaskUV: 0 + - _ALDecalControlsAlpha: 0 + - _ALDecalGlobalMask: 0 + - _ALDecalGlobalMaskBlendType: 2 + - _ALDecalHighEmission: 0 + - _ALDecalLineWidth: 1 + - _ALDecalLowEmission: 0 + - _ALDecalMidEmission: 0 + - _ALDecalShapeClip: 0 + - _ALDecalShapeClipBandWidth: 0.5 + - _ALDecalShapeClipVolumeWidth: 0.5 + - _ALDecalTrebleBoost: 1 + - _ALDecalType: 0 + - _ALDecalUV: 0 + - _ALDecalUVMode: 0 + - _ALDecalVolume: 0.5 + - _ALDecalVolumeClipMax: 1 + - _ALDecalVolumeClipMin: 0 + - _ALDecalVolumeColorHighThemeIndex: 0 + - _ALDecalVolumeColorLowThemeIndex: 0 + - _ALDecalVolumeColorMidThemeIndex: 0 + - _ALDecalVolumeColorSource: 1 + - _ALDecalVolumeStep: 0 + - _ALHighEmission: 0 + - _ALLowEmission: 0 + - _ALMidEmission: 0 + - _ALUVRotation: 0 + - _ALUVRotationSpeed: 0 + - _ALVolumeColorBlendAlpha: 1 + - _ALVolumeColorBlendType: 0 + - _ALVolumeColorDirection: 0 + - _ALVolumeColorHighThemeIndex: 0 + - _ALVolumeColorLowThemeIndex: 0 + - _ALVolumeColorMidThemeIndex: 0 + - _ALVolumeColorUV: 0 + - _AddBlendOp: 4 + - _AddBlendOpAlpha: 4 + - _AddDstBlend: 1 + - _AddDstBlendAlpha: 1 + - _AddSrcBlend: 5 + - _AddSrcBlendAlpha: 0 + - _Add_Antipodean_Rim2Light: 0 + - _Add_Antipodean_RimLight: 0 + - _AlphaAlphaAdd: 0 + - _AlphaAngular: 0 + - _AlphaAngularGlobalMask: 0 + - _AlphaAudioLinkAddBand: 0 + - _AlphaAudioLinkEnabled: 0 + - _AlphaBoostFA: 10 + - _AlphaColorThemeIndex: 0 + - _AlphaDistanceFade: 0 + - _AlphaDistanceFadeGlobalMask: 0 + - _AlphaDistanceFadeMax: 0 + - _AlphaDistanceFadeMaxAlpha: 1 + - _AlphaDistanceFadeMin: 0 + - _AlphaDistanceFadeMinAlpha: 0 + - _AlphaDistanceFadeType: 1 + - _AlphaDitherBias: 0 + - _AlphaDitherGradient: 0.1 + - _AlphaDithering: 0 + - _AlphaForceOpaque: 0 + - _AlphaFresnel: 0 + - _AlphaFresnelAlpha: 0 + - _AlphaFresnelGlobalMask: 0 + - _AlphaFresnelInvert: 0 + - _AlphaFresnelSharpness: 0.5 + - _AlphaFresnelWidth: 0.5 + - _AlphaGlobalMask: 0 + - _AlphaGlobalMaskBlendType: 2 + - _AlphaMaskBlendStrength: 1 + - _AlphaMaskInvert: 0 + - _AlphaMaskUV: 0 + - _AlphaMaskValue: 0 + - _AlphaMipScale: 0.25 + - _AlphaMod: 0 + - _AlphaPremultiply: 0 + - _AlphaSharpenedA2C: 0 + - _AlphaTextureStochastic: 0 + - _AlphaTextureUV: 0 + - _AlphaToCoverage: 0 + - _AngleCompareTo: 0 + - _AngleMinAlpha: 0 + - _AngleType: 0 + - _Aniso0Blur: 0 + - _Aniso0Edge: 0.5 + - _Aniso0Offset: 0 + - _Aniso0OffsetMapStrength: 0 + - _Aniso0Power: 0 + - _Aniso0Strength: 1 + - _Aniso0SwitchDirection: 0 + - _Aniso0TintIndex: 0 + - _Aniso0ToonMode: 0 + - _Aniso1Blur: 0 + - _Aniso1Edge: 0.5 + - _Aniso1Offset: 0 + - _Aniso1OffsetMapStrength: 0 + - _Aniso1Power: 0.1 + - _Aniso1Strength: 1 + - _Aniso1SwitchDirection: 0 + - _Aniso1TintIndex: 0 + - _Aniso1ToonMode: 0 + - _AnisoAdd: 1 + - _AnisoColorMapUV: 0 + - _AnisoGlobalMask: 0 + - _AnisoGlobalMaskBlendType: 2 + - _AnisoHideInShadow: 1 + - _AnisoReplace: 0 + - _AnisoUseBaseColor: 0 + - _AnisoUseLightColor: 1 + - _Anisotropy: 0 + - _AnisotropyMapChannel: 0 + - _AnisotropyMapUV: 0 + - _Ap_Rim2Light_FeatherOff: 0 + - _Ap_Rim2Light_Power: 0.1 + - _Ap_RimLight_FeatherOff: 0 + - _Ap_RimLight_Power: 0.1 + - _ApplyReflection: 0 + - _ApplySpecular: 1 + - _ApplySpecularFA: 1 + - _AudioLinkAnimToggle: 1 + - _AudioLinkBandOverridesEnabled: 0 + - _AudioLinkDecal0AlphaBand: 0 + - _AudioLinkDecal0ChannelSeparationBand: 0 + - _AudioLinkDecal0EmissionBand: 0 + - _AudioLinkDecal0RotationBand: 0 + - _AudioLinkDecal0ScaleBand: 0 + - _AudioLinkDecal0SideBand: 0 + - _AudioLinkDecal1AlphaBand: 0 + - _AudioLinkDecal1ChannelSeparationBand: 0 + - _AudioLinkDecal1EmissionBand: 0 + - _AudioLinkDecal1RotationBand: 0 + - _AudioLinkDecal1ScaleBand: 0 + - _AudioLinkDecal1SideBand: 0 + - _AudioLinkDecal2AlphaBand: 0 + - _AudioLinkDecal2ChannelSeparationBand: 0 + - _AudioLinkDecal2EmissionBand: 0 + - _AudioLinkDecal2RotationBand: 0 + - _AudioLinkDecal2ScaleBand: 0 + - _AudioLinkDecal2SideBand: 0 + - _AudioLinkDecal3AlphaBand: 0 + - _AudioLinkDecal3ChannelSeparationBand: 0 + - _AudioLinkDecal3EmissionBand: 0 + - _AudioLinkDecal3RotationBand: 0 + - _AudioLinkDecal3ScaleBand: 0 + - _AudioLinkDecal3SideBand: 0 + - _AudioLinkDecalCC0: 0 + - _AudioLinkDecalCC1: 0 + - _AudioLinkDecalCC2: 0 + - _AudioLinkDecalCC3: 0 + - _AudioLinkDissolveAlphaBand: 0 + - _AudioLinkDissolveDetailBand: 0 + - _AudioLinkEmission0CenterOutBand: 0 + - _AudioLinkEmission0CenterOutDuration: 1 + - _AudioLinkEmission0CenterOutSize: 0 + - _AudioLinkEmission1CenterOutBand: 0 + - _AudioLinkEmission1CenterOutDuration: 1 + - _AudioLinkEmission1CenterOutSize: 0 + - _AudioLinkEmission2CenterOutBand: 0 + - _AudioLinkEmission2CenterOutDuration: 1 + - _AudioLinkEmission2CenterOutSize: 0 + - _AudioLinkEmission3CenterOutBand: 0 + - _AudioLinkEmission3CenterOutDuration: 1 + - _AudioLinkEmission3CenterOutSize: 0 + - _AudioLinkFlipbookAlphaBand: 0 + - _AudioLinkFlipbookEmissionBand: 0 + - _AudioLinkFlipbookFrameBand: 0 + - _AudioLinkFlipbookScaleBand: 0 + - _AudioLinkHelp: 0 + - _AudioLinkOutlineColorBand: 0 + - _AudioLinkOutlineEmissionBand: 0 + - _AudioLinkOutlineSizeBand: 0 + - _AudioLinkPathEmissionAddBandA: 0 + - _AudioLinkPathEmissionAddBandB: 0 + - _AudioLinkPathEmissionAddBandG: 0 + - _AudioLinkPathEmissionAddBandR: 0 + - _AudioLinkPathTimeOffsetBandA: 0 + - _AudioLinkPathTimeOffsetBandB: 0 + - _AudioLinkPathTimeOffsetBandG: 0 + - _AudioLinkPathTimeOffsetBandR: 0 + - _AudioLinkPathWidthOffsetBandA: 0 + - _AudioLinkPathWidthOffsetBandB: 0 + - _AudioLinkPathWidthOffsetBandG: 0 + - _AudioLinkPathWidthOffsetBandR: 0 + - _AudioLinkRim2BrightnessBand: 0 + - _AudioLinkRim2EmissionBand: 0 + - _AudioLinkRim2WidthBand: 0 + - _AudioLinkRimBrightnessBand: 0 + - _AudioLinkRimEmissionBand: 0 + - _AudioLinkRimWidthBand: 0 + - _AudioLinkSmoothingBass: 0 + - _AudioLinkSmoothingHighMid: 0 + - _AudioLinkSmoothingLowMid: 0 + - _AudioLinkSmoothingTreble: 0 + - _AudioLinkVoronoiChronoSpeedXBand: 0 + - _AudioLinkVoronoiChronoSpeedXSpeed: 0 + - _AudioLinkVoronoiChronoSpeedXType: 0 + - _AudioLinkVoronoiChronoSpeedYBand: 0 + - _AudioLinkVoronoiChronoSpeedYSpeed: 0 + - _AudioLinkVoronoiChronoSpeedYType: 0 + - _AudioLinkVoronoiChronoSpeedZBand: 0 + - _AudioLinkVoronoiChronoSpeedZSpeed: 0 + - _AudioLinkVoronoiChronoSpeedZType: 0 + - _AudioLinkVoronoiGradientMaxAdd: 0 + - _AudioLinkVoronoiGradientMaxAddBand: 0 + - _AudioLinkVoronoiGradientMinAdd: 0 + - _AudioLinkVoronoiGradientMinAddBand: 0 + - _AudioLinkVoronoiInnerEmissionBand: 0 + - _AudioLinkVoronoiOuterEmissionBand: 0 + - _BRDFTPSDepthEnabled: 0 + - _BRDFTPSReflectionMaskStrength: 1 + - _BRDFTPSSpecularMaskStrength: 1 + - _BSSBloomfog: 0 + - _BSSBloomfogType: 1 + - _BSSEnabled: 0 + - _BSSHelpBox1: 0 + - _BSSHelpBox2: 0 + - _BSSHelpBox3: 0 + - _BSSSpacer1: 0 + - _BSSSpacer2: 0 + - _BSSSpacer3: 0 + - _BackFaceColorThemeIndex: 0 + - _BackFaceDetailIntensity: 1 + - _BackFaceEmissionLimiter: 1 + - _BackFaceEmissionStrength: 0 + - _BackFaceEnabled: 0 + - _BackFaceHueSelectOrShift: 1 + - _BackFaceHueShift: 0 + - _BackFaceHueShiftEnabled: 0 + - _BackFaceHueShiftSpeed: 0 + - _BackFaceMaskChannel: 0 + - _BackFaceMaskUV: 0 + - _BackFaceReplaceAlpha: 0 + - _BackFaceShiftColorSpace: 0 + - _BackFaceTextureUV: 0 + - _BacklightBackfaceMask: 1 + - _BacklightBlur: 0.05 + - _BacklightBorder: 0.35 + - _BacklightColorTexUV: 0 + - _BacklightDirectivity: 5 + - _BacklightEnabled: 0 + - _BacklightMainStrength: 0 + - _BacklightNormalStrength: 1 + - _BacklightReceiveShadow: 1 + - _BacklightViewStrength: 1 + - _BaseColor_Step: 0.5 + - _BaseShade_Feather: 0.0001 + - _BlackLightMasking0GlobalMaskBlendType: 0 + - _BlackLightMasking0GlobalMaskIndex: 0 + - _BlackLightMasking0Key: 1 + - _BlackLightMasking1GlobalMaskBlendType: 0 + - _BlackLightMasking1GlobalMaskIndex: 0 + - _BlackLightMasking1Key: 2 + - _BlackLightMasking2GlobalMaskBlendType: 0 + - _BlackLightMasking2GlobalMaskIndex: 0 + - _BlackLightMasking2Key: 3 + - _BlackLightMasking3GlobalMaskBlendType: 0 + - _BlackLightMasking3GlobalMaskIndex: 0 + - _BlackLightMasking3Key: 4 + - _BlackLightMaskingEnabled: 0 + - _BlendOp: 0 + - _BlendOpAlpha: 4 + - _BlendshapeBadScaleFix: 1 + - _BlendshapePower: 1 + - _BlueAlphaAdd: 0 + - _BlueColorThemeIndex: 0 + - _BlueTextureStochastic: 0 + - _BlueTextureUV: 0 + - _BulgeOffset: 0 + - _BulgePower: 0 + - _BumpMapStochastic: 0 + - _BumpMapUV: 0 + - _BumpScale: 1 + - _CCIgnoreCastedShadows: 0 + - _CameraAngleMax: 90 + - _CameraAngleMin: 45 + - _CenterOutDissolveInvert: 0 + - _CenterOutDissolveMode: 1 + - _CenterOutDissolveNormals: 0 + - _CenterOutDissolvePower: 1 + - _ClearCoatBRDF: 0 + - _ClearCoatForceFallback: 0 + - _ClearCoatGSAAEnabled: 1 + - _ClearCoatGSAAThreshold: 0.1 + - _ClearCoatGSAAVariance: 0.15 + - _ClearCoatGlobalMask: 0 + - _ClearCoatGlobalMaskBlendType: 2 + - _ClearCoatLitFallback: 1 + - _ClearCoatMapsClearCoatMaskChannel: 0 + - _ClearCoatMapsReflectionMaskChannel: 2 + - _ClearCoatMapsRoughnessChannel: 1 + - _ClearCoatMapsSpecularMaskChannel: 3 + - _ClearCoatMapsStochastic: 0 + - _ClearCoatMapsUV: 0 + - _ClearCoatMaskInvert: 0 + - _ClearCoatNormalSelect: 0 + - _ClearCoatReflectionMaskInvert: 0 + - _ClearCoatReflectionStrength: 1 + - _ClearCoatReflectionStrengthGlobalMask: 0 + - _ClearCoatReflectionStrengthGlobalMaskBlendType: 2 + - _ClearCoatReflectionTintThemeIndex: 0 + - _ClearCoatSmoothness: 1 + - _ClearCoatSmoothnessGlobalMask: 0 + - _ClearCoatSmoothnessGlobalMaskBlendType: 2 + - _ClearCoatSmoothnessMapInvert: 0 + - _ClearCoatSpecularMaskInvert: 0 + - _ClearCoatSpecularStrength: 1 + - _ClearCoatSpecularStrengthGlobalMask: 0 + - _ClearCoatSpecularStrengthGlobalMaskBlendType: 2 + - _ClearCoatSpecularTintThemeIndex: 0 + - _ClearCoatStrength: 1 + - _ClearCoatTPSDepthMaskEnabled: 0 + - _ClearCoatTPSMaskStrength: 1 + - _ClearcoatExposureOcclusion: 0 + - _ClearcoatFresnelStrength: 0.5 + - _ClothLerp: 0 + - _ClothMetallicSmoothnessMapInvert: 0 + - _ClothMetallicSmoothnessMapUV: 0 + - _ClothReflectance: 0.5 + - _ClothSmoothness: 0.5 + - _ColorGradingToggle: 0 + - _ColorMask: 15 + - _ColorThemeIndex: 0 + - _ContinuousDissolve: 0 + - _CubeMapBlendAmount: 1 + - _CubeMapBrightness: 0 + - _CubeMapColorThemeIndex: 0 + - _CubeMapContrast: 1 + - _CubeMapEmissionStrength: 0 + - _CubeMapEnabled: 0 + - _CubeMapHueSelectOrShift: 1 + - _CubeMapHueShift: 0 + - _CubeMapHueShiftColorSpace: 0 + - _CubeMapHueShiftEnabled: 0 + - _CubeMapHueShiftSpeed: 0 + - _CubeMapIntensity: 1 + - _CubeMapLightMask: 0 + - _CubeMapMaskChannel: 0 + - _CubeMapMaskGlobalMask: 0 + - _CubeMapMaskGlobalMaskBlendType: 2 + - _CubeMapMaskInvert: 0 + - _CubeMapMaskUV: 0 + - _CubeMapNormal: 1 + - _CubeMapSaturation: 1 + - _CubeMapSmoothness: 1 + - _CubeMapUVMode: 1 + - _CubeMapWorldNormalsStrength: 1 + - _CubemapBlendType: 0 + - _Cull: 2 + - _CurvFix: 1 + - _Curvature: 0 + - _CurvatureU: 0 + - _CurvatureV: 0 + - _CustomColors: 0 + - _Cutoff: 0.01 + - _Decal0ApplyGlobalMaskBlendType: 0 + - _Decal0ApplyGlobalMaskIndex: 0 + - _Decal0ChannelSeparation: 0 + - _Decal0ChannelSeparationAngleStrength: 0 + - _Decal0ChannelSeparationEnable: 0 + - _Decal0ChannelSeparationHue: 0 + - _Decal0ChannelSeparationPremultiply: 0 + - _Decal0ChannelSeparationVertical: 0 + - _Decal0Depth: 0 + - _Decal0FaceMask: 0 + - _Decal0GlobalMask: 0 + - _Decal0GlobalMaskBlendType: 2 + - _Decal0HueAngleStrength: 0 + - _Decal0MaskChannel: 0 + - _Decal0OnlyVideo: 0 + - _Decal0OverrideAlphaMode: 0 + - _Decal0TPSMaskStrength: 1 + - _Decal0UseDecalAlpha: 0 + - _Decal0VideoAspectFix: 0 + - _Decal0VideoEmissionStrength: 0 + - _Decal0VideoEnabled: 0 + - _Decal0VideoFitToScale: 1 + - _Decal1ApplyGlobalMaskBlendType: 0 + - _Decal1ApplyGlobalMaskIndex: 0 + - _Decal1ChannelSeparation: 0 + - _Decal1ChannelSeparationAngleStrength: 0 + - _Decal1ChannelSeparationEnable: 0 + - _Decal1ChannelSeparationHue: 0 + - _Decal1ChannelSeparationPremultiply: 0 + - _Decal1ChannelSeparationVertical: 0 + - _Decal1Depth: 0 + - _Decal1FaceMask: 0 + - _Decal1GlobalMask: 0 + - _Decal1GlobalMaskBlendType: 2 + - _Decal1HueAngleStrength: 0 + - _Decal1MaskChannel: 1 + - _Decal1OnlyVideo: 0 + - _Decal1OverrideAlphaMode: 0 + - _Decal1TPSMaskStrength: 1 + - _Decal1UseDecalAlpha: 0 + - _Decal1VideoAspectFix: 0 + - _Decal1VideoEmissionStrength: 0 + - _Decal1VideoEnabled: 0 + - _Decal1VideoFitToScale: 1 + - _Decal2ApplyGlobalMaskBlendType: 0 + - _Decal2ApplyGlobalMaskIndex: 0 + - _Decal2ChannelSeparation: 0 + - _Decal2ChannelSeparationAngleStrength: 0 + - _Decal2ChannelSeparationEnable: 0 + - _Decal2ChannelSeparationHue: 0 + - _Decal2ChannelSeparationPremultiply: 0 + - _Decal2ChannelSeparationVertical: 0 + - _Decal2Depth: 0 + - _Decal2FaceMask: 0 + - _Decal2GlobalMask: 0 + - _Decal2GlobalMaskBlendType: 2 + - _Decal2HueAngleStrength: 0 + - _Decal2MaskChannel: 2 + - _Decal2OnlyVideo: 0 + - _Decal2OverrideAlphaMode: 0 + - _Decal2TPSMaskStrength: 1 + - _Decal2UseDecalAlpha: 0 + - _Decal2VideoAspectFix: 0 + - _Decal2VideoEmissionStrength: 0 + - _Decal2VideoEnabled: 0 + - _Decal2VideoFitToScale: 1 + - _Decal3ApplyGlobalMaskBlendType: 0 + - _Decal3ApplyGlobalMaskIndex: 0 + - _Decal3ChannelSeparation: 0 + - _Decal3ChannelSeparationAngleStrength: 0 + - _Decal3ChannelSeparationEnable: 0 + - _Decal3ChannelSeparationHue: 0 + - _Decal3ChannelSeparationPremultiply: 0 + - _Decal3ChannelSeparationVertical: 0 + - _Decal3Depth: 0 + - _Decal3FaceMask: 0 + - _Decal3GlobalMask: 0 + - _Decal3GlobalMaskBlendType: 2 + - _Decal3HueAngleStrength: 0 + - _Decal3MaskChannel: 3 + - _Decal3OnlyVideo: 0 + - _Decal3OverrideAlphaMode: 0 + - _Decal3TPSMaskStrength: 1 + - _Decal3UseDecalAlpha: 0 + - _Decal3VideoAspectFix: 0 + - _Decal3VideoEmissionStrength: 0 + - _Decal3VideoEnabled: 0 + - _Decal3VideoFitToScale: 1 + - _DecalBlendAlpha: 1 + - _DecalBlendAlpha1: 1 + - _DecalBlendAlpha2: 1 + - _DecalBlendAlpha3: 1 + - _DecalBlendType: 0 + - _DecalBlendType1: 0 + - _DecalBlendType2: 0 + - _DecalBlendType3: 0 + - _DecalColor1ThemeIndex: 0 + - _DecalColor2ThemeIndex: 0 + - _DecalColor3ThemeIndex: 0 + - _DecalColorThemeIndex: 0 + - _DecalEmissionStrength: 0 + - _DecalEmissionStrength1: 0 + - _DecalEmissionStrength2: 0 + - _DecalEmissionStrength3: 0 + - _DecalEnabled: 0 + - _DecalEnabled1: 0 + - _DecalEnabled2: 0 + - _DecalEnabled3: 0 + - _DecalHueShift: 0 + - _DecalHueShift1: 0 + - _DecalHueShift2: 0 + - _DecalHueShift3: 0 + - _DecalHueShiftColorSpace: 0 + - _DecalHueShiftColorSpace1: 0 + - _DecalHueShiftColorSpace2: 0 + - _DecalHueShiftColorSpace3: 0 + - _DecalHueShiftEnabled: 0 + - _DecalHueShiftEnabled1: 0 + - _DecalHueShiftEnabled2: 0 + - _DecalHueShiftEnabled3: 0 + - _DecalHueShiftSelectOrShift: 1 + - _DecalHueShiftSelectOrShift1: 1 + - _DecalHueShiftSelectOrShift2: 1 + - _DecalHueShiftSelectOrShift3: 1 + - _DecalHueShiftSpeed: 0 + - _DecalHueShiftSpeed1: 0 + - _DecalHueShiftSpeed2: 0 + - _DecalHueShiftSpeed3: 0 + - _DecalMaskUV: 0 + - _DecalMirroredUVMode: 0 + - _DecalMirroredUVMode1: 0 + - _DecalMirroredUVMode2: 0 + - _DecalMirroredUVMode3: 0 + - _DecalOverrideAlpha: 0 + - _DecalOverrideAlpha1: 0 + - _DecalOverrideAlpha2: 0 + - _DecalOverrideAlpha3: 0 + - _DecalRotation: 0 + - _DecalRotation1: 0 + - _DecalRotation2: 0 + - _DecalRotation3: 0 + - _DecalRotationCTALBand0: 0 + - _DecalRotationCTALBand1: 0 + - _DecalRotationCTALBand2: 0 + - _DecalRotationCTALBand3: 0 + - _DecalRotationCTALSpeed0: 0 + - _DecalRotationCTALSpeed1: 0 + - _DecalRotationCTALSpeed2: 0 + - _DecalRotationCTALSpeed3: 0 + - _DecalRotationCTALType0: 0 + - _DecalRotationCTALType1: 0 + - _DecalRotationCTALType2: 0 + - _DecalRotationCTALType3: 0 + - _DecalRotationSpeed: 0 + - _DecalRotationSpeed1: 0 + - _DecalRotationSpeed2: 0 + - _DecalRotationSpeed3: 0 + - _DecalSymmetryMode: 0 + - _DecalSymmetryMode1: 0 + - _DecalSymmetryMode2: 0 + - _DecalSymmetryMode3: 0 + - _DecalTPSDepthMaskEnabled: 0 + - _DecalTexture1UV: 0 + - _DecalTexture2UV: 0 + - _DecalTexture3UV: 0 + - _DecalTextureUV: 0 + - _DecalTiled: 0 + - _DecalTiled1: 0 + - _DecalTiled2: 0 + - _DecalTiled3: 0 + - _DepthAlphaMaxDepth: 1 + - _DepthAlphaMaxValue: 0 + - _DepthAlphaMinDepth: 0 + - _DepthAlphaMinValue: 1 + - _DepthAlphaToggle: 0 + - _DepthBulgeFadeLength: 0.02 + - _DepthBulgeHeight: 0.02 + - _DepthBulgeMaskChannel: 0 + - _DepthBulgeMaskUV: 0 + - _DepthBulgeWarning: 0 + - _DepthColorBlendMode: 0 + - _DepthColorMaxDepth: 1 + - _DepthColorMaxValue: 0 + - _DepthColorMinDepth: 0 + - _DepthColorMinValue: 1 + - _DepthColorThemeIndex: 0 + - _DepthColorToggle: 0 + - _DepthEmissionStrength: 0 + - _DepthFXWarning: 0 + - _DepthMaskChannel: 0 + - _DepthMaskGlobalMask: 0 + - _DepthMaskGlobalMaskBlendType: 2 + - _DepthMaskUV: 0 + - _DepthRimAdd: 0 + - _DepthRimAdditiveLighting: 0 + - _DepthRimBrightness: 1 + - _DepthRimColorThemeIndex: 0 + - _DepthRimEmission: 0 + - _DepthRimHideInShadow: 0 + - _DepthRimMixBaseColor: 0 + - _DepthRimMixLightColor: 0 + - _DepthRimMultiply: 0 + - _DepthRimNormalToUse: 1 + - _DepthRimReplace: 0 + - _DepthRimSharpness: 0.2 + - _DepthRimType: 0 + - _DepthRimWidth: 0.2 + - _DepthTextureUV: 0 + - _DetailBrightness: 1 + - _DetailEnabled: 0 + - _DetailMaskStochastic: 0 + - _DetailMaskUV: 0 + - _DetailNormalGlobalMask: 0 + - _DetailNormalGlobalMaskBlendType: 2 + - _DetailNormalMapScale: 1 + - _DetailNormalMapStochastic: 0 + - _DetailNormalMapUV: 0 + - _DetailTexGlobalMask: 0 + - _DetailTexGlobalMaskBlendType: 2 + - _DetailTexIntensity: 1 + - _DetailTexStochastic: 0 + - _DetailTexUV: 0 + - _DetailTintThemeIndex: 0 + - _DisableDirectionalInAdd: 1 + - _DissolveAlpha: 0 + - _DissolveAlpha0: 0 + - _DissolveAlpha1: 0 + - _DissolveAlpha2: 0 + - _DissolveAlpha3: 0 + - _DissolveAlpha4: 0 + - _DissolveAlpha5: 0 + - _DissolveAlpha6: 0 + - _DissolveAlpha7: 0 + - _DissolveAlpha8: 0 + - _DissolveAlpha9: 0 + - _DissolveApplyGlobalMaskBlendType: 0 + - _DissolveApplyGlobalMaskIndex: 0 + - _DissolveDetailEdgeSmoothing: 0 + - _DissolveDetailNoiseUV: 0 + - _DissolveDetailStrength: 0.1 + - _DissolveEdgeColorThemeIndex: 0 + - _DissolveEdgeEmission: 0 + - _DissolveEdgeHardness: 0.5 + - _DissolveEdgeHueSelectOrShift: 1 + - _DissolveEdgeHueShift: 0 + - _DissolveEdgeHueShiftColorSpace: 0 + - _DissolveEdgeHueShiftEnabled: 0 + - _DissolveEdgeHueShiftSpeed: 0 + - _DissolveEdgeWidth: 0.025 + - _DissolveHueSelectOrShift: 1 + - _DissolveHueShift: 0 + - _DissolveHueShiftColorSpace: 0 + - _DissolveHueShiftEnabled: 0 + - _DissolveHueShiftSpeed: 0 + - _DissolveInverseApplyGlobalMaskBlendType: 0 + - _DissolveInverseApplyGlobalMaskIndex: 0 + - _DissolveInvertDetailNoise: 0 + - _DissolveInvertNoise: 0 + - _DissolveMaskGlobalMask: 0 + - _DissolveMaskGlobalMaskBlendType: 2 + - _DissolveMaskInvert: 0 + - _DissolveMaskUV: 0 + - _DissolveNoiseTextureUV: 0 + - _DissolveP2PClamp: 0 + - _DissolveP2PEdgeLength: 0.1 + - _DissolveP2PWorldLocal: 0 + - _DissolveTextureColorThemeIndex: 0 + - _DissolveToEmissionStrength: 0 + - _DissolveToTextureUV: 0 + - _DissolveType: 1 + - _DissolveUseVertexColors: 0 + - _DistortionFlowTexture1UV: 0 + - _DistortionFlowTextureUV: 0 + - _DistortionMaskChannel: 0 + - _DistortionMaskUV: 0 + - _DistortionStrength: 0.03 + - _DistortionStrength1: 0.01 + - _DistortionStrength1AudioLinkBand: 0 + - _DistortionStrengthAudioLinkBand: 0 + - _DistortionUvToDistort: 0 + - _DstBlend: 10 + - _DstBlendAlpha: 1 + - _EmissionAL0Enabled: 0 + - _EmissionAL0MultipliersBand: 0 + - _EmissionAL0StrengthBand: 0 + - _EmissionAL1Enabled: 0 + - _EmissionAL1MultipliersBand: 0 + - _EmissionAL1StrengthBand: 0 + - _EmissionAL2Enabled: 0 + - _EmissionAL2MultipliersBand: 0 + - _EmissionAL2StrengthBand: 0 + - _EmissionAL3Enabled: 0 + - _EmissionAL3MultipliersBand: 0 + - _EmissionAL3StrengthBand: 0 + - _EmissionBaseColorAsMap: 0 + - _EmissionBaseColorAsMap1: 0 + - _EmissionBaseColorAsMap2: 0 + - _EmissionBaseColorAsMap3: 0 + - _EmissionBlinkingEnabled: 0 + - _EmissionBlinkingEnabled1: 0 + - _EmissionBlinkingEnabled2: 0 + - _EmissionBlinkingEnabled3: 0 + - _EmissionBlinkingOffset: 0 + - _EmissionBlinkingOffset1: 0 + - _EmissionBlinkingOffset2: 0 + - _EmissionBlinkingOffset3: 0 + - _EmissionCenterOutEnabled: 0 + - _EmissionCenterOutEnabled1: 0 + - _EmissionCenterOutEnabled2: 0 + - _EmissionCenterOutEnabled3: 0 + - _EmissionCenterOutSpeed: 5 + - _EmissionCenterOutSpeed1: 5 + - _EmissionCenterOutSpeed2: 5 + - _EmissionCenterOutSpeed3: 5 + - _EmissionColor1ThemeIndex: 0 + - _EmissionColor2ThemeIndex: 0 + - _EmissionColor3ThemeIndex: 0 + - _EmissionColorThemeIndex: 0 + - _EmissionFluorescence: 0 + - _EmissionFluorescence1: 0 + - _EmissionFluorescence2: 0 + - _EmissionFluorescence3: 0 + - _EmissionHueSelectOrShift: 1 + - _EmissionHueSelectOrShift1: 1 + - _EmissionHueSelectOrShift2: 1 + - _EmissionHueSelectOrShift3: 1 + - _EmissionHueShift: 0 + - _EmissionHueShift1: 0 + - _EmissionHueShift2: 0 + - _EmissionHueShift3: 0 + - _EmissionHueShiftColorSpace: 0 + - _EmissionHueShiftColorSpace1: 0 + - _EmissionHueShiftColorSpace2: 0 + - _EmissionHueShiftColorSpace3: 0 + - _EmissionHueShiftEnabled: 0 + - _EmissionHueShiftEnabled1: 0 + - _EmissionHueShiftEnabled2: 0 + - _EmissionHueShiftEnabled3: 0 + - _EmissionHueShiftSpeed: 0 + - _EmissionHueShiftSpeed1: 0 + - _EmissionHueShiftSpeed2: 0 + - _EmissionHueShiftSpeed3: 0 + - _EmissionMap1UV: 0 + - _EmissionMap2UV: 0 + - _EmissionMap3UV: 0 + - _EmissionMapUV: 0 + - _EmissionMask0GlobalMask: 0 + - _EmissionMask0GlobalMaskBlendType: 2 + - _EmissionMask1Channel: 0 + - _EmissionMask1GlobalMask: 0 + - _EmissionMask1GlobalMaskBlendType: 2 + - _EmissionMask1UV: 0 + - _EmissionMask2Channel: 0 + - _EmissionMask2GlobalMask: 0 + - _EmissionMask2GlobalMaskBlendType: 2 + - _EmissionMask2UV: 0 + - _EmissionMask3Channel: 0 + - _EmissionMask3GlobalMask: 0 + - _EmissionMask3GlobalMaskBlendType: 2 + - _EmissionMask3UV: 0 + - _EmissionMaskChannel: 0 + - _EmissionMaskInvert: 0 + - _EmissionMaskInvert1: 0 + - _EmissionMaskInvert2: 0 + - _EmissionMaskInvert3: 0 + - _EmissionMaskUV: 0 + - _EmissionReplace0: 0 + - _EmissionReplace1: 0 + - _EmissionReplace2: 0 + - _EmissionReplace3: 0 + - _EmissionSaturation: 0 + - _EmissionSaturation1: 0 + - _EmissionSaturation2: 0 + - _EmissionSaturation3: 0 + - _EmissionScrollingOffset: 0 + - _EmissionScrollingOffset1: 0 + - _EmissionScrollingOffset2: 0 + - _EmissionScrollingOffset3: 0 + - _EmissionScrollingUseCurve: 0 + - _EmissionScrollingUseCurve1: 0 + - _EmissionScrollingUseCurve2: 0 + - _EmissionScrollingUseCurve3: 0 + - _EmissionScrollingVertexColor: 0 + - _EmissionScrollingVertexColor1: 0 + - _EmissionScrollingVertexColor2: 0 + - _EmissionScrollingVertexColor3: 0 + - _EmissionStrength: 0 + - _EmissionStrength1: 0 + - _EmissionStrength2: 0 + - _EmissionStrength3: 0 + - _EmissiveBlink_Max: 1 + - _EmissiveBlink_Max1: 1 + - _EmissiveBlink_Max2: 1 + - _EmissiveBlink_Max3: 1 + - _EmissiveBlink_Min: 0 + - _EmissiveBlink_Min1: 0 + - _EmissiveBlink_Min2: 0 + - _EmissiveBlink_Min3: 0 + - _EmissiveBlink_Velocity: 4 + - _EmissiveBlink_Velocity1: 4 + - _EmissiveBlink_Velocity2: 4 + - _EmissiveBlink_Velocity3: 4 + - _EmissiveScroll_Interval: 20 + - _EmissiveScroll_Interval1: 20 + - _EmissiveScroll_Interval2: 20 + - _EmissiveScroll_Interval3: 20 + - _EmissiveScroll_Velocity: 10 + - _EmissiveScroll_Velocity1: 10 + - _EmissiveScroll_Velocity2: 10 + - _EmissiveScroll_Velocity3: 10 + - _EmissiveScroll_Width: 10 + - _EmissiveScroll_Width1: 10 + - _EmissiveScroll_Width2: 10 + - _EmissiveScroll_Width3: 10 + - _EnableALDecal: 0 + - _EnableAniso: 0 + - _EnableAudioLink: 0 + - _EnableDepthBulge: 0 + - _EnableDepthRimLighting: 0 + - _EnableDissolve: 0 + - _EnableDissolveAudioLink: 0 + - _EnableDistortion: 0 + - _EnableDistortionAudioLink: 0 + - _EnableEmission: 0 + - _EnableEmission1: 0 + - _EnableEmission2: 0 + - _EnableEmission3: 0 + - _EnableEnvironmentalRim: 0 + - _EnableFlipbook: 0 + - _EnableGITDEmission: 0 + - _EnableGITDEmission1: 0 + - _EnableGITDEmission2: 0 + - _EnableGITDEmission3: 0 + - _EnableMirrorOptions: 0 + - _EnableOutlines: 0 + - _EnablePathRemapping: 0 + - _EnablePathing: 0 + - _EnableRim2Lighting: 0 + - _EnableRimLighting: 0 + - _EnableTouchGlow: 0 + - _EnableTruchet: 0 + - _EnableUDIMDiscardOptions: 0 + - _EnableUDIMFaceDiscardOptions: 0 + - _EnableVolumeColor: 0 + - _EntranceStiffness: 0.01 + - _EntryOpenDuration: 0.1 + - _FFBFOutlineStencilHelp0: 0 + - _FFBFOutlineStencilHelp1: 0 + - _FFBFStencilHelp0: 0 + - _FFBFStencilHelp1: 0 + - _FXProximityColor: 0 + - _FXProximityColorBackFace: 0 + - _FXProximityColorMaxColorThemeIndex: 0 + - _FXProximityColorMaxDistance: 1 + - _FXProximityColorMinColorThemeIndex: 0 + - _FXProximityColorMinDistance: 0 + - _FXProximityColorType: 1 + - _FlipBackfaceNormals: 1 + - _FlipbookAlphaControlsFinalAlpha: 0 + - _FlipbookBlendType: 0 + - _FlipbookChronoType: 0 + - _FlipbookChronotensityBand: 0 + - _FlipbookChronotensityEnabled: 0 + - _FlipbookChronotensitySpeed: 0 + - _FlipbookColorReplaces: 0 + - _FlipbookColorThemeIndex: 0 + - _FlipbookCrossfadeEnabled: 0 + - _FlipbookCurrentFrame: 0 + - _FlipbookEmissionStrength: 0 + - _FlipbookEndFrame: 0 + - _FlipbookFPS: 30 + - _FlipbookFrameOffset: 0 + - _FlipbookHueSelectOrShift: 1 + - _FlipbookHueShift: 0 + - _FlipbookHueShiftColorSpace: 0 + - _FlipbookHueShiftEnabled: 0 + - _FlipbookHueShiftSpeed: 0 + - _FlipbookIntensityControlsAlpha: 0 + - _FlipbookManualFrameControl: 0 + - _FlipbookMaskChannel: 0 + - _FlipbookMaskGlobalMask: 0 + - _FlipbookMaskGlobalMaskBlendType: 2 + - _FlipbookMaskUV: 0 + - _FlipbookReplace: 1 + - _FlipbookRotation: 0 + - _FlipbookRotationSpeed: 0 + - _FlipbookStartAndEnd: 0 + - _FlipbookStartFrame: 0 + - _FlipbookTexArrayUV: 0 + - _FlipbookTiled: 0 + - _FogHeightOffset: 0 + - _FogHeightScale: 1 + - _FogScale: 1 + - _FogStartOffset: 0 + - _ForceFlatRampedLightmap: 1 + - _ForgotToLockMaterial: 1 + - _GGXAnisotropics: 0 + - _GIEmissionMultiplier: 1 + - _GITDEMaxEmissionMultiplier: 0 + - _GITDEMaxEmissionMultiplier1: 0 + - _GITDEMaxEmissionMultiplier2: 0 + - _GITDEMaxEmissionMultiplier3: 0 + - _GITDEMaxLight: 1 + - _GITDEMaxLight1: 1 + - _GITDEMaxLight2: 1 + - _GITDEMaxLight3: 1 + - _GITDEMinEmissionMultiplier: 1 + - _GITDEMinEmissionMultiplier1: 1 + - _GITDEMinEmissionMultiplier2: 1 + - _GITDEMinEmissionMultiplier3: 1 + - _GITDEMinLight: 0 + - _GITDEMinLight1: 0 + - _GITDEMinLight2: 0 + - _GITDEMinLight3: 0 + - _GITDEWorldOrMesh: 0 + - _GITDEWorldOrMesh1: 0 + - _GITDEWorldOrMesh2: 0 + - _GITDEWorldOrMesh3: 0 + - _GSAAStrength: 0 + - _GlitterALAlphaAddBand: 0 + - _GlitterALChronoRotationSpeed: 0 + - _GlitterALChronoRotationSpeedBand: 0 + - _GlitterALChronoRotationSpeedType: 0 + - _GlitterALChronoSparkleSpeed: 0 + - _GlitterALChronoSparkleSpeedBand: 0 + - _GlitterALChronoSparkleSpeedType: 0 + - _GlitterALEnabled: 0 + - _GlitterALMaxBrightnessBand: 0 + - _GlitterALSizeAddBand: 0 + - _GlitterAngleRange: 90 + - _GlitterBias: 0.8 + - _GlitterBlendType: 0 + - _GlitterBrightness: 3 + - _GlitterCenterSize: 0.08 + - _GlitterColorMapUV: 0 + - _GlitterColorThemeIndex: 0 + - _GlitterContrast: 300 + - _GlitterEnable: 0 + - _GlitterFrequency: 300 + - _GlitterHideInShadow: 0 + - _GlitterHueSelectOrShift: 1 + - _GlitterHueShift: 0 + - _GlitterHueShiftColorSpace: 0 + - _GlitterHueShiftEnabled: 0 + - _GlitterHueShiftSpeed: 0 + - _GlitterJaggyFix: 0 + - _GlitterLayers: 2 + - _GlitterMaskChannel: 0 + - _GlitterMaskGlobalMask: 0 + - _GlitterMaskGlobalMaskBlendType: 2 + - _GlitterMaskInvert: 0 + - _GlitterMaskUV: 0 + - _GlitterMinBrightness: 0 + - _GlitterMode: 0 + - _GlitterRandomColors: 0 + - _GlitterRandomLocation: 1 + - _GlitterRandomRotation: 0 + - _GlitterRandomSize: 0 + - _GlitterScaleWithLighting: 0 + - _GlitterShape: 0 + - _GlitterSize: 0.3 + - _GlitterSpeed: 10 + - _GlitterTextureRotation: 0 + - _GlitterUV: 0 + - _GlitterUseNormals: 0 + - _GlitterUseSurfaceColor: 0 + - _GlobalMaskBackface_0: 0 + - _GlobalMaskBackface_1: 0 + - _GlobalMaskBackface_10: 0 + - _GlobalMaskBackface_11: 0 + - _GlobalMaskBackface_12: 0 + - _GlobalMaskBackface_13: 0 + - _GlobalMaskBackface_14: 0 + - _GlobalMaskBackface_15: 0 + - _GlobalMaskBackface_2: 0 + - _GlobalMaskBackface_3: 0 + - _GlobalMaskBackface_4: 0 + - _GlobalMaskBackface_5: 0 + - _GlobalMaskBackface_6: 0 + - _GlobalMaskBackface_7: 0 + - _GlobalMaskBackface_8: 0 + - _GlobalMaskBackface_9: 0 + - _GlobalMaskCamera_0: 0 + - _GlobalMaskCamera_1: 0 + - _GlobalMaskCamera_10: 0 + - _GlobalMaskCamera_11: 0 + - _GlobalMaskCamera_12: 0 + - _GlobalMaskCamera_13: 0 + - _GlobalMaskCamera_14: 0 + - _GlobalMaskCamera_15: 0 + - _GlobalMaskCamera_2: 0 + - _GlobalMaskCamera_3: 0 + - _GlobalMaskCamera_4: 0 + - _GlobalMaskCamera_5: 0 + - _GlobalMaskCamera_6: 0 + - _GlobalMaskCamera_7: 0 + - _GlobalMaskCamera_8: 0 + - _GlobalMaskCamera_9: 0 + - _GlobalMaskDistanceBlendType_0: 0 + - _GlobalMaskDistanceBlendType_1: 0 + - _GlobalMaskDistanceBlendType_10: 0 + - _GlobalMaskDistanceBlendType_11: 0 + - _GlobalMaskDistanceBlendType_12: 0 + - _GlobalMaskDistanceBlendType_13: 0 + - _GlobalMaskDistanceBlendType_14: 0 + - _GlobalMaskDistanceBlendType_15: 0 + - _GlobalMaskDistanceBlendType_2: 0 + - _GlobalMaskDistanceBlendType_3: 0 + - _GlobalMaskDistanceBlendType_4: 0 + - _GlobalMaskDistanceBlendType_5: 0 + - _GlobalMaskDistanceBlendType_6: 0 + - _GlobalMaskDistanceBlendType_7: 0 + - _GlobalMaskDistanceBlendType_8: 0 + - _GlobalMaskDistanceBlendType_9: 0 + - _GlobalMaskDistanceEnable_0: 0 + - _GlobalMaskDistanceEnable_1: 0 + - _GlobalMaskDistanceEnable_10: 0 + - _GlobalMaskDistanceEnable_11: 0 + - _GlobalMaskDistanceEnable_12: 0 + - _GlobalMaskDistanceEnable_13: 0 + - _GlobalMaskDistanceEnable_14: 0 + - _GlobalMaskDistanceEnable_15: 0 + - _GlobalMaskDistanceEnable_2: 0 + - _GlobalMaskDistanceEnable_3: 0 + - _GlobalMaskDistanceEnable_4: 0 + - _GlobalMaskDistanceEnable_5: 0 + - _GlobalMaskDistanceEnable_6: 0 + - _GlobalMaskDistanceEnable_7: 0 + - _GlobalMaskDistanceEnable_8: 0 + - _GlobalMaskDistanceEnable_9: 0 + - _GlobalMaskDistanceMaxAlpha_0: 1 + - _GlobalMaskDistanceMaxAlpha_1: 1 + - _GlobalMaskDistanceMaxAlpha_10: 1 + - _GlobalMaskDistanceMaxAlpha_11: 1 + - _GlobalMaskDistanceMaxAlpha_12: 1 + - _GlobalMaskDistanceMaxAlpha_13: 1 + - _GlobalMaskDistanceMaxAlpha_14: 1 + - _GlobalMaskDistanceMaxAlpha_15: 1 + - _GlobalMaskDistanceMaxAlpha_2: 1 + - _GlobalMaskDistanceMaxAlpha_3: 1 + - _GlobalMaskDistanceMaxAlpha_4: 1 + - _GlobalMaskDistanceMaxAlpha_5: 1 + - _GlobalMaskDistanceMaxAlpha_6: 1 + - _GlobalMaskDistanceMaxAlpha_7: 1 + - _GlobalMaskDistanceMaxAlpha_8: 1 + - _GlobalMaskDistanceMaxAlpha_9: 1 + - _GlobalMaskDistanceMax_0: 2 + - _GlobalMaskDistanceMax_1: 2 + - _GlobalMaskDistanceMax_10: 2 + - _GlobalMaskDistanceMax_11: 2 + - _GlobalMaskDistanceMax_12: 2 + - _GlobalMaskDistanceMax_13: 2 + - _GlobalMaskDistanceMax_14: 2 + - _GlobalMaskDistanceMax_15: 2 + - _GlobalMaskDistanceMax_2: 2 + - _GlobalMaskDistanceMax_3: 2 + - _GlobalMaskDistanceMax_4: 2 + - _GlobalMaskDistanceMax_5: 2 + - _GlobalMaskDistanceMax_6: 2 + - _GlobalMaskDistanceMax_7: 2 + - _GlobalMaskDistanceMax_8: 2 + - _GlobalMaskDistanceMax_9: 2 + - _GlobalMaskDistanceMinAlpha_0: 0 + - _GlobalMaskDistanceMinAlpha_1: 0 + - _GlobalMaskDistanceMinAlpha_10: 0 + - _GlobalMaskDistanceMinAlpha_11: 0 + - _GlobalMaskDistanceMinAlpha_12: 0 + - _GlobalMaskDistanceMinAlpha_13: 0 + - _GlobalMaskDistanceMinAlpha_14: 0 + - _GlobalMaskDistanceMinAlpha_15: 0 + - _GlobalMaskDistanceMinAlpha_2: 0 + - _GlobalMaskDistanceMinAlpha_3: 0 + - _GlobalMaskDistanceMinAlpha_4: 0 + - _GlobalMaskDistanceMinAlpha_5: 0 + - _GlobalMaskDistanceMinAlpha_6: 0 + - _GlobalMaskDistanceMinAlpha_7: 0 + - _GlobalMaskDistanceMinAlpha_8: 0 + - _GlobalMaskDistanceMinAlpha_9: 0 + - _GlobalMaskDistanceMin_0: 1 + - _GlobalMaskDistanceMin_1: 1 + - _GlobalMaskDistanceMin_10: 1 + - _GlobalMaskDistanceMin_11: 1 + - _GlobalMaskDistanceMin_12: 1 + - _GlobalMaskDistanceMin_13: 1 + - _GlobalMaskDistanceMin_14: 1 + - _GlobalMaskDistanceMin_15: 1 + - _GlobalMaskDistanceMin_2: 1 + - _GlobalMaskDistanceMin_3: 1 + - _GlobalMaskDistanceMin_4: 1 + - _GlobalMaskDistanceMin_5: 1 + - _GlobalMaskDistanceMin_6: 1 + - _GlobalMaskDistanceMin_7: 1 + - _GlobalMaskDistanceMin_8: 1 + - _GlobalMaskDistanceMin_9: 1 + - _GlobalMaskDistanceType_0: 1 + - _GlobalMaskDistanceType_1: 1 + - _GlobalMaskDistanceType_10: 1 + - _GlobalMaskDistanceType_11: 1 + - _GlobalMaskDistanceType_12: 1 + - _GlobalMaskDistanceType_13: 1 + - _GlobalMaskDistanceType_14: 1 + - _GlobalMaskDistanceType_15: 1 + - _GlobalMaskDistanceType_2: 1 + - _GlobalMaskDistanceType_3: 1 + - _GlobalMaskDistanceType_4: 1 + - _GlobalMaskDistanceType_5: 1 + - _GlobalMaskDistanceType_6: 1 + - _GlobalMaskDistanceType_7: 1 + - _GlobalMaskDistanceType_8: 1 + - _GlobalMaskDistanceType_9: 1 + - _GlobalMaskMirrorVisibilityMode: 1 + - _GlobalMaskMirror_0: 0 + - _GlobalMaskMirror_1: 0 + - _GlobalMaskMirror_10: 0 + - _GlobalMaskMirror_11: 0 + - _GlobalMaskMirror_12: 0 + - _GlobalMaskMirror_13: 0 + - _GlobalMaskMirror_14: 0 + - _GlobalMaskMirror_15: 0 + - _GlobalMaskMirror_2: 0 + - _GlobalMaskMirror_3: 0 + - _GlobalMaskMirror_4: 0 + - _GlobalMaskMirror_5: 0 + - _GlobalMaskMirror_6: 0 + - _GlobalMaskMirror_7: 0 + - _GlobalMaskMirror_8: 0 + - _GlobalMaskMirror_9: 0 + - _GlobalMaskModifiersBackfaceEnable: 0 + - _GlobalMaskModifiersCameraEnable: 0 + - _GlobalMaskModifiersCameraInfo: 0 + - _GlobalMaskModifiersDistanceEnable: 0 + - _GlobalMaskModifiersMirrorEnable: 0 + - _GlobalMaskOptionsEnable: 0 + - _GlobalMaskOptionsType: 0 + - _GlobalMaskSlider_0: 0 + - _GlobalMaskSlider_1: 0 + - _GlobalMaskSlider_10: 0 + - _GlobalMaskSlider_11: 0 + - _GlobalMaskSlider_12: 0 + - _GlobalMaskSlider_13: 0 + - _GlobalMaskSlider_14: 0 + - _GlobalMaskSlider_15: 0 + - _GlobalMaskSlider_2: 0 + - _GlobalMaskSlider_3: 0 + - _GlobalMaskSlider_4: 0 + - _GlobalMaskSlider_5: 0 + - _GlobalMaskSlider_6: 0 + - _GlobalMaskSlider_7: 0 + - _GlobalMaskSlider_8: 0 + - _GlobalMaskSlider_9: 0 + - _GlobalMaskTexture0Split: 0 + - _GlobalMaskTexture0UV: 0 + - _GlobalMaskTexture1Split: 0 + - _GlobalMaskTexture1UV: 0 + - _GlobalMaskTexture2Split: 0 + - _GlobalMaskTexture2UV: 0 + - _GlobalMaskTexture3Split: 0 + - _GlobalMaskTexture3UV: 0 + - _GlobalMaskTexturesEnable: 0 + - _GlobalMaskToggleOff_0: 0 + - _GlobalMaskToggleOff_1: 0 + - _GlobalMaskToggleOff_10: 0 + - _GlobalMaskToggleOff_11: 0 + - _GlobalMaskToggleOff_12: 0 + - _GlobalMaskToggleOff_13: 0 + - _GlobalMaskToggleOff_14: 0 + - _GlobalMaskToggleOff_15: 0 + - _GlobalMaskToggleOff_2: 0 + - _GlobalMaskToggleOff_3: 0 + - _GlobalMaskToggleOff_4: 0 + - _GlobalMaskToggleOff_5: 0 + - _GlobalMaskToggleOff_6: 0 + - _GlobalMaskToggleOff_7: 0 + - _GlobalMaskToggleOff_8: 0 + - _GlobalMaskToggleOff_9: 0 + - _GlobalMaskToggleOn_0: 0 + - _GlobalMaskToggleOn_1: 0 + - _GlobalMaskToggleOn_10: 0 + - _GlobalMaskToggleOn_11: 0 + - _GlobalMaskToggleOn_12: 0 + - _GlobalMaskToggleOn_13: 0 + - _GlobalMaskToggleOn_14: 0 + - _GlobalMaskToggleOn_15: 0 + - _GlobalMaskToggleOn_2: 0 + - _GlobalMaskToggleOn_3: 0 + - _GlobalMaskToggleOn_4: 0 + - _GlobalMaskToggleOn_5: 0 + - _GlobalMaskToggleOn_6: 0 + - _GlobalMaskToggleOn_7: 0 + - _GlobalMaskToggleOn_8: 0 + - _GlobalMaskToggleOn_9: 0 + - _GlobalMaskVertexColorAlpha: 0 + - _GlobalMaskVertexColorAlphaBlendType: 2 + - _GlobalMaskVertexColorBlue: 0 + - _GlobalMaskVertexColorBlueBlendType: 2 + - _GlobalMaskVertexColorGreen: 0 + - _GlobalMaskVertexColorGreenBlendType: 2 + - _GlobalMaskVertexColorLinearSpace: 1 + - _GlobalMaskVertexColorRed: 0 + - _GlobalMaskVertexColorRedBlendType: 2 + - _GlobalThemeHue0: 0 + - _GlobalThemeHue1: 0 + - _GlobalThemeHue2: 0 + - _GlobalThemeHue3: 0 + - _GlobalThemeHueSpeed0: 0 + - _GlobalThemeHueSpeed1: 0 + - _GlobalThemeHueSpeed2: 0 + - _GlobalThemeHueSpeed3: 0 + - _GlobalThemeSaturation0: 0 + - _GlobalThemeSaturation1: 0 + - _GlobalThemeSaturation2: 0 + - _GlobalThemeSaturation3: 0 + - _GlobalThemeValue0: 0 + - _GlobalThemeValue1: 0 + - _GlobalThemeValue2: 0 + - _GlobalThemeValue3: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _GreenAlphaAdd: 0 + - _GreenColorThemeIndex: 0 + - _GreenTextureStochastic: 0 + - _GreenTextureUV: 0 + - _HeightMapUV: 0 + - _HeightOffset: 0 + - _HeightStepsMax: 128 + - _HeightStepsMin: 10 + - _HeightStrength: 0.005 + - _HeightmaskChannel: 0 + - _HeightmaskInvert: 0 + - _HeightmaskUV: 0 + - _HighColorThemeIndex: 0 + - _HighColor_Power: 0.2 + - _HighColor_TexUV: 0 + - _IgnoreCastedShadows: 0 + - _IgnoreFog: 0 + - _Is_BlendAddToHiColor: 0 + - _Is_LightColor_Ap_Rim2Light: 1 + - _Is_LightColor_Ap_RimLight: 1 + - _Is_LightColor_Rim2Light: 1 + - _Is_LightColor_RimLight: 1 + - _Is_NormalMapToRim2Light: 1 + - _Is_NormalMapToRimLight: 1 + - _Is_SpecularToHighColor: 0 + - _LTCGIEnabled: 0 + - _LTCGI_AnimToggle: 1 + - _LTCGI_Attribution: 0 + - _LTCGI_DiffuseColorThemeIndex: 0 + - _LTCGI_Metallic: 0 + - _LTCGI_Smoothness: 0 + - _LTCGI_SpecularColorThemeIndex: 0 + - _LTCGI_UseEO: 0 + - _LTCGI_UsePBR: 1 + - _Layer1Strength: 1 + - _Layer2Size: 0 + - _Layer2Strength: 0 + - _Length: 0 + - _LightDataAOGlobalMaskBlendTypeR: 2 + - _LightDataAOGlobalMaskR: 0 + - _LightDataAOStrengthA: 0 + - _LightDataAOStrengthB: 0 + - _LightDataAOStrengthG: 0 + - _LightDataAOStrengthR: 1 + - _LightDataDebugEnabled: 0 + - _LightDataDetailShadowGlobalMaskBlendTypeR: 2 + - _LightDataDetailShadowGlobalMaskR: 0 + - _LightDataSDFBlendY: 1 + - _LightDataSDFMapLOD: 0 + - _LightDataSDFMapUV: 0 + - _LightDataShadowMaskGlobalMaskBlendTypeR: 2 + - _LightDataShadowMaskGlobalMaskR: 0 + - _LightDirection_MaskOn: 0 + - _LightDirection_MaskOn2: 0 + - _LightingAOMapsUV: 0 + - _LightingAddDetailShadowStrengthA: 0 + - _LightingAddDetailShadowStrengthB: 0 + - _LightingAddDetailShadowStrengthG: 0 + - _LightingAddDetailShadowStrengthR: 1 + - _LightingAdditiveCastedShadows: 1 + - _LightingAdditiveEnable: 1 + - _LightingAdditiveGradientEnd: 0.5 + - _LightingAdditiveGradientStart: 0 + - _LightingAdditiveLimit: 1 + - _LightingAdditiveLimited: 1 + - _LightingAdditiveMonochromatic: 0 + - _LightingAdditivePassthrough: 0.5 + - _LightingAdditiveType: 3 + - _LightingCap: 1 + - _LightingCapEnabled: 1 + - _LightingCastedShadows: 0 + - _LightingColorMode: 0 + - _LightingDebugVisualize: 0 + - _LightingDetailShadowMapsUV: 0 + - _LightingDetailShadowStrengthA: 0 + - _LightingDetailShadowStrengthB: 0 + - _LightingDetailShadowStrengthG: 0 + - _LightingDetailShadowStrengthR: 1 + - _LightingDirectionMode: 0 + - _LightingEnableLightVolumes: 1 + - _LightingForceColorEnabled: 0 + - _LightingForcedColorThemeIndex: 0 + - _LightingGradientEnd: 0.5 + - _LightingGradientStart: 0 + - _LightingIgnoreAmbientColor: 1 + - _LightingIndirectUsesNormals: 0 + - _LightingMapMode: 0 + - _LightingMinLightBrightness: 0 + - _LightingMirrorVertexLightingEnabled: 1 + - _LightingMode: 6 + - _LightingMonochromatic: 0 + - _LightingMulitlayerNonLinear: 1 + - _LightingShadowMaskStrengthA: 0 + - _LightingShadowMaskStrengthB: 0 + - _LightingShadowMaskStrengthG: 0 + - _LightingShadowMaskStrengthR: 1 + - _LightingShadowMasksUV: 0 + - _LightingVertexLightingEnabled: 1 + - _LightingViewDirOffsetPitch: 0 + - _LightingViewDirOffsetYaw: 0 + - _LightingWrappedNormalization: 0 + - _LightingWrappedWrap: 0 + - _LineColorThemeIndex: 0 + - _LineWidth: 1 + - _LookAtAlphaAlpha: 1 + - _LookAtAlphaMaskEnabled: 0 + - _LookAtAlphaTargetUp: 0 + - _LookAtBlueAlpha: 1 + - _LookAtBlueMaskEnabled: 0 + - _LookAtBlueTargetUp: 0 + - _LookAtGreenAlpha: 1 + - _LookAtGreenMaskEnabled: 0 + - _LookAtGreenTargetUp: 0 + - _LookAtMaskUV: 0 + - _LookAtRedAlpha: 1 + - _LookAtRedMaskEnabled: 1 + - _LookAtRedTargetUp: 0 + - _LookAtVisibilityEnabled: 0 + - _LookAtVisibilityMirror: 0 + - _LookAtVisibilityMode: 1 + - _LookAtVisibilityVRCCameraDesktop: 1 + - _LookAtVisibilityVRCCameraScreenshot: 1 + - _LookAtVisibilityVRCCameraVR: 1 + - _LookAtVisibilityVRCMirrorDesktop: 1 + - _LookAtVisibilityVRCMirrorVR: 1 + - _LookAtVisibilityVRCRegular: 1 + - _MainALHueShiftBand: 0 + - _MainALHueShiftCTIndex: 0 + - _MainAlphaMaskMode: 2 + - _MainBrightness: 0 + - _MainBrightnessGlobalMask: 0 + - _MainBrightnessGlobalMaskBlendType: 2 + - _MainColorAdjustTextureUV: 0 + - _MainColorAdjustToggle: 0 + - _MainGamma: 1 + - _MainGammaGlobalMask: 0 + - _MainGammaGlobalMaskBlendType: 2 + - _MainGradationStrength: 0 + - _MainHueALCTEnabled: 0 + - _MainHueALMotionSpeed: 1 + - _MainHueGlobalMask: 0 + - _MainHueGlobalMaskBlendType: 2 + - _MainHueShift: 0 + - _MainHueShiftColorSpace: 0 + - _MainHueShiftReplace: 1 + - _MainHueShiftSelectOrShift: 1 + - _MainHueShiftSpeed: 0 + - _MainHueShiftToggle: 0 + - _MainIgnoreTexAlpha: 0 + - _MainPixelMode: 0 + - _MainSaturationGlobalMask: 0 + - _MainSaturationGlobalMaskBlendType: 2 + - _MainTexStochastic: 0 + - _MainTexUV: 0 + - _MainUseVertexColorAlpha: 0 + - _MainVertexColoring: 0 + - _MainVertexColoringEnabled: 0 + - _MainVertexColoringLinearSpace: 1 + - _Matcap0ALAlphaAddBand: 0 + - _Matcap0ALChronoPanBand: 0 + - _Matcap0ALChronoPanSpeed: 0 + - _Matcap0ALChronoPanType: 0 + - _Matcap0ALEmissionAddBand: 0 + - _Matcap0ALEnabled: 0 + - _Matcap0ALIntensityAddBand: 0 + - _Matcap0CircleMaskBlur: 0.1 + - _Matcap0CircleMaskBorder: 0.45 + - _Matcap0CircleMaskEnabled: 0 + - _Matcap0CustomNormal: 0 + - _Matcap0NormalMapScale: 1 + - _Matcap0NormalMapUV: 0 + - _Matcap1ALAlphaAddBand: 0 + - _Matcap1ALChronoPanBand: 0 + - _Matcap1ALChronoPanSpeed: 0 + - _Matcap1ALChronoPanType: 0 + - _Matcap1ALEmissionAddBand: 0 + - _Matcap1ALEnabled: 0 + - _Matcap1ALIntensityAddBand: 0 + - _Matcap1CustomNormal: 0 + - _Matcap1NormalMapScale: 1 + - _Matcap1NormalMapUV: 0 + - _Matcap2ALAlphaAddBand: 0 + - _Matcap2ALChronoPanBand: 0 + - _Matcap2ALChronoPanSpeed: 0 + - _Matcap2ALChronoPanType: 0 + - _Matcap2ALEmissionAddBand: 0 + - _Matcap2ALEnabled: 0 + - _Matcap2ALIntensityAddBand: 0 + - _Matcap2Add: 0 + - _Matcap2AddToLight: 0 + - _Matcap2AlphaOverride: 0 + - _Matcap2ApplyToAlphaBlendType: 0 + - _Matcap2ApplyToAlphaBlending: 1 + - _Matcap2ApplyToAlphaEnabled: 0 + - _Matcap2ApplyToAlphaSourceBlend: 0 + - _Matcap2BaseColorMix: 0 + - _Matcap2Border: 0.5 + - _Matcap2CircleMaskBlur: 0.1 + - _Matcap2CircleMaskBorder: 0.45 + - _Matcap2CircleMaskEnabled: 0 + - _Matcap2ColorThemeIndex: 0 + - _Matcap2CustomNormal: 0 + - _Matcap2EmissionStrength: 0 + - _Matcap2Enable: 0 + - _Matcap2HueSelectOrShift: 1 + - _Matcap2HueShift: 0 + - _Matcap2HueShiftColorSpace: 0 + - _Matcap2HueShiftEnabled: 0 + - _Matcap2HueShiftSpeed: 0 + - _Matcap2Intensity: 1 + - _Matcap2LightColorMix: 0 + - _Matcap2LightMask: 0 + - _Matcap2MaskChannel: 0 + - _Matcap2MaskGlobalMask: 0 + - _Matcap2MaskGlobalMaskBlendType: 2 + - _Matcap2MaskInvert: 0 + - _Matcap2MaskSmoothnessApply: 0 + - _Matcap2MaskSmoothnessChannel: 3 + - _Matcap2MaskUV: 0 + - _Matcap2Mixed: 0 + - _Matcap2Multiply: 0 + - _Matcap2Normal: 1 + - _Matcap2NormalMapScale: 1 + - _Matcap2NormalMapUV: 0 + - _Matcap2Replace: 0 + - _Matcap2Rotation: 0 + - _Matcap2Screen: 0 + - _Matcap2Smoothness: 1 + - _Matcap2TPSDepthEnabled: 0 + - _Matcap2TPSMaskStrength: 1 + - _Matcap2UVMode: 1 + - _Matcap2UVToBlend: 1 + - _Matcap3ALAlphaAddBand: 0 + - _Matcap3ALChronoPanBand: 0 + - _Matcap3ALChronoPanSpeed: 0 + - _Matcap3ALChronoPanType: 0 + - _Matcap3ALEmissionAddBand: 0 + - _Matcap3ALEnabled: 0 + - _Matcap3ALIntensityAddBand: 0 + - _Matcap3Add: 0 + - _Matcap3AddToLight: 0 + - _Matcap3AlphaOverride: 0 + - _Matcap3ApplyToAlphaBlendType: 0 + - _Matcap3ApplyToAlphaBlending: 1 + - _Matcap3ApplyToAlphaEnabled: 0 + - _Matcap3ApplyToAlphaSourceBlend: 0 + - _Matcap3BaseColorMix: 0 + - _Matcap3Border: 0.5 + - _Matcap3CircleMaskBlur: 0.1 + - _Matcap3CircleMaskBorder: 0.45 + - _Matcap3CircleMaskEnabled: 0 + - _Matcap3ColorThemeIndex: 0 + - _Matcap3CustomNormal: 0 + - _Matcap3EmissionStrength: 0 + - _Matcap3Enable: 0 + - _Matcap3HueSelectOrShift: 1 + - _Matcap3HueShift: 0 + - _Matcap3HueShiftColorSpace: 0 + - _Matcap3HueShiftEnabled: 0 + - _Matcap3HueShiftSpeed: 0 + - _Matcap3Intensity: 1 + - _Matcap3LightColorMix: 0 + - _Matcap3LightMask: 0 + - _Matcap3MaskChannel: 0 + - _Matcap3MaskGlobalMask: 0 + - _Matcap3MaskGlobalMaskBlendType: 2 + - _Matcap3MaskInvert: 0 + - _Matcap3MaskSmoothnessApply: 0 + - _Matcap3MaskSmoothnessChannel: 3 + - _Matcap3MaskUV: 0 + - _Matcap3Mixed: 0 + - _Matcap3Multiply: 0 + - _Matcap3Normal: 1 + - _Matcap3NormalMapScale: 1 + - _Matcap3NormalMapUV: 0 + - _Matcap3Replace: 0 + - _Matcap3Rotation: 0 + - _Matcap3Screen: 0 + - _Matcap3Smoothness: 1 + - _Matcap3TPSDepthEnabled: 0 + - _Matcap3TPSMaskStrength: 1 + - _Matcap3UVMode: 1 + - _Matcap3UVToBlend: 1 + - _Matcap4Add: 0 + - _Matcap4AddToLight: 0 + - _Matcap4AlphaOverride: 0 + - _Matcap4ApplyToAlphaBlendType: 0 + - _Matcap4ApplyToAlphaBlending: 1 + - _Matcap4ApplyToAlphaEnabled: 0 + - _Matcap4ApplyToAlphaSourceBlend: 0 + - _Matcap4BaseColorMix: 0 + - _Matcap4Border: 0.5 + - _Matcap4CircleMaskBlur: 0.1 + - _Matcap4CircleMaskBorder: 0.45 + - _Matcap4CircleMaskEnabled: 0 + - _Matcap4ColorThemeIndex: 0 + - _Matcap4EmissionStrength: 0 + - _Matcap4Enable: 0 + - _Matcap4HueSelectOrShift: 1 + - _Matcap4HueShift: 0 + - _Matcap4HueShiftColorSpace: 0 + - _Matcap4HueShiftEnabled: 0 + - _Matcap4HueShiftSpeed: 0 + - _Matcap4Intensity: 1 + - _Matcap4LightColorMix: 0 + - _Matcap4LightMask: 0 + - _Matcap4MaskChannel: 0 + - _Matcap4MaskGlobalMask: 0 + - _Matcap4MaskGlobalMaskBlendType: 2 + - _Matcap4MaskInvert: 0 + - _Matcap4MaskSmoothnessApply: 0 + - _Matcap4MaskSmoothnessChannel: 3 + - _Matcap4MaskUV: 0 + - _Matcap4Mixed: 0 + - _Matcap4Multiply: 0 + - _Matcap4Normal: 1 + - _Matcap4Replace: 0 + - _Matcap4Rotation: 0 + - _Matcap4Screen: 0 + - _Matcap4Smoothness: 1 + - _Matcap4TPSDepthEnabled: 0 + - _Matcap4TPSMaskStrength: 1 + - _Matcap4UVMode: 1 + - _Matcap4UVToBlend: 1 + - _MatcapAdd: 0 + - _MatcapAddToLight: 0 + - _MatcapAlphaOverride: 0 + - _MatcapApplyToAlphaBlendType: 0 + - _MatcapApplyToAlphaBlending: 1 + - _MatcapApplyToAlphaEnabled: 0 + - _MatcapApplyToAlphaSourceBlend: 0 + - _MatcapBaseColorMix: 0 + - _MatcapBorder: 0.5 + - _MatcapColorThemeIndex: 0 + - _MatcapEmissionStrength: 0 + - _MatcapEnable: 0 + - _MatcapHueSelectOrShift: 1 + - _MatcapHueShift: 0 + - _MatcapHueShiftColorSpace: 0 + - _MatcapHueShiftEnabled: 0 + - _MatcapHueShiftSpeed: 0 + - _MatcapIntensity: 1 + - _MatcapLightColorMix: 0 + - _MatcapLightMask: 0 + - _MatcapMaskChannel: 0 + - _MatcapMaskGlobalMask: 0 + - _MatcapMaskGlobalMaskBlendType: 2 + - _MatcapMaskInvert: 0 + - _MatcapMaskSmoothnessApply: 0 + - _MatcapMaskSmoothnessChannel: 3 + - _MatcapMaskUV: 0 + - _MatcapMixed: 0 + - _MatcapMultiply: 0 + - _MatcapNormal: 1 + - _MatcapReplace: 1 + - _MatcapRotation: 0 + - _MatcapScreen: 0 + - _MatcapSmoothness: 1 + - _MatcapTPSDepthEnabled: 0 + - _MatcapTPSMaskStrength: 1 + - _MatcapUVMode: 1 + - _MatcapUVToBlend: 1 + - _Metallic: 0 + - _Mirror: 0 + - _MirrorColorThemeIndex: 0 + - _MirrorTextureBlendType: 0 + - _MirrorTextureEnabled: 0 + - _MirrorTextureForceEnabled: 0 + - _MirrorTextureUV: 0 + - _MochieBRDF: 1 + - _MochieForceFallback: 0 + - _MochieGSAAEnabled: 1 + - _MochieLitFallback: 1 + - _MochieMetallicGlobalMask: 0 + - _MochieMetallicGlobalMaskBlendType: 2 + - _MochieMetallicMapInvert: 0 + - _MochieMetallicMapsMetallicChannel: 0 + - _MochieMetallicMapsReflectionMaskChannel: 2 + - _MochieMetallicMapsRoughnessChannel: 1 + - _MochieMetallicMapsSpecularMaskChannel: 3 + - _MochieMetallicMapsStochastic: 0 + - _MochieMetallicMapsUV: 0 + - _MochieMetallicMasksUV: 0 + - _MochieMetallicMultiplier: 0 + - _MochieReflectionMaskInvert: 0 + - _MochieReflectionStrength: 1 + - _MochieReflectionStrengthGlobalMask: 0 + - _MochieReflectionStrengthGlobalMaskBlendType: 2 + - _MochieReflectionTintThemeIndex: 0 + - _MochieRoughnessMapInvert: 0 + - _MochieRoughnessMultiplier: 1 + - _MochieRoughnessMultiplier2: 1 + - _MochieSmoothnessGlobalMask: 0 + - _MochieSmoothnessGlobalMaskBlendType: 2 + - _MochieSpecularMaskInvert: 0 + - _MochieSpecularStrength: 1 + - _MochieSpecularStrength2: 1 + - _MochieSpecularStrengthGlobalMask: 0 + - _MochieSpecularStrengthGlobalMaskBlendType: 2 + - _MochieSpecularTintThemeIndex: 0 + - _Mode: 9 + - _ModelAngleMax: 90 + - _ModelAngleMin: 45 + - _MultilayerMathBlurMapUV: 0 + - _NormalCorrect: 0 + - _NormalCorrectAmount: 0.9 + - _OcclusionStrength: 1 + - _OffsetFactor: 0 + - _OffsetUnits: 0 + - _Offset_Z: 0 + - _OrifaceEnabled: 0 + - _OrificeChannel: 0 + - _OutlineALColorEnabled: 0 + - _OutlineAlphaDistanceFade: 0 + - _OutlineAlphaDistanceFadeMax: 0 + - _OutlineAlphaDistanceFadeMaxAlpha: 1 + - _OutlineAlphaDistanceFadeMin: 0 + - _OutlineAlphaDistanceFadeMinAlpha: 0 + - _OutlineAlphaDistanceFadeType: 1 + - _OutlineBlendOp: 0 + - _OutlineBlendOpAlpha: 4 + - _OutlineClipAtZeroWidth: 1 + - _OutlineCull: 1 + - _OutlineDstBlend: 10 + - _OutlineDstBlendAlpha: 1 + - _OutlineEmission: 0 + - _OutlineExpansionMode: 1 + - _OutlineFixWidth: 0.5 + - _OutlineFixedSize: 1 + - _OutlineGamma: 1 + - _OutlineHue: 0 + - _OutlineHueOffsetSpeed: 0 + - _OutlineHueShift: 0 + - _OutlineLit: 1 + - _OutlineMaskChannel: 0 + - _OutlineMaskUV: 0 + - _OutlineOverrideAlpha: 0 + - _OutlineRimLightBlend: 0 + - _OutlineSaturation: 1 + - _OutlineShadowStrength: 0 + - _OutlineSpace: 0 + - _OutlineSrcBlend: 5 + - _OutlineSrcBlendAlpha: 1 + - _OutlineStencilBackCompareFunction: 8 + - _OutlineStencilBackFailOp: 0 + - _OutlineStencilBackPassOp: 0 + - _OutlineStencilBackZFailOp: 0 + - _OutlineStencilCompareFunction: 8 + - _OutlineStencilFailOp: 0 + - _OutlineStencilFrontCompareFunction: 8 + - _OutlineStencilFrontFailOp: 0 + - _OutlineStencilFrontPassOp: 0 + - _OutlineStencilFrontZFailOp: 0 + - _OutlineStencilPassOp: 0 + - _OutlineStencilReadMask: 255 + - _OutlineStencilRef: 0 + - _OutlineStencilType: 0 + - _OutlineStencilWriteMask: 255 + - _OutlineStencilZFailOp: 0 + - _OutlineTextureUV: 0 + - _OutlineTintMix: 0 + - _OutlineUseVertexColorNormals: 0 + - _OutlineValue: 1 + - _OutlineVertexColorMask: 0 + - _OutlineVertexColorMaskStrength: 1 + - _OutlineZOffsetChannel: 0 + - _OutlineZOffsetInvertMaskChannel: 0 + - _OutlineZOffsetMaskStrength: 1 + - _OutlineZOffsetVertexColor: 0 + - _OutlineZOffsetVertexColorStrength: 1 + - _OutlineZTest: 4 + - _OutlineZWrite: 1 + - _OutlinesMaxDistance: 1 + - _PBRNormalSelect: 1 + - _PBRSplitMaskSample: 0 + - _PBRSplitMaskStochastic: 0 + - _PPBrightness: 1 + - _PPContrast: 1 + - _PPEmissionMultiplier: 1 + - _PPFinalColorMultiplier: 1 + - _PPHDR: 0 + - _PPHelp: 0 + - _PPHue: 0 + - _PPHueShiftColorSpace: 0 + - _PPLightingAddition: 0 + - _PPLightingMultiplier: 1 + - _PPLightness: 0 + - _PPMaskChannel: 0 + - _PPMaskInvert: 0 + - _PPMaskUV: 0 + - _PPPosterization: 0 + - _PPPosterizationAmount: 4 + - _PPSaturation: 1 + - _PanoUseBothEyes: 1 + - _Parallax: 0.02 + - _ParallaxAnisotropic: 1 + - _ParallaxAnisotropyScale: 1 + - _ParallaxBinarySteps: 8 + - _ParallaxConeRatio: 1 + - _ParallaxInternalBlendMode: 0 + - _ParallaxInternalHeightFromAlpha: 0 + - _ParallaxInternalHeightmapMode: 0 + - _ParallaxInternalHueSelectOrShift: 1 + - _ParallaxInternalHueShift: 0 + - _ParallaxInternalHueShiftColorSpace: 0 + - _ParallaxInternalHueShiftEnabled: 0 + - _ParallaxInternalHueShiftPerLevel: 0 + - _ParallaxInternalHueShiftSpeed: 0 + - _ParallaxInternalIterations: 4 + - _ParallaxInternalMapMaskChannel: 0 + - _ParallaxInternalMapMaskUV: 0 + - _ParallaxInternalMaxColorThemeIndex: 0 + - _ParallaxInternalMaxDepth: 0.1 + - _ParallaxInternalMaxFade: 0.1 + - _ParallaxInternalMinColorThemeIndex: 0 + - _ParallaxInternalMinDepth: 0 + - _ParallaxInternalMinFade: 1 + - _ParallaxInternalSurfaceBlendMode: 8 + - _ParallaxMipBias: 0 + - _ParallaxRelaxedCone: 1 + - _ParallaxUV: 0 + - _PathALAutoCorrelator: 0 + - _PathALAutoCorrelatorA: 0 + - _PathALAutoCorrelatorB: 0 + - _PathALAutoCorrelatorG: 0 + - _PathALAutoCorrelatorMode: 0 + - _PathALAutoCorrelatorR: 0 + - _PathALCCA: 0 + - _PathALCCB: 0 + - _PathALCCG: 0 + - _PathALCCR: 0 + - _PathALChrono: 0 + - _PathALColorChord: 0 + - _PathALEmissionOffset: 0 + - _PathALHistory: 0 + - _PathALHistoryA: 0 + - _PathALHistoryB: 0 + - _PathALHistoryBandA: 0 + - _PathALHistoryBandB: 0 + - _PathALHistoryBandG: 0 + - _PathALHistoryBandR: 0 + - _PathALHistoryG: 0 + - _PathALHistoryMode: 0 + - _PathALHistoryR: 0 + - _PathALTimeOffset: 0 + - _PathALWidthOffset: 0 + - _PathChronoBandA: 0 + - _PathChronoBandB: 0 + - _PathChronoBandG: 0 + - _PathChronoBandR: 0 + - _PathChronoSpeedA: 0 + - _PathChronoSpeedB: 0 + - _PathChronoSpeedG: 0 + - _PathChronoSpeedR: 0 + - _PathChronoTypeA: 0 + - _PathChronoTypeB: 0 + - _PathChronoTypeG: 0 + - _PathChronoTypeR: 0 + - _PathColorAThemeIndex: 0 + - _PathColorBThemeIndex: 0 + - _PathColorGThemeIndex: 0 + - _PathColorRThemeIndex: 0 + - _PathGradientType: 0 + - _PathPointSampling: 1 + - _PathSource: 0 + - _PathSourceDirA: 0 + - _PathSourceDirB: 0 + - _PathSourceDirG: 0 + - _PathSourceDirR: 0 + - _PathSurfaceBlendMode: 0 + - _PathTypeA: 2 + - _PathTypeB: 2 + - _PathTypeG: 2 + - _PathTypeR: 2 + - _PathingColorMapUV: 0 + - _PathingMapUV: 0 + - _PathingOverrideAlpha: 0 + - _PathingUVSelect: 0 + - _PenetratorEnabled: 0 + - _PoiGSAAThreshold: 0.1 + - _PoiGSAAVariance: 0.15 + - _PoiInternalParallax: 0 + - _PoiParallax: 0 + - _PoiUTSStyleOutlineBlend: 0 + - _PolarLengthScale: 1 + - _PolarRadialScale: 1 + - _PolarSpiralPower: 0 + - _PolarUV: 0 + - _PostProcess: 0 + - _RGBAAlphaBlendType: 0 + - _RGBAAlphaEmissionStrength: 0 + - _RGBAAlphaEnable: 0 + - _RGBAAlphaMetallicInvert: 0 + - _RGBAAlphaPBRSplitMaskSample: 0 + - _RGBAAlphaPBRSplitMaskStochastic: 0 + - _RGBAAlphaPBRUV: 0 + - _RGBAAlphaSmoothnessInvert: 0 + - _RGBABlueBlendType: 0 + - _RGBABlueEmissionStrength: 0 + - _RGBABlueEnable: 0 + - _RGBABlueMetallicInvert: 0 + - _RGBABluePBRSplitMaskSample: 0 + - _RGBABluePBRSplitMaskStochastic: 0 + - _RGBABluePBRUV: 0 + - _RGBABlueSmoothnessInvert: 0 + - _RGBAGreenBlendType: 0 + - _RGBAGreenEmissionStrength: 0 + - _RGBAGreenEnable: 0 + - _RGBAGreenMetallicInvert: 0 + - _RGBAGreenPBRSplitMaskSample: 0 + - _RGBAGreenPBRSplitMaskStochastic: 0 + - _RGBAGreenPBRUV: 0 + - _RGBAGreenSmoothnessInvert: 0 + - _RGBAMetallicMapsStochastic: 0 + - _RGBAMetallicMapsUV: 0 + - _RGBAPBRAlphaEnabled: 0 + - _RGBAPBRBlueEnabled: 0 + - _RGBAPBRGreenEnabled: 0 + - _RGBAPBRRedEnabled: 0 + - _RGBARedBlendType: 0 + - _RGBARedEmissionStrength: 0 + - _RGBARedEnable: 0 + - _RGBARedMetallicInvert: 0 + - _RGBARedPBRSplitMaskSample: 0 + - _RGBARedPBRSplitMaskStochastic: 0 + - _RGBARedPBRUV: 0 + - _RGBARedSmoothnessInvert: 0 + - _RGBASmoothnessMapsStochastic: 0 + - _RGBASmoothnessMapsUV: 0 + - _RGBMaskEnabled: 0 + - _RGBMaskType: 0 + - _RGBMaskUV: 0 + - _RalivAdvancedHelp: 0 + - _RalivDPSDisableShadowCaster: 1 + - _RalivDPSDisableShadowCasterHelp: 0 + - _RalivHelp: 0 + - _ReCurvature: 0 + - _RedAlphaAdd: 0 + - _RedColorThemeIndex: 0 + - _RedTextureStochastic: 0 + - _RedTextureUV: 0 + - _RefSpecFresnelStrength: 0.5 + - _Reflectance: 0.04 + - _ReflectionAnisotropicStretch: 1 + - _ReflectionApplyTransparency: 1 + - _ReflectionBlendMode: 1 + - _ReflectionCubeEnableLighting: 1 + - _ReflectionCubeOverride: 0 + - _ReflectionNormalStrength: 1 + - _RenderingAOBlockerEnabled: 0 + - _RenderingAOBlockerFlipNormal: 0 + - _RenderingAOBlockerNote: 0 + - _RenderingAOBlockerUVChannel: 0 + - _RenderingEarlyZEnabled: 0 + - _RenderingReduceClipDistance: 0 + - _RgbAlphaGlobalMaskBlendType: 2 + - _RgbAlphaGlobalMaskChannel: 0 + - _RgbAlphaMaskChannel: 3 + - _RgbBlueGlobalMaskBlendType: 2 + - _RgbBlueGlobalMaskChannel: 0 + - _RgbBlueMaskChannel: 2 + - _RgbGreenGlobalMaskBlendType: 2 + - _RgbGreenGlobalMaskChannel: 0 + - _RgbGreenMaskChannel: 1 + - _RgbNormalAGlobalMaskBlendType: 2 + - _RgbNormalAGlobalMaskChannel: 0 + - _RgbNormalAMaskChannel: 3 + - _RgbNormalAScale: 0 + - _RgbNormalAStochastic: 0 + - _RgbNormalAUV: 0 + - _RgbNormalAlphaBlendMode: 0 + - _RgbNormalBGlobalMaskBlendType: 2 + - _RgbNormalBGlobalMaskChannel: 0 + - _RgbNormalBMaskChannel: 2 + - _RgbNormalBScale: 0 + - _RgbNormalBStochastic: 0 + - _RgbNormalBUV: 0 + - _RgbNormalBlueBlendMode: 0 + - _RgbNormalGGlobalMaskBlendType: 2 + - _RgbNormalGGlobalMaskChannel: 0 + - _RgbNormalGMaskChannel: 1 + - _RgbNormalGScale: 0 + - _RgbNormalGStochastic: 0 + - _RgbNormalGUV: 0 + - _RgbNormalGreenBlendMode: 0 + - _RgbNormalRGlobalMaskBlendType: 2 + - _RgbNormalRGlobalMaskChannel: 0 + - _RgbNormalRMaskChannel: 0 + - _RgbNormalRScale: 0 + - _RgbNormalRStochastic: 0 + - _RgbNormalRUV: 0 + - _RgbNormalRedBlendMode: 0 + - _RgbRedGlobalMaskBlendType: 2 + - _RgbRedGlobalMaskChannel: 0 + - _RgbRedMaskChannel: 0 + - _Rim2ApColorThemeIndex: 0 + - _Rim2ApplyAlpha: 0 + - _Rim2ApplyAlphaBlend: 1 + - _Rim2ApplyGlobalMaskBlendType: 2 + - _Rim2ApplyGlobalMaskIndex: 0 + - _Rim2BackfaceMask: 1 + - _Rim2BaseColorMix: 0 + - _Rim2BiasIntensity: 0 + - _Rim2BlendMode: 1 + - _Rim2BlendStrength: 1 + - _Rim2Blur: 0.65 + - _Rim2Border: 0.5 + - _Rim2Brightness: 1 + - _Rim2ColorTexUV: 0 + - _Rim2DirRange: 0 + - _Rim2DirStrength: 0 + - _Rim2EnableLighting: 1 + - _Rim2FresnelPower: 3.5 + - _Rim2GlobalMask: 0 + - _Rim2GlobalMaskBlendType: 2 + - _Rim2HueSelectOrShift: 1 + - _Rim2HueShift: 0 + - _Rim2HueShiftColorSpace: 0 + - _Rim2HueShiftEnabled: 0 + - _Rim2HueShiftSpeed: 0 + - _Rim2IndirBlur: 0.1 + - _Rim2IndirBorder: 0.5 + - _Rim2IndirRange: 0 + - _Rim2LightColorThemeIndex: 0 + - _Rim2Light_FeatherOff: 0 + - _Rim2Light_InsideMask: 0.0001 + - _Rim2Light_Power: 0.1 + - _Rim2LightingInvert: 0 + - _Rim2MainStrength: 0 + - _Rim2MaskChannel: 0 + - _Rim2MaskInvert: 0 + - _Rim2MaskOnlyMask: 0 + - _Rim2MaskUV: 0 + - _Rim2NormalStrength: 1 + - _Rim2Power: 1 + - _Rim2ShadowMask: 0.5 + - _Rim2ShadowMaskInvert: 0 + - _Rim2ShadowMaskRampType: 0 + - _Rim2ShadowMaskStrength: 1 + - _Rim2ShadowToggle: 0 + - _Rim2ShadowWidth: 0 + - _Rim2Sharpness: 0.25 + - _Rim2Strength: 0 + - _Rim2Style: 0 + - _Rim2TexUV: 0 + - _Rim2VRParallaxStrength: 1 + - _Rim2Width: 0.8 + - _RimApColorThemeIndex: 0 + - _RimApplyAlpha: 0 + - _RimApplyAlphaBlend: 1 + - _RimApplyGlobalMaskBlendType: 2 + - _RimApplyGlobalMaskIndex: 0 + - _RimBackfaceMask: 1 + - _RimBaseColorMix: 0 + - _RimBiasIntensity: 0 + - _RimBlendMode: 1 + - _RimBlendStrength: 1 + - _RimBlur: 0.65 + - _RimBorder: 0.5 + - _RimBrightness: 1 + - _RimColorTexUV: 0 + - _RimDirRange: 0 + - _RimDirStrength: 0 + - _RimEnableLighting: 1 + - _RimEnviroBlur: 0.7 + - _RimEnviroChannel: 0 + - _RimEnviroIntensity: 1 + - _RimEnviroMaskUV: 0 + - _RimEnviroMinBrightness: 0 + - _RimEnviroSharpness: 0 + - _RimEnviroWidth: 0.45 + - _RimFresnelPower: 3.5 + - _RimGlobalMask: 0 + - _RimGlobalMaskBlendType: 2 + - _RimHueSelectOrShift: 1 + - _RimHueShift: 0 + - _RimHueShiftColorSpace: 0 + - _RimHueShiftEnabled: 0 + - _RimHueShiftSpeed: 0 + - _RimIndirBlur: 0.1 + - _RimIndirBorder: 0.5 + - _RimIndirRange: 0 + - _RimLightColorThemeIndex: 0 + - _RimLight_FeatherOff: 0 + - _RimLight_InsideMask: 0.0001 + - _RimLight_Power: 0.1 + - _RimLightingInvert: 0 + - _RimMainStrength: 0 + - _RimMaskChannel: 0 + - _RimMaskInvert: 0 + - _RimMaskOnlyMask: 0 + - _RimMaskUV: 0 + - _RimNormalStrength: 1 + - _RimPoi2BlendMode: 0 + - _RimPoiBlendMode: 0 + - _RimPower: 1 + - _RimShadowMask: 0.5 + - _RimShadowMaskInvert: 0 + - _RimShadowMaskRampType: 0 + - _RimShadowMaskStrength: 1 + - _RimShadowToggle: 0 + - _RimShadowWidth: 0 + - _RimSharpness: 0.25 + - _RimStrength: 0 + - _RimStyle: 0 + - _RimTexUV: 0 + - _RimVRParallaxStrength: 1 + - _RimWidth: 0.8 + - _RoughnessAnisotropy: 1 + - _SDFBlur: 0.1 + - _SDFShadingTextureUV: 0 + - _SFExposureOcclusion: 0 + - _SSAOAlphaFade: 1 + - _SSAOAnimationToggle: 1 + - _SSAOApplyGlobalMaskBlendType: 0 + - _SSAOApplyGlobalMaskIndex: 0 + - _SSAOAsRamp: 0 + - _SSAOBias: 0.003 + - _SSAOBlendType: 2 + - _SSAOCenterImportance: 1 + - _SSAOColorMapUV: 0 + - _SSAOColorThemeIndex: 0 + - _SSAOCone: 0 + - _SSAODepthGetWarning: 0 + - _SSAOEnableColorTexture: 0 + - _SSAOEnableMaskTexture: 0 + - _SSAOEnabled: 0 + - _SSAOFalloffEnd: 8 + - _SSAOFalloffStart: 6 + - _SSAOGlobalMaskBlendType: 2 + - _SSAOGlobalMaskIndex: 0 + - _SSAOHideByRampedLightMap: 0 + - _SSAOIntensity: 1 + - _SSAOMaskChannel: 0 + - _SSAOMaskInvert: 0 + - _SSAOMaskUV: 0 + - _SSAOQuality: 2.4 + - _SSAORadius: 0.002 + - _SSAORandomScale: 0 + - _SSAOUseNormals: 0 + - _SSAOUseSurfaceColor: 0 + - _SSIgnoreCastedShadows: 0 + - _SSSBaseColorMix: 0 + - _SSSDistortion: 1 + - _SSSSpread: 5 + - _SSSStrength: 0.25 + - _SSSThicknessMapChannel: 0 + - _SSSThicknessMapUV: 0 + - _SSSThicknessMod: -1 + - _Saturation: 0 + - _ScrollingEmission: 0 + - _ScrollingEmission1: 0 + - _ScrollingEmission2: 0 + - _ScrollingEmission3: 0 + - _Set_HighColorMaskChannel: 1 + - _Set_HighColorMaskUV: 0 + - _Set_Rim2LightMaskChannel: 1 + - _Set_Rim2LightMaskUV: 0 + - _Set_RimLightMaskChannel: 1 + - _Set_RimLightMaskUV: 0 + - _ShadeColor_Step: 0 + - _ShaderOptimizerEnabled: 1 + - _ShaderUIWarning0: -0 + - _ShaderUIWarning1: -0 + - _ShadingEnabled: 1 + - _ShadingRampedLightMapApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapApplyGlobalMaskIndex: 0 + - _ShadingRampedLightMapInverseApplyGlobalMaskBlendType: 2 + - _ShadingRampedLightMapInverseApplyGlobalMaskIndex: 0 + - _ShadingShadeMapBlendType: 0 + - _Shadow2ndBlur: 0.3 + - _Shadow2ndBorder: 0.5 + - _Shadow2ndColorTexUV: 0 + - _Shadow2ndReceive: 0 + - _Shadow3rdBlur: 0.1 + - _Shadow3rdBorder: 0.25 + - _Shadow3rdColorTexUV: 0 + - _Shadow3rdReceive: 0 + - _ShadowBlur: 0.1 + - _ShadowBorder: 0.5 + - _ShadowBorderMapToggle: 0 + - _ShadowBorderMaskLOD: 0 + - _ShadowBorderMaskUV: 0 + - _ShadowBorderRange: 0 + - _ShadowColorTexUV: 0 + - _ShadowEnvStrength: 0 + - _ShadowFlatBlur: 1 + - _ShadowFlatBorder: 1 + - _ShadowMainStrength: 0 + - _ShadowMaskType: 0 + - _ShadowOffset: 0 + - _ShadowPostAO: 0 + - _ShadowReceive: 0 + - _ShadowStrength: 1 + - _ShadowStrengthMaskUV: 0 + - _Shape1Depth: 0.1 + - _Shape1Duration: 0.1 + - _Shape2Depth: 0.2 + - _Shape2Duration: 0.1 + - _Shape3Depth: 0.3 + - _Shape3Duration: 0.1 + - _SkinThicknessMapInvert: 0 + - _SkinThicknessMapUV: 0 + - _SkinThicknessPower: 1 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _Specular2ndLayer: 0 + - _SpecularBlur: 0 + - _SpecularBorder: 0.5 + - _SpecularHighlights: 1 + - _SpecularNormalStrength: 1 + - _SpecularToon: 1 + - _SphericalDissolveClamp: 0 + - _SphericalDissolveInvert: 0 + - _SphericalDissolveRadius: 1.5 + - _Squeeze: 0 + - _SqueezeDist: 0 + - _SrcBlend: 5 + - _SrcBlendAlpha: 1 + - _SssBumpBlur: 0.7 + - _SssScale: 1 + - _StencilBackCompareFunction: 8 + - _StencilBackFailOp: 0 + - _StencilBackPassOp: 0 + - _StencilBackZFailOp: 0 + - _StencilCompareFunction: 8 + - _StencilFailOp: 0 + - _StencilFrontCompareFunction: 8 + - _StencilFrontFailOp: 0 + - _StencilFrontPassOp: 0 + - _StencilFrontZFailOp: 0 + - _StencilPassOp: 0 + - _StencilReadMask: 255 + - _StencilRef: 0 + - _StencilType: 0 + - _StencilWriteMask: 255 + - _StencilZFailOp: 0 + - _StereoEnabled: 0 + - _StochasticDeliotHeitzDensity: 1 + - _StochasticHexFallOffContrast: 0.6 + - _StochasticHexFallOffPower: 7 + - _StochasticHexGridDensity: 1 + - _StochasticHexRotationStrength: 0 + - _StochasticMode: 0 + - _StylizedReflectionMode: 0 + - _StylizedSpecular: 0 + - _StylizedSpecular2Feather: 0 + - _StylizedSpecularFeather: 0 + - _StylizedSpecularIgnoreNormal: 0 + - _StylizedSpecularIgnoreShadow: 0 + - _StylizedSpecularInvertMask: 0 + - _StylizedSpecularNormalStrength: 1 + - _StylizedSpecularStrength: 1 + - _SubsurfaceScattering: 0 + - _TPSHelpbox: 0 + - _TPSPenetratorEnabled: 0 + - _TPS_AnimatedToggle: 1 + - _TPS_BezierSmoothness: 0.4 + - _TPS_BezierStart: 0 + - _TPS_BufferedDepth: 0 + - _TPS_BufferedStrength: 0 + - _TPS_Buldge: 0.3 + - _TPS_BuldgeDistance: 0.2 + - _TPS_BuldgeFalloffDistance: 0.05 + - _TPS_Channel: 0 + - _TPS_ChannelWarning: 0 + - _TPS_IdleGravity: 0 + - _TPS_IdleSkrinkLength: 1 + - _TPS_IdleSkrinkWidth: 1 + - _TPS_IsSkinnedMeshRenderer: 0 + - _TPS_PenetratorLength: 1 + - _TPS_PumpingSpeed: 1 + - _TPS_PumpingStrength: 0 + - _TPS_PumpingWidth: 0.2 + - _TPS_SmoothStart: 1 + - _TPS_Squeeze: 0.3 + - _TPS_SqueezeDistance: 0.2 + - _TextEnabled: 0 + - _TextFPSColorThemeIndex: 0 + - _TextFPSEmissionStrength: 0 + - _TextFPSEnabled: 0 + - _TextFPSRotation: 0 + - _TextFPSUV: 0 + - _TextNumericColorThemeIndex: 0 + - _TextNumericDecimalDigits: 0 + - _TextNumericEmissionStrength: 0 + - _TextNumericEnabled: 0 + - _TextNumericRotation: 0 + - _TextNumericTrimZeroes: 0 + - _TextNumericUV: 0 + - _TextNumericValue: 0 + - _TextNumericWholeDigits: 4 + - _TextPixelRange: 4 + - _TextPositionColorThemeIndex: 0 + - _TextPositionEmissionStrength: 0 + - _TextPositionEnabled: 0 + - _TextPositionRotation: 0 + - _TextPositionUV: 0 + - _TextTimeColorThemeIndex: 0 + - _TextTimeEmissionStrength: 0 + - _TextTimeEnabled: 0 + - _TextTimeRotation: 0 + - _TextTimeUV: 0 + - _ToonRampCount: 1 + - _ToonRampUVSelector: 1 + - _TruchetALAlphaBand: 0 + - _TruchetALAlphaToggle: 0 + - _TruchetALEmissionBand: 0 + - _TruchetALEmissionToggle: 0 + - _TruchetAlpha: 1 + - _TruchetBlendType: 0 + - _TruchetChronoPanBand: 0 + - _TruchetChronoPanToggle: 0 + - _TruchetChronoPanType: 0 + - _TruchetColorThemeIndex: 0 + - _TruchetDensity: 10 + - _TruchetEdgeSharpness: 1 + - _TruchetEmissionStrength: 0 + - _TruchetHideWhenNoAL: 0 + - _TruchetMaskChannel: 0 + - _TruchetMaskGlobalMask: 0 + - _TruchetMaskGlobalMaskBlendType: 2 + - _TruchetMaskIntensity: 1 + - _TruchetMaskInvert: 0 + - _TruchetMaskUV: 0 + - _TruchetOverrideAlpha: 0 + - _TruchetThiccness: 0.1 + - _TruchetUV: 0 + - _Tweak_HighColorMaskLevel: 0 + - _Tweak_LightDirection_MaskLevel: 0 + - _Tweak_LightDirection_MaskLevel2: 0 + - _Tweak_Rim2LightMaskLevel: 0 + - _Tweak_RimLightMaskLevel: 0 + - _UDIMDiscardHelpbox: 0 + - _UDIMDiscardMode: 0 + - _UDIMDiscardRow0_0: 0 + - _UDIMDiscardRow0_1: 0 + - _UDIMDiscardRow0_2: 0 + - _UDIMDiscardRow0_3: 0 + - _UDIMDiscardRow1_0: 0 + - _UDIMDiscardRow1_1: 0 + - _UDIMDiscardRow1_2: 0 + - _UDIMDiscardRow1_3: 0 + - _UDIMDiscardRow2_0: 0 + - _UDIMDiscardRow2_1: 0 + - _UDIMDiscardRow2_2: 0 + - _UDIMDiscardRow2_3: 0 + - _UDIMDiscardRow3_0: 0 + - _UDIMDiscardRow3_1: 0 + - _UDIMDiscardRow3_2: 0 + - _UDIMDiscardRow3_3: 0 + - _UDIMDiscardUV: 0 + - _UDIMFaceDiscardFace: 0 + - _UDIMFaceDiscardRow0_0: 0 + - _UDIMFaceDiscardRow0_1: 0 + - _UDIMFaceDiscardRow0_2: 0 + - _UDIMFaceDiscardRow0_3: 0 + - _UDIMFaceDiscardRow1_0: 0 + - _UDIMFaceDiscardRow1_1: 0 + - _UDIMFaceDiscardRow1_2: 0 + - _UDIMFaceDiscardRow1_3: 0 + - _UDIMFaceDiscardRow2_0: 0 + - _UDIMFaceDiscardRow2_1: 0 + - _UDIMFaceDiscardRow2_2: 0 + - _UDIMFaceDiscardRow2_3: 0 + - _UDIMFaceDiscardRow3_0: 0 + - _UDIMFaceDiscardRow3_1: 0 + - _UDIMFaceDiscardRow3_2: 0 + - _UDIMFaceDiscardRow3_3: 0 + - _UDIMFaceDiscardUV: 0 + - _UVModLocalPos0: 0 + - _UVModLocalPos1: 1 + - _UVModWorldPos0: 0 + - _UVModWorldPos1: 2 + - _UVSec: 0 + - _UVTileDissolveAlpha_Row0_0: 0 + - _UVTileDissolveAlpha_Row0_1: 0 + - _UVTileDissolveAlpha_Row0_2: 0 + - _UVTileDissolveAlpha_Row0_3: 0 + - _UVTileDissolveAlpha_Row1_0: 0 + - _UVTileDissolveAlpha_Row1_1: 0 + - _UVTileDissolveAlpha_Row1_2: 0 + - _UVTileDissolveAlpha_Row1_3: 0 + - _UVTileDissolveAlpha_Row2_0: 0 + - _UVTileDissolveAlpha_Row2_1: 0 + - _UVTileDissolveAlpha_Row2_2: 0 + - _UVTileDissolveAlpha_Row2_3: 0 + - _UVTileDissolveAlpha_Row3_0: 0 + - _UVTileDissolveAlpha_Row3_1: 0 + - _UVTileDissolveAlpha_Row3_2: 0 + - _UVTileDissolveAlpha_Row3_3: 0 + - _UVTileDissolveDiscardAtMax: 1 + - _UVTileDissolveEnabled: 0 + - _UVTileDissolveUV: 0 + - _Unlit_Intensity: 1 + - _UseLightColor: 1 + - _UseReflection: 0 + - _Use_1stAs2nd: 0 + - _Use_1stShadeMapAlpha_As_ShadowMask: 0 + - _Use_2ndShadeMapAlpha_As_ShadowMask: 0 + - _Use_BaseAs1st: 0 + - _UzumoreAmount: 0.1 + - _UzumoreBias: 0.001 + - _UzumoreCategoryToggle: 0 + - _UzumoreEnabled: 1 + - _UzumoreMaskUV: 3 + - _VertexAudioLinkEnabled: 0 + - _VertexBarrelAlpha: 0 + - _VertexBarrelHeight: 0 + - _VertexBarrelMaskChannel: 0 + - _VertexBarrelMode: 0 + - _VertexBarrelWidth: 0.2 + - _VertexBasicsMaskChannel: 0 + - _VertexGlitchDensity: 10 + - _VertexGlitchFrequency: 1 + - _VertexGlitchMapPanSpeed: 10 + - _VertexGlitchMirror: 0 + - _VertexGlitchMirrorEnable: 0 + - _VertexGlitchStrength: 1 + - _VertexGlitchThreshold: 1 + - _VertexGlitchingAudioLinkBand: 0 + - _VertexGlitchingAudioLinkEnabled: 0 + - _VertexGlitchingAudiolinkOverride: 1 + - _VertexGlitchingEnabled: 0 + - _VertexGlitchingUseTexture: 0 + - _VertexLocalRotationALBandX: 0 + - _VertexLocalRotationALBandY: 0 + - _VertexLocalRotationALBandZ: 0 + - _VertexLocalRotationCTALBandX: 0 + - _VertexLocalRotationCTALBandY: 0 + - _VertexLocalRotationCTALBandZ: 0 + - _VertexLocalRotationCTALTypeX: 0 + - _VertexLocalRotationCTALTypeY: 0 + - _VertexLocalRotationCTALTypeZ: 0 + - _VertexLocalScaleALBand: 0 + - _VertexLocalTranslationALBand: 0 + - _VertexLookAtAudioLinkBand: 0 + - _VertexLookAtAudioLinkEnabled: 0 + - _VertexLookAtEnabled: 0 + - _VertexManipulationHeight: 0 + - _VertexManipulationHeightBand: 0 + - _VertexManipulationHeightBias: 0 + - _VertexManipulationHeightMapChannel: 0 + - _VertexManipulationHeightMaskChannel: 0 + - _VertexManipulationHeightMaskUV: 0 + - _VertexManipulationsEnabled: 0 + - _VertexRoundingDivision: 0.02 + - _VertexRoundingEnabled: 0 + - _VertexRoundingMaskChannel: 0 + - _VertexRoundingRangeBand: 0 + - _VertexRoundingSpace: 0 + - _VertexSpectrumMotion: 0 + - _VertexSpectrumUV: 0 + - _VertexSpectrumUVDirection: 0 + - _VertexSphereAlpha: 0 + - _VertexSphereHeight: 1 + - _VertexSphereMaskChannel: 0 + - _VertexSphereMode: 0 + - _VertexSphereRadius: 1 + - _VertexTornadoBaseHeight: 0 + - _VertexTornadoFunnelShape: 1 + - _VertexTornadoIntensity: 100 + - _VertexTornadoMaskChannel: 0 + - _VertexTornadoMode: 0 + - _VertexTornadoRadius: 1 + - _VertexTornadoSpeed: 5 + - _VertexTornadoTopHeight: 1 + - _VertexTornadoVerticalPull: 0 + - _VertexWindDetailAmplitude: 0.05 + - _VertexWindDetailFrequency: 5 + - _VertexWindDetailSpeed: 2.5 + - _VertexWindEnabled: 0 + - _VertexWindMaskChannel: 0 + - _VertexWindNoiseChannel: 0 + - _VertexWindNoiseScale: 10 + - _VertexWindNoiseSpeed: 0.5 + - _VertexWindNoiseStrength: 0.5 + - _VertexWindPrimaryAmplitude: 0.1 + - _VertexWindPrimaryFrequency: 1 + - _VertexWindPrimarySpeed: 1 + - _VertexWorldTranslationALBand: 0 + - _VideoBacklight: 1 + - _VideoCRTPixelEnergizedTime: 1.9 + - _VideoCRTRefreshRate: 24 + - _VideoContrast: 0 + - _VideoEffectsEnable: 0 + - _VideoEmissionEnabled: 1 + - _VideoMaskTextureChannel: 0 + - _VideoMaskTextureUV: 0 + - _VideoPixelTextureUV: 0 + - _VideoPixelateToResolution: 0 + - _VideoSaturation: 0 + - _VideoType: 3 + - _VisibilityMode: 1 + - _VisibilityVRCCameraDesktop: 1 + - _VisibilityVRCCameraScreenshot: 1 + - _VisibilityVRCCameraVR: 1 + - _VisibilityVRCMirrorDesktop: 1 + - _VisibilityVRCMirrorVR: 1 + - _VisibilityVRCRegular: 1 + - _VoronoiAffectsMaterialAlpha: 0 + - _VoronoiBlend: 0 + - _VoronoiEnableRandomCellColor: 0 + - _VoronoiEnabled: 0 + - _VoronoiGlobalMask: 0 + - _VoronoiGlobalMaskBlendType: 2 + - _VoronoiInnerEmissionStrength: 0 + - _VoronoiMaskChannel: 0 + - _VoronoiMaskUV: 0 + - _VoronoiNoiseChannel: 0 + - _VoronoiNoiseIntensity: 0.1 + - _VoronoiNoiseUV: 0 + - _VoronoiOuterEmissionStrength: 0 + - _VoronoiPower: 0.45454544 + - _VoronoiScale: 5 + - _VoronoiSpace: 0 + - _VoronoiType: 1 + - _Wriggle: 0 + - _WriggleSpeed: 0.28 + - _ZClip: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ppHueSelectOrShift: 1 + - footer_bluesky: 0 + - footer_discord: 0 + - footer_github: 0 + - footer_patreon: 0 + - footer_twitter: 0 + - footer_website: 0 + - footer_youtube: 0 + - g_end_tps_bezier: 0 + - g_end_tps_buldge: 0 + - g_end_tps_idle: 0 + - g_end_tps_pulsing: 0 + - g_end_tps_squeeze: 0 + - g_start_tps_bezier: 0 + - g_start_tps_buldge: 0 + - g_start_tps_idle: 0 + - g_start_tps_pulsing: 0 + - g_start_tps_squeeze: 0 + - m_AudioLinkCategory: 0 + - m_OutlineCategory: 0 + - m_end_ALDecalSpectrum: 0 + - m_end_ALVolumeColor: 0 + - m_end_Alpha: 0 + - m_end_Ansio: 0 + - m_end_BeatsaberBloomFog: 0 + - m_end_BeatsaberOptions: 0 + - m_end_BlackLightMasking: 0 + - m_end_BonusSliders: 0 + - m_end_CRT: 0 + - m_end_CenterOutDissolve: 0 + - m_end_ColorAdjust: 0 + - m_end_CubeMap: 0 + - m_end_Decal0: 0 + - m_end_Decal0AudioLink: 0 + - m_end_Decal1: 0 + - m_end_Decal1AudioLink: 0 + - m_end_Decal2: 0 + - m_end_Decal2AudioLink: 0 + - m_end_Decal3: 0 + - m_end_Decal3AudioLink: 0 + - m_end_DecalSection: 0 + - m_end_DepthBulge: 0 + - m_end_DetailOptions: 0 + - m_end_DistortionAudioLink: 0 + - m_end_FXProximityColor: 0 + - m_end_FlipbookAudioLink: 0 + - m_end_Gameboy: 0 + - m_end_GlobalMask: 0 + - m_end_GlobalMaskDistanceM_0: 0 + - m_end_GlobalMaskDistanceM_1: 0 + - m_end_GlobalMaskDistanceM_10: 0 + - m_end_GlobalMaskDistanceM_11: 0 + - m_end_GlobalMaskDistanceM_12: 0 + - m_end_GlobalMaskDistanceM_13: 0 + - m_end_GlobalMaskDistanceM_14: 0 + - m_end_GlobalMaskDistanceM_15: 0 + - m_end_GlobalMaskDistanceM_2: 0 + - m_end_GlobalMaskDistanceM_3: 0 + - m_end_GlobalMaskDistanceM_4: 0 + - m_end_GlobalMaskDistanceM_5: 0 + - m_end_GlobalMaskDistanceM_6: 0 + - m_end_GlobalMaskDistanceM_7: 0 + - m_end_GlobalMaskDistanceM_8: 0 + - m_end_GlobalMaskDistanceM_9: 0 + - m_end_GlobalMaskModifiers: 0 + - m_end_GlobalMaskModifiersBackface: 0 + - m_end_GlobalMaskModifiersCamera: 0 + - m_end_GlobalMaskModifiersDistance: 0 + - m_end_GlobalMaskModifiersMirror: 0 + - m_end_GlobalMaskOptions: 0 + - m_end_GlobalMaskTextures: 0 + - m_end_GlobalMaskVertexColors: 0 + - m_end_GlobalThemeColor0: 0 + - m_end_GlobalThemeColor1: 0 + - m_end_GlobalThemeColor2: 0 + - m_end_GlobalThemeColor3: 0 + - m_end_GlobalThemes: 0 + - m_end_LTCGI: 0 + - m_end_MainVertexColors: 0 + - m_end_Matcap2: 0 + - m_end_Matcap3: 0 + - m_end_Matcap4: 0 + - m_end_OutlineAudioLink: 0 + - m_end_OutlineStencil: 0 + - m_end_OutlineStencilPassBackOptions: 0 + - m_end_OutlineStencilPassFrontOptions: 0 + - m_end_PPAnimations: 0 + - m_end_PathAudioLink: 0 + - m_end_PoiGlobalCategory: 0 + - m_end_PoiLightData: 0 + - m_end_PoiPostProcessingCategory: 0 + - m_end_PoiShading: 0 + - m_end_PoiUVCategory: 0 + - m_end_RGBMask: 0 + - m_end_Rim2AudioLink: 0 + - m_end_RimAudioLink: 0 + - m_end_SphericalDissolve: 0 + - m_end_StencilPassBackOptions: 0 + - m_end_StencilPassFrontOptions: 0 + - m_end_StencilPassOptions: 0 + - m_end_Stochastic: 0 + - m_end_Text: 0 + - m_end_TextFPS: 0 + - m_end_TextInstanceTime: 0 + - m_end_TextNumeric: 0 + - m_end_TextPosition: 0 + - m_end_TruchetAudioLink: 0 + - m_end_UVTileDissolve: 0 + - m_end_Uzumore: 0 + - m_end_VideoSettings: 0 + - m_end_VoronoiAudioLink: 0 + - m_end_WorldAOBlocker: 0 + - m_end_alphaBlending: 0 + - m_end_audioLink: 0 + - m_end_audioLinkOverrides: 0 + - m_end_backFace: 0 + - m_end_backlight: 0 + - m_end_bakedLighting: 0 + - m_end_blending: 0 + - m_end_brdf: 0 + - m_end_clearCoat: 0 + - m_end_clearcoatadvanced: 0 + - m_end_clearcoatglobalmask: 0 + - m_end_depthFX: 0 + - m_end_depthRimLightOptions: 0 + - m_end_dissolve: 0 + - m_end_dissolveHueShift: 0 + - m_end_emission1Options: 0 + - m_end_emission2Options: 0 + - m_end_emission3Options: 0 + - m_end_emissionOptions: 0 + - m_end_flipBook: 0 + - m_end_glitter: 0 + - m_end_internalparallax: 0 + - m_end_matcap: 0 + - m_end_mirrorOptions: 0 + - m_end_normalCorrect: 0 + - m_end_outlineAlphaBlending: 0 + - m_end_outlineBlending: 0 + - m_end_parallax: 0 + - m_end_pathing: 0 + - m_end_pen_autoConfig: 0 + - m_end_poiSSAO: 0 + - m_end_pointToPoint: 0 + - m_end_postprocess: 0 + - m_end_raliv: 0 + - m_end_ralivAdvanced: 0 + - m_end_ralivOriface: 0 + - m_end_ralivPenetrator: 0 + - m_end_reflectionRim: 0 + - m_end_rim1LightOptions: 0 + - m_end_rim2LightOptions: 0 + - m_end_stylizedSpec: 0 + - m_end_subsurfaceScattering: 0 + - m_end_tps_penetrator: 0 + - m_end_truchet: 0 + - m_end_udimdiscardOptions: 0 + - m_end_udimfacediscardOptions: 0 + - m_end_uvDistortion: 0 + - m_end_uvLocalWorld: 0 + - m_end_uvPanosphere: 0 + - m_end_uvPolar: 0 + - m_end_vertexGlitching: 0 + - m_end_vertexLookAt: 0 + - m_end_vertexManipulation: 0 + - m_end_videoEffects: 0 + - m_end_voronoi: 0 + - m_end_voronoiRandom: 0 + - m_lightingCategory: 1 + - m_mainCategory: 1 + - m_modifierCategory: 0 + - m_renderingCategory: 0 + - m_specialFXCategory: 0 + - m_start_ALDecalSpectrum: 0 + - m_start_ALVolumeColor: 0 + - m_start_Alpha: 0 + - m_start_Aniso: 0 + - m_start_BeatsaberBloomFog: 0 + - m_start_BeatsaberOptions: 0 + - m_start_BlackLightMasking: 0 + - m_start_BonusSliders: 0 + - m_start_CRT: 0 + - m_start_CenterOutDissolve: 0 + - m_start_ColorAdjust: 0 + - m_start_CubeMap: 0 + - m_start_Decal0: 0 + - m_start_Decal0AudioLink: 0 + - m_start_Decal1: 0 + - m_start_Decal1AudioLink: 0 + - m_start_Decal2: 0 + - m_start_Decal2AudioLink: 0 + - m_start_Decal3: 0 + - m_start_Decal3AudioLink: 0 + - m_start_DecalSection: 0 + - m_start_DepthBulge: 0 + - m_start_DetailOptions: 0 + - m_start_DistortionAudioLink: 0 + - m_start_FXProximityColor: 0 + - m_start_FlipbookAudioLink: 0 + - m_start_Gameboy: 0 + - m_start_GlobalMask: 0 + - m_start_GlobalMaskDistanceM_0: 0 + - m_start_GlobalMaskDistanceM_1: 0 + - m_start_GlobalMaskDistanceM_10: 0 + - m_start_GlobalMaskDistanceM_11: 0 + - m_start_GlobalMaskDistanceM_12: 0 + - m_start_GlobalMaskDistanceM_13: 0 + - m_start_GlobalMaskDistanceM_14: 0 + - m_start_GlobalMaskDistanceM_15: 0 + - m_start_GlobalMaskDistanceM_2: 0 + - m_start_GlobalMaskDistanceM_3: 0 + - m_start_GlobalMaskDistanceM_4: 0 + - m_start_GlobalMaskDistanceM_5: 0 + - m_start_GlobalMaskDistanceM_6: 0 + - m_start_GlobalMaskDistanceM_7: 0 + - m_start_GlobalMaskDistanceM_8: 0 + - m_start_GlobalMaskDistanceM_9: 0 + - m_start_GlobalMaskModifiers: 0 + - m_start_GlobalMaskModifiersBackface: 0 + - m_start_GlobalMaskModifiersCamera: 0 + - m_start_GlobalMaskModifiersDistance: 0 + - m_start_GlobalMaskModifiersMirror: 0 + - m_start_GlobalMaskOptions: 0 + - m_start_GlobalMaskTextures: 0 + - m_start_GlobalMaskVertexColors: 0 + - m_start_GlobalThemeColor0: 0 + - m_start_GlobalThemeColor1: 0 + - m_start_GlobalThemeColor2: 0 + - m_start_GlobalThemeColor3: 0 + - m_start_GlobalThemes: 0 + - m_start_LTCGI: 0 + - m_start_MainVertexColors: 0 + - m_start_Matcap2: 0 + - m_start_Matcap3: 0 + - m_start_Matcap4: 0 + - m_start_OutlineAudioLink: 0 + - m_start_OutlineStencil: 0 + - m_start_OutlineStencilPassBackOptions: 0 + - m_start_OutlineStencilPassFrontOptions: 0 + - m_start_PPAnimations: 0 + - m_start_PathAudioLink: 0 + - m_start_PoiGlobalCategory: 0 + - m_start_PoiLightData: 0 + - m_start_PoiPostProcessingCategory: 0 + - m_start_PoiShading: 0 + - m_start_PoiUVCategory: 0 + - m_start_RGBMask: 0 + - m_start_Rim2AudioLink: 0 + - m_start_RimAudioLink: 0 + - m_start_SphericalDissolve: 0 + - m_start_StencilPassBackOptions: 0 + - m_start_StencilPassFrontOptions: 0 + - m_start_StencilPassOptions: 0 + - m_start_Stochastic: 0 + - m_start_Text: 0 + - m_start_TextFPS: 0 + - m_start_TextInstanceTime: 0 + - m_start_TextNumeric: 0 + - m_start_TextPosition: 0 + - m_start_TruchetAudioLink: 0 + - m_start_UVTileDissolve: 0 + - m_start_Uzumore: 0 + - m_start_VideoSettings: 0 + - m_start_VoronoiAudioLink: 0 + - m_start_WorldAOBlocker: 0 + - m_start_alphaBlending: 0 + - m_start_audioLink: 0 + - m_start_audioLinkOverrides: 0 + - m_start_backFace: 0 + - m_start_backlight: 0 + - m_start_bakedLighting: 0 + - m_start_blending: 0 + - m_start_brdf: 1 + - m_start_clearCoat: 0 + - m_start_clearcoatadvanced: 0 + - m_start_clearcoatglobalmask: 0 + - m_start_depthFX: 0 + - m_start_depthRimLightOptions: 0 + - m_start_dissolve: 0 + - m_start_dissolveHueShift: 0 + - m_start_emission1Options: 0 + - m_start_emission2Options: 0 + - m_start_emission3Options: 0 + - m_start_emissionOptions: 0 + - m_start_flipBook: 0 + - m_start_glitter: 0 + - m_start_internalparallax: 0 + - m_start_matcap: 0 + - m_start_mirrorOptions: 0 + - m_start_normalCorrect: 0 + - m_start_outlineAlphaBlending: 0 + - m_start_outlineBlending: 0 + - m_start_parallax: 0 + - m_start_pathing: 0 + - m_start_pen_autoConfig: 0 + - m_start_poiSSAO: 0 + - m_start_pointToPoint: 0 + - m_start_postprocess: 0 + - m_start_raliv: 0 + - m_start_ralivAdvanced: 0 + - m_start_ralivOriface: 0 + - m_start_ralivPenetrator: 0 + - m_start_reflectionRim: 0 + - m_start_rim2LightOptions: 0 + - m_start_rimLight1Options: 0 + - m_start_stylizedSpec: 0 + - m_start_subsurfaceScattering: 0 + - m_start_tps_penetrator: 0 + - m_start_truchet: 0 + - m_start_udimdiscardOptions: 0 + - m_start_udimfacediscardOptions: 0 + - m_start_uvDistortion: 0 + - m_start_uvLocalWorld: 0 + - m_start_uvPanosphere: 0 + - m_start_uvPolar: 0 + - m_start_vertexGlitching: 0 + - m_start_vertexLookAt: 0 + - m_start_vertexManipulation: 0 + - m_start_videoEffects: 0 + - m_start_voronoi: 0 + - m_start_voronoiRandom: 0 + - m_thirdpartyCategory: 0 + - m_vertexCategory: 0 + - s_end_ALAlpha: 0 + - s_end_ALDecalAudioModsOptions: 0 + - s_end_ALDecalBand: 0 + - s_end_ALDecalColorsBlendingOptions: 0 + - s_end_ALDecalShapeClipOptions: 0 + - s_end_ALDecalVolumeOptions: 0 + - s_end_ALSpectrumMotion: 0 + - s_end_ALVertexGlitching: 0 + - s_end_ALVertexHeight: 0 + - s_end_ALVertexLookAtAL: 0 + - s_end_AlphaAdvanced: 0 + - s_end_AlphaAngular: 0 + - s_end_AlphaDistanceFade: 0 + - s_end_AlphaDithering: 0 + - s_end_AlphaFresnel: 0 + - s_end_AlphaToCoverage: 0 + - s_end_AnisoBottomLayer: 0 + - s_end_AnisoTopLayer: 1 + - s_end_AudioLinkBandOverrides: 0 + - s_end_BRDFTPSMaskGroup: 0 + - s_end_BackFaceHueShift: 0 + - s_end_BackfaceMods: 0 + - s_end_CCopt: 1 + - s_end_ClearCoatTPSMaskGroup: 0 + - s_end_ColorAdjustColorGrading: 0 + - s_end_ContinuousRotation: 0 + - s_end_CubeMapColorAdjust: 0 + - s_end_CubeMapMasking: 0 + - s_end_Decal0ChannelSeparation: 0 + - s_end_Decal0GlobalMasking: 0 + - s_end_Decal0HueShift: 0 + - s_end_Decal0Video: 0 + - s_end_Decal1ChannelSeparation: 0 + - s_end_Decal1GlobalMasking: 0 + - s_end_Decal1HueShift: 0 + - s_end_Decal1Video: 0 + - s_end_Decal2ChannelSeparation: 0 + - s_end_Decal2GlobalMasking: 0 + - s_end_Decal2HueShift: 0 + - s_end_Decal2Video: 0 + - s_end_Decal3ChannelSeparation: 0 + - s_end_Decal3GlobalMasking: 0 + - s_end_Decal3HueShift: 0 + - s_end_Decal3Video: 0 + - s_end_DecalTPSMaskGroup: 0 + - s_end_DepthAlpha: 0 + - s_end_DepthFXColorEmission: 0 + - s_end_DetailNormal: 0 + - s_end_DetailTexture: 0 + - s_end_DissolveAudioLink: 0 + - s_end_DissolvedMenu: 0 + - s_end_EdgeMenu: 0 + - s_end_EmissionAL0Add: 0 + - s_end_EmissionAL0COut: 0 + - s_end_EmissionAL0Multiply: 0 + - s_end_EmissionAL1Add: 0 + - s_end_EmissionAL1COut: 0 + - s_end_EmissionAL1Multiply: 0 + - s_end_EmissionAL2Add: 0 + - s_end_EmissionAL2COut: 0 + - s_end_EmissionAL2Multiply: 0 + - s_end_EmissionAL3Add: 0 + - s_end_EmissionAL3COut: 0 + - s_end_EmissionAL3Multiply: 0 + - s_end_EmissionBlinking0: 0 + - s_end_EmissionBlinking1: 0 + - s_end_EmissionBlinking2: 0 + - s_end_EmissionBlinking3: 0 + - s_end_EmissionCenterOut0: 0 + - s_end_EmissionCenterOut1: 0 + - s_end_EmissionCenterOut2: 0 + - s_end_EmissionCenterOut3: 0 + - s_end_EmissionHueShift0: 0 + - s_end_EmissionHueShift1: 0 + - s_end_EmissionHueShift2: 0 + - s_end_EmissionHueShift3: 0 + - s_end_EmissionLightBased0: 0 + - s_end_EmissionLightBased1: 0 + - s_end_EmissionLightBased2: 0 + - s_end_EmissionLightBased3: 0 + - s_end_FixedRimBlending: 0 + - s_end_FixedRimColor: 0 + - s_end_FixedRimShapeControl: 0 + - s_end_FlipbookCrossfade: 0 + - s_end_FlipbookHueShift: 0 + - s_end_FlipbookManualFrameControl: 0 + - s_end_FlipbookStartAndEnd: 0 + - s_end_GlitterAudioLink: 0 + - s_end_GlitterColorAndShape: 0 + - s_end_GlitterHueShiftSection: 0 + - s_end_GlitterMask: 0 + - s_end_GlitterPositionSize: 0 + - s_end_GlitterRotationSection: 0 + - s_end_GlitterSparkleControl: 0 + - s_end_GlobalMaskOptionsForceToggles: 0 + - s_end_GlobalMaskOptionsMinMaxSliders: 0 + - s_end_GlobalMaskOptionsSliders: 0 + - s_end_LightDataAddPass: 1 + - s_end_LightDataBasePass: 1 + - s_end_LightDataDebug: 0 + - s_end_LightDataSDF: 1 + - s_end_LocalRotation: 0 + - s_end_LocalTranslation: 0 + - s_end_LookAtAlphaMask: 0 + - s_end_LookAtBlueMask: 0 + - s_end_LookAtGreenMask: 0 + - s_end_LookAtRedMask: 0 + - s_end_LookAtVisibility: 0 + - s_end_MainHueShift: 0 + - s_end_MainHueShiftAL: 0 + - s_end_MainHueShiftGlobalMask: 0 + - s_end_MaskingMenu: 0 + - s_end_Matcap0AudioLink: 0 + - s_end_Matcap0Blending: 0 + - s_end_Matcap0Masking: 0 + - s_end_Matcap1AudioLink: 0 + - s_end_Matcap1Blending: 0 + - s_end_Matcap1HueShift: 0 + - s_end_Matcap1Masking: 0 + - s_end_Matcap1Normal: 0 + - s_end_Matcap1Smoothness: 0 + - s_end_Matcap2AudioLink: 0 + - s_end_Matcap2Blending: 0 + - s_end_Matcap2HueShift: 0 + - s_end_Matcap2Masking: 0 + - s_end_Matcap2Normal: 0 + - s_end_Matcap2Smoothness: 0 + - s_end_Matcap2TPSMaskGroup: 0 + - s_end_Matcap3AudioLink: 0 + - s_end_Matcap3Blending: 0 + - s_end_Matcap3HueShift: 0 + - s_end_Matcap3Masking: 0 + - s_end_Matcap3Normal: 0 + - s_end_Matcap3Smoothness: 0 + - s_end_Matcap3TPSMaskGroup: 0 + - s_end_Matcap4TPSMaskGroup: 0 + - s_end_MatcapHueShift: 0 + - s_end_MatcapNormal: 0 + - s_end_MatcapSmoothness: 0 + - s_end_MatcapTPSMaskGroup: 0 + - s_end_MirrorTexture: 0 + - s_end_MultilayerMath1stLayer: 1 + - s_end_MultilayerMath2ndLayer: 0 + - s_end_MultilayerMath3rdLayer: 0 + - s_end_MultilayerMathBorder: 1 + - s_end_MultilayerMathBorderMap: 1 + - s_end_MultilayerShadowMap: 0 + - s_end_OutlineAlphaDistanceFade: 0 + - s_end_OutlineColorAdjust: 0 + - s_end_OutlineFixedSize: 0 + - s_end_OutlineLighting: 0 + - s_end_OutlineRenderingOptions: 0 + - s_end_OutlineZOffset: 0 + - s_end_PBRSecondSpecular: 0 + - s_end_PBRSplitMaskSample: 0 + - s_end_ParallaxInternalHueShift: 0 + - s_end_ParallaxInternalLayerColoring: 0 + - s_end_ParallaxInternalLayerControls: 0 + - s_end_PathAppearance: 0 + - s_end_PathColors: 0 + - s_end_PathRemapping: 0 + - s_end_PathSourceDirections: 0 + - s_end_PathTypes: 0 + - s_end_Positioning: 0 + - s_end_RGBAlpha: 0 + - s_end_RGBBlue: 0 + - s_end_RGBGreen: 0 + - s_end_RGBRed: 0 + - s_end_RimLight0Color: 0 + - s_end_RimLight0GlobalMasking: 0 + - s_end_RimLight0HueShift: 0 + - s_end_RimLight0LightDirMask: 0 + - s_end_RimLight0ShapeControls: 0 + - s_end_RimLight1Color: 0 + - s_end_RimLight1GlobalMasking: 0 + - s_end_RimLight1HueShift: 0 + - s_end_RimLight1LightDirMask: 0 + - s_end_RimLight1ShapeControls: 0 + - s_end_RimLight2DirectionMask: 0 + - s_end_RimLightDirectionMask: 0 + - s_end_SSAOAdvanced: 0 + - s_end_SSAOColorAndMasking: 0 + - s_end_ScrollingEmission0: 0 + - s_end_ScrollingEmission1: 0 + - s_end_ScrollingEmission2: 0 + - s_end_ScrollingEmission3: 0 + - s_end_ShadingAddPass: 0 + - s_end_ShadingGlobalMask: 0 + - s_end_StylizedReflectionLilEnviroReflections: 1 + - s_end_StylizedReflectionLilSpecular: 1 + - s_end_StylizedReflectionMode0: 1 + - s_end_StylizedReflectionMode1: 1 + - s_end_StylizedSpecularAdvanced: 0 + - s_end_StylizedSpecularLayer0: 0 + - s_end_StylizedSpecularLayer1: 0 + - s_end_TimingOptions: 0 + - s_end_TransitionMenu: 0 + - s_end_UVTileDissolveRow0: 0 + - s_end_UVTileDissolveRow1: 0 + - s_end_UVTileDissolveRow2: 0 + - s_end_UVTileDissolveRow3: 0 + - s_end_VertAL: 0 + - s_end_VertexBarrelMode: 0 + - s_end_VertexColors: 0 + - s_end_VertexGlitchMirror: 0 + - s_end_VertexGlitchTexture: 0 + - s_end_VertexManipulationHeight: 0 + - s_end_VertexRoundingAL: 0 + - s_end_VertexScale: 0 + - s_end_VertexSphereMode: 0 + - s_end_VertexTornadoMode: 0 + - s_end_VertexWind: 0 + - s_end_WorldTranslation: 0 + - s_end_brdfadvanced: 0 + - s_end_decal1_position: 0 + - s_end_decal2_position: 0 + - s_end_decal3_position: 0 + - s_end_decal_position: 0 + - s_end_deliot: 0 + - s_end_fogOpt: 1 + - s_end_ggxanisotropics: 0 + - s_end_heightFogOpt: 1 + - s_end_hextile: 0 + - s_end_liltoon_rim2_lightdir: 0 + - s_end_liltoon_rim_lightdir: 0 + - s_end_matcap1ApplyToAlpha: 0 + - s_end_matcap2ApplyToAlpha: 0 + - s_end_matcap3ApplyToAlpha: 0 + - s_end_matcapApplyToAlpha: 0 + - s_end_outline_al_color: 0 + - s_end_parallaxAdvanced: 0 + - s_end_vertexRounding: 0 + - s_start_ALAlpha: 0 + - s_start_ALDecalAudioModsOptions: 1 + - s_start_ALDecalBandOptions: 1 + - s_start_ALDecalColorsBlendingOptions: 1 + - s_start_ALDecalShapeClipOptions: 1 + - s_start_ALDecalVolumeOptions: 1 + - s_start_ALSpectrumMotion: 0 + - s_start_ALVertexGlitching: 0 + - s_start_ALVertexHeight: 0 + - s_start_ALVertexLookAtAL: 0 + - s_start_AlphaAdvanced: 0 + - s_start_AlphaAngular: 0 + - s_start_AlphaDistanceFade: 0 + - s_start_AlphaDithering: 0 + - s_start_AlphaFresnel: 0 + - s_start_AlphaToCoverage: 0 + - s_start_AnisoBottomLayer: 0 + - s_start_AnisoTopLayer: 1 + - s_start_AudioLinkBandOverrides: 1 + - s_start_BRDFTPSMaskGroup: 0 + - s_start_BackFaceHueShift: 0 + - s_start_BackfaceMods: 0 + - s_start_CCopt: 1 + - s_start_ClearCoatTPSMaskGroup: 0 + - s_start_ColorAdjustColorGrading: 0 + - s_start_ContinuousRotation: 0 + - s_start_CubeMapColorAdjust: 0 + - s_start_CubeMapMasking: 1 + - s_start_Decal0ChannelSeparation: 0 + - s_start_Decal0GlobalMasking: 0 + - s_start_Decal0HueShift: 0 + - s_start_Decal0Video: 0 + - s_start_Decal1ChannelSeparation: 0 + - s_start_Decal1GlobalMasking: 0 + - s_start_Decal1HueShift: 0 + - s_start_Decal1Video: 0 + - s_start_Decal2ChannelSeparation: 0 + - s_start_Decal2GlobalMasking: 0 + - s_start_Decal2HueShift: 0 + - s_start_Decal2Video: 0 + - s_start_Decal3ChannelSeparation: 0 + - s_start_Decal3GlobalMasking: 0 + - s_start_Decal3HueShift: 0 + - s_start_Decal3Video: 0 + - s_start_DecalTPSMaskGroup: 0 + - s_start_DepthAlpha: 0 + - s_start_DepthFXColorEmission: 0 + - s_start_DetailNormal: 0 + - s_start_DetailTexture: 0 + - s_start_DissolveAudioLink: 0 + - s_start_DissolvedMenu: 0 + - s_start_EdgeMenu: 0 + - s_start_EmissionAL0Add: 0 + - s_start_EmissionAL0COut: 0 + - s_start_EmissionAL0Multiply: 0 + - s_start_EmissionAL1Add: 0 + - s_start_EmissionAL1COut: 0 + - s_start_EmissionAL1Multiply: 0 + - s_start_EmissionAL2Add: 0 + - s_start_EmissionAL2COut: 0 + - s_start_EmissionAL2Multiply: 0 + - s_start_EmissionAL3Add: 0 + - s_start_EmissionAL3COut: 0 + - s_start_EmissionAL3Multiply: 0 + - s_start_EmissionBlinking0: 0 + - s_start_EmissionBlinking1: 0 + - s_start_EmissionBlinking2: 0 + - s_start_EmissionBlinking3: 0 + - s_start_EmissionCenterOut0: 0 + - s_start_EmissionCenterOut1: 0 + - s_start_EmissionCenterOut2: 0 + - s_start_EmissionCenterOut3: 0 + - s_start_EmissionHueShift0: 0 + - s_start_EmissionHueShift1: 0 + - s_start_EmissionHueShift2: 0 + - s_start_EmissionHueShift3: 0 + - s_start_EmissionLightBased0: 0 + - s_start_EmissionLightBased1: 0 + - s_start_EmissionLightBased2: 0 + - s_start_EmissionLightBased3: 0 + - s_start_FixedRimBlending: 1 + - s_start_FixedRimColor: 1 + - s_start_FixedRimShapeControl: 1 + - s_start_FlipbookCrossfade: 0 + - s_start_FlipbookHueShift: 0 + - s_start_FlipbookManualFrameControl: 0 + - s_start_FlipbookStartAndEnd: 0 + - s_start_GlitterAudioLink: 0 + - s_start_GlitterColorAndShape: 1 + - s_start_GlitterHueShiftSection: 0 + - s_start_GlitterMask: 0 + - s_start_GlitterPositionSize: 0 + - s_start_GlitterRotationSection: 0 + - s_start_GlitterSparkleControl: 1 + - s_start_GlobalMaskOptionsForceToggles: 0 + - s_start_GlobalMaskOptionsMinMaxSliders: 0 + - s_start_GlobalMaskOptionsSliders: 0 + - s_start_LightDataAddPass: 1 + - s_start_LightDataBasePass: 1 + - s_start_LightDataDebug: 0 + - s_start_LightDataSDF: 1 + - s_start_LocalRotation: 0 + - s_start_LocalTranslation: 0 + - s_start_LookAtAlphaMask: 0 + - s_start_LookAtBlueMask: 0 + - s_start_LookAtGreenMask: 0 + - s_start_LookAtRedMask: 1 + - s_start_LookAtVisibility: 0 + - s_start_MainHueShift: 1 + - s_start_MainHueShiftAL: 0 + - s_start_MainHueShiftGlobalMask: 0 + - s_start_MaskingMenu: 0 + - s_start_Matcap0AudioLink: 0 + - s_start_Matcap0Blending: 1 + - s_start_Matcap0Masking: 1 + - s_start_Matcap1AudioLink: 0 + - s_start_Matcap1Blending: 1 + - s_start_Matcap1HueShift: 0 + - s_start_Matcap1Masking: 1 + - s_start_Matcap1Normal: 0 + - s_start_Matcap1Smoothness: 0 + - s_start_Matcap2AudioLink: 0 + - s_start_Matcap2Blending: 1 + - s_start_Matcap2HueShift: 0 + - s_start_Matcap2Masking: 1 + - s_start_Matcap2Normal: 0 + - s_start_Matcap2Smoothness: 0 + - s_start_Matcap2TPSMaskGroup: 0 + - s_start_Matcap3AudioLink: 0 + - s_start_Matcap3Blending: 1 + - s_start_Matcap3HueShift: 0 + - s_start_Matcap3Masking: 1 + - s_start_Matcap3Normal: 0 + - s_start_Matcap3Smoothness: 0 + - s_start_Matcap3TPSMaskGroup: 0 + - s_start_Matcap4TPSMaskGroup: 0 + - s_start_MatcapHueShift: 0 + - s_start_MatcapNormal: 0 + - s_start_MatcapSmoothness: 0 + - s_start_MatcapTPSMaskGroup: 0 + - s_start_MirrorTexture: 1 + - s_start_MultilayerMath1stLayer: 1 + - s_start_MultilayerMath2ndLayer: 0 + - s_start_MultilayerMath3rdLayer: 0 + - s_start_MultilayerMathBorder: 1 + - s_start_MultilayerMathBorderMap: 0 + - s_start_MultilayerShadowMap: 0 + - s_start_OutlineAlphaDistanceFade: 0 + - s_start_OutlineColorAdjust: 0 + - s_start_OutlineFixedSize: 0 + - s_start_OutlineLighting: 0 + - s_start_OutlineRenderingOptions: 0 + - s_start_OutlineZOffset: 0 + - s_start_PBRSecondSpecular: 0 + - s_start_PBRSplitMaskSample: 0 + - s_start_ParallaxInternalHueShift: 0 + - s_start_ParallaxInternalLayerColoring: 1 + - s_start_ParallaxInternalLayerControls: 1 + - s_start_PathAppearance: 1 + - s_start_PathColors: 1 + - s_start_PathRemapping: 1 + - s_start_PathSourceDirections: 1 + - s_start_PathTypes: 1 + - s_start_Positioning: 1 + - s_start_RGBAlpha: 0 + - s_start_RGBBlue: 0 + - s_start_RGBGreen: 0 + - s_start_RGBRed: 0 + - s_start_RimLight0Color: 1 + - s_start_RimLight0GlobalMasking: 0 + - s_start_RimLight0HueShift: 0 + - s_start_RimLight0LightDirMask: 0 + - s_start_RimLight0ShapeControls: 1 + - s_start_RimLight1Color: 1 + - s_start_RimLight1GlobalMasking: 0 + - s_start_RimLight1HueShift: 0 + - s_start_RimLight1LightDirMask: 0 + - s_start_RimLight1ShapeControls: 1 + - s_start_RimLight2DirectionMask: 0 + - s_start_RimLightDirectionMask: 0 + - s_start_SSAOAdvanced: 0 + - s_start_SSAOColorAndMasking: 1 + - s_start_ScrollingEmission0: 0 + - s_start_ScrollingEmission1: 0 + - s_start_ScrollingEmission2: 0 + - s_start_ScrollingEmission3: 0 + - s_start_ShadingAddPass: 0 + - s_start_ShadingGlobalMask: 0 + - s_start_StylizedReflectionLilEnviroReflections: 1 + - s_start_StylizedReflectionLilSpecular: 1 + - s_start_StylizedReflectionMode0: 1 + - s_start_StylizedReflectionMode1: 1 + - s_start_StylizedSpecularAdvanced: 0 + - s_start_StylizedSpecularLayer0: 1 + - s_start_StylizedSpecularLayer1: 1 + - s_start_TimingOptions: 1 + - s_start_TransitionMenu: 0 + - s_start_UVTileDissolveRow0: 0 + - s_start_UVTileDissolveRow1: 0 + - s_start_UVTileDissolveRow2: 0 + - s_start_UVTileDissolveRow3: 0 + - s_start_VertAL: 0 + - s_start_VertexBarrelMode: 0 + - s_start_VertexColors: 0 + - s_start_VertexGlitchMirror: 0 + - s_start_VertexGlitchTexture: 1 + - s_start_VertexManipulationHeight: 1 + - s_start_VertexScale: 0 + - s_start_VertexSphereMode: 0 + - s_start_VertexTornadoMode: 0 + - s_start_VertexWind: 0 + - s_start_WorldTranslation: 0 + - s_start_brdfadvanced: 0 + - s_start_decal1_position: 1 + - s_start_decal2_position: 1 + - s_start_decal3_position: 1 + - s_start_decal_position: 1 + - s_start_deliot: 0 + - s_start_fogOpt: 1 + - s_start_ggxanisotropics: 0 + - s_start_heightFogOpt: 1 + - s_start_hextile: 0 + - s_start_liltoon_rim2_lightdir: 0 + - s_start_liltoon_rim_lightdir: 0 + - s_start_matcap1ApplyToAlpha: 0 + - s_start_matcap2ApplyToAlpha: 0 + - s_start_matcap3ApplyToAlpha: 0 + - s_start_matcapApplyToAlpha: 0 + - s_start_outline_al_color: 0 + - s_start_parallaxAdvanced: 0 + - s_start_vertexRounding: 0 + - s_start_vertexRoundingAL: 0 + - shader_is_using_thry_editor: 0 + - shader_locale: 0 + - shader_master_label: 0 + m_Colors: + - _1st_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _1st_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _2nd_ShadeColor: {r: 1, g: 1, b: 1, a: 1} + - _2nd_ShadeMapPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ALDecalVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALDecalVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALDecalVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _ALDecaldCircleDimensions: {r: 0, g: 1, b: 0, a: 1} + - _ALUVPosition: {r: 0.5, g: 0.5, b: 1, a: 1} + - _ALUVScale: {r: 1, g: 1, b: 1, a: 1} + - _ALVolumeColorHigh: {r: 1, g: 0, b: 0, a: 1} + - _ALVolumeColorLow: {r: 0, g: 0, b: 1, a: 1} + - _ALVolumeColorMid: {r: 0, g: 1, b: 0, a: 1} + - _AlphaAudioLinkAddRange: {r: 0, g: 0, b: 0, a: 1} + - _AlphaColor: {r: 1, g: 1, b: 1, a: 1} + - _AlphaMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _AlphaTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _AngleForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _Aniso0Tint: {r: 1, g: 1, b: 1, a: 1} + - _Aniso1Tint: {r: 1, g: 1, b: 1, a: 1} + - _AnisoColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _AnisotropyMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Ap_Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Ap_RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkBandOverrideSliders: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal0SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal1SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal2SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Alpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3ChannelSeparation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Emission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Rotation: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3Scale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMax: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDecal3SideMin: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkDissolveDetail: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission0CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission1CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission2CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkEmission3CenterOut: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookAlpha: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookFrame: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkFlipbookScale: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _AudioLinkOutlineColorMod: {r: 0, g: 1, b: 0, a: 0} + - _AudioLinkOutlineEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkOutlineSize: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkPathEmissionAddA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathEmissionAddR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathTimeOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetA: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetB: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetG: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkPathWidthOffsetR: {r: 0, g: 0, b: 0, a: 1} + - _AudioLinkRim2BrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2EmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRim2WidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkRimWidthAdd: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiInnerEmission: {r: 0, g: 0, b: 0, a: 0} + - _AudioLinkVoronoiOuterEmission: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceColor: {r: 1, g: 1, b: 1, a: 1} + - _BackFaceMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _BackFaceTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BacklightColor: {r: 0.85, g: 0.8, b: 0.7, a: 1} + - _BacklightColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _BlackLightMasking0Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking1Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking2Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlackLightMasking3Range: {r: 0.1, g: 0.5, b: 0, a: 0} + - _BlueColor: {r: 1, g: 1, b: 1, a: 1} + - _BlueTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _BumpMapPan: {r: 0, g: 0, b: 0, a: 0} + - _CenterOutDissolveDirection: {r: 0, g: 0, b: 1, a: 0} + - _ClearCoatMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _ClearCoatReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _ClearCoatSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _ClothMetallicSmoothnessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapColor: {r: 1, g: 1, b: 1, a: 1} + - _CubeMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotation: {r: 0, g: 0, b: 0, a: 0} + - _CubeMapRotationPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalColor: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor1: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor2: {r: 1, g: 1, b: 1, a: 1} + - _DecalColor3: {r: 1, g: 1, b: 1, a: 1} + - _DecalMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DecalPosition: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition1: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition2: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalPosition3: {r: 0.5, g: 0.5, b: 0, a: 0} + - _DecalScale: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale1: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale2: {r: 1, g: 1, b: 1, a: 0} + - _DecalScale3: {r: 1, g: 1, b: 1, a: 0} + - _DecalSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset1: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset2: {r: 0, g: 0, b: 0, a: 0} + - _DecalSideOffset3: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _DecalTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DepthColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DepthRimColor: {r: 1, g: 1, b: 1, a: 1} + - _DepthTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DetailMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailNormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTexPan: {r: 0, g: 0, b: 0, a: 0} + - _DetailTint: {r: 1, g: 1, b: 1, a: 1} + - _DissolveDetailNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveEdgeColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveEndPoint: {r: 0, g: 1, b: 0, a: 0} + - _DissolveMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveNoiseTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DissolveStartPoint: {r: 0, g: -1, b: 0, a: 0} + - _DissolveTextureColor: {r: 1, g: 1, b: 1, a: 1} + - _DissolveToTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionFlowTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrength1AudioLink: {r: 0, g: 0, b: 0, a: 0} + - _DistortionStrengthAudioLink: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL0Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL0StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL1Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL1StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL2Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL2StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionAL3Multipliers: {r: 1, g: 1, b: 0, a: 0} + - _EmissionAL3StrengthMod: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _EmissionColor1: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor2: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor3: {r: 1, g: 1, b: 1, a: 1} + - _EmissionMap1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMapPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask1Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask2Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMask3Pan: {r: 0, g: 0, b: 0, a: 0} + - _EmissionMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _EmissiveScroll_Direction: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction1: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction2: {r: 0, g: -10, b: 0, a: 0} + - _EmissiveScroll_Direction3: {r: 0, g: -10, b: 0, a: 0} + - _FXProximityColorMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _FXProximityColorMinColor: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookColor: {r: 1, g: 1, b: 1, a: 1} + - _FlipbookCrossfadeRange: {r: 0.75, g: 1, b: 0, a: 1} + - _FlipbookMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookPanning: {r: 0, g: 0, b: 0, a: 1} + - _FlipbookScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _FlipbookSideOffset: {r: 0, g: 0, b: 0, a: 0} + - _FlipbookTexArrayPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALMaxBrightnessAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterALSizeAdd: {r: 0, g: 0, b: 0, a: 0} + - _GlitterColor: {r: 1, g: 1, b: 1, a: 1} + - _GlitterColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _GlitterMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _GlitterMinMaxSize: {r: 0.1, g: 0.5, b: 0, a: 1} + - _GlitterRandomRotationSpeed: {r: 0, g: 0, b: 0, a: 0} + - _GlitterUVPanning: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskMinMaxSlider_0: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_1: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_10: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_11: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_12: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_13: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_14: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_15: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_2: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_3: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_4: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_5: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_6: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_7: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_8: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskMinMaxSlider_9: {r: 0, g: 1, b: 0, a: 1} + - _GlobalMaskTexture0Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture0SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture1SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture2SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3Pan: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_A: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_B: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitPan_G: {r: 0, g: 0, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_A: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_B: {r: 1, g: 1, b: 0, a: 0} + - _GlobalMaskTexture3SplitTilingOffset_G: {r: 1, g: 1, b: 0, a: 0} + - _GlobalThemeColor0: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor1: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor2: {r: 1, g: 1, b: 1, a: 1} + - _GlobalThemeColor3: {r: 1, g: 1, b: 1, a: 1} + - _GreenColor: {r: 1, g: 1, b: 1, a: 1} + - _GreenTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _HeightMapPan: {r: 0, g: 0, b: 0, a: 0} + - _HeightmaskPan: {r: 0, g: 0, b: 0, a: 0} + - _HighColor: {r: 1, g: 1, b: 1, a: 1} + - _HighColor_TexPan: {r: 0, g: 0, b: 0, a: 0} + - _LTCGI_DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _LTCGI_SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _LightDataSDFMapPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingAOMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingDetailShadowMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingForcedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowColor: {r: 1, g: 1, b: 1, a: 1} + - _LightingShadowMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _LightingWrappedColor: {r: 1, g: 1, b: 1, a: 1} + - _LightngForcedDirection: {r: 0, g: 0, b: 0, a: 1} + - _LineColor: {r: 1, g: 1, b: 1, a: 1} + - _LookAtAlphaDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtAlphaForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtAlphaMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtAlphaOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtAlphaUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtBlueDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtBlueForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtBlueMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtBlueOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBluePivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtBlueUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtGreenDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtGreenForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtGreenMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtGreenOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtGreenUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _LookAtMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedDistanceFalloff: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedFoV: {r: 0, g: 0, b: 0, a: 0} + - _LookAtRedForwardDirection: {r: 0, g: 0, b: 1, a: 1} + - _LookAtRedMaxPitchAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxRollAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedMaxYawAngle: {r: -180, g: 180, b: -180, a: 180} + - _LookAtRedOriginOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedPivotOffset: {r: 0, g: 0, b: 0, a: 1} + - _LookAtRedUpDirection: {r: 0, g: 1, b: 0, a: 1} + - _MainColorAdjustTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MainTexPan: {r: 0, g: 0, b: 0, a: 0} + - _MatCap2ndBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap3rdBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCap4thBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _MatCapBlendUV1: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap0NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap1NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap2Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALAlphaAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALEmissionAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3ALIntensityAdd: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap3MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3NormalMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap3Pan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Color: {r: 1, g: 1, b: 1, a: 1} + - _Matcap4MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Matcap4Pan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapColor: {r: 1, g: 1, b: 1, a: 1} + - _MatcapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _MatcapPan: {r: 0, g: 0, b: 0, a: 0} + - _MirrorColor: {r: 1, g: 1, b: 1, a: 1} + - _MirrorTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieMetallicMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _MochieReflectionTint: {r: 1, g: 1, b: 1, a: 1} + - _MochieSpecularTint: {r: 1, g: 1, b: 1, a: 1} + - _MultilayerMathBlurMapPan: {r: 0, g: 0, b: 0, a: 0} + - _NormalCorrectOrigin: {r: 0, g: 0.4, b: -0.025, a: 1} + - _OutlineDropShadowOffset: {r: 1, g: 0, b: 0, a: 0} + - _OutlineMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _OutlinePersonaDirection: {r: 1, g: 0, b: 0, a: 0} + - _OutlineTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _PBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _PPMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _PPRGB: {r: 1, g: 1, b: 1, a: 1} + - _PPTint: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMapMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ParallaxInternalMapPan: {r: 0, g: 0, b: 1, a: 1} + - _ParallaxInternalMaxColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalMinColor: {r: 1, g: 1, b: 1, a: 1} + - _ParallaxInternalPanDepthSpeed: {r: 0, g: 0, b: 1, a: 1} + - _PathALAutoCorrelatorRangeA: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeB: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeG: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALAutoCorrelatorRangeR: {r: 0.1, g: 0.9, b: 0, a: 1} + - _PathALHistoryRangeA: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeB: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeG: {r: 0, g: 1, b: 0, a: 1} + - _PathALHistoryRangeR: {r: 0, g: 1, b: 0, a: 1} + - _PathColorA: {r: 1, g: 1, b: 1, a: 1} + - _PathColorB: {r: 1, g: 1, b: 1, a: 1} + - _PathColorG: {r: 1, g: 1, b: 1, a: 1} + - _PathColorR: {r: 1, g: 1, b: 1, a: 1} + - _PathEmissionStrength: {r: 0, g: 0, b: 0, a: 0} + - _PathGapLengths: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathOffset: {r: 0, g: 0, b: 0, a: 0} + - _PathRemapA: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapB: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapG: {r: 0, g: 1, b: 0, a: 1} + - _PathRemapR: {r: 0, g: 1, b: 0, a: 1} + - _PathSegments: {r: 0, g: 0, b: 0, a: 0} + - _PathSoftness: {r: 1, g: 1, b: 1, a: 1} + - _PathSpeed: {r: 0.1, g: 0.1, b: 0.1, a: 0.1} + - _PathTime: {r: -999, g: -999, b: -999, a: -999} + - _PathWidth: {r: 0.03, g: 0.03, b: 0.03, a: 0.03} + - _PathingColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PathingMapPan: {r: 0, g: 0, b: 0, a: 0} + - _PolarCenter: {r: 0.5, g: 0.5, b: 0, a: 0} + - _RGBAAlphaPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAAlphaPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAAlphaScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBABluePBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBABlueScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBAGreenPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBAGreenScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBAMetallicMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedPBRMaskScaleTiling: {r: 1, g: 1, b: 0, a: 0} + - _RGBARedPBRMasksPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBARedScaleOffset: {r: 1, g: 1, b: 0, a: 0} + - _RGBASmoothnessMapsPan: {r: 0, g: 0, b: 0, a: 0} + - _RGBMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RedColor: {r: 1, g: 1, b: 1, a: 1} + - _RedTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _ReflectionColor: {r: 1, g: 1, b: 1, a: 1} + - _ReflectionCubeColor: {r: 0, g: 0, b: 0, a: 1} + - _RgbNormalAPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalBPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalGPan: {r: 0, g: 0, b: 0, a: 0} + - _RgbNormalRPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2Color: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _Rim2ColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2IndirColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2LightColor: {r: 1, g: 1, b: 1, a: 1} + - _Rim2MaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Rim2ShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _Rim2TexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimColor: {r: 0.65999997, g: 0.5, b: 0.47999996, a: 1} + - _RimColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _RimEnviroMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimIndirColor: {r: 1, g: 1, b: 1, a: 1} + - _RimLightColor: {r: 1, g: 1, b: 1, a: 1} + - _RimMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _RimShadowAlpha: {r: 0, g: 0, b: 0, a: 1} + - _RimTexPan: {r: 0, g: 0, b: 0, a: 0} + - _SDFForward: {r: 0, g: 0, b: 1, a: 0} + - _SDFLeft: {r: -1, g: 0, b: 0, a: 0} + - _SDFShadingTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOColor: {r: 0, g: 0, b: 0, a: 1} + - _SSAOColorMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOHSV: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SSAOMaxDistanceFalloff: {r: 0.01, g: 0.1, b: 1, a: 1} + - _SSSColor: {r: 1, g: 0, b: 0, a: 1} + - _SSSThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_HighColorMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_Rim2LightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Set_RimLightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow2ndColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColor: {r: 0, g: 0, b: 0, a: 0} + - _Shadow3rdColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowAOShift: {r: 0, g: 1, b: 0, a: 1} + - _ShadowAOShift2: {r: 0, g: 1, b: 0, a: 1} + - _ShadowBorderColor: {r: 1, g: 0, b: 0, a: 1} + - _ShadowBorderMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowColor: {r: 0.7, g: 0.75, b: 0.85, a: 1} + - _ShadowColorTexPan: {r: 0, g: 0, b: 0, a: 0} + - _ShadowStrengthMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _SkinThicknessMapPan: {r: 0, g: 0, b: 0, a: 0} + - _SphericalDissolveCenter: {r: 0, g: 0, b: 0, a: 1} + - _SssColorBleedAoWeights: {r: 0.4, g: 0.15, b: 0.13, a: 0} + - _SssTransmissionAbsorption: {r: -8, g: -40, b: -64, a: 0} + - _TPS_BuldgeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorForward: {r: 0, g: 0, b: 1, a: 0} + - _TPS_PenetratorRight: {r: 1, g: 0, b: 0, a: 0} + - _TPS_PenetratorScale: {r: 1, g: 1, b: 1, a: 1} + - _TPS_PenetratorUp: {r: 0, g: 1, b: 0, a: 0} + - _TPS_SqueezeTypeMultiplier: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSOutlineColor: {r: 1, g: 1, b: 1, a: 1} + - _TextFPSPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextFPSScale: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericColor: {r: 1, g: 1, b: 1, a: 1} + - _TextNumericOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextNumericScale: {r: 1, g: 1, b: 1, a: 1} + - _TextPositionColor: {r: 1, g: 0, b: 1, a: 1} + - _TextPositionOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionPadding: {r: 0, g: 0, b: 0, a: 0} + - _TextPositionScale: {r: 1, g: 1, b: 1, a: 1} + - _TextTimeColor: {r: 1, g: 0, b: 1, a: 1} + - _TextTimeOffset: {r: 0, g: 0, b: 0, a: 0} + - _TextTimePadding: {r: 0, g: 0, b: 0, a: 0} + - _TextTimeScale: {r: 1, g: 1, b: 1, a: 1} + - _TruchetALAlpha: {r: 0, g: 0, b: 0, a: 0} + - _TruchetALEmission: {r: 0, g: 0, b: 0, a: 0} + - _TruchetChronoPanSpeed: {r: 0, g: 0, b: 0, a: 0} + - _TruchetColor: {r: 1, g: 1, b: 1, a: 1} + - _TruchetMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _TruchetPanOffset: {r: 0, g: 0, b: 0, a: 0} + - _TruchetTexPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexBasicsMaskUVPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalRotationAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalRotationCTALSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalScaleALMax: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalScaleALMin: {r: 0, g: 0, b: 0, a: 0} + - _VertexLocalTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexLocalTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexLookAtAlphaAudiolink: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationHeightAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationHeightMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VertexManipulationLocalRotation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalRotationSpeed: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationLocalScale: {r: 1, g: 1, b: 1, a: 1} + - _VertexManipulationLocalTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexManipulationWorldTranslation: {r: 0, g: 0, b: 0, a: 1} + - _VertexRoundingRangeAL: {r: 0, g: 0, b: 0, a: 1} + - _VertexSpectrumOffsetMax: {r: 0, g: 0.1, b: 0, a: 1} + - _VertexSpectrumOffsetMin: {r: 0, g: 0, b: 0, a: 1} + - _VertexSphereCenter: {r: 0, g: 0, b: 0, a: 1} + - _VertexWindDetailDirection: {r: 0, g: 1, b: 0, a: 0} + - _VertexWindPrimaryDirection: {r: 1, g: 0, b: 0, a: 0} + - _VertexWorldTranslationALMax: {r: 0, g: 0, b: 0, a: 1} + - _VertexWorldTranslationALMin: {r: 0, g: 0, b: 0, a: 1} + - _VideoMaskTexturePan: {r: 0, g: 0, b: 0, a: 0} + - _VideoResolution: {r: 1280, g: 720, b: 0, a: 0} + - _VoronoiGradient: {r: 0, g: 0.5, b: 0, a: 0} + - _VoronoiInnerColor: {r: 1, g: 1, b: 1, a: 1} + - _VoronoiMaskPan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiNoisePan: {r: 0, g: 0, b: 0, a: 0} + - _VoronoiOuterColor: {r: 0, g: 0, b: 0, a: 1} + - _VoronoiRandomMinMaxBrightness: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiRandomMinMaxSaturation: {r: 0.8, g: 1, b: 0, a: 1} + - _VoronoiSpeed: {r: 1, g: 1, b: 1, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Quiz/Materials/WarningLight.mat.meta b/Assets/Quiz/Materials/WarningLight.mat.meta new file mode 100644 index 0000000..7bbe077 --- /dev/null +++ b/Assets/Quiz/Materials/WarningLight.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 840bcb10a024ade40964d286b99b9498 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Models/UC/TurretArm.fbx b/Assets/Quiz/Models/UC/TurretArm.fbx new file mode 100644 index 0000000..e1eabad Binary files /dev/null and b/Assets/Quiz/Models/UC/TurretArm.fbx differ diff --git a/Assets/Quiz/Models/UC/TurretArm.fbx.meta b/Assets/Quiz/Models/UC/TurretArm.fbx.meta new file mode 100644 index 0000000..676ebbe --- /dev/null +++ b/Assets/Quiz/Models/UC/TurretArm.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: cc37737c3ff5d7e42b4865d89ac84218 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Models/UC/TurretBarrel.fbx b/Assets/Quiz/Models/UC/TurretBarrel.fbx new file mode 100644 index 0000000..232e3dc Binary files /dev/null and b/Assets/Quiz/Models/UC/TurretBarrel.fbx differ diff --git a/Assets/Quiz/Models/UC/TurretBarrel.fbx.meta b/Assets/Quiz/Models/UC/TurretBarrel.fbx.meta new file mode 100644 index 0000000..3ccb29f --- /dev/null +++ b/Assets/Quiz/Models/UC/TurretBarrel.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 0664dd90b57b6444abebc51ece6d0c5d +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Models/UC/TurretBase.fbx b/Assets/Quiz/Models/UC/TurretBase.fbx new file mode 100644 index 0000000..4c22dcb Binary files /dev/null and b/Assets/Quiz/Models/UC/TurretBase.fbx differ diff --git a/Assets/Quiz/Models/UC/TurretBase.fbx.meta b/Assets/Quiz/Models/UC/TurretBase.fbx.meta new file mode 100644 index 0000000..145280f --- /dev/null +++ b/Assets/Quiz/Models/UC/TurretBase.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: b7dc74f4403e254448549cb30b4423b1 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Models/WarningLight.fbx b/Assets/Quiz/Models/WarningLight.fbx new file mode 100644 index 0000000..b8373bc Binary files /dev/null and b/Assets/Quiz/Models/WarningLight.fbx differ diff --git a/Assets/Quiz/Models/WarningLight.fbx.meta b/Assets/Quiz/Models/WarningLight.fbx.meta new file mode 100644 index 0000000..b8b2aa5 --- /dev/null +++ b/Assets/Quiz/Models/WarningLight.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 83b0c504531cce747a03372c31c6c9b6 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Prefabs/Door.prefab b/Assets/Quiz/Prefabs/Door.prefab index 0518c5c..34463f2 100644 --- a/Assets/Quiz/Prefabs/Door.prefab +++ b/Assets/Quiz/Prefabs/Door.prefab @@ -116,7 +116,7 @@ GameObject: - component: {fileID: 4259556231350831077} - component: {fileID: 7608627877075364897} - component: {fileID: 3254013147477455128} - m_Layer: 0 + m_Layer: 17 m_Name: Canvas m_TagString: Untagged m_Icon: {fileID: 0} @@ -141,7 +141,7 @@ RectTransform: m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 954.38, y: 1000} + m_SizeDelta: {x: 524.9, y: 143.3} m_Pivot: {x: 0.5, y: 0.5} --- !u!223 &3601699483249729264 Canvas: @@ -230,7 +230,7 @@ GameObject: - component: {fileID: 8026199772956616238} - component: {fileID: 3800222650531599870} - component: {fileID: 4115986927893723734} - m_Layer: 0 + m_Layer: 17 m_Name: Text (TMP) m_TagString: Untagged m_Icon: {fileID: 0} @@ -536,6 +536,9 @@ MonoBehaviour: doorOpenClip: {fileID: 8300000, guid: 68f74dfcb6a24d744ab1458f622db766, type: 3} doorCloseClip: {fileID: 8300000, guid: 15748c6a85f0ecc4780377cc3dd3aed4, type: 3} doorLockedClip: {fileID: 8300000, guid: 06caf027e091f0a49a1652e67bcc54c1, type: 3} + doorColliders: + - {fileID: 3315070339627509516} + - {fileID: 2471327853676666571} --- !u!114 &35819584842176034 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Quiz/Prefabs/TabletRow.prefab b/Assets/Quiz/Prefabs/TabletRow.prefab index 1068339..c61ae27 100644 --- a/Assets/Quiz/Prefabs/TabletRow.prefab +++ b/Assets/Quiz/Prefabs/TabletRow.prefab @@ -359,10 +359,10 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 14.3 - m_fontSizeBase: 24 + m_fontSizeBase: 5 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 1 + m_fontSizeMin: 5 m_fontSizeMax: 72 m_fontStyle: 0 m_HorizontalAlignment: 2 @@ -715,10 +715,10 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 14.3 - m_fontSizeBase: 24 + m_fontSizeBase: 5 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 1 + m_fontSizeMin: 5 m_fontSizeMax: 72 m_fontStyle: 0 m_HorizontalAlignment: 2 @@ -849,10 +849,10 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 14.3 - m_fontSizeBase: 24 + m_fontSizeBase: 5 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 1 + m_fontSizeMin: 5 m_fontSizeMax: 72 m_fontStyle: 0 m_HorizontalAlignment: 2 @@ -955,7 +955,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Red + m_text: R m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -982,11 +982,11 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 11.4 - m_fontSizeBase: 24 + m_fontSize: 14.3 + m_fontSizeBase: 5 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 1 + m_fontSizeMin: 5 m_fontSizeMax: 72 m_fontStyle: 0 m_HorizontalAlignment: 2 @@ -1222,7 +1222,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: Blue + m_text: B m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -1249,11 +1249,11 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 10.5 - m_fontSizeBase: 24 + m_fontSize: 14.3 + m_fontSizeBase: 5 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 1 + m_fontSizeMin: 5 m_fontSizeMax: 72 m_fontStyle: 0 m_HorizontalAlignment: 2 @@ -1424,6 +1424,161 @@ MonoBehaviour: m_StringArgument: Add5Point m_BoolArgument: 0 m_CallState: 2 +--- !u!1 &7306037706693580111 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2120735981995653141} + - component: {fileID: 8217649633977940270} + - component: {fileID: 8516152348082192496} + - component: {fileID: 974296153006259047} + m_Layer: 0 + m_Name: Score + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2120735981995653141 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7306037706693580111} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 664144901629724155} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8217649633977940270 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7306037706693580111} + m_CullTransparentMesh: 1 +--- !u!114 &8516152348082192496 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7306037706693580111} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 80 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 8.95 + m_fontSizeBase: 15.63 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 1 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &974296153006259047 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7306037706693580111} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 10 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 --- !u!1 &7900573371347159284 GameObject: m_ObjectHideFlags: 0 @@ -1458,6 +1613,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 2833036006029791312} + - {fileID: 2120735981995653141} - {fileID: 1521369068322302071} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1519,6 +1675,7 @@ MonoBehaviour: _udonSharpBackingUdonBehaviour: {fileID: 5768049078119411523} playerManager: {fileID: 0} playerName: {fileID: 6242764254027154711} + playerScore: {fileID: 8516152348082192496} backgroundImage: {fileID: 542764693324879769} --- !u!114 &5768049078119411523 MonoBehaviour: @@ -1596,7 +1753,7 @@ GameObject: - component: {fileID: 6242764254027154711} - component: {fileID: 6591862367719594470} m_Layer: 0 - m_Name: Text (TMP) + m_Name: PlayerName m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1676,7 +1833,7 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 16.05 + m_fontSize: 1 m_fontSizeBase: 36 m_fontWeight: 400 m_enableAutoSizing: 1 @@ -1735,7 +1892,7 @@ MonoBehaviour: m_MinHeight: -1 m_PreferredWidth: -1 m_PreferredHeight: -1 - m_FlexibleWidth: -1 + m_FlexibleWidth: 1 m_FlexibleHeight: -1 m_LayoutPriority: 1 --- !u!1 &9019609611271913931 @@ -1964,10 +2121,10 @@ MonoBehaviour: serializedVersion: 2 rgba: 4294967295 m_fontSize: 12.35 - m_fontSizeBase: 24 + m_fontSizeBase: 5 m_fontWeight: 400 m_enableAutoSizing: 1 - m_fontSizeMin: 1 + m_fontSizeMin: 5 m_fontSizeMax: 72 m_fontStyle: 0 m_HorizontalAlignment: 2 diff --git a/Assets/Quiz/QuizScene.unity b/Assets/Quiz/QuizScene.unity index 61ebf64..558cfe4 100644 --- a/Assets/Quiz/QuizScene.unity +++ b/Assets/Quiz/QuizScene.unity @@ -994,7 +994,7 @@ MonoBehaviour: AdaptiveResolution: 1 VoxelsPerUnit: 3 Resolution: {x: 61, y: 25, z: 45} - PreviewVoxels: 1 + PreviewVoxels: 0 BakeryVolume: {fileID: 2020562565} LightVolumeInstance: {fileID: 49243168} LightVolumeSetup: {fileID: 641951133} @@ -2550,6 +2550,58 @@ MonoBehaviour: Divine Soul, and Draconic Bloodline? (sorcerer) bonusQuestion3: Which class has access to abilities including deflect missiles, stunning strike, and unarmored defence? (monk) +--- !u!1 &106384047 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + m_PrefabInstance: {fileID: 129739576} + m_PrefabAsset: {fileID: 0} +--- !u!114 &106384053 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106384047} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &106384054 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 106384047} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 106384053} --- !u!1 &107912848 GameObject: m_ObjectHideFlags: 0 @@ -2637,6 +2689,7 @@ MonoBehaviour: - {fileID: 1247771533} - {fileID: 1402935901} - {fileID: 2014315519} + - {fileID: 189018458} --- !u!1 &116019992 GameObject: m_ObjectHideFlags: 0 @@ -3008,7 +3061,13 @@ PrefabInstance: m_RemovedGameObjects: - {fileID: 9039469528340861157, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 106384054} + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 106384053} m_SourcePrefab: {fileID: 100100000, guid: a4b69a2a368f99347822b1376eee0278, type: 3} --- !u!4 &129739577 stripped Transform: @@ -3277,6 +3336,8 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 400931635} + - {fileID: 1619203126} + - {fileID: 1489237205} - {fileID: 168850486} - {fileID: 1658940736} - {fileID: 1960633723} @@ -3290,6 +3351,9 @@ Transform: - {fileID: 167976939} - {fileID: 754242207} - {fileID: 1052669181} + - {fileID: 264424218} + - {fileID: 921835083} + - {fileID: 189018457} m_Father: {fileID: 285263198} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &139112631 @@ -3738,6 +3802,160 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 150636676} m_CullTransparentMesh: 1 +--- !u!1 &161812134 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 161812135} + - component: {fileID: 161812139} + - component: {fileID: 161812138} + - component: {fileID: 161812137} + - component: {fileID: 161812136} + m_Layer: 0 + m_Name: Button (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &161812135 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161812134} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.0008845081} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 334796039} + m_Father: {fileID: 1364068246} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &161812136 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161812134} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 82.85 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &161812137 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161812134} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 161812138} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1361438331} + m_TargetAssemblyTypeName: + m_MethodName: SendCustomEvent + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: RandomizeAllPlayerTeams + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &161812138 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161812134} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 35630e38b4e5ffb40b44ec5348b4333f, type: 2} + m_Color: {r: 0.5137255, g: 0.9221883, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &161812139 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 161812134} + m_CullTransparentMesh: 1 --- !u!1001 &167976938 PrefabInstance: m_ObjectHideFlags: 0 @@ -3897,7 +4115,10 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 07f0ab73ad9da7447a29602f04926a92, type: 3} + insertIndex: -1 + addedObject: {fileID: 168850488} m_SourcePrefab: {fileID: 100100000, guid: 07f0ab73ad9da7447a29602f04926a92, type: 3} --- !u!1 &168850483 stripped GameObject: @@ -3914,6 +4135,28 @@ Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 07f0ab73ad9da7447a29602f04926a92, type: 3} m_PrefabInstance: {fileID: 168850482} m_PrefabAsset: {fileID: 0} +--- !u!64 &168850488 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168850483} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: -2042070659358296946, guid: 07f0ab73ad9da7447a29602f04926a92, type: 3} --- !u!1 &169102899 GameObject: m_ObjectHideFlags: 0 @@ -4180,6 +4423,95 @@ GameObject: m_CorrespondingSourceObject: {fileID: 100590131341888120, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1121960421} m_PrefabAsset: {fileID: 0} +--- !u!1001 &189018456 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 138663202} + m_Modifications: + - target: {fileID: 3308455658644698921, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: playerManager + value: + objectReference: {fileID: 1361438332} + - target: {fileID: 3308455658644698921, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: serializationData.Prefab + value: + objectReference: {fileID: 3308455658644698921, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + - target: {fileID: 8520528909953721210, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_Name + value: UCScoreBoard + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalScale.x + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalScale.z + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalPosition.x + value: -12.114049 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalPosition.y + value: 3.588581 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalPosition.z + value: -39.159695 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalRotation.w + value: -0.5000007 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalRotation.x + value: -0.5000009 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalRotation.y + value: 0.4999992 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalRotation.z + value: -0.4999992 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -270 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9990438e2eecf6846a9aa659de507798, type: 3} +--- !u!4 &189018457 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 9040183826093750720, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + m_PrefabInstance: {fileID: 189018456} + m_PrefabAsset: {fileID: 0} +--- !u!114 &189018458 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 3308455658644698921, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + m_PrefabInstance: {fileID: 189018456} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532472719} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df6e8d6ea43de87479510788c8e2f15d, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &192622410 stripped GameObject: m_CorrespondingSourceObject: {fileID: 4374023605064953943, guid: b6d026cca31904b44aab6b272b98664c, type: 3} @@ -5552,6 +5884,38 @@ GameObject: m_CorrespondingSourceObject: {fileID: 6515456391347357321, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1725237038} m_PrefabAsset: {fileID: 0} +--- !u!1 &264424217 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 264424218} + m_Layer: 0 + m_Name: Turret + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &264424218 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 264424217} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 772508343} + m_Father: {fileID: 138663202} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &267155291 PrefabInstance: m_ObjectHideFlags: 0 @@ -5900,18 +6264,18 @@ RectTransform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 282873480} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0.00013073266} + m_LocalPosition: {x: 0, y: 0, z: 0.0008845081} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1005614852} - m_Father: {fileID: 464110433} + m_Father: {fileID: 1364068246} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0} + m_SizeDelta: {x: 640, y: 80} + m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &282873482 MonoBehaviour: m_ObjectHideFlags: 0 @@ -6019,10 +6383,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_IgnoreLayout: 0 - m_MinWidth: 500 - m_MinHeight: 80 + m_MinWidth: -1 + m_MinHeight: -1 m_PreferredWidth: -1 - m_PreferredHeight: -1 + m_PreferredHeight: 82.85 m_FlexibleWidth: -1 m_FlexibleHeight: -1 m_LayoutPriority: 1 @@ -7142,7 +7506,8 @@ Transform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 433685199} m_Father: {fileID: 285263198} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &322391580 @@ -7167,7 +7532,17 @@ MonoBehaviour: PrefabModifications: [] SerializationNodes: [] _udonSharpBackingUdonBehaviour: {fileID: 322391581} - isBuzzersEnabled: 1 + isBuzzersEnabled: 0 + areSirensActivated: 0 + lights: + - {fileID: 1564405634} + - {fileID: 598639087} + - {fileID: 940560459} + - {fileID: 1103164090} + sirenAudioSource: {fileID: 433685200} + turretAnimators: + - {fileID: 772508347} + - {fileID: 1626802769} --- !u!114 &322391581 MonoBehaviour: m_ObjectHideFlags: 2 @@ -7187,7 +7562,7 @@ MonoBehaviour: SynchronizePosition: 0 AllowCollisionOwnershipTransfer: 0 Reliable: 0 - _syncMethod: 2 + _syncMethod: 3 serializedProgramAsset: {fileID: 11400000, guid: a484d3a5d637cca43a2617c2eb1a4dde, type: 2} programSource: {fileID: 11400000, guid: 4624ec24c9f8ec4449a12e6ffad1f51b, type: 2} serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF @@ -7203,6 +7578,140 @@ GameObject: m_CorrespondingSourceObject: {fileID: 100590131341888120, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 446262684} m_PrefabAsset: {fileID: 0} +--- !u!1 &334796038 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 334796039} + - component: {fileID: 334796041} + - component: {fileID: 334796040} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &334796039 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 334796038} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 161812135} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &334796040 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 334796038} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Randomize Teams + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 18 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 5, y: 5, z: 5, w: 5} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &334796041 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 334796038} + m_CullTransparentMesh: 1 --- !u!1 &346760485 GameObject: m_ObjectHideFlags: 0 @@ -7696,7 +8205,13 @@ PrefabInstance: m_RemovedGameObjects: - {fileID: 9039469528340861157, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 1800930730} + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 1800930731} m_SourcePrefab: {fileID: 100100000, guid: a4b69a2a368f99347822b1376eee0278, type: 3} --- !u!4 &374751488 stripped Transform: @@ -9552,6 +10067,75 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 1600512188104761576, guid: 844da2a9bfdfa474784b61993287bcc8, type: 3} m_PrefabInstance: {fileID: 1786457057} m_PrefabAsset: {fileID: 0} +--- !u!1001 &428131387 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1711739656} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalPosition.z + value: 0.3038 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.w + value: -0.8520956 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.x + value: 0.000001618705 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000002477069 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.z + value: 0.5233861 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 360 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -63.119 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 6de578af1c253b9429e499e26a698144, type: 2} + - target: {fileID: 919132149155446097, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_Name + value: TurretBarrel + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + insertIndex: -1 + addedObject: {fileID: 1685112124} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} +--- !u!4 &428131388 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + m_PrefabInstance: {fileID: 428131387} + m_PrefabAsset: {fileID: 0} --- !u!1 &428624007 stripped GameObject: m_CorrespondingSourceObject: {fileID: 2341549958043435017, guid: 51d691fd44f684a4f8378d7d2ef9f4a7, type: 3} @@ -9655,6 +10239,153 @@ Transform: m_CorrespondingSourceObject: {fileID: 2360677752135671356, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_PrefabInstance: {fileID: 1710390289690672240} m_PrefabAsset: {fileID: 0} +--- !u!1 &433685198 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 433685199} + - component: {fileID: 433685200} + - component: {fileID: 433685201} + m_Layer: 0 + m_Name: AlarmSpeaker + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &433685199 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 433685198} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -24, y: 3.5, z: -35.25} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 322391579} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &433685200 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 433685198} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: 4b0ae256de1a30843a2ad8d4ea54d4cc, type: 3} + m_PlayOnAwake: 0 + m_Volume: 0.5 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &433685201 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 433685198} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -617992517, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + Gain: 10 + Far: 80 + Near: 0 + VolumetricRadius: 0 + EnableSpatialization: 0 + UseAudioSourceVolumeCurve: 0 --- !u!1 &435823305 GameObject: m_ObjectHideFlags: 0 @@ -10613,6 +11344,4836 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3433cbb3076d31b4e8629a10775bc308, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &457810780 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 457810781} + - component: {fileID: 457810783} + - component: {fileID: 457810782} + m_Layer: 0 + m_Name: Particle System + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &457810781 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 457810780} + serializedVersion: 2 + m_LocalRotation: {x: -0.000001513123, y: -0.0000026710377, z: -0.52338624, w: -0.85209554} + m_LocalPosition: {x: 0, y: 0, z: 2.2199998} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 991617176} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 63.119} +--- !u!199 &457810782 +ParticleSystemRenderer: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 457810780} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10308, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_RenderMode: 0 + m_MeshDistribution: 0 + m_SortMode: 0 + m_MinParticleSize: 0 + m_MaxParticleSize: 0.5 + m_CameraVelocityScale: 0 + m_VelocityScale: 0 + m_LengthScale: 2 + m_SortingFudge: 0 + m_NormalDirection: 1 + m_ShadowBias: 0 + m_RenderAlignment: 0 + m_Pivot: {x: 0, y: 0, z: 0} + m_Flip: {x: 0, y: 0, z: 0} + m_EnableGPUInstancing: 1 + m_ApplyActiveColorSpace: 1 + m_AllowRoll: 1 + m_FreeformStretching: 0 + m_RotateWithStretchDirection: 1 + m_UseCustomVertexStreams: 0 + m_VertexStreams: 00010304 + m_UseCustomTrailVertexStreams: 0 + m_TrailVertexStreams: 00010304 + m_Mesh: {fileID: 0} + m_Mesh1: {fileID: 0} + m_Mesh2: {fileID: 0} + m_Mesh3: {fileID: 0} + m_MeshWeighting: 1 + m_MeshWeighting1: 1 + m_MeshWeighting2: 1 + m_MeshWeighting3: 1 + m_MaskInteraction: 0 +--- !u!198 &457810783 +ParticleSystem: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 457810780} + serializedVersion: 8 + lengthInSec: 2.5 + simulationSpeed: 1 + stopAction: 0 + cullingMode: 0 + ringBufferMode: 0 + ringBufferLoopRange: {x: 0, y: 1} + emitterVelocityMode: 1 + looping: 1 + prewarm: 0 + playOnAwake: 1 + useUnscaledTime: 0 + autoRandomSeed: 1 + startDelay: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + moveWithTransform: 0 + moveWithCustomTransform: {fileID: 0} + scalingMode: 1 + randomSeed: 0 + InitialModule: + serializedVersion: 3 + enabled: 1 + startLifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 2 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 5 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startColor: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + startSize: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotation: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + randomizeRotationDirection: 0 + gravitySource: 0 + maxNumParticles: 1000 + customEmitterVelocity: {x: 0, y: 0, z: 0} + size3D: 0 + rotation3D: 0 + gravityModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + ShapeModule: + serializedVersion: 6 + enabled: 1 + type: 4 + angle: 61.3 + length: 5 + boxThickness: {x: 0, y: 0, z: 0} + radiusThickness: 1 + donutRadius: 0.2 + m_Position: {x: 0, y: 0, z: 0} + m_Rotation: {x: 0, y: 0, z: 0} + m_Scale: {x: 1, y: 1, z: 1} + placementMode: 0 + m_MeshMaterialIndex: 0 + m_MeshNormalOffset: 0 + m_MeshSpawn: + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Mesh: {fileID: 0} + m_MeshRenderer: {fileID: 0} + m_SkinnedMeshRenderer: {fileID: 0} + m_Sprite: {fileID: 0} + m_SpriteRenderer: {fileID: 0} + m_UseMeshMaterialIndex: 0 + m_UseMeshColors: 1 + alignToDirection: 0 + m_Texture: {fileID: 0} + m_TextureClipChannel: 2 + m_TextureClipThreshold: 0 + m_TextureUVChannel: 0 + m_TextureColorAffectsParticles: 1 + m_TextureAlphaAffectsParticles: 1 + m_TextureBilinearFiltering: 0 + randomDirectionAmount: 0 + sphericalDirectionAmount: 0 + randomPositionAmount: 0 + radius: + value: 0.06 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + arc: + value: 360 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + EmissionModule: + enabled: 1 + serializedVersion: 4 + rateOverTime: + serializedVersion: 2 + minMaxState: 0 + scalar: 500 + minScalar: 10 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rateOverDistance: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_BurstCount: 0 + m_Bursts: [] + SizeModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + RotationModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + ColorModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + UVModule: + serializedVersion: 2 + enabled: 1 + mode: 1 + timeMode: 0 + fps: 30 + frameOverTime: + serializedVersion: 2 + minMaxState: 1 + scalar: 0.9999 + minScalar: 0.9999 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startFrame: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedRange: {x: 0, y: 1} + tilesX: 1 + tilesY: 1 + animationType: 0 + rowIndex: 0 + cycles: 1 + uvChannelMask: -1 + rowMode: 1 + sprites: + - sprite: {fileID: 21300000, guid: 9c095b11d0f14754c936d705717c4db9, type: 3} + flipU: 0 + flipV: 0 + VelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + radial: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + InheritVelocityModule: + enabled: 0 + m_Mode: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + LifetimeByEmitterSpeedModule: + enabled: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: -0.8 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.2 + inSlope: -0.8 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Range: {x: 0, y: 1} + ForceModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + randomizePerFrame: 0 + ExternalForcesModule: + serializedVersion: 2 + enabled: 0 + multiplierCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + influenceFilter: 0 + influenceMask: + serializedVersion: 2 + m_Bits: 4294967295 + influenceList: [] + ClampVelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + magnitude: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxis: 0 + inWorldSpace: 0 + multiplyDragByParticleSize: 1 + multiplyDragByParticleVelocity: 1 + dampen: 0 + drag: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + NoiseModule: + enabled: 0 + strength: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + frequency: 0.5 + damping: 1 + octaves: 1 + octaveMultiplier: 0.5 + octaveScale: 2 + quality: 1 + scrollSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remap: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapY: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapZ: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapEnabled: 0 + positionAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rotationAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + sizeAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + SizeBySpeedModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + range: {x: 0, y: 1} + separateAxes: 0 + RotationBySpeedModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + range: {x: 0, y: 1} + ColorBySpeedModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + range: {x: 0, y: 1} + CollisionModule: + enabled: 0 + serializedVersion: 4 + type: 0 + collisionMode: 0 + colliderForce: 0 + multiplyColliderForceByParticleSize: 0 + multiplyColliderForceByParticleSpeed: 0 + multiplyColliderForceByCollisionAngle: 1 + m_Planes: [] + m_Dampen: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Bounce: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_EnergyLossOnCollision: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minKillSpeed: 0 + maxKillSpeed: 10000 + radiusScale: 1 + collidesWith: + serializedVersion: 2 + m_Bits: 4294967295 + maxCollisionShapes: 256 + quality: 0 + voxelSize: 0.5 + collisionMessages: 0 + collidesWithDynamic: 1 + interiorCollisions: 0 + TriggerModule: + enabled: 0 + serializedVersion: 2 + inside: 1 + outside: 0 + enter: 0 + exit: 0 + colliderQueryMode: 0 + radiusScale: 1 + primitives: [] + SubModule: + serializedVersion: 2 + enabled: 0 + subEmitters: + - serializedVersion: 3 + emitter: {fileID: 0} + type: 0 + properties: 0 + emitProbability: 1 + LightsModule: + enabled: 0 + ratio: 0 + light: {fileID: 0} + randomDistribution: 1 + color: 1 + range: 1 + intensity: 1 + rangeCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + intensityCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + maxLights: 20 + TrailModule: + enabled: 0 + mode: 0 + ratio: 1 + lifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minVertexDistance: 0.2 + textureMode: 0 + textureScale: {x: 1, y: 1} + ribbonCount: 1 + shadowBias: 0.5 + worldSpace: 0 + dieWithParticles: 1 + sizeAffectsWidth: 1 + sizeAffectsLifetime: 0 + inheritParticleColor: 1 + generateLightingData: 0 + splitSubEmitterRibbons: 0 + attachRibbonsToTransform: 0 + colorOverLifetime: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + widthOverTrail: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorOverTrail: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + CustomDataModule: + enabled: 0 + mode0: 0 + vectorComponentCount0: 4 + color0: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel0: Color + vector0_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_0: X + vector0_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_1: Y + vector0_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_2: Z + vector0_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_3: W + mode1: 0 + vectorComponentCount1: 4 + color1: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel1: Color + vector1_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_0: X + vector1_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_1: Y + vector1_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_2: Z + vector1_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_3: W --- !u!1 &458289728 GameObject: m_ObjectHideFlags: 0 @@ -10748,7 +16309,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 520901813} - - {fileID: 282873481} + - {fileID: 1364068246} m_Father: {fileID: 1402950304} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -12472,6 +18033,11 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8880764824548044079, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 2086896412} m_PrefabAsset: {fileID: 0} +--- !u!1 &532472719 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8520528909953721210, guid: 9990438e2eecf6846a9aa659de507798, type: 3} + m_PrefabInstance: {fileID: 189018456} + m_PrefabAsset: {fileID: 0} --- !u!1 &533228809 GameObject: m_ObjectHideFlags: 0 @@ -14083,6 +19649,100 @@ MonoBehaviour: in the mid 20th century, with its name being an acronym of objects you can jump off. For five points, what do the letters B, A, S, and E stand for? (buildings, antennae, spans, earth) +--- !u!1 &598639085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 598639086} + - component: {fileID: 598639087} + m_Layer: 0 + m_Name: Spot Light (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &598639086 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 598639085} + serializedVersion: 2 + m_LocalRotation: {x: -0.000000029802326, y: 0.707107, z: 0.000000029802326, w: -0.7071066} + m_LocalPosition: {x: 0, y: 0.11240008, z: 0.000000029802322} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1619203126} + m_LocalEulerAnglesHint: {x: 0, y: 270, z: 0} +--- !u!108 &598639087 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 598639085} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 0 + m_Shape: 0 + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_Intensity: 0 + m_Range: 5 + m_SpotAngle: 84.6 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 --- !u!23 &599148971 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 2697018564455198238, guid: acde36bc75391a540a76c589339eeb32, type: 3} @@ -18464,6 +24124,283 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8880764824548044079, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 576108662} m_PrefabAsset: {fileID: 0} +--- !u!1001 &772508342 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 264424218} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalPosition.x + value: -21.12902 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalPosition.y + value: 7.55 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalPosition.z + value: -37.39493 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.w + value: -1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.x + value: -1.4242974e-14 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000087422755 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 487478f4e1c54324b8c767e8b689f6d4, type: 2} + - target: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_Name + value: TurretArm + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 1711739656} + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 772508347} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 772508346} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 772508345} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 772508352} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 772508351} + m_SourcePrefab: {fileID: 100100000, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} +--- !u!4 &772508343 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + m_PrefabInstance: {fileID: 772508342} + m_PrefabAsset: {fileID: 0} +--- !u!1 &772508344 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + m_PrefabInstance: {fileID: 772508342} + m_PrefabAsset: {fileID: 0} +--- !u!114 &772508345 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 772508344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 3 + serializedProgramAsset: {fileID: 11400000, guid: 0cb53f1275b984a4fb54157395348eb7, type: 2} + programSource: {fileID: 11400000, guid: bf2ab87fa81f13b408e7c2e992cdce04, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &772508346 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 772508344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6a52a319b79eb5245be42fbaec662d59, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 772508345} + audioSource: {fileID: 772508352} + gunLower1: {fileID: 8300000, guid: c538b7c238b16f14e9b89ca88c05cc6a, type: 3} + gunLower2: {fileID: 8300000, guid: 8b16f017db990654295fbc0f4c58935c, type: 3} + GunSpinUp: {fileID: 8300000, guid: 461afdcfdc292a84997e8417bbed3c09, type: 3} + steamBlast: {fileID: 8300000, guid: e1f55bc72a7596149b8ea53245b221dd, type: 3} + steamParticleSystem: {fileID: 1685112126} +--- !u!95 &772508347 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 772508344} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: fa0b5baa794724b4e98ac64450013638, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &772508351 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 772508344} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -617992517, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + Gain: 10 + Far: 40 + Near: 0 + VolumetricRadius: 0 + EnableSpatialization: 1 + UseAudioSourceVolumeCurve: 0 +--- !u!82 &772508352 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 772508344} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 1 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 --- !u!1 &780542785 GameObject: m_ObjectHideFlags: 0 @@ -21036,7 +26973,13 @@ PrefabInstance: m_RemovedGameObjects: - {fileID: 9039469528340861157, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 940570431} + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 940570432} m_SourcePrefab: {fileID: 100100000, guid: a4b69a2a368f99347822b1376eee0278, type: 3} --- !u!4 &899350061 stripped Transform: @@ -21992,6 +27935,38 @@ GameObject: m_CorrespondingSourceObject: {fileID: 1337646829457088878, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 1487057093} m_PrefabAsset: {fileID: 0} +--- !u!1 &921835082 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 921835083} + m_Layer: 0 + m_Name: Turret (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &921835083 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 921835082} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -6.5, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1626802764} + m_Father: {fileID: 138663202} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!23 &924447930 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: 7547418677490389003, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -22323,6 +28298,152 @@ MonoBehaviour: Entry: 6 Data: _udonSharpBackingUdonBehaviour: {fileID: 931100286} +--- !u!1 &940560457 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 940560458} + - component: {fileID: 940560459} + m_Layer: 0 + m_Name: Spot Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &940560458 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 940560457} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.7071066, z: 0.000000029802326, w: 0.707107} + m_LocalPosition: {x: 0, y: 0.11240008, z: 0.000000029802322} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1489237205} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!108 &940560459 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 940560457} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 0 + m_Shape: 0 + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_Intensity: 0 + m_Range: 5 + m_SpotAngle: 84.6 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!1 &940570425 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + m_PrefabInstance: {fileID: 899350060} + m_PrefabAsset: {fileID: 0} +--- !u!114 &940570431 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 940570425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 940570432} +--- !u!114 &940570432 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 940570425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 0 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 --- !u!1 &941168690 stripped GameObject: m_CorrespondingSourceObject: {fileID: 100590131341888120, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -23043,6 +29164,11 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 56226d676b0e8a94e9461ad87a1c012e, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!4 &991617176 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + m_PrefabInstance: {fileID: 2045619787} + m_PrefabAsset: {fileID: 0} --- !u!1001 &992013939 PrefabInstance: m_ObjectHideFlags: 0 @@ -23667,6 +29793,140 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 999167986} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1002754915 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1002754916} + - component: {fileID: 1002754918} + - component: {fileID: 1002754917} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1002754916 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1002754915} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1141302905} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1002754917 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1002754915} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Gun Lower + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 26.85 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 5, y: 5, z: 5, w: 5} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1002754918 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1002754915} + m_CullTransparentMesh: 1 --- !u!1 &1005614851 GameObject: m_ObjectHideFlags: 0 @@ -26447,6 +32707,100 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!1 &1103164088 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1103164089} + - component: {fileID: 1103164090} + m_Layer: 0 + m_Name: Spot Light (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1103164089 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1103164088} + serializedVersion: 2 + m_LocalRotation: {x: -0.000000029802326, y: 0.707107, z: 0.000000029802326, w: -0.7071066} + m_LocalPosition: {x: 0, y: 0.11240008, z: 0.000000029802322} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1489237205} + m_LocalEulerAnglesHint: {x: 0, y: 270, z: 0} +--- !u!108 &1103164090 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1103164088} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 0 + m_Shape: 0 + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_Intensity: 0 + m_Range: 5 + m_SpotAngle: 84.6 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 --- !u!1001 &1110630393 PrefabInstance: m_ObjectHideFlags: 0 @@ -27178,6 +33532,160 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!1 &1141302904 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1141302905} + - component: {fileID: 1141302909} + - component: {fileID: 1141302908} + - component: {fileID: 1141302907} + - component: {fileID: 1141302906} + m_Layer: 0 + m_Name: Button (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1141302905 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1141302904} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.0008845081} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1002754916} + m_Father: {fileID: 1364068246} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1141302906 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1141302904} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 82.85 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1141302907 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1141302904} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1141302908} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 322391581} + m_TargetAssemblyTypeName: + m_MethodName: SendCustomEvent + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: HandleGunButtonPress + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1141302908 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1141302904} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 35630e38b4e5ffb40b44ec5348b4333f, type: 2} + m_Color: {r: 0.990362, g: 1, b: 0.5137255, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1141302909 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1141302904} + m_CullTransparentMesh: 1 --- !u!1 &1144270763 stripped GameObject: m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 1611d9bc5e3b2d348887fbca07869875, type: 3} @@ -31521,7 +38029,13 @@ PrefabInstance: m_RemovedGameObjects: - {fileID: 9039469528340861157, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 1507891014} + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 1507891015} m_SourcePrefab: {fileID: 100100000, guid: a4b69a2a368f99347822b1376eee0278, type: 3} --- !u!4 &1290715186 stripped Transform: @@ -38411,6 +44925,93 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 689256096079544507, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 1362277936} m_PrefabAsset: {fileID: 0} +--- !u!1 &1364068245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1364068246} + - component: {fileID: 1364068248} + - component: {fileID: 1364068247} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1364068246 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1364068245} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0.001558006} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 282873481} + - {fileID: 2114574444} + - {fileID: 1141302905} + - {fileID: 161812135} + m_Father: {fileID: 464110433} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1364068247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1364068245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 1 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1364068248 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1364068245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 0 --- !u!1 &1366527141 GameObject: m_ObjectHideFlags: 0 @@ -39399,6 +46000,8 @@ GameObject: - component: {fileID: 1402950307} - component: {fileID: 1402950306} - component: {fileID: 1402950305} + - component: {fileID: 1402950310} + - component: {fileID: 1402950309} m_Layer: 0 m_Name: Canvas m_TagString: Untagged @@ -39502,6 +46105,53 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!114 &1402950309 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402950303} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 2 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &1402950310 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1402950303} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1402950309} --- !u!1001 &1407078581 PrefabInstance: m_ObjectHideFlags: 0 @@ -40041,6 +46691,58 @@ MonoBehaviour: bonusQuestion3: In which country in southeast Europe is Plovdiv, the winner for 2019? The city is known for its Roman ruins, Ottoman townhouses, and being the birthplace of wrestler Miroslav Barnyashev (Bulgaria) +--- !u!1 &1424746389 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + m_PrefabInstance: {fileID: 1477190661} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1424746395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424746389} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1424746396} +--- !u!114 &1424746396 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1424746389} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 0 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 --- !u!4 &1426648473 stripped Transform: m_CorrespondingSourceObject: {fileID: 7797344969400887727, guid: 87958fc281472354fb5c86b6da9b46fa, type: 3} @@ -40834,7 +47536,13 @@ PrefabInstance: m_RemovedGameObjects: - {fileID: 9039469528340861157, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 1424746395} + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 1424746396} m_SourcePrefab: {fileID: 100100000, guid: a4b69a2a368f99347822b1376eee0278, type: 3} --- !u!4 &1477190662 stripped Transform: @@ -41220,6 +47928,78 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 689256096079544507, guid: 958bb1f4471ffc744b9726403c33780c, type: 3} m_PrefabInstance: {fileID: 1487057093} m_PrefabAsset: {fileID: 0} +--- !u!1001 &1489237203 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 138663202} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalPosition.x + value: -26.807 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalPosition.y + value: 2.783827 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalPosition.z + value: -35.006 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5434319 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4533295 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.y + value: 0.5381744 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.z + value: -0.45775813 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 89.443 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -80.218 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 840bcb10a024ade40964d286b99b9498, type: 2} + - target: {fileID: 919132149155446097, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_Name + value: WarningLight (1) + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + insertIndex: -1 + addedObject: {fileID: 940560458} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + insertIndex: -1 + addedObject: {fileID: 1103164089} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} +--- !u!4 &1489237205 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + m_PrefabInstance: {fileID: 1489237203} + m_PrefabAsset: {fileID: 0} --- !u!1 &1496265691 GameObject: m_ObjectHideFlags: 0 @@ -41254,7 +48034,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -0.001591303} + m_AnchoredPosition: {x: 0, y: -0.0008211219} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 1} --- !u!114 &1496265693 @@ -41337,6 +48117,58 @@ Transform: - {fileID: 748132932} m_Father: {fileID: 855597967} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1507891008 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + m_PrefabInstance: {fileID: 1290715185} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1507891014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1507891008} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1507891015} +--- !u!114 &1507891015 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1507891008} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 0 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 --- !u!1 &1510411348 GameObject: m_ObjectHideFlags: 0 @@ -42895,6 +49727,100 @@ MonoBehaviour: shadowmaskGroupID: 0 directionMode: 0 maskChannel: -1 +--- !u!1 &1564405632 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1564405633} + - component: {fileID: 1564405634} + m_Layer: 0 + m_Name: Spot Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1564405633 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564405632} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.7071066, z: 0.000000029802326, w: 0.707107} + m_LocalPosition: {x: 0, y: 0.11240008, z: 0.000000029802322} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1619203126} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!108 &1564405634 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1564405632} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 0 + m_Shape: 0 + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_Intensity: 0 + m_Range: 5 + m_SpotAngle: 84.6 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 --- !u!1001 &1564889613 PrefabInstance: m_ObjectHideFlags: 0 @@ -44191,6 +51117,78 @@ GameObject: m_CorrespondingSourceObject: {fileID: 4498322420252528587, guid: acde36bc75391a540a76c589339eeb32, type: 3} m_PrefabInstance: {fileID: 369696550} m_PrefabAsset: {fileID: 0} +--- !u!1001 &1619203125 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 138663202} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalPosition.x + value: -21.41 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalPosition.y + value: 2.783827 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalPosition.z + value: -34.953033 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.w + value: 0.5434319 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.x + value: -0.4533295 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.y + value: 0.5381744 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalRotation.z + value: -0.45775813 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 89.443 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -80.218 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 840bcb10a024ade40964d286b99b9498, type: 2} + - target: {fileID: 919132149155446097, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + propertyPath: m_Name + value: WarningLight + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + insertIndex: -1 + addedObject: {fileID: 1564405633} + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + insertIndex: -1 + addedObject: {fileID: 598639086} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} +--- !u!4 &1619203126 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 83b0c504531cce747a03372c31c6c9b6, type: 3} + m_PrefabInstance: {fileID: 1619203125} + m_PrefabAsset: {fileID: 0} --- !u!1 &1619500838 stripped GameObject: m_CorrespondingSourceObject: {fileID: 6515456391347357321, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -44405,6 +51403,204 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 +--- !u!1 &1626802763 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + m_PrefabInstance: {fileID: 2006361932} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1626802764 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + m_PrefabInstance: {fileID: 2006361932} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1626802765 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1626802763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -617992517, guid: 661092b4961be7145bfbe56e1e62337b, type: 3} + m_Name: + m_EditorClassIdentifier: + Gain: 10 + Far: 40 + Near: 0 + VolumetricRadius: 0 + EnableSpatialization: 1 + UseAudioSourceVolumeCurve: 0 +--- !u!82 &1626802766 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1626802763} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 1 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &1626802767 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1626802763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 3 + serializedProgramAsset: {fileID: 11400000, guid: 0cb53f1275b984a4fb54157395348eb7, type: 2} + programSource: {fileID: 11400000, guid: bf2ab87fa81f13b408e7c2e992cdce04, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 +--- !u!114 &1626802768 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1626802763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6a52a319b79eb5245be42fbaec662d59, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1626802767} + audioSource: {fileID: 1626802766} + gunLower1: {fileID: 8300000, guid: c538b7c238b16f14e9b89ca88c05cc6a, type: 3} + gunLower2: {fileID: 8300000, guid: 8b16f017db990654295fbc0f4c58935c, type: 3} + GunSpinUp: {fileID: 8300000, guid: 461afdcfdc292a84997e8417bbed3c09, type: 3} + steamBlast: {fileID: 8300000, guid: e1f55bc72a7596149b8ea53245b221dd, type: 3} + steamParticleSystem: {fileID: 457810783} +--- !u!95 &1626802769 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1626802763} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: fa0b5baa794724b4e98ac64450013638, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 --- !u!1001 &1633629520 PrefabInstance: m_ObjectHideFlags: 0 @@ -44508,7 +51704,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 779405444076784686, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} propertyPath: m_text - value: studio 479 + value: studio 514 objectReference: {fileID: 0} - target: {fileID: 2128584790989480836, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} propertyPath: serializationData.Prefab @@ -44978,7 +52174,10 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0fa3d6e5ef847664abe16d36a25531a0, type: 3} insertIndex: -1 addedObject: {fileID: 1402950304} - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 0fa3d6e5ef847664abe16d36a25531a0, type: 3} + insertIndex: -1 + addedObject: {fileID: 1658940738} m_SourcePrefab: {fileID: 100100000, guid: 0fa3d6e5ef847664abe16d36a25531a0, type: 3} --- !u!1 &1658940733 stripped GameObject: @@ -44995,6 +52194,28 @@ Transform: m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0fa3d6e5ef847664abe16d36a25531a0, type: 3} m_PrefabInstance: {fileID: 1658940732} m_PrefabAsset: {fileID: 0} +--- !u!64 &1658940738 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1658940733} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 2534964839176971238, guid: 0fa3d6e5ef847664abe16d36a25531a0, type: 3} --- !u!1 &1663184057 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8379790806586723610, guid: 45eee8952e906cc48aeccfacdeaef466, type: 3} @@ -45389,6 +52610,4836 @@ MonoBehaviour: fixPos3D: 0 voxelSize: {x: 1, y: 1, z: 1} passedFilter: 0 +--- !u!1 &1685112123 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1685112124} + - component: {fileID: 1685112126} + - component: {fileID: 1685112125} + m_Layer: 0 + m_Name: Particle System + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1685112124 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685112123} + serializedVersion: 2 + m_LocalRotation: {x: -0.000001513123, y: -0.0000026710377, z: -0.52338624, w: -0.85209554} + m_LocalPosition: {x: 0, y: 0, z: 2.2199998} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 428131388} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 63.119} +--- !u!199 &1685112125 +ParticleSystemRenderer: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685112123} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10308, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_RenderMode: 0 + m_MeshDistribution: 0 + m_SortMode: 0 + m_MinParticleSize: 0 + m_MaxParticleSize: 0.5 + m_CameraVelocityScale: 0 + m_VelocityScale: 0 + m_LengthScale: 2 + m_SortingFudge: 0 + m_NormalDirection: 1 + m_ShadowBias: 0 + m_RenderAlignment: 0 + m_Pivot: {x: 0, y: 0, z: 0} + m_Flip: {x: 0, y: 0, z: 0} + m_EnableGPUInstancing: 1 + m_ApplyActiveColorSpace: 1 + m_AllowRoll: 1 + m_FreeformStretching: 0 + m_RotateWithStretchDirection: 1 + m_UseCustomVertexStreams: 0 + m_VertexStreams: 00010304 + m_UseCustomTrailVertexStreams: 0 + m_TrailVertexStreams: 00010304 + m_Mesh: {fileID: 0} + m_Mesh1: {fileID: 0} + m_Mesh2: {fileID: 0} + m_Mesh3: {fileID: 0} + m_MeshWeighting: 1 + m_MeshWeighting1: 1 + m_MeshWeighting2: 1 + m_MeshWeighting3: 1 + m_MaskInteraction: 0 +--- !u!198 &1685112126 +ParticleSystem: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1685112123} + serializedVersion: 8 + lengthInSec: 2.5 + simulationSpeed: 1 + stopAction: 0 + cullingMode: 0 + ringBufferMode: 0 + ringBufferLoopRange: {x: 0, y: 1} + emitterVelocityMode: 1 + looping: 1 + prewarm: 0 + playOnAwake: 1 + useUnscaledTime: 0 + autoRandomSeed: 1 + startDelay: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + moveWithTransform: 0 + moveWithCustomTransform: {fileID: 0} + scalingMode: 1 + randomSeed: 0 + InitialModule: + serializedVersion: 3 + enabled: 1 + startLifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 2 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 5 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startColor: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + startSize: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotation: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + randomizeRotationDirection: 0 + gravitySource: 0 + maxNumParticles: 1000 + customEmitterVelocity: {x: 0, y: 0, z: 0} + size3D: 0 + rotation3D: 0 + gravityModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + ShapeModule: + serializedVersion: 6 + enabled: 1 + type: 4 + angle: 61.3 + length: 5 + boxThickness: {x: 0, y: 0, z: 0} + radiusThickness: 1 + donutRadius: 0.2 + m_Position: {x: 0, y: 0, z: 0} + m_Rotation: {x: 0, y: 0, z: 0} + m_Scale: {x: 1, y: 1, z: 1} + placementMode: 0 + m_MeshMaterialIndex: 0 + m_MeshNormalOffset: 0 + m_MeshSpawn: + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Mesh: {fileID: 0} + m_MeshRenderer: {fileID: 0} + m_SkinnedMeshRenderer: {fileID: 0} + m_Sprite: {fileID: 0} + m_SpriteRenderer: {fileID: 0} + m_UseMeshMaterialIndex: 0 + m_UseMeshColors: 1 + alignToDirection: 0 + m_Texture: {fileID: 0} + m_TextureClipChannel: 2 + m_TextureClipThreshold: 0 + m_TextureUVChannel: 0 + m_TextureColorAffectsParticles: 1 + m_TextureAlphaAffectsParticles: 1 + m_TextureBilinearFiltering: 0 + randomDirectionAmount: 0 + sphericalDirectionAmount: 0 + randomPositionAmount: 0 + radius: + value: 0.06 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + arc: + value: 360 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + EmissionModule: + enabled: 1 + serializedVersion: 4 + rateOverTime: + serializedVersion: 2 + minMaxState: 0 + scalar: 500 + minScalar: 10 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rateOverDistance: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_BurstCount: 0 + m_Bursts: [] + SizeModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + RotationModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + ColorModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + UVModule: + serializedVersion: 2 + enabled: 1 + mode: 1 + timeMode: 0 + fps: 30 + frameOverTime: + serializedVersion: 2 + minMaxState: 1 + scalar: 0.9999 + minScalar: 0.9999 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startFrame: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedRange: {x: 0, y: 1} + tilesX: 1 + tilesY: 1 + animationType: 0 + rowIndex: 0 + cycles: 1 + uvChannelMask: -1 + rowMode: 1 + sprites: + - sprite: {fileID: 21300000, guid: 9c095b11d0f14754c936d705717c4db9, type: 3} + flipU: 0 + flipV: 0 + VelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + radial: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + InheritVelocityModule: + enabled: 0 + m_Mode: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + LifetimeByEmitterSpeedModule: + enabled: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: -0.8 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.2 + inSlope: -0.8 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Range: {x: 0, y: 1} + ForceModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + randomizePerFrame: 0 + ExternalForcesModule: + serializedVersion: 2 + enabled: 0 + multiplierCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + influenceFilter: 0 + influenceMask: + serializedVersion: 2 + m_Bits: 4294967295 + influenceList: [] + ClampVelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + magnitude: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxis: 0 + inWorldSpace: 0 + multiplyDragByParticleSize: 1 + multiplyDragByParticleVelocity: 1 + dampen: 0 + drag: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + NoiseModule: + enabled: 0 + strength: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + frequency: 0.5 + damping: 1 + octaves: 1 + octaveMultiplier: 0.5 + octaveScale: 2 + quality: 1 + scrollSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remap: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapY: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapZ: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapEnabled: 0 + positionAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rotationAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + sizeAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + SizeBySpeedModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + range: {x: 0, y: 1} + separateAxes: 0 + RotationBySpeedModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + range: {x: 0, y: 1} + ColorBySpeedModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + range: {x: 0, y: 1} + CollisionModule: + enabled: 0 + serializedVersion: 4 + type: 0 + collisionMode: 0 + colliderForce: 0 + multiplyColliderForceByParticleSize: 0 + multiplyColliderForceByParticleSpeed: 0 + multiplyColliderForceByCollisionAngle: 1 + m_Planes: [] + m_Dampen: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Bounce: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_EnergyLossOnCollision: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minKillSpeed: 0 + maxKillSpeed: 10000 + radiusScale: 1 + collidesWith: + serializedVersion: 2 + m_Bits: 4294967295 + maxCollisionShapes: 256 + quality: 0 + voxelSize: 0.5 + collisionMessages: 0 + collidesWithDynamic: 1 + interiorCollisions: 0 + TriggerModule: + enabled: 0 + serializedVersion: 2 + inside: 1 + outside: 0 + enter: 0 + exit: 0 + colliderQueryMode: 0 + radiusScale: 1 + primitives: [] + SubModule: + serializedVersion: 2 + enabled: 0 + subEmitters: + - serializedVersion: 3 + emitter: {fileID: 0} + type: 0 + properties: 0 + emitProbability: 1 + LightsModule: + enabled: 0 + ratio: 0 + light: {fileID: 0} + randomDistribution: 1 + color: 1 + range: 1 + intensity: 1 + rangeCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + intensityCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + maxLights: 20 + TrailModule: + enabled: 0 + mode: 0 + ratio: 1 + lifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minVertexDistance: 0.2 + textureMode: 0 + textureScale: {x: 1, y: 1} + ribbonCount: 1 + shadowBias: 0.5 + worldSpace: 0 + dieWithParticles: 1 + sizeAffectsWidth: 1 + sizeAffectsLifetime: 0 + inheritParticleColor: 1 + generateLightingData: 0 + splitSubEmitterRibbons: 0 + attachRibbonsToTransform: 0 + colorOverLifetime: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + widthOverTrail: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorOverTrail: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + CustomDataModule: + enabled: 0 + mode0: 0 + vectorComponentCount0: 4 + color0: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel0: Color + vector0_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_0: X + vector0_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_1: Y + vector0_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_2: Z + vector0_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_3: W + mode1: 0 + vectorComponentCount1: 4 + color1: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel1: Color + vector1_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_0: X + vector1_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_1: Y + vector1_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_2: Z + vector1_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_3: W --- !u!1001 &1688180659 PrefabInstance: m_ObjectHideFlags: 0 @@ -45734,6 +57785,75 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 09436c050a69bf0449a0a979b01268b7, type: 3} m_PrefabInstance: {fileID: 1249668048} m_PrefabAsset: {fileID: 0} +--- !u!1001 &1711739655 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 772508343} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalPosition.x + value: -0.000000087422755 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalPosition.y + value: 0.25 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalPosition.z + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.w + value: 0.00000004371138 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.x + value: -0.0000001629207 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.z + value: 0.0000000754979 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 6de578af1c253b9429e499e26a698144, type: 2} + - target: {fileID: 919132149155446097, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_Name + value: TurretBase + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + insertIndex: -1 + addedObject: {fileID: 428131388} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} +--- !u!4 &1711739656 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + m_PrefabInstance: {fileID: 1711739655} + m_PrefabAsset: {fileID: 0} --- !u!1 &1712184206 stripped GameObject: m_CorrespondingSourceObject: {fileID: 9189557463581648220, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -47363,7 +59483,7 @@ MonoBehaviour: m_HandleRect: {fileID: 1577496118} m_Direction: 2 m_Value: 1 - m_Size: 0.9999975 + m_Size: 0.9999968 m_NumberOfSteps: 0 m_OnValueChanged: m_PersistentCalls: @@ -49225,6 +61345,58 @@ GameObject: m_CorrespondingSourceObject: {fileID: 9004724186224534342, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 992013939} m_PrefabAsset: {fileID: 0} +--- !u!1 &1800930724 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + m_PrefabInstance: {fileID: 374751487} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1800930730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1800930724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 1800930731} +--- !u!114 &1800930731 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1800930724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 0 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 --- !u!1001 &1802793939 PrefabInstance: m_ObjectHideFlags: 0 @@ -50384,6 +62556,140 @@ MonoBehaviour: - TOGO - TUNISIA answerPoints: 0b000000070000000200000001000000010000000200000024000000010000000300000003000000140000000100000000000000130000002300000006000000180000000400000025000000090000000b0000000c00000005000000080000000500000013000000330000000d0000000900000007000000020000001d000000 +--- !u!1 &1847534666 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1847534667} + - component: {fileID: 1847534669} + - component: {fileID: 1847534668} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1847534667 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847534666} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2114574444} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1847534668 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847534666} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Activate sirens + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 23 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 5, y: 5, z: 5, w: 5} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1847534669 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1847534666} + m_CullTransparentMesh: 1 --- !u!23 &1848060572 stripped MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 09436c050a69bf0449a0a979b01268b7, type: 3} @@ -51475,16 +63781,16 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1913136014} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 2.5} + m_LocalRotation: {x: 3.281661e-28, y: 1, z: -2.5243546e-29, w: -0.00000032782552} + m_LocalPosition: {x: 0, y: 0, z: 290.6} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2103680741} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -0, y: -0} + m_AnchoredPosition: {x: -4554, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1913136016 @@ -51507,7 +63813,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: studio 477 + m_text: studio 514 m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 6b791dbdd1604d14cb2431058a79037a, type: 2} m_sharedMaterial: {fileID: -3678860873926418823, guid: 6b791dbdd1604d14cb2431058a79037a, type: 2} @@ -53797,6 +66103,85 @@ GameObject: m_CorrespondingSourceObject: {fileID: 8313676601306732379, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 2086896412} m_PrefabAsset: {fileID: 0} +--- !u!1001 &2006361932 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 921835083} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalPosition.x + value: -21.12902 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalPosition.y + value: 7.55 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalPosition.z + value: -37.39493 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.w + value: -1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.x + value: -1.4242974e-14 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000000087422755 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 487478f4e1c54324b8c767e8b689f6d4, type: 2} + - target: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + propertyPath: m_Name + value: TurretArm + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 2037685376} + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 1626802769} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 1626802768} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 1626802767} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 1626802766} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} + insertIndex: -1 + addedObject: {fileID: 1626802765} + m_SourcePrefab: {fileID: 100100000, guid: cc37737c3ff5d7e42b4865d89ac84218, type: 3} --- !u!1 &2006572246 stripped GameObject: m_CorrespondingSourceObject: {fileID: 2880588319250313143, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} @@ -54103,6 +66488,70 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: 8880764824548044079, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1121960421} m_PrefabAsset: {fileID: 0} +--- !u!1001 &2032876305 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1626802764} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalPosition.x + value: -0.000000087422755 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalPosition.y + value: 0.25 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalPosition.z + value: -0.5 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.w + value: 0.00000004371138 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.x + value: -0.0000001629207 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalRotation.z + value: 0.0000000754979 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 6de578af1c253b9429e499e26a698144, type: 2} + - target: {fileID: 919132149155446097, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + propertyPath: m_Name + value: TurretBase + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + insertIndex: -1 + addedObject: {fileID: 991617176} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} --- !u!1001 &2034465663 PrefabInstance: m_ObjectHideFlags: 0 @@ -54181,11 +66630,80 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 864b654b07e5bc142b4622f196ca3b41, type: 3} m_PrefabInstance: {fileID: 2034465663} m_PrefabAsset: {fileID: 0} +--- !u!4 &2037685376 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: b7dc74f4403e254448549cb30b4423b1, type: 3} + m_PrefabInstance: {fileID: 2032876305} + m_PrefabAsset: {fileID: 0} --- !u!1 &2045190517 stripped GameObject: m_CorrespondingSourceObject: {fileID: 9004724186224534342, guid: 79fd3af9a2caf6d408aac61db7c37819, type: 3} m_PrefabInstance: {fileID: 1121960421} m_PrefabAsset: {fileID: 0} +--- !u!1001 &2045619787 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 2037685376} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalPosition.z + value: 0.3038 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.w + value: -0.8520956 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.x + value: 0.000001618705 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.y + value: 0.000002477069 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalRotation.z + value: 0.5233861 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 360 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -63.119 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 6de578af1c253b9429e499e26a698144, type: 2} + - target: {fileID: 919132149155446097, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + propertyPath: m_Name + value: TurretBarrel + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: + - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} + insertIndex: -1 + addedObject: {fileID: 457810781} + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0664dd90b57b6444abebc51ece6d0c5d, type: 3} --- !u!1 &2048655452 GameObject: m_ObjectHideFlags: 0 @@ -54566,6 +67084,58 @@ MonoBehaviour: the highest peak in Wales? (Snowdon)" bonusQuestion3: "Which is the tallest mountain in all of the UK? Its name means \u201Cvenomous mountain\u201D in Gaelic (Ben Nevis)" +--- !u!1 &2063742003 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + m_PrefabInstance: {fileID: 1710390289690672240} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2063742009 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063742003} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b6b523568f8c0d41b4050be6ebc288c, type: 3} + m_Name: + m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + _udonSharpBackingUdonBehaviour: {fileID: 2063742010} +--- !u!114 &2063742010 +MonoBehaviour: + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2063742003} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45115577ef41a5b4ca741ed302693907, type: 3} + m_Name: + m_EditorClassIdentifier: + interactTextPlacement: {fileID: 0} + interactText: Use + interactTextGO: {fileID: 0} + proximity: 2 + SynchronizePosition: 0 + AllowCollisionOwnershipTransfer: 0 + Reliable: 0 + _syncMethod: 0 + serializedProgramAsset: {fileID: 11400000, guid: 208e0b51a0b35dc40b8c32978aab7284, type: 2} + programSource: {fileID: 11400000, guid: a0767478411f08d4fa42f140c47abb64, type: 2} + serializedPublicVariablesBytesString: Ai8AAAAAATIAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAFQAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AAAAAAAYBAAAAAAAAACcBBAAAAHQAeQBwAGUAAWgAAABTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEcAZQBuAGUAcgBpAGMALgBMAGkAcwB0AGAAMQBbAFsAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4ALgBJAG4AdABlAHIAZgBhAGMAZQBzAC4ASQBVAGQAbwBuAFYAYQByAGkAYQBiAGwAZQAsACAAVgBSAEMALgBVAGQAbwBuAC4AQwBvAG0AbQBvAG4AXQBdACwAIABtAHMAYwBvAHIAbABpAGIAAQEJAAAAVgBhAHIAaQBhAGIAbABlAHMALwEAAAABaAAAAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ARwBlAG4AZQByAGkAYwAuAEwAaQBzAHQAYAAxAFsAWwBWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAEkAbgB0AGUAcgBmAGEAYwBlAHMALgBJAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlACwAIABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgBdAF0ALAAgAG0AcwBjAG8AcgBsAGkAYgABAAAABgEAAAAAAAAAAi8CAAAAAUkAAABWAFIAQwAuAFUAZABvAG4ALgBDAG8AbQBtAG8AbgAuAFUAZABvAG4AVgBhAHIAaQBhAGIAbABlAGAAMQBbAFsAUwB5AHMAdABlAG0ALgBJAG4AdAAzADIALAAgAG0AcwBjAG8AcgBsAGkAYgBdAF0ALAAgAFYAUgBDAC4AVQBkAG8AbgAuAEMAbwBtAG0AbwBuAAIAAAAGAgAAAAAAAAAnAQQAAAB0AHkAcABlAAEXAAAAUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwAsACAAbQBzAGMAbwByAGwAaQBiACcBCgAAAFMAeQBtAGIAbwBsAE4AYQBtAGUAAR8AAABfAF8AXwBVAGQAbwBuAFMAaABhAHIAcABCAGUAaABhAHYAaQBvAHUAcgBWAGUAcgBzAGkAbwBuAF8AXwBfACcBBAAAAHQAeQBwAGUAARYAAABTAHkAcwB0AGUAbQAuAEkAbgB0ADMAMgAsACAAbQBzAGMAbwByAGwAaQBiABcBBQAAAFYAYQBsAHUAZQACAAAABwUHBQcF + publicVariablesUnityEngineObjects: [] + publicVariablesSerializationDataFormat: 0 --- !u!1001 &2067310247 PrefabInstance: m_ObjectHideFlags: 0 @@ -56248,6 +68818,160 @@ MeshRenderer: m_CorrespondingSourceObject: {fileID: -7511558181221131132, guid: 2f5faf56eef0ad748ad331a95b4b2abc, type: 3} m_PrefabInstance: {fileID: 2113064813} m_PrefabAsset: {fileID: 0} +--- !u!1 &2114574443 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2114574444} + - component: {fileID: 2114574448} + - component: {fileID: 2114574447} + - component: {fileID: 2114574446} + - component: {fileID: 2114574445} + m_Layer: 0 + m_Name: Button (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2114574444 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114574443} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.0008845081} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1847534667} + m_Father: {fileID: 1364068246} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 160, y: 40} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2114574445 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114574443} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 82.85 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &2114574446 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114574443} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2114574447} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 322391581} + m_TargetAssemblyTypeName: + m_MethodName: SendCustomEvent + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: HandleSirenButton + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &2114574447 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114574443} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 2100000, guid: 35630e38b4e5ffb40b44ec5348b4333f, type: 2} + m_Color: {r: 1, g: 0.6180719, b: 0.5137255, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2114574448 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2114574443} + m_CullTransparentMesh: 1 --- !u!1 &2117243262 GameObject: m_ObjectHideFlags: 0 @@ -57489,7 +70213,13 @@ PrefabInstance: m_RemovedGameObjects: - {fileID: 9039469528340861157, guid: a4b69a2a368f99347822b1376eee0278, type: 3} m_AddedGameObjects: [] - m_AddedComponents: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 2063742009} + - targetCorrespondingSourceObject: {fileID: 8309885670462832762, guid: a4b69a2a368f99347822b1376eee0278, type: 3} + insertIndex: -1 + addedObject: {fileID: 2063742010} m_SourcePrefab: {fileID: 100100000, guid: a4b69a2a368f99347822b1376eee0278, type: 3} --- !u!114 &3231720197660963110 MonoBehaviour: @@ -57929,12 +70659,13 @@ MonoBehaviour: useAssignedLayers: 0 DynamicPrefabs: [] DynamicMaterials: + - {fileID: 2100000, guid: dd0230fc1fb9dc141a4bf63f069a8c5d, type: 2} - {fileID: 2100000, guid: 2aff5bcb44571d145a53916006e5b0fc, type: 2} - {fileID: 2100000, guid: b26dcac062b7da14fb6e50fc6b69aa77, type: 2} + - {fileID: 2100000, guid: f61de072c139b1046b4331e609b5ec8d, type: 2} - {fileID: 2100000, guid: 6e335a1ff69fc8445ae83f96fb249293, type: 2} - {fileID: 2100000, guid: 6dba0e876b8368347a4fb3f027e9b50e, type: 2} - {fileID: 2100000, guid: 9fa141bf96518154fb0b91e9f9d2831c, type: 2} - - {fileID: 2100000, guid: f61de072c139b1046b4331e609b5ec8d, type: 2} - {fileID: 2100000, guid: f06733e6df5d5584b9e5c62de0310e00, type: 2} - {fileID: -876546973899608171, guid: 5c44459d12f34ed4fa7e98f2698e61f2, type: 3} - {fileID: 2100000, guid: b9257d637744d15458654516d0135220, type: 2} @@ -57944,7 +70675,6 @@ MonoBehaviour: - {fileID: 2100000, guid: 4d93572e13ca9ce489fe617e57fe7930, type: 2} - {fileID: 2100000, guid: 156868ebaeb510e49b9e98d3432f84d8, type: 2} - {fileID: 2100000, guid: 7c5c11e2849673c43945d9ded9767ef0, type: 2} - - {fileID: 2100000, guid: dd0230fc1fb9dc141a4bf63f069a8c5d, type: 2} - {fileID: 2100000, guid: dfde93b45f020924693e2e504123dbf6, type: 2} - {fileID: 2100000, guid: f9048d49b12588b489343e8c4461d43f, type: 2} - {fileID: 2100000, guid: eb8a9840e6536604fac38ad9b70e6704, type: 2} @@ -57954,16 +70684,19 @@ MonoBehaviour: - {fileID: 2100000, guid: 04e6c9ad0e6dc494cb9dfad9e0fbc1dc, type: 2} - {fileID: 2100000, guid: 85980b42c2579134d951ee2c7bf3c7f6, type: 2} - {fileID: 2100000, guid: a5b644ad52ca8024aad424f62b5682ed, type: 2} + - {fileID: 2100000, guid: 840bcb10a024ade40964d286b99b9498, type: 2} - {fileID: 2100000, guid: 910fa54bcbdeb6e4fbbda994a76372c4, type: 2} - {fileID: 2100000, guid: 1e21ef144704e1140a5ef07064b27209, type: 2} - {fileID: 2100000, guid: 38b0ea3521603844580cb9fffc997106, type: 2} + - {fileID: 2100000, guid: 487478f4e1c54324b8c767e8b689f6d4, type: 2} + - {fileID: 2100000, guid: 6de578af1c253b9429e499e26a698144, type: 2} + - {fileID: 10308, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 2100000, guid: 40ac1972b558b66459a6c2d0d9a2785a, type: 2} - {fileID: 2100000, guid: e5e3830988904fb4e8ddda8116c9f883, type: 2} - {fileID: 2100000, guid: 53c3b33ab44d5b842ac7c8a095901308, type: 2} - {fileID: 2100000, guid: 0a7f557424e99564aadf76146dbd76f5, type: 2} - {fileID: 2100000, guid: f45e687b234af6948b76b2622ed33647, type: 2} - {fileID: 2100000, guid: d9d7a7e28039eb14f98a63d3f0943c0a, type: 2} - - {fileID: 2100000, guid: 51fd67e1cb8077d45bb1d5f36612a67f, type: 2} - {fileID: 2100000, guid: 79104b7c72559ae419b9b5c0aaf3f627, type: 2} - {fileID: 2100000, guid: 6c802bc1dd1dee24095056a5f6da8a8a, type: 2} - {fileID: 2100000, guid: 026a7c368b9c59343bc40afa213abe94, type: 2} @@ -57990,6 +70723,7 @@ MonoBehaviour: - {fileID: 2100000, guid: 37e60f16e5a8fad48bd1749b9fe09a02, type: 2} - {fileID: 6151071871934886045, guid: c7c49b161bf2ede449f099db8f5f5a20, type: 3} - {fileID: 7539852561095912346, guid: c7c49b161bf2ede449f099db8f5f5a20, type: 3} + - {fileID: 2100000, guid: 51fd67e1cb8077d45bb1d5f36612a67f, type: 2} - {fileID: 2100000, guid: b7744b7dccafd7c479db7f7db6f5e317, type: 2} - {fileID: 2100000, guid: 360a40a163e0f3347b5b14b9771d2ab5, type: 2} - {fileID: 2100000, guid: ff8623efa30a1f349a02f4ebab214ae7, type: 2} @@ -59043,6 +71777,46 @@ MonoBehaviour: ID: 237 SerializedTypeNames: - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 772508344} + ID: 238 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1626802763} + ID: 239 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 532472719} + ID: 240 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1507891008} + ID: 241 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1800930724} + ID: 242 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 940570425} + ID: 243 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1424746389} + ID: 244 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 106384047} + ID: 245 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 2063742003} + ID: 246 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour + - gameObject: {fileID: 1402950303} + ID: 247 + SerializedTypeNames: + - VRC.Udon.UdonBehaviour portraitCameraPositionOffset: {x: 0, y: 0, z: 0} portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139} PlayerPersistence: [] diff --git a/Assets/Quiz/Scripts/Door/Door.cs b/Assets/Quiz/Scripts/Door/Door.cs index 53ae830..32d038d 100644 --- a/Assets/Quiz/Scripts/Door/Door.cs +++ b/Assets/Quiz/Scripts/Door/Door.cs @@ -18,6 +18,23 @@ public class Door : UdonSharpBehaviour [SerializeField] private AudioClip doorCloseClip; [SerializeField] private AudioClip doorLockedClip; + public void Start() + { + int layer = LayerMask.NameToLayer("Walkthrough"); + + if (Networking.IsOwner(gameObject)) + { + gameObject.layer = layer; + + // Set layer for all children + Transform[] children = gameObject.GetComponentsInChildren(); + for (int i = 0; i < children.Length; i++) + { + children[i].gameObject.layer = layer; + } + } + } + private void ToggleOpen() { if (Networking.IsOwner(gameObject)) diff --git a/Assets/Quiz/Scripts/Door/DoorHandle.cs b/Assets/Quiz/Scripts/Door/DoorHandle.cs index f88ebc3..7bff325 100644 --- a/Assets/Quiz/Scripts/Door/DoorHandle.cs +++ b/Assets/Quiz/Scripts/Door/DoorHandle.cs @@ -8,6 +8,7 @@ public class DoorHandle : UdonSharpBehaviour { [SerializeField] private Door doorScript; + public override void Interact() { if (doorScript != null) diff --git a/Assets/Quiz/Scripts/Managers/PlayerManager.cs b/Assets/Quiz/Scripts/Managers/PlayerManager.cs index 9bda932..d176821 100644 --- a/Assets/Quiz/Scripts/Managers/PlayerManager.cs +++ b/Assets/Quiz/Scripts/Managers/PlayerManager.cs @@ -173,6 +173,50 @@ public class PlayerManager : UdonSharpBehaviour return "unassigned"; } + public void RandomizeAllPlayerTeams() + { + if (!Networking.IsOwner(gameObject)) return; + + float half = currentPlayerIds.Length / 2f; + int redSlots = (int)half; + int blueSlots = currentPlayerIds.Length - redSlots; + int redAssigned = 0; + int blueAssigned = 0; + + // Shuffle player IDs + int[] shuffledIds = new int[currentPlayerIds.Length]; + System.Array.Copy(currentPlayerIds, shuffledIds, currentPlayerIds.Length); + ShuffleArray(shuffledIds); + + // Assign teams based on shuffled order + for (int i = 0; i < shuffledIds.Length; i++) + { + string team = "unassigned"; + if (redAssigned < redSlots) + { + team = "red"; + redAssigned++; + } + else if (blueAssigned < blueSlots) + { + team = "blue"; + blueAssigned++; + } + SetTeam(shuffledIds[i], team); + } + } + + private void ShuffleArray(int[] array) + { + for (int i = array.Length - 1; i > 0; i--) + { + int randomIndex = UnityEngine.Random.Range(0, i + 1); + int temp = array[i]; + array[i] = array[randomIndex]; + array[randomIndex] = temp; + } + } + public string GetTeam(int playerId) { int index = GetPlayerIndex(playerId); diff --git a/Assets/Quiz/Scripts/Tablet/TabletRow.asset b/Assets/Quiz/Scripts/Tablet/TabletRow.asset index 71b2374..9ee979e 100644 --- a/Assets/Quiz/Scripts/Tablet/TabletRow.asset +++ b/Assets/Quiz/Scripts/Tablet/TabletRow.asset @@ -43,7 +43,7 @@ MonoBehaviour: Data: - Name: Entry: 12 - Data: 4 + Data: 5 - Name: Entry: 7 Data: @@ -169,25 +169,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: player + Data: playerScore - Name: $v Entry: 7 Data: 10|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: player + Data: playerScore - Name: k__BackingField - Entry: 7 - Data: 11|System.RuntimeType, mscorlib - - Name: - Entry: 1 - Data: VRC.SDKBase.VRCPlayerApi, VRCSDKBase - - Name: - Entry: 8 - Data: + Entry: 9 + Data: 7 - Name: k__BackingField Entry: 9 - Data: 11 + Data: 7 - Name: k__BackingField Entry: 7 Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib @@ -202,10 +196,16 @@ MonoBehaviour: Data: true - Name: _fieldAttributes Entry: 7 - Data: 12|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + Data: 11|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib - Name: Entry: 12 - Data: 0 + Data: 1 + - Name: + Entry: 7 + Data: 12|UnityEngine.SerializeField, UnityEngine.CoreModule + - Name: + Entry: 8 + Data: - Name: Entry: 13 Data: @@ -223,19 +223,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: backgroundImage + Data: player - Name: $v Entry: 7 Data: 13|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: backgroundImage + Data: player - Name: k__BackingField Entry: 7 Data: 14|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: UnityEngine.UI.Image, UnityEngine.UI + Data: VRC.SDKBase.VRCPlayerApi, VRCSDKBase - Name: Entry: 8 Data: @@ -272,6 +272,60 @@ MonoBehaviour: - Name: Entry: 8 Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: backgroundImage + - Name: $v + Entry: 7 + Data: 16|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: backgroundImage + - Name: k__BackingField + Entry: 7 + Data: 17|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.UI.Image, UnityEngine.UI + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 17 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 18|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: - Name: Entry: 13 Data: diff --git a/Assets/Quiz/Scripts/Tablet/TabletRow.cs b/Assets/Quiz/Scripts/Tablet/TabletRow.cs index a2f6cb7..6fe4dad 100644 --- a/Assets/Quiz/Scripts/Tablet/TabletRow.cs +++ b/Assets/Quiz/Scripts/Tablet/TabletRow.cs @@ -9,6 +9,7 @@ public class TabletRow : UdonSharpBehaviour { public PlayerManager playerManager; [SerializeField] private TMPro.TextMeshProUGUI playerName; + [SerializeField] private TMPro.TextMeshProUGUI playerScore; public VRCPlayerApi player; public Image backgroundImage; @@ -20,6 +21,13 @@ public class TabletRow : UdonSharpBehaviour playerName.text = name; } + public void SetPlayerScore(int score) + { + if (playerScore == null) return; + + playerScore.text = score.ToString(); + } + public void SetBackgroundColor(Color color) { if (backgroundImage == null) return; diff --git a/Assets/Quiz/Scripts/Tablet/TabletScoreboard.cs b/Assets/Quiz/Scripts/Tablet/TabletScoreboard.cs index 0673de4..f8a09b7 100644 --- a/Assets/Quiz/Scripts/Tablet/TabletScoreboard.cs +++ b/Assets/Quiz/Scripts/Tablet/TabletScoreboard.cs @@ -49,6 +49,8 @@ public class TabletScoreboard : Scoreboard // Set player name row.SetPlayerName(player.displayName); string teamColor = playerManager.GetTeam(player.playerId); + int score = playerManager.GetScore(player.playerId); + row.SetPlayerScore(score); row.SetBackgroundColor(teamColor == "red" ? Color.red : teamColor == "blue" ? Color.blue : Color.grey); playerRows[i] = row; diff --git a/Assets/Quiz/Scripts/UC/TurretController.asset b/Assets/Quiz/Scripts/UC/TurretController.asset new file mode 100644 index 0000000..af1cd6f --- /dev/null +++ b/Assets/Quiz/Scripts/UC/TurretController.asset @@ -0,0 +1,358 @@ +%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: c333ccfdd0cbdbc4ca30cef2dd6e6b9b, type: 3} + m_Name: TurretController + m_EditorClassIdentifier: + serializedUdonProgramAsset: {fileID: 11400000, guid: 0cb53f1275b984a4fb54157395348eb7, type: 2} + udonAssembly: + assemblyError: + sourceCsScript: {fileID: 11500000, guid: 6a52a319b79eb5245be42fbaec662d59, type: 3} + scriptVersion: 2 + compiledVersion: 2 + behaviourSyncMode: 0 + hasInteractEvent: 0 + scriptID: -5478787906906636701 + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: + - Name: fieldDefinitions + Entry: 7 + Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[UdonSharp.Compiler.FieldDefinition, + UdonSharp.Editor]], mscorlib + - Name: comparer + Entry: 7 + Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, + mscorlib]], mscorlib + - Name: + Entry: 8 + Data: + - Name: + Entry: 12 + Data: 6 + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: audioSource + - Name: $v + Entry: 7 + Data: 2|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: audioSource + - Name: k__BackingField + Entry: 7 + Data: 3|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.AudioSource, UnityEngine.AudioModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 4|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: gunLower1 + - Name: $v + Entry: 7 + Data: 5|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: gunLower1 + - Name: k__BackingField + Entry: 7 + Data: 6|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.AudioClip, UnityEngine.AudioModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: gunLower2 + - Name: $v + Entry: 7 + Data: 8|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: gunLower2 + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 9|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: GunSpinUp + - Name: $v + Entry: 7 + Data: 10|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: GunSpinUp + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 11|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: steamBlast + - Name: $v + Entry: 7 + Data: 12|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: steamBlast + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 9 + Data: 6 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 13|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: steamParticleSystem + - Name: $v + Entry: 7 + Data: 14|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: steamParticleSystem + - Name: k__BackingField + Entry: 7 + Data: 15|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.ParticleSystem, UnityEngine.ParticleSystemModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 15 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 16|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: diff --git a/Assets/Quiz/Scripts/UC/TurretController.asset.meta b/Assets/Quiz/Scripts/UC/TurretController.asset.meta new file mode 100644 index 0000000..5481267 --- /dev/null +++ b/Assets/Quiz/Scripts/UC/TurretController.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf2ab87fa81f13b408e7c2e992cdce04 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/UC/TurretController.cs b/Assets/Quiz/Scripts/UC/TurretController.cs new file mode 100644 index 0000000..920271b --- /dev/null +++ b/Assets/Quiz/Scripts/UC/TurretController.cs @@ -0,0 +1,46 @@ +using UdonSharp; +using UnityEngine; +using VRC.SDKBase; +using VRC.Udon; + +public class TurretController : UdonSharpBehaviour +{ + public AudioSource audioSource; + public AudioClip gunLower1; + public AudioClip gunLower2; + public AudioClip GunSpinUp; + public AudioClip steamBlast; + + public ParticleSystem steamParticleSystem; + + public void Start() + { + steamParticleSystem.Stop(); + } + + public void PlayGunLower1() + { + audioSource.PlayOneShot(gunLower1); + } + + public void PlayGunLower2() + { + audioSource.PlayOneShot(gunLower2); + } + + public void PlayGunSpinUp() + { + audioSource.PlayOneShot(GunSpinUp); + } + + public void PlaySteamBlast() + { + audioSource.PlayOneShot(steamBlast); + steamParticleSystem.Play(); + } + + public void StopSteamBlast() + { + steamParticleSystem.Stop(); + } +} diff --git a/Assets/Quiz/Scripts/UC/TurretController.cs.meta b/Assets/Quiz/Scripts/UC/TurretController.cs.meta new file mode 100644 index 0000000..f6cfa89 --- /dev/null +++ b/Assets/Quiz/Scripts/UC/TurretController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a52a319b79eb5245be42fbaec662d59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Scripts/UC/UCController.cs b/Assets/Quiz/Scripts/UC/UCController.cs index 2683116..50fdf2e 100644 --- a/Assets/Quiz/Scripts/UC/UCController.cs +++ b/Assets/Quiz/Scripts/UC/UCController.cs @@ -25,7 +25,7 @@ public class UCController : UdonSharpBehaviour UCQuestionListItem listItem = listItemObj.GetComponent(); if (listItem != null) { - listItem.Initialize(question); + listItem.Initialize(question, i); listItem.controller = this; } } diff --git a/Assets/Quiz/Scripts/UC/UCQuestionListItem.cs b/Assets/Quiz/Scripts/UC/UCQuestionListItem.cs index 5f921b1..d2de617 100644 --- a/Assets/Quiz/Scripts/UC/UCQuestionListItem.cs +++ b/Assets/Quiz/Scripts/UC/UCQuestionListItem.cs @@ -12,7 +12,7 @@ public class UCQuestionListItem : UdonSharpBehaviour public TMPro.TextMeshProUGUI textComponent; - public void Initialize(UCQuestion question) + public void Initialize(UCQuestion question, int index) { questionData = question; @@ -28,7 +28,7 @@ public class UCQuestionListItem : UdonSharpBehaviour if (textComponent != null && questionData != null) { - textComponent.text = questionData.mainQuestion; + textComponent.text = index.ToString() + ". " + questionData.mainQuestion; } } diff --git a/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.asset b/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.asset index 57f9b56..167bc27 100644 --- a/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.asset +++ b/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.asset @@ -43,7 +43,7 @@ MonoBehaviour: Data: - Name: Entry: 12 - Data: 1 + Data: 5 - Name: Entry: 7 Data: @@ -104,6 +104,222 @@ MonoBehaviour: - Name: Entry: 8 Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: areSirensActivated + - Name: $v + Entry: 7 + Data: 6|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: areSirensActivated + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 9 + Data: 3 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 3 + Data: 1 + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 7|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 1 + - Name: + Entry: 7 + Data: 8|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: lights + - Name: $v + Entry: 7 + Data: 9|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: lights + - Name: k__BackingField + Entry: 7 + Data: 10|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.Light[], UnityEngine.CoreModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 10 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 11|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: sirenAudioSource + - Name: $v + Entry: 7 + Data: 12|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: sirenAudioSource + - Name: k__BackingField + Entry: 7 + Data: 13|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.AudioSource, UnityEngine.AudioModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 13 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 14|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: turretAnimators + - Name: $v + Entry: 7 + Data: 15|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: turretAnimators + - Name: k__BackingField + Entry: 7 + Data: 16|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: UnityEngine.Animator[], UnityEngine.AnimationModule + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 16 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: true + - Name: _fieldAttributes + Entry: 7 + Data: 17|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: - Name: Entry: 13 Data: diff --git a/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.cs b/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.cs index 7a6db53..cb47073 100644 --- a/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.cs +++ b/Assets/Quiz/Scripts/UC/UniversallyChallengedManager.cs @@ -1,16 +1,91 @@  using UdonSharp; using UnityEngine; +using VRC.SDK3.UdonNetworkCalling; using VRC.SDKBase; using VRC.Udon; public class UniversallyChallengedManager : UdonSharpBehaviour { [UdonSynced] public bool isBuzzersEnabled = false; + [UdonSynced] public bool areSirensActivated = false; + public Light[] lights; + public AudioSource sirenAudioSource; + public Animator[] turretAnimators; + public void EnableBuzzers() { isBuzzersEnabled = true; RequestSerialization(); } + + public void HandleSirenButton() + { + areSirensActivated = !areSirensActivated; + UpdateLights(); + HandleAudio(); + RequestSerialization(); + } + + private void HandleAudio() + { + if (sirenAudioSource != null) + { + if (areSirensActivated) + { + sirenAudioSource.Play(); + } + else + { + sirenAudioSource.Stop(); + } + } + } + + private void UpdateLights() + { + for (int i = 0; i < lights.Length; i++) + { + lights[i].intensity = areSirensActivated ? 50f : 0f; + } + } + + public override void OnDeserialization() + { + UpdateLights(); + // Only sync audio if this is not the owner (owner already plays it in HandleSirenButton) + if (!Networking.IsOwner(gameObject)) + { + HandleAudio(); + } + } + + public void Update() + { + if (areSirensActivated) + { + for (int i = 0; i < lights.Length; i++) + { + lights[i].transform.rotation *= Quaternion.Euler(0, Time.deltaTime * 200f, 0); + } + } + } + + public void HandleGunButtonPress() + { + SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "ActivateGunTurrets"); + } + + [NetworkCallable] + public void ActivateGunTurrets() + { + if (turretAnimators != null) + { + for (int i = 0; i < turretAnimators.Length; i++) + { + turretAnimators[i].SetTrigger("StartGunLower"); + } + } + } } diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_AmbientOcclusion.png b/Assets/Quiz/Textures/UC/t_GunTurret_AmbientOcclusion.png new file mode 100644 index 0000000..5b0754c Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_GunTurret_AmbientOcclusion.png differ diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_AmbientOcclusion.png.meta b/Assets/Quiz/Textures/UC/t_GunTurret_AmbientOcclusion.png.meta new file mode 100644 index 0000000..d14e5af --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_GunTurret_AmbientOcclusion.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 9f84994a45601c2419691869458f1207 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_BaseColor.png b/Assets/Quiz/Textures/UC/t_GunTurret_BaseColor.png new file mode 100644 index 0000000..86aa538 Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_GunTurret_BaseColor.png differ diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_BaseColor.png.meta b/Assets/Quiz/Textures/UC/t_GunTurret_BaseColor.png.meta new file mode 100644 index 0000000..bfa9e0d --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_GunTurret_BaseColor.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 245d598d0afeeec4abe88c9a2b31a95b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_MetallicSmoothnessMaps.png b/Assets/Quiz/Textures/UC/t_GunTurret_MetallicSmoothnessMaps.png new file mode 100644 index 0000000..322731c Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_GunTurret_MetallicSmoothnessMaps.png differ diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_MetallicSmoothnessMaps.png.meta b/Assets/Quiz/Textures/UC/t_GunTurret_MetallicSmoothnessMaps.png.meta new file mode 100644 index 0000000..fb16458 --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_GunTurret_MetallicSmoothnessMaps.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: e8291f76219d1c147bfbddcacb64d704 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_NormalMap.png b/Assets/Quiz/Textures/UC/t_GunTurret_NormalMap.png new file mode 100644 index 0000000..1fdd5c2 Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_GunTurret_NormalMap.png differ diff --git a/Assets/Quiz/Textures/UC/t_GunTurret_NormalMap.png.meta b/Assets/Quiz/Textures/UC/t_GunTurret_NormalMap.png.meta new file mode 100644 index 0000000..19feedf --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_GunTurret_NormalMap.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: f91deecf74361794e90d0a3e3371bb31 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_AmbientOcclusion.png b/Assets/Quiz/Textures/UC/t_TurretArm_AmbientOcclusion.png new file mode 100644 index 0000000..bca101f Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_TurretArm_AmbientOcclusion.png differ diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_AmbientOcclusion.png.meta b/Assets/Quiz/Textures/UC/t_TurretArm_AmbientOcclusion.png.meta new file mode 100644 index 0000000..f74f1d8 --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_TurretArm_AmbientOcclusion.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 516526b3f3ac61b49aae5ef6fa9f2d2c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_BaseColor.png b/Assets/Quiz/Textures/UC/t_TurretArm_BaseColor.png new file mode 100644 index 0000000..337be34 Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_TurretArm_BaseColor.png differ diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_BaseColor.png.meta b/Assets/Quiz/Textures/UC/t_TurretArm_BaseColor.png.meta new file mode 100644 index 0000000..7cab2d0 --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_TurretArm_BaseColor.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: d8154662965aecb4e9b1228056ecc22f +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_MetallicSmoothnessMaps.png b/Assets/Quiz/Textures/UC/t_TurretArm_MetallicSmoothnessMaps.png new file mode 100644 index 0000000..a76890a Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_TurretArm_MetallicSmoothnessMaps.png differ diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_MetallicSmoothnessMaps.png.meta b/Assets/Quiz/Textures/UC/t_TurretArm_MetallicSmoothnessMaps.png.meta new file mode 100644 index 0000000..cc02d6d --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_TurretArm_MetallicSmoothnessMaps.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 6f5dacfa607fc25409fa478ed20223d0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_NormalMap.png b/Assets/Quiz/Textures/UC/t_TurretArm_NormalMap.png new file mode 100644 index 0000000..e466e47 Binary files /dev/null and b/Assets/Quiz/Textures/UC/t_TurretArm_NormalMap.png differ diff --git a/Assets/Quiz/Textures/UC/t_TurretArm_NormalMap.png.meta b/Assets/Quiz/Textures/UC/t_TurretArm_NormalMap.png.meta new file mode 100644 index 0000000..fee516d --- /dev/null +++ b/Assets/Quiz/Textures/UC/t_TurretArm_NormalMap.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 44e07cad3ef7a3847bf7cfa758ff14d7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/smoke.png b/Assets/Quiz/Textures/smoke.png new file mode 100644 index 0000000..c9ba3b5 Binary files /dev/null and b/Assets/Quiz/Textures/smoke.png differ diff --git a/Assets/Quiz/Textures/smoke.png.meta b/Assets/Quiz/Textures/smoke.png.meta new file mode 100644 index 0000000..e323150 --- /dev/null +++ b/Assets/Quiz/Textures/smoke.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 9c095b11d0f14754c936d705717c4db9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/t_WarningLight_AmbientOcclusion.png b/Assets/Quiz/Textures/t_WarningLight_AmbientOcclusion.png new file mode 100644 index 0000000..3eef057 Binary files /dev/null and b/Assets/Quiz/Textures/t_WarningLight_AmbientOcclusion.png differ diff --git a/Assets/Quiz/Textures/t_WarningLight_AmbientOcclusion.png.meta b/Assets/Quiz/Textures/t_WarningLight_AmbientOcclusion.png.meta new file mode 100644 index 0000000..43e60a7 --- /dev/null +++ b/Assets/Quiz/Textures/t_WarningLight_AmbientOcclusion.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 544f60ae72ba4544f8d1c01f34ceb00e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/t_WarningLight_BaseColor.png b/Assets/Quiz/Textures/t_WarningLight_BaseColor.png new file mode 100644 index 0000000..a4cfdb1 Binary files /dev/null and b/Assets/Quiz/Textures/t_WarningLight_BaseColor.png differ diff --git a/Assets/Quiz/Textures/t_WarningLight_BaseColor.png.meta b/Assets/Quiz/Textures/t_WarningLight_BaseColor.png.meta new file mode 100644 index 0000000..e7a071a --- /dev/null +++ b/Assets/Quiz/Textures/t_WarningLight_BaseColor.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 1364651b6d5b1164983190585596fdba +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/t_WarningLight_EmissionMap.png b/Assets/Quiz/Textures/t_WarningLight_EmissionMap.png new file mode 100644 index 0000000..c9ee398 Binary files /dev/null and b/Assets/Quiz/Textures/t_WarningLight_EmissionMap.png differ diff --git a/Assets/Quiz/Textures/t_WarningLight_EmissionMap.png.meta b/Assets/Quiz/Textures/t_WarningLight_EmissionMap.png.meta new file mode 100644 index 0000000..1a35869 --- /dev/null +++ b/Assets/Quiz/Textures/t_WarningLight_EmissionMap.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 5f94dafd1236b6b44918aa258a3bf0a7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/t_WarningLight_MetallicSmoothnessMaps.png b/Assets/Quiz/Textures/t_WarningLight_MetallicSmoothnessMaps.png new file mode 100644 index 0000000..5d9fa2f Binary files /dev/null and b/Assets/Quiz/Textures/t_WarningLight_MetallicSmoothnessMaps.png differ diff --git a/Assets/Quiz/Textures/t_WarningLight_MetallicSmoothnessMaps.png.meta b/Assets/Quiz/Textures/t_WarningLight_MetallicSmoothnessMaps.png.meta new file mode 100644 index 0000000..a177ba0 --- /dev/null +++ b/Assets/Quiz/Textures/t_WarningLight_MetallicSmoothnessMaps.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: f808388bc4582d649a96e42f3277deb5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Quiz/Textures/t_WarningLight_NormalMap.png b/Assets/Quiz/Textures/t_WarningLight_NormalMap.png new file mode 100644 index 0000000..e72679e Binary files /dev/null and b/Assets/Quiz/Textures/t_WarningLight_NormalMap.png differ diff --git a/Assets/Quiz/Textures/t_WarningLight_NormalMap.png.meta b/Assets/Quiz/Textures/t_WarningLight_NormalMap.png.meta new file mode 100644 index 0000000..0f4a75e --- /dev/null +++ b/Assets/Quiz/Textures/t_WarningLight_NormalMap.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: c1e5d23b508aa30488c8840686833e53 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset b/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset index 793f3c4..4bc6427 100644 --- a/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset +++ b/Assets/SerializedUdonPrograms/05a95d053eb5ae345935fb8b2441f352.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15c5d6c02740200142874068a147451202227621b4284d20a8a0424802440244128abd2bf65edfd367177befbdf7de7b57ecf5d9cbb7333b937b76ee9cbdbbd97b36bbf95ef891cdb6b3e7fce74c3b333bdba290593f19c3ad5f73d92c56c246b03256c956b215d65f25d676b9f5cfde53c767b255d67689f5bbdc3a379ce5a7b893ff0ccbe869fd2eb5f6ea58bd75e76a56616dabc5f9d9accafabbd4bab7cadae347175bffabacab325a593795b1096c069bce7233baa7103157dc54278f6570bb32b2acdfe3d9bed6d92aa1147f48a138956bfd9a6d9da913e7965b4aabebe6b33d8559cbad7315d63dab588d2573919098757701137f307bd3456ebb5aff33adffa3e57e0beb7f36bf5efe0daf6d6bfde796ede6726d37706db6fcbbbb7cc6d91e9ed15a6e7bc8ed21f6b10c06f6b90e1be57eae765f3b797d86dcef29b7ede5f116daf11c79bca576bc0372bc2372bc9376bc97dc1e06381ca6dd73a8bca715d8b7fe6e71b526e370795d26d019ca53e75b6bf71d218fb70136c1fb8e40ee3b52bbafa376df91c87d4769f775d2ee3b4abb4f1dcf03fbfc7c96ed2f19f5f2b862aa7865837d8b5756a5dc571cd76bd7ad97dba3e5f1b660dfbaa7651ffb792d2bb5e71d03d24ec93e161c3b061c83f2db39e5673e2ff77bcbedf140465f8d613f29a3bda64b7f701d3f9fa39dcf07b24de707c86d1fe4fc40a08fe9fc20795cf9d060b93d01d832d4a72d79296c3921852d4352d832d4a32d27cafd8eda75c3b4f3ba9c02b9ed819cdf447b8e3abea9dc9e24cf7702fb7c7b1c60caffe63ef4b8dcdf8c095f6d77b2bdcd52e9b039487f75ef8834a7472adf4a951e233ca64721487f654b510a5b54fec4f2893a9f0f649bce63f9449d57b61421e753f996ba0ef32d751ef32d755ef72d75bc11bed5e0432359c2b7f87e3ba083ba1ed6c5ea7e556e16dbf70fad91fb6ef57ca67d6fdb4b34fd4f96cfe80cf6ad73d9a7cbfd51727b2a4b2e9b87816b28989eae31553a9d02743945ea7bbcdc1fcd9c7a8f91d75af6b73fc4de363068096440065266db5a17067a99a5334857998531380de8721acea5c1d62d5370f1ea3f3fc9fdade476acdc6e9390d771470ff2b6955bd576f1abcf76dafd7e9fbfbddc9ec19ce5c5192efa6c21b7c30167d333dc9eab743b537bee992e766c2db73b0478ee38e6ec778c91dbb398b3ed76969dceedef97b6ab76ff78c0c04d0725f76c29b70bd8b7e4e6f4b4e5e6a832ac44bbcf64bfdf679f239fdd55eeab3aec5c70ffb972abf6ff25efe906f62d7d3b2c94fb59da7dff96d77707fbead97c7b9e3cdf03ec7379633539a96c52d7e5817dd066cf517547b6765d36b80eeaafae538c547f6e82c66a22b856719d94489b7c55de4e96db52b99d92b8a6ff58ed99a96c75f3df9d98d37fb791dbf399d37fcfb739773cc4bebee306797c6796c84b6e3a28b9ff61661fba00dc7f8166df85cce94317daba747e5b4b0375df45cce943178167f3edc5cce943174b793723697a89264f7f9e3a9fabdda7fb8cea2f4fd5ce439f509c4c3e31cd834fe8ec2e95cfee05f6b9ad4ae674b99d25b733c0bd6a3bd39036bb249e3d50f54b55faa4f20525230fec83bcd7f165e6cfb7dcfc5b4f8bd9cc997ffdca2b634ebfbd8c39631f97d97cbb6cb06de9f2b8765fb6765f9ef33e9e2dc4fe5cb99d93c2f62c4dfee5cce9ab97cbad2aeb3730a7ef6f90cf5de7f3b99783ebb8bcde2ed7baf15431b82b98b3bcb942eaf59dcdb19bca3bca8e5d53e8a7e45ec9cce5cd55e0feabb4b4b99a39cb9bab6d5dbaabfd2cedbe6b34e6d78067f3edb51af36b6d79ddbed2e4a4b2495d9707f641bee9a6ea1aaf8cdcd265bedcce033c657eef7a3f900f9fb73b73fab4df672ed0ecbb8e39e370d76969b81773f69dd5f185c0ee3de4b61c1cdb536e1781634a7645c2ce9e5ee2bc4b349dafd774be5ed36db1a6b3ba0feaacda7050e72a83ce4ab65f9df766cebc7e0390a9ea16a8cf52833ed5067d6e68a43e2bb567dfa831bc5163b85c63a8ce2b962bb4f3aa6e83362d33d8a4fafbd02625dbaf4de5727b3373966baa8d711373c670f9be5526f47cdf7e46af4e4017bebd4593738bbb9c5e6ee320b5ccd9e6535c9f05762b760be5f676e62ce39e05c7f9f65ee6ac07efb5f5c83b40eee768f26e95d7f701fb50ee73daf9e7e4f679a0a362fc0238f63c38c6b78f30672cfb11a9d71c173e4a873cb00fcad95eaa6ed9c7a76d7506ddebc1b13572bb1a1c53b26f03c7609a489f1c325c1e5b25b77780eb6fd3d2ea0ee61cbf582bb71d34f9776a76dc69b043f927b443b525a01d4af65d063bee76b1e31e70fd5de07a750eda51c19cbe980df6ad34ef53a35d779fbcae2fd887e9aee4f473cae9abcae77de556c51a943df76bdcd4f3543e7b409eef0faed7b93ee091ab7af68306ae0fb9707d185cff20b85e9d33715579291bec731e0f6bd73daa717d546e4b3539fd9c72faa974dd0fe1fa18c255a5d7e31ad7c70c5c557bdc2bd7270c5c9f74e1fa14b8fe0970bd3a07b9ea65ecd3cc59c63eadd9f70c73f65df4fbd579d50f75ab9f942fbec892cbfc2972fb92a6cf8be038dfbecc9c65fecb763ae6abf86e8e26ef552dfd5ed5e4bea69d7f4d6e5f61c9e58892f9ba76cfeb9acc37349f78453bde41bb3e0fec8332bfbfeab37b61faa681e944b97d4b63fa2638ceb76f6b4cdfb6990e5465578e26ef5dcdfe7735b9ef69e7df93db7758b2af2b99ef6bf7bc2fb71f3067feffc0d66dc057889c0f35391f6aba7da4a5cd3be038df4e62ced87e074dfec79afc8f35f99f20f2d5f10edaf579601fa47dfe053ed2fe5343dacf90dbcfb4b4ff141ce7db8d5ada6fb4f90e516dc11c4dde179afd5f6872bfd4ce7f29b79f1bd25ec9fc4abb47a5edd75ada7f6deb36682322e71b4dce379a6edf6a69f33938ceb733b5b4efa4c9ff4e93ff9ddc7eafe9f9bdade76015cfd5f5fc4193f383a6e78f889e3fcaed2ecceca34afe4f9afc9f34f9ff45e4abe31db4ebf3c03ef0d1812a4eeec5477f01e95f27b7bf6adc7eb5b90dd9a85df70b73d6edbf687afd06f4e2fbabc171befd599ecfd7e4feacc91f60db3554979387c851f7d76b72066ae75701dbfdc627f6973add2ff755dfe640b9557d8c83e4b3077990a9c646954ebf33670ce5773b1d86a9faae17b84f8fd3aa737f3367bce96f4d865b1c51e9f3077396557fc8ed9fcc19ef5331dabf801efa18aeba27dd63b8ff30e718ee3fc0de6ce6b0bd60ac9d7605aa6d7230d08d6fddc607a16d7f4979eba53c350ea2b8e5817d34ce9c9921caf829accaea07d6b2429108dc5aaf5340d59da9277f72d1adf92ffe334c3cb6deeab8d45a020c3330cbc4fcce7a368a151b6760f6123115f5f412f1bbdcbaa25a081d9c91f4883b921ec195abb1fe5581e9a375d6f1c962f6299f405a6d9d19c1a65a5b7ed7423692cdb7fe39a5ccb51e5b63150a556c8ef5bb56c85b68a99d7c652a93f85453fd9e59964c7b26ec72eb88025a6bedd7080d678bdf6b84a65542fb52eb58bd9897bb822d61e3aded3af1b464db57597f9b9e39472233eb689e108b1db7a7ddaa649a6059c3b52f14f9e77f29d21429c2d1b7e6f983ffb42a142dbc639352e27f0ced428607274ba58c91025986e358312b147388672511f46f63b28566ffb6798f61a35d6d3193e1c9dd5b589048e145395b4cbff2ded77ec8749a368a158af0409f14a6b981e5f20a44edefc784cccc56455c511d7f8609bf08cdcf0e11bf7d5db5b8ce7f02b416959f3301c4f0de1ceb8f75d6ff1aebe279428d2a364ddcbc48beccb0d4125fcb9252a9888b6c23402757a3a994c550b730a1ce0a1b75eab2c50d7556835d09d4fcc74c301b21984a078c604b1341d176db83946072234cfd35deba77a945628da859575bf79b1a6dee4cf9e0cee61a5333cf768267beb129e94f238c702b03e1224eb8bd49c96c4d49ae1f2238d3947462586b4e88cecfcfad1452caad6bfdbb3fefc36ca6bbbf39ad3a88b4ea99645c6a15b0b4696d42d82efca2da2ef96a52d4fb66803c40d3df73f9d1092d81dd75c008b631111471bc85a1941fb3add6faced6b972ebfa2ad122e4c7675a12cbad677379e3c4131239d679873bdbce9ecb912e82eb60508e04d50c239e65229e1376b64fd436d8cb87ee64bb365891205b28e216c9f93bf5b378cb44bc8dd08afdef276a3f99e61cc30365a6d23c756a633943345bf49c21e2d7e1f77b1ad716e45d905c2d57fc63fd9809e632b76e8bdf96605b03bd227e902751720dad375478de4524b73349e60779fcd55875e9c23be1c2db9b84f3e29007165336afbae382734cde2422a765217ad30c2bc5f66676a4a971256d6f1307a33ff511fed42bc93a2f3a605ed5c1943c9c625f2fc9d3074f9e8e98e07e010577c204f70f28b8b349303723df90eb8dd9201717dec5249c371506b0e4eea5285274e1d9b8f0ae98f08106e13d4d9abb08ef86953b830ce54e869f72a73ba6f66083da07f854bb0756a80d4943a1968b091f6a147ec80e7e84f7c4fc7098c10f5bf9f4c35e98f0823438791e267c1383f00c9fc27b1b84178a3c7b280b3712621ec29a2c562fa97294c6eab9761c8e6ba4c6306659dbc5420b7e9c6b917ae8cbbd1ed994195aeca2d899c8bc0fc4d15bc15f946f2bc226e65a8e4f402b8898ce58edd9c7e4f0bccbcddffa4f8acff2627a81a387394744559758fff8de44a127ff2b295fb4c1f3455f53be10354298ed2018216e5c3b6884c97f45e593dce2f1f234be58416b3940c546b441bcad8899db545e9e8079453fcc2b469abc825790b5c027265afc6d8f1d67ed2df1e50bfdb127179b9edc5df8e3028bc1026b573d95f74ef8a246ebc4393e1c6eafcbe4478f7c4c8f51263dba003d968a1861a5f4c7c66b3000d360b449836e4612d365b9d2782d06625a6c61d2a223d0a25ca47d5d80670fc29e3dc6f4ec1cf0ec05a28c5c2247c7fd9647834dcfe5f5f496860c5ec4d37e6ca246d09f331c7fce10ccbead701f732b7bd789491f7e2c1d6ad28097bc5b9b2ce53eb68d5e26e94f2bc29f360cb3775b93bd9d657a8e12fe93b0baf1fe54803d7f3bb7e7737fe2cfaab4e8ae0ee4cf9b60cfdfdef4fc5e0e7f86e93ed32ac1eb445adb33437879a7464afde8b329a6cf0e267d063af4f1abd70241b1caa77f6e66d290f7af7664c9fdabc733fdf5af869b84f3126c1c0bde91d81c2b43c663654849a3ca9011a6e7f01c3c01cbc11303e4e042ccaa499855931b65551166d514ccaad200568dc4bc6c2783970dcef2e765c598f09d0dc22b7d0a1f6512cee395fcdd889491a42eb8e0d198d6d30c5a1f9fed4feb2db08c373d0d196f0c86644640245b6248661a905cd2d61f92b198d6bb04d47a2b4ceb5906ad7ff2a9f5d626e13cb0c6c7b60305f4b7c178cc09c8635b8c479981c7e876fe786c87099f6b105eef53f8f698f05d0dc21ff6297c072c25770b9a923b626aef6e507bdbf6fed41e87099f67107eb24fe1e34dc2793135df504c1903de2ec55409a6f91e262c39fe349f8009dfd320fcf50efe844fc4b0ec65c0c27ffc60996412cef3fd8280f97e328664a101c99f3e914cc19094a7014929267c9141780b9fc277c2b05418b0ccece80fcbce58a15219b450998aa95d6550fbab4efed49e86095f6c10dea9b33fe1d331e14b0cc28ff7297c06e62a4bd3e0873331e1d56910be0b267cef34089f85095f6610ded2a7f0d998f09a34683ec7249c17877cbd9520c56119a6f58a34683dd720bc500c958639e7118ea5f88fe5af340136c6dff9eb6ba6f98ea99e8fc5de77c592669f3424cd6e9843ad0ae850bb9b04f3b29ebf4d1aa8ac9f87a95c1f50e5f926c1bc285ecd928be203bafb2b8af730e50131a25f4d9a07caac63d58cbfec37519cad16d1b71186d144ee936e57f35c308df1cf43ac167ab8e797359ef3cb5a915f787c8c4e572c6fed694a721e7f5ce7c5975c02957b6182f70d287801e6a4fb199cb4b2873f275d881535fba7a1a8293709e739e0002f48d6e2821761ac0f0cc8bac22498471d0ff222d825c05889a13838208a2a0cc52101512cc6041f1a50f012cc9f0f33f873cf5c7ffebc14e37c7840ced5188e2302e2d81bc371a401c7069f389661388e0a88a306c37174401ccb31c1eb030a5e81093e26a0e09558021e6b48c0037afa4bc05a4cf87106e1137af913be0f26fc7883f04ebdfd095f65105e28e61c8639519e4f3f59258627fd77004e303986b141c3bfb3619a24effe74ac8952674a164eee242f9e7a229e24f526c1bc5776b217c1b5b8e0d5a6b4165340770931adbdbcd66e4ee9533ca7f4a922a5bb2759e5fae637426d8d29393835f1b90b4d1d5116eb49722a9e246bb1bc7dba216fbfee336fafc3343fc3a0791b9f9aef8b697ea641f3a2befe34df0f137e9641f8fa7efe84ef8f093fdb54130cf527fc0093703ef07e4ec3096de09d7f3dc1ffc0fb81a6e7f034e41f89489a12c2137d012b6d98f4b9429c2ab1da613cecb1ccfcdabe8fcaf52053c922e67faf202d59524ddbe51dd0d522a78f00931de788672796180832159aaf1dd6d7d001e33fe6b2e93c513615b3d4938ed3a13d56aa1d8c6582f30d99608f027f99e01093701e63e25f910814633a14937c4150c9879924f32ef6852c7817fb7053fe10af302c23cd1fde03376ae271fa024dfccb21de6aeb8b458ee0539668f5c5f2c211a6a4e7e1844b4c26f808271c8909be34a0e0a330c19705147c3496bf2e0f9abfd663923704957c8c2973895778163749e6d2c713d297a5aef09ca5ae14596a53972c15444b2c231d6b4a639e12577971cb2bf1243e0e739eab833acff126c9bc8b788d17955d422f276082af0d28f84493603ecc729d17c12ec32c279904f33ed4f55e04bbf43b4fc652ef86a0a9770a26f9c6a0924fc528df1490f26998ca370755f9742cfd6e09987e67602c6e0dc8e24c4cf06d01059f8541be3d28e4b331c97704957c8e49326f80f24f47046d809e8b09bf2b0dc2ff8531b93b28937f636adf9306b5cfc3d4be37a8dae76392ef0b2af93f1890fbd300e4024cf80369107e21c6e4c1a04c2ec2d47e280d6a5f8ca9fd7050b52fc1d47e240d6a5f8aa9fd6850b52fc3243f1654f2e51890c7d3006403a6f61341d5be0293fc6450c95762409e4a0390ab30e14fa741f8d51893678232b90653fbd934a87d2da6f67341d5bece249977d8f937b78274d8afc704bf1050f00d98e017030abe1113fc5240c13761a9f772d0d4bb1993fc4a50c9b760925f0d2af95693641e727ccd0be68b71c1b79904f335665ef722d86551a4dbb1acfd461ab2f61d188e3703e2b81373e7b702baf35d18e7b70372be1be3fc4e1a38df83e17837208e7bb19cf25ed09c721fc6e3fd34f0b81fe3f141401e0f9804f321ba0fbd087619cb7b10f3bb8f02fadd4318e78fd3c0f9618cf32701393f82f9dda741fdee518cc76769e0f118c66363401e8f637ef77940bf7b02f3bb2f02fadd9318e72fd3c0f9298cf35701393f8d69fd751ab47e0613fe4d1a843f8b09ff360dc29f3309e761f5efbcf07609ab3f6f12ccc72ebef722d865ece2054cf00f0105bf8871fe310d9c5fc284ff9406e12f9b84f332957fb92d5099fa8a49329fa9f0b317d82e2becbf6a12ccdb8fbf7811ecd27e7c0d73e85f033af4eb26c1bc64facd8b609792e90d93605eb0ffee45b04b0df026e6737fa4c1e7dec284ff9906e16f630efd5750877e0773e8bf033af4bb9843ff13d0a1dfc31c9a2fc319c4a1dfc71c3ac38b601787fe004bbd16190153ef434ce5960155fe08cb83adbc0876c9831f631a6706d4f8134ce3d60135fe14cbd86d328267eccf30e1596910be11f3bbeca07ef739566ab4f502dba5d4f8022b35da7911ec526a7c89951aed03961a5f610e9d13d0a1bfc652af43d0d4fb0653b9634095bfc5f260a78079f03b4ce3ce0135fe1e83dc2528e41f3095bb0654f9470c72b780907fc234ee1e50e3ff621af708a8f1cf26c1bc40ccf522d8e515995f4c8279b1dc330dc5f2af98cff50aea73bf616ae7a541eddf31b57b0755fb0f4ced3e6950fb4f93703e07a8af171f719903f417c6a35f501e7f6392fb0795fc8f49329fc295ef0586cb142edef63666f1011986d745f81a4c70062afc22d808b142e84aeb610bd8643133b45c5cc557b9b55754e6e7b1bbddce38cf39bfe4e6a7d4c9c06c1d68b2b5c4a3ad13ace36bc43ac5f69aa9e9b1129ef363630bccc641261bc7683626be0a9478f5d1b695cf065e29d7ee35df819f49c8f263494bcc92c1264bc66a96c059ccc16d314bf3634d2bcc9a21266bc6a1e9023d6f2ae333d1ebd0fc05edf16667e3f3562666df50937d7cb935f3bcf2e4173a1a977afea5fbb1b63566ed3093b5dbf9f04dfe9e41bde7948492f47be65a5656b34a5f76b5c1ec2af092e7e0f70a82e739b3343fd66461d66c62b266074f796e9c45b412ac901d3ccf25cef8b12d1bb36d53936d5b8bdde4ef4796093b6aa43df67b2d0bc40ba175f276ee416ea561fa4a90b698459b992cda5e4b2de773618a9589975a5759d74e67fc8b02e568da3965a4cfb2769865c34d96cd46cb46c81d5a3891ed63dd5a2ed3715f97f2cf99725eae491783f61883cdbd94986e258bbf12134a4a47899983d935c2645755433e542fe5c2577213af612fb66eb1df332b6db832f1a2ef2c913a55a2ddc9af861c668a77d296c86f1bcc159e5f6dfd5e84b432210dca9aa503c6a9d0c4a98c9813ffba4b095b2d2ce27213f7b8130acea123c6a1082be54ce5f67491d66b458dba4c6a675bb744e686a9d6b90a21087edf815f6192877d77d88f659d30cb469a2c9b4798c29303e7043c2ff821d21923528cb5f9fd95fba5a22d5b23de49ad96be1b6699de05b36f94c9be42c49731dff3d21269bcee5d31dd479b742f6e94ee2a2fc26fdf941aac685c0bb01b66c116588fcb7f8f7286f82a916a5d3465ffb23b66ed1893b545a8b57aeb6172cad6433ad2aa07a6fd968deffd9b5a7d4d953ab9987d634df66de33975fcb5ed70cb1a5353f7c46cdaca64d3784f6936dbba7891a869ca4559dcb47dc85e98855b7b89879a2d2c15f54d743c330fb3711b938d133cd9e82dba1da695bd312bb73559b973a36a33d5aa4a9c1d6f6dddeb33caf6661fcce6edb01adc6b0cce6f9dd0d8f6615fcc82ed4d160cd12cd0b54eb4fcab44cbafdef2cbf49413fd303d77c0bcabb179283aed8dfe98cd3b7af12eb778855fef82b2fc58908f5930ce4b9b43d7ba04a417d7955fc799f2de97aeb15a4cd1ab858d8bee0ec0ec1befa5f64ab68ffb65725d95b8cedbf1f4b64106623696986cdc36858d766b2a71837b5c97ceaa419855134c569dc89a2a1634c1daaa1aaa525c5b21a456b2ba14f1037c9417b724b1a89f79493f7fe4db58ff3232f8843dfb8bde3cfe3d53dcc1f7ea58a1f86c785103dbd45f38e7cfe64b41f2f2744e431c25f5428313ad446dcdbf6ac47f86657087a8970584611dae1221bf467aa1dd3ee6a3129305912ac1b8c2da9fcaec2f037b5df0d1e4272380a740ebbc2ffda82f159b91d1465aa46459a4c5c7d19b9ba59378aa7695a9daa2507c6e7cb3467a536a2d26f3a7b534fb50f2775b605e34e96e0b505fd6cef0fa59e694cf4df5bd98cd8500553ba61457068a5d93b85ec2d9ec01c955cc0edc4cb1727c9bcc16453c3da65042b3bf13ced30682db499630bcbc8c03ae7559095ca594b83a30f8e9655b09082e16b0da2760ed4409ab2773fb0e7ca25553663daf52b649e300f0eedc04c09de94bb459e2e695a231611e0e8a033406bc6e2a7d89663f3cbeb8d6830a601a25aece499954f95adc908ded9840369d12598eb1cee4f19ac531695edcde36816a0625aa5eae55409cbd6d5d8f04c2999408bb3a109608bfe3319b6ad1cf881bb699dd13d876a1c4d65a60b3c35bab62922df98f82332b3c9f4a1e112815d1912aabc314076cb7774d609b4d89ad9dc0365164bcd5e2f1a5729a461c300d07de3587beddefef6324710058393401b08c12a0fd9975982179b16f2f6c1f07503dbb2440cd0daf3b9e5c8ec501d652006b57fa42df2d3ea6326c1cb065810ed26e94d8fa32b726aca92c2b91a3a04bbcd81e0194c3413c63774a943d5c51c6339af6b068d0b6c9d4844f4a12ded871027fc4f1110d1e17e121f05a7194cbabd44738fa5b97444ef3797084a220a95d5fe0d22a2bf010de2e48d19d2ff0516e16781e8328f010a62af01cff2b4819972ef018e729706d7be8cf49ae700b7c742df46bddbab605becb8e8246c61e0a0216f8058d0a7b1734aad19c181c360fea16f1c1e1f9ffcfc76df9a729d91e1c027f479effd835dd9e610c7dd8c3f42b580d739bd0b4c082384ad7a14f920ece6f5bb97dea34db51ef75f0626063eabe0b59a2e1b057947016c712e72d00e78228e11c154b9cbf039c0bc3c0b904050ad5e7997d0c1dce6c2a9c3b019ce551c2591c4b9cfb009c8bc2e87461309d9eb9051dca5c2a94bf01941594283bb144cbaebaa11dcb8fd48ade08bf2c7ef8ca00becaa6f444288efb2219ca3654281f0728ab28517693282b64035d9fe89b98ba4d88f1542a8ceb00c6c561c58fcb45c72ca4cc7c2215ba3a806e0925ba3c067bb9a9e20afc1c573169fc2206edc8ad01d2a5f4d3bd78737b810c2854b29a067c2178e55a2a84cb00c2eaa6ac629caf4614d1a1aca542791240b9771855cc48eb7f55c39b0cea74481e49565357018ccb2831f661a97a3350207c1d89b0e62ea2c23a1460ad0923a3630d20675b9230a39379681f807239f5ac166775c3bd7089a52a19b43e54d03a01682b9a021a61a62583d611405bd9b49916be624798693b51a1ec0150d68651adf8af5408233c64d5ca8700eb3e518a8c938672c97a3497019caba2849334944b86f36580b38e7a065785eb88f02cf36b543128395b0388f59410bb4b9facb12ee2feb8b74b3c9cb00a220be77e0a40ae8ecec002616b920ce54b00e51aead6a47d839a28348fd96b5b93416b4705ad1580b6368c00c5a86619a0a80118d75162e413be9c3d1974b279fab075a7c2d61e60db37acf0185c18d2ee06c6ddfb16038cfb5162cc65fe06fbb78ae150ff7600e6fe518239368630b705300f88124cc27e3519ccd100e6815182393a86308b01cc83a20473cb18c2dc0ac03c384a30e338d76c4b00f39028c1248c9693c1ec0e601e1a259884c10a32985d01ccc3a2049370c23319cc9100e6e151824918fb2183b9198079441830b141313d464e98cdc922e4dd00cc23a30493b0022283b93380791425cc2ca64786ea6238ba9d03701d1d9d292984dd45b2a8d04080727d1828d5188dfdcd187c70217e430bff01288fa144d98f258fd278fda8266933886cb2e96b00edb1618c6e7befedc4b1555902701e17259ca42f7992e1dc1be03c9e12676fcf19df39299a10ea9554505f00504f882254c21e1019d4e701d413a30895b0de27837a2c807a5214a112762fc9a01e03a09edc94535e9c4d7cc250315913ff4780f2144a948398b3896fafe7a33e7ee4fcbc86da8eb7cef20ee91a562da628aca2f557b229329f03c8a7366538c4e9afa493b4c83cf64000f3b428c18ce34b279b0098a74709661cdf06df14c03c8312664796781757490d690612d93be0ab01bc3329e1e51bea743fdf3a24ad82ba50e13d11e03d8b126f8ec4cb1fbc58d6f4b66c1ed423039749058e0170678751423a5fb04f5ee82e8457ebc9a2a05b0098e750c26cfceb52844d22b2d7a59e0258cf6dca218ff84f50e80250fe2bba717a42b46471fae301da7f871158c6327ff2a0701c8785cf0338cf8b12cee258e2bc09e03c3f4a3847c512e7f700e77fa2348a343296738d27009c17440967712c71ae04382f0ca3c1c41bf33c535782f5b09bc79b43cb01ca8ba2138b271cd52443f911407931254ab5e2b98ac5af1262ec55dcf48937cd613ae25f00ec254de9a3a10d12932d47f60f407969183d78ffeb6811667db21e7c11c07a5918589d51a612867f8a21ce4b39ee0eb05e4e89557d6d631473be1d1c52ed4e16369e07006e68cac892b3768fe3b8657f80f20a4a94ea3b28aa76af60eaf5fee6b5f0c92f00e895614fadc16a755811c57141bd0701d4aba20895b0762783fa04807a7514a112667f32a8b701a8d744116a1c9786bc0b40bd360ca8c9cb889b3f7916e756e80e00ea75510a2d8fa45c5e850ce7d500e7f551c2591c4b9c1b01ce1ba239264fb8a005598ffe2b80f5464aacf0a38a7c80782d0831c7fd5335bb0088374577349ef0dd4eb2d1f82f01da9bc3c8f6aa3b0ac323a5aeef79c6b153fa07c07a0b2556f5f190d1acb97d3ca41c20bc354af53be9d03159fd7e31c0795b9470920e1d93e1bc17e0bc3d4a3847c512e7df00e71d94380719707aade143ead55f4c05f95600f9ce384026acf9c9201f0e20df1507c884915432c8af02c877c70132e1180019e43b00e47be20099b0ff4506f90b00f9de3840266c5d90417e1740beaf2927fe84360395ac63fb1940793f254afe681823205c838c6c55fa2c00eb813032b70aaef08bf9edb5ccdf5bf584ad5ab2b7eadf01901f8c03e4382e5df00a80fc50534e008aff975ce702940f87111a2c6e76a1c1a500e1234d599f4371f1fcdce80300e5a3942887303cfeffffe1cdfb3f01e8c7c2c8f6239b5db6af04081fa744a83ef2835542ca52524f245b62630dc0f8042546f3520693199fbe13f2a41eb26c3d07c07cb229aba2d0d6c8236b189d0e503e15c650b4ff774a08b33bd90c94be00ebd39458db32f899d2c4ec93f805393a0364cf34656fc7d9be249cff44d6be1c02503e1b46a64e55d9386745c575059d5d01d6e79ad6436d51f6b7db09ab1db22f10e70294cf4773e22361a098acda791f607d218c0912de577e88e3e7a77604385f8c124ed27549c8701e0c70be14259ca4abe690e15c0070be1ca5d950a493c6c966436d00385f8912cee258e27c1be07c9512e7304363c9392e648fad2f177ff331f7d542e4c486cf98cf11d44208289f4705fb2000fbb5e88cb5c7f16341cf0094af53a2840b095789ecbe3cac60315934a91ec07b83121eaf5413618f59d6612e287efda07600d89bd4d1755efec15ef94ed6117bf6917395dbf8058447018c6f5162842f7ce96b8ac5fd85af9900e2db941007182a113b26c4e76aacb0fc92d7d0b5ae4df638ae6fdb02007e273a114ec240075984730040f96e1828bd7d1d9170c63159b6bf1ca07c2f4abd72d237e4c932f97480f3fd28e1247d439e0ce77e00e707943883bd854c98f1c966763c07d07e18cd183ca1c792c5e0bf03583fa2c4da9d25d6bdab6a0866349ff6e80c00f2e32895a4a41faa202b49c7019c9f440967712c712e01383f0d239b275aa0cdebebdce702909f4505641c97bf380c80dc181590842fba9281bc0a80fc3c2a20e3d8b5bc0080fc222a20095f582503f92200f9655440c6f14dca6701c8afa20292f0dbc56420df0420bf6eca1147672c93307393c532bf0528bfa144c9c7fae11b40891170fb7328f11bf76903d07d4b892ed53ab45808238e018cfb01d4efa208756c0ca1de03a07e1f45a871fc72c77500ea0f51841ac70f9a1e05a0fe1845a884410e32a84702a83f45116a1c5fb23a0240fd6f14a1c671ede43b01d49fa30895b0b74406f54600f597284225ec379141bd0140fd358a50e3f806d1f500ea6f9450f30d50fd2d4841d86225ebb09e09f0fe4e8957ada630da3138ac4ec7fdc3a78b00c63fa233938eb0b74f86b200a0fc338ab340485fce222b477f0258ff8a2256d2b733c8b03e06b0fe1dc624060c6bf23b6f847d7db297b4ce0738ff89124ed2392164386f0638f96cefc8e01c154b9cbf029c1961e0f43e018cb0674f3663692ac0d9224a38495f7025c3b916e06c498953bd28c81fbc58a054b257c84be2d7eacc00f05a51c2531f872e66cdebe3d0bb01809961001cd9cc006e0300b6a604a86682606561dce76f5e0440b6890ac838cedffc370099151590719cbf790d00991d1590719cbf790900d9362a20e3387ff36e00b25d5440c671fee6ed0064fba88024ecbd90817c0880cc890ac8384e84bd0f80ec10159084031164209f04203b460524e1544332908f02909d2841fa9b9a4dd800220b53bc0150760ea3973dba99f5b22701805dc288393a5722b69599c8ecd5b5d4cbfae42b109f48857315c0d995122777087db9a8a98cc71feb63be54d45880b01b2542beb4d75a79ba12bc6b41f84d35b291984c00ad3b2534356da5482b07ed1754e23e6d652f80b10725c6c67f6c218e33d64700acb9613478bccd06220ce69279683f80b267181eea7fda4a1ce7ff7e0cb0f6a2c41a6c1523c288d05a2ab4ef01b479519a73319232524956d35f0a70f68e12cee258e27c04e0ecd3947d71e728631c4775de0228fb52f77d541bb4797dcb6f0f80b05f182136ee6dcd7169b2890064ff30408e6ca620a70090f96180b4e3423084c11b42abc38a0c91819c0d400e08a3a2e1205788c22ae18dcda397be02a01c189dee2461bf870ce5208072501828bd2dd31cc7d941e7009483a3347b77642cd762df1ee01c12259ca36289737f807368947016c712e77c807318254ebeb39f8c0191616a4785a925c054109dde751cab97a701ca4da23369208e5fdffd2f40b969588365cdef1def3d01c6cd2831e61b3cd2df4a0484233d64e3e0a702bcc3c3787d897b69b9e820d685e59b64e3391500dee6d11c268be37a6eaf03ac23a2d35d8c63b4fc4a80b2304a0df29194732ac91ae4d300cea228e12c8e25ce7d01ce916134918a9b6513a91a602c8eeeb402c2e611d950d90900eda8288d8393762fc9c6c1ff05708e8e124ed2f81019ce6b01ce2da28493347a4986f36b80734c349bf3715cf3fa1b8075cb28359a48a76691359a26039c63a38493746a1619ce5a8073abf05e4db195986a5d5e615d50e38827c57902c2708073eb30667260a3e6ce8c1e3f90bd00c86da202328e431a3d01c86da302328eb1a4f100e476510119c7f534f200c8eda302328eeb69cc022077880ac838aea7510a40ee48093297f9eb4812f677c8ba91670198e3a204937039083298670398e3a304338e018e4300cc9228c1246ca093c13c14c09c102598715ce3f76800736294601236d4c960ae07302745092661d3880ce67100e6e428c18ce37b9027039853a20493f0ad0a3298a70098a5518249385b930ce66900e64ed199f84a5862924d47f804a0dc39da3336099b4a643336cf0078a786f5ae64737ce9742100398d126496b5b3dcda5907e0c50f5736c0359d12571e73cecab45f2fb5c7c19d6565485f2e255bc7ed6780744618eb0aeaeb69c57d5dc13100e0cce8bca34bd86924abb5f301ca5d2851f69528ebd952eb745d439d5d6629c3e1aaed78eb62beeec61aeb2afe6afe2a5ab0646fa71502b0b3a20a96b0214406767300767654c1124636c9c00e0660e744152c617d4f06b637005b1655b0845d4e32b00700b073a3d30e201cbd246b070c032877a5449963ed38d7d50a6571dc3e54e03a0070bb45693236e9ac61b280dc1500e7ee51c249faaa1519ce0f00ce79d44b49f08bf93b41f1c3d416609a1fc55700485f54217b05e00780758f2862257d9d8a0cebc3026b9b4c4df8a424e125a204e3655885d0df6ebc8c6093457d5b25905458fb53456bb19e2db480ccb7fef94b8b3dad7fa6e319e2e5ff896c1dab1547b9bc4a217bb975966b56c78afa5b97ecc95da395748d0261945a95a6402ca46f3f7f89f58feb3ccf71cebcc87e414657eb5c85d5d2e0b62f63d3842d8bc4fd75a2755c6ba56bb9d089a3cc10b132aedb0aeb7a7e75bd75b6525c516ea568b9752fe758986f5d96c1e34f76cb7a44439b7a847cf971b9dc53c753cbe4ecdca5edc5016598f34e4dda523d9545b6a3f2fb175bba570867e44753599ada3edc83dabba44ae1009e16cdd9fe053cdd65b20b37cd152e5f66a57ca574de19d6c5954229fe93f97ff0743d26c8330200 serializedProgramBytesString: - serializedSignature: c0e16e8d275740d09217567dbf9d438e8a656b9db3c686a78447d7bcdc7c4a4c06004774ad11b243eedd68f8e15bbc38e2ce785f6417a312dc778d2d97bfc205 + serializedSignature: 4e5a04624c4d4864e7f16a63bdbec8d1725d47cec552a02249c1fafc2ecdc1d8685ca2f80cecfb545e1f004208b8a710795bfd0e862e82199d8386b5ef6bd60f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset b/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset index 015003b..4adec11 100644 --- a/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset +++ b/Assets/SerializedUdonPrograms/065771c70501b7948b90054d4c86d4f7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5bfb5a1347149f0de466122e2204d45aedcd589504b0d6da8b55a496d6aa1f24fca1ed8751169b7e2150887cf8b54fd047e91bf411fa027d87be41ff6bcf39334b26bb67b22c309150c397bdccce9c39e777ae3b136245011fe70a1c96c482981593a22256c4ba68c0d52c9cd7e04fde79ed8fc4269c5fc0b10acfae88f32123f173d11987e33cdc6d89268c7c299ec3b946cf17850bd7f330d6853b6c5d85af0bbd9c7e18541177c543f140e49dd110124b34684bb53928979382e31df10a9ebac4144e52a44779382cc2932d7ab6064c7bfd9e881f48ac3578f61cc66c8a3ad07c4614533b707448263ac5d5b94f9db3f04dc0f7a4768f52fcaaeefbd53907dfb46f6c42eb83d723bee749d57ecad73ea0d11a50e741d57754bb07bace906f6c4a9d8754ff31ed1ecfc3aa3dafdd3bda7cde3ce3be796ef8f839e1e33da668a4d4b58e65465da7b8be7187ace26bd053556c88220dbe14c17cbd91e1868ba41331a96bb0609cb60926b2010418eba9906d36c58c9866ad67c2c96a7ccfd2b10a3d6a44742238c51f812990b93afcb99ae96f41fb3df21c34fe1a3c9914f7e18ca39e8a2930e6273e2a4b306d1ddcc71565386e10bda7c076b0679848e826fe310b40537af11ab478806ec07d9d385ca4e33671ea12f7f3d0d6a498d280a87207ce3b345b50f64db8e6e62c2bc8781e796736b5cb90e1a9e92e4883dc17c95fde68e4756804a14f4c2837ec2f5204fd2da0893718ca2013a72429694cc934d5d6362d8a146717020846973128216fdf12efebe25a4759786450dd67488296867ff9e7ef3f33bfffb5136f176d461429859e0d11ad13b048afe08c05287416211eef2f21a37ef81d0e7e4ce3ce6217e197fd6ad42fba02129499da15406544192e76e05b279f4262b3c48c64aa2e02da292554115360d26718932688631cc4a96e431c1e533a419cda95ab05317e7804d30604c3783021d8c72148f5ddf756110c165fded51d18fb2320b14d19f5258ce78ab5ce9862c179d587298f6786f03ccf9690d1383221dccf218c0c3a8fbb82f022d431dfc2b32af477295762bbf4d9961cedbd3aa39bdd33ba3942f79c86ee7eb831211b67902da5d47b87dfa5fe854f3ced63120ddd403cc111c7f835c885449c7119fe4af07d49c2e01dd6f8f245393073d23c73d234f350d8cccb001d1a2a1a83ab408d3273ca34f3303733ba0e965a553012699c4db8c67151e64c73ee91793d45cafe0238beede7f71cc0473ad61851c3f70993c64e711acb92ad9429d5be201bd9148f9406a3e82c6372bc51c6f156a00e8ae27859ce20a8b1dc4583c067eb4405dd29ba51a0822ffb8d82b7883c59c47840b870164c5691e3f483a632ce456ebf6e7266dd0c70845197137b219c31131ee408a3d24fb338fa29e7cd948738732280ba59223e046dfd24e4424174633ab3e7847b56f0e561d8fc264b1ae6f4827a7ccb14f4fcaa1931abe6a429789de382d74d21d8eaa0420aabd3525a4da90553e13c5cc9e135a8d0b045874407c4ffacddf1a204c61193446f7312b9bb127935a4be002913021adc2a2d15a264f3bb3de7c00ce58af90249e18294dbd47b52c9838be2edabf54b548ed4e0f88ca4f3cbadbf85ed1dad259801118e82d329134ee7399c2a96716a40df59980a2542baad319d113a380ea3261c2e7038dc16b821d2508bc673c4458d561a75fd48b9d6216ca10fac518956534bcdf8249cc2e1f9c39849be7738f91e5bd4f3bd03fb83d923a220923721f22e87c8b42f90cb35162997a7e932b4b58ac72871ae352a8a04e32609de33d92c3fa76ea773e267e85e5551fc55074ecdedd16d36097f0ebdc6cca995ab576021eba4f126502a52b95312dcda00bfbd841cac01e2387379d7aec2379bde17e6cda6d54032dfefbe4398149c874d6a3ea64b172e93798f25a924f26801d254ff1d37493fd0b51a2b52257a799fd614cec5459cad8fb7a1e82bae92c0038a9340006bfc65e5182e854f5448e82c6165e75522e02dc91fc22e2b9ad66d806785eae62df8bb0faf9fc978ac84e8176c429412c197eb5e00083f18097dc4bf3a3467dcdf7e44306c0c52a0de01f6d629fdb920842f8cd0ebca51e3fc921e060aac9d140c0ed6ca507c66296186faf07f9e3c4a681818571327bd584bde7ec5a6b78f09b9ec2a35d6a0055f73dd55f2cf7f905dca745b4c38bb17e1f6131786442b705eed0694cf952d363b96e116a14cda8232a141396913cabc82f285d12e2b6d35b34530d3b6c0cc6860166d82995360e2c4ab04a4471b5ff3ad0117b7059cd0802bbd4e87ee7d1b8c6b504e1d9dd838dd83b131a541396d13ca0b4cc646269ab461db10dfa85ffb1d375b8d6900cfd80418e9cabd6f6b20e56c81d4af8174cd264805658575e854a7f33a5ce1ca97b7118b25f4b26f1dd4fc4b14ab3699b105f78006f74736e11e34e6f086ead27b11d3d1c0bb6e13bc5126629a565f2d5ae1882d208735203f3e3a597caa076d32a94179c32694a7199be47685f5df9559b54e6b2929a741fa894d4831ca6fd33b8d0b9df434d47b89a54f03ed663762a3c9a57b3d36a635203fb509a4b764614a32ed1b7956c1ccdb0233ab81f9d95102d362aab106e6a006e6e747276bcff460d63e218ecdd64f098bb92f44db4e8b39b115b49755b9c732ac646ec0ccdf095c15a8c2b82a9d5bfb2d45fac91a16dd51f6703bd30cdf0cb9856239bc95d70f4d5787b1c1c3497a90cd9e6c07ad14e9c776c759fe2f85fcb769faa099e6c9a42ba0f915f54bfb87d0798598c24ffc3f9d0b5a32d13f0000 serializedProgramBytesString: - serializedSignature: 9cb08aaf6acecd1e0d045b15e3edc61f573b71baffd0aa78ec33aa2e68ffaaa2da354b7fe356a0479d8f47fbf6b93dc4cf3db8ef7c94c887f1ae30bfa42a500a + serializedSignature: 2afef95a4a185e1724e9e114309cf6132071b5a5d9a1b6f97629c4f580e4cf10c7fd7db48cd9a2b92a36402b388de83baaff197738075aa40805b8aecafdb60e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset b/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset index 48bfc04..338ac14 100644 --- a/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset +++ b/Assets/SerializedUdonPrograms/09c0c4402f33e734592e05288a881890.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c14c7f7c0e780e0c55d4309103481e02e099022c5d2d2d2164b08b4414ad0babb507777777777777777f7f6bf333b73f77632efb27b7bef32cbef0f9f64b3bbb36fe67de7cd9bd9b1ad95c79c7fb17eceaf1dd81c36890d6025ac94ad66ab9cbf2639c795ce7ff74c5d9fc5d63ac772e7f762e75e3f965dcd93fc5faf583be777b17356c9d6394fae674b9de30a717f2e2b73fe2e769e2d73cef8d565ce4f99132a56c779a88415b2edd94cd636d6ba1a113b88872ae5b518d72b56dff93d916d76ee968944f148f2c4adb6ceafb9ce9d4a716fa59368156e01db55a8b5d2b9b7d479662dab70642e1112ebdf3c87893f987be8248f9de5b1a3f3d340fe5d5bfe5d5ffe0dc3f3eb5cbb5d9284ed02c22a995d9d9f2ce7e777799eed9ed7da479e7773cf63ad34190d818c6de5b1bb3ce6c8630fe7a7aef3e7df3ed29fec5e4b29e71f79de4a9eff0bce55daf8f5ffe4795bf7bc9662db4e9ec7e4797bed3cd5f4f5948c4ed71835f299770de5b15735e193c968248fb921643466c2866a9d9f246c171056c5d3dbd55f845336cb8f37803037c8631dc9bc96763d4b5eafad5daf8b5caf875cafaf5def238f3782b4dca83d73937ca60e3877feae73b626e366192e0ba419ca53f7eb6acfdd22afd7033ac1e76e419ebb557bae9ef6dcadc873b769cfd5d79ebb4d7b4e5dcf01e7fc7e7d57c7daa5f27a5ff7bccee349ecc34f79e92f8f77c8781a80737ebc5d5e6f08ce9dfcc8eae7c69fa57cdc0079bc5393736735720e4892c67ce6f57ffd34b67769b6729794f9b8fb1c471ab7737ebc5b866fa4c9bb5b93d7d82baf9e6235481e5f96e1b691e703b574a9fb75b5fb39205e785fe5c1fbf27a1370ce8f6f21f11568f7f5f854bd3540bb3f580bf781bcdf543b6f96246f545a94cef7c8679a8373875dfdf9d5b01b520d3b753f5dec943c8c9dba8fb11baa854b859dd2f54396f083ca46954dde2fe5b40061d5757e7c96796dff5957062f5e1e7fa8e4dd2bc3b704e750ee47dafd8fe4f1639046c5fa1370ed63708d1f5f91725a8173275d0d6e665e7fabd2f5a016ef835aba943db406e7d0dfa8f8da68f1bd9e84bf929d03ce818fad5f21af0f0bc8728481d548706db43c8e02d794ecfbc03568030ddc30799fcb6bc3e5f10110fe3ecd361e605e9b1d13903dd44371867a8c35e8a1643f64d0e3e1247a3c02c23f04c2ab7b508f71f2584f93ffa8a6c7a3063dc6fbd443c97ecca0c7e349f47802847f0c8457f7a01e13e4b1be26ff494d8f2743e8a1643f65d0e3e9247a3c03c23f05c2ab7b508f3ce6f5450dc0b95306b739400bf71cf3d6bfcf316f3954721a7be534998ae4fbf31a2ffdfe0bdafd17e4f1452d1d2f6ae97849de6faba55fafa35a8374a8e7e0fd76daf3ca573500e75cbfcbb570af6ae97b551e0b34398dbd729aaed1f25e71784de3a0df7f5dbbaf7ce71b5a3aded038bd897052f755ddda1aa4433d07ef2b4e7a1df836f3d6816f6bf2df6109bf6d7a5edd6f2fcf2722e1ded5e279578be73d4d4ff5dc2496282befc963218b97ad66aaad9e6adb7cb23c7ea6d9cd67f2f829f3b6a93f75756b26dbbfcd543fc21479fc5c93f3797239cd93a5712af3b6cd8b98b78c7cc1bced932fa4cc52f7b9e6ea7d4eddff92796dad085c87f21a7be5b5b85d9ecbf625ffd3d3de2bf6a62b7ebfae763f07c40befcb3c88c598a77d29cef9b116125f81765f8f4fb52fa768f7b7f3868bd5669ef665fc3c48dbfc2be66d9b7fe5b26bf97335eca655c34edd4f173b250f63a7ee63eca67bc3a5c46e86667fdbb3441957e57116b8a6cad66c162ff705c7c86b33e5f16b10fe6b799c238fdfc8347500e74edeb452fd57a634ce9547d5765469fd9679fdf8b7f25862887f07704db54b7704d794ecefc03515cff7095d07e6ca6bf3e4f10710fe3b105edd83f9a5de0deb6af27fd4f4f8d1a71eaa1d04f550b27f32e8f173123d7e01e17f02e1d53da8c74ef2584f93ffaba6c7af21f450b27f33e8f17b123dfe00e17f03e1d53da8c7cef2585f93ffa7a6c79f21f450b2ff32e8f177123dfe01e1ff02e1d53da8471d4deebfcc5bbfabbe6ae5b7fe63defa5d7f5edd57ed8805dafd5d0c1c764de8d24ebd4fa6da0e50e959e81e63aadfb62338777eda3d9d44d66ef2a87cb9eae3ad03ce9dbfdbd771d3dc7eb437ee585de6ad9f7703d7a1bcc65e791df2657855c734625e9fbf085c87721bca709db473e5bb555da2fa9e3b83731e6f276f38b6441e17cbf05db4fb4bb578f4fba5f27ad7248cb57a379eb60e5ada54fd50a6e5cdb284cd741a2e8f9d34d9d26663f535d9f5a56cd5a62bd7642f4fc8ceb91f91adeadd069a6c399ed5b150865ba1c9de3d213b7b1f4d3696ef7b78e346f33fbb9afc6face5bf1c37e95413f98fe4953837bda72c9371aafbca3f29fb69c2e27e25d60484e5c7a6cc5b7e9bba72b3c74b19595a1ccd99c787c79a6b725b68f7655a62cd401a24fb584b8d794b37eecee3dd783babb68bcafbd65ade5780eb308d6a4cb09376de4cda967a4f54696ea5a5a3959b8eaef7cb702bbd3ce3f950b79af4a9e772b4fb75b5fbea7d7c99f7be621a7fbe8d96ffeaf9ceda7d5dfe2acd3e947c950f6a4cb5093887dc747d566bf7557ceaa8f2418dc5b604e7d0563a30ef7bbd92bf46bbafe4eee90d17ebc83cedf2c065b423725f2fa3ba5e9d34bd949d29bd3a7bf58a73eeec955b257f9b80fce5be4ff977cc0fa876463a7cc8ee320d72bcbd8a0fe9ca12e5b72b08cb8fd9cceb43b25db939874819595a1cdb6afcb6d5e476d7eecb3908b16e200ddde4318779cb6e8e1b77b743dc78bba9be1e55467b32b30fe9a9a5b137f3fa10752e7d488e1aaf5479de434b470fc940f15debe589fa103d7deab91ced7e5dedbef221bb7bef2ba6f1e77b69f9af9eefacddd7e52b1fd24593aff22197797d48aec64dd767b5765ff7212a1ffa68b600ed911ffb32af0f51f2d768f7751f22c3c5d43860aa3ea41f721ff3214aaffe9a5efd35bdd478a1f221ddb4eb5dbde1e3f9db15e42fafeb549f72267cc87299863c66f621f92c517ef341587e1cc8bc3e64a02b37578d7d6469711468fc0a34b983b5fb72ac3a3608a44195b921cc5b7687b871f790fd9f3db399b78c0ed36cba025c87691cc9bc3e449d4b1f927bbed7666243b5740c950cd4b845a59727ea43f4f4a9e772b4fb75b5fbca872cf7de574ce3cf0fd7f25f3ddf59bbafcb573e244f93afd23d82797dc8088d9baecf6aedbeee43543e8cd26c6194662ba399d78728f96bb4fbba0f91e1626358381f3206b98ff910a5d7584dafb19a5ee3bc7ac5398ff3caad92bff9207f1d3beda1c6e0c3f810bdef613cf3f63d8c77c3f49e9a44d63ae6b1ffd804e6f51913a48c03dc74f7bedd1b776c22f3f63dac03d7a1bcc65e797dd4388de23749b3c745e03a945bc8bce55f9dfbe973c77cadd2bd88559df3a1e29dcc3cfe375604aef3a3eaefae03ce9dbff3ae9672b23479c59a9d156b72b7d3eecbb187d85490c67a9acce9da33d33599d3bcb61bb71b3056169b06aef1e30cf94c3770eee8d5f7726f7835f68d867f1da41f3eb79e79cba92a8f4aa7999a4e33359d54feb7f6ca671be4f9f69a7d6e9447e5e766796d419cabe7f871b666bfb35d7dfafdec0d17ef9f9923c36f0bcef971aebc5e5b4bdf5c2d9dddbdd745b806de67940e4257e843956e39e01cdab9fefcb490cfcf0cf97c61c8e7f531ad6a9e8fc7d7b59af06dab89af658acf17867c7e66c8e7a7857c7eaaf7795506e3759ce223ebb83e8be4fd30759cf2cd703c43b5617690721a8073a76ce65fac852b611e1f20ce61ba77d4ec6c14b8ce8ff3e4fd1c4dee3c4d7e7757effc87bd72e2f16872d4f362be1094d343bb3f1ce81e74aefa0e1ac7f9cc5b4fcd77990d5ce4a67da0ea1f948c623b79d92979b19d34798d3579cf7be588b1a2643aa8f8166879bac0955790ab85db55cbd35d35d6bb6836b623b8ce8f3b6b79aad2d907dc07e74cd95a4f8d8392b79bc6753799ee6c2d1f54fa167a6d4ec989cb5da4a5bf043c07d3a787efe9e66381aa077734e8056d50c9a92e7f92d998aae31603192abe25ac6a9b4ad5ad4b99b74db5045ce747d556af03ce9dbf87c83a3adea652f29631af7f5aa6c92dd7eecb7198d872904655ffaf485c8b2d07d7f8b14cca6905ce9d740d56639e75b574edaec5bbbb96ae3d98b70da3c65f666bf1b5f1c637245793a3f8672518a97b71bb5bc23c3ebae066f02c0f3733841da87a45d968858cab1738e7e9fe1c84e7f773bdcf89ebc9d2a0e2db2c8f9ba4fc95525e6f70ce8fabe4f53e5af8d5f27a5fedfa1a795dbda3ec0de4a8e754387edc5386cf06e7fcb9bd12f931fb7a796d1f6f5c6c5fa0ebfef2b85fe2b989eafd41a5bd35087f80766fb7c473ed8ef0c1ef20793c50a67badc64ff5e7556afc54f875f27a7fedba6ad3abf9c9070339ea39158e1f3768fc54bbc3c4ef106f5c1e7eea1dc22fbf4399a76c04e6a7dea30e63a9971935375e9519d506eb08ce9d323322db1b8e1d5e4d9c6d403890a7a1d3b7494bdf2699bef35d6e23bef73e17dbcc3c652ca6caec91f27c2f793f0f9cc3781a7ae319a9fb8a237c723842cacb4f12d60f87a398d7e683ca39dee5149fd32dc7a3627b4bb903b5ebfb324fd913e7fcb89fbcaed6eeb403d7f951fa92d801325c013877388e5aae85db47861beca66ff4fbdaf5988c678bbc7eb816bf4a9fe23c043cafc2c3fb6aadce09f2fa515e79b113e43903e7fc78b4bc3e4c937f94765fc9571c0fd2384adf173b468b57c93b565e57f9d40e8487f7553c6a7c57d51527c9fb23c0b9c37df4e35ebe9ee77878f92ec0549be840966887289f9703c2c0f7961393ebcc4ed2f24add57ed9563e5f583e5f526e09c1f0f61de3eba93bce989dfafabdd577de0c721f7551ff781dafd93bde16287cafb4dc139bf6fa827628769767b8ad96e4538689f2a1f54be9eaad9adb277c5ea48903fcaa7295b1ea5c57184765fc5719a66bb2a8ee3101b3d0c8487f7877aed246ea343b4e7543e28db6e0fc2c3fb7a193d9e99cbcaf1f2b845de1f0dce61591ea3a5ef442d7d2768d7555950724e46e29776123b458bff14affdc5cbe45870ee94c9f1cacee4bb6fec542d1fda81ebfc789a26afc02b6fc2782ddc1932dc3870ce8fa703db51efddaa9e3d9379dbce674ad92acfced09e3b9355f5136725cac576bfbbc709eadde96cf77c528ef6ccd12cf5b6ccb9cc5bb79d23659fe5cde7b8bd9d258f72bd41ec1c8de739aece13b768f2ce45e49d2b8fe7c9fb321fd8795a3ce76bf971be3c5e00749771b1f301d70be43515ced175ba5ad7938c8b6ad77700f22f9447599fb38bc03d5987b38b13f14c51ef4c9778f32d69bc6a8ee08540870b5da693664939aa9dabeaa18b249b09e09cdfef039ee7f73b68f2ae4e921e65d31727d2118fef122dbe4bb4f82e95f79b837327bea2595e39f1f0d7c8f013c1393f5eafe5f9f5789a989a1f310984817a5cc7bc65f33a374d852f7bc3c7ae64de36c79552ce784d4e374dced76edee83ac66ed058dd00d2cbcfd57e041dc03967858dfff1fcbf5fde53ef4ed04695be97836b97ca6b57806baa5fe362105e85e1f7553fc965327d85f2fa65c979b1cbc1757ebc4ade2f02e73c9ca9fe5732afd6f2e06acd4e741fafece55a2d8f0ac0b9c374cad35a38b537865abfafeaac9bb57894bf557b590c01cfabf0f0beaa8355dd74ab575efcb95be5f136cd160ac0394ff73e5a38ac5cdc99c8df98da3762b29696dbb5b4a8fc54fb550cd4d278bb765fe996cc8749ff1353fb3ff406e7fca8f68de803cef9f11e66cedf7be451ae0b8fdda771bacfe5b4dddb5ab8fbb5fc556d9507bdf18870ea3a3f3ec4bc6d12b98e3af600f3b48998b2d78799f7bdf761373dc5eabd55f150ebaffb82737eff484d4e9e2647b517947d3eaa71521c1ed3ecf37e101edee779e894bbe2cf35b98f6b72551bff0944eee3da7d651b2a5f9f04f6f8803c3ec5bcfef049709d1f9f96f7eb807390b7ec0a4d9e7a5eada59e08cef951ad8156ebca54dd08db5ecfca6b7adb0bc88ffb00b5a65cf6c516fbd9ffe94c796c938893c97694a76f4bf525ab75dd7a5b49aeef8ec9719a985a8f5d00ce1d56d3e769e1d4fa6c550e549b58adab1e04c2a9ebfca8d6458f06e7fca8d6538f03e7fcf812d045b5a35f47e250730bded0e2906ba2636a8df554201b5ef7b36e40d5dd17c867d5fa6a55575d05aef3f3f3e5b95a47dd099cf3fba6be4d25fb6dafec98f2456acdb4eed3de9147b9363aa6d644178073272f679fac857b5fcb4be5d33ed038bf0faef3a3dca323f69116cf476e3c33d769e13e655e5fa7d87cecb54d114e5de7c74fe4fd62edbe5a733d019c435fa1d6527700e7205d713dbf40f4fc421ed5bae7f1da731f23cfe9e9de0e9cf3f81f96f9adde3715b7af80ad6ff199b6af355d0bc0b913d7f6e3b5706a9df114700e99295d3b80732ee772cd36d59a58d54fd9165ce747b5ce55e659bcadf01da28f5c871a93fdc6b11f347d7e90b65ba88553eb37c781737e046b43c5df3c0daa1dfb33f3b6db7f96b2d5ba75f50ea374556b5d5519bf065ce7c7df99b73daad66e9adaa36a5daa6a4319c623e2e985befd5aafad18c72814e39f10c6728d6cec37cd9e113de3fa69f2e2fe46c9fb599397cc7f3697acd5f8c075801597a5d6bb4ed3ced5ba71b5de43ad776d00ce1db9730ed1e4c135ac6a6ea01a0b556dde2edafda54086e9be3e77d4f79ad1ac9858073a9595b1c56c0dcb139bfaf196acdfad3fd593d56ffa29d6e58b5e73c677ffe4d1ae639b9d47cb4c3b6f96887d3dd739d635c8b8f3667bb1664fc53e49fc5eec84582184cea855258a3baa44c11357e1fc2f03db86563ad7a7885d47f9c6a12b9c3b03d874e7c89f5ac406b205ce7faf941d9c682bd87ae76c9ef37b8d90b7c84976d590d5a9c4b718d59f99e3c87477405de95c5140d738e715228573c5ef0d22a56522f5c5ceb575623fd655ac9c4d748e9b446c55755febfc6d8a739e44664ea3792354ecbabbddaacaa642471b9efa3c6193ff9f233591231c7ddd19b21cd6c9136f204755c989ff67e83a19de695c2c650c14c8629e6b83589e98eb33a70ac1e03a56d5d06cdf2eefa16c70525dcc64787677141a2472f8e536bfd69a5b347e429657b502965797abd6a91ad59281e5f272c54ad5202a6465d5c9e709d5f1c74cf8c554f3b919c4ef865b21c205cf80baa2f2f3668058fa3acff96393f35321f0ac746e963b6785ce631b9da82a9ce362a75a9de1fc5e25efad6555722c9f8baf27a057ad52ab4b3886bd9609bb18d99d5723568f6dc69d1c7cfdb81609f079a21dd62e897962718906542dd98a5205e8f51983878dca1f714196395f1a8a7c4925362c676a9b72a661a60b44f53540b27c6914d72b912ffc9f996163c4b6ab4b0346b08e8960a39ab16d9ef6d46c9b4f7be8af3134f36b92d40693a5002398652228de5b4b3248707b2785bbcb76636a0c9bfa66d84c306c5f453b3f69c028d63550cce7149b9b92d5404b9658626a165c0f13dc22a4e0fa98e0962105373019d436992e92fcde6a218557b8c1cd898f2cf6d5dd9ad99e5a2365b2fa2460d6d4d094371c611b63aaf4cc698d674e234c72dbb0921b6392db8595bc8dc9a0c40cb2ccb7da53ab23b9af69ebbb8eecc09235ba83d6904d4cf4c43cb75d48e955ed4c527f4d749e5dee70d8207a08d63bcf9b3a9f9213ede8dbdb771234b399a94b2c588a30c24d4d96cfb177c6b25d37fe0eb8f1373309e73176f1e3a63be1829b63e5b56bd8f2da02e3916de0110bc8a3a5c99c05a4651931e7b9ce2bdd342789f0256f80bc8bbff695794c4ac9486ee2dd7c9bf8b6c2c4fb00134f672a31b36f65ca0961550b6b3027dcd7f075a210970997b9cc793a28fbeebed9e708f6ddab65ef375d18edd658a1ea910627d3c69495a21897d5605616576bb041b3b5a7ef6ced25b2b577b5d99a4a1ab12c6e6bca05e1ef166438170a9d94af737e127fa91efba0c4737d13ef2d887735120f921e8c6e3b135de1c316d738dd4221498d982c76246d0e4cba8f6fd27d05e91e3e49fb4b1b46bdbdc96d71eafdfc345ffae22eab03d67ce91fb6f9d211f3b403d2e0693b9984f3d7bd3c56b51bed3fe75f15e18d71e19db194e71b525e3b60cabb60c0071a80c78200ef8a31196460728029d949986463c20b0cc2b70414de0d133ed820fcfc80c2b735392cd10c3830230eabba990353c4c742cb3cdd662aded562b897a7480d1dcf718ecb442af8759e8aea671c24777843e27cc0808068c91401d756f35af0f9a60dc58b98d91d0f13eed8ae3463eebcbbc9e07917255f985365588cbf0c2c94dd163cfe55e2d62c27069e9bfc3a9fed51a54cd4c3cb440ee6e146183c5cd057cb1ea602271a65ab6ab4c01539bff9bc8b4af1f70699bdf344dc89d1c03045892f87eb6ca8d944ed6634da51c26807f930da74a41e33c79e98ff1d6df0bf0fc782f9df5e588537c650e1056a61e46292c78695dc1b0332ce04a45630207db0c237de50f858c0c2d7174bf90443caafae132ce5fdb0944f4c43cafb9bdc8678db5841ea364aa4ffdc2c8a58b9284c5066a226e0052c5968ee026630fe25edf5221dc99d055fbbe6ef45a3503809ce872ead986b1880d55445a6e407a882f24cd92d5e7332395e0ae782a4365e3ad977364e61e6f1523f69c0b2271f2bee530dc57d4b56b0e23ed024bcb138353419c59b646aa3c1622bcd3accfd37c0f9572f2bc848e920533ab9779f6648673e6fdaf239cbb544a6cc1099322049d932b5128397ae2afa0cc3f529c0dcec4c839bad15d0cd0ec60a34df0bab4ad373bab0dbaa00b2d9de8eededeb1c5ddb2d7354e57faf767e73e5cb65bf122f97d9622c689de3e0573b0de8fece95c502589973a72cde92e112070a89cb44c95d299ee3b25db4fcfe20e7fe48e758e01cbb05f236434c5a73539e6532118e6f76389b1c8a619e63c2bc282d98538799cd36b2e5d29d668b21bc554e4c15522e9ff85a2abab1f85df7f935426eb94845a5f33f58760cc3dcd65c83db3ab96130b735dc54b388dea84c8e734f7042714bdf9c429d32cf779d52c2cc63dcc963c76a9311a66ce9c8dc3d0cabadec4bf02c1969ca12d18797c9097aba070f96293bface94f9cc3c39afbaf8b16c1965a2273a296767909e9f89e366723bf926b7b320d7ba8a5649e75623d4469b8c9953e3a3400db4e4149a6ad19d71831e8339b05d0c0e6c9746c11cd8582ce5bb1a525e2f60cac76129dfcd90f29cc6c1523e1eabf5169a6a3d664a7a925a630296f44586a47f1d30e91331e18b0dc2a7360b267c9249386fd1f1056f615f9c0b31e14bd320bc08135e9a06e1934dc2f92b7f99c963e8820b71c153303b5ce6477012139c8a5949b9c14afa350f6625c526e13cfc7286345279cf488846ea7618a6dd4dc595bf7d046da4f2cac8c6f7816918ea3d30d415e1504fc750af34a15e9236d4d17927988115ad5586a235be55b0a235137363abd3e0c6b6c784af4983f05926e1dc47ee19d247cec62c726d481f3907c35169c0611c9b4f82632e6625eb4c0eb875302b996712cedf7fd6fb4192e4fda70413bc21a4e01d30d61bd3607a3b9a84f376e8263fa94ed2069d8f65e2664326fe1c301377c284ef65107e779b60c277c684ef6d107e48db60c21760c2f731089fd52e98f05d304bd9370d96b22b267cbf3408df0d13be7f1a842f3409e73d1307f8b1f1f9b8e04526c1dc6bf25927552a7cde2116b4c25f272beff2145a55c1aae6c5982e079974e137b23db106896b0916d7c1a6b8f814b885ceff7ce767699541307e678d986bc7c90649c5522c15879852d102a462a56cfcb8b358534f41299682434d29680852b0d071dc6bc5d044b07abb0c733f87997c5b8760ee671956880f4f43212ec7527e8421e5ef074cf9722ce547a621e52bb0941f6548f9e88ec152be3b96f2a3d390f23d4cc2b9751d63b24f3e94b840fab25d1ddfb040faa191f2a5c3bd365f1cfbb3b1ceef22e0b3960a4115ce5f7c71c51ae7da72e15f36894ecc3271b534a04fabc0d27fac29fdbc0b3691a289ce8d4ae159954e23a53ebb1a06665c9fadbf40ad14212ae5b8affb2ae6ea57c9dc0ed9cde2c9203aad34e9c40de4b8f80dedad566c185e8fb9ff06b8ff82bdd8aec28c6c8bc1c8ea0434b2d598f0130cc2b3020a5f83093fd120bc6e40e17b62e67592c9bc727c150ff7bd3ccf390e96d7dca2b2371b22c30e758e410c662d6630276306734a6883a9c4e23c158bf3b4d071aec3b2faf43478c2f526e1bc09c977800fd384dc80913a132325f671cf82a48271da88713a3b0d9c369984f3a6d3397e38f5c2056f3609e695e8b9ac6a257afbd06095e85e58413ecf4faa9394bdbd31c1e79b3c441f114e2d8eca6689b586a54ec9e7fd717c3c6c8cf4217c9c8c57236effdc18e94ddcab2b1c95dc6b83027a8b7d30ce1718387f1f90f3be98755c18d23af63309e6b344f9e6c0a16689ee8f49be38ace40330d2971848e70e0b46fa408cf4a521491f84a5fa3243aa7f0f98ea83b1e272b9a9b8f4468a4bb6687dad15ad2d73b149dc87c526786139048371850146fef060300ec5845f6910be3ca0f0c34cc27925c077500e5b091c6e109e27d644f1aeb54c2d1f540d78b596bb449881be1c4f854a3ebbe16a53a931ce6ee0bbd3e6c6ba307dc160b0d460f31d8e3091156bc26a66fef43c06576a0f727448effce96b7d73bf8e55377f3a7c5ab15c39d2942bd9f4b9126e0783b9f1b643d0e5b37ce75e7d094c6de6fe33e7ce0df1dca14b33963b479972a79bedb95314afa282e6ce8d86dc614973e7a634e54eb23463b973345611dd9c868ae8189370ee9b6f31f9155df035b8e0634d82f980edad7e042719b03dce2498b7406ef323384953e578ac3571bba135f1f8c860ad892d58aaf9b6c755da6dfc34f1e212448913b078ee34c5c34d7ba973b25814e7ca40319d88e1bacb802b7b6c305c279984f3f077c76f68effce23b3aa94f4c39d91421d7fe5e1337de0fca17c2ee294e794e650b826ea137b7a8bd3d9fb0559d182152afa3aa4b2b91376364b757901c3a05d3e93e934ebc7a72531d248e53b138ee37c5c16f78390489eb342cae07b03294dad8dbe9583c0f62f124f23e483c676025e82143091a3e2158093ad3249cbfde3eecc74d2679bd3dcb249857478fb0f0d5d1d91892470d48660544720e96f2c7d290f273b1943f6e48f9c501537e1e26fc0983f02d1383093f1fc3f2641ab05c6012cedb174ff931c324ed8b0b31244f1b90fc1e10c94558e1792664e1b9d82498f795f1cf7185ea2bbb04e3f19c8147fd49c1785c6a12ce13f33c3354c77c1d0eff2c97dca622c092bfcb30255e3428913d399812979b8473f7cc3fb355c5ad7325f4d6bb1aa44cb4ef47c6a7a60471fc57606abe6c50f3e6ed82a9792526fc1583f097a707137e15c6f0551343fe0ac99b49eea6b5ee507175cd246f93676040b25763cabf6650fefa59c194bf0653fe7593f27c5b86996286126c61670b18cb98bbf4a9548c7eaf115b9828e34a0628088a6b31146f1850349e1d0cc575188a37313b58e0d982631e9bcfa63b0afafdb4011fe50da2fcf558fade32a5af9508e7f3230b015271832915bc66e51fca0b5bb3de88097f270dc26f3209e7f514ff245fa87aea6683e43cb139159f4a63c3fe166a797efafa68f9770dfdf5d1becf783f13df148236bd585fd32da67ce7bb197c605241cff62978b6df8a09fe30a4e0db30c11f85147c3b56043e0e5b04eec0247f1256f29d98e44fc34abe0b93fc5958c9779b24733ff6791afcd83d58b2bf089bec7b4d92b91ffbd28fddbd8f0bbecf249857c55ff9119ca48beb7e0cf4d76900fd0086e39b90381ec4caf7b721cbf74318e7ef42727e18e3fc7d1a383f82e1f821248e4731c13f8614fc18c6f9a7909c1fc738ff9c06ce4f60387e0989e3494cf0af21053f8571fe2d24e7a731cebfa781f333188e3f42e278d624987b7efe21d6509eff398cc75f69e0f13cc6e3ef903c5ec004ff1352f08b188e7fd380e3254cf87f6910feb249b898601b0b3792f80a667bb15848db7b15e3512b169ec76b9889d4f6c3238989bc8e09ae1352f01b188eac34e07813135e370dc2dfc26caf5e48db7b1b4b75fd34a4fa1d4c788334087f1713de300dc2dfc384374a83f0f70dc2f3c4e6c67ced51e6fb34d2b1575ff21e8dc67eac74064eec03ccfcb70969fe1f62f9dc240df9fc9149389fd3d2d44faa93cc69f9d864407c350cf167883083a0339c662652c6aeb0e631f519228a54621d609f98b298e7440b3f59ccd38c08fed42498b7095a866d137c86496e1556f2e798e4d661257f81496e1356f2979803689b0607f01596ec766193fd3596ecf66948f63758b23b844df6b726c9bcdba7a39fe2f23e2ef83b9360fe36dbc98fe0246fb3df63a03ba701f40f188e2e2171fc6812cc5bd05d43b6a07fc2386787e4fc33c6b95b1a38ff82e1d836248e5f31c1dd430afe0de39c1392f3ef18e71e69e0fc0786a367481c7f62827b8514fc17c6393724e7bf31cebdd3c0f91f0c479f9038fec552dd370da9fe0f13de2f0dc2791f8cf10da17fc837849849307f591b10f29da61696e2bc9029ae8d09ce0f29b88e49b0f80857d876411626795058c9754d92b9d115a4c1e8ea61c91e1c36d9f531c943c24a6e80491e1a567243ccee8685b4bb4698e0e1210537c6588c08cb621bccec46a6c1ec9a60c247a54178538cc9e8b04c9a9924f38f498ff1938dc93e266d12cc9bd1634336a35b9804f30e9c71213b705a6290c78785dc0a933c21ace4d658299c18b214b6c1cc79521accb92d567d1786acbedb61388a42e2686f12cc1b77934336ee3a60299e1232c51d31c153430aee84a1280e89a23396e2ed42a6b80b66cbd3d260cb5d31e1d3d3203c1b731c33c23a8e6e98df9f19d2ef6f8bf9fded43fafdee98df9f15d2efe76090678785dc03933c27ace49e5859991bb2acf4c2cc795e1acc3917f3fb2521fd7e6f0cc70e2171f4c19cdd8e219d5d5f2cc5f343a6b81f2678a79082fb6328760e89620096e20521539c87d9f22e69b0e57c4cf8ae69103e10731cbb85751c8330bfbf30a4df2fc0fcfea2907e7f30e6f71787f4fb4330c84bc2421e8a495e1a56f230acac94862c2bc331732e4b83398fc0fcfeb2907e7f2486a33c248e5198b35b1ed2d98dc652bc22648ac76082770f29782c86628f9028c66129ae0899e2f158f15b19b6f84dc024af0a2b792256fe56a7a1fc4dc248af0949ba1013bc6748c145188eb569c03119135e9906e15330135917d644a66255f7fa9055773156756f0859756f8755dd1b4356ddd330bbdb14d2eea663ce6e7348673703338bbdc29ac54c2cc97b874cf2f65831d9270dc56416267cdf34089f8dc1de2f2cec3958b2f74f43b2e79a84f371ef03fce4649271ef7926c1fc9b3d07fa119cec6340188e83d28063072c170f0e9b8b3b62c93e240dc99e8f25fbd0b0c9de094bf6616948f6ce988d1c1ed24616603c8e08cb63178cc79169e0b12b26fca83408df0d63727458260bb1641f9386642fc2841f9b06e18b31e1c7a541f8124cf8f16910be1413be250dc24b31533921aca99461924f0c2b7919d6a03c296483b21c6b509e1cb241b9dc2438c7393dc58fe02453c65760824f0d297877acd9775ac866df1e58dbfaf4906deb0accdece086b6f2b4d92f9066567fa4972920dca56612cce0ac962b54970b6737a762cc9b6b67a0437e011acc17cd23969f0497b6258ce0d89652d9691e785ccc84a2cc5e7874cf13a93e06ecee9054132f2263c82f558ca2f0c99f20d98e08b420ade8895f38bc396f34d98e44bc24ade8c95c74bd3541ef7c2927e59d8a4ef6d909cd7c3398df1ef646672e3ef42c6f73a5e0cfe9ae73cb107e35b1c05dddefbf2185fb2ecc592d7936b952dae858bbbb990bc90f175666b0470f3fab52b627cd2793a62c4d6aaed63b20bbe97d9957e4a615fdc2cf6c58af755218bf77e26c1dcdeae3664593ecf32036d3dbe2bf086cefe587cd7d0c477005652af0d5b520fc4eae4ebd250271f84e5f7f521f3fb6093603e7877831fc14906ef0ec1527c63c8141f8a09be29a4e0c3b0c27a73c8c27a3866e3b7d0d8f811587cb7d2c47724f616745bc8b7a0a330456ea751e4682cbe3b68e23b068bef4e9af88ec5e2bb8b26bee3b0f8eea689ef782cbe7b68e2db82c5772f4d7c2798e26be99cdee7a7a0f5c63dd4899822f7d3287212560b3f10b6163e19d3e4411a4d4ec1e27b8826be53b1f81ea689ef342cbe4768e23bdd141fdfd7fd513f269e645ff7334c82f9b0f9637e0427f9f8e999982d3f1ed696cfc2d83f41c3fe6c2cbe2769e23b0723f7545872e7629a3c4da3c9799826cf84d5e47ccc6c9f0d69b617609d71cf85ec8cbb1063f17c581617616f582fa4e10deb628cc78b21795c82a5faa534a4fa520cf6cb61615f8639e257423ae2cb4d3d5a3c7c6c39ab899d946630f71b5e6b9d2b5c9ff4eea6f4aa8996b137ea35d11bd58fe1bb29854d29d64b75852947f8c711627b91e688ea752b7152c8ef0ff07c80807fb66f95d47799a3af92571c0f5f14ff7614ff8405bfbf425c819feec3a427cfb5d77de7da1b22d7c63256a3da60397b25d657f266c8be92ab30c16f85147c3526f8ed9082afc19a04efd03409aec5e27b9726beebb09ae0bdb035c1f55813e4fd904d901bb09af18334d48c37623c3e0ccbe326ac9ff0a390fd84376326f3318dc9dc82c5f7094d7cb762f17d4a13df6d587c9fd1c4773b16dfe734f1dd81c5f7054d7c77624dc22f433609efc2dade5f856c7bdf8dd5265f87ac4deec1d07f4383fe5e2cbe6f69e2bb0ff39edf85f59ef763def3fb90def301ac73f487909da30f62ec7fa461ff1016df4f34f13d8ce5f5cf61f3fa1193e46ce7f497587ae65d3c8aa1fa9506d563587cbfd1c4f73816dfef34f13d81c5f7074d7c4f622dc03fd3d0027c0a13fe571a843f8d159abfc3169a67b03cf887260f9ec530fd9b064ccf61cafc47a3ccf3587cac16497c2f606610ab15d20c5ec4eac95ab5c2d5932f9904f38586b5fd084eb2d0f0658c7d1d1af6af60f165d1c4f72af61e5cd70fb824efc1af61add47a7e042769a5be8e11aa4f43e80d2cbe0634f1bd89816b1812dc5b98e0462105bf8d096e1c52f03b18fa6d68d0bf8bc5d78426bef73047db34aca37d1f73b4cd423ada0f3044cd69107d88c5d78226be8fb02c6919364b3ec6346945a3c9279826adc36af229f652dac68f71257929fd0c6bb5b5ad15bed5f639c6a35d581e5f6039db9e2667bfc434e9105693afb00ce898860cf81ac3d48906d337587c9d69e2fb16cb962e61b3e53b4c93ae349a7c8fc5974d13df0f18b96e61c9fd88354db60dd934f90943d49d06d1cf18a29cb0887ec13ac07bf84194a403fc57ecd5a267c8578bdf3016bdc2b2f81d3397dc90e6f20726b87748c17f622cfa8465f11796e4be2193fc3726b85f2dfe210eafe0d8314ccd4250b304e01c01d3fc033fb30f06380571a198d7b1ca093bc9898acf97e07213cf143ac70a47ea66e758ca263b4fb99fb7ab94cf26e658b8b3415688d920de3b6efa0a1c0d1726d182cf7259effc5d09629f2766a328995ea93b384fad70e404a1fe0f46bdbf89fa943875b51aacd87962b1939632793d715ee8a466a393ce0ae7b8d8495582ef52c174adf87b619c406a1283e8fa2fa6eb0093ae2392e83acff9d9e4c8582f66d0f0dc5ce6a4299876661941f4f90fd327cfa4cfe814f5a974aeac738e53840596097be7b1cd706c6d8d98a7b5c660fb7cf6d36a314f6a319fb313402bde7b69d42adfa4d5c02a5aa9358cea38dd49274f959fdcc19e0d92fe1896fe81a6f48fa936fd85627e199f85c67dc26227ed9b53d2c52427885eb530bd0699f41aca18e2f1263831af15feb3aa16988fc4ee246405d1a436a649814993e19a26f03b8fe175314b0ba24d1d4c9bc1266d26a0f9e26ab0da29cd0b1dbbe7f559a5e317968bf29b4c1f7f7aa6ee0fb230fd8698f49bcab039a56af6e66a71b62ae5dc0b2e3d88b675316d8762dec3af6dce957edc5f4e4249e96867d4c3f41ae6a7ccc19654f832679616449bfa9836c34dda8cf355e62638444b8565b91e3a7c994bdc09a25b034cb71126dd466af5d744e7166f3194083d2aa43eeefc5f9ebe62e72ff7716e41c9bc61fa3c48434ca391268dc66ab9e58d17e65849bc1e9de9dc2d17f5ac39efbc32d2a759234cb35126cd7a689ae925a95c7a88e9c283953b7f2f4f934d35c6d239da94ce69becacb14d15655ab04544db5bdf37711dbd311c4c5d564bdb50da6f31893cef897a56199f0e6d32af9e699ccbf054971132cc563b1f709bf75a137dde5acea07e1f19ad5f4f9f8205a35c5b41a67d26a52929ac7d562b2a86d560acbf3ffc66fae99d39573cd301dc79b741c82e61cefdb58e20452ba4e77742d7742ac15ab5aaad6b1e96e2534c7f49860d2a330849fa849cfd002d372a249cb7cdf6f5253aa6de1a5c397b7c4523fc994fa41015aa841d39faa476885695068d2606e00cfec5a5ca2fe719fc17d9bb7fcf809932e1b6c8d3128f2938bc9dae3417331559fd706d360b21f5f51d5afe379e7cfc37befa42b9fda625a4e316939d197479ceb045e2252bb18f408d5d4fb463b4cc3a97ede78935962b037de64f9974a5dd61ed3abd8a4d728df5e3e9856786ea5a253074ca7ed52ef6baaaec465b266ee88e937cd8f4f09521fe0ad28faf7e14e9896d3fdbc8d51b488fd6b9d6a6dd119d3790666b9c1eafc62f1c65321fad857b064ef333479da05d36fa649bf32463b7aba8ecd126f0ce572747407d14fc257f22f11daa56a25e13d58578cd3f6264e25c49cf051e6e484c273c8c638cc3271985fc33e80da3b74c368cc36d198ecb32d592ccabb5dedc96d314de798342df25583cf607ccf8d75623cd8f580784f68a65a95dd313de7fae9f5d1db5c9384a655730ff6e4f8b99eded6580ea6e33c3fadb1aa3a26fa49783a79386e5d4b0dfe7a1e7327abf9d52eb551961e987e25587f6432fddc7a29f180ff56587a73ad27a6d50e26ad16a4d932b1f217347c7a99f4c298ece8c7ffe26db2eafd6fa6dbdeb998a6f34d9a0e8eb73fc2ccb72a14b358787f7ca5c1ee53c9afde98163b059d49555cad1edeb18312472b775cc734eaa8da6a3c4c107dfa60faec6cd22747d3c7147bb2beb0545b297db1542e30a5727a1aa9cf1575c13a693da95a64424a10adfb615aef82f580a54feb156c2f591bce1031af16a3bd139d1f9e92aab3de526babf4c734dc953a5fbd233ba9e66b424a10ad07605aef868dcaa75feb19cc9de7e43e95ae729a8769b630e808899bee44ff51558ba3a9a5f2310d169934189fc6bc992372c47d9fc0fb50e631385f7590233388760331ed1663b37792cfac4c7c2d23f98c243daffc4a0da2db204cb725584b2a986e786f57b277570a4d0b304d979a342dad56537c9eed3cf1b75b977bdf1ffceae53f24b7ff65692cc983314aa5588f76307b50e53619c5ea49859d9b3c04d3b20cebd5a0b07aef3b1185cd0fc5f45c86bd3ba66af36ad6bf8a87c6dad3f12e320c63526e6232238d79ef6fed00952d0cc7f45e8ecd62c88cdea97980d4188cc018acc07af982ac15992434e0d75788feb06065205d1e7c24a6e3eed83872101ddd59c761344ba5cc8ec274da233db5126c81f91b85a3b0ced1989615262d6785f0d6aa164ecd5bd3683f06d37e2536e33f5ccbc3bfbf4d6555d7584c9b55266d764ad1db9a660a046d399a5b24e96e578ec378acc6de7153cb5d37dd65e23dcf3c1691ea2cc0f198066b4c1a4c09513ae730b7ef6843e0b78674e5d6044cd73d4dbaf60b5887a8bce2f5e57ae3e8756afd6213b154afc5c6b7524935f499996dcd4fc2f4ab34e9372ca07ed0ea2624cd9374d4e885982eeb4cbadc524597d4c635bc7712cff8191fc05a06fa972792add04f750648d055e1c97a67abef610b928f45583eaef7b3568a665e487a7a6527639a6d30695690c442fdf669a67fdc6d0aa6c346930e7d53ae758bd3e8c5a76269de644a735eca694e365f26559b29c6d2be391d3550cdb70bb6c3f4dbcbdfc893ff3690fe2e3dcd1118ac7d9b3eada7615aef9dda8a307feb77539be995aae54ec774dc075b63146445589051a8e47eae9ef33f166be4fc5924ec835bcc2cf1043fab64797c5f4091beeabe39a4aef3b8573ae9e1b6318fa919a7d57f5768df5aeeeeb6e25faf1887aaf6e48a2dd36cc07db242484ed83b5fe39cd82585978401f1129faeef4041edfc7ff989ef21b454d4c4fccd72896319f5a4464a96439a2f41ddea34dd8fe76a0b99abb5f2789508eac560d6547d2af6e7b1d536db50db2a6461d936a5dd153093b9eb5f63cd198b57cd1cdb2a517e6789e6c53a719d17df6a638565d5146b7f2140cdf0ab565c09681698c4b517a6e63ac7b5cc1d6ee71fbeaa97552b9f67c40194c83a09640b59bef8ada32b71622995adfda9a2162965ee97dd2a1d65a200f2f69c04c803ed0439301220f906840ae44194209b7a40f23a9727a15cfa4e8e2c0ab836354be03a9812574b81cb7dd5562f5bd3999a4eb6de7974a94c5214b0fd3d2481ed106a6ceabd48af2056c8fe653eb3ad3412d8f86c2485ed504a6c4d00b649a20bc6ed765e27bb8ca200ebfee1095887d13747cc453331c32e0ac8460f4b203bdcce5ab4201220d76527401e4109b261dcf60a45d4ee5777374702d231a0123892baa9013bf4a2e9fcbf06ef0a4751e26a863aff49ac42f45bad8c04b07d4005703425b046a2101689ee80c4704554de41799792c2740c7d3da99c3eeff375fb2c2b053055734601d9311312c88ea544b64d1564517b417abb4e02d57199b5ae3d4597aedbe28f92755d3f3281ecf89a71f4d102b6684402d8969a0116ad76fe726161f5b234e1fa72d2d4bbbc8351c63be779cbad886d1243c76b85bc52bdb39ecfd1b12ee527c0cef6dc240d845c9f9dd9b93e1ab1b9017a3b72aba95a727df4cfe586ea0c0df37441a8a707394f63ef4db9013ada727dbef9e7fa6a51e756dbe9924c4e22fe64a1609afcd597a670a6565b62f4d23cea98cf472f4ffc1f1f58cce7038b277108fc132ffc9f5b679d4c5967b593f9e78e23af12f3b8f0d9030bf97a323d0d9daaa4618e9cdeb842c4a1ea2a536a1a786ab3d67e144ca546fb86259a00a7d884735024716683be86536dc25910499cb301ced36cc239389238f702384fb709e79048e2bc0fe03cc3269c432389f30780f34c4a9c5d0c38fdcf211c4687967fa69104ed7100ed5994687b49b4154ea00a8138312d3d95c5bd55e67e4400f66d00f6d951829d1f41d8a701d8e744097695e9611180fd3d807d6e262abc72b4ca83c9e76e62281dcec654151e5fe3a9709e6713ce8248e2bc0ce03cdf269c832289f31080f3024a9c6d0ccd3128d05bd087d0a1ec4085f24b80f2425b50164412e52250055d640bca419144391ca0bc9812656b897298f353165fd15a2cc616f85a557e6f8d58ebc51f881ec8e5a0785f9289d97f78c5837d248cf03daa1915d62100eba5999a51cfadb0dcc195219b9c4f056f3d807719f5d0be82b762ab29d23b007c9753e32b65ee2a6ffe92b8d4f126fa5a70327cbda8f0b501f8aea0c4d7d9504bfbdd9481b0bbe335aa37f0cb419d7d654d367fa038d2eaa51e958dbe056cf42aea35210b0524b77a599b29ef584285ae04a0bb3a53e8d68b401942770d15ba0b00ba6b28d1b592e896caf91ffac70994a6a48577672a8c6301c66b336181f95b4de11d01d05d4789ae854457e0fc2cf74c25cb10c2422a84c70284d767cafab60eff770c4077434d3660bc1b8e10b605c95ef1ce006dc11b3351950cf4f4dfa8db19b248b276e01460913765c222b11ad9dba426b4483294dd01ca9b2951f663fa60acbbcb5d625670e5ffd018f887c011dc42bd5ecf5b934f10dd658463d964bd8bf581adde5a13d0a2d8255b0f40bb2d133ddd7eba1f603f37e948cc142aacd34101bedd46aca4c3ae64587f05d67a874df33349a7ab90cdcfac07acf44e9b7092ceaf20c33910e0bccb269ca4b37fc8702e0038efb609e7e048e23c13e0bcc7269c432289f30580f35e9b700e8d24ce3f01cefbec5d2a10c539be4700b4f7db32c16a20254ab24904efb004ca076c41591049943b01ab7cd01694832289b22e40f9902d28074712e5b300e5c399e8812fd82a7be08f037ef2113be74f0e8e6067dd4a80f5517be60a8d88a085760005fd314a947c3587b7b37812539fc422c3d6840a5b1d60818f53626b5b6dc1f6aec821b441b2f538e300cc276c82393c8230c700984fda0493b09f9d0c665f00f3299b6012d6da64307b03984fdb049370df033298c300cc676c8219c505a170bfdb676d824938924e06331bc07cce2698841360c8607605309fb70926e1363c64307b02982fd80493b087880c663700f3c54cc0c42617eae33e84c59c6cd4a70b80f9924d30092b203298fb03982f676219009fc3be52469ef8c67294fb2df702085fc9c4a06e3ef37e60b7eaf6c43cd45a11227a16d90be07c9512677b5675f6b05ab68c8f40466f786231e8b57ccd36a084151019d0af8185be4e09944f4ef6760357f93c5d040620b200ae3732314bc3dd6a5b1d274b3bf46e635ecce01e05c4be92cc126702b46fdab36885b0f792ac169f0e50be95d9b19d4aec7b4711a8ad1b036c6f677a0a96798b073e54b692ad1196ea8e9093be811752a11d0ceaed776cdac88e748b7bb277f019c052dfb50927e99eec6438cf0338dfb30927e91703c870ee0370be4f89b3a36f3fea5d1a4d3888d69c6a12eb91c0837e602354424b2583ba0240fdd046a8841dc464509703a81fd90895b0e3830cea27c0a77e6c2354c2ce0f32a81f03a89fd8bbe6228a5f0c381c38814f29d1f665de8e3afedbdd2f81279aefa0501dea42b682253e2bc6fbee37d3da735faa86d78b00fa6794d03b5463cf1399fb5138f79afbc93a523b26dbdc672d40fa3975ff28efc45be21028175f0e2ca7c3d5890a5733e051bfb0678236e1dc24b24ebc46c0f2beac590ffabfb3efccf300fa5735391eefb55fd2dd15c82c780b70065fdb049370de2719cc1300cc6f6c8249d8994206736f00f35b9b604671b4e96000f33b9b6012769e90c1ac0030bfb7092661f71e19cc3d01cc1f6c8219c59d104b01cc1f6d8219c59ddaf700307fb20926e1ca3732982703983fdb04338aeb824f01307fc9c4279486b2adf3134abb0390bf66ea5b3f4a6a86e0916d863f0ac0fb2d135638642bb5c26500e4ef99d88842f522f111a28d60a9ffd6356d7617d04ff40725d66d24561ef1320156c95ec1083fa39445058e017bfc33530b0c121f36d6bf4395a1e24df655aa8b00cebf32f14d3477c37cbe8b0c0f9a217c64333e2f06f8fea6c4d743f38eee972ffe773e207f36f097ff440574140730f606a0ffcdc4775ccc1513e1da8e8654cea0167006ff516f9f5f2ab02d761854c8f6261f682383964305ad1580c66a5bb8cf3be98e8664fbbcf707c538662356d2de7532acaf036bad4589b5ba3546d1dfa0a21340599b1265b8c53284680ba9d07e04d0d6a1441bfc230f51dc16e00b8033cb269c832289b325a89aeada84b3209238a7009cf56cc23938923837029cf56dc239249238af03381bd884736824717e097036cc74a3c97fc707e1b82559c7c71680b651262cd5ff0ae328eed93917349a1adb84b32092382f0438b7b109e7a048e23c00e06c9289f7780ca6b7a013ce2b261bc9fc19a06c6a0bca8248a25c03aaa066b6a01c1449949301cae699e8ff0cfefd0cc209b164db574d0385bd052556b57d1adcde6f92188c5bcbdcaeb9c477ada3bc69d5610068cb4cd829043acb09ce0516b3ad6ddfc45c80b5554d7a52288eb4c893cde764c093b6a644a926c7f21922de3dc1b69ed974bb02bb6c430993cfe9c4672d71a864f0b6a582d712c06b4b09af9b73c2c7808ae300a74b70454ccd5c2a96dd21c528e4e84d063b10006e4709b827abba396aeaeb8409bd2a596fd3bbc0abb6afc90a2a63db05cda7b2daeb01ca0e94281b683ed5b544326064bb7cb403c5bc634d4e62f0368ea2b8da722840d929138d23d87c2f8a2f3780b3e4a3fb2ed411c0ec9c8997cbc48615d52f3288e2b758f38067ec621b50c25a9b0c680900dad536a0515c06b30d009a6d1bd0287edfa00b00da8d12a8699b3f3fbd9e847e94acd7f33150316d6b23d42876253f05a076b7112aa13f25837a1f809a632354429f4a06f52100b5878d5009f7f62283fa1b80dad346a884a39e6450ff02507bd9089570ae0819d4ef00d45c1ba112eef94506f52700b5b78d5009f7b121833a1734fefbd834d99674271bbacff9009c7d6dc239289238c7039cfd6cc25910499c6500677f9b700e8e24ce0b01ce0136e11c12499c9f009c79991818f13701675024f7a75b0f60e6db04338afbd36d003007da04338a3b74ef09600eb209661477e8ae04300b6c8219c51dbaf7003007db04338a3b74af023087d804338a7346260198436d8219c5d9c98500e6309b60467187ee3100e6709b60467187ee7100e6081b7760226d2491edc0b43bc03ad246aca4ab38c9b0fec91258475162ed6ac06ade8d698a7c24635f899d41053717d8ec689be11236a7c8e0b60570c7d80c97b01223831b0370c7da0c97b0b94506f77de073c7d90c97f095950ceec1c072c7db0c97b073850cee08007782bd7b3712da6d2115da72807622255afe6180c4072b0a59d4bf1cdb0478d349360de091eedf4436805707d861a14d3849bba3c970e6009c4536e124dd0e8b0ce70e00e7649b700e8e24ce0300ce2936e11c12499c0f039c536dc2393492387f06388bedddf492102dd936044703b4db51a2ed6e40ebb7210f7b5709679cbc4f65bfcb00e46951804c38478a0c7231803c3d0a9009bb03c920dfcb12906744013261b72019e49b01e49951804c38244306f95b0079fb2840261c9a2183fc00803c2b0a90093b0cc920370715dfec2840266c279341fe0158f29c2840269c834006b90058f2dc2840269cb14d06795b00795e2636ffc2fa26124927ee2227db6be53de0144a6c4149da9f4b867221b0ca1d6c41493ad24086b21740b9632626c805dff93c8afb555482c23e3f139593daa98a07e68faf61ebe2dd91254ec27895a48e139d07f996c91b9c70abc52ee9a46f656463b85381edee1405c8846f6564900701c83b470132614f1919e46e00f282284026ec292383dc0c40dec5965603e95e1764ad86bf41f5b6ab2d2849376620437909b0cadd6c4149ba569b0ce52c80726126502e65e69daa3336d9986c97f485a0802fa244d942a2e456e7fd8c47863ede5148668d00e1e29a2cd8501ca935922d8e7b19a05c92096bacfa5199a85be36480702925c256d5f846a529a925ee4c857134c0584a89b107d377a056df2f9beefcae04cd756cb251221c21e8de54a03f057579594d7acf8cadca22abcbcf07289751a26c2d510e767e126b058ad9d6f239aedd40e12fafc9f6a5b7468fe2e6358b01cae59428ebf2fa2eee3b2be950917d7fa73d40b52213db2ce45769fc6c3d45b810c0dc9d12667d9e5b7290b8500e0893e1229b4bdd10e0da231373a95573a7ccf8b122acbb228adf32b901a0adb071670ad2f14cb29d29c682c6ce4a1bb1924e5e20c3fa0bb0d6559958a3820f139768fde7844df2c6543827029cab6dc25910499c67039c6b6cc249ba171519ce1500e79e362d4823dd2c89ac11551f54496b6dc249baa51719ce210067a54d380b2289733780739d4d38074712e73900e77a9b700e8924cef700ce0df62ee68de237c58f02683752a2edc5aaf6667a671ab9f3e6578abff97cfaf54264e283c5f304b50c8c608ea2b2e31ea049b5c996591ea4ef4e641d276f03949b6d4149fade44867247e002f6b20525e93b1319caff8055ee6d0bcac19144f914b0ca7dec5c9210c56fe8ad0516baaf3df391a2f8859d76c042f7a344d9942586e4ca44637e65a686e0c8a6238c0476b83f25bc66005e620838ea239867017c0750e26b0ff0953b1778b37d9298febf96a9991d2b9dc0fc1e0fb7568421037a1d15d02300d0032981e630ef18a73ec170eb5e7df112f0990765a256579879512f8fdfdedaa6c64e03580fced4ec10b33b28118f66c0155c4305f370e00a0ea184d9cdd04472a171a0abd876a20b644dd2b125426b251b59aa0d001f6acf0cba287eb16c3b80f2309bc63c4957b491596619c079b84d384957b591e1bc1ae03cc2269ca42bdbc8709e08701e99e96110ff3be813ae6f2fa442db1d34a08ea244db87612b3adc5ea6eac69b0a9db04b05398e9cb76a89b72c249bd17c18407e742616240cf4e0860377d1ee0b381fb88563ec9cec48e86dc9263bb607f6796c26ecb3806d9d0b667601f6799c4dad8081945515592b602ac079bc4d380b2289f35c80738b4d38493f544c867333c0790225ce8e5a43aa4c5438ae90adad7baf21a88a4ecc4455a4a0ae483a6f247a55d187c03a4fb2056414d72ddd08409e6c0b48c2f9776420bb82a27d8a2d20092b1e32904d00c8536d01493843840c641100799a2d20a3b8a96a3e0079ba2d2009a77f93817c12803cc3169084fbd192815c02409e4909b2034b3e8f7ea213908fb6a8c90eee903161b54336587c01407a969dd31409e7d6914d533c8925b09e6dcf3445c2fa9cece5b136b0d0732851f6ace23d57b1654ef0492cb1f1cad6bd5dd50300f5b9999ad4e8767cac6619db9d8e6c99d77ea0d09f5713960ac784fc2ffb22ec08215bf6752db0d4f333d14d1774cc288a2346cf03fbbdc046a8842d0132a8cf00a817da0895b0d7890cea8300ea453642257c1520837a1b807ab18d50092b2a32a8b702a897d80895b09d4a06f51600f5521ba112f65291417d1240bdcc46a8843d5664509f00502fb7112a618f0019d44701d42b6c841ac5bdf11e0150afcc448f15de1118f5c1e58d00e55535d9f9e7ddf59bd02ac996d9fe0adef3afa644c9f788dde0dc5ccaa63b81caa5759647b017aa39b0be6b2891f1cf4c78577f9638924b450f539983d19d0b5a11c102bc0d40786d26c69954471e5f84b0515625dea29ca1f7a0122aa43b83827c5d26a6290e147e512dede69b576f141e72b573a534535dcdbda8709e092cf4fa4c5868bef8ad8e739c5b7b3a4cca84e08caea0272bf44703a43750221da015fad22ab6e9edbb4fe02d96778a93d835618389cc9a2f03cee1467b16d412f6e1938d962e05567c532656d2fb1b781e1cc9d5c97f01bbbcd9269884ddcb64307f07306fb10926e1000819cc3f00cc5b6d8219c5e5096f0398b7d90493b0a14f06f34700f3761b577392eecc48d63dd70760bdc346aca4dbb092617d0d3497eea4c4dad580d5ff149d4194531fc826e93c016cf62e9be11236f4c9e03e03e0de6d335cc2863f19dc8700dc7b6c864b387c4706f75100f75e9be1120e3893c17d0cc0bdcf66b8845324c8e03e0ee0de6f335cc2b73032b8b703b80fd80c378af3a5ef00701fb4192e61cf1619dc7b00dc876c861bc50fbc3c08e03e4c09970ffa9632be7c678d80b7942d074b7fa2379ec5271828708f6462c415eb31a8fafd3bc2424e36ade22b80f3519b7092fa4c329cad40b17ecc269ca4bb4091e19c01703e6e134ed2b12a329c9b00ce276cc2392492386f04389fb409e7d048e2fc16e07c8a1267b8cf0946b1fbe45880f6699b76d323fd6830d96e7a3b8346d33336e124fdca2d19ce2b00ce676dc249da9d4786f35080f3394a9c7dabf5a389197dd5cdf09b2bfc2c4f08e944e01ba8a06f061ef6f9284227ec5b2583be1a407f218ad0099b6964d01f01d05facc96540de76441437fefa1e78ea976c41591049944b8155be6c0b4ad2b15632941301ca57285136678945186ee4eb9d80eb58d457b1ec0b8af5ab9400d5c7dbd5928bca78d592da9649511c5ffd1a58eb6b94b0d5e75e79c4cb046e257b950c12bd59ad3160a9afdbb94d22a14d926d933810607d8312abda19d55f13297a55d1fd00e49bb6808ce2dafdbb01c8b76c0119c58de11f0720dfb605641437867f18807cc7169051dc18fe3900f25d5b40467163f8a701c8f76c0119c58de15f0220dfb7056414dfc45f04203fb00524e1aa1232906f00901fda029270ed1319c85701c88f6ab29b0d8a236d0091bd7b7f00507e4c89b28973c277e0d9e43c9698f999e8f7899e15b600e83ec9c480b1779b1837314562c2cd4aa6beaf4cbe450cd92646c301ce4f2971a67783f728cea9bf17f4567e4689ba9b86dabba35951fc7bb65bdb37195f03803fb7679342c2ae0eb24d0a5f0528bfa044c967c2f048135b6fcd167ff11f326c645f1b690bbce997f6ecfa14c54d370603945f65627e47a2624a6cfd1666d732c22a8a6cf4f21750ecbf8e2274424b27837e2780fe4d14a147717fbed301f46fedd920692065cf0099af1e09607e6713cc286e77381ac0fcde269884bda864300700983fd80493b06f9f0ce63000f3479b60467123cebe00e64f36c18ce20735fb01983fdb04338a9dd33d01cc5f6c8219c55d4d7b0398bfda04338a1d7c1d01ccdf6c8219c50e96ce00e6ef366ebf493a839e6cfbcd9900eb1f3662256dc89361fd8325b0fe69ef8644a4efef642353b7009bfdcb66b851dcd5f45600f76f9be1467157d3b300dc7f6c861bc55d4dcf0570ffb5196e14b7e5b806c0fdcf66b851dcd5f4660097d5b1186e1457dd9d08e0c66c861bc55d4d4f06706bd90c378a33b04e01706bdb0c378abb9a9e0ae0d6a184cb17e3ae11a84ae543fa9034193cb2fdcff87459052f8b129e69ffb312e7b842c45124c4f07b658eadae761e59232618a9f98284af08855468b703765997126df04d63095f0ac82c350be0ac67134ed22f4790e1ec0170d6b70967412471ce07381bd884737024719e047036b409e79048e27c1ae06c6413cea191c4f91bc0d938d38d26ffcdf92876fd1d03d06e4389b6bb73c25b9889f9a5d399da2b6fbdf3e05299a0eae7a1466f0eea269680dc8412727b86ed15b575ed74f215b0daa69440836d4f18c5bd4ede05b6d9cc1694059144b92bb0cae6b6a024fd720e19ca3600650b5b50927e6e9b0ce56700654b4a942d58621db577256a86f67a24eb59ea0f7c642b4a84a9efa047387847b683de0680b5b52d859c74620f5921ff1da06c630bca8248a2bc08f8cbb6b6a024fd883619caed01ca769428d58e3c1c55597cdb83625105f13d5132540191812c02c5bb7d26400edc4a414e02203b5082cc66de3771b5374f8978c0dbab34d179a892a98f0aa81084efe5d750e1bd1814f88e99b0d3115ba99d6e0fecb4132548b5547c294bec2ff1bffaa5912301f4ce99a8f921746c463fe9a686646b4e1601945d323100e2f76b4f83292d93ec6b4fd7029c5d6dc2493ab1910ce7048033db269c0591c47906c0d9cd269c832289b31ce0dc961227d7804ffbaa944d273e35ac504e038bde20712380ad3b25b6deccbcc1a1db3557dd8071a1137ea9e0c641f3162af10730fa5201df0734f673a2069c70ca3819f09b00f01e51034e388d9c0cf8fd0078cfa801271cab2203fe3e00de8b1278b8893e515cccb31f409b6b4bb736e9eb0359e7cc9ba0a5d1db1694a4af0e6428e700abec630b4ad2d7063294ff02abec6b0b4ad2ee1632943700abec4789b24335d5d0d63332b01220ed5f93d6e9ed5b8de2ee7cad01ca0194285bb1c4849ec4208bba9da12116ba1d2381bfcccb445b731d5beedcae64d83abc29f201efa6f284857d0615da41006d3e255ab57d97bf8114d27da6c8ecf43a0073a04d30a3e83baf073007d904338a3b9b5e056016d804338a3b9b5e03600eb609661477363d1dc01c6213cc28ee6c7a398039d4269851dcd9f4540073984d30a3b8b3e96900e6704a986a5d5dbe187c2e1330273934d68aa4f0641789bfb9800c7c24ee262aa04701a023288176044013c73942d86af1aab9f57c796f1e803a92126a530095bf97978b97cd8cbca5936d079b07e08da28457c0b0aeb8122739dc874e627c9f9c95cc5dc5bc4a44b4962d7304b86b978be321135fdee316cdefae1057d6d2becfbf4135767405e8711a4def1612f838f2f5d201ec21b267a2c0bd871439d9399639a20817859375323705963d86126aeadb7213b656c91cc62860ab636dc44aba4c9c0ceb8fc05ac751620db7a31ee97813d9d8fc77c066c7db0c378a1b6dfe04e04ea0841b7cee34e19a3eb2d9a90b80239868134ed2d5a66438af043827d9849374c52919cee301ce424a9c6a6cd4bbe2746b191b9d0d301651620cb74b296175544885b605a88e2667a2c063c5bdea2ea5844d27b259ff9f034b9d62134ed2ee69329c4d81754eb50927e9f446329c1300ce629b7092be2791e1ac0038b7b309e79048e2bc14e09c6613cea191c4f939c0393dd38d26ff6ff151fc6ed9f100ed0c3b3bf508b19275eafd031a4f336d7af924dd319fece5733ec0b9bd4d3849b77827c37909c039cb269ca413ccc8701e0470cea6c4a9b694c1ab27ff5bcac06915846d02b20915eb40c5358712bada10099beee3f5aed11b2dcd01d63bd71690515cdbd419809c670bc828eeab5b004096d8029270b22e19c83e00e40eb68024ace1c940ae022077b40524e1c206ba55c900e47c5b40122eb72103b90680dcc91690848bc0c840ae062077ce440748f01dc809ab1eb21dc88b01d6059458535be84dd82c225be87d1778e3d98512695b03d2649dca841d74645dca9f02fbdcd52698232208f3330073379b604671b0e3260073a14d30093b37c860de0e602eb20926619d4e06f30e0073b14d30096b7332987702984b6c8249f85a4906f32e0073a94d30a3f84dd07b00cc529b6012be5e92c17c16c02cb3092661a70719cc5700cc659430836d7515c51d466a8197c9724a946ae92cffee8d929aa149dc3b53c1db11d8e1f24c74bee58b0eb80ae7326700e71c45fb632ce700902b2841f664e66d8021caad7b97dafd4181df9d12b5fea5e484dd6e5dc3bd0702a07b64ca096c8d5f64ea079c404526ba8ae197c336ca9e76af6dc2de7742dba4db1803d8e6ca4cd8e6f0add436d701db5c4509b2330b3af3783a5bc1dce138420bed4d05f60460a1ab33d194c7c62fbd4df928ee22361ed8e89a4cd86862bb55ef362eea38d109cc3f53bd81f1ef26ac17de95b0f3b81315d84b01d83d6d054b58f8c9c06e0bc0aeb5a7f0138e639215fe2500652525ca6d9c13efb7e7139b0955467082425d006e1d25b8e0ab85a3389ede00d4e7eb6dc249badb0219cea100e7069b7092ee054286b314e0dc6813cec191c4791ec0b9c9269c432289f323807333254e7ec203f33d40a287a901a8b1f7aac9a134fd95318aedc63781cded6d134cc2f96f6430df0230f7b1096614bfca713580b9af4d30a3f8558ebb01ccfd6c8219c531f32b01ccfd6d8219c5af725c05601e6013cc287e95e31000f3409b6046b13ffd5000f3209b6046f1ab1cfb029807db04338a5fe53808c03c841266ea1b9b13da28d9663d9d00d6436dc44aba812419d6175802eb619458c3edbd4dfafe4e369deb0b60b387db0c97f07d9e0cee3700ee1136c3257c8b2283fb06807ba4cd7009dfaac8e0be03e01e65335cc29e2932b81f00b847db0c97b0a78a0ceec700ee3136c38de2e4efe700dc636d861bc5cfa0bc0ce01e67335cc29e2d32b8af00b8c7db0c97b0a78b0ceeeb026ebd2c4df8e42ac2278951763ecebe54a4df9d4d37c07977e4ea9709ce4b9d733527799153901738ff83e5c8aece7fd3f598584456c436b135e22a97572a64af74eef29455b27cbe8a600b37905ad2407263f59ddf7c1afa12877bb993b6d5ceefdc5843e7ea0647ca5279a55ca6888388c59a4bdd5739f767b03291d1a5f10c5fecc8e214f2fa3bc162439d5fae890c884fd11ce0f99861e27af532b9e6c9a59dc0d58b99edbf226d79569d46ae99793fd038007ca211d3b47afdf0fc6f9c2457f206f0bcd89af53f91e7bbcc7661a66d638d9cbf4a9c9c778597b1ed9dc0a52251fc5fd6ff01a08465bcc7440400 serializedProgramBytesString: - serializedSignature: 9cf616cbe606d24dcf7cbb6e5dfdbbc368d74526b34cd60601471fd65e2cbe66fc42c1fe6c2dd2203e8c84395814d8fd250094f1994902e4dad2b242ecb33603 + serializedSignature: ed4f4ebe045d39015d283192d248b1a7fd5e62e84934a59d15c27fd3e1d5c9ba705166e2c17e767d1fa48a7991ee2a07f1395064c9ba15ddcf708b8c8ab9e409 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset b/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset index 84d70ba..f7fb29d 100644 --- a/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset +++ b/Assets/SerializedUdonPrograms/09dda5f2eb755fa4e858f339c8b1278b.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c16c5d687e70542972a82140141098aa4d211818412e9104045a5258448203109cd8a1d3b2af6861d7bef8a0d7befbd77afdeabd7eebd57bf9dd99dbc672773deec66f72cb3f90c3fb2d9ddd9ff9e79e64cd999d9d94619ccfa490cb07ecd6133591e1bc866b32256ce56587fe559dbe5d63f7b4f1e9fce2aad6d89f57ba1756e00eb55c795fca75fa28bf5bbc0daab62d5d6952bd9626b5b2acecf62c5d6df05d6b5c5d61e3fbac4fa5f6c854a34b12e9acdf2d9343695754e74aa43628eb8a8ca3996e0f14a34b77e8f656badb3c5c2287e930c71aab3f56b9675a64a9c5b6e192dc3cd630788682db7ce2db6aea9646596e622a1d8fcfb294cfcc1ec4d3767dbddd976b5feb770fe6eecfcdddcf91b86e7c779ecf64f11b607082b3577b2fea759ff7f73f67bdafb8dfa3afbbdecfdc4f68a464ba0d1dbd9eeec6cfb385baed1d4faf35e0ff6a73ab78b6dc3e4a702eaeceac465b41297561e19b774b6fdea089f4aa395b34d0fa0d1da4eeb46133da4756b709ffe4e5a376749dfe2dbe74098e79c6d1327edee538ea739c7ef578e37458e37438e37578eefe66c9f07b63caf5cf38273cd0360dfb2b349bea2f1a213ee416033d493e7b728d7bde41c7f08c4095ef71272ddcbca75cd94eb5e46ae7b45b9aeb972dd2bca75f2781fb0cfcf3f6cc7b1716be7f8eef67e938a14fee125bfece16c5f73eef308d8e7db579de38f827d9e1eafd9f74f6be21c1fe86c5f57745e4fad93969ec2c64ce62ea706286cdf507ce50d47b3c2b16d334bfa39dfbee9847f4cd17b53d1dbead66b2af7b39dedbf9c708f3bfb598a5df2fc16e57c1f705f785ea6c17f9ce34f807dbefd05b95f8e725ebd5f2e481b787e9012eebfcef92795fd5465f1764a9cdf72ae791aec37b12f49c96e701dece4f9b0d8493d8c9d3c8fb11ba284ab0f3b19d7ffb16439287d54fae4bb8ece3320ac3cceb75f33b7ef7f6d6bb4903e9fa6e8bded847f16ec43dd3f95f37f3adbbf808d0e6bfe67cdb1bfc031feeb7b47e739b0cfed926d1659de4abbde57eefbbe6297f487e7c13e2c6fe4fd5e50eeb72e057fa9dd07ec8332b6b96c070df5c972786d566c0438b6a7b31d098e49ed77c031e8032dec30191b9c63c39ced7b20fc3b8a6fbcc7dc3e3bca277b180fc919c6632f4d3ca4f6079a787c98221e1f81f01f80f0f21c8cc76867db4cd1ff5889c7c79a788cf1180fa9fd89261e9fa688c76720fc2720bc3c07e331d6d93657f43f57e2f179807848ed2f34f1f832453cbe02e1bf00e1e539188f0ce62e8b1e01fb561edc2e5d09f70d73d7bfdf30773e943a5b159def9174ff87c24b3dffad72fe5b67fb9d62c7778a1dff74cebfa8d8afd651cf033be475f0fc4bcaf5b2ac7a04ec5bf16b335d09f78362df0fce3647d1d9ead669db45497bc9e1df0a07f5fc8fcaf91f9ded4f8a1d3f299c7e4638c9f3b26e7d1ed821af83e72527b50efc95b9ebc05f15fddf58b2dcd65d2fcfbfecece721e17e57eef3bb729f3f9478caebf833490b10866fc7b19abcd54eb6d5ebdb369f606f138ddc7e23f6f936c15c6dea8413b7764efbb7dd2647c779864c3456741ad7a1b335858d05ccdd361fcf5c7924219f2d1f00fbd6fff6adedebdacbe739272d12f299f331b75e224dd1dbead6ebb0c009efb42f13dd98bbbdb7b762973cbf4539df07dc179e9769d09db9da9709a7ef26d103b95f8e725ebd9f6c5f4e54ce4f72874becc45cedcb9a7d1f6df3847c6e7f1aec5bec3a5e5407bbc975b093e7c36227f53076f23cc66e8a3b5cbdd84d75fb1f9bce9279dc890f9b018ec9fe9999ac26dfe748fba639f76d960c9f9075d42c675ff691bc02f6adb4d97e740a1b0b9dad6c3bcabcd282b9caf184b4718ee6fe73411c64bb741f704ce63bd80728ef23fbd2ac3099b2ec9eed9c037d51899620bc3c07d36b5f67db54d1df4e8987f4e7bae221db41301e8e76a28d261e6d53c4a31db8571b105e9e83f1d8cfd93653f4db2bf1681f201e4eb844074d3c3aa688c7f6e05e1d4078790ec6639eb36daee87752e2d129403c1cedc40e9a78744e118f2ee05e3b80f0f21c8c4713457747e6aadfc53e28b7125d99bb7e57af97e7653b627ff779768086c381c9b87491cf93f56d07487b1638f7e8e9d8f32ad8b7c274a94ea135dfd9cab2bc1773d7cfbd1c8d1b1c9b3f73df3bd19bb9ebe7f9e038d4dbead6dbf12d27bcac637665ee327f21380e757771c2bda6eccbb25be6c99d9de3af837d7edfadee706cb1b35de4847f43395fa4dc473d5fec1c977d855eea5d69db2b6edbbacafa6189923625499fe9f691b3ddaa684b9feda368f771b4e5f3dc5245bb34a9dd7729a22debddbe8a765f475b3e3f1da4682f4b6af7eaab6863e95ee6be379afe6fd591fefd94f4ef67dbda6d5ba4bfccaf4a5a31599f3dcc5c794aa437bf673a733f7f48ffe9cf92e54a7f10966f7763eefcbb9baddbf32b47234db987ec377d16ec43dd3d94f3b2af6f7760c3eece56f689be0ef6ad7b77ffcabe6f8fd14ada672a69bf1c1c8736e630779e97fb4fd9ba3d253f99f6198a1d190e03e9fb2bdc3c6bd2614b1df6c9ebfa28e7b728e7e5f37889fbbc645a737d9692fef2fa5ce5bcaa2fdbc9e98abe4c876ce66e57cbf8486e6a7cca95f3f27eb2fd25d32157f10569a7f49541ccfd5c2ff52b94f352ff6077b8c460e66a97fbcea38391f36a1e55e3354489d710255e43ddf1aae13cd4ad5b2b7dfb83f4b5fcb4bb2cdfb17240b633c228439639360c63fa3204f41d8abf6558be1dc1dc65c8085bb7afecdf4853eeb1a7c26f4f45779472dee9774e807e49f137dfeec5dc79772ffbdebd07d8f7ed7dac736fe9d363149f5e0e8e431bf399bb0c91fb4e19d257729365c868c58ed1b61d7d6e70c255ba79a265886a9fbcae8f727e8b725e9621cbdce725d39aebc72ae92fafcf55ceabfab20c19a6e8cb74c863ee32244fe1a6c6a75c39af9621321dc629be304ef115d957f0bca25fa19c57cb10275c62020b56864c40ce6365888c97ec737816ecc37815b8e355c3b9c0ad5b2b7d8783f4e5eda835c0dfa8cb9052c786bd99be0c99c492f9771208cbb79399bb0c996ceba6cb790969ca3da62afca62abad394f3b20f650ab0c1e9e7494c67eebc3bddbef72e4effe72eb2ad28f3e84cc5a79783e3d0c6d9cc5d86c87da70c49977d3eb20c99a1d831c3b6a39f1cb7a872f344cb10d53e795d1fe5fc16e5bc2c434adde725d39aeb6729e92fafcf55ceabfab20cd95bd197e950c8dc6548a1c24d8d4fb9725e2d43643acc517c618ee22b7399bb0c91fa15ca79b50c71c225f661c1ca907d90f3581922e3b5af12af7d9578ede78e570de7fddcbab5d27712485f5ed7c9b90141ca10b5ef611e73f73dccb3c3a47f9f424bf64bc8f2647fe62e33f6b735faa7db76f75fe0be77e200e6ee7ba806c7a1de56454fce6192f9eb40c51f1782e350773e73e77fb9efa5cf1d2b6b65dc17b0da733ee47d173257f99b58008ef3adf4c707c0bea591a1f6074bbd22c5cf8a14dd62e57cb1b35d0c6c6ca6689628d794289a4bdcbe5be3370726354518c03db1d4b9e66db06fc56bf7e9eef072ec1b0dbf0ed80faf5bc9dcf954e6471927596e3e0bf6619c64fa3fefd667ab9cfd8314ff5ced6c653927db760f837d791ddf9629fe5b66c767c045ee7035fd33cb9df0ef807dbe5de11cbf5fb16f8562e7bbeee3225c0bf735320e22aeb00c9571eb03f6a19fabd72f09787d69c0ebe707bc7e81bfeb6beef7661de15face37ecfd6f3faf901af2f0d78fd9280d72f765f2ff3604d1d27f970de5679b79b1cab0852c7c9b2b98225f3816ccf1fece83c02f6adbc9939590957c15c6540a2c26d4fa252f1b391e038df963be7df5374cb15fd77ed786796b9756aeea3e8c8ebc57c21a8f3be727e1888bb8e552a7e73158e55cc5d4f55d9ccb29adbb6678d76c2cbf65cb59b9dd44b542b7a5b15bd356e1d3156942a0ef27eab94345d65eb65bfa4845ba3a4a9bc9f64adfaf23ee038dfca7ae73dc5ceddc079b0cf647bf503b00ff5d62a5cd73a763fe50e5f63df216e9f933a35ba872af6cf01d741fbd4f01fd8e9982ddb7cfb68e2057d50ead4953ea97c4c8e971f0634e4fd0e67b5db54b2ed700473b7a90e07c7f9f64885e991b646ae7c57264dd13b8ab9cba7a314dda395f3473bdb63808d339c63c7268f89f3f218dfae73749e03fbdcae2b1d8da68a5dc729f73d4eb1eb78e66ec31cef5c3f53b9df0bcafd5e527424ffb4242379aec6ef0e67ae323a677f702d0f372d801fc83cd8ae0e0d195e8e55af0d704f4723710248af136c3e83e49cb88e8a4f9ee030781aecf3f38704b043f23b348046aa7347dae9354e8e21ad53e2742273e795136d06833fb2af1b22ebe2a3ecfd41b28e5aab5cff28d8e7dbf580eb7a5b7348aea3e93cb3b0a311db3a82eb601d2175ce73c2c97240ce2dd67170f22093f3244e6235be2eef2b8ec1fb4bdd8fea991ec77ab02bd5f5aadf9dece8bd02f62d0e4365b9217de8b83a7ce87885b7bc8fcce3a73277ddb10e1ce7db53145f39c5b6639833ff6f981cfb3bc1de9f2ce748ac07e15b80bfbdd8ec87d3690aa7d31cfbe47b0b92d38975dcf324963acf9ccedce5c0e9f67d866f6f5f375cbe637032c2e174c0e1748f36a5e270aa62df06e6ce371b1cfb9e53c27754c23f00f6f9f95302d874ba1df7bd65f9e1d83062a87d7cc402254d4eabe35eed9debd7d8d78f9475f9192cb54f9fcdf43e7db6b3dda8c47da37d9f9172bcef4c45ff2cc527e47dce63ee76992ca336b29af266bc330e3652e6dbb335fec1ef2db5cf71a76b4aad739ded2c242c3f266dfcd8d93f9fa5f47326f353aa39c317e835126780f4bc10b98f6477a69b5d8d5f9ee96ccf52d250faf9f9c97b88bf65d814e93a6aa8125edee36cc5860ee038df5ec0dc75420745479effc47dbc268ee73357fb69cf758abd9ab8d470c0e2f29a72ef0fc3b16dd464e5fe67827d980e3bb875c43e6478915ba726dd647c9e66aef8ecb554097736abf1e1bd6439314b3907d248ebf31723be27ef710e739795e738b6c8e7a06c25dca7ee70a3e55cf94bdcba62ce939c2b28ebc54bf5b688bcc2b7e73af7f80cecf37bc86758f92e481fb00f794b5b2f546cbd50d1d9a4e8e86cbd8cb9cb8acb5373f45456a4aa2fae64dafa628c33af6d8cac93a41f5cc13cd5176336dbd7e7c9f796aeaac31f2e626edfbcc8d6199bef84bb5ab9fe1a4547e6a98b992baf887da40c1f2bc7341c5bd5fa60ec2dcefeb5cc9d9fe4bd2e51ee7589877b5da7f8802eef5caff8c00d75f8c0151e7cc06bfaa5f2959bf5be92b7d149eb07947bdde8cd57f29cf7dff365dfce4d8a6f5ccadce5f0a5f675f94efb377f80725d47e5baadca75453eedbc45d1d7a5d9ad4a9add56479adde823cdeab22f559add6edb51f3fead97e7fb3bea713f79ed9de0dabbc0b916cabdeed49c4b659bcc9beb02b0901a1b1d7fd8c4dce53edfb7fc63fc46773806e6fdb3bb993bffeacaf05436c8ba5bceb7bf4cb1e132db86095d34e1a50df730b72fe96c90d73bf3f313972bf7b9dcb9cf3a4d78791fb90e4d7de3ea8c9d2564f924db49728d940792f71261f8b107c1fdc738db2dc9fb4ef432ffff21a62da7268e7434a6a7d0906db82b99bb1fbd2338ceb7573177d972957d8f02c9e561f7753575c6d5ccdd769065da35cef1cfdd76b04701a3ab9d638f8163b21edc9a64345996a38f00ad168a6e47707fd046adb36da9c4a7a66d2acfcbb6d066e66e0b6d76f848dbe4bc81543efc047397a9a9d2bc9d739feb9c6b5e07fbd67df7bed21dae26fcf580cd93cc3dde28c33a63020959667f01f6f9f606901e3780fbb6007ff3edb5e0d8b5b65d93462376dd04ec7a1ab14bf6c3dfa2d8e5d457899bc1fd6e06f785fd86d20ed9172ceb9c0d2c75392bd359d67b9f827daee7b4a926c93eefdb9c705f827da9c38fcb7ab287c7fb7bf185db155fb8ddb66df2b1ee704cf6f3dfa170bcc339bfbe0e5b0ef318ce6f5fb24ca33b997b8ced4e3b1e53ee50c2ddc5dc636cb2fe95fb7733773bea6e4567ab12fe1ee61e737b141c87f77bd77d5c943ba9383cea319ceb585a42bca73c9115b385ac82658817b7fb33efcbe6c92beb5e304fbc23ce7ff19f7ee2b6d56cad7569b16ed5bad9624dbc6a9663f9b26ed5ba1dc5bb9af2ee79e2f7422b44a910fd3a51eb16f7d6ba0537aeccfa570c96dcabb28e4f102bf6f145f74aad3303d9646bcbaf5ac0b2d83ceb9f5b658e75db32b6d2da2bb47e5708bd0596d9b543d61525be3c9f7acd4c4bd35e3d70b9754402adb0f6cb8485b3c4ef55c2d262617d8175ac5aac65b88295b0b1d6768db85bedb8575a7febee59e820d3dba85f44103b6e2f55289329df8a0db73e43f8e2df29b22d5284a36fcaf307ff69922146a34faa95127f33b40b19fe9057e06864096409d7b16c9621c6df67d622e83f8eb563a8f76f9bf760969b322e7a323cb9bb8918245378e0a11bdadc76fa3d4bd2dc51cb61196208bf7b1d514b0596eba58bb7a1fd44212dad49263754c59fd0e117d33f674588df0e572ac2f94f80a6a2f273278078ddbdd0fa638df5bfcc0a3cddfabdd0babccc29e7668860fc7fad34cae482cd04e6da95685da662a01be9408be7bec26de2e7d8d2b5a95137af894512758668197549e190d8bd4493a9b1d36e9259a6f7acb70a4ed8f0f02f6f4dc91d322273d86569faf46929d2a73e77c552a8b12e855a469d15ea2efb53a54fab9a7825d387ffe819b6467cbc2e1b30824d74045b6d1b1fe7b6d7cfc7f924d23d14867a7e6d52fa602a0b3082693a826245a9d911129c66597890d362ac1fc3b69e19b6130c77ac153b2f3660149b6a2866728aed7566b550cce21621c2cd30e10e01859b63c21d030ab7d039d4765167497eae5ca82cb4c2fa7727de97babb5aace9fda9139227eb3601f3a696bab4e10877d05aa5264e273c715a61ca9d832ab7c694bb0455de4ee750e21db8e8dbebf5ab237959d3d9731dd995a56a6efbad21dbe8e88915a6f627a557bb1b49fe35d6ba76a9c56195e81b58695dafeb764a4db49be7d2bebba0d98be93ac3fc5984116eabf37c8ebd0796ecaaf377c59dbf9d4e9cdf71272fc574775cb83d965f7b6af26bc24f7eeda0f3b876d179dc2c96cf2659e7165ae18b452f083f3e5be41459afdbc7dc21537b5c2fcf1ed7bb96c7d5d722cce33a621eb773081eb73d26de2704f14e98d7f50dea753b6066ef1282d99d31f15d4310ef8289f70b417c474c3c3d04f1ae9878ff10c4bbe9c479cb683756fb89f32feba796786b5cbc3b66f9ee1acb9bf8b4bc07e6e403823af94e18933d344cd6e9cc4ec1a427263e5023bec1a7782f4c3c4323bec9a7786f8d7886a8e08e62d1b671f4c36b13c4d7a88a5d4f98f2bee5624c845b24c757665adb25c20a7e9c5b51f7b05ceaba2bb3860fe84313d5f438e67d90903e16bc6fbea568b3e86b563e209e6e98cd581dbdb3cee1f9d33c7fbbbe56df3177d6f94e0b9fdf7f853835ddba034f4d7e9c0f89d6ca13cdf03cd1072be17235255cc26709d75797e144ab64c536cd70e3acdf2bc5a311ff7b9593bc85e2dec90ef4205989af39d74353b389da4debb48385d3667b70da30acc7dc7117acfc1da2297ffb26fc95bfbb62e24335e2653ec5fb61b5e9304d6deaab63211d531e1e54b93f0664840e48237f4076c372f6484dce663e73f6ee98e57b6a2c2f6ce2cff20198e5a342b07c0f5d99241e664a49cba4d94ee1bc56e4df129153a166b29ae1b93755685ebe4c61fc3b902b851da94b22be92a1b707d2d1a204e27ce86cc5ca9d81ba24e7d5d6189df93eeab70c5d728bc7cb28c72de0d86cfdc62dc67a4ec63ca61fb7f06203963c99bae4e1d93d5f93dd87a6f9cbee593a711e7e1cd3b447c5037cfd4665c65b57356dc2ec9f81d64fb3343f2316d93a3b798b6c82c6ce4cde6ee62bf335128952201265608abca56b82facf5db5e2938dc727072b66f7d614b38d7c16b3b998f8248d78639fe283b0d282bffe57abd13c5924516dbabdd8a196631f6e6ded8c516c71e47f975bbf39d912674206cff4bd44876fb5557b945b4dff3d58a518ac2961bcc3afb8a60dc615b384e212512c2c17d7716d3bddf8f96cebfc706b9b636d7bfb2aca0663f9648aceff783e991acce1876098a7e9302f080573fd61f662abd952a7acee25fae95758772a7374f9bcb622eb58b5386b5f5fc1e457a079695ee53339866265e2744d9938b2a5bf327198aeda12dd8b510e668db142558ac949fe2bac199e2bac994c3f9095faee5855355c972cf64c120f2d899978928cd02589e8948d72168e5a3df84b9442cf89329be967e0d4757f2c5946eae8895ee71911d2f3322f544f6e8e67727305b94eb5629572ea24426d4f9d33736ae21b368a39a375b5e85cdca1476105d8be9a02ac492b7f05d85e98e5fb692c6fe6d3f2d198e5f334963fe7d3f23158adb7bfaed6633ad353d41a6331d30fd098beb1b53fd3f330f10335e2dfb7f5279eaf13e72d3afede59d0a7f27198f88210c4c763e20b43109fa013e7fd098b7425862a3c1a179e88f9e1622fc2295cb000f392228d97bcd6ce9f97ecad13e7e18b19d2485dc20235522761984a74d995b788fd3652796564e2f3c0640cf5520c756930d45330d407e9502f0a0d757c9e09a662596b99266b7dd5d15fd69a86156365211463d331f1e52188cfc0cac81501cbc899984796072c236761382a3438b4b30a52e028c4bce4605d01bcbd3f2f99ad13e7edf84a2f48523cffccc184ab020acfc5585787e07afbe8c4793b74a517ab53b441f7c512719526112feae42f11f7c3c4576bc48b76f0273e0f135fa3111fd0d99ff8fe98f85a8df86f3ec50fc03ce590103ce5404cfcd010c4e763e2878520be4027ce7b260ef7e2e3b371e1853a615e6af265466b55f8bcbbd06f855fed54de25f56855f9ab9a176171395217177ea297ebae7eeeb518bbd73addbd784538dffa9769fd5f5c6b848d9fe16fbb570ab27eac28c2ac384a67450760c572a7f1b350b0afbf05c5980547eb2c68092c986f15bd9562dcc35fbdbd042b7e8ed1956d5dfd153f2558263e36844cbc14b3fc388de5eb7d5a5e8a597e7c08961f84597e82c6f2cf7c5abe0cb37c7d08969761fe79a2ce3ff938e53ca72c3bc02a1be639e5d070e7a1c33eb68fd8eec14659bfc781326bb1102ab3fe2ab28e5558c7968af2658de8c42c16478b7c9669cb31fb4fd2d9cf3bb09316c9c9e3bd6ae234dc89cf019a8119bbcc561fa0968b1055cea0b2fd2866c7af8ad91db26bc5957ee2b4421727ee2027d79c509e6ac5dacecd98fd33d0fef1f7605b8e39d9a91a274bf3e9641598f8691af1a63ec50fc63ce0749d07f4f5e4c1f6a37386b5cd758ed9de7c281be4841d6c6dfda4692596a61bb0343d23709a5661f73c13bbe75981ef598d25f5c6100aab953a71decae36bc80669e5adc2489d839112abbda64152fe38adc6389d1702a7353a71fe2ad4f95e38a578156aad4e98cf03e48b14079a077808a67c6150e54331e58b822a1f86295f1c54f9704cf992a0ca47689433c4db29fc817bdbbe7256bfd7cd2ed5f9b476587213e3c3923b316faf9bf97dd5ec485d9af136e065ac761b70f3607f6dc0755871717908c5c55198e557682cffdea7e54763e2576ac4f387f8133f0613bf4a23fe804ff16375e21ce3d55e4ad14db8f07158eebe2668ee3e1ee3b159c3e38ea1fe789c80895fab11ef3ecc9ff87a8cc97541999c88295f1f54f9240cc80d1a20eff9047232267ea346bcef707fe2a7604c6e0acae454aca0ba398482ea34ccec5b829a7d3a46fb560ded5e23fcd1de80997d5b50b3cfc0ccbe5d63f67a9f669f8989dfa111ffcaa7f85998f89d1af10123fd896fc49cf0ae109cf06cccf2bb3596e7fbb4fc1c4cfc1e8df81a9fe2e762e2f76ac4aff4297e9e4e9c4f0dbfafe68432359c2fecedbcc3e863caf6f958241ed04462abcf485c80893fa8116fbea73ff10b31f12d3a97f7297e1126fe9046fcbcbdfc895f8c893fac11dfec53fc124cfc118d78dfd1fec42fc5c41fd588e7fa14df84893fa6117fc9a7f865587eda8ae5a7c7eb959f2ec722f1842612dffb8cc4153a715ef3f145d203d57c5762663fa5317bfa187f665f85893fad11bfc7a7f8d598f8331af1df7c8a5f83893fab111f39d69ff8664cfc398d78a14ff16b31f1e775658c4ff1eb30f11734e2aff914bf1ecba92f6239f5a57ae5d41bb048bcac89c44f3e23712396535f099a536fd229f3c6d8ab2c7863ec668cc96b1a2687e5f963720b26feba467c7dbe3ff15b31af7903f39a37ebe535b76191784b97af7c46e2764cfc6d8d78e6387fe277602ef94e5097bc13537e37a8f25d98f27b4195efc650bfaf41bd71bc3fd4f760e21f68c4bb4cf0277e2f26fea1467c9d4ff1fb74e2bcc0f88805eba4bb1fb3fa638dd5bff9b4fa01ccea4f025afd2026fc6940e12d3a613e52f89917e11403a30f619c3fd770ee3bd11fe78731f12f34e2dd0bfc893fa213e7b341bff48224c56cd04731e1af020a3fa613e655f1d72c7855bc5527cea7997ee3c5ea14d34c1fc712f11f9a447ccf67223ea113e7d5f0b70ca986bf63f5a9869fc4f2cf3f99669602af07f8bc333ef76d9698a45f2146bbaa59159bc65633fbe3205562627f85afecf61466c7bf7476f0b132391fcdbb3dfc8a4a11da8f654f63967dafb3acb5b0acd03ab0ccdacd13638ef6d86399afbb3e83ddf5072c5d92f3f3f477af5fec9fc5ecf8b7ce0e9e67f93df8cb94fce50df5030a7eeefc1c5628fc1842a1f03c26fe5308e22fe8c47963eb6716b0b1f5a24639432cb3c827e399b0428e5ce023bc55727ed115d3da71f45f191f47e7cbcad0da8b8db4bfa44b779e9abf79a969f2f0647f1913fe3da0f02b98f01f01855fc5b2c07f826681d730e5ff06557e1d53fe5f50e53730e53f832abf8995637f85508ebd8599cddfad0e64f6db3a657bb9580f7ef72b2efc8e4e98d7c98dbc08a79817f72e06ba712238e8f7301c4d02e2781fcbdf695e8453e4ef0f30ce4d0372fe10e3dc2c04ce1f61389a07c4f13126dc22a0f02718e79601397f8a716e1502e7cf301cad03e2f81c13de2ea0f01718e73601397f89716e1b02e7af301ced02e2f85a27cc4bfef6414bfe6f301e1d42e0f10f8c47c7803cbec584b70f28fc1d86a3530838fe8989ef1082f8bf74e2fc71aeb31724299efbbec77caf4b50dffb01e3b163083cfe8db948d7802ef22326dc2da0f04f188eee21e0f81913ef1182f82f98efed14d0f77ec5acee1982d5bf61e2bd4210ff1d13ef1d82f81f98f8ce2188ff47239e21beeec0df5e8cbe4f238cd53e53f768f4f1e2a50538b1ff62eedf37a0fbff0f4be75d4248e73f75e2fc05eb5dbd583d1a17fe4be740e20b1e4bb68903d1394e3f1d296d57587a82ffe7eb8c5358897580f17e815a49cc53a2bf9724e63623c2099d306f13ec16b44dd00853de3da872634c794050e52698f21e4195d374cabc0018184201d014333b23a8d9cd30b3334330bb3966765650b35be89479b74f76c06e9f963a61fe349b13f069b615063a3704d0ad311c8302e2d84e27ccd36570c016741b8cf390809cdb629c8786c0b91d866358401ced31e1e101853b609c4704e4dc11e33c3204cedb6338f60c88a313263c2aa0f00e18e7bd0272ee8c711e1d02e72e188e310171ec88593d3604abbb62e279218877d389f3867f7ec02784ee3a61feb0362ee0334d0fcce2f1012dde09139e1050b827d62e9818b45dd00b532e08aadc1b73babd4370ba9d31b3270535bb0fa63c39a8725f4c794a50e55d30bf9b1ad0ef76c584a70514ee87b1981e94453ae676334270bbfe98f8cc10c477c398cc0aca64779d325f0ba5d04b32a6580b6500d68c9e1db019bd874e9877e0cc09d8813310833c3728e40c4c799fa0ca99582edc37602eccc2dc79bf10dc391babbee705acbe73301cfb07c4918b35ee0e08d8b81b84597c60408b0763c2f3030a0fc1502c0888622866f1c280160fc37c795108be3c1c135f1c82f808ace0280a5a708cc4cafde280e5fe9e58b9bf2460b93f0a2bf74b0296fb7b61909706853c1a532e0daa3c06cb2b0705cc2b6331775e16823be761e57e59c0723f1fc3b13c208e715861b7226061371eb3b83ca0c51330e18a80c21331140707445180595c19d0e2bd315fae0ac1972761e2d521884fc60a8e95410b8e2958b9bf2a60b93f152bf757072cf7a761e5fe9a80e5fe740cf2daa0906760ca8704559e89e5954303e69559983b1f16823b1762e5fee101cbfdd9188e2302e29883157647062cece66216af0b68f13e98f0510185f7c5501c1d10c57e98c5c704b4781e96fd8e0d9afdf6c7948f0baa7c0096ff8e0f21ff1d88913e2120e9f998f0fa80c20b301c2786806321267e5208e28b30173939a88b2cc6aaee530256dd4558d57d6ac0aabb18abba4f0b58752fc1fceef4807e578215761b0216764b31b73823a85b9462269f19d0e483b06c725608d9641926be3104f1320cf6d941612fc7cc3e2704b357e8c4f9b8f7b95e5232d5d70b74c27cc584f3bc08a75831a102c3717e08380ec652f182a0a95889997d6108665761665f14d4ec6accec8b43307b25e6239704f49155188f4b83f2588df1d814028f3598f8652188afc5985c1e94c92198d9578460f6a198f89521881f86895f1582f8e198f8d521881f81895f1382f89198ab6c0eea2aeb30e56b832a1f853528af0bd8a03c1a6b505e1fb041798c4e984f19bfc18b708a29e3c762c23706143e0e6bf6dd14b0d9773cd6b6be3960dbfa04ccdf6e09ea6feb31e55b832a9f8829df1654f9249d326fc3ddee05736f5cf864cce43b829a7c0aa67c6750e553b112f4ae104ad0d330b3ef0e6af6e998f23d41953760caf706553e03437d5f08a8cfc4c4ef0f41fc2c4cfc8110c43762c01f0c0afc6cccec2d21987d0e66f64341cd3e17537e38a8f2791890474200723e26fe6808e217e8c479f8c7bc94d99b70e10b31d85b83c2be08537e3ca8f2c518e92742207d0926fe6408e297624c9e0aca6413a6fc7450e5cb30e567822a5f8e293f1b54f90a2cbb3c1730bb5c8979c7f32178c755188f1782f2b81a33fbc510ccbe4627ced7177dc90bec14eb8b6ec678bc1c94c7b598f22b4195afc3945f0daa7cbd4e990fc2bce605738a41981b30935f0f6af28d3a65fe59d037bc989ce2b3a037612cde0cc8e2668cc55b4159dc82b1783b208b5b3193df096af26d1ae50cbef26c6201db769fa4944baa72bd31e20ef5fb3ce5bb3aee09858e584be0bd045f4ba0af08198e65d8fa01b76369f97ed0b4bc0373bf0f02badf9d98c91f0635f92eacd2fa28844aeb6eccec8f839a7d8f4e990f677ce285748ae18c7bb1eeb14f139a95884fa971d7d9ac4864333b4b2e177f1788ccca1d758975899d250b6a4226bfc43e93158bb3a5e248a5e5eaf3c54ad3c5e25beb79d6ad78c6e2bac96bf2adadcc08456cbc7595bd9e4c95736d3233da4580fd8576f719db3ebe70f7fc14b1e00b75acb4feae02772f144590d474abceb1ae2af5f9cdf7fb30ea9fe9a80f560ac6643cc65831ad14546c868b05b7ca5a36c2986367925a7e62723f1693cf753119aac4042e97123c2e7a353fb179008bcd17bad88c41d3c58e41b9581d7db2f0d22acb87965a97ae48191f6ff1e4155bb9a802b99e9ff83d88c5ef4b5dfc26326ca19bda2b3ed72ff5fcabfb89ed162cb65fe962bba70fdfe46555b5e794844a61941e0f61f1fada4b9e83e563f03ca757f3139b87b1d87ca38bcd5e9ef2dc188b6891f0ac52e145c1f35cf28c9fb83d82c5ed1fbab80dafa95ddd0dbbd9221e654e7cec862eb7afc0facbbe9c7b50aad230bc12e4512c46dfea62344a492df77d618af19260a1e53d6bd954eb6c095b88a69d5b23bc983d86c5ec3b5dcc765162a6e624f9fd8cc9a2042bb1fe5e1a924f6dc5ecfca7cece499ef2cb04f1f0b2d069bdc99a6a9af5f73876b025c4e5b665bdf53816e77fe9e28c2fd006f3843b9d5638edc954e59b1f8b9fc02cfe5e67f1481f35addbee12567b5d45bc66d5adc2e827564f62b1fa4117abbc14358f1d8bf1a2b6592e3ccf7b3b5e5f338795724f6171fcb72e8e83d094e34f2c8bac4032ae93adb89658212a450745ed3a36ec56c2d3583c7ed4c5233f4039b12d4b8667b058fea48b65a6e727a90975b6f0c228cb9fc5acff59677db68f16aa5ffbeb5b223c87c5e0175d0c66f928996d8f4bd63ff63578d9e6ce3f5ec284e583cf630c7ef5928aa9dae37e53b1be65de0b580c7ef35256d42ed7f1b4f356c2bbcf84954e2f62b1fc5d17cbb19e4a44fe7db445c2da85c2abb6edf3c64b580cfff0f2c49bca13fd3df1a64abffad4652f63f1fa8f2e5e233c97f2fe6285a7567de2f40a16a7ffd6bfafa9ae1c1765cdfc2a16bfff792953fcd407782b8afe79f8352c967f7a791aa368117b8f757d6b8bd7b138ff8579aebf3abf403cf1948961bd5296ea7986264ddfc0e2c71a69e257cc68c744f8f71e2bc5b3833de63147f493945abf1789d8d5d74b8297606f629c123a4eb38939e16347a90905e7f016c6a1918ec33edbb80ca02e1ddec66834d6d118efb12d5920f2bb59edc977b09836d1c5749ca71a7c0ae31f03a8165fd6b54b40bc2734aa56e5bb583cd374f1547b7dd436579e8869edd4833d395e8e87db1a7b0f8b63535d1cd5d658ed3826fb49b89d3c1cf7aec59af2bad0fabb421cf716bbfa8db2bc8fc5af992e7e23eb889f5d2f252ff0de0a0b37d53ec062d55c17ab79217b2696fffc860f97c9871893163a26036b6a65f79893aca92bad80ee1ee771a27526cbdfbaaef563f94798e52d759663a365f0eef5e94f0933461f63316aa58bd164c216d24ca7f62c16b1b627ce953a75e92129ea98fa78e02758ac5b63f5a2df74acfbb9bd2ec530e2f92916cfed74f1cc47e23955c465b568f32d73b57cf8f8ee34ebcc0a915afe4675c26be57c86c5b28d97da5fdfcaf1d29a8bb2afe2732c8e6d7571dc99d5d557619733c99a5d5fe3fbb1f00bccc2763a0bf7232c49ecb80579260d67e4e14b8c487b1d9151be735f7204bf5cb4c2cb5c537153d714b527edfa89d95758cc3ae862b6afef98d9a5a7bb64f1139720e550ea72b699f52f916865fd394e78209f0f325d5cc1f7aa58464feb9418c59393a6a5d70e747978f238bff772cb1e5e2e14d6f867720a35a6d0b191ddf4173ffd123c99aa9d6cabf9005e9ed02f73e26cd7a455e2ab87c50e63fe2437d0f2a55271953a291d8b852ea70e047915c6aeee38c9a9eb7c6eeb62e117bcec5d64f95a33274652cb22dd8b936e6831dd9ea76a4f27551b65f4e671dcbd9ede54b7159df8dd1aeb7da8732db2b08cd4d96e0b4c75f258a2bdb5331f605be11451e542b2c0c9a075de55fd60a17ad73d8480acb1ea949b0daa679ddc8ec2d5ece97995cc99186b1577cdd21a65f2d4d88112592b816c3ecb14bff9a71779bd56686de380a9282f89a93325a6ee2e4caa87cdb6ee52e4746d4c140dad22e76d9c2a2b327100b9a06f1264174a90ad05c83c01497adb7461c6aa58802a1b9604b52325a8362e8f73038b4bf6ac1e9e84d595125617018bd72f76ab3bcf99855522dadd559634ef671c27b2abddda298a05c0f5e39200bbd17b9bfd18c3078c2a8509dc5cbb6b200eb0360c4ec2ea4e09ab85802533237fa65813936645f31149443da22ee6e3042a7f6812d44e66362cb26201f2ad6e49903d29416e0f405631bb9bc25d9215087cdc07e300aeeff824b85e94e0daba3c90f76270134a9c6755ee6b71c0d5ab5d1257efe80aff38355d878e4922da991251476b47f614aa0fdfc9f195b8b4c1de028fe27d28b135159e650f8b57c6a49eec021aa87d29e16ce72aa56c230a993dc378592c506d9c9044b54b14a8b2628baaf5c424aa5da93b0c654935cb0ac69b0bbc9f357e4f8af92023f6a32edcf54f8a336a86d2e3f3ccd804b4f3d3cd6ce7e7c40264f75e4990fde9fdcfddce1f63791e9fe0ca4d5a5533a92c0ed8aa419fc56ed4ad7c59d2c5b72db611b4c5768f0a577cbd2b1378d700ea51a4a477c11518e28069f3a024a63d2831b50398e2dc37f111686c0ca41f9d1c27c6d3578adbc7691097cfc99098322831756072f8235fdc1a9bc81807689b41bf5766744f947c5e57dcfabc8e6d9244954589aa13abdde68af7e3d22da004cba6f6325833c60f5511a81d73a26ad9275fa72815f562b96bca5d1cb0e50a6ccdd21471f5ddaefacf1ef3c71a9fe7c69bbae3ac864785385a2dfc5299f7c627f71a67792e9cb7969ea2a990ee715e58ba8787a4741f9ddbe9755431e91e865ed2030d1006b93a27d0d5d90e296ff939bd8e62323dc50346ba8767b5741fbd06e975ce8548f7d107969e72245c7f568e29494bf03940e9c85404f57852119fee975e6bfc21dd63f7687abda6dfa4fb6c55a47b7a7a4af7350e9ceeb9e5ace665b5573dbd8e5ef7e4246efde4eb4c5e900dfa7f3ebf3ab39775683087c05760e63f76ab6308fdd4b1f9cc9e4ebf8295b1d44b2b66d5ee90ed5ecb06f722edb29da1b3a685ab25d2c94b04eb35f107749c0d350967762c718e003887998433279638cb00cee126e1cc8d25ce9301ce1126e11c144b9c97029c234dc2393896386f0538f78c0267090a149acfbd73301dced654386f61499ca34cc2991b4b9c97039c7b9984332b9638f70538479b8433279638cf0138c79884333b96388f0138c752e2dca18e9add9dd107d1a1ec4a85320dd4ea79a6a0cc8925ca4301ca7c535066c712e52c80721c25ca9e1a94de17f0e1bd8a64707b53c13d09c01d1fc5f0f310eb7f71cd4a2cc96e5c7eae42743cf30be2e7a5a5a01a9a10c52454bc56c73e2351eb65b3f0b0b6a3c23a18609d18d51b54dc0b4b9c4180087c723615bc95005e01f59c3809afb4c164e9b900dfdedbb20e8772a4d9b81915ca5f00ca4951acb890e564e3caa8bc702615ba3900dde4a8d0ad14812242b7890add0300dd9428de5b5eec0ce0aa8bc3ca989266deb95418f70218a746b55c4ac3c8bcc301ba6951a16b1899f73e806efab6ac7dddabfe113ee491b5036f040f7933a22807b35c0f79f274441e49d68899083c7226f5b34805b3a77bd993d1560af7484ed58b5f63ba3380372b8aec8cd5c5eec634617626f3c39d01ca42ea377796ba26858e114fc6b596c38b41474273006df6b68016c7de976600da9c283ab5bc3c01c32e2dd21eed3c2aac25a03e9e6b2256d2e12b32aced01d67d4c9ae3433aec4f36c7676780735f9370928e5393e19c0c70ee67124ed25914643857019cf34cc2493a658a0ce7e900e7fe26e1249dd04786f37280f30093700e8e25cebb01ce034d994d9145f91c44f61cfe1b4ba29c6f0aca9c58a2ac065eb9c01494d9b144d91ba05c680acadc58a2bc12a05c1405ca4c96fca650edd77e79884a71367ed5ce5a50562e36734e4f6e0c7b955600ac45e6ccab1816c3aee04120b31753af05efeed5cc63e50e0d326c6da8b035011eb884125be73a33b67b0a3ea10f924dc01f056096980473680c610e0530979a0493b043980c667f00b3d4249884b53619cc5d01cc834c8239248630e1aa82cb4c8219c737c0760730cb4c824938e44b06b32780b9dc2498843335c860ee0460ae300926e19a036430770130cb4d8249d84b4406b317805911054c6c3a963a404198cdc9fa897a0098079b0493b00222837918805919d54b4bab98fcec78449354c9f01d0ef0554531f2e8eefed5ada119e72ee07e00673525ce1d1d9c6556a032e67e8d0e1f818cdff0c461a0c772a56940092b1f32a0cd00d0559440f90c5a771770550c071fd240865e4d896b27503e26b7e31d3f74afb55bc0e03bb3c4652599274e0368d79833c59fb0e7926c5c670a40b936da719d2aecf31c31a8ad5b036c874491b9e103e26c07db5a31026e3f3c163bebe856084fb55f87227dfa1e4d96b9413573a849ab5691ae4749f6fc7d1df0d4c34cc249ba5a2a19ce4b00cec34dc249babc2719ce8700ce234cc249ba703719ce0280f348937092ae344d86f34c80739d493849d74127c37924c07954144b2ce5284da708badbc8d6c6d80ae01d4d09af1bf3dae274af5740e891e90922a8c782b6e6312642251cf121837a0c807aac8950097b33c9a03200f53813a112f6689241fd0b94a9c75342edcddc5dc4e5e2621b241fc080dd720da9cbf80ce0b5275002eeca6a8f11e15f878af338d11dc067d74781141604752d524b5ab66ea2427a05f0d213cd794d8070861c5977f2ae00e549db7282821b25e9ba0864309f0659fd649360124e842583f90c80798a493009a76893c17c12c03cd52498711c827b0ac03ccd2498840f9f6430970398a79b0493b07b840ce6c100e6069360c67131bd6200f30c9360c67199ef3200f34c936012be0a4806f35900f3ac283ecd319835cc4f732c03203746f50d09a91a113cb2018e9100ded95178e1a006ea852500e439512c26217b3579a7f06af0ba7ec3eacb5c0dba36cea5c4da8bf9e9789b6e9de72b74d8ebbf56585791e27d8faa2ffe3680f73c4abc1d189c2e3bc50ac88b80e9cc5e053bce5dc357808c7f3e25c2ed1c84fcc64b847f4aed52cb1c32706954e01800774194af0a54b1a556b0250daeac3c1364e60ba9eb72b9807da1a8b1175badb03c67a6311f098af762f63b02cfbc288ad11e775d6e2f00e5f64df7aad86448c9be94720ff0cd8ba36867da154d9ef04859dd4c152dcdea585737c701dfbc248a4fcee8ab1bc277835a52a16b04d05d4afda0586509acb00235940f7cec00e06d3271517bd29531c916b59f08cac5cb4cc44a3a204186f547e0ad976fcb77d5e2bfc8493780f20a735fba22443b9a0aed9f00ed95262d234e3a3c41d6346a02cad2ab4cc2991d4b9c0301ceab4dc299134b9c8b00ce6b4cc2991b4b9ceb01cecd26e11c144b9c17029cd79a8473702c71de00705e67d23b6c8362b938e90da0a174bd4938736389f35280f30693700e8e25ce8701ce1b4dc2493acd950ce75480f3269370e6c412e75900e7cd26e1cc8e25cea300ce5b4cf9940de9cb01645dca6d4123e9565350e6c412e5a900e56da6a0cc8e25ca8500e5ed667e158870563bd9c27c9341b979471458e14ba9d3ade05cb08035b4054cd301d63bcd798b328eef5d740319ffae2866b76759ffdd8bf3359ce9b00702bfbc3baa49d911af3a433659e61100ef9e283cd1bd88a97bd24ca1b58d7309790a8079efb62c21235b63663615ca3b4009795fd443c172c5832231ec2bb763ade0bc0c5d6585b5179e205d0da13b15da9b00dafbb7d5fcb886301dfb4490dd1f306795e238bed53b04a07c30aa6a4836d9c7d5bc23045f6d89efead95d01cc2d51ce765fccea7e33288e1f42de1b94980f990694f0f9870c680500fab06940e3f83e463a00fa886940e3f871916100e8a3a601251ccc20037a1700fa58d4eb1b7ae9e924ac98c87a3a3f0135fd5613a1c6b1fbf80b00f57113a11256506450df01509f30112a61254506f50300f54913a1122eca4706b503a8a89e32112ae1482719d41d00d4a74d844ad8a42283da12407dc644a8848bf591416d03a03e6b2254c205a8c8a0ae00509f3369ca77161b16c38ee77e00e7f326e1cc8e25ce7900e70b26e1cc8925ce7500e78b26e1cc8d25ce7300ce974cc239289638af05385f8e62d0cefe2878a9986c53ee5acd2ba289376403c96b5812e52b510cda799b10463ad99b6c04f478e097af9a04338ec3c9070298af9904338e9315e70398af9b04338e8b44ef0360be6112cc382e12bd1f80f9a6892bda90be9640b6a2cd7100eb5b2662257d07890c6b2780f56d4aac3d3558f5abdb4c702e89ec438f055470f300dc774c864bd89c22839b0de0be6b325cc24a8c0c6e7700f73d93e11236b7c8e0fe8725e1be6f325cc2475632b885c0733f3077b936c251a8d154688f06683fa45ee93bf98d847c6bbbc86251c2265b9794c4b04faa0dc8f01f99d45b4aba4006596f694fe0871f9b8493b4938f0ce75e00e72726e1245d6f840ce7c100e7a726e1245dab89eef54580f333937092ae2446867313c0f9b949384997be22c3793bc0f90525ce3e1a9c5e5b9bb0978a7074f4572ac84701c85fc60132e16c2832c84500f25771804cd8ad4206f96d9684fc751c201376af90417e1140fe260e9009bbb6c920b700c5c53fe20099b08b9b0cf27bc093bf8d0364c25e2d32c80380277f1707c884ed6432c8ad01e47fc60132e1582e19e4a900f2bfe20099f04d2c32c87b02c8df9bb2d224693f2ed9dbd77f80eaed07535092763a92a13c0478e5bf4d4149da1d4e86722c40f963948b2c940906bc0c6d58cb809c0580fe64e682b2717c25b80a949e3f4751db273f1fbc585c5e213cd5fbb274848fb96423b78b81effe1207c8848fb96490a700c8bfc601721c17581c0920ff1607c884551d19e4dd01e4df4d698691be4e4cd66ae80c50fe610a4ad2775fc9509e0750fec71494a46f6593a15c0650fe775baeae1ad92c58b2c59417b024caff51a2ece0a0e45ee75e6e3ea2775d4753219c0110fe69cec70fe2f80adcbf00cabfa2f0c6da1f3f88bb374e000859634284adac9d2a4b6085158877362fb482708445319c40d409404b5042dbbe8e0a45c69434fbcea5c2b827c0d88812a3bf8f1c103e2892d5cbb780264e634a94f04345f3add283af6b9e271efeb829dcec19d65eb1b8c16c2112c1fae79ba8b01e0b3cb4092556f981835ceb7ff2258a02d650beac331f804c8b22ab6325a6bbd14338604cd6e859045036a54429dffbcfacd5e869387e390ec06c4609b3b9b553ea8cb6e73b23ebf16bf8b404b89a53e292efe9c9fec862ed87351ad280db73006d8b286a702f8f85eeb9788403c3644b25ec0b1a462d4dc44a3a0b840c6b3b80b5152556bfdf671e44d97c27fb3ef36690f95b9b84333796382f0238b73309e7e058e2bc17e06c6312ceac58e21c0b70b63509674e2c719e0e70b6330927e94a68643897029ceda3c089c1acbdec01e1d33ad913531fd050ea60124ed205e5c8704e07383b9a8433279638d7029cdb9b843337963837009c9d4cc239289638af023877a0c4d98fd5ee3476cf79b35f89592efee6a3972b8564f273af85cc9e064e3e963e980a765f50ef77de9683719135f0c9baf27e0528bb988292b4714f86b21214013b9a8292b4614ff72d6780b2ab292849fb97c8505e0250768ba253d9ffcb3171fc6056252837bb6f4b0f750f12132e0c4336489c033cb40725cab62c39485c2c5a9ccba31a14269b4c3302f8e14e51ccfab027d3145a879731fbf5eb1542a83c9ae93374cf430064cf28ca49395ccc7dafa4e674439bf6ba0464ee5e94587b6bca49db17f984af156c6ff11c5491b217941030591f6863e0b7bdcd99ad14c78f114d02287736a9779ef49b63649e7937c0d9c7249ca45fc423c37935c0d9d7249ca4afff91e1dc1fe0dcc5249ca4af0092e1bc00e0dcd5249ca4af0192e13c09e0ec17c5e44508d3fb4706081703184d8576146891a69b39cb8ed063c966d9e502acfda37810cd610df3f5830340d6dfcda49274106576272b49af0538773709676e2c715e0c700e3009e7e058e2bc1fe0dcc3249c59b1c49907700e3409674e2c719e017066988493f4fbcc64380f02383329717663ea1b49bc75698b34b40ee65d40bb332b8a76a7845a9a722e48fcda9dff03de996d0ac838be1df73c0099630a48c2b511c9400e07593bd7149084150f19c8fe00e420534012cefa2003b900801c6c0ac838ae813c09801c620a48c279c76420cf0720879a029270b5633290870390c3cc99d045584a9235c97702288747f19ce3b7873d8efdebff6049a8234c844a38f5900cea5700ea4813a11236dbc9a0be0fa0ee692254c2263c19d45700d451264225ecf22083fa3280ba97895009bb3fc8a0be04a08e36112a61339f0ceae700ea1813a11236f9c9a07e06a08e35112a61e39f0ceac7006a9e8950e3b884d547006a3e25d4762cb99439bfa8614ca9b909e01b17c5b33d3e8e19f7c18dd500e5f8285ed6ca523279047e38930adea300de044a787c0d78f732a8b32de522eb08179cccec79736531f4bfed00c2899408bb32777f279ff4badaa948dc593aa2a72032af5c09baeb0acc798388b0938eace7b30878e7de26ce2d265d0e80acf9330e78e82413b192aefd4186f5dfc05b279bb40410e9e443b237889b022f9d62124ed2d97264383300cea926e1249dcb49867329c039cd249ca4f3e0c9709e08704e370927e95b1a64382f023867988493f4b502329c37039c334d9ab84dbab81fd9c4eddb40436996493849979e24c37925c05968124ed2657bc970ee0770ce360927e93ab36438cf0538e7988493741564329cc7039c73b7e5bc3a77468fe314c556a056dfc7149439b144790440b9af2928b36389f20080723f4a94f203a3f60a74723bc5ba60952051cee2bcfedc8da09c9c17c5c01abff112e18f527b8513247efdee09006fff283a88fd2f724a38d84bb6c86916c07a40142f1778abbbe35746be0b401e680ac8384e3f7813809c6f0ac838be5bf92900b9c01490717cb7f2430072a12920e3f86ee53700e4225340c6f1ddca2f01c8c5a6808ce3bb95ff04208b4c0119c747c4ef00c862534012ce2f2203f91300b9c41490842ffe9181fc01802c31e76d5fc20610d9b3f77f01caa551f497bbfb7f6c63c631fb730e726152f27e20b2d998c300ce524a9cbcc7bf525c2a3bd07857c562b6ccba2c7edd67ed01b683a27843228b35a437244e05f89651e26b61ed5459022bac40332c0ac5e23f19b0de54c03a00606551f57a9788326dbe656e159b6305e01714c5bad7fb1080713925c6ceaeca6382c095273e0d52e9541ab3c5a511c0dc4405f3080073853913f9093b6cc91a358300ca724a941d815f1e2ccac22a972f4650a990f9e383006205f5d38aac5492cd983ce715285e6ac2d79fe2573b7701200f8ea294f4f6b49215cbcfcdcd06e3d59526c18ce30b4f7301cc2a936012769391c12c0030ab4d8249d8794b06732680b9d2249871fc32da780073954930e3b83cde040073b54930e3d8fb3806c05c63124cc249016430f301ccb526c18ce3c2f48301cc434c8219c7e7f1a100e6a126be014e3a7797ec0df05280f53013b19236e4c9b06e0fb01e4e8935d8d7fb085ba2a3a9d01603b44798f4a228695b94acffbd17c079a44938b363897334c0b9ce249c39b1c45905701e6512cedc58e23c0de03cda249c836289f33280f31893700e8e25ce3b01ce63a398c1c1e7aead12a3e87cd82dee333836b224bee34c79a391b41b840ce5ef00e5f1a6a0cc8925ca3520539f600acaec58a2cc0228d79b8232379628af06284fa444d981256777b8d7638da8ba194d85700f50469e64e61bb784a396646fdcae02584f36259393cef320cbe41d41263fc5149439b14479364079aa2928b36389f22080f2b428dee0e1a8ece5beb9a905aca1cc581f0f4acad3a30099d54041e603901ba298c98e656e1953d29509e65261bc0664ec33a26a532697bf992a7c3192579fe8fa2781279e1945961ed640b3f47400f22c735e0488e39ccc8500e5469356031c44594a92ad06780dc079b64938736389f34280f31c93700e8e25ce7b00ce734dc2493a038e0ce76880f33c9370e6c412e7c900e7f926e1cc8e25ce2500e705d42fdaf38957554e1b934fceca772662c5af91de0a60bb9012db8eacf68bcfee3776dd0d76e2a71eb2c6fa3a00f422533ad7482b1c32943f0394179b8292b4b22143b91c74675c620a4ad28a860ce58e00e5a5a6a0247dde2143793140b9891265570dca39168f3c4b289f4d6263ad80555640fb987c5d9f10e9262aa41700a49799b312561c5f39cd04282fa79fc1c6a7fcf1d55faa98bdf2019feebfd00acc271814c5b0657917a8bdafa0c4d79ec11ef499d621aecb1787a88a75fff97a00f0caa8d6244af69fcbd311f59e9365e38100e35551bcbd53cd965aa7b9efe9dfdd99e05c0027ba905636055468b301daaba35aa52df239be7453a401be6b28f175739590b0a494ab05369c05176703a89b29a1b60550b90f9638d54d041e49f6a6630680772dbd478eaba96cf2aca02b1ddf5b26308e75967db225c75bdb62d1408adf534e5b00f53a13dfca259d404de6ab7340f3fc7a13b192be2d4186753b80f5064aacbce779152b155dbee56cba158863e393a9c9a075a782d60e64f11b4d1acb194439ab926c2ce77680f3269370e6c612e75500e7cd26e1249d894e86731ec0798b49384967a393e13c1fe0bcd5249ca433d2c9709e0070de1645af917b467a43e9359a0930de1ec56364b6d2c68cf384d5c700bc3bcc5d308770e5acd15468f700cdf33b4d5aa580748a0159175c6380f32e9370928e8d93e1dc0de0bcdb249ca4b336c870ee0f70de63124ed2e90664384f0038ef350927e9e47f329ce7029cf799849374b63a19ceeb00cefbcdeccf247c1e22ebcfec02b03e60d2e325e92a59648f9737b324ce074dc249ba861b19ce4d00e7169370922e3a4686f37180f3219370922e274a86b310e07cd8249ca4eb5f92e13c1be07cc4249ca4abb392e13c1ae07c348af7cb1733fd6bd1ee8c1ebfeeba3e00e463a6808ce37cf6ee00e4565340c67145b71c00f2715340127e4f850ce46e00e413a68024ac6cc840ce02209f340524e18aff64207301c8a74c0149f87a0a19c80a00f269534012ae094306b21c807c268a8e37ff6b5f12563d646b5fee0db03e4b89b533f3d73d4cd88b49d6399c00bd98cf990493f02ba764301b0198cf9b04338ec3162f806cfe824930099fc4c960be0a60be68124cc20a880ce66b00e64b26c1247c222783f93a80f9b24930099f81c860be0160be6212cc387e68e62d00f3559360123e0b91c1fc1ac07ccd2498844fe86430bf07305f37672d8e387eb1bc0768b2bf11c5746cfea6b9548d682efb5c2a78fb003f7c338a7147b8c6db188b46b57509376995c8cc8b1da4715d97e35080f3ad283adedceb7270831bc6bad60300c8b7a358fea9cc0ac4cb46fe0ac06aa783cd5d52c24e37c2a771b2d50fca4139f90ef58a1c55cc5ea9085bc6317e1eb93df0c877a358d024535433fc7595b2e82a1ab25a7a0bc0f71e25be36c0fb0a052ebe54441e938b48c4cff33a0274ef47fdca945cf6ae488cf0c8ed582b38ffca197f49bf5c6471d23291ece5fceb4199f84114f5f5d0065a5f57031ffd308ae7196cc4d1fd3c43d89d4656528e01283fa244d983a98b9279cfec8460e9323b00fbb1a960097bd3c9c05e06c07e622a58c2311f32b0e701b09f9a0a368ef57e6f00f63353c112f6b893817d0280fddc54b084bd9c64606f0560bf30a78145386186ac81b518a0fc9212e576d68efb5bd0c9550dab62386dab2900f795496ff592be7e4ad659dc173c7c7e6d124ed2d58dc870ce0038bf310927e9da5b64388f0438ff61124ed285f6c8706e0438bf350927e93290643837039cdf51e2e43b3c30ef878f1fa616a0c6fea7890b4790ae6544b670c410e07dff32112be98a5b6458bf15deda2c4d111f5f4b3c4f9460bc0c5b2cecb79f5406b209a2715d2c902cb6f6278b47c36ab6c00232cffae72f2d0eb0fee98e27c44c90716c0dab1047b95e91d05e6e9de59655b1cc9dad20df73d74838ae919ee06f3b578a7bdb0beb2747a7aa44b413e273255c878f5d4d617c0ac4424b79a1d81632f9c5970cfe526e62b0f5cb7ee41d58f3b03bd059cb6eb9b3278fd7adc9e3995aed0718192585ca424ba1ba62643b15bf7e8960572c540bea8c69ddf1c353bb758a54c9e8cbd3a221c7ffdf3cdd9b3ae9de2863171edfac107caf6e8b7ee4776e4454b2f29a510e13cf109f0ce1ff8df7ebe9568872615ca53033885fb7b462e7d62b15f7cdd8d54c9f0e2fee3fc1b2ac5146bffafab47f8b7ea6f4695bcdee0f55b42778889d3e1dd438274355087f5858e30b760e5f6afd5de481440fd1d388ab8db1f64a445c4b85ea72267f785dc95b5fbc28fa8592a7cfa9240d39c7e0a545262f2d7e7565a84c9ea17efbdbd343f5f4df2979d663cadeff636fffa3b6b7ffe76f6f0fd5dbff4bc9b315f0f6949fd2fc7fece3ffabede37ffeede3a1faf85f943cdb32ddf3cd6c4bdd7e00fbfb5927e9ebac492d5fe76cfef6f5f07cbd1125cf4e4cdf4eb7c7de4bfef67bc4ef1bd7f6fb267ffb7d487ecfff75164d0de87cd3acf045428fffa4fd1f5b7cb10ac7bf0300 serializedProgramBytesString: - serializedSignature: 1b2b0ccc5c4aff7a2a2a05f774cfd4dd1066dfad16896748895dd842fc377864d4809fe191ab3016b9ee486e915ab05c7b8c098bd1f21158db7d684de09f6206 + serializedSignature: 6c3da49623e6694d60e19caa57487d80b144cbf41b0eb2c2292910555dc01595c9fdf9dd077d65e69851a47eaa1699872f1abab306439620131e301e727df601 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset b/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset index f3cc2b1..9fc9f01 100644 --- a/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset +++ b/Assets/SerializedUdonPrograms/11be2a0f1f5d7dd40b1e776c7a281df0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5dcb5b1bc9116f0142086303e66dfc00bf90cd4302bf5fd8186c2f6baf710c789d7837181b61b31186057663c7bbd9bc1f9bc7f7e596434e39e7945bbe2fa77c39e690638e39e46fc82587a4aaa60795465d9246520b0d59e943ad99eeaeaefa5575554d4f6ba8892b788586e0e3917aa826d5889a574b6a4dbd826f9350aec2db3972cf3f501b50be80cf45a81b527d797ae26b20d40d9fd370b4a9b6a0e727ea39942b543fab92f07d1afa26e108cf2ec35f125a85eaa0d3bc9a5233eabeea0a75e421f1883a6dea7321942bd4009f37d51ba84d125338489caabae063166a36a96e159876db3d511f9258ab50f71cfa6ca814d07c46141bda238abe28a768d4659d2efbe0af1efe46d931d6bde36957abdb8de9e31af88b227dfd9dd3deabcb565df6ebb6f87d8f2ef7b1734dba6c66e7fa75d9a2cf85e1ef9f058cdde019fba8e6fb0c3b069948bd4033f4c0d3ef986e7f961d63b9df43ef5c26bd9a83fab89ed1c3efe73dfde34c4677cc21cf9871761ecb015d7f811df3311b3cfdda74fb8b9ef3edec18eb2f690c7ec9fa61799cf118d163adebe313baef657ddcc1cebb7db1fe8a470f2719cd16768ecb773553bedacff471a707c316ddfe9aa7beddc383b7be4ba56dcf54dfadd276c8eb7b3ced62ba7edc837fd4537fd1c1b7f66ffafc01c69fcb873b1e96a774bfeb02dd532a53afaebe4eb3366e69d2b51f9b1b56993637ece8a4eeef1e3a6ebf41ddfe06e3c93d8f6542d74fb0632c7b597b5e9fc766d12d89f3caedeb1e0bb2847f5725b2fc4bd0773e3ebce378751f2d50f751769ee3753313affac71ecca3ac6f5897232a339e8ce8bebff5b473792f249e1cd6a5ebef78ec38a4d273c83d7744a5fd44ced8110e859c589784d4605dc569609c6585a6166ecffc490592aec70f7c0dd0b05b10bed7818021b2cf53deb005516bcc18d97b424d8cef49fa5c84162b4474327b883f650d81cca5e09d6469c9269cbf43590d26262b5033a2ee4189bd9e824a9fc03b93ca23183605a94d52cdc1e73ad17b0a6c67b7cc2712a630de3e0f81a69361adc21917d075384e1187b3f4f929719a24eea7e1dc16e57baf20e3bb09e56b1a2d5bf60df86e1a734e4366e6d19c6849e79d74ce55d3144883dcc73197fa4a233ba2114a6327f534ac8b5376fb659626bec2d07132e838a7358d51822c94716e4cc5c99f3fcc42d0bf8cd9129aeddbc1fb3c04af5cb298914175f79204690dfff12f337ffecdeffffd9f70a66867549c52f9837944cb052cd28b853ab328e416211cae4b20a35ef84326f8313d0fcd56107ea7dd0ab5f3af807a8a4c990a0861389f832fafe12f058da7a07c06552fc0d3e1757b966612482642e06687ce7c0c4af0d698e06da834bcf9fd492e781bb6e54ac38b2f33825101c17c3c4808d61a104c44741e97a575e22beae10b5b0bd4eb4cfaa18c6fc1aa7ee6e19c9356dda2da158ac50e4a23da6eb708a75c2d73eb0d1745863d009975d6443ac34589f2f025e9326cd225a2bdd7c4aa578d4db21aeb4d6a6cdc992052dc244377d5e541a0579c64cd396380df291631a1474b6a7315440febd688ca22b4f58f205e970d7add9419be5682af3b4bb8fc2c4810369820a415c8f91d0aa3d2f26d6e10f717ec33da08c39e9c9152e24142316af20f388ddb0db3c3e8ea9b651fd168228e7aeb30c4b7ffc22b8b785426be478a529d8578b61c01aa4922dc5522e1bd121cdd0638fe6ac23a071cfb24ae7b4ae4ba59227ca044c22d12e1de1209b79a3c03815fc90c700666dd47ca5903f0ef150e16ec150e2973f6976f7cc923ec973cc2e13278843649e7b8d457726ad92eb1de67603de493f50e89f57e13ebe89d9ea8b72a01d85f5297d56d20fe3968bccf97409d264ba6995ec918c72da9b81877745b8e344471722cd9d1ac90d1e8e61edd3a80d708bc2261f3e438aecc21b39041a409d22559d9098395d5f8b4b26e89f84903f15a9fc47b24131e3099304e9aab84488a50b906b0a3417faec6a11c85120d7c4c9bf55b32f0ab2ace7a8cfb32f603127731137718a51d6e9e686e1c2e901f3fa3f64aa39e328deadccdf043ffa044ffb4c9c3fb207c48223c5822e1c326c298a60c29c3aa44c45f9a7244e27ad804374ee1dbf04ee8b71f31fa4c23a15bc63b59d9572d5ecaad32e57e49867889c81f95584e94caf231c9ad8c1adc8af2e9568e4b788c9588c70903e138a58d955d29752ead908effd087fb558e980036c62bbc936b5e0ccdcd8314ab4e4aaa3957a26a0624533d5faaa9c624962f94c8f22989f0c512099f96085f2a91f0a044f872898487247770a50cee6058328daba59ac68844f95aa994e31220e365002421a9f17a896a1c9508df5086607a59b9fb2166d594ba0b3e6f11bc4852cd93d74cd1d2f28af68d0bf09e866f4ef715b54467b84fe219b4b72e7351cf8f44639244132689d0d79817c571497c4e394be78e34282972baa5cf7a79e68b68deba47200d62e04792339224374d924c2925a2ebf0bf06b16c0164fc183a2c6a6dbdc9a315fbfa3a2b49396992f28447ca09401c37f3bed132bed03abaa792a4872df5328bd7f47abb1f3ecf497c4e99f89cf0f0991ed38f2ed2bde4f3e5d2c37949be5b26f92e7ae4e3b6efd509da0be619b9a49367529a9a1f692e48d2dc2e5e5bf7c8b36d82577849e8eea4b62e4af2dd31c977cd87b666f50c2a4cb672fbbc4b925cef98e4ba5e90de268087251d9bd6caa2b7e23cc86549b669936c313132cd6d5fa1708fe75eb764cfa574deef87db2b12b7ef9ab81dcf61610e9fb7c907ac42977c91b3d098c37bf991ecaa24d95d9364b7f34ae658d934e926b73f97e5cc358f8af712d72449ef15e22538f6a579895c5a2cc64b8c4b72bd67926bb202b699c6a75c567a5d92f1be49c6c715997fa5e789c5a271434263c684c6988f787727af2597478209498207c5d96c61b1ad388f53ac8c372519bf6692f16e41d1fb0ead812d529b8deddc6b06bea7b3e7ca6462117887e8b6dc2da2b301fd1f90f7c2a34d15a7bbc60955f86f06908355982d38f21c8cfc6c7b752e3705dc1f25fd8260597957fe8add4c9e4f0a074decbf4cbf387037289ba4cb2f93bc713ea225726901d2748779b7498a2bd2dbb7246be274a37bb0486bcacf05ee12abaf35db90ffadb40e81fbf4b35a7dd76581ba2f4293adfcf4f36d35182602ee0eeb32fc68c6591142e7b9a19ccb3a7c45c23589364abc2d82d34ce02ca8047dbe4f5d91d42d8a4cd82d0870fda13e0dd7239b70350a700501a40f984dbd5f0990460308d23f08a448d843dc7be155ae5f45e543560e44cd14fa5f037b6be4d59220842730d1fea16ae3fc310f2cb12ce71c13a7584cb4ab58015e2c9d2f99f39c04e64b5fff3f4f651298ca7c03411875233f798b2736bd45a7d69d93b9bea20c5abe3618f58e5fca0fa1a219fe24528870c5f89493ccf17eb0b350a697df70b25883f2ac2d284f30283fb409653bf335cff5de8b359ad6c832d6ac93c7c2e6c1b3c87d0cc66fda84314cd4d019a7b223760080aa65402d5462ea3ed761c4bb8e95e9052d4e5d6b50b631289fda84723f9bbaab7af045ba3511f469dbcc205cb409619786f085184ae633d6af2c46e5a82d300f33309f5513981627b73530f732309f5762722776dde46e62102ed984b09106707fcb8e8ce2d16b7b9035db822cca204bda84ec80b6ba14344a6d5fafaed23d81dd15a58f3348976d42ea2fe1391740288f30285fd88472af8612075e26fb7469e3bd6c6bc0856d01a718702f77d206831f971b19942b36a1440952cad91384cb4f0e0ec10b29f50cb08f2a617b852d7b9d09a0ff3bc5a0fc56f58492b10042d9c3a04cd984323337bca727f4a63dc8da6c41d6c0205bdd49ebcbdc816431881cb205652b83f255f5f8c420a6d7fd0cca359b50f61ba04426b600910d387e573ff471b7253c350ce0759b00b7a8f44244fa27e2415f846861f07d5c3d31fb6c00a1ec65506ed884d2bd5535b62b6f551d64306eda84b14365aef1ace4d8af69d1335abbb2893320b7aa278a07716527c1a0fcc42694bd1e9bc4b47c19de490a35bb2b353acd40fdd426a8ee66a1ece5b257ba49f0c00b31f0be6d13bc832adfcd2ce99728166df2b82d583b19acaf2b117c24502b74b3d55af0196240bea916208318c58f3120bf533d513c888b6a3106e5db4a4059d8b54e1077387630283fb3096554f1fd6473ca79f88535c09a6c0156c700fbdc2660eec5a1bb4cb1bb2e0ef73018bf6b134677dbc9d8aedb76728841f885eda99bbeb510dca91b66807daf12beceb13777c38935c05a6d011661807ddf26606eee27c5d9a027d1ed0cc81f540b90414ca2f733207f582d405abcc56f0dc86e06e48faa05488bd722d680ec6240fed82690ee6664e9b22ef3d90356a7b7b580d3c7c0fc4935816931e85803f32803f3a7d504a6c5696e0dcc0106e6cfaa094c8bc1c71a98c30ccc9f57139816ef565b03738481f9a54d30fdad2b06f1c6ff2083f2179580b2b075c5206e213da076cdd3181278f586ffd1be3eaccd21e6f9756c4c58dd8c094b273161d3754c5839701e81d0aab17b0512bca79254bb448fb45a648f4388d3bf87c1c7b0fa79e04f6e9a885c6e6abf427842e6d9922a9bcecbf1fc0593a4f9e593eda7298756e2f46f7376b3fcbf56ce3f5da7179a69173da9631e34bfa49fb636038d9788297c85ff072baa6f766f850000 serializedProgramBytesString: - serializedSignature: e91621bd264c2fb8323ecd8b3558734e5303ab653e1081a39e5f9626d0cb6c0b515f83e03d0337e9a5406e72e852ade0663fb5d729e98ecdafc4dafd63c2c00e + serializedSignature: 462deb9e72e73a8d630e9a7be4acd94f3bf7e2f02b31372a52ec187c7a9917860a8bf9296a6a9167ffab284776d0ea52c41a72d985ed75a4b78b40897606830f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset b/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset index a26cce2..42c66f6 100644 --- a/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset +++ b/Assets/SerializedUdonPrograms/13a6f181596d6094c8b946028f390ace.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d0778144796806b0049e41c0d36c289b10d9210c118078244b2c1601038602c8434123292902521c011679c13ce39e78c73ce39acedddf5ee7af7f6ee76eff6eef6f6f6eef672d8ab575dad79d3536fa65b3d6f54ed5bf8a452a7d7effdf52a87ee552ae4bfd814f96bad58252a44895823eac416d122ffaa9061b3fcef1cb9e7578a361936c8df35f2da14519ce549f837393656fe5e2a8fda45877c72aba89561a3babe5a24e4df4be5b309790467ebe54f42de15eb231f5a232ac50a71ac18131b9545c45af550bb3e1703bb627de5ef056287bc9a504ac14b4ad5a531f2d76a79a55d5d6b964abbf7ad13eb9559cdf25aad7ca64d3449991b95c4bedf482d62ca26150cd6e1001d0e923ffdf4dfbdf4df7df5dfd43957c610242b930cf7fe813a1c1ae29dc3902c3fef74ef191ee29dfd753822848c913aec8d648c423abae746cb9f02f9e76ff5f118e7b860833e1eeb1cf71beae39dbd75789afc29943f2fa363e9a9bd2638b27aefd4e7c779986dd5cfbde2397e551fefa5c3bd75d8a9afbf868e21dca6cfbf8e8e21dcaecfbf818e219ca07590ba8df8569f1b6fe0e7dad7e6b1afcdb1af77ab3edec773ff0e7dff9be818c2d3f5f9b7f471313a0fe1191e1e67e87022d2b7ccc3749287599f2c3a3fe53cdfe7537d7edf8071922d2ef6437ac0f5b73d7a7578f4ea70aef571e5efefb9df2fcb03bacfb28bc5811e5b0b75d8aeff7e071d4338d963d3bba9361554eae37840c699d29ccbff201d9ea59f7d0f1d4378267adf993a3c1b9d3b5887e7a07367a37310eed4b2df47c7d2aea20f3d72fb231987e8708a48e6e19ab758a6cf15e9f04291ea0b173af20bab9cfb8bf6e8f3533dfc2ef2f0738f5d7e253a2cd5e1c5fafa07e818c25d9ef7efd2f6edf1c8b944a4e62397e8b00cd903d73f14a9f65dea917fa9967fb53e9ee6d1e73291ead3e5e83c84977becbe5c903edd65c3741dce20eea5fccdf5b3993a3c4fa4fad9793a3c17c5cbb93a3c5fa4fbd905e8dcf9e81cf683f7d1b1e4d4f72e8f5cec67b37478a8a0fdcc64d76c11cc970ed3e19c80eff196ed5718985c89ce5d81ce417895d6e323742c99f43b33c33bdd771dae9ffd9838ff093a0fc79f6690e9da71a40eaf463a1fa539f4d5c78374788d96fb193a8670ae0eaf15a9f9e5b58e6dfd3bf4f13c1d16e8b02f7a373cf7b973adbf5b87994fe8719d478feb74b84087bb3d7aecd67ab8722b3c7ab8ef7f051d4378046212b4dee696110b75384c24fdeb4d7dcead575c2f52f393eb1d7d07b8f98eabc30de86ff7d945e81e90f185e7fa627dfe4b1f3a2fd1e1521f3adfe8d1f94647e781ae1fbb7ade64d0f9e82c3a1f13406737ad2ef7a1f3cd1e9d6f76741ee4e697ae9eb718743e368bce2b02e87c9c0e57f9d0f9568fceb73a3a0f1eebd1f936f4f74a1dde6eb06375163baa900cd3f53501ec5cabc3e37dd87987c7ce3bb49d6e1ee6da71a7c1a613b2d87462009d4fd2e13a1f3adfe5d1f92e47e7213b3d3adf6dd0f9e42c3aaf0fa0f3293aacf6a1f33d1e9def71741eead6235c3def35e8bc218bce35017476cbaefb3cfadca7f5d985ee83eb3f0820f37e8fccfbb5ccef3c32bf0a20f3018fcc071c99c3ca3c32fd94b9b53aacd3e1461d26b48caf03e8f5a047af07b55e5f7aeeabd7f77d1340f6431ed90f39b2874ff1dcd7a0effb6100d90f8bf47ad323e8dcc3e81c848f8ad4bae4a35a97173d723789d43a921f5d1ef3d8f998237bc448cf7d8d22b59ee5a70fe5718fecc7b56cb76e3251874f88f4f4b65987a70a737a6b42324cd79b45f6f43841872d3a7c4a3ff323740ce19348bf2d3a7c1a9d7b5287cf88d436b5db967e16ddfb2cba17c23dfa991fa363c968d44d1ed9ee73cfe9fbbf45c710bafd36cfebeb3f41c7d8cf5ed0d77f8a8ee17dfb7bee7f51dff73374ecda8de57ce791e3eae1eaf512b2fd251d8e47e74cf1e2da3a171dc3bb7e2e54be3ed2adf71cec535ecab98298ea715e22739c1a49ad54dd043d0f7ebbc6dd27b3778a83e842f805ff26abd776881df2d184a9677a8deaf7ee90addb7263cff4b8d840a47785fa5d23ef6854427f91fe8a97d25e01ca35c9ff09d4adde2ecf2f56bdf2d0b1de28af94c88a65a37a6a836cceaf93ff53a5ac95af6d125be55195fcddaae46d906aa7df99cd24e882f73eb34aca7446089ae5191768ab3c6e521aae56bf3b95a609a5fd5279ae438d57b4c8ec78810cb7abb7a5dbde26ff36bdb34a2333eb681e28a0ce3bc3116e34554a6b40fb52952ffd29467a2246007de12f7432ec53aa7a612f4d8b893f31743219a8382fd532a62964b19473e5a254f51dac4a2318dcc6740bcdfeedf09e256664b4c54c06a27bbcb22019c3af2d6e5cffc7d965bf2e48356dba2855dde313b29896092cc88bc746a749c86c4241419f3250d48b3f66c2afba6257e711bf735fa3ba2f780414aa9229350262d04cab927f6c973f4d2af535aa61db2d52c816794b9b52322d7eca405891429c5e8066539382dccb04b96fbe2167cf553241eedb65571232fc3313ec4710cca60345b0b789a0aa919dcc4a30bdfae5feb5403ebb4992e854652af893a9ba969929347da67a989a790e503c8b8d95c8601a5184fb9808abb659132be135f29c53c15ca8ae36aa5a498958ae9edc24df05f5943a2531a16da29e71b92e575334b62a6d32c7c040df313048c5007448706b4cc55081298606f44c49d9bd3c049aef633cb4bfec45e5214332167441739042133d35f765738ff8b72b738b3a86b7b9138672e7dd43bb6c4ef22e55e33ca519fc38379a41f95ba8abc4a2a8c01cc5c35514f32b43394591c92906f75ca6375fbea34e65dfb89292c9dae413fedd6284ef4c6f64d64c2f571a5331d4d714436a8a5b551e333db8b64549a991f706cff8604ed921deca9319f968857c6c9a71d955a010f633202c8372638c213b5655ba7e1ec5803721bcbf297e54bed399978ad96a51298e912ae20abe29d76857086b6498407f3952924fae949ad4489ddd62dbb9eebe23731c8ff59daac6a9289e832a73f9b482729301a6981cd633d58b69b21d1b3c95c1ccc71169fe6c8e83f1192b17d4fb297603a924362107496c90493844ccde667bbda2c7d3a2079b444396bb8f486fedfd51fe4b13de8f163e84d27b6268bd879a4403efe21cf01e46099f9403e1c329e1fbe640f808937060b59f296ff20a1e470b1e69120c51bfbf1fc10368c1a3281c07e400c768cabb0f3478f7533183f00cde3d86123ed920fccd80c2c752c2e306e15f06143ece241c6ac2304695d68fe614536ed1522c33c46435af589c21cac4593284ecb7418f2038edde3a79769baa006e524f74c8e31af9d3a94437aaeb9d486eb3aad7d44829f07c49ba4545b4457b51b80e36e07ab157305ce329df3f24a4ef4f30082e55f9030c85dbd022cd6d6b748a8997b17086a9cbf118fce6d3952acaf736c58aca58cf658d15bf83c38bd57aa9845821ab23a70a67542f9d863b3a087d51f53a45b67435cd32bf2b732c9608439f822a1f160aff43dcfc5640a7422fe54d65ca9b4a327893499be0fe64f6e569eaed76b1a17c7f1f2a1f2d37e4a39b7a07cb472752c5ce743ff96886dcbf98123cc3549e413d6b912a915ab29441c58a55b19a04d1a6a9cfe92af382683889d270a649431813aa501a36290d5be4df507ad62bffabf36894b9142d56be90bcdeaa9b861bd5c48ecdfa692897a19c86f2db5bc26f53b95913d2639bf2fecd01cbe87d2906b34c0c0ef255eb68561ab7eb11b9627915524487ba3391d60f1f4cdffd4ce580aaae1ec75a0e041f6137e7d3b0c4a39f072bb424cdb9d46c954b8d4ab32ce34034416e7f2a1739cc908bece9132c17398072a33926379ae049ecb5cac99d64d5e6710f27b9772f811f486975b849abe5591378263d6d4ad4934d764395171677846dbec529a8479aa036faca3136a92e33c76c688fb85dd1c56a25fa16352fa75d23ae926776c810ced5c97b3b503e03aed2a2cbe6848eb2f4ce3ab704816848e8dcb9519de934449feb84c9523f58641c44f13acac46b3aaa9104e97e9c2fef71d6ee97e8e79367cc5d90416c38d894ebaa767c3e674a78eb81c172deb9a6fa8c31d79d27ccb324b2bd9fca790fa172def9869c77ffc26039ef149370e82b838561deeebc58a0eebca994e756983cb7da574a77b2bd1a95da921e9a9af2f093c079a3eea7a07389d47741e77b47572a6fd469be4d799be37b89aeecbc46e7184d01537589890db4472b457a43ac0c1a62d0d6705a3e8b44b67634e471a059bb2c7cc0bf9abbd3eef15a338db6a6948ae9c5a69806335779689a071c83102d33e900551f58a1e7ad328d34155ab369e1d3a824b8d490047715054b82e514bda34df4a68ad4ca4fbbfcab5dd5e692a556baafd2dedefdead1740aca3106287b0242994141596682b25e98eb5ee0e2f5ba08f60fc5a928ac56054fc2735f7aadac5e45059e86ed54097618ea61c53ac36fd3d1d524ef0a9671cca4b82ca79ca53bd501e799648611be0a308b7296630dce7279df60ce72285588ad301462bd021562b329de2b4dbcd7fa2ac4bc055187fc5fa38a13c72ffdd12f569e54ecb3ba66aaca06f3bcc3a8183cce10837f08188373a8185c6588c160a38a879b44430305ea9ee9d337bc9247d3928fa07c0326b184e9fb3a9212bcc6e4747d542a72a235c85b8ea22274ad2142ffbb5fb0089d6b120e6d4858d8ec6d43c64c519aa10d398fe27382890fc46032794ce92a0a8ed40912ce40b3198ea7052c03e7530c4f3430bca07f30860b2886271918f60ac8b08262b8cec470b0c0b5cd748641985552cc4e3630ab1a108cd9428ad97a03331190d9228ad9292666d02f572dff97c91fc892e16fa78f17460282105b4cbdb7daf4de61e8bdd5b2086c414502d4bb6be4df3b02bd7f0915631b0c31d67760b0185b4ac5584d0e728aa329721b33c5d8b4d031760cf5dedaa031b65a550edae4ef20ef5f46c5589d21c65e0d1863cba9184be4205f3a9622579f29c6ca43c7d80aeabd0da6f70ec910630b55cb2cc8bb571ade5daaa6a2f0ce19486f1a50cd81648301dbd9a6e4069f54091b0eec6dc88b557e6cec53030e71a239932b9da9feb7e3a8b474aa212db50e0a969656516969b3212df50e989656533edd94292d4d0f9d96aaa8f7369bde3b0aa5a54e434c755f8f35941e2d4173e1a43641debf96f29c2d06cf39617030cf399ef29c5683e7f409e8392750e44ecbe43933437bce89d47bdb4cef1d9a21c696099859df1ae8ed2751f1d56e88af814382c5d73a2abe3a0cf1551030be4ea6b86dcd145fb342c7d77aeabd9d4153d84ad5cd061d7441de7f0a1563db0c31f666c018aba6626cbb21c60a03c6d8068adc8e4c317668e818aba1de7b7ad014e6762f0579fb460ae91906a42220d25a9370186d38b3eb826750057688edaf26730619eea8a3109e6d42d85f214cadd007cd9812863796aae9c45092f5dcf445a8eac24625edeaef4e5dfdaa52ef4e2ea80f333111f6df0d5655dc29a0aa582eb24fcdcb85f654a5b1de14636a8ef649798931a7529b5c55e4f629c360b3b7eaebde953926ce157e07c0cf5331b08ff056d6836943916d30915573c5f3bbb785e3212027f86402d8f577a229b733f2bc40501b5764d68122b8c9947f41be7aa108d923de4849be28ace453a9bcfd622a6fdfd5adbc7d3395b75f62cadbdd0a0d743fe0b19eee17cf4dd4fb2f35bd7fb87eff0cf9d3ac3cb85d38d344bbaf4133a5c165260dc6085c41a8940cb609f72b1c09f5ee4a19c2148c0655256f08a44b8b4917682fc276dfde417d15d70106f5b79884c321ec3fedddfae7f0869ffc6ec9eec7ff90f68202fa05ad14c92b4d24dd2a1e70ab9727ab85bb235b63c0eea4d3a8547855d854d84649be3aace47693648851d8303b6cc5b08352fbdab06a6fa5a218f6d70e3304d869105caa162df5cc32a2f0538a329788bbfdf05a44f3da668a08e0757d48c1db29c1378414bcc314c36af5d8a93d12c3b9582e93398e6ff443ac8c26763a95d86e0a99d8cea004df1c52f09926c1d0a6bec58fe00c4b77cf320986dac0ad7e044fa5059f6df24ab57aaebe47bc92cf1b6f339132d6bf614ff8780c2631736849d5d2cf314531c4c41d7ea2f8763a8a7752a5e19d614bc3732977bf2ba4bb9f47b9fbdd21ddfd7c0af23d21215f4009be37a4e00ba9d8bb2f6cec5d44e582f787cc052f36098622f4013f823314a1bb28160f86657109a5f2432155be9452f9e1b02a5f4645df2321a3ef724af0a321055f41a591c742a6912b29c18f87147c15157b4f848dbdab29c84f86847c8d493034ac6097fab00dab6b291e4f87e5711da5f63339507b37a5f6b361d5be9e92bc27ace41b2820cfe500c88d94dacf8755fb264aed1772a0f6cd94da2f8655fb164aed9772a0f6ad94da2f8755fb364aed5772a0f6ed26e1d0ff07df8723c768bc2f68a45f7007c5e5b5b05ceea4b8bc9e032e77516abf1156edbb29b5dfcc81daf7506abf1556ed7b29b5dfce81daf7516abf1356edfb29c9ef8695fc0025f9bdb0921fa424bf1f56f24394e40fc24a7ed824196a67f0edbe30b5b34728c11f8514fc28c5e2e3b02c1ea3247f1256f2e394e44fc34a7ec224196aa09ff9c19ca1aafaa449306cc2f8b91fc1c369c14f5182bf0829f86993603884cf47798790dc7f4186909e31bd00b252f8b65bd8acf4594af8573910be87f2bfafc3fadf7326c9308deb1b3fb19961ebb6e74d8241911ffa113c8f16fc02c5e2476159bc4839e08f73e4802f995e0029e25b3f4c32f4bcbd6c120c99037c812c6d7014d659993b5557a4ecac0103a830b9aa5a4a6d568b751bf5a7aee04a76097017ee2e4edd9f394866f60a65df4f4df6c15a3cfc5efc4d12c7aa457ad8adc6a025be3bf54a26dbf053412c7b95b2ec6726cb669231979c18e058e84c0f489df7edd796b5f289a0c3e4af51767c67b2e370d20ed3c09963114cc4e85003f9dec153da1bd3075a83d8f43a65d3cf4d361d4ada94ae45aa4578af322e5bdea06cf985c99639a42de9eb437a2a76dea42cfa3393454774dba2068347d23699fc3788556f5156fdd264153d8c46a79f16ad61ae72b0b7298dffdca431fda1042a1e162bbdd3afc236e4155d9b8039e907eeaf0aa4fd3b94f67f61d2fe004fc9325fe5af356ae309cc7899d2a641c0ae565ecec96fb304d1f35d4acfbfa44a78f33b71a9be509c266faf51e53ac406ad297d3e5725fc7b947dbf32d9b7a41be507e54799cb7f2a9da7cb0962edfb94b5bf3659bba61bf535b89a1ebb7eea6cf9acd77d4071f82b1387b9814bd845c2d92eb07b711cae7cfa90b2edaf4db61d98b37c31781ef811a5e96f4c9aae0eec8da67cc6364ffc9862f0372606ab843b1ddf5def9a5c92625a41eb4ec3f7f33912875c7b5749b24553cc64692e6af09f5004fed644e0f8bc1158a86a2c1b95adb0b3598792eeec3559abf73edb2160d3a8dc79c3a7148bbfa3f2255e16ee32a75cc4f367946dbf35d936cd5393a85096742adddc545e25cfd17582e4e762725313fa9cd2ffef4dfa1f23f2d117c0dd4bf00565f3ef4c3627bafcd15d6685175939d421feea458d9e4cb8b4ebcee4d2ad55ca069830df99e289902a9ddd7f1af48288b5aafddad8954a73d3a3d21ddffe92e2f40f54bd8a9313d43c2ac4566511c84d3e93ad3e1296c30f280ebfef99fccb3d930bdbbea26cfb47936df3f2609bbbd63a17d67d4d59f74f26eb2eef310f86fe4697449dcc43db74bbab3d40eac765066d457261a97959692ea87f4351ff6713f52a769f825a1fec2cb546deb94c9d312deac40b3f7341e18714853f9828accc43ad27d115d7a65225b9603317d6ff88b2fe5f4cd6d3ada0a0edb576950e567afa80b135ee170682f446247ba68230f831c5e05f4d0cfcf5322d13ce52ca2abdc3734ff6327d4bd9f76f26fbca3df6e1da8ab7e7cf89dd4cb6d1359f2016fc84b2e0df4d169cc4583e381687a909e686c84f2922ff6122b228439cfae9410bdf06e8bef7fe8cb2f43ffd786fe696db2cb5ecd9bf15c9a78258f01d65c17ff9cf5fe09dc17bb11dfba8f3b98aa19f53f6fd3755efce9e7fce97e9b14ed9e66c891d3effccd6ee2e92ff633198dbb150dd09dff858a94a54a7bc2a551fc12aebca5bb27faf0bdede2cbd09a85675e50ed93704f91ff98e42d8f450287e80dc5dc76d584257a1e437698f7537102f5139558bf27be8312a912592f31546bf1bb398f2c912945362ebfc6fd1e2dd6022162bd216b9b22469f545b0ef9ba5ff0bb13a4ac76aafd262b0f1906e7a53762dfe086feb6df621d33620c912caa4fb64bd43b4d3da515b57ba837ee6aa6cd63766fb92c95425c0ad036615b706256f93b871cacd9c4ca54d57cda6c484282ae855063101bbc2b2e172b665805831edc91a0554df0d48a28a71a21a61f42cfc410fdf765a800dfeb9d87a717b587214be46094ad664a380aa03a1ea9defc4989c30160554958392a8fa70a24add6b31755fcc643f4d1490ed1a964456c0896ca44286075740107c9ca8430b723e25056a4501dc97fd92e00af39d2c933bcd4701551c9591459ca80a5166bf54544602ce6f50f6de97130e2cc9a076858d02a85f0e4e82eac7096a800194537f8f02a6dd439298fa7363aa8eac37dd36348969404f54159cc10c773a4f1490cd1b9e4436903ba7f2967851023505e5548338410d4ef12dc7a3e0634c201426404501d6a7c8ab06f75c42744715a380ec57a8ce3e8413997777ed2895834b50063f347f89307d2bf228c0aa441e358cbf31e3c282664c83ee928e4adf682bea1b1d9ecfc417257ffa3d4a7c23f82ba1de3e2b98a614054c570f044c45051ee1de31e9ee8fef04634b8f44c1b0c642b15dcd2869134ec78d67646a92bcc53acd47c6d0c8523c401f7a3c4bc7713cadaf21ee63ec279e25ff8b07ea258b67e91a325f4f0eafc433a41ef3b3c9dee078c64a7a3c6367433c430b3b4ed639e2191a9ce94fb999653c6bf11cf7d9994bdf975a81cc765f9251b6da7b72d8dd3c5c5e06c3eea362ffbf47c4cb60447c3440785943704a9d319ca5ce581d73ce04881635dd929e30029fbc9ceed561429a0ea91bfeba1991499b7e2925d3683f0676a774829dd4dc427cac4d38cb2389f33184735c3e70369040b1fad56a290e1bce7e5c388f4338f7e2c4e97e41b156e796deb97d78de58191fc8022e905b10c8f19c20476749e6581c78251bca222e94a7239413f80753699f4cce1067c4389b0b6319c2b877beba6eb60a77d944f2cb3e6ce8cee342578fd0edc3896e2f852ebd61542d362b880b543d70b31608ebee617d505ab33c77488770211d88904ee4ce1fa9f6968f1939b943d9c88572254259cc89d2fdb2267c66b45d35783b84f7b35dd1ab4136227c93f2515253c54b6a49cd58e9612ba9c72194fb72a2dc47a4577afcee2ec28a761117da4e84763f9b9a8daced1cb6447f0fc2b9bf4d38cb2389f30584f3807ce06c923735e962a8ed7b978f5e8d701ec889738e07e7d6ae3c34752d742e571db346c938ae28391745c964ce2871bf4eeab79fe9b008f632cd4230e336c19c1d4198d311cc836c8239338230f747300fb609e68c08c2dc07c13cc42698874610e63404738a4d30a338cc71088239d526988c1dcb6c30c720982536c164ac67b2c11c8d6096da04937170980de65e0866994d30cb2308732c82392d1f30a97e526f9709633267eb30391cc12ccf479f3d0cc675766d8a92a73efbf15cf886207cd3ed1812664cd26c43c22d08e30c4e8cc3911736eb97d7a8699d79f244b6aeba8908e1cc7cf47c9689e40710a80eb66aa55eda460c11e8661b8170ceb267308eb12b83cd330f44280fb56b665c14eb929508e76c4e9ce385dfb1cdd49de3183b356ee782fa08827a988d50193b37d8a03e8ca0ceb1112a636eca06f54a04f5701ba1327610b341bd02413dc246a88c05151bd40b10d4236d84cad85262837a3e827a948d50193b8ed9a09e83a0ceb5112a63cf121bd4b311d4799c50fdade070be48c3e89d6c7d4c872290f36d01c9e8916c20a720900b6c01c95808b1819c834056e4a373846acfa7768e30b691d83a479e40282b7b7230231525eb645a36981508e6429b60327689b0c15c84602eb209266303930de69108e6629b6046b143791e82b9c426988c65391bcc9908e6529b60327679b0c19c8d601e6d13cc282e3e2847308fb1096614d7aecf403097d9049371a63b1bccc508e6729b6032aec16083793482792c274c77732e7871bd6a4abab21b3957aeb3edec2110b8159ce026884c333e4cfbabe561e6075be7c6208475654fcefc88fe1ce2c108e5719c28fd2fc3ae10de4583ac68a772a13d0ba15d958f493554175cfa326cc6ea11db34d81b11ced536e12c8f24ce8710ce2abba67c4571fdda1284730d274e98ce5c2b0f5ae5635bd5eb5709e7b3e00975c4b82bcd202e787d10bcb59cf0f00cf7664961bb54b64ee4695e31dbfe48a310bee3ed19eb8962efd04508e509dcc938b9f56c12681efc700017bcf108de89f94ac620e4fbb1b9d42684efa49e6cd5a426e328f6984f4228d7d9d1aa316d2ec588966d73a9ed08edc93655c359bbd6d812fd0308e77a4e9c137d7bea62fd48dee6b79571c1dd81e09e6297af32b671d87cf50e84b3da269ce591c4f938c2b98113e77ebe937e7ad7db7cd1a60aae1dbc59c0702ec84f21c8353d59a9ca5b6e3a8f0be5c108e5467b9a99511c37df8a50d672a2f4bf269d1123db9af4fd10c63a7b5a4c519c4a78104299b0ab3b388afb1c1d8570d6db5455629de8ca5655ba0fe16ce0c439d990d09d0d4add0f25395524e733495075daaa4426b7df77be429587c2692717ec0482bda927cbf9bc65036c3df3cf22948d9c280f10a99bf33a0ac06810f8655da05ea9286e797e31027d2a2768fcc1126704294fddce6cbdf62311bacdf6cc949b1ec9e52dad0866934d30a3b822a309c16cb609661457643423982d36c18ce2f8521d82b9c52698511c73df8c60b6da04338a3d4b1b10ccd36c8219c515193508661b274c77357ae6965074bf70f92202d9ce09729201a433cb1de6cab588a3557bbd35638f5314a771f742803bece9098d62adf30084726b3e50e2351ba6cf39b2afd360ebfe188a5076dad5a91cc54fe19c82706eb3635653fa8031ebac26b6b51a2f21b4dbedf2d428eeff3e1fe1dcc18913a6a437cb83ed6a167cbb1aead8aa488047462fc72c40e04ee70477a048ed30de284f6e92173b153aa82c79073edc7081e14ec62a135bbfe77308f5199ca8a16ec6ba7c95cd1bfb214467da33e3238add6f9723946771a2c40b0bdc5ae5525119e97ae47004efec7cc09be6f1c63c8cefb0556d262078e770cf358262a155c0d7d19df238390259a10a8d16554f6ce2c338920b6311c2b8d39e167614b793284528cfb56b720c63659b6d72cccd08e77936e12c8f24ce4711cef3ed6a0a46f15b946b11ce0bf2d1870e159f7a5d5a2764c5078a1b67fe7ab457f96e44202fe404d9571e740a77ef98e56a924bf49a77bd11ae8bf251674cdfb3a845df12bd123a86e05ddcf3035fecdf3b654bb4d72090bb6c01c9d85bc306b21d81bcc416908cb32dd840de80405e6a0b48c67a221bc8eb10c8cb6c01c9d835c606f21604f2725b40328e5cb381bc0981bcc216908c6d16369077229057da0292713a341bc8db10c8ab6c01c9d865c606f25e04f26a5b4032ee0bcc06f26e04f21a7b86b4a23809fa0c84f25a4e947b0bbc57d622e12c54824d9f40609d54ab430bdca806ff41bd3c0c77b1813d0281bd2e1f603bc42679b99d9ce5f37d59255682c0eeced720ac6b7f9efa1f2fe082d780e05dcf09cfddcbda9d9ad2a1a03963d9ce48f6f7696af4d308eb0df68c2b4671ba7e3142792327ca70bbbe31a265cb39b721b437e533f1c330c45a7911a6f5253c1e1bfd2d759e47586fe6c40ac32c35d2fa3a0193f6168b363575af553ec4068d6d4ba74204ed169bc6bb593fd5c536de7d17c279ab4d38cb2389730fc2799b3de5791417d3c711cadb3951f697074df2f236b5fe0684b4c8db7744d0fbfa226477d83579258acbea0e4338efecc9dea2bca164eb787b06a1bc2b1f95f36c9d1adf9f6d6ef74668efe644ebeebb0ed3a33b51a53cda13ab86217cf770e20bb664be3c9265f60908e6bd36c18ce2a68c272298f7d904338aebbaab10ccfb6d8219c5e54c6b10cc076c8219c581b41508e68336c18ce26e42ab11cc876c8219c5dd848e41301fb609661487278e45301fb1096614bfef7c3282f9a84d30a3b8206f3d82f91827cc83457a3787b3cbc06a5129739be9860d45dad1878c937f2d146d6a108379f781462ee4b723e48f738ffc2457f3ac14ce6228d6ef448ee382d61f417bc2aede4dc63c94ad77f32484f3494e9cb345eaa0aeb34adc9bf49389db94092c503b6325ba42e7d9b546cf66cd12d8bcfb4c141d4fd9317d213d2258a72fb0ed81701e42fbb44d639cac7df96ca34cd7239ccfd88493b595c586f34184f359bb8a35c6be29b6626d19c2b98713a73b579e6a1a447dd1413502f99c2d20a3b8e8601d02f9bc2d20a3b89c7a2e02f9822d20a3381a3f19817cd11690515c4ebd10817cc91690515c4ebd00817cd91690515c4ebd1c817cc51690515c4ebd14817cd51690515c4e7d3c02f99a2d20a3b89c7a1502f93a27c83291da61070b07cc7bffd2f3ebd2fb8ea2fe2de92711fe37f231e6e4b7db83b14dc4d6e9712d82f9a64d30195bea6c307723986fd904338add71a721986fdb0493b1c5ce06b30dc17cc7269851dc9ab403c17cd726988c2d7736983b11ccf76c82c9d8566283792182f9be4d30a3b884701782f9814d3019db4c6c302f45303fb40926634b9e0de65508e6479c3083ed9e14c5e5089721941fe703a5bf098c519cf2bd2f42f90927caf4fd92fc7f2289b1f2ceb687f6a908eca7b6828de2b7a76a11d8cfec98ea65daa986313360dba9e61284f6737bf2d528ceb19f8a507e61d3342fd6e9b66c95a7fb11ce2f3971162b9cc9a9b1ab755e598b38548bcd0a394ca7ad957f3bc217c910be97c1f8b1baf15c780728bc45051ee18bd28457285f026faa15ee9722616fc0c522a17242205d2b8f97a9a2a8436c90feb64efe0f1627ebe57fd3f998da1c70a1d8ae8646da94bc3a25bb595e05cdda45d92479cb0fc0450ab58bc48d5fe5882b59b5320a5b85f385eb84faee568bbaab4dfdc4b37c23339e616fa878a06f7ac5c97d54205a62b1613a26e0dc7201bbf9d54819352aac923f1b559c94426d2e364bfe72aa00255d857f891e526ad647eef9ec32211e324bfb0a60c7cce9b129671e94cd22c7e9e1f97a952c134aead2ac9666b78ff6c6811962a5743f888befb3fd5f43bceb68576e3a4625873532e6ebb40baf90373bc909fe15fc1ff9c434b136ba0100 serializedProgramBytesString: - serializedSignature: 1155972d5d4833a09118436232a4f9fc7b43bd53559edd00c7e30358d6f0fd361697cc78ba5ec81d17d519f75f4caeb761fd34b2251103b903c9ec5afe2e3b0f + serializedSignature: ae523eac0593e2f4fe75b6efb00d27fc44a0d70356bd94d730fe1c36ae86d26dcdd0ba04ca6be7a30b2ec03efaf5c279928be7016dd361a917d03f6853d56a02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset index 7bdb89f..45c82b4 100644 --- a/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset +++ b/Assets/SerializedUdonPrograms/18a8a73823b22934e929c67357a4e2d7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5aeb72d346143e722cdf736b1b0cbd52681b53124b493afddb42a021338530499c3f0c134cec80191b32b661c22bf48dfa1e7d9ccea4e71cadc87ab52bd98e65e3147b2c59bbdab3e7fbce6557c74e38802f6b050f07b00b9b50860ad4e00dbcc66f9b786ee1dbbbf2db1f431bcf2ff058c5be15b81e31925ecbd6553c6ee35507ba38f22d1ce1b9c1fd7b50c7efdb38b68e57d47a8c9f3ade6525715005eec10e3c82a2b51421e2800775449b45b8ac0c1eefc27becadb3523489c35d453cec614f87fb5aa8b47fdf1378cab05ad8778463dad04499cf5962e61f1acb98f89417e799f36648e1a720aeb3e29c54be5be243f7ce4a632de99317fd73e23a27ceb624cb3fa795efb26e29f19997c6cbed0bd4767676f6af6d31e30f90832a9c8093a01b6f0de01afec868a720d1a98400bdccd37691fe1314a0b14c85edde850d58d75ae69a5590f4dee46315ef68b0509a4c99e2efc014a45c13df75c9ad3ad8bec55e498ed5c09e32fc89671af50cd6d0519e28520e70da26ba661df6f178c2f29ea1dac13ba320910baa637651a617212d6cf1093dc1eb266bb8c7c777ac699db5dfc6b62ec7eb6b8cd8bb783ee5d982d8dbf85d37e7bea04cafa33e504ced5e38fa66ba8768487b8763e79345266111a23eb528c230e97066fa2b60894f1c7a49c6e605c893b1e6a5eb9eb6757038b7ee06181c1c6310a1debfa3f87e1ac20c99bbc808ce2d4c2fbb17d60638b44c585f47c00a2395e495ac2b0109e1eadb76d2252555ea2d0df5ae2d96332da2ac8288ae0cc21326e1e911089f3109cf68845b030a4fea3c927703af62f5c80ab6794bed7dee6d707e2ec34344d215999a30f91b2bd3fdbe5f3ee48dda5bd624dc8369cbb3aab016f05e3725364f25ab0c10abb62687b5759621935bcd09598646bec4b9682dadb144fa8cd63af9bead5360ebb8a1d6198dc6260ba57416e21df5cb8f2276466b99d9be2d33c7965919206e466591b42e55a6c5734c4079354de6cc693263cac10b2348f05993d68b17d43aa7134c503eeb4770c12c386fa2e3f311d051d0851543d98b35ac7a257bf735f8bec1b7495f003d3f2a4bf36f8afae71b99321ce2fb0d2a7e0877d0cb6b1c09def30bf5e84799db4d3dfa785de2780d3e424751608ac2599d779001afe8585937e609354bdcc16f54417a2ff87a0154c239c4a7b93a8fea62ae0fc1aebae092d905e74c088a3a04bff765d75deeab32366f2d1aa9650740376f4277d5846e38fb6c09fb84a1e94ff220e8164ce8aee9d06d85a0d3ef1e3c6c1d81ada568da3f26959703f49306cea3c79ac6b76551debdcffcb571e4631e41571d703825bbd07fe18de66e611453c5641f357ace2933ba0cf72598cb70c7811c326c45260a85e74534fe98cb76fe53be0e5d342673f5292d10f9b290695e9f2e1bd2afc8aa7e4539e1700abf3da437456b416581d48cde87065f873c018ff8b7051440c9fb0803b7ca0382811739df0eca7c25eca89b6f9505f8a58b1154a2c9c9bc65bfcde6ed302f14f28af03f46e675c36d7682f131cf19e914d5a356925753e38517d38f4df36f647f2f45facc79fad5a74d97babefd9f67469732e3774442c14f242e2592eb71463b4d454b6903bc5ff9c88204fa10a34d99eb22c5c86c4fcce7fa01324cdca739ee3ddabe8f9bb6966187131b6d85b868cb49b4dd988cb7ad4d216db644dbcdc9d0e64e61902625da7e8893b62c0769ef4ad49942c2b212613fc64d18f999fc8cf94b7c84d97111969108fb69dc84c598c96223cc92085b1e376131e6b0d8080389b0d2b809db9842c26624c26e8d9bb018b7b2b111969008fb791c84bdfb50d58b3524e7e2222c2511763b4ec26802755bb12d9e004ea7d0d3f270698a252e7917fd72faa18e5032ec024ba18f705ebd625130409b6d2a67d3c6bbc692aa52edc2e1df037e85c18a7de132a30b0bab20156014cb05ffe030c962890ee9450a278510ab38fcebc565c64f7fa74909b3b39b16b9ac5641cbd78493efe0cd9e2bd3cbfe0f57be09a7702e0000 serializedProgramBytesString: - serializedSignature: fa385e1f033056999f2e7e6efb137ab67adea12b6abb0ad141f035b4f6910a0616c5b69976fc92ebb294a37e178b7c95114b10ea96a95b95346604726d7d4804 + serializedSignature: 532bd475156f5fcc5f2f7e7b54faf0ccd572bafc54ae74aab644422dea6c5779fa42e340959289fed810d4121ce1c463dbf35b43b1af09a849f1ca7b9a377a00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset b/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset index 705f6c4..c3801e8 100644 --- a/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset +++ b/Assets/SerializedUdonPrograms/19cd62cadd8e1e84e8a34345d144dd8c.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed585b53d340143e5b1a0a5a41546ee2033e892392020eef72531cb908941774a0d0163bb605dbc2e05fc0077f8f7fc35fc3a3df3949da34d92654083a4832d9646f67cff9beb3bb67133309971a47b245eb34471394a62c1d52195f737897705b39a77c8d2a781f20cda06e9c46437af2f54c0d215d42ae4a35f43ca67dbc0b52bf41397c2fa16f0e392ecde3c9a1958aa3539ae66995566850f58788d8924e55bb4cb15daa0be92c7d436d4e94e2414ca91a44b2819aaad495a0b4d36e9b3e895925d4eda34f858a90b92712bb042e3c8612eddea27d868ec88c71f9f33660747a8603c8a23b634436923c6c0daa1e4180c68ab46054a3699ad25a31ac922ebde724cda04541841afe217efa8660e58ab8732e0aaa287f230c320905d44cd07bbcb9d72e4d02d46d8f942d0c5b048d39da447a24f276a1b6bf6598494c97b7cf3a645ade54428903e811f245d17043d213d13427da2fa1ac26be5d8677cfe27d2aa3f96dafe05b37e6a60d995e47bd53b52ab75cd7a1691ed6b0f66607bbd92d237f831186bed3b0a761dce439a2ce7c4cdc62682d32862cd6968c49814c35954d91c959b5ee43b07d1bfd16eafddbc27b865e05daa24786e91e110b1a0c2ffe3a9ff871fefdcc68366d9acc4e36ed49886941c0b2bc3135e093106c8261c453aca8177ea5833fc1851bd708bfd5ae20edda27a05376a66602542fb22b68b086a7206a576919d5653c07a2a88f9b140b4a08bcfecd334cc55600c77400775d37c0e12b4a10c05d75bb1a009315e96810ec6e8160980ead10ecd021c883a82f912298469915fa2c486d41f6cb86cc43c9f3684e5818d483715c9630f358740946fc4edde606e2a6149a12f846a9d95ddecdeccd8c12869ee4a4901cbd32ad9c22ae730ad65c7d8cd429fcf1b8f3358bbe9f41d6890459c7e8af8bdf8369bf07dd5f7a68d7e3df23f88f6a4f15ed69641809dc4a31780b825305bab9974d93c956a9364e306c5d09539a43cf4d68b02748879f677a03ce33f92b0b6dc3acb09629ee9f97f38f132ee9ac0bb7a975189fb02d7264016976801b67e9fde605c5c3eb624447968bc6147e5e7a65269ccada551179592f4f3cfdfe39cdfb9a717626b57e32a678523ff8cfe75b8ae7db43729dde6226b3af5efce16217aede231ead430f79fb51a7256045feb7d941efbeacf4157bcffd207b48b5ce9767c4cb1c44ba4594d3a2e722e684ff81628e5e03b8ac5850c51d17678ea5d8b6fe28c1635fd8c1cd03e7d164a72ebb007522034ef35fed6a80231770035102f7d406ce8a17ca021d2b51134f2cd33bfb17d54ed3306e937628151dc0dd51011c73013c18f5b4d67b66d96e12197889a8c0532ef086a2048fe9ffea5905abd101968c0ab00e7b53bf01e1538a378b6177ec31d682a6b10b6c6956a4d367e35046eb65597c32183723ef46d463722caa66dadcdd836586eff98fd954a5f7efe295f177156196ced2cb845cc900564ca6ec46db3f429e807c5002f23498b784e768158db3a2145fc66f1eedaccf751d0000 serializedProgramBytesString: - serializedSignature: 2d85dd9d88180418417fe23392414e9eb146ee479ab3ef640b0d78541cd76eb509b5c1eefd2324d8600be2e1813a66085933212b16775d8d68ea32fcd4b72b09 + serializedSignature: afda4e6b5244910619b6a7278c181867132dbe5beabeb7181a65110825858e203770c82c32f6d756da2131401d859fd1bbc419f6378e16ae81adb288e364e305 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset index 8536ac3..aacf96b 100644 --- a/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset +++ b/Assets/SerializedUdonPrograms/1acedb947e4c9dc4d8f749557d611c1e.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09edd3f6cef44c4dd5d7d5d5617a86a284d2ff6287f5d780ea51edaa56f5ab617553ddd0bfda753aa53fce96bbffb29ad1e998fe1ed47987d5ae1c67c2bfaad826fddda5b766d59c3e735e0de97402f37bd588fedda5cf1dd15bb07754ff1fd147c596eb93fa5587baa42eaacad8861c2206f0a459b32f0676c556eaef36f5acce1d41a5e02209ccaad45fbd3a6716f3a6b4d2ee718fa9c7d1ac299d37a4cf9951935ae67594b87297d62986363957d0ff57e8ff1de6f732931699fd67c971ee7e733ae69f23db2079dc6c2f37f99d641bd2b8499b4cfe79a203a4c5266d36fbbaccf64a939698b4c5e43f64b64b4d5a66d2559ef35799f48cd97fc16cb799ed87cd76bbd9ee36db0f98b4dca415265d6dd235265d6bd25673fe45c756e4117ffdf5d7ff67f24f9b741db1653b6102e96623e392d9de499840bac593bf9b308174ab27ff8c49f7916bee25fb20dde6396733b9962bd33d0ed20de6f8cb667b3fe109e9468fbc2ac217d24a4f7eab49ebccfe2b641bd27a93264d7e0fd986f488d9dfeb9177ccecef23db901e37e9518fbca326ad65e49d34fbfbc936a4a74cdae891d768d28447de61a2b77b3df738480f9ae307cc760dd94ff5d9648e7b84948bcbdfe5ec1e07e97a4fb9adf3ecbfaa8cbfc66318bdceeb7832a8a655022b7e8dca3fccba67e60eb0186be00bfe55e165e774289bd6022c51ae1f63e89c6ad03e618b729b636544ef76fc1ed4474ca050b898e712af645c02949bd49f1112a267f5fe4e8cf010a427744ead0e1a1378d613da4d1fd39f742903fab2933acc8f68e79bd79702794f68b5338fcc65128473ef393d5aa6d3da4ce93d2ed069bd3d891af6e2f72dd47404b5efd2fbe6b0edbba15bbf369ddec6ab65da3ea37fdbaed96790d975b4373adc7ea769738ba9435b03da27b0fd592a91c5281140bfe251530d9727b0c57e29a32496183a41063a325d46461d228ba5edab5709ecebf46510f46f63a68576ff86bc9b2865501f9bcd1e3b1d28f2436845aa94553cddae0695c0bedab61c7665a30af2aab147ed57ff787c7912b4f4f28f59f827e3a64dcb34a9c463126c31928b38c9c5854a5e66f319ecff8e89fa4cbfdee73486673177022368adee128fe87dee2003e87347bafed28dc7cea30ed93d0b62fd760fac19136a321c2c098556823e724829217d394f5a6e2b151c7df48658937b51f73194e3bf1ec36067a7d73559d2a5483ab3a3954b078e60dc56638060995dad968c4a53ca579a15b6e2c1414d4f88c593ab61cb563830a2acccbb70cab1703666d8965d03ae688a6d4503f42a2c4a811765144d395f342bb9725fcdb9a38f722fe184afb10a7fc19753ade2b0ace5caca0796524ef8ba00849771c2d75b845754f913fe00c77c4300055ace09df1840815670c22b03d07c35277c53009aafe1846fb608ffcfbf1ff6257c2d277c4b009aafb3084f60cdbaa616a33b03c30fe8dc8fe863e7b2760fe0c8ec311b66bf8e78f8d8e335748bab6330bb168c5e5c245f6fa38da126dc6eca1c0ebde138ff2de1f6bca9ee505c1725fbf5397a1b6c1501e8edb4a9e4ad043bf84ab09113bcab40c1959ce0dd050adec409de53a0e0cd9ce0bd050adec209de57a0e0ad9ce0fd050adec6093e50a0e0ed9c60986eaff2088e3da837af9b21f629ed91cfa9a4baa353f98f1f9b76d8225b59d891ed9226f5a472a61bfd47b6eabc235b0d13d9725d9f8b6c3b398f3868f308b87b378104c3f58720fc6497cd52f09343f954aa1a5ef06e0ee1611b42b86937aa376eea5d6163f4836b0f87eb4881b8f672b86a6db8e0fedb2c69b56581f901b48f03942810d07e0e50d206088ebe652a3e54f7868210f901708003505720802a0e40bd0d00c4cea7f5cf413c7606fbc610afc3c250cd61682810430d87e1a80d0384b7260cf993e807a7750dde6b00ec51cd24c70153a7f737695f4ded6ff665f641ceec63059a7d88137cbc40c187399e276c3c61ec0bf44ea9abfab83b482cf5bbfeee6f3fcc8e70a63516685a2d27f8648182139ce053050a4eda04c3d402743a0b9d71a9e384370520bc9e137eda2afcf9763fc21b2cc21338af06b2c29f1469bf1b1d82bdbf034b9396795825708a0f7c26786d203a7abfe2f61e36ac8aaa165283eb851fe57cea4c000e7b8c13de1a80f0e39cf0b6006ac3099b70a80ded16f749966716b12967ef255bf84b3672f6740400eb2427fc6c00c24f71c2cf0550120f7225d12956124db64bc2262c012de846fa699be455b89947a3b68d17dc6c130c775760d569a1b76e5ab8f2bd6029dfca97ffdbe8a77ccfd884c3f1b0ce35a36f041292e6e3a7ffd3ca795137eb45afbdfa6a33f9c29b0c7ebca8cd72c904deee599c4513b0663b35540bb651bd68a198c0bb4fd9964514a611d4eb96d417d3a6c2aaddec8b330ad3826b57db6da58fb7cc9e5c94d2bf6219a706eb03976d3e80f7f16ab3d00f422f8f276473872be80ed20a714ed1c1c5ba1e5bacab57ee12e65e7de6055dd0831a3b54367804e319bcee536672aa565dd39f31ccb9a6a5cf6a7d064d21cd601e2db4f4d56b7ee2e859ce825e9b056758ceb028645a1f346734ef44cd9d75521d5ab767743eecb79f9dbe9e2a38ebce71d6f5d9acebf654e4f4eb3a76ddd4565e434d6f685d2794bb221884b4e2beecda67cf0bcaee4eceee7e9bdd7c30edc12b0f63f84af7c85b774ff76a4dd76ef9d1f93ca7f3804de74e4f59d1abd292eac4baecd6ff3e356e254dcfce961354f97471b63e62b3b5c547f9387bc62cdaa6966df1fbb91c3fb63dc4d976d5665b5b20b62dacfc16eaa917380b1fb559b8cfe3a929aa8e557dda42ba982053cb549e1f2d1fe6b47c934dcba605c400c88747062166bbe7f6ea5a378e756d244bbc4fefa2f9b1aa9bb3ea319b552716601574c3e6306238919db7c2d6b3f063cb45ce9637db6cb9e3c396d4b4d2795d22030bae2f61e570845376f8e17a89e3fab88d6b73464b92aa6f0ecd73a8c1149675b6da999e436fa30755a72f7396bdc566d9d59c9639fd98219f96159e130c8d2b1c8d6b361a07d8fa93f2326f2408aac5e8e1347dc2a669579e7d9b6e1c9d409c9ac6a519439ea8b5782d642f67efa0cdde46b664bad1a271357ab707701387d6c3d86a3a2d69764b83e8d1f471d65c0fc6cf6c356261dcfb394d8782d1f47a609a0e709a0e2f2c920511a31792134c247b84a33162a3716191690463f355cee6519bcdc7595f85a5ca7dca59d2ec583f6bbc75ceeccd4e203d6f4093831eaddd9262fd89c540c9b3184966f49997f10cd89a55095c899e54f93faa0ed79ec2a59193da8a41fdcb7de629bb049872e61e5c1f55de09c9853ec39ccb0a279ec2f9a36a903c176bb32eb74dfcf3dac5c6225796268dabd0ef354bc769a9162570adf8a1057a536e2d26e06acbec3ee47fc1bb23e0a28237db68014e3f6cd20c90fab5d461f33be795722d403d8202dca77c03786b03b857abd66f1887adb3fa331d53aa385e9484127852125331629a8f181ef807b1d023fc5c60d57161cf7a64068e0a0cd5b7b57ab017e40d7b03093e37f146d3fc291a08aa2d5e529da582a55a297beb9284566af23e6f4092d0804c01840e37de626dbf2159db5761995df38c518e7baf53c80b0e4ad26a7f693e462c24029c54a900795312d94a836c501f30a692b2b86aa4701d24b8a6257195195ccedcec1cce0c0ea197d5cb616b91c2d640b03d2d896db5c13685a77421341879c0f4f62dc49794c3572e856f05c13713465c1b4d1b7736c821db21856c2f41362b1dd79c61636a941b3d0f6b26b8e624715528fba31921c0bb2205af9dc09b0fa37a8e23289854bd2d1bd1c4ba1de504d9ad3090a5f7d404239a18b27a82ec19e98896de53ab8b604f6d17c1753b3c5c75b215520cd72182eb59495c7cc7f668043bb60f126c6f95c4b6c6609bc596735ecd907b84dd28269a0d410501f85c180d417ad756700c2ad6b5ad21c8de1646649bc5d3ea653d4c0c5725c175273c5c0db2eda618ae6d04d7dbc3a890e93d33c146402c861d23c89e0fc3c3523d33415c625d8d0304d70b92b8e277437e34dbc62401f56258a004639618a8a304d43bc20225380f2b06aa91807aa72428b7979f7abc20cab3156b09b6778511e09d2e4432a23dae0d04d7bbc3c35517d11ed71682eb3d92b8ec43a02822db4990bd571259ea7e12442f5881702fdc4f2a26f8de27ed71a9379b8530c72fd604b41064ef0fa392ba73fcd19dda7980207b298c6620352c3a11c161d11182eb0392b8f81958c1a6609b14b67504db0725b1951a6cde677d05ab665c0a9a22d03eb418d0043d4d0c5a8c40fbf06240131c718a412b22d03e22092df7ca9f28ce6cac24f83e1a0e3ee8e886bc704a0c5f09c1f731e92a3b4b4e09a1ab2b36b83a43a07d5c129afd0e4014ab699c20fb4418c8d287f0827701c4bc6c3f41f6494964b6a9c8e80eaad6106c9f0abf724671d2bb8e20fbb424b2cc71a8202eb171e81e82eb33e1c732c1a1bb582c3b4c907d360c0f4badc888e2eced5682eb7392b8b22f9a8aeefda8d504e0e7c3f3b78688de8fda44707d4112170c37dcbf8e13c208406cd0de44807d318c2620bd9321d8048855c95304d997c2a892a94ec6b1087632aa09ae2f4be2e227bb059f01105b6e7c8260fb8a34b6f43f2113423cbb2485ad8d60fbaa243678506f5e67f429e78d25d1bb9d729aa0fa5a18712cb5d4258a5dd9cd04d7d7c3c325fc948918ae8d04d7372471d9c79682c3713164bb09b26f4a22cbbdd445b0828a2d752923f8be25dd62da3b1a515c21b48a60fb76385ec7ddb613acb462f84a09beef48c7b921e5bee42f843e9a58d7b69520fbae24b262e3714f297857bd68f52c9182b58cc0fa5e18ed68fa003d8a7366cb09b2ef4b22cb1ca047f179e01d04d70fc2c325bc865b0c572dc1f5c3f070093f9329862b4170fd288cf8953e0e109c31131b075411643f0e3fe40b22130bf9c709b29f841bf2052717c52ae53e82eba792b84a94774546346733d613603f0b3f8a4511d97675cfbc70340993593f87628f9962afce98ff75dee0b9c6580763db6e35829303ce3b3e0755ea6d9e09208cefc7f6f396e0ec32c1b6ecd27e410df094ca6460a512c4eb436d96e6b68f2fe1b22ca592805bc6f7b4fdbf84722f36e55e948079ec585d00be975ba35f29fe85b5e1dc817fe395eb65057fad681a8f04350bf16b682cd2e54de075135bde983e1d9cedbfa6b1ac28b175a13eed5fa397257dda91368ef83db23bf3b0ce5e0e5e9b53474da33fd08552237879f89b8eb9496c8f41b3c84b6bd55b6368eb044a9d522eb662fcab0c45490845bf91e499c71b3befe55ac2478824448857d22a51122ad16f97bc3b50effe9d24cf3c1fb9be8f3dfcf7991efe87250f0fd4c3ff28c933ef67adee631fff53a68fff79c9c703f5f1bf4847f13ceeebdec71efed74c0fffdb928707eae17f97e4e96385e97dece5ffc8f4f27f2e7979a05efe2f499ebeffdcc17decebaf66fafa6b4bbe1e90afc3a712bbcef42f8c5dd2c70fa33cf817ff3f8fae33c60ab70000 serializedProgramBytesString: - serializedSignature: e969d0513488ebce2162355fac66f2f618721128570f8f2a146c442821c4e31e113b7ad06a74afd44a2780459969ed62b1b382e1f6f384b9bf6634c3d9e1ce0c + serializedSignature: cacc550346779a219a05ead92ef9d232d25ec4e03f61ec62f996287271c90ed123d227cd2ef3270a8df327a787058a94f3d5e5fd639e964878d5d74398595c02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset index 6c9074d..e576bdb 100644 --- a/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset +++ b/Assets/SerializedUdonPrograms/1f7e9fb643472ef4d83f2ad49fe34b18.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15080921409ce28aed248e21c1b002e2dc892d202624c4a6b8feb82810687148094324e122af9037ca1be471f2333f52e574f7cea2d1eeccae56d2088b582a7677ae9eeeaf8fe9d9111193c1c77808973db6c556d83cdb657976ce5ec1d30adccfe06b979cfa4d5684fb4bb8e6a0ed21bb1730123fd3c6185cd7a15462651879c98ee17e4aeddbcc82e775186b41096b4fe0cf825e46270cda65abec397bc6d2c64800893d1a54e27506ca65c4e1bacc7e87568b98c2494c6a4ac3651b5a4ad476064c3bfd5eb07d12eb0cda8e614c911580e611518cff03578364a2db00bfa7e0af0bfe868432defb78fd302ff7b2ebe1ac5b7876fa1afc0fc78c086540c2f8db453b29d070ea127ceca88b768fd03721d4e1bd838f49f372b432e7f5980ea10eef113e664c28238f7ff9f028e3c5a1db25a91be4f5e375d28cfbd09cb0e5bce6d7a1d32f94b1df24c76315ef6fdebcf9376a9055fe0076926317cc44c18d8f59edeee38c0c761cc238c29999a669cb60a217404062bdbbe41b65b6c416a5d63b6e2405be57e89a831ea7441427734df1a7670a64ae005f4b70bd12d4af91e7a2f39d42cb3cdb803b8e3a640be04c2f5c54f660da02b8afc576e07a41f40e816d6fcf2091d04ddd63b680a61d45cea0c601f402ca05e2709baeaf89538bb85f87ba32c5b45710d596e17e45b379652fc2b36cce1d0e999c47793051d5db21cb51d32a4883dc9b64bfef3472131aa1f038c5ddb0d3a408f8874713ef30b4830c06cb754e63c10eab55758bcca4f565cb83607819bd12caed3b08ef7d1f6450dd6992a0a261fc44abc55a62262e17c65480587ea022bd1963d443c19ffd68b433834cbaa13764d0c7b072a785d063db3951c941dff0f023a8b36ef83dd867b05b8ce01bf30817cc820ac28804c24c8c67165eaeba5d5c614f05e50e997290aab1dd42e53c07d97fe56b4778d5606a35e70241ae990469c69bb204cdafd24ba74c2f719e057a5872ab25a1564b544538d920e12e99be29373dd4aa6f27c1dc864ce22768cb417f8b562bacdf048a39981be96569864a525a3dc2df127a6bb6843eb284fb42badc28672a1b89c9104fb4dac3b6610cf62904aca3725c713372b796b587b04d29bc2c88071582719933a0cd0ed4e20c7d6a67e8961146d50caae475134fa98927647aa79deed15be569ce4b86f0de3654b3b70d93453ca8c3dbfcb853d94b8f4cad581c51a5506eb546d56a4dca88e38ca3b518e3b09a70af8aeb7413b8ee53111f6b02f17e15f17109712324f1940aef8906f11e50713d29e13a1e92eb415564996a426419924516b2cbd6ae2865dad563bff02bca7b0c5ff3b84c63e33a40543bba2a3864e1a94875f3ec00be98be21797c16a7adec5bb0a5be19e481ed0e532d75fee0a842d7b0cc6e50b57765783d6a10af970cdf561fb00d6611a765f68b0f761e13bda336d111951cf76472645df855e6b4f93c07ee6d2e4bf0dd012e7103e5a765b5f6c596ea0d5918f94655f2bd2f936f3fa49e6ca9d7483b626ba901fb6dc0f243e09256e1f2810c97a70ddaef1ab7df66797b1849c754927ea89254e451dc708a36be4e2f4b7f8341398a1465ae39d558bf9666d9fab84ad2fbcdd0e93ce7d43e373be70bd12a7f4d8cbc62f9293c79e3bab8a170b7d9b4f2a1249d5049fa914cd21f1b90340b4b6e8ee4c3d64be0135f99db526ec115cb97dcdf754a3ca992f8814ce2c735c5e92cf09027dbb58f011a8fd3416b500cbe868149e1f7d4b3086337090d2c959849b9758655b61f41676338fb1978137acc0e007074bd69f5a730cdd42765279e2ca1de439320296cbc70fc099dac392fe265d205cba43e208a71891c5a80346d346e9ba433a855e7303662d27e67b64e6b0ae602cf70bb3ae436143ed3b4093ca39f4800017ce571c01dc3a2c5141512384bd00bd23922e09c2934e188184dcb0e24459ef6e1071ddd45dcbdb236eb28b2d6ed8dd72bfa290e5d017b588bf4f26e2fa14deddbc6f927a295cf282ca5126ae5213283a176f67f1e05331805f1974c5d434ed0c8a055cce9f4ec24e9cbd698983a1d808fb9e66ae46cb0bbcad3fb6a11a41e6fa773b4a80ddbbc4ed87a386c17ae7d56461f68c3ba404b0aa09937636b0b6d085b42802dd30a5babde8b69b5b5982ed02202680b3a418b73d06c02177ae18aea82ab5f806b51275c090e57f5bb008d6e99d00559a700d9522ba259def5d241aba5a574c1d62dc0f6a94ed8621cb6d7fcdd8c46b0b4d9585400eb512bc03ad10f9636cb8a09607dd60a87f4a6174b6d98cac605d83ed7091ba6176750b8f2bc3e6d3f5b1b1440fbe2666cad1d77002901b62f75c2d62dc086ffca72d5a679191300fbaa150b804580b527587d02585feb04ab9783754caf5eaa0f13da71b36408c07da3133879f6df8e99598700d9b7ad8864e2f193c6ed9236e7ec1100fbaed580b563341b10007bdc0ac0ecf4a2a8db25b501d6cb6ecd094c0613a527aceac0439d3edb871e035c4eacfb9959d49ee7a7f8950310937e5788dba330a783fe34834f27b2a2282efd149aa69f669cb8c8246de4f425e9a315937e86799be55f66f67f07d307cd344d66bc0b9ab7895b900a1429432f529fe87f8750fcb8683f0000 serializedProgramBytesString: - serializedSignature: 57b18cbe9d75903bcfcdf55158185abb3e1c8fb701b8ebafd6734330487bbc13b85168f57b75b1048665f63a41cc902945ba81db3759be75574b7fe560874809 + serializedSignature: 8fd88c28dd70c6a3c05f871502d35fa37895c209df1599d9585ac370be1500369ed5a4c46f1ba7a3f8b563328966985be7613e7ab3ea587830a0415b5658e90c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset b/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset index db224fc..890b887 100644 --- a/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset +++ b/Assets/SerializedUdonPrograms/29bd21032c7bca44b9b818398771d5f0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c5545f6f8ef0342efbdf71204929086284ae8a04010027621a44034404c028215157b57ecbdf7de777575ed7dd575d7de5dd775752d6b2febffcedc99bcf3e6cd79efdd37398f19ffbff021937befdc3367be73a697db22d7f37f22e3fd5fcbbcc5de0c2fc75bea557aebbcb5fe5f337c778dff2fb892f71779f5bebbcaff5dee3f1bef0d4df226fb1913e9ebff9ee75f35788dfe9bebbd0adfade1cf977855fedff3fc77abfc2b76b7daff5fe5fb8ab4f25f5aeacdf44abd855e9f48af242296f1971ac4bd088b57a4adff7bbab7c97f5ac5956281e4f2477dfc5f4bfc270dfcd91a5f69e96f6f6f5f1ead35feb30aff9d7aafd697b9924b6c3b3fdfe37f78813356b8db09b7a570c7f9ffdbf9ffb33caf5599b8d75ab8a7077f4756836b16d35a71dd59f157a3f8dbaaf81b2ffced2faedb08f70c259c33c4fbaf88eb2e8abf1ac5df2f8a3f359cb6c23d5309e7cce0fdc81471dd55f157a3f8ab54fca9e1b40bfcb5784c89f7598abcb384bcbb92f0e929dcadcafb5b453853147fe70b7f07806be65e20eed7826be65e28eeaf01d73a3d7a09f76c458fb395f84a7f17297a5c24dc8b153d2e16ee258a1e97207a24e1d972a0e24f725b0baee1fbab95f74b40b8321fb4536c0b61d0f23cc5df394ad8e728efaf56de7f4009bb0d085bdadbb94ad8e706efb6eaa9f83b4f09fb3ce5fdd5cafbdb2b61b70561b7107fb7157fc3b2649c172d4bda29f72e05f72e15ee658afe9789f06ff282f247e6e309c2cd13eee55eac3d5d2edc5cafa9ec9af09ab8979320fc2b94f0af08c26f2dcb8756c2bd52f17765f02cab2c082beb2245ee44e15e25de5b07ae997b35d0e56a1096bc9725dc6b9470af11e13e17f861e618136ebe70af55c2bd16c8157cdac8b2bd40617bbdc2f67ae11645dfcd95e570a170af03ba5f97985953b8922d12c7d6b789383ea6c8d571ba4191718390f18d125729a358f8af53ee4f4a23ddb2c0bded45789bbde47945c6ff4645f71b05a787c5f508c5dfea587fed65193619f897faec28dc9bc13d19eecec2dd41c83d50793e15bcab7b5e22dc29c8f369c2dd09793e5d498399c2bd2581ae3392e87a4b125d6725d175768abab652dcdb80ce7310bf73857b87176b5b7708f77620e376e1de0aeedd2adc9b147bb949b1835d847ba7e65dc9719e124ff97c2a7857f75c72dc15792e39ce479eab1c17783cbf7469f462f333164759ee8c54fcad8ef5d741e6d7c9c0bf64b1d08bcf13325c2c4fc8e7589e90cf259f52e4b9e4b30879aef249547e0cf7a27982b9778977ebc1b5cfa2e3038abfbb41bc5b0b3fb2ecdf4df1e3ebd571b3b8d746f8dd0730c2fcb6157ee5f5624dd84bc03de69645e574923a2f0dae7b540af9ef89fbcb9438e9de4dc46e7725be61dfdf436110f6fd3d152e61df97f599d4ff1e25ed3b28f7f747debb5779af9b725f7d4fc6f73ee5bd8eca7decbdfb95f7ba2bf7d5f7249f3f28ef7552ee63effd5179af87725f7d4fdad303e27983b86eafdc57df1beea5d63e56eb8d3f79a9d71b0f7bb1f5c6c3c27d08c87848b87b29b2e4fdbd85fb8822eb11e1fe59dc6f04d7cc7d1084f1a092a68f2a8c1f0d74efba45612a65f836def5294596b4c7c714598f09594f29fea03e7d84fbb8175b673c1ebcdbadade2ef41e16fbdb8ee2ddc2794f79f08deef2e6d5b4dbb27810e52c65321d2f319250d9e11eed340c6d3c2dd479125efef2bdce71459cf09f759253d9f52ee4b06896c56f6e19f57f83c2ff8dca7c46f3fe1bea0e8f48270ff22ee6f00d7cc7d51dc3f480957de97bacabeed4b8a3e2f053af498abe8b35cb82f2bfabc2cdcbf8afb1bc135735f11f73729e1bee2a5ce4e96c37f13ef1c0cae99aeaccdc6eab7eb12c852edee55601f2b3cbd8d950bf77525ceaf0bf7352043f693ff0eee49392b85fb9622e72de1be0dde795bb86f7ab16db23703793d370771edb91584279fb7037f33f70d8d2e15c27d57d1e55de1be07de794fb8ef08bf8728b2e4b8dd078aac0f84fb2190f5a170df57640d15ee475eac1d7e1484d3bbafe2ef1f40e61bc2fd18dcfb3878afd7c34077e65681e72c9c4315ff9f89eb51c2fda7d754ceb26289df1bad3c93fac87b4cee61e27a98703f51e2f58988d7978abf7f69e2f529b8f7a9784f8e39bdafc4eb53255ed2bfecf7cb78fd1bc44bdaec68e599d447de83f11a2cdccf94787d1684d757f619aa85fb5f20f31d708fb99f2b3a7f1ec8e8b355f1ff8df07738b866ee2a45ce11b172fa9eacc89175a8cc53df8af736836be6ca387d279e1fa9c8f95ed1e77b45ee0fe2f951ca7b3f28fe7e54c2ff0edc67ee4f4af88395fb4707e9d8c47c30084f3e67d743144e35e0dae7d45fb6c37569f63eb8c7dc2f9434fb2290d16faee23f599a493947c4cae95fa2c8314d3329276c9abd0fee9ba4d910e5be48b326e643407830cdd4faea3f204df6f7f4f5951c6bfcd28b2d8f6559f305902179bf18e8336091b82fc7fabf526ce5abc0ff80ae8a3f696bb29d3a48b85f2bef7f2dde5fa4f87b5f79bf65e2f007ae10d7fd9384f399224fce8dfcacb0f9d98bb7f9fee01e4c937ec2fd4509f317453719a69c77f95509f3572f6abbed14d9df2a610e481ccf41d28ea40dfc26fcad01d7ccfd9fb87f0cb88671395689cb0f88bfe362fd0d2a51fc4966c72bfa439659406ff9bc4a89770afd3ff62764c2af994e578930ee4b204b690f4522b169c4af992bdf657fb7147e4e00cfe47de6b612cf4f04d7feffc12529e821e304c7c1577809dba591368ace62de37d21ae82cc6a6868c5464c878b75564887e5ea49d17df765c0b9ec17137f97c1dd0d78fc750795ff269afa457fbe05dd55f93ff0e40873a8585f42b74887452e221c636221d010bd98f6800cf403c9a9ecb7e5e3df27cbda24b2ab6da59897b6711f74582556502594a7b3bd24589ab981b8d740571eda6d86a57709fb9dd155bed2ef4f92c053d649c7a84b0d55e8acea25f1ae90974ee19bc37ec4524debd151962bc80afe4c06cb54f6ab63afc36c5f6fa2ae9d5377857f5d7e4bf5f085b1da0c443948191fe8085ac0f1ac033688bf23966abf279185b956309a28f1e1928de3d095c337790b87f32b866ef1de435f52d464c49213c69478315d6838367236a85accd216c7248089b1ca6a4c330e10e05e93054e8f243a0cb48a55d1119a1e83e22f03ff2b5587f4dfee11c4a323b19ade827fa699151403f59ae378067d00ee473cc4ee4f354ec448c2945867bb1633a92eb46e5b99ae73685b045999e6314be638267a38e0fd263d445096489b1ca48b6176bc7d9e2b9e85b44c67a31e3a5fcba55d02de6fe7600ef09fb1e3d539125c65423db29b2b613b2662afea42cc8e760455f95df2169f01ba7f01b27f4794ac4e3ad04b2d4bc35de4b3d6fe578b1b62bd68f44264465f0bffdf7c688f51fd9b20f29f34abea27b7ee03fbb30d65f93ff022ff5bc55a4e85724dc42a09f5cd3d1009ec1bc239f63794b3e4f256fc9fa3057b1d55ce14e14f74f01d7cccdd3d8d1a1e099ce8e0e4bc38ee45a8f1a70ed3f1bdb3548bbb12313c892f5f4a4d8b835dddf5e1387c39577d4381c11220e329f4f06e1c87b3b827b72fe78b37826d764ac03d7ccdd09d8c84ec2dd59f83d15c895f7992be7c24f03d77e5cc69d87843d55095bcc99474a40d8254a58d3c43ba7836be64ed7c451b89119e0d9910a53e9578c894466293acd12ee4ca0932c1767837bd3c13de6ca399d33c0356351a7c447a6575694937cd6548eee28649d29ec50ced9f455b8d7806b16d66b8abfc9c25f2af311472befce8db5eb882cc7b644f51f3f3f05b9324de6293acf0b741e7fa890757a0259aa1dc93526ebc035737701e92ec75e649e90eb4e4e03d72cfc5f02f9130a810ce62ef0626c5fcae3f7a1bcb362e54d9063009a7848d94db216c6da76d3fd528d6d1fa3bca3ae0f39d64b5e768872d713e31d91ddc43b5bc135731781f0c598476471f45e448c774596288c24eb32e0b70cf865ee52251d9606dc72cf5364cbf796c5328ac8f51db20fb8bb620b72fd46b5b8de433c3f1b5cb3f046c6fa8fec29fc9d03ae65bca19c73153975b17a45f60271df4be8920378eaec42597bc1af41fecf91f9ac3a3579da7ba24fec152936b0b76203721dc0c95e533ecf93fac93aae308df0651dbf0f7857f6b5f605ccc4bc75643fc4b69603bfcb815fe6ae506c6b459046f95d15d9f2bd72c5b6ca4558b2be5ba9d8969cf394b655a1d8564510dec44f62fdf3bd00edc0df920373e518e179e09a8521e3502d9e37806b1886d039b20a8421e7234e4a627772fe7b37700dec2e4fce3d57a7262ff65e56848f15cef5aafcf6739d97cb3db15a21d52d39f2cde49b7198e8d6ec17fb19c3836df43b6675be00cd8e98a57cbf4da357e0e56b77c4f4e3636832f419fc77b9efa3860b3d3f1217c4fd714130e56afd7f55603b4f837f7f0edf0dc436f4d4f84f72bcf9becbde5ae14df4f6f6ffc54a59e6075beb37b4abbc32ff771d97b7c2573bde67b228b1ad3fea3b8b7d99c1cea435fe1d09b4cebfaee51a2ee1bf37704dabb8f6f3fc7b8d7c9fd45a6f9537dd7737f2d0e2e35eefffad0bb34c20d3eba8dfa084dd0fb641c9649ae9c786699fcbfb44ff9722db2245f85402cb1feca7552eefd59c189712ffc730286458c36d9e903191238bc4dccbf77279db6e711cc1f0718c8fa1debe03dec57e059f282e7a322cb907f0184453b8d788ef6f7cfaf48ba766c546adc0cb6553387cec3551d4128165f2b2f9687998286465b5ca638aaaf8233afc7cea694906f107fe6ab8bff009d09a577eb109c0a751cafc3f36faff6b7dcfa5bea2d1f28fe5b0b8b4c96382da70bcf19567321531c02d7480db661a70f2122511e0b64df18a02663f7a82ed1082c974c008b6d411e4adb17d4809c637bde45fd3fd7757fb2436707b5aefbfaf6baa2566caa64b27284cf53c3b709e43b50dc8701a61845b6908e731c21d754ab6539464fa2182b330c19d0c05b7d6d9045f915e96c15cc59eade352ca7dbfe1f3159b361ea7165c7a23e8c28da06f5ce492ab80257a1b5dda30845db55aa989d3054f9cb698e46ea692db6192bb6b24c71b5402c9ed7506c59708ec4f6a504bfd7b41ff6a167f5ac31be5ac795ecea597fa29b8bf1734de59ea62fea5492de0a722ace79a2436be1e2917403db9edb1b1174a6d313beda04b7376b3572a65484f3cc93b62827b1b0aee8409ee6328b83326b8afa1e02e98e07e8682bb6282fb1b0aee86091e6028b83b2678a0a1e01e98e04186827bea8a2e6edc15dba4e862edbc1c6f267fab8eb73c0e125553a23712175683532eac86f0c26a4c82c22a3dfdb0e2a9972e5919fda1a924eb103c597b638287190aee83091e6e28b82f267884a1e07e3a0be7a5ecf26d68e141ef32714597dcb247a66cd9a3b8658f486ad9a9ea8559747f5d3232daa35349c65178320ec0048f31143c50671fbcb2acda86f6c17abb757e688dde6c7e0256ad5fd698d94a76cab63296dbcad8a4b6928e8e98dd0cd2252f4b85ed5249deb178f20ec6ec669ca1dd0cc1048f37143c546790bc91b5629b1ae41a3f36abbc2a43339c90b219e670331c998219a6aa19667cc37449c988e7a692943978520ed725256fd6667e7c3abdd13bb670ac8fda37f6b0d1bb895ea2e1e5b063772374c9c2fada6cf59f51877d2426b9c054f2285d8a77db76b5493083b74e8ce935df00005bccd0520195cbbb3f89ea8df4b5f10bc5cd53c1afe79f9b3f354b6f844549abaff4d5c04c75b4cea058b2176b38e5314eac949f0a7e3dffdc733b67c5595a116e6963b02027250ab209a41f644141c1d450416663416e8f06595d5d3d55862b221d2ac8b1ba20d918e1e426cfd1207ff37fe284b7c3856f8709df41239c55eb61848fd30967fe774ca55249307c3d1e2bbca698165e13301e3b69787cd22a1c8f1c8cc7ce863c7275452e1f30a9d966452e93b98e5faf4dd2990a5ff44ed5f1d2968425bc249c90a42434d3152b11f374a9c2479b8e244d9554d749e9469de369c885328b7db79a6bc1ee5788b666e2b012a7e2b4263ea002e5e341b3bcd4577bd1c782add86ec1ad6946526b2ae30741b329f26a1ecb35695893de9267f2b0ed228359fe445d41c726cc98fa714b0d58c1c62c9b9d46bdce5be4df2ef749314de2cac0367819988f85395b17261b562bf7fface413be0b789a053da870a11660f5c51c4d7d31b375b8faa210ab2fe61ad617453ac13df8650a824b70c1c55822eca24b04d60d64c81bbde57e61609e1893b0d077d585ce464597fbfff2fcffc9b460feeab99f30fa6c8f19c77c8d7154b609671c9375c2591b886d34309a25de412799a515db42a0f684d9fa9c38e11371e13bea84b34ab154531be4b1da802dec6fcf8d392e9c99783853305bd84d670bddb92d94fa29beaca920623d7656882fe5b31ce55c4a98d4df49a3412e9f95605b17b6c5d230ec28ffc4d5f4624dc2e4f249907e71f1482534b1f923f86983d4766c194a769a0160b5d2ce98492cd599442f503c54f9e883da921905338f8dfc195bdf1d7cf8218c614cc5f458869b66a0c76a5e28550aa3485f83124c83dd751af4d49258285a17e96b310dd3620f9d165d80162cb4557eaaa71ff6742cec3d75617702612fe72d25d6860bac325c1535032b5bf7d294ad5ec8b2752656b6ee8d95adfba455b6cec2e0edab83d74353b6b26c1c94a8e996aeb3753ab0d2753f5d5cfb78c1a18db0dc51032bc3039b834578852ec2b059138d72facd9ab958e8e5bad075cd1a4c8bf49a35f3301b5ea9b1e1b6216d7817cc862b301bae4ccb8677c5a056e14520b3e105fe8d8de2133b8da2226af0b3755034af0a69c5f3312baec6ac7855fa56bc4017184b9fd55e7c73746bfb70cdd18558bad560e9b67f5ae956aa0b87113e40976ebd9bd24da610ebf6d6fa19ba9eaff3ad8b49b9ca5069b7084bbb5a2cedd6a49f76bb61796ead26cf4542e6b9c598f0751ae12d430a5f82595d9dc6eaaeea18ceeaca30cd0fd468ee85d47c29a679bd46f3bb426abe0c13dea011fe5e48e1bb63c21b35c287760a277c0f4cf87a8df0152185ef8909dfa0117e5948e17b6165c741bab283154db2029d2f5a286c606c53a852626f2ccc8dba3061535b1f767a55f63e98169b745af40031678ddd063e59b8de93fb7fa29da0303aec8be970b04e87811a128975498fcc7e985687e8b46ac73368050f87a5c86c3eac1b26bce558788762f6500706449778c1ee14360a50cabb62f5bc3b5c19b2ddb102d3e2309d1641d76b06af27cbfcdf0778c1e703d77ac118446da8b0cbb1b00fd785ddd7835daf443aa497fe2b316d8ed069c36a6f366d5ec1c30fd75ea8c042daac0b898de455f0b40e06e41bfdeaa83e24e94a2cc4237521b6e1712be7dddaf0615561611da50bcbf334257702e9d51ae9b97cbd6c267701aadb33c28da3b18372529bb4dce2e97700260b1f1bf85aa54b1bd64a3ac68b6f258dd4254d8256d26a4cf8b11ae15d430aafd1096776729cceaa58d33487ff0b635bfb63611caf0b03b60ae6f9fc77e3b71b42963a0760619e80d5026a5d181b767a655f2da6c5893a2dd820588d177c70b65c4c1196f2b5ff610734d660e19ea40bb7b326dc05a29c0a1bf25a2ce493b19025f7f53c97a53fe0b80e0bf99464212f8fe9a3862f99ebb0904fd585dc8d87bc40d4b0d1f45dc02dad410c1d8509ff402cfcd374e1f78f8979323dd2b3fb7a5d6dd22fd3b5c912317ac4e484af4dd8d14343e23ab82525fa1ae50ca44649a60356a33460697a66326b6621ac32c8478d58c867e942869327320dd7f1de43fa1aacc734d8aad3a0778c3d07e38672f47bbdcfc2a415bf41a709eb2c9fedc57796878e08d7593e489749f8de96cc2fdc660b0bc2671176225b8fb82ca2cf20e77a89966d63e163d963236622e7e94c04ce6cadf182afb2a76f9e9bb0b0cf4f9641a2e619ed642e10fa84d1e0604c830b9269501b37d4911e8343300d2ed469d02b0983f4077f0ec5f4b828593159cd0716d227701816f2c5ba90bb6909980c731c8e857f49b298d7f31222fd981f81857ca92ee4beda9847d35e37e414469bcd983697e9b4614dec0a64a2a22154b84762e15e8e51901d8b253cdca093c98638b0899330da1c856973854e9b615e7c772755add26b101eadd38f55a4577af11569def87015e9169d70d611beca339fa33806237bb58e6cd718b290597a79ed582cf46b74a1f789cb6b32459bc3c68ed3e892cbb7ccb2b9b34cb5575239d24ddf5ab9d6d7b29d828ccf8e6adb2bec84cd6c5e73a51e3ed65a395e978aecf27a2ffe64b6b74eeff150dddb3fbc1a97345978d29c8099c90d582128b37135ef73cb03336b428eb89e8865eb1b35d9ba6f5eb86c7d924e38f3cf3e186eb238f7649d21f32dda07901a72ea1b24e4c2bbe6dbd071b38e99d6f06fe186cf36bcd0ea8b659653b0cc72ab26b3bc79cb21a5f3763aab5f98cc722a96596ed36516d972d26796706d86d3b08aea764d45a5dd6896a0a23a5d279c4d72dce1196ed93a03937ca7a9e43331c977994a3e0b937cb7a9e4ad98e47b4c259f8d49bed754f23998e4fb4c259f8b49bedf54f27998e43f984a3e5f57fef3c321b6cd663ef32d4d89cbfe3feaca7e95d70c9cd705ba9460bc1e30147ca14e30abb81f4c45708213a72ec234fe93a1c61763821f32147c0986e261431497ea04b356d49f53119ca0157519963f1f31cd9f9763901f35847c05a6f263a62a5f89497edc54f2553ac96c38e18954606cc1055f8d19c6938686710dc6e2295316d7622c9e3664711dc6e2194316d763a6fcaca129df80417ece14f28d98e4e74d25df84497ec154f2cd3ac96c91dd5f52c15c820bbe0513fca2a1e05b318b7bc9d0e26ec304bf6c28f8764cf05f0d05df81e5ea570c73f59d58e2fdcd30f1eec20cf9efa6867cb74e32eb21beea990f65de83a9fd9aa9daf762925f37957c1f26f90d53c9f76392df3495fc074cf25ba692ff88497edb54f20398e4774c253f8899f4bbcd60d27fc20aa5f70c0ba58730c1ef1b0a7e58279895761fa422384169f7678cf387cdc0f9114ceb8f0cb57e14b3bb7f98dadd6398e48f4d253f8e49fea7a9e42730c99f984a7e12b3e77f19daf3533ac1ecf08f4f53119ce04cdda7318dff6da8f133982d7f6668cbcf6239f0f366c881cf615affc750ebe7319bfbc2d4e65ec054fed250e5bf6804e7f2435833391339ddbf627f879f89fccad7b25b1c59ed6cccd79e7e1a3251e0d8ccca8b987dfeb719ecf325cc8cbe3135a3973133fad6d08cfeaa13cc16e07de769d7b5a9a2cfc545bf82a1febe1950ff0d43fd8329eabf63927f3495fcaa4e322bcd7f4a25111394e6af612aff6caaf2eb98ddfd6268776f602aff6aaaf29b98e4ff994a7e0b83f19b218cb73195d91e262395dfd1490e3e2a9482ca09a671dfc558b44845700216ef6904e7f233c0d9c65afaf30c977833bd5dfd676ceb079319dc0f364444cfaa8bf595b8a66ba923a2ade85a4558453798fb4c5f1bacea7b1fb3852c435bf800b385d686b6f0a14e30b38536a908663411c11f6119aead6986fb874e32f3df2e1595131c71fe31a6727b5395ffa993cc16eb76882439e018fe0a75daf02758643a9a46e65f18ff4e86fc3fc554ee6caaf2bf31fe5dc8f87f8645a6ab69643ec724773395fc1f9d64d67aea9e4aca26683d7d81a9dcc354e52f759259c1d8d3b060fc0a53b997a9ca5f63927b9b4afeaf4e32ab55fa18563fdfe804b37e46df88793fe35b4ceb7e865a7f8709ee6f28f87b0cc78066c0f103267c603308ff114332c810c94f98e0c186827fc632f810c30cfe0b960d879a66c35f31958719aafc3f8de0dca1ece60a6fdb35dce141cfd37808e935e287a7dc881f11919fd3692ecdb006fd6fbaa46415ddc8549232c17a29d6edd45adf2853eb8be82433eb1b6d687d2d74825957618c6157a1252638db50702b0cf25853c8593ac9aca5b49d614ba935a6f2385395db607631ded02eda628227180a6e87d9458ea15db4c720e79a42ee80d9459ea15d74d40966d5e644c3fab513967af986a9d719835c600ab90ba672a1a1ca5d31832b3234b86e98e06243c1dd31c8934c21f7c02c797b434bee89a93cd954e55e985dec606817bd31c13b1a0aee83d9c51443bbe88b41dec914723fcc2e7636b48bfe580937d5b0841b80a55e8961ea0dd409663db569cdd0531ba413ce660da7474c670d0763c631c3d4388660c631d3d03886622acf32557918661db30dad6338661d739ac13a46603ce69af2188925e13cc3241c85e5ef5d0cf3f7682c0577354cc13118e4f9a690b331db58d00cb63116537ba1a9dadb61924b4d258fc3242f32953c1eb3e7dd0ced7902a6f26253957330835e6268d0b998d9953583d9e5e984b389d6a511dd322455f2d7b8e48998e465a692f3b134dcdd340d0b30b3dbc3d0ec0ab162744fc362b408b3babd0cadae1883bcb729e449983defd30cf6bcbd4e385b71ba6f2a3c12ac389d8c69bd5f3368bd03067bb929ec1d31b5573483da5330e32b3734be9d7482d9211c2b53117c0b2e78670c474533e0988ae1a834c45182e1a832c4310d2befaa0dcbbbe91ac1b9c3fccb083b4b3af3bbe8d5b39b9b6ffffc2a1d29edfcc7ea081b1b679f7ca6d0129b0b998125718d6112cfc404ef6f287816968d0e30cc46b375829951d6a62278353e6e33072bbed79816df73b1f26a6d339457f330b5d799aabd0b5660d5191658bb62b671a0a16dccc758d49bb258802561433324e1422c13361a66c2524cebf5cda0f522cc3c36189ac76e98e0830c052fd60966971b23f1e74ec99fb800b2f0009660bc373503ef324cf8c1cd207c2996730e31cd39cb30e33ed4d0b877c74a91c30c4b913d3016879bb2d81333c0239ac900f7d205c0f6c36f4e8549092e786f2c4f1e699827f7c1901cd54c48f6c5343fda50f3fdb0fcb8a519f2e3724cf831cd207c0566e0c79a1a783996d98f33ccec2bb1cc7ebc6166afc0589c60caa252d77b1aee5f66f4f0f769fc5c7cb6122bfc26c61353ee159d14d11ffd9e3874acb7538519ffc9cd60fcd558829f629ae0abb0c2f754c3c2773536ee785a44739ce5ce4a2a30eb58c7ed889d4097c38fba5cc78f2c5eca3f635beffb5de8b1cf31977bf278eee070614c46e2a761063e6bb0989dae8bd9340feb75c33e378ce13c9e8b6a79be616f2d17b14e2ca1f9e2b73f16bf3374f19b82c66f8e177c283c3e9ec171ebd3f89d1afe1d8c7069b7cc7f16f64ce003b0589da98bd50e68ace24f990de2240f2c6f8c3b35114fbff81316c3c4a8168bd159ba184d426314af456c8c8223c283b852c5650d1697ade16c2e59eaacd2d8241e279d058789d55a2c5667eb625594464e92f12a0779293860bdba194b8475583cced1c5632f4faeb35eeae751961241aaac69fa6e67236f195473ad59cb605e93cf593c06ccc7621ecf2a11a77a11df393cbe8b782b629538b87e19b7cf1afff74a1e3b35de41ab23f8de91fa2cdd94adc3889cab23b29490c812fe947d18613d8f15931b7d270c8b744ad503310ee7e93854117330b30ccc2e9a83533dc6e97caccd00430cc814f8efc076c22cef40df7b396f29348acfe6e8dfc2ef375709d180c5ef025dfc66a414bf79bcecb3278e8d581c2fd4c5315f8963f0cddac06265e95de6dfc3354d6483d1b7c2c4603d16838b7431988dd6474bfdf767f29c56c773e7414d6df420174685eccedf5e2dbebdb6d077592d559d2425cdf3db062ca617eb629a97625ac9d36dc2a4947c278cf60761da5f62a27da23ca18f577a56b611d3fe52f37cc23ec8163e9fb0b7c2c460131683cb74319868cc1f8f5b7a297030a6ffe5cdd583d3b53b99ae73fdbfab78ed5bcf3f68159fcfd32f7f0fc16275852e56239bda1ab13bf7e0711db04d99a86d1046cb43312dafc4ca582cd4b07521de9a49d4ea4b3f3d0ec3627a1536c283d72673b8cdd4f916c3463d8298378874a9e0fab13e25de539b11e3c7b4f6381c8bd9d5ba988d4e9a8632b7cce72dd855bc466c9e9c7e04a6e9353a4d67a6d4ee9ac37bfbc1a70febfd926bb5760c26932dafcd582cafd5c5726ad2f458e27b5cc99f63b9227cecd22d2f8ec4e2765d2a2d67acbc98e65b7c25cf27fab1d1f4ca8a74e3781416c7eb75719c9e92950669188cb655a0f10c9f8ee9e5c3a3b118dea08b6171c2b2b0cc773736d5b4b2146c1477a97bf45bb098dc18aeedc062c258d6f196ff6cde2ea8f575d936b13a068bd54dba582d44da0e0bb9d607f17ae680985c17b421a25f2b0f37a6c87ce36d95f85309c2c4fc582ce63763e3de3a4d96f21c562b4a9460366f396f973488d7598a84eb17a55b1b1c87c5e8165d8c7213b603e3d9a612aff4753f1ed3fd56ac9c08afbb6c6db0f2bf81cf2495f3d9b2c0ee9aab4c3f018bc96dba98e4a4dc1a97dacff2d838be6ce7267b378ce627629adf9e4a9b099bb54b361a179b17e873c949582cefc0d227ec588f4ca90d4d629aa72e3d19d3fc4ef3de77e23e76f38c1e9c82e97f17563e998c3d251fd509a3fba998ee77eb741fa5e81e5d3941ddef390dd3f39ef4c7d3e7f37aadc18a1ecfe958fcee4d650c0d96286a9ae8473b521b850e138333b018dca78bc112b4fc0953dea6b24a22932b29cec418dc9f4abf556fa5c97a7699eaf19c85c5ed0fbab8ed9a52dcf4230fa5fedfd1d4de96b9722b16e73f86b3696c95429037e39f36f0d82c52d661c038c9cf7f271e218b951a2d19c230381b63f0402ae39bf89aa7e4e39b996e419d83c5f441f3798c62af30546f29fa5698189c8bc5e04fa9d7922cccf0b3ce41fcb0fbcd9542e761f17b081bab48d45a611a567a6c3ca254b37a26eabbf96669dbf8ff2211b6827816f7c956352ee2a31b41aecf1de13fe2f37bf2dc42b91a222766e544f43e0b7d8daf11e359d6b4ee217a8a2126e1611f58eb165ef03326c260cbef896bf64d06a3edb522d6413dc44604e6f092a58af727d928fe7cde036d8c3b17128b856e0508bbab8b5df238c975c2ea0ade48a48d889194e59366d345bfbb98fe99a56a3791aa2d7259733d322e4d6b4aaec5232cb4967a1bea1347168e3be8740f04c8518b085bc2bcdc9bcb8b884a9e20cbf8d04c95ff4a60e8494354f7b8aa214ee002644d9a54dc5290bd75e2fa71330b9a6bf5a26b51d8c9f3da64b5c86329f12825ae3e71b8e68b76d55affb54d7eba056d2bd643abe4517101dfa251517c8f51e2ebcaf12df7f2bce8a296a0420f3630b022c30560f35b45813d4e09ac3507c65e2fe7ed1d17e0b01f09e7094a383d399c52dffb02bf25b251d853a310d01093195d0057db250aee494a70fde24ab125be77a6062bc766f316a89b25d9e9a3a3089fca6cbd39cdb7c14ade9471a7de6c04f5e6d394b8bac7e192b32c6c7d757d53ffdb0568b583a2d09ea184d6bba97c939991358d6bf9700e5bf859a7645217e05d34360aef594a78031364d060357bb517eca874b3a4fb6c5c14e473992de964d69dcf270cddc8b47d8746713d4f89ab731cae523edf2afbb82ec0baaf4314d60bf4d5022be1a2bd4ea62edbeab6944f8c069d2b17a0edd3230aed2f94d0fac759d862aec23a3e20272dcdcd52edb5ec28c417e9fb0e106270f496abd5c163c3a3e05ea204d743936597f0fe2913e85aa61dda3d8aede5cc560bb29c73a7b7f04d4706ab4d96225c9d8b4a7f74371c617c1c9a355966791bf9ac5c3d9757a98e4bb3c5e5d669fe5738ae9c1d37f8939dd2f85976d22688ce47ac3566a7302eacf3a3f681b3438dd16487285cb2536e3b64a7dcf9d4c5486deb6687aa39b2d31830ce4e7378263bed864176e89e66b651f72a3a3da79f56cb63d373affc7f3e7396c766cefec620b0135fd84f504bfd9db296ea2bca9760a2742d5f16824f292f67e76bab3a0c8cd321f63c235943e9b46917538775492582e9d4633778d14aff559b70e63b89f30180f3359b70163889f36d80f3759b70163a89f31780f30d9b70163989937d0048e27cd3269cc54ee29c0370be45bf7001c719bbdc2adf9b4407730b15cc2200f36d9b60163b083307c07cc72698450ec21c0d60be6b13cc4207610e0330dfb3092661054406730080f9be4d30f31d84d91bc0fcc02698131d84d90bc0fcd02698790ec2ec02607e6413ccc90ec29c0a60fec32698db3b08730a80f931fd6a2a1c26dcd83691b29539910ae51280f29f94287b099415629c5ddd3706f72411563d5954204ff1a2203fb1052461b54306f27800f25fd4ab12986736f9074bc5e8c931655e70220e19c45154100700889f524264a35ceb62668aa3737accd3063a783da9e07505f0fe4dbf2a2bb67a4976baca72ca91a1561122a4dd4035f3d9b6acb1a138d28aa60d95757e0bacf3f34cb424b18a26166521a55d92c13c02c0fc8f4d3009c7d2c9606e0630bfb00926e1882519ccc300cc2f6d8249d8cb2183793880f9954d3009472cc9601e02607e6d134cc2b1743298870298ffb5092661d7910ce62600f31b9b60bad8ce3c18c0fcd6269884239664308f0430bfb30926e1583a19cca300ccefa9073758a0ecdcae4008bbaa048bc7dd5b3d3402c0fb615bf6c46327225c9c20bb0aa0fc9112e5408172554ac31af0742cc28aa78c0aeb6c80f5a74c60adf53d31a0c19e99e0a05476d0eeef6b82621f3004f73325d6a10ad60abeda728607b71c255e974958189095ab7f0756fb4b26cad5d46a78179bf11301ca5f29510ed65451a97e519514ed0c2ab4e703b4ffa344dbd98bee3a6ce4bbb4d855f0f95ae6c5bd99f23280eeb76d9bc10351c1573409adf00c2a94f500a5d72283357c0d6fbc478fc8c7dba32eae7e5b096af8082556b60441ce9cc76e878ddd561b7c6f860ce4582a9003817db6a004197eef24e1241b59d3e82e80b3a54d3849775990e17c1ce06c6513ce0227717e027066d9849374469d0c676b5009b5b60967919338c7029c6d6cc259ec24cea50067db4cb43c93772d838ff3adf15f5c45dda0cfa1c2fa0f5086b6a3c41a6e75fb4427b7a4b60136dade26982e6e498d00981d6c82e9e296d45f4136ef68134c17b7a4fe0c6076b209a68b5b52bf04303bdb04d3c52da91f00985d6c82e9e2a0dcbb0066579b60ba38e3fe1680d9cd26982e6e49ed049a46dd6d82e9e296d4b600660f4a98e1b6a412563f64136d7301ca9e9428d9a9a9721a439ed5094f2c7575f3df10504af6a204d83d2140976780060184bd2911c6ef9f8c027475ff641700af0f75c5b2a10997eee05af56be964308750c1ec0d60f6cd442d8d2f325c1a53b9103679da51c1dc03c0ec67134cc2260f19ccdd01ccfe36c1241c5a2383b904c01c60134cc2a13532980b00cc8136c1249c8e2083b90cc01c64134cc2e90832984b01ccc136c1241c5a23833901c01c62134cc2a1353298db0198436d8249381d4106737b0073984d3009c783c860160098c33301135b78fd7bd8a6321ec01c61134cc20a880ce664007324f582ebc4a344d3bce023361bbcb80f79393062d41d801c45097288879db825bfbe23dde9bef7d51c2d43ced6b8139fe3da810aee42309e3e9a12ae6e3b55ea7009fb4664685f05763b867aa45d6ea7aaf3e0a7b25cdf56b50520cccec4c419bead0aee9b74f194a39d01cab1992845a33b7ce11e20794e210ed7c54da9ef00b8db65ba14d5af1c9ee1b1cfc4d5717b0ed093f6964aa8d0ee052aa8719958e39efaa0888b9dcf1381a58ea79ebb5cce6d2ed65e33501d91d9621180378112de8094b379c636a6b28f4692409d0d32788e8d50092b2432a8d301d45c4aa8e99d524c68a764a7147f08327fdeb65cc415db5c72f160ddfec03a276ecb71a65894a49b58c860ee0dec32df26982e9e52bc0f805960134c174f292e05300b6d82e962ff7d2f00b3c826982e9e523c17c02cb609a68ba714ef0a604eb209a68b2349b300cced6d82e9e229c57300ccc936c174f194e27d01cc1d6c82e9e229c5fb01983b52c2ec2460b280abbde020d340369b222603477650a907c04dd996bdf0d83122178f927801a0dcc9de7975d20c4e36f93b130c71ec6c335cc2aa880cee0c0077aacd70091b4d64707b00b82536c37571b94d0700779acd70093ba264708700b8d36d864b38644206b71f803bc366b884837b6470c703b8336d864b380c4d067724803bcb66b82e2e729c06e0ceb6192ee1d41e19dc0200778ebd8b735dacce6ef7a268e7666259995c0eb9c6f7cad6e6e307b310b66bc916ea66034b9d67c70248dd573908db06645fe5b81e58ea2ed44385ecdbec0dfc8b1c6cf978255f455acb5f21035744056e3400b7abbda5a78ba35b5920bbcfdf96ebf2dddf5a3b1658e9023b4a4eddd27142b42554686f066817da743c3ae9c020d986c62b01ce529b70e63b89f30f00e7229b70163889f3358073379b70927ee0990ce75700e7629b70163989b32f68302db10967b193388b01ce327b0e54251cc023ebb9ef07502eb56fa708e18033d94e917600e9327b768ab8b8b6f447500ded9e89ed8a790ad00c6c5724eba5e700787b50c2ebeaa927903065d9b0db225ecd54f9af91e1233b77a403c0b72725be9e28bedfc3f12ddd00c6bdec59b1e7e2b737ee0028f7a6ced06cd8977d9dbdd607076db394a3dde460abb11dc0b74f26beef861f2500054ef3ea7915b389b68e2ea3c2ba0860ddd79e0ceee257375e0728f7b377cac2c5658db701b4cbed394ac8c5dd73c500e50a3ba62c7493bd8468c9267b2f0268cb33dd1bc76783822960d25920b269e07f02a42b6d1a7a23ddd840d688ba0fe0acb00967be93385f02382b6dc259e024cecf01ce2a9b70163a89b33b18c9acb6096791933827009cab6cc259ec24ce0a807375a6d71eeb1b4b73c42b191b6b221bb6fb0d94a43536c325ec8c92c1bd04c0dddf66b8840d7e32b81702b807d854ca926e9f212b656f04386b6dc299ef24ce4701ce3536e12c7012e74700e75a9b70163a89d3034daa7536e12c7212e70880b3ce269cc54ee29c07701e68cf47c94917cc92cd35ed0a60d6db0493b0cd4906731680d9400973840666aabb38e04433a1c5de4205b904406e740132a1259341de09405eef0264c225136490f7069037b8009970048b0cf26e00f2412e40266c929141de1740de4809b99f7fc13c07ab4a6b39b219319f168a7ef56e9eff4ab92f9670b9640e15d0a15e14e8267bb63610da26d9d68652609b0753a2ece85f94fbb167bbe7d7790b781f2bb03fc27df3749bbb81051e628f0512ce5091596015b0c043b7e5a2b38c8dea93f5b0aa81551e66df3e25c2ad5f64fb94fa00eb3cdc9e7d4a2e1edbfe5f609d4750ef15493cd0b789ff45dac3ff9a0a631eb0c8cd9418877aeaa94cebbd8d5e9835d02e9e3e7a2bb0d2233361a5587524634a8af13a2a8cc7018c47d9b3e1c1c541e86b01caa3a92d32da445fe4c1af24cfe457753cb31fe40b24c338840a635f80718b9d3b9b08333ad9cea69d00d66328b1b6f72f36340d5f6460d32cd9145d1b80ec58eab2511d0f9acf9be6bf9791a06100e571f6ec5872f1b37e2500e5f1993846a050a9b75d3e46e02400ef04bbbec04dd8e4213bf06f03c079a24d6b4248cfaf21ab70ee01384fb20967be93389f00384fb609678193383f05384fb10967a19338db83f1a1536dc259e424ceed00ced36cc259ec24ce3d00ced3ed9938236c24914d9ced0c509e61cfd4848bdfed2c0428cfa444c95accd11eb9bb4318ad419d7d963d1f3a2da0fc840999f53500985b6d82e9e23046238079b64d3009570791c1ac0330cfb10926e1474ac8601e08609e6b134c17cf575a0b609e67134c174f905d07609e6f134c1797b9d4029817d80493b08f4306730d8079a14d305dece5ac07302fb20926e1b25532981b01cc8bed58cd46588f93ad669b087ade975062ec950463a07a319f9524ac76b2a840ee09405e4a09929d551d7b12f734b066c8dda3cc3b810c7d99bde7cabaf875e18700dacb29d10ed3a0654a3472786bbd5d7c97ed2dfbbd7d20af05007c853dcb605c1cf29802505e99c9e5d5153cabaf15e5e71caf9e6779d5563364a9649316934135751525de010a5eb6fa8d895aeb5f6ffa9d417d10d8ecd5761c363dc38bff3e2661fbb4840aed9d00ed35762dec22c44956511d0d705e9b89e6beccfe35bfb32cbf232847afa304395a01b952d326fd7def085a06505f6fdfae4ac262806c57650b80f4067b962eb838abd411a0bc3113cbb6272a4033b06c9bac76cf05d5d14dd4f058a0ac760f84b0ab4a3074e2de1a909100decdf66cf123ec746ea142f90840790b25ca6ca5365fd5d4cd6c08d19477fdfcae5d409979ebb61f749ee8157ba45b53cfa502390880bccd169084164906f2afa000b8dddec167c2c50d64cdf73f01b477d83138a2fb121761b545f625aecb01da3bed197676713a793a4079974ddb0c48c799c8daa6d7009c77db8433df499c7f0438efb10927e9e245329c6f029cf7da84b3d0499c5f039cf7d984b3c8499c8341a3fe7e9b70163b89730780f30ff6ec7823dc284336e9510650fe911265674f5de3c494658df585bc47e4deeaa6cea08c7c2013c3c42ce06a6e8352f65ae1c5bdc67904c07bd0be1920c2690bb219a0ae202bff69db8f1cc952d1bd32f159609b0fd902d2c519f53f03900fdb029270c08d0ce42b00e49f6d0149d8722403f92200f9882d20092b1b3290df03908fda02d2c5af057c03403e660b48c25dea64200782e6cfe3b68074b14bf803b0c8276c01e9e267187281453e690b48c25d9664208703904fd9b3b6cdc54dfedf81ccfdb43d1b56498775c9609e00603e63134c174f4c3815c07cd626982e9e98700c80f99c4d305d3c31e15800f3797b56651266f22d54281f06285fa0443948a06cf4567b6c7d7098754384199e6cdd501e00fb174ab023bdd8e5aec1b72bd8e2eb44e3eaf2a87ce66f9aaf490d2de6115463ecff03985fb4f38b17840d29b22f5ecc07585fca045669bd8d7ca705fb5043a3aff64c6dbfc9dd032c16837ed3cbf62c2674b10d900f2cf4aff62e7925444b56755d00d0be427dec4ff47337f36376afbbff31a63e00e3df32598632a0cbfc87b53e91aa842d56173f00ba3b2843ff9ee9850af8eea15a2e8834c3175121fd37b0d457a9cf558a66f805fe7ff697fb59bd2700f81a7589c93cb30a06fbea7999ff7ba37f870ce3282a8c8301c6d733b180ab48c9e019d8e74bb6e1ef6400ef8d4c8c30c126fbcadfd94299bb01cc37ed685db24a463d6d86707ebd840aed2a507fbf65d3d2eb8994eb3ec8965edf042cf56d9b70e63b89f33180f31d9b70929e074f86f36380f35d9b70163a89b315283bdfb30967919338c7009cefdb84b3d8499cf301ce0f2871b27df4e57c08a3c6ef4ec2feb77b7def31a084fc3013a344c95b9a2c1ad10f26930e69907d34f95f00eb47993d2a3ada1377f9a8e88e00e03fecd9d2e7e2668105a05cfc9812254b33966dd90b33b83536f2a1b55a5ed71161233bd4a425b0c07fda63812eaed75c0e2cf0133b3ee440382a44f62187bf008bfc5726c627f3fcff6bc42839bbcec0f824d9f14f0701789f52c26befb1d661063fd740d6a06e0b90fd7b5bae57cfd061782751ad12aa04e5df67d49bead92c76308f2ddb842ef74fb2810d7e6eefa96d84fb7ac81a384f03b4ffb16735908b9f979d0a507e91c9d5960dc2022bfc87f9a12cd6c563c2af0398bfa4eec9c4f6aa5dee4bb707d8becae44aa05abee6b7b1e9140d3cd3bbb8a7e27d80f56bbbbe5be1e20796f60438ff4b89b3ab075701cde62390eeaf01ea05f07d43896f88a6a1840fe4aa6049b33a19dca700dc6f6d864b38564e06777bd03bface9e813617d70d4d0228bfb7ef142d42a464a768bd07b2fe0ff6ec35273c9183acc1340a58e78fd4c3207299ea02d106653bcddc5d9ada0f58e14ff6ecdfcd77b2b75e0560fe6c134c1733750d80f98b4d305dfc326a0580f9ab4d305dfc6c572580f93f9b60ba78b4493980f99b4d305d3cda642580c9d6195803d3c561b8e50066c426982e6e6b5e0160b6b00926e1b2173298fb03982d6d82e9e2d77b0e00305b51c21ce1c54e6204a7aaaff4d8f2e8d8556d8917511396a5642b3ede0090b3320919ce63fede67312f05905b53420e777c14614f7e0b15cae700ca369428cd568710f69ec8acf44980b6adbd6809db056468ff03d0b6a344cbe604639731443f861c7c65659a17ddc6e2dec2861e00647b4a903dbce882d80a2f76657b8616c69259e33800b10325441683e8bc3b3c01ce3d68ad00b48e94d0e452ec7ca58c74d9e20a01bc4e99ae5a523fdd80b0ff5e4285f61680b63325daf0a71bb8d81fba02e0ec62134ed2a13a329cf7039c5d6dc259e024cebf019cdd6cc259e824ce2f00ceee36e1243d729c0c674fb0daa3874d388b9dc4990f70f6b409e724277156039cbda8fbe089c6e663171dbab7e4700628357bdb02d2c5b59b3b00907d6c01e9e27907bb01907d6d01e9e2c711e70190fd6c01e9e2c711570190fd6d01e9e2c711170390036c01e9e2c7114f032007da02d2c58f23ae06200751821cedc5ce98aff4e227c3529f36236c69920d1b978326fb604ad4e96d6e216c2a916d6e6909900ea1449aa758ef7ad436f14f33c58fd167e85c10b233b31701fc4333b1402cd53e3de1ac3a598ffe3c50120fb30926e16a3b3298970198c36d82e9e258d3e900e6089b6012b602c8609e01608eb40926610f9f0ce69900e6289b601236a6c8609e05608eb60926614f9f0ce65600738c4d305d3c19fb6c0033db2698843d7e3298e70098636d8249380e4506f35c00733beac5876bf963764271add367228e02d0c66dcb0d04501c693543b6abe8278072bc3d7b31082b992d54289f012827500f2933cfec748f7962509995806cef5069d3d7a7cb3c57cffae80f40e6508264c7a4c46e0f28e33bdd4ab97cc243d0c846e3870374b9f66467c2e134b2ecfc32409967effe1f1737005e0dd04ecc849562936fb1f5b78b27294c0228f329510e12281b7d0bacf11a42d9282158321b5d08c016d80a9670c88d0cec2e006ca1ad605d9c1e9e09c016d90ad6c5ea6a4700b6d88eed5a657cda975569d5a24f4f5acacea0427b31403bc99e96808b87ad4c0328b7b7697d3ce9279bc806e6ee053827db8493f42820329ccf039c3bd884b3c0499c9f019c3bda84b3d0499c9dc13aa42936e12c7212e7388073279b70163b897305c7d9264b113e3b4e7830a7c3a21b1c6a12347572bc395e951814aef19fe478f379b3bdd15be1d7cd7bfbffc2a5c1befe3fddfd083fab6196b7d1abe37799bc4a2e7b8dff34382b248fade2dd9999c4106112d991445fcdcc4e706846f066f44b730b7822071fcd654fd9873ae43079f4eb35d9fcfb745062ec13dd97ebb2f92733d86c59059f3b2b8d19332ee586b749e8837d35279011fb749e46bbd4be67abf3374dab79fc18b70c353800279ba71a1622ee473d48279b7f7b325148f0a89d6ccdd13c6aa8c9fc273aca27e0134de5055ef01147f58311d9297d0c259b67e4a8afc53c63320b5ddfa44ffc3b3d63de99ef95f31cc1a6693621bea1edb1e7d5fedfb55aad931df09e1d7292289b9ff023fdc3c17b9d5f287b06efd8d77bc182e4681ab230eb389fec4877e07fbed056efb3670a92a37a744b2837eaaf5f4c49109420b8def2c3dbd9bcd3a8bea7d35fbec10ae908d78a957a8cf502ff2ee35ec953bf5ccc2fb134cd651f1e8f14fbbf82c1939ca661931cb1d07b8db892f793cb64a57262695359d11bd1d7c6b5cd569f248b515005b2f7abbd726e910dfc6eb298268f1f5e37754c902ab9ec238bbfebf897b07417c9cecdb40faf5897f2422528984a7dcf955c29f693f5ff007a6e9b04e2010300 serializedProgramBytesString: - serializedSignature: f9fc7dc7a9a8cdc1b518448d980db60d3988ae99d029dc1e3425080a1e504ce1ed40143c661908691ad7199b3372dea8e10f96e3f85c1b2063f7b119a29bf504 + serializedSignature: b3d1c7d93bbb22c0abfe15566056ef52f61bdd5120574b61671e7556b23dfc83514e12578fcc9dc6319ca6a071210aab0a4c21216d1c403920b41abd0ce47706 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset b/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset index c4264b4..4a3c0f0 100644 --- a/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset +++ b/Assets/SerializedUdonPrograms/29fe30e2a863cca43af6ab4dc34b67ee.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59eb72db44143e722c5f9a04534a9a941668cba5665a2ab7650ad37f6d5a20d03699d8ce9f0ed3b889130cb6e3b11d26bc02afc01f5e83f7e11df809df39bb8a656925c56e3685b4d2582bede5ec39dfb9ecd975c6235cce0d3c36689d96e926d5699bf6a88bb765941ddceacbaf5fa33eca5d3c1b68bb41975346f275cd59c273055f031a62e43e6da16c497b959a785fc1d826beb87607bf267a39590caad3435aa5a7b4e82ca490d89041035de7b05c4e01cf07f42b5a9bc2144fe249d3221e55b40ca4ad03a6fd7ecfe80711ab83b62d8ce9531b345f08c5c21f3c56649222a7cbac2e0bbaae18f8e6b6aff073f1dbd4f5795dba81be19fd5ed0ef41baaea67b26a1ef589deb087adf429e06f5c8934e9f4da0667f64ba8299742ea33081a679da21a0ec818001e5bae8704877e8b611e50bce5c80ef657936d0a3254467a353fc199982996be36e064c6480fa6fc4c2d8485a68b9498f51f2a84dba05a53f0b51d9c0b46d9859936a78f684de26d88ef64c1389cd293c661d3495b57750e303dac3775b38accaf317e1b429dcafa06e28bed785f73d407920b34565efe3dd34674d4366e6d16cf471f5cab57c353d8434ccbd37c366f64623af42230c7d6e56bb61d693c8f15b44136f305441c695c544d1b8a5c2f958dd6df2f8d3598f2038b98c5109cdf6adf0be4b5f24ca624686d57d5124186978e9cbbf7eaffc3d7fcf1d17ed0e79b26c5d4a112d0958a65776ce4728248be0bad90a331a86df31c12f4b64f504e157fd5ad26f7205e464651a5780a42c35bc1ce0d746e7353c1b18ded6718e97b7a174e78c2aa2a74a4ea70a65c3429ac66e1cd81913d88593063b3dba24815d38946b04365f66048b3108a6f11087e08c01c14a5e6767111b10be8a21beb8770cf5ac493f9223fe6c553f75d4a924eb91b4b664651ed1dc936f9ecd4f909346b0969e48c2bd2fbc24eb73f650e611709ee4babc3fb1cbd99c4eade5cabb66139a1713b2cf4c9cc9b926a3987d350bd4742efb16f85c3cb2cb9612d797491d366772588e216f1be2c83fb822fe5a8cf7d7bc8938abe66c9cc461e2a578e20593ded9629dda09ea9ddbf6844a037d27d7fd3be0f57a1809b3e2cf89e29722c2a5b310a7fc625cb47ed714adef91bf45ae6257f33de66d609e269c782840b6a454f03dc7bd823735bc0527e69a20dfabe0eb2752bb9e70dbb84493ac1067e2245a3049f44908cbfb40ac2f59889260979ac2dd63095bbb78ff31c2ebc8edcc7ce6713b0e1bfd23e9d9c7d83548d792af01791c3f9d0a1dfdf88167ef003d46a8066e5f0852e987111c32e20e2376225635edbe344d0a85178fdf91c30b7faf63922e5da6f83d785e4be4d302d21c674f9da49cbbe5f4b11b653c0e98cef529ad299d0b8e3eb919b30d4d9e872b024fe5b414047855f05d2eba1dd8d3313c75d6606431cdfab910f0b770c7702ac7a6761f706d4b441fe056f952de0d11fffad86c6fbaed59d44b4a12970e2439eb0bbdedb0d77022f09fe3fc42d0eacb47b49c51283687d00a87e2f75ef32859e12879914128fa41a5c25672c9a6e733e8bcb056028b6ebc1eb9675f7a85f87899639be25854281d45c86922832b914141fabe4d48e735a43cf10eba3c3fa4cdd99835e05c5bc05100b80f6c02775e03b7a59d79184af882ccb3c55a83b2680bca5c00ca0f6d42794543a972ddae58a172dc7d945dfa4eff3772da00ce0400be6c13605ecbb6c60e4afd266ba0e56d81361300ed8a4dd04ab191b1fbbf05cf098077d52678ec33bdd0ca3cb007d8bc2dc0b201c03eb209d842ca727242b1ce5a42930f00f9b14d20170d8b49fca1915530cfd902b340a766df58e17d231fb01d6ea6ca09cb553926b0a82ddb592d7f17a39f48fed0c07c8ace68fbe67137e72e4d76f6914c337d6ff5290576a221bdb58f4d6fc7b15f3449fa327bc7b904ad787cae7daae5bf4663ff8de5dd4531ef3a34af883769159db78529bedc7f01149b60bc51280000 serializedProgramBytesString: - serializedSignature: d65cd75e376e1d7eef9468e8e52d5f18ce9afa5310ddbc02e51f76541aa72785a5632536fa8e3935b3502d208ea291d4bcf33299f540066a5f0c270de3cdba00 + serializedSignature: 7d337da3f0c62763bc4c2a895285c99ee487d597fde9488dffcdb7605a5c97e31cc75250a1d417f418baa5d5937af6f55820252bb07781a18f19d2478c831f04 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset b/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset index ce0caa4..dbc1325 100644 --- a/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset +++ b/Assets/SerializedUdonPrograms/2c30388fd9dc1ff408c4b34ef1cb3274.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd52d35010de539a962288a880281778258e480238dccb8f8a83c000e58671a040c13a6dedb4c1c1199fc037f2317c0e1f42bfdd9c40484e1afe0a88249393e4fcecf9f6db3d7b366dca261c6a04c51a2dd3348d529e76e80b55f1348d7b05a7f7e6d72f511df73d9405b48dd050c2483e9ea94728e7f0d6201723f7691bf792b4af5011cf73185bc41bd7eee22aa2974a63509e66689116a85ff526885893410d5da7582fd58e728abea1b528a078125b9afa51aca0a5216d1580f6fbadd34751ab82b66d8ca9531932b744623b33a54427b9b5e93b23cde0b2f47b0a578efbf3b3a5449377905da01ad9dca89e9f82727f6432d92c3a93f2f081759ed6855a350830689c173e5d9aa071a3c603aa33807b5aca027a944468263ac5cfc8140cae8cb318305703f56fc5da6cb0125a46691e771eb5496330c07a48ca1aa62dc3e4455a455913799b801ded99a4129b363c6619323dcfaba0c627b486f7b2205c91f2ab202d0afa39d4b9b20eaa580953b81fc86c51ddeb7836cdb9aa293363343b605cbde7e6be9966a00da3b7c5376f2d72151661ea3319bd0cd336af11f52362895b0ebd20634960f7648c79a1f558dd38d9125797230c9e5ec7a88666fff6f89ea4574d753133c3e67e221a1c5938f77bebbb3b58ff651d576d826c76133598a05a336259deb0ea8b4868ae8265a51d061aa65f99e8cf72e5ca25d2eff52b49bfd31bc0db998e1b4075e0755560b818b62de26b788e58c4e1e1592135ba6526018ba33565a2b5fdb2694d8e23cd686d3fd4eb88563ecc0ce662184cc210c7609b81418721751860fdc161e542b018518cf0b44938fbc01d932bf5892b7d920d724897055cae76af21319c8b1e9c718e520449361e891587a4d384c4910cb9aa33b2597180926ce333b8b6d0690ff36fe09c97a49d9f82e658449fcf3a1508b7ad614409f8cde8b33895627a66c59c758c5c9211fcd6209bd9167c27cd7279ee0af0707ab20a15b7c4dd9373deae2639efee85a53f495a784ecde3772547f6b7549376c93ac5a77a59ad912f0b4cf302b8719ade65abea2f2d4ad9ec68eac519bd29194537cfd676d2efa6a44dc013b0201fc8a19de743203024ce135c9da6795e8a003f37b880cf3d76aed740b623f1be81930f5eea21e16f5af45971d27d3fba2eba25121d001ed7b2bc9df03ae1087aed90df0bfaf970acaf1c855b73987438dcf6fce791d061f6ee3309961f381ca6ec412b57372703bc756e6b02ddd0361a14b7414e78fef364feb963eb3f7b12e5ce1203d212033c2a1fb692ca2e4d254fbc8b2e1b87b24bd1707971c459ad228e02c4f55ea50f06c1b7d40773ada2b22d40655f2ba97caaa9f4f2d8aa78615d02f13eee557aaf7f5ebb6904a70204f7b792e0eed8455ed55dfebd08a96e4e96e47096c4ffd6f83f5fead4a347eb5285442f3129606c41ee476988cd215c4dd2e9f2f4e632937384010ae450211b94af55de63d2f43c39506713abd8fc0975a3f57f1c76d37ec990f3b0bc27bc884fa8bafce957973ed65f5227b614f01c0000 serializedProgramBytesString: - serializedSignature: 53ec23ee9a01671c3abacd0746600cb9aa944b8e729313caf32907b8e4520493b763170288edd578cfc38453306486c1059421728fb543aef52e80e1eb67600c + serializedSignature: 91fc510a64a6684e72e26ca1efbaf2e9f4c45bf4f6c3bafaba338d9fb822718fab53ab16183b260c1be9e275ab491ab07b4b120b54c68d1719a5219706843a06 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset b/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset index c11eea5..6c2a2b9 100644 --- a/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset +++ b/Assets/SerializedUdonPrograms/2f9470ad3bec463449d4e6ade3d92a6a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c16c5f3f0f741426f2208026a5094202521a10b082434a5090151444a1202924024547befbdf7de7bc1865d51b1f7deb0f7eecf5ededbbddd3c739b9d2777cfdd3cd9e3ffc227b9dcdddedcce776767fb5e835ce6fc4bf4727ecd60535921ebc3a6b352b6942d71fe2a748e95ce7ff74c5d9fc29639c772e7f73ce75e2f965dc793fc5ff74447e7f778e7ac9a2d779e5cc14a9ce322717f1a2b73fe1eef3c5be69cf1ab0b9c9f322754a2a1f3d07456c426b349ac43a27d1d22668887aae5b504d72bd1c4f93d8aad71ee968948f197e48a5b1d9c5fd39c3bd5e25ea51369156e169b2dd4aa74ee9538cf2c63158eccf94262930da399f883b987aef2b89d3c663b3f4de5df9bc9bf9bc8bf61787e9d6bb7778ab0db83b04a6637e727cbf9f95d9eefe09e376827cf7774cf13ed3419cd808ceef298238f3de47127e7a791f3e72d3ee24f71afa78c7b9e16f7e63e993693c75e75844f25a3b93cf60e21a3859bb60d06f948db16e03d7d64da3661495be2c7eb4198ebe5b1a14cab5bb5eb59f2fa6ddaf546c8f5c6c8f526daf55c79bc01c4e506ed991be533b78373279e0dfb69326e92e1ee007186f2d4fdb5da7337cbeb77029de0733723cfdda23dd7587bee16e4b95bb5e79a68cfddaa3da7aef700e7fcfe5dae8e0dfe96d7f3dcf3867353d8879ffc922f8fb7cbf7dc0dcef9f13679fd1e70ced363bd7cff2ff27a813cdea1c9b923b59cac8e29e2d89f79fd525f8ded5acd56d64a9973dde7b2ce65493be7c73b65f87b3579776af2d679e535526933501e9f93e1ee93e703b478a9fb6bb5fb3dc07be17d95066fc9ebf783737e7c1579df20edbefe3e559e1468f7076be1de96f71fd0ce1f4c91362d359def92cf3c04ce1d768d7fa883dd903ad8a9fb51b153f23076ea3ec66e672d5c3aec94aeefb0a41f5436aa6cf25e29e76110565de7c72799d7f69f74653455369fa5c9bb5b867f049c43b9ef6af7df95c7f7401c15ebf7c1b5f7c0357e7c5eca79149cf3784d90e7cadfaa78dda7bd57a5938a97b287c7c039f437ea7debb5f755a5e0af64f700e7c0c7365169313420cbe10656bb806b23e57104b8a664df03ae411b68ea86c93d545e1b268feb40f87b4078750fdaeca880eca11e8a33d4a3d0a087927dbf418f0752e8f120087f3f08afee413d8ae4b1b126ff214d0fe583a01ea37deaa1643f6cd0e391147a3c0ac23f0cc2ab7b508f31f2d84493ff98a687b2f974f450b2d71bf4783c851e4f80f0eb4178750feaa1ea64ca17dd0dce9d3cd4b2a3166e03f396bf1b98371f2a39eb34391b91747f4ae3a5df7f5abbffb43c3ea3c5e3192d1ecfcafb4a6fbdeea9fba4a7c073f0fe13daf3ca57dd0dce1dfd5a8dd0c2bda0c5ef05791ca4c959e795d35aa5b96e572f6a1cf4fb2f69f75f92c797b578bcac717a05e1a4eeabb2f531100ff51cbcaf38e965e06bcc5b06bea6c97f9d25fdb6e97975ff49793e1609f786f69e37b4f7bca9e9a99e1bc79279e54d791ccf6af2566b55574fb76ebe9b3c6e645ebbd9288f1f306f9dfa0357b73673ddf7b739555e5765ef879a9c0feb90a3f2b9298e1399b76ebe2bf3e6918f98b77ef29194f9b7fbdce6ca56545a7cccbcb6b62bb80ee5adf3ca6b3b459eabfae51fcc5bdf9ba4c54bdd5fabddef01de0befab34f89379eb977fcae35fc8fb0669f7f5f7a9fae504edfe642ddcdfcc5bbf54e741eae69f306fddfc1397dd1627d6c16e8a264767a7ee47c54ec9c3d8a9fb18bbddb570e9b09b0a74e1c76296cce34a9fe9e09aca5b33584dbe2fe826af4d93c74f41f84fe5710f79fc4cc669033877d2a69deabf32c571a63caabaa38aebe7ccebc73f97c7bd0cef9f05ae8d94c7bdc13525fb0b704dbde7cba4ae790fcb6b7bcae35720fc1720bcba07d36bb63c36d2e47fade9f1b54f3d543d08eaa1647f63d0e3db147a7c07c27f03c2ab7b508f7de4b1b126ff7b4d8fef43e8a164ff60d0e3c7147afc04c2ff00c2ab7b508f39f2d84493ffb3a6c7cf21f450b27f31e8f1bf147afc0ac2ff02c2ab7b508f869adcdf98b77cff8d79fdd6efcc5bbeebcfabfbaa1e3157bb3fcfc0617e52978e4a5ebaf500f57ca93cfe23e3f3143877c2742c4d21ab441e952fff9779cbe77fa58c0b659c5fd5defd1ff396cf25e03a94b7ce2b6f2be5d7641993507dcecae79781eb406e623319ee69ed5cf9ee56f23a93d79f01e7fcbd6bbde158b93c2e90e19fd5ee2fd4dea3df5f24afabfe071fe56e4ddc3678e3d649950ffb6a2c17276da6f38bf2b856932d6d3691d064cbb4ea74a80c57a1c9ae4ccaee3613912dcbdd44034d7603295bf5092dd1642f4dcace6ea7c9c6d2bdcafb6e34fd9faf23fdd558c533e0bc21787f26d35fe5572dadc4b9a99db258beb311f3fa27653f8d598d5f49340661f9518daddc0ece1db9dbaa764896f68e66cce3c313cd34b9cdb5fb720c2b01c60d13ead842632ec7aababce9be776b55775169df4a4bfbfdc07518c7cd9937cfabf3075db9dbaa712a95f62db578b4940c54fd689997674d3ae8b6a9c74f3dd743bbbf56bbafeaa98bbdf715d39ae75b6be9af9edf4ebbafcbafd6ec43c957e9d08679ead5e21c72d3f559aedd57ef537524950e6d355b68abd9ca16ccdbae57f25768f795fc95de70625c19d6cb83e6d176c87d3d8fea7ab5d7f46aafe9b5a557af1ace5b7ae5d64a5f35fe29fb8fbb28ff8ef90155cf88c2872c9571e8c0cc3ea4234be6df8e202c3f6ec5bc3e642b576eb72e524696f68ece1abfce9adc2eda7d2927d109c4a1933c6ecdbc79776bf7dd5dbbb8efed2a6db5268f6eabd9f47ee03a8ce376cceb43d4b9f421dbabbaa3f221db68f1d8c68dc7f617ca70abbc3c511fa2c74f3dd743bbbf56bbaf7cc852ef7dc5b4e6f96c2dfdd5f3db69f775f9ca8774d0e4ab74e8cabc3ea4abc64dd767b9765ff7212a1db6d76c617bcd56ba31af0f51f25768f7751f22c3257660e17cc80ec87dcc8728bd76d4f4da51d3abbb57af1aceddbd726ba56f4790bebc1eb510d81bb50fa99471c861661fd28325f36f0f10961fd57c9fdbc1b9233767ae9491a5bda397c6af9726b7b776bfb73cf60471e8298f7d9837eff671dfbdc35cf7bd3ba8fe4c9547f3349bde0f5c87715463be4f6be7d287e4a83cab7c48ae168f5c371edd37ca70abbd3c511fa2c74f3dd743bbbf56bbafe253e9bdaf98d63cafc6ceefd29edf4ebbafcb573e244793afd2219f797d48bec64dd767b9765ff7212a1dfa69b6d04fb395fecceb4394fc15da7ddd87c87089012c9c0f1980dcc77c88d26ba0a6974a7fa5d720af5e359c0779e5d64adf1e207d793bef46606fe9fa10adef21319879fa1ec439cfef1b53c85ac33cf69f18c2bc3e63882ba3474737de3da678df9dd89979fb1ed680eb50de3a4d9e1abf547c876af65806ae43b9c39837ffab733f7dee98af55bac3b1dc86da7b77611eff2bc2aaebfc3842e336c29591abc6c5b33479a3343b1ba5c92dd4eecbfebac44810c7c69accd1da33a33599455edbadb19ba1499989222ff7c418f9cc0be0dcd1abe7086f7835f68d86af02f187cfedcfbcf954e547a5d3584da7b19a4e2afd1ff3ca6707c8f3719a7d1e288fcacf8df7da823857cff1a31a375907ce1d7d7a9de80d57d33fb39b0cff2238e747351e729b16bf095a3c5ff25e17e19a7a9f513a085da10f55baf500e7d0cef5e78b423e3f36e4f3c3423e3f3cd8f335ef7bae8ef08fd7f1be47d27c7e58c8e7c7867cbe28e4f323bdcfab3c5853c6293eb28ceba1e6b08729e3946f9ec492f940e5fdc952cedde0dcc99b7943b5709398c70724b471e5c414cdce4680ebfc3851de7f59933b5193ff92ab77dede5e3935efd1e4a8e7d92e9a9c57b4fbc380ee41e7aacfd238eecebce5d4ee92d9ef6edcfbaafaf65ef2fe542f3b252f315593b7ce2bafef42af1c3156944a07f5be622d4d8b5d79f90f6be16668693a43633d5db3b1bdc1757e9ca6a5a98a672eb80fce85de3cfcabe01ccadb43e3ba878cf73ddef035f19be9b53925a746ee9e5afcf702cfc1f8e9e15f75d3317fa3576f8f5ed006959cbad227958dc9f1f2041c7354ef83638eaa4e552cefedcdbc75aa59e03a3fced698ce7665f45363d7599abc39cceb9fe66872e76af7e7cae33c1047959ef393d7c47d758d1ff791721e05e73c5e674a198db4789568ef2dd1e255cabc7518355638437bdf7aed7d3a37c53f2bc928a1db9db263e9a30b26806779b86921ece0209926aacdabfa70cb98b70d5ee6c67f80b2cd83e5f505e0ddf2597618b027584f54f70f07cf9aee1f218f8720f78f94c74391fb47316f9d41f5ab961be27a34086392758c262b15cb63e5711bf09ee35cbe23528d25abe78f97c76dc1f3b23f36b1504b8f85323de4fcaf816d52c85772557ff26bdaf513e451f521bf2ecf4fd4e27e92f6dcc9acc67607a9756ba768614e4d8619acf2da695a98d393617813545c3b430b736632cc505557384b0b737632cc70352f2215ef9325cb7da5de6f80737eff1c79aefa1fde04e7fca8c6a99e01e74e9a0c5eed0dc7ce95e1d41a8af334f9159a7c39d69ca8d4e4576af255b82532dcdb5afc9678df5b135ef58dbfa38557d7dfd5c257c9ebef69e1d575b55621156b397732b14c63adc6bace97e7fb692c549f62b5c6a2da6531e4136fb81ad61f68ac95fce59a7cd5a65ca1c95fa1c957e156ca701bb5f8adf4beb726fc2a79fd432dbcbafe91167eb5bcfeb1165e5dffc407ebd3e533aa9dfe0638e7f72f90e76b3416aafd7e80c6e20097c5d06c6fb81ad66a8ece799afc0335f9aa4d729026ff204dbe0a77b00cf79916bf83bdefad09afca8bcfb5f0eabaaa83a462277d54e2308ddd61f2be1cc74a1caae976a83c1eaee976b8abdbb06fbce16ad87da9b153f28fd0e4cb323171a426ff484dbe0aa7cac0afb4f81de57d6f4df8a3e5f5afb5f0eaba2e5f958bdf6ae1d5f5efb4f0c7caebdf6be1d5f51fb4f0c7c9eb3f6ae1d5f59f7ca4e5d9f29913b4b454e5dd45f2fc788db52c4f12276aac4f74598f18e70d5793966a1edf799afc9334f9b21c4d9cacc93f5993afc29d22c3fda2c5ef14ef7b6bc29f2aafff4f0bafaeffaa853f4d5eff4d0bafaeffae853f5d5eff430bafaeffa9853f435eff4b0bafaeffad853f535eff470bafaeffab853f4b5eff4f0b2faff3e9569ef067cbeb092dbcbadec0876da97ad9395a1a9e23d390c795d79dae4d21eb62f9ccb92c59df93eb0d13e7816bdbc86be76bef3adf7dd7c84fbce16ac25f0d645cc2bcf55815f65219f622a9fb66e09c1f2f96d71b82733dcefa7baf01f72e43de7bb90c7badf65ec92b7161524642f944c024a1d6656e2ecf2f907254fbb23d781632bbd065366aae371cbba20e0e7a7cb88c53c1bbb98c4e485cdacaf00f7b6d87c979430d1ab9b652b8509377959606595a1ac8346da0c614ae04d7f9f152edb94bb570326d1a3401e7fc78b9bcaeb7412e07f185d7af006ca4ef4b5c09ae5de9ea5f78add453ad5b6867087b05b8c6dfa5f68fd85a5ebf8a79fb9aae72651775f3c6496fd33468eebebb68a8164eb6891ab490e7a9f27c7bef31715d32deec6ae6b57315f61a19f606cdaee4be0489eb99377fa97d1bc01c1f26b9f96a43cab62ebb4eca93fb3f346809ce9d778d5eeb0d279ed3dac609b5e7c333e0dcf06ce2e6dacfd6b4abaf6369b4abb31262feea3856c6e6b12a962b1c32ef0df1bb1d8e7ab2ee8d70c4dc5c514230be230e7fed72b6c679b4ccb41bcd74b1d7cd7256c0f28dbbd16c25e66eaab7178adff39c108b84d0560d6abde2de5aafe091ab70fe9781ad74aa9deb63c54e3c7c339d45ce9d3e6c8273e44fcd657dd92ce7bf57ca0ce7b5156c857356ecfcae12f2e63ad1ae1db22e95f8b63bfa33531d99eeae4095ce1505b4ca39af10319c267eaf14312d13b11fef5c5b2ef6285ac2cad928e7b85abcadb6eecb9cbf4def2c96c8cc71346f0e845d77b72052c954e468c3639f2bf2d2ff4f91fa4811314dbc95cc870d7385373cbe564afc7f86ae93e105fa7829a3af4096f05ccb67b9a2cc9f5a8b60701d6b6b68b66f97f700d62fa52e66323cb93b0b0d92297cd59e0f8cdbab79b39e595ed50a58aea87e74a943b55460b9bc1c310b39880a59590df3784475fc09137e51259b9641fc6eb845225cf00468240a3f6f028869eac5ce1fab9d9f0a27f048e772a9f07f856ca1136c89f07e15ac560ae571718d05e4da45685d11c5303730611635d7e27ab1726c43bad4a09bd46891049d2bea4e1d539823f62e51616a206b4d2ac3bc39b1dfc09df3065f96654e9766225dd2791b96329b9952a659a63340dd1e3f55ba34afd12b992efc9f99610bc4b6eb8a0346b0a18960f3fab16d1ef7f46c9b37317a6b0ccdfc5aa5b4c15431c0086699088a36ddf40c129cecc4705f594f4c8f616bdf0cdb08865bd5d2ce4f1c308a8d0c14f338c5cd4dd16aaa458bc70811dc1813dc36a4e02698e02d420a6e6a32a89699ce92fcde52218517b7c1cd89f7b0f4d4dd9ad99eda2379b2ee2860d6d4cc94361ce196c658e989d31e4f9ce698e40e6125b7c024770c2bb9a5c9a0c40cf7ccd7d2d32b23b9afe9e0bb8cecc45255b2839690ad4cf4b8b314138fe8e8d5ee3c527f8d729ee5b5e095a246bcc279ded4d9949a6867dfdebe8ba099cd4c5d60c16284116e6db27c8e7d6b2cd975e3ef841b7f1b93705e28f0e1805a0d0fa3f4c6b8f4cd4dc6215e99d91698dba8e17282672ede1fbd6d2dca87ee6236876c8635ae52c7014bfcb698dbeb1ad6ed6d8149de2eace47698e4edc34a6e6f92ccf34737537ed50577c1056f89e5b11d22c8631d301e3b86e5d11193dc3dace4ad4c395764e70ad29c3bddb9e6f6c98f16771789ae0cd8c5314dbad0129993ea7e62a2d8c97e85884deabc9ee3dbedf710f99ccfefa68e31e6193a99d29efbd69d3087a5277f369efc9d31c3ea19d6b0ba60d1ee658cb641788a686f6db25ae14297d493d52e11f2e731353c51282c61651d96a0ecd1bfe5f6f66db97d84e5e6a7b4dce8628d59ef369827cf0de9c9b73509e68e2bcf8fe01eb8e06cac88e81b4111d1d5249c37d3f259edeeafff9c7fb584b7c0856f87c5bcc010f3cd02c67c7bcc53f433788a44104fd10d63d2dfc0e45053b45330d901133ec020fcd480c277c4840f3408bf34a0f0ee261f272a738791fa38bf23fc63c5876eca3cdd5deabd4b85a7e0315243bc539de302110b7e5d9590a9df95da130eaae1033af245957434f33f4f815e0bbe9ebc997064663f3d44f869bbe28c79f31c93c1f376215f3550ab15c9bdf11cd9ddc0dfbf44dc9ae2bc81a7e67859ba046967f6c03cdc5083874b04f4703b99329c6889d0562aea4a765ef8ae100d49fef74a99bcc5e2ddc951bc3059892f95dcda50b289d2cd68b4c399aa5c6422f69839f6c4fcef2e06ffbb772298ffed851578230c055ea0aa716f4cf2c8b092fb60404699803408062417cb7c8586ccc70266be3c2ce645869817350c16f3be58cc474710f37c93db10fd0c8b48dd46aadab9b72488b6053286f96d818c154e825b3b5d5c31d750809554e34cd10f5004f53325b7e8f9c9e438279cc391de38e778dfc9b82b338f73fa8903963cfdb1ecbe9b21bbe76405cbee034cc279f809cc5065147d6be98de28aad091a32f75f1fe75fe3ac20239c034df1e435fc498678e6f1aa2ddfaba1814894292251faa4c85ba65a62f0dc554b9f21b83e834cfa7037bbbbc1cd3608e8660763199a0fded5aa7a4e10eea736806c768053d41ce41c5ddb2d7354e57f2f757e73e5398e6a595dcd16dd79cb9de27aa95381eecd9689f1d772e75eb6f3a36a325c625f217181c8b995e2392edb45cbefe73bf78738c702e7d83590b7198299f234938970532e0e67933b6398a79b30cf8d0473fa30b3d92ab650bad36c3925ae543ad76c3141b554f46ef1bbeef3554c7da6953bdcea80c93114735b330c6eab57b3606e6b98a96411fdf3991c9f1ee984e296be268d32650fdf65ca4c661e9b4efd76ac34196e4a164e6e4f5384f424998927c92ea624111df2991cd7d43d78b044d9cb77a2cc62e631cdbade8f25cb08133d31e2b07b06e9f999e06d26b7b76f72b305b9f6b5b44a39071aa136d264cc9c1adfc0a4a9169db1a65274366ed0a3300736c7e0c07e09e8c00ab198cf35c4bc71c0981761319f6788f9fdcd83c57c3456eacd37957acc14f514a5c6182cea2586a81fd92258d4c762c24b0dc237b60e267c9c4938afd1f16672d886f3784cf8820884ef8a092f8f40f86e26e1bc305b68f218bae0b1b8e00926c1dcb216f9119cc204276256b2afc14ad6b7096625934cc279f8c50ca9a48afd56d2afa44ec630559ab22b8f5ed04a2a2f8c6c6c0f4cc1502fc1502f0d877a770c759509f5fcc850c7a74d3015cb5afb19b2d69b5b04cb5ad34cc2b91b5b16811b2bc6845747207c3ae6239787f49133308b5c11d247ee81e15869c0611c9b4f8163266625ab4c0eb85d302bd9d3249cb77f56fb4192a2fdb31726784d48c1b330d6fb47607a7b9b84f37ae8017e629da20e3a1b4bc4030d897862fb6089b80f26fc2083f0e22d83099f83093fd820bc4b8760c2e762c20f3108ff22a0f07998a51c1a81a5ccc7841f1681f0124cf8e111082f3509e7e18ff063e3b370c16526c1dc6b1ec90c053eefc20e5ae02f978577791ab5aa6045f3024c97a34cbaf01bd99eb706795739f6aea34defe29df9739cff79ce4f49ad41307e876f5bb14c900d128b85582c8e31c5a22d8845a5acfccc13ecd38fc1222c06c79a62d00cc4608e53022f134313c1caed7d31f7739cc9b7750ae67e169b84f34c7c7c0499b8028bf9098698af0e18f34a2ce6274610f32558cc4f32c4fcd580315f8ac5fce408625e85d9e72926fbe4330766495f36dbf10db3a41f1a221b1deeb599e2d89b0d777e8f063eab4408aa70fe2a75ae5539d7160affb25a74629689aba5017dda7e58fc4f35c59f0fe7246334cab9512d3cabd26988d467b66160c6f5d97a03aa5284a896e3be6e53ccd5af9ab91db26bc49341745a66d2891bc8693537b456add8e8ae3173fff571ff056bd85663467686c1c81a0634b2e598f0330dc2b3020a5f81093fcb20bc5140e12b31f33adb645edd7c650fb75d9eeb1cfbc96b6e563980f597610738c72006b30a33987330833937b4c1acc6de791ef6cef343bf730d96d41744e009f73709e7e1f9ee7a61aa900760a42ec24889fdf5b220a9609c0ec4385d1201a7834cc279597729ab5dd60ded1facac3bd8249ccf01b9ccc48a571bf91e80723e7180b9198760f9fa0a53bee69311e73815fa256c8c73913bf7e9a0df2c484e3dd4f45e3ec478a541bf5cb16828bd99465731f71302e29fc17a76c5e37818c6e66a139bf62c59654d3615c68b429217ede9579d0fc7e2718d291eb0f2ee2da4d38fc111580cae35c5a09d91c424d91c4c3f164762b1b8ce148bd62016fc6de58e61a4ffeea3b0775f8fe713d57c99aa55a082bcf768ecbd3798dedb06bc97bfcdcd97e96b7d0cf6f61b4d6f6fe5d19a8fcc2f6723e5d67c2b03fa87634d6fe649cab7ba0cb33eec389360eeb56f66b5bdf685038279ede34dc2f972875bfcc43ac5e2b3130c8273c56ac715b5bc62fd2dc74d2e1384131ca25ca0cb3f8caeaf484848e76e9e82c13f1197233ede98795db0a91c27623678bbc106670e0c66832761c2ef30083f30a0f09331035f1bd2c04fc1627da721d697068cf5a958acef0a19ebd3b058df6d88f5fa80b13e1d8bf53d21637d0616eb7b0db1fe2260accfc462bd2e64accfc2627d9f21d62d06058bf5d958acef0f19eb734c82f998d303cc508fe70eeb41e1b006f97258e34487f942364574e0543bb572eee4dd5a463aee2ac098d7b926c578bde7211672b1d27926c9bce9f3b00919af6c3ec2d4f4f747595d4b4b8ae54842355b20ca944ae2c9efe76306f0186600eb850e037d19c004e767557d24ff05985a8f636a3d21d41ae24bad22595be6f0d51e041954ee424cb92731e53608e5faf9526eb453bf58e81c33a8d04598424f610a3d2d141ae04ba142a1ce32e73ca32678b14929de02e2bbe287dd00e5129370de5ee1dbe5d76af9f06defe6d474a3cf604bc58d4a535991a2cd7329f6cee74cef84ad6cf3bbf975eebc820d585e86c5e279532c9a7a349f28866c83697d39f6be174cef6b6bd45abd373d8dafc062f0a229063c77cc4bb3557ba5e94ddc645f3298ec39c327ef1cc464afc284bf6c103e73f03d238208bf1a63f48a8911dffcb35ca4c39c9a9ec2209caec1def6aae96d9b039bd0df9a9e455c6b7a3faf6bbec66ad735371605ab6b5e6712ce6b4efceb8ea16a4ed79b24f35e19fe7dadb0dddd3760c2df8c40f88d1893b7c232b9c9203957ec3ec487f06d5886ad7aaea35b8acd3f37e96f810affd0644e82afe0a78d2fd61372b329ddf930c0bb261502f4dddf82097e2fa4e05b31c1ef87147c1b96053e089b056ec7246f0c2bf90e4cf2876125afc5247f1456f29d981ffb38023f761716ed4fc246fb6e9364eec73ef56377efe082ef3109e6c5d7677e04a7187cbd1703fd7904a0d76138be0889e33e2c7f7f19327fdf8f71fe2a24e7074c8239e7af23e0fc2086e39b90381ec2047f1b52f0c318e7ef42727e04e3fc7d049c1fc570fc1012c76398e01f430a5e8f71fe2924e7c731ce3f47c0f9090cc72f21713c6912cc3d3fffd66b28cfbf01e3f16b043c9ec278fc1692c7d398e0df430a7e06c3f14704389ec584ff1981f0e74cc2792bf42f3f485234579fc76cefefb0b6f702c6e39f0878bc8899c8bf214de4254cf07f2105bf8ce1e083d06171bc82094f4420fc55ccf6f8b796c3d8de6b58ac378b20d6af63c21b4620fc0d4c785604c2dfc484378a40f85b06e1b962e363bee621f37d1a516c2995ba47a3b11f2b9d82137b1b33ff2621cdff1d2c9d9b4690ceef9a84f3b5b2cdfcc43ac55ad9f74c0694cd2f2ea81703a2339ce62652c6aeb01609de15c6377ba58825d601f6be2989794ab4f493c43cce88e00f4c82799da05522649d602326b97558c91f6292db8495fc112679f3b0923fc61c40db081cc02758b4b7081bed4fb168b78b20da9f61d16e1f36da9f9b24f36e9f2dfd649714dd3e5f9804f3d66c073f8253b466bfc440778c00f457188ead42e2f8da2498d7a03bf9119ca206fd0dc6b97348cedf629cbb44c0f93b0cc7d621717c8f09de26a4e01f30cedb86e4fc23c6393b02ce3f6138ba86c4f1332678bb90827fc1386f1f92f3ff30cedd22e0fc2b86638790387ec362bd6304b1fe1d13de3d02e17f9884bb9fca0ed742f8d3249837d67a846cd3fc85c578a79031fe1b13dc33a4e07f4c8279bda057d87ac1bf98e4de6125ff87195d9f088c8e771b19a39d1b36da094c725e58c90d30c97dc34adecc24999b537e48bb6b88092e0829380b63d12f2c8b4626c9dcecfa4760768d31e1032210de046332302c93a626c97c4dd8203fc998624d583393605e8d1e1cb21adddc249877e00c09d981d30283bc7358c82d31c943c34a6e85e5c2612173616bcc9c874760ce6d4cc279f1bd4bc8e27b730cc7889038da9a04f3caddc89095bb2db0188f0a19e37698e0c29082db63288a42a2d8128bf1e89031ee80d9f298086cb923267c6c04c2b7c21cc7b8b08ea313e6f7c787f4fb9d31bfbf6b48bfdf05f3fbbb85f4fb5b6390278485bc0d26796258c9db62796552c8bc928d99f3e408ccb92be6f7a784f4fbdb6138760f89637bccd94d0de9ecba61319e1632c63b60828b430ade1143313d248aee588c67848c710e66cb7b4460cb3d30e1332310be13e638f60ceb387a627e7faf907ebf17e6f76785f4fbbd31bfbf7748bfdf07833c3b2ce45c4cf23e6125e76179654ec8bcd21733e7b91198733ee6f7e785f4fb05188ef92171f4c39c5d494867d71f8b7169c8180fc0049785143c1043b120248a41588ccb43c6783096fd1686cd7e4330c98bc24ade19cb7ffb4690ff8662a41787243d0c135c1152f0700c4765043876c1842f8940f808cc44968635919158d15d15b2e81e8515ddfb852cba0bb1a27b59c8a2bb08b3bbea9076371a7376cb433abb319859ac086b1663b128af0c19e571583659154136198f095f1d81f05d31d86bc2c2de0d8bf6fe11447b8249381ff73ec04f4aa618f79e6812ccb77e3cd08fe0149f969884e13828021c93b1543c386c2a4ec1a27d4804d1de1d8bf6a161a33d158bf66111447b1a66238787b491628cc71161794cc7781c19018f1998f0a32210be07c6e4e8b04c6662d13e268268ef89093f3602e17b61c28f8b40f82c4cf8f11108df1b137e4204c26763a672625853d907937c5258c973b00ae5c9212b9473b10ae529212b94f34c82b39dd353fd084e31657c3e26f8b490824bb06adfe921ab7da558ddfa8c9075eb32ccdece0c6b6f0b30b3382ba4599463513e3b6c94176292cf092b799141726e57e734c1bf94509fdbda46bbb362ea352ae7fa49f907718afb9a286ec7292eaa178ae1b7584ccdeb3c3fbc1ec5792dc6ecf9fcb0f65c6192ccedf98290495c8945f9c2b0515e8249be28ace4a526c9bce57771c2b43f9f4178362ebc0a137e4904c2f73365a8ed7986aaae67b714e57e9fa933d9a57e2c763dce70992981b853ba2c64eeadc60cf6f2b006bbdc249927fb152159acc0a27c65d828afc4245f1556f22a2c835d1d41065b8d09bf2602e16b4cb9b71bcfbd2beb39f746bfad6dea3c7cad1fbb7d0227b93f9687af0b99870fc0ccf6fab0667ba049324ffc1b42b238088bf28d61a37c3026f9a6b0920fc1b2d9cd1164b3434dd96c079ecdaaea399b45b3c172eaac758b1f73da80d33b0ccb5ab786cc5a8763d6745b586b3ac2249927f8ed21591c8945f98eb0513e0a93bc36ace4a3b1ac75670459eb184cf85d11083f16137e7704c28fc384df1381f0e34d1e6747ee7196d5b3c7896e07f4d45ee75e3f39ed699ce00998d75917d2eb9c8865b4fbc266b4934c9279a2df1f92c5c958941f081be55330c90f86957c2a96bd1e8a207b9d86097f3802e1a763c21f8940f81998f04723107e2626fcb108849f85095f1f81f0b331e18f4720fc1cccc89f086be4e762d17e3282689f87457b43d8689f8f497e2aace40b30204f4700e4422cdacf848df64526c97cf4f0593f9e3bc577642fc6783c17018f4b30e1cf4720fc524cf80b1108bf0c13fe6204c22fc784bf1481f02b4cc2f9571d5ef6632929bebe752566dcaf8435eeab30c9af86957cb549329f3af99a1f1829a64e5e83097e3da4e06bb18cfe46c88c7e1d16e33743c6f87acc9adf8ac09a6fc070bc1d12c78d98cdbd13d6e66ec224bf1b56f2cd98e4f7c24abec524990fe9bf9f307c23e644713ad569494d77da5abc95e7b6082bc5dfe3455b91b7d816b079b24538be26e4e89a6f18f32ff9f2bbee977f96392d33f5a55bfe95e542d1fe5b2ee4269f29728e158ed435ceb1d4691dba5fe12d935f2386ed3cf8396bef1d377e058e86735268c1db97fccb4fd5e0edc5a205ac647aa5f26f452d72e4049918712b46fd031375fefd30b31e231d4d97092a2ec312e6768beb71849a637792b28268721ba6c946932683344de05e90e175314b0ba2cded98361f9ab41989a68babc15256e5fc9e20acb4dab121f73be2a9f4f1a727ef57592afa39b8bc20fadd81e9f79149bf710cdbc5b3f6e76cd24bbde0d28368bb16d3f66393b6c302d8a6fb556ebf29092545e13deec4f4fac44f9e83fe317c9e334b0ba2cd5d98369f9ab4d9c5579e1be9102d1596e50e0f86cf73c93b4174bb1bd3ed33936e436a4ad7694e79b75bcd77f9a60b3d2aa43e6e3f2b8fdf78e72ff7716e41a9bc61741ee41e4ca3cf4d1a0dd752cbfb5e9862dc13cc73ac670d9be4dc2d77fec6d2ce2b233acdeec534fbc2a4d90e9a667a4e525fd09b203c58b9f3f7c2886c6a1d16cf2f4df1dccd577e192bfac5e7c9da9b2aa9263b7f8f66fb3982b8b8fa2cb7eec374fecaa433befb34cc13de745a22eb93a9fc5b9018df8fc5f86b538c87062869bdf12e67b5378dc74b56d316f341b47a00d3ea1b935685294a1e578b317266e33c838fc2ebf1e69239aa947b10d3f15b938efdd194e32d96f94e20a52b9f7456ee845826c6c76a97b151d7121ec2f4f8cea44751083f519f9ee1614ccbef4d5ae6f96e498dadb38617852f7f048bfd0fa6d8e707a8a1068d7fba1ee1514c831f4d1a4c0be0995d8b4b963fee33b86ff3e61f3f61a2b2c1c730063ff949c554f5f1a0a998aecf5b8f69f0b31f5f51dbafe369e7cfc37bef44954e8f635afe62d272942f8f38cd093c5fc4567dcdba3edb1b4f601afecf4f8b379525066bf1a64abf74cab22731bd7e35e9b5b36f2f1f4c2b3cb5d2d16903a6d36fe9f735d595e33259323f85e9f7bb1f9f12a43cc06b51f4ede1a7312dfff0d31aa3a811fbd73addd2e2194ce73f31cb0d56e68f172d9e0a31ab6c114bd59ea149d36731fdfe32e957c668c74496b329a2c5502ec73c66887e9245ceeff942bb74ad24bc077b0ee3f4b789d374624ef8d8516a42e1393c8f71f8c7c461663dfb006aeff00246e35f138d313eeb92e3457eb7ab3ef922a6e97f264d47fb2ac1278a19acbc1ea93c20de139aa95ae54b989eac818f5e1fbdce552834ad9d7ab027c7cff5686b632f633a264c3aeab5b1da3a26fb49783c79386e5d25067f5decfc5d25aefbd32ebd51965730fd1a98f41b5a877e6eb9947cc07f2d2cda547b15d36a339356b322b64c2cff050d1f2d93d730260d4d4c06a2b5b3e4ccfa69cecf0a47236ebddedee76a8797eb9fb8c051c28b2e318c454d93be577cc331802eaf63ba64997429494b17b78f05d61c0a458895d2ae83484c3e99ccd5b88425625649d2bf279f0ec2e80d8c512313a32128a3ba461adc3e0eb81f01ae5bedbd0b8268f426a6516393463b06d648a5b87e97df2b0e14d3b7b0983631c574ac0ffb4cb563861bfb6a991e3cceaa0d503bc7a51e254dc7afbc8de9dad4a4ebce91e85a9e86ae41747a07d3a99949a75191ea54e23cc3fdcd02e7ff18515fd84fbc86d7124c75dbf43ce8bb9886cd4d1a4e8ad442d3d7300a7b7d0fd3bc8549f3d191a6ed4219b24a86e4add66ae169542d70f7c852f87d4ccf96263d778f3485c3ea19453a7f80e9dfcaa4ff181ffae3db83d4af07de8869da3a5849ef5f536afffb21a6511bacd515954699f1be1f61fa6d6ed26f6284b659bfbef7634cefb6588f4154e95a21c265c2ef7e82e9b88549c7c911a66d381da348df4f31dddb99741fef43f7ba3675a95fcffb19a66f7b93bec322d397daff7e8ee9b5a549afa2c8f52a3584e63326791bb8f68cc37473ea1798961d4c5a4e89dc5ad3d7320adbfd12d3be63babed8b4334cfde6cfaf301db74ab7cf0bd7913a4f7e8de9d2c9a4cbe0487429656562a4618d539aa8fea8a872df37983e9dd36d87d56d7f41f589c206bfc5f4ec62d2b35f64e956c1ccb35fd34badef302db636693122b2d4aa5b8b28d2e87b4cbb6d4cdae1737b83a5115fd530d1b9bf3ab254fa01d363db74db4d7e52c99f1e51a4d38f987ed974e9b44a1ca34da79f303dbad2a5935f3da248a79f31fdb64bd7b7637b40d56ffde2174ccfedd32d9353eb495dc7f81fa64f37933e0322d327faf2ea574c931dd2edc1f76781992bb37ec334dc913eadaa9869dd5aba69f53ba64977fab4aa5b9328d2ea0f4cc39c74db217ed32afa3ac69f982e3dd26d37fa4dadccd533fec274dc29dd7a86bff45a26e7064595567f637af44cb79ee12fadfce811453afd83e9d7cba4dfa0c8d209d6a5fa46965aff62daf44eb7d7cd5f6af9d7268a34fb0fd3b24fe6d2ccb4422abd34e3531d8ddae4662ecd526b13459a25302df33297660591a559034c9bbe994bb3d4da4491669b615ae69bb4dc8bd1cdc277e7558559ad80cf220d42a42146a400eb89836f2d14baba7aa91963c56c69ca744b3d8f3e3debcdc2b4e8878db1616f4d777eb95763bf369caebe8d307dfba73bc6567baea7caa12b45bb99eff2455f77698ce935c0a4573eaad74491520b9d9ce9ea32daf12e5581629f6eca34c1341888cdb0f16389fe56ce66d6069b629a0e0ad6d6d6d3aa50f415f0d9a679016b5ee96ad20cd3643036df3ffddc5429e69ad48e7bf4fd70cd31ad8698b45a929656eeda06baf9e0c167834741ae05466ee7745bf3b83da4b32a200a1d5b623a0ef55362e27b53f9597ba6dbbaff7ce0a717b7b1f33f9168eefc395ad4bf780fc91441889f55b3dceece2db1bb895bb7eb535367ebe3a9df25aff318543afe97bfb9b8a676c6bf99905ac2b006eec202f1af7b8227c37269da89051a51f7c90a2139e9e1f9ee6563854594899a5f89733e81b93324d4b722ead2c2544fed036aaa50bbba75525f8be07b7e9688fa3d4fe5f98e2d35961a29590ee91c4e7a53d374384fd5d632551be4f2bda0133dd3b4a6ba63b10b7fdb66661bea508b2c6c2198e2ee0a98c4dc9dad127cc3eb3900db1291697966e122c74ba756e75b618ddef4d6de4280f2ea758a9bce928bbc4ce2b612a6e66e5bb88cb91b861625186b9cd5208fa7c6084a64ad05b2394edd84ff1e251e2cf5f8f738e0ba754012d7484a5c5d3cb8744b9beebca554768b8e132ebd94b91fcba976948903c829dd922047d909b26f2c406ee89c04594809b29d07a45b81851f469a2790960b7871005705b27251e63c1faff1f22894cb323a2eb8dab449e21a4d89aba5c03599f1c9aef3c4b02acca4714035a528896a0c25aa2d9c13d5bbad573e16c976c4fe8ccfea8803b60da02a3296125b236161fcf179a2fb350e70baf54fc21967677959100b902db29320c753826c2b404260e66e8d3840db7b4412daae94d05a192b196e6b77654c60fd02dcff6ed4150be5fee3ebf68f046e7f0225aee6c2b6468b3e9315e2f5716aa8f37e378569227dfd4b65c1a931acaa2e6fc85135ced284eb6346e9f7a705e38bf7fcf10cec8eb0b9abb6ca448f88a727906f336f5dcc27c19ebc9c14192bc7674f598e0f5f9613a0ba9b538715e7f86894e584ea3a08f37441a8a7f39da7f51a6e4ea0d6bb4ec7d45997e3bb7e9353478b2ea7ce423f3930611e50c8e3031393ff8f8f19e4f13183291c02ffda1affe79615bb539615dbca94ab7002f145a6f399fb3199190c4e7dc087e3f2f41875a91523efd7c155b9618a5b534fc992ed47dd744a9773417d652a25dc6d245c77fc6d8900ec770faa396c001ddab154681700b4d328d17634a04d3598dab776e3363a9ceda9707e06aa8cc536e1cc8f25cead80754eb70967412c71ee0a70ceb00967bf58e25c0c70ee6113cefeb1c4097b2566da8473402c71de0870ee99099ce52850187d5eb21356945a50e1dc0794ec7bd984333f96384f01386751e2ec504766f7b68ef263d93eba1c64f5bd6d82596b3e470c605e0f60cea684b9651d30bd3eb33f1dca4e54283f06997c1f5b5016c412e59ec02ae7d882323f9628fb0294732951b697280732bee3875a63375e74ec96c955f055a2bb983f103f9095207bcfcbc40409bc4a847d3a96b0006a43857508c03a3f53b3e4b81596cb354c19b0c95954f0f607f04a28e1b501f0166d32597a16c0575a9fc50c14479a8d1b53a17c15a02ccbc4049ebe321b2fcb9415cea442b71740b780121d3f59200748e3d752e904309567621e7a891cb4d53ffea43425cda8b3a93016028c0b2931660969eebae8c5312c1cb604a016656a4ae2a6e1d1860374fbd66fb91af7c9004b41f36d717da2f46e0e428892acb27c114059918902a4afa725ac6e67287393d5f42680cc5d99098bc4ca616fa599d022c950e600944bec98e953fb9b77a4681fa542bb2fc8ec4ba9277d2ff4cc901c293a176aad928d415f4c13608f55f5012d8e1d588d01b4fdead71fc6bdb2733140b98c12251fe8f5eeef92dca7860c5b1f2a6c5b036cd599e899f6d38d05fba549474e76a5c23a1a1421cb6dc44a3a4c4a86f57b60ad2b28b1f662deb9e33c020b3c1b5ed6bd0d96e94305a4be750315f6238035afb469be19e90429b2f9660ce05c65134ed20952643877023857db84b32096388b01ce3536e1ec174b9cd500e7fe36e1ec1f4b9c27039c0750e2e4ed5935e0b51773172f91e1ea4285ab3da8301d68cf7cc7beb16c629e066cef209b60c671f2e8e900e6c136c124ec7c238379068079884d3009978390c13c13c03cd42698fd6208f32c00f3309b6012767f90c13c1bc03cdc2698843549329817039847d80473600c615e02601e6913cc41318479298079944d3007c710e66500e6d1b62c0721ad6592cd6a7b9d25511e630bca8258a29c0aacf2585b50e6c712e57fc02a8fb3736d0d61c59d6c6ac23280f5787bd6371016416453b5b60099fd04eaa909dea931856ca9a44186ad1515b686c0024fa4c4d687851fecc5be8b483ae0fb3415fa9380c59e64cf24ec3856e68f03284fce4465deef6e18849e946c2f8c22e0124eb10926a16592c11c05609e6a134cc2ae3932987007e4d36c824958f72483d907c03cdd2698845d73643087029867d804338e9b31f50730cfb40926e1103019cc1d00ccb36c824958652783d90dc03cdb26988443c064307b0298e7d80493b0838e0ce68e00e6b99980892d72d167c0116673b2f96fdb0398e7d90493b0002283792e8079be1ddb42106670b26d21ce01182fc8c414d73ce131537d8f638eecc623ecf724b3ca5e00e7859438b762de7ecf452cb939133e7219bf11a2bd4017dc45b601252c84c8807e0a2cf462ea49d8de018dea180ea565015c976462a9befbad1a751c23edd0fb2d9ef10ceec446ec2bc92c711a407ba93d1b4a10f660928d52ee0e505e46ff7d7a778b936a96fc1653863637e94105f06400f0f2cc0ef356635f0b8c4175a705c076851d1b99f05173fd934584dd18649f2cea0d2a3e57dab4133fe9c200b28e8ca9c052afb20927e9278bc8701e07705e4d89b3b3ef8cefdda88c126a8208ea7c90e5afb1112a650f2615d47900eab53642a51cfda182fa3ec8fed7d908957214880aea7b00eaf594509b392715ce6dbe3f2bfca066fcea9f6d01b21bec99e84a383a4ed6846c08fce48df53938e14549ba3e8d0ce6e1c02e6fb20926e12418329847009837db0493707a1619cc4300cc5b6c8219c76eb7c300cc5b6d824958512783b91f80799b4d30099b926430570298b7db04338edb352f0230efb009661c3f18530560aeb50926e13200329847029877da04338e4bfd8e0230efcac417f306b04df38b794b01c8bb33f56937253543f0c826648d00f0eeb167f95e1c373639167469dc9b890cdd7f13cdd08b814daecbc4327d35098b77ecae020ba137ada958d3817dde4789b5a5c4ea2e8eae00de7291131d32705954e018b0c7fb333ded6086c3a3d08976a9a80aa9e32827389fd7b1922d92d3624887cbc8361dbd0ed8e40399f8fa99d92609a70a36a342d70058e583367e3780748f18b2ef06ec082cf2211bb19276b791617d0958ebc3f539fb32fecbf7ba02948fd83b0b8e102dd92cb87701da476dda819db4f38d6cbcfc2380f3319b70e6c712670b5034adb70967412c718e00381fb70967bf58e22c07389fb00967ff58e23c18e07cd2269c036289f34a8073834d13b249e77590d541678292fd299b70e6c712e78900e7d3b6ecf14a3a7d8bac97f35b80f2195b50e6c712e52ec0673e6be776b9849365c8d6f84e0116fa1c25d67c167eb3d222e7378f007fc972716549e6362d7d822a090e0496fd7c262c1b6e4331c509ce058e679bda7614bd8165bf60cffcf838cea8fb03a07c3113536df8126bef4ae14d6740793e80f9923d931ce2f8f9b055c073be5c9f2833b654701615ca1b00ca572851f6d0ea010b02d500369d6f531f0a80bf4a09bc0d28f5b99079425086bc2859e97e1df0a2afd93b0d82b0778a6c1ac435c0325fb7676f9a38aeebd81958e91b99a838c1aafde89ad9787012597cf74cca0630dfb463a8b958f84f6ebb0b84b84a5a3b7d940aedfe20cbbf95c99de64a7c4c6f8ce3c79d7200d0b76d034ad80425033a09007dc736a0719c80db08007dd736a071dcadb30300fa1e25507e52e968cf1f8f5fc5bd1d28c5dfcff4f6297e7af1098b1bb25efc8701d40f6c841ac7a191f500ea461ba112163b6450ef01503fb4112a61d14306f57e00f5231ba112ee634306f50700f5631ba1128ee29341fd0540fdc446a871fce4ed1700eaa7364225dcdf860cea3700ea67364225dcb3810cea04d046fabc7ebb96e33ef67915b0cf2f6c9a924bba010659b3340b58e69736e1cc8f25cec100e75736e12c8825ce7d00ceaf6dc2d92f96380f0038bfb10967ff58e23c1fe0fc3613a39cfe66da91cebe271b322e0530bfb309661cc7df870298dfdb04338eb3408701983fd804338efb2a0e00307fb409661cf7551c0460fe64e33619a44b6ec8b6c92801587fb6112be9a23032ac3fb324d65f28b16e6bc06a9ec734563e92b1efc84ca182db15d8ecff6c864b589d2283db06c0fdd566b884851819dc3f815bf8cd66b884d52d32b86f01b8bfdb0c97b0c94a06371fb8853fec9898cb673ceb7b40118e4291ed013517a0fd937a9bcce4f6ad45ce71bec3a29c4d701e29a70347b688a115c8f07fd9d4c547bac5065917df3f00e7df36e124ede423c3b935c8d6ffd884b320963827039cffda84b35f2c7156029cffd984b37f2c711e0570b2cd2cc2392096386f0238139438b737e0f45bdb84bd5484437aef50419e032037880364c2d95064904701c89bc5013261b70a19e4bb591272c3384026ec5e21837c13809c1507c8845ddb64903f07901bc5013261173719e4750072e3384026ecd52283dc0c147c4de20099b09e4c06f92b60c94de30099702c970c722f60c9cde2009970251619e4ce0072734ac8c136a425740a648bd4df044ea1852d28493b1dc950ce0456d9d21694a4dde1743bfb0094ad285136774ee63377ff8952e761779bae1246b891420f2a68db82acdc9a125afa1b22c771d9ef6a80b54d264a74b52f0a0fcc1faf627cb0daff1673844d59b2d1d99120c36f1e07c871fc9c614f00b96d1c20c771b3c44e00f21671804cd8bd4806b92980dcce96aa16e93a57b2aad6ff40f1d6de1694a46b5cc9508e0756b96526509630f362f68c4dcf24db7dba145865074a946d254a6e75de0de633b42132d94cc1e90061c7faccd8501ca935922d277a0ea0dc8a12659e56a6a7f34d9471ceef72c796a7384279e433b633fa8354f82b805fed4489bf9173b252cc8859212e90a1caa642b539b0d4ce99f09bb53fcc1177bfb91b40d8851261bb3a4a71a52969a69d4d857124c0b875fd163fae2877671fc2262559a6ae02fe6f1b4a94b95af113ec531c9be6c7b8d600f8dbd6a71d676c411b59a5fe5a80323b138513fff841a5289ce6898f2064ac7022ebf8381678d5ae9408b30dd658970380c327a4999d6c08e50a60a1dbd5ef100a1498a1d980640bdc0f0556bb3d25d6f6126b3fe727b9786d3cdb543e1557024076a304d933544da0507c926b99739ec1e6e7d354d08f074e6187faecd6f376a410ce8e22eb485900ec77474a946a939bbc5acdd34dc7198c0730bb53c26ce29c2c9259be484e2323c345b64ca819c09553bfd938ee0dd22b01ca1ed415f995cecd6ae7366c684e643333335987cc1a3b02843b5122545b24a892bcccf811386c202e8e1f32ba1ea0ed99894a7cd02a3ce99c3cb24afc40500dea652356d209b86458bf03d6da3b138b81f126e7746d3a0361d1d4820ae75880b38f4d3849375224c3b904e0ccb569a93ae94e7f64a57e02f8d03c9b7092ee474986b30fc0d9d7269c05b1c4b907c0996f13ce7eb1c4b902e02cb00967ff58e23c05e0ec4789b33babdd7ef74ea7e52da74ae73fff9bf780ae1022939fd72e16d43230e3693815ec9d40b9df9f12367fb577882e7e8372db0058036c99424b5a7d276bbbbf06500eb40565412c514e01fe72902d28495b4164287f075639d8ce957571fca2de2a8075883d339409778e221b58db1c64f69d2951b666c981b53251a7acccd4401ad9bca45d801d0eb567aa22e112986c2a94a7023b1c46897273969ce951ed997794115b249b817426b0c5e199286ad4b81047565e737b535bc15104ec72174aac5d0d599c4762b9b0d0256c57d158ac4ad9554c0898aca3783360b723ec992413c70fbe4d062847da348441bac095cc32f7053847d9849374912b19ceb300cec24c4c5ca87b06b2db1de7fdb603e1fe0c642b8fba8042aac8ce1176428b251b616f0bb08ecec4ece302b669ce3e9e07b2fe189b3c695fcaec4ee64927029c636dc249fa6957329c07019ce328716ee19ccc332e7a291602ab9cc7e609e1f16b7e6e05208ea784d899e9d3127931e30ad9d41a9f9b810268d74c14400aeaa294e343f12b80de01d6b99b2d20e33845f6060072822d2009f7ad2303d91164ed89b680242cbdc94036062027d9029270508d0ce4700072b22d20e3b8076d0f00728a2d200937502503390b80dcdd9e615ec2cc4d5693fc1b94db53a997fc5538b74bd862a79dba82b635433665700b806b5a265a33413bd4e2d89df614805a6c2354c2f91b64509f0050a7db0895b0724e06f53e0075868d50092bea64506f0550f7b0112a61c70619d45b00d49936428de3ae333703a87bda089570150619d4c700d4bd6c844ad8422283fa28803acb46a8846d2532a80f01a87bdb08358eabd51f0450675342f5bf392aa16d926d8e7a21c0b84f26ba44f0a1dfb80f651c0850ceb167f23661e6cea6427908e8a89b4b89927f75ab44eecbc5a76c55d4dc8a5f975c1b607ff332b9910f2f4656b1192cb95d792a7b24ccda64f67801b0c7f99468f99c946a5625666d2c727e57b051021b9fb8153f6c5d80459650efcee5dd5c6fba23b9544e7e99c0dc397015312c545a0284a594083b69999a7bc355b296e8cdce19eae2984985741ac8cc6576cc1b2e164079ed72811057495b6e3f4a85f6048076813d6b2f080737c84af38520e397db38059b74013559b3717b60a10b6dc44aba5b0219d61781b52ea25ef59b9cf23a413cb898c57b07ce0e00debe366dcf433a9b9d0ce72700e7629b7092ce6627c3d91278cc0a9b7016c412e71880b3d2269cfd62897321c0b9c4269cfd6389f3708073a94d3807c412e7550067954d0bab48372d255b58350794ecfbd9849374d352329ca7019ccb6cd997ab6f2c67167f095056db82b2209628f7063e73b92d28f36389726780724526f6e272bf12cc412ad94b623b9c9600597aa59d5bed110ea5916db53700605d9589c52cfe0a9df865ee7b01c8d5b6808ce3bc8d3b01c835b6808ce312d44700c8fd6d0119c725a80f009007d802328e4b5037009007da02328e4b501f07200fb20524619b9b0ce4b300e4c1b6808c63dbe61900f2105b40124e342003f9320079a82d2009574e92817c01803c8c126423c6c7c04b84ee7c5e5bfcfac53b035487dbb3109fb0ae48d64df13640794426fac4f3c46f757423339ab9fbafab3d2fd54ec3f19b1c380ce03cd28e652584a533d9b2928b00c6a3ec590b41d8aacea642b91a74e21e4d89726b8972395be8dce6a36dfe27ab12f6fb904d563d0fd8e83194607b33efd4ea054ea00a216c190a39f98de971ceef722749a638e2c40412cfd384e01fa402bf0858f4b194e0d5a719788d7253fa34c3a9c0728fb3679a35612f3a59f569304079bcbd8b0108d192f9d765209b9f4089b65728ff3ac1f9599579efba9e0afb7e00fb8994d83bd459f5f23a87387ecdaa00c03cc92698715cd2d21fc03cd92698842d2c3298dd01cc536c8249d82b4f06330fc03cd5269871fc6a503700f3349b60c6719fcd1d00ccd36d8219c7bed26d01cc336c8249d82f4506733b00f34c9b60c6f1c30ced00ccb36c8219c736fd9600e6d936aef1259d4d4cb6c6772cc07a8e8d58492bf264587f6249ace7dad10355c86a7fc68eb0264af619bb4260b1e7d9b49a8db42e4a366aff2fb0d4f36dc2991f4b9cdb00ebbcc0269c05b1c4b93bc079a14d38fbc512e71280f3229b70f68f25ce1301ce8b6dc2392096386f06382fb1659120693b9e6cdae21ba054bfd4169405b144390358e565b6a0cc8f25cad600e5e5d45b47aae98cde2d2433344b84acf5930f32f615762e60251c2b225bc07a00c07aa52d999c74749d2c93ff08505e650bcafc58a21c07fce5d59958c5c1516d8a9f96df15d8e4359900d9771305390e80bc9612642ed3b723e79b50782772fd5f9b04b61cb883eb32d1a9ace0cf1708cb6a3ed598baf1498896ace9791e407b7d261cc4e04dd44114030771831d4b6d085b4a644b6dce07186fccc46cfafe6cd39a4d7f360078933db3e9e33829b10ca0bcd9a60dfa486785906dd03706e0bcc5269c05b1c4792dc079ab4d38f36389b302e0bc8d1227d7804f46a896d51f5e912f929313e2577f6c0eb0dd6e4ba707a97f24ab41be0250de610b4a52df48867237d0aa596b0b4a52bf4886f237609577dab3b9451cd765b402567957269a88799eb6b6ba9da1160edd2a3660917767a237a8ae2d04c6ca07e0b810696fd0142ab40301da7b323171db5fe391748631999d5e0160de6b13cc38faceab01cc7536c18ce39ab6cb00ccfb6c8219c7356d970398f7db04338e6bda2e01301fb009661cd7b45d0a603e6813cc38ae693b1ac07cc82698715cd3760c80f9b04d30e3b8abc73500e623f6ec4e475865cf26b34bd0427f9412656766da7e72aa10b654b4d8379d4d28f704f6f91825d4d6002aefde28176df68c747690ada7ec07e0ada7b7c8d135bd4585624cdcb5bdc502e328b14def622992cf2ae21fa12f8d619f666b00f5f14c4c32c8dbc426191c0f003e61e3e269d20a3b5d6607c5cf933662255d134486f56b60ad1b6c1a29279de74e36523e17e07cca269ca4d577329c67009c4f53e2ecc16ab785ea9a490c3f455f28fe5a09a8910e72dc4605fc0400fc994c0cc37917176c2ac3703300c667eddde983b07b846cad5b73500f78cea6e5d5a4136bc8e6287d082cf5799b7092f68492e16c02acf3059b7092ce5522c33904e07cd1269cfd6289b30ce07cc9269cfd6389f32080f3659b700e8825ce0b01ce57ec6ce113b6a1c85af8bf8212fe559b9aa4a45ba391354967039cafd9849374860819ce9300ced733b1c6121bedf45a66fcfaed7b00906fd802328e93bab70320dfb405641c37f6190440be650bc8387e243c17807cdb169071fc48783500f98e2d20e3f891f03d00c8776d0119c78f84af0020dfb305641c3f12be1c807cdfce2dd0088b1eb22dd02601ac1f646232a2df2e0ec296385907c70700e6469b60127e628c0ce64600f3439b60c6b1ebed4600f3239b6012b6c4c960de06607e6c134cc202880ce6ed00e62736c1246c9193c1bc03c0fcd42698846d2032986b01cccf6c8219c75ddeef02303fb70926615b880ce69300e61736c1246ca193c17c1ec0fcd29e3d3ee2b8b4fa2f80f2ab4c2c76e11bee2aa9199a5248b6f9e3de00ded799989989f51415d70025b441328c17008cdfd8b32090b0cccea642793498aff16d26fa2ebd5bf6f0086f1adbe3f60536f91d25c84eccbb85339f09bc4af6517aad13f65b12766890adab9c086cf3fb4c4fc09ee1f02874a25d2a3ca83a8e7282f3cf8eac647cf1c00a46bce178172ab45703b43f6422db0fda44b3fd1a90ed7fcc44518495e8de9a651c77f3180d50fe4489726ba66f7be63fb313f6659265f68301d89f6d051b472fda1d80fdc58e1542c5c2937207b14088aba475068f52a13d0c1450ffcbc40af602b669ad603f1dd8e6aff6144c71dc7fa61ca0fc8d12654be7c4fb51bbe47615d5319c78d00880fbdda6b515a48b00c87a311b009ff8874d3849d7a593e1cc0538ffb40967412c71ce0638ffb20967bf58e25c0970fe6d13cefeb1c4790ec0f90f254e7eb24856cde387a92928b1ffb571f91ee98a72b2e57bed81f5fd672356d27d0fc8b03e2dacb57196267c4c2de185c283711f5622e2efb654fab0b1a2725d26909438e71344b7c57236d70132cbf91f2c2d663bff4dd713622c73345bcdaac4552eaf54c8ae74eef29855b3bc9db839386a346a2e4d2327c1ff2a910d021ecb8a9a74ce49f0aaf54af1ec0a79a59973a5c2b9c277b09be1b9d304dc511f7acc11c82a6bce7898058e74de2bbb1773f717c9496409accbe4be7839428f79e02b9c9cc56206f7d0c949b415315bc6f8178792fbec14396f9ea985dcc2230dde2b16c4ab1c09f3406c55fc78922744c39d335ce23c3191f19d23f9dd79e258ecfccc17e99ddbd3099618e0fc72bba2fad47442f591bba954ca3375bd6e993c8d534be3d16d9430e7f18ac8acb32e8ddc0cc59f5f2052b04c481d5fa7a675eb875b7a8b14a992db8ba7c5a6ac7f039eee32d9859976109978ba93f2a5d294273b814b45a4f8bfacff078595aae408b50300 serializedProgramBytesString: - serializedSignature: 121c3e86297b3217d97d6992d0d827ce606645e68d39782cb0f9adf9ae9126703cbf2e5255aa7655141dc2858e3147a2833b74fd533aa600f8ea956c72805509 + serializedSignature: 47062d3469f3da32c677109b322f68585121bafad15166676b8e5607eee3beb2034ebb89c3a900230dbc45204d91e796e2baf9ee9f0c64850f63b49d4e1b6004 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset index d825a5a..fab013e 100644 --- a/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset +++ b/Assets/SerializedUdonPrograms/3053cc98f03a13041a10e0650d9b6e24.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a5f6f1b45109f737cb6e338b4a5405a28100aa8416d739756e28107a4366921a24da23ac94b851227be44063bb662178a105f80cfc017e18d473e1452f8cddc5eb377b79b8b939c4b426de5cefb6f767ebf99d99dddb6e0113ece1d3cd6e919cdd32cad5193bab4875ff37877f00d4b51fd0aede3bd8b67036d77683a63247f6e39d7f05c44a94f038c7c41db78b7a4bd4e017e2f626c8012d7eee02f402fa788416bb440cbb44453cebb1922d665505fd5398ccba9e0f9907e416b204af1249e344de151474b5fda3a503aeaf79cbe17581db46d63cc3eb521734b2456fee6b182297a5189ebb5b2a3feb87e5c2b339a3f12fd5cad0f69fd786c5595c7b47a7e1754fb44a25c53f2fe52f565831e25bdefc1c1c13fae232c7f0bdc0dea91c7c29c2f8670876864b623889e0505f4964c3b00e53d083058634d6c3da0fb74cf688deb4e4dd37b5e9e0df46889509e2c31c59fa92958b936be81e64a7dd47f239ec8ced442cb2c3dc19b476dd21c9ce37942ca3aa66dc31d035ac5b327f236a176ba67162476bbe4986790194645073511a13d94dba2615d9e3f89a68168bf88ba81c4e81ea2f421de2f65b634f67dfc36cdb9aa2833eb680e0e5b7d18829199168086b5f7c4a7df58e4755884a92f4daa302c7ab2aafc9eb2c41b0ec345c6954d279431172ed1b1ba7be471d1a9a7181c1e631aa1d9bf97a1d90f2a468e4263e6860d7e57301cdad88d83ba4f1e6f12ce8d0c504751caf2660ceb7a96f2ae5bf459c524f58e897ad9e25647483db775454a037d87279f69bd9d203fcdbe5f52dbf78ce44dc3aa60a3b060a0d07755f6927289f184525cb2081e33d9a632eab008fbb5a4dff0961997a424ce81c3cbe40a0a0d0c61b5a665df99a65fc9a7df2c76ab5a1c3f4b3d9bd58a36ab4d9cd26aaec96a92286ee66ab5284bac231df80e6d0df40f64cbe17a9dee0732c36166191f71b43d6bc759e6c4609362b0cfb49cf7b49ad94c59b299f2ad539ab26c12cc0178c9e4d5572d5ebd07ea0602a9213ed94ceb50b5eb50b1e970d9a4c3d7afe88e53b7447c94fb598cf8a38a9659dac077575a3690fb75e1642c48c7c03d4cf26ca61b06d9b80dd91513b2af2cc8d6247cda724069a92061ad17f1eb9071aed11d5adf2e936df19d601844551ba2b74d88beb420b2711bb75753bcaba77a2dc9ad4190c2a2af8ec32099b021b96af33adbaca1d68fc5f33a1892e65bef7d7c2b9d1459cd86ec1d13329ff8aa644f1d7f1fc96c2d39332de06f0b9d22844fe4f666183f5bc708fb6a50c6d771d80e8f648bd8c7c81519c1a53e79e26c3e1dff4a81e7ee401ff6ed5540dc121fcfbe60e00b22db05c34e6a4b3be959330b45781ae2f13b7221119d5f4ce8b231d9cfd56585289205a625182e1ad2f7d8aad1fd58c193b0b87d426fcad682f3b6d298d98786cfe94201d19ae7f0febf21c31be832c8969f7558ba2b02a263d819dca9b1533d00314dc9a1faf8f287433c21fcf19979d9c992f8743c5c9215e825d4eb0ab9014024e28333bdff9ce6d774ff9e49f9c8e1f26a5e167d5e5eafffcf573e9ff9799f49a8440b85cf0bc507794673552cb5a122e5053af1d6e927e739cd25ca782cbecbc701719218977f2d7043ca6ee449d984a2aca3266e4896982b696e5ea41534d23e7c1da4cd9d43d24a1a691fe5495a4d91d652ff60c827a4edbc7d6d322fda5c8db68f47b1a6c58f3a395256cd8bb2b246d9f42828ebc64e50e77145238db24ff2a4aca228e30c6717549d4fba8a1a5d3747e1613bb1bb89f318946374610e133e2ff69f52f8df2954e870a67e4561e1ede62905b2f534c5640d2d6bf7f8c657bb583bde31f66899d92935df71bf3a6a246cd03e331b9cc531c184f4344786da1156f1d8d8171affe749379d92a4720d960f8507b48cce4d518a3feebf8d048bf718260000 serializedProgramBytesString: - serializedSignature: 4075346896eb7055d656aaab1aa5a84f44b8e197f5793b0bd974b191705682f850d6afa7c98d39304db672b189f33ae14b97d0b2597af7b9afe5561cf24dae08 + serializedSignature: 472243aada7c3a00c638915f161909aab1338d52167b5f9528cc5acbadb8cf98db5600e6382f605099409cf7ace5235db788ca50f3497a883b4aa2db924d1b0d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset b/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset index e606342..1ded54c 100644 --- a/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset +++ b/Assets/SerializedUdonPrograms/325baefe0e659934e9903e4b8235c861.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec7d079c1445f376efed91832051e2a1840309470645c9490191242a48ba038e709c7747120366cc593083398b39e79c31bde68c39e7acdff44cd76e4d6fd7eeccf6f432c3f7871fccf6f4ccd3554f5757e79ebc1eccfa13eb6afd378d4d62c35977369515b365acccfa35dcba2eb5fe3a21b83f915558d705d6ff73acb8aeac20c39bfc4fa75873ebffb156a89255596f2e67f3ac6ba91d3f999558bfc75aef9658217e77bef5afc47a2a966fbd34958d60fbb009ac59ac49068869f64b95e25e8ceb15ab69fd3f8cadb6624b6ca178223deca866d67f93ad984a3b6ea925343c77209b69abb5d48a9b67bd53c1965898736dc49ab32f63f60fe65cfa886b5f71ed6dfdab257ec7c5ef9ae2377e9edfe7dacd48f36c3ff42c60f6b7fe55b3fefd2ec2039c70cd11223cd009c71a4b18b511c66ee2babbb80e12d73dac7fd5ade4fff0207fbab806ce35f69ac0fb13852d9d63231c19f3de10cfef29ae43c57530927598b80e11f7acf7d61c23ee0d17d75102ff4d91de5f28ccaf6f89fb7fa330bfbe2deeff83c21c6f6432ad73852e0cf86d8064033d5f97f47cddd1336fa3786eb4f4fc3be2f97f51985fdf15f7ff13cf8f45f7f9f53d279e9b4d22cc9f1b9394f790b3256ef712d7bd15dc826da8b81d27d2f89f483386c2fc7743713f4f84c78bf8f7117e4371ef03f16c1c3d03f7117ff9f96efef29748b2c07b229ff3ab49f9fca1c4eb87e2fa8678be3a0a5bf8f1e71c9de3af3ad77cc8e309d2fb603f7fa1307f6ea242d78f90ed9c8eee21f92d6fe6c85343ba3f0885797c4d215f2b11bfaf3b2dcb7b25d2da70b2b837093d23c9c6a6487cd792f8feda9d9781e631e4413e0a5bbfabcf9670e0bd8fc5f3b551985fb7a2b4419f4f92f7ec78b8c7af9f0a9c3a28ccd31d40a4fb9994ee67e2b969e23a55c4d795e2f793f24e8e9f2eeed7f396e7dcb4edf8fd9df0d089525eb675f3cd0e10d7d62cd53f09ee13fe09b8ffdbfd5ca22e3ad0ad43227ea65b07d6c8c1a95120c250e7d447321c24ae4dc47556d266d7d614f7b2ad67663b3835c086c09fd561deea6091c7563326fdf3e930845d59ad83ec31ea3a3cd65c98e6d97ee85948679ea33f031e7b8bfcfd3cf98cfd3be6e0db79575fba5f4ddcdf41ba5f9db85f83b85fd37d3fe12bbe40b27ce17e27f62573fb842f1d396b174b185f31b71faa26e1417c0de9bdafc57db0dfead27b5f13ef7d23bd57437aef1be2bd6fa5f76a4aef7deb7e0fee277cc017cce5036a7515f1c54eb8f6e91e6c295ddc7c91cef7229d8628ccafdf89fb3ba230cf8f9f9df4ebb417380b44fc0f12ce0fe971ea8c4923632973b7634b246e7f946ce5478179ba90ed2964e73cfe27e6f68f25e83ec66be4c6ab2bea0f6853e6d561ee36d922b75c109fb005881f84d2c5f1220ff29a31575bc50ef3eb8e447a8bddf129e9415b698114bfd4fd5c5e7311df580a837f56e50df87bc88b9fc53b4d51d8e2ae7e4106eeca327007f1417107781477104f71b7ccfd5c56dc81ae3bb1a4dfce976cf23781d30c3d0bf779187c743e0a5bbf77009baf26e1fdc2dc6d985fdcb8792ddcf176985f5b221981eb56c97b763cdce3d7ba02a7390a73b90e1518d525b9fe90e4fa43920bec018791bf49a4d7424a6f23cd3f60834dd961e463eb836f2cf7c725ab48e58a55a27bcbc5b50add837aeb57740fdb806817f5dd2ce20e1671bf279fb7df45b661c7619b5de18f7b971e0b147aac54e801f5e89f0a3dfe4aa3c7df488f3fd1f31087f55825ae3524fc7f243dfe51e8b1daa31e500fffabd0e33f5a0fde0c49e8f12f7a1ee2b01e87886b4d377e5eccad871dce560f819d9797aa471e9409951ef9c9e7f3f2d0f31087f5106dd3842f6a88c2d6b38dc648cf41fb318ec2b81c024e23374e63a9cd95d003da9db589f89aeef83ce0a49624472d498eda22bea55bfe943a6a272407bc87e35bb9df4ff8aa8628ccf52b979eab27c90775ed6209a7911ba709f45f65bbaa2ff124c7ef20f124daeb790d2439201f8027180b90798278a85b774272c07b381e7892eac0bc46cc5d073692f01bb3a4df56bd0ff1adc5fd35c4734da4749a48e93495f4847628afd36aa167f8bdc358a26c3585b67ab66df32304761bc96eda886b6be66a53db614bb7a6a2fddbf42181b356c4b79570da66c0d99a46c62399bb6d7e3873979102e66e9f143898cdba3aef3583fe1cc4b773db1ae0d9f7315e23375e73a15ba27dd99fb9db7b47497289f8840f83f841285d1c0f793080b9db97a2ace50d24d25bec8e4f490fda976ba5f8a3ddcfe5edc6dced4b08fb689be7edcc5c6d733b6c71b7d37d19b83b86a5e70ee283e20ef028ee209ee2ee58f7735971779cdbfed83a96ac3f853eec04740fecef449628f703c518243b5ea4bb4bf279fb378f13637379ed854c6d50d8ca9b16b3d3c87892b842bb14ca4a07e6f6e31d44fc298af44f453a40bbf434744f60e77544f7209d4e495dfb89710226c69af30a515a1dd1f31087f30bc62eaa4bf89d253d3a7bd403da41580f819dd745a1c7ae69f4e88ad2ea829e8738acc719e25a43c2ef26e9d14d430f68637457e8d1238d1e4528adeee87988c37a9c29ae3525fc9e921e3d35f48036582f851e304faad2a30f4aab177a1ee2b01ef9126e5fe6aedf615e16eaf77ecc5dbfcbef433cb423ce72c7b3b3153c9c93d4a58d97ba3e5d1cc823fc4adeee429e5a286c3dd3e6ec3458e78a2bf8f241cc5d3f0f121862feab6dbe3bed3c310f9c2fe1d9f7315e23375e5b9893863a661873fbfcf5e83ec61d2af0da4a61f0ddd096dc53e0fd89c23cddadeee7d879e2ba41e0d495e2cf97d291e32f10f7a16ef552ef0ad912be5dc85600f5c38552de5c94b4195e45f36bbbad1236d8ec60097bb0c086fedcc512f62549ec2eeb086ca8778748d8431cec76c0c946097b5312bbe308099bcaf74bdd6993f95f9021ff874bf93f5cc8ba2df21fcaab94570cfa73723fe52291e608e6f24f09fb813507f01b9ee5d751cc5d7e4739b81d218d6a521a6398db878f9170c74af1629d41de68248358b390b797c4f95e4edabb88f1b35d664b793f4ecafbcbd07d2c23cc81b795c24d1cdc0e1f4879bfb724c7de8e1c1dd689e72e77f399c8871a19e483f706b9e313ef41fc62243f8a074e13ef8f97f21fde5f22c5cbf85748f601f8900f1398bb5d3dc1cd5b8a3e574abc427ad0fe827c9828d9c244c956f665ae7e7d02ff2a291ef0af763f973789b9dae5becbe824225e2ea3b25e9325bd264b7a4d71eb95e0798a1b37257f47a2fce5be1bfc3be507a09d11840fd92464803508b20f99c692e5771a7a965ff7636e1fb29f83db05ca6535298dfd25fef697700f90e2a18f331dc9305d5cc57a8244d93dd049bbd33827dd4e60535046674a367d19ba8f659ccddc3e04c2c2877481f94af021332439663872747e4e3c778d9b4fd287c8f2c17b83dcf189f7201e7cc826773c709a78ff2029ffe1fd2552bc8c0f3e64aa840ff9308bb97dc82c376f29fa5ce98e4ff121900f73245b9823d9ca5ce6f621807f95142ffb10f15cde3ca6e743e611f1940f01bd8a25bd8a25bd607e127cc874e97e3df7f389fc9d86f297b7a336207b33ed432e1132cc676a1fb28025cbef02f42cbf2e646e1fb2d0c1ed0e7dfb6a521a8b24fe1649b88ba57868939622194ac575097397dd254edabb8af1cf5d611d0a94d132c9a62f43f7b18c0733b70f81b0f021dd619c1b7cc852498ea58203182fbfd6cd27e94364f9e0bd41eef8c47b100f3ee412773c709a787f9994fff0fe12295ec6071f325fc2877c28676e1f52eee62d459f2bddf1293e04f2a142b2850ac9562a99db8700fe5552bcec43c47379554ccf875411f1940f01bd964b7a2d97f45ae1d62bc1f30a376e4afec25a05e143babc83ec2d5b1f228f3dac64eeb18795ce333d1aa4c1ba8eb9fdc92ae6f619ab04c61847ee1e6bdd69e7ad66eeb187ebd07d8cd748c2fb99b9cbd721923dae47f731ee1ae62eff10f632e64ef95ad01dcd1925b885740f632eff9b7728bacfaf30be9e8fc2d6efbe55cced6b016fad64676b25dc23a5f823c5f50824630d09f368e99da325cca3dcb69bb09b4392987947a17bfc7a8c78a71d0a5b7af52c773f0f73dfe4f31b91fcf8bdeb99bb9c4279049d8e95743a56d209f27f27373ebb41848f93ecf346e6f673c7bb6d21ef78f41ebfae93ec779da34faffbdccf25c6674e10cfef8cc2fc7aa2b8bf8324df89929cbbb8efdbcfd572bf033ad8ba621f0aba0d42616ce7f2fb4769be7face6fb6b34df3fd4dffb89f4ea6578be6586f46a67f9fe1acdf78fd57cff28cdf78f70bf0f653051c7013fa28e2b2a64497f8bd3f153c7816f3e9925cb01b4354e11380d51d82a9bfd9648cf9dcc5c3e20ef64b73c79a74a765685eef3eb4922bebd847b9284bf8ba377bf93dd388974241c78df5e2f84713a48f10723ddfdae553f55e2f134e6aea74e7338eb5fe8c8de7fb678fe14117fba9b3bc0cb3b5dc26b24e16d70e3309c7f2a7921bd33a53c3dd3c11bf0bdf4dcd9529ec2fc0a707d966463a7a1fbfc7a8694a720e778148fc20c6ca4a3c403e09d23f17a8e90fb73f7f309f9ce75db1ce02470d74bf29f82dec3f2c9cf7774f27120b4f94e53e8856d107032e54f3a1b83b1a40d0803d23b8fa5b6a9c41870def9ccdda63a0fdde75768abe7a3b0f57b77b17e35d1a6023c18ebad8dc218f762295eccc3e45d826484fa7a63f25ede25e81ebf5e28709aa3b025d76e8f098cea925c9ba4743749725dcadc6d18987f39514aaf8594def7120ef05f2dc911c425ecee3ce6f2d1030f45eff2e78ed7b003211fbb49036333c24a8701cf43f9b85923cd5b10969734614ddcad1a69de86b0bca429d637b0db35d2bc0361794913d6c8dda991e65d08cb4b9ab00ee36e8d34ef41585ed2146b2fd8bd1a69de87b0bca429d679b0fb35d27c00617949b3485c1fd448f32184e5254d588ff2b0469a8f202c2f698a3528ec518d341f43585ed22c10d7c735d26c27ae4f6860887e277b520383ef53e175eb000fcf423b8dcf09e1f618cc275e26eec3f81bb40bae40f2c1bdcde81ee05e29e16e46f7f9f51ae66e23f0b0f57bf83a0907debb99b9ebe29bc5f51694368c8b20ff9e770bbac7af3730771be00627dd61e50e77c36713e9df2ea57fbb78ee6911be43c47742617ebd4ddc2f44bcc27d7ebd4ac4774661cced4dccdd4ebf49f054e09637817b85946e6bf7fd447be20ae66ec76e96e23733577b63e8d5120eac8bacef4e9f7590f0c5b8087bc61dcf9e658936cf85274b985da4b43a89fb79d27d18bb015bdb1985797ca1fbbd449e02e771e6e6bca364f330867f35511654767f2d61f7303e4ed8fd5eab241c78ef4ec9eeee0cd6ee472e74f260af896efc8c767d9ddbae13f90ee37f77b9ed9a7594f482f8d652bacf31f7783cdc7f5e84ef91e4116d86bcbbc5fd5d5198bff7027397a3ae286ce93f1afccd8be20afbbfef48dae720d8bfdf09c98ef306e66e602e04ca108c913643611c2f8f73c9ef433cac91dc42e4d1bd1227f78aeb7d521ebd84eef3ebfd229ea1307f6e4c527738e724611fc0ebcb22fc80c4eb03c29ee11c8557245eef4a62ef0163d1a0cfab22fca0a4cf83e2fa10b279f0a78f209b7fc8497b0cc80abef0e1649a63608fc478290ee7ebc3e2faa8943f8fa0fbaafc97f5784cd243b44df2505bc3fe6dc93c16fad860af4f24651e0bfde697a538f8cdaf4f8ab4bab96dc9becfaf4f49b6f894646b4fab6d31f13ec4832dbe46d8e23392cec2efe73debb6c514ae9e93de136b45f29e4779fe3f840571fcfa0273cf2dbde0c18e33d47723368af8d7c5f50de7fe20e81789fadff6dfb5d06f6efb7026d09bc2ce717f4cf50e8fbb07950b5867f9963b2f12b2421dd34c8a87faf03a29fe5a741ffba59d51189709a82b9aa2308fbf2f29e39e620d0683b39cc0ff83cf8aa33096fd2609fb2611ff00c2867542e9daafef4a3abf2870dba0b09517e3a06df181b8c2594ee8fca0f1b057f043717d87a56f8343daa0d31629ed2d4edae361cdd7c752da9f207c389fe6d3a43cdc44ed7b5b3dc8530da533c5e3f3ed8938ccef47924dbcc4dced9697848e570b4ce017ece065b71d005edecb125e2337de04f075a0cb8719f2a29384ff0a73b79744fd93f72a4b6d2fbd96bc97f72abac7af701e571d14e6f2dde5c6cd281ff0f73a7a0e3882b39ae2e819b8cfaf70fe563e0a5bbff781318b4ed27b94ee6f29747f1be9fe16bac7afef48babf23d2153e14d2877413e500cebb123e74c273cc1f57e9ecf11389cf77256ede75649c28cee99b08651ab88633dde26ebcbcf724bc46121ef856b0c7ad1974007ef1d95d9f4a3c7dc0dcfee203919638ff65dfc6d27be3d3bfb7af58bf0e6da2846e70d6556d14e6579c0f20ef47c97b791fa27bfcfa3173f71d3e16e9c25a10e0782bc1b1f063799f20fb40f2e66592f75385bc9f21793f45f7f8f573c97e3f77e49d54e5c6cd9897c0fb172cb5ecc2994a71f40cdce757382b291f85addf53600d9f6c137046521b14b69e9f2ccad2e442e9bdf119de83fab950928fe2f81b05c7df228ebf41f7f815ce1e6a8ec25c3fc85be009ce40927982391038db48b6891f32c8fba342de9f90bc3fa27bfc0a67e9d441612eafe8ff42be807c897cf982b97cdaa4756e3932da503a9f066d69c8cb5f99db07fdeac83815e6df616c00ceb189bb71f27e9370f251985f7f41fcfc22b037b8b1135870de496d1486f7acfb897599704e0b2a8fda3cc0192af9286cfd9ed6d8c98369d0de013efe24f8f853c26b24e11de34e977d9e410799a3bf248ec4192b79e8fc95846dfe83b8ff1bdde3d77f99bb2cfdebc8b75f7b7ff241fa296328705ff497f8e3b8af6587f973ff31f718ca7f285dd4b7d4cddf78cc9dbf7698eb2beabfe9d05f127cc7f3d4f91bcf93f01ab9f1a6435f1fea6eecc73de42f83b25f3bcd3be9f486f32bbecc906e3a0c58f3f7950686f0dd0cce1dfd0e61093fcbbe6789fec76ce8337debf0b8ffc9cefdfd37a649eb47771edb7b0e055e9b8969de0319a12df1934246f03169643ca0c8b97fc08834697511f909f386c22f26d637f99519f6e1fea69019ce7d4a27f35621f3ef69d2fad379662eb46745598ee70b5d764461ebdf81a07f3374bf16facdaf71742f2ede13fd9a783537477158ab21c6e4e3d5457c0f14e6f1cd111e8f2f72e3f32d40f67330960ae749c96334140f621d7c625dbecfbc8ac5c455f88c9890270ee71d817ce0f3505ec6619d629abc9cb1d9b93fe3315a96185c61ac6f73126ff78d22ae9a5b3e764bf29941a25f10139cc740aedbd033a27d1283f614aca9f3cb179ce30be7eb0a1f18afe9e62b06f68ef982b4d3f035f303e7fecc9f695962a2fe8ac1bc8b8a2f381f15d64da9f8827333c18fabf8da51932f480bce53427cc4608d7b1a3e0efadeb93f2b9f4e2b06f509cc7ff9955194d118ec45c232423d9346c659a2ff3feb6a3aad18ac25823938bf328a353a31581f8465847a398d8cb345ff7ff6383aad98e82bc19e16df7e1fda09df39d7387f0eb7135a4bf170f6594f14e6b2822f847361dba2307f5eac878815a07478b85d9293c4bb3b277538f436428e3a921c751c39e60087705e00eaf72979e8e7f1b9741c7616328873d7a03f1117e7aef1ad8a76bd07fd5e215b6c970c697646cf715d7b6bca574f92af9e906fa3900fe651803b389731837c71383fae0f0af32b9cffd61785f915ce8ddb11852d39e64d94de87f3dffaa130f53ebfee9094d7fecd31cf7663c6daa3788ed11f85bde8ec85e74612cfe2ccf362d1ef2e16ed899898478e75f06807b0a620dd9a182ff23596e46b2ce413e3dfc55b24f93a79940fd636a43bb3c64fdf0acedd6b84c2969c25625d8fdcc789c3397cb55198cb057a8b3380137d455177c40a59c2df94c09cd814292e0b7d625d1ccc29623cde1e57b0e49fdfc0b93f3fdddc85ac1b9c1b0c6798ee8aee4b7e3426fa9c2a3f9a781ece9ef2705e49ac3ba18798479cff751a0c590f384b17f4e881eecb7a403951e901cfc3d9535ef4e8a5d663c146e7fe82dbd260c87a48e721c77aa3fbb21e90be4a0f781ecea0f2a2477fb51e0bc5f8dfc243d360c87ab494f410be2536505cc1f7b662aeb672bc65aa9ef0cd11959e091cf4ad8904c66ee8199e465d291eceb3f2c2cd1e6a6e4a8f71ee976e4883217303e76a0237e29b43b1c1e22afada71383793a1f7646edaa6e106700ad0f38031043d83b981f8a13eb819aee666d146e7fea234f61f833641fba48c297cb593f812fdf7d84837461cce9b64e83d99af9dd3f00538a8fd94c018859ec17c41fc681f7c8d55f3b5788b737ff1d634183237ed256ec4379662e21b4bb131e239a8e3197a4fe6a6431a6e00a7237a1e30c6a1673037100fe70c79e1469c25c4501ec4f651f3b514be55217f8f06b88176436d14e6cfef9bd46fe9f4cc32d9b2f0f7519d1d13df3f8a4d42cf20dd13f170f68f17dda730d7dae498382f871588ebbbc9f4136ba1df43f7842d329857b5b0c6419f5fecc98f7746f907ed17bc6742b44fe2684f437c57748f5fa18eaf83c2567e94fdecc68dc1d922f5a4fbe2fb44f11eccdd6e823abb3b73ad838ac3385b97a45ecb60fce400290e7ee338386fb20d0a5bf22e137dba98b081d8fe12dfc0b1e0350e6d820214e6f1aaf1b9d66e59e2bd24197a0919b6a4b10b68b7b651e886bfad047d7568dff666eef66d6f27ad83c1cee0fb4c90ffd046e88dc23cfea1a45e838788770f94de853a74000af3f847d0bbe0436648ef42ddd3078579fc63c9778740df16ca36f007e742d646619e067c4f50aed7205eaef3c1defbb09432c0505949e94300678d50d8e2b882ea43f471cb9bf029fd50de42fe103e25112ffb14e87beea9c01a859e516149f556e2fe4ce2bef886561cce48ee84c2fc8abee9171f9cca23e0c4459b2cd157ece7f05729da98b159d2f3d219d10979e61072cecd20e780a44cb1d9280d88e35738b7b92d0a13e53d364f5c613ecdef98de7ce6de9702ed941291f610e6f61f431cbeaad29c7f02ef266c762873cf290e1518639cb4abd68ae7453b200e6d1d092f3e4cc26b24e17d2e9e17e7c4c4164aef8f60eeb608ccc7789ce78895bae54ce00e17b8d0ff5e84eeabd26f9b39fd0487d026e2f7c4fc4a2ccd38786ca9135efa9087bc5f26e57d3b715f9c0f151f29e5fd4887e71575696c7817e6ede2a3987b5c7394c098213dbf38c3f362ee2626e6da62074bb2823f6128ec276fc5f903b1caec7113bab4437956e521cf96fbc8b395529e1588fbe29b3771680bb741614bf89569b063627f4bec1037560cceeeb1d25b056d1671264d4c7c5b223e56e2676c1a7e562099819fc33cf073b80f7e60ac00ec692f890f7176eb2ad1d7891d81f449332e96c005bbde5bc21567b1ae167ac4d67ac0ad869e3fd2e3f3e9e6d08183a3250ee03cd73628cc65057f091c1c958103c0050ec64bb8e31ddc43a08caef5805b0d3d7f8cc7e7c764e680ed2864117db7d8b1c82eb9ace22c5998c74984453d0ddff18cc3d9b10d51d8c25db350c29b88648635a2e29c80d871ccd5064ac49f8f3054f17ece6086b9837d9372d8bfb9ac62fe7b0dcc7f0fa19f3d345fe24bb4a5e270066d2f290cf3a7c017b4111ba230c7dd20e14dd1e06b3011ef872fe1c7e2539372c4dab9af717496acbc6e0b9e49acdb826fdb7642617e853367774561fe9ed8071387efcc7645618bafc33e27649a89e49da69629d1cf9d25c9046d5b383b55f47162c7a3fbc009f874cb6e0ebf5c925dec1388cf96649fedc80ecfa7c83ec787ecf324d9453b373e57927d1dba9f4676f00747807d9f809ee7d7fd99bb1e137df298680fc7e1acdf5e5258f617909f0d5198a7bb41c29b41db7f4207c2fe633b13f13eec3f06f5f989887fc89b93503ad2785cda32257c41bc98b9fb58c50e076b611e4e9cbb139f8f3810efc6f0d93a5847883f1dbdab8a1767efc44e25e2e12c24a91f6ec7832c504e4a243d4a1c3d8e14b67524f0aee264562a6eecac347a9f9341ef7333e8bd3e83de607f67abe353becd0db6b84021ebf9284e95d605196411df8148f1f3107f11f36cc770d6657ca17807faca30875eeacec3848d2e4eea653f63e5eb51df4befc2d9bdbb3bf97d34f88e4b507c2d84c7e3368a2b9c8b54578adf2461cbf1706e11e4c3e592dc4b58a24cee0ee35a629f5e5c9ccb9b3f48ba5f86e45c22c9799924c71249cea544bc2ce795929ccb909c30d628ce8588974b72c27d74265b7c9924e715921ccb2439cb897859ceab25392b92720e82b6b5d8971faf94e484fb5548ce0a49ceab24392a24392b897849cec4f81d9c9dbb87747f054b2d9720c3354c5dae36499872bc2c03b4eb574a32c0fd556964b836830c2b3dca006325ab2519e0fe216964b82e830cab3dca50209e5f23c900f70f4d23837c16ab2cc31a8f32b413cf1f26c900f70fa765b0f771a793e1308f3240dbe5084906b8bf360d0f376490e1088f32c0f8f591e2fe9ed2fda3d2c8706306198ef428038c7b1f2dc900f78f4923c34d196438daa30cb086fc584906b87f5c1a19366790e1588f32c0ba7238ef77b0747f5d1a196ece20c3f11e658079ae132419e0fe896964b825830c27789401e66860de0fce246d8ac256dbe19c0fc473f21c0d9c515a1b85f9f514243bcc17a1efcdc54f41f7f815ce0dad83c2285dc04d996381fbd0ff8336722714e6d73350daa29d1d3f1ddd83b5aa50b79e958c4b99938534a1bf778e94a6680fc7a1bd5a88c2fc0a677dee81d2c2797bab3bef12f19ba4f7e5f84bd572c2191af1f5929ca2dd1ddf20c929dadbf1f3dc72a6d8e06d196cf03c229e92538c77c5cf97e48436fb0528bf443b3d0e6761ee49c8787b06192ff427630ce6612f926414678bc62f46328af344e3e25b0f29edf84de8d94b1c7b3ff56b22bd4ba5f4c499a0f1cb10c665e2ba91b9dafebc28d95897a0f85a4806cc179ccb54578adf2461cbf1145fb0ffe772497e1897b902c922f61fc4af24f8ba1a3d7ba5c3d7e9ad88f4ae91d2bb465caf4518e2fc9238b47b055fa7c35ac74b507c2d2403e60bceeaa92bc56f92b0e578992f181bb88ed0fd0624c37542f7add2bbd74b7afc2ee9713dc2b841d2e36e49ce1b243dae27e2293d6e64a9fe1f9d031bbf11dde357a8d7eba030f2ffb17bddf99ce0059df31a7b80a96d509cf31407bfda0985f915fc58210af32b3a0b2d2ece3d8bc1f99c16bf17c3bc9e38b7228ece628ddf2cf10be78bd595e237210c553cc52f94d32128ccaf608f943f7c88a5f7877712f1941c70de5a6f14e6d7bb33c8f1700639eef62907f03b1485f9f5de0c723c92418e7b7dca01f9380c85f9f5fe0c723c9a418efb7dca0165a10f0af32b9c81369890e3b10c723ce8530eb0b70128ccaf0f6790e3f10c7250f623b76fd38dbfa9e6099f1071b04e16da4e6027c35198c73fc512fe6013acd910679bb1112ced9ca4f2de44295dc88f1128ccaf8f26b163e22cb4f8e3c97b763cbf3e21de077c58d782ce838d3f899ee5d7a7c43bf9286cfdde3051c286f79e66ee3e80903d26ce538b4b67b7c5e1cc4ea817e00cb791286ca5b7fe1df7f37198c71a85c2a037c619edc6d950e8962b8ece7e8b8b3930b64ffabc025d13f3c7702e9ed847b43edfad53263ce53df18dcb389c3bd71085b91ef739696dd82aa53529435a800b6799c9b6b085a5d6d52fa17bf01c3ad72afe1ac2e45738972b1f85addfe737976480f7e01cac31288cd38733a746a2b08577def748669c1f70565a4d375e1cce031beb4e3ff1de6bee7c3c6f80a4d71649bf36927ee56efd32e545426ee0f4150957e8793eecfff398c7f197247961dcac7d9abcf692af70f6563e0a5bbf2f04bfeb375fe16cb291286ce15db05592ff4d24d39b19f2fa55775a7138dfac835b362acf2f68e0c6c9589ed2d529b06ffcb92c30203ff0b96ae043df66aeb21b87f3114127385bad25c280fbfc2a9d6b1617e7905dbcd9fd7c020fce35ab29c9f1be24c77be83ebf7e20a5f38148679d8403f27d289e6f26c503ee47ee78fb79b8cfaf1f33f778d5c722bdd9447a5b33a4f70911ff9614df9a787fab3b1eee2b79b56cefa242377ee2b9b7dccf5db891b69b189caf0b6ba63e656e9ff2a9c3c925b0274cd4793138773313ae98378b7f26e18a3d2597c03ac1177ce2427fff7309f773812beaf7d88b3e71af14385f48b85f38b81b854f4cec69f48a2bf6f5c7bf9470bf14b8b00ebbab4f5c28f75f49b8e26cb78db00e6c8b4f5cb0a5af25dcaf1ddc4d20e74b1e715ff6f69cf25d7156631c9d071713755c1cedf78f8b73e0e2700e9cec1bbf47cf7e8f9ee55738f32d1f85addf97b597b0e1bd1f99bbdd2ace1a8a417df21373b75be10c21a8cb7e66eebaec6727bd4bff763f1f47e7a3c57f413cf02b9ca9d61985791a301e0f67b2f544619c869039fe3b4a03c67d327cf3017848d8099c0f217cce26380f748a373cf7bd6a31fb3c9a31ac84cd61e5ac877d400ed7729a55bf0e67ddd95456cc96b132ebd770ebbad4faeb84e03ebcd995156478c73ec78bffc7ff74b293ad62abad574b9c3349265b814aeb5689f53cc7186bbd53c57ab35e36f6522b6e9e855361f9b9523697ed649f4d03a90fb7ff9f633d516a83ee959f92c4dd294970e196587f4bacd7aaac17b99095d6fdd1d69d32eb5f85756f9e151e675df95bb3594f76a0f5d78d32cd4a76095b6e85a658ff97db78b32db1539fcca4d24cebaefcce240bb3cc966ea97507082db7c24b6c0927dbffafb0252db1a51f6bddabb2ee716d16b061d675959d5aaaee15d66f559a5304656a1967faba1fb38f22826c1a6169c3a5ef61dbe2ffe5c8b6c8114e7df5bdf29d6298dfc3f6c227a6e4c4ff71e83819be1162acc0e869531673ddebc57af0a0bdb14d57c7540dd5f6edf0ddcfeacca4d345cd0ccfee96b606c91cde7dc19bdf8e39fb869fabb955ebcd7a54e7aab5caa05a3a62395ea17d72951f15aa55cb2fe282caf4c754f4dbc7a04dce21fdce73a5f673fe33a0ba5df9b933c03e7e6c8af56395f56f895dfa4aad2ab4c47a65bcf55099f56f812d6e4a0e1571b81a36c9a955682641299af35434db3dcc29dbc4ca0fcce0e1d444d74c689124ba87dd2e6a9ec61ca9b4ec06539e6835418179637c9ffebb170ddc544d9d2fb5ed7cc926352a67e2aa9ca99deb0290d9e3a7cb973a09bd92f9c2ffa839ac4bd87626192806f3550cd6d936b6cd65cfceb6f9b449378943357ff5d3da603a092806aba918b4c719a7e690c17d2c0917897662761ceee099c30636873ba568e745068ac5ea0a168b388b0d5562d592c4b28fc35203d7a08077d404ae490137d204aea532a87ab92e923c6e998dc22b5cffe6c4776aec2abb35b53d3521ca646611286baaadca1b4e6153a55472e634a133a70e85dc4c17b92e85dc5c17b99ecaa0ecd30c73df4acfae8ee4bea699e73ab2054bd7c8f65b43d657b167cf97cc30ca5eeae011fc1a66bdbbd0e261853d22b0dc7a5f35d8949ed1969ebd7d2b9bcd02a61a02f32711c5f00e2acbe7b4b7a6b25d36fe16b4f1375081f314db7871d3ad68e0862abbb0535b6cd42ea65af79c41bd91766ca93d1294c45c6687cb501d9cee0d6e0be3ad6bb125219725bdd5b4658a3e844d043fd0c9ac64dc02ab33f1a706d1c568671bab79612853de9172e23b2b9c78cc8f136f4421efa25b3d34a64a487bcd12d28402eea009dc94e2a2a32e17cd28e44ebaf9d75ce52e6c73c9ed588d33fcc171fc57c37cd6b76d8a3f2e18aa2e8b9d19350c935e06aa6ced44e54d17ddbc69415540bb065001b55465bc5d9a4b8d663cd4be93d908b6b725a2caf555bac6d6f0ef91166a859d29c99a1c90d21b099f9e6dade0cce64d6928dd6c43e9c698419929a36a45657df700b2be3505de2300f03614785100e06d29f09e01801750e0bd02006f4781f70e007c670abc4f00e0bb50feadafc2bff9aad5da53c8fd74913ba890791f991fb097b18aaf4f0377a480076802775201f366fb402fc0ed68e0420a78374de0ce0ae01e76a38def48cf650582ddaeda310fb334acb453865f0e4af2cd899624732c994bb2a85a765731a9ac52f8da9042fb84d06da10555d9745199086f03f2ad8aa90d2b4551ec4c9bc9ae5421df53b79077a59007eb2277a39087e82277a79087ea22f7a09087e9221751c8c375917b5286372200c3eb45818f0c00bcb70a9cbb77be9b42b7c6eda302e763c7a3130f27c1ffb3fea480d7a5c1fb52928f51485ecba7e4fd285319ab30155f7da1fe14277b293859ab123b0d270328f0bd15e0a7fb041f48818f53806ff409be9b02bc873dc07124cbed28b07ad9e1684b339e1a9e834baddc60ddd924eb3adf9682dfe752645eae98be6a1e9fe0078d0cdae3342399f7c593e6b5e0874ed6b68796d40d07be01aa30643253cd89dd5506cfe73bf98eb79435357c98761673e64078fa6576d4442b059e9b63c5e0674a99a8419789419487db57e1e1623e3ddc1eaa02670fcf956dd302c7c786f9a2cd4afbf70a91bd53ecb4934b8b748a129f94f3378032d936da5e1e8c3608e92973dc93f2bf5314fef7d0983fff3b98b275bec82263ef2a8d110fa16ad2698a9ad457a36b2825f27eaae2e90c7f41ff828f8ae2856e05f6f45aa5752db363f9ef4aeb175fdf3dc7462fb6eeae40ef97a31e4a775f8c0ca31899aecbc870ca42f65758c8e73e2d64840a9ccf361ce0c542d2cc368c5479227b38dfec00aef719ac6027f90e54f1a5f43b33180cdc9a9395f236a354d9cd6d6f264b6d8914f196083f6b29cf967b962d77f73472ab2a75ff92a758d93eb4958da6cac66c45d9d890e7af6c8ca15cd11c4def3996029eabf2717c906b94bd40a02cadbf2ab0eda5c0dec15221ec66372bbcc6ea221fe64bbebd2856e729587dc327ab7b53ca17ab94e76e75b8adfc125b79eec8abaceb7cdb888a2575d339f302bb8a4e8d9d6b6ff8596cdd59693b9c25289595b6812ef659158ca30a590955c8e6270ad9828cce618a2511afe42aadb7b8744b0d17b1f12a6d787b959f80a13b963081b2b45285a5b5cff76769fb5075db22cdba6da20a98d76d8bbd00cfa081f7a5e858a2a0e3749f744c5280f7b0a78773b9a06da83dddc80b9eff99f4a52a7a95756c19532f664b9f3a556b4e56650b676e9997fc2ea3b3648a2a4bec79f55c2e6f90ab6b7f9952ee39530e66eaa50d99d2a7b2652ae5672b283fcb0f3516e3183e3ce034aac6aa52d558dc35ceb2fe1659ff965ab756d921a796e2cd233f35c97e54cacb552937484979ace5f3b34f7d3a95fa0a55eaf550eab3ec111b5e0b39b95ce12bddfd292fb852e105cbabfbf38207a8c0799ef143a2e5ea4c397a9da63a3b90b2c8d594451e929545cea072668d2a677674d905ee20676f1b3329090e5549d0d8651bdc53553172779a0f290ea22ce53085a58ca8e1cf5266a9c079f3e1702f5e3f4df3613625f5110aa94ff629f51c15382f9b6b99e638c45c0af9485de479142147a908a9e98f90620afc680578556d7fe0252a70ee4d8e517813fec78f3799af02e7cdcc63bd18609a66e602aaf01ee705384d795ca800ee612fe5cbe5ae2ebc6335bb5d5dc7ab7850b669f85147aa5d5d5e64a0da35a594c59ea0b0d8e975fc59ec2215387ffe44965a45f5b017fa65b767cd3e5c5c1c10c0ba5b7f6aa4567169f6732da64ad6c98a9295e7b3642da1c04f5180c77d822fa54a173ffe3ca56ae48305aa713318b7291086e48c5557d943171552e3aac01e20a962ddaceb7ceb7f67808057a705d63f98afe0883d6dc4f976315a6abfc7b19de1021edfcb8adfcdbaf6b6aeed7c15fd32caae4e53d85511b7abd3f50c641945f3192a9a67074273f664f2b1a485c2b739d3127cf46a89c0e56763148b298902f17eb98dbbc096824f5bf8cb8e72ca879ca9f021331af8f32107abc0b99738cb4bfd91a63f5c41019fad095ca902e665f81c2fc007d3c0550ae01ef60ae67d53bca6b91acfcba924ea9aee5c95feca9a8e7f40a030d62445abb4077710ac2d576507678d7f8da0966c9d2affbb9ece921594e99fa730fdf60dfd99fe4a4af2f31592d7f029f92a4af20b14927fed53f2d52a702ee1852a7fc954a2a7f1378750a25fa410fdb61dfd89be8602bf5801dea0a93ff04355e0bc2dc04fd2d76dc21f46816f0c00fc700a7c5300e047a8c079e7e3522f1e334de7632d65879779014e638247525672b9c24a7ef6692547a9c0f9f35730a279c30fa6d468de1c4dd17495aab8f27914bfcd1b5e1985b125790c45f5d514d5d7e8517d2c45f5b52aaae7064675745a93c75145eb3a45d1aad9c25fd13a9e7263d707e0c6d651e03704007e02e5236fd4f49127aa8079fedca4e9234fa23272b3ca47faccc89355e0bcf57eb317a9d3b4de4fa1806fd1043e95b28e5b03b08ed354e0bca9789b17a9d334134fa732f1764526ded7d25f269e4181dfa1003fa6953ff03329f03b15e0e35afb033f8b02bf4b01debc8d3ff0b3294bb93b004b398702bf2700f07329f07b03005faf02e7fe871f279c5275f25d127eabce2a510dc28a4e3fed137f95dc064a97fb55baf0880257aa7ed23a8f4aeb01555a78fa6c5ecadac0ec27f1cea7a4785025857b1ad16946389376d94b700125c1432a096a333c8db89f6d19553e6bc00b292ff1b0ca0515f8f312175165ed9100cadac594e48f2a24bfdaa7e49750923f1680e41b29c91f57489edfce9fe49b28c99f0840f24b29fb7c52659f7cc3e081c297cdb47cc381c20fed269aefcebde9f6b51bdbd3fa7f24f259f36c20befc904f8b975bf716dafe65953d1c5862df2df6e9d32ea3e47f4a253fdf1a93940876f1162474da4de833533138eef86cb92bb2d47ea2524c84399d1a47bf4ae60c6daeb6dff4a3d3e52a9db8813c9d8890fa87f637a96a30e74f77e78fbf2ee21594913dab30b27c9f46762505fe9c02bc9a4ff0ab28f0e715e0d57d825fad02e744bfa032aff69e8a87d3c3ed615dfb887b4e5159c3fa8a67fbf95cce7c0d65302f5206b345db60aea5d27c894af365ed34afa3b2fa95003ce1f52a70fe3cff8086ce0cca0d1453af514cd99f9daa8699f2c7d38d144faf07c0d34d14f81b01806fa6c0df0c00fc6615383f72897f9e88dc5a2727d08d4ee0162a81b7034ae0568a9e7702a0e7360afcdd00c06f5781f3b555fc13525a6babeea090dfd745be9342fe4017f92e0af9435de4bb29e48f7491efa1903fd645be9742deaa8b7c1f85fc892ef2fd14f2a7bac80f50c89fe9223f48217fae8bfc1085fc852ef2c32a64de51e79f29d33d45e4110afcab00c01fa5c0bf0e00fc310afc9b00c01f5781f38a807f724cb722788202ff2e00f02729f0ef03007f4a05ce3bf93f241e4e82f719eaaf93ffb40a9c3796f927d1945b11f842f755f63604bee37b893d6ae87c0aca4fd7e1194aa99f144a6d1dee4fa96755e0fcb436fe6d399dd3da9ea3d8fa45c5166f81f1513c3e92985c943f99394752f3b10758e2e387b9e729197e55c9c09bf530b2e74d16fe7485fda41fa95e5048d5c33e1332f787baf3f388fc2fd8e2df046c24d197472cd9e2df06a48f74a7d2a7166dbda8ca515e16fe5094856346f92b0b5b28f03f15e06b47fb037f4905ceade42f952dcafbad9727b6d6bab7175722abdc4d8c8855b23db2d86ffdb24a3e6e957f2b323b960afd3b0dfd0ac5eb3f0a5edff1c9ebab14afffaa7875f6b12e632bd938b138811fe5b3da1753af51eafca75067cc5efed4f91fa50e5f0e97a24e67c94cf839fece2a0b3f66c20b201ff4dd438c85f921e3758a8c584c3199ef938c3728f03c05f8e93ec1dfa4c0e30af0c77c82bf4581e72bc037eced0ffc6d0abc9a8a739fe0efa8c0f98eb3ea31bd1d67efaa807903a2464cbfe1f71e055e3300f0f729f05a01807f4065666d4566168ff397991f5299594733333fa228a91b00251f5394d453d9b74f4ab65294d4d7a4e4138a921d02a0e4530abc4100e09fa9c079ffa5614c7368e0734aec1d0310fb0b2a271b69e6e497141f8d75f9f88a426ea28bfc35c574d30098fe862a90cd1405b26a7f7f05f25b8a93e6ba9c7c4771b253009c7caf02e70da5165eac2f4d8bea070ab8a5aa05d8d00e265b7abc6537c70aadce7a59d08f5466b752b58b7c66f64f5496b40e204b7ea6246fa390bcf901fe24ff85ca96b65eb285f77bf9daa4aaacb3e5574ab9028572ab7c2af71b952ded02c896df29c9775648fe9c4fc9ffa0b2651755b6ec20654b89e8376597257f528ab5572856f3407f8afd45b9c50eba6ef16f4aec8e0ab1bff629f63f547e7452e5c71e647e94d9c341cb1367de3a4b7b56da83200bc57e0267f94e89bde0cf5dc4f8334e1f77a13df05a6cf771f912ce32b1a7810f8ff9c9eb7f29d20a15a4b59fe18fb4ffa8e2d73980e2c7070e9433de5d62c1cc78c75409706a7655f5757d5293a702e7f9d455654f4d53ec09be2b84cb78760712c62935bb29d4fcdca79af92a70fb63460a0b88f9b4806a94e43d1492d79de94ff2ea14789102bcc827780d8a969e01148c9a94e4bd14924ff129792d4af2de01485e9b02ef1300781d8a96be0a5a9ef2494b5daa38f75315e716698a73155b65af53d52dd6f52875fbab1a8d07f953b73e9551031419e5f700911d28c9072a241fe453f20654adb15b40b546434afadd15d2cff629fd8e14f82005f8313ec11b5199ba4700a5af3125f99e0ac9dff0297913aaf40d5695be0652e9e3f326cb5879d6cde5a6946a4314aa15cef2a75a332a5386069029cd29c98729243fd4a7e43b519932dc4bc7926f79592e96c867972d2d28e546a8ba673e956b4965cbc800b2a51525f92885e405b3fd49de9aca96d15eca0a1cec9c6da6b4a1541ba350addca76a6d29d5c6aa54b3c7185821ea3df1be58675fea1450eaeca550a7cf1c7feab45381f39efede9ae3c03b533c8dd31ce2db4505ccfbf6e375fbf6ed55c87cd1d984986ad1d9dac17e169d75a0c0f751822b244f03de91029f180078270a7cdf00c00b15e03deccfb0f223de72ff9589f1cc19f898c49ce11467f8a422e06f4d4c529501e50aa0c9313e4ac23f91675a626ad55067aa204fa10609f93e38befb6db9a3ab24979fb2de85727d5315aeef7755714fe3fa76a5c0a7a91a26f3fd8177a558db4fc51a47806f6bfae1a71b95ca74aa32c2abf2b249b13b45dafe0ad21ef2495a0f0afc0005f88805fec08b28ae0e547155cdce11681efa61a82795ce0c553a7552f2249b347b51c4cd5410b7ce2771bd29f0835423600bfd81f7a1d89a459513eed3794fca0f3f7da954667b2927d9a4d88f6abbcf09a0edde9fca91b98a1c99e833470650e0f314e03ffb041f486544b12a236aa1ec2e14c353fedacebb51e995a8d26bc2928b98e78bc3102c4763fd731c65f6c724ec4ec9315f2507fe0281ae210e5235b00aac60ec0096bbcf68273f2deddc9f6a2f56963f210d4fa56f3c2df0dc785a68379edad84f662f0dd530da832a28a58a82b2a4d45f41d993025fa4006fb0c81ff860ca1a17abac91f7adc659dccfb167111daeb21b2e1e42a5bb245329586ea79a7df91b4aa5bc941a2752953f6061aa6525e37ca53f8ceab496e9765a875386b24c55f5fb3494111478b9027cc8627fe023a93c3998b242e7bb1305763e703f989d158ea2d2ada006a7c0169c5972fe4ef696389a4abdd28f253a4c000f7ed21f43f5e6ab02e8cd8fa5ec65b9c25eeef2692f7b51e02b14e03396f803df9bca9695998c11aacbec8c711c95ee2aaa770de600e9666f8ae3a9b457fb37c529421a3fe94fa09ce221ba4e711fca54d6284ce5739fa63291023f54013e68a93ff07da9f1d8c334c7632751997d783aafd73320af37994afd88cced5fc7c0865a0ff0f6205fdbe427e529546ead55e4d6169fb93595023f5201deaacc1ff8348ab3a3549c39df9e74365e8eb5daaf7e38da8f4ae9e84c4e08a798dd86cee91485c728283c79993f0af7a7143b56a5583f96e953a57076df1cdbfbce65cef1bdd466b102f181cf82c45631678b5857715c921f9a0ea0683a4e415371b93f9a0ea4c08f57806ff4093e83025fa7007fc727f84c2a834fa02c377573320c83fafe761995f689aab49b2b4a8d5a86eccad12c8ae69354a3d995fe689e4da97ab24a55e773432576e998673f5f9c5232e0bcd0425126fc0debcca1e43945258f73fae628e67c6c97975d47a6a1f6af0abb242fb7ef55fa92622e25c5a92a295abb2a356fd264670af32853384d559c7d9a423135b079ba6260d316d2c7c06609057e4600a3a6f3295ace54d0f29c4f5a1650e06729c05fadf207be9032b4b35586d6d50a4e493986b7121548e74cf915f62ba5f633ce7a6ff7311b05a2dae3075866d3b529a528394741c994e5fe2859445172ae8a925d6d8fe42c809f2796c0f3d32ccb6dc5e733676d64491a2a1c12f5bcd6628a90f5aaa68e4f429650456783a2e8d4f459749652929fa790fc429f929751929f1f40a15f46497e8142f2a77c4a5e4e815fa800dfbcc21ff8c194855fa4b2f06e59147ae72c876e76d383a7e09ce6a05bec2b28522e56905273a53f522a29522e5191d28928f694e2d81d38774ba4a2ef87882a8a888d0a2286f824623905be49013ed127f80aaa445e1a40895c49497e99aaa1ea53f25514f8e50af0c255fec05753c67785caf85a11c6e76e075789d390b237b3432895af54a8fcb54f3ed7502a5fe565382a8dd487522676750026761845c9350a4a66fbb482c329f06b15e0e53ec18fa0f8be4e65623c985ce2e587feb5543ad753e9f0f1b789f65caf9f748ea4d2b941954ebe9dce72bb28f849e5282a951b35adf468ca4a6f0ac04a8fa1a4de4c7133417c34c28f0ac752a9dc4c8d521c88c625a6b0e96c1cdb8d51df7ae7a77bfb91e6384a9a5b54d2d4658c4cd94faac753a9deaa4ab596ab5475cbc225afa3d2bb8d4a2f59bab249ef042abddba95130551e27cf75f793f689aab479127778297b69262c4ea294ba53b3509f4c39f0bb5415e611fe1cf8292a703e5375772222095ec4b7dcde6345d4b6794849671f3a9d532976eea546e4f8203d6c082fb3a3a6a2cfccf1454e7cdc6981bda4c7b9e787d4d32879ee53c9030bad7a59ff927b3cc626fa1dd94f349d4ec971bf4a0ef8220e9fe6727ff9227b09cea02478801e9b742448323181394bcfb297e24c4a8a072997901c9b9caaf8d8a19fb4cfa2cac04354197838ab3270b62a9d9656f011453a3dda594131348d5795392bd89cc6f98162dd997ca0e6a3161e9f5fb3ff283e55b08e96f11c2a1f1e4b572e8a022f17e752723c9eae5c1405582ed653123c91ae5c14055c2e3650523c99a95cf0d4168831f9ecd23e8f2a174f51e5e2e9accac5f9948ecfa4cbeb3e01e6f5059404cfa6cbeb3e01e7f5859414cf65aa0be6d90ded2abbcce97c9fed224a82e7337b6167d9c37097247ed2be984afb0555da7c1fc20aed29d14ba8345f54a5c9f7ec77b3fefa49612395c216550a7821c962eb86ce12ee4d54ca2fa952c6cb0657246e679ffaa554ea2fab52afa7b0a4ec1acb9751e9be42f1cd2d8757af2313e74d0c17f7fccdae5e4e35d35f5534d3d71eedaf997e05a5d66b540f2d552d3fca5c4929f33fd5b8e431fe94b98a52e675aa539daa8cd309f4a3d2d5944a6f2854dae253a56b2895dea4549a634f7294dad5073e6ede8f4ad752a9bea54ad55e076d379457649de275548a6f53154499a80a708ac906a29fb4afa7d27e872a032bd09881ff0f0adc40a5f7ae2abd860976f1f4acf33988ecf4bd914aff3dca85ceb173d6597338d2ee343b4bbefc7deef0262addf7a98a180e0bc93ecdcd549a1f5076e59c0537cfb6ace4c970d9ec38ba994afb43aad955a948714ae2143ae70c3a3f12dc4249f01195d370e48433f8c1cfc1cb6641f3ad54ba1f53250a7badee76e9f293de6d547a5ba966b63bbd603eb1723b25c52754b9764ba1fb49813ba8f43f55a5df3425fde0b6abdf4949f2994a9296299224bf40e0e489b3db8e97fde1a26bc6bdff125f32dd45c9f4396d23c14b713725c517b4efc5cc40f9f49b23f750e97e4935da65db8486523607d1dc4b3591be523491469ce9af89741fa5dad79ae3e3f753935edf0430e9f50025f5b79421c062d9715a59f12095ee7794939017eba6a69fddeacc872849be5749d22ac5244b50a300264b9d75a47c5bae5364fd6f93789892ea076f05858f14c3a881ff03621fa152ff91ea65a6a63e89c1e1dd7e527e944af927aa71965a79f96d203d46a5f933d53873a7596c575573b2aaac1fa7d2fec59bbe5559348b9ea0dce0af0a3738e55c7f6ef0496afef137cdf9c7a754c0dcf07ff702dc8e067e5a05cc5787ff11e35f457103b752f9d7f534f8332a701efc33c60fc17783df3fba74e67f038a3e4949a01a9dc0b39401fd956e20cae9c72db1b72d3a3d47bf6ddde7a85ae9ef006aa5e729a5fe512915b78223ed46a21f055ea0d2f8579546353b8d6c869a5ea4d2f94f950e47c8661bf1162a157e12ab529becfcf34b543a312a9d6417ce4f3a2f53e9e4a9d2e1117c9674b1bd476ca54f1ffc0a5546e379a965f4ed1bd7ec33768fb376f253465fa594c957290383e4ea32ea6fd0f63555cadc0954cbd3dcd2fb3faafc57cfd32fffaf5362d7d015fb0d0ab9a62ef29b0ae41e3bf39251cab6c5c97953ec364999f5f67cb1b729d833f36ae579a87617d07cbda5ca09ce576d4de0b729e03a9ac0efa87278179ec38bb6490e8f1633b2fb58bd8f45ccd955106c1ed7f5c2d82c9ab17729c757cf0b701abff61e055c5f13f87dcaaded10805bfb80026f1000f8872a706e9d0d3533f123aae1bda317e0340def8fa9ae42232fc069ba0a5b5505b53d2fa8f3b749413557401bab988a494cd9676f35c9e3676f7561f4c1a53a525267727da2ca629e134dbd6431979900fe94aac79be9d6e39f5156d95cd32a3fa74aff4e0194fe2f28f01601807f4991dd5297ecaf28dfd24ad3b77cad02e623fcadbd00a75940f80d05dc4613f85b0ab8ad26f07754ee15e8e6def714723b5de41f28e49d75917fa49077d145fe892a82ed0328823f536277d015fb17aa0876d42c82bfaa80f9c861272fc00d68e0df28a20b0320fa778a8ece9a74fc4195ef2e9ae5fb4f8ae75d3579fe8be2b96b003cff4dd1d14d938e7f28e0ee9ac0ff523cf7d0e4f93f8ae7a20078e6e37f4a3a7a6ad211a3807b6902e7a98039cfbd35798eab80ed2f8d05c0733e45475f4d3aaaa980b9e7efa7ebf9ab537cf40f808f1a141f0334f9a849010fd404ae45d1b15b0074d4a6c0770f00bc8e0a9c0f720cd21c0da94bd9de1ebab6578fe263cf00f8a84f99c8604d13d981021ea209dc80a26368007434a4c0870500be23657bc3356daf1125f58800a46e4c818f0c00bc09053e2a00f0a614f8e800c09ba9c0f918e218cd31c4e694958cd5b4929d283af60a808e162a70be257f6f2f52cfa0815baa80f9b0d838cd61b15614f0784de0d6544d3041b726684321efa38bdc96429ea88b5c4021efab8bdc8eb2e74901d8f3ce94d89375c5de85127b4a0062b7a7c49eaa2b760715b2fdf943cdce7e47aa0fb39f661fa61345f4f400882ea4e8d85f938ece54bbe900cd7653178ae7033579de95e27946003c77a5e898a94947370af8204de0ee14cfb33479ee41f13c3b009e8b283ae668d2d193029eab09dc8be2799e26cfbd299e8b03e0b90f454789261d7d29a9e70720753f0a7c4100e0fda906ef42cd06ef00aa895eaad9441f4849bc4853e2dd28e0c59ac0bb53ed8225baed824114f2525de43d28a32b0bc0e8f6a4c45ea62bf6600ab95c177908857cb02ef250caee2a34ed6e18055ca9093c9ce2a24a978b1194d92d0fc0ec4652e02b02001f4571b2529793d12a64bed06395976c4cb3d0630cd58c5eadd98c1e4b8d471ca2391eb11745f21a5d92f7a6900fd5451e4795c2c3344be178ca9c0f0fc09c2750d5f7119ad5f73e141d6b35e9984835ee8ed46cdced4b497c94a6c49328e0a335812753541ca349c5144ae26335259e4ad9f27101d8f2340afcf800c0f7a31cc73a5dc7319df2fb2768fafdfd29bf7fa2a6df3f80f2fb2769fafd0329924fd6257906857c8a2ef24caaac9caa59560ea2ccf9b400cc7916e5f74fd7f4fbb3293aced0a4630ee5ecced47476732989cfd294781e057cb626703145c5399a549450129fab29f17cca96d70760cb0b28f00d01802fa41cc779ba8ea394f2fbe76bfafd4594dfbf40d3ef2fa6fcfe859a7e7f0945f245ba242fa5902fd6452ea3caca259a65651965ce1b0330e772caef6fd2f4fb0753745caa494705e5ec2ed374769594c4976b4a5c45015fa109bc9ca2e24a4d2a5650125fa529f14aaaf85dad5bfc5651c8d7e822afa6cadfb50194bf4328a6afd3647a0d057cbd26f0a1141d370440c76114f88d01801f4e99c84dba26720455756fd6acbad75255f7cd9a55f79154d57d8b66d57d146577b76adaddd194b3bb4dd3d91d4399c5edba66712c25f21d9a221f4715933b032826c753e0770500be8e22fb6e5db24fa0c4be2700b14f5481f379ef7bbde4649a79ef9354c0fcab03f779012ea3814fa6e8b83f003a4ea172f101dd5c3c9512fbc100c43e8d12fb215db14fa7c47e3800b1cfa06ce4114d1b3993e2e3515d3ecea2f8782c003ecea6c01f0f00fc1c8a93277439399712fbc900c45e4f813f1500f8060afce900c0cfa3c09f0900fc7c0afcd900c02fa04ce5395d53b990427e5e17f922aa41f9826683f262aa41f9a26683f21215707b2bb8c50b709a25e31b29e09734813751cdbe97359b7d97526deb5734dbd697a980f9618eaf7a01ae4f035f4e95bfd702287f5750e0ff0b00fc4a0afcf500c0afa2c0df0800fc6a2a33dfd4cccc6b28aff496ae57ba96e2e3ed00f8b88e027f2700f0eb29f0770300bf8122fc3d5dc26fa4c47e3f00b16fa2c4fe4057eccd94d81f0620f6cdd420ce479a8338b75015cdc79a15cdad14f0564de0db289e3f0980e7db299e3fd5e4f90e153017e4332fc007d3c07752127fae29f15d14cf5f04c0f3dd2af03656f04b2ba2510a780af4ef34f43d14d35f69327d2f05fcb526f07d14d3df04c0f4fd54bbec5bcd76d9039427fd4ed7933e4811fdbd26d10f5122ffa02bf2c35416fe1840163e42f58b7ed2ec173d4a49fd7300523f46e5e22f9ab9f838958bbfeae6e2139457fa4ddb2b3d4951fd7b00543f4581ff1100f8d314f89f01803f4319c95f9a46f22c25f5df0148fd1c25f53f9a523f4f99f6bfbaa6fd02550dfca7590dbc4889cce29a226fa19063bac82f51c879bac82f5366178feb9bdd2b54532f3faed7d47b956aab57f3029ca6adfe1a055c5d13f87f540ed6d0cdc1d7a91cac19400ebe4181d70a00fc4d8a93daba9cbc4565631dcd6c7c9b02aeab09fc0ec5453d5d2edea590ebeb22bf4719c70e0118c7fb94ef68a0e93b3ea0f868a8cbc7879471eca8691c1f51c08d34813fa6b868accbc556ca369a04601b9f50e04d0300ff9422bb9926d99f51c0cd35813fa7727127dd5cfc8222ba4500447f4981b70c00fc2b8a9356ba9c7c4d21b7d645fe863290369a06f22d05dc5613f83b8a8b025d2ebea78ca35d00c6f10305be7300e03f5264efa249f64f14707b4de09fa95ceca09b8bbf50c81d75917fa5903be922ff4619476100c6f13bd5aae9acd9aaf983e2a38b2e1f7f527cec1a001f7f517c74d5e4e36faab074d32c2cff50c0dd3581ffa572b0876e0efe478d1216c5754709f998897260a9a71736d20c2cc554c09c8d5eba6ce4a990b93df70ec09ee394d87d74c5cea790fbea22575321f32fc3f7b322da7a21a4330d5e9d02ef1f00780d15381ffa1be0c5fad28c11d6a480076a02d75201737fb79ba6bfab4d99c7eebae65187421ea48b5c9742de4317b91e85bca72e727dca9e070760cf3b50620fd115bb01853c5417b921853c4c1779470a79b82e72230a79842e72630a79a42e72130a79942e7253ca278dd6f449cda8c6c118cdc641734ae2b19a12ef4401efa509dc8202de5b13b825053c4e13b81555058ed7ac025b53edaf0901b4bfda5074eca349475b8a8e899a7414a8800bace0be5e8017c648e07614159334a9d899a262b22615bb502e6e8aae8b6b4f713155938b0e1417d334b9e848b533f60ba09dd189a263ba261d85540eeeaf9b839d29910fd014b90be58e0e0cc01dedaa02e783053334070bba52c0333581bb513978906e0e76a7889e1500d13da8a6c66ccda64611c5c71c5d3e7a52ae63aea6ebe845893c4f57e4de1472b12e721faa78976816efbe94c8f37545ee47212fd045ee4f59c6424dcb184001976a020fa48adf22cde2b71b25f1624d8977a7ead72501d4af8328f0a50180ef41159532cda2b22765d0cb740d7ab00ab9b1152cf722f2201a780825f2c1ba220fa5902b74918751f5606500f5e0700abc2a00f01154615cae5918475264afd0257b1485bc5217793445c62a4d32c65022afd615792c25f2219a22ef4589bc4657e4bd29e4437591c751c887e9228fa7900fd7459e4065e0119a19b80f25f25a5d912752221fa929f2be94c847e98a3c8912f9684d912753221fa32bf2144ae46335459e4a011fa7093c8d6ac51cafd98ad94f05cc27bbd7c57527bba753addc13345bb9fb532c9fa8c9f20114f0499ac00752a67cb2ae29cfa0443e4553e49994c59daa697107516daed3026873cda26cee744d9b9b4de5e019ba39388722fa4c4da2e752449f1500d1f328a2cfd624ba9822fa1c5da24b28e4737591e7ab90f9f933ebbd9091e6fc990514f0064de0850ae01e1dac606cb6f5df64b69a558afbddd9240bbdcc0a955aa1122b3c9c2db37e955be12556b8c27a9affbfc20acfb37e555a4f4cb69eaeb09e2a630bd830ebba8acde64ed0fa3bcd421b6e3f3182ed6dc5cdb19ee798cefd8916e21c2b6d8e37d44ea12b2b1071ee37665a7f799c5b522e5985f5fb3c153b31899da2ea56f07cebc9c2587bfbc96024ab46305e4a59df05bad6b788aa022ed4ac0216539ee9224dcfb48402be5813782945c5259a549451be746300be741945c7264d3aca293a2ed5a4e3601570232b789915d15a418792926e7402151425976b52524951728526255594855c1980852ca7a4be4a53ea1594d4570720f54a4aea6b34a55e45497d6d0052afa6a4be4e53ea4328a9af0f40ea3594d437684a7d2825f58d01487d1825f54d9a521f4e49bd3900a98fa0a4be5953eab594d4b70420f59194d4b76a4a7d14d5b2b94db765733425f2ed9a221f43897c87aec8c75222dfa929f27194c877e98a7c3c25f2dd9a22af5301f379bd7be2faf37a275052dfab29f58994d4f70520f549542edeaf9b8b27532da607345b4ca7a880798fe9412fc069d6ce9c4a013fa4097c1a45f2c3ba249fae42e633b38f781139cdccec1914f0a39ac06752e3348f698ed39c45d9dbe39af6763655093e114025780e45c7939a749c4bb9a3a734ddd17a4ae2a73525de40f1fc4c003c9f47d1f1ac261de753743ca749c70594d3785ed7695c4871f182261717515cbca8c9c5c52ae0b656708b17e0c9f422eb4b28925fd225792345f2cb9a246fa2fcdc2b9a7eee522af75ed5ccbdcba8dc7b4d33f72ea724fe9fa6c457a846a33b5ac1d8126672347aaa75afd48a5dcd46dab1a5d6ff1c73a89546b1155a66bdbbccfa5d6163f111dfcc6f8cb7fe155b212e4dfa51ead73d8f52bf618f521759bf4c4b4c8d5e5f4915dc37750bee5554c17d4bb3e05e4d15dcb7350bee3554317847b3185cab02e6c5e05d2fc0dc4808e0eba8dc7b4f37f7aea772ef7dcddcbb81cabd0f3473ef46aad7f1a166afe3260af8234de0cd54ee7dac9b7b3753246fd524f916aa6df949006dcb5ba9f2f7a966f9bb8d92fab300a4be9d2a299f6b96943b28f3f842d73ceea444fe5253e4bb2891bfd215f96e4ae4af3545be8712f91b5d91efa544fe5653e4fb2891bfd315f97e4ae4ef35457e801a7bfb2180b1b70729a97fd494fa214aea9f0290fa614aea9f35a57e4405cc4f1dffc50b70ba53c729e05f35811fa3807fd3047e5c05cc83bf5b112d1519a8ccc46a74024f5035cb1f01d42c4f52e07f0600fe14e544fed275224f538d8fbf351b1fcf50ed837f34db07cf525cfcabcbc5739401fe1790013eaf4a802f2463f97a0bc95ea03889e56b72f22265d679f9fa66bd85028f0700fe920abc35e7da0bd9eb69e09729b2abe992fd0a855c5d17f9551532ff80680d2f64a4f980e86b5416d60c200bff47f9905a5ea44ee3435ea788aead4bf41b14721d5de43729a6eb06c0f45b1478bd00c0dfa6c0eb0700fe0e05be4300e0ef52b9d9403737dfa3c46e1880d8ef53e03b0600fe01c549235d4e3ea4c46e1c80d81f51e04d0200ff98e2a4a92e275b29b19b0520f6271478f300c03fa538d9499793cf28e416bac89f53c82d7591bfa0905be9227f4921b7d645fe8a426ea38bfc3585dc5617f91baa0d5f901f4c1bfe5baafbdbce4b9b244df7f73baa30ee1c4061fc9e02df2500f01fa8dc6caf9b9b3f52bdd30e5ec84ed33bfd896a5976d46c59fe4c71d149978b5fa8267ca16613fe57ca363a07601bbf517c74d1e5e377aa33bdab6667fa0f6aacafabf57427093876b21de43b90a6b2627b7edb990b5f6aff1e6bcf92f3b9f0f9d62bce5cf8d8c49323d90aeb0e7f629275e5b1a5f69d0ad69dcdb2fe4eb6638b2dc4e5f6cc35c74dbe33c2bac27ea86236ca7a6b0e5b6aa7e0bc9b9ced76e6de4bed9967778c235f6f4bc35969b4e073d6cbaddf9528f529f6dc3f60ba51a7596f955a387e0642ffa458efa6627d28a366e1f76173d9229bcd2ac1e232566efd3f96f1f5094bec1509fc2d1e931941d68caf5c5866cfd1cfb19ef5a3df5f947edd55faed4eea375ae472aa9e0bac1097b8cab684324be6f9f61a87a569749d92f2ac1f9dfea674eaa1d2a93fa953aa146e8dcaadd80a6177a674f987d2a548a5cb6ea42eb01266991d2adb86b9f32fa5514f954683b2d66881c222699d54f6eb47abff28ad7aa9b4eae2c34f803e6542c2745ed48fc47c705729716f95c47b3246a6eac8394ad8c21c857fa23d7d3aaf96ad66314ab33e2acd7a655dfee7b185f6cab262db169727fc80ba26f3a3411ea5415f9506637c9491a1961e1576edece832cfaebf2bd2c84d979974e87eb48d53daf65369db41b2445923c89d71b64c0bacdf0b03ca957c4acefe545b409d26aeffc7d92da34acbd616dab6962e1fe8fc09a62d508dd26f804abf61becbcd683b6786274a4d3636a757f754a7341ca8d2b0af466b678e7dcf69374fb65bc4f303cca91a941ebba9f4d843b2442cb55c7a260bf9bd59613aef9d4d6bbb26a5d7ee2abd067b2a61432d198aed3c2cb53d957e09cbce7bd4a2741ba4d26d449a3cc3da8db47afdcbedd71c2b956575e790d7bccbde326b535aee41d5bd5e2d737446cba4f5f3a3411d4a833d551a4cf5d192831e1f8f4dcd352fbdbe5cf60ceb523c0c56f150c2cc8e3754b189f63afd05623c619addf72ab5fe9f6b6b174c8b331b9f558fe26908652fdb665c263d43fa3cd4a77818aae2a11fe9bbb36ba166c2f2a3c90e9426c3549a0cf0e1c3fceba246f3a34d034a9be15eb4c156a2af8d1acd8f360d296d4650e321aa7398a6daad8125a255e0ec049a65fbe64af17aa9a27d6ac6cfee486934d24b3fdc9d2eae67a6da230615d6b313acd80576bf5cdd02726304a759234ab3512acdf6f6d49a1b6d8fb8cd115e127a4dfb58bf932da16dd9876a4ce93c5aa5f3f034a52da8519564390b6a7ca509a5e3187fbd283e5330d77a08741d67d7ef236d79557e25e89abb29a5c7582f2d723ff6b92d2db219a5e55e2a2d8b3cd7cb7edbe3d9f59a9a53d2efad927eb2efd6b8aaff14b696f84e1407e3bcf4a9d2d5e07ef3305b8fd182d260bc979296ea15bdf57d69ff98aeed9b7d3eb5a4b49c408d9f65f62793ad87e7326776661e5983e76a0ca315a5e13e5ec69dd259a2bf71a7a0fb2ead29bd2652b3a0de7ca43fade8dcca46a736944efb663f5a9da9c4e5b25e6b4be937c94bebd2ccfc95e999ad024ae7c92a9da76f639d4db3d18e62638a8a8d511e6b156a7c6e5bd62c3b539a4e55693ad253591ecff8a90ebc4681f527740f3157f5cb2e949ed3bcf49e64ef3bdcd63435f7708fc8cbfd60fd727b4ac7fdbcf8e5541d93fd8db1f6bc58956d5d7c745096768af5bbdcbeef4dbbec46683a50fa4da7d677a4d3cfa941932f789fdf0836d73a525aedafd2eac0802d932a7f7e9f0f96934e142707a8383980991bf976fa313a3304c1cc1d15528c1ce8a5a736dcd6d5d10b7aa953ac7bde468783f1c09d290d6664537ac7daf311256c952569eafc3765bdc16bd585d26aa64aabee19b4e236e8e452a5c2aee8f1b66ccad8ae94e407e95b544fd62f0b8be26ff9d1a02ba5c12ceffd109ea6ff7e88a31f753fa8b659374abfd92afd7a6a97795a87ecca46774afe392af90b19bdea074e5dc3eb60e02cb654efeb785efb5c311fd2f6a0a49debadcd9f4cd5ff280b7e3b5d4c309a16519acef33666a6d634d37ab3ec74ccbef4f4a4b42cf6d2e257f76cbcf4e0723952d18bd2b124bb39216feb9ab2eba366db17ef4de9389f1a8dc1f3b2bdad50a9dd5258a658555a9998b785abf36ef21dfc051eb7ffe133ba101b74afbc0fa5f30295ce638cebecb48247b0e5b61ff3e2c5fc68db97d276a197f51da9fe68acddc22fb3da85a589fa24bd370a2adffa519a947aa9b1d59a4cb05e989023f9fb53f22f52c93fda63cde06de632d7f5c3004ad7c5542d988b32066d9da0cad6404acb25d41cad9f1975d3f3e8bb51d22f55493f41ca23e07e82cdec4a7b447ab1abbe7338dfc78a2bb373829ea355adcbe64fabd2a3bedde647f3dd29cdcb549afbd9f5c3fb0026eae94194c4cb541277907c47eee4dc8392b35c2567fb0ced425352ee494979b04aca8e9294aab55ba6241d4c495ae125df53eb0c53720ea1e4ac54c9b95fceda91bcb4c248223f1ddb595debb4b2e6d9234295d67b7cdc3db8ba6f28c545958a8bb1396d534fb2f52956b4d9b2d77718a5ef72aa6f9f1b7dc7d91a9507a8e9704ad3152a4de9554dd41e58d86995ca02f78c13997bdfb27a8ec8f4aebf1114072ba91e63501c6c3b9d47523aaff2327ae5774789fecc7cf6163e8ad274b5feb8753fd6c7579b36f9961f0d46531a1ce27ddc9aa7e97fdcdad18fba1f540e8da1f45be3a517ac5e4948cfd37a9bc3f223ff584afe4355f2ef9cb12c41cf2ee90b543e422d610deb6f2c56c7fa39d2d693afba9f68f7a41c8fd3a3931565f7dbe04bd230b309df28592a42709fa7bdd49291e7ed9444cb23f95d690ae1304bf9ea79ccf9d389ef84b70d8d8b1e9b2f71e0bcb9c4464e8e7af3bd10a36d2f5762b7e0e659e171d695bf257fa99bd242359bcbefaab4cbac137c29859ff432cfee1ff2f233d7cafd1a4223c0b298e61314db9da687f35ced2f7235af073f113cb66b96d694598a23786a71b50d354b6116b7f455b23b001344cf3cc63f040d0dabe1d6cd72ebd772bb39328939dbd74aec5045e694711956a5dccd0680929b116e2a72522ab89d6c737386dd2b98338dd2a084b11ad5f28a788eac35495b43441b9fad2ab75b2315b677196ae5a7b3f6210a94b5df2349d991a6299b850a68995d1b70b7cc21c78a865e1428abaa91a4ec289394b5b1299bc58a445bb8dc12c219119e680b33df2692ff2a167dde6576050b1e350a64de569924f3689364b6729129db2126778cdd782b66ce47ca2a2d65a240e4da2e49228f315f9081c87dacd792bdf6e46eb1285036604692b2634d5256075517e38495f1c1a9d591a0e9ec21499a8e0b6711ed1909227f6f9724f2f86dd53c490ea94481b2cd839294addb565e2d39ba1a05cafaec9fa4ec04939435259b2749eaf0272ea3405ef1ca2479279a246f0789bc325b8405a2bf1b950ed790a649ba4eca5df14cda179f0ce04573aa5548c74582b229a549ca4e365d9b4225b0bf5d0cabec7595c919b36455c0d51829d6af45a5f5f6fdf42491a7e46a8c44eeaf968ae1e34318ef844581b6df51eff5d45cd1962cb07cb692ef222a618b13e3a851a06de1dc246da799a4adbaede9f8eb73ec165b14c869353449cee926c969e22a8a3cf915f658c772dbaaaa44f303d6834581ba858393d49d6192bae69ea8732fce8d02813fef9924f04c9304eee86a82383b21932bfc9214468134b63649da5926496b80ac6e28c387b046ab5f70db7e49c2ce3649586344d8187b6d8c7b67784942cfca4810b701cd2f9c932be2284bf3ac6908887b756a92b8734d12578fb907273950b4c6719fda3d49d57ad3e3b8b35c8bd4e6d8f567342ceaeaf9499a36e4a2b3de33f233040b6726293b2f9c43dfbd2341e4a08e4922cfcfddb89a6c7b6511e9a49f7c4092ae0b4cd2b513f3d22b9037b14581c27750c7eac26d3134e9f41060b57214282b5f94a4ec229394b560991ab9aae50cd168f0ae45fdd18b4df747d5e36bd1ebc43f352749da25b92baceeea215aadb941b392946d34dd85a7288b9277db705092b04da69b20c9cd39519d27b80dcd135c6a92aefa2c755c8dafa1e4a07c914c14c8ba6f4992accb4c0f80abe7dc79515c19c1d5459b9727a9bb7cdbb5d3a23467b0717192b22b72353494242c4aa368138724a9bad2245578b653d5781dcbe0ecb528d0f606a2ed2a93b4d566f2889ad3748d02491fa0dd0657e7aaa59f3a423bdca6ac3222dda32968acf61ad3ee3e391f005b32a2b8d0e57ab4d0e55a9394356599bae5d16b5ed445ddf1ebcccf0d8cb4c7299c1d5451dad3c23743024dd76fabde64a49c3fea7edf607a8436fd8c40541721541d95a4f0c6dcf53071cbbf2a32a317031626c9bac9749b3f49166fca466d51f2e5b593546d36495533175523ec0eb873e6bb7376db5254349db3bfa240dff54724e9bb39976dff2815c7f20549926e315d5fd26dff296c7a4496bd0f421b796ecd55bb3f695b519cc12c2f4e5276dbb69a14719a14515988fc06dafb74fbb618198bce20e296799caa1ad52470f994a3eccfeaf0c72f7daa089f4e19c95631d8c2c8275038363a65841fe5183ac9efc847a78414a6e91f167a3c1ba1d0c3cc52a18fdd2a8519da7a851e36a9156a6ddad579bbb7d6dbbdacb7bd0eab1566582259e8a9922ef4b82b37fd73c991ac425f4b850b7d0fee1466bd4aa330abbd06853e37771466b976a930c3ac46619addfa853e86f90b5376f214fa5aa35ce869ed7ca1c771ce42aded80851eb747a77f6e326222f332bdf458b8f4795b6e5ae8692143fa54932b44d2a38165177a5ea4e3b6acf4dbe5680b8692e1ad0dec4e33fde94f85e44c4d619a55d1a96f411faf30e3a08c9c13d49e5ffa39f702bc4ccf25d9cbb420a150fb609e429ff3f885bef7da1766313851e8798b536196a392c983f970032e79a05e113f98efcefcffbfcfcc2be267e6ddc549f843f45e9cfeccddb918f51b60fde3f6c47f97dbde9a3f20a5d62a25b54956469731f8ba105461aa746bb97a362dbca8924defe63b96ec08de6392387005a5b68865d643de4fad9dc5fa99a37686296ae7c793d4de6b92dae60a6a31a0fbb0556ebb297b2182a3b389293a774174de17263a074692cea188cefbc34467cf48d2d9262f49e70361a2b35724e91c8ee87c304c74f68e249d2b119d0f8589ce3e91a4f34244e7c361a2b36f24e97c09d1f94898e8ec17493abf43743e1a263afb4792ce3aa8a1f498493af120bdb7a153fe7485fd64f43a9e4fb224ad8fe7c24a1790768ac5e7cd79839dcdbaa6e85c1a4bd2f94498e81c10493aa7233a9f0c139d7d2349671d44e75361a2b34f24e9fc15f9cea7c34467ff48d2b907b2ce67c24467bf48d2d906d1f96c98e8ec19493a57a0c2fe5c98e8ec1d493a5f47743e1f263a7b4592ceb3109d2f98a413a6692932dd5fd2eb95fa3192e0c83cd81499b7a2aee68b612233e5b3111120f31a44e6963091591441322f4764be6492cca619c874d7e77d2338f0d1040dcfbd1c162a7b4792cab31195af8485ca5e91a4723ca2f2d5b050d9379254be87a87c2d2c54f689249537222aff17162afb4792ca43510dfe7a58a8ec17492abb232adf080b95032249e5db88ca374d5209eb88e73167e1abfc39794774e753e5067b3bd54c11f90a1a747b2b2c441aece91823f21944e4db26896cc7f01a72b88eb2018ad9305b9c2ab44416af5acfc1c46f2b53047fc89204bf930b4bed6ffd2bb137047151ddb3e7515eba7d0922f25d9344c2c2047a24130f710c651536a5abcd7ad206a6682d43b4be679256bcb58b5be102b1312b0736696c9ce87a44defb26c9c3bbca4ab79b227d2aa2ef835c14e925d6434b44655269efbc7018a1db9906eb7463b45e81ba911f9aa435b9c39217e515f65eafe5a2be8eb25d96a146d147b99834a35a97188ed3dccbaadd8dd159c3149d8f233a3f0e139d4591a4f34644e7d630d1d9339274de85e8fc645b0e6fc874468fcaf710959f9aa412b662f7146dc98a5c553965a6a83b0535853ecb4533bc9f648b3920afbe29f29e45e47d9e8b76242ec2ea5dbd395c9fc167588dd0ba2b1aadfc228cb4f68c24ad1fa2e6f997b928ea03725fd48d35cdef4755cc5726c96b9ca1f1039a1aada9d79ba27125f2985fe7a2a62eda6e6aea0a44dd3726a9838556de9adf4697f61b6b31ee868af3b76122338a3d99dd1199df8589cc3e1124b32f22f3fb30916970dedb18990311993f84894c83ed476364f64464fe1826320d6e773646661f44e64f6122d3e0c4833132bb21327f0e1399511c4c2b4264fe122632074490ccc188cc5fc344e6c00892390491f99b49327762a9474450e72847f970885b5992d0dfb7ed148403c50f31313af7ddd91495d5d098e51fb91ad8586e3f94a3818d853143d40d42c5facf6d6985ee41de28ee1fbb030df1fe958bea0616b60032355669904c6363952fa122fdb7493277b1c9f47208fe2cb6d8a67d987d06f06291045fcc5a623d9df221ef081cfbd41d5541ffe4625c9d4fdd2697a942748e7ca8b1a6d15a44e3bf2669ac8768dc1e0e66fe0911f79f49e20a14958f7aae917fff807febc07d82bad1f99e37e286e8bd16f950be99c038bd5021cd65cec27e4ce158db5eb7a715975d10bd3193f4e22ff36c0fc5fe6b54ecf34c1227af00ae126bd07987712c1ba1b4c7e86e8ffa06d963dc24adb02e9d5743950cbee79023ab34d6189a807a42f926e9839e90b7d1a2280e09ef8e0a78359354c25811d5a94c3d77dde8b0b031dbfc1915edea6123d4a0851a23f40744688db0116a727d9b29427f4384d6cc4563a8f776d218fa0ff9ca5a2689f3fe719a293699bc6a9a6fc32d355b0d2d3045ed9ba846af6d925afe11ab850c7f5472a8ddce3458908d6d0dad89ecb1ceb6202d8afb696b20d2ea6edbb663d4e772daa3425b2f979d435e994c43bb19e9c989289e14f813aa9febe7a27eeeb59dd4cfbfa1a2bd8349e2e07b8bbc57bd54243ec71eac88faf8f8184461835c14692f9bedf0110e468fb35b678ad6a3d17c63c330d26af4ec4a63b47643b4ee980b4fd9773bf1948d50cdddc82471febf0569709784b11e7511aab11b87894ea31f8f3146e71844679330d169f4c47e6374ee8cbc64d330d169f488796374ee8de86c16263a8d7e00c1189dc7203a9b87894ea31bf68cd17913a273a730d169f44b51c6e87c07d1d9224c741afd168f313a7f4574b60c139d46bf14658cce1d5043a9d5b61ccbc4eb837a9a1c7433d623aa8f7a44ad4d52092b82bd2dae367a6493b111ccf3915db6091399060bb93132d72332db86894c832346c6c83c0791591026320d6ec13746e69988cc766122d3e046676364ce4364ee1c2632a3f8e5b25988cc5dc2446614e723a72332db8789cc28ee3c1b88c8ec1026320d6e743646e6a588cc8e6122d3e0167c63645e84c8ec948bc9b43edbc9645a2dd4752c34491c7c410296c12c4ad30b8fe22e9df7900576cec57006559cddc319061b40c6a86c8806daba8485cade91a4f20444e5ae61a1d2e881b5c6a8ec8ba8ec1a162afb4692ca671195ddc242a5d1fd10c6a8bc1651d93d2c54f68f24952b500dde232c54f68b24957f22ab2c0a0b95032349e5f7c82a7b8685ca0191a4f20944652f9354b660a9478b0d65d3d844c60f15e3828fb40f7fa8b2217270b898b149dc2f5992d2de2629ad650556d83dee12eb21d02b7a36588008eb939bcdf34552b1cec170453b53f43d85862bfae6629ca7ff7632ced31211d72f178bf8fd7fe0d2e02ca2b10d7997a3e2dc7f5bd6ce186e56240ffe1c87da8c034c525997c91b428733f856a331da8c7d9e281f59e0c05c78c47edb89476c863ce26eb958ce0723dfcea72cb7b75329ff871ad7bb6f5b4fe840395b930d4e6619db9afc10a272502e6606e9ba7aaad4833646665d5364ee8ffce31e6122d3a0651a23735f44e69e6122d3e0723e63648e46640e0e1399061be2c6c81c8ec81c1226320d2e813646e60444e6d03091697009b43132f742640e0b13990697f31923730022737898c834d8643746667f44e6883091697009b43132f744648e0c139906676a8c91391091392a1764527bc3e4ad76513c83b21f22737498c88ce209a9c3109963727d188eb7af819ba4d5d467abff4183bf63c348abd1dd0fc6687d1bd1ba572e0efdc433de136d31f8a42d1f5dafb4219d23bca708867230f36d6c90ee61e408f6cec5446e5162e87839cbd9596dc646df3723fac699a4cffba7d60d3694d69ba2f1693489313e17a706722bdcbe4e0dfc1e59e2846dd93c92a770a3f8c9f58dc81ef709139951fce4fa2644e6c4309119c54fae5f8cc8dc374c6446f193eb972032278589cc287e72fd4244e6e4309119c54fae5f84c89c122632a3f87d9df3119953c34466143fb97e0122735a98c88ce227d72f4564ee172632a3b8f2f23244e6f45cac84c3a34463c5e05ba93db451ca0eb1ee17e76264c8d810f11c96a473ff5c7cf329f96589327b7fc42a46efdc89e2f1761bd028e6016123348a6715ec82083dd024a1fc233feea5d695e6e832b6c8bf1a2ad0334cd2d55eb2bf4a863f0d3ccd6266b8a540b15d15c1759815c7298671f60a66f8d88756a668ee8396bdceccf517cabc936b7024c918b57b206a0f32496d3b05b5eae9b5f1b6680b2dae4a8497adb0ff19f5a89363a6469710c1b3c24eb0c1368031822f4304cfced54c66f23a4ab405c6b82ab3b1a87d60bcbd6aac35703caadee684e783c4511c17dd0f513937173bcca1a5b0d48a586517f5caedacad7a1b6aabce334fe9382bc8214632be317599ed2f17db540fb362e659bf1d40ee104a2ca0627394763345694b64a5c526296dc8f007dc715b362753c6c69a53edd08049496eb7aa5626064ca237305217d9ddfc707c8278b805b2d44a75991d2ab3ab2483d31e334c51bb1879c90526a9adcd7d86f563aec5c002fb65674957f40a7113648d0b7331eae97d976514d7bf2f403eb1344c740e88249d13119d8bc24467df48d2590dd1b9384c74f689249ddf20dfb9244c74f68f249dbd91752e0d139dfd2249677344675998e834fa710f637416a3c2be2c4c74f68e249d5b109de561a2b35724e93c1dd179702e26e7b2e954babf566e70f96c3b53347f8bc6df2bc2db7737b896c958dffd79446da5496a7710d4f69608cec1509c31f226a2e25f6592bc969eedd2bd71d0e0823063db065f43a349cbc348aac1626e8cd45711a92bc248aac1850dc648bd1591ba328ca49afc32af29526f41a4ae0a23a906a7868d91ba1191ba3a8ca41a6c951a23f51244ea216124d5608fca18a9ad10a96bc248aac1c58dc6486d89483d348ca446f1788b4fd040df616124d5e47141a648dd8a483d3c175f042cb2d7312d632bedc5371caccc7a6d75ae5689185bb9f43e4b1279442e88a4d6d539a2f7b44fee3658cc7f3745e4cb88c8b56121d260d13646e40b88c8234d12d91a156dd8e835c65e5937dee26489cd49b9bda20974ae6451def2753722f6a85c8ce97b5b42cbf781447147fc43a80a3a3a4c741afd08a8313ab7203a8f09139d4591a4f31a44e7b161a2d3e8b62f6374de8ae83ccef466c4e4d2c571d6830b22b86cb131aa6a8e37495723969c2d7212e7c226b7bb44b9695e826c6e5d783edb14c513bf06a2818d13c2e40d7b45f22c86e791659e18263a8b2249e76644e74961a2b36724e9bc07d179722ebf9955c99c9341b6afbd6d2fa2951fa7985f5433d9d2bf9c95db8f55592f243f49bbcdf6b819eb917745cda453c379a074145786fc846afbd3c273ee52cf48369dce43367a7a98c88ce261a9e72332cf081399513c2c753d22f3cc309119c54301362032cf0a1399511c2d3a1a91797698c88ce261a9c72232cf091399513c2c751922f3dc309119c5c352572332d78789cc281e967a0122734398c88ce210c8a588ccf372b118812f36e09fd171b6b86c3f63f09b1091e7e7ea033ac9f99fa89f41330bd177412e760d71fa003547e4ad37455e1522efc2f07cacde60bfdbd877b01e40639817e5c21ff6dd4efde145c8262fcec588258cadf3b1c995f66e4a8791ed6b8cfd2c346279492eecb327db3e97b37e8aec73631847d47b45720bcb29c87f6e0a23ad4647308dd1fa292af6979aa4b59ea095273cdf2615b04b4d4e9c553355cc192ae6976dcba651ce36a71e6c8c4a54b42f3749655b05957e4e8b37d80f37d6ffb919917b4598c9353862648cdc1b10b95786995c83639bc6c85d8cc8bd2acce41a6cee1b23770e22f7ea30936b70bec818b9cb10b9d78499dc287efe640922f7da30936b700ede18b9672172af0b33b906fb5ac6c8ad40e45e1f6672a3f8e99eab11b93784995c832bf08c91bb09917b632ebfd7e18cb93ac702babbbdf8a84083d55899294a5f4594de14deaf7845b18570331ad3da9c8bad5f456cfbdbfaf51e4b92787378ed338a43323351d1bfc524b5f559ba3157839f98ac6d8aba3c6495b7e662898eb70d897d23b9dee9086487b78589cc28ae773a1291797b98c88ce28e8f3588cc3bc2446614777c1c86c8bc334c644671c7c74a44e65d6122338a3b3e562332ef0e139951dcf15189c8bc274c644671c7c77244e6bd6122338a3b3e962232ef0b139951dcf1518ec8bc3fd7eba02832dd837106bde73a53b416a331a307c248abd1c93a63b4ee80687d705b7e33dbfd091f835ed4d8077cfab024950fe5621f481febdf0aebe6128b899c6d653076d0c55d88be87c3fb611e839669ecdb322d50217f2417a7dd50be7398f5ea32c6f788f04f41f3cf9f983caddb149d8d510dff6898e81c18493af744743e16263a8daeca33f7717254d81f0f139dbd2249e76044e71361a2b37724e95c82e87c324c74f689249de7203a9f0a139d46fbeec6e87c11d1f97498e8ec17493abf42743e13263afb4792ce7cd4507ad6249d1d6c3a27da09c35a8e4a1bc4d9073ad17a8d0f7ac040ddf676e662114b12fd5c98be6c3cd0e4949cb18191d25892cee7c344e78048d23905d1f94298e8343a616c8cceea88ce17c344679f48d2f923f29d5bc24467ff48d2d91f59e74b61a2b35f24e96c81e87c394c741add3063ae664785fd9530d1d93b9274be82e87c354c741a3d91c4189d67203a5fdb962740b80bbac1258ac6361bb4433df9ff8585cade91a4723da2f2f5b050d92b92542e4354be11162a8dae413646e52788ca37c342659f4852f930a2f2adb050d93f9254ae45239e6f8785ca7e91a47238a2f29db05039209254be8fa87cd72495ed15547a5da9e45e9a6870baa39d299a1f417ef4bd5c9e239aba5398b2df289e237a17a2f5fd5cd04a7732f1c978d85e0d6e4868608ad6635892d60f72e15fc15a4bd376360d167c6316fa1af2af1f86e95b8746573019db90f0201af3fc284c741a5dc1648cce17119d1f8789cea248d27915a2736b98e88ce6f7666e41747e6292ce962c79b4ca02eb06a7939f13ce0147da75397f75b8bd52c4f9cc83d3b0aa8a60857413aadb3fcd459309933ad17a9c038e150dff527bc787f315d9e25cd06a6c99cd5c44eb67e1f9787914b7c3ee881af59f9ba4924fd65432e7709f79d68d49b600e3ade87273b4d537455b4764815fe462e32bffa6c2427b1162b1bd1cb1623b3a90ea1c44e697b9fa900f2ed451fe0ad20844de5726c9eba7f085ce695e932d21f6b6849ec64a6d8b5ca61855aab45779565a21b83aef26df81b5a1dcb667996c420d32951567a0eee7d7e1f9ca5cbf481e143417b547bf091399513c28682122f3db309119c58382662332bf0b1399513c28680e22f3fb309119c583826622327f08139951ec191d84c8fc314c6446f1a0a0fd10993f8589cc280ed5ed8fc8fc394c6446f1a8d44588cc5fc24466148f4a3d1891f96b78be2a6bb02e37f655d98ea833f95b2e0645fae77e50c4981dde87ecf07793e4edccd26f789d2238d9665b5d8dd9674f96a4f88ff07c25d1605137f695c47bd118fc9fb928ea03b7a3f1cf275151ff2b57f396b32c21e6d92cf0af704f46d31ad3c4245bb427d83e4385fbef5c9c48c749ad4c78cda89f48370cd9e43f26e96bc7dc4bba96d9be905aeb395abce6f69806bb93b34c11fc2122f8dff0543e069becc62a9f1ea89df95f78bf0613c5cf9c7e86ac9455df8647a4babb96511cd91c8b2aa498492aa1978e17d28cb46b792ef270db1ecbecbbd15d95d41b91996792cc9d3278cfd473137b99f4a1c6eafb37900f8d878d50838372c6087d1d119a1f3642a37802d83d88d06a6123d4600bd4dca1d388d0ea6123d4e0749b31429f4284d6081ba1069b4cc608bd0f115a336c841a5caa608cd01710a1b5c246a8c18534c6087d16115a3b6c841a5ce6658cd05710a175c246a8c14588c6087d19115ad724a1de3f2d31c51e15e5bdfcf936dc52b33dfa05a6a87d1b0d8ed4cb85adc218e93cd487c7c049158c126aac573f1fcd22d50f1ba1065ba4c6083d1911ba43d8088de201022310a10dc2466814f7bb4f458436344928dfbc559218051d673db84054480b2258ab376249da7634491b4c197b993d727f68cf18a9c68eb1f817d5e78dc2486a14cf06c94305bc71184935580d1923f55764a94dc248aac1aac818a97f22529b86915483dd4f63a47647c5bf591849353848628cd45e88d4e66124d5e0509e31523b2252770a23a906079c8d91da0591da228ca41a9c5a3646ea8988d4962649f5ff49d3282e7de88b46485b8589ce8191a4731ca2b37598e8ec19493a07a1c2de264c7446739dd30c4467db30d1d93b92749e86e82c08139d7d2249e7e388ce7661a2b36f24e9fc18d1b97398e834ba35d6189d3154b3ef12263afb4792ce1d119ded73b1209ca213c3cd32bbdcd6d8eafa175051ef102632a3b807be06b2cc8e6122338aa7805d8a2cb35398c88ce22960f723320bc34466144f013b0491d9394c6446f114b03588cc2e6122338a7be5aa1099bb8689cc289e02b60291d9354c6446f114b0831199ddc24466144f01ab4464763749662b1f64ba5731196c24ad3345eb26446b8f30d26af43bb0c668ed89682d32496b5b05ad7e8ec3305849193b0e630222b76798c9fd7fe5dd077c5545f607f041441141a9222822020236484f144b80d011a4a9804248421209241042b1a0a2228abd606fab62c1be96b5f7babaabee5a5757575d7b5f5d716dff3b73dfe5fe5e0a04767ff3cec97ffdb069efddbcf7cddc7b67ce9c3943ec4ed1707301375d322ef12646c3ed0cb81992713556c9790b72f23225e31287ac34dc2a68b959927189c1151aee74c0cd96b1ee6eb0a9bda505b5dd4e63d15e0eb4394cda3606d78c0c093ece0c2c4a13ab476870b46a4e762fa1082e970d5765c2cd50ec536d1dbc0526aa244a83a3550add0de0f224cd7ce6aa5c35df17e697f696c499a792b30038f791c499a692b33bdc5e064ae2d45922632870ee2b89334325e762e0dc4f1267a64ace1b80737f499c592a395f05ce03247152f7e9a2717e079cf99238735472b6868ed2a05456b38d5f7ab8173c8d9256b7a10202738399943deb69998d0d6fe09c13310faf070bf93838fd87684026668ed2908f00e4020dc8c449121af26770b918aa0199385942437e0f9087694026def868c86b0179b80664e284350df97b401ea10199388d4243ee0b37be911a9089430e1a726f401ea50199989945433e1490476b4026ae63a1210f07e4313e06cf0dc5229207cfc48b026df0dc11280f9442490d87d328cf02cab15228a9133534ca7d81729c144a6a189c46f93a501e2485923a4143a3bc0928c74ba1a486bf69944742f87b82144aeac40c8db21b504e9442494d06a251be0194937cac56296d10b32915debcd1c4ac937d8c89a24ae5f6c1f6e955c6ce7a357e7b4c6230909650792cdc9c0ed6804c0c06d290cb01f9100dc81a377a3d04900fd5804c9ca0a1210f03e429527a0dd4b288b45ec3ee4039550a25b5861f8df21aa09c2685925a388946790c501e2685925abb8f46f935501e2e85925a559246f934504e974249add947a3bc1006ab33a45052ab49d228670265a1144a6a05731ae57b4039339579adde169ccf63514e3431651193b27d82d2b6ba3297555d6c6c7ef57cf7dd2ab764d23e9446485b9e7b0a1016fb485a6fa835e2e1e85b0cd38a243d06b950259238a913c634ce9781739624ce012a39d70067a9244e6a66088df32ee02c4b65a728995363a5beb781b29c49d9c7510e0fbeac366302850aa750e5eee6e3dd8bb12ba76adc77c3b63bddcc76f88382e714059f87bf6a68f0b1247864310f9bb6b2aa3fdcf38f606fe36adf7b98713721110e2e722f435f4e5d1f609beda3b799d6e47a9bc7026185ef6287f5e77ed62e18479cd9ecb41989750f1852ce91c84a5d3649637d0f42717399ac1d37d05d8ade29f5de7e01eba4af8193be32b5dda4f050158e9238f14b2b6db4059ce8554ccaae09ca012e05a724d1226b82a357b9272d089e1e9ff8f691f3dda3f47586ee82d6392f95add35b714d5a38ee3eb85ece6752f632b5d312e29ee5c6e57e684c4ce80117816a26f3ce8dbedbe70746c50e7642d29f82c8fb7a7312efb5c0bb20b5298e78404feb9d6905b9cf83117e8d8fd15366f06f4ee29717ba9b98a7d1132d48b212081732093b01615c5273841b889698c5be20695370abe09ebf8809d9cd418e76d1a605c115d39ec2f6c113cd21c177531659a2c1ee08b08b5339b7991c11d5b879d634a05cc2a4dc164e76bcd77b38c1e7b2f0c603de913e367e19502754d774ae96c700e6514ccc96c117e589fee510132ec6d637a06c055c47a7f61aa83ddcb12b74788e4975b8233f18588e73f76fcde18e7ba0752e6592f600d2f8e350778062371ab7878e5193078e7460dae8fc03003ed6c7f011dbece4e081f6a65319bcf0eae08025c17fb38327cc4c5c04f4b6db9f80f5387e97bd76bb8d61b19d464ff2004beb672e836becf13eb6be888276f1c072b0239d5be70686b99ec49007ade3f431d02e63d276a9e75290ef02c9e50eb9a95c5b3f818bc0094cd0b609d0bce0dfc2e09b3623c45bfc88d69d7a0cf84e94b8d52035e79316d9ac81698f9324b252b3eb68ac7b00eb721fc98a0dc7e12725dd8af29863a9d62cce22b8199d2c89335725e748e05c2189334b256733e03c451267a64ace77e14e7faa24ce1c959cfda175ae94c499ad92b323709e2689334d25e70c38d94f97c499a192f339e03c431267ba4acee5c079a6af8073140419e75e4694f255ed0e59e87ec138136e78194d11eb8d8c3e0cc067f9088a64a4222842e3bb1bf8cef63dc714879587b8005da189d61d796891b438531fb8bf9f236923ac5c662608ad85a64342e2b99238f354728e04cef32471a6a9e4ec0561baf32571a6abe43c18385749e2cc50c9b902382f90c499a992f321e0bc501267964aceb781f322499cd92a397f04ce8b2571e6a8e46c0b1da54be46cc0aa3113644b18115dca2f6f914c99bc1ece26dbcc09feb39fdb255c35ee9005eb9271263ab5282c42c49ec0c2ded7c4d89749a955470d2dd3da6d5bb8a25e2e85921a56a6519e0c945748a1a486946994194079a5144aeabc3b8df259a0bc4a0a2575ce9d46791d50fe4e0a2575be9d46b9007a9e574ba1a4ceb5d3287f8056798d144a6a061d8df22b6895d74aa1a466cfd128ef04cad532b791226e124ddb46ea0613b35ec79f6bafbf8a62f42e9b62e5c43d01f87a39153f737994b4754783e0c674838ff5ed76debdc4b5d039be9216689596aaa11ddee8239e142dda9a69c2759bc92b8a9af64650fde066b5865d2ed56683cc0c044acde8e081a5891b57a9c26b657b68a337f9a8c1d050f838f95a99c1dc209276b5ec0601e49b25616a2cadd21d306f9184a9b1087a27c0bc551226b1034fc3ec0298b749c2246e454ac3dc0c306f978449ac854cc36c0d987748c2d4b8dbc18fd035fabd244c622c8986f90b60de290953e3a8bc1f9ce67749c224eef446c3dc0330eff651ff6363d6b911af9bb4b544d703e83dd240352eceba1f40ff200d94d8e7a4813e05a0f73241bb9bfa2bcb0e3615ee7b298cbed3668dbac29dfe3e89db9ca433634bb46d4e6e81f8e6fd1259d354b27e01131c0fc8e94ae5aa8c7f9e0fd7d50725616a8c7fae02cc8724616a8c7f9e0d980f4bc2d418ff3c07301f9184a931fe7926603e2a095363fcf32cc07c4c12a6c6f8e72980f9b8244c8df1cf3300f30949981ae39f1700e693923035c63f2f04cca77ca478d9ca34d151b5efba7102e03ded63b3a7f5671b67bbfd6188379b162cc8e721bcf18c8f9c4d2cf0533740e7a1b0cf9e2ccadb4d4cf9acaf6d75e28fc312b5bbe2c5aa9aeb767d0998cf3131fb99e41cce59262cb75fdce086f7754f7ffbc63ced40b80d0bfc6a08c8fd91096e7700aa3261e5394c94d57713da09dae8f33a7674250e2e6919c6a7c12dea051f11f888d9768f4a611b93867ba01a8799cbe084ff938fad4db00bd5f8364b8c7ad25aec5aa0fdb38faa9e481bdef12dde5c33d215b0a85aef64b2c65487e670e57d51ce4e9a1a23f49381f2251fbdd6c62ddaca513911f728dcaa5e9684a9b1653e08987f9184a971eee861c0fcab244c8d7347f702e62b923035ce1ddd0f98af4ac2d4d8a9bf0b305f9384a971eee81ec07c5dd25e0779cc090f5aa77d3ec4ecdf90c4499d3fa2714e03ce37257166a9e46c079c7f93c499a992f3671373be2589334725e710689d6f4be2cc56c9b93b70fe5d12679a4acea3e0647f47122775651c8df34de07c571267ba4ace2b81f31f4ccedea66e8ac3a16e22c3c6e36d71a07cf77925acebb06fa72078b1e5eefb5e12206873f69f01f47bbe6794ea5f2a33d8d87ade552e7a1f254510234ed358b4536046e97d1f73a0c9b92543dd018add049d3d7472812b7a8ba54dd4bd052df603999b9313afb8b4cdc9c7416bfda78fec3c9bda58b22eef69846bab2566b1d19ee6781eb4cf0f25f504f254ae3f9e05ddfe8f24715297d0d038c702e7c79238b354723607ce4f247166aae47c1fae9d9f4ae2a4ce79d238d3a1757e2689335b25e776c0f9b9244e9d95458ae064ff421227b538208df3cfc0f9a524ce74959c2b81f32b2667bb04679a1bb77bdf869cb667f61300f8b58f4cfb4d892c258fdb89a9383d68cc90f0f00d937907939c695fe2e8c28334b53cfb7c08867ceb231812a1969b86d62a4d67469568c190d700f25f522089cbb86990b701e4775220356ed4f30974e2bf9702a97107d87700f2df52208977701a64019cda3f48812476d969905d0072ad1448e2c2031a642940fe280592b81c8606391920ff23059258e08f06791140fe240592b8da8d06793440fecc84dcb516a44da5a9bd4eb869efb2f52c8ccc7ff111902b328d59f06a83c51ad71c3d0afdcd5f2571eadcfee425e0fc4d12e700959c3702a7fd2d6238a9514d1ae79dc0d98cc9b971db926a5c459c0377fccd9894518038390d7172f0509bd85569c604ffec677171167a12220df528689fcd99a861376a9c096b2f851da26a7790b072d810d7412a3451b1ab94ed91409b474a3731f5e63edaefc6e67b6accf6dc122e0a2d24a21263f434d4cd01750b89a8c49e000df547b8d26e2911951829a5a17e09a82d25a212679668a85f00ea5612518941141aeae780da4a222a319a4a436d0637aaad25a21223ab345403a8ad25a21207af34d45fe0f46f231195382b4543fd1950b7f1115c693853547b12c42d26a6dc9649d9364199635290234a5b7dfc10f0b54d6d982f3c548543259ed4b430c940986d6ac7a48cb6a648ab05eaa11dd2966a17403b6ccfc4dbf47d3889776fda869167409bec2091354d25eb47d0d3ec98caab663226f1aa398f75e23f01949d98948ddb93c6ee0b4b0d7eac65413e0590db498124f6286990f70264672990c4c0310df260b8f96c2f0592182ca641fe062db20b13b27df0854dfcb295406c477c7ef072ab82cfc399ced126ac1652a17098d8c6c4845d99845d4d72d69dedf22c4a042c925ba5a768fb5c16e9d9d02a776092fe775ba168dcbce72ea0dd9149db650357ce41c1532bdda5c05e14c2e430e26c3b2dccb10c6e45dda4811267da69a0e500ba933450e2d594063a1640bb4b032576e369a06300746769a0c49b120d740280f690064aecd6d3400f02d05da48132c3722cd01900da531a28313847039d0aa0bda48112f33e68a02500da5b1a2831e783065a0ca0bbfa88c4376ed507718c44cba89f6362ca3e4cca0e269ebf0c7ff908d3546acfbe07887d99889d37708227b7c74ce62093d622a7c1c9dd4f12a6c6d3fb08c0dc4d12a6c62d4b0f05ccdd2561123b4534cc2980b987244c8dfbbf8e07cc3d25616a5cb9391130f79284a971ffd70301b3bf244c8dcbb3c701e60049981a8b4d0e03cc3449981af77f1d0198e9be530e1bc24c5e2ea8716d5b214c096748644d53c9ba0db066fa4e6268fcee5bc46e3d2da5bb142e04593e0ab23436d649dd378616e9ec049cd99238a9bb1ad1380f00ce1c499cd4ad24689cdde03a9a2b8993baf701af7502679e244eeace1c34ce39c0b9b7244eea489ec6790970ee238993ba85198df345e01c288993ba49148df373e0dc571227750b331a672be828edc7e4ec66ea6e049d6f8a9c855d7680dbe746efda43053bda54f1c72686dddf473b6dfc36a5c4e1266dbba8ca6631e70192387355724e01ce7c499c592a39db00e720499cd429631ae75ab8760e96c499a392733f689d43247166abe4dc19380b2471a6a9e45c0c27fb50499c192a395f07ce619238d355725e0a9cc353590b24f944d7b835ca7630721f2185324325e52aa01c2985325d25e5e140394a0a65964aca0f8072b4144a6a06328df201a01c2385324725e55288701e2885325b25e520a01c2b85325725e55b40398e49d9ab1eca4ddbbd9d98fbd983c57c195c470ff251a4ca4e6fcc32f313df1e626c3da51050f7cab76c087a8c6742468578d352510095c6f73cf04d60f245d563ed2f9ee54ef6e8d873130fa1e1d1728e03bb7578137d24c7361cd2c08a9c9eb67e68cb623d0258273159ed5955ecda63616050113c393c40897b80fdbc32f84d134d59e2a595b979758d7b696d0fa4937d140088ead08525cbed4e704dabfefb8bd04d3ad8478fb331fb1253bb4234ca4fa02b74888fc0709169ec76b91ad7083f0177f4432571522b7dd0386f06ce299238a9b1761ae73dc039d5c77513d3bae22d492726443c2472d1eee9bd81729a8f2164e36680f4dd80de05c8c3a4406abc93bf0a90874b81242eb3a641fe0090d3a54012b3886990ff02c81952208925296890bf0164a1144862a1141ae44f0039530a2431018606b9050c1b8ba4406a9cf1690e90c5522089a5ce6890ad00b2440a24b1001f0d722b809c95cae9dce431b7c6ea475b0365a98f3699e682bed138bbc04d45d827699f676c05f7ed321f71a001eeffa38fe18b293015eea0517d0e7af082b68b8bddd82de22cf751fba87161356a7e1bed241f036df30849981acb428e07ccd992303596851c05981592303596851c0d987324616aec180d05ccb992303596851c0698959230359685cc07cc2a49981acb421600e63c49981a0be34f00ccf992303516c69f0c98d53e06945106517898aa2636f7f80124642d486dcc283c941da953671f698905fb00654d2a2993b7992752d2b6997f18c26f0b7d54315a60ca821f579b86d6524c7401387b4d9de50e36877bba97b260479b1876918f652ad1d5b3d22c7290f34db41bf00433c48c328382275407df0fbf37ce84ab2bece3f2835752ce65beb83989b90c2e058b7d2c0f18e0da709c9ce521644cbb8e0e873bfc1226de0e805768365cba4c731c7e21a01ec9440d2b674f08de7f95a9720f5b103c21beaa4e37b31de620473e3b71e0a1c147bbb48ab8488056726f77b8a61ee563394bdc23b5ed31ccd21c115c4debeb99669b4cee35b4058bf549b8861ecd646d9760b55df86a38f53d9df2b46de94f8553fe181ffdd1c6a660eb1b74e6c329bed4c73aa086baf675cb8f673047f1bcaaaf70721f2b0d941863a2817e06a0c74903259ef234d07701f47869a0c4fb390df46d005d260d941824a1817e08a0274803d5583bfb7d003d511a2871e69d06fa31809e240d9498174203fd0840974b0325662dd1403f05d093a5811273ea68a09f00e80a7e9ca9317590ea8bdd137ba4b4d8fd9b309e3fc547c99eb0f651a5df70086f932613f39dea334c6793ba27bb7a1e358eb1e1a93a62b79e3655f71c9cf02b7d4c7564d53aed3db4495a3af7046893a7f9c80c69dc8a8d349569362530697cba244c8d69367301f30c49981a171acc04cc3325616a5c685004986749c2d4b8d0e030c03c5b12a6c685063300f31c49981a171a8c07cc7325616a5c68301130cf9384a971a1c158c03c5f12a6c699f5830073958f51796330b1122cb59ae10a16eb49c07a8144566a479ec63a00582f64b2760cbea84ecaa12b095ec678f7322a5d24c9aa84e93634c66d588cbd4dcc78113bb5abca84b5b34b5ceb8b19edcbb6d516162bcce6dc05002f9611651f6c6aef36402d34358d457b3c9ce297f8585fd4d819a15c9553c07b4278f852499c792a398702e7659238a923761ae7ce70b25f2e89335d25e748e0bc4212a7cef499a5c079a524ce4c959c3703e7559238a96555689c6f00e7ef247166abe4fc1e38af96c499a392b30d7494aef1912c936ba25d5bc22c0fddc9328f9898efda54ae1d8a5f3a79228336562f86b4add54cca7d4c72de5195891753272fbace802d1dea8edbabd72dca4e5e9c1d3f675cd2918931fc81ac3fca597079b8cec7e5213d1597075a9bbe132e0fd7a7b2d445f2e541e39e051de0be7f83144aea82181ae5194079a314ca749594d940b9460a25b5c81f8df265a0bc490a65a64aca354079b314ca1c95948ba103748b14ca6c95949b01e5ad5228f35452fe1b286f934299ab92f269a0bc9d49d9dec4ab85ca5ccca8d8458fbced5d409b0a9e6562c23b7c24d16cfc3ed5c4046eda3ed53703ebefa59ce4d4252fb493bc0f7488ee9442492da042a3bc1828ef924299ae92720950de2d85925a3a9a46f92950de2385325325e5e340f9072994392a29cf83bee5bd5228b355521e0e94f749a1cc5549f90fa0bc9f4919edd966a94a5cc558fb52e37c62edb33b4b4d0cf9800fc8b4260a7934403ee823a7a3a159743c5c388fae717de5e33093fe90244e6a7a218df3afc0f9b024ce012a396f02ce472471ea5c4c7d37703ecae46c1d7cd150f5777db79c6e70cb79ccf7c2bffa570625d7384aa7162fdd8cc4fa330c1e1f97c84a5d4a4d637d13589ff0d1d3cc6ba23dcd1570da3fc9bf5a2e3476556565d2b592b810b5078bad2fb03de5a3fd3534fac6391de2894c2b64f63d8cbd9f6642461b364549aec5aefd159a6839f4fa361523c2d236c3d906609f61c2f6aa059bbc134698013c2978611639fa3828f85999bb1c94271e4d2e4341db2ba317303fcb64ee538bb9c2b55d7b661605870d4b95da6d71c2f9f3fa03749e2e16b4e5ffd7c35dff39dfabd71bdf9289052a68edb80fb4e33f3269a36a9c36061a1d557b27ea6818723eef23652623f83727f1cb0bdd464e9e0869a3f65d80f08554ae1b4a0e82682c1a79888929ffc4a6b4a3a059c1376a82872c700552c2904878a812f750fb7965f03b79c34c166567a0fc3393b255f04585b17b5d8e4ebaafebbb16f600b2177d8c8c6cfaa0bdfb862bcc0a5c17a7d2784b22dc930569e08af8928fb070c3498493922679f3987dc7d62ccee9c0f9b224ce5c959c2380f32f9238b35472fe0a57cdbf4ae2cc54c9f937e07c4512678e4acebde0647f551267b64acef6c0f99a244eea5c108df37038d95f97c449dd6e91c6f90c70be2189933a014ce33c1e38dff41db36c7cc54de25623b465566b2166f937266d1b13ce5dda83d871b9c52c0c1e666787346e3cdf13dae45bec495fdbceec014624dae29044bbd3c7b635b0bdcd64eb60e21879f8cb9b4ec2c13f01f1ef52f2d6a91d1f1a651b980e7b470a25b5d343a35c0e94ef4aa1a476786894fd81f21f5228a951211ae53340f99e144a6a448846b91a28df9742498d06d128e742b7fb032994d448108df21b6895ff9442499ddfe1f52ba1557e2885923ab743a3bc03283f625276ad8712cb8d2697119de40e43cd5c2b6b4622dd19483f4e65ebc4c351abc0d0d25bf6866be62792964b516b6ed038ff0893119f4ae21ca092f356e0fc4c12a7ceadb9ef05cecf999c1d4d9c4d14aff3897eac3dbbb2d4c48c5ff898845860ca821f57373805312cf184e4b568c43bfb7416ed50a0fdd247ee6f7a93cbfddd1f08bf92b9469278eda4ad91fc163a4a5f3359a352f5692605a5ea69f9977740abfc86bd22c2b6b9c5c6a64dc78ba7e2391f7d43c8ee80f7adaffb769c051c5ff5754f96bd0d8cff623276361bd39ba46e6dcc2b5b0298df49c2d4380a7f1530bf978449dc3a9686f90260fe5b12a6c6fa2f2f01e60f9230897b50d1309f05ccb592308995d56998cf03e68f923089e36e1ae6d580f91f4998c42a0634cceb01f32749981a6396df00e6cf92308939be34ccef01f317266677130f246d50cd620e77f38f63128b9bcb4d95cbf84d5ea16b9f33df3d9e172162e1de0fb8bf32717b9aff4d8d18e25d9f5659e32708c3fda60199d84fa521bf03c8a6a502648db58efe02c8cd342013fbb534e47b0079330dc8c4e8150db92ba4e334d780acb1a4541740de5c033231da4543de1e905b684026c66769c85b01f2161a9089233d1af24e80bca50664626c8286bc0320b764226f380f353c54586095787ba315583d1528b7625276311b5fc581d836692be5af815cbf56d2408957541ae86a00dd5a1a28b11f40033d12405b4b0325f65e69a0c700681b69a0c49b120d7429806e230d941829a0819e06a0db4a03d5580f670180b695064a8ccad2406b00b49d3450e25c020d741180b697064a9c01a3812e06d00e4cd01d4c3c871b7f1cef0e56e916f514b801a77db07d131ee66e691ba79c6662d48e4cd44ddfaf8b78bfa72d9ab81546f59d24b2a6a964fd1266b5b64b65dc291993d8c59fc73af19f07cace4ccadd4cddf4225c9d9f514f21c1eae011d1228cf8332cca4eecb3d29602b5851bd8f64cf2682555b649c14a2a5a9ad10370abeac2e48bf696b1f77dcb556aaa7de1ad60e195015e575f9da728012e3e8547044f1e67eca6534b4c9451a837f1ad279cd03bf8b886e2ede8ffe735741e74ac766492ff777b7769cc01d80e68bbf9e85cd57f8988dea7870b036dc1e59370b5dd496e2bd538f53c195a6977fe8dac605d118fc18e2d1cefcf76e8834cb8576278c8a1c1c792e050c44aceb4f6ba2db4d79d99a8ede0d44f4e98f0d2bda2b5ca83a027d08309182dd66838212279df398d2b5fae83537c1749981a57bedc04983d25616a5cfb7f2960f69284a971edff9580d95b12a6c6b5ffab00735749981ad7fe5f04987d24616a5cfb7f3260f69584a971edff2980d94f12a6c6b5ff2700e66e923035aefd3f093077f73de3d91066be8b76da6033b9d8072d6e3f1fa6e9f690c89aa692b51fb0eec964b59b3dc505e5a2a98f92e0e1fa821c765a3142db8b89b6f15b496b5ca8500531a3fe92387355724e05ce019238b354726e0b9c699238335572fe07ae9de992387354720e86d6992189931a71a771ee069c999238a925b3790bbce064cf92c499a192f30de0cc96c4492d2c47e3bc1c3873989c51516d4bd5f436c3381518737da423a6d71a9f6b9e2f1f0b7879be13641abf9d39311047dbce7c048436f666e77214ba0cf8727772c7295c5ec21c035980fda06deee3e376d3d0cd6650f0d44a63571a15063f256f03484b92ed0081e1819238a91b54d238b381735f499cd4cdcf699c2de06ab99f244e6a396d1ae77ec0b9bf244eea7ef234ce32e03c40122775f76e1ae739c0992f8993baaf3c8df305e01c2489939a8e40e3fc1838074be2a4ee2f4fe36c0e1da5213267ce89d123dacc7926b4d2021f652da2fa8a73d7c58d1a4e9dd198853409dae95049d1cd3c95b5c066c354c630499cb92a392701e770499c592a395b02e708499c992a39bf3331e748499c392a3973a1758e92c4495d4640e3dc1138474be24c53c9590527fb18499c192a395f01ce03257152f70ba5719e039c63999cbb98bad513c6b997112dedaf76870c77171be29658173aa94a379aa75755a0954a7f1c88c731897b994d9f344e1ee113176cf560313f0603d28398ccf6576311806a8558eda04d8e67627532ebdfa53179e44e83a495a0d81c3a4b13a44012037434c8eba0454e9402494ca4a1410e04c849522089114e1a6416404e9602495cb546839c0290074b8124767168906300f2102990c4510f0db202200f950249acdf41839c0d9053a44012abcad0205703e4542990c45a4734c86b01729a8ff9f386e343586d3b79493f8db52d8b7519b01ec664ddd524cf9fcf34750b4036ed8da6bf8540c6e14cea01b5a86b1a84acdec44812b1db4f0b8d3c0efcd353595ea56e1ebdbe6ca66f213c3243122631d644c3fc0e300b25616accb37b0530674ac224deb26898af016691244c62578b86f93a60164bc224c69e68981f026689244ce2689f86f92960ce9284498c41d130bf02cc524998c4513f0df36bc02c9384c9dcae8c85f90d6096fbd851231a8096af772a4e63c4fe4d184c1ee1235ba9a1b01e1e2ec4d4b8e8e0216899b3257152d769d238ff049c159238a99b3bd338af05ce399238a96bdc699cb703e75c76b1d30a77dfae72b1cdc2e021f60e4edc128776efee6562b4ca546e359adc0635ee4db03d2c19acf251700a536347271261e7064f5c62346f2af614b4c8793e0a4ea505ffa2a37aaad675010bef4cc09bcfc4eb594f1b1c1efcd0269dd4044fb12655eeaa38debd343bc6a931517a76b58f164abb663e08c8d54ce4ec7aae99c9fb61c6c5a8ea4eac55bb9ddbaa83afa28fe173eb2f60458dcad38a58ed0fe3a5053ec6f18deb42e5a8dcf6e924e840d548c2d4b8edd372c05c28095363d7ea78c05c240953e3b64f2702e66249981ab77d3a16309748c2d4b8edd3718079a4244c8de1906ac03c4a12a6c66d9f9600e6d19230356e7c7b32601e230953e3c6b72b0073696a0378e1a1ec989f3ac34e5b78bd020693c7fac8a9b7c193b862bc7dc1765cbed857148a16c22b3131e471a96c9398514f6d93f35894cf4150f978266587e08b1298ccc837935dbd854af7a20b82976493b9edd3f505ecb683f6b8ccc71a0f8c8a0e0e7e58157c56e35ece78876c4ff3f9260cbbd1e3a0139a9158fbc2ade704266b5753bb46628959945838907cc27b5a4c3097d55257c2e97ea29c2b27b19749bb727686bbf949bef7de68fc8a23622ba5ad387a1f4efce53e3a4ab94db4a3b4066e4c27fb38dd1b3712d2183b1a05942b9894dd12940b8253b9dc546fd4c94e84a59deca7c3c97e8a545862e898063b155aeca95261352e889d04b02ba5c26abcefef0db0a74985258ef269b017c135f674a9b0c489631aecb9007b868f32fe8d5fb599a6724df1dd30aa3a531aa8c615efb701e859d24035ae2d5e0ea0674b03d5b8f2fd44003d471aa8c635c66702e8b9d24035ae805f09a0e74903d5b8d6f80a003d5f1aa8c695f09700e82a69a01ad71caf01d00ba4816a5c11bf1a402f6482b64d806605ff1606dfb4eb42bc2dbca1f1dd6762be8bd86b3997b831b99d52b6d5eef2dde79550704dff8c7d17e0bc58cec488c66cbbc380f21226659be08b3277152c76d7c3f9411b8ca6ec887b1ed04a586e0170974adaa8345765a023036e309749e2cc53c9390a382f97c4a9330cb70f24de5c2189335d25e754e0bc521267864aced381f32a499c992a391f01cedf49e2cc52c9f92e705e2d89335b25e7afc0798d244eea6a231a673be8285dcbe4b45f9427c6e0fa98b63231d3ea5456444c1e7153efd7b431f7ded0e6ae9384a97185db10c0bc5e12a6c61a1f39807983244c8d353e7201f34649981a6b7cf406cc35923035d6f84803cc9b24616aacf1d11d306f9684a9719dc62e80798b244c8d353e5a02e6ad923035d6f8d811306ff3b14ab83198c9fbc011dbe80a16eb040867dc2e91959a9549636de958b76c51ebe043eb1c7cb08be1d8284e9189eb6fee6586193b355be2488a82af479b72f7ac1901c8d4e0bf8dfb5b1c16fc57dff79bb932ab0566b1a972dfb5c72b76c79e13fcd4beb26a3360b7e02177d8a6d12ad134faba1acb76f141dd42957d1d46b509972514398ebecd5a07dfb38f9d197cb734782f95c1ff97265e6ff8d378fd68ed9fb6ace7b97d9bb54afaae7dff6185ddbe1b512aa1afcb2fb04799153c3aac8b6a2b0014babf45685ae2daef04f78caae0195deb3ca3bec74d346589a650e6148b83676e4a6a886d42cd9ab54bb41a5b3d788c2971efb5d8bddfc2e03745efb3ffeec1c35c51d270d1c85eeb968bec95283f3a27f155f4fd0d1fd3b699f51fedf7b66134abff9a51f13f6bed1b7a47e1096a9f3fcbfdf54adc51476cf09d6ef8fd357ce6b45ecf5fa5ff1ef66fd194dfff9df6ef9ef8b3bb66dad95d1426057ff9e2c4a938367870584ac3feafc5ff01fda62ff6b7190800 serializedProgramBytesString: - serializedSignature: 96bbdb453a973d20c9b6e81dff9cbc741aa9c545f216fc04ed4225ec8b42f6dfb22425ba07e340fa90176faa6ebd2967879904af0424d44c2dc714b000814e09 + serializedSignature: 582706b8fe9d515c0a75cecbe917ce5cabc2405e5a2fc93f120a3d87fe86115a48c801e7178a38d483c2f19f14f7c88e5236f119cb2a1927cbd37c77c0eab105 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset index 0a52d4f..06404c2 100644 --- a/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset +++ b/Assets/SerializedUdonPrograms/33324f447d661da40b534c9fa93c0ec2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b53144714ee5998bd08089a80788b9a18c5083bab58e62d55a2a8245e08b754c54a2d2b2cbaba5cb2bb467dcc53aaf28ff294bf911f91d73c9b73bee9819e99ee1946b6c110678be99dbe9c3ee73ba7cf39ddb3e43c4197334eb72531276e8bb25814ab62536cd0b7db54aed3c77f0aea67458bca6774af51dbb8389f3292afcbce28dd67e8a92d3a34f29558a1b281f67951a7ef3334b64e4f5cbb467f75eae5f4d2a04571473c168fc409673885c41206b5659dc3723945ba4f89b7d45a07533c8987a613749ba79636dad689e9a0df13f113c45aa7b6151ad3124da2f914148b7ff358c884222fcb5ef9bd4f79e6b2204b57b6f7cbe71cfd95989efcaed272e5f837097d03fa3db22cc9f10386f623b2fda87c2e2ae3d4f641dd9cae034ddc276c6a624b7860e24a06930946a61b0b93cee77c7cc96a78da0ea9658b086834b6087be88849715dabb1934ebfc2f76ddc6bd4a301a243f129fe884dc1cc35e95357ccad4df5f760ad6c700d6a298b0754f2a865718d0ce84984ca124ddb2493ad8b05ba6f81de32b11def9926129b6674cc1cd1f457ce3ad504806ed173131ccee3fe0b38ad83fb19aaeb601d6fd04a9ea2f20d668bcbdea2efba391724647a1ef50bc854ef2fd3404d77481ae6de83ed7ed4c8416884a1cf0fc965d8ebc19bfc1ed3c4470c7d27e32230f934aef9a12154775d78fce8ccc510cc2e635c42bd7dfb78df14371265d123c3ea3e0d0976347ce9cfbfde4dd5fff9cd0d8b36293c84ad3329a22501cbf4c69c91188564115cb7b7c28c46e17774f0230ccfef23fc7ebf06fa6557401e9129ac0004dc2068ce8be7d4d02256cb629a98a881eda6647211223511e61ab26e0ae3eae2aef49e9be235848be9b3929769cb9826e0a68965524a4ea794e27e2b25dd0b2529a5b82dd78e52f8d22358322098c68309c11e1d82c8deda56115ca43a3f5d9a466b035654a668cd51ba464f5348abdf6e5b581b7299c6dd423d8f0c62f7438c7f05de9235c049ea598d06cc5ae88316bec6cad94f394c5aecd56991c57296ad6a3148bae729bbfa8eda6ad4bf8e08cef5b344b1467333bd5b986127510f8f48d60f27db1311fde8f53200bd5c54b6107be5cc84b8ab431cbbb4857df43cdcb6092a6c69d97d0f6fdbae462d5f0fed20a01d8d0997ce8209c2bc06c20a7bc3218d477c47975b8a30c67eca40bca0d34fff7e4786c724fe0be1ef28b26be7d8aeedfeb8212aa4cd6f524d51871ece007edd177f92b6f1bf87cca41e922f98d7f7b2cc51b0f39ba3720d5c70fd8a4c1793e74ad6cc27dbf8ec68c6c319c8b4d8fdf1857d293e256e72b0906158c84442c45ac0c91bef79d720e57a629c0a90084727bd758e60ee0f0b1993e59774968fd3ab6707920f2d49e919edc9cc1a49b662f6173d512b66e7eb5c4db093bd71749e93aa9d9bc162466131f6b83069ff884efbec869d1707a2fdef698e1a666ca1c7a60cb1ddb381933a1be070e29413d0ef065f114b483287533007db0c998ca24f97a7707e715a68b6d3df6cbbb97022f948f0bb84d798f7a5dcea9645953ecfd052150fa86d0584d4f4947be8e89912d9589254302749fd26c9cee824bb135902aa73f625d9240eaa84f4cfd0465322cf2da671492de1b6709e9945ca019394677552fe60d09f096f5ff27bd061b0c59ba5b22d8f49b8867be82d31699b681e15767e59b0386ac2e2331d163f76018b392a3bca76b6db58e8567e1644064d889cd321b262f441f1f4a92c6d98d1885a046ff357336013d678162ca2eb68896a1b34b71ea3027d1c873dde34825b8b46ce62043fb58587ccb7922195e3b9d7695df3da5d20ee9e620da727681c0f4c6fecd662c1f87d5fdea449e11faaf1f835bce10b5e08e8a4dbfda622fea2aa20250a6811d29cbb1f3a492fa85acd79c341b2f93ed694cec5e73c5b8fde86b21f42fb041ec9ad89c3894915c3f9c4bc934e3f6d333e0102c11b8d2ebca466a3ba45c0ac22d5698b367028b8b90ae3fe854d700a00875fdead4a8ff45f80e701e029b811e277bbb608dfef654edc5d0cc241bfc16eb8057aab51f7c19bee0f8ef38beaf21f8b2da1318dddec44247d24a97044faf27f1e2c2a1c2c2e31087d816fc51abf6c738d0f405755ac9e35ea52dda6cdf94564b6bdbcc82d8556bebb1b51f6ea1cc76c023722815b919617dd06a9cc5745c51e94255b50e61528afd884f28c84d2cf4f376085bbcba02dc23a6a0bd69202eb570769a1e18dba45288fdb82b2a04079d526947ca4c86184599c26061ad206ad4136680b3257816cdc266417348bba856df42b6c6cbf95bfe43b6c5e33a7003c6113e03e506b21497989e4313869b1065a9f2dd07a14d0ca36411b14a674674376b1065ec116788e029e6713bcb312bc8e780e6f688ad2f15334ab4b79d816b04505d88a4d60cf697c6596c3418be09eb205ee1105dc6b36c1654fbf153be5b606d8802dc07ac5a139d7a8706a7a9d95ee48a58f258433fff0e09894937f1bf01079444d1e2fd49483048fb1766e8a6c8791c934d377f993aa2811fd34bba69f6e9c5ce824ddcb29467f82563cde421d6af96f08ff1fa370b1999e80192f2a275f8fa9f32a98e2cbfd17cd8c331253370000 serializedProgramBytesString: - serializedSignature: 7f2ff4c155af1d826d4cca7c2679b24fbb6d895c556ddc16dabc817a4281247fb1d8c092a0adc291c9566da81124c68ed17d497455d3795ad91db58d548e030b + serializedSignature: 1b6e2a82e4c2a183d14d2ebbdd9ea5f0d2804c6a93f8a4779e291ff5bb5b9e4ea231808727c549e4241f094df800f681a6357425d398b8a03a79ee943347360c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset b/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset index 271f796..933689e 100644 --- a/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset +++ b/Assets/SerializedUdonPrograms/373d5e0b020b21e4f9e1ee01818fdf80.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed58dd76d346109e752cc96e43d2d036294d5a02bda84b0109e8e19e04daa6a7104e12e786f6242676a85bdbf8d80e27ed23f48d780b5ea1afd01768bf1949b62cad241cbc0102f2b17ef66776e6fb666777b6e0122e7515b75ddaa275ba4e55aad353eae06d1dcf367efe5758fe907a783ec1bd86baabb49ad393afafd567b86fe0ab4f03f43ca2033c9b52bf4d0dbc6fa06f035f5c7a887f03ad54119daa749736e9012da94f7344ec4aa77e50a6d82e55c27d8dfe446d4394e2415ca95ac26d1b357da96b43e9b0dd23fa55cc6aa3ee007d7ad482ccc722b1b4c27dc5267938c1b3807f99ebf9dd52a2f98f9055a32eb95ca9be9900e2b0673eb82cda2ef8fa00651e760033ba10a0b1b02af80de816ddd45a7841cd46f45e977b0d2d9a22b4941ce279620856ae855f23424f1fe53f08bb4c501335d7e9673cb9d73edd00e08f625276316c0b14376807f7aec8db87dac99679263195f13e5b90e97b5a1b2521a05d7cb744c36db93f134d1ba2fd06ca06e2f71d78fe1a9ec7325ad2f61ede7563ee0490e975d43b5c5ab9efd6214d77610d6befceb09bbd67e47530c2d0dba5601a165d9e23eaef0413ef31f4838c2581dc9771c30fa5636537c9e54fb5954070721b9316eafddbc7fb367d97698b1e19a67b592c1831fc577179f9c5fe3fff5ae3a6dd22d766d356724ccb0296e555d4624242b6099655f458d138fc4a07bf2c6bdba708bfdfae29ed2627c09695699c0059fe76f0728c7f0b8defa0b82ef16f9d7e43b38e44bf16e2202bc8f331c19567074b7c45b398e6a99c0678410778e9b401cf8f3059809786768d00e74b8f603905c13c1dd2109cd120e8314d1fe8fc40f42ac7f4e2d629d28b3a7ed8047568949f2acafc8dd63da96d8a7f728faef8d920080769ed426eeecb36f74834c866f143d8732d06979ec15961f08a6cc7a7af651acf968e09e658fd629489e4963b7c5b435f8e1dcf248e1ca1bf6e8b9e8dfab997467d4e505fd5260e93699486b0ad4398dd42fdf15a7c3d94f954be79b430199b9ed7cf0f6d1ee1efb2832b37c3bfa7a3d947bc4f0cb689e4587ada178476f3caa43985a30baf1cf1cf6ba2fe7fb812d195a3a5e5e0a7143bd33d51b107a51e62f8a67cf5c9e589a03cad77ebd362e6b38d7581f3991d68f058ccc84f923fa6f4243919d34f9a2fe559e1af75dcff5092ea700faeb32edfa6f4dcd0092c0a6501e939fdeaf5765bfa09b31a1cc550c19569fded09bd295f0b3e7cb267f43e34f9ded017f0404ed0208067fd9e74afa1c9205ffe2664fc1ef0a6937f4d048449c414ce85d8a9ee0098ba44913e7e7e0473ac98f0efa7e665274b1092f3615e22d0b184cb9ec8abc7e70787e5374ef3c5a87f57123e320aaffab0e871785d7ac7239fc7918f8f9e878733058ffde182c9d9ccabdf9361521916c74679950380f2d8ec765ec68493ccf01999e13e609f9b04ec9cb8f69e0c7c88267b43d94da8630c38cb147014016ed924708b017007c1541de03d2a30aafc1e79e6a02c9b82d28940b96212ca4b0194feeeb4235ec84a0c24a7ead04fc129fb5903b81001f80b9300cfa74ef2ce5b1b215504bc2f4d4748cef1bbb2ac8c9f5ff6cd01b7600a383b02dcc5d35b8b378248690cb0595380152380ad9a048c2d381a1e228c7b9a31d8e64cc166d19949523c4e527895b28b01f595949d66bc3cf4fa4a26b9959c20e3e71b0b01721dc8bc2fcb630d9ad6e439ca3d5c6ea66ed364c978b6ccfcc4e0324512a618e3ada9313e8d644767e9ab243eb319acb87c6a77a6edff8ac60e551d6b49d2e22a98f7853768138deba2145fd6ffc347f2e4f6240000 serializedProgramBytesString: - serializedSignature: 2cefcada50c4a5b70871a978cafaefbe42fa2a998bb7d3909b51644c4e5cc3b173108bfc358cd3927255d5090acfda52d19689e4ab648f10780269b13b751a06 + serializedSignature: 01b53339bf9f8677343688225d6704f284a238d27cc83f666255d2d7433cf458c0f6b23702ddd8c7d851f7ec58f045ebb3640503283992c6b9c837e26c76a10a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset b/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset index c5de2f6..c013d4b 100644 --- a/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset +++ b/Assets/SerializedUdonPrograms/37ebb0e047669b84098b26e3dc0c7fb6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9de95f14c919c76b90e110f0165050f11e0f18c45b514440445111c475d58d228cca2e088be06ab29bcdb1d9241b936cee3b31f7e6dedcbb3937f7b52ff207ec8b7d9997fb22ef937aaaab9967aaebe9839ec26e77e133d3d33d55bf7eea5bd753d5d53d0569c6ff125bf9db59d6cbda5803eb67436c8cdde09fdaf87694ff5b7bf6f11e36c1b7d7f8fb00ff6e2babf388097f1b13d5fcbd8befdd64933ce6141be4db61f17d1fcbf0cf5d3c6e86efc1d1abfc95e1a112853c523f6b67a7d849569558ea21715644ba298f25205d8912fe7e98dde1df6684517092b4f8aa8abff5f16f6e8aef46b9d176b80bec1191ac51fedd208f33c146b8e615a15872b782890fccda2c96db42b95dc05fa5f2f37cb95dcf5f45fc7502ed43f86efe4af2d7903cbe04c583f027e57e81d42c919ff17997caed3c745eb7f09572bb41b16983b4e97569d37f5db4ec746d5434365a1a89759646a2d9235db6ce2679fc94127e334ad3661416b65b659c1eb4cfcf5dd0ad68dbf1ea65f8d3681fb60de81c369b343ad6808ec1b651eaf4a27d38ef3a175eb60d55681f34fa24a7eb1e3c36b9c4c7fa2985afcd711b7396c92dca39b6a1e32e7ce75c5674ec784d0adf14f1fd19e57815da474c0a5ef4b037c572edad54f45328be9df66a19a6df25afec7ab250b16fa1c2dc2dee1214c74f9d5c26b78b7c865f24b7db51f8ed56fe14deb3f8250b596e3a2ae476874cc759b40ff1de50c22d71094f9c3b794feed7583614db79502bb77b509cbd52f721f49d7d1cb63be5f7e7d03e3e871d7eb907b33932de4b92cbebf278d267fc050a0fdbae8773ed2ab2ed290aa86b97af5d8aee2ea9fbbcdc2f0ea8bb426e772bbabba5ee7fe47e894fdde54a7ee9c2b89559990fc5872cf6c5769b679fb336603eec53d2b54feabf22f7e706d4b5f361bfa2bbdfd22da996fb650175ed7c6856749ba5eeb8dc2ff7a95b9b877c80ed01749e03d216bbcf57591f506c3f20b72b3d6cf563c741a471d0b2a3f449226f0e2a761c94db5579b0a30569b45876ccc53e1dcecb16c58e16b9ad0b6187cafc903cc779b40f36bda684c3fee63cb96d65b97e59ab8cfbaa126eb50c7741eeaf61a26e96db6dae1f7bedbc39acd87bd83a67d95d259ccede36c5de3619f749e66eefda19d86be761bb626fbb75cef266259ccede0ec5de0e1977ab87bdeb02d86bfb3d4798de37ee447675a2b0b03dca727db7a3967d15b7156d3b5e17cbf5ddbae4f69892ce6352a74709771cd9725c6ebb95b8dd4a5c3b9ccac8b6a90aed23bfb0fc191dbb64428c148ff2b1db001b67690113bc66bf435a3ba6f76016a48be00dfe368ad34ef261e33817d08c28fbc57875927b484dda11e5b24439b2bb4dbc0ff010c342f4a2f3142f3b4e01c68df0ff0c1a0edfe4c73bc5681a06c4c3fc9b069e01c322d665ee6a5fe0ffb92a67f96947f8903ac31de8297e2ad0bbcccd7686f44a120c9dd538bd5cd31ad98ff22336d071be3f222cec13efb784a519617d173f3629e6196eb06bbc311963b7c5d99c699fe09f75e73c2391e96dd40ff0a9e3d634829d4ded3c35607d5af41d6fe5c8fdc811405f745156c3c2b4e8a99f73e4c45b0cad4626291a6b4b639b4096c839d6c4d2623cd4eb20183c8dce14eacbb7c57b171f50baa5454f06b2bb46a4209bc33d4f4df55fdc70e2d9646ed2b6b3b41892d57a24cd0d2ce8a512950e05f7242493858d60a88a3fa1c32f86777db388df0a372cc205cf8022d133e56680989e3dc33fdce6af11798a0161fc20af5f20dcc7a34ff14f60ac239f1a41b458a07676a45ee652b00b74b04b661bb677ebe206bb643a5d59d8f0a727584a10f4b2812238474750787b676691207c3726540678d8e00c613a608bca500fb04c00ac7624cedb040a61a10ee1dcfbd3e0ceac0882975ae5bb0856b8b697410b6052474f4cc39c374acf1e07f47187ef38ff6e8087cf08a7028e5b0d5a76bc901bca9d268c0feb159a7a92f305c995682433136b28b2451ab28d407681cec052c540b08d102ea6841786142ea1841785142ea5841787149e4b092f09295c46092f0d295c4e09578614aed009039f2a4deb02dd8e43bc82169fa76b2544522ece4a2b919d2db03f1de671aff3f4dc124340707b74b30bee2d45b5ef9662996829ea986ece239845546b315f4758e4e9634609f7f363d67c4887f876580ca2b39a63621fce665fb7778b01544f88750053c21677fecb7df3af11fce12ab1597ba9dc594055ae5aaaeb0e50b91652e22bf220be48270eed31747b4e9f4d552ea39517eb94a10b59c59c1ef5fff89f43bc94165f4231a9cb0393a53a7168cd56fb698397d1c295ba4a2cdacee18854e2fc56e035be2bf05a5181eb0355e07c55de2aaa2cadd394a544c0b254ad13070f0d96213906f1707d187ab561b1526a8c0fe8cfb16eb6cf6330ff08070189bd26a73433d383f53a81e309be1d14e0ac0232c243d509df74d29996623a2dcba8b66243d8b662b94e19c26ff453e35cbc9e1aaa114a691aa175498dd52e8d502d65f5a69056afa04ae4664d892c0858225752b9b8256c2eaea294b78655aea394ebc32aafa6ea6783ae7e82d0255903db843707b52cc36b6b907ab4862a94694da17c6d6eb042b996126fd488df2d0b26be8e12dfa6116f2e0f26be9ecae4a6b099bc8152de1e567923a5bc23ac724aa70cd57aa79fc6a58616de44352ebb348d0b0bd8b86ca6c477e7417c0b25be270fe25ba99cdc1b3627eb75cae0f5edf393936b69e1068d705a0c14afb2fbe14e9e6257d8a3ccbaf09a5f4772bf8e94d691841524a90414431356522e645a97c5901307fc6471339dc58d54a93c18b6546ea32a534b1e2a531355e40f852cf2db291ead6179eca0940f8755de4929b78555de4529b78755de4d29778455dea35386f047fc140d17a7792f25dc1952781fc5e2685816fb29e5aeb0cacd94f2b1b0ca0728e5e361950f52cadd61955b28e51361950f51ca27c32ab752caa7c22a1fa6947bc22ab751caa7c32ab753cabd61953b28e5beb0ca4774cad0c3c2a5fbb03d6c2725de9f07f1a31493b3619974e994c1318015f5611c836394c9e7c29a7c5ca70cb3c10ffb31d96536b89b32f97c58934fe894614202d6f93a2635f631fbb255ee85eb7e315c1811ce31dc110a83824bfcbf8b7fb2a2c334251cc14e3b76afd5ef7217710499323949a5e8a22e454719e5fe3b67915bb9930ff7d2de91a903bbc1f1576dcf2e9fb824a68082aa0749ed292ab58fe852bb9ee50ef6d414c10415e445b7b0e91aff7cdd257541ececa1ec7c9bcece56c5ceec392d3bc73839cbca9bfcff8c9c5e73cb073a7ff253ea4e53e9bba44b5f93923e5c13d43ce99479e2370d582b480a7aa9145cd6a5a08fac37f8fc38b73ad8e33cea806c25eeb8d48ddc76c14f987ce5621fc56040c7a0c557296de52ddf906c19c7f2524a675603cf5069bba24bdb810025b4cfb384fa6df5cf7242c301a7c8fba9740dead2d54896db76febac2035d93a9ea66f0ec84207dd64cac3f4b593fa4b3bedd5789eb1493510322cc44245ac787a8546674a96c20bc0cbc842eb7bfea107da9ddaa78c50d62f939caf2ab3acb8fb8d41a9c435da2c439db43baa499f79b1ea6527a6de63db4aecdbf5f65f03c95beebbaf4b5f94a9f9f7c9ccd345ea0d238ac4b63ff743db39794e11be82cfba005b9ca06e4547fd774c80e764bfaadbda22466f8296e89d0d93ee1060fdbc64f7553f8c9a3288e9a627cd740b056b598ff27c4c5d60eb968e10ef735c784d624d7488bf5568dd329f5bec510ce3dca6b18e4c0199ef22b2227bc6f387c94d1371c3a2fb2ccf4de33af54e872ad01e51b4e9d779ae8fbec8a658a6c2d4e5a2c3e7bd0520a4b268be6c95c2d488b35705b66589abcad1881b3cdd197a1e0f7da580227193cfd890bc035af4b22fa000f32e9adaf5efe52f5eb85807d43561eeeb1854265b9cb13cc1adac15f71b2a011b88f9a84335fc081f98ad339ad792bdf1b12a5360eb85e2acde2ba61125705816b377438b140f5424916d59849548b05aa4b1c0bbc436f8917dff5f048309282cf71c0761b55c871f315d21a5ae69631b8d4bd2726a5ec8db9595c8f9bc4b5d4b594b5294b3ae380ee0554d2264ca29b4796b4f8b466875039bb6912d6021256bc7aca7b6559609326815973c0d624ae35fd10073c2385593c5326f158cb647bc569015187985b1c8b496f588e30dd9a3d27a24718705534ed4744151ce1516010f4582cb035236c4f987722accaa7828a4f65ac2bcee2ba6d1257f97465b4020dc5ac3afe7b4e16d41df32e8373f81327d7b4518c158b938ab83a859dafc7247911a6a79aa01277f0823f2e8e82de903af5246e208c9ae56f6768ea28e5987e49051819a602faf729d7aa9c72e97555abdcba9a94c6b949f96873531ed30729cffa95f2315f63abd08e7dcac72033e5cbe3cdce42eb678f1b41e41deccd3d41dc0813c4f0a8c8a2131282d5523f65b2a5ae96a5d9ba1e0033ac6ed75a2e8975e38a0d619e48559ad38e97f949e04cda72b85a6f777cef8c12cea658e23c86703e6dda8fb07a047cc32e3992ce1fbaf9a6d0952074ef32890e1a9321d1350d883b6e2665773626ae6eda2da6318015a600162280ef360910baa4abdafe39cee5af1ce17b8f497c95b2251c943db3ba4823f792b66348903f94c5a650562394ef8d52a7027733c5af533984703e63ba64aa153bebe0c37230cba4eb02ea500cdbc80a84f27d265156c992798d2c9bd87c2899c660969a82b906c17c364a300db699c660d62098ef8f124c836eb83198eb10cc0f440966530c61ae45303f6812668da637f7b386df60dbd96c0a6a1a417d2e8a500db6a1c6a03620a81f3209b55e421de18100a8f5002c752e7526777019055f630a7c0a81bf6b127c85046f4d2d037a5b7bd8a43f9a34058e21701f3609ce1e295973f36e73ec365ec732cf188ce16b11ce8f98c409973a46e5ecd130b37e7642378be458301583e1e61c04f1a326217a4d84c4dfa95f8c503e6f12e54adfbdbcb3f3318a76ad29b44d08edc766a3e5f43fc764d01f3556e9f7239c1f8f12cea658e2ec40383f611227cc5a3baf0369979fc6a0ff2e42d83e69129bb58c21333db709ada2c5227e739a0b11b44f9984b680657d48bbcc65c49171b1320582c5afaa2e43f83e6d125f25c32e38b5846516dc6f63285722949f895227020f6e8b1fce3684f3b32671d6b2dce98c293910f4ba1ddea8e768ac93d983b07e2e5aa574470c4be94184f3f351c2d9144b9cdd08e7174ce25cab547a083c21263326a7abbebd748ffe7919a34dc03253908f23c85f3409199c3ea77b4e2cf68e41db598cc07dc924386b15f22d66ff4885cbddae31286ff310b62f47a98d8487f0c6af8d6c4538bf6212e76a0d4ecb3987b6ef063bc6acdf897ed0e62d0b10e07b2601970ac083ccf526e3185c009b8f807dd524b0354aaf3d2e2a72e64d30e1db85107fcd24e2a50ae261463f7ec9204863f345db10c8af9b04b9520139f8c097d17a84f61bb3d1cf537349d985d8719e4faa4338bf391b38fdbb4d06177219c3d98c707e2b4a389b6289f328c2f96d9338e7336ad1cb0d19c4183c63b7082410bc174cc2c3172d726f388df34297e508df774ce2b39d21aa2acfd21a7663ced06604f2bb51011947af721302f9bda88034b876dd18c82308e4f7a302d260ff6c0ce41604f207510169f0928431909d08e40f4d8284d920e76c79fc7ae72402f62393c082dd4a6ab07f36e627ae46285f3489120a83fea6e6f85ead2943f07e6c125ef0f1f3ce180ef85a10ce9f98c4398f2c8b715dd83717a1fba94974cb3525f1c15cc6b21721fd9949a4f8b14eea959a595afc676cc2b61241fc79b45a488365d2580bb90fe1fc4594701a6d358de16c47387f69126719d9e1c4af5d2c45d05e3209cd1ef651ce77dca7c6aa10c897a302328e53634b10c85f4505641c6774562090bf3609d27eac83dfee654f0c3b975d08e66fa204338e4bf5772398bf8d12cc38ba3deb11ccdf4509661cef44dc8060fe3e4a30e378c97f2382f94a9460c6f159a95b11cc3f4409661c6f1b694430ff182598719ce8dd8e60fe294a30e3f8f4ca1d08e69fa304338e773eec4430ff321b30a905a6f645b1382f2f5d8560fed5244c6b061d2e3bd84fe5875fa278309e3abd0041fc9b4988d61d615302a3c74f17c5a0ec2d42d8fe6e12db425491e13955f64d74b374e5c6d82d754b11c07f980418fcca4d1c67830eb307e6377d1aa1b9fd27148932592452019ed796f2f9fb002962b592f5033acee3f60fc7b8df116cfdf48cf37bfce334f4c59a94e7ca81948f752e295f0ff84f057e5ab8f553370b6589bac1c39f108ec300ff6e406cb33f7b938639f3044c5106f9b96c774d284fee6aff824293d0b7232379ab09f9f89d1d5d4abdd347d7aa72975c494353fb40a7ff55c87799eda29856894ad6cf73de128787e34e884661428449fe1f9d43b36054c70000 serializedProgramBytesString: - serializedSignature: beee11c6e7e90cd4ec1fd8ed098f44c9bbd7c3c0b69f689299b3cafca2c229a3dfee971d429049a87943835575d22ded272d760ac7ca1b2a6afd9bc144321d0a + serializedSignature: 9e2142c23b5662c75d84c55431c68d656b62ec667f0780a48e654b6aadd1d5d7a6f685f6d57bd747250dbbe50af9959fb3a72e2beb2925335d7df1baf5e1e30c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset b/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset index 31053c8..fb239d5 100644 --- a/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset +++ b/Assets/SerializedUdonPrograms/39c8fe87733eaad46a45adcb37d7a3c6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed574b53134110ee59d8242810f185961ef4a49614bb80c55dc00716af22840b6585403656aa9298ca460b6e9efd2ffe00ff9407abbc78d1af7b7721d9ddec18619142b295999d99ee9eafbf9e999e352cc24f4da1d8a64d5aa4692a5285de53136f8ba81b78bc56d0bf416dd4ef50963136450f349afc7ba4eea05c46cba50e343fd03eea9a8c17c8c1fb32741db4b8b78abf0329350ca5222dd13aadd1a4baa531b12d4aaedfa7d82f9543b94087187504144f62c9d0248a02465c196b007420b7436fc5ad06c6f6a1d3a63a6cee89c59cd085bfa904dd6bc897a94596c1fd4f06a031d0d413c8a6330691cf244fdb01d4160cc47851148e3a3447b3b15edc55a35db817a52c43a2264687a2537c8d4cc1e0ea789cae10b8e87f2511e420d430324d2ba8596b976640ea4ec8ca36a6ad238c0e6da16c89bd5dc08e4aea5ce27085753661d35b4d0df40484b6d0ae0bc282941f05a923e897d1d791b5ddc4ea5e407d20b3457d6fe33d6ece2d9fb2788cf18baa5fbfb77483302dc11b466f717c2e23f24f22c2d46786fc6d386cf11e519f2391b8e4d03b644c39ac3d1b334299eae99b258b9b6a33c2e0e03e463d8c5fdf1edff3f42cd197786638dcf7c483e308fffcf1e5dbafb1ef9fcc5ed7e6c8cab06bf735ae2511cbf61eabdb110bc92e98e6b0cd40c3f4ab38fab3dc593843fa3db99ac80d1e808c64a6de00a871345720b087e79056d1e90a3036d1441d898ccd66b2426e3475ea00f6a3d788a33777d6f4eacf93247a73477e1dd34bde3d2786c1913e0cea309866168f5257a1f94224dbd0df80444d5a2e596c5ad9035ca4184103b639036e01fb9e30a9bf565d49b856554f2dc3eabcf0f862fdaa5cc382533bce3bbd4ffd6f1359dfa3c0169866022e9ca7bcb2327e50296b86e2fa32a59bd39f1e6dd1b8e465271c001ef7b2bd4a384eecd2b9433edacb73b0a9e337a3cd9b7aec3fdf6f36efb7f1ee4ba461318beae95f1e767a78f9eed9b45f8ebaa5e0195893cf7e18e07896f070f6a842a47464bb0630a1d94e72171a11538184793a1fc11c9fe7c05911fc2e1e6f211b36c7e45a9ac43df489f3525e53a863101d30d246fb8dffb157ea99a6dba512d9e9113c9216c14617c11369129cefbb329bbe486ae465d3224ff9c7ec05486836278aebd1fc31e1fbc217f755d90f65e896a53ece25169f3b6a7ec03333d9a6fe24bdc17055fc7aad9fabe415e7e94912d96842542c4e6717daff9be1653a29d79c2222ef1977681dc21501c53ff337e13cb35652170000 serializedProgramBytesString: - serializedSignature: 4b85fd71a67bd49803eaaccb0aa2749e5822038e5d42c57f52403e46e2c274eaa766f9654a001b467bdb2bdabaafb144bc0d40cabfc1f9b40e6521b621041606 + serializedSignature: 320400700799ba1c6b5a4ee930081073e3a36d2bd2984584f5c1b5285dbe36ec5ab71a4be11d6d3295218fc4d64b7236a6cfb65c55f29eb6e9de91822110de08 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset b/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset index 28909ec..6787f4f 100644 --- a/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset +++ b/Assets/SerializedUdonPrograms/3b7cf818728abba4d82a9eb5d6725c29.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7f6f8e70221b895e01228120a2421094e5b24581b0ac55b4a21901028411aa0a5eeeedebebabbbbbbbbbbb7eff5f5b5af6eaff6df999dc93d3b77cecd6e76cfcd2cff5ff890cddad973be73e68ceccc6ca302e6fc248638bfe6b3d96c12cb67f358055bc7d63a7f4d72b66b9c7fee9e3a3e8bd538db2ae777b9736e08cbade34efe3330d1c5f93dddd9dbc0363a776e62cb9ded2a717e0eab74fe9eeedc5be9ecf1a32b9cff95ce558926ce4df358299bc976629d13397588982f6eda208f25b85d8966ceef896c1fe76ca5508a3fa4409ceaecfc9ae39cd920cead719456d72d628b85596b9c73cb9d7b6a58b523739990d8ecaa914cfcc1dc4d47b9cd91dbad9cffcde5df8de5dfcde4dff07a7e9c5bb75b9a6b3b816b954cae7596f3ff57b9dfc5dd6fa4f6bbbafb898e9a8c16404637b9edaee9dec3f9dfd4f973820ffdd39debe9ea30f274b9df4e6e0f96f227827d874142e9de5b6e0f01baaa7bfbca6d2f296392767e6b70afe97c3fb9cd45cef797db3ec8f901f27869483603657ae9e9d392f9f39b16729b57c7f5e964b494db412164b472d3ae718f34d77602d7aae76ce3da2fae53f9856f0f05d71c2ab74d24f3c9daf12c797c8a76bc29723c1b39de4c3b3e586e0f03ba1ca6dd73b8bc672ad877f4cceaa2c938425e370de80ce5a9f3d3b5fb8e94c7770036c1fb8e44ee3b4abb2f5bbbef28e4bea3b5fb9a69f71daddda78ee7807d7e7e47d7c6c61fc9e343dcfdacb0f9255f6e8f95cf2903fb7c7b8c3c3e03ecf3f4b84a3eff2d79bc406e8fd3e41c57879c3fd2e8388c7963ef508dedf19aaf1cefca6c5aeaded7747f96f473be3d415ebf9326ef044dde4cafbcecb3e57eb1dc5e2eaf9b25f78b34bdd4f9e9daf91cf05c785ea5c1cdf2f8ce609f6faf439e57a29dd79fd70ba40d3c3f5cbbee16797eb6b63f274ddab4d66c3e51de3317ec3bec9abd5607bb1175b053e7a362a7e461ecd4798cdd48edbafab053b6deca927150f9a8f2c953a49c79e05a759c6f2f645edfbfd095d142f97c9626ef2479fd7cb00fe5dea69dbf4d6e6f073a2ad6778063b783637c7b8594b300ec73bd0ae5be8ab74aafd3b4e79ea6e9a5fc6121d887f1463d6f17ed79ca0f4dfc95ec1cb00f626cb32fe4f15101598e31b01a0b8e6d2bb7e3c03125fb64700cfa4073f79ac20a796cb4dc9e0aae3f59f38d5399d767b70bc81edaa138433bb637d8a1649f6eb0e38c34769c09ae3f1d5cafce413bc6cb6db626ff2ccd8eb30c764cf06987927db6c18e73d2d8f10f70fdd9e07a750edaa1eae7cd34f9e76a769c1bc20e25fb3c831de7a7b1e30270fd79e07a750edaa1f2b48a456560dfc983adffd0aebb8879cbdf8b98371f2a3933bd72da3c86a4fbc51a2ffdfc25daf94be4f6524d8f4b353d2e93e777d5f4d7cba885400f751f3cbf48bb5fc5aa32b0efd8d7b69f76dd959a7e57ca6d892667a626e72b2ded1587ab340efaf9abb5f357cbed359a1ed7689cae4538a9f3aa6c5d08f450f7c1f38a935e065ecfbc65e0f59afc1b58326e9bee57e7551fc024e4ba1bb5e7dca83de726cd4e751faf673607d7f0ed64569bb7da7d248fd5b76eaecaf6bb34bfb94b6eef64de3af59dae6ded65fdb7fd46795cb591eed6e4dc5d871c15c74c3a4e67debab9dec6bb8779eb27f748991fb9f77550ed399516f732afaf4d01c7a1bc995e795ba93ca1ea972f336f7d6f074d2f757eba763e073c179e57fabfc2bcf5cb57e4f655e47925da79fd79aa7e394d3bbfa376dd6bcc5bbf54fb41eae6f7316fddfc3e975dc7f575b02bd3e4e8ecd4f9a8d82979183b751e633743bbae3eec74ff9bc592795cd9b33338a6f2d66c569bef4b547c55be7a3fb8fe7eb9553a3c20755a0cf69db4c949171f543aaabaa3d2f541e68de30fcaed7cc3f3178063aa5eba101c53b21f02c7d4731e4eda3a4c95792a763e02ae7f085cafcec1f45275f6a69afc47353b1ef56987aa07413b94ecc70c763c9ec68e27c0f58f81ebd53968872a17b235f94f6a763c19c20e25fb29831d4fa7b1e31970fd53e07a750edaa1cae1669afc67353b9e0d618792fd9cc18ee7d3d8f102b8fe3970bd3a07ed68a2c97d9179cbf71799376ebdc4bce5bb7ebf3aafea11bb69e7171b38ec9eb4a58b6a4fd6b71ea0f4592ab7af4b7d7607fbce355da7a591b5446e552c7f8379cbe737a48c835d9dbbdea53dfb4de62d9f9780e350de4cafbc6ed7c97d55c6bcc7bc31bf1c1c8772df95d7e9fb2a6eb691dbb7e4f189609f3ff76cedbae572bb4c5e3f493b5fa13d473f5f298fa7eb6fd5cb5da5db62e6d1adbbca032b349bab923ed3e336b93d5b93ad7cf66d4df6db52b6b263a5267b555276ff71886c55eebea3c97e47ca7e48eeefa1c95e9d949dfbab261b4bf76aedd958fa2fad23fddfd7d2ff7d57d71e0d91fe2abfea69d59a99db295572fb01f3c627e53f1fb2645cf9105ccbb71f316ffefdc8959b7b9fdccfd29ef109f3c6f04f34b99f6ae73f95db8f810e1fcbed671af3cfdc67f7bccf7d6e2fc541a5fd3fb5b45f038e431dffcdbc795eedcf71e5e6aafe2195269f6b7a7c2e198c93fb6b359e2a1d543981e9a7eecbd1ce4fd7ceabfc52a59dff50bbff5f5afaabfb7b69e775f9eb34ff50e7553a7cc1bcf56a55ce286eba3debb5f34a9eaa23a974f852f3852f35bbfec3bced7a257f4fedbc925fa35df715f3d6cb83e6d1af90f37a1ed5edfa5ab3eb6bcdaeff6a767dac1d2fd5aecf01fb2a7d1d3feda9e23b1607543d238a18b25a6ebf61e618f22d4be6df6fc1b57cfb1df3c690ef5cb9fc55bd2786a867fca0f1fb4193fba376fe47b9fd1ee8f0bddcfec4bc79f727f7d97c18027f6e5f95062a8ffec2cc31e4174dc7ff316f0c51fb3286f453ef2b95cffcace9f1b3ab47bf83e5fe068d27164374fdd47d39daf9e9da791543566be7bfd5eeff554b7f757f2fedbc2e5fc5906fb4f32a1d7e63de18f29bc64db767bd765e8f212a1d7ed77ce177cdae3f9837af29f97b6ae7f518a2aefb93858b217f22e7b118a2ecfa4bb3eb2fcdaebf35bbbed78e976ad7e7807d1043faa83e8c4cc49055ee96ff698a218904abcdbfe26f752ddf36629e1822f61db983949d59da33d49893f9601fcacdd2cecbfb138d810ed2ce4453e6c9bb62df913740f67f0e50ef2f641e4da8f1285a0c4934d3746cc93c31a4765fc690416a4c8ef49944b6a647b6ab479eea3750fdb075c49014fdd47d39daf9e9da7915435679cf2ba6b5f737d7d25fdddf4b3bafcb5fa7f98792afd2a105f3c490440b8d9b6ecf7aedbc1e43543ab4d27ca195e62b8ae3424dfe9eda793d86c8eb126d58a818527bbfdf18a2ec6aabd9d556b3ab9dd7ae5aceedbc7253d23701d297b7f3d47be1303144eb7b48b4679ebe07b1cff3fb6369646d621eff4f7460de98d141caf8c3d57b9b12efb3135b316fdfc326701cca9be995b78d7adfa4f25747cd1fcbc17128378779f3bfdaf7d3e78ec55a657b27963ae6433db733f3c4df4427709c6fbb68dcbab8320af3a49c2c4d5e37cdcfba6972bb6be7e578d5445796daefa864f6d4eee9a9c954635c559e547ed3312933d1c3cb3da1c69c96837dc7ae21fdbcd7ab77dfe8f57381fef0bebd98379faafca86ceaadd9d45bb349a5ff42af7cb6b7dccfd5fc73b3dcaa38d7c7eb0b625fddc7b77d35ffedebda3374bdf73a15e7135bcbeb97817dbeed278f4fd1f4eb07e4f0f3cbbdc7c575cdbdf7281b84ad30862adb72c03ef473fdfe1e21efef1df2fe9c90f7770a767fedf34aebb87ed73a9e37bf9ef7e784bcbf77c8fb7b84bcbfabf77e95076bcb38c5479671dba87ec330659c8acd0358321f8c91c7064a396560dfc99bc372b5eb06304f0c10fb50ef3ccdcfc681e37cdb5f9eafd0e4f6d7e42f77ed1e36de2ba7f6399a1c75bf182f04e5546ae74703db838e555763fd14c741cc5b4e0d92ccde73752f52f7a934dec6cb4ec913c7a1bc995e7945655e39e25d513a1bd4f38668693ac495577c99765dbe96a66a4c9f62adc6a22a1f5b088ef3ed602d4d959e83c179b02fece6d7afd03828796a2cea54b0cff53ecf7b7dad7e855e9f53726ae50ed3f49f0fee83fae9d7af70d3b158d5f954590fed823ea8e4d4953ee97c4cd6bd124540867a5e314bad53c93a5ea28479eb54c5e038df0ed7980e77650c57ef18b334792399373e8dd4e48ed2cecb31a40998bf543b098ceb4b8c06c7f8768494b300ec73bd543c6daae935567bee584daf71cc5b87517163b6f6bc5db4e75da6c951fcb3928cd4b95abf2b067ec7c74314827bf9753343f8c13e324d46f9b856ce2d4a6cc7bced73391e36b1ad3c3e03ec3b368f38dc7dc68897bc72981c5b9dd85ede5705f6f9763c48cff1e99f3152c93c406ef74dc384cff552f61ee8e3fabab81cc43cf947bc739369dab5898ffb3de7b212a20f679ad3ea2d776abc05bc03484468bfd31dd59d754f74147d4dfc17ff19281ebbd17188f58e00c36cc379622ee346a7f557649c6dd855f427a8a74f12bfcb9d2b5609a12b13298fb83be5115cb96ae75f25982ab9c1393e55ccb4e49325573967f25999b3e5772d65c3d822e79f57ca7ce7b1d54e63a492cd757eaf17f2963a6aa75e5997497c5aa57ecf6c47a63beb738d7344015defec570b0de788df7b094d2b85f6d39d631bc51cd4b5ac8a4d74b69bc5d3526daf71fe363d73ae4466d6d13cf9133bee4e3155c954ea58c3b52f103ef97f29d21029c2d137e5f983ff34291011e3d89494f83f866e90e185d5742963984096f01c2b6205a28e313b8560701b532d34fbb7cb7b042b496b8b990c4feeeec282640a6f3eb47fef0e9b4b77cbf29a56cc0a4435a5471da6a503cbe5e589565f1013b2b29a14724575fc09137ed1c5352783f8ddeb5689eb8227405351f8791340349be7f29470fe578bdcb74a4cc55fe744ba758ef0d56c82f3bbda89a3e5ce632ba40929e955c885670be4a9056a5d6a63d01b99a08b772e731bc4e7b1e507d2636f566b45127b81a8817549e39cd8b344f5a9b1ac43a9ec73e24b2fecbdcfd87dd6be35a364e4d8c2d1176799d3a785489ffa3c154ba1c6a6146a91e96c517739902e7d5ad6da954c1ffe6366d80af1f1ba74c0083631116cd9303ece75af9f8ff34eb3a11a4333bf36697d309d0618c12c1341f1c66f5e0609ce7434dc43d61eebc7b0ad6f86ed04c3ae29d6f9d101a3d8d440b190536c6f52abb9a616d708119c8d09ee105270334cf056210537373954eb4c67497e6e9d90c20bdee0eec4dbdc83f5b066f6a71c244fd6ad02e64d2d4c69c31176326aa5274e0e9e382d31c99dc34a6e8549ee1256726b93438977fe99afbbd7af8ce4b1a6b3ef32b21b4b57f50e5a42b631d113231f7623a597daa5a4fe9ae8dcbbd2e1b097e827d8e4dc6fea824a4fb4bbef68df43d0cc65a68eb1601a6184db9a3c9f63ef8925bbeefcdd70e76f6712ce9fd8cb4f98ee810b6e6ff20bf1b4a519f18b39ac94ede89c2b77aeaf142d277e7c9623b1dc79369737413c219912de3bd2fb476fdffe912bfca31ff08fb09a617ed201f3933e11f8c95698f0be1108ef6812ce0ba9ad596ae5ff6fe72745782b5c780ea6793f83e689809a77c24aa5fe86522911a454ea8c3119606072b049ed344cba60c2071a849f1c5078574c789e41f845018577338515116b0ec94858a9ebadc754b1b863a5a7b2af9ebb4e7455738d54b7f76c67bb4268c18f732dea7e5b923e300daae503ba33446498cc4c45544359c1c700b410c587396c0e1661d32e9db1c0dbdde4f0bc61c50720a474e971675d222b5bfcf96bc5a959ce13786af2e3fc4d554a9ec8c6f3440f539e10017b6d83e689c9ceef4da222c9ffde4ba6c05cf1ec647763186fe7231f7a1a0a1f510019fd2a5ff855910fbf8a427bcc637a6221b2c01022fb258285c85e5881576828f01a072cf07a9b8473971e66083c853cf0142573bafe9cc1f87372b13c556cca531d449e9ae9104fed209fe778778573e9465305364daeea63ca55a2a692c98e2bd8395fbf8eab125389202a45a95d547e9e2647d6b83fd948f81ec1cc7d607e1e80659abe984b8c34b9448e7089258ed32f717655f69d2ede92f0f729fc1c1f18e0aec61cc431b6c6f41885bba6abc74acf5b9afa6bd00fd360b449838e46123bc9e2b2fe5af4c7b41863d2a22dd0823fadca49f5fa3f7b00f6ecb1a667b706cf5e228afe2a394e40bc2d0bf0dc8158e01e6708dce31b050bdc7926e15c773eb8285417d7204cf27661256f8301d9de04a4713020834dc27949369e856f740ec1349f60d03c2f2b98e64331cd2746a079be4178816889ae4a09b851964cf364dd741f5137aa12611cca4cd6b279584f77352f976630beaafc26a147fa128ccfeff0d7d9c247e7e789f1b074ba62c553011692269bd40f10730a4d8279509fe247f0085cf03093609e03a61a7240aba6c172409149b83b32cf501f11bd1df57b65c66770346dc2dc9f7ce7273bb5a299e67552b1494f5ea1ddc1a0a7a8d0f2e1af8d84bb950977cb4fe36ea6466970870b52712e31d9c323cf0c43e4691430f20cc77c9c0fa54f2976cb842ba502c865fb394e7d80b3752b83958ea9fcef75ceef1aad70ce151de61b9d80bace69af0f1555050eacd23993accc7089c384c4152276ad11f771d92e5a7ebec8393fc6d9163bdb3e8132e008cc95679a5c84bbf2ac703e3912c3bcb309f3d24830d71f662edbdba9d9ba054aae56c7cd15630455f32b57debf9ea92fa1f0226743c0e4188585add986b0d5ae65b0b035da54b68aeed24cbe0c9ce05c55235e07046fefcdf15d5ace65e61781e99f8e957f634cc9d285b9d343ea2ca6e6e24932d69424a2933993a398f4081e2c51e6fb4e9405cc3c82a9aee763c932ce444ff4a2ef9c417a7ec6d89ac92df44d6e17412e27c5aab4c350116adb9a9c9953e373aa9a6bea949a4ad15d7087de0e0b608b0c01ecad80016c7b4cf3dd0c9a6707d47c3ca6f96283e617b50aa6f904acd4dbdd54ea3193ea694a8d8998ea4b0caaaf6c1d4cf54998f0a506e18fb50b26bcd4249cd7e8ca59f8b6e4644cf8b208844fc1842f8f40f85493705e98559822862eb814173ccd24987b56a51fc1695c703ae6252b0c5e7255fb605eb2834938bfbe8a219554be9464884aea8e18a655a6ecca1b08412ba9bc30b2b13d5086a1de0343bd3a1cea1918ea6a13ea6591a18e4f9b60272c6bad3164adfb3a06cb5a334dc279185b1b41189b85095f1781f09db118b93e648c9c8d79e49e2163e41c0c478d01877128501a1c73312fd9600ac039c1bc649e49386fff6cf483244dfb673e26785348c10b30d67b45e07a0b4dc2f9f57bfbd13a4d1d74172c11371b12717da76089b82b267c1f83f0519d83095f8409dfd7209c8fd10a227c374cf87e06e1cf0514be18f394fd23f094dd31e10744207c0926fcc008842f3509e73d1307f9f1f105b8e07293601e350f6686029f7717062df037cac2bbaa1eb5aa6045f332cc96434cb6f013b99ea70679d672ec59879a9e055f8c2f4f792f54ff97d31598168799b4800304d6c8ca4fb9605f7f0d2a310d0e3769d082c1d7e30b84676c0c586eafc0c2cf11a6d8d63d58f8a93209e799f8c80832f14a4cf3a30c9aef1650f35598e64747a0f91e98e6c71834bf2ba0e6ab31cd8f8d40f36acc3f8f33f9277f4fb948c6b2c54e6c5824e3d018d9e8708f2d14dba16c3be7f76410b3960b41d5ce5f7ce0cf7ae7d84a115f368b4ecc4a71b422604c5b83e97fbc497fde819dd4480de3cfadb5698cb467b1e1c58c1bb3f506d41a71c5063990ca6d8ab9f6b9df785f2726125404b269adc926ee2027d49ed05ab5e2dbb0d9ccfdc9777f82356cd7614e7692c1c99a0474b2f598f0930dc2b3020adf13137e8a4178d380c26b30f73ad5e45efd7c650fb75d5ee06c4be43137abecc786cb6b4738db200eb3017398d33087393db4c36cc49e7906f6cc33433f731396d467451009f73209e75548fea1933055c8bd3152e760a4c4e74cb320a9609c36639cce8d80d33e26e1bcac3b8fa59675b923829575fb629a9f1f81e6fb9984738c17f849e15c5cf0fe5894b8d01425780caa9643a283160d07607c2e8a80cf8198f08b0dc2830e583908739b4b0c6eb3796430b739d8249c8faabc94851c5579884932efb7bbcc8fcfa4e9b73b14837d790429791826fc8a08841f8ec1be322cec230c920bc49c1e5e07b66138a51afa16dd90caab4c7e647cab7e35e36fd5f9e0465a7db137f1479ad29db7dcaff19315d28c7e3c0a137c6d48c1476382af0b29f8182c0b5c1f360b1c8b49be21ace4e330c93786957c3c26f9a6b0924f3049e671ece608e2d88998dab78455fb2493641ec76ef5e37757e3824f3609e6e5e26d7e04a7a9319e8281be3d02d0a76238ee0889e33493609ebfef0c99bf4fc738df1592f31926c19cf3dd11703e13c3714f481c676182ef0d29f86c8cf37d21399f6312cc39df1f01e77f60381e0889e35c4cf08321059f87717e2824e7f331ce0f47c0f9020cc72321715c6812cc233fff0e76a8c87f11c6e3b108785c8cf1783c248f4b30c14f84147c2986e3c908705c86097f2a02e1979b84f386f9d37e90a469c15f81f9de33617def4a8cc7b311f0b80a7391e742bac8d598e0e7430abe06c3f1420438aec584bf1881f0eb30df7b29a4ef5d8f69fd72045adf80097f2502e13762c25f8d40f84d98f0d722107eb3417881582784bf34cc7c9f4614f3e0d2f768bceec74bcb7062b760eeff4648f7bf154be7372348e7db4cc27947e15b7eb44ed35178bbc981c4b2252b1ac481e81ce76d13296357d83b8c7785f119ef145a621d6077989298a7c4bb7e92f81d3c89ef3409e67502fe3da7507582bb30c9ef87957c3726f983b092efc1247f1856f2bd5800f8288200701fa6f6c761d5be1f53fb9308d47e0053fbd3b06a3f6892ccbb7d3ef3935dd274fb3c6412cc5bb39ffb119ca635fb3006fa9f11807e04c3f1af90381e3509e635e82ffc084e53837e0ce3fcef909c1fc7387f1901e727301cff0989e3494cf05721053f8571fe3a24e7a731ceff8d80f333188e6f42e2781613fc6d48c1cf619cbf0bc9f9798cf3f711707e01c3f143481c2f625aff1881d62f61c27f8a40f8cb26e1bce2ffb31f24695a08af9804f3c6da2f7e04a769d3bc8a69fc6b488d5fc304ff1652f0eb26c1bc5ef03f16b25ef00626f9f7b092dfc49cee8f089cee2d4ced3fc3aafd3626f9afb092dfc124ff1d56f2bb98dff1f9e061fcee3d4c7022a4e0f731168d1221597c80b95de34478b7fb1013de2402e11f614cb2c232f9d82499af3cd8d44f32a659cdfe1393605e8dcef623384d35fa539360de81d3cc8fe0341d389f61909b8785fc3926b94558c9ffc47261cb90b9f05f983bb78ac09dbf3009e7bed4da8fd6698aef7f6338da84c4f1a54930afdcb5f523384de5ee3f98c6ed426afc1526b87d48c15f63283a8444f15f4ce3ad426afc0de6cb1d23f0e56f31e1391108ff0e0b1c9dc2068eef4d9279dcef1c32eeff6012cce37e979071ff4793e04ee2c27071ff270c72b7b0907fc624770f2bf9172caff40899577ec5dcb96704eefc9b4938f7a55e21e3feff301cbd43e2f81d0b76b92183dd1f98c67d426afc2726b86f48c17f6128b60e89e26f4ce37e2135169f9937f972ff087c3981091f1081f04626e13c700c0c1b381a9b24f3b89f1732ee373109e6717f50c8b89f6512cce3fe3621e37e530cf2e0b090b331c943c24a6e6692ccb3c0d09079a539e6cef911b8730b9370ee4b0521e37e4b0c4761481cad4c8279b01b1632d8b5c6342e0aa9711b4c707148c16d3114252151b4c3341e1e52e3f658f61b1136fb75c0248f0c2b792b2cff8d8a20ff75c4488f0e493a07133c26a4e04e188eb111e0e88c091f1781f02e988b6c1bd645ba6245f776218bee6e58d1bd7dc8a2bb3b56748f0f5974f7c0fc6e4248bfeb8905bb8921835d2fcc2d2685758bde98caa52155cec5b2c9e408b2491f4cf8940884f7c5604f0d0b7b6b4ced6911a8ddcf249cbff79eee2725d3bcf7ee6f12ccd7c3dbc18fe034ebe10dc070ec18018e81582a96854dc53c4ced1911a83d08537ba7b06a6f83a93d3302b507633e322ba48f0cc178ec1c96c7508cc7ec0878e463c2e74420bc006332372c93424ced7911a83d0c133e3f02e14598f00511082fc6842f8c407809267c9708840fc75c65d7b0ae320293bc28ace491588572b79015ca5158857271c80ae56893603e647c773f82d30c191f83095e1252f058acdab73464b56f1c56b72e0f59b7de16f3b76561fd6d3b4cf2f2b092b73749e68b4d55f8819166b1a9f198ca9561559e80a5df8a846191a3e3c52eff22affa1e2ffc1a6ff29bcb2b9c5bdcb928d36baf4caed0c73f10c9cfae12476a58be5817738e385be148dc24669170b9c97b4a9d6d352b97ebee4d916b7656ca8f5cc29927f013a8de33ae7ec58e854bd25891fc2eb1f9abc4faf3e63b77ad0ab8e0d3448c7a9589fa0486cd8881f3615c8aebd87af1f56b3e3fa85acc08e277f133754bd02de33387d6313e7786af8e18c4be49987d2b4df655127bd54636ab76f1fb729162e5c243ca1ddbb975fe3d281dadfaf84129c6699589d3bc06cb7de90985e73019e3b08789032f8eccf93af9652dd7aae5c2929a141d6124c0ce246505b1640a66c96a9325a3344ba07f85b7c52c2d883553316baab13865d60cc6a632e6aec13c57aeba9ace1e7f76d63f4e4dc3ec5b63b26f1a1a875397e8aa5fea05971ec4dae998b56b4dd66e1bc037dd28eb3725a38ea23b6076adf393e7602c0b9fe7ccd28258b32366cd7a9335dbfbca73131ca215c2b356092f0a9fe7926782d85686d9b6a7c9b631b5e5dd1ca7feb763edcacef3841dd5d21e77c6f31251ebd9206fe71e942e1a461741666016d5982cda4e4b2def73618af148c06b29fbb09d185fb1ba1c4d3baf8ce82cdb09b36c83c9b2fe9a657a4eaa9211a24c44b02ac657098fc6a766627a6e34e9b9a3affc3255cc1e2f97f5295552cd74fe9eccf6740471710d596ecdc26cde64b2199f519fda7e50e9b456b6afd2c5b7201aef8c69bc9749e371014a5aafde552c75210cbc64352d9b11c4aad998557b9bac9a94a6e471ad98224a9b35c2f3ead72a49e6bba8526e0e66e366938dc3d194e32df865ce45cad632d1229b2cf43595b151d712e66276ec63b2a334449c68c8c8300fb3725f939585be5b5253ebace14511cbe763daef67d2be28400d35a8fef58d080b300bf6375930274064763d2e59feb8f7f8edd9c964efcf428cc1017e52315d7d3c682ad637e6ed825970a09f58911ad7f1b4f317e1d3f5b7d43f9d76c5ac3cc864e5445f11718e73f132a16db9f0aa866d6f2cc22c3cd84f8b379d27066bf146dd5fb61b66d72126bbc6fa8ef2c1acc253ab3e362dc66c3ab4fe7d4d75e5b84c96ccbb63f61de627a604290ff05a147d7b780966e5e17e5a63143562ff56d7b7b4588ad97c84c9e6850d6c33358d728cc691261a537c969dd3457dc5aef2731966e951264b27fb8a5833185fad8e979beafd1ddef393a952743966e7d17e5ab97a193349589a9a7ab0e5eae778b4a54f0566e3317e4a9f541b93ed42ae27bf8e7b177fefa66b3bd7f97bbd38eecfbafaf52a5762f61d8bf5bfa4b3cfad27246ff05fea449b6a2b30ab8e3359b52862cfc4f25fd0eba36552853139dec4645746f74ed96dad8579f71eb44d9eedfc4b245a32265ab91b45fff92cc190ef6d6005bd9c53a2d7c3b539bfd6967c8fddc9e3fcf96b9ce7f212626eadd67cedd1f4124e706037e55fd3e23f03133ca136ca8c6e58e17592905f2d6d73a3fd06b1ac6fa528f76a444990cfcae4972bd56aae7559614abf7c9082d0baba6d52ebbcf2b131cb451d859750cb1c6fcb961629590ee9de9cf49666e9893c555bc9546d5490cb6d1c5c4f6faa5b8b93f8d31a9b7da8730a5998734cbabb0276923dde89f68cc96a958b6dad88093cb37091d36577519d4fd557e4d59f3a540850655c9de2e681606812d755b89afb3ab386b90309f29c6c969dd5a890a7c6c994c87a30f81d671ddd3ce72915b2cc9fc6e0f7643738c6c4016449ff24c853ec04392c1620afeb9104792a2548f7dbe6339dcbe78b7a42a573297fafc23f420931c6015ad9c824b4d328a1b5f5781fef18d73f0a1d075c3fb64be23a9d12d756ce8e7abbaa170fab646b7c5fc647e5c601db75a0b03883125b3b8f974d622b85ddab1d7596cbeac98658002b199104762625b0a60298db52ae8949d5a3198073969d2566712c407e9b9b04793675f057d12cbe516c258862e750e26a29fc6eb268a46d128f8f53cb8037f415a67f50626aedc99eb363589d5898c551656769c2f5eef9fa37e083f1c5bb1a78069ecc368b216035425e85def5d0c7b9c43acdcf855d07796932569ecfa6799e8f589617a0f696578717e7f9a838e7856ada85b9bb38d4dd45cedd7afd23cf57152ecf771b2cd93769ee532ce47d93e7fd7fde6d58c8bb0dcfe710f8c444fee346ef0b28a3772f99ce6e2ff15a31b6d7efe8d3256c84ae4f8f147dbc1ff05271dca459734fa42ff5636c7da23d9f19ad0ac60b29d17631a0c55fbe2ee173efe970e650e1bc0fd4332eb20967512c717e0e705e6c13cee258e2ec0532fb2536e12c8925cef100e7a599c059850285eaf3d8495814b5a2c2b90bc8ec9751e2ec5487777a510ea743d98d0ae5bd00e5e5b6a02c8e25ca6120935f610bcaa258a26c0e505e49893247a21ce9fcafac1d9a325d34f42ad966716ebd68dcf11be2077215c8de5765a2b3192f78b0196729af67a3c3da8e0aeb0880f5ea4cbd77e45e58c5874b67c6271750c1db0bc0bb2653afd3566d31597a01c0776d431633501c6936cea642791d40791d25ca3612e530998d6b32e58573a9d0cd07e8aea744d751a25b2e7b2af5c1c1ca52520fdc850ae3f600e30d99f0c0c22dc603c700743736641cf40e5c2f8c6189bc3da86edf9489cc3ccc53dd56a733e49164c5c934e0913767c223b198e82d99093d920c657780f216eac10a2b3d6ff626886a76cae8db18b44a9a0168b73604b43836e5b201b4db32d142f6539d86ed63d21e9c1154587b8222e5761bb19276d792617d1278eb1d36bd97217d9140f65ee60d80f34e9b7016c512e7cf00e75d36e12c8e25ce412086de6dcb0b8561945523b24eb31b8067de630bcae258a2dc0678e5bdb6a02c8a25ca378157de67e7db99921856e9d702acf7dbd3433e3a86edf0ff00940f50a2e46345bc4d4a3e6ed2a54186ad0d15b62600db8394d83ad799b1bde37d087d906cb4cf7600e64336c11c154398a300cc876d8249d81a2783b90d80f9884d30094b6d32980301cc476d82393286308701988fd904338ec34d8700988fdb0493b0bf9d0c661700f3099b6012be262383d919c07cd226988483f4c960f604309fb2092661d70619ccae00e6d3998089bd0bd7bb8209b3395947702700f3994cf4ab17b2e4d731b8baa9337ff95535e28af8e1cc03389fa5c4d955e2ac762eaad606a1e2fdebf1ebc72c025dc2cfd9069430c39301bd1f78e8f39440f990116fb75bca0a4331e8f0cd02b85ea0c4a5667dbbb3fbd5768af443ef0a01de4924c4b192cc136702b42fda33a68db0b788ac2fbd3f40f95266fbd237604bf0c4a0b46e05b0bd9c89cc0d2be5fe9774206cf19452a1fd11a07d2513f54aff1d1b716c404e07385fb50927e9920e6438f701385fa3c4d9dd77c6f70ef52784fa0e15d431a0aafeba8d50093b3bc8a08e0650dfb0112a61a3920cea1d20fbbf692354c2862519d4db01d4b732d152f7b694cceba1c5b97db42f00fab63d638d085fb391b58fde0328df69c82e632f4ad291ed64302b01cc776d8249f8369d0c663580f99e4d3009c77990c15c0e60be6f13cc38f6295500981fd80493b01a4f06b31cc0fcd02698840d4d3298cb00cc8f6c8219c7e9d03b02981fdb04338eabbecc00303fb10926e1786232986b00cc4f6d8219c7d9163500e6679430d5b27723d896b9ecdd6a00f2734a90707d36253543f0c8d6241a07e0fd33135e387c0bf5c22a00f25f9420d5f43e352c86f755ee0d26506d5983638682def62f28b1aa6f5bf007af1060956cfecd0632705954e018f0c77f53826beeecf04f91f329a4c9d561c880e552016b0f807d49094cadce66f634c221592da8d03502e8fe9389d8e7a75fdcbbac0e611705d9fa2f7f01ac5fd98895b4e7870cebd500ebd70d39ca2dfe53523a0294ffb577b81621da522ab48700b4df64627c1196f953177f22ec07221b587837c0f9ad4d388b6289f32380f33b9b7016c7126707d0caf9de269c25b1c4b92dc0f9432670fa1fea1ac7c9fa3b81ccfea34d388b6289f32080f3a7861c45e4f54cc2b11a64bd438f03943fdb82b22896283b8398f94b261a9bc19727237c334e365bad0c78e8af99c00a67f3a6ff9e6f9c67f50e02587f6bc88cef7d1319c7b11b2f0394ffcbc44b5dfe3d00ef8cb52de72dd0ee00e6ef0dd9b7e4f5cb380ed0ea0b50fe9109bf84917372ed1b4af8622dbe23d7b70230ffa484a94fda5feee3bd641c577365a0baf4976d40098b2132a00300d0bf6d031ac737e71f802ccfdfd05905348e0b9f7c03802628819ae6a8f9691fc5f133366703a88d6c841ac746e779006a631ba112c65332a82703a84d6c841ac70f329d0ea066d90895703a2019d4a700d4a6364225ec1f2583fa1c809a6d23d4387ebce12100b5998d5009a70992417d0c406d6e2354c2a92f6450fb81e6690b4aa8c187e3104e7e21ebbf7f07f8684b9b7016c5126736f0ce5636e12c8e25cee100676b4a9c9debc0a9f7e2c77109807100661b9b60c6f1a5484700b3ad4d30e3f8e63307c06c6713cc38ce5a6f0360b6b709661c67adb703303b50c2acff841ac2363cd9cc8fb100eb563662251d854786f55996c4da91126b6f0356f32c90a9f2968cade1594605f7370037c766b884d52932b85f00b89d6c864b588891c17d05c0ed6c335cc2ea1619dc9b01dc2e36c3256cb292c16d01ea095d29e1869bd648d8395d4a85b63b40db8d122d5fcf21b9ce48a9b35de6b0a8729c661de5f2043da8c0b50119bebb4d5d7ca4739ac8baf81e00387bd88493b4938f0ce77700674f9b7016c712675f10257b51e2dc3a4401041bae84bdfc5753411e0920f78e0364c2f7a66490bb01c8b971804cd8d222837c1288be7de20099b0c54506f90800b96f1c2013f67691417e1040de3a0e90097bbdc8209f0a20f78b0364c2862e19e44f00e4fe71804c584f2683fc08803c200e90095fef90416e02aa7003e3009970cc3619e41f8027e751420eb628086150209ba775134039c81694a4fd1064280b41d6dfc61694a43d6464287f055e393813630f82afaf12c7b92e1b01d62199289cd42c577e31bf7d3de3af62e63b64263906548822496d273a37f2952ef672aee373626b685b6564ef1eba823030340e90095b6564901b03c8f971804cd8534606f97b102e0ae20099b0a78c0cf2c70072a12db506d2793264b586e701ca61b6a0249d234386b20f88af459940b99c999766cad8e0a30554289702af2ca644d941a2e45ee75d322c430b85955221dc19202c69c88c0dc5917a23d960f9cb01cae199f0c6d405ece2ee8d5301c21194083bd6111b95a5a49e48f631ad6d01c6910ddbc6870233f4e6956c7e411f8075142556f58db212b6657ea36c090039ba21ab40de42278e5f091f0e508ec9c474b7c2944267cbf1cbc900e6584a98cd9c9d55f28d52a97c7b14bfd1812d00ae7199189eae3a312a8daba262cdc4382e9a782840bbad8d3304495f7e9095e06d41db7b3b1bb192bee924c3fa04f0d6ed3331eadaff774e083b87c93ecc3111e01c6f134ed249ec643857029c136c9a13403acb9aacd47f0be09c68134ed2b500c870360245d2249b7016c712e71080b39412e74096dab4f4be4e730787ad117ff341639b84c8e48afe7305b50cf478e653c1ee0142c1645bde0a9196f96415feeb01ca29b6a024fd882119ca3c1002a6da8292b4ea4486f225e095d3ec1c2c16c795513700acd3ed79e94638af8facfff3df00e50e9428dbb264ff67a5a826adc9547f27d9fbf3b100de8e99c8deaa038f23abaa3dbda5bd08ee010aa0324aac7d0cd9dbfd32141fb4b596ed20ea9cebd3b6e9e3f8b9f7c6c06f67d8f3fe288eaba2f6032877b2a9af89749c1c9967ee0670ceb477c51ec271c9a554683f056867d9d9774fe8b1647df75f02ac3b67625043f1163aa861310039dbae484a98ddc922e92480738e4d384917ec26c3b907c03937131fe348beabe711d215b2a555f4df0550e76522762aa8abd2f67fc62f76de0a40ceb705641cc78d1c06402eb005641c3f03fb2d00b9d0169071fc40f18700e42eb68024ec342603d909f42aed6a0bc838ce804f00908b6c014938e79d0c643100b99b3daf31083337594df23510251737e4b7f2b0ce8d38766d5c0ca0ee6e2354c2176e64502f005097d80895b0b64906f5340075a98d50096b9e64508f0650cb6d844ad85227837a1480bacc46a8719c58782480badc46a871fc1ad4b9006a858d5009abfc6450ff01a056da0895b0f24f06f52c0075858d50e33827e94c00b52a138d53fcfd51dc3b953703942ba917b6f0ce2d9ee748ae708e708165cc7d6d5c1d4384ad01c2559408bb316f9f131ff3b1b7cccc5eafcc504d742e15d2c1a0f7690f7b068111769490f53e4d00deb9dac6a135a4a3e7c98aa0df01d66a1bb1924e9521c37a15c0bac6a61973a4036dc866ccdd0370aeb50927e9401b329c9f019ceb6cc2591c4b9c5d4029bfde269c25b1c4b91dc0b9a74da3ea48e7c2938daadb1564f61a5ba61a0e8be5cbe48701ca0db6a02c8e25ca1290c937da82b2289628b702283765627a217ff00a0152c95e2b2f895fb33201b2f45e76ce1e26ec8e239b3d5c04b0ee9d89f14bfe0a9df865ee5300c8cdb6808c6307f10900e43eb6808ce3a8e37300c87d6d0119c751c7670090fbd902328ea38e2f0220f7b705641c471d9f0f401e600b48c2363719c8cb00c8036d0119c7b6cda500e441b6808ce3175dae01200fb60524e1d862329057029087d833a180b00244d6f6be05a03c34131dbd85e2b7dabaca4c66ee3a496ad909b53a4dfc061b8c06380fb367b00161ab9bcc337301cac333f1c5027f997c582c973f6b09fa278fb009661c87c1b406308fb4092661ed920ce6df209b1f6513cc387ee5a519f0cca36d8219c725cffe009e798c4d30e33871f54f00f3589b60c6b1d2fe0b80799c4d3009fbd2c960fe0fc03cde2698715ce9e82b00f3049b60c6b105f45f00f3441bc705938ed5201b17dc1b54924eb2112b69459e0ceb33c05b4fb6774953c29a682915da2ce0b1a7d834b895b42e4a36b8f575e0a9a7da84b32896387f02384fb30967712c710e0499fd745b46659256edc9de13dd083cf30c5b5016c712653ef0ca336d4159144b94ff025e7916f53469f3a79833b486365985281f203cdbce11c384ddc7642386f70658cfb1259393be7023cbe44f0394ffb00565512c51e682a2e7dc4c0c9be1a8b6c42f0f4c013e791e25c896cece72a7c8e15171b5c3813f7e937329e1880e32681d00b4f333e17dc3b650ef2b05202fc804c8d15b28c85900e485f68c318ae3e0830100e545764d738ee3f7d6c6039c17db84b328963857009c9750e2e416f05ef20d324ef29ef452d96b1ebf0eb49600dba5b654bd4933345951732d4079992d288b6389726bd08ab9dc1694a471910ce58bc02bafb067f87f1c070cfe13a0bc92126547063f8bac2ae5c92ffb66a44a4e86b10060bc2a13efbe373aadeb55cea5d89befa9f206d83b493a67bc8c0a6d31407b75264614f96bed90464e323fdd1fc0bc26132b087b67fbcc16c2d689ecbfe5ccf99907a05e9ba94fcbbb5f46df90a9c849366aa810c0bb8ede2327d7163d7c6cd026e97bab05c689cea5bcbfd21539c5d9f235842b6258416a0ba05e6fe30837d217b764beda0a54e16fb0112be9280d32ac8f026fbd91fab5c45ece09de0dbc8ecd722ee2d8f8fb7032683da8a0b503d06eb2a9ab8df4752d5957db2280f3e64cb483bcef18b79476d06c80f1167bc700134e0628a5427b1b407bab4da32c497b36c93a89ef02386fb3092769c3920ce7fb00e7ed36e124ed2c26c3d91ed434efb00967492c718e0038efb4b3e21ec74f7cbe0032fd5d76d5410907fe93d541e7029c776762800cd6d30951c6719dad0301c87b6c0119c79197070090f7da02328e2b08f70220efb305641c5ffde60090f7db02328e93504a00c8076c0119c715840703900fda02328e2b08af03201fb205641c57109e03403e6c0bc838ae20bc2700f9882d20e3b882f07a00f2513ba7eb11163d64d3f57600581f6bc8c576f45e22c2b60e591fd11500e6e336c1246c8193c1bc13c07cc2269871ecbd3c18c07cd22698842d7132988703984fd904338e5f893c06c07cda2698842d723298c70298cfd80493b00d4406f33800f3599b60c67145a2e301cce76c8249d8162283792280f9bc4d30095be864302f04305fb06726501c57bb7e15a07c3113a3d8f93a074a6a86c6bded42056f2180f752267a8abcd3a8b8c25bc6da064301c8972941769320ab9d8b7866e68303f7963d42deac9da1cfc0924d4fe90f06bfbc9209df1cb585fae626e09baf52826c0f32f97a961ca59e2180b95400f703005fb367e192382e5abf3540f93a25ca9e4c9f703adfa131c951ba42c055db89cec57c8d413ebf824facaaa1ed1f229b57d11b807dc356b084c51019d86e00ec9bf664fe387ecc6b2440f91625cad6ce8e77e1d0e4fcc90d317c61d614807bdba661d5a4e37fc95adf6f039cefd88493749d4b329c4d4145fd5d9b7016c7126701c0f91e254ebec32fe673cfe287a939c8c4efdb383782744214d9dc88af01d60f6cc44a3a6d8f0ceb25026b7696267c4a8af0492282f118b65ce8efd605f3d954517da91448963bfb65a2f2bd912d75802c72fe054b8bc5ce3fd3f184e8e59ccc36b3f5e22897572164af71ce72cd36b0c23ece251f72d74848d7c84b33439d1b9d103d035cca5ae76933185f2ea5dcb9b65c6ce73aff97098b0bfa3a9725781ab84d8afcdac644be9c0ebb46eea9e375cbe456a697f61134454b9feac8d2a72e8b5c97e2f7af10cb79540aa9d3ebb4b46efbf0b46e9526550a784b7d8bb6ff639eee32d9859b76166e3ccf497957385f85aa46b8748db826ebff01dd2143ca0bad0200 serializedProgramBytesString: - serializedSignature: f6714f74172433496390356715d5075adda802cbbab743605f83513e29c71e326874a39587d3eb173a80d5a32b1c23ac0c9e48b06269f585096bd30e5ee8980e + serializedSignature: 2560e28db655d15bde6b904b0c634c89a959e27768ea4c72ca80029f203a5fc57d7e5857079491209bd39a29b33d2cbd3d2c3ed2e4234485027612bf24cf430a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset b/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset index acec611..9623f04 100644 --- a/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset +++ b/Assets/SerializedUdonPrograms/3b915252c12161a4084ba3b6c6d98363.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9c59531cc91180ab8161380548e212202e0910d70c20ade5ddf5ae24d0c14a082d970f698d465c8bc42598b597373bc2118ef08bff867f82fd4ffc27fce657879d995d2d6abab3baa7874918f00e31ddd355dd59995f56651ddd4d594ac1c71985cd8a5a50d36a5c2dab75b5aff6e0d734ec77e1cf3df2d25fa943d86fc1360379a3aa27e24afc0c3a6db09d85a32395852b7f506bb0dfa6fc45b501bf67e1da0d38c2d44df86ec0594e055cb4ac66d4bc7aa95a9de608112b74d1914e73d02ea70ab68fd431e46e905258488ab25a61b308394794b70b4a7be7bd56df9159bb90b706d71caa1d90f98e2456bd2857f443b9bba4de57e97d237c2be1db6f1ca315f7e19b80ef1b9d5ea9f74df0ad367e63fa2d7d5ca6f3aaf46fb33cef9aabfa9adbc63196f7779f5ede79fdbef3fea98f6bb47effcea3ec6b5ad680718cfb5abdbfaef3078d6328cbf9d22dc3f9934e2fd7fb66c31e4f468b91d66ca499f2877cf2ff16a2bba7639bbef68e2fbd5da70f1bc7b8afd3fb1b3a7fc438763443dc77e8fc51a31c2f1df79d3a7f4c1fd7eb7d42efbb7cd7771ae9b86ff55defe9ddedd3fb8ade37f8f63dfabc71e33a2f1df737757ecae79b5e9d9e368e4d7d267ce7f7f9ceeff3c99fe47c9470a8a53f83b69751072a454e430fe51b92bc2ba383118aaec40d7e06a9d82c34fb0310c04484658a375935057a7311a1dda933f49ea66d06ced826a153c122fe11280295db81bf0d239c1d41fa538a8618d0b621675cbd803d5ef51690bf86bf5c292b50ec0e84c40db504db0392f71614089e196512863eff350b20d38dccbb90e2013d80e31dd27091b6bf234d3748fb5948cb523fb1073dc523d8ff48a5056d3f84df5c994b1a19af231fa06de96e37e0b96906ac41ed5354677ff2c8797804d1574ee9665891a228fa9780277e62e80619ec2466b58c0942e6e4a44daa14f5230b0182f16d0c5ac8d76f97f767ea6ea82d3c197477075970e2e1f77d036ffef3af8f7f4de49a36a5523454ea8c302d0c2cca1b725a0212c24d48242ad2a8a81fbfc3e1a7a1d1e219e277cfdba6f3e23b8046673e073838245982c377a45c56cdc1ef3df86e919201bfa4514892d0063bce28f56c70cb38b855670d373a9a84c1adfa64d7095cfcf004ab2d04a374b0112ce708d248fabd28c1654873873d8f29779bfa4aec3533247d1e747eaffb54b4c776be47718e266b3f9026e1bc71ea32e6e3cdb3ae25d6380496d4d6e6990ace3335671f38dc56b913d10bf1ac71b8db1dacdb0f78def5d6e810ae838d6082219846825758b5fef075a2daa7166a64115ec9b987a6a3ef44dde3cd57166160fa1c543c91b64f950ccb39a2c1109ef78a647ea0e1d0c96cc7bb36dc790d7937944672dc8031032b867636b72639b762146d6222e97fe113706bb5ddad559c5b6956ffc733716bd4d4958b3841c4dedc6501f69ba405a6afe9f6135e5678a5b8fa89cf09e314ad4e3c56f94fc0e5adc0058f1a6c8e09beca5ea72a5b5a3adb2a7c35572769e566eb5cfae8e7b03dfeb43c5adcde1917efba7cf52bab54c888a8853c3912d24b9f4e5f9b576a6c61a8950943b86e1a270cd5722e6f38ebcedf3fac89d7f9b7e5dd7fb45b3afea8f26daea9e3e8359e5f8359d136a0e653456e30b8b25cee0fc8d813863689d369d483add1dbc0b089f76a4764c33c9d1636efd7730d13bddfc9a04a37e59842bf128196da616fa9576c83cc2e7690f9e7e93883cc069bf09bac7026c684086fe45a09f5ef4b671863306f9fa4e0f241fc2883772646fc24f80ad94315b22d605cb40ab6aad6c421a47b2d9be71268e466cdbd7907f33ea23c1cd2ec2566cb57194fa431b19fad1ffe66d2636f26d7381fe3f0d1792beae3dca9d42350fe48074d77eab40329c724ef2195e09f40795784fbf556de7ebd4d7ebda5fc93bcc235b3f9f2bacd9703a7f5653327191d3cc861f00beeb30b6eb1091e3aa5e0565b677627aa33d39b589d599badb46189d2dab996452e3a9fb5c76fa18c0c95784867ecebdea078517484c198a2ba13b6ca580cbd7c7ed2ce621bfaa88a5af62c8642b6c67fc35605c724aa6087adb47189d23a6da5a5244aebb295969628ed26571a36e609aeb4966069962247ed4576db8a9c142bb2c756e4945891bd4c9129ea16b6d57944c9257548e3e423b549cd7ab7c831f2aeca7744724f61a0c2b820a7ab2d4cf5711501bdf219a7bedfddf7eceeeee704e392f7cf1473137646297668f552e1b2d9efc9a00ffaf6c9b85a85bf59c89f871cf7d1144ce17170cb9d78b6e9b4dc8953c0caa4ddca5b362bef73567e6e75b1a99d6bdf0c556cb7521f87d81766d70a5cbb0d55208e45b76d16fd9cb3e881d522bc8d7b002779f63c254fba4b9833a0177ace6e55ee5267f1fc3560b3ee73cebaaf62d7ca2dca59552f206f8d0499d3083c8393679b70c4b16cd066d917b6f666120dd6bf7dd060157cf291c6483bda477e4fe4d63e7b4eb1fc3764b3f24bcecac518edcd6e6f3eed2e7edb2c9cc11d1b835f700cee5beab0adce99adf51568784476b963633b8ddc15d038d60cdbacf98ab3e68b5358b300da6569bc1f650d372f8863d388cda6af399b32d65acae961d6d639eadcd11e7c4830acb67292f2f3a584cf476d7c1e707c96ad7c7235288c8cdf5ab38d9a0f6c487018b37178c871785d008787d07fae17d082cfaf6e8cdb983ce298bc29a0ed3cd643e2c3404ccef577213952112565a332cd51d92ab188c29f2bc52a6d633563eb51f29f39e48ef2b2816999ddaae0142e8e4d13369b1e73364d5b6d0a6ae15a74a42d3a28b0c72fc6cc63d266e313cec62705db7878aa71403c4b93f0e738b5e4a83daa2fc734aada56ee1364295aa94e7f1ad5443fbe8365ef428dc4b1e3c963cbd10fe53c55f637808237f90a7d1924ca0af7e15ebc7e93de18f25e30e0accbff11afe08b2f496d91270b48d32afd65b3f499e9d5b2142d3a8f14589ba2b598c5d2caf93a14ff617857c04b1d651d5c095ba5cb33704a365a7ed453356324c07b43a2082fbdb923331c501d923b8f884332519646eedf48c249121c7cbe745d47a48b80e780f024133ee14f8ad6080b7b3924182e1a2840ff48dddf21c95bf7870fbac3526a9a3f379bff50a0090d31f5e6a447e27b9234f6482ffecf3b8b3476167308a1df8badd4c65f4ab6f17ef2d52a64aec17795da4f86d649dd75987c476269bf66a77989ac3a274a74e463762191a2d508a4f3929007ac90dde5a178434141d4a352a86f1aa85f49a21ef6a1deb1ac89c759cf13457e5b0af93503f9b792c86f6ae4eef4628fb0e73b4912457b4f0a6daf817641126d8b46bba6bb37fffd8edc75204194f55228af1828172551b66a945b39f5d41469aa2f0ab35a0a668d017349126647de4d3ef76ed4a41cd43e29a82d06d4e552843a7101a1361b50574a11aa60f31783da6440fda524d47a0d150bde24a49e6c5c941403979002a70c70bf3acffefce277414903e5af25517632282fef54b5cec0fa9bb3c01a1d2f2f03d63603ebebf36cf867d6f9b44ba1ac3550be394f94b97322c1c191d89ca8c140f99d24ca5ea6b1a3125920822b4edf28f7bfb75db64eaacc00fcdbd2e8a4fccf9e0a626d91c25a6d605d95c45a49d24efe7b9618aa5a2954e506aab792a830489d2c37cfe89b21b80887b7362e5e6cac30c06524c1d5e6807b46739b2df5bd646d13839630a0bd3b8b78177ff428b83224367aec30b0ae954637e2c72a38fc11c35a6f605d97c4daa06ccb187bfa1431784929788e016f43125e9daf0f36ff1d9918b646296c9506b64d496ca7bb5926d89cc56e96f51968b74ab3f3b98851f28681f5fbd2c47af70262ed32b06e9f4520c882f770501eef5552c1e9a1d89ca7ca40fb5e126d77de35f6f23c60d36ec0fd50ca700563ad18dc6e03ee4e29c3159c4589c1ed31e0ee4ac26d65e09a02735f8e150d033d52301b0d987ba50453b0d98bc1bc6ac0dc2f259882cd5c0ce67503e68124ccc2c7ab531770bcdaa92ecddb0e6984f411ab4685ae1a438195fea18805eda19075dba1d0350bf7158526cd0da5cdd13919fd1243c6785d2145ff8b0aff594d9c579ec26546bf4b7088681cbed5ec14cddfc5783f82b3f434ef4ad485782545ffa9eb32db8fcf27556ab753356da54abeac4edeaf998793d74929fc24fe074374aea969720000 serializedProgramBytesString: - serializedSignature: fbe740bc1049a0e340636c1f95888e2b28f3622c12f19ab7ff7b8da2289b2c4c19c8ca6abe4e538ae35315a8e5105448801fdba5c98315021d5efdb8b081270e + serializedSignature: 204b74724e389182c42b572125e969a98e96bb1bce484f1e763dd6b6e50b7a1620dbdaf7847185420a6de79f04132c02b50c779aae5e5c7f2ef5df9d102e840a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset b/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset index 09d75be..4c3012a 100644 --- a/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset +++ b/Assets/SerializedUdonPrograms/3bb52ac58e382bb4e981b9cf13af249f.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: 3bb52ac58e382bb4e981b9cf13af249f m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed5c49531b4714ee01b401422c06818d139ccd726c23018e9d38b1133663d91828045c5c295b0681e5202062f1724aaa5239e457e447e490fc9fe496432ad71c92f7def4a0d64cf72c420d8878549ad1cc74bf7eef7b6bf70c34a5196cc635d8adb04536c986d9325b63db6c0b7e4dc2b1041ff3ccbabec0ca70dc807d1eee5d63431e3d71bb6cf4c33e0b67bb6c0f7aeeb3553816e97e8e15e07716fa16e00cafaec3b700ad8c16e8b4cca6d83c9b6349a3d783c40a75dae5d70c94cb88c27e82bd86bb05620a0749d3ad24ec72706797ee958069abdd63f6358955827babd0a7cc3681e633a218fd13f606c94487183fb6f263377cc3f0ed11ce518aeff879483862bb73fcbc991fdb6cf77bf9793b3fefe3f77ee6d7e3fcd8c18f09de2ec9cf9b388f51fe5be4d96b4cb7be9dbc7dd447db167e0cf36f7f803e911afa4403f4b130e8e27d06647d420659e27db08d3cdb6169227285f97719aba7b7b320e930ee70bb4cc3ee8159ee000189c52e933fecb131362ab5d801a35de07b92f679685124a2e79d43fce6180299db844f4170b75db83e43de8a0e57843bc36c168ed8eb291b01077a6ca3b202c36e82cb16d812ec7788de5360dbd9d24b24744d7b9f45a069468e125cb100dd81f34de23047fb03e2b440dc67e1da1ec5b12d886413707c45a339652fc36fd9984b1c32398ff200a2ba6e86294b4d53200d729f26db7cab9193d008421f3ecfddb0254d91e5278726de626806194c04594e63842033aaae8db234e5bd450782c165744a28b76f13ef9bec86ab2c726450dd1748828a86fff97be6f73bb7a6ff08558b36c6d298368c410fd1dc80457a29a3cf41c15d8450a825838cdae13764f0631a3572c708bfd9ae48ed822b204c99a95a0194a8a6a0013671682113e6c5424a9226bd985141d92483327adc507ac70e3728a3877255a0c44d8e604c81a0170f2a049b650852ed55d28ae0325c338b9c69ba5ba4cc38ccc6e97a0990d823ee51163f6dcd2cfb882610fbc48f3bea381db86e435d8e781b218e51533fcf2a2db5c8b444339acd13d2d23ef08cfce7e0bb0fbd5779e8f4eee15f47edbe7514271d655c75541f8e551a0ac93444f3b6a5638c4413147d37a94eddaa2116e124f5aa3d16c9214f10e4fd0ee1bc595041189641883660bc3861239f24ce77ea6ee09dbe0dbc8bd01ef665e0b573abd24c44a2990c6aa65b2640cc2600f2ae201c5511ee3922e1988c308e764e926dff85cd413ca626de2a33545ae7f95eaba1fa5dcc98a175bf029b07677bc1cc59a835ee3619007264cd6617e1b84e5ce0752b2aba8fe56ed6bd87f854304ed3fad734f3bf24a35f0a2ce89b32d6629cbb7bc9b87173300b8b6af7923b773f8d7ebab0518582369963617c1890cd08503a5ce398a7a9d596d385236a2f6b978d845e765e625e1934af0b87fa1c244487a4885abf26a0db7320704061709fd76df6f6a0333bcffd6a9ee32a9e2faa787e07beadc86ea0713a64110833b2f1e64423903907417aebb48c69d29b63b8f8ff923ce21bf093036e9f4bd0a60c6314b82f1d25e6bc8b204b6651b8c9bd6e886ce4ae0fafd32995cacf122a3fbb24f3334c564b30ea6b360b5457819f028c16c4db3a5509f33d49c28c1acc49dc256176a984795f25ccde9184e9968d8791eb0326ab6fed94136aca3d2a493e94493275685c3936c51e8233e5c1740a36d331973d86d913f8642958bee4cbc478459e606409005b8bce515d8907c1ef9c4aca8f6452deb5859cea714db9b621e098b2e449b388c086300976e7bd7e92f5aa24bb2c936c5a5910d8a7fcc39c47d4abc59d9d6b71912b88b42b70af18d003fa5472a66472ce1edaa915a4c410250b7fd9c39695c0b7487658005e0fa8b589095efd96864179cc6453a4a18bec8d8b05d422755225f51599d43f6a943a4777d780e23e498474550903db07e3c34fea71b3bda323ddaf42fa6319d2f75cfc48b62c6362b800ddf3d07e9e5ae6a058dbe66879d1b266c0f590744025e95599a4b76b8a184ba49b0dd25cd9236e049128021fc3c0c4374df6819177817ae0d92e4b53d6cff82881aceb387609720e462bb4b66714b5bccb1c7c7d45f5d47c9dd5eb016a6d855c562a9dff82d4f9b038c225b26801d254029d3549afa356c35cab4d692abbaed6684dde5ce0f43cdc2cb7a1e08f944c0273bc8e32503ff729fdae913a2a00e605d5788e6a5f1e70204604ac678d75787d044d6d1c785ea359d02e7cfe822b91505306b591d609194e42ad188d11779b6a5b338e238c8d00d68251012ba313ac84009638ad692cb87e10e01ad109977c42db0810fd2a4034aa13221ce00945a5291a5a5558370268bf08316b4c276871c10dad45c9c672c141b2af48c846fc5edd4a8bda5e13711641092a3b5fd18a7499e8add98b225a4d396d9cdf108b9a946f374bf92c21521e3698f2ccab291fc924a588a0951981bc92cfe08ce013f6ff2ed633a8c99b08420f07c18c4cb77446a63eb2b327d4c47c83de6d1698b18f7f94d7db6255512be247b85a22579b10e43fd509a5fda99336a812baa00a09507da613aa24b7ba0dbe26b045eb962249917dad7617d30566a700e66d9d608e495c58c7c29e46250ce9524287a084cf752a21ce958003af93355bb48bce0aaf7ec0857401c704e0be38c904d4f88120264079e7f4e4f2d106cce55d0294777542892916632736903f2cd0065e5c17782d02785fea04af5d00cf2a86ac6723da60ebd2055b5880edabe382cdfed8461b6c6dba606b16601bd709db251ef5c44ab24c250bbaea167bc0ff6ceeaca5952601e0099d00c705bbac2c0c34ae434704e026752711794db8c59b345e063604f0a6748217ac9819694028130294d33aa1ec101c585c956b5c178e0ad0ddd309dd3bdc0af7d8735adb09f6629cc6b492d4056dab00ed8c4e68ad3520d50a90fded348d606a5b50eb16c0bcaf13cc8b0e3bad5e0152bf7dae35760eea02362e009b3dadc06ab4586dc0b6b333f39c2f838f511ea07184b871a45ce758291fb3fe6a0af6c96dcaa3564e79a662f3415917471bff6ae6114d65f2d0264fc7ca43b334bd2f8d0f8c82bcf8e44ed3fb89d64304d4907b9bf3af824ff2299d4cd2a33cb16b77d14a9adef03ecbf2cf8a7a6f4ad39bde2375b03d6f8e1eb120fffaa8be0fed4e9f46cdffb2b6432d91cda35834d67ad5f48a346e3a793aadb97eb2cf555b737fadd61c9ca3799dd66c52332b151bed191fd2c9f56097b9d26a87ec41fc9f12051a1efff6d41b898b34c757531b87b30d92b548544bccda2221eb93a4974a96a1af194f700656666b440fb7d07f9c486247c8500000 + serializedProgramCompressedBytes: 1f8b080000000000000aed5de95e5bc7151f0984c00663b0d9ccea2dc8c648f252274d62a76cc124d8b8209cb66e6a631058b658c262c7f9d62ffde5d767e823f405fa167d88e605f2b51fda73ce9d8b4673cfdc45d20022113fe9eade3b73e69cff59e6cca24b3c23e015bb051fcfc4a2981269b12cd6c4b6d8826f5370dc843fe7ccbdfe54ecc271033e57e0de2d311250135fa3b15ef89c83b33db10f350fc42a1c0b747f49e4e1fb1cd4cdc3195e5d87771e4ac51aa1d2b298160be289e889750590784695f6e4b518ca156b86cf49f101eee689296c2443b77ae06309eeecd1bd4d60da2df75c7c4b626dc2bd55a8b32b8a40f315516c2e3608fa229c438b3c9e91c76e7837c17b449e9f95c71e79fdb2720ed2c58a5a39b7fe15ed7a9fbc7e5539c763ab3cf6cafbd7e4799b3c5e5278ec95c77e59f6ba52c6bd8ec70179ff23e55ce5b557ab3728cb8f2ae7781c92d753ca3927a34be79c728ef76fc03b01ef7fcaeb71294bb3fcaee2efe234ace13cecf01e77f595508e58eea63c6f90c776edfe983c3f2fcf6f39f7e2ae7e3be4b1531e2fc872e321780e6ad3afee45a77cecc710651be5b149bed311ea242ba8d31ca18e8b4197ac93e1ea246214091e816fae881d912122681d6143965b33385821e926b21681510b9bdd87b0b003049888b14cf1685fdc1577d888d1176b55f89ea2cf15285120a2596f13fff23481cc15e12faf84bb3db83e4bd112035e01eea4c53c1cb1d64b711b02d8738dca3368b60821332f72f0b943f45e02dbde9241226168d4eb2c024d27726fc21517d01d382f12874bf4f98e38cd13f773706d9ffa912de84926e1f83db5e6957d17be736de624643c8f7c00375d77ba09574dd3200d729f21dbfc5523c7a11184be292bddb0314391e5ef1e4dfc8aa11364b0e39893346e1364b1b26b774486fabd450f82d165f44ac8dbb783f77d71cf57161e1954773f4950d2f07f7f9efdcf838f677e4a948b765764b0db880d0488e6072cd24bc5ba3d14fc4548241ab3c8a80e7f8c831fbbd1d8d211c2ef942b50b9e80aa06c4e53007554d350008b78b4906d92c9428ae9268398314119e7a06c3e6a288363871f94cd877295a0c4178f608b01c1201e4c0836700852eeb56915c165b8e624393374b7403d635a4cd0f54d40629fb84759c294757ad9c734803b207efc51c7e1d8b8863a8ff859421ca3a67d9e4d5a6ae4b44423cae23169e9007846fe97e07d00b55765e80cae115e47ada175d4463acafaeaa8361c9b3494e0344463cedc1146a2498abe45ca53b72a884538c01ed363110f793b41deeb112e980513844d1c84347df1e6988d7c8a38dfa9b9819f0f6de01d84763a948157cead493349463359d44c2727408b2600f26e20dc6c227ca14ac22d1c616ced22d3dbfe0f5e1ee22d66e26738e288511797156110f8864edf42e9d7648407a08ad75e8192e636cf72ce4173787fb5ea1c6127506669ae372f16c0c1df0867e4ebb6bb4d46871cb923e84538ae131778dd8dc4fe6df9bb52f7213e25e833345f3823c24f03d9970233b738b9746fa04b73dcf839b58b45b94bf301a58f5a3f59d898c24f2b67fb3427fafb23ec5bc38cbc79dbbcc4d82629a19f9430ee6302395a44c1e9a37522b6598101b0fa1fa0a6bb3cf8f90e830dfa69e3f4837ddb31cc27543606c305899ed063b021e1371d107504768eeb4d10bd6186295a05d0bb8d2173b7d16eeaaa46b8ae0a85c329c9053281ad481dd479ae25b48ccb9cf5a3d0570e43e1550274840d46eeb749a8f61a08bca3ace5400eb3f4f210ee749efbcc3c779878be66e21957c4ce20bb91dae9e41c841affe1583b6fc76091de3aad3a38f49e085c2b7d4fa6fb1622cc3b19da73506617dac8cb6ea89aee1a570e071987333bdd28d9c8c3101d964da94c4e7cc1e46729cecf30b7c4c8fe41cc03d555e0270fad45f1b68b5c7b98dfde10defcf6c73813347cf2db2e9330374dc2ec57254c37d71ec6933153588e10017b38e2984de342ad77acab536e3753eee5bc9a5cfdad55af0e9f2bb8fb14a2e40bfe7e8bb94ab8116b9afc15576bedf26bf2c83e4e3be4a68513a29dda6a26c36946b7e67eb3355fe2fc049d305b0327ec3711bf5d03e203260fbf53ad870f7294d186ee5609f610679c14d38f67aaab16234d7ff3bc1706b15e3362c32625ffa65a258f987abbfb5c6ff7c018d0e6a1d007d2c563f8b607fd605abc80bf2712db1c20512a837754a4d41530fd5e695c11a557bd6c92eb634eae69e126564b625a7c0d768332e4b5b4c9e1cf916b8e060aefc5d6a13c3c2e9c6de912964f1a4791f28a49ca4f38293f356a8fe3d291738f107801244cba2be947bff30ca42a44cc86ae9a24fa2d27d1671548b42125daf77449662d7abbaf28325d33c9f42927d37da34cdef92647a25992c87b778f74330503478c966b72360a6be4c4049ced924ea34872dd24c9679c24d7b5685e6ab35c13f3c4d786c0f9e1da78ff47263e3fe7f89cd0f82cb5e9f0b90da83a5ceec15f8e06e25bbe7e10ce3f2af7fb51937c0f38f9ee68f2a93ea1eb6456ea24ac0c2aad2812a44c123ce424f83cb24fb8b6b56188bfe1a34614a96e98a4fa8293ea8b507637019ebb46bc3a2be6d5db5d653e75d324dbef38d91e6ab295dbba2a1f6a628546d0d8db6e287b03fcfda576de3466926c82936cc6688bfa4e88b4e4112dd1e5ce3ff3092f6d257deb2d939c939c9cf38739913b19a44e0571d34c7387254b134c8be44579e0f51d957630c1abdf5133288f93c317a8e982f8c1c7022a917adc24f51427f5df2c4abd4477d780e2014984744d1373583e1a1f61a6f8c267dd95209d36213dcd21fda58f1f71bb551c0c9fca4c74814a2e415fbced1bd1bd1b036a2169c624e90c27a939eff68b1839d2cd06692eda88c95fa224fcc5685d7e86ec0323ef53aae1e48c199a00cd1efa41f0da28b6bd093d26462bb4b65714b582a793d1024c3f265817fa4c40a5fbca2b9b309f63a50b3ff1efdd439f9412b9b400699afa3d6d92cea2569352abf10ccd408f55684dc15c3cc2d61a781b8abed3d621e0ce59c47091ea1175bf6ba48e12802b8a6a025bd5e795f456c78980bbf65c835fd538b9cb9a1cf2e1a06507dc2c9988677b281e58840c9709dd188d11779b66109c388e30d60358ff56c0faca2658b852f082aa6317bd5f17e0e0cb05e76b9be0b42b96a4aeadd5972d353694e09ab70917bfaa5a0f107da240f4d826449de46e18b2a7a969d3a8a31e40bba7c4a82736416b53dcd0dd19535f2ef80f822a99d0887fe9215e9b5f2e86fd69913743c4883723bea7d9ac5da2b7a6678cb4ea7ed2385f104ac697f2f46aa9d08e970a9971a502ac32159886a442742f29434c2d0da0f8814fb68b48ffb2c736591cdbe006d5a611098213ab166dc6aa6eb2b31754c4790e86dfa039abb75fcd8f245bcae258328c7095c4b2334af6b56413ca2109a5332bb045339761d7c6ac42db6f0bda3e05da9c4d68f57da6d6a06ab7055542816ad926543dd20a37caec5025a9b26fd5ee5a6c81795101f3994d30ef32d1d1c614b345258cda5242a7a2846f6c2aa14f2aa108858adabe0ad3ea9d4540876c01daad00fa079b80b64940b1e17582d4a55df08e4f6a075cc216704201ee8f36810b4a96ea3fb2b62850fee938a12ccf3befd461de794181f2b94d288745d8bc93df5967d14e7b6d813ba480fb679be05e0cb0535752ab300ed882b15581f15b9b30625e8d091316e0d7aaad81d7660bbc4605bcbfd804af5501cf1d01b94bf3d660ebb0055b9302db8ba3824ddf35600db6b3b6606b50607b6913b6cb4c77b24be31474d52df1957c98dd694b7de20ac02b36016e53ecb234d15abf0e9d54807b6513b82e513e102c9cb201e02505c8559b40ded4805cf5ec770f3b6f59da0b6d15f2b42dc87b15c8d76c42de2e4c63ee2d59a4fe46383105bcfc5138be6946b3de1dbf5f0172dd2690d146ddb7ebd026db1528376c4259dd6a8f4568adadf60c2ad0beb609ed39514a90d455e4fa4d919a15e80a476195fbd4a3effd026682ce2ad0be398a4ec8143bd54ec8a27b5beb84ce2940be3d2940d6636fdea60059b409a4bbd46b4a8bf49f435904d3daba798f02e6e64902d3a28b5b0373400173eb248169717dc71a98c30a98db36c18c96b4dfadc3a4bd4b8172c7269483424f8fca7773989f1d67d5e1afda02b64301f6bb930aacc56ec91ab0e7c5a9d9209dc5d47c178d23218d23e5bb74920ab198574e415fb34a054c81a7024780ce7ee20e89363e2ef6b1c0158a1528b342c7d2dee20c3dd80b1f1112e5e774fe348337fee2ae94a618ef6dde47f01fe766664ed26a3636b7fa6825430f0d3bcdf2efab7a8f67e83966b76b607bc11c1d8828ff672c627c0fd8807bf234eafc4bc91d2a896c5663d1b883bc9c5e81dacd0c9c4c6bae9decefcaad79b0526b8eced17b9bd6ec507332158df66c08e9783de832974aed903da8ffc0254fcde3a3f0829118a4018099da049c6d90ac05a2ba29dc5732e1fef5d06f6f96a1ae134f70e26f57ac113d7c25fe0f2254b5c8b5750000 serializedProgramBytesString: - serializedSignature: e68a1b83a27157a92577f933b493c0ba3081980abf57e20a758de96a714403ad030184e704db1e6531df32ae78e333c9b5c59ae112ec35ea8b28657fbe40290f + serializedSignature: eb8e16f05beb2ee0c50efb23d74568a973ec237229243d292634fad1e32c9b16e13b1b31ad0b1ba5c1ddfd3aa085e7c86ebcedc0a612bc99bae01027a1017909 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset b/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset index d6c81cd..6036927 100644 --- a/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset +++ b/Assets/SerializedUdonPrograms/3bed6d9b99cd8fb4198c4739bb4e8e4d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec7d09dc55d317f6b9f7bdf7adb759838af0a659694622cd13699e489ae75173a642144208211421842484a8148a9029332173861232f69d7dce5af7eeb3ef7ecebdfbeecbfffb7ebfaf7e75ee3ec3b39eb5f6da6b8f679f6803c7fd13a9e7fed7d7e9e9b475ea3b7d9ce1ce2467a2fbabad7b9ce0fef5537cbebb33c53d8e72ff1fe25eabe714a67952fca915a9e4fedfd94d4d75a6b94f4e7786b9c731def55ece08f77767f7d9116e4a9c1de9fe1be1de1589b90ff571da39dd9cae4ec5488534107dbd87a6d2b988d02b52d4fdbf8d33dbbd3ac223258434f02e5574ffebe55e99ea5d9be092e6fb0638033db526b8d786b9cf4c71c6bb98433dc4a2b1cf1def87e31f46d3710c1d47b9ff0ae8771efd2e4abfe5fbc579a1dd5921f78e95ee65cc71eebfb8fbef00a5c7fbe9125b293dc14f47ca2b18c5248c89749c44c7c9743cc7fd97ef3efe6d06fcc3ae4df139ecea44e9a9749c4ec769f4ac7bcf4bf5e8dc0c3fdd7217a567faf6892ca6f42c3ace0618ee31bac4bf96578df4f84e4a8b63753abf474ac792cf39e7d2f91acaf335e85893ce7f2fa5c5f3b5e9f9f3e97cad24b7e8c974ed02e59a38779e744e1c6b13fe0f525adc7721a5eb28d7eb84d8b305dd738ca2f331c47937dd372778bf333789b57d299d3bc57f26af28a559a752922e2c7770509e5baafce310e5fc101f33de907835566cde988e7515fe75fde7626528dd24f85c42de45caf51f95eb17d3f99f94f397d0734de9fa5e292d8ef5933ae7f13343253bcca36bc749e7f8bef9d2351da70574bc145cbf9c8e9781eb57283a5d49f28ed770b94abaa6c3ba9a8e0bc1f56bd270592471717d29dece09c623d96675c3f33a9ffdee5ae5fe7a4ec257d5b8115f4fe9ebe8de6393f7c677d0b5eb956b8c29ae2d96ae49fa25aedfa0d8fa463a722cb92929ef797ee618c96fc4b3fba4b4cbb94817baef663a7f8264237ad6b945ba26db9dafdfaaf05aaaf147bef70e3a4e0658c85ff93afbeb6de0fa323ade0eae2f57b836a2630f89eb9d746c4c36e2fa6005716b90b473919574ed6ee51aff16d7ee4adedf8bebab13e9d84e927b0f1d8fa3e3bdc9e7ce2ca4732caf071def4bdef362773a77bf842d8e0f24efd9bc85cead228e0dc91e3f4b6957e7a254af380fd2f5fd946e46d7d752fa213a3e4cc7d574e47afd17455e23455e23c2dbedf32b2841f73f42c735747c14e086b509385e377382be4f3a14f4279994af0eebf4041d1f93f2661d1d1f4fdaf2e52a211c58df13157d4ff46517df48f73d4947f695a793f873588fa7fc678af5a6f47ae59967249e54b739cf4ae758d68624f63945fd638207c78993145b9d44b27f0ade97b8ff6449ce262758b6f8dee7e8de539c60fd760a1d5b2431f25a48720ba4dfe2d85c3ad79cecb800f06a29f1da0c785159c86badf06a4dc75692bc56211cd886cfd3f1053abee8047d96dbb8dc6e7e898edb92f972f45b213ec5fef0b27f6f01b7d5b87e2b2ee91cf67c313a6e4f737f1846713abe628151c2b75f893d21f78e95ee6539affafa3b5c478fa2fc6823e54d1bba1623dbffaa9c8fd3f9df94f3f9e07c1170be68f03cd7c5796d252e6d83cfe4b5a3670e48699767a9af158cf674dfef1267198fafffa13cd781ceff29e9243fd7013cd75179ae88f25c47f05c27e5b9a2ca739d82cff179ee037a6971fd2f5fc7925c87bce6a74b73bf32dbbee1eb24e75427d8d63b958e9de9fcdf52dacd8fd2b3483ed7b96fd0f5d3149cd3d2e06c0fe1f89613ec4b733b916ddb45f1952e3e6699f2fe7365b8fd16a3eba7d3fdff04f1bcf332dec120de216c2baeb746f8f709d7f1cebfadf01aa1f8025f9f2cc995af731e502ccc8f4869711c0fe4ed0c5e4f91c731f60de5fa3bc1fbf2a6107e544987c5a9928ace5de9999894767f97e5f603b2ddbb696cc7d773653bc643b6e3ebc876ef05efcbca76aceb542719b7638a4ff6209cb8742f9f17c7414ed0f707f918e5d9e7e30a5e37c2cb97d232ee34e5fa343a4e9738b2ad6724cfe54d97ce89e348c22922a5052fb67fbec2ab9722b797c28bfda5a89496e30dcb2b50e455c7f667ec448c9dea04626c596ecfbe6f664be7c3545b391f49e73ea1e3c7d239cedfeed239d907a8edd39cc63b9c0fe85a4f290fba2bbed153f1d95d66b60fe8f186468f4f357a30466f8d1e7d42f4e82be9d15bba9fafc97a7c46c7220a7e3f458f7e1a3d3ecf500ff6dbfe1a3dce08d1e34c498ffed2fd7c4dd683c7fa8a2af803143d0658e8c1e5e52c8d1e0343f4385bd2e32ce97ebe26ebf1a6138c457ba4b45b062b6e57ee1bec04ea5f2f2d9743c63918c4a9c4630c6abe0f09da2be5fa50c59e43e9384ce1314ce1319c9ee3be00f157eba8444c1a223d275f2f1e7c9e6355c24e14ab2aed57ee1ba5f0a3367ca2ce629c83419ccadcf755fd6ab46227f5fa18c54e3477923756e1c1fd0db6d3386027bece756f5189073f275f673ba975e0042758074e50f0273ac9b8ad7b9eaee7f3b8c917e0be498a1c651e266fb2a227b743bf74926585db275f3989b27518b7d5b36d9b7f43d8b314bfa1b997bc994eb04d4d63ad8753fbf7701ee3a2be75de6c0567761a9c308edf39c1b6b9da3f3bd709b64fce25ccd5c48defe7f6e279415f63bcbcf314bc8341bc23382fb97d79ad136cefed5178d1f5440ce3eb9325b9f275ce83eb9c60fb92c7b1af07f27606afa7c8e3f6e5b7caf5ef83f7e52d7682ed4b4e9bb4cdcf77826df3f37ddb1dd92a8ded7e48633bbe9e2bdb311eb21d5f47b6fb31785f56b6e37130f6cf7d4eb2fe247d9c9fa5733c6eb5df4994fb16dc87e031b30b92f7e7d1bca34363b4791712a792525ae40db711741c69bc26d12ee5b232c709c6719e4b3ca091ffbba403b74bff90ce712c9c2b9d63391725753d89fa090e8ffd5c2cc99a2bddcfd7e4fc52c66012f897287a5c92a11e9f6af4608c791a3d2e0dd1e33249d63ce97ebe26ebc1f54f11057fbea2c77c0b3db85dba40a3c7e5217a5c21c95a20ddcfd7643d28fe27da078c7fa5a2c795167a705b60a1468fab42f4b85a92b550ba9fafc97ac414dc6b9c60fdce73a55cbfd3dc68a27e579fe7ebdc8e50ea28e760aa1dc4e9c4b835f727b36d07109f488464d05c677e2929edde53ad5208d6363a722cbfd109d6cf371246779f73b50541d9793739c1fa799b745ec63b18c4abce73655cc72c7502313f1295cecbb8346f9a5f5a49b33eacfb1292bb4f4a0bb9a383f745d8867974ff8fcaf578504ecaf57c3acff54326f52e714bc476e646f54384e305e9ecad8d229fa9398f8ea3156cf6d99b15ec9b7dec1ad49f8b1428d8c592d80d4a006cae776f51b06f21ec4584555cc12e91c43e66ab828df2bd645036ccff324a5acd7f9eebde27a56392fcff32ff415e79694d3f25c2b190e6e3393e25fce70e271957ee90ee15c7654eb0fc2ef3718fa1d8c8f57742c69d4e3086dfa9e0dea55cbf8b8ecb250ecbe9b842b1f90a5f76ad85bedc5adc76e1bcbf47c9fb52d27999e37d4eb0cc733a8f7c6bb892f7772b3cee261b509c8e940eda33910f7fa4e1c7cf4d0e5ee7e712d7774afca5eb797728cfdf1bccffc4f32f2ad715fc08fbfeed0a3ee7c34a27d8ae5ea9d84dd1277248f07ac20ef94a3edcaff8c2fd8aaf3c40d78b2af86583d713fa940bde97b7ca09b4cb8dcbe82a705d2da3aa5e0f2a7a3da8e8f55050af849d1f0ae2a6e4ef1d52fe8ad8c7ed7f100712ed8c5cc410f2f5bc871d7d0c59ed24cbef6ae95e717cc409c690477cdcfa3cbe1157643caad8ef510577ad729dd68ce4ad9138d09a95bcc79c60d97dcc975d77872fb71ecfdf73197d42f1e952d27999e3534e3086709a62487d9eafe4e71f57783c4e36a031f5c4badd743144e5c7cf4d0e5e4f9409bebe53e22f97f1d5caf3eb82f99f78fe45e5ba829f88210f2bf89c0f4f3ac118f2a46237459f440c794ab143bea487b8feb4e20b4f2bbeb2de09c610c62f1bbc9e1243e8bebc671cbb18f20cb88e6208ebf5aca2d7b38a5e1b827a25ecbc21889b92bfaba5fc7539d6e5f553ff450c21acbc8d8e3e866c7292e5779374af383ee70463c8733e6e13f6cfb822638b62bf2d0aeef3ca755a3794b759e2b0998e2f38c1b2fb822fbb218d7f361cef04cbe856c5a74b49e7658e2f3bc118c2698a218d790c8f9f7f51e1f1a2cfa331cd5b78ef49641243547efcdce4e0f54499e0eb3b25fe7219dfa43cbf2d98ff89e75f54ae2bf88918b251c1e77c78c909c6909714bb29fa2462c8cb8a1df2253dc4f5ed8a2f6c577ce51527184318bf6cf07a4a0ca1fbf25e75ec62c8abe03a8a21acd76b8a5eaf297aed08ea95b0f38e206e4afe6e92f257f4f3064bfe966d0c51c71e5ea7674b496951de1763acc8a141ffcfe3351507a4b4c0d8eef36e1a0bcace7b93eeff278897f7a682773088d794df51e1f2f596e28f51e9bc8cfbb6132cff9cce64cc1dc55ad67da793b2e62321f71d27107ff3764ae7c5f15dc56eeffa1827f2bb477105ef7dc5cfde57703f50aef31cf07b4ecab86302f323e5998f14cc0f83be9bf09bb79298de3d92ddf33ea6670e91d2ae5ec7ed0fdecf73dfe8fee3ab4bfca5e7bc37cbe4729aafe8f489a2d3278a4e6f077562fc088db7e5ed52fcb3321d99dfa7415ff0d2fc9c387ea6f8ef67be3e27b40ade97189ff99cf89495d2e2b89b707e53f8ed0ef2cc2f173cefdd57107c8675f074956368e5a09f7b69b94e519fffd0f2f94f2c9f7fdbf2f99d66cf27e4fd147e3fc75e248f7dd1f8f9b72d9fffc4f2f90f2d9f7f2ff83c97c1441dc7f941755c538aed56751cc7e62f93e5c0e118f515c9db23a5ddb2d9fc27e5be2f9d400cf0d2326f9e1be5fae063e9bc387e417ccb2bb85f04f1bdb22be647ca04711272141c7edef948c1a9a05cff40d2dd74ad3aafc1663b7ee304eba96f7c9b9db48ab8f3f8205fe779dc7f827879df2a78078378275709e2787345613ab0bc3d4a9eeef1f15a4c53eefb41c95365be3bef7bc5c7fe90ce8be3774a9e32cf25d27529ede92dee3fd409da81f17e54ecfa23f11e1fbc3fc1efa7a0cf314e0277afc2ff80f49ccc4fbdff503f1f5b709b4f5df3aee89dc049973f613ec6f3e5f27c3ccb93e7e3b9edc87db1fd4eb04df5b3745e1c7f516cfa8b8fd192e723e20ade6f4e303efda6e01e50ae33ae3c2fcaf74af3a279bf4be7c4f157c22922a505af4e8491aff0fa5391fba7c2eb2f27d886e138b45f9157a0c89ba6e0b0fde3491bf1b584dffd2cf95ddc7f5d39f1acb86faf851fd0bbdfde7ba55962440e93b0c230f8fec3c90f9a65c08fd6c845aa58e89809fe91ff127e4fc22fb4b0efd174a4f678a42ae5ffdfbe5fe45794d2e27a3527e153db69fd7aa4869feecc6df89a8ee78fade9fde53631cc23522b2837522789df8f6246a4b6740fb77d8f093ea77b3735c2ef44efc7f213b63ccbe7dc86df2be5bcabe784db76b0ff5cdb6594e675ddff90ecbfa5b4b82fe6736ccbfddd7ac1639eb43e21c2ef4fff14bc2742ef89c728b6f0fb7e5e3ae28755c6f07eb3fc02e97706bac5a284ff9d9416471e6bd923a5856ebb7cdddaf19a94750672c491de65cbaf24a55ddc76cd08b73bb8bfb29416c798a47f8c30ce270cae077b48d7a57c8ac532e31c5aa6e8ddd508bd93ad2d338d1d6d99695fdd3fdf3e2c7e7520bd2936469ad091dea38d344dca9b94c97b9861ba9c40c76621ba9ce8a7372cc9008fde818d9c1c82d7426f9b0eadfcf31d7a6339117a1737d29c8e2d93f85bd607af719b24466380f9874b69575e47f6637adf3146ef4ee6735b96daf59156c1eb89b10bbededa09f633dbf87c7af3f5b64ec6712ad29e8e1d42ec476b8963bc4645e6d251ba47c7b553906b28177aef30725a0897cec4a540c345be47c7e574032ef45e4fa47b08971e7abfeab4c43fdf69159613e94ad7da25f588f494ce89a3667f82482f83bc25bf8ef4c13af0f8688ce70f7e96d2ae2e9d37d27df47e504c7a97dafb2dee5946f750dd9e2807c57d4c5e4b94b89f30237d7d2e4be766a00bbdd713e91f921f67f8e936b40ec68bb9aebc536bfbe74fa5bc4cd423359df098ccb6e1f9d99fa5b4c09d4bb834af1ce371dfefa434e3083b1c41e9b119ca0f8bb1ecd3675a60d0186564803d8f5829d27d9f94766d741a8fafd37b4491b3e939dd3e49ba7232888ef43e526470f2b9cf78de78081d8786f8c630e255da49891b89bd57783da1123778ef15ef59dd755a2f19190eae2fa3eb23c0f5e54e309e8f24796542b84e4ec3b54c1aaea3c075e63a3a43ae6348de21215c7702acf9d2b3615cc782ebcc755c865c69ac24563684eb8b006bbef46c18d70969b84e04d755aed49f8e95c35c2393d2702d9786eb39e03a739d921957b52d80f23ba52d406dc058f9541d2353a57b7458d3147b897791e53610bd93ec50db2c56c109b4b5623c5fac6bcfcd54f4e5187768926764b6a3b701ed5b17abe404fb52dc07a1f9a8fc23a5b4786e5692c7e690f797d5d81de339887d52da8dbb3d38eed11aec08afd1cf34eed23e77117a072b3227f9dc67dcde994bc78be8a86b5f30cfc3149e87f93c7b72fd7e319d3f5cf2057a16c611be3e5f7a56779dfdfd12707d195d9f07aeabfe1e962fc348afa5be1d7aee226c7a7f247219ce8708e91161be9793af1c95815c1ebb91def9c8b82ee776e75dc96723574ad70a14597769aed1b908af41ae4adc0be9fc554eb07cf29e76dcc7db96b407eff513a17735780d8af17e403d839c6255829cbcb49b577d798c9eda8531797c8dc68562473941ff3dca7fb6f74fc1fb12f7174a189b14ff51f67f8a1ded0463058da1c5aa2631bcdf2cb740fa2d8e4748e78ef079f55900785593786d06bca8af11aba1f0a2f1d75875495ef5100edcff199b6ad718c73fa90d1ca3fe531fe6c3f9b748ba2ee75f4d907ff2f86b1989939c7fc4b1dff9415fe8d74e4aebec2de4ed0f62276448799eb67e40795ecb09d60f349ec9f3ffec87893e1571ea77b22287f767046da7c87512bf78d20e29cfafcbe0f974e590f3a5b6935aae784fd47d52dad5a77fa7e07d89fbeb3a99972b1eefdc2ba5c5511a8b8bd593e41648bfc5b18e74ae0ef1da0578497b91a62d570d155e34be1793f6488c35c01ccee0f16f2e57925dbdf16eb9ccd0be82f955a5b4c0e8223d2bdd9718b7e4fb784e7d8584afca92f3d5b4ff48e30a91ebb3c0e03d4bee4d3e9bd8a3b89784375aba4fe8c6fbdbfe2da55d5dcfe4fd9fcf96ce1728f7707b4abc77e7969b71eb82d8b2dc88ba0fa969fdc53c9a483c9af83c0670cce376d6a9d275694e33c663b9373959e75184e74d682f545d3b2fc67bf4f27c6f6fe9bc38d2bea5bc76d04bbb7a9cddca09f872602f5a1e7fa17d71f32946aafb0af375d37d8563dcb7d82ba5c551daebd5fbedf23c6bbcafef59f382faa58cedf07821ed0d1ba37d2ef3ab4969a137ad298fd1be92f9d5a5b43836a7f335a4b4841f3b99aed794d22eeec0c5cafdbc3f11eda793cff363b7d271a9745d3c477b51f23c5d8cc6bfb5edd5dbfcf4fc65213e24db49e0b520fcda525ab24784de718bdc112277999376dc30b29c8e7786e0dc95017f2e031cffee76701968e9e8cb404b3ab6728265a095affbe0ad743fc7125d1968ed04c7205bd3b33cef573f788c497b3e46ee71b4e520c2f190c7eef74a6971a47984445ba4ad138867b1f6743d26a5359c222ba5e734e534721fe047ef9ec53a29fca86d10eb98d43146630fb10ed2399ad388f17cc01e292d7876d7df975f47b96f56f0be9432afb60365dbf3fb703c4ec16d62ae13747b5387f921bdb7167908fb61621c9edb8cb4bf63a2cd78aaafd79056fe7343062bcf4d4ef3dc3ccc33c2fb1df3bc92e1dc6164351d1fc1fa45d638da7997a165fcf34343c64f228ffaf72c5c9a01177a872df25888adb99fc07b5ffe2da505a715c489d701a87943cf25e60af9b9af4374785cafff30d27f58d8f85157e928f17568cfc6e1bc0e4ef5e92e4ed2a7f97d36b56fc3ed7cda232f515ea90e8af13e91c74869713c3d891debee04eb432ea3bc27620d29cdcf0a0ebc2f5f2d292d8e72bd2caed7559e93f6a04bd1591adf883c29e9ecda78f8b20cecf494132cfb4f07f320b23ee94fcf536c8af0bb6999ccefd1fb67910dd83f231be919b617cf1ffe2da5c57d9b92cf8e189f816cea63453687c8dee2a71f6c45697a9f2bd65be1d0dbf7bd113b483eb55d232f68fc3ce4f99121fb8e7bfab11d387f5e7402b6d1ed191fd96a901fdbe8f852884d5ed6e824b8d3fb2f237785c851c7b3fa38c1be5d1f1f6b14af85e03df8b8ed5235c9a7f53cff387abc82fd0a61f555b0fbfad8a379cdf6ab74a4f79712fd42dd3a2bc6eca760f623beecfb3b88cbdd217c39d6bcaec8cf44b745e13cf8fec81b6978a4f3037a3729c2e3983a3fe07d7ab9cfd15ff1699ee7de997c766b6106b2f9fd94f743647fa0f7c131ddfdf3638687c8e940b6e3b5428c41ef2945a4bd2923bcd7c9c7490e936b67a0039581c8a7213a7ca6d7612cbdff3936444ee4733af2de579aef4944f87d9a4ccafd1774fc12f34dc45fde47947f0bce54d747bed2e8c4f7c9be41cf8d2b11c24d1d17e07d480f486981b134789f23d75f5f2b36385b7946adfba475046add176abf6fe8f86d487ed39e8319b5db389e7c1f921fdcaf3acb09f6ab68dde6781e83e1718974eb2c5836f56d223f61d991bd7adf1d4ff5dff8dd584e84df4390fa39917dfe735b43da8c097e9497115a531f61bd073ac17eff40cc3fa50d4b7bc326dab0e4271342d63f3934de3e81da0813dec5f7467ed5dbcbfb9a9d7b7e62d83ef8aa8f0e96ecf69be2a35cb77019a13d6413ed585a5f121be204dbb143e83828891de3752b6cdf614ea07d1aa3f528fc5d9818ad1d498ce70cf7759cc46b3f7ff775bd91c71fffa0ebac9f4677e6c032223f2b1c683d4aa2ad3d828e239d605b7b645017d4d64ec853dada913f7dee4ff2ba2b7a1f21a3d8caebc4796f2b69dd318fb145788db3a85f16a5c714cb7dbde7e8bd28f93b31117ea7ead9543929df894927274276a1b536893af39f54b9b1511ab907b3941b95f0c531e4db39e7b423dcfe1837cac7581037466b84f2eb4969715db7c680e3ed1827186fc7d091e7a9fe96d2aebc2924331a77f475237a2eac9dc1fc790f639a17e275b94eeb641e78bfc5bde3e9de2a525a5ce7b130deafb8a49476794c1f4cfcf32599225d3469a3b91be91cbdef139b24f9c5241f672ae78f1acfa43dfaa3058e369e45e91daf18eff5bb574a8ba3f42d82d8d4100ed4f68df21e70ad933a4c2b0af8cd96f89500fcd866e72afc78ae749ac4659acf85e5454b85e419ef015d454acb793643c9b319c13c4bd1e53c035b9fafe8c2f3ccb39218de6fa1cb87d8ae908bb4af6c5abbce51b8d0deb0b10b252e172afeaab36bdb0cedca7b6a1f2ea505f68e208e8c1d2d2d5de37365a4fb04ce64452e8d536ad74e71ec6b2ff1a7f112471a374eb48fa748b618e3f39dc163613c1e7a4e52ce0c5e5fb153b9c6587c8e6508fbff1594e99c26f1e0b1ffd335e7ba6ace49edd1e8213ea73378bcf27a9fffcc42fffccca68a5ca98d1fa57d04bc3a5cadefba4bf7f15a42aab3a3d4e64ac4335e1be7cabb98627d94f79891c6d8a215fd7bb6cda5742527d87655db96fc6d929252dad56d96b2fe581b0f796d9c5a2ea81e86f150fac6496c8624578e41bab829782d235955f03de7c600772956a66d9ba2587991136c9b5e44c7b9920f85c4b5b463bb28ae5da2c8e53956694fe818adf18b725c9845cfd497d2ae6d66ff05784a312f30afe2facfb98315ff99acc828199491b83f2c0f94b99b288f2f86ccdd4479bc99c664a34726ef991ff29e51a2ed466bbaa285c441d7ffe23ea9fc7d0f5d5ca8ea2463a0c0d2cdc5acd36085f1a339f868357b7e0ecfbbcd53ce496de56875e99e5ce940fd9a68cd101db8bd7aa9136caf5eeafbcff9dc16aae53f77feb20ce4529b345a2747b693ec94588744fb8e27d653cdf7f95eb024785fe2fe0512e6262758f6d5f554bc67f85e292d8e972731bcdf2cb740fa2d8e9749e72ef3795dd810f0ba52e2b519f0e2f5545729bc686ff0d84249de42cc610e8dc1468f015ca4fdc7a375f55ca2dc075aa470e131e76b247d54fc6b257cf51d5dc6e71879bd824fdf4d8e5d27e9c5eb66a5b1d8187d77413b166b587e1c9ac78ad1371512f3ea8bc99ef4fedb9c8d0afe5369f01997f738a77e19ef231593d63079f7f03971a43dc8790f8318ed413eb7bacf656ebbe073bc9f147cee7c43ee6333bc2f2c3e709f86d7fed17a897c392db81df075baa892f25cc3f0e72eea1ed4c9eb6f86704de0d27bc7b19b155cda77fca29559e2d277e5a3b4462dc67b8f3794d22efec5dcb71c6b88df54c1bf55c1bf95f0479be167aa67685e1faae4f56d8a6d6fa323ed9d9e18df58ea73bea49e82c33addaee0dc9e0687e67ab8cdefb5d9c36ccbf2e85bdc31daff38bf919416cfd2f8726c99136c7f2d23b96f2978c76788b75cc15beee3cdabaee09d9021de9d0ade9d84374dc16b9621de5d0ade5d84b73d3b3bc756105e6385cf8941f9b17be8be26525a60733bf86e27d807e5f827ad9d8dd13c716c25ddfb8ff42c9f17c7fbe8fa0129edea78596d05879fe3bdb59b4a6971e4bdc48f93d22ecea5622ec08d6f97eef28f09dc7b95e769eff4c4f8e3dd213a0bbc560a0eef757ebc9416cf2f51f8950cf2bb8ce7b733cccb04de2ac9d6f74ae7c491f7273f414a0b59bb7deef34b98c98cc97d70811bb6ff43489c8af1dee2274ae908f56bc47df4dd3e1eeb0f1dcbbf457a466ddb4adf1e4cf45722247335c92825a563fe6b5dc2360b9a059f8bd1dee6dc7e883da2f83ce3152878bcfe5ba7833a2eb146f18d3584b19838ad559e9b9ce639a5bf9de88f3e9ab44b4a7fb479105bbb96906db23689133dc9bfa7e52eba87c73d9e90fcf3099fd7e5dc0ee27d1e22d275a14773292d8e8f4b18b49ffae534ee17a37749127d968ed279be5fc67c9c8e8f4998b457fc15ed140cdecbfc58292d8ebc97f949525af605da8b9ef7134de0af52f065fbd1fa9a680be99a38f2bee615a5b4c0d0cc87f0334e27c9ef796d1aed9f9e68573fed735ad834785ff414094bdcffa3729dd723ffa49c6f45cfd17ee689be048d8fc6e479a9679c14fd13fa6e50786ef0795ec97ec5bec7763956797ea3727ebd745ec24fe4cd86a01da2ade9d846c1dda4e4c3a60cf2a1b3940f3c4ed8d6d1db97aff3bae90cd63844c916d10e980bcf895fd5292827110b9e4b724c3b4eb745c95bee2b535f3a314eb7999eef93c48ef27bdc616b94556ecf3b304e25e2be340e9c715dc0f5e30b4e701ce605df5657f757f0ba69f0d28da9f33a761e73e2f5e619cc4f473bd391f7aed18de90c25aeabfdf3d7f07a05d5865bb10da3a765902799ac7f9065a4f3a197141fa2758db16d8a0f6da3e38b4e4a194ac8dd2ec94d37b6fdaa2297d61ac65e51e4f2bac29725df259b474f97ae8923efbb5e4f4a8bfb780df20e92f98394669dc4f175e579fec6b72ea6b04cde73fc64292d8ebca7f9df52daf58f450794e7793fdf16521a3d2f8e6f24ed10a37dd0af3d398899586f42fba627c6de79cda3f4ee6c94d775900da2d27c50e29cb49e96654479ddb458474b7d81c4f88854b6a3bcf698dfb3df967c2ef17e1c977f7ef7ff6729edea77dd60ba4f5defc6fba99794d2e27e348ffeaee49ff2da3597cb75721c11182b2c30d80efda4b212165f68ce201ab6875358dce43dbc7f96d2ae0e8bb9aee57de2ab4b6971e4fde16b48698ee11c67c5755e034475d7f56ba5ebe2a85b7fef72bf7e2be9a39b6b6419bcffb36e9e85bff3ce6b8a346be913b64e13ffa3bcf696e33de9b298f399df8dfbd049896fd133a47b746d045e77c9717c80935c0be51e6f582d711432688ffd44d9fe88b8eca1fb1d893f5f2f08de7b83f22e77c23fa56fc407de67007e193d2b282bc5c612ffe8c00cf2ec6c49f7347eaff3e928ad2f8b0e76d29705398e0da173217567c20fe576d050ff9e4cf6274bbce3fe89e4235c4f7d4ab6de27a5dd7cbaa95ef0bec4fd9f49189b947c52e764789df25e292d8e9f4b7ef1b924b740fa2d8ebba473bb88d716c0eb0b8957ba3999af145e5fd1f14b49de9798c3addca755c702684d72a28ff8b57fff92eac1fb63df38c9be859b874b788ce073e93a9a8ff94ef28174f33ddf2b7ad29ae3d81e49a73d8a0e3f283afce0eb707327c0e747033e7b153e7cfc49e243cfc6be0ddae8662eef9f4bd7f9996fa473e2b8cf098ca124b8fe223d4363a2515aeb1afb55e146dfb28eed979ed94fb6f89038fd24c9d3dd2b8ef21ee0aaed0e48b61b0e6cc7eb5eff50f8d17edc3169ffee18edd51d93f633f77ebb9c6f592af101f724fcfa4c3affa774cf9f8443e39fb77671f43afd25e93412e844eb4963bc6ff05e292d8e7f4b72ffc65c127c79af0929be79bfc53d3ccea19ba7e6bd0ee5ef40ebe2a8fa6e1397f34229edca5aca632fdc3e1a43cf334fded3ec5b43f9eb32bc2fac0ee036d74127d8e63ae873bf4db1a53cdf1a1debe7b9babefbb658905fda395aa52feb8d5f49e94cfbc951de536fbfa17cce175a1f1b9d40727575b569fd4feb0ca3934230953d48c5b261b91fe0a55d9bdede298483d26e8a47250eb40631654d19adf58bc79c40798b53fec5e3c4e348292d8e7949ec38c98f47241bab5ca439c7e814c085d6f0c60b142e2ca7a82493e64ae3f921328b25afa9e3125c57c4a57d613dfe8207cda1c54b2b7950dacf83657b24d9e2a8ec8d1757f3b20cc93e28a505ceeee0fdbc5f589cf695cc3f454a4bf747a7079f8bd31e75f92d7d7f88f378d00c45c7b8843133e4daac906bb343ae9d0baeb9c73b9b2a36a6fdf9e265151b97f575e5fb53f254da7331ca6bfa543fa23d03e3872a7e447390f1c395fca2757df14a922ff01a05da4f305e4ee159cee7b97c17dd372755f73beb295873295d41c1aa403a737fe3228025d931ca6b1269bd22b71fe3b4a69ac77be2fcae9d66bc27ca6bc12e95e48923ef07fc839406180ee7abb4df27db464c21cb79ce759dd6969cf705d26f81d12e58d6a297297ed34a4a735929907e0b8c0f33f0a5346bd1a12f49f399f10a800397f902e9b7cb6b05b7ed691e201147aa48694d1c49d88df590f606e618b582f7936a2df9a08c4d3ec9fd5e6dac13c752928de62b79c16bf05c7f7861b174bf904f31327a395de7f97b6a6bc4798df3cf52da7dee9e2e419cbba98d16a5357b51dedf51e7cfbcf65f5e8bbf30583ee47797788e4c7e77c9217fcaf8dd25dad7ea6e1a038d5e15c4495947eb1eef219fd6b56974730eda76ced54eb29d2330d74b761347da3392c763e2343674cf0289379f2f50ee619b5f93461764136e4bd11ac2947227edb9986ebfc138ef5fb9574a8be3914e208647af95ce8b63215daf28a505aeaeed45f38bf1aa4e60bcc34bbbf658d91be871b494478c512d792eaaee35c83185d63ec66b28bad19865bcba9427b45e39ba58ba268dd725aedfa09795e05ad3c0e6b5155eb48e25aeecf118e731d4f2749e624d94f68f8bd21a47edf8388dbbc5eb287e5ac7b7f97dbcbe76a874be40b987d68045797c8cd7c1dd9c94b721e4fddc849f52998b4b7b2926f6d0e5f82deddf18bd55b11fdd13a57e745cd9bf314ef3c4f17a920e5c3fd7577caebeafdbfdab018f06063c1a293c68ed57bca1c483ec1ca5757bf1c6ca338d536d13a5b579d13ba46be2487bf825ca1cefe11756e678ffbd7d52dad5ffc1ea8e5effe39cd43277bc814d94bdf3e25407c7a5bdf3e2b4ae2aba4cba269739bebe5c91c53edd5cf1e9e6be4eabb84f3c543a5f20fd16c713a573b4e7de2ac6a7be5ffc24c9069de9dcc9a97689de293d278ff1f3f5bb240cddf5158a7e7c9ed6abc54f516cc9fd9516920e2db05e9cc7d17b089fd7a71a965f6730e1f1bdf582c778cba4ec74df928ab75674a298166f25f16f45cf486b0774fce26d08eb3b292d8e6de9fc1e29edf27f88de297ba855d01e19c911475ad7c1df8df2d2027732e12e00f75796d219c80b8da5b43e30ca6bab695e33cee33b15a5b4b81ef2ce75bc83136c2376f0f57998fa11d1fbe8787f0856d89af761493da30fd039ce6f1e7faa22a5856d34ef6c4679cd15afedd27cff264afbdf85edd9147dc84f27de2994dfb7141ca81c27dae89d7c7b3ccaed53652e39de59b9bfb37fff6a6e139f2d9d2f50eee1fa4737ef4beb42d6f0189bb2c630aeecbf17a7fdf71e619ea707ef4bc449be8fe25c94d76c3217dd58a96baf35dcce64bf97de4f8dd3be748f505f97e704e3cabe7789fb780e566d3f496d6f758f9828afd34473ba3247d5565d145b7521db3654f84aefbe26ee41ed6b99ab325f1a5d13cc57ddfc73f451ba87cb68c83e0c6b68ff2ff685e8da0cf20c954bcdfbc5d1c77c7c7eef967def518e01b4d6324aeb38b5fd429ab3ce64bfd428adbf8cf39e7f6da4b490bbdec77a94f5a57599d1a7b17ce318cadff3b83c04936324ef59f8b3947679aee5716c837df9d8b66b97f9b2d6ae0d7986e57757e4f37e87b4eedae1fd64b88ddd93aed797d2aeccc7687e24de2bf87cbc5710073e4f7380d16795bca63eed131ca3d5b222afed4bb3ae2ccefb59ed95d2e248eb30787d579cd6eac4e598a9967bda0b3051ee692fc0279a4acf8a23adc3c86f2ba5050ef57de2bc975e35292de3c8f71704cfc5a57dafa21b807da4799374ebdfe2672bf6e1fa85f7683a26285f5e97e5718904d765c5a93dad5d97d53598af715ecf5f5d4acbb26b0431d9bea6fb6fc6bb4bf95520fd165c68fef309b64f3fe9ba5cd7d0fdebb8fdb0d17feec9907d201375661f058bf27b1d8d2dade3b2dc55ba5ea0dcbb10cb896e0afaa976bd268f47c9fe1d56aed4faf239d23783f534f1c164ff76525a5c277f890f09e69f9716d7a98f16a7bdb012f18262dc934b251c093fbad9e7f654d83c1bc7e92da407d705cf1b3cfb02a54724ed94383752b2abc22f347e53ac7b6a30f19816f28c9a5f527c485bce473ac1723e928e239c6039a7f50971a99d9d2277b49379fc1dabc8a5364c7c8c22770c1d4725b1e3bc0f5275292d8ebc97520d292dc58138ef19534b4a0b4e5c9fd11a9138efa3d45e394feb19e293141c9a0be63d25e2343fcbfba87969372fd787bcff94c0a6b9eaf8398a0c9edba5f9d6fc0e525a60d23b5bf1a98a6cdaef637d48fd1fe575b45b1559cc85f73f292da50596a62dc37a38ec2fd3e9d98e52dae5f36c2c28c361bfe3fd903886f3f8cc36ba4efba5e47792eee7f3e2a8ece711a7bd369ea1398b28ad1f8fbe8c75488cdb4b65374a6d63f83d60f7dab3dc679990fa7cc02e4af9e1f59bec77e9d66f86c60db54c9eeb641e0b947d55e2b40e247e9e132c933cdf2bed5312bfd00996499e6bbdc0099649fe061c97c9398a9fcf09e6419ce6a8a3bcee9efb31a6ed705abf9ff5b814b74de63ac136f25cdfbf9ee3f54714b79f633fa175bb71690f9a28bdb3be91fb556a9e5d24ddfb9a3ecfa23be8de4b953ce3f9df7952de507f397e4952e74dd581eccb24d969f62e8a2f5064f39894b4ef467cbe229b7f0b1b71bf86ecb1690be07485c4e975c089de1d882f543851fb287ea5e2c334f718bf3c6993e74e06f2af7232afd7ae51e4d3bc5bfc6a45fed58a7ca1c39b3e8f67e74ad7d8f7d98704068d1347dff2efe7fe51fc62c9e758271abb8bbe1dbc37a37684e487296b6ee83d84cdbccfc1ce0cf0b92cf138d440099fd7a92c7252e263a495748f263eaadf228fbee373e1effc25dab892bc507e347e18bf96eccd6319bc4ee0bae0f9f8b5d27971a4fd5178efb938ed85b6856c13a578137d4f91477b9924c65579de5f3766f080c489fd87de9bc8f65b4f11fa468c4363dd3c0798385f21783efa819d3c87e7142b4af9c279257f8393efe3fe36efcd72b89476edfbfc2a05a39206b7b2642f5e4b92adbdd6a7ca897e648719e5bd5f659e9fd8613afc8d01c9ce515e3b7098746e97a51c2ed752de453fb5c4bc8f8e8512e6678a5ea636a67ebf237d0b32cadf1f95d63344797c5ffafe6294d61a26c6424d7d86fbe2cd929889784bfb0025e64f691fa0ad2ba567c4f99b529f35fd567174b765be50ffc3e1f61eeff7534a4abbdcb7858d9bca186cdf2f9c405937e6c5ed43da232e7eb3c28bda1adbb68460f137dea4f51f015ce6faa525d7937c2e2f713b88de4f7178cd2aed459458bbc77b13f17bb83ccecaf3e47ba4b48b2bba3801bca5923efc7d0eea8745bf56fc86afc7250cddf5fca05fa5d557f0b82dc9c3fb2db876f2edf632bffff178c8bd4b157bd1b791e2b72bf6e27d88f2829ce37728f6bac3c7ddde50c15b6661afc77260af96c46b2ec9fc8630aa4979a2b60bc2f078fe7eb9138c33cb7d39aff01a1c9ad789df25e94fcf46794e6d89a21f5d77ae929ed55da7766ff43bfdf528bfcb44f6e1f7951c691d8243f688dfa9e841fb26bd42fb9fbcc271536793b9a9b851f61b8dde89ef7f23bde73be17a2f08d7db5946d77f04d739cf387ed331be4293477ba56b3a1bef4b9307d4b74df171bebedfc9dc87b9df7cb7ff0c7f3f33faabe293f738095f56f78489f31e4b5d94f32b93ba7bcf0bdcdfe8f84b907be2fa812066caf5df83bac5797dcc7d4e206624783f2071b8cff7bf1df59467798fa7d37dfd76b422597f4ad70b243c598f3f149e0f287adc0fae2b7a24d642ac222e5d95f30f6afc8839fce5e8fde0401033e5baca81e75f1f5238f0f9874338fc9d86c3431972e031ddd5c4a19b72fe91100effa4e1b03a430e3c16ba46e1c0e71f0de170300d87351972e0f1e3b50a073eff18e6208a78280775af1ac481fbcfbce75277e5fc13211c2269383c9e21075e8fb34ee1c0e79f0ce1104dc3615d861c789dfc530a073eff740887bc341c9eca9003cf49f23e495d94f3cf847088a5e1b03e430e3ccff9acc281cf6f08e1104fc3e1d90c39f0b8f446e2d04339bf2984437e1a0e1b33e4c0f3d2cf291cf8fce6100e45d270782e430e2433be45c90b3eff7c0887a269386cc99003ad1789bfa070e0f32f86702848c3e1850c39507f24be55e1c0e7b78570289686c3d60c39f07820ed8594880f7cfee5100ec5d3707829430e3ce6bf9d38f454cebf12c2a1441a0edb33e440fbcfc4696fa644b9e0f3af8570289986c3ab1972e0f99c1d0a073eff7a0887526938ecc89003af45e1fd93ba28e7df0ce1503a0d873732e4c0eba2de5238f0f9b743389449c3e1ad0c39f0bce94e85039f7f2784c3216938eccc9003af5d7957f1073eff5e0887b26938bc9b21075e1ff5bec281cf7f10c2a15c1a0eef67c881d7567fa8e4059fff288443f9341c3ecc9003adf38a7facd881cf7f12c2a1421a0e1f67c881dfa7daa570e0f39f867038340d875d1972184cf77fa6e4059fff3c8443c5341c3ecb90c310ba7fb7c281cf7f11c2a1521a0ebb33e4c0efe67ca970e0f35f8570a89c86c3971972081b1b09b996c77b67f03a749ea771dbb9adaadb613bb48e274f9e63335c4fe1d4248c2ad963e41d216165322f5b9b9e3bd242e65112562632c9fe798516b6e2f91d1e4fdb27a5ddbed36783494655ca6b5a4fa69b4f880c9630d5f9a36f14fc6f087f23e1d3d85ba42cc60f9dbba2b5398ef44e7cf0fe78c41b1fefe48c70cbf964a781f711c83a8e681df574da3af5dd96da70679233d1fdd5d63d4e70fffa293ecf4fd6730ad33ce3f5bdbdaf68ba7f6a7962a739b3dd4747381111c37ab989a9eea911eefd02a3b3fbcc34a789d3d8c39ee05e1be6e24c71c63b63dc7850395242e2ddd6fb7f887bc7180fb4577e8a882753440872e3ddbf23dcc7a6b90f0a9253ddf31ddd3313dd7f53dc73c3dc7417f7289e1aec34721b09031494beaed8f1ce7437d5dbfd7fb28737d8a59d7a673a9506ba67d5677aba98133d7613dc336cd0c96e7abcc7b097f7ff0c8fe9088f7d67f7dc34f79cd06694d3c63dcef2a4a5ea3ec5fdad93d99b4ca6e738d0e87c245254caa676ae36827d03cf4fff7f8efc2f72c41b7e12e543fc8935f066c7ae48c989ff6f433fc88841aace84d1c833592470aeb1d3c09b3fec996241731d5335d4fbb76fefe39da6a1bae82d23b2fb704f83640e17bde1961e3b4bb79b120faad6c46920bc2452258d6a61861578b52387a62084ab108fc71a0aa2aaf9233af37b9fbfedf51f9adfbf6f8c779f7906e47b955f3003bcada77abb3f66b9ffc67b2266bbf0c39cee6e6a88fb5b504dc99d8602aa8867e0d4ea331d4964e2a8cec4de8ac1deff130f1f9026bae98d5c34a145d2c80dbcf64fa5105744b2bcc6521eb598b8b07cf0d079dd3ab7b8bef2bba7373de1a486272e8febf3a798973fd948453994a7cba162ff7521481ff5c3f2a77842af64fe883f7a1b96003e9e8e03b2604c67c1e2ff1b1f17dcb3f371313c7aac6243bdfd4a85fa60180364c1b8ce82de5e677dfe430b7673198ea5b66276362c9db10dcb7836ac9ca25d261c9015f335566c58827a6b29b40a145a8211002e8280cb5a021745c0e52c810b740e55f2bf2e92e2da240f65887bafb93b8951d1ba6a58d3fb53055026d35340de544c9737c284876a59a9995301674e71845cd116b90442ae648b5c52e750de8ad2ffbea59e5d1d29624dc58cebc8c39cb086b6690d594a673d6f0cf2ac7fd57aa90348fcab8dfbec68d70e33bc5181e9eef3ba01a7708b1e9e71b4afe259b3d0d10d83993142162eadf37c61f62350b6abce7f1876fe323a7021f1c84cc274150c7c08023eca12b82c0a0485b681a01c42aeaa418e982097d7159232ff9b10d3c8ed4a98871831ba5c2ec5d7f445a25a688041f291fb57d0e58ab05d753d25355baae16c3954972d9ee3f6f80fb3a58d9b12bfcd33a586cbf290cc1a1135bd3ca990a25698709423155140aa958380540915c2dab6c5bb3242ae638b7c98ce8fbc3835e63fa9037b39ed9cd35c8a49b449de18b89033d51ba11de3d63123dcb3f2eff62eea142fbb93b5112385fb9d78cdf5084d3e3b3024d4f5dcef58c7f9173923773d1ce57b3ddb7caf82908fb5453e42e7515efdf4df0e5ffaa382e3b38a4e629386a3326e953670d0e864380794eb47eaf24658b021a2a5664f039c3d4721f04639002f445ed5d8d6abaa22e426b6c847ebfcd56bf59cf91f46c0362ef9a91ea67fbe8fe7256aa4e0bbc2bdb7694223695cd86b8b1c9912c5cce48a8d716b45c4d8ec74efbe88e720fa5271bc572a6c25a232524de70f22d7bc3d7615e58fd3b9f1f1d825aa23f0663900af813cf9445b4fae89909bdb22d742c827d922d7d6218b76ac782f31b581a822d7c4c87574c8a2a9275644d936f58ed1818b2ea2d89ed8a68b581701b7b404ae87805b59021f8b805b5b02d747c06d2c811ba0e2dd3613e090a2dd1001b7b3046e84ca5f7bdbf2d7182177b0456e82903b6a908d86249a22e44eb6c8c721e4ceb6d6385e872c9a5de29db2d466d7b25626cdae1310f8695af0b92d4dc09b219b74b1b5c9893a6411fbc5bb5d56b1bfb90e590cbc8837b6ec065e4e42e6e866eb7c27eb9045bceb9e49f40889772d10700f4be053902d7adaba464b84dccb16b9152a2bbdb56565a351416c8dfcae8fb5dfb541d07dada1db22e87ed6d0ed5011ef6f5bc4dbeb90455d2b5eb2b16da37740e067e600bc23021f9003f04e08fcac1c807746e00373007eaa0e5cb4d7c50ecfb6edf5d310f8a01c807741e08373007eba0e5c44c2218e6524ec8a9087da2277d3218b183bccb11f63ea8ec087e700bc07b2c9088d4d8c6af79e3a641109473a9691b017e23cca361f7b6b901b78334fc2b3ff574363f272d1d69e84ec86c9c4db23994d948ba990da91ea4ebaa1accc99a161ad3ec8b9c7e6c0b9fb22f0713900ef87bc70bcad17f647c8136c91cf40c8136d91cf44c8936c9107a04c9c9c834c3c0bd13ec796f640843cc516f96c843cd516791032f5b41c987a30a23ddd96f610843cc3167928429e698b3c0c21cfb2451e8e3271760e327104023f3707e02311f87939001fa503176d56b1b7ba6d9b75b40e5cacdcbc20717312fca0fb2705bc04061f83985fa8615ecc90f958e48773347e68d4fe1b876c32576393b93ada2136198fc02fd2802f32049f80c02fd6802f33049fa8016fe0add211d4ffcb3598fa177f3bba9a0969f20af8d4551ffce6674ff738d26331c27bb36944062f0c8737522f49d8479acbf5161ab57774eb36ff575acc73d914f3860af54de84b1dd184febf8b336a844fd239bc78dbe03247f3569be8c30d72fc058242fe44ef52771745e4a6383fc63da6948922b84c4c46116ebe26c2450c23dc39ba02e7ad2f9bf83f2d70edddffc56bd353bddf33287b7b7bb2932ff8d91425b1d3a9d9d2afcb3da76d9c81d3e6823d72c72928fe5ea189bfd52366f1772a02bf5203dec9107c1a2a48e2e31769271e424ac874047c95ae84c6bcfbcccbe10c649bab35b6e96f689b993a70d1d2101fe6b06af1ce42b41769682f34a43d1b59fe5a9de54545decefd318de2f708d7f10b9d1ede4551400bbd77ee87b8bf467a85748251fe9c8b14bd4ea3e892a899a2e72145afd7295aa055d44499f391bcc53a7922d9dd8d1e7e4c319173019273834e4eb1849c765e968d739f99e4669a89c40b91c41b91250b69242d3bb79883dce2268d5bec36748bb93a703197ba2493901632977a11b2d2cd3a2bf98d8e412ee4202a42fea8e3202f3dc4fd35c4d06a1723f9b7e8e49723f90dbdffdb7af5d734f7f2186f2b93c00bfd061c2e411c6ed571a812e0900917717d8a574a4d58cdd3b112916da993da366f28dae6e27b00d41856e55c8ae55c8ab4bf5da77d794ffb6eae8eace15047ec0c34ce39939ac7ed134d52136d2f432cee40a555f6bfd6eebf5146f2e62379cb74f2ca4a792e5e4b9be8c6d9f1969ebf0031588eedee33189168e975a5ce4af62c2e472cee4cc722d5fed9b3b802b1b84bc7e2d04009145db051b46591cf65b8fb37db5870252a752b50a9bb3bab52b710697c0f8e7be1a56e967143f32ac4e1deb032d0288765e06ac4606598f735ca7119b806b1b82f1d8b5c96814588c5fd3a169543cb404feff9499e8db22d09d7eaf888f6cc034e6a7b6651dcac3d739d0e5c8c35886f27d88e355c8fc01fd4803b86e08b51363d840bae1c30938dcbec5de506c4e1611d87320157e9e535446c1aba3722c758ad718c7af9668e7113cabb477290774b10f89a1c80dfac031735c7a30ea839c47721cc6b8e5b50e63fa6cb7cb9ae9c917829506d9d66e786b722268fa72b0aec867db58c4c382c45567f02597d5d5656bf0de9faa44e577f8997a8af7b7b761535755baa35473966834eb76b2437f0de9ffd2fb70392b73ccb6e3ba0a73419d2c07bd33475e39f4ca489af80d0468b8e53048cff8b4f6de87616ca44001a18bd03b9c2333a57a8e0e81aee9dbde693d8932efbe2b70cf17856c7a3b4c46388d754996a217b3992bd4127bba413d65831917ba74eaea87b363aa975cf96226675cf5d3a7031e4b1c9b15c2bb702213fa7414e9ddf0d41be1b216fb6e57c0f32f5168da9ff3234f5bd3a70e126cf3b96c3d02b11ed1734b40b8b9ad1be0fd17ed196f6fd88f6560ded7686b41f404eb2cdd64956e99045f5fb9203aa5ff17196a8179bc5674e6a47c4eb767d689664b6377834ca8bcba2fad2cdc58a488deee7aae674f738dc15292abdb85135ff20d2e715a48ff8508a7973e22124e73524674756721ed6c911f1557c9725254e0b171ae47664fb26f64815f5a4a81fcc061656eba48af69ff89a8aed8b618f20d3bd894cf75656a65b834cf7b6ce74c51c9e8e178e29da7a23bc569f89d91e4566dba9359bd9cb7a6b5180794713601615980598c790adc4275b6c665c1fd7018b802bbe236315709f4094dfd765af78a1a8ab1b550aa54e9468310ef1d65d8cf2da3185de126b31bb38c4fb9f9be185eebd23bd39c74934fb3886dca49ef7cc38f7f764af912e6259a1873ed2c510f12b3957991cf233b1df3a64bf0f6cedf724f2a70f35fef493a13f3d85687f644bfb691db218d2fb38134f0d798f683db2c7271a7b742966668f6710eb5d96ac9f45c09f5a026f40b1ec336d2cd3982324966d44e09f6bc15b1905ca4d2830ecd60506ff851751ec45f49fea354886b84555343d861b15d5e790dc2f7472e5711d2c3fbb99c7cd88c9973a26c5150bf897c6186abf05c9fc4a27b33cd03e293b3bcd9fd7b1106d8baf1dd0b610df94316f5bbc80b4fd56a7ad3f80cb23647c1c4f5d687f231b132d5fd449174356e203d8ea30689eae6c860c836e4571708f260eee2e6e1607b721e6df6b986ba34a08f39710f80f1af00243f09791597ed498a54c0933b36cd7818bc824beba65555dbe8290f7da22bf8a0cb24f6790926606790d81ffac013f50ca0c7c07f293fd3970c2d735e00dbc5df3fedd8d11c3bad4c1a5cfa61df0f05161f15dfaccde86fcd5e10d11ff3dae68c8f70d14af7fd3d13708c56fea80857b1cc804783d067e0b9580df3525e0c3d26625e06d1db8b8ff0f27b59a6ce0edcc98dde6fe7fba4fe5c71cff4f7df74f91d46a3664e3fb9da8a4fea529a951c392fa0ef289bf1d4d1d2e5ed6d70d67153ae7b9ad980bbceea29890f057704ef3ba97c23be58172d1919ceefe3ed6eb501eeb0ddbfbf349854e726a412036f210477a657d82f79cc0f67d5f5c6fec5e6fee1e9bb8c7aa460efb2ecafa7f3459df5064fd41bb3c7c0f99592c0b4831f3e09c98397b63163a339dd114800b956532858ef8d6d7706f7460048d0288debdc01de5b198eafe35cb8ef751318f44528bf9aef266c5fc035d5de4ed12fa5feec1dddadbc056b478cde71ca3914c6b97bc887e07ee70e9a8bef850972dc272311d21354b041700fc912e4bbcbd55ffcb5d6ed5f178b34c89679c29f911fd0eb7e9e4a36cf95867bd4271f2bfdcbd3c936fe5e92d572463cb158de8372f0ffd9c1cb0da273a6716562b88a46ebff3abae162d8a1d7a170a60c534016c6505b300f629625e5cc3bc8821f3cf10f3121ae6930f3563fe39aaf54aea6a3d47473da4d6d88da897d2506f56d18cfa1708bcb4067cf16166e05feac0458bae4cc4beeff515023f2407e05f23f0b23900ff46072e7a8de532a96f7ec5c0df223f2c9f0970880b7e87bca482c64b661d6ee6257b74e0e2fe4323a0915a3162d548fd1e99a992aeb88a1db04c1ba9a232fabfb13ff00332756564eac3ec4cfd2332f5e13a530fcd99a9ffdfe913fc848a56154dd15a78a459d1da8bc2d811390863fb10f8913900ff19c5c8a32c63e47ee491859631f217648eaa1a7368f7330931c7afc84b8ed605e0a3ccbce4371db8e8ff54b3ecff1c40c0d52d817f47b6ae9103d7fb43075ee8266b66c23aa40dfa27cac45a9a4c6c556896897f21f0da1af0a255cdc0ff46e07534e03b0cc1ff41e0c768c0971e6d067e10794add1c788a1301e0f572001ed181fb1f97cbc00df3b11b4675c022b0d5d7d5c962db70d33a791ad5afbcd2c6a4e163567be6215d1ae874f1c27c40aa89ac1892d550274b9ef41e9632d591fd5aee3862d148c7427e157602b54ffc1550d933c8470c1aeb181473e4d5e4fd3ccf986658b516d14914c04d74e1a7ba5984288a0a71d31c14e202c4fc380df37a35cc981743cc8fcf01f3e288f9091ae60b0c999740cc9be5807949e49f27eafc537c356300c5b2816e6c184071a839f50bfc73fdbde3b1ce29eeffeda59835cc031aeff8eb0027bbe7467bf1659637ce38c23b3bdc30a69542fc9bebf88b4f0d2419f1d6b185099d9a933e82bfda4ff263b6dac799e0dd3135b1c271927776b8e3efc622fa3ab31dd3e552a5753a09073909753c4f161d4f6fe6c8f13b9ec67dcf32c8c95a689c2c66e8648720f05334e07143f0b208bca5063cdf10bc1c72af563af7aa9e51f1f0bbce0ddc63533ae71795f39ce3e8dee3dda389c394470ed31a394c1b6b87a98064b64532db59cb3c146575fb1c44c28aa809d9c1b209590959aa23b294d8152c3f2e5bcacc4e95919d3ae7c04e87e9c0c5baa9532396eba60e47b5e8699a5a74782bb35ab40aa2ddc596f61108f9745be4231172575be4a31072375be4421db27821ab7bc4f285acaa08b9872df2d1c8f17a6a1c6f6b6b33c7ab86aa905e966368d511706f5ddd24c2454fafd935c21b92f5d78689c64f8b44f7d4447a0d64b33e1a9bbd6b68b39ac83dfbdaba672d44bb9f8676ed3666b46b230fed6feba17510f219b6c8c720839ca931c8604383d4d5818b450f0374559f58747e56249b45e7f590bf0cb4f5976351213b5b57c8fc37d1bbb845cbefeb74f27a18addd94bf9262aa5111ab8f640fd2c9aee4c86307611cb27b81a0818e8d18b8199c491c0bfbc623f2c0211a0ffcab9d99073642361c8ac65fe4cd2c0ab37805a131526798469d12edcdd46982c0876bc0c71b823745393cc232878f43c0232d818f47c0a32c814f40761ead6b1118dab919f2c9313a9f145dd69e5ec9f5df5b36f1c513911a637595b4a11acd512f635c0e7a192721e6e335cc2b7530637e32ca800928a8fb7bfa88c56b62787e8a174a0b136d28932c6981149ba86b80182a760a029fa4019f6508de12e5f7e41ce4772b9425e7e8b244ecad93dcf145ccb08cf146f5e4ece1f580d98fddb7469ca6e83805b76eec23ad7d486e0525f33361d206e5eb544dbe16ed6896af6d75e0a291360d35d2a667d5486b87fc67460efca73db2d04c8d85fa1b5aa8037284593a47280be3c578720811c6671b394047c460b68e01ef652c3e732df646e30bd917854e48feb93af9f2c650c1a2209aa533ddffb3b54367e443e7e5c0874e453e74bec687761bfad069c88217200bea7dc86f0a4cf26e1461cffbce818105bb201e17ea78f0ce764da8cb30d5c9c5f65ea7230e73741c8e84ded4dde3e47fa4c49fa0b1b54e57d4cf9e6bdbcfee869ceb228d734dee64e65cdd91412fd619b454c0b98679a61be1adceeb60bcd16e0fa4d6251ab5e61aaad51381cfd3154843f05ea8dabb14557b976555edf5464accd728d1b4b399127d50c62f404d143f39465a98996c9e04638dd960455fa4e6e51a35371aaad90f815fa10117df3d3601ef8f6c78a5ce8602a8b79b1ce7d98ef7c69fe2c51c137b9d81545aa851a98ca14a67eac0453fe6aa4cfac521df54188080afb6043e0b015f63093c10d97991ce2f4f33b3f3d9c875ae452374c9c276ba13dc6149dc2622f110f7fa6c87775c3271a94148d5eb34aa1e30547530caa0eb2d33680862bd58c3ba4a1733d6435106dd10deea9a9658d08137c532c99a61a8b2b9115536376555d90c47fa2ed1e9eb6f5e2af6f24dba65cf840b9ae83742275734b56fd6e927baefb744827bdcaac242360018898c792b32e6d2ac8c390a19f3b64c8d99dd1e83a391316f47c6bc237b638e41c65c868cb93c2b638e45c6bc5367cce21a63b6f77a1e26861c870c791732e48aec0d391e19f26e64c87bb232e40464c87b33f5caf65e77699261089b888cb91219f3beec8d3909f5f3efd7f4f3b5afb786f4f327a39c7a00e5d4aaac72ea1c94530fea72aa7422a7e44678b65bab4f41b9f510caad87b3cfada948d1d53a45f9a30d626c6aaa1720c533d98f264c43d21f419d5f75af7e795b5813c9d351d3658da6e952a2bb59d36506027f5403dec9107c26025fab01df61083e0b15dec7723048371be5f6e3badcf6e6021d7f17bdd669260a4c72fe5cc4e2091d8b239cd43dfdd2b1c96e92fe3cd44a5f67d94a3f1f39cc931a8769d6c3cc612e40d67c0a75a35abb3f877be37bb9ef465d88547d5a375267a8ea1c9441eb2d33682e62fd8c86f56243d617a10c7a36d36ed4904486d974a32e4635f70654736fccaae6be04e9bb090dabf93577d22dbb7b2dac91f46eb45c8b9b3561e7a17afc39548f6fcebe1ebf14f9d016dd58494f331fba0cd9f4799d4deb3a0e7d207584f716943f6879ae2306dd26ba961563d7a2988b90e90751f17686ff8eb95ffca77a4373bc616c72cf6a13ebcf47fef602f2b717b3f2b7051a390daabac9c8b9cefff213e2c96fb08ff4e6d97dbcae5ed99ee9f520c6053eceed7f7d455cb5fdb4f8d648eaa7c523e4d4fa7d81b645c4ebbba7784ffcefb4423b0d5d8ebcff25d444160331e77849619d6e2eb38994bfe60dd52b74d2c5b4d6cb11cb69ad2b11f2765be48508f9155be4ab50987b5513e656f5320b735723f0d7742d6b43f06b10f80e0df87e43f045c8e0af6b0c1e3531f8b5c8f9df08eb1f36cc51fff03a24fd4d9df4431cb97f280fe5890020d62f987eadfb7a9d7c312ef356c47271f26284fcb62df20dc8d1766a1cedfc33cd1ced4604fe8e067cad21f84dc826efdada6409a2fd9ece2603cc68df8c9cf47d9d938a2d67e5376b73ffd1ea5b747cc46a900f22f61f39b81559f2435d0f6ba0992597224b7ea4b3a468aaa9962b24bb0a9b35f7ba903c8acfdf3f317f5de636a4f2c71a95e71aaa7c3b02ff4403feb521f81dc89ebb74f6ac97813dc51bd385de4230bf4553e8f8ef54fb7b61f033a3bd36bcffacff66b889bd9721937caa31c90143932c47e09f69c01b9e6d067e27b2f7e73a7bd7cec0de13bd5eb758b225069686795786272c2b7fcdc77cb0e42e648add1a53b43234c50a04fe85aed01882df8decfc251a74ca3ce29a7fb0fc1ec4e62b1d1bff6b66f28765db7a4388a6bbb4dc8ba47e8dc675924d23bdf4ec862d57221edfa46b208ec9c172c4fb90f46f75d28313081d9de437a7cd3ff17b3f92fc9d4e72c58064cc20bb3c780071d9a3e3e2ef54139ce9366d18af42c5fb7b4df1de3ad8ac783f88c07fd080171d6206fe10b2d58fa8b4f6567679e2fc32b1d7c348a59f342aad3454693502dfab6b4318823f82ecb52f537b65e35f6b904a3febda00862a3d8ac0f76bc09b0e35035f8bc07fd1804f33047f0c65c6afbacc28a9755e319c2f1a0b26d9f13852ea375d76182af50452ea00528a27e29231ac771623c4eb90dcdf7572759f364b959f5dfc7e1231f943c7a4b812bfb3cbd2a790cc3f33a933b289814f2327fa4be3445b869b39d17a3476f0b7edd8c1333a64519fff93b8a04c241c8c643391f02c328ff8068c6a9ef23a2542ccb301e576249a6114f7df4a37fbcee746a45254a35277439536a11ccf8b5ae6f87388764c437b9121edcd2827e2ba9c28ea24dff7c82607b62055f235aa2c3354e5799403456c73e00544bba886f62e43da2f22f0020d78ef9166e05b51b4281605d1a278349b68b10d295142a3c40a43255e423e5a52e7a3e534d142deae26bb97ad5f460a96d228b8d650c1ed08bcb406bce92833f05774e0626ea24c34753226623219f32aa27d882e3019d27e0dd12eaba16d3487b403d12ea7a1bddb90f6eb08bcbc06bccc6833f0371078050df87843f03711f8a11af05586e06fa1225c515784ab688a7072aa7da277636160ad657685fa6da472258dca5f1baabc135547956daba37774c8627de26151bbbd4ade45c0875b02bf870c5d4563e8da63cc0cfd3ef2ad2374be2526bc741bf3143a3d124b24c4ebabe281f1597d4efe03a4ec911a659b192afb21023f4a574a0dc13f42f95f6899ff1f23e0aa96c09fa04276b46d21db850c5d4d63e83d8686fe14b96c759dcb0a7db8d5ddc97b3d74789601ef33a4540d8d527f192af53902afa901ef32d60c7c376ac8d6420dd9da593564bf404ad4d128b1d450892f51b61f83babda2e13adef117218e90b2df24d3bf422ad5d5a8b4c350a5af51bed443f9726c56f9f20d52a2be46890fc79929f12dca9706ba7c29eed52043bc76c708afe6c82657be430a35d4c5174385f620f0461af07ae3cdc0bf47d66aacb3d6215ef01ae7b6e526bb96124b23677981acb56baf19092b9a58ee07549934b1ac4c7e44566baab1da4a43abfd84ac761cb25a9fc047affcd689f837dcc96633c1bd48b9e335caad33546e1f023f41035e748219f8cf3a70d1cb6f16b55f40b41f313f51c37cb421f35f509e37d7e5b9ff0957bf9af797098d4aa4fce17cb104432c186aee96a32686cb867e458a9ea4ebeb182afa1b52f464e4dca97316ed9ce9de8c7b369bed1c40f25be8e48b971ef0dc89ca23bb3994df91b94fd185f78966e6fe03b57a5bdab67aff44b45be942e02433da7fa1b6426bd4566893555be16fa4445b8d1225269b29f10faa7dda59d63e0751986b9f8330e74481493a684c32cdd0241104de51e7eb86e05104de49d79439c70c3c0f8177d6b5f60dc1633a7011324e45ad4a9ec60cee15621276e248a1d3745961a8503e02efa201df38c50cbc880edcfbf6816d4c2b8af2a16b262536c4d80508b85bba5aaf9723be683ad97b43689adbb5ebe3d63363dc5f6633d8c590fcee99d67a984776b55e711d23b1c8ae47547c6639c8289a0a5d0d439740caf63435b61837f65faa3451ad2492df2b5b6327796467ec52c8d8bd35c68e1819bb3482eea381d694c610e8322888f4d555ce33cc82c82108bc9fae1f32d30cbcac0e5c54d0fd3515f4c18373e69854d0e574e0a26d74066a1b9d9955dba83cb2d000dd9c9da1852a200b9d958326cca1a8000eb40ce3159149ced64ded1a9aa412021fa401df62085e199964b02e26957574ddaece6e24e27687ff8abd89ed0e430c86e818c89b6d67c224bbb87838f2c2a17a2f6c65e28555507e0ed3e4e7bc73cdf2f308043e5cd7fb32043f129965440e0ae75188f948dde88221f342e464a3744ee63548e9e5ca42c9bd4c5ca82a5267b46e41c67966ea1c8dc0c768c01718825743b61aabb395d82e24d9e9b01d62ac8e141ba751ec80a1623510f878ddecd2f966e03591d526e8ace675ca9537787a27de37cb769fad5a48c189bac862a8606d043e49570d1982d741d69b8c9ae6499fe35fe3e9fba8d9f8dd3148b9737413ee73cc94ab8b949ba253ce7fa5c77f91a6ad37903885dcc45cad7a48f254347aacbecaa363905d9d7a2ce2320d15103d87e41a0b737bd4471ca6eb3854496b0f954b961fb342ac6620e79f4d1f669fee0c75c4b62bfe67ca1b3833bd41e7616ef83091df10c99fa9935f10905fdf63d0c0485e23246f16aa8c6778fb910df73638194f5bec98486c8c24ced649cc1351dbadfa9b1ac968a291d1e068371919e8fc9bdbe60491fdfbfcb62fa30ef1cef85b10894d6326b8bf87796308c29643d36c7e736ed474f39bf3a262f39baa295a67c30d6d61d314e5e8f9284767baf7cc30cad1e3908c0b908c96ee7d2d8c641c8f645c8864d43496710292314727a388a747729b013359cd90acb94856cdac659da82b7162dc28d2e33f2c717e636d4a1625eb22977f0dc5242d4099bad82b531552f40a938eca4e73d4d8b944d3d8297fb95963e724043e4fd79232043f19815faa015f758519780be4ba97e95c577c0846f41187787becf9fb0acacb3ffbb82ed7c59b8619427bc609f7e3e977b389f75310b3f93a66f296b682d964afaacefe8df49648fa02545d271b4d3dbdfb8718be2bdb0a49bc1c3715d537d19392b36b94b546ae7685aeffbed0ccd5da2005af442dbea43ae22594e10907cbcea1da22f90b718fc437ecf4443b373b676a87245f8534d7ed7fc505cfb78189fcf6285bafd664eb46c36ced8094bb0695147e935c9eae3551a723526791469df15799a9d3094d285c8b2614aecb6a42a13352e27a8d124bae3653e25494278bd100b73a2e63fb398ad3907a3768d473ae3153af0b02bf513712b8c80cfc7464bb9bd0f081fcf9a6e4c6c7a271325c5913d5dc70594257c465898e8b504a481553a553bdf9e8eca47643e6bd5963dea5d79a99b73b1a4ebf2507c3e93d10f8ad3900ef89c097e600bc17b2f96d1a9bbf6568f3de08fc76dd00f37566e07d908fde611e6bb2fb5a4b5fa4de328d7a7bae3753af1f025fae012fb3d80cbc3faa6cee4495cd5d59553667a03c5a816637b801c29dc7ec1b3f6722d9779b347efc05bed9ec0f320065e03d9a0c5c6b98816721f07b35e0d36e30031f88c0576ac09719829f8dc0efd380af36041f84c0efd780c76e34031f8c1cea01d431c401c7fc8b4643906aab34aa9d6ca8da5004fea0067cb021f83064b7875010f0bf373bdd2b72ad9d91de535312fd1013ab0d47b21f46b2935fe998ee7517b27fef650492bd5a27bb92a3fb52888e43765dec9188cd2368de6190f7caa2f0607e0bc844de28246f0daa9e93e157959b9dc6a35125f728aae4d66655c98d419a3e86876c78c14376cb1dc6a2e2fab8a6b86e5f6a565cc721b33d81ccb62e2bb38d474a3ca9ab086e33536202ca93a750e58f6375363b7f4f44ca3dadab886e37536e12526ebd79cb37bb2fc24d460c9e410c38a4890fc08b31dba4dcb6de8a82a9861f1d3e07317856c740b7902d8c497601670ae2b441c7a964a8554ce44e457237eae4ea76a24b959f9d05a6e9988811cd4dd1d4ef7f8979cd14f090ef7f4dd7cd40557793913ece7f3703d5c7f1773669e24a1f40334e663351cf69e268831a428fca297a64226db38b5754c009a36d5de638d3dc7ffddd7f8bdc7fab9689b0ac9de5dae2cd72652713cd76cd40aef83c2a02e26b687e1e882dbfdb79616a8c63bae9f74c24f7059ddce2de7d13bd3695ff45f4c22c46b76721992fa2413279abdec22c0bfb6c24752b92dad3e17792bb78e5618c9732b3efb948ea3694afe2d59471de06e433bd4f3365a7ed7928a0bca4092851c380723e52ea65d4a1c3f1b2b7d3dfd07d2e40d2b7eba457ce286afb2cb28bdd172253bf9283d83d0729fbaa4ed9422f2ef0db36621702ffb35fc13772e40f7ff5f23c7bba57bea6197bd95ca4fa6b1ad51d43d52f42aaefd0a95e2eb4e8143ab5298feb182978316a8ebeae698ecebad3ac397a0952f00d9d82159ce0c4c554afde1de10def157a9fe5f2ebe8e1c6d307f390926f6a945c6fa8e4a548c9b750d895736d18edfd63aad2653aa9a239fd7634759d589ee3e89db32e16301fd96ca7ae27b9c2cc660b10fb7734ec9d2cd85f8ed8bfab1b8037647f05027f4f03dee96e33f02b913bbd8fba2f3dbd803e25f1ae4d72d18b1f0183e56842169b4d2d440a7fa05178a5a1c25721f00f35e03f19825f8d862c3e4243161f673564710d52e2135d84b9c74c8945087c97067ceebd66e0d7227ffb54e76f759cd42103f46972f1099ff0ef19b7c862cdcc7588ef67e99a66e8ebca26d2af47d23fcfb469865864d7345b8cf8ec4e37953555919ddd54da0d48fe17a809a37e675d9e50cb2e4f6e44c5e34b4df1d8bfd2ac78dc841a805f691a804575b5544803700962feb586f9f0fbcc98dfac0317fdaf6fa296db30dc8232fd5b5da60b8489f41524936cbd1549f90e4d92245fcff7b7dae3af5a71509ae89defe8b5bda61b0edb2e456cf6e8d854d514fc4c596517086e43fcbe479338a31212bb7ac5de2c776e47aefb83aed0dd6fe6ba7720657ed429534f532765f6d1ed42ef1d1d5d266453332d43ac7f423553d245e4cccf2e122f47d2f7eaa497d7446264331316772216fbd2d920174ba4ef42d27f4e37b338c1e137b6ec72610562b03f1d83417441d486ea2a631306772306bfa49bfec8844976c1e91e142c7ed5048bea0f9a058b7b11f86f1af0320f9b81af44d63ca0b3a6e858e83f50df5cd909aa5a16f1e53ea4e8ef1a45cf3254f47ea4e81f3a45ebbbc9365e612da497106b796e2136381ced1d935ff2acefa60add26ff68fac6e754f7d7246f404e04e0893480373ae164e2e54213b33c80ccf2a7c62c1b0dcdb20a81ffa501df6d08fe2002ff5b035e74b519f84308fc1f0d782543f08751b7fa20ea568b3128f36ef56ae495e2153cb08082d7f267b780e21164b6689e26c31f3133db1a049ea7015fb4c60cfc51041ed380af35045f8b323c9e07323c3fab0c7f0c295144a344bd47cd94781c8117d5800f36047f02b96a81ce558f701c6969318fdbc935c4785ad32646bea77873d42274fadfc83071e87548e9621aa5271b2afda406bc81f8604b64b2f36f4ebcf775d1da7a13d2c3bdeb8c368152bd940a38f9be434fc75f4038de3d53cfdb55260c297cbabeb86bc13cc5820d6a09ed9b7ae7fe1b8e75bdd777c5fdc9e972a7a2d7c51bead216a4939fe2751c38e95f224f4cfaff97ccd15281a790cb96d4b8ec2e43977d1a95d352ba722a467a3a48334f855ee5925d495c8fd42aad51abe95a33b59e4101ba0c0ad0876415a09f454a94d52871d663664a6c40e0e574167ac20c7c23022faf012fb3ce0c7c1302afa0015f6d08fe1c023f5403ee3c6906be198157d4802f3504df82c02b69c0b71a823f8fc02b6bc0df35047f41072ec6af0fcbd3bd5a357783c9ab552f22e687eb32f41933e65b5180aba20b7035a89ef63fbd2537406a7b434023dd5f43bdfd9de4edeaa73a7512a1f03c576636dbd86f43163e4263e157b677696962e19790858fd458788ba1855f46163e4a67e1e64e7059c3705a56c63ddf218125fcfc86263709277b2d8d195efd3a9dfacf7e6ed5f39a8693bc0913be5bdccb0d4793bcd88ecc55a831d7d786e67a056574556d51d2808764f4ab88f9d11ae6eb3798317f0d6574355d46cb5310dd956cf3dbfa0223fb1d3a772036d5756c74531099b2ca6e94ef75c4af868e5f858cac95cdeb756f201e35753c8e34b293dde7b8df44ce5a4be3ac5d9e3373d6b710786d0df8f986e06f23f03a1af09586e03b11f8311af0a29bcdc0df41e07535e08b0dc1df45e0f534e0a3b79881bf87fcf8589d1ffbabb5854726c713c4ca6ce1a523bc754023bdf5bdc96adb74fcf97da46c7d8db2cb0c95fd008137d0b5ce9f3703ff108137d480ef3004ff088137d280577fc10cfc633489df38cf7212ff1344bb8986f62c43dabb1078535d0fde10fc53047e9cae97f8a219f86708fc780df80243f0cf11f8091af0d85633f0dd08bc99067cbb21f81708fc440df8f06d66e05f22f0e6bab2ff9219f857288a9ea48ba2e215a8015273dd5f52dd3cd14592dfd31868b864f76bc4e4643499a1936a22f11b64d8161ac3cedd6e66d86fd188d32968c4a96556234edf21b3b542d5e02047fdc4b4fc013e31413bd4bd7994d4ac3331ea1ec4a7356ae68ac66263f7df88c42295cede4bfee215e6ec971a7c8f78b4d1f19077d018e4bd47201a06a368af6653c7fa01e57d5b94f7edb2cafb1f7572c482baf63a3962314307f78218cdf6fe144915b61e0bfb0929d51129d5292ba5f6a28cebaccb385e23d2d4fde7af551a4e1326d9bbce3ec4e0541d83f21283a40bf3a2b1ec59fc8c589c166607b19de2306ffa609a93dc03203b06fb11832ee98b90dfd66e1b606222fb1724fb749d6c714114d5e4d69626b27e45f540575dbff335b37ae037a4483734a1c2461ce79e986d917d0790e4ee3ac9f262b31989d3d94bff1d49efa1935e52e33cc9cb2672ff40727beae48a64722d8e899c3f919c5e3a39eecdceb1ee5f13097f2109bd51f1e3b14ffb45e37f23d97d74b22ba695ddcd0b8c53bc915bd3d76bfe415cfaa250c05cccb7de3f8864f5d3c92a21c9b2d9f0dfc90352fba3b21294eaf52ab2901b4172cfc8dcc3ba3a62bba1a1c6e5278a649fa9932d5ecde0917ba1abbdfc3c247f00aa5ea72add8da18eff1d946c19c41083b3507c6606dd12112bfbe1f238923e305ddecbd2877803c0a68b70f391ecb3519f45175d78795057afb698e9cdf58ccb6a48bc08e233084d64a4f269ef3671c4fa4c7e7fc1dfa82c1b3645119bc1a823cc6cc4863bc3bc7683597e14208943501b85257672258e0f9447b3dd688a21c94351bc9da4d424acb389d4e248ea309d54b1e9c564698821bb7e71092473388af1fe9e3ac17d76cc5f4e2d89e48ec071d6979bccd3ee4e707f5a13f9a590fc9128cecc908697921f87cfa6249546b247a17c9ee92d669ae674f0ecdd2b8b654c6590ccd1a82c8da63294dcb7393b0f3b04491e83258f504a6f767b47974592c7a252cc3ec616ce2677cb21a9e39067f9ebe7f94b08bc2d6236b2cb23d9e371c414134de3dc9343bd018a6c5be61590e409288e4c73f88b6ded9ce0eed626720f457227a6976b133f2a22b993502b69b4e75bf2f6483c0c31c52b6926d22b21e99371991ae24d894fa70fc6085f3b338bf73b2b23c9e7207b8ff15e36b7957b984eae68644cd10c868cdf65361872b80edc2b1d79f6fbc554d1817b8e683b197804429e6e8b7ca40e5954c233dc0b87a445ae89918f42c8336d910b913566d95aa32af2bdd91adf1bfc9999ef1d8dc0cfd5806f3404afa60317b365e7e565f0cde63118b83a32f6f9b6c6ae81285f6049b926a27ca12de55a2826cec9847248d0ab8d80e75a02d741c01759021f838c7cb1ad91eb22e44b6c91ebe99045bb6c5e26c6a882818f45d5caa539a856ea237b5c666b8f062844cfb70dd10d11e705b69c1b21e4cb6d911ba3787485653c6a8280afb4046eaa033eca4d2ecc04383f02818fd3010bffbf2a13e05f31e3e311f0d596c027a0a27d8d65d16e86fc6d91adbf9d8890afb5456e8e90afb3453e09215f6f8b7c32cac0c59619d80251bec196f229a8f8dd6859fc5a225bdc64698b56c8164b6c6dd11ad9e2664b5bb44155eb2d39a85adb22f05b7300de0e197ba9adb1db6b901bd476939171cebff95a6f1f6f87e7692e7e7befea18af739fc4f43bfb421aef3e1df68458e074ba37a03cdde312fe32ef6d3a3f8a2836f35e94bd3d4fbc282bde49f977f9a2d7633be8f25df8c91d9914859005501d11f0324be04e0878b92570675404eeb42d02a722e4bb6c914f43c82b6c91bb20e4bb6d914f4771ec9e1cc4b1ae88f6bdb6b4bbe990451c5b9989df89720e80bbeb80c5e8c97d990097c18c7b2043df9f0343f744e678c0d21cbd50f95e6559be7b233b3f6869e73ec8ce0fe5c0ce7d91391eb634473f04bcda12b83fb2f32396763e03d9794d0eec7c2632c7a396e6188080d75a029f85ecfc98a59d07223b3f9e033b9f8dccf184a53906a1c8bfce36f20f46f6783207f61882ecf194a53d8622e0a72d81872173accf81398623f06772003e028d2f3f6b39be3c12f9de065bdf1b85ecb13107f6188d5c6493a58b8c41c0cf59028f45e6d89c03738c43e05b72003e1ef9def396be3701b17e2107ac2722f01773003e09816fcd01f86404be2d07e0e7e8c634c476f691b1ceff624ca3a3e3bf3fd3cd19ea8c75fc6595b91dd17829132fdd8e2d3605b9ffcb96ee3f15e5f3f61ce4f3341db818b27c2513d6213300d3750e748c70a091ff1307faf71ce7d58c87c25ef386c28411fe0d96f05372ba2c1624766492c5afe17eec4cd42678ddb64d300b21bf618b3c1b21bf698b7c2e427ecb16f93c1400dece4100381fd1de694bfb0244fb9d1cd0be10d17ed796f61c34ecf39ee5b0cf5cd49b7ddfb2377b1132f4073930f4c5c81c1f5a9ae312d482fec8b2053d0fd9f9634b3b5f8aecfc490eec7c1932c72e4b73cc47c09f5a022f4076feccd2ce97233b7f9e033b5f81ccb1dbd21c5722e02f2c8117223b7f6969e7ab909dbfca819daf46e6f8dad21cd720d6dfe480f52204fe6d0ec0af453d84ef2c7b08d7e98045676d8f659fe67ac4f87b4bc68b11f00f96c037a076c18fb6ed821b11f24fb6c83721a7db9b03a75b8268efb3a57d3342fed916f91684bcdf16f956e477bf58fadd5204fcab25f06dc816bfd9dae276e4760772e0767720f0df7300be0cd9e40f5b9b2cd7218ba55e7f66928d214bbdee44cde8bf2c9bd177a1019cbf2d0770562023ff636be4bb11f2415be47b5029746276a5f05ee4cee27b7db6eebc1255dfd14c588754dff72173e4599ae37ed4b88b65021cd2b87b00318e5b325e8580f32d811f44a62862698a8710e3a2968c1f46be5c90035f5e8dc08be500fc1114388ac72c03c71a14f74b6462ec90b8ff288afb2533010e89fb6b51dc2f95097048dc7f0c19b9b4ad911f47c8656c919f4065e510cbb2b20eb973d91cb8f39328ee97b38cfb4f217394b734c7d328d855b00c76eb11e3432d193f83802b5a023f8b4c51c9d2141b10e3ca968c37225f3e2c07bebc09811f9e03f0e750e0a8621b3836a3b87f8465dcdf82e2fe919671ff7914f78fb28cfb2f202317da1af945845cd516792b2a2b475b96956dc89dabe5c09d5f4271bfba65dc7f1999a386a539b6a36057d332d8bd8218d7b264fc2a02ae6d09fc1a32451d4b53ec408c8fb164fc3a2a7e756d8bdf1b08b99e2df29ba8fc1d9b83f2f716b2747d4b4bbf8d801b5802ef44e668980373bc83c01be500fc5de4228d6d5de43d547537b1acbadf47557753cbaafb0354751f6759757f88fcee784bbffb0805bb132c83ddc7c82d9ad9bac52788f289969477a162d23c07c5e453047e520ec03f43c63ed9d6d89f23da2d72407b379af73e25939c0c99f7fe42072c3e6cd53213e03cfc72f497c81cad72608eaf502eb6b6cdc5af11ed3639a0fd0da2ddd696f6b78876bb1cd0fe0ef9487b4b1fd983ecd1c1d61edf237b74cc813d7e40e09d7200fe23b249675b9bfc84689f9a03da7b11f8693900df87c0bbe400fc67047e7a0ec0f723f0ae3900ff05b94a375b57f9152177b745fe0d35287b5836280fa006654fcb06e5ef3a60b164bc5726c0214bc6ff40c0bd2d81ff44cdbe3e96cdbebf50dbbaaf65dbfa6f04dccf12f81fe4c8fd6d1df920ea729d61d9e512d3f35aca67da528ee890c546380332a11cb2114e54072c76113b2b13e0905dc4f2902d06dada228690cfb6458e23e441b6c8f90879b02d72111db2a8a686e4a09a2a8ac087e600bc00810fcb01783164f0e1b6062f8e9047d8229740c8236d914ba2523ecab29497429447db522ead4316b1778c65a3a00c021e6b097c08021e67095c16018fb7042e878027580297476e31d1d62d2aa0a031290741e3501db8b7c3be65c3a022627d4e0e5857426d8329966d83ca2817a7dae6e26108799a2df2e1c8a5a75bba74154479862de52310f24c5be42311f22c5be4a310f26c5be4425406cfb52c835511e5f36c291f8d0ae0f99605b01ab2c50596b6a88e6c71a1ad2d6a205bccb1b4454d4479ae2de55a28385f9483e05c1bd1bed896761d847c892df23108799e2d725de4d0975a3a743d44f9325bcac722879e6fe9d0f5912d1658daa201b2c5e5b6b668886c7185a52d1a21ca57da526e8c9017da223741c857d9223745bdb5ab2d7b6bc721cad7d8523e1e515e6449f90444f95a5bcacd90335f67e9cc2722cad7db526eae432ee72617bb178ecaa4a66a80c14fd28037a8eb2623bd9c7f73a79b20723beffb61feb7c4c4ce3113dc6bc3bc5d62c6bb6843d3ec617383ab43558d1d3c5b44145b787bd9dc18137bd9544cd1301d0fb44bcdc928f36fb2cdfc160879892df2293a6431327f732625216408bf258a0ab758468556c816b7dadaa235425e6a8bdc06d5f7b759d6f76d51fbf5f61cb45fdba128798765946c8f0cbdccd6d01d90d72db7f4ba8e08f84e4be04ec8c877591ab93332f20a5b239f8a90efb6453e0d21df638bdc0595c07b2d4be0e9a85e5e99837ab92b02bf2f07e0dd90e7dd6fe979dd75c0a235f1405815ad0a10b53310d0039965550eccd21379ca83969ed20b39f743b6cedd1b213f6c8bdc0721afb645ee8b901fb145ee8790d7d822f747c88fda229f8190d7da229f89901fb3451e800acae39605e52c44f9095bca03516b779d656bf76c44f9495bca8350ac7b2a07b16e30cac2a72db3700862bd3e07ac87a28aeb19cb8a6b1862fd6c0e580f472eb2c1d64546a0fa76638eeadb91c82e9b726097513af0f26ef2b94c72f3780c3c1a15f6cd96857d0ccac92db6393916213f6f8b3c0e19e3054b638c473dd01773d0039d80ecb1d5d61e1311ed6d39a03d09d17ec996f66444fbe51cd03e07816fcf01f81404fe4a0ec0a72283bf6a6bf06908f9355be4e9a8eedd6159f7ce40945fb7a53c1355bc6f5856bcb310e5376d29cf46567ecbd2cae7225bbc6d698bf310e39d968ccf478cdfb1647c0162fcae25e30b915bbc67eb1673902ddeb7b4c55cd454fa20074da58b10f8873900bf18817f9403f04b10f8c739009f875a909f58b6202f45feb7cbd6ff2e43c89fda22cf47c89fd9222f40c5fc73cb627e39a2bcdb96f215a8987f6159ccaf44b6f8d2d2160b912dbeb2b5c555c8165f5bdae26a648b6f2c6d710d2ad7df5a96eb45c814df599ae25a648a3d96a6b80e99e27b4b535c8f4cf183a529162347fed1d6916f405dd99f2cbbb23722ca7b6d29df8428efb3a4bc0451fed996f2cd0879bf2df22d08f9175be45b11f2afb6c84b11f26fb6c8b721e403b6c8b723e4df6d91efd0218bbefc1fb11cec8c8d68ff694b7b3942fecb16f94e84fcb72df25d08f91f5be4151ae406f59cff78cd575b67b44b7f8a7b7e60166bbe0eeac2a776ad9713d7aff54a271fadf5ba1b150171ceb608dc83c0a33900bf17d5457971bbba6825621dcb01ebfb503988c72dcbc1fd88767e0e683f806817b1a5bd0ad12e9a03da0f22da05b6b41fd221577393c5dc73355268a7405f1c85d00fa33186e271fb3186d5c822256c2df2082a8f252dcbe31a44b9942de5475137a774269443ba396b5137a74c26c021dd9cc7902d0eb1b5c5e308b9ac2df21308b99c2df23a64e6f296667e12f972054b5f7e0a011f6a09fc343272455b23af47942b59527e06e55e65cbdc7b168d051c960970c858c00664e4c36d8dbc1119b98aa5913721e0232c819f43b1f348cbd8b919557f47e5a0fadb825ca3d0d2359e47e6a86a698e1790cf1d6deb732f224357cb81a1b7227b54b7b4c736c4ba460e58bf84dca3a6a57bbc8c58d7ca01ebedc8d6b52d6dfd0a625d2707ac5f45b63ec6d2d6afa19057d732e4ed40c0f52c815f47c0c75a02bf8182477ddbe0f126426e608bfc16426e688bfc36426e648bbc132137b6457e072137b1457e17458da69651e33d44f9385bcaefeb90c502d1e3e3b95920fa010a7827e420e07d88c09be500fc2364f4136d8dfe31f293e6967ef209a27c922de55d08f9645be44f11720b5be4cf90994fb134f3e788724b5bcabb510ddecab206ff02d9a2b5a52dbe44b668636b8baf902dda5adae26b44b99d2de56f50aba37d2694435a1ddf22e00e96c0df21bfe868e9177bd05044a74c80438622be476ed1d9d22d7e406e71aaad5bfc888c7c9aa5917f4246ee6269e4bdc8c8a75b1a791f3272575b23ff8c90bbd922ef47c8dd6d917f418ed1c3d2317e45f9d7d332ff7e43b6e8656b8b03c816bd2d6df13ba2dcc796f21fc8ca7d2dadfc27a2dccf96f25fc8cafd2dadfc37a27c862de57f9095cfb4b4f2414479802d65b1a4408b7c962d7244872ce67607c6ede776a33a70e11c675b3a471e623d2807ac633a70e11f832dfd238e580fc901eb7c1d78593739d43d7784065c2ba02e16500465e630cbcc2c8a980fcf11f30294a1232c33b41832c9484b9314d7018b56f7a84c80439ae72510f0684be09208788c25702914fac6da86bed208799c2d7219843cde16f910843cc116b92c429e688b5c0e214fb2452e8fcadf64cbf25701513ec796f2a128164db18c451551e5323507954b25043e2d07e09591b1a7db1afb301d7231373923ce37a7a15d02831f8e6c32330736a9826c32cbd62647a03233dbb2cc1c89ec716e0eec71142a36e759169b42546f9d6f596f55453978816d0e1e8d72f042cb1cac8680e758025747c0732d816b20b7b8c8d22d6a22c6175b32ae854ac925392825b59139e6599aa30e72e64b6d9df91854fe2eb32c7f75510eceb7ccc17a08788125f0b128f72eb7ccbdfa28f7aeb0cdbd06c816575adaa221025e6809dc0819f92a4b233746c0575b02374125e41acb12d214b9c5225bb7380ee5deb596b9773c02bece12f804047cbd257033e4168b2ddde244947b37d8e65e73847ca32df2493a6431bd745326c608995e3a19012fb1046e816c71b3ad2d4e418e718ba563b444ae7caba52bb742b6586a6b8bd6c816b759daa28d0e586ca57c7b26c0215b29b745b6b8c3d616ed10f2325be4f6a822596e5991744094efb4a5dc51872c5acb77c5ed5bcb9d10ed15b6b43b23e4bb6d914f45c8f7d8229f8690efb545ee829057da229f8e42dd7d96a1ae2ba27cbf2de56e08f9015be4ee0879952d720f1db25815f9603c077b6023da0fd9d2ee85683f9c03dabd11edd5b6b4fb20e4476c91fba2e2b2c6b2b8f4fb3feddd077c1455d706f001690a0a6247546c182ba9143b251405418a5d3124012281c424347befbdf75e5e7befd87befbdf7de15bb7e73efec30cf267b935d769fc9397cbcfe7821c9eee4ce7fefccdc72eeb92ee95b7220bd93ebe0b7e6e0e03ba73ab86979dc960e49332d8f5d5ca5be3d07a5ded575f03b7270f0dd5cb5e4ce2c6bc9eeae52df958352efe1fa20efcef2839c98eac066b2f91eff7b6ba62875ca923713d0bea78b655e0e58ca5c07bf3707079fe4ba53dd97ed9daadc55ecfb7350ec0a57057f20cb0a5ee92af5833928f56457057f28cb0a3ec555ea877350eaa92eeb47b2b4ae7295fad11c947a2f97f563595a4f7395faf11c94bada75a77a224777aae9aed23f9983d2cf701dfca91c1cbcc675f0a77370f05ad76df0996c6f837bbb8afd6c0e8a5de73af873393878bdcbe4f96c4d1a521dd90c4ebc90ceb5d9cc28c64c57915fccb6c8b35cd22fe5407ab6ebe02fe7e0e0735c26af646b32d755ec577350ec7d5c4f9dd7b27ceaeceb2af5eb3928f57eaea7ce1b593e75f67795facd1c94fa00d753e7ad1c3d750e7495feed1c94fe2057057f27db0a7eb0ab0ebe9b651d3cc4e5f15e0e3c0e7579bc9fadc761ae237f90ed910f775d371f6679dd1ce1fa083fcaf2233cd265f171b61647b92c3ec9d2e26857adfb3407b5ee1817f46759421feb2af5e73928f5712eeb2fb2b43edec5f165961c27b838beca01c7892e8eafb3e43829d581cd24d037edb39f043ad975f06f7370f0535c07ff2e07073fd57513f93edb9bc869a98e6cb35ea7f34936d3c43edd55e41fb32df219ae23ff94ed91cf741df9e76c8f7c96ebc8bf647be4b35d47fe35db239fe3aa1af3b3ac1ae7ba8afc5bb6453ecf55e4dfb32cf2f9ae22ff916d912f7015f9cf2c8b7ca1abc87f655be48b5c45fe3bcb225fec2af23fd916f912d791ffcdf6c897a63ab2792eff970ec67cf7812f731dd8eb90dd812f4f75601328d3269d033713287345aa039bb64cdb740edc4c5be64a57855b229d0337975bda552dda75c8b25a5ce53a72fb6c8f7cb50ba3439618d7b83ebe8e597e7cd7ba4adc29cb125f97eac0ddfc2f97f40fbc5c9336579343afed3ef4f5ae322f9565996f7095b973d665bed155e62e5996f9a654073621974ba773e066422e6f769578992c4b7c8babc45db32cf1adae1277cbb2c4b7b94abc6c9625bedd55e2ee5996f88e5407363d9ee53a64dfe3b9d355eae5b32cf55dae52af908352dfed2af58a5996fa1e57a957ca41a9e7b94abd7296a5bed7f5105c25db87e07dae22f7c8b2c8f7bb8abc6ab6457ec055e49e5916f9c1540736233dab75c87ea4e72157a957cfb2d40fbb4abd460e4afd88abd4bdb22cf5a3aeeab166b6d5e3315791d7cab2c88fbb8abc76b6457ec255e475b22cf293ae22af9b6d919f7215b97796457eda75835e2f0737e8675ca5cecbb2d4cfa63ab049c7b27e87dca46379ce55f20db22cf9f3aedbc78639b87dbce02af5465996fa4557a937ce41a95f72957a932c4bfdb2eb72ec93ede5f88aabc8f95916f95557910bb22df26bae22176659e4d75d452ecab6c86fb88a5c9c6591df7455e7921c54e7b75ca5ee9b65a9df7695ba5f0e4afd8eabd4fdb32cf5bbaeea3120dbeaf19eabc89b6659e4f75dd09be500fa0357a937cfb2d41fba4abd450e4afd91abd45b6659ea8f5dd563ab6cabc727ae226f9d65913f75157960b645fecc55e4415916f973579107675be42f5c471e92ed91bf741db934db237fe5621eea1f79bd46476e739cfd72ac37d89be055d82d3c83ed3ea7db7f8fb01b819aed3e27fb6f09b6fb1cb1e095a5de2cff3be61563fdbfcd4fabec77eabc4dbc89fe7fe3ec4f2bfc23ceb49b709ae346ef19e2ff5ded1f75aeff778537d47f579937ddfe86e0bdd1c69dc1f6a255767bd1e49f04e52bf2cf7062336751eaff99e999cd3ea3df3ede6e6f1a1e33f9a83bf8efaaf28f93491dfcdaa53e2c95fa960bd4c7f90edb7a83fc1fd5fb3fd8ceffd3e0cdb65b924e4b942eb09c627f32d11be9ffacdc1e68cc02bd3afb8a54c70bbe87af1c683772cde4ccbe719dd9f05467b6a9e3cc26780d7603d92afb77b06dac29f508ff5fc1db8d78e34f62b437c9dbcbd6ad86263f331bcdd678664bda32df299333fad6754623529d51a1e38c5cb6d1794db0afabb3b5d4bc3a7767f09deb0cb6497506833dcf793d05a5adf14b3ed12f7f85ff5ff00999eb26fdeb30f927ee9f65728edfbbce71db54e75849be8f35f89fb4d9e2784ae23e657eb539ab32bf869a4f307dabe6eaf4c2dc797e70398d4ce534a1d5eef7cd0b65eff0a3cb61542a875d880ec3b2ae2fee1a9389c84f2e91ed52890cf4bf9ce0ff7e73fdcfb5cfcc29b63c9549bf1fef17233cb32d78b5dd08bc2af109b77c84dcdd057f769ddfe854e73724e367aeb9878ff67f3263c13336f5d90d4bb45c3867f98beb2cc7a43acb91c47a6dbebbb7fd35e6ac826de0ab12cfee7dfcbf5dcf8d85b99a7f759df5f6a9cefa0421add871f60835f6f599b463c725be1bdc195ab7253bdf253f36957cdf466d8ba8453ed03fd73a2b1338965bbbba2665c436bceb27d1b1323993df5c67322ed599f46f74267835677f2ea98f96c9d9fcee3a9bf1aebb79ea92e11d7ca4bd16eafd3a34d5de979a3b9ff4ce73e1ef737fb8ce6f42aaf31bee7c5a05d74badbd5e822b64e13ebdcc8f9ec9d9fee93adb1d529ded1619d4cda0b59aee2799ebd6e85faef3da319d6b0eef90d95f73a98f96c9d9fced3a9b9d529dcd56695d732df5b232bfe6a29f64726effb8ce6d67d78885fb3ac7f333d78d69ebceb52dab29cdb40b928f91bb3bc9bfae33db25d599addbe8cc1ad7bb68e4a5d2d6a406ff5e999b4fe03f5739774d55ce6dd3aa5dc3fcb2575a73d38209efeba3fd7f97dab69b395c6bdee54d9874ca73de2dd5396f90419f24fc9c66245ae3b91a8768e32af1eea94abc7906cfa5e4724f71f422d2ef736472566d5d67b5c7c28d200db5f7e6e9b6e62ddc584874dde5ea935bc2758e13539d6389f393336dfc49fe8bc2731d69fbf5a5b6bca99e48b97ea6b6739dc79eae7eeec2de275af3ced0de759665a9ce323fed7ec7b016db43b9b8977770957e926b4c39ddf65ca6e55fd83b4247d71994a73a837119dc99831a173d7f82f7a43b5a14e78852279741453a9f6273add74c3fc585bde72de93a83ca74ee15ae9981549f5df633030bff392de53acbc9a9ce72505a77c471fe8b27d9d296d95ad5baadf3ceae339c924effb0b99a9859ff30d7a3f45d5ce73535d5796d96f65d3eb3b3727f5a0b734e4bbbcea96ae147665abae2e27c322fe33abfbdd2b9a764f23c70b7a2f8b3c25d5d67392d9dde18a3459cfe592fecd3a29beb9cab539df34ead7cce6c8d655d1ad353690c4df3d939c2b657643d3fbbbbce7446aa332d4deb8e35ca7f71b57d6e867382ee919fb89ea2cbb9ceb3269d5e6ee367cc607ba64d3f3decb9a6f3fddc3e7d96779d636d3a4f9fa6e718f50b4d39cdeb4ced32f3628d4b3bdeff77adfd7e7a67b77063b02bb8ce6f6fd7f84b73e717b413a237a4ffd4c9eda7b6a2ebacea529dd5ae39ae99aeeb2fd3d7e7d6642597497d3a23d29ca7516e9e2c2bbbceac21d599157b0b1371168e2356f9af1d65dfd1e085710bb9796aace23a8b99aeb67b7667d1f8fe931c8b919b73eae13aa759a9ce699366cf69825fb2ea46e751ea9931dff099dfd27b3329f9aaae92cf4ee7d996fa199e4e5b25ce9e474fd739ce49758e058dce71b06d7b04b11c61df63bcffbd965a19055edf1cb53f5673957f6eaaf2efeca85dee08a5e069967c5d6472cd6513d1b43077f8d55d1efba433be96f9e7d95cf917ee135dc37506fba63a8323167ca2f1c42525d794e4d8cbcccae13ad2783bb71bdedd982345bd5cd2fba592deda6b3c3f3dd7fe2bd3bb5bf83ed7777375675bd37576fba737fbdef4ec5a1a4f89ebccd6729dd901a9ce6cbb8cef79c352dcf332bb8bb1564aaced3af303d31b3f886200331f3fc0f841f74f72f519afe33ad383326909b6f4190711a6c13d2f88720cfaa4cd47590ef17f323311659dc939adeb3aa7835d6df4749e4dcdf963499bfb4433398bdeaeb33824bdf99fd475b0a538c1b8ebdf7aaeb33c349b2b2dbd19a0853bd785fd3cf35c677a986b9c20db18f7b8da8f0bffe9afef32393c95499f66fb6ccdaddf72af4b5bf8b26fe02afb11acbb4cf3e3190b572b37749dc591e9450fa5befe5a5e7f16e795b791eb1c8f5ab8d1a8e0b32b4f391a15ef3cc7c6ae333b3ad599add3ecf583631ea9631c16b6949bb84a794caa520e4bb38ea517f714f7f3ac8feb5c8f4de7aee0aa6b66e4acca8ea1353ffa99abb3c8779dc5710b37835a9a68e1ed68ef094da36ed39b350be32e83f577f56944226772ce05ae733e3e9d11aaa6e73cc29e73a537c7bff22767f4b92ddc7846a1abfc27a42aff862d96df3c8d06dbabaaae9988cea6afc8a4cc45ae329f984e0c49a6e66159b93395c5ae733ac9350eddbce7c2459d85c7c9a4e425ae929f9c4edc66f81ba356d7767685db242fd5387ff459e4eafaedeb2afd29a94adfbbc5bac45b2dd0cf55d2531726e66dbc6756688cb19af5295b4d2de7dc30e3924daf9785ff2cfabbcef0b45467589483b67173f1970bd76a1ce03a87d3539d439ee78aa20dc73b926b5543e2bbb92aeda6aed29e914e3fdabd2ebce511abb8a3bb36739de999a9ce74cd349e7375f6b3c8556b777357f9ce4a55bec6ab6e9bb6764724e64f27db9fa4336a982be92d5c6772767a2da25467b29dff86ed622aff96aef29f93aafcc35bb8cfa61e3f93b31e6b2bd7d99e9bce8cdc042853b66d0f3c562667b0b5eb0ccecb74e545d8eb083f97a6fd26cebd69a0eb0ccecf7e96bbf9b96cf7fc7726e51fe42aff05ae5875f75ca43babc4587b0d053186c94f45f3ddf2c4bc65d3cf6ce13f97c1aef3bad0d52b4ffd2c1f65cf62aa7f2f0ee392aa6d999ab66319e358435c677151aab3e89f618b24184da95ed032094a596effd5605b970dfe816b737636a5aeb3b9d835bb98de6732d88e034f6fa1a4ad391e39d475e697b8ee73e99df940ff9e966a8428f76730cc750697663337d5f2daa478c7f286bbcef2b254673922cdb3cc24ba3ade7a39c275be97a73adfadd2ae97e6eb39ad7c6edbb8ceed8af4c636328d577245632c5ccb685b57e9af74953e93f5cf99b48d1626fe67a4abf4ff4b676426557e8a603420f7990a47b94a7a95abefb6f071b115760cbb36f1aaedbcdce63ad8ce752657bb668652b71eb9dea35da5bc265529d76fd61be7af58e51de32aefb5e9abe2c81da794dbbb4a795daa52aedbe2738b55ceb1ae725e9f4e399bf6f7b22f6747ffbf366d3afbff2cb59f5530b25a63dfd3e01fa7cfc6fe8fecfd35a8739b2ce8f96c92d4f789be6f7ebf1903377730137119c4086de4f56ae10837f8041dda7ac1ffd66b63f8cccddc2cd26933b99144f0ce6a7be428dac5e4e5353df7201ec4b43336f1eff755f65d7bfafabbfaffb57416a9e249cd77539d5dcbe7b4bbff9f7995c97a576e7b4da6fd33c9af031d1367141ecb973613238bdc99de683ed561894fb56d1f13d06267e216a636b55c8a9bcc6f5b22751d5aa9892c5e1da9ca1e1c207c4eb5315be7990b2cdffeff04ffa81589c9f8ededf56afe54246eca2dfe6ebc9653fdee8ded01c2556a2d1e0e07a0521d6e155be18220953a2f186cd8afdaf33ab66f9b6f3e939b99705d2c9cb9174cf32a17ccefd7d9cf5403d42b2322a85b98506677a7b0b164868c6abd20dc6394ff968a74ce4e0056ff8111d6ad4cac656dad8aee6233bc20b37c8d3de488446f4003d9ef9d23b2db98643d93ee608de9f08e36dc763d2aec63c74cb216aa806cd72782bc9d09b9345ca8c3ed7dacc25eb065fedf7355503db14b447507fb9e367141d750e79372b77d23ac3b9958ab5a2cf37c0c72ae0f4eccb999ba66e60ae6daf169b58f867111e35dfc06c768cb5865796aecc08f198ed40075d8f911d4dd321f08052a20f7eb1d41de135fdf2058da3ad0bfcf55d80edb288b57662fe33a15709f8c89e0e631e1ba7ac99daa19b60853127d592d5c8ff488b8ee8da32b65de3225519fcc21b4dcd9e6954550f731a1ba25353bc2bfab13f54a4fd3e3acfd22b0fbf9dda9e43bd838ff0da62066a069a89aeed490e111d9034cb2a52c5978f9454d0d0d48a71d17213dc84432fb5c865da5c69df32854c6f40734b0edd725627b887dff4adeb3265ae9382ed10fd000d6e9d608ec61265877b87fd57bbac7d0f68331b447f8cd89e49b7eb04be3341550159511d4a3fce6c438bb00b9d62e499e635bf815de2c2f4cf1a401cc8331ffc798601d2c98797b1047a70167e4d611cee371ddabc2cb2e0a541967d11a94d4a8d39e89d09e60a2ade885833a51c73ad8a7d0ac1330e312385aa6a33931e7aa08ef49fe8d3e482a68ee554140b29e66c449f747504ff187ab4d2d339dec32fb24c47aa501ab17f4199f6662999dbca3745a2654bad6bed8048e44cdd57a9faf4ac9f8c41bf00878863ff2ea1ae98fc6fac3d9a5a87759af02f2879d23c867650e6117a9807c608308f2b9b81b25e33c93e529786468ea407d531aa13dcf44ebe4054108f5b600c156a61a80fa5f1701bdc004ea688166c265a881e72018b57891dfdc082f3a7c08e819a27e614884f5521c58058ab10e823bd3cbfc0b4f5b3bff3ce079853fef38da469846cf386d2dfd17ae88b85e65073c358ea8d015f0547d4244f51a7ba830ec14690e01c8db36027b9ddd8b6caee13932d17030f7301d756da36111dd1b71d5b5e8c2d457d73ed926027b33eef88930384003d43b7b46506ff1e7b6c3a0395d73dbf3f68990de8e2b5e5feb40cdb53050f30e136be5166ef34153d520cef4c2754e1a00ef849bfdbbfce76494d837782a46f50d3175d4bd4eb0b0e63d766b3fbc50f5069ff487e093f7e36eed07b3925aa6729f3925a2fa803f6a9adca0d01a7632677284f6213f5adad4afb0ed352931d5b68bbded572616236b69be8ed93582fb8809d739c58519641ad6c0f4c8e911d3c7fcfb57e3567e99dd6c48c7a5387c5244f549dc61735a9bb22bc39ab64fe35eeda1b9fb5d0d433d9ff1ef5fe68e556f9baa95aad6e99a2c1821d3e7fc8bd23c0987d85fed4a2ba801ed91eb23b42fe21edad114cbfa454504f5251fca3452831453a67e85b77c0d50b57b45505fc5dd0d2af54ca6d81a2537f6476021e9d74caa55bc54c91830fa466b7c6ba7e723c26fd80b655aea14cd51f3ac1cbf47c4f62dff220ddb62e6aea66df1685ed788ea3bfe9cf760db3cd59b8de7b04111d7f7fc567e8dbd2083756bee04cf2ae06e89e07ee067b17007356dbf604ddb504b59bde04ea781f1efa911e38ffcced2e005eb8baa55b5d26e9c1631fdc49fa90cfb91a6b655aaa94bfb8d8d907e66d7a56802a41e2e410d4c6f6c1531fd12770c34ee1a1ee691d780d6737a84f62b7f6d64325a78a7d234fdf1405504369fbf922d79a4a271d769a0dfe734bf444be0e641f054fc2dae90a7c66b8e340df7ccd9da80756cdfe8e0439b1c7cb0b770f95f33537667aa35bd06d3f30c99cd6cb9393664ae3503a3e24afe3b669ecd6b66e8392fcd549279698411e46590ef22af85be6b5e1ac991f2b24ae195cdbb8bb27a7761e21349dd26c96bb27c3c2fadeb3e2fc31589796d5acab89a97765e89bc34bad7796d5a5aef11bdc2b5c8212f45647f5eca864baac55b791946dbe62d54d8565e9ad984f2328c69ca6bd35c2ae1bcb4c261f3d20ad0cecb688e2ff5abddc7767559f2b24800995c97534de1e665b5e834f59590fa95cda747cdcb28fe232f8381d1a87ea48aef4dfd53f378a9b1f782e6a30652bf3bbaf334974a252fed30a1bc8c1b8779590cb7e4a5d5760fcf2df58c515e33e314e1f19bcf9bd2f8ea693eb37aea7b5daa4e5a9e338839bccbbab3d286af70270208cfadf9147379ce2461792daca949fdf3280a2faf9960a0f0134b9d0135f591a389adbc341647e5659c8e232fe55ad9bcb4e7baf3321a8fcd4b2b8156f82cc5e5a9a15dea5c19a96b5faab9adbc859c138b36e4c04676b49146bed990e38fffe77b65e49bbd32fe34085fb50f10829ee75fcc9ee7ea894fbeca9ef60caf3ad1266fbae954705ab589a7d30cfb1cecdbb83c3d9b9467ac5f156678e16e8461ef3355c9964cea9fce4fe76417a68ffaf61251a7fe6ffedc67705155d81b4ef20e71b5f6a6675e4c43ecc3421cdb3642fc278e0516583ff180c9db8a4df4fa37cd80913bce15589c5bb78b38ff95c4394025e78ec0f99f24ce02959c43e08e6936d812c359a892732e70b691c459a492f322e06c2b89b35825e74bc0b98424ce12959cff02673b499c7d55722e0f4ff6f69238fba9e4dc08383b3039cd8051b9ed03995f6d8a9932bb51eec8fab2c8d6f222b28e71d4c029ce3a88c5374d75626fbc0b8bf39136116727499cfd5572de009c4b4ae22c51c93916389792c459ac92b31f707696c4d94f25e759c0d94512675f959cb3817369499c052a39ef8286d23292388b54722e09b5b3ab24ce42959c9f40edecc6e45cc96bbe2389519b06b31f0fb3431b12e6e7d08d5c561226b166d2303f01ccee92304b14623e0798cb49c22c5688f914602e2f099338f446c37c043057908459a810f33ec05c511266931da515609e0a982b49c2cc5788791260ae2c09738042cc1f0173154998fd15627e0b983d5a13735ce25066328d7c99d3e2e166b48f30579584497c00d1306b00b3a7244c62d38886590798ab49c22436da6998b30073754998c4ee240d733660ae21099338d041c3dc17307b49c2240ec1d1300f04cc3525611207876998c702e65a9230898d761ae60980b9b6244c62779286f92060aec3c45cb105cce4c95ee2e3a7078bb216c25cd7954259a492f207a0ec2d8592da28a251de0994eb49a12c5149b912dc2bf3a45016aba4ac8681b7f5a550f655497917d4ca0d9894ab2428abfd171946f3d20adbf4496e1445079dc81cc7ecc802ed0ca01b3241833c13f55e908120756e1c1adfda2cbe815ec4b711932f4c78d4cfff53e9cdf2823515a6c086718e17d3fa72da85bd1444bb6dcc840cb2824cb5f95fc6d9ac38266785797b98878786475bd55306b57013265e982acd1d2a88136503bd3a5b1fe7da5e0e8db51b8bf50d60edc3af9341e288200350415c17346db67125b8a0f3d98d9ec98d5242e14365b4bd5bd6d943a648e2aae0213318ea610193d2e4eb99697f38d61ea0ccabb5476eb20341eed07ab2d03604b4427ec326b878ab1699e7f11fc057c4e4ebe135edb3042996c67943bc6dbd41894c6dc1f78245a4d43c44b485a43f4037b0388e80fe722fc891d5d06cafc52c36214e33d07a2eb32023518924ce7e2a390f07cebe92388b55720e05ce7e92384b54725602677f499cd4295a1ae786c039401267914acebec0b9a924ce7c959c6f41d77133499c052a399784dab9b924cefe2a39cf07ce2d24710e50c97923706ed99a93638d39f551e6c1ecf756fc9a99bcdbc5446f9ae51d9418820b0e66764830b9d49becf6a660547d5d2fe2dc9ac9192432afb6031d0df650668accb14b978230ab5d016e20130e771929b343bc310dbb2dc11a35ff1de80631e9bad8a3d525329e9ba4fa5312b33a53145eaa5b01dbe038666afa367a94c450e77ab3f0d680c7c690b82ed7998981dc582e57da906e09f4544a9974e1de22aeb6e020ffdfe65fd4860bad065e0e97efd0d6640ccf94cad889f5f0f8101887c57121e72f32cfdd77806e781c61f6e975eaa859ff68fd900e70571c21095363ff7869c0dc4612267105220db31d606e2b0993188b4bc36c0f9823256112576dd330db02e6284998c455db34cc2500733b49981a23c4bf85a6d16849981a8768bf07cc319230896b636998cbc065bebd244ce2da581ae6728039b675e7618243050b8d35e606daae5d44392e8e454a99e495265ee8b4dcbd93608e70bc3450e2c54e03dd0b4027480325762c69a0bb03e80ed240899d4b1ae81e00baa334508df9cf2702e84ed24089037334d03200dd591a28b1d94403dd01407791064aec6cd2407704d05da5811207e968a0bb02e86ed24089037534d0dd0074f73896cf9bd0837a2f5a1c1a4df8ea5eaeb715f4def7886bea77d188e1e80374135b73e02339c7b4c6dce7c51049b4671c711ce6728eb261843f8ea946d286e2bef222c6b2382ee6a245e662fe0e2ee649ad9b09030f1853268c792cd64a602d97b3e6a150694cc70a709fac90c4a97335631be0ac94c4a973356367e09c2c8953e76ac6cfa18f334512a7ced58cbf01e7d438fae0aee7fb20ffad357696b2ccff69b0008f3817445b3b71366400ac92064a9cada4819e05a07b490325b63e69a07300749a3450623f9d063a1340aba58112c73169a04702e87469a0c491761ae861003a431a28713e9d067a3a80d6480325467cd0404f05d05a69a0c4863d0df44c00dd5b1a2831e283067a0680d6c5318c5cb8c80c23bf0ee39df54cba307968302f6932519b03699f8d3cd38bf81ae298524b6fc843e3ea8b1aa09c29ebae488d73a7dd15bf681781ce9206aa71b8e333009d2d0d54e370c76b003a471aa8c6e18e570174ae34508dc31d6f02e83ed240350e77bc0ea0fb4a03d538dcf10180ee270d54e370c7bb00babf34508dc31d1f03e801d240350e777c08a007c631dc51b2c80c77bc0bc31d0731e9c2cdb74c7dabb09bcc94f97fcfb58709863ef4d5bb9dbc08ef60269ed99d67aabd482bece55a67c30aa7301b3cb4adb53a01da21ad81a6713fb28e807668eb0eab0587d2bb44ff46a03cac3583fe87786631caa40425b13378463b12e55bf0dc3d3c8ee76ef122f3dc2d86e7ee114cbaee5e34cd30dd0b378d9ce2e95f2b711b5cc8473209cd1a38f34bcd9be67a61726e73f13628bcff6d0d6c47c5b14e22d35512d4fde769eb24de85d0e9a325b216a8643d12588f613f62eaed5b2aedb7867ac9fb8aeaeb9dac0a17fab1713c9dfb2d324fe77b81eeb83802f7d31da1e9af727c6604b4138f97c4a933ba6717e03c411267814ace6de11173a224ce42959c0700e74992388b5472de049c274be2d43955f011709e2289b34425673b78149d2a89939aa98dc6b91a709e2689b39f4ace42e03c9d3dd5106ea935cd3faf323bd160468cf48d0fade1456867b4e6544354f46003561a252d18ba3b0cf29e19472cb9a1aaf0ccae8bc1984f2cbd705a4d5c1dd67b9f15c70046df456600e35fa8796733e9566ae141929cd98a9a778096dbea40788c9c230993f84ca661ee0798e74ac2248e8ed330f701ccf3246112e31c6998b301f37c4998c4d0001ae624c0bc40122631648a86391a302f9484496c94d3308703e645923035a6fd1c0298174bc224ae4fa4611e0f989748c224ae4da4611e039897b6266672c424f532a7f5c49f05cccb2461121f4034ccb701f3724998c4a6110df31dc0bc421226b1d14ec31c076943ae948449ec4ed2307702ccff49c2240e74d0307707ccab24611287e068987b02e6d592308983c334cc32c0bc461226b1d14ec3ac04cc6b256112bb9334cc2ac0bcae35173a254fe4125b99b489dce9103574bd14ca2295945f00e50d52280b55529e0494374aa12c5149793574236f9242494d6843a35c09286f964249dd74904679323cc16f6152f6485056fb2f328c337c090358e1cd69069538924923bd1c6ae7ad712cd373ef1285a3ecb8508f38d841cb4fd015e28d6e6bcd8b1e0f3791d96ca72d6b3e0f9eeab7b3973527e7c718ecd52434686ccbb0d8cc2143b63be2b857620ddcc1f718ec1f6888b7ad37c87fa1df934d7c6f82178413126b222d88f02678fcdcd9baf74a2c3ede2b898fa047da9258674258eb5d4cd6d513ac0dfe655ee5bf74e2823a596143aec3bf07f92f36378259feab82fd71c99dcb9eac1a7b2fd0de2d9596dad9a4d17e014ff87ba4d252479768b4e5403b8f49bba4e7d917985f6cf6cd1deabf88f8acefcd025b119ef5f732c156b575d124ab33c73369ea46f92f362b2c267ad36c2d1d9458f3131cd2809ad517150a51f300f53ef66229b3e5c15cff0de5de48ff8506b09289465b61b63da0dddfbafd1e9cb0d038f7f330f4cc1f8863ee27bdd626b5e9de85857932d4cb072561126b260df340c07c48122631928386390b301f9684491c76a361d603e623923089911c34cc7d00f3514998c418231ae61cc07c4c122631629886590d988f4bc2240ebfd130a701e61392308911c334cc3ac07c521226711c8886391d309f6262f6f23299c218e305e924820ceab5febba8cff72a16ef30e8603e1d475d2df7522736699c5c47e3c65a7b415d7d4612a6c66ddfee04cc67e3c81393efff996513dccef4624b044ee3eb01e3e7cf31f9966fb12eceb5ffa23e7e6803c0c701e3f3fc0160336f6346d26b6033187d756f0fb8745f60a28579fccda53bdd5b94f2f83700e18badf928c1c3917303d330af878bf8254998c416230df326c07c59122671ac9286793560be220993388a4ec3bc06305f9584496cf8d030ff0798af49c2248e08d130af02ccd72561127bd934cc2b00f30d4998c45e360df34ac07c531226714e9c86791b60be25095363c8ff1d80f9761c03bfe13a1f130458e6055b108eb40369b58be058654f18f87d87c91b6655cfb7131595b6ae9ae256598d32fba67d3c13e9665e156c29a78ff3192fe27c97c9b986e79aa6482fcc9a782ba0c502bf0775f53dc9b8c487160df70dc07d5f322eb17945c33d01703f908c4b7c84d1708f05dc0f25e312bbac34dc5b00f723c9b81a17b79c0cb81f4bc6250e03d2701f05dc4f24e31207ac69b80f01eea7927189532b34dc6700f733c9b8c449401aee1380fb391377152f793cc1bcd1cce937973544e3464e3f414e862fa4816a4cc3b23f807e19c7f0210ec90cb7235a15fe6d208c40a9573d20732a0c1f7ec5c4ece435ce1852cfe3a2e5aa69ef455c5fc7b1927de11e3d1a9fea6bc383e79bd6cd188207c48c21c4e7f93c16eb6170817f1bc700767a932da659af71ee6a4578f87c2789933aaa4ae36c0b9cdf4be22c52c9d905387f90c499af92f30b4809f4a3244e6a866e1ae7efc0f913933348b356ef055942a2a6ba398c89756ef05f6a9aebb3ed21cca6cb81118d9496f862b41791fecc245dc74bee5c9acc35c66196ffc37091977963d3babb284401ac0e6dd35f98cc26c5a1f9a5b55e9032a831ad3eba35a186fecaa45bdaf3165cf243edafdfdbae50325f135787d02eedbe00373f8eae66befdfff0efa189f1a3e1497df61130a6441ff4a08d20fd08b4bfc5917929bde7bac660f2fd81f277f69d31180e19e71bd4db27b9f96a174b4b7c76d3ee8c9380ee8f3806865dc31d4d97c1f663c63fd140b7819cb37f4a032536d869a02300f42f69a01a176b6f0aa07f4b03d5d8301f00a0ff480325c633d140b706d07fa58112639868a05b00e87fd240892d4e1ae81000f53a090325c62ad1400703681b69a0c4994c1ae870006d2b0d94388749031d0aa04b3041bbfa5fd4da5f1bcea6fb97879d5337df33c5d6378e54e94578ed9878cbd9da1884c744a3efa912a0d31069f96d8e8559f4f64cc430e4301c672f4faa7de18e30ee31248d2b95bf84d1f50efc1a1a8c70d6dad0ad60755d8dbd3bc692098776998f81c9b58e4cc4302a2e9de01993b35b63be91cfe081d34912a6c614191f01e692923035a6c8f80430979284a9f1c1f31e60769684a93145c60780d98589d9f2a45a70a8603b13620792f62c7f129ee54b33299b6ee358bf20e980be6ea2399b906d19265baae0ec0909b6b95ea93d4c959d951cec1f64ba6d6bce4834e1a9b9bae7b3682f85c0c2ae4cda20cb6c55027388fdf595f600510a0c7d35b31c6a663726df52fe17a6873dc9179862df5c660f4523a32d07d802c89665df036bbd284df9382f584551ce645b9bc5b63cb07567b2aded250f544429794bed808579e360cb6a8ab568ad406b034d9de598c8615c70fadb8d69dc08e23e185c5b5e1227b58b48e3bc0c385790c459a292731be05c511267b14ace7ce05c491227355e83c6792270ae2c89b3af4ace32e05c451267814aceff7911670f499c452a39ff01ce552571527377d138df02ce9eec380d330234c6ce3936f86f4f1ed228f3c259c8b1b66833fdef1307e0cc2a510ae85d306eb95a9cb3e4c118d12cfbffe162bee6068589d368b441e1fda1d3b9ba645ce2e4050d771ae0ae211997385c42c3ddb45d84db4beeb83c7185066d5cbe2bd0aec98e8c9b681b4ec9c09af77eeb09931a6b31f1564dbb5e8ef6dfbc97ff77b9479e297a9ed506f81350d796884a7cf6d350ff00d47524a2129ff934d45980baae4454e2b39e863a13507bb7661448f2e00931ea9d36cb7410f4a6d68b8332559ec3687f4dcd590ecf8461bd3c26658f1497ba7b77ec309c9b78f7eccb223d115a9eeb33498b525ce8c9991083c6fc74fbefe0444c6f6ab2cd51630a9b9ceca7d4f6b6ccabc6dbb66b58e38977db27db903e84a3a05e6fc0fc105648eb6e6beeb3d4da4c0b9b5806eeb51b4a8124d6481a646780dc480a24b1c94f83ec0a901bc731d6ef0ea7c5d86403aa7111420d706e228993baaa9dc6b91f70f691c459ac92732be0cc97c459a2927367e02c90c449dd8687c6d903380b257116a9e4cc07ce22499cf92a39ef863e50b124ce02959c3f006789244e9d8b5f4f838bbdaf24ce012a392f05ce7e4c4eb35d49b490c6ec6f3c85c7455b44b3b91771f58f6308d9152e965cfb88a3f1b49a77324c6c0c882388a1e9c29a45353e64140c256fcaa43529a28315490d49ab94c859693664c1f580cb7b33490f97beccfcb1b44b7c0e3c5c3697c4494dc7cbbb6302e71692388b55728e02ce2d257196a8e49c029c5b49e22c54c9b931706e2d89b34825677fe01c2889335f25e76730a831481267814ace2e503b074be2ecaf92f322e01c228973804ace7b80b3348e9e7a8337d533db332dfa3baf4f05daa152690b54d21e028fa86171e4a24bbf2fafef16709c17610e978449ac9934cce3017384244c8d99658f06cc6d24616adc7cec18c0dc5612a6c6a9b5230173a4244c8d697a8f02cc51923035a6e93d1c30b79384a9314def1180395a12a6c61dad4f00cc31923035f6db4f04ccede3583a609606542e580d640a1c6d6d1bc3ba76dac2c12ed0951ccb4fd61b2c1c8c826562e2a3f5c40f827a382e8e9c0af976a023386a4c789dda90f0de03bcf1ad1b718461311ab3c0dfd02ea29c10c7fdb06411bd1f7682fbe10e71ecc79649523f62b3879638ad270c03ef280d94d8f4a181ae06a03b4903250eb3d1409705d09da5811287da68a0cb03e82ed24089531434d09500745769a0c4e6120d746500dd4d1a2871d88d06ba0480ee2e0d9438f446036d0fa07b4803254e59d0403b00e84469a01a33227703d03d2581162a055d0b560d954903d578c9af09a093a4816a7c28f500d07269a01a9b4df3e11e5ac104ede9252f1434092467dbd56c81c8a2b5e7d6b7504f2b99acbdbc4c52f88df1a29de306fa25a8e2f256b178d706dec9ec3598612ac9c916b761c1b955f0e0dab3e0ccff42b829ad39e1919c3b96d883efc09a3bda18263ca6c6919037bc73d6f83571b2bda89bdf4b58e3e2eabd6167832a398b0b0abd6295b148cbc07d722f499c252a395706ce6992380b5572fe096dcf6a499cd4a63c8db31dd4cee99238f355723e01b57386244e9d61b1df00674d1c7b1635ed11a5b71c8b38234f0b023b0adaa2b5927189f12334dcfd01776fc9b8c4013d1aee48c0ad938c4bbce7d27007016ebd645ce264090d7757c06d908c4b9c38a1e18e05dc99927189d15134dc99803b4b322e31968f86bb27e0ce968cab31edc0be803b47322e31c68f863b1770e7327197f4bfa84d9a89aa63e6aba5cd428df722b07de2de293693e42dfaeae2e63096b56f1cf3fcb89bdc385fa3d6abb56f6a307d14ff5fe5deb40513811af794eb09ab4af68b63342bdffeff60ffdb333cb375d9342fd8c778863d5c8dadc37a393702cefd999ccb26380bfc3f33ed8b8203c4b4ca89361cb8220c071e10c7aa4f03681688058f9d98f868f3a4f7c3a3e7c038e24bc2c9e7727b419bc2ccb2ff327b16260f570ff20f5663a7a0cdcfa9d3d0b4cbfb67680a1dc4e4ed6e79c32cdf3b7861f2f431fe9f7aafca9a987ba6be1a3a016ae8c1721b471a47fb3781da79486b06f10cb18c9312f126c4defa19ed48941321dee45026e5325e738164f53cbaa558b5b02d5ce087c5914dc4550b93e7474b54a666b919eae1e1923035a666b915308f9084a93139e5f58079a4244c8dc9296f04cca324616a4c4e7935601e2d09536372ca6b01f31849981a93535e0498c74ac2d4989cf24ac03c4e12a6c628bcf300f37849981a93535e009827c4b1762e1d4c3399569718e3a46ee03c8fc57a1fccfd9c2891951a524363ad02d693e2183572c533272f9cd5b86876aa17519e1cc7e445b137d18eb757fb12b1655deccde2bb14f84e897b687882ff7795fd1da5f630e667c1cce4743be56bbe0ad623136be67c166d095ce4a7326957f392e7856a1b4d582c6a0b131f8731f7d3a4c2121b5134d85da011757a1c8109aea77de379cbfe4c4edacce5e6504fcf90c4394025e704e03c53122775b5078d730b783c9d2589b35025e76ce03c5b122735b9108df31ce03c471267b14acec781f35c499cd4d1261ae7afc0799e24cebe2a39bbc093fd7c499cfd5472ae0f9c17c4c1996e62b6012a33823f00f1c5174ae2ecaf92f35ae0bc48122775e69dc6391a382f96c459ac92b310382f91c4d94f25e7e9c079a924cebe2a396702e7659238a9eb83699c577b11e7e59238756e9df22f705e2189b35025e707c079257fdd65bd7f08b386285af852eacdb1bfa1dc1eb8c24ed255f8e71d08e99bde1803a0ff6bcd809be484abc5ccf0595acad5c930577495244c6260370d730fc0bc5a1226317c9686b933605e230993f810a2610e04cc6b256112c36769985b02e675923089317434ccfe8079bd244ce290310db310306f9084498c4fa2611600e68d9230890b086998fb01e64d9230894b5b69987b01e6cdadb95a3d79ec88d8ffa1ed2a73304c01df228592baff268df217a0bc550a65a14aca9781f2362994d4f5c134ca55e15e79bb144aea58118db2160212ee9042d95725e5d3502bef8c6341967b8c1d1b44b8248bd833efc662fdce8b58ef8a3b9969facb60a8d36cb4853097429dbd5b322e71b493867b19e0de231957e312ae65e1c1354f322e71cc8986db1d70ef958c4b1c1da5e12e07b8f749c625b61668b8ab02eefd4cdc1e2970dd3bca4eb087a126ffebcb22bd17481f90b3c3570137a29e960e633aa4f47d50122735a29ec6b90f703e2489933adb44e3dc12381f96c4a933f7cd04e07c4412277525278d7315e07c5412277525278db30f703e2689335f25e75d1002feb8244e6a2794c6f92d703e2189939af282c6792a5cec4f4ae2a4a6bca0715e029c4fc5b9b584e95406b42621bae9b9cf4cf4d85dd329c4e13dda64cab5d0e97c3a8ec914dcd928d856a2c1163b48295466dfbc8f6762ed356fc8f3ac17b13ec3645dceffa2cc3ffb06ff2543fd7f55f92f9be4ff6d36881aef7f6fa0b783cf6c7638d287580c88cfb6e69c69f29d5463d6da4a088a788e49d9d5ffc22c9d996c6b65b5ffe6ed6d924073c060704edfc05c3ed4c3e7e388bf339b434db5f9172a3c9389a1ce16dab0cef162cab6487be078d0da7c815d13a39ddfa24b3b063cde6eae80f722136fd51477c49647dda9fd1fdae57d1b4c1fbf241195d8aea4a1de02a82ff373d2d67bc1cacdd1de6c3bb556e7377acc03a8deb624f5357db68347ce2b71e4a46df01f3855fe4b33d9ac8cba449b760ffd0e3a94af4aa5a52ed7a6d12e07b4af49a5d5b98f7b153cf95f67d22eed7f5167cf7e90ffffa63b59e10df74c4eb0691e715f38da9d7439b893bec1df3b3368bc4fb78df7323bd011dbe6b8bc6deea1eebd1947ff27bd11cdbe2a3730db0930df9284a97103b33d00f36d49981a37301b0398ef48c2d4b881d904c07c5712a6c60dcc4602e67b9230350e058f02ccf725616adcc06c38607e200953e354efb680f9a1244c8d5b384f02cc8f24616adcc2b902303f6edd99c8e050c1063bc467392d035d19041c7cc24fe99759fe4ee2854ecb91b8290cba7d2a0d9478b1d3403703d0cfa4816acce2b92e807e2e0d94d8b9a481ae07a05f4803250ecad140f300f44b69a0c481391ae80600fa9534508d7bbcae01a05f4b0325763669a06b02e837d240890d7b1ae85a00faad3450e2401d0d741d00fd2e8e48b97ef147cad1a67d7b41c0ebf7add9634fce99a831cbec40a0fc8149d9c552ceb651ec0dde50fb42734013d8a5af06eee8456c3fb66e9a2a3c604c69aae6b158a7c150dc4f7296571572bb92b491cde5e0e2fe591267a14aceffe099fd8b24ce22959c4b42edfc551267be4ace97a076ce97c449cd3b47e3fc05387f638716868bfc82629ab0c21976b5a459e0a7b791d41f1a49bfc7d1c729b4d199357631554c7199bd5978d700de1ffc3516c1522a7390327ba098f86875ef416849fe29a78ba8718782fe30a9fb179372432f79917eb90dea37c530458e56ff34b7b06a8cff4ed3ff31af1be897abcaa32eddaf62d5dfbe80fe771c036eb8747fa0af51e1995515a39ac4ba9317edd3e2dc77851bc23f712c5fc11b42260b58f4d1f68386fcbf71dc6bd36d79ea6b75ce85a7fe7f710476e1655fead7c4e05e3bd88b12a2d02f79da6af42980e92d19c33dd4d50618e499255626accbdc4d830110e24389d6a8fa12d6fdb691046a52f1119b5634d01be129df561a28315e8e067a1d802e210d94f86ca7815e00a0eda4816abc879e0fa0eda58112e78c68a01703680769a0c436280df42200ed280d9438944c03bd14403b490325c61cd3402f01d025a58112233a69a0d700e852d2408931c734d0ab00b4731ca0d19869cba94c890f255a5ffe011863ea220d94d86ca2817e06a04b4b03d5986cf702005d461a28b1eb4903bd0140bb32414d6862e582b1cf91fe0ba724e2eda6287cf46ce9456cdd986ca9321eba663e313091f8f8a1ed9fb913d4c56525a26adc94743740ed2e1195f818a2a18e01d4e524a2121f4534d4f180babc4454621f89867a14a0ae201195d893a7a11e07a82b4a44258e37d1500f02d49524a212474569a88701eaca125189f39f34d44f007515266acba138c1a1f4e6b279c08b287bc441e9aa9f436cff7e528292d87c3aa31dab4d0aa3a1ab322997f1a2a8a6c95e9517c42f690e03df0ec2167b32e9c2551de98eccf7571970330e6ae26a923807a8e4ac00ced5257116a8e49c084fef352471ea8cae3b0b387b49e22c52c9f91070ae2989939a898ec6f90d70ae2589b34425e752f0285a5b122735292a8d731de05c4712673f959cfd80735d26a7d9e125798b46339f69360cd5b957568117c1f566c22deb455dc799f645c10162ea40d25614758275eceb3101c31545ae0b190f3791bbbc8086f90f3cb3f324616accbbbd25dc13d79784a971e7a157a1666e200953e3ce437f03e686923035ee3cf402606e24095363569a5700736349981a175b3f0b989b48c2d4b8f3d07380d94712a6c69d879e00cc7c49981a771e7a1a300b98983d33c04c0e8825369268b93aff02d64289ac052a598f05d62226eb1a295827f87f57d9df516a0f637e56e90d4bbc25399515f121f50c0bf72ec02d968c4b6c4ed170ff07b8259271890f311aee2980db57322eb1b945c3dd1b70fb49c625f6ff69b84f016eff38da09e1bab86014bfb964811312af20d6d9be2cd6c360f474009335553ebbd47576b07f90e9fe6fadb15f050b1289832cf359b48f428ddd943d59172d3c1ce2ff3dc9b7989258824883a3250234e19721dc6692268dfbab4c7331102ef1cd25710e50c9b913706e2189b34025e708b84b6e298953674e9b7d80732b499c452a392f03cead2571527779a571be019c03257196a8e4f4e051344812675f959cab00e760499cfd5472f601ce214cce0efe17d5aac3137b791155696baeb78c8a6eda931a13523540a0e2502665772f8af4349b4598c3980d76e6c615eb49231cd226221cd69ad3c68d678a881371b46d4fd68564e7c3256112c31369986b00e6084998c4f1491ae68a80b98d244c62638786b924606e2b0993f80ca761b603cc919230356ecdfc2f34c34749c224ce9fd330ff04cced246112e71e6998f30173b4244c8ddbeb6d0cf7cc319230890bb468987980b93d1373ed1498e9ce8a639022b1c69a84c414e4df603078ac0664624da621bf05c8e33420135b0534e4d1803c5e0332b1b540432e05e4091a90893d2f1af28180bc830664628f8c863c169077d4804c1cdda2215f02c83b6940268e7ad1900f01e49d352013671068c88f00f22e1a9089330b34e45b0079d7d65d2a191c2a48d34a1dd8a1e5bc7d18bacfbb49c224762e6898cf03e6ee92303566637e1130f7908449ec2cd030df04cc899230894d291ae6db80b9a7244c62e39f86f93e609649c224368d68981f02e6a4d6cc609f1c9c46bcc869915535d0ca2c974249bd5fd228bf03ca0a2994d4352334ca2b81b2520a2535229f46d91eee9593a55052d78ad028074374c0142994d4850d34ca3ba0564e656f816a120657f83facf146d9e50b65fe5b2bfd37d0d868eb904d2edf90ad2a8e9403539c757051dab06f05082fdf2b8ef1cc30938379b1797bad672253c2dc0d15761433fc7b90ffc6a9fe0166d91a6c723f5027f26875f74d78a64fd3804c1c4da2213f0cc8d51a9089e39f34e49b0179ba0664e2883d0df962409e21a5b145dd7d89d6d83a1a286ba45052635a69949da00b502b85929a259f46f901d4cabda55052b708a251ae07bda93a2994d4cdab6894757081d7b7e6bae7d8920fd242d6db40afaa8149d92345ad6c39371e31f086961b6f33b8d067c6b194dc5cc853eda049859d318a6ddb205a0ebc9fbd8870561c29355c17381eceb42ca90379b41ce47b437283d99238a9194a689c0702e71c499cd4117b1ae720e09c2b89933a9744e3dc1338f791c4a97303a1b581735f499cd4f9771a672170ee2789335f25e7c3d07cdf5f122735d086c6f91b701e2089939a4298c6790e5cec074ae2a4a610a6715e0e9c07c591743ddffe7ff8f718dba1acb71681c950ff6bb3a223ecad4fb4456d5018acb802d01edc9a8373c93555e3ee61ebc190f1214cca75bde489b75aafda8637040320eeb1a531f0ba81febbaab8339c552ce84130ce74a81668628da641b785e1e6c398d0bd52dc1c32e32546ddd3788b81f770fe26eb532de240ff85e589020cb6ad8606fb30abe601d2d2c0eee9458047c431e05cb0c80d387f098447c6d1b46af001abfc976616eb449caca3c5889c004daba3a4d252634668b4f74277f56826edf25ef3fdab41febfcdbfa8cff7de2cc6cbe0e23fa63519c333a53276624d25bf0f8cc7b2192bfc7f4cb641e3d5fe9b830ee8b8c4e55c0e1efa821bd607c6e35ab72b8a8b1035ae81df1e5a96c7f35b96c14049836d0699c50b0d71358b7880f0ec3e21eead29d37f7a53a398684fef7ce8bf9f28199798c09086db07704f928cab31b67e35c03d5932aec698fae501f714c9b81ad737ad0db8a74ac6d5b8ae692dc03d4d322e71949486db1b704f978c4b9c59a5e1ae03b86748c625c643d3703702dc3325e3125745d3703704dcb35a73b420792984c64d3ab68489ebb3e3da026e7a52b28398c60b68b5713718903ea775531fe00163ca613e8fc57a8117b19e2b278eaa907bcfa445a82c0f17fa7992380b55727ac079be244e6ade3c1ae752c0798124ce7c959c6fc210f68592380b5472fe0a9c17313957487016fb7f2afd867a902fdc14d84cfdcd89aba9449be67b129ee917c7353735d12f68bd2dc8747b8018427669514f8f425bf392386aa201ac4f31c5acbd26ce01c84b99905dbd287c6cbaffb28af8f068b123eb03de65ad998a20f9f1421c27a23d5a0e863be2e54cca55bce6873206f96fadb1610f65f61e59c0cd3842bb437683b1a12ba48112279569a05d01f44a69a0c421371ae82fed22d0ff4903258e14d140bf03d0aba48112278c69a07f00e8d5d2408993c434d0df00f41a69a0c489611ae83f007aad3450e264300df42f00bd4e1a28b1614f03f5a0d974bd3450e2201c0df43fa8a137c4d1632f6ec41a438f9d86b71a8cafdf18c7263f66dc2879b5dca2338af9b91761dec4c4ece47f615e6c36951ce2051b48eaab7b4b01d7cdad3b5aa47d6dc72d40794b6b06be0cb143c2931294c426f919ed489495f038b9358e159a612281685e67b0459cd1a49e4627438ddca0dd1f07c1c3e6b6380262320d87a12665a305c43c0facb74b64a5a6bfa2b11e01ac77c43157ee0edf9a9074e90f603ea2bab0386f87b9a13b2571f657c9793170de2589933af64ee31c049c774be2a4ae89a371ae079cf748e2eca792f378e09c2789b3af4acedd81f35e499c052a392ff122cefb247116a9e4fc0b38ef97c459a892f379e07c80c9d92dc159e4ff99e57fb3da97d01fd2b526dc2b1f8ca336a63b5dd15fe5eccf3630baf49024ce012a397703ce87257116a8e41c09431e8f48e22c54c9793a703e2a89b34825e76dc0f998244eea4a741ae7e7c0f9b8244e9d711dede151f48424cebe2a39d700ce272571f653c959049c4f313997b19cf5fe2166f82f1be795db229879cda19e0957d0d7031ae245744fb7669842f24891c609e065a133f90c9372bd1494c9c94fcc1cfb746fbafd77a9ff67a63d64e98239f860578fe0175267db8f6661ef0df5f659295bec52473869f5761a34959e9342491ddda4517e0c94cf4ba1a48e6cd2284f04ca17a45052a77f6994ff83e6d18b5228a953bf34ca1580f2252994d4794a1ae549b054e0e538b6da69bca79179b13968b8a5992bd84be7de5c5f414d7d25ce48cf729b35a1ce0ba33da7daf9a164dee8bb44da43da9268af07da575b37f519a6e2c3a044e2eab66eac1abb3cf49f5e93b3311f71f53aede23f0d1a4fafc7b16ac82c7ca9b4e348d3e39a14a625877cd78bf0de606f6e821bece1a626a36d5fbdce1eceac1fa231ae4d6b2a01e39b713e806625c86abc70f3d2e616c4105771d016c41c0d4da7b7a4eeb345edc1d3d29ade0a49cfde964a4bedd1d3683f81e7fb3b5269a9437834da7140fb2e93d604b2997beb245f608a37d27fe19444eb748ac279a3cde011f55e1ceb835d931fc92d4e9dc94c1f03ccf725616a4c90f63a607e200993b8d68d86f930607e280993d84ba7613e02981f49c22436e469980f02e6c7923089f9bb68980f01e6279230350e1fdf0c989f4ac22436cf69987700e6679230358e6dbe09989f4bc224e68da5617e0c985fc8d9819848491b947b126685be8c73bcd31cc88cb687615dcd8f77121f4634da4360bcf3ab38b2ca65b2a495780fa52d1bfc06c68bbe96064abcf869a0df03e837d240897d761ae8a700faad345062bf9d06fa39807e270d9438de4903fd1240bf97064a1cf3a4817e0da03f480325369b68a0ef00e88fd24035665bf800407f92064a1cffa4817e04a03f4b03258e81d2403f06d05f2481162a6dd8bf03f120bf4a03d5d8f57c1b40e74b03d5d86c7a0b407f9306aab161ff0680fe2e0d5463d7f37500fd431aa8c6c191d700f44f69a01a9b4daf02e85fd2403536ec5f01d0bfa5816aec7abe0ca0ff4803d53838f21c80fe1bc7f243e40ce291c77943bc6dbd41fe0bebfd1706df1be345eb4106fa25a8f226321b51552cdead6036f43f39b3f4fd5586d69e07bd7ab3b18c184c8da1b51702661b49981a436b4f01ccb692303586d69e0d984b48c2d4185a7b3460b69384a931b4f664c06c2f09536368eda180d94112a6c6d0da2300b3a3244c8da1b59700662749981a436b2f07cc2599987eefca2e5eadf63081000d8cb68875032f025b8a09b686e7ea91a7b7ae9d581b69b84b41086d67c9b8c4fb260db723e076918cab716dfba73092b4b4645c625b9486fb11e02e231997d86ba2e17e0fb85d25e312fbf734dcaf01b79b645ce248140df777c05d56322e71cc9486fb2be076978c4b1cdda7e1b685a6d872927189f35034dcbfa1e62ecfc45dc18bd20a4ef4cfabcc9be67f7bb0e53407aab1dc136dc188bb2ed0120ff586b1811598906106d170ada859273a65c18f17b59cb7ef40dacb1599ac1b382ffe604ebf28b10343adadb14126dc7aff156162c2e85fa55e9dadcf41ee311af9862cf267e17ebb12937c7527793af75b8ded84ffa036af1cc74dc21df283078c29cdf03c166b1ddc7b5761b2266f16b4bddd30d5fca948641ca7d1f565d10df522ba1e4cba759a3cb6caad83c9891b46489937369d3968ba55a5bed6411e34b3566532af99e29e1a34a9cc5d7386b78ddd38a8b6d9f83f8db17f4b403deec9046e69d3abe42697c600a0fd8072352665b801b5e91298a65375e211144bae715a6693ffe061b47a1c33aee93ce1cd36801aa7afdf82b6e81a9230354e5fbf0398bd24616a0ce07d0d30d79484a93180f70dc05c4b12a6c6e7f74b80b9b6244c8d01bcaf00e63a92303506f03e0798eb4ac2d418c0fb0260f69684a97198f929c05c4f12a6c600de6700332f8e09bb704ca9c69becff6756de2dba8933a703eefa4cdc709ff974578d0e50990ce649e8ad6f2089931a214de3bc05383794c459a2927347e0dc481267b14ace2d807363499cd4f1241ae705c0b98924cebe2a390f02ce3e923875a6797bda8b38f3257152579bd038d782da592089b35025e70f503b0b5b77be127b44c4f14e5a8fa83ba47d298a3b5e6982ff7795fd1da5f630e667952942c5a8bbd2ce67d13640bc523193b6c8736df88bd174d9c7e3117bfcb478bc0ed0e32f8923682cd390316afb8016347635d4edbe71443e17796643f55989ba6a0a6ceae79cb8021e7ab020ff834759bf38ea67be6d1d54dabb6a50434d34de58ff3be6f794f9df1fe51fa4c23ed0e801e5bd59acc74083abbfa406d70095e90bef01ce019238a9b978689c9702e7a692384b54729602e76692388b55726e009c9b4be2a4cedbd3384f00ce2d2471f655c9391138b794c4a93331f1155ec4b995244eea2a7c1ae7dfc0b9b524ce42959caf00e7c03806fad2c3d4b8c6a3070c840c8a63a02f1c8d0a527105431ec9a883edb2c4baa4e11022add79e447b59bb8876309376d546b495162e38c8a2b676f95c18611a12c70853885ad58832f919af6f84a91e204ba540126b240d7230400e9502490cbea541de0890c3a440129b4734c80b0172b81448e242051ae46b0039420a24713a9906f920406e230592b8428e06f933406edb9a210ec9cd1f8d17f70110e2309249d9c3cb64679b20e905f5c1434b7c710af47846c531cce10ec0c17e8ed95f51e36aa45aa8a1db49e2d4b9b86b7fe01c2d89b35825e7d6c039461267894ace5d80737b499c852a397b01e758499cd41ccd34ce02e01c2789335f25e7fd305b395e1227755f5a1ae7afc0394112a7ce6dac4e878b7d07499c0354725e069c3bb6e66c6532a7c6cc217530fcb1139372354b39ce3fff5aafd6becc44c28ff4ff55ee4df37f32cd420fb21917a7250e3bd4ffdb245cabe0c1f2322d7b11ecce71e5a70be629834504b1846bd396131c0597f82e4cbe4cb79d36f74c628e3a5a58c23c00dd551aa8c6b571f701e86ed24089531a34d0db00747769a0c4673b0df47600dd431a2871ae88067a27804e94064acca84803bd1b40f79406aa31f8f07a002d93064a0ceaa281de04a093a4816a8c34be1940cba58112074378c9ac00b482ddd19cead5d8feb8e9b797d9c5ab15b086bd5e613fbdc48bf82ae308d76ef011cd061299ec2253a872d7ae9da0664e964a5ba092b616c6e7a7c411099fce08282e2fd0986ba10cc642a74a44258e3bd150f700d42a89a8c4673e0d751ca0ee251195d832a5a10e07d469125189fd271aea3040ad96884aece5d3508702ea7489a8c4b1281aeaae803a43222ab19d4a43dd05506b24a26adc48724740ad95884a9c7da2a1ee00a87b335197f79a0fd119e4ffdbfc8b5a3769f9c09e878e695d1ca139eee13d1cdcd3b80c7615a0ac6fdd28a7e0507a93af4e6e175136c81a742e54194dd20686f6664a03d5184dd21640674903d5184df207dc3d674b03d5184df21780ce9106aa319ae41f009d2b0d5463348907f7d07da4816a8c26f9116ae8bed240354693fc04a0fb4903d5184df20b80ee2f0d546334c97c003d401268a1d286fd97f0503a501aa8c6aee767007a9034508dcda64f01f46069a01a1bf69f00e821d24035763d3f06d043a5816a1c1cf908400f9306aab1d9f421801e2e0d5463c3fe03003d421aa8c6aee7fb007aa434508d8323ef02e8514cd0ae09d082469374312cefa6c52f1f08ddcca39978bdbc4c52058ef17f6e4218cc3afa817e09aab8f1a1552cde22086638a635a78e47fb6fd9cbff57b9d7c09d3aeed08644b9324c1d1f1b47a2d5e6c319cc72056a24e8daac3a7903ec8b709c1448e2838706791d401ecf4fd912641699b8e0deb89d67b683345b434ef60b36cbff5e95fdc9a4447c087d2f43da52b03fe1a174829c2c4d854ad3592e0b0fa1132571eaccbff80fb4374f92c4a933ff6247a89d274be2d4997ff105a89da748e2d4997ff127e03c95c9d9ddf3ec9258b3cd73b5edf74cf08f5c61f727aef4467ac156d0d53c425af8ecd25e44785a1cd9e8c31d12cc3eefb353eec315d362ae25587da1afe19e793abb095f6b7f6db854bbde3fbbba4472c0319e4935506565cc4d8006498b47ae80ba7906fbf236b91926fbdf98e9bfa401b2358cf38235f0e5fe57fa7a419b02e199712417683a82944e7a01e2c3873638b7155ce667c53154eceaa90ff2df5a631f4be60115348e88210bb48ee5fdd0633f5b1a2831a88606fa28809e230d9438dd4603bd1040cf95064abc87d2402f06d0f3a48112473d69a0e702e8f9d240898d791ae8f9007a81345062d8170df42a00bd501a28313091067a2f805e240d9438974903bd04402f96064a0c4ca481fe0f402f91045aa0b4617f04ccb65f2a0d5463d7f37000bd4c1aa8c666d37400bd5c1aa8c686fd5e007a8534508d5dcf7a00bd521aa8c6c1911a00fd9f34508dcda659007a9534508d0dfb0600bd5a1aa8c6aee701007a8d34508d83237300f45a2668170b1afc5a0367c2172abc600f781a1b6dfff7115ec4765d1c81dce985d510bb96b4909a4381f27a26e53a5e723c48bddd35c1ccbe577843fd1755fbff4d4a8432347fb16b6cce2f034322373099576ae1ce995c638b99bd775a9d3d0d306f9484a9f106700e60de240993f83ca7619602e6cd923089ad4d1a660360de220993d817a261f602cc5b25616adc1eba08306f9384491c47a2617601ccdb25616a8c905f1a30ef9084496cb4f3566f40effc4e4998c419221ae68b80791713b3670698c99bf368dc49e61e884abe5b226b814ad6a9c07a4f1c9b4984c32233ed0b8383347713d0783f9d06b78079125135de574f07d47bf90904fc4fd1ff61ad2dc42c3b206716ca84abdfa3d548fa86e876f122c8fbe25e3a33c1ffbbcafe8e527b18f3b34a6fb07f90e9fe6fadb15f99575337919acfa2fd1deea6f7c7b10c36dd79a3fe2a67deb7804bfe01499cd4bdb7699c3b00e78392380b54726e0d17fb439238a929ff7853c4c0f9b024ce22959ce703e7239238a9837734ce1781f351499c252a39e703e7639238fbaae45c069eec8f4be2eca7927303e07c821dad14a44babf30f33da7f5ba91d51326fd0c756e4456c4fc6510bd3cd313b80d999a465987dac4dc4f99424cefe2a396f04cea7257196a8e41c0f9ccf48e2a4c680d0380700e7b39238fba9e43c17389f93c4d95725e77ec0f9bc24ce02959cf3a0a1f48224ce22959c9da176be288953e98650503b5f6acd6890e4ecf125cc38255afef813214ee9654998c47e390df338c07c451226713e9d86791460be2a099318f141c33c1c305f6bcd1d37921b47c4a505b4c4bdfbc2d0f0eb52288b5452fe08946f48a1a46eea48a37c1228df944259a2927265b857be258592ba0c8b463903262ade9642d95725e53d502bdf6152aee125c76c56f92f0f37d709e3339b9b52d3b82af850c07d9789dbc9ffc2e4df0e529c8ff21de6f0b86819b8bb7911d77b71ec2d687ef1645b1bc363cf48bc8486478b136e0378efc7b150c03d1a843d1b5c2a40bc84bbb1585f05d60f98ac1d3cb3f94399ddf4c1e4eed077b75b19a83e8c63eb11ac7feedd2d83242813990b51698950be8186ce47713474cca677c33c139931de33fbac4e49fc3b1089619b3bdae623cfc2de421ff347cbebfd4398b513a9371e196d13f4d4d9c356301f37b48d4806c1c5fe899c9daf0ab8cd70dad3bb1e6ae7a79238fba9e43c14383f93c4a933edc910e0fc5c1227752488c659019c5f48e2a48e51d238d707ce2f25715247cf699c25c0f995244e6a0a481ae72b10a5f1b5244eea34198db31dd4ce6f2471f657c9791e707e2b8973804aceab81f3bb38d69887a3e975f63065f600a946d3c725be1b6c564f1c88a3f5df0f81a190eff97910d20d35d037e3330aa6747f900249ac9134c88d01f2472990c460411ae40480fc490a2431509006b93d40fe2c059238ee4e83dc1d207f9102494c4b4a83dc19207f9502498c4ea7419603e47c29901a035ef604c8dfa44012138bd320a700e4ef522089e9ee69901500f9476b46b325f7c135e61a5e1f28ff6452aee6358d661bedcdf64c1eb7c639089be629d217db711044b2fd251556e3c68a6300f66fa9b01a632fab60bce81f266cb7046c918dfa68f0bf6d0e64be536b4368cccbf4f1bd06d316ffc631309c6fff3ffc3b284ca9ad83e665a6f831441f2dc15a28f5b61771fec7e45cd633618441606b99ffe3115e9078b4ca6ec154e5ede3e90c2eec0e805e6722e0d2fe1726c56d79e2170fb61316e610e68e4883a305556f04706d9870e17ac7f4667874466e6c0d77c5b6923035eeff331030979084a971ff9ffe80d94e12a6c6fd7f3607ccf6923035f6c93701cc0e923035eeff5300981d25616adcaf621dc0ec240953e33e151b03e692923035ee803a1430979284a97107d46180d99989192c2badf782953fc36d87b1025600d52bec778ff322bc2e4cbc65bd681c08d7416a1f489b07b56f692660cbb33b1802486cfcd04200cb6148771926e52a5ee6e918898f195acabbe3215cb5ab3450e2a386067a22807693064a1cd6a0811e09a0cb4a03250e6dd0408f06d0eed2408943c234d06300743969a01af3b01e07a0cb4b03250e73d040ab01740569a0c4a10e1ae80c005d511a28718898067a0880ae240d94d853a2811e06a02b3341c3ac6ec819a6dda9b0634ae1df83fc974ff5df66d2940589504cfc30f1f2a7cda81f01215bab48c6253eac68b807036e0fc9b8c4db020df778c05d55322ef12146c33d06707b4ac625765b69b8d700ee6a927189832c34dc2b0077f5d61ca24e4e89af71df8b363044bd069332ccc219867397db1a688a1184caba47fe352efe9f0235b4179375fd46ac263a7e8e7f88305371102bef4e3689af1be897a98a0b5ec5021f0af5784d26f83a8dc06b6049c2a2cf7c39d4ebb5e2b85db83bbe78404cda4b6c8acd63b14e8539d7b599ac9965b529f45b071a634bbbc3aaba75247116aae4fc170667d695c459a492b313d4cede9238f35572be08b5733d499c052a397f06ce3c7ef059103f159e7f4cb153b466ffcff01c5f3f8e790157e3a8e94ae3feccf8145a305a3db4373790064a8ca0a281d602e886d24035ae871f09a01b4903d5b80e7e5b00dd581a2871888f063a1a40379106aa31b7c87600da471a2871b284063a1e40f3a581121bf134d0b1005a200d9418e347039d04a085d2408951a834d009005ac4ef664ef5ff99bcb669ac25acf00fad0f6f672fc22b66e22de37f6126312abd6936398ba977b82d943eba9e405712c7d4717aa3451a17d0ce04cabeb2ee89452a073b5e8139cc7ed240350e76bc0ca0fda5816a1cecb80d40074803d538d87133806e2a0d54e360c71d00ba9934508d831db703e8e6d240350e76dc0fa05b4803d538d8710f806e290d54e360c74b00ba9534508d831d8f01e8d64cd030b5af99539f6c5f667ae9da3392dcee457c03997ccb01dfdebe42a53d54b81f7b2c88b49dd9fb4268c2a0d61df8c0e06e8d695dce01cac1adb9fc60881d8a9be4d1e3e4cf6847a2dc0cee8c43f8c3c041a2e9b1f6979b078bd9d4be227181ebbba487c37db19489b73cdc17a77a4196307388452373fcfb70390f8d23e2ada4d1451d035e6f16deea10cc3a2c8ec47fe92c0708a6c5f48da8df0b98c325616acca2783f608e9084a9318ffcdd80b98d244c8d79e4e701e6b6923035c6ab5f0f982325616acc237f07608e9284a9318ffc3580b99d244c8d79e4af05ccd1923035e691bf0230c748c2d418067315606e1fc792e87430931744135b9cb425d1ef03eb5889acd4863c8df518601dc71f4baff782dcf261fe83499ed9aa6c9affb299fecb2679261f020d91b601ee482f421c1f67d2949989a90877a28970b2827827a58d67de0a83c11398acaba7b8e42778c1be8373bd527b18f3b34abb99de74ffb7d6d8afccaba9dbdacfa7d1c265bf431c8ba4d39dd2d5b960a5146aea8e923807a8e4dc19387792c449edc5d338b7818b7d67499c852a39f703ce5d2471ea8c7fbb1c387795c459ac92f33de0dc4d122775274d1ae712f028da5d1227350d2a8db30770ee218993ba190a8db3003827b66610575474f2e83cad0f5f03511f7bc6119369a8667966537b1358a83d68660de02b6bcd18b8e49a489cdaa0d5c419f0049f248592bafa8746f91550964ba12c54497926505648a1a4ee814da35c02721d544aa12c5649b91e3480264ba1a4eead41a33c056ae5142665772f8a1e0ee783c2295fdd8da0f72057e6d4b808a7da1e4c85edcbd4c545489b9878d18b08ab5a37a1386ee68013bdc410c36e2cd695a179be17bf6656fb2f28b3897530c58eee49de6da1664e93f2a8a1c6b5d3280f87b664b5144a6a4a131a654768004d974259a892f275a89533a45096a8a45c1dda923552288b5552ee0d17782d9372052f1a97acb42b214d5147d8b6a5d94328a696250df20b787eefcd84ec91a24eb61ca045ac9bb400adcde132af8b83348c7b4bae97ae0b9e188a4daba517c2e55e1fc7e55eb0885eee9fc1e5dec0845cda7c5289618cf17e6f3c2840b82c9a0647cb66d00fe066cad93fa5803be34d5b0e50076342b324715267bc699c0703e76c499cd468211ae760e09c2389931a2d44e32c07ceb99238a9919634cedec0b98f244e6aa4258db31838f795c499af92f3291853df4f12a7ceb5e6bf03e7fe9238a94b52689ce7c2c57e80244eea92141ae7ff80f340266717ff8b5a2f7975e42e5eb0de8cc6d693c5b6b117b11d14c712be06bfe75de5bf74e282e1b50a8b17fe3dc87fb199319fe5bf2ad8b7821cdb46a3fd0a6ae4c15269a9b16e34dabfe1517488545a6a702b8d7632d01ecaa45dd6c3f5e6a3bdd9f60e5ab760e57970207d3146a3e08e7a581c491edd2b28e6da7f51c7d969790afbc064efe14cc65e19348f067bc1eaf232fb9d7afb0e2aefbe6d49bc45f0703a22ae5da3a7fb2fabf0625b4b419bbad814ee9147c65137d39ba90cef9ce62e3ad02f419547cd7d50c5e25d1aa6d88e92fa74a786d0d09eeed3e0b23f5a2a2d35668e467b24dc148e8923e9bd99415fd492debf0788c7c631bb3e60119d5dffc98b208f8ba315ea6a3e45ad50626f88d60a3d09eae3f14cc6359c4ffa74ee9825cc84cfb43be63e109d7482645c8d8fa3a9807ba2645c62e2331a6e5fc03d49322eb16b4ac32d01dc9325e36a1cdedb0a704f918c4b4c5141c3ed07b8a74ac6254ef0d1707700dcd324e312875c68b8a300f774c9b8c4b59d34dc0ac03d43322e313f320d7737c03db3353bba832d681d773ee010d67cc00018183c8bc9b89a97bc52a4c2d6be326b114ca7244fbe0407d6bbf76039d4cfb3a5c2121b5b34d8a76196e01ca9b0c4ce2d0df620803d572a2cf11e4b839d08b0e7498525b65e69b073e11e7b7e1cb0f9f6ffc3bfcd93bfd2c6019a8d4acd6f32d4a360b2db14b441e1f0771e0c7f5f107782fff45bae1adbadbde0667061ebe6d1c103c6944787b65dcaf7d08ebd484e5475a17f5fd5b827e74a108575b124ce42959c4b00e72592388b54722e0d9c974ae2cc57c9f935dc3b2f93c4a9733fe33f80f3f23886fd925ba523fc370df44d1afc374629dec6251a4de5f1b44c6951d61d01f78ad64cac9e5c57356e157d8017515ec9a45cc5cb74339fbecc0b9f56378ba13bfa3f69a0c458161ae826007a953450e2101f0db43b805e2d0d9438b447035d1640af91064a9c36a181ae00a0d74a03254e97d0409703d0eba4816adcdaa727805e2f0d94388a4f035d05406f90064a1c0ba581ae0fa0374a0325f69468a06b02e84daddbe9c4293b22256dcaee31e8bfdfcc0fdb09723d1ad27a2f58703e3cf1bd6868a45e618d3c0d26e86e89e312cfb7334995b6464674a3ec855d667f5217c7b8126d5a6e1700bd358e3150f7b41c16df2c5423f68bbab0386f05cedb2471f657c9791170de2e8993bad284c6b92570de2189b35825e7bac079a724ce7e2a390f07cebb24715287e8689c3b03e7dd92380b54729ee1459cf748e22c52c9391f38e749e22c54c9f91c70de1b77e0e204ffef2afb3b4aed61cccf2a17e48e0a3245ceb03d28e2ec266d03c06eed22dafbe2a8a94dc31a825c273b7865f68d15aa0319ee869a7a3f3f6f698d3dc088440d1de291f396d2d83a03db034cb64e1ea6290c6a1e8d8b9657a714b81e6ccd91cbe4860f71549db7cf368c5c3e2465eb346a1b9246b917c46f3e2c8592da7ea4517e08948f48a1a4b61d6994c703e5a35228a9036c34ca2ba0adf898144aeae01a8d7249a07c5c0a2575248846390ca6719f605276b394e65826ad60f0b6915eb0f3f6f88487bea9db895ec4f7a4bc7d3a893592d63c9f0217f7534c52f345b58dc6a855d8e92b849af7746bde03f170d47592b4a0ff53a191f30cff1e38cb0b4305c6db2429410881de7be00e50139f8d637c315cca8f9081c6a2967e6247783a3f2767151a79ed04ed429f0dc315cf4be2eca792f358e07c411267b14ace6d80f345499cd4a4bf34cec9c0f992244eea6e0934ce8d80f365499c452a39fb01e72b9238f355727e08012daf4ae2a4eedf41e35c0a6ae76b9238fbabe4bc10385f97c4394025e71dc0f9461c694e4db445b4314af8e398b645a131bee4458c6fc6bbff51eaa8a06189378cf60fb19767b2c83570c7309f61d15e0bb46f49dd5a8a3ab94b5b9472035cfc6f4ba5a54ef6d2689f8046d43b5269a9d11d34dac140fb2e93b6bb176d88363df1cb83b568da1f576b03e17bfc517a53d3cc10b389ab9c191f1f6dbe6835e07b9fc9b792975942338d69a22e84e7fb079230354ebf5d04981f4ac224268ea0619e0b981f49c224a635a1619e0f981f4bc22426dda1619e0e989f48c224a684a2619e03989f4ac22436ce69982701e667923089210b34ccd300f37349981a473a2f06cc2f24616acc417c03607ec9c45cd34b8e53324186653652c984ba9a0ea4d91fa3f9b4501a133fbedf2e02feaa75431231f04b634aa84381f2eb38721965b2409f7827a52d827e13863fbe91064abc9bd240df06d06fa581127bee34d01701f43b69a0c4de3b0df42500fd5e1a28f1a144037d19407f90064a1cf9a481be0aa03f4a03d598eae46900fd491a28b1374f037d06407f96064a1c05e525e301d05fa48112474269a02f00e8af9240c93b5ff12e7908b0992f0d5463d7f32900fd4d1aa8c666d3e300fabb34508d0dfb4701f40f69a01abb9e8f00e89fd240350e8e3c0ca07f4903d5d86c7a0840ff9606aab161ff2080fe230d5463d7f30100fd571aa8c6c191fb01f43f26682f2f935c3563fc9f9b3dd6cd6e1903fd125479d45c0d552cde75218b88f91069bcab7aa972c18eb507abb1ab944aedcca779b139891832c22ed18684fa9b17a1b661a2ae6551c7f9e75febd5da9735f86f18edcdf666d89a596f972ad4faaf996641072566f1835f30d4ffbbd2335be8e89bb55f0f88db32895b9ab54f5ef645ec477560d5d67561d67e0926e5065ed3701dbcc316a5c8b05d0f7b1445ff2af57f459dfd45d498930d59b5f70878a8b563922fe37f51ef05998fcdbdd61cb5cc3fc428ff2d869246d79b4537162efcf64cba9ef0c09a699ffc636c21c2655df55ee39dd8352fb4391b6a6407266b57600df288d5c785378f85f732d4c98e4cbccc56ca9bb5201a8371bb429bb49324ce12959cab00e792923875868aff0577caa5247116a9e46c0fb5b3b3244eeaf8138df369a89d5d247116a8e4fc1638976677336b13634a9312bdf45d12fda051f690933cecd1d32869c904368146d232ec3e4f6da3a63ae6aca5d1d1e2ea27035dd7387ae8ae31d0ff3f3df44e90c3b61b933cd5f663e9e715214e33d36e042bc278d3b271f4e0dd532478c081b6c69afbef44e66433ad133a0342caba3359cdafaeb693210d6a77d35a1beea8cb31b196b6470b57cf0db1976d99953097b4be47d16a00b7bcdcfb2231e28e765fdc10ee8b2bb4e694c610cb38c90b1622121f3167b4235156c3d37b45feac66e9822c8b832d5d307fd94a536eb44d77bac2a5bf121375052fd8b03198d50c7f3d8eb64ff0bf5f61efa31a77bedc1d20578e63ce3d5cd21d5cf0c1419aebad6b4c877125dc3d5761a2864907d269534e54bae5c46370ffec2109536306872700735549981a73d83d04983d25616acc61f70860ae260953630ebbfb00737549981a73d83d00986b48c2d498c3ee6ec0ec250953630ebb7980b9a6244c8d8df6db01732d49981ae72aef04ccb5e31857cf74549d9ab49236aefe0c0428ac2391b54025eba1c0ba6e1c03c9f97626c84c00a717314f5f7e401b5f5a1d66827ac7110392ee1a24eac63dbc85dbc0b99e244eeab65234ce9b81334f122775c3481ae70ec0b9be244eea76a634cecd807303499cd4cd76699ce703e7869238a9e3f234ce03807323499cd40d23699c4f7811e7c69238a9bbc3d2385785dab989244e6a1a751ae7d7503bfb3039c30d230dd5a2b761e42fc0981f47588d3b223e38143dac8616fcb52a44c317c4b148b0b0d180480cf590163eb32a0c7814c61d39977aebd2a6c1dcd42416f359b47d81b6288e078febb1d3783f84fe2a774418d02ee22c96c4394025e778e02c91c449dd9494c6b9195cec7d257152b791a2714e06ce7e9238a91b3df3f22800677f499cc52a391f03ce0192384b54727e0f9c9b4ae2a4862fd0383bc3937d33499cfd5472f606cecd65ceb413c7916833ed27c045bf451c1dcf70b9c114cfac003633edd158923be84663fcd2061072b3a5a411cf012a13503f0403c85b49e2ecaf92f33ae0dc5a1267894aceed8173a024ce62959c45c0394812673f959c6700e760499cd4050834ce59c039441267814ace5bbd88b3541267914ace8e503b874ae22c54c9f911d4ce614ccee5129c05fe9fbd7d854a7ba820894a4cf3ecb4942a6f409d1cce4f0fe09e674fee07e99b28ee069023a44012073e6890bfc265bd8d1448e2fc3a0db21620b79502491c2fa2415601e4482990c4d54334c8530172941448e2da601ae42900b99d1448621b9206f938408e960249cca340833c0b20c748812466f7a041be0690db4b8124e69ca1413e05906399904bfa5f04dd42f3a7426d76cd75006c5c6b865c2737bc35de0df78590ebf171a47e0e276fcb6db23d530c53e4f15e98c274a89dd49dee8df40fd214bc712082c630849f200c6142ebe627c6cdc5923329d058bbb158bf819bc20e4cd61e5e261b3986836fc45e10ed3e7b27d4d41d5b337d4ad3b8777d97fd000893d9491226710c9386b92960ee2c0953e303691dc0dc451226712c9317640898bb4ac2243ed369981b00e66e9230894f731ae68680b9bb244c62bf8986b90960ee21099338b649c3cc07cc89923089a34934cc02c0dc531226718c9386d91f30cbe46c7757a0341f67158c364d92c4495dd042e39c0b9ce59238a98b01699c5b006785244eea62401ae776c059298993ba909ac6b934704e96c4495d484de3dc0438a748e2cc57c9792704154e95c4494d4241e3fc0a38ab24715233ced0384f818b7d2f499cd48c3334ce8b81731a93b39b17e5e932070976648b29929dd6a9bcca8bf8aa997c9dbd68d36f937c7cdc02427d810a2b01daf4d6dcbd32f912d6b89350350c6acc6052aee225c77c8406cde52d24de0f69790bb78765fa35ecdd7e27fa3f9e652f67f346b31bfa48ff3b267446df9d7037b8a86b9970cb78d1260dc12f8fe92142bb1f8e8016e2de71e4ca2cb0177070d498f03ab521e1fd09f5ae2e8e3b602679ae35e612be165a84f5d24089012ebcdc1a00da200d94d8e8a1815e01a033a5816a5cd47c2580ce92064a9cb8a5815e05a0b3a58112276f69a0d700e81c69a0c47e0e0df424009d2b0d94182cc84baa03a0fb480325060cd240cf02d07da58112830669a01700e87e714413e1368a63fdbfcdd1cd98e528ffad66b023868d137bb3307b419f7dff38326536d8dd26cd6047b818a5c24e4c847f0ff25f3cd57fd32cff55357641163963514f16ed0f504f0f904a4bcd5e44a31d0eb4074aa5a5a62da3d156c30de120f6c0718317aeb11ce3bfd0240b69b08033148eb89baa12c21d1cc7de55ae09dd41febf833949e2a008ed81f42cd4bf43e278baa7372fde8fd97fe7456302e6a19230897d771ae63e807998244c8d13bef58079b8244ce2339b86d900984748c224f6d76998d301f3484998c4be3a0d736fc03c4a12a6c618b7298079b4244ce238270d732fc03c46122671ae9d86b93f601e2b099338cf4ec33c18308fe387b2fabd04ff0de5de0e5e10ba55e3bf60a6ff82499e09e8d21785b48d17f11ddfba51991844a871f3e383db459427c89aba28511993340ec62d4f9406aa3126693c809e240d54634cd208003d591aa8c698a46d01f41469a01a63924602e8a9d24035c6248d06d0d3a4816a8c49da1c404f9706aa31266920809e210d54634c5229809e290d54634cd230003d8b09dacbcb24d3eb182f5a6939d02f4195474dba57c5e22d84e581673379cdaf0e07448237d1b0682bd8cc3517629d1347127c131f576917009aa29a029b71a4399ef6f56c2f00e4b9fc359461bddbbed12e6934385a92e66100775e6b0ec1613271ea105c873624cab56008ee7c3969220abd629593bbdde041728124ce42959c7f43b3e742499c452a393b40edbc481267be4acee7a1765e2c89b34025e78fc079491cbb5984393a66f8df9c9dd80c2419163708218e142dc17aba7f0a17fca54cd2a5fc2f4ca37cb2ff8d99fe4bf4b62d0d554876999cb625713692d6b6cc87b6e5e571aca2683a6891ce3a0ae2854d5b45b1115cd857c4b1bd7691b7e86daf7d1f5cea57c63190d17f111dc85811228afe17c7d2145c3139c27f4b34a411c35a49dac0da6ca88f57c5911acad4c7998bc4a57c0fd05ddd9adb232637c5358654ef0b94d7302957f3167eed23319688f6ccde10ee92d74a8525b63369b08f428dbd4e2a2cf15640833d1b60af970a4b1ceaa0c11e0bb0374885254672d0600f03d81ba5c26aec70ce00d89ba4c212a3e368b03701eccd526189719c34d8eb01f616a9b01a33785c07b0b74a8525c6c6d360cf03d8dbe2889a730d3d37dd47b540e5fed39f4392f2dba5816adc83fa0b00bd431aa8c6dd7e5f06d03ba5816adcf1f75500bd4b1aa8c69dd21f07d0bba5816adc2dfd4900bd471aa8c6dd7f3f06d079d24035ee00fc2980de2b0d54e3cee9af03e87dd24035ee9efe2e80de2f09b44069c3febc7611e803d24035763dcf05d007a5816a6c361d0da00f4903d5d8b03f12401f9606aab1eb791a803e220d54e3e0c87100faa834508dcda6b300f43169a01a1bf66700e8e3d24035763dcf01d027a4816a1c1c391b409f6427fb4b5e0132ce7fb9298689761eea99d4fb343e5ab6f8015ec4f7541cdb7e97f87f66f9dfacb611cddab7fdbe12f89e6ecdc53443ecc4f0242fc89548bc90cd13814279000c793c2327c2596336d943a0563ecbcebb30d53e402a6ccdabf34a17acfea8e7c17563c17500b8e7e258f09aeed399ba8330edeeb82d3c9b9f97c4394025e71ec0f982244e9d2398dbc112c317257116aae43c03385f92c459a492f376e07c591267b14ace2f81f315499cd43cdc34ce0ef0287a5512675f959c6b02e76b9238a9bb69d0384b80f37526a7f9c2bc983af643635ad28b98de8863d31157ad4bee71539fd7b43ef78350e7de9484a9710797e701f32d49981af7b09c07986f4bc2d4b887e50380f98e244c8d7b58de0598ef4ac2d4b887e5dd80f99e244c8da9face04ccf725616a4cb87213607e200953e31e96bb03e687923035ee613915303f6262f6cc001373721632ebe83c16eb7530d8f6b144566a402b8d7512b07ec2645dd54bce1fdb602334c27c74c9c0c14183b003222a6d8bc65d6dd841c7f68d0e3eb4c9c107db813173a2e5b6fc41f0c026de30cfcc77575adf72ffeb915e957dd79e7e2ddbd5ff2fb34f6277ffbf54df6fd3a6ab5fa2526f8e5f3cf35d73bc0a7b6cb3d1a82959bd979fefbfe45353317a242a465e9b65fdffafb5276be2962659a02a5bfe327be47dec71f2ec4c7e9dfd6c06f9ff5fe5ffacc21b6e0703a7f947ceb3890953e5bf1de7050909cae1d3cc6b6346966636f9795e9bce0bbe3fd67a94f9afafb5764109cafcd795273e98c156d86899b3cb6bd3c59e49b01dcb24fbca69de2ef635e6c82b36f3d351f67705dbb1d6db540bb5fe3b5c197df3ac74f24f1aef28119436f93523fddf667e6be0692a53b5f5ab4d943d48da58e7976fb45faa527b37aab167be9c3df399fe4f6bbca1febf8c7e780ee3fdef0df476f0c6d857e7d930aaa956a4c2fec6325b8a0ad87cb63e51ba7a2fd80d63a8fdcd416a53f3f5dc463f1fef1f2fb818c2e3e6b5e90e250a2e296337c3d619539a7189f7e6a51515171c2ff9555179936b4897c42b27f9df9b62cf704a62efa329fe4f3ba5f869f44906df1d676f570d0b8e16e5236d7cb42ef682afb3d2954d7edad9de04672d28a7a9b1467baebd5db4b15756e830ca7eb6e6a765f6eff1f65a33f78a3e05fecbda98b490416a8f4d1624f508ee28d3fdff82afc2efb77c4c737f68fe689f999b409bd44f87ea9cddd95a3aa3a8e64c4e18d7dbefb674a62d9f9ffb2ed9a5994fa54fa1f92c16e5f3ffdc7cee5d139f7bdb3e45e67c0b7250f75a2ed117e637b725b5475cfb6ce3ad437c2d0feee0c1d3ce14339b5a6eee78c9c7abb2bfb74fb1cc1a9ebb73ff12ef6c6dfb942c6c0dcfbc445f316b7870b4200b54a3630f4be3ec527f0e8dcf397a55adad0f650bea4270bd9be77f451a12abd9d696fb6803fdafa6d873adb2479dee85ff334f4ed3833137a6af999e2ba771c7186d1b0675f6b0158bef20c11d24dfdc41be49bac8f2cd45f6ede2da9fd3daff1dd37399a4dadfe23295ffc735fdfba635fd87c5353da735fd47a667a7a49a9e724b9effc7b5fba7a6b5fbe7c5b53ba7b5fb97f8eee3c12094f953b1b8a637aae9bf36ade9f317d7f49cd6f4df989e196de0fbffb89effdeb49effb1b89ee7b49effd91a2359dbf9353e9ca2585cdbc3dafe57d3dafef7e2da9ed3dafe0fd373b9a4da3ea6d1f4dce23a9faaceffdbb4ceffb7b8cee7b4ce7b4b133d974daaf3a3bdd989ea19d6fee0408beb7b58df4dd3af517d6fcbfc7cfe1fd6f725989ec92d1aacef66aabfdef65617d7f6b0b6b76b5adbdb2faeed39aded1d989e3d3cd7bc521023d7e0bfd49cf26c7b0813be1304ba2dbe02c22ba063d32ba0d3e22b20a757c0924ccf551c5740109a18545f73cf2ff54c52a0c5f5bf71fd5faa69fdefbcb8fee7b4fe77617a764eaaff18f4b9b88e87757ce9a6757c99c5753ca775bc2bd3d3cc3b8535dc84bd9aa39a028eb2a7b8f86e1ed5f46e4d6bfab28b6b7a4e6b7a77a667d7a4bbf9702f0880c760fac5753dacebcb35adebcb2faeeb39aaebe6bf956ce36282ffde8ac40a86d1feeb2becf1fef3ffd7feff00412ce3cbbc020c00 serializedProgramBytesString: - serializedSignature: d62d686c0c390894285d29b9d4b48204c2d510f4bcb6e46dab6fcfb6c080c561235c6e221020f30a71e1b959792876aa8773a63682a2257343bfabe3d67cb006 + serializedSignature: f70f5871e3944d239376044e6a6e408e098401d4838ed01415f3424f734f4a990555208c64cd6e38ce345af13e6ed90c15f1c290113c437f141dfbc7980bca0c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset index 4662703..17b603f 100644 --- a/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset +++ b/Assets/SerializedUdonPrograms/3d024fda64377514ab33fa3baefec378.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5cd95bdb46105f01c69823dc6008108790e01c6003b99bb6014280e6a25c3dd294cbe6e8c7553034bcb5af7deabfd3f7fe59fdbe7466b4b257f2ae2c192f8ad3e00fadb59266677e73ecec68a122c1e0c7b803876536cf26d9305b622976c0f6e1db24b47bf031cfacfe397604ed161cd7e0da1d162bf024fe0c1a5138cec2d931cbc093276c03da1dbabec0d2f07d169e4dc319f66ec26f1aee32aae0a125f68cbd61af59a7d15e80c4323d74ccfb0c94cba881e3043b83ab69620a0749d0a54e382cc09563bab6074c5bf7bd65ef48ac3db8b601cf1cb15da0b94e146b9a2a187d61667399654f59847fafe26da5d057c95b789a55c36faf706ef05fecef13e889fd57f8f790d087bf31ecfbf0e1c3bf0e7ec2c2d875bcad15fa6a791be174ae0ae72427efef17e889fd163ff5bc6d50f0d3c5db4b02ed267eef357edec6db56de3fc0cfbb857e6c9bf9f5eb021dab1fdb46c7f54b423fb6edfcfa0d078f3dbc8d0a3c4679dbc99f19e4e71d8efeb8452b6490b5ce80fdacb1439620c5de64deddca7ab2b043910d55702319a4613360ba87404062d54be4331936c646a556dd65d40b7c4fd2710deed821a238986388bff38640e676e193165cf218faa7c9a3d12977e0ca307b092d3eb5ca46c0c9de3aa82cc3b0bbe0d669b608c743a2b70a6ce7df594824745fe733f340d38c2e7bd063017a08e7bbc4e1021d4f89d334713f0b7d198a75fb10ed26a07d4fa3e5cb7e04df65632e72c8e43cca838caadf0c65969a9e8134c87d82e2ca678d04a11184befa2677c3aa0445fd3ff334f1194333c8e0c435cb698c106486ad6f9425686e4be521e85fc67c092dfb5e64af78fe8272a4e14a067af0a96ddebf043e829a4029968082190655775bf2cad14393182229735610b28b3dc612388d183d05c476031de9c50d9c894a2d5e28549544219cea3364eaa3146141abfaec94cdfb76e83e3763942ba7da8b7292d53cf7894b66d642e3abd0ab90a187d1dd58d58a9e95552cc0f4f102aeadc1fd690a51d83f0714d7606ca4374e23e43211fb13eeb8d678c63542b80e0839d2793953215e29439c52bd9d0b447c8c53dbe7f7ef728ad664bd43ab93239bbc33e4a14e79c70ae8a0d6b30eea480743793a2825af2aad5449b49244add4cbd88f38d847ce1584433275d38ae78f0b5177a1547f9a56ce6958d6aeb35f788e668d7b40f9197264e57af3d06e1217d8bfc12701f7b1dccda3218b4f0edf04ad12a77c2c58f44b810bb80a32d34632d398943bebdb04d0dc86b14e29df3d819164238442724768a2113e2ef9558e532d731c9ca59a69416857ac814bf0151a1f4324f288281dd1222f93756aa7a3e7f95b58ed6f61193f78dae2c591436ac2352a415bbd1076e13822238c11a24de21a49748df6ac2d7690a50c3326245053140d7648ebc352cbb0275cf6fb2dbf7c4505aa13d200d8a9539e26b53cb5b28847b599f75a239e9b4485a68edc74a1a23207967a4605bd0d388ae8b8c7b74ecfd35f9474f9c44597ba2551f9789dcc4251a35d5e4c3faa36957a95e977ab4c1f6b8ab518817d9964836c1c74c99e6082d425998b1093a701b988170975b847af67f7e823f778ecea1efaa450b946a34c93a4dead4034b9cc433ca23be63bd0bbeb0aebec95ce548d00b8eda295f3718469967050244c31b20d7d5ca8b4df24d33e755e6cedc15cf7ef32f742985cabf8b6e58a43ab04b514e97ea6aa3fb8f3a042b0591699d17fae498c2dd96833066e11ceb81b53c7dd16d968a8af0115084ee2fd6ae2ad2a51aeeb10a54d361a4e9d37545327be3632b3c638b316da2a2758a4308a75fa4d52e29ee69cb15de648641bbf0634215a5995f50af7391517b6e05cc73488a5fb5e89fda91df116e9f09eeb74586a19544edca1b2c5db2a5bc477fcb571a9cdbb5849a7cac3867478585425d5b04aaa44515275c9c6c16430c93c64d77d6ac2dd32c2c8c88834dafdfed44fb4bb2c238ea7a35eb8765967f7a8601f53c17eb728d87b65e360ce8e3e95b72698665631c6aa241657911c8695c50a381bae2b56e8159c751dfb65756455ddd9cf7aa34f25eb7d99acf71db216e2c42e538a028e25d96b5e7ec03bc4d027beaff023c91595240f64923c62e27b28f7b750a614c75c8a0cbfd78d6fe7b565a0869af7234f4c25cf43993c4b59cd58453ab14467beb245bd6cd21a08a59ccdde390553a259069ca75c380dbc9ed2ddc35c12bc9a028a272411d2cd3da31b87ab2a1c1ec9709861aa69cf7b89c46eb55b9232195e978f222baaf991b65f25ed6399b4eaf29e8c0fbb5cfb25f6bf6b2acebf9071ae4e3117b3e99b3d76a4e1d10c10b0aee7f39d5b67f8e17b40c5f713550454f1ed4c8ced1298bdbf511d22e56241f6f5a81f49aeab24f9521531bc70604a7100717b05e2e309696187a2f899ab0ebcc9a703871b2a1cbe92e1b0e81231bc548d4c7c30193ee556793eb9dd92733f280caa50f85a86c283a2ed1a5f231dd37326b73a341a57c9f25426cba46f598ecf298bbf792e0c1fc3c0fc748a5bd319641c074439033412548c486667f4c22ff970ec3d88f468398b20e17ab6dae24e619ca9f7686eb2526dd72b24852c3b1916f213513aef2f95f3b72686b944162d409a2a339f9aa413a8d52aaed58a04d5836e17694d85b9406fabae94db90ffdd4826016b6d60e0f264259bce7a4bdfc46548417e9c2f3f9dfc0c11016b5f5b09b631a3118e03bf29aaee1cc3077fc2a18a24eae9994e30c304266eef4c4157c68b3c1f013c312307cf944e788a7bb9570e10fe2340f85c2784d122dcb51c00fc8b5c341c72107f5eb289a3b82da3f9535c2339c97b4a648e885eca39e55141fd63e37c5a9cb2e2e70efbf1a22c312e8990f122c3422ec793e76649ccf166fee7e957b295926300a1d7ca5628467da33346d5933e57e8012482eb810d5ab98d3ac73acf76f7882d2ad57911a498c85429240f2f8281ed813ed81a75c1562fc0f652276cf8a6c55f1492ce8aa58334aa0bd23a01d257c158e2843ed8e2ba608b0ab0bd0e06b6bbfa600be9822d2cc0f646276cf83673c3d394bf40a01e512a8265a4f2b3c51e01d4399da0e2c6664c17b062ba40343151d50658bf2ec0ba05c0be0dc67947f4c116d1055b8500dbbc4ed86a396cf6f7121a21d366692d02640bc158daa3328c686d026c8bc1c076bf0c73b95a01b6a560601b2f436beb10605bd6095b03872d9ddd8591db4d93d4075c581770d50270df05059cc669411b700d0270dfeb042ec6fcae63f377b8955f75a54a80f7079df0a204db0492d5656d492bbfa5d96501b41f83993cc6cab0241512607bab13362cba7a5bd16a03b14f17885d02883fe904d15a59e02a36b75b44e3dc1bd30559a300d9bb60dc55236cdaa21c1360fb59276c2d1c36b77d615a21bca50bc27601c2958b70567b19402364daca004d0264abc138ebc3329c162e09b0ad0503db3d7db075e8822d22c0b6ae13b63a0e9b7357a5c62599b6f9b455006d2308d0ca31096916404be9042dc2413bcd6e172ecf857f8d0058faa2012bc712932100b679d18069dc59a2cd253bd927b3e72d899926fed70d618b99f755705cf1ba32ee52b5899fe3bdb1b975ac99e38cf903fe5922de636e4a5b13b69125e80fac737f96e96d73b73bcdc27bbcb6114a43ee3fbb25b38f52ec5b93497a9e3d6cf52e5a49d01fa17fcaf2e3bfa1ace66a2733ed24175862b9fd926fd811af02e34fe83ff373288cb95f0000 serializedProgramBytesString: - serializedSignature: 635687b9a78de741855609f8f219f94d5d87f4dc94fbc1d998efbc0fcc15c1160502f278f0c9bf1176e9b7b6e2ce76548bdd69088d29cd416f8a7969f352d20e + serializedSignature: 22758ba9762ce9e8b4146bbbdf2b94212cdda45eb9a333a3c161846b70ee1bc3c3b9ee030fe01d32b79af21cc1c854a96039c37455bb33e50faae9d7e0a0d104 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset b/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset index 21f62c9..465ba25 100644 --- a/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset +++ b/Assets/SerializedUdonPrograms/3e3a985dc1775fc47b7a4c8a485aa989.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c94c5f3f0f7422f4a51a40a5111a29400a189a8f422559a082a04124224404c028235d87bef15152b362cd87befbdf7de7bf767799fdd673737cf733b977b6e6f2ebbbc7ffdc0f1b4d9d9efcef6ddd99c7ce6fd17ebe9fd358b4d6323596f369315b1e56c99f7af91deef52ef7fff4add9fca2abcdf12efef42ef594f965bcb97fcbfeeb176dedfe3bdab4a56e57db9822df47e4bc5f3e9acd8fbf778efdb62ef8adf5de4fd29f6de8ad5f73e9ac946b1296c326b1b6b538b8859e2a34a792fc6e3156becfd3d82adf69e160ba57820f9e2515befafe9de934af16ca9a7b47a6f2edb47446ba9f76ca1f74d052bf3642e10121b171533f10fe6ff0c93bfc3e5ef6ede9f26f2dff5e4bf1bcb7fc3f7f97d1ebbbd93bc3b02bcab648ef4fe34f0fefc21af47f9d74d46c9ebd1fe756ccb908ca640c618f93b56fe8e93bfe3bd3f0d19cbb92205fd933ddbddd761e117f27a07ff37b69f947f25b8f618c4d47b1342ef2f916178b2862a4e13e5371706758f95c5df8ddd249f4d0a3d5332f9b3c9e019d7e9aad0f329f2fed5f27a47f97ca9bc7f0db8f6f4c919177c8fed217fa706e5d73c9f16929f2fe52d0b315a26e5abf456e1ec0cd273bafc9d21bf592e655c0baef96f39f84686e7e5aef833a8a77a3e0be8e9b1add73cc836a0c79ea167b3e36932ffd814eca6a5d465ff10e3fd7d06f50e963adc2adfdf4bfece95bf73e2e12d78274978ca96facadf7de2df0dbb4edeeb297f0705d383ed2b75aa00f11ee4ebd7e083d0b7f2375605de9d174a77f5ee7cf9ee0af97c3db8e6bf957119e2dffc9bc1406ea17cb612dc53b28b40bac03456cf8bc1b7bae78be4ef02e47989fc5d883c5f1c8a73a90cef8024ba8eab45d7036ad1753fe4b9d275498abaf602cc61beacf4d3bcd103c006f8fd55209d56f9ef34ac0ac95a9d18efd881e0bbd5e09e92c3c3be2e2477ad94a1caf89d588d1d379a28ef9569eca2572d76a19e6376a19e2bd64b91e78af532e439c2ba8653b27ca3de9dcf92e79b8300d7835862deededb36cdc495ecbb2929533bc4c51bc61fe1b91285bfc9bcb1e2adfd9df97334ea55b85fc55f651190fabcb54792f5979b9c27fb7dec4a00eac19d02bd9f74de5efca5ade4f26a399fc3dc04046739f5393c549de1d01de55e1acf2e32fdee3d7bb49ee07833438583eab2fede3fad0fd06f2fe0da1fb0d91fb8d90fb8d83f76bda1e87005d0e097e133b547e7323b8f6f46c56149271987cef26a03394a79e6f087d572defdf0ce204bfab46be5b13faae51e8bb35c8778787be6b1cfaeef0e077ea7e4d1bee10f9fc163f8e4d5599bcdabf6e766a0ab694ec99caff47b260597ea4fc3d42debf155cf3f4f8c50fbf79572947a5df512139472597d37c5c121d0f65c176fc8121b647876ce56829f354a9db13c0cef9f363e4fbb705e589fb50dec6a0bccd3e91ef57cbfb97c8f76e97f70f0be9a59e6f083d1f07c285cf551aac97f7ef00d7fcf74a24bc35a1e7e1f00e0769039f1f117c2f769d7c7e67e8faae2469b35928cec7ca6fee06d71ebb16b9b5b03bb21676ea79a6d82979183bf51c637754f0bdb4d8a9b85ecfe2e576fd904d9e20e5dc03de55f7f9ef792c68fbe7f9325a2a9b6f1092779c7cff5e700de5de107aaecaf21b818e8af54df17bb11bc13dfebb9605db656ba55eb00e817a9d140af7a4905eca1eee03d7b0bc51e1dd1f0a6f2dce5fc9ae2963af678132b6457ff9fce8682cd9b189acd871e09e4c3b763cb8a7ea2d780fda806cfb0c54f59c2aab4e0469707cc8364e0cd9ec89d1d807e2a1d20dc643bd077556f5e8c99a789c92241ea782789c0cde57cf603ce47355f7d6c83f2d148fd334f13825c578a87afd744d3cce48128f33413c4e07efab67301eaace6e1c927f56281e6719c443b533ced6c4e39c24f13817c4e36cf0be7a06e3a1da30aa2cba125c7b7970cb71a1f7ce6781fa575cc37ca8e46c0cca69d31249f70b82bc129e5f18e229c7c7621785f4b828a4c7c5f2f90341fd13eaa8fb801eea3bf8fcc150fcd78638ad95f12b0fbd776948bf4be5f33521391b8372b61a8cd8d565214ee1e79787385d2e7fd785f45817e27405c2493d5775eb7d400ff51d7cae3885ebc0ab58b00ebc2a24ff6a162fb775dfabe70fc9fba721ef5d130ae79a5038d786e2a9daa1a08c88c9714506ca88b6aaad9e6edb5ce6ffd8cd21bb917d89d806166c536ff0e3d656b67fdb2a7d553ebe2524e7965ae47c9244c77358b06d7e260be6915b59b07d72ab2fb35d4fffbb76aa3fa7dae6b7056d4dc98bdd1692b73128af7db57c5ffec69e66c1f6deb921bdd4f30da1e7e340b8f0b94a836758b07df98cfc7d16096f4de879383cd5be3c3bf4fcbce07bb1e758b07da9aea3b4cd37b260db7ca3cfaec33db5b03b3f2427cc2e547e1bb353f23076ea39c6ee82e07b69b1537328ca9e2f66f1fa53d5c797807b326fb1b5ac26df0f91730e4cd62bb1dbe3efc7545c2f95d777489d1e06d75eda749c9f4447598ed6b44b555eb99305cb71196fb64e13fe15200eaa5d7a25b8a7daa577817b2a9cbbe3711df4837ca6ea8c7b40587781f7d533985eaa3c6f18927f6f281eaadeaa2d1eaa1d04e3a1daa5f769e2717f92783c00c2ba0fbcaf9ec178a8f1d74621f90f86e2f1a0413c54bbf4214d3c1e4e128f4740580f81f7d533180f55ef350ec97f34148f470de2a1daa58f69e2f17892783c01c27a0cbcaf9ec178d40fc97d9205ebf727e57355bf3fc582f57bf87bf55cb523ae0d3e67eb351cae8bc7a58bea4fa6db0e50faa83ef1f3529f47c0b5f74e973393c852f363aa2c7f8105ebe717a48c677c9d73eb07c38ebdc882f57325b80fe56d0ccacb5573b4d5f2fe6b2c58e6df00ee43b9afcaf71e0d5dabb27b7379ff2579ff1a70cdc3fd24f81e53fd9c1be5fb57859e6f0885137eaeda602aafa752ef2add1e0eeab68daa1f54bb55a5cdad719bd98ef9bfdb7e1292ad6cf6e590ec97a56c15cf503ab18d71d93d8e4564af91b25e09c97ec597bdad9ae7be3d24fb8eb8eceea342b2b174bf3318369afe8f85aec3e9ff7a28fd5f97bad645fa0fd3a795b8d6f553547bfb0d16289f6aece74d162f57de04eff2dfb75830ffbee5cbedaecaee06a130de61c132fc9d90dc7743cfdf95bf6f031dde96bfef8598bfe787ddb5b11f6ed7f9a1b4ff2094f67781fb50c78f5930cfabebbb7cb9ddd4fb2aeddf0fe9f1beaf4737b5aee2ee20cf9a74d8508b7eeabb71a1e71b42cfd700fdc173c5b4e6fb0f43e9afbe3f3cf43c2c5fd5576f84e4ab74f88805dbd51f85b885e3736fe8b90a4fb5bf543a7c12b2854f42b6f2290bf4eb6be4df177aaee4df1f7c2ff6190bb4cb23e7d1cf90e7e13c1a8ed7e7a1787d1e8ad717c178d570fe222837217ddf04e9cbcb6e55be63e5c003f23a1365884afb2f99be0cf98ac5f3ef57e05dfefb350b96215ffb727ba8b9f306a130be0df1fb3624f7bbd0f3efe4ef3740876fe4eff72c9877bff7c3ce9be8879ba7c69aaae5f31f43367d17b80f75fc8505cb10752dcb901e6abe5295213f84f4f8c1d76347d947652aad6a2b43c2faa9efc6859e6f083d5765c81dc1e78a69cdf73f85d25f7d7f78e87958be2a43be0cc957e9f0330b96213f87b885e3736fe879b80c51727e0dd9c2af215bf98d05cb1025ffbed0f3701922df8bfdceccca90df91e75819a2e2f547285e7f84e2f567305e359cff0cca4d48dfaf40faf276941a27ca4619a2daec7f317d19f23f16cfbfff03eff2dfbf59b00cf9db979bafe6381a84c2f837c4efdf90dcff42cfff93bfff001dfef17f73180be45d71ed85dd538e7ff6546b68abe5f31ca62d43c47da0638e5afff268e85a9621f96a4d8eb4999c58480fc9365fcd5b3c18e489952109faa9efc6859e6f083d5765c8c6e073c5b4e6fb7aa1f457df1f1e7a1e96afca90bf42f2553aa8754477806bc82d1c9f7b43cfc365884a8786415bc869188c578e5a77745f48fe7da1e7e13244be97a3d627a55986d47c9f6a19a2e2d52414af50deca691a8c570de7a641b9e1f415d7a00ce9a1d6e6999421a1b1879c662c30f620aebd77fab44c224b8d9b48fbcf69ce0265468e5cebd6679caf779fea60d8394adfdb82f272360bc9db1892f70b0be6afcd43f67803b80fe5b660c1fcafae531973c7ca5a15f7962c71cd870ab7150b94bf392dc17dfedb3ac4adb52f63a05a2bd920246fcb909d6d1992db26f4bc8dfcdd82258c3bd6c86c1bfaa66d48e65641dbadb19bcde332c53b807b4e3bf9cde3e0da8b57bff2e0fb6aee1b7d7f2dd01f7ef7300be653951f559cda87e2d43e142795fef705e53395073a84ec538d8f2a791d83b620aed577fcb753c87e3bf9f129b827f89e2ae773b696ef3f01aef96f6779ff86907e9d437a3e19bccfc018b1fa46c541c41596a12a6ee3c035b4f3f0f75b197edfdef0fb1686dfb78cf67d4d7857d7f2fe03b584776f9adfb730fcbebde1f75b197ebf45f07b95076bda308a8face3fae6b178790bc38952c7a9b23997c5f3811c43cad946cab9125c7b79735059e8bd5c162803c435d47bdba09db0e3c17dfedb453e7f2a24b74b48fe937ebc079d189453134e488efa9e1d1792f374e8f93120ee51d7aaabbd718ae3762c584f6de7331b9ce7eb3e78be7c5ff6f173ba06d92979395d43f23686e49d1b9423e68a92c54185d72d94a6dd7c793bfd107a2f2f94a6cad614ebee211bbb12dce7bfdb87d254e939093c07d74cada77986053928793b84b8ee20f5fe22f87e8d7e3b066d4ec9a991db23a4ff3af01dd42ffcbe9c231aa2f2e6959a78411b54726a4b9f643676a994d513c850e1f562896d2ab9162ba7370bb6a97a81fbfc373fc434df9731b49d94d32024af2f0b964f7d4372fb859ef793bf054047b98635a77ffc9e78aeeef1df3e52ce75e0dad36b67555e360ce9352014ee80905e0359b00d33507ebf3614defda1f07e08c951fc1bc419a9673576d78b05cae82107836ff97b1719d881b2a58906321e03b292c950ef3f2eed60700aef7693bf4fd4223b998c2781ac54f453f9fa2983309f06b25209539585cf1884f92c90954a986abfd37306613e2f7ffb00192ff8e93be98314be4ff6ec65f9fb8afcd5ed9393fda59ab24beda57d185c7bf96eb7f949c27bd597c9b7388b6b3577fa867f7fb26a9ba8798ad7e37a4c4965fe32d93339279203f7f9a97ae01df00eec6fa9e76a8e31151dde93e1eca409e77df08e2e9c0f2284b38ffcdd0a84f361308d22ef414cf64cee95661fb1f46d58c5f3630319724c817d62ae47ce10161cffe4d79e0d8f506df1cfe4af9c6f4b794fba6ad77c2a7fbf8c7f57b42ea8438d2e70efbd1a535776f0b57c67284bb429b51e35bcef573d2f06dfea9e2f92bfdf20cfd5bedf6f91e78b43bacab9b39c5d92e83aae165d77a945d7ef91e74ad71f90e7615de51c5cceae49745d538baebbd6a2eb4fc873a5ebcfc8f3b0ae724c3007fa2409eb7a3822ab187c9b4cd75f91e74ad7df90e7615d7f97e10d4ba2eb3d88ac62f06d325dff409e2b5dff449e87755563d7c393e8fa1722ab187c9b4cd7bf91e74ad77f52d4355c668c003aff8bbc2be7a17246c9e7ebc135ff1d199721feed957f63a70665f07f26cbb7b11808db2be3c6cd40f41d1d0f2b96a3d73726cbd09cb1217da57f9b9c3140df31bebee1f06af445f26e405ffeef82901cd5a719976813b1fae01d9dec0621d949eaa198ea0bb562c9eb32f5be5a4bdb58ded7d547bbca7714a3dda53ecf826b1ed7bffdefc62b5f09aa7db726f4ddc3e09aff8e07fcc7fbb2c6cbf98ff18b43b2c681f7a02cf59d1a0bd2c539accfc4900ce93b68f73e88ad4d02b6169a7faa492be9ef2047f9075a0faef9ef6410d7c920dc26e0dffc7702b83741eaa55874c2df99f00ca2fb1e40f7e688ee6a0e6946487769c339d3e5fde7c035ff9d9668d335e1ce02e16e8e84db42be3b3b14ee6cf9bb67285ce94728672688bff253a4c2557e959e05d79ccf23889e7b013d5bb140d93351f5efc236a8c278381846cdfbc9d20086c1af5bcbdf364cdb6f89817928950f850f2f995727abf5a8c9f2ba9c038aa97868f2ba70c306fb53c9e4b5f7df9d914ab924e76d621df1b0b57e5376f2994e9a2fbfefc4823e52928529e782629d9384b96f6298b12e32dd9395252a8c5cffdd5dff48e15d355706dab13973a41d3c0fae55daaab2973f7fa176f9c2d716b4cfb92c689f737d9653d4baaffce06fcede80c1362c985795ff313546bf2f0be655c931679fb88c1cd59f046b77b5fa2bbdd53880f2e5f330b8e67a1fe9b316bffcfd3e29c8e7ef27f3a1a7d2467d0fdbedafcbf0e7b3e018f97ca9cf37be7c9eed31f9b1ede46fd790cc4229f345708dd9a8fa46f9d77a49de57f3c94580f902708fff2e64c1b1cc85beee5365d936f589e07735f3cad877df2489ab1a8f547d5d9d7f37159762c07907796f5188f3223fcc69d785be2d49fc36d60dbc03db50eab99a9fb83a745f96d539a52c68cfa5f2773160bb3851f71cd55e0ff92ecc91be0ba7cd0ebda7fc8abdc482712a0bdecf5902ee43f98f87e42bdf122a3e3b86e42adf5b2f836bccce547ddc03e8ac6b8ff60cb14c96af94afaede49c255ed996580abf46b385de5ddfe49def926a85f4d7dbb3cfe6ead6d0fe553703db8e6bfe52cd8f650fbd3d5b84903dfad62a00c01632a3155c626f37918d61bfa080bb71374e594aac33a69eeb563c9cb5e954eb22c8d299f87c9c66bd7483d95cfbb57c0b5971e3393ad7f92eb5366aaf548e1b8039f6e31357fa4d24cae0599a9d691ca3e554ced29937ed47294afb797c1351627f50df471a66c63007847970f0602fd3c99b3427ace3a98d51ec7daec52f9315c0fae95bed02e5726da5e42b8d0f7e0a050b8edc02fbfaf7c68a632f6aae4431f85b5c54bf9125a0faef9ef41a17849df3139d0276238dc4341b8b5f56daa43e156cbdfc342e14a7f5039d03f9b9cf38aed049ef1df352c5897cbfc111b22afd518daabe05ac589ff1e11fafe8824f62afd48e61c19d74bfcdbb3b7d9aabd3a18dc076959f39edac322db5db1a17878b15d58adfd811a0ecaa7d86be09aff1e1dd2e3685f8fbd6684be3f56bef73ab8c6bee7bf470106474999e70665c67605cf617ff02816cfab2a7d770ba64b6c1890afee0d07f754186acccce354a8f6cc876df43886976bc9cae591f277540a36017cde887f7b3ce6ac0dd9c4f12196ea3db5767f740a3631a6769b8829dfd1322f68eb3d594ece5576abca62e5eb29ddb2985f6beae2a49c659b35363e09e714ebd9981cd74a56e747d52f61ae54f9b57a185c7b2cf74ed6670ddbe44940e7503b23e1dd53c0bb13f4efc6d4d895f241b51e5cf3df53e332c4bff92ff491a5fa1ec0974c8ef47395738694f906b8863c94bf8d8de0dae3b16f59e87db5f645f9977a135c83f7639382dfe528ff1a6ff94c73941f99c9219d1b001953923c9b9ae4d91e499e4d4bf26c3ad38e1de5281f57fc1de5037c2678c67f953fab17c13596ff67c9df3d812efc57f9ac7a155c633254bf48f939db2bfe4ea16acf0df0d3649eecefc7e604758663624caee1893a2616a97d733ee0a8c656c27940f6577294bfadf5e09aff2a3f5d6f806bfebd5a9faef659aab19324f3eeb17d59ca634f4cf216e54893d03d5946e7285f60af806b8fff7cd556d7f529d4bdf680cdbcda754faaabf26903748d295fee1dc0bdf966e1c454789d814c3506b935b8375cdeeb02ee15ca7be3d20b3b614e45f9597b165c7bec17ac92d7ca8fdaf3e01ac841bf7f20180eec37c6d498cf2ef237eada987e7e180b65ff3db690c5f33bd7612d0b9607ea5ad5a76a9ce152161c3bb954cabd2924efb2b8eeea5bb53f2956c482ed02f57c0390a17b1ec59741325b92e33b35f9e1b138cba16bcd64277d26fb5331382696eeda95cb258b6bc0b5970e4572dd634ccd3fc9fd8e5a9bff12c80cb5e172d685e4aff3e517abf24c8eb9a93d6bb5e7a9063131773a8e15b34256cef2c5e6453e1296ea5135eacbda0fa91173cb625725e3a7d5f060abd86aefd362dd493133c5393455acc0cb23ba9362da8b7eaa0a7da4f8bbd07ba354087d372721883b1382e0ca9579ff1783636e2abdfb63c52939fca09b52ef496f36d1fbe55fcd677dd95cefffa094595eb0656c857735c3fbbb5cc89befa99df8666d51e247e284bf99e6c9f44fec59eadd5140cbbdeb32a1e174f1f74aa169b1d07ebc77af4a9c1fb48c95b011deef2a115a62dc2bbc7febc29c2191e975d41fdc83ddf78f0752c934ca8b0dd73e5fe49fff4b91ba48118ebee1bb321fd6cf172b278e4f4889ff63e817327ce1c87829a3af40160bdcebc7f2c59afe690904a3c73131867afbf6790f64fd93c6454f862777471183780adff9c3031b965e7462f706c1a815b07cb114a6532d514b0696cbcb13b3e651a2d0a041fd3e5cd130fe980ebf587e333d8bf8fdf74ac57bd113a0a1a8fc820920860e6678ff58e5fd2913e5db724f247f3cd5fb53e809e2ca26a44f1f2eac91409c5881d6a6260639470759ac6d9a5127368e1d15971c73e39a58c431e78bd654bb24c68885259a4bf5649b496597b76f3868caf85dce68ffc6a4fe8376eeb3d3a50df4e9d354a44f3aa16229544f97424db39d0d6a2ff793a54fb39a78c5d387ffa767d81cb1f1da74c008d6d7116c563736ce754fcfc6f9844caf10433dbfcd93da60320d30820d7404c568d1cc2c129ce269b89f6c2da6c7b045ca0c5b0a86ed1362978a0e18c5861a8a7d38c5563ab59a84d4e21a21821b61825b1b0a6e8c09dec25070139d416d96ed2cc99f2d17520abd77a39b131f83ec112ed6f4f6d406c993b5ab805953535dda70845b69b50a274e1b3c719a6192db9a4a6e8e496e672a79339d41091f21d96faba75747f2b2a66dca75640796aca91db586dc5c474f8c94ed4d4a2f710849fd6b84f7ed628fc34a312eb0c2fb5e37e4949c68c7944bfb4e82662ed30d8445d30823dc4267f91cfbd658b2878dbf036efc2d75c279889d5329a63be1825b6182bb180a6e8d1504b9a605c11698e46d34926351246fa9cb242deba688e9eb7525a217317c2df21609b6a6cf12db252d60b0f031f36fa34b15ceaeab5ea570b26c8727cb56ba641186bb471693451d751e3d51b6f7b46c955a23a29b48933609d14a163896226db102a97b060aa4765826cc33cddeed31c93b984aeea0b323514e9566a50e9cce46b1099e8a7169cbc528380fa7528cd1967a754cb17717fe7bb427b5422477bc36529292db1d5ff8bcb5269d195a24f410e6d78b31429d3173ed88a57b4fd374ef8449ee652a796b9d4589fa29bb0398fea860595aa5135f86de25e556693ec3462793eb80a57a675dda70827d30b5c2c9938f274f174c78df0c08cfc5acaa9fa9556d83492e3095bcadce5e45ab674e164bc0119ef29542a67f7fa6b0927049a1de4a6ebdfd6b6204c685455ba4734229162d5cbed4aabbd828bd42bc171306a2cf150345ae300d11cb23dbe9ec81a71a5fe5da2414f9013a331e889b44574cf8e00c08df1eb3e49d4c2db91b267988a9e4ee98e49d4d25e7e924f3762c5ff19ad8400c4bee864bde412799f7e2f83a26935edc8e98e05d0d05f7c004ef6628b827267898a1e05e98e0e186827b630637c2d4e0f23195471aaadc072b3446a522384981d117cb22a34db3483f8cf2180de548a3060598e4b1a6e9d71f933cce54f2004cf278531a037592799b8b6f01486c733d302c4a9b6b10a6f60453208331c9134d25ef84499e642a79082679b2a9e49d7592f9d0015fbf6f3a743014b390a95a0b89d62adf052b99f6302c9976c5b49e9601ad77c3784fcf00ef613ae17c6e6946cdcb71e1ff79ff25086f8e0b1f8e693e53a379d3889a8fc00c7c96c6c02395522331267b6a9854ebd44ec26414267cb646f8a911858fc684efa511be36a2f0311ae1f962f8750dcbee2c917e71f2582f663c3438479f382ea556a74ef37e17092df87dae45ed8b9a93f736e7d4f001bd4d31ce3a9aa5bec49a3e167c2b4e53d17ed3f757f99c5f9e653a63bddfb13a83e7eb21f87e20edcabb79cc9fc2e0e12f93abee968bd4e4f74bbddf843cd108cf13e3b0126e5f4d09178b58c28dd7653831b6beac4e33dc68ef6fbeb4bb52fc7ba54cde1922ecf8124493acc47744451b9c9e2f8cb65f0a469b09ed3173dc1d2b7f0b35e56fd758b4f27702267c8146787944e113b1da74a1a6368dd45c9c846591224d166111b3c8642cff17ebf27f0b91ffe7793dd47922218b84a9cd139b492a44191625ef4fc1c25ea40bbb25087b9ec88e5535e5e624a94b94d0a7ea42e7b57189a61aeac3aba1c5f1723f1ccede78387b60b12cd5c5722b19cbbede9f9535333e705d73fabca7619aeca7d3a47380f70891b58bbcd69797358456cbe4df5560662ab0fe3a8266d3b1b45882a545595a69314357218829d16cce75a7b2b7425fac73674ae151e34e6891be8ce9a7bb936e4140c8cdc46c67b9ce765a01db29cf88edcec2c22fd785bf45c076797ba944ee81e25aa46ba57b62f5c7fe9afaa34fbd68f5c76cac94afc84029bf17a679a546f3b511359fa313ce3172b743b50e0a24e13d1713bc4297e6bc5f38d933c75c506e72fb2e14add41291dab96226a8cafb2d147fabdc9debbdbbc8fbbb5cb664734569c7dbb23dc5374bbc7f978bbccff376ae90bec893b1c20bbc4a7ce75bd402c637552e8914cbbdb1b459a9499b3722a6cd3e3ae13c7772b74e4623befbea24f3f60edf406ed4de998725fb6a5db2b716595dbf05887748e6c80e549424998f6970a04e838e81c2a6764df85b15c20ca3e854a8d38957910731a48ae41eaea257910bb0b81f82d39f1a327f15d3d1351dc528315da8d1205fac2ecae66609b8212cbdcd12876a12265facc349dc16914a68d26398ff5f2364eca19ae9f75da4120056f7176126b14667126d407628aee91e8e97edc555066d80624c8fc371d3f4f5582c6a81226914e96bb008d3e0089d065b6a494c967d96f4b528c1b43852a705ecb3f1d04abc544f3fecc558d847e9c2de8c256b874509b7142bfe8ec68abf63d22afef6c3e277ac2e7ead6a29fe56451e0f5ba20b9f177ec7e9e2c94b93e343c54238b06a3cb0320cea0918d413d382ba14837a920e6a7301758628ae4a64c34d218e82721986f2640ce529e9a35cae0b8cb7e24e6589adb85f1a456bc59563fc4ec3f8295eb9c21473d9eede2f2ffca3f0db1f8bd2e99a280d6d1c2d4a1598f03334c2e747145ea913cefb52dc499b695faa0a137e9646789388c2576058ced66039312296953ae1bc88e6fecd8c9aec076092cf3595bc0a03729e0e489368405663c2cfd708af6a164df881989d5c9001233c48233c5facc4a65d6c3f53768b578bb67d892853a0ccf864156f60267b9bb790fd61db15428fe46d69eecd2eb5ad68dc879cbfc89e4e57aca17c30564e5fac533f42517c884e30378f4b52115c8d0b3e542798e780b59a1c30bb79b41c70984e387fff52965801e78bd5fee96d18e77eda1ad667fe7fbdbdff34757792cdd4d53a3d7933e8728d9ea219b4cefb9323cced0a616ebd93989b6e6e37bac145696eadc14a9e2b35254f4ec492e7704cf8551ae1f5220a3f02cb40dc5b5e4243874fb9e9e8e67ac5631f2fcfe4ca3e6fb1c791ff9b8f0772b2b00fc21b482bbc7ff7122380bd448f68996874e6b2789f8d4bec2b242e1205e352f19ddf402d150dac833c4d0f6143bcdf02ef779b48b9fb482c9f5ca3b33f9e4fae3533f8a330cceb7598e7670473fa3073bde6c562595be586baf2b96c85988e2a14e1e4caefcb85dc12a145a5f77fb4e4385a47879789d769cac4bd5b452b138fd108cf17db74b2b90976b8d841c63b08d187b5aed75539daaaf806a6df029b3c74ac723d56972c9cdc8d3a85c24972039e24c7e992446c6ecae636b370f5102d516e4a39513630fd16b3dac2c792e5785db2f06afce6549265199e2c276082f9c9e6e149d08b74154d12e1276279fc564d1eefda3a5a1e3f09d3fc368de68d226a7e32a6f9468de6df44d4fc14ac62b85d5731309dea490ad65331d5efd0a87eeb16d1543f0d137ea74678cbb6d1849fae13ce1b3d7731f3bedc1998f0bb3320fc4c4cf83d19107e964e38ef85de9b4adebf08177c366687f7a5223889099e8359c9fd1a2bf925a2959cab13cedf7f8021edb80799513bee3c0cd343baecca977a456dc7f1dacec626f3f918ea8731d48f98a1be0043fda80ef5828ca176a7d97c2196b51ed364adc61da365ad8bb062ecf10c14631763c29fc880f04bb032f249c332722d66914f1996919762389ed6e0d0ee684982e332cc4a9ed115c011ade4729d70de457836152449ba08eb30c1cf190abe0263fd7c064cef4a9d70de0e7d2115ad93b441afc212f1454d22ded3295a225e8d097f4923fcc8ada309bf0613feb246f8c4ced1845f8b097f4523bc5d9768c2d76396f26a062ce53a4cf86b19107ebd4e38ef5fbf9e8a196ec005dfa013cc0b367ed64d429dcc77b746ad93ab0293d0d11a3ed16acf1bb1b8bca98b0b7f901b08354a58376161bda50b0bae625998307592fe4a920d98166febb480ab7996caf689bfaa337d0d6ec6347847a7415306d7b2ec292ca32a62d57a0b5642bcab2b7eb6895642dc8a65e2f73290896fc3347f5fa3f9d51135df8869fe410634bf1dd3fc438de6f5b78da6f91d98e61f6540f33b31fbfc58679fdcb9c35c5996ede3950d7365393444f60bfc7bb3c56f2fb6abf7f7685066f94b56cbe4dae672efde6251beac120399c5e26e51c432ed2e4cff4f74faf35df1718d94d79edc9a380d91f1d94733bde097d9e13ece52f14665cdaaede5e26e91283dfc41d9d5e2cb2871ba5b17276e209fd63c08753c3ff3fe346cc4fcff7afbff45eb7bde8319d9e71a23ab1fd1c8eec5847fa111de20a2f0fb30e15f6a84378c28fc7eccbcbed29957d794b287df75cef77efbcb7b7e5639880d90ef0ef47ea318cc0398c17c8d19cc37c606f32016e6b75898df1987f91096d4df67a0247c58279c3721f94961264dc84730523f62a47ee2a41a4052d1383d8a71fa39039c1ed309e7ebb0f8898a46ebb01ed749e6b5e8af2cb116fd6068b45af4094ceddf4cd57e1293fcbba9e4a730c97f984a7e1a93fca7a9e4677492f91a667ec09ed16ea06731c9ff3395fc1c46e36f531acfeb24f3dece3fa9142a499cd9bc80e5957f3579e5815da3e5951731adff33d4fa254c309fe83311fc328623164bc4d169b768385ed109e715594e4cd308e04d8c69a2fdb75a78ce885291bf8a45a39e261ae511a3f11a26bcbe46f8ba88c25fc752b68161cabe8169dd50a3f5b111b57e13d3ba91a1d66fe904f31ab871ccbc067e1b13de2403c2dfc18cbda9ced8d5266ceef78f3b13500fd21f3079170bbf992e7cb8116c1e9b09269cf81ec903bcbffd2b9e11a3edec780f83dc3c0390dfc722b9992e926aa77981dcd459c932b1d3ed034c87cd753a7446414f153af9be82fc5eb25ffa2d179faa3343a368f62196e55b68b2fc27c3a265f98f74c2795ddf326658d77fac93cc77c6b54aa53049e2abf3134c706b43c19f6282b73014fc1996825b6a52b0ff886829f83966b86d7486db4e5caacdfa935870ab3e7f8d1b6da1f79cef64f2b7ee4731d62fb0a86ea5896a59c4a87e8925505bc304fa0a63d84ec7b099c8fc7c0979255b2178a5e386eb6b5d985b89179125f01d62e9ec04fc068b5b475ddcfceda353bcf8c4ad645a8d454489dfb7ba707925d049173fbe1770eb58da7b01bfc36076c66076490be6f718ccdc5461f2c5a9bc7e8a662c3f6030b7c1606e9b3ecc1f75817198db6130bba605f3270ce6f678ae0bc21c2d2afe28207fc64076c340764f1fe42f18c83c0ce40e6981fc1503b963aa56193fdf240accdf30983d30983dd387f93b06b31706b3775a30ffc060e6eb6036d7c0e46dede55e93300aca3f31947d30947dd347f9972e30de98efa769cc6b574b2769ccff0f4ba7022c9dfaa7954e7f63e93440974e2d6ad2693af38fc2e3936c23e5045689aebd9024b5fec1526b20965a83d24fad7fb1880ec6baa025a2d9c63df6ad103e94968bfaa6920df75e9c2af27994c8fe8785bf932efc0e2cde33aa5d8ff41cf3b018a2d1109d46d05950a1587f522ae63ca12128ff6ce9f71f63984e3beb74da8a61fd47d85288eb1745931c4c93a151ed25be5f324af8f5b0f07749d75ee27aa4672ff5318d76d56904bd5e568ad65a95916534c042df2dd910926f19d01a78acd3a95a1aeac217078818f69a1ae904f3bede704d5fef9171d1fa7a8d316a23b06a38e8be24ee212e0aab26ba50f980d3c898b953fca6589446e9a2d41a64ccb8198cf74c52791af1175944895e334c83d1b5159ca968925ee66c8ee934a6b6e22aaecb28515016b27486d736c3c21f9b6a7185eb911e91cd318dc661cdf9444d66c8fd9251c26d81853bbeb62a0c0f3f3d022db16cb8bb3e1b0e8b920d5b61d19ca08ba6bf0631d87f8f5a02b7c60aca89ba79ac89d10aca2d74c2f9a4cd24c3499b2db144989c81b2b00d86648a06c9b08848b6c2844fd508bf29a2f0b698f9ec916ac5948e09b5c3a2344d13a5072246a93d267cba46f837118577c084cfd008ef39299af08e5862ccc4668ec29ee3726b7cc7e5a6e93cb31316c1599a08ce8f18c1ad31e17b6a84af8d28bc33466f36d620494e2fbaefbd2e58f4f6d2352123462f17133e4723fc8788c2b7c1d8cdd5b16b246a91b1a222f4cfcc8c42695b2cacbd6bebbf04c34caf32de0ec3b88f06e3a8a9d13076c5a2b62f36061cf7b3079d4e4789d0f65884e66922d4728f6811ea8645687eb2b4e2cb057823ba5ccc11a7dfd7ec8e855e88b76da0af50eebb3b5ac5948785b8002b81e32126869c9e85ee8025e8424d825e372d5a82ee8845b008eb9fc4a3c38794f832f999debd896c08531b9fa244ae07167eb12efccd01e01535993e3d63ea8985bc28cac0051fb2e0b3873e8328e1f7c292b54493ac5da7474bd6de58e41663394535db60c113253af958744a75d199112d3a7d30e1fb69843f1351785f8cd512bc90e69efafddd24e9d1ea878559964a2f2d1de7b50518c2a5baa6d6cc6808fb63d15986cd56f8037ef0c0047f8364f412640016f6727ca6c4cfc755a0179f5e1932100bbb3cfae0673a631a83b0f0f7c74c376846ca8ca384391833a40a8d214d9d1dcd9076c22254a98b505b0697fbe482c53ddce1545168b86a48c486d4104c972aac2bdc93a9133f4ad30e75670cef0a5d573822dea1589456eaa2c40fb21f296610f9244d59cdb6b778913784256e695ee6ddf70f44894f464501b00b06e0000d80172202d8151bf559a51df5a9de2dcaa8cf6e98e6ab359affb15734cd87619a1f9881f1aae198f08332207c0426fce00c081f89313f44c3bc684e34e6a3b0ec722856bcc2d2c89f5d8bba166a3416a1c334117a256284c660c2ab35c23f89287c2c267c8d4678a7b9d1848fc3841fae6b0146143e1e4be72374e9dc2494cec5919769ed8e45e6484d64daed1d2d3213b0c81ca58b0c9c5fe1ebe7b9d1a6b75c6a2216eed1ba7075f32b89e1a7d7619ea4d1243fd7bb8c65f3bc9f99cc3fd6b6c00b3dbdf37e8ea989471c5cfe363c1e895ead5309ed584f5e632e8e439bba2f637fefc3d807de9f76debffbefcbb0e3878f8be98f004a254ccccbe764cc5a8ec7ac74b827d74f834a2f9c5122dbf9ce55a2d8c6142cdc13b0229dc7d1dfeb520a463ba28439150bf344ac21094ffaca4d333fee81857a1216ea34a6dcb74d64fed9bb5591f94ec3423d194b57befc658968351e209cc6a517dbe958917a8aa6483d78df6845ea0c4cf8a9ba3a39a2f09918b1d374c4dab0c44686dfede1eefbf811827ec95514b9e3310b8be4e9ba4a695eb448ee8945f20ccc18e366902b0a141ee1a8519a8d45e94c4d9486468cd25e3ae17c16e9ac5892a3b2c301f4c0039883697fb646fb23236a3f174b90737409c227dc552d3dbc9645865112686f4c8b73755a706f09e136436ddaa4d782d807437f9e06fddef3a3a1df17137ebe46785944e1f330e117e872716134e1f331e1176a845747145e8809bf4823fcef88c21760c22fd68daa2c88267c2166c59760835673036b89668bd913fd399ffb442cf28a305dd662ed1b7db851c22cc6e05eaa81dbbc281adc453ae17c24f5b298a12388129d643ec37479cc7cd3ef628cc93a0d931f223229c5845fa1113e55872589f0fd74c27943edca98e19ed9253ac97c40feaa98d952dd322c25afce404a2ec5785c63ca631926f95a53c9cb759239c0f5a9904ee223b81c4bc2eb0c93707f8cc5f5a62c2a30c937984aaec424df682ab90ac37c9321e6153ac1dcefd586540427f17bb512b3b89b0d2dee004cf02d86825761a977ab69eaadd68d3f6deb5dc6f871bfd93f4bcfe4a0b0e42354b7e9d2403b86b4518c21edc8f063cdcc8e33d3a7c481ba34e629717b2ac6c37546041f8419cf1da6c673305697dd9981baec104cf85d19107e28c6e46e532687e932149f9d8c2da9930c9578e0a31afecc5cd6ba27e5ac75afc85af949b25666f4c53259b52eddb99ddc974a26abc6937d0d26f87e43c18763821f30147c0496051e34cd024762921f32957c1426f96153c94763921f31957c0c568e3d9a8172ec584cedc74cd53e4e279997638fa76277f7e2d5d1f13ac1bc8ff7442a829338173d0103fd6406409f88e178ca10c74958fe7eda307f9f8c717ec690f32918e76733c0f9540cc77386384ec3043f6f28f8748cf30b869ccfc038bf9801ce6762385e32c4711626f86543c167639c5f31e47c0ec6f9d50c703e17c3f19a218ef3b092ff75d392ff7c8cc71b19e07101c6e34d431e176282df32147c1186e3ed0ce0b81813fe4e06845fa213cec7c6df4d05499241f4b598edbd676a7b97623cdecf008fcb3013f9c0d0442ec7047f6828781d86e3a30ce0b80213fe7106845f89d9de2786b67715a6f5a719d0fa6a4cf86719107e0d26fcf30c08bf1613fe450684afd78d6974f52e63fbb1ba18d3d09d6495d9118d2f53b1d22b7062d761e6ff95a1f95f8fa5f3d71948e71bb0f1eb6f0cc7af6fc4c636bf351cdbbc0913fc9da1e00d5815f7bd6915773326f90753c9b760927f34957c2b26f92753c9b761f6fc7306ec7923a6f62fa66adf8ea9fd6b06d4be0353fb3753b5efc446317e371cc5b80beb9cfd61d839bb1b03fd670640df83e1f8cb10c7bd5883f07f860dc2fb30ce7f1b72be1fe3fc4f06383f80e1f8d710c78398e0ff0c053f84716639669c1fc638c772cc393f82e1c84945eb24381ec504d73314fc18c6b9be21e7c731ce0d32c0f9090c4743431c4f625a37ca80d64f61c21b6740f8d35883b7492a489234789fd109e67d8fa6a908be0217fc2ca67133438d9fc304373714fc3cd62ed82cc7b05df00226797353c92f6246d7220346f712a6764b53b55fc624b73295fc0a26b9b5a9e45731bbdbc2d0ee5ec3046f6928f8758c451b53166f6066b75506ccee4d4c78db0c087f0b63d2ce94c9db3ac97ca15efb549231c942bd77b06674875404276946bf8b8d47744c457092f188f730c89d4c21bf8f49deda54f207582eec6c980b3fc4ccb94b06ccf923acface35acbe3fc6706c6388e313ac71b7ad61e3ee534ce3ed0c35fe0c13dcd550f0e7188aed0d517c8169dccd50e32f315bee9e015bfe0a139e9701e15f6305c70ea605c73758b9bfa361b9ff2d56eef7302cf7bfc3cafd9e86e5fef718e45ea6907fc024f73695fc239657f20df3ca4f9839f7c98039ff8c95fb7d0dcbfd5f301cfd0c71fc8a1576058685dd6f98c6fd0d35fe1d133cc050f01f188a818628fec4341e64a8f15f982d0fce802dff0f13be530684ff8d151c434c0b8e7fb0727f67c372ff5facdc1f6a58eeff8795fbbb1896fb7cd4560b795753c8314cf26ea692737492791618669857eae90473731e9e0173aeaf13cecbfd1186e57e030cc748431c0d7582790c471916768d308d471b6adc18133cc65070130cc55843144d318dc7196adc0ccb7ee34db35f734cf2eea69237c3f2df840ce4bfcd31d2130d49b7c0044f3214dc12c3313903385a61c2a76440786bcc44a69a9ac8163ac9bceadec3b0eade52279857ddd30cabee363ac15c91e98655f75698ddcd30b4bbb6586137d3b0b06b8799c52c53b3688fa9bca7a1ca1db06c323b03d9a423267caf0c08ef84c19e630a7b6b4cedb91950bbb34e389ff7dedb70debb8b4e7067ef729f5404df800bcec570ec9b011cdb60a938cf3415b7c5d49e9f01b5b7c3d42e3455bb2ba6f6820ca8bd3d66230b0d6da41bc6a3c89447778c47710678e461c2176540f80e18931253263b626a2fce80da3d30e1a51910de1313be5f0684f7c2842fc980f0de98f0b20c08cfc74c65a9a9a9f4c1242f3395dc176b502e376c50f6c31a94e5860dca029de06dbdcbfd53119c64c9787f4c7085a1e00158b3afd2b0d937106b5b5719b6ad0761f6b6c2d4de06631970650632e04e98f00332207c08c6649529939db1dee26ac3dee2502c0f1e68980777c1041f642878574cf0c1868277c3041f6228781826f85043c1c331c187190a1e81995bb5a1b98dc472c81ad31c324a2799bb123b3c159593b8121b8db138c290c5188cc591a62cc6622c8e3264310e53f9685395c763928f3195bc3b26f95853c91330c9c7994a9e88493ede54f224cc9a4f30b4e6c998ca279aaa3c05b3e6930cad792aa6f2c9a62aef81513ec590f2349d607e78cda939e687d74cc7849f9601e133b0543cdd301567625a9f9101ad67610979a66142ee89697d5606b49e8db13edb90f55e188e730c71ccc1709c9b011c73b17c7e9e693edf1be371be218f7d7482b9dbfb0b52119ce49cf97d31d3b8d0d034e661902f32853c1f937cb1a9e442ac737c8961e778012678ada1e085188b4b4d5914612a5f66a8723166ca971b9af2228cc53a53162598ca5718aabc18137ca5a1e0522c5b5f6598adf7c3205f6d0a79096670d7181a5c1926f85a43c14b31c1eb0d052fc3205f670a793956415d6f5841956315f60d19a8b0f7c7acf946436baec070dc6488a3124bc10da6295885a97cb3a1ca2b306bbec5d09a5762a6716b064ce300cc346e33348d5518e78d869c5763386ecf008e0331adef30d4fa204ceb3b33a0f5c15822de65988887605adf9d01ad0fc558df63c8fa304ceb7b33a07535c6fa3e43d66bb0f2e37ec3f2e3704cf00386828fc0043f6828f848acf47fc8b4f43f0a93fcb0a9e4a331c98f984a3e0693fca8a9e46331c98f994a3e0ecbdb8f1be6ede331959f3055f904acd4783203a5c68998da4f99aa7d1246fa6943d227eb04f303109fc9c9cc0188a7609a3f6ba8f9a998e6cf6548f3d3b03ae079c33ae074ac447dc1b0443d43275838c6cec980636cccb85f3235eeb330c92f9b4a3e5b27999fb1f64a8e7ab9162049ce583b071b9678d57058e25ccc3e5e33b48ff330c1af1b0a3e1fcbe46f1866f20b308b7e3303167d2196c1df32cce0176106fdb6a9415f8c497ec754f22558c5f86e062ac6b598e1bd67687897623cde37e57119a6f207862a5f8ea9fca1a9caeb30c91f994abe0283f1718ee640d213c5e5343692cd6445c27fb1efeb78a9f8b77fdc3cf775cc0fbaf67d1d8faf7973b4380498bf318d158ba7feb1c015acb7380678ba785ae4495c21bc1373b9f16ff881f2eaf8d32236c6fbcaf7875c29bf8d7b34f67d2b970a6fc8c127be7e055e0ce7258905f7a3bcc2fb7725087d863c70dd9719943acbfbaa34e231ec5762d43fd1511f52437dbac761021be13daaf41ecc6455c2c774a9f8f53d4b73edc67bfff23fe77a85f5851ea4c3cfb82feae58cfb8a2ef4e21a2546576131fa5417a362623baa6253857fed1269273c686e13855edc79ec52b79964b4d249f9ab314e9fe938cdacb3fc969c9039876b300e9feb380c67d8e969307dfc782d67e5220f700fec65c2e77aa98c4fed1232971faec5e2f7852e7ea3d1f8259e0de7c772acb0f2c4a7e118c083d6530d214a3cd763f1fc5217cf3984f63cd638dfe3393f0a91eb30225fe9884c8f6cd9a3d9fedea785b2dc5f9db26567d3faafc7187cad63c03b4cfa7a7ab8973a15a2d6f7092c14e5544582a6b066c79ec4654589c90d584cbed1c56470282690ae795cf4d2a2c4e6462c36df62a5ae5e33688f13453eadf44a9ac5c24e92c527b578a66f773761f1fb4e17bf71114addf4522fbaf428b1dd80c5f67b5d6c7789609b7e1b2ad594cc741be9662c5e3fa492e760996e9ee7f4d2a2c4e6162c363fea62b35b4a796eb847b448b6fb976724cfc59f4489dbad58dc7ed2c56dd750dc82f91cc68fe71b5e73af6693bda725debfb198066564ae24b90d8bd9cfba986d1f8a59d8ee4a647e9a28f27b89f7efc5194a818d989ebfe8f49c9092758d15e70115cab6982ad7a778ff8eb73deab294bf1d8bf3afba38e3879a27b6b0543a2d93a30bc94a83281adf8169fc9b4ee3a1917b034aef1296784a145e0fe9ce948a12ab3bb158fdae8bd5c824e5b41f8b31a26c5e2a2c2fbd1e7a3cdf652ae5eec2e2f8872e8e03d094e3e3570bbc97545c278a5eca68a1afae46ca749d7a37168f3f75f11865504ed465c9700f16cbbf74b1ec9372bf636cadeda14c94e5f762daff4fa77dbf08edb9a8faa75b22dc87c5e0ef546290ace5163506e9e6f7fbb118fc934a3e492cd3f03e7b6aa55bb2118af4f3c903582cffd5c572444aa5c174efe50542db42613775db327d108be17fa9f48d925962b4be51a6c74d1fc2e2c5ea69e2b573ca255cb458e1a9954e9c1ec6e214d3c529b55189da725c366ba547b0f8e5e8e2172e53a28c03e22d08fa19a047b158d6d3c532dc13a1680da61eeb746b8bc7b038d7d7c579761dc7999ac6e3188d063a1a6352ac3bc78bf6b35df5e713584c1bea623a3aa5126b12e3a7f4f27a53cd5be1a31ed9aa459fc4e2d94817cf700f2f5cc78c14314d4c3dd86b4be57e666b9fa7b038364ea5f6498c63bc4fc4f5e4ef71ebe2f355f8dc5c6ab14b6ffcf1692c7e4d74f11b5a4bfcfc7642fc83d46b9dcca6da3358ac9aea623537c39689e5bfa8ef6796c9b31893663a266313ca5fbf94e4e561f45e3efc3ad9934c95c0cf61716dae8b6bff505c478a52d59f3d56adaa19debd64ba26af31e3df4589c5f3582c36d3c5228f61a34b336ace9e87a381ea44fa4c69fb02a6ede6a9d406987dd53697919e65a51bc717b138b6d0c5313ca391d886f12d6da1b64597ddd6d94b58cc5aea62d695e9d79ca9d51b15de8bc94666d2d5f2654ccb56e9f1cf448b3a33317b058b59eb54728fbecd984adb389b3ddd57b1386e915a09a1ef01d45e42a4d3fa4f371d5fc3e2b8a52e8ee1b52d89a5205fadc9d362917882f56f28ead0d7b198b4d1c5a46f4a3199ec7d30394bfabf81e9bf954efff06833d606486d543c33fdab37b118b4d5c5605c4a6542783d8e3df3b66f61b16d974a7acd4c327a19757660669ae9f5361683f6a9e498e416d7970d8c1083f83751f47f07d3bf834eff3e687b533f9b99b939cc46deffb15833ef9fa3453cf94a90a9e20b7e55c9f2b7f71e09fdfcf648ef9a55a2bd032b4ae3f779d84b3d7db8e5cea8590fda93e5d622a1633dff887bf15ff718875a25bbedb145a1f4f5bf2c1392e333207c553eb7cf6522ddf9b84e6f8f57a9f86abe972673bdff6b8b856e652cbfab8b5ded71dac7fb9fbfc5f7382c14ed23de7658e0594623192325cb23dd8d93ded462da89a7ea8e325573f2bbf338f648d39a6ad762eb7afec0a0ce86da269085ed129deebe80c972ed86c824f364837ca42cf27907b0a8f69060fed485d44b0850a354b58a8385aa4e5c7b615e7e63ae4256526f4c62ac51839c3e3c053a53626a2e30f19cbf8415cb92b84aacbd287302d496c3e3a0ba5082e25b30d500025f685fcefcc19f49de2745a9c4ce0258efec1287954b09ab95b0aa7899b54c549ebca6e222c7cbbad30564558de3c8b6a144d649209bc7fac82e4310dd4c2f942239d8384e946545a292a9f084f6730264758f38c86de94bb429deebb3444baad87b75a2689b973b01eadc797150dbd969717d9d00f9c7b671905d29416e1900e9cf040df77a0145a2fd3749c02b1495478513e0168f8b83db9e125c8b0038dea5e22a94c8a6b12bb886b58de3ea968db61affa444da1317e14ac976e4c438a8eef4cd8f60869cee7dc015e1ddb031ce343fd60d8b23cba344c6fd5ea8e66db89d562a47d10f64ae749ffe00adb61d28b1b5069656e978ef2077d738b41d29a13514d0f8e78562c4cf05384f0c8dc3e94109a70dc8887ce970b9d8d6c231557a1c0e9083485e252d1644b9806e31e875f6b4b3415be004c8a1dde3207b65ab548bd79fcb3d6bac10438f2e956a77ec1687d69b125a23016d05b03217f0b45c10c7934f3d7e16b7293822eb8fd1ba00eb4c5043f6c906acbe0ec37a05c0ea4b9ff1a689605733bea8c8053c3f003cfde83bd953c4ec4cbc088736e502ae5bc1a8580125aecd58e2f0e134d19a2ff2c4ba80ea95597154fd2951f1b3e75553d5e5f1ae0bc11cd200eab67db276d544d970e0659823b6065a5703e98774a632dfd7e1023107be84cd61fe8effd16c9533433a55606a7750b6b267bc2c732f7bce06d97370b6c75795c5b900ea5c306ebf1325a876b594637e5b6cb9582fa516c1b80070e8b038c021f41d6cbc345323172e4063a03cdb99bef68c3b70f5ebca78c9062db0d209747f007b1b4add07505581bba3fab78251fd5db2dd07e022dc19ae1e3c278e6a57fa65764154a3c5d8aa0b98d6ce8d63da8ddea2c24d8b42e162d88d0ef82b60f27658b65753b8dc7cfd00345f87d367c5d162c1f10a11bc4b0bedf8a275856944b60bf7b8bf3117500ddb3b8e6a243d2a951579abdeb5b539eb9ac5518da21f651d294a277757534f0583d2a3a9cbaa7883b492ed2176d6543a5256cd008b01c6646b0827bc1880af69e5bd461780fd2280356a10121e767593fef6996894f18d3e3c1bf3c1448599778db86cb0f1877b1bb04ef3b170e34e5e92a6405e8a6bf3f352e833e645583596574b659297c262d03ca325cb265f17187ddd4fa688bec0cb4b580f959752becf8bb854282f56db1696bc9497b3e5a550dfe5d53ae51f7f039be7ced34ceee6a5bc3c252fe2844b5e5a039b79292e37cd8b388095174bb6372b2fa5e1fdbc94e6e8f222f5b9f46fe3b2938daaeb9ff24270b9b0d8e4dde6bc94c751f3529c3fca4bb26d30af96a961fdf3e92057e36325fa6fe3bd12c549bfab252f8539fe3ccdfaa4f86e6258c5c57701f7e1bb89c7fd7fbed1b70fdfe83b9e43b84252f0db7dbb53b6fb3acb1ce6efeb5ec6ca58ea6766cc6303c3fa744ad0679a6708cb987284a4da7e3acd9a045a8717a512d9745a88ffc5e24dea09d40bdd55e15524b24ad09d60b9c8aefc653288f9541047008813b3310108ed130a0c9f3ed13771856de670b6a1c2791ec039c9269cfd9cc4f912c039d9269c054ee2fc1be09c6213cefe4ee2ec9613c739d5269c039cc4b93bc0b9874d38073a89733f80739a4d38073989f34c80733a25cea6dec542d1caac90cd73ed02fecc211b48856c5b164736231b165882da20549f978f84fd9de654380b40ed3dd3269cfd9dc4d909e09c6513ce414ee22c0438f7b409e7402771ee0e70ceb609675f27719e08aaa2bd6cc259e024ce0f01ce3936e1ece724ce6b01ceb99438b762c99beac18c3e800e65073294a0dcdcdb1694054ea2dc11f478f6b105653f2751fe04ac725f4a94ed25ca32ef258e71a19cd74ee6cbbd0f1dd04654404f07b6392f1bfb2f07797f8a85c369ae2a5798635d95adf91f32cbdc08aa9ef9f4ab1df9ec72a55879e2af5de19fab1975f7c68406017885d97053833783b0a39b13fc2e660e6b4b2aac4702ac0bb2e54c9067e112b9aa280b197a0315bc8701bc85d4eb71578887d3848042562e2427acf2ce1cb44e54d07600d08aa857e72a8b2bdd642a912b00bee2ba6c29061b3684651f59c3e64ad0525c44dfb30eae2b9dc79608bc23e45a375f185f8b58ec0949d89fe7400dbd3db0cc926cb95f2a14f56f9632f50d54e8d601748bb385ceaf50b2848e6ce2eb4580ae341b1b1f17ca5593e1c3ef544c49cbc26554184f0018f7cb96a3b94d23f31e0bd02da144d7b6160b0cd6c8a433856475f27f0066994d30073908938106ce529b60f67710e6dfc03297d904937090960ce6bf00e6729b60269cd6e200cc5f01cc729b6012ae3d2383f90780b9bf4d305d9c3af81ec0acb009a68bc3153f01989536c11cec20cc18681a55d90473270761e600982bea764cd217e51fd84c586292ed119b0e265b5766ab1fbe698c043d0fcac703ead20a830708135a21d9c4d60a90a157656350ad6f60ca5f3dce924592958b67038b5c9d8dcc5cb0c964e6d701ba03eb76ba1f0accd2747f3515d62500eb41d9b0c87e9b8c456e01cac483b351bda4d66274b15b381658e121d4eb261607dcfdf00c5c4239ca43b652a7318076685d40737179532300edb0bacdb4aef74c9a80f2af9abeeaf02b0de82f47c5d0bd353b3b032b5c43898eef9ae081f28f567bf1f2092c17eeb0dcb3b88100dbe1d96803466d01922e90afa6c2da160c311c612356d2dd3064581f04e5e391d4e563a5f8a458dc1a233cd69531e535cdbd95631d41463f8a125d13efa29cf94ee686337777fbef02801d6d93bf09d21dab64f67733c8bac7d88493748b2519ced701ce636dc249ba01980c6733505f1f67134ed215666438fb009cc7db8493d4530a19cec900e70936e124f5454186f34880f3449b70927a4a21c37931c07912f5a05995e8c1f026f80cb9c58df7c4ddeb77776171682767636d446a13a9a45e4ac9a6522f0416788a4d3009c7c0c9609e06609e6a134cc2b1713298d500e66936c17471c5c4c100e6e9b638f020cde464a3e55781eee319b6a02c7012e5b6c02acfb405653f27513e05acf2ac6cb424e3476a903bed20dbebdf8bc5a19d6da7d30ec2ad4864b3da7703ace7d8e303c0c5a5cb9f826c7d2ef5d46c7055c5483131bb8cb28bb83915b6fac002cfabdb8c0dd587199bb015795c8c08eb24608de7534f84f1178267609101eb4665875b013bbc80125847a60e3ae3f2e0616b75e6c8830c6a1e807aa13ddb3908b719910da55d021ae01765a38f9daaf356c2ba9acc75ebfec02e2fb60926a16592c15c0e605e62134cc2b53f6430f70430d7da0493b077430673028079a94d30095d8090c1dc1bc0bccc26982efa0edf0bc0bcdc269884d30f6430470198eb6c8249d87124833912c0bcc226988453b674e781009857da049370dc9c0ce66800f3aaba74b4105ed04298cdc996b38c0030afb6092661054406735f00f31a4a98d011f14ab1589f3b81cdd27e58327c8f017cd766c34700668b2aa6a4e52399e3cd9300c6f594185b032b5c2a032f14338caebb599803105e678f2f9f9d9c74c0b9104c415c6f134c171d7016019837d804d345079c7301cc1b6d82e9a203cebd01cc9b6c82e9a203ce9900e6069b60bae880734f00f3669b60bae869650f00f3169b60bae880731a80796b36f6e6f4116343c5022657b754d028141f1de8dd2f126ff90e1fdceb40ae64719cb751e2ecc2129719ccf2788cf4d42e12f6aa7e4778aff3455a2bbd777dc723bc534998f1c9565e9e0f161e6ca4841b3e05917fa84e5ac2560013667eb2f5bf3d01d0db6d034a68a164406f07a5e91d9440b9e3ace0cacb4a3a5c646b7e1b80d2f24e4a5c9d8d4a4bc25e3a5959b907c8da77d5ed625628102e66251c49aaa6c2fa1bb0d8bba91de2f040b934be32732af33dbcf0972b9d6c1a6d03d0dd938dccde47fcad7ec7c84a675ca0d41ccfe0198ac4ad4eb26ae72280f6debaf508087b442e8e21cd0428efa3f708c85fdf544e331e0cd0dd4f896e0b90c1cbbdd72a652772b998b6cdcabc0fd9e2ea61a005f94076f7ee54d6f4c7ddb3bde6c0f61ecc764b72a6c4b69a8d16624a45061ee909592aec935f2d136525e1d8e54554686f0016f910b5452a4776dc1ea19f54326cdb5161db1258e4c3d918584b7d2dba8bebd77a012b7cc4269ca4278291e16c07703e6a13ce414ee2dc17e07ccc269c039dc43906e07cdc269ca4ee9ac870ae0655d11336e12c7012e7ab00e79336e1ece724ceab00cea7ec6dba13ee87246bbaf70383c04fd3ef244f056dd02f16e108d1c61811d4fe00ea333642255c074706b500407dd646a884252b19d49b4033ea391ba112ae8b23837a2380fabc8d5009172290413d10407dc146a8848b11c8a0ae06505fa484da82f9531995f243ff080f3563c987f2dc1b501ec2e2f05ea284d7416391fed284e96c149b205cf0547a2faae50a15e20dc24c4e76c04709a8e35fa65e1cc327751778044ad844efc512075770f40016f88a3d0ef15cdcfff31a28095fa544d994c5a730a6781fedeebdca3f76affceb0dacef354a649b791765a28cabf2ea5fbe3a88bfca7be03c0b9381eb4105ae0300f7ba3dabd3490f3122cbb8fb01986fd804d3c58d7b4b01cc376d82e9e2c6bd1200f32d9b60bab8e86a3180f9b64d305ddcb8570c60be63134c1737ee2d0230dfb509a68b1bf7160098efd904d3c58d7b4500e6fb36c1249c282383590e607e60134c17ddcf1f01607e4809b38d8439d0fb53cc56327faa36b8a43f0b6b81c996f5df01407e443f80eb2fa85652b3048fcc07d1f100dec7753b7ce68bf21d7e13761cc9d6a49f00066e3fc946861eb08966e85b814d7e9a8d4d796abf2d9fd03a001cceb169edbaed0eecf333eab14ab54f6c9100ab649732c243111a508163c01e3fafcb323238d94a5846929d95570a6cf00b7b1d3f90b628c9a6c24e0170bfb4192e61df870cee4900ee5736c325eca593c15d0ee07e6d335c17fdc1ec0de07e63335cc2914f32b85500eeb736c3251ca327835b01e07e67335cc2d92432b80702b8dfdb0c9770de930cee2a00f7079be1bae8b4e73800f7479be112ae2521837b2880fb93bdcea65cacceaac0faba9fb3e1470e3a91e4ee53ca59b9f8a8cafb9caff75c28cfaf74d58de4132c0ef4976c6c31f47d248d14fe4066787f2f61fe2eb86542dc7261c3eee27c0ee0fc9512a77f1e815ace384b0c0b167baf4f65412f35eecd010c05087fb3b7f47471746b2f5031fd4eef720a1bbe267420d9940a5d0eb0ca3fb231a192ca1a79e8e3b01f657d5e4d85f50f509fff692356d25e3f19d6cb01d6bfead24d9ffb67030e0319ff7ff63a0d20444be6346039b0d2bf29d16ecd8293d489aefcf065148460c99a50ab413dff4f361af558a99a78d09d8b47dd1d0decf45f9b70f67312e7f300e77f36e12c7012e7f70027ab6f11cefe4ee2dc06949d319b700e7012e7388033c7269c039dc4b910e0ac6713ce414ee23c1ee0ac4f89731b96782c096f7fce10424ac41073452d885d3c72b902544e0db261afa9fba6259c1325eb8ce6039c0d6dc2d9df499ced01ce4636e11ce424ce790067639b700e7412e75880b3894d3849d79390e13c94c57136b509678193385f03389bd984b39f9338af06389b53e2ac6d834430a313ae6d22dba47337283737b305658193287b83fed1e6b6a0ece724cacd00ca1694286b3f260fee8182739d848bc7c90e763c1f949b2d29b1ea1632a63e3d47da64229ba01b0e6cb695cd705d9cfddc05c06d6d335cc2813d32b8bb02b85bd80c9770750919dcdd00dc2d6d86ebe22168c300dc36d96827c015cefeead1aa9ae3f94abd97f9c7077acf8b6a56f4b9b830f700d04ed8aa2e5bb2501c69938bccebced3a07fd59612a57261d4d7fb133c40723cdb541c755c07ecb21d254ce879075a6716e091ad67fe12c06b4f098fbbe3a810b11fe1fd5deabdc48f77e6d3734b18e16a66b2d2700b00ae0325b8d6200b2f1559b8b066ae332b1997ccf61a8252b063364a416c896db04219e8a4f7e5ae0066279b60bae87db91b80b9b54d305df4bebc0d80d9d926982e7a5fde16c0ec62134c17bd2f770430736d82e9629fa63380b98d4d305df4bedc0ac0dcd626982e7a5f6e0b606e67134c17bd2f770730bbda04d345efcb7900e6f6753ba4e68bf2376c11d6e5641bb6e68041df6e7589326ba76692b9c71c0b5076cfc6f8393ecf0e0566699ebd9a0aebb72c8e358f126b4b161fa7e4420a8520d7877967037c3bd893c109ab1db20c7e00c8e03b52a2d4b9001aeed128627cd7f0a484d14ce2a931b291cc4f806df6a0046ae670c545a7ace5a089d4331bd93eb5f6a68bc31d538095f6ca46d31d66fbd13547048c6471cff6e4599eac3ada0dc0ec9d8d3254ed7b5bc86a3f1880d03ac980fe05327abe6d4009db9b644073412ddfc736a02e1e5df106b0d0beb60125acdbc9807e0980f6a304ca9da9f981ae1037b2e6e28f6cf9417f50fd1450a2ebc852ef0d059da99141255b097f3ab0c7fe364275717bc1d900ea001ba112564564508f075007da0895b03a22837a32803ac846a884eb92c8a03e04a00eb6112ae1fa2432a88f01a83bd90895709d1219d4bb00d4213642255caf4406f53e0075671ba112cec19341ed0c7af643eb764cd4f569e35d817dee42dd055563a28b44d7334b1372dda8d0edc3e2e876a54417dd452ae1a41c598f7e23b0c4dd6cc2d9cf499cef039cc36cc259e024ce76a0ca196e13cefe4ee21c09708eb009e7002771ce033847da849374592219ce6300ce5136e11ce424ce7500e7684a9c6d6bc1195ec2e0e2fae33200738c4d305d5c7fbc14c01c6b134c177760160198e36c82e9e20ecc2500e6789b60bab803732080b9bb4d305ddc815908604eb009a68b4b1237073027da04d3c51d982d00cc4936c174710766630073b24d305ddc81d914c09c420933fda31f091b49d554580700ac536dc44aeafd980ceba360e8780f4aaca93be71b2b3f09ee3d22aca4aea082fb33803bcd66b884cd2932b81f01b8d36d864b588991c17d06c09d61335cc2e61619dcf500ee4c9be112f6ffc9e0d607ed8459d96827a88d0b2bc48b6a8be274368a4d6023bc972bbd97d5b645ff0d429b1d4885f51c80754f4aac66e71a130eb290b9f0fd0e1407b329d172b794c5355b134779bf0b3c16256ca2f749091d38b2edb27c999102b7974d5377a4eefbc9a6eed6023b9c63134ed28168329c2f039c736dc2497a8014194e062aa0bd6dc2497a962119ce1d00ce7d6cc2497ad22619ce0900e7be36e12475a34a867319c039cf269ca4276d92e13c0be09c4f89b3a17751e63d5ec896307e04847ba872591c5521252ae5eabc8fe842fa6eab96791fac66ae3baf7a1b205c4089703b4de64db5ab0847ee095733dd1b2382dc1764e9852e40265c7f4706794b00b9c805c88443cd64908f03fda4621720130edf91413e0c405ee40264c2e93e32c87702c8252e40269cf623837c2280bcd805c88443d26490df01904b5d804cd82b23837c0f80bc9f0b9009d7b79041fe17405ee20264c2dd006490bf0590cb2821473b8d9eb05020eb3c5f03502eb50525e98c0119ca3cd07b5b660b4ad2b92c32941f02ab5c4e89b2b977518838cd766f82ba158b632ba7c456fbe1029b929bad0701d6fdb351a7ab253efc65fe7939ab62517c91137666c96c770b507a56b80099b0334b06f91f50ae56ba00d945affadf00c8552e40261c602483fc3680bcc296c616a97324b2c6d6c300e54a5b50927af22143b913a8c40eb00525a9fb0432941d00ca55d940b990e9fdf0656dfd3fd99144d7b338cad59428d51a036e758b455faa48ac65c9da71ea646ba62f01080faccb8c0dc5915a23d97ed54b40757310254affa836ff9312d9a79f234741a7cb97dc5b30b413b0c483b39199fb6e7299f92c80f0104a846ab55f1ff1f758c64f639aeefd5d26ab13be644d6dd2213fad896cabce9b00e7a19438b7aca5a65631252d179751619c01301e56b7558c2fca773c4cd80327733cbc27683b5653a26c053278952811d5916c592921c9000e0775f49abab4c5aced6c266b7c8f02b6787836ea6b6e8b4b59f8f4cf2c5823d958cfa7a0643ca26ea735a0c02cadd1aba6c2ba10603d92126b1b89b5bff727be1f74bc685116b355d9b24fb2a18a4a00f2a8ba1caa08760e5d744d3817a03c9a12a5f20cd527a177b3e9d8e51900e63194301b7b17fc65bef66894ec61bbd7b36e0a701d5bb7d9d8f506784bd07e3c8e12a5f2dea0a6c08ab527216323e32e1e947a30407b7c361a43519b42a42b8ec81a434d4033fd041bb1922e2f24c3fa00b0d613b331d48637dd6706b2fe00ca72b53915ceed01ce936cc2d9df499c6d00ce936dc239c8499c7300ce536cc239d0499c2301ce536dc2d9d7499c2b581ce76936e12c7012e70b00e7e936e124f5e24c86f34280f30c4a9c2d25ce02efcf4aef669947a2385b431d64e7253e0bf09d990d6bc46c31d1351be1301cd950c82da0ea39cb269ca4bec4c970be05709e6d13ce02277136077df5736cc2d9df499c8300ce736dc239c0499c5301cef36cc239d0499c47019ce7db84739093382f05382fa8cb498e6087d2c591f8bf581ce5859428bb6b500677f7f0c98ea5defffcdf7cebff0a217274cd64c80c412d0bab86e753c11e0f605f940dbb4d6dbf0f615793cc6eaf00add18b6d41493a084286726b509a5e620b4ad2011032944f02ab5c6b0b4ad2690d32941700abbc941265fa6e00089d5491b9017800544197d5a5854271a48e2ec996797d0c32fbe594285bb0f8322f7fdfc5d26c8d7592ad283e0ed8e13a4a787cbf45392b135996af8c9bcefc1de30b193fb867a5b8c7c5f1d5726418b7a3c2d80660bc8212a35aa354c5167b8f2b131aefc9fd1fb8e801e17f00ed959468f9740cb73e78ae4c89fcdcbdbe793f80ed2a4a6c6af16b6aeb880b9c3c31fe0300f36a9b60bab82cfb7300f31a9b60ba7862fcbb00e6b536c174f1c4f8f701ccf536c174f1c4f85700cceb6c82e9e289f1ef0098d7db04d345a71177019837d804d3c513e3ef07306fb409a68b43195f019837d90493d0e91319cc6f00cc0df6c01cec640f68221864bbd926982ef680260398b7d804d3c51ed07800f3569b60bad8039a0060de66134c177b404301cc8d36c174b107340ac0bcdd26982ef680760230efb009a68b3da02100e69d36c174b1073405c0bccb26982ef680a602987753c24cdfd711a18d565361fd87c5b1de438955f93af25d3ecef06ef39389470a8be58296b3ac387b249ba3fc0880bc371bf6a93c7bf8cef5d4e34dcd29ee5660c9d67d9458d5620498e9535f8e40d8d9245b8c3002a0bddfce1295b0db4956a2fe0c0a820728b16ea3b158bff4e436b98ced2e56bb97875007f704131609643b82eb01c00f52028ee655cec5f1a66900e5439428d5e66a5efbf37549653283bbed0d764bd0267d98125f74273e844d7cb28cbd0bc0f9884d38fb3b893317e07cd4269c839cc4b918e07ccc269c039dc4390be07cdc269ca4675591e13c0dd4e44fd8849374be9d0c6723609d4fda8493f4cc2a329cb703eb7c2adbbdf8540fff263db992eccc960380a53e4d89b68005c79df8f0076fca2ff7b0568801bc8a9a2193e96c149be0452311b257f0d77c374b2b81b04bda832a114e064329cf64632825ea400a69a5564d85f51360dbcf6663709afbfeda141df1af07e5ef733655670328cb5cb2ea6c076097cfdb84b3bf9338b702385fb009e7202771ee0370be6813ce814ee21c0d70be6413cebe4ee25c05aaa2976dc249ba33890ce7cb00e72b36e1ece724cecb00ce57b331b7941a4c17a7e9ce067da2d728517664e1a34e78bfc717b2a92d8778155446af67a347a4a0968650062b22f77a44d703906fd802d245677f8700906fda029270513819c8af00c8b76c0149588793817c13807cdb1690842b99c840b60435f83bb680245c664306f27fc022dfb50524e1ce4d3290bd8045be4709b203c35683fa531b23bc172bbd17d50ad10af1066169497648fd6280f4fdbaecf1041be72e6e387c0e64f30f28516e2d504ef7e25f2e26d72a189f58e35ebe16b225de93250234b7517eed8b1de3fdf27577457460c9d6d6f3d35114d80f29c1c2658ac5604e322bb33f64b3937b01bbfc281b3df1a8b3932ece4d5e00a07e6c23541777239d0ba07e622354c28e2519d49300d44f6d844ad86c22837a3880fa998d500907e5c8a0ae01503fb7112ae1001d19d46a00f50b1ba1127abd21837a1680faa58d50097bf76450cf0450bfb211aa8bdb114f0350bfb611aa8ba7b79f0aa07e938d41137cd6ddf5f9a347591ce5b7753bfee48be26721905a25d976c4956028ef3b4a94eaf088be21a02e1f94bb0864e9efebd20ee1c930a47648760ec70c60873f50a26ced5d2c16a70e16896c5be1a95beefdbb50089cc8fca5dc650e968a9b8152f1c76c4c74a81923be4fe300593f07ed324b9dcb1ba8906e0facf2274aa4669e44084798c83c89ec0cd0fe9c8db273214bc523838b6eaee6838cff0b25ca747712911ea2574d85f55750bbff6a2356d2f38cc8b05e06b0fe968dcea5aaa65688177d219bda1acf05a034fd9dba19cff7b77169fe4e37ae2a3cccccbdaa6847507efe91ed5a3ef59dc684639e643b8ddb00bbfc93126dd403c74937c2902d6a3816949d7fd9849374e70619ce1700ceffd98493745f1119ce1f00cebf6dc249bac5950ce776a0ecfcc7269ca41bb0c9708e0738ffb50927e91657329c8b00ceff6cc249ba019b0ce78900276b407ccaabeff1b3c21333c5fb2cee48c53d6c03581c5b8c125b74271584cd75b2fd9783410d9e6313cefe4ee2dc1ae0ac6713ce414ee25c0070d6b709e74027714e07381bd884b3af93384f065551439b70929e924d86f33380b3914d38fb3989f31680b33125ceda962a0433ba8b1b0a6f03e566135b50163889b207e8f534b505653f2751d603289b51a26cec5dc4fd784ef238ac7270cea725280f9b53e252ebde78c08b84dd29d9cbe42beecd36c600bccd28e1d57e0a0c5cf996a55d172da9b01e06b06e4e89b5a177c1d75dae607c3fba8bbb7bdb01542de851f9478f0c6784878c91adf0dd15a06a49894acd6eabf51615424ca110a0d65604575dc0c5d38419960ced4c50e7b6a244ab7c74a4d6a876aff1720c6852b7b605a48b3b23ca00c82d6c01e9a267ad5300c82d6d01e9a267ad1300c836b68074d1b3d63900e456b68074d1b3d61900645b5b40128e299281bc08806c670b4817c76ece0720dbdb029270270419c84b01c80eb6802474aa4306f26200b2635d0ecc4271a40d20b2c1b2eb00ca4ed998c8f24f4b57bfbe32a3452f9bbfe6af25273f339d6c4bde312c8e736b4a9cad181ff9f1876d0bbdc7e399bf50bfd4bbe21f1cc8dc1c3a6b0d0076a604d89645d9783780b2e626cbdccd41e6ee62134cc2f62419cccd00cc5c9b60ba784c775300731b9b60bae8a5b51980b9ad4d305d6c10350030b7b30926e1382519ccc60066579b60bab88bb61e80b9bd4d3009e774c860d60730bbd90493b03f4e06737300b3bb4d305df497d102c0ccabdbc10d38034e58fd90cd80978319f01dea1265d00316214a320f585300ca1deb76511514e8bad3e5652c8eb50725d6cdbd0bbe9caa982d11e3453c5367c52f06d948512780ae673632776a958e8b8da1c900652f4a945bb0f820f0fe1e8562214a1d3693953329c88e9d790940ec9d8d46506a93127d9d6c513600d54dbe4d305d6c51360230fbd804d3c531f53f41f3bcaf4d305d1c53cf0196d9cf26982e8ea9ff062cb3c026982e8ea9ff0e60f6b709a68b63ea3f0298036c82e9e298fa2f00e6409b60ba38a6fe198039c826982e7623bf00300767638c28fa08918b87c8b4078da49d6cc44ada9027c3fa08b0d6219458bbb2c49d67958c3b05e3befc8b6a863f6a3f8d97b084251b162906d6bb733636f841eb4ddd7d2d61839fcc7dedbbc082876663ed26563024baaf256cf2930d286f003877b109673f2771be0270ee6a13ce022771c64039ba9b4d38fb3b89331fe01c66134ed22588643827029cc36dc239d0499c9500e7089b700e7212e74500e7484a9c2d254ebeb16aa5d889c1e738b334b34986ef6916c737ca163f58a48377643bd7ae068da2d1b6a02c7012655790a9c7d882b29f93285f0456399612656b165fff113ce6304b6524595ffc2050468ea3f6d8c63f2e14b15f28c786dc3ee2281fc01b6fa7c736c2d975328f6d8f00acbbdb524292ae47222b21ef0725e4045b501638897230a8b727da82b29f93285b019493b2e15082a3f28f20e6aa8e67fe197babb2557b93813c13949493b301b2ef260af27400720af54131caf3e502efef856c099b236774dc6b00f504d8a666c3df2f6f802ff55ee356e7bacdbd05e0ed918dccbbd3269a792f0620a75182dc9a0567c48b44dfc5efd12c17e38cc16507be607f1f1ae1c218b27d6887807a7abaad605d74713b0d809d91edc5056a6d867ff2bdfa1de1bdce8736560ae42bc4d006e1f218b22a6912403bd3ce0d7f847df26a2aac7f823276963dbbd65cdc89310ba0dc9312657bd0682a61c502e52c163f63828f63168a27fe3826b1f332b22cff31003adba6438d0653564e64871a958231a3bd6cc249eafe840ce77600e71c9b70f67712676b8073ae4d380739897336c0b9b74d38073a89733780731f9b70926e7321c359016af67d6dc259e024cec701ce7936e1ece724ce7300cef9f66e1120dcfa4fb62c6128e8c517d28fc72f1702c64ba4a3a8c7e3c956bc350316b9c096394ad2aa876c50791da8c917da8292b4da2143d91164e6225b5092563964281f0756596c0b4ad28e24dd8135c02a1751a2eca041b969ee99dc07202da144ca2fcac412ff72076be902504b2fb6e71810171df17c00cac3524a945bb2f8587a7c0e5d3dced20c3a19c6838145ee978d9e4c155bec3dae44fb3163e5074107a48465e2155468ab01da25d9459bfa442f69139d6cdee77780b62c1bdba3f8eab74d677bd49300df527bbc5f933a3b212b416f023097d904d3c55a7d0380b9dc26982ebad7bb01c02cb709a68beef56e0430f7b709a68beef5ce03302b6c82e9a27bbd0b00cc4a9b60bae85eef2800b3ca26982ebad73b05c05c61134c171d8cdf0c60aeb409a68b0ec6ef04300fb0e7c81ac2fe0fd98af6c3c0d0ef2a4a941d99ee3cde6942d8723130b7e99cca7b39b0cfd59450b71550a77bf12f17b3e115dee7956c0a3b400cc65578ffe6634ae5de3b4b04d01172e79a1fc018efb7d813ece2b9bddd01e203ed396a89b008203b6a695f50041c94adcd807cf8ad8455666b30ae9a0ade21c00e0fa684b7a3c60ee16c6481660d5125d83610ffd768c6b7b42c1703c8848dfc1e54c84f05f67a88bd9bb0088749c846e64703b487dab9098b70288fac90f8011412875162e54197896509ea942bf716236c07605553c2da4c48ab904da251a1adabee35e5b706e0d6d85b2e12f6dec9cac559a05c3c9cbe9734ba66a1c24881cdef0fd551139e6c21570b60af47d878ce00e980325965d310d8ea91366225f5a44986f55eb062e9a86c94ae70f76f2a3d7cf2e112b2befc53a02038daa6ed2da4a7a3936d6fd91958ea3136e1ecef24ce2e00e7b136e11ce424ce6280f3389b700e7412e70c80f3789b7092fadd24c3792aa88a4eb00927a9ef4d329c5f009c27da84937412990ce76d00e749d958351ff4bfb9a9ac9a5f0b309e9c8d098f7ea17e92cb4efb4a4085738abd9ba70917dc906d9e5e09d09e6ad3292ca4db0cc8ba9547019ca7d98493746d1d19ce3b00ced36dc249bab99a0ce7d700e71936e124dd154c86b31318f53cd3269ca4cecfc8708e0138cfb20927a97b29329cf301ceb36dc249eafc8c0ce7b100e739764e7110762faba9b03e01aaa4736deaad939e5149d65bef03709e67134ed21354c970760038cfb70927e919956438e7039c17d88493f40455329ce300ce0b6dc2497a363a19cea3591ce74536e1243dcc9b0ce71b00e7c536e124dd4d4c86f31a80f3926c9c00836de68228093772910d26df0740aeb505a48b27b3dd0b405e6a0b48c231783290e300c8cb6c01e9a29bbee100e4e5b68074f1b0e42a00729d2d2009dd5690819c04405e610b48c2e60f19c8c301c82b6d0149b82f880ce41a00f22a5b40123a9e2203790f0079b52d2009f7029381bc1480bc86126413ef627fe18e8fff297276b75a5700ec5a3b8f9227acabc98e923f17605d9f0d7729a94e9811760ec9a6cb8e006393d7d9049370c8820ce69100e6f536c1747122773f00f3069b60120e5d90c15c0a60de68134cc20a880ce63200f3269b60120e6190c1dc1fc0dc60134cc24e2319cc4a00f3669b60120e6590c15c0560de62134cc2ce2319cc8300cc5b6d824938a44106f35000f3364a98fcecb17256263a8b7c4739ffbc5008736ff8824b51d036da73428b8beec79f05f6773b25cacd59dcdf811f7896f6979159e17bc00aefc8c6fe327ebe85929a2578cba8e05d09e0dd998d4a04fad9e0ee48cb45b551c526799f1649a0c49e35ba51c17c06c0bc2b7bbeb4a6327e30672973d797566700ee6e7bdc350f72f28c95fea02ab9c726982e9eb13200c0bcd726982e3672fa0298f7d904d3c53356fa0198f7db04d3c533567a02980fd804d3c533567a03980fda04d3c533567604301fb209a68b67acf400301fb609a68b67ac0c04301fb109a68b67ac0c02301fb5e78c15c286115967f220b05df9316af7df959e8065de4bfe47ee8d7bb76771588f6763295ff06468ae301ff559e5fc28e48100e413f69c90429881c94e48990d32f09394283b489465de4b1c23f76775805ccc17840a17f811b622c98e48ea02903e658f7512367bc8ac737f80f2697bfdfebb7852f912d0087a261b95d1e04db4327a085446cf66c373259cd519ef7db2875867ee37d5ddf5943e11607c2e1ba5666a3d1c17c784f600289fa744b9b54459253cf557462a33093b8e6465e62f00ec0bb68275f1109a1f01d8176d054b581490812d04605fb2152ce1240619d8e900eccbb682251c3626033b15807dc556b02e36f8c700b0afda0a9670d90219d8ef00d8d76c054bb8b8860cecd700ecebb68275f12cd43200f60d5bc1122eba21035b0ac0be490996ef4ee6c3278bbc1b2bbc57aa3c010b851a7c78851f9de8e29acebe00df5bf68c01b838613c0fa07c9b7a79ec62b119a548cc635680233e2be9c0916dcf6f08c0bd63933f6b52c7cb64c37ab78261e6776dc2497a4c1219cef700cef76cc2497a881719ced6607ee97d9b70929e2749867308c0f9814d38494f3b25c33917e0fcd0269ca4e74992e13c1ae0fcc8269ca44b12c9705e0e707e4ced4fab527c522c6eb9ea4fab0f8b03fb841218bfe02f937602c9ecaa09c0f4695d6eb50f4f04bbb83f6d2dc8a49fd904d3c5fd699701989fdb04d3c5fd69e702985fd804d3c5fd69e701985fda04d3c5fd698703985fd904d3c5b5484700985fdb04d3c5fd692b00cc6f6c82e9e2feb43500e6b7369eb4477a966e3515d6cfc108e5773662253df1990ceb85026ba30621e16312848f14430b7c706121534e4a2abdfb63199f93291648167ad71359a9f86abe0764aef77fb4b4d8c7fb5f773f261cf78c66ab58b9b8cbe51509d94bbda75c33af1f9ce7bdf23d378d16d234f262ad18f7d4c523cb6734170840be93954221f94021274fcc365588b419e1fd5dea3d2b62e3c470ca124f729ef0f8b54268334dc4a4d0935a2e629d2734e373a6e5824411f3e7a8a6cb09e785de755eacb17c678177afc463b4dcfb3b2fd69cc5fd882d908e60e630ff4c763f4c9f568958975d019e35055f4ef1eeedee3de1547d6d38ef4211cb85725423a88d7ee4232fa5d95f5feb705c4a649ae609332a13e4cabdabcd05576e6a2b84c587dddcf8d2fcb5e515322ea345a6e2a9cc0d3326d290a734dfa23749bc59e8855f287e678854e55699bf83f75a8c0fb2f84b017ad72c02e82d4fbb5f2aafd4fdda65724b4c2eed076e6e317d495496b13c545b8cfc6ccfbf5f24aca858481d5f6b4c6b8f1f9e1f9b274995fc1d795a6ccaf1ff91a7bb4c7661a66d45769de9a57c91740538c57bb94828c5ff6bf0ff00b1fa0e96c6700500 serializedProgramBytesString: - serializedSignature: 9d1f634e4ab7f5dba538fd5f3f8950008e77c3b2cd42afddd823c50e09985ef8b9bf5ec58e28658c327eede8a13774ee8e7d5d1e44889535344c51a5ae45130b + serializedSignature: 8a29f76c9d520838c4d0902034c0df3ca219b8d17761c095934583a05376f77869d36f21be75145da7ffe8656c8fb87ecfa899506cc85910745ff85cb919b508 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3edb1995fea586242a08d3c8d345c279.asset b/Assets/SerializedUdonPrograms/3edb1995fea586242a08d3c8d345c279.asset index 5f6a4f8..d0a0d52 100644 --- a/Assets/SerializedUdonPrograms/3edb1995fea586242a08d3c8d345c279.asset +++ b/Assets/SerializedUdonPrograms/3edb1995fea586242a08d3c8d345c279.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15477ac0e7019210bd770c98f66c8a44071b0302514447a29866212401024980249a2bf6b9779fed73b7717a7297ee2477297729977ee99776694e72a99772492efd12df7cdfceea7dbb6fbe7dbbefbdef69571cfaa1d1b66fe6fbcf3733df949d1d50a5f4bfd442fdeba0aa579bd4627540b5a8f3aa53ffb549871dfac73972cfef555d3a3cad7f37e96b0bd5cc1c4fc2bff9a949fa779d3eea563dfac94baa59876d78bd41b5eabfebf4b3adfa08ce9ed2ff5bf55da941faa103aa56ed51bbd5c4d4f81c220ee243dde65c0af44a0dd6bf37aa6bfa6a2b260a22a9c24b13f5af067da51baf75e844bbf71d55c751ad0e7dad593fd3a5dab5cc932871f0b8110aff504e30c48495fa7fb9fe7fd51c979b70a8f9fb9a391e68c2a5e6fcbde479f73c84cbccf5fbc831d0b8aeff97e9ffaf9bf3834c38ccdc7fbf391e60640e367ffbd30ae108132e37cf3e408eb5dcd430733cd284c3c9b336f9eeb551265c61e43ee8bbbeca9c7f881cebf8067ec1c76e8df9fb3a398670b409579beb0ffbe4af257faf36bab8b2c798f04e738f6699fad09c1bebbbe6ca72cf4178874f27237fc042733cce847765e40fd860ce8df75d731941b8cec87dc4777ebd39ff3172ecca807083b9fe2891e39e87b0c65c7f8ca41fc28dbef86ac8790837f99edb64c209265c69ae3faebc76b8d99c7f821c43b8c59c7f921cbb7220ac35d79f32c76526dce67b6e9befb9adbee76ac979d766e1fad3ca6eb73a9e41377ccc5ddd5c36134d5867ce3fe33befe6dd93e498a6d1cda3677d79b3dd9c7f8ec877cf43b8c35c7f9e1c4338c9a7db0b8c6eb9ea01b72edaa9ec75d14e13ee52deba689793df65c31c7e656b7df27633f2dcf32f2aafcd8c54deba6b302367b7f2d6752ff9ee77c33d24cec9e6de8f87e0e13ebfd717ef5e5f3ab978f79178a7448877aa8f53bdf2d66bf50eabf2270364e5d30e70cf4c73f2557da03276a6efad48fbf2d90d1b48daa713bdb58c8afdcc33fbc933b74460c5d98c5ffe01227f864fbeffde83e4de9911d2e23e33cb848794b79c1c72d23b78b9c362f0b600996e5a6e35e1dd46d6cbe418c2c324dec346fe8d00b9b34d38c784738ddc57f2d0ef884fbf234efc95e31cfd2ad30132fdfa1df5e977d484c748bcc78cfceb0172e7f9f49b1f413fbf1d1c2771a723d8815fce3d44ce6d11e4dc6ec246f2bceba39d20e71ac939089b4c1caf9263cd6dc8a703e274e33aa9bc75dd4913369bf39f20c7102e30618bb9fe1a39d6710e9da9d016862e0f1177abf2fa0aad263ca5bceda97bfeb439effabe2e6fd7f76a535e9b6a33e15973fe0d720ce122139e33d7dff4c5d761cebf458e216c37e7df26c7545ea7b9fe0e91ef9e87f0bcb9fe2ed1cb3d0fe105e5f5ad4e91f3105e545edfec34390fe11973fd3d1fa7c5beeb377cd7ab54785bad366197cab6d56e72ae8b9c83b047796d158eb5dd0c6f0988d38deb92f2daea25135e565e5bbdacbcb67a45796df58a8913fa04da56877f1810b7cb668909dd76e786ed99b214f658b7690b6ad2b9558542a00608dbb5769fccdda906d1e5f00bfecdc7687b7427f3821660e9d91ec07e738fee452eb5f66c27635fcf8d7d13fe6ed277b4a1d0f7b3a3f84c561490b876fdd34abae5ddfafc56ecd543c7bc4d5f59ac9dca367cea84467a54ff78a51cd4d1b6eb8c6dd50ec2251d15c83ba1939d7d672e95a00bef7fa65ecb7446183af41917e8057ddc8e296cc0df9731a5ad98fa3a7dae07c73b3a7531dba8c3ab185bb6ee5dfa6f5b9cfb0d327b1aed030ddc796738c3cda65aad0da4be0a6df49b39d2173902e8cbdf37c57050157aa74f67e5c437193a950c742aea8c8c25882ce539b7545561bfbf3e8b60741db335b4dbb7c37ba55a1ea88b9d0c64f754d42093c31f7de593f7a7be74f5a932af6acb54150e6b4dcba15a105890974e4dc89210ac4259d9a06a48a81f7fca86bf024e369410bf735f1bde173d03cab165f266406a5c6f83bb0b2d15c6a921a19b30394eb2da4dc2b372a91a445620e8ec6634576239d4036ca807971a75eeba2508f5e05ebd32a8e19f9d60254330571a3882036d04d1c73c264a30db0973ffdaa89f3da3495cc696f5927edee6b4053305677a918fa99de750e439d3ea4a464b11477890857035101e664b64a52f91903e4670992debb01bd1269a7507f439c77fdd8c57dbd0e9712b0470854e6136385358dcdd6e56edc2b9a34b988ee04c1d1e3a534760a642af512ead5c7697db7205723175b22405aa41bbaf3b34888cb4f3a805c4d38d2e13dcb717659e43a72963cceeb3c1f93032743e8cc27c98470a573152c791afb091c7a9b6f63e290ff5fa2f386ad1d52fd8cdb5401bdbabab986b38c7daac7f872f15a343e7c618cc8dea805251ac1473393498ab0ac716581556dab21eea8bd4891216ba8d3aeddd28d335e3767de61acaabc118fcc6ec3e119cc5e34267f178cce23959052eff94715939c4969590bf132ceecc47fa5f567656f2d939d4261c8af7449b5b0ac6538bf5f91554630bba3c17f45f3d1ae04c54d228e34f43059f86613693c281b8fd25742de1da799402ad5574e712663417f881d96d6732dacea42ce5722781b391e1b66c0484532ca9cace9cc97ce68cb0650eaea628a5dfbf47eb7e5639a340d1b3666ae8523d4dd97dfe5cf173f93292cb97e985e6cb285bbee0c98bb1aa87171807109c0ca7d759ab8f7af47f3a4c10bda68609d7e996be1cfcb3e7ed0cccdb1579d4d8f9ebc0d9c5685beee149d90e45b0e68d1e777081e7681bd6492d79e6d64c4b6ea502736b96723b167269e672678cadd442d9ba35480d7fe19dc117deb15c04b32d110cc823827136fb42b54e8bda17e7c01e34752758c3b2227756c1071be86356858461f24c264560cf9f835ff0d7f5cf96d96d782edab05c2a38fb1d6f332fc8fd791654d5631d2dd47aaa8fdfd6e6f2b636c1666be34aed2134989ab95d058fe8db6d08965cccc86e4dd6dbf335cd7809b9d2c0e5d7441b41ccc4874bd21ae49ad2dd8aaba45b3d5e50f6a0823ba757afc353980a38dfec691db9b88273e7b65e3ea484a3d96d26ed43df6b018b42868077c7d4070bd06ee29566ce2627d9ea1028d50bad4565f9c6ac2a23cd5719936dc2a18708ed7d56af139c72a80c9b34043072dac46fc7cab20795dea2ffbeaa1bf8d65e07ae25523f740a97aac5b65441735dab60dad94d57765aa2c43ed5163bf4eb60494bce119bf1bce06936c1307e50adb2c70fbe5c6e713402c60fa673cc96d898813a8d58213569463d3a579df102a7da8c42eb162edea561e275c730a2c73b838b77992dde61bdf19ed7b69abfb633b95897e78e357f5d67d96205435b61a98faba13e86d5e203b0aa5b85551d141ccea1b1556dd11da02c7d16f0fadcca515c6da3381829b6e44d6f36476f0d470fde6b188243af51b49a6389a70a3d0a5863d677ce8333490af24e61d7d991b75bc15b4e57302fcfe91cbe6c9ab0fd58324fe3d542dd0578cf25dad0c05ab4d6752a77c32ca915d714cfe5ecf62eaeae736b9a565583cb04766af9cd784b140b9ec759f03ace82d7e765c1f339fd36d8f4ab34750a10cc4faf34175f8d2dbe32ac07dc18a3c4731b17cf465b3c43309e7ab428b0975df8d7994831de6eab0bd0933b275a1704d5d9edd8f969416912b372f05657b8c1dd5a2ce555016d5271d2cb95e3059c3d6cb6d903f4d7dd5a7617d623e74cbe5c22b5cff148f6b1904bc116cef2af208b9e8876b8c8160f741ee095364b3f7b4394cec3624e896d36254661b16ad4ce6e23ae5a6cc2ec6bc4a326e5bcff1b45b52a2ef63a5bec9348ecd4013d846bb07a8c5bb147759a51e74e9b6f1f909a6a5b6a20d2edb652e1175ccb0b5ec2a9b9836b731ab5ad384ab516a0d0525b0d86ddc5b37d528315c34b0daebf7686c9a9553cb165b69c82410878c5b1a029a6e59ce4dd854a5e61cb65ec7e7788e672f1267ef29b0681b73ab386aab1e3bf4415735a8a4bdd40ecd5c0d051b7a97e8052ef0830f955e6dc0a187b50a8736b150e260475ebf669a59a8c8bdc699eca67743d2b41cc981abcd89a2e113eae615f692b28d07eefb3e4b7957694f1f6555cb1ac2fb458aee62437142a798d4d32cc77c20a0fb6afe68f60161fc11db608a628e725daac2c988a270b2c0bd5d3b26f754dd59ff2bd7ccaefb4a57c94725ee90d8d26602e70ad2d0268b1e1ddde420616efe2ccfe6e09b35fc7c5765822b6f596d8aa70b0b36ffc906254abc16dd3111b46dec4ad9531bc011d3cea570c3db86a78036721c7242ca4868bedb8446c1bb9d8ee91886d13175ba3446cb5b6d8a0b77842597b8bd99554406f71b34d388cb534a910b5df085ef0168ed14909465b3946cd4560b48d53a54542953a2eb65689d8b673b19d92886d07974da78b904d3b6dc2c1e93a13c69403ba90bb6c82c1f461315a417edf6e2ec9670b4cf21e9b60181a3e174670c0faf6bd5c8adb0b4cf13e2ec51d05a6b89ecbbdce4273af814bf2f90293bc9f137ca140c10738c1170b147c9013dc55a0e0435cee75179a7b77db24c382e49e30499ec60b3ecc25f952a1493ec249be5ca8e4a31c8c2b05c238c625f96aa1493ece99dcb5024dee1e4ef0bd050a6eb408aec2951ad0d896bed32437687b9f8d94b54b049b7ba553303127914aae2b74c296c590130f84c9e2fbf92c6ee2ccfdc142cdfda44d32dcff5098240734bccd36c13005713d8ce080b98a168ec5c385b268b549864ecb2361921cd0693965130cde30eccd59746ff83417dba312b19db1d53eb85eabb54f6a9fcc045871eb9ec72cf0aa00176ed354fcd430633d8f63c52615a53d8bdb6c0605adf81361ca45402b7ed62618fa6db07f5ba1fdb6739cf0a78a20bc9d13fe741184777005f8198902dcc9a9f26c115439cf097fae08c22f709c9e97e074918bed0589d8ba6cb1812bf162983217e04a7473825f2a50708f4d30348ab0296041edf2259b64b8ffe530490ef0512edb0483ebf14a18c1013eca158ec5ab85b2b8ca2519b630cc5a2192595be99d52f5ae9c74a66117e3621967d5642359e347a770e10e9b3c6eb2370ab36b9c66afd9345be9d36c9975bf8decdd361c2dbb8d9607f0affdfaff553c6ef434fe74d3a6289adccb69f2ba4d139828b4b7d2d91a79f3e8b465954ca35935992dcdb6a6268a56f7715abd61d3ea6864cbabd3d7f7e82b9d79595a14adfdf9ecdd00200a93fb39266fda981cef65e2ae44a6eb906d6b9ceb7aefccac6eae472d5ab57e97f16eaf457bdf8dc9c86c325b39c233c1fafbaf1ed4d7da22bed3f300c7e52d1b179889a231d2bc72b483372a1a35838b388fd96ef2d99f526f1ef3578a95fb0f725abe6dd3b28729119c453b9a6fc57ce596cc442d25b95ea82f96bc28141fe228be63a3b8342f8a50b738757d179609b8bb7876709dd3e05d9b063b0b6ab9dcbabf19d7237729f75544e795fbe0fcf3beb46f7b653f8ad60f735abfc7e55b7019cf94eeee1c25bb58f9f608a7c10d9b069b235a1e5736bcf9e85f09c5b7dfde97d6a3e8f9314ecff76d7a6e13d1d3bf8c8bd7d3b656258ab68f72da7e8b4ddb26d6fbb2a583b646bb70d404f48105eed7226a142e9725ace1318ecfb7727e5c9814503235ba2669c9c3a6fb8ec9e31c936fb33139900793f0d6e2d7d6db23c96c7520c1e1098ec3b7db38dcc172c8d573e951fedd29796db277b28ca2d1939c46df61d36815ab51762a4a5f8f3fc5e9f29d365dea2359a9d36fe8411d9b235857f832cbd97114024f7304becb4660abcfe7a0b1d2b2b915fd28b786de8f5be166f783bc652fa85416c73b7986d3f5bb6dba2ec9db722f2183e25bebb35cfabfc796fe7bf2a853e19dbc93a62ec97ca820feadcd731c994f46ab936c64dc5ced3479edf496ef55ada677506c5d9ee774f9944d973d9174a989dcd695b6367a81d3fd7b6dbafb4739b8da68a782919feed8d4432f725a7e9f4dcbc32aeab89ff305d6be19f9cb676ceb258ec7f7db78f0a3bbb6f4512235251db1fb38a7d50f701eb0d44866035e6dd1122fa1462037f34cd0187d3138bccc71f8411b8723821c9c913fef2793216ad0d61ddf8d4223df71ff5738223f6423f278892d83db0324538b844d4798dd44646def558ef40fdb4837b0354b94f1f3dc12c2dd53acd6e6131c830f6c0cf8057ed90c329e9153ef166bb6ef352ec53f624bf1ca2c2f2013ab6be5ee7605ddea106a76265239cf9ffdeb9c263fca69925f8fc3397b05b594f14adfe034f9319b26cb7d79e27ceec7a9795cebd9afcf05f95741a5215ffff24d4e8b4fdbb4a80be95f7a47a2da70969ff69d0af735f3d5f72d4edfcfd8f45d93b7fdb5e3584db77eaac1ac7190194d7b9bd3e7c76dfaa4597d82fa79f7168dfe3b5c6a7fc296da4d21adad16dbf0361c1beb7b0b7b97d3f1276d3a6e09a9233f0ed1779abec769fa53364df7b2b697594dea68ecda61a94659f2dbcfe606a7fd676ddab70afbac8579f1615b99608fb342ffa452f016c966e57ccaee9a4ed5798c053c8d2adc76b2ba9744ee4d7221ee0efc8e4e3bfac88e2eb9f7dbfb9ce2bf3f9bfdc24abe9f22cd6f47c13aab76e17746ccfeec6a85d1c895a549e38698fd4dd39f865c1d6e727540156ec3b9204f6bca9d8a9f81d806da6d28fac7171d01bb4dbf2005eb341b311aba44c2593e7240ff9533be5c9f2d598402dc353745f804b3b38b620b6e9bea0c1e9ed1a72aca0654433efc6c6960edc7c74ea367d2a56b99ab589b2701d657876560fd9c24ac4aab652501d1078332883e2f89a81c1175f7f681930007feb9707e5e12cec45efbc90c97c366a5d095a39d9e56b334ac2511f8d69667f0fd8224bea18aee29bb15fb8127d10d4c02a62f0ece60fa45494cceb692b064720b3a0cce83353860732d11a83e450ae42f49a21a15e02ad4eaf350489300ec0352047f59ba05ccde463a11882a33887e45baf8f13b892701d5d709aa5f954435128b9f1f56d22af6af115ffd0bf2b86cbebadb434c02aeda21195cbf2689aba217572d0edf24c353ff7c19e0a928f309f78f65e63fde108d293f323212ebb9abb872b20be5b5f8474ae6e85b6297f25f5764a4239dd56149e7f09fd24c2f306db1b7741e1e7f3a945392ce39ca910e51bba6035cea34d3d6a7733470e910d5144dbd7dd82133dc691fa6ac86e1cedf5037f74864358c44fe2640b86a2038b5ea6f49d6aaa395f3811f50f39c723e967400813acb12daf08a2fd66959b17ab712716b545bfc959e3a77681895f2a97761af62b759fa6d49801394f3710367e4be53df14347bb0440e658514cacb04e5eff42d4a3a31572d87322d85f22c41f9c5be44e99db91244394d0ae5dd04e5ef4aa2bcdda06cd737b5a36f413f3d039376de174dc24db00a229f2b85fc1441fe7ba5b0de66d3aa07aff413442956a70e25287f5f12e52d968a20ec321d51b423a4d06e2668ff40122dec2914e416ef51b056d0d28f2f1ec45a2988b713887fd8b7453de96dfe0482f24b9228a7852eeafec66865021ba36d04eb1f49629d68b09e669d299a7c511bad9482398dc0fce352c0e48abbff4d1a419893a5600e2330ff244e30053b9f62304712987f2a09d3e628795721bae1467d3bbc0b78195d7ee80c34aa55091c22b987a0fd3349b4698b9d16b22d8e68b5304b0af76882fb4349dcd17a4f2b12d87b9a4150feb9244a7fdfff02b146584adfa5e8f0737feefbd711e47f21893c7f2f56d092c5b06e2158ff5212ebd4d058bd4383cbe4a0de2f05b59b40fd721ca12e4d20d42e02f5afe20855d0bb15837a8240fdeb3842156caac4a03612a87f23097599e2fcdae2bee42e98096ba532610ec984bf95cc04b77391dd6fbb993a176b08eebf93c49d6bccc13fdd2d38b428d6bd584260fe7d9c602e4f20ccc504e657e20433891ddf2a02f31fe20453d0a31583b980c0fcc738c114ec7389c15c4860fe539c60267175409ac0fce738c14ce2f2b5db08ccaf4ac29ca9a278a2b69df3046d75bc14deb504efbf48e21d6ef042c4a710ae2bbb2dfbcdcae2812b9302a708b87f950457d8cc9660cb2e36b3d540d0fe5b29d066e607dced51726fa0225adc1f97427b86a0fd9a24da5cb358c95f743184a0fc774994932c1540f03a8124ae14e82138ff4312a73b43452db3ff4efc8d2358ff5312eb30c4ea6c84e75f559dbc55a86504db7f49625be46b821cf7a85539df228261e69b6ba27a3b01ffdfa568a0c2bdad22e84689ad5c6d2728ffa72f51966cf654ec6d953682f27f4b591d78df56b1adf1efdf6f03b412f05f97045f582f4bd0e112eb65ed2368ffaf14d543b851aa240e454f2128ffbf6f5126bdd15a44507e248932ff856a4974abd611ac2a2588754668acf62f8a084e9eac9282bb97c04dc519ae608520067737813b20ce70057d0031b83b09dc8171862b58e78ac15d4ae00e8a335cc1a51462702f11b86571862bb8e8470cee4902b75c126e2e7f36f9fb5c8c20282b4a81921fcf4afaa60bcd04e5e0be45497b5982edbe582feb1c4159d997284be6428915f0a304e590beac2bbd055cf08d56b1027e2b4139541265fe7dffd509ecfb5f20588749629dadbc83d7adcadd96b0cbf2456cbe464de23621b504f2f0bead0692de384d222847c4b31a10ac5dc5aa810e8275a424d66a8b85465948e9cc5d35f77ed8b8563561c5e11212ad206648e11f45f08f92b6ea285bdcd20c48defad5a904eb6849ac854d100a8e02884d101e2068c748a29d65410b89e841789d6abb0e3bd4857eb7827000013c363e5d8724bea6760b41394e12a5b3e132f56c37215410e2ee682d588f8a15f64104e0f8f80cae08daa298ff7a9ea09c2089b24a79fb5bb05b6513be035d0c774bb44edd2b057f05813f51127e5a05add4da6d565d35f5f37505a709ee49f175bf04571588d5c8fb09dac9f1f10ed624d03b984f504e89e78882e0d20cb1c25f43b04e95c41afd0d18419c626fc05c2138a795c24aa3bf0123389c2866a5e309d6e99258472aee0dd74e734bf26ace1481778b243ce7734d1db871d23995cc3ed440026b467cfa5082ce8f581faa93a09c298972ba41d98363a4dd6c4dd85f5ea89848c0ce922fd074c7553158a3a460951358b7c6c7054fe2361e9309cad9a51d14713786bb790745ee20f0e7c4b3ff9344cf7203c13a37d933aa82fd25b119d5b104ffbcf88e3d096ea128e6c91e2768e74ba29de2abad9b88dfdabf1608ed2048d3f1f12592b8c1e74c82f2b678366782a3a462cdd94582f57649ac337d85ded934a4bfaf10dc4af02e88a7d50aceb68a59ed26827561b29d30411f58cc091b43f02f2a8513966ba0a6ffbc3f388ba05d2c8976a1af3ecede83e866fa4cee4a82bd2abedd0ac19736c5ba150709daea523481ae454385b113adba3f7eb17035c1ba4412abb3c75bbbbea11957b6247be97025c1b6345ed3d749b4c216827399244e70396c1f6ebe8a0d52923fdb5c4d102e974418fea5f67d9a511346d385d7cf4bd79247a5e0ae27705748c29d18b1b80bbe532856d88f11982be3045370e0450c661381b92a4e3093d80c2d233057c709661237655e4e60ae8913cc24aeef5b4560de112798820b84c460ee2230ef8c134cc131543198f504e6da38c1141ce410837988c0bc2b4e3005a7fac4601e2630d7c509a6e00e0062308f1098eb4b3155923db27933ef007027c1bf4112ff5c657f2f708f3aa57f007cfffee6c55d04744d29965a54e3ef3a051f8407bb7504d4a82b68d7ee3b013d09ac328613941be33b192268a56293217b08da4df1591094c4af574e27286b255166bf2dd0bfbf11308f80dd1c57b0492cfcb309d82d92602b11ac3351d2a22f9fd7bfafc9011b2305ac8200db1a9fda5270ec5eacb69c4b506e8be74234c14648ccebdc88582bca7cc2b76409dfa4dc8d62329ff4820fad6f55adcad9b00bde995aac762a6741e409dd741cd53fd1f2e2b8feb19d4fe17baa305b7a01cf82bc1694dd81d543bbbebf7a8ebea50e4ca3dc9846daf282663ae46638e954d0b7e15cc9f44db134536db931b620f273683017746681ac762313ae4036a4f05ed00b9630ed42ff1b3a416e4fb2494b85f4558141a460d18fd3e22cee6d6b9c9cead03fce917b3eb74ce01e2c6d7bcad959db56eeda8b6631b934728c1c9e77f72de9c6b3b934cdad1f6f7dc30272a50afc8d7eadff0ec87793ed68a61353e0631cd039df62e6d9f7e89b5b3051f0afec1bd28b84ac19400100 serializedProgramBytesString: - serializedSignature: 4d3794e9577a0d4fc11ebc8544477aad7295dbe3956b6a223be28f0dd424e52088248efcb1293e9ebac318cb63878060e62b315cb912f579f1454e021ae8ea09 + serializedSignature: 5407fd5674023a95ca3f5e80de0ad5f323a0e4e5ced039e2cec9c18cd9977d93141f9c60bf7b04dea604a7567cdaa3465e0e395ceecf621b36fe6bbc3dbfa507 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset b/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset index b5a4967..bc7b17f 100644 --- a/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset +++ b/Assets/SerializedUdonPrograms/3fe3bf7f70138de40ab6efee2bad0543.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d797c14d9717e030809210eb180603916964b5c9a415ccb72ad90040810085dcbb96240120824a1d5c19138b19dc489e31c8e13e7762ec7b9ef3bceb9399dc3493671e2dcb7e3248e736fe2fd2f79f5fab5a6a6bbaaa77b7a6a3433b6f493def4eb7ef5aabeaa5755eff5eb9e7949a57f127bf4bf7ed5ad5a5593ea5383eaa11ad79f5a7539a67f9d23b7be4b4deaf2aefe9fd6e7f6a84d395ac2cf8ec41afdbf431f4da969dd7246ddd1e58839dfa386f4e70edd76481f41edb0fe1bd2572516e8467daa4d5d5217554362550e12fda6d194ad4b805c891afdff947aaacf0e19a6a093a439d5a0fff5e83353e6dc9866dabdeebaba69c41ad3e7eee836936a54d3bc6d28d64cd42af34139458d2d17e9bf2afdf7017b3cdfd6d5d8cff8da5a5b36eabf85faef263a0689072dad777aaedf6969ba9fa1ed2b21fa5b60cb3da8fd625bee45757b501d94bb6d1f03e858d3325ad1fc252ed8fa85b66c22e827515d13aae3e843b90bb5d965fb7c62fb7ccdd657d93245f4b90fd5a5509d4b0ff7e9d2ff58008e75b63c8ce856dbf290a5770b5de3d643f9823d9f46c7babff9c73c74dc76fbedf5b7d131944708395f447547501d94472d9d3be818fa5dc9f47bccd3afcbdf715b3f888ea13c81fa3ea1b26dd1a5b9041dc3f921abc33755b65dbae57e4473a96d33ecb966992d0fdaf377d1319407108d03b66c4675cd8cde5c7d55dbfa7b01ba77699c64747f3258f7d56f7ae8b8ed5eb2d78fa063ac6f57a7f7b375bae0bd0eaed5afdbfae52a7b8c703a5ca166fd568d2b67bd2d5b90bc2db63c65e93c50d9e3bed5537f0ad543f98c3d3f6a8f577ae8b67bdab7db7235e2cff535ab6cd986f86bb3658307c731cff9352a634bf8bc8bf3695b3feea93f63eb1fa2f650aef5b41bf39c7f56d136bcce96e754b60d9fb36587ad9f40c7509e4532bbb4d6e7e06103c3c3465b767a78e8b4e505d4978bfd795477c696cfd9f292a5f32a3a76db40d9e539df65cb4db6bcec397f19c90ce5457b7ed2a3d3cd9ef35e9d3fef91dfebf7daecf9294f3de3bbe6bf61eba938b14265c610b4990eb896aa5b6dcb2db6ecb17466d03194dd480f5b6dd98beaba6dd9a7b2fd933bc6fbd1b5fde85a285f56d93e0b8eb5cdd4d67968bbedaea8ecb871c596db6c795565dbd75595edd3aed9f38fd0b1ee6fd1d779aebf6eaf7b8c8e5db9319d271e3a6e5c77f9ba8164bfa1323ec5ada3f4e2caba041d239ba879cd23532e7a549ddb763bd7b62a61f2aeb3bad7b4f60cc97970d14e153e6d775be64ed881f442f8073f3b4cb7d33a359ed00488acb9cfe4e4d33a7a379359f3da441de2bbd5fc4feb2b460cd1a7fe2e3ee8eb02981bd5bf4328e59fd2f567cc8c0192fe117da6493baa11d3ea964ef7aeebdf6c2afdbadb513d9886b4d1cce8ae80de2dcdb6ffca5c22c1f4c0dba65bd374662f63bac60574421f8f1a0e7bccff4786d321c37d87ae9b3673a9713d3c4ee9f289e9cd2ffba4fe4cf5d96b21a379a427315cbd335572d5d4a6a501ee93c63e3fa391b9d00840bff0a91d860b922672bfcba789cf60e8381948763b2c8d7d06b244565db34a9a7cb8db87607419fd12d2f6ede07d484f448264a1910175af331264343cd3fc918f9efed0de6d55d9a2ed5749938aafcf215a10b040af31b1da47215884aaaa052960d40b7f8282dfa45e3d4584dfb96ec45c175d010b4d64ca564002c2719bfe705b1fded527609deab1f2e923058dab0da4fe80998b2d0ed47914a8668da7774e6c9a5b260b86b566568a0cac4993f1ac09303eae2f931ecdb339923b3cde78c7c41be7b7bcfb5355b45e6a8d5ef2e98dd3cc7c4a33b5c536f7dcfe3d482f8b67e5cae8057e680ceb18dbcec50387e0020a419313df1045d09f08bb9f4ee9b6f734128f4c7633a3db53897330a63061d8ebc194c673a9c1731399ce47e38843b88a403805082fa3985ce46112f863082fa45467a68bf74555d7a7eb9c3944bb393b62124f4841d386fa256d6ef76d820a4071d7bbcaea347707660c27c16a5d1e5aadf546adb0ee2dc92da7f26a4a336612fb604e34e3d27c688ea137d7d1164e372ba8f002d69b480668a1309cb9eb9ce6a79a893e2b8d49c833c319450d6114298855ab8800f07ffac7e70bea785fb08823be9a200e11380af15aca9ccdfd80b7173946d00b2cd450f6ebd29d6177eb72d87001f5c045ee859960d36fa04cdfdc0b6827e3ca5c49017aaf05cfc88c90b566849416cfdc685a4cd9647db1333f6ff08896f93d1b3a9cad63b2be5cfd73e8d551e8190f5efc597a7e59334cb91b4267cd1b54d0243b6acebc8472b680de4682a904e56c37f0ce7629451c120ab8e1e39b1683c5c3d21f0c3b484c27ed90ebd217a4b5a8cebe0c5fffd57cffcbb8fe3751fd83090fe8df94fecbcd075c3969ae8ac2d1722eb66d2662dbeb0ba2c5b67a8a385cff3c3538bd84eb79c22b38c25b62127e861abba6b298ab1170eea1a192d6d7461fbf70fb6cb777fcd283779ba2970d72b3c00de0959c456d272c6aa22a9a45ada28843b8da1146f101f3bdd594e28d2823a28a0f9f2e177646d1183a3cee341602bba7e478e56ca981523778b35d94bf747617647c62143fb886eb6937d5d3124f4f9d6694a4b59451fb5dcbf5bb87eaf7191b11f6e93fdc3f6c331c307569bb81310a0fcf723ceca578a8f345a51eeb17881117d0eb3aaed726aad755a857aef7fc22e07a8e8f6490060e1454031b381e52140f8b7d1ae8357e3a5a9f1bb93ef7517dae64f177fbce0ffde7382e9a292e6026be49bd45ffb9bdbea83f47e96f13d7df7eaabfdad9fe325616b5c7cd5c8f07a81e97219cc1630eeb5ef3b7abe7b9be0f527dd7a3be9dbdc75d5916ee7013a5ff2d44ff4913c3612754b1d2a930b75ee92809fb271779603249041929615755a3f154e1fbe722df564a737008db2dbd77503ff1fe8f7ff23d1f6e7b9b4f3555bc6ab671a67184328d25d6340094615d39a0dc8d2d23daf1453189ed54bf1053608f6f9cd47d0747f8684cc28d14618803b09bd89f667b296fe329efa48687c94487458707979ac9dd5c384ee9801c4427cc2082fc4e824b6eb8ede2747c32ae8e7773945f8a4b790f4519aca7258cc19fe009efe5089f8a49b88923dc1a93709223dc1693708a23dc1e93f03e8ef0e998849b299f62e651b7457d8abbd2dca3313fafcfa5f5f543662717d4e344a2c5f4e0defd71ce67b70af6256742fb92b3c6976c57aaa0dc713e643fa5d2c5e630dedac4018a30a8f45c18c26779c20729c21009cf8721bc8e277c88220c8b76b0e99e5c598eb0887b9823de5900e22f70eefa625c777d841bf197628ef81739c25d31091fe5b0b81c178b63dc50e98e39548e5384eb94f394419c24f00407726f4c904f72d6dc57006b7e89209e344b5db754290583fc02413f053d1908e0798fc6c456153d10440d022d9c015e896980a728559ad5c3b959a0ee35cb11b03f7ed8a863acc03386aba1957b4de55aa08ecf2ba7ee564adda095eb61d47d8d57771be7216fc4f490ed1cc73763727c9a7364af14c0919da188c32ac34018ae039623ce725cdf2a00d71d1cf17401889fa3888303b91d069280e4ed3c87f59d98585fe0080fc624dcc9413114138a8b1cc7c33139bec411be1b93701747f85e4cc29739c223310977538461bdf17e18c22b79c23d1ce1073109f75284e1101e05f7aecdba3f51d666fb38bf315600bfd1cf111f2f00f19729e2306580a7cc634d19ae509421204e84d1664040bcca398f57633a8f6b1c169371b1b8ce19e054810cf006d5018c88e93098ece409dfe4bc083c0deebbebd0a614997c5f547073eab1c9d31ed8678e9accfd890e7dfe923ee33cad0935749647edad1c30b7bd32b968f61698282eed154eca479494307fa7b9c4dc39f2c1535a5336577f1a205f905cfdba6dd4bb36039c448f29897a2248f4500fe0017dcdabba69dadc149b8e205974e9f3d7ea2d0e83271406307c71bf2d66e31e4c2e1db9ef1a1b1ed049d190e17c5a47682faf991d9451f84c737c3ea5f86cf1f099e913ebe782b1bb291dfaee19dc784ef9fa42e9e13627df6751f2357be4c3b6e1d5c919ab93b032605a5124b8c349f0d994047d91475387395bfa236a90c3e12d140ec7581cfc1bd0b2c7d85dc6db878f0d51a41ae2a4fa1c4aaa93a1c65f8bc66ad0f0eabc9520fef8cbcfb70c73b27d2e67b94efc769f3fc04f1f381c409c1e5669bb12d5317b65bb0e968e2ebb8d0e60a7c1237375939505ce0e9a2dd12013d0cdb4f14a8b9f4e2e443cbccbe1f0560a876b8238383e2bfbed85fd66b3d088fe7fdb8ccb2868e46bf5f73844de46217236c258f67ae93b46db9339fc7474ea51a41de1a47d3b25ed69268fe5169df3894b51e84791f43e27e9e75192b60544db5cf91ed72ee84ca122d1034ecacfa7a43cca5a2f153bb263d1b46f2d9ab756ffba751499463999be8092a98b95c9cf45c60383e749cf3e9012459220cd15c2438f71d2bf83927e483852c5f3d061ed3f1f9cc6399cbe90cba6a3789a6cdba7364cc7cf491e72127c1125c1a15812400e36352bc7453bda83b4174592094e927772bac0bdb61a6b742ccff53abdba2edcfca530ba789593e08b29095a3d1260dca264bffc6809ca74f2d5d22427e3bb28194fe494d1d1db1dddc4af85fce260be924d71927d0925d9f18058efcd607a726630923e6e9a93eb4b29b9cecd7a08f7b5dc69e5dc4d4f9bd6ee4a23752efa8aa3cc1c748693f8cb2889cfb3b19f9b59bb8fa37acf4ef9f4e56e7e97cfc91f71327f3925f3e990992ab7963297d9ea634ed277c78f1387cca34d51e304b48a22c1134e82afa024a0d728a1cf28730a2c1f571f5d43d5fa37611ec96a37742675fb2ee3a39cf190344fd7a5667d4aeef73e0007631a71e8b9773643ccfd3687f728fe05a7fee709f27dd7652e29a85cb90965cb58baf0ef06f1bfd7b3da4ae4d2d2489b270a2b4dd2af04adceb75a9d97344f2beeced39a7273f155b8b79c2fc9c57906c5bb43c0cd9213ce37143841135c4f4efab9dec0b1d71070234c01dee90b46e5249b93cab9e1010f595457cd4b01eeef950467b989c113ba6b2793c83c7008ba03c006cb02308500fbea620286a76eddbad963ddbc1c007b9f01acbaca43dc9b9f14eaedc4b950e63dee3213e39e984c6dd2d01bf47a60f31c73a971fe35d80a1b430db4469faff2b7a3ec2d930cd0413c05c9c0d77e9ac7e914c4697813fec29b6e5833dee2eb25bd85fbfe803b16406fa28e93c094b7f738af205e94e541aac288968f17d98adcee374802b9d60239aa2f1a354324f3fa056e6e2f08e8062940cf2240bf5112d0d5165067c2306e40e597b0f6c941592d05e52504e5fbe612caec79aca055ae9382f22082f29b8a0125e72fb3ad52104a31ab5c8aa0fc66492837125619fe2e9920b4d7a4a03d85a0fd164968377982d1a4c9c3063cb7f2f8574d8bc2bb540ade3604efb74ac2db60e1bdcb7ad4beac382f189ceaa4c05c8ec0fcb6520253d032c5c05c84c07c7f2981d95c8660ae44607e7b31c0e462bd777386a0656e9302f31904e60724c18c96381d2cc3c4e95904e5774842e9be0b6dbf277dcabc0b4d0cbc9d52e0ad46e07da72478eb54d8ac337b5674440ed41352a09e40a07e572982fa421982fa2202f5bb4b11d4c36508ea1104eaf79422a887ca10d47d08d4ef2d455005a3bc18a82904eaf79522a807ca10d42402f5fb4b11d4fd65086a1302f5074a1154c1c9a718a87b11a83f588aa00aae3589818a3793fc5029822a38b31703752702f5872541ddadb2179bf1d30c532ada1358991daea2a09f9502bd1981fe2392a0e75a9bf2de1d15cc0ac41654b621307fb494c0140c5c62606e4660fe58298129985a8981f93c02f3c74b09cc72bce1fc1c02f3274a09cc72dc53b20981f9939260067ff341f96d145308b89f92046e692070bebdb98583ae560aba7908ba9f96842ed73da4f2bf515c83a0fca02494e137df38db59f16368a2d08add61ba81a0fd194968b72a6af38d33a18cf614a420ccf55230b720987f56126618830eb4adc6366147ba03e66419c2b610c1f673c5f0a1e1b6d59663727e1941f9f39250e2ef242bf27d78313bac47e0fdc25cda61d1968ac5f6247722287fb1d8b13cfc4e4fc1598ed84ecf6308dad78a61a5e1a68ce5b82ed480a0fca5625b69f8edde82d08a6df76e47d0feb224b4cf8586b672f2cce308dc5f910477bde26f6f382f6bc2e48b3401157bbceb3482f5572561dd12da66fd13d022dd255a2905720f02f9d7e6327c95ff835f8b1194bf5e0c28c3cd9bca711dfe0282f24392506e0bf0a8d16e178b02fdb214d02f21a07f431268f7cbc9b9e1ef4a2a0ae3612918b720187f732e877ed136e08879d17308cadf9acb8094ed450577328b79d1f508cadf9684d25d7d3a5041ab4fdb11781f9604cffbb606209356deb7ef967f4c3f8f00fd9d62c474ff1ad4a7c7c6af0308e8df95047a1501b47f025abe2f6cb98e80fc3d49203713400213d3665d745cc7c41933edacb45bccf311c0af974eac2fc70d8a6b1194bf5fcc70050d616db4d2c2d54504e81f14c38b6600adac65bcc308c88f4802b9dd03e46de5bfc354d96f1db982a0fe4349a821e1c74b25cecbf5ba94b3912c3ddba09cc0ab42e0fd9134780366765e39b3a51508bc8f964e24177c525e2cf06c4450fe7131ecd0bffb73dc5e527ee02510787f528ca81d3cf7117fe79258d43e8980fcd35201b21cd39f4308c83f2b152005f7d28901d98780fcf3520152702f8818901d08c8bf28152005e7dc6240f62320ff5212c868377ccb71eb571782f2af24a1f46ea1715e1eee7c7758876aabb015cc5e04eb5f17c342c3a5e5e5f834db3204e5df4842196f73a220b4629b135b11b47f5bccc10f4fb965bec3a8d2f6235d45b0fe9d24acf0fc255e0dea345699365e55f00118b195a00508b8bf9704ce9d811faca095a01d08bc8f498257aba83548c18756c5f6605623c8fea174a2b4e07be6c4a2f43a04e5c78b11a5a7d53d05dfea52f9bbdc6b11b4ff2809adfb0801b52733f375be9575b7f10c02f79f8a11729a8b1f72c4e2f52a04de3f4b8217ee1b8aca77d1770902f213a50264392efad62120ff4512c894c757ceb077b4f91055790fb57423f83f2909bffb1a1f6e61ae125ecbdf88c0fcd7520253d0c38a81b90b81f96fa504a6e0a2b11898bb1198ff5e4a600ade5e1303f30504e67f941298827786c4c03c8ac0fccf520253f035e76260be8cc0fcaf5202537081440ccc6b08ccff960433de9b40ca71f7e57e04ed1b92d0465bc62bc7f726ad4150fe4fe94029f81d3162506e5015f3dde52990e57fb13934e6b8f7d41862a7726322e8f56dced785d75bb4c635cf9d6ac85ce17cc9785a65be3a3c093e2f011bbe727db337fe06ef609a805530b54f0120097a7c8c164ccb85f8ae724ad2dcf2f1165317a09524ac2257b4fc6f82deadda8d9936986fb5efd39a7788c34d8749fd1998829faaff07517ee64b73e70000 serializedProgramBytesString: - serializedSignature: 5998ec1d6aeed19fbcae6b5b4bec92500509020b3b959425b8ce934c39788fbc60b28b70151ac6080208d1138bddf6af3ed8cde00432f24a9394e1a783e72207 + serializedSignature: 4721af54f85b1ebac23061b1a1571f5719437b24eb75808125a4e3da219a08bf777675fabf13b606cfc97a354c1f874100ed4c7f7be08718b7106f63a2febd06 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4624ec24c9f8ec4449a12e6ffad1f51b.asset b/Assets/SerializedUdonPrograms/4624ec24c9f8ec4449a12e6ffad1f51b.asset index 1befbd4..a44bbd7 100644 --- a/Assets/SerializedUdonPrograms/4624ec24c9f8ec4449a12e6ffad1f51b.asset +++ b/Assets/SerializedUdonPrograms/4624ec24c9f8ec4449a12e6ffad1f51b.asset @@ -12,9 +12,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: 4624ec24c9f8ec4449a12e6ffad1f51b m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed5adb521b4710ed115a5d0236be05ecd8c4388ecbb8ecb08b9df2730c268414765c02e107570a0b58605392502499d87ecb6b3e20df905fc8d725dd3db3d25e66b55ad0108a585bdad99d4b5f4ef7f4f48c94b3013fe211de36a1024b300f55d8854368e2d312960dbce49b5fff0ada58eee3bd866d8f603665247dee8beb785fc5b70e7471e43bd8c1d2e3f67570f17915c7baf846b57bf875b197c8e3a02a3c879fe0254c8bcf53486cf2a08eaa13a49728e17d113e60abcb4211139b9ba6f1b68e2d1d6e6ba0d07ebf37f033abd5c0b61d1cd3863ad2dc668aa5ef682cebc4455e95962ac7f05b56cf05f52daaf79c6a2399729660ed7e407e3568814d8de2410633f823d30d40a40b3929335a82d87651d51612d0a050658cbbf0041e6b51b8212602722ff1bd863d3c265a8ab3f83bc68284abe3e5064cd8c1fa15f60032a2872df3b086258d7a0b0b689437112a9bc8b68e6ee0c206de5b4cef2d8a1def99a612993b3aa68234a53736b0c607b485ef7596709def472ca9cbd2af625d97e7461367c72296ef995b5cf7363eeb786e28c8f432ea9d32a95ebabe6fa6e7a80d496f937f7eb2c87f621182be5052d3306f73e4f82366894f18ca206371b097341664b80dd53d069b636e258660761de31aeafd5be2fd14be1da88b1e1932f74dd6a06fe13fff3afa6d62edf5452bacda13b069d910b752541b042cd19b1353310a8355b0acbc438246e1173af879595b3f45f8653f8ffb6537408157a6b00118e22a12f45020993cd4380e7ec06107ead965862e2ead2fb0a689df7dee1bb39ae32ff6739a65354df824e8733ae84ba70d7d7aac19047da9a7571f7afae8112c27209826431282633a043947db384504a9ed90a9900f65c7f03394f56114433d80e30ce0754d7e9b26421284790d840e59754263d97ff06395238211de09c42d1d71ea7f41a3b288511e4fa65cd0599e8014bf1bb5fcb029fc0aefa05cdcde6cc32f2af7f2f91e72de4512f9395c05cb3d9682ea7754e01fcc6bb04f5dece1d307d8263cc572868d88792d2669c3c4ae7d895d7b562b9dffb4883429761f711efb0e39e93858967ef25c660e674bffa46959d4cd1caabca25bebd67a3af95c823c646c25b9f6783b473ebedaebb9cceb23f5a8b0866e6fc59c872dbca8f65766435e26e78ac7ac3df888a5bfa7a0be415fdcc45a0f79c46635696115f112821c729979b771e42b1e416f1db029fc082783ad887703ed44617003e5dae6d99d6e81ab03b6d07b23db4da569a1b3d17cc04a41ed868f0df19d635169e4d342a429169f3b4daf9155d5610ee46c0e870f8fe94de952d0f155614cef43d9f34549e0a58a3de2829a24be4b2fe264fc88974c6a53b90563978edb374cc0df708ce00c895cec19c2b4cb81b083177d68c247887f3f329f3bde66223e3b2619eaf71cdddb4c6f373a5ba8cb99937c2ae8ed73291ed30fbdfa90e950e89dfe9f47458730a43cbb50f483884341e486c9994e046819dd510076234b6a38cbdf02272ac1498e15caa138303e8c7ac7890516c70209e617a6c32681d9e6acac8e4f3e6dca4a8c016799020e02c0dd3409dc548a17068537ea83655350e60350de320925ed6928e285037030341bf4446353782c00df8c49f8ee284f949b82264f6212a2cb5bbf26fca87efa386ffe990b00fca5498027136364537531065ed114782200de6d93e0cd28f0ba70c0937c2bb2054f3eb430ea95974c01cb47e0e7238b77a8cb2c8492e66162b54c9d2f2b8de98ce70587a31ab6d5b8eca7d13611144f21db9e7330cdf41cf74e50a988a5ea23b3d428f2769da627c9e1270658c526939d6bfdbf82d079079d128a8511f85eba447721cb5f50cc275067cfcaf25f552dee49629ec4cbe9278e303d8ff9da57cfa6878f4ef7afc31e7eedb81e9e5da27b263d5c5293194484f6ca10dae9ed10d5b9dfabc5fed03fb597f3fd00e8ef73e948ccf0e63099da337cdb675d3da6da00ff53b4fc6b9a8f9eaa3856c618fa75a5cd7fde6b734feb5fc8759739b8280000 + serializedProgramCompressedBytes: 1f8b080000000000000aed5df95f54d715bf33322c0a125744441151471166044de212151091c42d02266d9212941127012430aedd922e699bee6d9aee6dbaa7cb0ffdb5bfe58fe89fd1ffa1bde7bcfb983bef9dfb969977863756f8ccbc79dbb9e77ccf7a977993cc08f9973822df6e88eb6244f48b29312bee8a45f969446e17e4bfb5671fbf2696e5764ebecfc873474497cf9df07730b143be8fcbbd15519077de13b7e4368fe727444e7e1e97f7e6e41e1cbd2d5f397955a24ede3425ce8babe28a684b6cf32171036f5a51c7122057a251be0f8b47f26c0e9982463278aa4dbe4dc8332b786e41326d5ff79a7803c55a90e76ec97b96c5bca4791329367e9212f841589b46b56d52db75dae7f5f2552f5f836a3fa9ce35aacffafd75da16ee39a6f637c817b4f8aada6fb6f6c53fd47e4b8836ead5b643e371a3daeed28e7568c760dba9ee3daeed4b3e13a7359eeb9411d9edc0eb59c5fb69c7f1e702f0daaab6bb35be526abb47d1795ebbc63e0edb2e75fe84b62ff94b4e3ae8d8f7ed55d79f2c952769ebf819b5ed56bcc8fb935bd5b14d8e73363dfb18d03de5686fb3b60fe74f2b9ce603e0b2c5610f361ffb14ad17b47d90e19f8adf4fd5f16da2d47efc6c52beeaae3974d243e864bf43273dda71d81e70e8e4808376ca71df41874e0eaa6d5a1d3fa3edc3f6903a7e56ed1f56fbe7b47dd86e57db5e757ec8a1c75ec7fe1175ddb0d68e7d1cb67deafc88831ffbf879875c9bb57d4df710367cf5d1a6b63bd4b65dd1180d706f8328f5f77e75ef056d5fea23f5a143d7194dd7368dac43d719ed386c8f3a747dd441bbc171df8043d7036abb531d1f735cbf59dbd730acfb0f85432a8159e4a28ceb336249641018d062d07467dfe99fe880743d460d01190f9a2dc894b2240910d9660a73594146ee0132dbb4279a35be47f07d465e9147a217dd4dfccbd50430372fff735aaa5c91c7c730d342b2cccb33fde292dcc25d6f4a55bd26ff4ba9dc90cdcecb749b1393f27d09e9bd29d9765fe92712a455e73dd7254d2beb2fc82336a04b727f1e399cc0f7fbc8690eb91f97c70a58832cca2a64586e1f626b6ed997e567aacd490519cd239dfc4dc7ad12c356d379290d709f01877eaa9135d108405f7f51b9615d062bab0f5c9a788aa1156420f18e2b1a4711b244c9b10191c1dc7cdd85607819dd12d2f66de1fdac2c82bd64a191017577a004450d7ff4c9fd07cd975ed9982a156d5064b024dee5239a17b0402f9dd8eea2e02d422a559705469df02728f8315d4e54117eebba3c5e175e01f598994a1580104f498279c990d5499bc138f848de76477dce618339995a2fcb238bf23587d7bab496ad5745449a48ab7ecc9ba04f52d037561b7aff58e3057de3aa5c45e8e18f46b0c980a01f0f2604d7510862ed38594504e1dc5da40236141e43e8b4f73a31a401dc8000ee7009e7cf8209c23a02c22c40d84c72d5e4e00a070b68ca294a39206b628e553996d3438d3a8a67f358e65805ce9c74fdc2ea688be94a5b319771f4e61ef2e0adc29655598b6065009b44ef6a188a9aa38daa2f827f0d29da605ad160f8983099553da57c30291c72a8bef287641bb358fd4ec8d73d79f72d955efdef086e06306cd3e730035a2f9b502f590fbd44c5b149430d9486d08eefae91861691fe8c3c0768fa59a37ebdd5ab09aea7cd94bbe238c5a0a746a2e4704b10f7dd8a66523da64cc6d248650938b88dc8ffff957fae44d1644e144da614b49d4841893029683d65e338cef41eab8d071de819c3f98c9cb82a13f45bc2eaa1dbedde45850147764fffbadcde462ee0b81d0dbcdbf2f68336ca0f70ec7954041faee297020a9e243a443b3a4417c99dfd6958d2840aff3e1a38444eaa8594c1e576620bf192dfe4961b4c6ed941b8e59220ea370fb76c3611df45107f3724f1168a38786627619259304998ba580fea4fb9dad9696e6723150170a4bd9a7d2cdd32c2f70ff604ae2aba04ddbff26bdf645fad147a983cab3f36535eff1426c6da02f74fbb85d7d04ad8dee933147a5baa6d7b136a64625e788fd3d1f8c1a4de1e177e178769fc7a0cf6e7c78309c14d54940004f7936c1121a8c71c1a3653c4e1e001c2661214f16e33f12da6e079900a9ec970c173ab2978a64dc1f3d06a023d8c2a82b937538548a5b3f0ddc230417a9b09ac5e02ac4f4382b5dd64434768d31e0963436d1471d0449f4913fd65a5b11d5428413378cc1a4afc4a202b3002bddb385368d1bb22606dcc03b48bb7a5b5dc5725d0a4bc661987580b1597ae3013db4944007370cfa2e59f11fe851da754a650d74e5912f4d16186c435b80d616a484de8ddc7be5c4efa2de87d120bde65e466c5ed280d661bdb69e26080e2a005edae80b21754db97a4840f10b730ed7650b68d21e136ab6d9be2592571cfdb66a11f1fac903b86b67ad8234a57169d694deca22c0034719c62dca9e26366157752842166c37aad8a0699775394c13b60c51759f88548e27b4cc49f8f8078970993139562b29772284c83b93571a8e20873b4ee7432b03b9d42773ae4e14ee5f36872a66e4abf5077c0daa14a6bd77d26e379a152e3e931d9fc99086c7ebf89f8d908881f306172ae524c0e5294c1a18682c4c55366c2698270066bcafc9a78eaa458c609c41559f880a52f44ecb1c3813d76043db6cfc3632be7d5e4b98728ad6005fed69a68e565d9c68c2a4817d5a07db47a8125a3eb9ce3c058917a7514a3e00bb2a0f3cd30303b2afc7aae513064328ac3a6707e218270de6b223e1601f123147130e78b84d6b3ed6e7d28a5389b1c3537d9676a729cadc97e53f47fb1d2e89fa12843d27a49549eb4b226e29722207ed484c9e54a3119202867b003b920e23079cc35717c45044d6057315a1df58856d1f16c8a598394fea1270e5f8170f5e82f097b64c41eb9d0c72da83191f1d52b8ba32130bd0567ed6577fd625afec3d177b019c0d4d2781e9bce8bc79a5470ad8efc0d79342fdb08339e70cc24f5cb94d4671cf65aba92cae2feaeb4d669d40d8c763cc291a0390fae4b69789f0d23d9719364d729c9a68cb6a78f1de8128ee3d977308bceabfba695e4de54825d13150ecf9a7098a0703077fbe825361622d7e4ed334afe4a2df23913bf93d1f13b81516429127e9f37f13b45f1bbdfe1414338fe08d8599c5923a3d332a359cb6d0bb29bede4b238c11686cf13263e6f507c0e39f82cb6a9fbc0258c512b52357748ef2dde653e1e959d9f34c9f70a25df80433eddf79c3a19533a092a834e2b8c04a74c12bc4a4970d268f9c5e1198bff15c57f5e6525e80616e395ceb93ef518856f9c3649f4194aa2b3816c6e48f2308bfcd3f924bccd95e74f2f9864fb2c25dbf9d57a614276205f92763e837a299d27b1d0b7a41d97e7afca33d6d78ecc99859a818cceabce98a47c2d9c4dba97f894c6bb826b80c22cb17b30238c44674d12bd1e4e223717a512414d5e70d43d3425aa271e46a2732689dea024320f134daef63a7439e01bf9f328897dde2b6a84e17bc8c4f7e728bec71dd1416f558f0f97b1ce07d497b02ebbe5517b96c6bba091b05c79874df24e53f2be6ed413652f1602a3aa8fb35cb6a45e18f058ef880995372954e6ca4085b20baf5a9da214ee5a2eacce9bb09aa1b0ba103a76d9954265b12b8aca61d424e94d4ad2f7055f6f7c02cfce4a8af75022a06b5add00d787e323c83a09a75716bf401705d2174c48df32d994a9d60dd23b36ddeb7526aa5a66cc24e96cb8ccef1c8b2ada49013d0baaef3943142e57770df23f918041c651b40f1859b98677c0de8ac8e0c290ecaa1ff82fc486b61724ce802558dbcdd50587de146064d5f41405f71a9472bf505fdeaaa37152bae0aba7dc0f0f685012d9b424d2b8f0e3499314e4a9b7bf6193cce01a94de32adc99f0bc8e2f5eb681b0aff95618bc015d50f0abcdccbb75dbf85e07d48c0fef679040f146940cea17bbb2cac81958febe0eb4ec92ce8e30e276856190a0f5a985590d5023cff4e16e1c973c2036bab2f62c299451787d2d8fa4ecab004ad808960b126203b278a90bdc509d9560764960bea705d5b65aa16809bd55cf16d4ee05a5492b7533240f658fe5bcf65a805a8846663f3dca17e1a6de93c366d9a29ab05d0ee602c6b4839883b0beea89e51e487b4b9246a45fb7c888379cb486fd65922e142d3b871bea09738691f374b070cf9e9c0369826726c3a54944c072e6d8abd05bacacf426f019efcf9ff5cc867a19087afefd70f2a10ac88b5c419b176a20dd873318bf222d3c84a7116671a565596f251c923919a4a62d9a920429613cf0e6a49e01d4e48b713909a8731b37c50f67041d9ad41b95c0d286f29f7f61e7b6284b2810bca760dca154e2877077674f7602c2bb4235cd0a635680b6b6ba5b5eef0cf6850dee384b24d4139678c9e3afbac89a8890bcc660dccfb710293d132d9c0dca081f9204e600ed62098db34301fc609cc811a04738b06e6a36a80694a3fce05ad8c6ebe810bcc260dccc79c607688a06552e99c2063223ac605ea2e0dd4cfc71154464b6503b54303f50b9ca00e126ecf31d7cfa8842c971276684af822a7125a9412a0e1db68d7366d983a67032ec5059cd080fb1227707e7da6daaf4c1b3528bfcc092574ce608cb374c0581f4a66b444b68cbf4e83efdd6a5862b0e13ac64a94adf7deab41f9de5a3a75ed43b95d83f22b6b0965d50aa52e2e28376a507e353e0ece58c8b359e5610dcaafc5c7c16b11ca4d1a945fe784b215a91527499d8b385d2b2ba2036f2b17780d1a78ef738207b3e670c29a8f6484aa950baa9406d53738a1da4b443fcbe2c0f616c58bc2fa05aa27adfc4e6a007f93136058033183cd165764acb85645d462095ea741f82d4e08b7291b9d9717cda3ad9abf2ac99854bab980ecd180fc202e40323a351b90bb3520bf1d172019fb316c40663420bfc30964ab300d902daa4b6a6fcd464203efbbd5b04253cfa5d6e3e27e0dc8efc505c85a8c8b7b3420bf1f17206b312e6635207fc0096479eb2e196d936ddde55e0dd21f72421a6eb12063bc644b3c3b35287fc409254c29acacf666e82717b1c1b7890bbe7a0dbe1f73c267afb5848725c1cc4cb847a5303af9612e68b76ad07ec809ed9ec071937e120023b8a35ce01ed2c0fd499cc1658ca96ce01ed1c0fd28cee03296536ce0f669e0fe94135cbb2e35e5fe5aef296dd680fc595c80acc59e52ab06e4cf3981ec0ceceece991f5660af72013ba001fb0b4e60db08609fb4e5ae9d1a98bf8c13988cb1930dcc2e0dcc5fc5094cc68cce06e63e0dcc5fc7094cc6ef5bb081794003f3377102f3580d82d9af81f9db388179bc06c13caa81f93127987699541c2a295dc36efe5968d6f8d9ce056c9b06ecefe20a2c63966703b64503f6f7710596b116650376bd78629e03938581d93f8071a49471a403ad9e4f075ee493762d4d4b071a4c4f07580f683d446593c21d7e7dfe325e39a31edf32a33d502583bf7e083fb510e68179de3401756f6a7f046813b4dfcd47662f513cc18592d45f3eb3ed357b6825d305ba7892e5ff93d09edc93ccc08c1ffe784ea5b6e7cfd19ff5963966c1427eb1267e5a86c735dd45e69691cd4aac1c524129bd3cb69be98ea7854727fb5ff4c896ccec2bd7c2c373f409a7855bd4ac3ac6417b2c8074b41e9c3217af5a427bd07f062b87cdc38f61f923d18933fc666a43726f0e65cd23d50561ff35e0e38a9359084c7fe5c4b3ccb5c04fb2e798a34616a2c6df4a1c2b0b8ef5f7a7161f91c5c37f1b3e766f4a141ff277555e3f8bf4e02ff53f1dc8712ed2a30000 serializedProgramBytesString: - serializedSignature: 861af24ad9a7628905720b44aca116f34fa80271bff301b0ea2ef0668cd80160198c70866fc242f88aa7a69ba2d85cf4baefadf45b24859b9c0435c915aa210d + serializedSignature: 585c4b90e97f8ac5e4e0595ce8e9d80de8055d359d282261518dca2d74f5f401119a13cc192e36b92c1bec98340c83eb31fc06818036218d73ff5fc9a1b3270b programUnityEngineObjects: [] - networkCallingEntrypointMetadata: [] + networkCallingEntrypointMetadata: + - _maxEventsPerSecond: 5 + _name: ActivateGunTurrets + _parameters: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset index 8158dfa..1e330ec 100644 --- a/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset +++ b/Assets/SerializedUdonPrograms/4715e20276be3b141a6a216230cab4e9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5afd72db44105f3996bfd32440088502a52dc4853452da19f88f99346921434932759c7f3a8ce3d44a30d8a927361086e105185e88b7e2019809bbab537d92ee2c3bf63538d41a4bd67decc76ff776f72e4939801f6b056ffbf014366015aad080177082bf36f0d9c6cb7f0bda77e1149fc778af63df0adc4c98499f65eb1dbc6fe15b177a38f327788ecf26f757c0c3df5b38d7c3376a3dc2af87a3ac344eaac226ecc0362c598b0924f6795257b459a49795c3fb43f8157b3d168a9838dcb584b70af674b9af8d4207e39ec177ac561bfb9ee39c536821cd43a698fb9be6b24ec10332f82d46de4bf8b5cfcfcfff11edb678924679e9373d67c49c59f19e92da2df1a5fe6b91f7b9088f8278e6251ec13317e19195da037a328f4c94876db135be467cead0018785bc3b82db0433931d8648675202cc6566db43d3749080c26a55f6891e3c80fb4aab5db74a92dc1b7cafe3882613256611167fc55890702dbc3cc9e5bad8fe157b2c395d137b56e1093e69d601aca1133d8b50d947b62d745b0ff6f0de617a0728767c64924ae49ed1394f91a6bf7adad81200dac1f7164b58e1fbcf2ca9c7d26f615b8fd7f209aee687f83c636e71dd4ff1b78ae79e804c2da37a11e9dafda51a986913b521e91d5e03af2d721916e1b0342f9661dae168f547cc12af31f4838ccdc9c9a7b1e6a78750db7d7038071cc4101c5dc7b886817f0781b5822be81becabe3788fad44edbb48b18ebc89de3a73e807e3f08c404f356ae40af758bbbef5edb0ba0fc0a1f461dd48507710d844af6cdd9172ccb86ad976da25e1a3e6b254e6e21459316aae30e51dd4f90711d206399fda2899618ce26644ee2f2b3269127f1d7a29157ab9578d9e3faec9e346472fc7a546183d8b8abadfc085df71da2316dbe3c10d0db0790db049a2e9809d5100eb6645a517b3753e22120dd4104eab08d36b7118c2b69eb0ad235c1a93704607c5ec985064558473a2128e794421e411675c44b23f4439e6f51c733a55e6c65425af037f7e4cf00b3ac20b63122eeac07f4305fe972f334138aa6f03edfe7ee105f5a35866ab50c3eb987b6a5806bec0054784e45c412354f4745965142397749abda9d2ec0b8d663a497cedaa3c661de9f77847f33dbb6285df82a298c6c9c1681f5b9b233aecac4e97b754ba7c7e215d024b35b860ef8851db7cc4e0c5b49003ea289a5cd369b2a8f3371d575feac7ec736dc67b908ce11e39cf4e4ab3399d666fab347381ce554ec41ef811736bf2c66913bf873828d0f0091ff544a51ca4c1600fcbe2657162f513ea29cedce519f4d6058783980bc39f2b10ef36ca431bc23d54f1902b89e453064ad3ba53862398d48633498bad9765c511afe16013a3d22e5927fde63a2b340a6821d21cd5af9aa674cc989911564d399c603ebba037254b715de6967852955406fa04829867d14aa88985e1f1692b1924914b52157f8f0904fbae091caf916bad233c0dae8dbb78d1276ba75c42ff5d93102d3044bedde4ac172ed6a701b2b204d97b26219bd742d6af66a701b03f19b0ac1d21fe7862f1ec62bbcb78e49de35c7786e2516b4fd468a148ccc5e27f4df21bb2179635d1a83ce4122c0fe577fde2409dd45d12e2fdff79de76296f7f4020148334c751e3439351a3c4d6f3eddf65fb9db0d2355cb1115ee39cf8e54371c31e46918bc48ebc146c6f9a842d2760abe3806370f1d79a39b8b2a6e0ca49707d6412aea280ab2d18d7795b5843e0a60f344b02edd66580368d9e969140bb6d12b48200ed28b481370859de14645909b23b9793020cc2662c05a425d83e36091b9dbf245547f2a1d8f441694b507e6212ca450d94fd0272ba812c48402e5fce523698698dc106126c6593b0c5abb9692c4c6624b8eebefa1c6b10326339360557e6acc1a5b5ff29f8ffdc27960e6dba17842e1408be058f8342834d569736e00eff29a8ff179ee1ce5307d34cde1dd3f96dc6527b696b623698c48e5fa5e938bbffd200ab38fcc7acabacff4ad44d9778b35345cbfbc43dd8c1c10d168a3ef6bfe62e7530ce2c0000 serializedProgramBytesString: - serializedSignature: c9179343930167369b1d5ed4b23ed7fc3975cd3f1e10c36df7b5c531a9937356210e147527194c26acf0d303a877918b8855428b60d966cb067aef4097b60b03 + serializedSignature: 85655b57321a7fe250c805a8e7e1a67b7832e4f020665b5c2f4ea848c0e77c5a1b6ed76424fd52e9ef3cbc67562ba5ee0ce84d9eb879f699c046fe415c868605 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset b/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset index 02868d9..23969b2 100644 --- a/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset +++ b/Assets/SerializedUdonPrograms/471c284666debf04982ed08687881498.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9c59571b37148035c62b98c5606c48d29474c3298bcdd2746f1396b4f4d084c3f6d0b4071c30ad53db706c8793bef7a9a77fa8e7f4a5af7dea4fe87b7f447bef1d0dc81ac9c3608bd834e3339a4dbabaf79374a591060259069b350dc12edb64cb6c96edb04376cc2a70b60cc732fcec2be7fe06abc2f17b08f3f06c9a4d78a4c46dd21a83700dae6aac0e299fb3033816e9f9162bc0f91aa42dc015de3d82bd00b1ac2024da612bec317bc4d2d6a887885d4a54e3f72cb4cb8a42b8c47e82a705520a33c9d2a334045bf0a446cfcaa0b413ef09fb8ecc2ac3b3034853652590f9942446f7038c4e987d08f1630f3ff6c11e867d54b80e72c062bc303fc6f9794ab8c6633fec31e11c8f0392ec015b36fb9b5f07f9715048ebe41711e2a08cb4f43ccaef8fd9369de9ebc81c52c88c79c8ec1564e27580a789f27315bf84646382f3fb5dd267b8451b2faacf88a4cf882d3fb02ee9936c379f9045b5ff4ba88f7976c2b2a4e05d76f166eaa4f46ea0283a8c016e93946d1d9ac2090850b4921d6a8375b6c0e695ad64dc8a0b7a2f5398871845123aeecee2375716a85c097e05a189d7e0fe17e421b09117e1c92c5b8723a6da6773d0689f48527621db12b88902db86f084e4ed83daee985e26a13b90d36c824cdb5b95e18e03f404ae4ba4e11685a7a46981b45f837b75f29d15f09e4b707c41b9b96dafc2b92acf6d8e4cada3da69e9eedbaed129a615b006b5cf52dd7c55222fa344107d789c37c360963ccb2fae9278c5d07632e8a8d7b88c39426635dc9b6759f2e59b2e82fe6d745ba8aedf36ef7b6cb1a92d6a3258dc37c982f312fef38f7f7efe35feecc750a3690b2c4bc3875b1ea635038bf23256ca25a1b909a15030878acaf82d157eea8eb7ae10bf1daf48f1fc1740987aa6c6022040db70f202f61244de80300fc94bdccfad43e23c74aa2b10d6617795542ecc0726194557eaa5b00e7740853b7ad5b8bdfd4b33dcd133bbce71e3a62618d310f4d24147b0474590c66bdf1a25e81e8839674b90f60720714abdeb7348af1ab835678a03ca1989a99a671ff19c500e27fd69a4231c5410ce21e1b84ac998a424eaa7111c5209c6dad4afa851ffc2e6121ed30b0fab8463f31d5079077cd13a913cc232f704257a4776e51dd1e71dd1e53da8cb7b0f7e73b01ff23cf11a07dbf69bb99fbca3babc875479dfe079e728747ce043aaf36589002638f38e3e348ae9344a34a3916b0b8d5e5ddec3aabcfb95342e63739fca2b9132db57e8d7f1d93149c9435cff9e1d5f91a764cfae7643497243632ee3bc55d0b99db80a61df55778d8f41c367cc7e59f20f70f4c26e3ca5e916bdf2d7d1ebd739ed748b4e7b4025186bf698b2b2c892937ac9833a95c75b54794827f8468b82133a16375b6531ac53f9568b2a8fe8547ead5595933a956fb7a8f2a8ce87bfaef2e10f184e3457f824d52a35f022cd6c884d69963cfc31b8883d905aa6bebfc8a7b6f089b7048c2536d54647e7a7af48e9ec9b50d9f70d73467aceb84d9c00b4c7d0e8ec8e68aa0e9dddda59cc557081f6ccfc26595100bb4e29b6cd03e780ead2aac02ef5bb45089f9275b2dde29b8ffc4ce4e587485a47e48e8a48c12091ad9689e878c8a97621872268e587d3988ed31b2a4e3b86395520ee32648516a1dcf3347eea4c730e11f859163a8b55925c85941b9402af6a2c4ba3861c53bd0da927d731ef32940bb6ddedb332f59e6a7f93e9a7da8f5cddf865675dbdac5095daac506ea275de36e9679823dc22471690a611c675b3f42d2cd51e5eaa812c0d76a62e599bbcb5785bcccd73b9c66b8ec916f0887c1408c0518fd72b9d679e5ec3cf1912e04c4fb661c5092bda03d0f790c6cf35f8ddb7188b8402392c8b774c020b3500eb0634b83968264da2e96d4083c703aa43dd00e92faa3f919024fc61db3cd7e5a6aedd3e76907ab517a01ede457987b2cfa557a44ed33c23d6bc8cd48c3217f243196d0d3beff0d51d750e3bfcbbfff3be38877df1bb0861d4e9bac8274c99f40929664f96d943af0a446a36d8cdc9f9b7b2e4156bf01aa98b187719cf1117dcebf455a03ce075b1de74bc6c1065c414cab08072c6244a670a17333ea23ae9c82eba3bf5f6810b99022776f1b326c1dd5634e7c6b745fd6ad21e18640c6d9f29b44302daeccb6cdea2f2469b77cc14ca908032671225ae6ec9eb74dd57f37a045c739ddba8e7ba10eda08076be73fa6c83fed1589f1d15502e746e2d5decc25a9a14d02e9a447b47811695a813bc0afb8a7f2d7add3aa48000f8bdce710306ebaa3137d02ba0bcd7b96e60a10bddc0b080f67d93689d8f6adc6f45151ea5fbeaa525c0fba0739ab8c1419331941101e5872651e28c8a3c7c773eafeabee61b14b07d64125b5ae119f5df1e18edb193a660f609303fee2498061bb431980302cc4f3a09a6c1f72063301302cc4f3b09a6c1218f31982302cccf4cc26c6d3469d0831aeb8efa05b49f9b44eb6f4064b0961a1b10c5d8b55933ce6194fb4c5820cd286751334d0767f6326c82db5f012dbe66057ae27ca37fbe249ba5ef6df155d1cf5733cd657aaf97e2779f614b5de34b6d2bb776ac01ab2c6d653d38dea454b2f489f275b67f89d97f7a4f1b56d3347d2db003256f0bc7cf76abf4df22aa1427f41f588a614029430000 serializedProgramBytesString: - serializedSignature: b1158b7357ed31aabb88a3aa016dd4a288edabc5491ccd5dfe3c43a7f4e9908ad573fe90c97fccd465b044cb78ab3562360bc39c55f022a231d673b931b70603 + serializedSignature: b889fc9227faf05622cb03a7eb5687cf6e87322594bb6d60cb42e75064830aae16eda50e6de48d12a154ade746c2b770b7f104d61b999984a9430dfb2d985a00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset index 142d4c9..7b7a360 100644 --- a/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset +++ b/Assets/SerializedUdonPrograms/49ba99e73d9ab4349871a10f182ee457.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b53db46145e19cbc6d860201093344d69d314a74990c169daa6b7844b52a6699ae1f6d0b4e31830291d73191b68f2d8d73ef7cff4bf75869e737665afa55d49c65e1368f0586bad76cf9ef39dab5622e630f8b3eec0619d2db37936cdd6d816db677bf06b1eda5df8f033b7ff39ab41fb0a8e65b876874d86ccc4bf296b028e4b7056678730f3886d42bb43d75758057e2fc1dc0a9c61ef367c2b30ca8ac3a435b6c07e62cf58ce1a0f21b14e93eaa2cf42b9ac7e38ceb13770b5424ce1220e5dcac16105aed4e9da2e30ed8e7bc17e25b176e1da26cca9b12ad0dc208afdbfc0d12299a8c9b2c6294b49bf2df14dc07704bef6c9c9c9bfa26f58b431698e2ddab8d417176d9fa0332acd93fb2f79e867449b9668a5459b1273c6a4736c07449b14d7c73db486a4b143a21d14632f4be78491e8cf4934dd7e1713790df77cc295c3b648f3df832ecaec803924f0ad364cd49d196e9c483a11134a9ba2650fc10c0e8080c242d6c8fe0e5991cd2a2de48a9591f89ea7631946ec10515cccb3c43fbe2590b92a7c2a9279d7a1ff0979071af80e5c99664fa1c5592fd90c18ec0b0f957558b60a2e5261ab703c207a2f816dffc83091d015bc73968126f7d45de871013d80f32a71b842c763e2b442dc2f41df21c58d3d881c73d0bea6d5fcb2d7e0b76acd5501999a47b5c3eafa795870d5b400d220f70efad33b8d9c894628945d116e187728f2fde5d3c43b0c7990b12911721a333cddb4f4cd3287f2c9cf3e04db97d12fa16bdf6e605d010ffa01ae95617c85b484fd6bc46f3300b78e7265532385eabf4b1235356eb78a58640ea60ceb5a8888410023bdbc755dca2ba711c5b6e30564d8ab164ba5164a857ff6442d6139f209956f15a8ad36d8ef22b8b9ebee5360438edc20b90ced367181fd9b02d1e0b582959c68e0d354b24325c2621b99debc14a8b2582121ea97bc35a9e4cefd3507347f83b58e29511cc14aaa156cdb67ceb4428a5678bbe4d7d9774c65df5422968cdaf71af4f17a6a91aeee90943ce46340adc0d843922b6864b06d0e440940a4b13469ec06635de24b87769f0a6d2ada578ca2dd4a998fdba17141294b8d6a2632aa8384aabffe0e5b5f875e5c851edd12edf53045163d123c85b165f0397e86e5849b5f9a631660cc1ff0ab2ac67ab3503104f3a1c8986709f3595f3634c3b54e53b6425305d4d4b04a9094471094414338a132814caf1d480ed3ed3bd04864658e6a1c286c7d9d5a922ab560f8b914452d837ab5f4eb088f754838a5233cde21e1011d61dc0699f210b6d0ff106834981a013d4980e33ed4247bd0d6ca699d6fe43af48d8c8ef044878407554e479dcb3d74bab05bc12097c37bd29c0701fc53bbdd5572bbcb3ed98239d039dd904e2def75a896ac8a309e5e8b42d8d6131e5611464f7c3f0ae1b49ef088cee9aeab9cee4d2389b9e9469fc0c293179add342bc1c79dc96f08b147754328df34961a67bcb4960b6b6e14487d9b3609d1a8971a2317c1d479f1be4cf1ba02dc1dd3685c5736af7518bf03b3da0925a33a3c3f50e1f9a80d3ca394031ccd570c37ed4b245f1d16aad259ab6c329576e4bba4936f5225df7da62bdfb124774b77ce755d707d287a8338ee86a6c674927ca892e4a1514d2d369258b7f434ae93ee239574f39ec02aafca39dd878451628f80f32dd226dfad0dd65154ed9d56c6cb3a196fe864ec8506dd87615e299ba9aa1d19733a193f56c958f4e8719eb4c4a39beb67abd017a48d269fddd2d3844e869b2a190ada98b100df0d18f44aca1a7efee54abcbd3891848f6561b25c240c6a30f339cdc0b33a73a86e28b0e89b48b8f62ef083cf395641c40d2ab9c2b7863e61fa8767dbbe22e8b4cf51c2a450e5d1692993cad245dfb4f43f334a0a895c5a80341552174dd229d46a9fd06acca19aeef629ad299c8bbcbc5ae803d8b00d204ee099d814b5b0262fd1f432859650fa61f7c7778980fb50a10bcf8bd1a878baaa913aeb8443d28e1510f75b26c1192570b8c6fc19a69929ce03687f4ba07d6a12b4b140d056e8ad944dc1d47900ee1e0197b43dc41f772da69d6e03d91f7db394ef5ed3638d1ad1dbf24663ba497cdb38bf2d5b63de1791f26d59543eb2d3368b0475722ff08da9ff77fe2ea051dd451046dc74471164da6404c990064b3481db017f125702aff5acd5c9c3ed544becc84611e434f1232d055ec7246c299286df733f66f87e6015d8300658da1460c3126005938025859d1d898da88239b06c5360c9b5d08c49b0060458ad779c33e6201b340559bf04d9ac49c8d202b25db1709936198cdad9a829d01212684593a08d349c52f7ba885100fb4d01684900de3b9bec69d0598d65cfb804db67bd8f6f060b0e63f12d254176df246448973fc4397f79332b81f4f9d9b863f11cbae39004db1767039bc1e06faca48d49b07d6912367c60127eeb1be5a9c8f9b3cd8c04f283dea70a8376692c552425c8beea3d640623a031c80624c8be3609d9cd00576eddf3ba98ee6c4b407f6312e894b0cde3c6a34ba3a5f25553800d4a807ddb6bc0ce63f4eb63176667bf80b7cddf3169b33a2f95e779cdde20df021f11f26281f523ab50b1b5055f6c9bdbe10ebd1085f713ed3ce50ca619be57fd1045b2d4765ced9a9ebab1ffae92b493bdf84c80561c7a79eb22cb8fefd32584dac94c73b49bb6069ae7c4f1ff796ae2d543fcb3ff036d079e8ea73f0000 serializedProgramBytesString: - serializedSignature: e93ca1686e20feea435de4a2ca184f7d1836b014095c8bf4fd655b4243d82286121e23d106a771b841f5fec75df7cae9e4703d1f0e7c0fe406973433c092bf05 + serializedSignature: c5ae90bbbbe8eed35bd7c4e7318ae016d91ddf0b0ddf3de7a80f073ec213105b2dc40e34a2ba1edff1802eb84159d34b5d7f3d5695efd1b5c385327d5d98e704 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset b/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset index 9fd8c34..0449aaf 100644 --- a/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset +++ b/Assets/SerializedUdonPrograms/4a11243f2a6c0254187bde32bd2a8f41.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c6d571b45149e0d2c4980904281d056b4f5add4b66c80b66aadd5422be2b1d8c3db97eaa12984164b0043a0addffce207ff84e7e85ff08b3fc0dfa5f7de9d25b3b333fb9230246093c34e765eeedcfb3c77eeccec24a41c062feb1a5c56d8029b61e36c99adb31db60d9f6620adc0dbbdf3f21fb12aa4cfe05a82b26bec62444b7c5db646e03a07777bac062df7d91aa49b54bec8caf0790eda96e10e7337e0af0cb5ac4e68b4cceeb3efd83c2b5843112256a8d11ecfb3d02e2b03d769f61a4acba41476e25051012e8b50b247651550daabf798fd406655a06c0dda54d916c87c4a1233bb70b5c8264a6c9e76f134cdd30ccf1be0f729f8cbf2fc94d4b683a73dbc8e25a4bdc2e71e210fd31cefe3ac708f88fd25c9ede6f506f97d274ff38afece089ff3421ea67d527f7dae2ceb8e24b79fd71b12eec5f6c352fbef85f6585e5061665be40d5f033f25b6cb1c02f14a02b7f55a463b2c8aee4ab91c83e762b735708d5d10a0f09a65f2c91a9b62934aaf3967f50a7acfd0b504353649e848b08bbf035da0725bf02e0b2ebf07f9b33462d0e937a1649c7d0b29b67ac226c0891f4b5256a0db2d183665b604d75d92f704d40ed68c32098787dc660164baa3b702391ea0bb70bf451a2ed2f580342d93f6739057a358b20dd1641ad257d45bd0f62a7c56f5b9c42153eba81ec4ba7c37547834dd076b507b87c6d01b465ac10842df35c28761a743d1e5b700136f3074838c4d93a32b63c29d9e7c7993cca1f966218060721b8316aafddbc5fb16bb116a8b1a19a4fb02595067f8f11fa53ff7677fffc7f69b36c51c9a7edf8a302d0c589437660d0724849b60db9d45545486df52c14f4b83c56384dfadb749f59213d04533939f000ba7ecfb50e12508c58aaeea3350bc03a25fb00033451493267083536794823a78532a7833c70d6f743c0983377368571d5e7ca911cc6a108cd2418760870a415af7558c22b80c79eec2e701956ed26c39ceee517e0590a891f6684b9cbaeeccfb9016f6fba44f38eab814be2ea1ae46bc8710c7486a5e671d4b9d2a96d0046bab452ced83cea8ff228dfd2ac90ab7db6b119fa3ded81ce588a362284747a3b18e215bc15031c3f736f2f0fe175e76563204079d4678978a7eda04fe6294feb83baa597a005086ddf953f6235f0a7bfdee109ca891b7a45e807483b4c07c8f86f0bec21d257f884f1d638736c70f12ec0bcd5b81fbe714396c3f39ec45a576dea76990f91cfa3a2027dce78145ae6fdbea2131403db497fdbac19356f9378e69ebe796fab73ba5a2bc0ddaa9bbf2e6193e637a49bef70282c601476609ea54a10f2c6dd6a3f1c9caa86251a05f180c12df7763f06dd22a1dc319557844da87548bcb6e62bd463dfb169572cc4ceb636656e5537dc7bd3414c752f2a5e170ec09b0a0591646f5afe3ab5bc7d7886e3320f2e56d07d6f90621096f3d2ade28c06fb464a92323a8abe771167f79732e36bbe789dd8f429637cd68a9f3815e950f201317548acb149fd7539c53514ccf96978e716862d90e492941dde483131f325c9543b49abf51e26f24605cb40a3a6efa54dc20846f2bb592c919d59393d7b1fe4e93ac9fd109bed8a4e07e1d16979ac562401705df5545c15f0fe75e6f6e146746d5ac3b7758b33edf2ed0282e03fb07547b9cadc27b914ad741e23ef90fcad5cdd8583f991e71e6fe559fef8a0f6c56a5b21590b3093d2789fa677548bfa7427a591b09c538e822b703c16295ac2eb39fa079894616b6c3d26829f1eaf811f08feb24380cea70785f85c36d2d0ef22389ba1721abc8dc33e2b51ad0fda8991dd259f481caa29b2116a936f0ae5d9e87e211cb23105582b66a0b1a67665867c7872a3bee4ab1dedfafe899682d8eb2d7340a9f090f86c2753f3acb0a3acb2eab2cbbd210431e2bc93c2a0d6fcbc215e1038a4788d2236a81777bcca1d05f64f1f7b8d87705462e2285d1ed292116bdaf1963fa93e0e0bab4d143c1c6766e734aebe2ef408307a0696e91270b90a6a9f0b4597a456435e5d02474b5416f8ad602d7ef5d1d6a1f4a7e24e20a98e7cf6cb45be6c87ea27688d74980776276045f8240e7ba0700add32a7a0fdef8b591b49d2a22fe574d8274d607927fd553a6d5d549828d116c695b12fed5910dd2c60e1183e1244f01fc153d46ac92bc7539bcd0baa7dd34bf268687b104de33a61d8ef5194d3d13157146bbfe3f9f6c8a38d98c2308035e6ca6d8e0988c0db8615c3be449bd9691fa6ce66b06595f7cc8c531a89118d12984d6a249f872127cfeed8731e07a4c01d7210037611238dc57e0aa788d0fdcf09d76d11c94695350660428274d42798143e96e0fb6a152bccdfb943950cf9b02f58c00ea543b823a790241cd0ba0de684750274e20a8bd02a837db11548331d518a83d02a8b74c823aa5989e4c3c5c3648c2a02912d202091f9b2421c749c08e37c8af3dd9f8eccc1870b629e09800dc2726818b5a5c89ca1bf5c1ac29286d01ca4f5b09e5b1c5d4822928b30294b74d427949315155290ee246739b7dc37f7372da7c352500fc994980f3da78b9cdab9cbc5d94258077a79503ddbf2135b822350665b700e5e726a12c28067ad8899ec1413d6a0acc9c00e6dd7602d3a0671a03b34f00f38b7602d3e06ede1898fd02985f9a047394835963cfe919bbbc43d27fa1dbe890ef37052cfd92eb741c3c1507c93adf394ff8a3ecb1582705ee394f3f4704bf1fff90167825a85ba2b47ee6e3d0576470179fe4dc395c66f481cc341a6da94744f04745ad3c645259dacc81536f082b0e7dcde734db3fc3dcffad402f74d3021d472e03f3ae707c3c56a57f8f51a53af67f57b4d2ec1a440000 serializedProgramBytesString: - serializedSignature: 5712d9e48458c72aa83d37e38346377b197dfc6c32bdbd888a625d975393c4094b31e8ab586b6349d440b25f21cc0eb56b748aab3a274badb85bda54b8ecf90c + serializedSignature: 0a89af46a2738ec11ab17e986d2fe5e6afe1305c8e5d77e870d25975c32ecc720ca52d3cfab2c21d4672575f8ef5cb3ef8f0b3a7ad05115f3c07310b98ce9f0f programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset index 8d4f172..5d99160 100644 --- a/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset +++ b/Assets/SerializedUdonPrograms/4eb7aa2be7d95324ea25c03bf1cab34f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09f6b1bd333d5353f5757575989edda284d27fb1c3fa6d40f5a87655abfad5b0baa96ee84fed3a9dd22f67cbdd7f59cde8744cbf0feabcc36a578e33e1af2ab649bf77e9ad5935a7cf9c57433a9dc0fc5e35a23f77e97347f416ec1dd5ff23faa8d8727d52bfea5097d4455519db9043c4009e346bf6c5c0aed84afddea69ed5b923a8145c24815995faad57e7cc62de9456da3dee31f5389a35a5f386f439336a52cbbc8e1257eed23ac5d026e70afa7f85feef309f9799b4c8ec3f4b8e73f79bd331ff1cd906c9e3667bb9c9ef24db90c64dda64f2cf131d202d3669b3d9d765b6579ab4c4a42d26ff21b35d6ad23293aef29cbfcaa467ccfe0b66bbcd6c3f6cb6dbcd76b7d97ec0a4e526ad30e96a93ae31e95a93b69af32f3ab6228ff8ebafbffe3f937fdaa4eb882ddb091348371b1997ccf64ec204d22d9efcdd8409a45b3df9674cba8f5c732fd907e936cf399bc9b55c99ee71906e30c75f36dbfb094f48377ae45511be90567af25b4d5a67f65f21db90d69b3469f27bc836a447ccfe5e8fbc63667f1fd986f4b8498f7ae41d35692d23efa4d9df4fb6213d65d2468fbc4693263cf20e13bdddebb9c7417ad01c3f60b66bc87eaacf2673dc23a45c5cfe2e67f73848d77bca6d9d67ff5565fc351ec3e8755ec7934135ad1258f16b54fe61d63d337780c558036ff05785979dd3a16c5a0bb044b97e8ca173aa41fb842dca6d8e9511bddbf17d501f318142e1629e4bbc927109506e52bf4648889ed5fb3b31c243909ed039b53a684ce0594f68377d4cbfd2a50ce8cb4eea303fa29d6f5e5f0ae43da1d5ce3c32974910cebde7f468994e6b33a5f7b840a7f5f6246ad88befb750d311d4be4bef9bc3b6ef866efdda747a1baf9669fb8cfe6cbb669f4166d7d1dee870fb9da6cd2da60e6d0d689fc0f667a94416a34400fd8a474d355c9ec016fba58c925862e80419e8c874191975882c96b6af5e25b0afd39741d0bf8d9916dafd1bf26ea294417d6c367bec74a0c80fa115a95256f174bb1a5402fb6adb72d8958d2ac8abc61eb55ffde3f1e549d0d2cb3f66e19f8c9b362dd3a4128f49b0c5482ee22417172a7999cd67b0ff3b26ea33fd7a9fd3189ec5dc098ca0b5ba4b3ca2f7b9830ca0cf1de9fa4b371e3b8f3a64f72c88f5db3db0664ca8c970b024145a09fac821a584f4e53c69b9ad5470f4d11b624dee45ddc7508eff7a0c839d9d5ed764499722e9cc8e562e1d3882715b8d01826576b55a322a4d295f6956d88a0707353d21164fae862d5be1c088b232efc229c7c2d998615b760db8a229b6150dd0abb028055e945134e57cd1ace4ca7d35e78e3ecabd8413bec62afc055f4eb58ac3b2962b2b1f584a39e1eb02105ec6095f6f115e51e54ff8031cf30d01146839277c6300055ac109af0c40f3d59cf04d0168be8613bed922fc3fff7ed897f0b59cf02d0168bece223c8135eb9a5a8cee0c0c3fa0733fa28f9dcbda3d8023b3c76c98fd3ae2e1638fd7d02dae8ec1ec5a307a71917cbd8d36869a70bb297338f486e3fcb784dbf3a6ba43715d94ecd7e7e86db05504a0b7d3a692b712ece02bc1464ef0ae0205577282771728781327784f8182377382f71628780b27785f8182b77282f71728781b27f8408182b7738261babdca2338f6a0debc6e86d8a7b4473ea792ea8e4ee55f7e6cda618b6c656147b64b9ad493ca996ef41fd9aaf38e6c354c64cb757d2eb2ede43ce2a0cd23e0eedd04120cd71f82f0935d364bc14f0ee553a96a78c1bb3984876d08e1a6dda8deb8a977858dd10fae3d1cae2305e2dacbe1aab5e182fb6fb3a4d59605e607d03e0e50a24040fb3940491b2038fa96a9f850dd1b0a42e407c0010e405d8100aa3800f53600103b9fd61f07f1d819ec1b43bc0e0b433587a1a1400c351c86a3360c10de9a30e44fa21f9cd63578af01b04735931c074c9ddedfa47d35b5bfd997d90739b38f1568f6214ef0f102051fe6789eb0f184b12fd03ba5aeeae3ee20b1d4e7fabb9ffd303bc299d658a069b59ce093050a4e70824f15283869130c530bd0e92c74c6a58e13de1480f07a4ef869abf0e7dbfd086fb0084fe0bc1ac80a7f52a4fd6e7408f6fe0e2c4d5ae66195c0293ef099e0b581e8e87d8bdb7bd8b02aaa5a480dae177e94f3a9330138ec314e786b00c28f73c2db02a80d276cc2a136b45bdc27599e59c4a69cbd976ce12fd9c8d9d31100ac939cf0b301083fc5093f1740493cc89544a7584934d92e099bb004b4a01be9a76d9257e1661e8dda365e70b34d30dc5d8155a785deba69e1caf782a57c2b5ffe6fa39ff23d63130ec7c33ad78cbe1148489a979ffe4f2be745ddac17bdf6eaabcde40d6f32f8f1a236cb251378bb6771164dc09aedd4502dd846f5a2856202ef3e655b1651984650af5b526f4c9b0aab76b32fce284c0bae5d6db7953ede327b72514aff8a659c1aac0f5cb6f900dec7abcd423f08bd3c9e90cd1daea03b482bc439450717eb7a6cb1ae5eb94b987bf5991774410f6aec50d9e0118c67f0ba4f99c9a95a754dbfc630e79a963eabf5193485348379b4d0d257aff989a367390b7a6d169c6139c3a290697dd09cd1bc133577d6497568dd9ed1f9b0df7e76fa7aaae0ac3bc759d767b3aedb5391d3afebd875535b790d35bda1759d50ee8a6010d28afbb26b9f3d2f28bb3b39bbfb6d76f3c1b407af3c8ce12bdd236fdd3dddab355dbbe547e7f39cce03369d3b3d6545af4a4baa13ebb25bfffbd4b895343d3b5b4e50e5d3c5d9fa88cdd6161fe5e3ec19b3689b5ab6c5efe772fcd8f61067db559b6d6d81d8b6b0f25ba8a75ee02c7cd466e13e8fa7a6a83a56f5690be962824c2d53797eb47c98d3f24d362d9b161003201f1e198498ed9edbab6bdd38d6b5912cf13ebd8be6c7aa6eceaac76c569d588055d00d9bc388e14476de0a5bcfc28f2d17395bde6cb3e58e0f5b52d34ae775890c2cb8be8495c3114ed9e187eb258eebe336aecd192d49aabe3934cfa1065358d6d96a677a0ebd8d1e549dbecc59f6169b6557735ae6f463867c5a56784e3034ae7034aed9681c60eb4fcacbbc9120a816a387d3f4099ba65d79f66dba717402716a1a97660c79a2d6e2b590bd9cbd83367b1bd992e9468bc6d5e8dd1ec04d1c5a0f63abe9b4a4d92d0da247d3c759733d183fb3d5888571efe7341d0a46d3eb81693ac0693abcb04816448c5e484e3091ec118ec6888dc68545a6118ccd57399b476d361f677d15962af7296749b363fdacf1d639b3373b81f4bc014d0e7ab4764b8af52b160325cf622499d1675ec633606b562570257a52e5ffa83a5c7b0a97464e6a2b06f527f799a7ec1260ca997b707d5479272417fa0c732e2b9c780ae78faa41f25caccdbadc36f1cf6b171b8b5c599a34ae42bfd72c1da7a55a94c0b5e28716e84db9b59880ab2db3fb90ff05ef8e808b0abed9460b70fa61936680d4afa50e9bcf39af946b01ea1114e03ee51bc0b736807bb56afd8671d83aab5fd331a58ae3454928812725311523a6f988e1813f88851ee1e702ab8e0b7bd62333705460a8beadd583bd206fd81b48f0b989379ae64fd140506df192ea2c152cd54ad95b9724b45293f77903928406640a2074b8f1166bfb0dc9dabe0acbec9a678c72dc7b9d42bee0a024adf697e663c44222c049950a90372591ad34c806f501632a298bab460ad741826b5a125799c1e5cccdcee1cce0107a59bd1cb616296c0d04dbd392d8561b6c53784a17428391074c6fdf427c49397ce552f856107c3361c4b5d1b47167831cb21d52c8f61264b3d271cd1936a646b9d1f3b066826b4e125785b23f9a1102bc2b52f0da09bcf930aae738828249d5dbb2114dacdb514e90dd0a03597a4f4d30a28921ab27c89e918e68e93db5ba08f6d476115cb7c3c355275b21c5701d22b89e95c4c5776c8f46b063fb20c1f656496c6b0cb6596c39e7d50cb947d88d62a2d910541080cf85d110a4776d05c7a0625ddb1a82ec6d6144b6593cad5ed6c3c47055125c77c2c3d520db6e8ae1da4670bd3d8c0a99de33136c04c462d83182ecf9303c2cd53313c425d6d5384070bd20892b7e37e447b36d4c12502f86054a306689813a4a40bd232c5082f3b062a01a09a8774a82727bf9a9c70ba23c5bb196607b571801dee9422423dae3da4070bd3b3c5c7511ed716d21b8de2389cb3e048a22b29d04d97b2591a5ee2741f4821508f7c2fda46282ef7dd21e97fa66b310e6f8c59a801682ecfd615452778e3fba533b0f10642f85d10ca486452722382c3a42707d4012173f032bd8146c93c2b68e60fba024b65283cdfbacaf60d58c4b415304da8716039aa0a789418b11681f5e0c6882234e31684504da4724a1e55ef913c5998d9504df47c3c1071ddd90174e89e12b21f83e265d6567c929217475c506576708b48f4b42b3df018862358d13649f080359fa105ef02e809897ed27c83e2989cc361519dd41d51a82ed53e157ce284e7ad711649f964496390e15c425360edd43707d26fc58263874178b658709b2cf86e161a91519519cbddd4a707d4e1257f64553d1bd1fb59a00fc7c78fed610d1fb519b08ae2f48e282e186fbeb38218c00c406ed4d04d817c36802d23b19824d8058953c45907d298c2a99ea641c8b6027a39ae0fab2242e7eb25bf01900b1e5c62708b6af48634bff099910e2d925296c6d04db5725b1c1837af33aa34f39df5812bddb29a709aaaf8511c7524b5da2d895dd4c707d3d3c5cc24f9988e1da48707d4312977d6c29381c1743b69b20fba624b2dc4b5d042ba8d852973282ef5bd22da6bda311c51542ab08b66f87e375dc6d3bc14a2b86af94e0fb8e749c1b52ee97fc85d04713ebdab61264df9544566c3cee2905df552f5a3d4ba4602d23b0be17463b9a3e408fe29cd97282ecfb92c83207e8517c1e7807c1f583f07009afe116c3554b70fd303c5cc2cf648ae14a105c3f0a237ea58f030467ccc4c6015504d98fc30ff982c8c442fe7182ec27e1867cc1c945b14ab98fe0faa924ae12e55d9111cdd98cf504d8cfc28f625144b65ddd335f389a84c9ac9f43b1c74cb15767ccff3adfe0b9c6580763db6e35829303ce777c0eaad4b7792680307e3fb69f6f09ce2e136ccb2eed17d4004fa94c06562a417c7da8cdd2dcf6f1255c96a5541270cbf89eb6ff9750eec5a6dc8b12308f1dab0bc0f7726bf42bc57f616d3877e0df78e57a59c1af154de391a066217e0d8d45babc09bc6e62cb1bd3a783b3fdd734961525b62ed4a7fd6bf4b2a44f3bd2c611bf4776671ed6d9cbc16b73eaa869f407ba506a042f0fbfe9989bc4f618348bbcb456bd3586b64ea0d429e5fe15e3af3214252114fd4692671edfd8792fd7123e42242142bc9256899250897ebbe4dd817af7ef2479e6f9c8f57dece1bfcff4f03f2c7978a01efe47499e793f6b751ffbf89f327dfccf4b3e1ea88fff453a8ae7715ff73ef6f0bf667af8df963c3c500fffbb244f1f2b4cef632fff47a697ff73c9cb03f5f27f49f2f4fd7307f7b1afbf9ae9ebaf2df97a40be0eaf4aec3ad35f18bba48f1f4679f017ff3f86dbf21d0ab70000 serializedProgramBytesString: - serializedSignature: f33eb3a3c5a071aebb8c02f70952965831f8da850aa4dfa614b90d351cb0787aadcff08270e9ad727e62d2b75feda750707ea6105208e1787d6c141e9d5fd20a + serializedSignature: efecaa36196790c3a92565fda9bf41078c36b16bb7af7eaadd5b6272e743e227c659b4448a1c2eecab0ce2b02f4211684bb804ddce7fadbfa8cd073ad0703101 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset b/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset index 7858314..604d785 100644 --- a/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset +++ b/Assets/SerializedUdonPrograms/50202e5b06e243b4bb51a5f88c7ad2ff.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d09781c4756806b64ebb265c9b77c5bbe6225b635b27cdfb125d9962fd996e538b11d59966459b6242b3a1ce7b4733bc786000b0408b0c072877b815d58204080702f1076030458ee000b0458969bdd7ad5559ad73df57abad5f326d38ae4cf6a754fd7ebf7fe7af5eaec9a82a4903f89b5f2d7697152d48b1ad12a3ac535d12fffaa97c73ef9cf3933d78f8b4179ec96bfdbe5676b45558694f0b33a314ffe6e9267436258a61c111df2d8a33e6f115df2ef2699b64b9ec1d54bf27f97bc2b3159266a150da2591c1395893919449c568986f4b504d8952891bff78987e4a75d4a297848527d54297fb5c84f86d4677d526973df59715e99d5273feb90690645af947951492cb9355da83f847358a48f93f4517e2a8ae4ff117d3e5b1f67c9ffa5faef4a7dacd0f75ed7e773f4b118dd3b571f4b2de9cbd0b579fa5882aecdd7c729e8da027d9c86ae2dd4c772746da63e1ef6d803e7325714d74279acd2d717a37470ff83fa7c893e1ed1d76fa0739073469f2f75e44d795b9f1bb933904ecb9c7ba6beaecf0bf46725fa6f9c1fcbf5f1a847ffa3fab96f69fddff59165181cf3c838e6c82828736414acccc0c0c839eec96f73ff0964e309742f1c5b749a87d0b97cf6a48d1ed926dd297dffc3e81c8eade81986cd6974ad155d83e33d5ace23e81c9e5be6c3cbe8b0029d838c4735276313c5e3b84f7a2cbfd9c3d7703c23d2fdf7a4e71967d0751fbe930f7ae49874f77af836139f3fe6b9be029d2326935ecda06fb370ebbbdc23bf19a537b6cfd036bca5cf57a2b4705ca5ef95cf2f7bc5273f4d59ba43a4e2121cefd33a3c8ecee5f30a1739320b1bf4f5d5ce79c56bfabcda93fea627fd651f5db00ec6ce3b853b66f8d9709748c551389ef5d87056ebf07947665189bebe86b0c1a4bfe94e5fb4d64717ac83d1636d081bd609b7bf9f176edf3daf75f8b8b6e14d4fba0a4fba5be81c8ee7905ee7b4acf71d59c5b5fa7a9947e6fd5ad613fabc065d377230672db7d8c4259bbd490b7348a3cb4cb19fcf7af5abd1cf7f529fd786e0bd5e1f8d2fb469594fa173a957c96c4766c94e7dbd8ef01993fea627fd051f5db00e266f3684b0c1d41353f4f182c7860b5a87771c9920465ddf44d860d2df74a72f3531c6a60bd6c1d8b039840d5b84dbef2f0ab7df5fd43abca66df8b4275d8527dd2d740ec776a457bb96f59ed6cfd83dcd23b343cb7a5a9f6f45d78d1ccc59cb9d72c4c7de6d16e6906658eb72db27ad57bfadfaf9cfe8f3ed2178efd0699fd5e73b9db453a70748bb4bdf6becdc2d82b7d974bd35b553a7b9e19366963eeed1ba3e1740bea9633b85bd1dd685fca00bdd0bc74bc2ed73971c5dcb863db24dba6ee16e27dc8daec3d156079bb42bd0396a2b4c7d27808dabf4b147b8dbac3dfa7859b8cbef656d872eff65efa3bcf0b97fda6c1f5d8c0e7bf5f1aa96711b9dc3f10ae27d451f7b3d7af7eae7ddf6dcb72f44bed78be0fe3bdd795eb9698b4cf21cfb90ce8d1e1dcc3dfbf5f19afefc79740ec77e24a35f1f1bd0359b7e035ad60be81c8e0fe8eb2fa273d0ff7b1d9bcbdf20ee7f099d0779be1fb3227d1c146e5f197474a9d8e8e85261dac2079df3699f41cf36f797a2bfe17820825e4dfab993912cd0e74d7dfd0bfafa21918ab77ecf327dd921e1eecb0e3972a7ebf6ef7463cfb027cf86911cb8fe117d5e15f0f9ae6b8509353a725046897699bb497513b488830ee39894990770407411fc829fd5eab1c332100e4801965194563546332c5b2975d65194f98932a477bdfadd2eefe851425f4e7fc4a7d21e01caf5ca7f5d680868485e3fa046906010a8477e52238ec823a4ba209b5167e53fb794d3f2b1bd32d074c94ef2887c14c8bb20d54ebf339349305ce44d7352ca7446b3fae4150374409ef72a0d5bd4efeb4ad32ea57d93bc36acc6d6fa6535b14f1e6fa8a7a5db3e28ffb63df3944666d7d13ea8455d7786ce4c3635486b40fba48a711339f241e408a02f7a5917c3c94915d55e48cb8909864e90295415802363bd4296705dab1349384d9c4c2318dec6740bedfeedf0de2c3b447eb6d8c940762f5416a472f84b1f4dcebbff9dcf7eaed06dda06915455f2a20ca6f9810579d589b96912fc4d282c9c5c0b8a7af1276cf8d570524b0ef13bf7f5a8fbc2674091aa99dc19a0009d927fdc90ff7bd5231e92e23b64d3774456a510078fca9bfbe5ff6ea5765a4ed582d862053bbd2acda43085bbc086bb24d7b833c7173fdc25a376a570c38f9d60294130930e14c1493682aa6d768e95607a43ccfcb54fa6bd2c495c575e3522d3db1a6efe4c6100669d87a99de754c5b3cada9c0ca7114578b285702d102eb32959ea5112f4230417dab24e0d7f9dcaa1f3c367d7941428fee1dd1fc673d678dddf9e57e52aafe6a5199759052a6f8a6c7903082bac5a7933a79cce9c625be64ccd7d45e0c4d4de0cad0a7bd6c010c1d2c091690619dbfd75a0f2a684ca9b9951f3a6d42619f2661665b057f80c5af8144aedd951d59e4a499e13557299cd59d5c5d60fc859a99509fe0e3b3770d8af54ce3adfd759291d28879d66a3a82e9efec0e2f1d838ce0bcc71bee2b82043480e4bb2dc46b23cf7fe986a948e8de382c01c1792fe9859078a62858da2ba98fbaee0d89ac6d0afab0c5c012d167e3db9b00de3e954b45d1235dacea0242f8d2a79a62dc79521bdac39de2aaf39a39a8dead31e3514068362ed4a7ab3e47c45384366c68ba93426ef8faa356c234a1b7f2fa90a5cca96290f8199716e8d29af9a65cb7b688f2cb71911a233309b12bc22a2e03936c1703f4c84476d2ccda584afca82f04a9b7068d5dc110449252d781e558057472dc0f329c9d551252fb04986c6c99d4160cca7052fb4090645ee0a2278212d78914d30740ad688f401932fcb9f34e1a5b4f0c536e15037c232256b95e315be9816bec4168655d47f82350c079d10b30539f3dc6b2aa881466646e4a43c5e525a74a911bfae001369fe017bdd289f14e3a4aabb1a45f0693d7e2b60495581aa3892aae2a809597184af34ecd556ad7a7a7eb1a12ab8a554a95d6f29b567129682e5536aaba8f05867098f8930e17119a5f6068bda8f86547bb92d1ea896c015d678c0e9abfe257c6390d89fa489ada0c2f3264b784e840ccf2ba9bcde6cc9ebb72687cbeb5536e190d75b2222b9c326189a4ab0002e6a53693585649b05c9dac27048aaa952bbdd526a43356aeea4d4de6151fba5906adf4501df9905e06b28cd7759347f3fa4e66b29e1bb2dc28f178513bece261c8ae61e4bd1b462f1299a3514f3bbb3c03c4961d96bc1d2591c0e4b2d257c9f45f81b2185afa74a507dd4125447a9dd60517b654938b53750c21b2dc29f0e297c23c5647f54269b28b50f58d47e2fa4da9b29e1072dc20f968613be852a9b4d59289b5b29e087a202df4631396c61726e4a3826db29e1472cc23f1952f80e9b70084147457a17a716ba38f04add1435dc92f69c5afa393b29239a2d467c31a411bb28e1c72dc2aba68613be9b127ec222bc36a4f03d36e130f30a03dc694b58807adbe8c29556d9a8ee941f0edbda61c5f433efa60c6ab11874a42c9c417b2dc2936a68ef84c8dd907d907568f6763f2c3c28f53050ce6eedd7c2644eb57ad939f8f3a97ee73eca154edb5c619672056aedd2585da39e728d7b2caef18969e15ca3810abf67a286df460addbd3674150add1109ad435d3c287f0f49941ddacd864221db4f3dfb3edbb3e7a967b7c948d9964107f81c1c723894360728c667a3323e48b9c6398b6b345484738d264af8798bf0d7430a3f4431b93f2a93c394e4b6a8928f50922f44957c9492dc1e55f2314af2c5a8929b6d926156105ee1cb3824b18c167cdc2618e203bc4b16b5b9798212de9505e12729e197b220bc85cac9eea83979ca2619eab2cb4172d26770a9d52238a966fe0048ee4728f946267b6ca4acad13189bad4ec028108796543be6b42d8b2127ae06c9e22b7416df4379656f54af3c4315a6be2c14a67b2997ef8fe8f2f7513cae45e57196923c1055f2394af20351259fa7240f46957cbf4d32f409e065c2a8437a6d94dac351d5be40491e892ab99d927c3daae48b94e407a34aeea024df882ab9930a1e0f6521787451c21fce82f04b149347a232e9b649869807efc74789799729951f8baa720f25f9f1a892afd824437fe56610183e0b9bae5a0427d582243026f76d9ef4f9f9ecb67c6ed978595b3eb04aa53a01133d7cba52ed9f5eca919e8cea487d94233d15d191fa29959f8eaaf2359b8baa656db97c89c4dbcc0d3724f84c60b77b56d85f20c9f47cca95066cf4d4dabd0bacf4ccc29916d1200ecbcf606c0a643ad78f4b89edf2d9206faf7a426ab18d3b853fd7e70273bdadb8ae14226b9a51c41fa04ac2f3514bc22025f985a8928728c92f46953c6c930cfef7529080739b163c62130cc39ab0cf46daa0e9f6d18c776762ab72f75e15b17bb453c3b06993fccb49de23a3759b9e32310e880ba3f733f74b1f61065eaf5316bd6cb36895a7f8ee95ee31a85cd7b10046f187d50071972a9ec3b2e1e3d535f55240183d1fa4f4fc2a9b9e87c81ad4b602cb6b055c83a24e6b0e9f8c457e188b6f5016bf62b3b881f0b5632a471e54f65cd5afb3a4bcad597ee2ec9d11cea2ecf9df4394955f6db372afc7ff5239e2d8744d064fc7fb602ae2947a77b8df371fe9fccd8e7d0f53f67d8dcdbe3a8f7d7e5e7a4097b5a0366059612c7884b2e06b6d16b490250f3f1fe756a3acbc4674d48334b427ba3d30c83dd9cac54729061fb531d813c84bf7ca18dfa9eb806b59f1d2b145d6c728dbbece66dbae101eda92d14383d66fa72521a813c3d8f53865d7d753f1133f11bf8e9ac95ba9747e9f64cb336f52567e83cdcadd1e2bddcfc576b6aa59f941792fd420dd6a4edeeea76e19d9b3ec1665d9ab36cb0e072a73075403de595f30385a3f34cbbf53f9fa41d6164f50367f6390da027b58d4da02cb0a63c1939405df14249af859102e9af895b6b14493a728bbbed966d781c0e52c533cf196ae5c94bca7295b5fb3d9bad1d7d6a87e38762b9ea1acf8962075b6bf15e17cd13f9fc6e28dcf52b67dabcdb623c2f40dcc1b45f87d22476b88879744bb1e64691abdb351f6109d71c693aa6e8679dcebea6e87045c7d403d06ec71066b7ab43f3fec536b8cc5eae728abbfcd66752ba3d52dead34e2971445904725369d263696a2b816c70b84d71f8988d032cf40adeb3c3a5347dacd9abbd592f48b7d9d36584b1f479cad26fb7597a1f638e3b44dcdf4b735ab590c0db2f5aeb19bf7c1f6b6fec058ac87750edbd70a302a9111cb3c40f0f4ec21d3679d4306618cb5ea42cfb4eaad609a389db3ad821f4a84a313c6a57766a9d97282b3e6eb36247642bcc9715819e1daa2ce3119decd8f411caa6efb2d9746f689f736a53b7e661a84419b9f28fbfc5f25f422d5f6f54b101fa43c7550a381b1249b56d40eda8c599df0f8667f7497d20274e8d468ecc6ffd7eb7a037484e5f2936d6bd723359618ba135288a62eb82bfab9ebe2f70b1b6c8c892a4d5360ae3cdd2ef815c2dd5b95a90543b3aac19a33765d602366c2f9a64f7a1f03b833a028ee932a65e2648ad106fd10d08a7830d19d1ab8a1ac408b83de3d3334d3dae53024cfb230b3b8683cb39437283c2193eee2c12a2b8b0a01672e5fb38d195bbd01d95884010283ca0fe8e03acb78b53b0be9f13d62c8b9fa550c5cdc7de9d9cc2f603b92b9ed0c6edd61111625cbd8a0fceb43a44db38a07b259142f73a27bae9d6e2e98e6d710076ae3405ec073981cd54c0c0a31ad4a3a9318138407b6d5a0ada0f7142ab707959936ed0a6b0c5239ec18fc1f5c3b9c3650a25eed3c501d7ab25295c3fc2896bb6a5d6c4b0e2566f7eac10c015177a84ef4f133ed6fe4138da744f06fcb451dc502360834a5ea7b767a3b65bcb37cd7f54a09e497580e8541db289511da225571dca7fbd9a64ea8b54676c807bedb7859bea40ed84eac095636ae8c13e64500b430f3f263edca302b5302af0e3006144437062e9273863a97917da1904ea5753c67ed33db01d8b4787285f9b52ea8aaee5410c1c4b84bd886af29fe0c409c5e6b2f0be46ee0e17f1c3371de1fbc95c786337e98f58fd36b5110e1bce522e9cbb10ce9fe2c4091bb3b68fee4e91a15f9c3d70cbb8c0cd44e03ec9096e6e86a8e85e9051cb87720617cafb11ca4f7d9028ddf3198c289fe542790da1fc69eecaa54d45bd36e14c930d0b67a276404ddec26df1ab5c36227c3f930b4fecd06dc561df196e464f2ce642b907a1fc34274adc27e943fd06d34f88bb4fce47207f961324ec233f249cadc47007ac4e76a8e2876d2ac2f6739cd8c2f75a18db896c382f239c3fcf89b352846b766f8b61a3bb0ec17c239f606e8d21cc5a04f317f209e6a618c25c8360fe623ec1dc184398772298bf944f30b7c4106612c17c339f60c671d4672d82f9cbf904737d0c612e43307f259f6032761bd9602e45307f359f60324e35b0c15c8d60be954f30eb6208732582f96bb980498d0d793b948cc59cad3b598560fe7a3ec164ac80d8601e42307f8313269e88bf3efa62428e06d8d8a61fee40f87e93131f4c199901367ad504e364582517c23284f0b73811c2833a5ce86026d1a1c1866d3117b60a84edb739b1859fcb8e6373671bc2f93b9c38cb857da4dc4c39c4af0a9982d07d8613dd42913e5a1e64c319c67af90a17d4d308eaefe62354c696231bd45604f5f7b86b6bd3d8e9702d57c9518327c985701542f8fb9c082b509c0cf42a510c5a8bc508dedb9cf0e0db4e3ae51f1725816ef5da78371faea95cb826235c7fc089abca1203c3bdebcc180d6f73e11d46783fcb89779ac60b0fbea4e01ad9f092371bb8422e700281fb1c27b81a0dae57de04d8a0167e306dfde3d876bd64f559b69593cd08fd3b9ce8dddfad55af3a8db0ceffaae8f26480f16cc64e245bd3fd00c2f9879c3833ad598bffe4c32284f28f38512eb1545641b7f96145fb0417daab08ed1fe7a2d0075f8e15c721df0b08e7bbf984b32e96380711ce3fc905cee00371715cf8b21de1fc534e9c6676c7e9a3e3616133143794abdefa7c2e980b10cc3fe384993eb66e3e629c9258c885ad1c61fb3c27363c290642c6c79b10eb11be3fe7c417ee4d08c685036c6f423422947f91ab68d82bcc3683ee2f82ce915fb28d27cd4630ff32173575f07624e34a74b662de8f70fe1527cea5169c61361764ecf3b08db3df8be0fe757ef92a63ab92cd573b10cebfe1c409df30e5c44f1829621cdd6443558850fd2d27aa15c23dba093743f2015568dd7b069be33e99105a99f0d563b0766390b778b355455710e4f73821aff2401e1078e3e0f13fc9318040ff1d2768b3190ed5163596b2626ce5c2b81761fc7b4e8c33847b4fa321a5489f1210e791f60604f01f72519f071f258ae37b139b10ce2fe4134ed6314c369c4d08e73fe60267f0d626e3fb666c85bd07e1fc274e9cee3dd5c6dffc643502f9cf9c209759fcd281066dcc7e7148ad391a1877b3960508f0fb9c80dd2be2f040718e4695d81662af4308ff85132174467a44fa268f71ec64ce40d0fe359fea6fd6a138b6625c8f70fe5b7ee18ce3eb7a9b11ce2fe6a2fe36bdf31e0fcc1c552f6cb1f10c02f9ef9c20977a40767c0886884f21b85fe2846ba6d96a7503297d2976dc5fe39b8350fe07274a98f035abda036ef51d037ca508df7fe6a2fa09de7d64ac7ed81a47ed08e77fe513ceba58e21c4238ff3b173883378ee2b899ce6e84f37f38719aedddd35f1be8d7b7c46f3d4702c1fb5f4e78de799f0ecf98d0786f1c7523d0ffc709da34e1a922ef2ef0f16bc29f4020ff3f5f40c6b12f741c81fc72be80647c559f0d6427020901352f4032368cd8409e442013f902927175111bc82e04b28013a4f3450839ff420eb665309310b8499ce0e60b6afac1bd7d4e8e0632d836d3a944402773020db7f49ab1e1c3d654df87501672a20c3fa8c1b83b305b2ffc12c259c489d3bc530195c9f8d968ac06e12be6c6674628eb89d7a2d8f0b1bd08350de12be1c467e6b9d78fbb79ee2d0861692ee261f061b438aebcd880704ec9279c75b1c47910e19cca89137fe9656a326cbc7c61cc3c84b18c13a3d9c56058c6c81e116e1393788e482e4168a7e5a201b47e5c3580ee42f8ca39f1c1de59bdc27c47aef315acf1eb59cf42b82a3871d1afd1a7de00cf91efb1bd0fbe10c19cce3dbe631adf4d69954bfcaa9312046e0627b829081c6c7717dfd7ef8a10b2999cc8f0377dbb6707735660d9eadae508e2ac7c6a5caf8fe5d764dd8d70ceceafa1b0387e81411bc239279f70b276fdd8703e8070cecdafc21ec7af71db897056e66256909a4288fbca891508e4bc7c0119c795138b11c8f9b9e8cb048d978c75395bb43c87602ec8279871dc02e73c82b9309f60c6b11e3f8c602eca279871dc95f20882b9389f60c67105f9510473493ec1645cbec706f31882b9349f60c6715fab1604b32a9f60c67189ca3d08e6b27c82c9f835c16c30ef433097e713cc386e287216c15c91abc55320647c6c48bb15e15b998b596dec8be37b23bb3e84761527da700b4e191b466c0b4ef723947770a25c2cbc6b2fc6b78fee406057e7d3783beb6c105b34ed4538ab73b5b4a08f78593eeecb5ae62a98c5851ee1fbd384d72ba3c1773a94fe4e14ac11078459a4d2233fa9911d7f67e9ca05e95d67e5bf7039705efeb35d4fa8b7711bc50d31a0ae82bc4e25bb4f7eea4c1ad702ee3bb14354677861a5dafa4575d5699be802a084da1a129ee8ec9dd0a55a279daa85d2aeb63ebba8e82421ba2560071727a8d58c86b31afd85387dfacc5ccf2c1388f84bbb2be1ac6ab79583deace565268b1cf783f49714f52e25b529a3a599eda3fda2cc275792d01e1ad7f6af817c2fd1f95e90846d6812ebb3e07b99355a0b4f2e608abc0197d3e45fce1e57916540dd096a46f16c80e096d7a39e9bacca4fafce9eedeb70342b482e1bab5787d7a886d3ab1d694e9bd723fb4000ebecf9e0b53975d780f287f6515f70caf865f9776700128b558f8796b6579e752b5b7b94d43e617ea0b684f61904a32427cfd05fd13b9ecb0c1d2f6a215ed4ba8a542d14a9f513be9e555fafe3e4196a65ee87d8cf37a4fbf9c6093fcfaa9f6fe2e439860dea3ec4debe39dddbb74c787b56bd7d2b27cf72c2db27e2bad7d3b7a57bfaf6094fcfaaa7efe0e45946787a9d6898f0f2512fdf99eee5bb26bc3cab5ebe9b93e74c416d5ee1dee667c2e38dc7ef49f7f8bb273c3eab1ebf3757edf580dbb57c88bd7d5fbab7d74f787b96bc1dfe55aa6f296995693bf5daa166797fa792073f855f012ba1552a78300100 serializedProgramBytesString: - serializedSignature: 47efeaa54f1e1a0b0405ed436edd15102a50fea5aa154703acc10bb1fdefd84df197dc9569c46b0ae6cc2245396c7c19b29a6d035575bb617417525f0bdb1f0c + serializedSignature: 4def796d7e42514f2a53dac6c0b754d95f16104481dc1c034ddd6cb5bbf0a079d589ecd09d2b31180eaed38b08dc0ba7934fcba2044f0438c116d47a4f1d860d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset index 5b94153..e49f7ff 100644 --- a/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset +++ b/Assets/SerializedUdonPrograms/5463afdb73b505649b857341d262468a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5bd976134710ed913d5ab08db113c0800910487062ac91314b9e720e60b385c5f1f6c2498490641091172411c8635e932fca47e40ff229e12455777aec59ba6734426d1c07e97846d34b75d5bdd5d5dd2539e3087a5997e8b22696c42d5114aba226b6c4267dba45f70d7abb4f5ef9a268d1fd395d2b5477499c4de8c9af8bd6045defd1535b74a8e76b51a57b03f5cba24e9fef51df3a3d71e93afdd5a99535489d56c5bc782c1e89e3d6d104116be8d4966516db65e5e97a53fc42b57528c58338a83a4e9765aa69a36e8394f6da3d113fc0ac0daaab529f966892cc679098ff9bfbc226dcb2f23e283f0ffb9ef99e93775bd68fc8e70cfd15589efcec9765cbfe6f63da7af207e4bd20fb1ff63df3fd902c1f0d950fc9f223f239ef6befaf1f53e9605b60e62e615511dbc281525fa57021af67b2f3b0e86cc6c59bbc8887ed104ddb2440c1e02afca323e6c465258327ac619fdeb770ad508b06848e4787f82332042bd7a477dde77e6d2abf03ef65076c504d513ca03bf77a2a66c9a19e84a4acd1b04d72e1ba58a1eb36e43d25b5a32d934c62570df7592299ee4cdaa0120fd06d7a6e42c3655c7f86a675687f8fca3a98d79b34b36fd2fd2d468bdadea2cfaa315724646a1dd5134a57ee4e5b8fa679b286b577e0eb1f19f9108c30f4d971390d071d449fdf224c7cc4d00d3236162a57c6acbb5404ca2e0b871fada50882e96d8c5aa8f66f17ef6be24aac2d6a6498ee53b06097e11fdfbd3bfffb5f8b7fda41d3e68483656c32c1b4386059de94752c2221de04db1e2cb1a261f82d15fc589697f7107eb75d03edd21390c5ca1424c09ac5e6a82637402fa8a245aa16c502295181da4da9e42a4c6a62996bc8b215ecdfaae227a9d43c3d75e8efb68ca65be20d8c8df05bcaca6dcd9462014e325347524645527eaf494a8e4a7124e577ecda25895f6a040b1a049374d02138a04210bbbd574611f4b66fcbe441df515d85dad7b11670f92249acd0d82cef064698d67a9e3f24b8bd8332e3d1e78deb6905fa7a0686c0c055dfb6d5bc0d3af60655ec612ffe745fb1d71b37bce99e0971a3e664049c5ce88193b488db2ac4d925ac953d8c385cb70529156a9b3ee6f0716f3aecf56a684701ed44c4b86415741066151096380a1e5144c27fe86517428a717cd208cfa9f819deeb15e13199ff52b8278bf4ec8c75edf7e39ad520697c1d3579157ac83dfcba27f124290170073b947ac03e6fdc2d9cda5823ef04b844f77568c1e5d5407cd58d15cfcc273bf8ec32e32077b220ba4f6398b7e253d226030f390a0f99c19e6f53262c16c0400323793b3a3efbaec34a3737a76bed21f11049b1d7e0dab6d5de790c63ef2f64749e5f50793eb25f1bfb6a25d5ef217a5b6339760c843d1ad9bdd9beee7074da0d2067c3ecb6e539835172903f9c8ef1da35e91d6cc55c6a8f3dcbdbbbdd8bed6ac10c75a0afd482c3ab558cd1e27b925701a62db4d8924be17be8e22aa499511398517bc38c6ea61c52cd1404c6e746678a194f889f1d2714b3a334a6e24b49d749d065ce8d75140da928e235c17af94128eac7348927ea948aa8f12851716c4d822dd3d35dc7d9b06a57ccbbd9d34291c4f97627040427ed23c1df68bdc1b8de442f8a32bd9fa3a62c1e505d1582fc41825ba8e4e9c249644b9ed36fc94774967da6b26c3ee4a1fead806bc916695026a45f818da6449e6b74fde26a8275c1534d1a2b0febac3ca3b2b2a3e14f87b76bf91d70a80be469394c4a46f44b5e1a144775289e55a1b89012459d86c11912de8c709d7a8607a3771a3b8fe8ec3ca7b2f3ae113bc3db1dbd9daab897c6da319db59fabacad6a2370f4a8529433982d5a0cf17683fe6a8450b75606d94c8345388aac516983c6566394a3b765f11abd8095b7453d17d1839fdac2e1339b5512dd1f9b78ec0d8a6a1cb95648bb678860c987a1f342ff2df97a64a7d0eb17a64956b8896beebf0eaff5be845359d7fd013efae5704e5ae4c922a4f9847ae02cbde06735e3f0090f7bd05ebc29598b2f78b401b50fa5ffa2c715f048a6013049ca086f2c6095a4d6e4e7c4919252603310e0ad757df88908bbd70dd2af862d5f9bde0fa82467674a2ced4b93306501531b71ae45d7ff023802e0e4ec90f0db7d9b8cbd7d911a0d1ba308d46fb12d68415e2d1c46f858beef34bfe80f0353111f998a995cbb2b947a652921abf83f5f3c4abc78f0afd7b2c35eacc54cffdae44c1f016765cca2756a52de91cdfb8dd068eff3638a422002d8dd98d27b1470819b3609dc31095c557a5ef850e857be2c4ae6a02c988232eb83f2924928272594ee7e75135ed8dd8eda20ac274dc17ac807ebcc87f4d060dac220948adfb3f607ca9c0fcaa2492899335e4658c50552a0217dd01864a3a620b37d903926213ba798d4ac448710e183ee7df96bda831635333e804b26013e0c69c1bccc0af6626e3ec6187443a6a01bf041376b12ba51a1dbf46cca26c6c0cb9902cff28177d92478a725781df1023151b75647736b4627f45153c0e67dc0ce9904f6ba04b6498d5c9fd4a5e5fb91ba354ac68429320a3e32ae9824e38c62f94a93bf3508eea42970877ce05e35092eb3b81df15463808d98026c501c98945389a7ec3526dd92a44f25ee30dcacce98b4967f30f510e51599f7a9f8323c0efff2c1e201d2648de36526a75faefb0d0ab1d4ec1b4bfd4829a92c7d9ff4d2700c2b0e9f6d0fb4fddf08f7bf46f162373d8ee4a33f25f9981ad7a014bfec7f0123a6142a803c0000 serializedProgramBytesString: - serializedSignature: f6a985a15e3c4a52e0480e1943431253bc5dd319b68386070d1a8c1fe124a08cb3599a34e350aabc645c2ee8b50e188bb4ff254af5353e040598249e7e8b1f04 + serializedSignature: f0ce01c7967eba1593dde165a9e4202a612c6484e86c8b2fdbacee8a6c1e50c586d6b0cf07f7adb9a26f1a18eae8b7e48f15e68c1e73e341faf2c9666a646a0a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset index 78d3833..bf6fa8c 100644 --- a/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset +++ b/Assets/SerializedUdonPrograms/566cc00e27d5822449529a3785eae366.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ceb561bc911ee0184106030f802186c641b8c6c0312e0dd249bc4598c6fc480bde6928bb3c15a1830bb081c4bf87272f2027982e49cfdb13ff30a7987e48d728e5355d3836a46dd1a8d462d659c958ea6a76fd5555f5557f774f7a82d2be0634dc3654b3c174b62566c8a5d712c8ee06e09c2027c9d989bfe4cbc81701fae79c89b16e9809af899b286e1ba0cb1a22841cd13b103e101e5af0b1bee97a1ae0d314cdd839f0da5ac0ea8b429ee8ba7624d0c591702486c51a5a24cb3502eab0baef7c407c8b589296c244b59437059879c22e5158069b7dc0bf135895580bc1da8f3461c02cd6f8862d73fda04dd88d34074c2ef068b5bf287e9532cde2181c6fbab4e5c7c2fe3ed3e3aede53a949e6134314cc02fc5ee31fda6bc7769267d349332bc26d36fc978ca57cea57b5da6df96f15e56dfcdc7b047969bf6c5253f2473e2e3c78fff91f9e76438c8da1a94e159597786c5319c9061bfcc9f6571c0a8ed07191ff2c93224c3f3323dcbe22a592665b99c8c8ffae88dcaf0928fde244bc77058e6cfb138f2f937191ff3d11df3b53f2fe3e33efa5764fe822f2eb126fa098907619eb0a8173d06bbce8bd722db8615b174adddddad19dcd19174275ef03345cd96a04bbd06028adeb6497db90492cc2b7bdb88d5cbf85ea26b1e4a1c10516cccd7c43f2b9a40e60ee16b33575184f447e469d0591c40ceac5881106bbd0475bd80af97ca16347b08eec6161b707d4df45e02db9525834442b7e2aff31c683a5eaf00292ea0af217e481caed3f52d716a13f7cb9056221f7c045ef81e84efa9b54ad9dfc0bdaacd0d09999a47b5f3d3a53b2ed655d37d9006b9cf92fffa5123add0080d25776437ecc8621fb1fe5aa1891f31749c0c0e98cb92c61c416679d2e64516a3d67a0582e165ac94506ddf4f81b36f651fa9268d1a1b54f80cc950d671c22bd482c8d244622c40a86a9022bd8cc2af07319f4874e490453ff4960a7a9ab26c34117acc3b262a79281b1e7c9a2ff9c0af443f87c59204e0708570c12ce8206c534098c366ba945ca57c5c61490de576957290aaf5d2a872dc09c73a8c2c4f202f0fe56df25e98fe0c28e6a16da4b7482d942729de1ad59596aaa5c790ceba4967136cfa1495339d2e3b74baec89aacb848a32467b5530f80927f4843b5546926ab6f374ca1d50b9f0fdf70c4d5dbd18587f87e80bd0e35b482ac10fd9dba16ca719e7f1b32463456820ed299d2616cae5d3e215693f0decd834f349c3841a673c794841007681a5b4c78ab0f43b82e750d64b13846e8d34b4750cd71da08dfea328d35e4178403c1c437d6c29afe4cca616dd897d9a528f28bf74daea89a4eac8cb257c405c3ea6b6f6a1cd125053f7a03ecdb011a4365d3f49aaac193d537f2dd6dcadb7e62e95357737df9a1d480e0326366a6bc6a7e771bfaf10ba016940ab9aea3ce85493d2a96630a26aba558431f19c4e5e3ff1013df11e9d7b3c1fd13df6aa08234617543e6723b2cfb1a94fa6a507707a659aea17e821ba28fdd05b2a55f64445a2ecfa933f8b9cf80b8bcd51ac40651cbf345b89429f1e85333a782f4684b74f47782822e17edd483c1c75243eaba33c1295f2808ef2a5a89407759d7a3462a73ea7233c1691f0799db7b8dc006f714147fc4a03885fd4111f6f00f1211ddee988780feb6cef6a54db1bd1e171ad01785cd211bfde00e2a33ab02722823da6233c1991f0651d1c371a00c71515718c4ed5c275155f3dae228c632cee9f548cb125117e8c7d00f77b34f9d961b379f5088b33ea0dcac5d463493b4dab6deebc7e8ac6e17c0d2377e533c30ed129d012cd6ec5885dff189dd6a9e76644f55cd5b9865b515dc3359db9de5698ebbfffb572378cb95ed7119f56f6851fbe0c437c4287c94c544c26756ccf36a00bdfd0f5b4acaaa7dd15ee8a8977f5638d6cf41df5a7ef647f9a15dbf0dda79c6db172da6ff8d3309650d1d3adbe84b1fe299d643995645f6824db14ce73f30185ce431f72bd0c775bd2c7ec520a7fd8e28ba7fe3cefba601889323a89e654127da5914887edace414f5b54abc9d1031bd5f5da4f5045c8fb0151878e5f4e76e411e221746fe9b3af9e755f2a39a37a165d4dc07f2f7fbc4b70d68d8a09f93531b5da173106174580ff7b774dc2fa8b8df88a0bdea2b3aab84028e6d27a4a50f90521e61fc92f2458346a0705b87c29d66a39017ef5b86c2b40e85cf54283c11c2c74d798dcd91f82179de02c95bc97bb974350bafd5f639bd3032cfe864fe5c25f3425d9a77471b5c832d8f388df3c0b33a197ea29261d9a7376fbb0ec7c7c0bdeb810e24bf8b901bec4f6bf7b5f5cb9bd5c9fb5395bc8b75e9ec510dbd7511e8d4da3fc3c897d3c9f733957c6bda116595787f054f148e4c4ba733faea9ea49e9cc6483ea793fc0b95e40f2b3c50b9556ec7cb84c69fe4ccc1c1a95e041a65c3f33a497fae9274d5d888d3ec31664127f72f5472df6dca1813762449c2d7b27029ff016dccbc81dacf080b8c15459656f973a73a0b3e0687ed178027b4a58dd35db7e04371bf14fa43717ba251e7a382a4704ef060fd3d9167676e54d205cba43f0b969412b9b40069daf6f8d424bdcbb5da96a54d8ddb755a533017bfc2d6dad536147e27d521b046e30c10c09dbf6daa8eeea7144c3fe880cf0c11708f0e35e01c281ad52200b34b7b9a45f8e2279968cb21ee5f9a046784c0411d54f7d14bb43a7744f3c8dd584078c7420893091f71ff80dda8239bb59ecaa87429fde4c4df037bc7649f08b0cfc5d0d6dfff1ae78bdc45642aba59a64edb2a8f6cea11298759f7fecf079d1c0e3a4b08c20dd74793afb86fd257f4923eb7a982a3e723127a1b7aa5afad28e72e531edfd05d8b20f5f8871473b10f4cc2860d143c8b2adcf88d0137600ab8eb0cb8872681eb96f6e6347c028570a69c330759d214641683ec9149c8fa2564e5436fde072b831dd598bd5d66e03d6e2578062dcf18785d0cbce55682371743f0ba1978bf36095e528257a02af1b4b40b0cac2726c1ea9260e164721fa0326a5b095370a5195c2bcd836bceac751983ab8fc1b56a122efd24f74e0c27b9430cb63593b0f548d8f081aa7cc63f9eb3b50e06da5393a0394f067cd339de4f06d71870cf9a616d05d9709ed60ee2e9d9120cb4af5a015a1c47cf1e06daf3568066f041ca1868571868eb2641731fdcf73c1b6306edaccf1464e30cb20d9390e9a71d06613336ed4832d8369bd13dfdc73c0cced58c4d3b8619685bad002d8e73b53606da6f5a019ac1ee690cb47e06da6f5b019ac1d1d31868671968bf6b05680b31046d8081f67b93a0e13b70de37ccf5a7b3e307e35506e30b9330e23b8a08d43b3acc55f4bc0c6437e7e9d41888130cc43f9804d19dfe7acfadc57101fc1283ec6b9390e9a7bf9fc770fa3bc660fba349d8cafb06b8bd1ccf7d838b0cac6d9360e1e36fd8c328fc586bfcecf01c83f6656bbaafc1498b31d806196cf9d6c066b0231b83ad9dc1f64d73c6577eb6da2064c696973a19643bcd80ecd873e83c8ecbe58241b6db1c2be3b3b8388eb0230c32db2464953bf371b4b0330caebdd6b8ffcf62e8fe47196cfb2661739c25ff638878ef9a4e32e05e99042e25ededede9cb4df1f467e7196007cd1802bcfb58719c68f48a4fe665881c82f42daabd43aa3d136af52f1370ec221370603b136291cc79976140a28cdedd391499076e1deecaef3564e96fd8f095ef30ef5855a719fcd2c17708a4a5ee3f870db38e46bc48a19234ca4b15bd55b492a53faefb94e547d93aa5dac94c8768df611334ef10b7c55328bc4b4ce127f15f14b53ffd49650000 serializedProgramBytesString: - serializedSignature: 30e6a5cf9737c9ad7ee6ba5a32070db6d451652d6ed1b78aea925a483ae7b67cd951c940a9a6ae9b4720e2d38ac52e974618d851542d34543b9ff0ff59ed9d0c + serializedSignature: f76b31439587faab572f81a73ae246367675b6d870403c3a0bc4a2a34b9639449871c953c82dccac0afe700a1e88d56719b29e1474a39ef0219b26ebe7454906 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset b/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset index df92332..7edfc07 100644 --- a/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset +++ b/Assets/SerializedUdonPrograms/57900d57d3c8cdd4cae64f9da89db8cd.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c14c7fbf0e7824b718a97502c140b095e68714871a7a514420c8a3641abb4a5ee2d75777777777777975fddf5ddd99dc93d3b99e7ee3673cf31c3fb271fb2d9ddd9679ef9ce336e597d99f72fd6cbfb3587cd60a3591f369b15b3556ca5f7d768efbac2fb09eee4f369acdcbb9679bf0bbd77bd5876922ff9bfeeb1d6deef02efae82adf1be5ccb8abceb52fffd4c56e2fd5de07d5be2ddf1a7a5deff12cf55aca6f7d16c36864d655358ab58cb2422e6f81f558867311eae585deff728b6d17b5be22bc53de9ebbf6ae5fd9ae9bda9f0dfadf09496eee6b3057eb05678ef8abc6fcad9724fe6625f62dd6f4a99ff070b2e3dc5b597b8eee4fdaf27feae21feae2bfe86eef9731eba3d13b8ed0ddc4a997dbcffb5bcffbf8bfbbec17dbdd5e23e37b88fb55064d40732fa896b9eb8e68b6b7fef7f6dc6b2a6a6a07fa277ff0939d3c07d4c50e3cfa7837b8f41d62dc2dd80b07b3648f8e185a76089783630f826b645095f47103ef97db6f06f86f2bc93783e53dcef20f48989e7b3c03dd76f9e7037583caf23dccd06f7354178a54e3b6a74da417c3b47dc0f11f773837056b290cc6a28ee7700cfa12ef3145d6e49a04b5325bcd35928bc3524eba1e27956d56fd970f08ecbd85d79bf8bb8ee8cbcdf555c8721ef4788e77b88fb91e23a5a5c47c56d637e5df1ac99d0ff03713f465cc78278874ce787596a65360f64d6ec2feec789eb7860635c464d4566cd04325b0a99478afb09e25a00e28acba8a5c8ac9540662b21f31d71bf9bb84e64f1f4c165d45664d64e20b37520b35613713f495c2727f8664a703fe609713f35b81ff5b7b86fcfc2763b1ddc7b7ed57e4171574fb893f9a4486331909ff97f4bb7fc5a577cb300dceb64cbef1a08f77b817b7e6da8e8d850c8b942c891cfb703ba886fd92ca02fb0efcaf7b3c1b7baf732bdcf40decf15d799c8fb792c947e6458655eefdff3f70b83f8a9b559bcefa0309c0eeebdb0d75dadb8ab4efc48ae0bc0bd4e76b2f869a4e8d848c891e94932a18c9f3d92c4cffcf4c44f9d2ee27d75cbe43d0339758f15f7b25c68c052abaf48fd1624719f48860cfb5e063284add4db92c06d6fe056fa233832994fed24383706b6d158bc9379f922e5b9cc8f0b95e7b591e77590e775c3cf2bd34c13a04b93f037b1a62c9c669a067a36385191d14cb85b0c7486f2e4fb22e5bbe6e279310813fcae39f25d0be5bb3aca772d90ef5a2adfd555be6b19fe4e3eaf4c1f4d58287dd49775b445c17d837b52b0a544ef043fbf9500f39856e2babd785e02eebdf868981df8df50d605a5fead1539ad93c8599340c71216aef3ab76d446b1953642e63d42b79f819df3f76d59380f2f04cfa1bcd2b0bc46324e64bd384fb82b13cf4b15bde4fb22e57d3ef017be9771b08b78be04dcf3eb10c4bf5eca7bd53fe9be4879bf24ec2eb6ab78bf54b9df3b41dc6ca784b99df86619b8f7d8359675298cddd224ece4fb74b193f23076f23dc66eefb0bb6ab193611dc1e2f9b6ac474b9b94eda7e5c0ad7cceafbd58d8f67b05329a489bafa5c86bcfc2758bf68adc91cafb91e23a0ae828598f8e3ff3dfcb67fc9a2fe4ac00f75c2f5997acade895adf89bade825ed6125b887f98df46f9ee2df33387f29bb328f1dc142796ce345e2fdb2682cd98aaaacfc6e21f94ce663abc033596e7500cfa00d8876c720d9de91f600fa01621d807bf90edaec3ed1d887c22165c070946bc221cbd14e9a70c836b92e1c9d41383a01f7f21d0c4785b8d651e47751c221eb90301cb29c49160e59ae77d584a35b82707407e1e80adccb77301c6bc5b5ae223f4709478e4138643da387261cb2ef4e178e9e201c3d807bf90e8643d4692af3a2e9e0de4b832dd628ee7ab350f91b93f5d77c454e69584ecb6148bcf709f3aaf2beafc2b3afb8e62a7ae42a7af413ef5785f5af5246ad047ac8efe0fbd5e1ef2bf3aae9e09e87ef1cc55d7f453fd927d34b91531a96b3bd52c7ace43040e1a4be1fa8701a28ae83143d06299c06239ce47b59b6ae047ac8efe07bc9492d0387b270193854912ffbdc1622dfcbf732ff5b87b81ba6f8334cf167b8124ef11d5bcfe26945f413b20dac326db59275f5ead6cdf715b2c72a7623faf9626358b84e3d26085b2b51ff6df58d90b39f783f4e91332eb19cd64d12e8b83f0bd7cd37b2701a19cfc2f593f142e6bce0bbd6b23d27ebe613c2b626e5c52628f24ac3f2da5c23dc4b9bda8b85eb7b07287ac9f745cafb7ce02f7c2fe360210bd72f85cdc51621fef552deabfe49f7fb29ef0f0cbb8b15b270fd52de47a99b17b070ddbc2060d7f68b24ec0e4ac24ebe4f173b290f6327df63ec3685dd558bddc161fb6387b278f929c2c3368367226db1c35865badf59ea7188f077b7b8fb98ecaf3e5cdc4f143a95837b2f6edac9fe2b9d8e4788abac97cab4328985f371d9f63a4ae3ffd1200c320d1f039ec97ae964f04cfa33251ed621b2ee2bfaf86353815f93817bf90ec6970c636d45beecabdc0bdca7120e590f82e190f5d2e99a70cc48108e99c0afe9c0bd7c07c3719cb8d651e4cf52c221fb62ab130e592f9dad09c79c04e1980bfc9a0ddccb77301cc78b6b5d45beecc3dd0bdc57371cb25ebabb261c7b2408c77ce0d7eec0bd7c07c3515391bb270b97efb28c91e5fb02162edfd5efe57b598f3821fc9e9da8e170523c2c1d178967d5ad07487d4e117e2c16fa54807bcf4dc70712c83a595c655e2efb3516807b2ee3f740e7ecdcb0dfb162162e9f4f06cfa1bcd2b0bc4eb22d26cb98a52c9ce76f01cfa1dc25c2dd1ae55ee6dd8dc4f312f17c2db8e7fe3609bb63a789eba9c2fdeecafbd3157fd4f76788e7729c36957257ea56aee8b649b83b53899bb3e236d3b997b83651644b9b2d5564970ad9b23d77b622fb9cb8ec9eb720b265b95ba6c82e0b64ef28e2909dabc83e2f2ebbfb6a453616efe787fd46e37f5d92f8df5b89ffbd035d3b6f8df897e955892b26c7d6d476ca59c2cf652c943f55dacf7216cf579603b7fcba8285d3ef8a406e77d956aca5f8b18a85f3f0558adcd5ca7b512788817e86986cc7eda330df27f0bb4bffc0df2eb25c97715fa1c4fd05e039d4711d0ba77979bfb7b0ad864adc972b7a94077a749373422e0cf3ac8c87a224fac9eff295f745ca7b3917eaacf07bc9b4f2fb354afccbefcb94f7aafc8b14fb90f2653cac65e17ab5e420b9a9e1b958792ffd93f52f190feb155b58afd8ca06166ad757cabf44792fe55f1a761793ed0499e6a3a6d18dc87b358daae1da5709976c9fc870c9f684e4bb5279be47d87d65fc2e07f1cbf3be4dc0de74f980ac67a4230f394fe8b03fd3e72107b078fa3d00b8e5d70359380f393090db738390514bf16393c26f9322f760e5fdc1e27a10d041b6cd0e61e1b47b48e077ce86c0df1c398745a6d1cd8a4d5f009e431d8f60e13c44de8b3ca4a7cc0b641e72a8a2c7a1811e3bc97987978579a27988aa9ffc2e5f795fa4bc9779c879e1f731a55f22769812fff2fb32e5bd2a5fe621fb2bf2653c1ccec279886c974a6e6a782e56deab79888c8723155b90f578692b47b1701e22e55fa2bc57f310e12e763433cb438e46de6379880cd7314ab88e51c2756c385c959c8f0dcbad12bf0780f8e565dd23c0dea8f310d1ff1c3b8ee9f390e3593cfd1e0fdcf2eb092c9c879c10c8ed2be725d452fc3849e1779222f764e5bdac0fc23696e83b8c9dc2c269f794c0ef5ea2ffb3b79c1b2cd3a8b409350f3955d151dac01ae55ee4217de59c1c99876c51f4d82218c87ee4cbc33cd13c44d54f7e97afbc2f52decb3ce49cf07bc9b4f2fbd394f897df9729ef55f9320f394e912fe3e17416ce43641a93dcd4f05cacbc57f310190f672ab670a6622bb2deb552917f89f25ecd4384bbd8d9cc2c0f391b798fe521325c329ef602f7305ce786c355c9f9dcb0dc2af17b3c885fcf4e7bc97e1c933c44ed7b90e55405b8f7dce40e4b204b8efdcbfce47c16ce33ce1732d6047ae75e13f63b76010bf73d5c019e4379a56179fdb259387d5da8d8e316f01ccabd8885d3bfbc4fa5cf1dcb6b65d82f6655e77c487f2f61a1fc37763178ceaf972adc2e0d640c121c2af35a29ef72c5ce2e57e45ea1bc97df5dc6aaf43b56cabc4af9e62a45e69561dbadb49b0be3327d37807bec6af1cd7a70ef852bef9cb07b39f68dba7f06e80fbf933ac9745a5b09d3354a98ae51c27451384c523ebb5adc5fabd8a7b45fc9e6bab02df8f7f23b7ebd5eb1dfeb83f0e47f117657d93f738370bf01dcf3eb8de279a1a2df8d8a9e1bc3cf7d77f5c2dfc830f8618579a80c5b3eb88776ae7e7fa5e1f7d7187e7f91e1f7179b7dcfda1b7edf21daf795e1dd2389fb5549fcdbab9adfb737fbbe927775bfbfc8f0fb6b0cbfbfd2f0fbcbc2dfcb3ca8b28c977c4419df4f8e299994f1b26cba99c5f301397fef1621673ab8f7f2a6c16728ee6e66a13cd0bf877adfcac276be0a3ce7d79bc4fb7d15b93729f23706e11e7c47584ea53f8a1cf93d5ba9c8d94f790ffa5a23cfd53f5ae1781b0b97d3b705cc86cc0a741f22fb478f12ef6f0fb393f2fce7505ea922ef91b01c7fac2c5118a47f772a717a67206fe7f68abbbb9538bd5b617d976263c780e7fc7a8712a752cf69e03db867b24dbebfc241cabb47e17a8fd0bb45d87da57ef7866d4ecaa9947b9fa2ff51e03ba89fea5ecc7dd959d6798fd1840bdaa094932c7e12d9d8e142d6fd4086f4ef0156b54e79a878f7200bd7291f00cff9f52185e943818ce1724d612d45de232c9c3f3da2c87d5479ffa8b83e0674147d76b1c7e3cffcf7f219bf3e2ce4ac00f79e5ec3be17326a2b7a3da1f8fb84a2d7932c5c877b527c7f98e2dfbcb07fc3db2b7224ff5a7146f25da5dd3dc04279f4ce57806fb9bb430cece05a11278353702beb994fb170ffc453226c9f8870fc9e40960cffb32c9c4749db7b0ec4e173c02dbf3eafd8d6f381bfbbd65564cbef5e50e250f401c75e04bc64985e02febe089ef1ebcb8aedbc1cf8bbcb077838a50e9571f85c380e7791e3d8d72b7a3c2ddcc9fe3c9987de5855677613d0f969f14c96b99e1f2572dcea06204bca10ef62cf68e4226bfc2adfcf06dfeade236b302bdfcb357eb722ef95357eecb6203c73e4fcb244362acbb857141b7d2588b3114706b2469c9340969cfffe3a62a36f00ee6f00b7fcfaa662a36f06fe8ebc46912dbf7b4bb1d1b7c4f56d102f324cef007fdf06cff8f55dc546df15fecaf10c9d8dbea1d8e81b611b1d21d722dfa1e8f1aa62a31d34367abbc6465f4dc146e1ba853bc577af69e462362adfcf06dfeade23eb502bdf4b1bbd0b79afdae8dd116c54f6657706e16a26f47d0ff07a2f88c3d1725d6ea7046e641f7b6f8d6cb9f6ee7df0ddfbe23bd11754b9ce5de7e68904b2c55af7d1df24709388c57d2cbceefd7e165ef7fe0088677e3d396e3b1df74f41fe438afc8715f98f98c98f7d20ec40ceb3ed0aaefcb99c632ae3bc0be022fab21858eb51a9470f8dbb6e1a7739559fc53e0271f811d0935f3f64e1fce9c320fec6cbb5215d95ef3e16ee37817b7efd9485ebfc9f8aeb27e27909b8af196cffc0998ecb55e47c26dc1f0cee13c99910c8e1d3b543723e17ee67827beefe92b0bb10eb1ee29a0fee61fd5ecafe423c9f01ee6b56d521143f398aec1c45f647e1f7fe3dc87bc72e517494712be36f19b8e7baa8e91fda59a2f421ead3ac0d70ff986263ba34f1b812bea8e9e64b118e69e09e5fbf52eceaab207c1384fdb127c2eed1bd6e649e26c3f4240ba7fba7c4f569e096cbfd5af83f1fdcf3f7ba3d3be49ac0eae64da25ecb9e4be0c7f3867e883536b16f44b864b9d74e3cff9fc2fb7f01efdd2e51dc7dc7f475a1efe38c63df03b7fcfa2d0be735df22b2e5773fb0709bea1bf09c5f7f64e136d58f429ee4206d7f204b68fbd2bfcab4f73d0ba5bd8257c4fbf62c1c8ee92c148e49931477d56124c3b48085c25445b6fcee2716ae2ffe24ae3f2b3afe1cc89928e6bf4cdc145c2775097fc7649b48dac7eecafb1759a89e53f95cb68d7e15ef0f01f7fcfa0b08f32f224cb2cd93a678da4db633ef494d5ec27422d23f7bd9408658df3fe99b40bfc9ea5e62af2409ef6f2c9427b257c1737efd5dbcaf00f79e7f9365ffdf6b81bf33e47cfad753f3b7d29f3f141bfa43c817f31f267fa2f04e26f78db07cf616abccbbe64a366f0abffe04f6f2a712ef7f09bdcac1bda7d79435d1f4a9942bd3e5df8adcbf855c99afa7186fb20e3cb566c4ef649dff1f10f67f84ac114adcfcc3c2f51be96e43443f9b8befff037efe2764dda2f829f7a39b01eef9f55ff0edbfc1b7d3e43c6111af7c7b33587ff3efb9bbba41fc4fcb16eebb24708ff9a5d6759285b9a59009f663f3ffe6b264bb408439ab060b95935952c60ee03b5006f9f7fc1a03b26381ece9b2ddb6bd785e5309634de1ae7dc064ba64d825817bccaf4d1199883661562d20ab969025e7fcbf1d6693a8aea593332362fe9772be92421e3c43ac1b987186a2c3eb896567d566a13c384bf40b6729fbae65897dd766bc11f8c39365280c49fc61ef84e527ca1bb3ea02b6b25e28f2c6ac7a2c9487f9f79e5e334f8ca64fa55c19eefa8adcfa42aeecdf4891a7df0fe07d372b3be277229fca027b5165893dac66eda9c48ddc176d06b8e757b04797ff37ff56dab6cca7e4b86609b8e7ee6e08e26296cc1fba24708ff8355bb5ff646196f914d85bcbff9bcb5aad8459eee33407dcc37caa310be753623facac4640b6d8f76db6ac67c97c4aee995502eeb9bb470226b325c32e09dc237ecd91ede25499a49a9e12e509efb3906dfbebeda5ac77c5753178f69eb81681671f886b31ab4ca70dde48c1ef0f03b7bc2848ea56f4a366c9bdc6a6837b8fdddc3181acb9b2fc937d086f266123e5cabdc8f604f730cdcb3dc7cac13df7f79d88fe49792d41fcb70cfb9925f7ef5a00ee3dbf76bf44d1597e27f713db0bdcf3abdc1f6c2db8f7e4cc13f9ff3cd1fed95db61145ff7a565ba09b90c53e066e405ba8f2bdec93da43792efabeb2e45c9543c03dbfca393087827b7e6d0774106de12cd00fe3ffcde58b795a59720fa7cde0be663c6c95ee93c48f645a5986c83de344bb6aaecc0f528def04369d25f70e9a06eef9b59362e39d82b0ec21c7217754dc95807b7ecd069cb2c5b75b143f7664e13e8f1dc073f91dcc23a51cb52f1bee012cfa27d9e7e2aaebb3f982a53e16d036f073beac2b7e09e4729d3a0b1d0f53ee0f17ee44be9fd545e1d945c87d4791d71584459619727eb2baa7b07c7f3a90a17b1f652d63b6d0a39bf8e608e539ec9f957b1acb3eb8af14ffe5fb6f1499ea7bd9c725f5933694a3e8209ff748a0c3b74974c849510769a33b293ac8e73d13e8f05d121d764a5187cec27d2f4507f9bc77021dbe4fa243af147590e5411f4507f9bc6f021d7e48a2439f147510edf0ac5c4507f9bc5f021d7e4ca2436e8a3ac8722e4fd1413ecf4fa0c34f4974c84b510759a6f6577490cf0724d0e1e7243af44f5107b1bf67d6404507f97c50021d7e49a2c3c01475906d83c18a0ef2f990043afc9a4487c129ea20ebe243151de4f39d13e8f05b121d86a6a883a84f640d537490cf8727d0e1f7243a60fbd7ab3a7417eee57e9cd3c3eeb346c475f0dd7865dee2cdcab7720f4d5e0ff0cae5c5b24fe04ff0be1e9007c321fb447757de7fa3c856dfabe1e821de8f14cf8f549ec37d3155967fb1c42c4722ef551dba09f7a31196630187d101cba217946fc7845916c93ee13fc1fb7a401e0cc7df613d2bdf7fa3c856dfabe1106dc8ac710a4bf97c7c0296ffb0c42cc721ef551d645d7202c212ecd1e4bbf15896b456be2d609575c712b9e6ee4fe59d9405c3f0afc249beff067cab7baf8621513d2d51bb6e12e02bd67c644d0e73f0efbd3097ae56dcc93da5f604f7fcbd6c8b4c61f1b6087f7e3378ceaf727fab7d15b91315f9625e77e989613995fe2872e4f7ec2645ce7ecafb1b40d893b6856ac5fcf32c26b01256c856b3be7e67314ff1a91e1924bf4c7e5890df2fedf79a337e6a10f7760ddbe87d5aa23bb167b67f1ed01a8f469ef6c49e36fed902d2f7d1feef42cfc5525fe8515955bcb8b38a175cb9e5de4f09386ea8c27b3ede3fad881f38b4d47bd3874df2aefcab45ac1f9beffd84a5ccf1bc5dced67a77b3bcdfab7d798b3cb5abba4c16247e3491facd0c4f667072d20aef8904badabb5fee6b38d3ffbdced7b4c4d7bec07bb6c63fc769252bf31a44abd806dfb7aa612ff7fed6f9394b20d3eba83f40097b1e1cd324a3698c171aae7d5fdf16ff2f46b6468cf8c34747897458b3af3f6273749598f83f864126c3078a0a848c7e3eb258e8591eebebaf1798518560f430560da1debe03de0359ff8461d193e1d1ddce0f413c8677995138fdb49b4bdbd60a072d9ff5f5bbf2db27095a22b05c5e8e7ff2419420d4aa5533972baae28fe9f0fbcb756766107fe06ea9ef2e7a04d4f60bbf7004f84770ccf2fed8e0fd5fee391ee9090cd4aaf03f5c29545bceaac4512e1758c7c75cb5104da62a063a4b07daef3b9cb555ec1c3bb62f31eaba95a188a3eeebd78c5a273048cc2fbfca9425ea4d32c9bc31b9ffa09d73875c584b1f2ff5fd78a98e6f58ccd4d0c54cfd4c2781e4797ea278695019ae78bcf07f7a860d11db4ea60346b0a68e6083ad63db5cf7ead9361fd4edad30d4f36b94d00613698011aca523e88f68cfce20c1a99e867b8b9a62f518364e9961139f619b2aa14b45078c626d0dc55c4eb1a94ead7a8a5a5c2344701d4c703343c17531c1cd0d05d7d319d476994e92fcdd2a5f4aa1e736ba39f1bed79e6ab6a6b7a796489a4cae02664df57571c3116eafd54a8d9c9678e434c024b73295dc1093dcda54f2763a83f2f72aca7c3dbd7a6524cf6b5aa55c46b66589aad9514bc8463a7afeec9c3d49e955ed3e927f8df2be5de27158e7f709acf5bed775372526da2ee5dcbebd4f339be93ac1a26984116eacb37c8ebd0316edaaf1b7c58dbf894e38f7718754b2e9f6b8e0a698e08e86829b611941b626238845c9089a63923b994a6e8149ded134f36a8949ee6c2a797b4c721753c9ad30c95d4d25b7c624773395dc0693dcddd436da6292734c756ea7cb9afd049fc9aa37ec56a85ed5bb47653840d3dccf5faa56b253f14dcc2709fed5415ae37ce048578b4fc5032c276faf8b103f3f5b461a21b3bd67c150c758ffed52bf7f3c2e73957fbf12b44b127dc1a364b2772df634e4ba248ebc5ebac8f3735a3e158656b3dea944741f3fa2e995c18ca2832efd73a3e8ab2197cbc9e52ac152b3843e7896b083ce33de06e4ddd5557a1ab9fc2ad2ebe0d23b6259599e6956968d49ce3795dc0993dcdf54f28e98e401a6923b6392079a4aee82491e642ab9ab2eeff3eb458b49f33e59cb9ec9c6b089debb42cf7d893f66c59f4ff324167a7e7379237d1f64d20ede87bf4a9cd30dd6e5747efdac1b6369d5c33f18b05864007d32f00fcb3b87fa7967ba8387e594dd7426e4575317596542d5331f3e032eb526e7309f7a976a508f4abcbb2e3be0c487eb9455738361786e90a313ccdbb47cce9b699bb607267cd73408df09133e220dc27bea84f3deba91958ee3c2fff3fe5511de1017de0bd37c9446f3ac889af7c60a8ed19a822352fba80fc6648c86c9269dda0998f4c5848fd5083f31a2f05c4cf8388df00b220aefa7cb0cfd96f5c119c90c934df51aef858cfb06473daa56a4e55c9f19deb5d4d7823fe75a249f2296383b1dcf34a5b1df3f3016649c5b3f147c32657dbfbb4b9fd917f899bd5d3a63c5459ecee0797b81cfd8acd2bae02df885a2d799fbbfd27f35cdf381c76681685a45697fe46339dc444d0e178b98c3f5d72538bf5b68e5564d70bce5b9d6ef82e07faf13d13bcbf73b3e99c32429f1b9a31d34259b5fba698d76b26fb47929186d3ab4c7cc710096ff4ed1e4bfab63d1f2df815881375553e0456a290dd249e6952e3e5fd9a4d2355827981719d33579652ecf2bf90058961fa333fd18e56531d6e7a1cb76a2f79154094f011e9e2158786661e1991dcf6c23f83314f3670ee6cfdc6af9b333967dcec3b3cfd95eae52ec3de4eec778ff177b2fcbfcdc24781625fb1c86f9bfbbce7f6eeb09a69e45f07738e6ef1e3a7f9bf9e15ee8895ce80faaadf4c21fe4aafc299fd75dee5b62140d76c13498afd3a005d0a0a432cf9a22ecbffa5aec8a69b167220eb9deff22c19e4f0a5c63a0c1084c83059805480d16fa158932cf0e968ae23c8abf23b19c7a2f4d4e7d6c8d6839f5282c500b53c94f13683d1a13bc084bafbcdc5fe3d70b784e98ed4f96cef65722c85414c5ff3118b5420db50f22521b8b056eb12e70cd7d772bfdca43a1a847667b45c17a16ccc41feaddede719ca019102380e0b60912680fd6b460be0782c80c5589aaf1ac0c97effc91a83204ec08258a209e2911183588005b11433d0719e6996fb41caf62aedab44615d5ccdc0ed8605ae4c13b87722066e2216b825bac0f156c05cef55903b2d174b42aa17ac4958b0966a82d5a456b4604dc682b5b72e585cd0482f8e368a961d0fd02c2f06a3666553b0202dd304293b6290a662c2976b84e746143e4d279cc736df39dcb43f6eba4e38aff9ad6448cd8f9f9511bde637038bf4d5ba48e76d8185a2e15eee971b4b34b63dda7bc26be1cb2219c24c9d267ccec03eba10f32c439c321dfcd38c46f6c43d9b8505bb4217ec962c5edd8857bb0afc0a20aff854bfda331bd3638d4e0f58f14a5705740ea6c15a9d062db424cc2ba073312dd6e9b4680cb4e0bef1ca5ff5fd9e87f9bd5ee7b7aeeab9b4b2288ee2efee5812df8025f18dd54ae27b60e1db5717beb69a240e1b5b13427657bda43e1f4beafb61497dffea27f53d759ef132e00056b50cb8a36eb43260814e383711be8bbd515fcc5e98e4834c252fc4806cd201a9170dc8224cf8c11ae117348826bc50279c97b87c9f30d31277b146785f7f8a1caf5cd930452abdd3a3f81e6aa98dfaf25d4072627c9c8d4e57ac27b508cbbc0ed3a91f210f2ac6f2a0c353119c20bf29c152c0119a14b0b961b41450aa13cedd1fa9c939fbfad330abb71ce8289ee1d61419ae98881161a94c1996528fd6a4d41a1153ea12cc26f8716f550a34de66d2f510cbf657360ba655f2c626ff7b95f7bb5c29d6b3fdc9f36b586fef5aeafd2ef70bc132c65be2f16a1097d8cf9758eaa7f515fe775c7660fbfc7d9ef77ea877cdf7ae9d2219ec522cea8fd5447d2e8ffae3cce2706f0cf3f13acc8bd282b9fa30b3bdeada129101672bb5e3a0bb4b7656678bef57fb72cb442da72262742cc392f9099a647e64d368c97cb9ae2cf2e7f0667261d048cf55b93f8f27facce913532e5d4e62fa4541897dc7ca8b15ba68e1e44e4e255b3f098f9295ba28f167d0667245b33ac4152d524e493952b630fd6ae664fe63d1b24a47cf9f123c3d83f452d95b434feed494c99de6936b59255409b79f40a8add61933a7c6f711ada7562574a5e869b841efa313ce33b0333419d8b466d132b0724cf333359ad789a87905a6f9591acd5b378fa6f91aacd43b5b57ea319dea094a8db598eae76854ff20a2eaeb30e1e76a840f6b154df87a9d705ea33b8f99b7bd3660c2cf4f83f08d98f00bd2207c5f9d70eefe425d8ea10ade8c0bde4f27985bd645a9084e6082fb635672b1c64ab25b47b3920374c2b9fb4b185249bd941955520fc4305da64bae7cb0216a2595174636b6070ec2505f8ea1bec20cf5260cf5953ad48bd386da9d36c1c158d2ba4a93b4fab78b96b40ec1b2b1abd3908d1d8a09bf260dc2376379e4b58679e46198455e6798471e8ee1b85e83433b1b3e018e23302bb9419701b78f662547ea84f3f6cf8da92049d0fe390a137c93a1e0a331d637a7c1f48ed109e7f5d05b52d13a411df4589d601e89b76a22f18b8891781c26fc368df01b3a44137e3c26fc768df00d3b44137e0226fc0e8df0311da3093f11b3943bd360292761c2ef4a83f09331e177a741f8293ae1bc67e29e546c7c0b2e788b4e30cf35ef659a029f4f1e8e5ae0af11857759356a55d18ae653b1b0dca70b0b7f911df2358a5fa7617eddaff30b0ea917551947a9feb0f6e998160fe8b480530b5688ca4fa1cfbefa1a9c8169f0a04e83fa0c0eaccff52d634dc472fb4c2cfb794897b7758a96fd9c8525e287d39088cfc6347f44a3f92b11353f07d3fcd134687e2ea6f9631acd73778ca6f97998e68fa741f3f331fb7c42679f7cd9db7c91972df0f286f9221f1a2a1a1dc1b379feb537dbc5fb3d16e45945bea0e5de5f7ccad06aefd9123f7fd9e0776296f84f8b23e6691760fa3fa9d39fcff18f6b24d7df66578669a808cf02cdc04c9067ab0da815be8b8aca39c5abfca7c57eee1174c86ef4bf8c12a60b7561e206f254e50ba555cbcf1daf5d8705ffe2abc623346c2fc28cec198d91d58c68641763c29fd508af1551f82598f0e734c26b47147e29665ecfebccab4b4ac9236897f7f5aefdc5b320a9ecc70608b703234e89bd0c339817308379d1d8602ec7fc7c09f3f365633fafc0a2fa9534e48457ea84f32a243fb0d6a40a7915a6f56b1aadb5e30009b4be1a8b86d7b16878c3381aaec102f4661aa2e15a9d705e94bec5aa16a5670c8f56945ea713ce6752be9d4a1c27d816ef7a4ceb77345a2fdf359ad637e8847365de4d45eb04dd0e376282df33147c139696de374c4b37eb04f3be8c0f52119ca02fe3169d603ef6fba12e1df189a8fc3ccbe813516fd5f9c3d3dac73a7ff8b4cf4f58b5a77dde8659e5a71aab1c36229a55de8ea5a5cf0cd3d21d98d69f6bb46e322a9ad67762f1fc0516cf5f562b9eefc2e2f92b2c9ebfae7e3cdf8d11fb4643ec8388c4eed109e79370f90150469370efd549e69360be4dc582122cb5be0fe3f19d8647eb31d178dc8f09ff5e233c27a2f00730e13f68844f8a28fc418cf78f86bc1fc2b4fe49a3f586885a3f8c09ff5923fcc888c21fc184ffa2117e4d44e18f6229e757d394f318a6f66f1ab51f181f4dedc731e1bf6b847f1251f81398f03f34c2f79c104df89398f03f35c2374514fe1426fc2f8df047220a7f5a279c57d2f9298755da99bc1a1f5e9d224779f9b772095ab6f7d72ad1e932bc1a0b2d9fc102fc8f26c05f440cf0b398f07f75b9684134e1cf6134ffd3d1dc5e43132e0a573b7da2307c1e0b269f3655253f8f18cc17b060c66249168cad64a68bd55ec4fcced2f9dd94c17e6db95745a1df6b5651b9742e8aff2f61fed7d0f9df36e47f323df83b6e0ad1463c5ec672fb9a31c3dcfe154c722d53c9afea24f3f4503b665623780db3fb3a1abb2f9e1ccdee5fc778d435e5f106a6763d8dda75a74453fb4d9d70de6d523f66de6df21616930d0c63f26d0c49430d9227a64743f20e267c3b8df02e33a3097f57279c236c940a9204536edec3f29ec6a9084e9085bc8fe168a2c1f1cc9c68383ed009e72dd2a631a445da2c56ed16e98758489a6b42f27bc4907c8425a4169a8414752bcd8f75c2799cb54c56b0f19337e586afd52f583fc1fcdf5ee77f13162e58e54a64b85a398aef9f62beb7d2f9de86e98b559d16d52b543fc3eca8b5c68eded9239a1d7d8e05b68d2eb07c7640a20d5ad65463e38f2fb0e0b5d504ef9b88c1fb120b5e3b5df07859311f9c6c3934c1f6627ccc2a4a30bfc23469afd3849f62156fb9c04d7ea2f8f935e667079d9f8d80252ff31e6c3448c1df603eef902c05afab7c5c7ddfff87f9de51e77b7827876083acea955ddf62fe666389291ec7ead64ef19daba268f01da641278c7b5c83aa1bb8441db4ff1ef37d47ac3116f77db4ffbb88adf54b90e87eff80f9dd194b5fc1448c551ee7eaa6af1f313fbb60f11df7333df1fd13a641572c85c7358867e4321b8fe2f3cf98cfdd92fb5cd5d2a2f8fc0be673f7e4310d77aa8ae2e7af989f395868837e946062239ffe585d1bfb0df3b9075617537d368be7df31ff77d2f9cf5ff08945a5fe24a0a28894ffc0fcea89e5db4bd3928afec4fceda5f397d7a67b7b3f517cf80bf3a1379653e0211bed4f8f8d3a19f56f4c833e3a0d78936745352df61fcca7be58fa843e552f74ff627ee6eafce407b8961aa58aff74fef1ea633fc3ae0616d308f60f3032edd7896192f34d2567e924f3e6657fc34e861a3ac13c5606187632d4c4040f34145c0b133cc850706d4cf06043c17530b318626a167531c9434d25d7d349e685eece69e845ac8f091f9606e10d74c2794578782ad19860c248430cf62ea6b0b7c352f7ae86a9bb11a6f20853951b635138320d51d804133e2a0dc29b624c469b3269a693cc2b1a635289c60407fa35d709e62dcbb1a9084ed07fda02133cce50704b4cf07843c1db63b137c134f65a61920b4c25b7c624ef662ab90d2679a2a9e4b658129c948624d80e537bb2a9daedb12438c5300976d009e6bda25353119c6096f30e18e8696900dd11c331dd10473696be6718a6ef4e18e799869c77c438cf4a03e7ce188ed98638ba6082e7180aee8a719e6bc8b91bc6795e1a3877c770ec6e88230713bc87a1e01e18e7f9869c77c238ef9906ce3d311c0b0c71f4c272febd4c73fede188f8569e0d107e3b1c890475f4c70a1a1e05c0cc7e234e0e887092f4a83f03cac195e6cd80ccfc76cafc4d4f6fa633c4ad3c063006622658626321013bcc450f0200cc7d234e0188c09df3b0dc28760b6b7ccd0f686625a2f4f83d63b63c257a441f8304cf8ca34081f8e095f9506e1bb6884f7f54fafe7dbed667e97f1749c9d9778ebccd5a958e94c9cd8ae98f9ef6368fe23b0782e4f433c8fc47acf2a0c7bcf46e90c289b1b50e95631203ac359a323155348f97baeae8df101597e3e368596d8eeaca37551cc63625d2a51cc7546048fc1ea04eb4deb046331c91b4c258fc3246f34953c1e93bcafa9e4095806b05f1a3280024cedfd4dd5de0d53fb8034a83d1153fb4053b52761dd3e071976fb4cc65ab39b0c5bb35330d007a701f4540cc7218638a66135e8430d6bd0d331ce9b0d39cfc0381f9606ce33311c871be29885093ec250f06c8cf391869ce7609c8f4a03e7b9188ea30d71ccc3041f632878778cf3b1869cf7c0381f9706cef3311cc71be2d813d3fa843468bd00137e621a84ef85b5104e326c212cd409e68db5930ddb348b308d4f31d4b81013bcc550f062ac5e70aa69bda008937c9aa9e462cce84e4f83d195606a9f61aa762926f94c53c96598e4b34c252fc1ecee6c43bb5b8a093ec750f0de188b734d592cc3cceebc3498dd724cf8f96910be026372812993953ac97cfed385a9446382f94fabb06af44586d5e8d55807cec5861d38fb60902f31855c8e49bed4547205960a2f334c856b3073be3c0de6bc162bbeaf302cbed76138ae34c4b11eabdc5d6558b9db80697cb5a1c61b31c1d7180ade174371ad218afd308daf33d4787fcc96af4f832d1f8009bf210dc20fc4328e1b4d338e83b07cff26c37c7f1396efdf6c98ef1f8ce5fbb718e6fb8760906f35857c2826f93653c99bb1b472bb615a390c33e73bd260ce8763f9fe9d86f9fe11188ebb0c711c896576771b667647611adf63a8f1d198e07b0d051f83a1b8cf10c5b198c6f71b6a7c1c66cb0fa4c1968fc7843f9806e1276019c743a619c78958beffb061be7f1296ef3f6298ef9f8ce5fb8f1ae6fba760901f3385bc0593fcb8a9e453b1b4f284615a390d33e727d360cea763f9fe5386f9fe19188ea70d719c896576cf18667667611a3f6ba8f1d998e0e70c059f83a178de10c5b998c62f186a7c1e96fc5e344d7ee763925f32957c0196fe5e4e43fabb1023fd8a21e98b30c1af1a0abe18c3f15a1a705c82097f3d0dc22fc54ce40d5313b90c2bbadf342cba2fc78aeeb70c8bee2bb0a2fb6dc3a2fb4acceede31b4bbabb0ccee5dc3ccee6acc2cde33358b6b3095df3754f95a2c997c908664721d26fcc33408bf1e83fd9129ec1b30b53f4e83da37ea84f371ef4f5289c904e3de37e904f30ce1d35404273852e1660cc76769c0710b168b9f9bc6e2ad98da5fa441eddb30b5bf3455fb764cedafd2a0f61d988d7c6d682377623cbe31e57117c6e37f69e0713726fcdb3408bf0763f29d29937b31b5bf4f83daf761c27f4883f0fb31e13fa641f80398f09fd220fc414cf8cf6910fe10662abf989acac398e45f4d253f8255287f33ac503e8a55287f37ac503ea6139cedddfe918ae00453c61fc704ff6928f809acdaf79761b5ef49ac6efdb761ddfa29ccdefe31b5b7a77592f9014cffa6a2728203989ec1eced3f437b7b16cb32f8d6c0a659c67398f0581a843f8fc5625696612cbe80b56f6b6499b56f5fc4d260cd54042748832f61826b190a7e19835cdb14f22b98e43aa6925fc51261dd5460244884af6189b05e2a821324c2d7b174523f0de9e40d4c788334087f138bc586a6b1f8169608b7334c846f6369a591615a790713dcd850f0bb18e426a690dfc324373595fc3e26b999a9e40f307b6e9e067bfe1053bb85a9da1f616ab74c83da1feb84f34d27b74fc5f4126c3af909c6a395298f4f31c9ad4d257f86496e632af9734c725b53c95f6092db994afe12338df686a6f115a672075395bfc62afe3ba4a272a2bde731c11d0d05ff0f63916dcae25b4c722753c9df6119d28e69c890bec784774e83f01fb068ec62188d3f62b0bb9ac2fe09abcd7433accdfc8ca9dcdd54e55f30c939a6927fd549e6e71ff748054682f38f7fc3f2ba9d0cf3badf31163d4d59fc8149ee652af94f2c09f64e4312fc0b53bb8fa9da7f6392fb9a4afe07939c6b2af95f4c723f53c9ff6192f34c25f3fe1dade47c53c9314c727f53c95998e401a6926be824fbdb7e1b16293531950799aa5c0b933cd854726d9d649e8d0e31cc46eb602a0f3555b9ae4eb2bfef771a32bb7a98dac34cd5ae8f491e6e2ab90126791753c90d31c9bb9a4ade0e933cc25472234cf24853c98d31c9a34c2537c1b2a4d1865952534ce531a62a37c3248f3595dc1c4bdfe3d290be5b606a8f3755bb25a6f68434a8bd3da67681a9daad7492796b6537c3d64a6b4ce589a62ab7c1484f4a03e9b6588138d9b0406c87693d250d5ab7d709e7cdaca986cdac0e98d6d3d2a0f50e98894c3735918e582cce308cc56c4ce599a62a77c224cf3295bc2356bacc362c5d3a6382e7180aee82b1986bcaa22ba6f23c4395bb6182773714dc1d63b187298b1c4ce5f9862af7c054ded354e59d30951718aadc1353792f53957b612a2f3454b937a6f2225395fb602a171aaadc175379b1a9cab998ca45862af7c3542e3655390f53b9c450e57c4ce5525395fb632a9719aa3c00537989a9ca033195971aaa3c0853796f539507632a2f33547908a6f272539587622aaf305479674ce595a62a0fc3545e65a8f2704ce5d5a62aef8249dec754f2ae188c72431823b0e6658561f37224a6f11a438d47612d9eb56968f18cc662709d690c8ec178ac37e431168bc10d8631380ed378a3a1c6e3b118dc370d3138018bc1fd4c63b000e3b1bf218fddb0183cc0300627ea0473f707a62238c1f29d49580c1e9486189c8cc5e026d3189c82a97d701ad49e8a99c721599ac38d8ff56f67b0d16c362bf6b7f00fb6fb5fe1ff5de01f04c0b7fb2ff53e09b6fb2fa8743996ad6325be8b19acc47fbbd47f52cefab085decf4cff6db12771adbf513f971bff660ce307ba17b28ddeb5988df3be0ace94a810dfc637f70f8e1758ea6fb91f7e13e897ef8570618250f0cdfad77a7f5700df67f9c71b489961a973fc239e8b23a59d6918f54375d477a9a43ed3e330918d62fc48eb1236c5fbbf86adf78f135826b40b5896f96f16b249debb225fd0b44a7ae5be0b9dbce0197439d23fc8214ac8a66321dbac0bd9502464b3d91aff0089a5fe353836826b5de0fd157cce89ab31010f6050dff1832656317ed44261c4e3b86760213a4c17a2fe488830b6e1f85aeab99dcce20796a72f1433b1501cae0bc5cec6a128408f984f5f986661613a4217a6218ca1f944dcbaa6307e20c7724fdf722ffdf3834cf8011e89f39874856736169e2375e119133957e0e10bc783fe8812dd793de90be51c2c9447e94239d0c8128b7d5b5c2d5c4d11e14a149b514232170bc9d1ba904c222c3bf9d37d7c6f7898822377968a7c725fefca73512e271d65d73c2cd4c760569a38d5adf2e267a11742ae7fa1c8f393a538fab4b83b16ca6375a12c21ae17adf12c9d1f995426ea3ddceb208617fba14b9d56a2345d1d6bd803e3749c8ed3ecad567f8c92835787c37c8cc3f1588d2e71aa18e7e7df2bfcb49b9ed8ad6e2eb72716b2137421ebaa846ca4e767b99ffbaa35d3125f93356c49154de3f5f4287a2ec0f43c51a7e74845cfb89f30579ae4db608557ff5fe2e720b8a6f8f374e5487b61e13b4917be3c257cd032d438192fe224d53040595142b0100bc1c9ba10ec9a520c8df4d269b16827e84ab8e831543deb5b8485ed14ac56a3f7538d9b223f27ab5a6b4e45ffb8ac282129c442b2451792c111ec2c7a58f4d2a2846631169a5375a199c0b0e3fde4b186abfcbb95d50e5d74e951425b8485f6345d68874788bb9949f308ca5a463116aed353b14958f299dba45e5a94d09460a1392395ba42b804817921b72d5e2fdce8b701cb12d4fbc332d257469562213b5317b28929e5f0e3fdc3320b45cd5096c441fb5cb619b666b95c8685f92c5d98f10344619a09d79556a6b9ddba04d3f86c9dc6c322e48961bdcb907e84d47b1da2846a2916aa7374a11a9d811a783c774857cced8d85f15c5d1807a031c77bd3177b8e645827f96dcbb1bebebadc30ddf9f9322c1ce7a5d28710259fd89a39c3722c94e7eb42999b729d306a7dbd7a35da1598f617e8b49f19215fc37b7c924b48cd4dba627025c6e0c254da5c89ea1d51e3b0ba39c62a2c0417e942302aa59436d373bcd8d7a7d0e7bd755b5eabb1105e9c4a9d37511c45abf3a6bb47691f2c5c97602336a9e51ed14285c75675c2548e85e9d2eaf7d124eb39ce648e5f8185efb254cab52839255e3ad38f88aec14279792ab57c9abe4eea5ed0b55898afc02c375a6958e0d7a4790c17f95fa55a1aa62b4ed761e1bb5217be795b394ea9637b3d46e32a1d8d714969c838e6f167d738d7062ca457eb423a36a51c79b23f86ceeb05d2a2f19e884cd5123662e1bc2695d6a15a868ef6435a35f6608b2f95e7e92d5df7c5c2786d2aa56bd530c6db53ea6c0e55db59dedfabfde7a985ae7afd66fb61e1bb0eebb74814bea01e14ff20f55235bdb1b63f16aaeb75a19a9f66cbc4d25f54f7e9657200c6e4061d931d93d6a382d656dc4af5d61b45c303310d6f4cdfacb0406bf896c7ee5aa61bcfae5eae7810168a9b74a15890a650047336a3480af7a455efcb285c36615c6ec6caffeae9947a5f00d57ccd83b190dea20b69df6a5940e2599bd5afbb1c82e97eab4ef73d2a754fffdc1369e3d59fa3939e11f6433122b7a5d25f35da0f6b102e9973cef29ea5363e9b9e1c69331682db53a9a7e9eba3a9d4bb33d94b701816c63baa375291da4c88eab52caadb823a1c0be39d58df7794910aeaf1892330edefd269df8d251fa1e5e98882f39198a677eb34ed9224bd986b59c7fb89c51a787f8ef565f3d1e8697e0cf0bb0ad6b793f7ca8fef202fee5399c7f609e5c7f1e7dcff155efc72a2b32a73d35e2c3b89847bb2823de6fd7fdd631cde1a51d18b952a1c822f97fb92e33dda7cd5c1783fdf0fe6d31679f793fc19c56bd8223ee7cffb49160a5db9d207942c3074c9c3b4c0fbe1aef8ea9422bf8785e7678b3d0ba82342246579a479b5789b0be9bd3c56db8858cdeadb9987b16735ad29b916f771df6ae86da85515b23075e8740f04c859e8b1a6decd42806d250b16eaacf2451688ec30a9af30efd3f9dadb1720db3849c5cd0699824e5c1bdfd482c2a69c05d3232fa8cb589d5a59b93c36eea744d6d847c66306d6357713f90b5f19e6022eaf50abc4f50025aef63eae852c5754c3c39636dbf3a55874f04cf08baa623f5be00db43c27405ed3330ef241faa41a5f4d37972df1136789ef3c10eb86ed1d39298eec213b6daf9f1320bb748e837c983ecf9320792d99ab50566977e54ee05ade2a8eeb114a5cdb698b083e91bfd491d27411281e1ea544d5326459811223bd0f8a8422e184e902ba6923e2e81ea344b7bd8f6e866f5581e74b3485c268ef09e7b1cc0978bf8f8fc37b9c125e73ef46ce1155abbbf1558bae94a85deac5b13d4189adb66f73c1305cb92379d9a6e171384fd29792f11ada04bf671ae6662ee09a36238eeb293b6b67f94e805cd23d0ef2694a900d4320799f57a9efb828959059006a13c8f49fa12f312528583773b731b5a8200eef594a78cd58d59ada6c56e1e39be98f09bb6371d78022e1394a686d357534bc7aeb565dedef097188cf5397abb2aee66e1ded03d041f942e6ca556e7bb0a11e1f04d795ad2e802c9e1307f92225c8063ec8b1fed8c45adf7b973ac4f9f896c4f4127dc1c07b3bc6f85e631bbfb800ed83dde3d05ea6ef22c212a90ba85e681047f50a25aa7a3e2a35df7201d10720a77a957e6c003699e27316b82877907d3f3f8eec354a648d4209d0cda6fa33fe404a9d5a8a70752d40f5c7dba311c66706f01adc58b681adf69f068d2b65a64017cf89759abf0e47fa7312540872521c49cf49a1329b13a173322749419293c2d04d8ed13899c9d7f9465fe7795fabfd913929375373220e3de4a430f09f9364e4272761574d4ee41efd9c6ab72f7322f785e4a438009d933467cd49a1a354b58b68ad981ca4ce9093725d3527c522353ed54c3f452c974f357be3fff35960b97c16d89b1cc254412128dfdfa22edf0bd19450a57c6f5fc5bf196295c3525f9e2cc7753ed70b95f47d52094c754a7b7ee899ac1abd4d896e0791f482f9922bd97296fa9e510bd9403ab49ba9d05e118ba37d87126d6b0d5a7cdaee4236b8ea5847fa70b6a4c2c98f409538dfb509e7102771760238dfb309673f2771e683c4febe4d38f39cc4590a707e6013ce7c27719e02707e6813cefe4ee2bc07e0fcc8269c039cc4f93ec0f9b14d38073a89f34780f3139b700e7212270315a54fe91b97bc95be8aadd77484b8878e4b91e83ecb842596a1b608d5e7f9246183b22115cecf00cecf6dc2d9df499c4f019c5fd884b39f933897019c5fda8433df499cf7019c5fd98433cf499cc7039c5f67623a2806339cd007d0a16c4b857218a85f7e630bca7c2751de0d50fecf1694794ea25c03507e6b0bcafe4ea26c075a3cdf51cf858cb778467a9f6d14a33eeeb5755a8302e6fb4c2c6e1ce4fd2fa9dcbe892b5cecfdbdc17fb7da9fb9c03f70cfface01207fc8c49466bce2839d7950652177fab036a1c2ba1460fd3153cbbab91596f103b23263935ba8e05d09e0fd4409af0980b7749b49d247037c3f6fcdb2198a234dc675a850d604d59c5f323195b59f48c6e599b2c293a8d01d05acf0574a742d04ba2231cd4add66578694d4024fa3c2580e30fe96a9c9d4db8605ae00e87ea744d72a890586f341d2ee5bb29cf07f00e61f36c11ce420cc6f01cc3f6d82d9df41985f03987fd90493b033820ce63700e6df36c1acb2939c0330bf0430ffb10926e1c40032985f0198ffda0433d741989f0298ffd904d3c546e2e70026ab6111ccc10ec2fc0ec08cd90473888330bf0730b32861ca157bf9deff25a1553a196a446ea642f82e4058831261b2ceb4f0def484850e59b7eeafa033ad26254ad923d42f3466235f67c822c912f57ec0226b51624c3e6203056668c4a62715d6f9006bed4c24f4d40a1e176b977900651d4a947c443b5cdc702b2ca36c2c928d18d605d0ea6e0d682e0eb3d601d0ea65222f8c9a1392ceee21cb0baf0225757d1bb1924ee523c33a0b606d408935fa1265c22109b239404dc1c4a98636e11ce224ce1e00e77636e1249da04f86731c48ec8d6cc2493aa39c0ce70a80b3b14d3849d73b90e13c1fe06c62134ed2d171329c4f019c4d6dc249baf48e0ce7a70067339b700e7412e7ef0067739b700e7212674d50516ab135bb84c38b9b083b3dc8a6aa0e0696d9d21694f94ea2bc01a0dcde1694794ea2dc13a06c650b4ad229306428df00285b6762cc277f9b1cf3798fc531b6d9ba633ed82a1dc2a98364ddc71702ac6db766420f8ff9b838d5a01024f4769428f99af5f0f0c568b64ad020c3d6880a5b4d6081ed29b1b5f12d902ffd0cf6eb85bb05178871480e95efb53a95ad67c136b5ee55ce3b01a01d32317f28d58d1c081335d9360e9300cc1d6c824938b38d0ce66e0066479b60120ea591c11c036066db0493b01a4406732480d9c92698846b7bc8604e003077b409a68bfb088d03303bdb049370b20c19ccbe0066179b6012ce712383d907c0ec6a134cc2b53d6430070098dd6c8249d8e54606131e1ad89d12665b0173b9e788630c1458ebfdad4e69cd506227ebc56c03467c72b6e6a21475008d1026590bbd37b0cf1e36c1242cd3e9f646073077cac40a1fbe3dc40ae179a17fc299eb7deba300c29e99181dcff50ba044c7c72d14b9a98bbb502f00387bd1f768c68b9fa52cbe81133e4aee5ee1733fe859ef6d1b50174bf3dd00d03e9440f9928ef05005e19965648364b54082ee4b5d5e978ab19ce20483121918ef21b3bd1e00662e254c79005c70f6a2bc8e13893a7c925e01835bdf11173c64680f0168fb65623017ab578607735ddc05665780328f126570d6ea6a301639ca6351eafd908e3e0ea502d71580cbcfec287845655dd2bd3a634380ad7f267245d8fb93fab198845d6b9ba9d0ae06959d019468eb7b37bc104972627dfa90b5a742d61458e3c04c3408531fa875b173f71d8073904d3849f7c122c3f938c039d8269ca4278992e15c08700eb10927e9d19764386f033887da8493f46056329c47009c3bdb5b31229c8e4556317a06548c8651a2953bf4e72b8033d0674eb62bf5cdc02e8753c26b97b25d86f7c7229c39b4364655510216b98b8d5009671091417d1b40ddd546a884fd4364505f025047d8089570162619d41701d491364225ac4091417d1c401d652354c2194664501f035047db08957098970cea6800758c8d5009877ac9a08e0250c7520ff5c67b3f27790ecb1cecf9e463c812d7384a5c9d5878aa4178286306db562712fe09ec71bced805d9c2c5317ccd49c90894160acf7293c08ece2893fbb025b2dd89af334c32849778323833907e4acbbd904d3c5e393e60298136d82e9e2f149b300cc4936c17471e2cc6c0073b24d305d3c3e69328039c526982e1e9f3403c09c6a134c1737b82f0030a7d904d3c5e393260298d36d82e9e2f149f300cc1936c174714fa33d00cc9994305b0a980319dcbc2c3c2ddbe513c9cf0320676562ac9dcf76975233048f6cac7d1580373b135638601bb5c2b300c8399420e5267ab2f38df7a5af07cb56b6ad3ecdbb403fd15c4aac7c096a2aeb83c8100ea342d81d58e63c4a84d9ac6aafe51c8fc7684fd018af2636ca7358e1390c9ec13de2467a1a2ca5b55032bcbf010bdd9d7e394bb084aad4872b652ff5d42103578b0a1c0376b907253875e9e95adf0acb13d6295d6c38fe002c713e2550756f8ea0080af66b0d430d9f564586f4242aa413c188cf9e999e221be493b33d75782b485e4779cef980db3acf2d2faeca69d1920d07ef06d02ea044db8de916ab8ef620f2c907cb3cb58afc323ed85f2d7c745dfc8dcb8b57df0439ed5e94a81b252ca208d7a7d7a7429705d02dcc4497476a43be039c2ca0c68124bfc826982ef66c16009885996870a602335cde13164b64c7281e032a518b6dc44a3adc46867520c05a9489a93358d7b1fb9b43f6044552b1bdcbb608d16e262bed81959650a28d7e86aa8bfbc735004554a94d38873889730780b3cc269ca443c36438db81c4bec4269c794ee22c023897da8433df499c87029c7bdb84b3bf93386f033897d98493b4f14986f35d8073b94d38073a89f37f00e70a9b700e7212e7bf00e7ca4ce04c7d8f25174f70799fc571aeb209677f27713e0170aeb60927e91203329c8b00ce7d6cc299ef24ce3b00ce729b70e63989f35880b32213fd9e18cc7042275c9845368a390194ea6b6c4199ef24cafb00cab5b6a0cc7312e56900e53a5b50f67712e528d0bfb99e7aae273f11831f58bb7e6bccf5246bf93403c5cd864c8c5e463fca9b707d1bd929050701ac1b3381159ee232cd73ce0516b06ded3497bd00d67db766de09c5915a28d96c90daa018da2f13536bfa3175df8f6d672dc749c02ef7cfd48aa20cefde493665f60600ef804c342039bc42740e67866c916c9aeced00e7819948d8d8c499701e39d0c945ffff009807d904d3c522e75f0073934d305d9c1afb178079b04d305d9c1afb378079482616c204e537df98afc8af9ccff5aa464b7da1fcb340bcdb55f59701d243b76ec3120acc50c3926c5aec5d00eb664aac7cf1608527807771f073daca7d51bb791f7011ee25f11d00b8c328c13501493ce825e2823254ab244bce8f027c87dbbbae8db0f021abb08f05bd98476ccd99eee192dcc5eafa3060a54766a25204bbddc6566e52319ac5f756707711e04e00e6519430d5e5d6452cf9d61484d64906f438d0e576b46d40092b4364406f06408fb10da88b9ba72c03408fb50da88b1b40ef0f801e671b50c2e93164402781cad2f1944075e712a4325a495830918d567605567a828d505d1c02ee01a09e682354c2028a0c6a0700f5241ba112165264503b01a827db0895708b7d32a8b301d4536c844a38e18b0ceaee00ea161ba11256a9c8a04e06504fb5112ae1d6fb6450a703a8a7d90895703b6932a83702a8a7dbb4ea6d30e586d2647dfadb83b6d41936e11ce224cebe00e79936e124ddee9c0ce74490d8cfb209679e93380f0438cfb60967be9338af0738cfb109677f2771be02709e6b13ce014ee2fc02e03ccf269c039dc4f937c079be4d38073989b31ea8285d908951fad45671e43979c4ce93c0362fb409a68b47ec7c0d605e64134c170f19bd10c0bcd826982e1e327a118079894d305d3c64f46c00f3529b60ba78c8e8b900e66536c1747102e31900e6e536c17471bdd15900e61536c17471bdd1b100e69536c17471bdd1a900e65599581c1375690c6925896c71cc1300ebd5366225dd47890ceb3c80f51a4aac1d3558f5fbc78f179fc0d14dd2696233a9e01e0ee05e6b335cc2ea1419dcb500ee7536c3252cc4c8e02e0470afb7192e61758b0cee2e00ee0d36c3256cff93c13d1dc0bd9112aed9812884bd019ba9d09e0cd0de448996af4f8e1f0b3dc6bb2ef65894f96beacbe8c091ad02e527e1497037db34c634983289938d313502634cb7d88473889338bb009cb7da8493740b6a329c63402e799b4d3849fbf3c97096019cb7db849374476f329c5b00ce3b6cc249ba7d3f19ce8700ce3b6dc2497ab80419ce0f01cebb6cc239d0499c3f039c77db847390933863a0a2740f25cece1a9ca9362d619734e1349d3e54901f01367baf0b900927969141be1c40becf05c8847da86490db03c8f7bb0099b02f950c723300f9011720138e6391419e04203fe80264c2f12c32c81d01e4875c804cd8854d06791580fcb00b9009ebc96490a702c88fb8009970e20619e49300e4475d804c38cd9d0cf22600f9314ac8d10e6c737173af9d01cac76d4149da874b86f27680f2095b50928e2e90a12c06289fb4052569573819caef01caa732314133fa69632eee3575398b637d3a13e5bcdc65923be69faf667cbe4aeadb74133670c926685c066cf7191720133670c9209f08203feb026417379c3f08407ece05c8849d8e64905702c8cfdb526b20dd0988acd63003a07cc11694a4dbd690a17c16a07cd11694a47b0590a1bc04a07cc91694a4bbff90a19c0206cd5fce04ca22a63f012563eb06b650a13c85c551be4289b29940c9ad2e7cac6b868e3ada4c85703340f8ead64cd8501ca93592ad73ad01f2c8d728517665e19ae66aef376fcf07f618d43467b2316ca257bf2cf444958867d380bb91de574b69abf4c3a8407f0c40bfee0a68428b2603fd1fc81cde70053461770b19e8daa04ef0a62ba009bb5cc8407f09b28eb75c014dd8f94d06ba23b0e8b72941b74852af9021252dea4ea3c2f82ab0d7773251c3edb7cdd570f70585d8bb99b044acbd15b744c2ba009925ae0618dfdb9a0d858ced2540d66c6d0ff2c6f7b7eec0201498a199af643bb7cc0416fa0125d696026b7fef7f7c5576819f6796b00d99ca31c97aa84e06203fdc9a3d54e13e011777b21c0d507e4489526e24965ba5fcde76ec720380f93125ccbade0d77cc67f48d11b3f7c87091adceaa0f707d42894b6efc21db3a25dab3a1b15e7c178f8e6d0caae59f66a2048f5a7e934e3e232bc1cf01583fb3112be94c53ba8a11c0fa392556b9ea15af6fce0e25fd0194d5f7865438df00f9ea1736e1ecef24ce4700ce2f6dc2d9cf499c5301ceaf6cc299ef24ce6b01ceaf6dc249ba173019cefd01ce6f328113835975e32fc2e6255915bf19e849fa9f4d38873889b327c0f9ad4d3849b75226c3391ed43bbfb30927e986df6438f70138bfb70967be93382f05387fb009677f27713e0f70fe6813ce014ee2fc0ce0fcc9269c039dc4f907c0f9b34d38073989b316a828fd4289936fd81d781a7cc6077dc779d772ffc96ede875c54012bf5dabdebfd7efa72364d7c117441bb07978f8a49b8bf52c2edceaa0ebf85d729f1fefb15de0fff9b6f6cb0d61739b6b27f7f964f2d0393762753c1ee0f60ff66cbc206d29e27b2419141208ffddd1694a4bd4e6428af0328ffb00525698f1319ca3d00ca3f6d4149da534f86f27580f2afad3b6f09dbd080700b2eb20d0d2e0345d0dff62cc171f17ce845c042ffa144d998c5a7db94f8d5f915999a5e43362d7125b0c37f29e1f1d1053e23099e6152263e77afbade1660fb2f1353bc529b2d97efe431da2f0298aca645305d9c7cf8128019b309a68bc7683f076066d904d3c563b45f00306bd804d3c563b42f05306bda04d3c563b49f06306bd904d3c515f1e70398b56d82e9e231da170098756c82e96243f16300b3ae4d300977b42183f90980598f126617165e68a02e54ddb637596b0506ddea5362ce4e88795b5dd3d11ce06d4089b7918f77bd7050cc26f81b00c4c72fddeb02e90232808694e8f8126b9ea4e12e097210b8c453083e27c348b667c2bd00e376941865ffba4ce0bccfb2acf2f5b6b62fd395a053b81175c22ef45e2df79cacd74c53702f61b70416d998125d27567568822bb1c62faf577a08f9d483d52cd18c7842db249b0f5f03006e420938da526b173be87601289b52a28cbe2c8bb0524f6699cf039ccd6cc249baad2f19ceb50067739b70923639c9703e0470b6b00927e9f6be6438cf06385b52e2945b054098a99e9d44bae3dc662ab42341ed73fb4c54ea5399dd115ed34e68b1646bdad703acad28b1cacd7ef2d9b6b9d9cf8920e9b7b629271d4099dcc972d2b701ce3636e1ecef24cec700ceb636e1ece724ce3d01ce7636e1241d7927c3793dc0d9de269c794ee23c18e0ec4089b31d5337ace2d5a140c8b6d6fbb904549476c8444549425d9a607c8870c898aca2d4128c0f75b405a48bcb0846008bccb605a48b23964d00c84eb680249cf44506f2000072475b401296e064209703909d6d01493841960ce4c50064175b40ba7808eff10064575b40122e262003f91100d9cd1690844b5cc8403e004076a704c9172cae674bfcbef512df09173553cc812bf2d521c3d7870a1f5751e2cba1c4176db5a48bab3086004bec9189f676d4a109170726fa00a83bd90895b0ed4d06b52780dad346a884ad1e32a8d9006a2f1ba112b680c8a0b604507bdb0895b0c7880c6a0b00b58f8d505d3c2ea73980dad746a884ad2432a839006aae8d50095b4c6450bb03a8fd6c844a58f92783da0540cdb311aa8b276d740650f329a1ca6585b9fe6f790d56128df43e2c120af1a7c13c7a3298648b0f5e617198fd33d1d2c747d75d1f29ba06a01c408952ee8bd44f49f2199821771215bc1b01bc8194f0f819ace1b596b33dc9c5de132e70120ba61f2e77d0feb603080751226ccbc29dc77ceef07a51ac84937486da4464567907286a06535b2507baca73c457b7c1359693fd02670d7373d96a36b0ca219408db24a902553dee2197b2ef930ce804304566a86d4009fb3dc9808e064077b60d2861ae4906341f001d661b50c29a2519d07e00e870db8012f6ca93011d0480ee621b50c21e7932a00300d05d6d034ad873440674670074846d40097b8dc8800e014047da06d4c5e34976014047d90694b0079e0ce87000747426bae2b893e4db54b8b859da781647398612259ffe55ca82bdba8a432df5d14ceee0e55e4f520ec03796125f030637f371bba3a33980362e13c312a9cd99ebefe4d69123415e38de26982ee6866300cc0936c17471f3fc610066814d305ddc3c7f570073379b60bab837d7600073a24d305d9cb63d14c09c64134c1737cfef0f604eb609a68b9be70f0430a7d804d3c585fbb900e6549b60bab8797e1e80398d12667577e1223d5c916cbedb916012c2741bb1929ea44a867500c03a83126b47a69b46086778ccadb28090efb3edf2b4c2812c0e7726255cb3bd0e09db4c9ba9d03e0aec765626ec564ef35a0d2c36debbb96dcde1fc00c09d4d0937ea11f6839d1c166e086a04736cc239c4499cd900e75c9b70926ed44786b31748ecf36cc249bab31c19ce128073779b7092ee7b4886f30480730f9b7092f64191e1bc13e09c6f134ed22d78c970be0770ee6913ce814ee2fc16e05c6013ce414ee2fc0fe0dc2b133853df6f9bb0c949b667ec172c8e73a14d3849473dc9703e03702eb209673f2771ee037016da8493f4407b329cf7039c8b6dc299e724ce1300ce224a9cc9b6520b27741737f51b0e4af5625b50e63b89f25e80b2c41694794ea23c0ca02cb50525e9dc3a32941d40ff6619254ab98302f7b8d4072965af144edc1b7d8f81826609253c394c8c97db53bd8ff6f6fe2af2ee33b48357132aaca500eb524aac4d05d63c65a82d43675f911db8fc1600b8772600f6dbc600be0a002ea3042837854ead06e95ef1521f94d4cb6d01e9e228793d0072852d205d3c1363070072a52d205d3c13a32d00b9ca16902e9e89d10d805c6d0b4817cfc4d81180dcc716902e9e89d11b802cb705a48badeb9d00c80a5b4012aea72403d90f805c630b48174ffbcb0520d76ecdae33288eb40244d6fb530ba05c9789519bf06cf64099b1fec401ee2c98194c3e7f9d6ce3c7e52c8e733d254eb92ea888a5b217c70027974cff06606eb009a68b4ba67f073037da04d3c525d3bf0098fbda04d3c525d3bf0298fbd904d3c5f2fc2700737f9b60bab864fa6700f3009b60bab864fa0700f3409b60bab864fa4700f3209b60bab869d41f00e6269b60bab869d49f00e6c19430f9d6f71c235c10cd8f6128f5c4c067ee0ddc3e08101e428930f98c0c28d0f5d3ff6e05580fcd44af516ac9dcc5e26767807233254abed1a37e9f4cf792753700edb04c1433a9f55af673b2cc3e0af45b1e6e134c17cbeca301cc236c82e962afe56600f3489b60bad86b79048079944d305decb5dc08601e6d134c177b2df703308fb109a68bbd96eb00cc636d82e962afe50600f3389b60bad86bb914c03cde26982e361b2b00cc1332d1b111bd5bc3c523b8af01584fb4112b69459e0ceb5c80f5244aac667b1112d6443753a13d18a03d99126df4edf25c3cf4ab3158ff788a4d38873889b33bc0b9c5269ca42d25329c6341623fd5269c794ee2dc1be03ccd269cf94ee23c0fe03cdd269ca4e75f90e17c18e03cc3269ca473e3c8707e02709e6913ce814ee2fc05e03ccb269c839cc499052a4a6753e20c46d4f9697f45feb97fa3fddf451e0f3ecf830b2df6542bf27e440dce39941ca144790e3dca5417ebbbb8387a2848e4e7da8232df4994b70294e7d98232cf49940b00caf36d41497a921519caef00ca0b28513663f1356b4bfc92bad82fb333b6370c5907dc6250dc5c98892ee3e89b3e114e5720dbf4e96a80f5225b1239e9042fb2443e0524f28b6d4199ef24ca0701ca4b6c4199e724ca0b00ca4b6d41497a543719caf1a0f17819254ab91b024755c2d6b160e0acc02fcd4bd8864c95e56420378242e7f24c80ecb78d825c0f405e4109b24592c42d434abacbdb6954189f0679e49599b0c721dba83d1e0aecf1aa4c1436a92d58717152f60880f26a4a94dc6b6e87a5be13de1fe95e5f641b00eb9a4cf492a77e0a0a617e48b693ff6b00e7b536e1243d7a9b0ce7c300e77536e1249de04a86730ac079bd4d38f39dc4792ec079834d38f39cc4b90ee0bc91126757163eb498d71f8323b565b5678e4767b4178862bf9224afa33c97bc6b789de78e2f532da7adb4b7a702fd02a8b4dfe40a68c239f064a0df02a06fa6046d36ab9870192bd9a0c66b00ed2d94687976c7715588e626473a46e073afbadf00e4b1b7dad2a7495a99226bb1f70716789b2d28492b526428af05286fb7052569258a0ce51c80f20e5b5092363ec9503e0750deb9355186bbe45c5cdabf17407957267adb7343ddc4f275863a89c9301681d2fbee4cd427d778d5705e61c76a93e3c507705e07699b682615dac100ed3d9468e5dadfd4fadf4917a992d9e9a900e6bd36c17431ef3c0dc0bccf26982e6e8bb209c0bcdf26982e6e8bb205c07cc026982e6e8bb206c07cd026982e6e8b722080f9904d305ddc16650980f9b04d305ddc16656f00f3119b60bab831e4e900e6a336c1747163c83300ccc728617666e151a10a31c6c327d06ceb23423f818e90c75d80ece2f8660300f9094ac81d15c8f044e9789f139e51b8581bf806c07d92126e36abda2b1ad8ed4c36864df4ac956f105d229ec15de0477a1a2ca5cd20c8368e6e0b66ca3f4589b71dd39dd136c317b6caef39dd764e6a3b12146d4f53426d0ca0f26ee6325691a94e67b2add18a01bc6728e155ff8402c29e2832ac1f00accfd2d75de3fb29c09c72aedfbfcf052f674b8517c50e4e6be808603e4709b3650298e3bc0fca7dd1bb79efb948f740ee08403e4f5ffc8cad1ca21bcd5609160bd9323f1be0e57b91f7772092c3e5564a689d6403c98d01d41728a13605c54fb8c29f912288ac427f1d00f862268aa0a80510692f2959117426a8cabf642356d23d69c8b04e03585fa6c41a7d0d0861271fd9b4f06741e27fc5269ca47b2d90e1ac00385fb50927e97e0b64381f00385fb30927698f3e19ce3301ced72971ca8962e18d02b695896287018c6f64a2c3234f29df33006f0b15bc9b00bc3729e199adda20ecdddc4c85763b50357a8bbac619781a7cc62726c213050b58299bcad6fb38cbbd567ce03640eb5eabbd05b0d8b7335108614550d52df6098738c870d6077df0efd884738893385b039cefda849374dd11dd8e0d200f7dcf269ca4b39bc8702e0638dfb70927e9522e329c87009c1fd88493740d1219ce5b00ce0f6dc249ba3d0b19ce3701ce8f6cc239d0499c5f019c1fdb8473909338ff01383fb1b33f9eb04f89ac3f7e3ec0faa94d5d74a4c7949075d17dc8e2383fb30927e9213a64389f04383fb70927e9016464384b00ce2f6cc2497a621619cebb01ce2f6dc249ba628e0ce77100e7579438e576a9d88205889270b102d9949a8f00c8af6d01e9e2cedc570190dfd802927068830c643e00f93f5b40bab8ed4a2f00f25b5b40ba78744e1900f99d2d2009976693819c06407e6f0b48c2ea0f19c88b00c81f6c0149b878800ce4e100e48fb68024dc5c850ce42500e44fb68024dcf2870ce4c500e4cf99e8bb8c7ec81861d14376c8d80100eb2f9458e50af7d46776b8d7bfde0a7404ff6a134cc21638ddac0e00f3379b60ba38f2c300ccdf6d8249d8122783190330ffb0092661014406b30e80f9a74d30095be46430eb02987fd90493b00d4406b32180f9b74d30095be664301b0198ffd80493b02d4406b32980f9af4d30095be86430b70730ffa384196d176e17373fcd032859ad0cac0ae287874aa9195a524576d2e5312c0e2f46096f3bef662de3331974fb73b837fdaa1d009745094e76b185f77ee70a6f1b4784160290352841b665e16dcdf822a9f5a22b2d9c27c2ee35c27637d9c65037811cb1262552dd52bf6d7b13be1160d54fad4c24fbc1db68b2bf0224fbda9420e1ee317027c30c0124db526f100058871260b4a3955ddc577b38405997126507a61e40927a6e4908962cb79c0ec0d6b3152c61ff2519d8a1006c7d5bc1bab893f11000b681ad605dac38f503601bda0a96b05b8e0cec9d00ec76b68225ec3c26037b0b00dbc856b0841d7664607707601b53826dc3a20e0bbbb977c264d0286d4209542e670976d59ec4e47eb113fc3d68467a774542a50cecab4d86f375609f4ded6959b97894c95880b21975f7f2123f1917fb09ba1c6cc25be1e00cb9da005cf34c24e9d467c8b93847ae05c8215bd884738893387b039c2d6dc249ba949f0c6701e8afdfde269ca4bb6d92e12c07385bd98493742f58329c57039cad6dc249baf13319ce9701ce3636e11ce024cecf01ceb636e11ce824cebf00ce7636e11ce424ce3aa0a2d49e1227bfe18ef9b41af730d563714c1d2831259b5aa88e65bad8e6ee056c6e079b60ba787c681f00b3a34d3009872ac860e60098d936c1249c414c06732700b3934d305d9c43dc15c0dcd126988403676430bb01989d6d824938d3830ce68e0066179b60ba38d1ab3380d9d526982e1e995c03c0ec66134cc2794764309b0098dd296156ff2c40421b255ba5b12fe8cec8b1112be9840332ac7d7dac756a29c2c755113edaefc3e1bd3845befec138771f369ef1a1d912161c62d3874d62c13aa0451e90f9de4fb4b858e0fde89ec7fc255b63d906b6da7fcae515fbb257786fb966152cb78be7a407378d46c234726275bddf7c96fd628f7b993fcda1cc7b5a3ff494eb54e84bcc8935f3de14fae15cc5d6fb382bfcb72bfde910f1037972620d422ee1d13d394687fbe4c41a8524573db43727d65123bfaabb28be545dc7a58670a4f7dd46169cef94e31b129754eac74691ffaca186759988eb9c24abc672627cfc7d7d95e73359fc90d88a4aade393532684260a54f8a61cf3170a70dbe0b1369995f83158ecc771a197a20a3d0db9fbbe5d3d67b181deaf6092569fcae9597dc479562bc49d7c9e5c26b7ddc4d276e2061ad3e75dcbd396ea928528c828f8f7a53ecf125f6a41d290260f1f9e821b268895bedd785c6ccbe1ef09e33dab6f771ede7e69b0bde41af5e23e671195963c595708d5929e2f6e5ffcf25c7195af5cb9afa6897df352252c6fa9ef6fdf1c3b6d3b7d61ef1db6ed1ed5b5ede81af5a1b4ed405a309357913d3e85d0e9e3410d73dcd56adf1e0a2b6d2148e94bbcbf8b5320d1c19f83884b1be9dd95f9615dea4b5dc1e43f5e66063fadfc327fb6f76db1a8114df5dc17fbf2fef3fed5fa7f3fccf0225bcd0400 serializedProgramBytesString: - serializedSignature: 57f3deacd5cdfa00d6dd207ff643f29a7a7daf2f5ecd0bfe7c2d29dda4bcd74bf27661c88c8a04625cf39e3e176ed2f802aeff59d83e88e3831be0fc031de400 + serializedSignature: f1b43d1e9128e57df47fb927623c335a54f570454230e576f7e29f4adea29636ddb835bcbcd131da15053e4895d6c9b5cb049d203a06cccdd98de7e534b25500 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset b/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset index e90d24e..0ae16d5 100644 --- a/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset +++ b/Assets/SerializedUdonPrograms/5896e31cb82659c4182c31c13343f974.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d695b1cc711807b11cb219040080974a37b75b10b1202dde212424212e290131f415802097b41322045ceedc4b91ce74e1c27714ee7706e27cef90ff213f2215ff32d3f21cf9374d5f4686b67bae760a8f50c313c6cefccf45457bd7d551f33946585fc491d961f37c488e815ad625cdc16f7c49cfcd62bc359f96b1dd9e787c5bc0cefc8cf4979edb068f1b9137ef6a79ae5e7a03c5a108bf2ce07e2960c67f0faa89892df07e5bd53f208ce4ecbbf29192b552e6f1a177de29ab82a9a521b7c44dcc09b16d4b914d895aa929f3de24579750a958244b278a9497e8cca2b0b786d562a6dc77b4a3c8366cdca6bb7e43df3222f653e8b12ab6e5608fc22ac608d0a6b557840fec918a29f1c83155df22f2dffeeabf36b55b84e85f5f2afda8a537e5b9dab23b2abd5f732f5bd4a7da73aac52e14112dfd6ab81c401fd2e38aeaf57e70702a453a9c2439a741a491c5d3a1b42a453eb080f93f436869053aec2231a7d9b481c9dbecd8e74ecf39b549855d72f9263085b495aad2aac0a988f4ebb73e4becd067db6a8b0dda14fbb0adb888c36155607d427adc2a31a7edb481c1dbfed067d77a8b0c3a16f870a8f91b48ea970f512f91d27f7b518f4d9a9c22e873e5d2aec24323a5558b3447d4e90fb7609ff725cafc2dd2a3ca5ee1924c7109e2472f7a8f0343977528567d4fd97d4f15e159e2571cf92b8109e53f75c26c7b2ce54ec71c8b6ef3bafe20f916308f7a9b0dbc1b95b85fb55d8a3ae5f21c732bdf4db8ef8bd2ade55726cdb4de55c73c8f98f43af3e627b9f28b4bf5ef96bdb9a21c790d6b0b0daf17f386cf29357742e9dc2deefa2ec8f2665af91c548d09b04eda6ed3bfd3b68105d011ff0b31f935d945de17d2940d34b8e631fbc285b83766d2fb929554bf4eec5cf49196306855e7727f1375712a05c5efe4e912e7e419e1f400f013af91979a55516ae19bceba66cd29e92bfc5526ec864f3d24d981263f2f33ecabb29d576c7f43309dc01e73d2352a6e5adccca3336d0fbf2388f1a8ee2e743d4740ab51f94e716d1779a93de538f0c1f616a6edbe7e5775d9a630a995e47bdd3623a6fb9467636f5496b40fb2cfa10efe5c8bb9123e89a5d57d5b03c8b5ecb2bae9c788fa1d5c880c331a864b421b254d1b9769145bf65c44530bc8d6e0bf5e5dbe27d5c3a2c5eb6e8c940766f410b0a39fcafb7de7cbd73dfdf1bd3c5a61d1559e866525b7d4cf3020bf232a98d2e09de26a4d3e53950d4893fa5c38fc384d112e2b7e2cd60bcf01950813d537106a4c0ad1e935f1ec9bfbc8cdc2d055a6a2de08d734ab5bc6c09e7b125bd2be30c4b0cae3ccb41029588dddda9faa96e025fa6035f556af0fe2d8d17f8aac77615c0c38f9e60b581a09f0e2682ab7404d14b7b9a95a0db25b3bff5c87bef4a120fb19f7d20efd7b970de4c61a874c4c154cfb30679b6681dcb701a990897eb088382a99b25213c2abd9bcbf2daa48c3f853d289c1f96122765da20af1b5328d8547c8737e9dac0a4d720e93d847454cd4cc4d31ae23920be56a76cb54359d0d320b842979550825233ac59392ecf59e3877ebc3a834e6741e63d3c86d40095576cc8b22b380ff800f5f0cedcbac0995b8f990b334c7cba9ab2bb52972b38d93056c24e00aedd432993326ef86e0066420f39bb013dec0684ddec32ce5f0513c22a5d8d0184ebb55a39ab4c83b9ca549b24374695bcda24794354c93526c91ba34aaed54906444d415aa61ab3e0353ac190abcd1aefe2bff2c725bcda2c7cad49f8268d70701bc208af3321d91c1149bd4e30c4df124470bd59f03a5d7b8319f052493a74bf99af015c989a12d764857f4e585316eed6d79efa1891e1346a01e7410bff1933ef966ceb633e05be592c43fd22f8fc1dbf1530775f860dea76dfde6b0c873730e9338d56ce2ea1f7d237e63b30ed78913175130dba2a05dd6f8bd00c1ea19e4cc8df9cfc5b508e33a40fe7604ed45a4075d5bc4a73cd5b6f4a7fa72efd0692fe8474256fcbdf71741ca1de15f409a341a349835d3a0dea8b082cca0b8b91ecdf604a7db72ef5da22fba1845a6537accd1b4da9eed1a5ba1153b54add3cb66977c513f26f06efcdab09d25e79064aeef3a134693269b2d7affcdd27838aa5f36f36a5bfcf4cc2e64f87356e1e53b26c86d164934993fd3a4d761469125c23880579b8184ab7cd26dd32e65c1a9225f3169e8cce668b29fd03baf43717b1f1d3636944b6ea3402fff5601057c46340bacd64ea21af0ad1b66c1562bb29fdc3baf4d716a1be88a3783aa31826e51da6948fe8526ed25600b7064bcbde16932ead3a5dea1c053e1a879da6b4b3bab49b0d857db948ec326993d369538dda58276664e5b2bac730e9edd6a497c511052c24956ae81f640547ef2ae3b61407161cd2685d45d8cc92c16d60c1d337b9727b74390587b0cbc5b910737664f2fa6bef4c6f76654dda9c357b75598363b2d22f492d6d621ef6dd343947fbc6cce9105e2b4a61a7e5f7992ad2715d455aa3aaf53c7a5d79f9cdde5d3013b2efdcafcb351cf0967241858e6cc2e75ba7ae53d5e65997d02fa6f8a56fcab58c2ed7a0cc9fd01425583474654d87396b0ee884838f0f7b8f22cd4a1dd44986c6f9948e648829984326954f4755f9b049e53311553ea2130caedad920823d5cb556138b735159647592a1ce9e0fa272975970ce04b93b22e436138b9ea82cda4d2c7a23b2386a2a177d11cbc531138bfea82c3a4c2c2e446471dc542e0622968b4e138b8b51597499580c466471c2c4e2524416273582b33801f7bc88c75aa3fd9cc0f2ad375ed631d3f6dcb0af369382968f575f534f7f4a97ed903b578264fb9039db4feb04c321ecf075fae5f64f18bffc8c2e01f051608bb0d6dd0de1a39c35091f5e06e1e74cadc3f5a8adc37953251e895889bb4dcdce68c466a7c7c4622c2a8b5e53011c5fa602d8a74ba006c5465b97ebd70986b1ce13423366ea36b61dd4fb6fc571d53dd98e4c48a9b3386d36a37673c3157f09108bb676c58bf461c666174cf6bd4f67df94b05794ec351ebac2638d4aa15798c6dde9d02b0c3e8ed92ffb0aabcd1c412b601cf91063b72a7b6062a8f841b81b388138233f9f45eb9c76d32d7ec557bc68dd9029841dc30e9838bd5fc7699c99d39c8cdb2b93028b406ee11e6f42d1395c34717852c7e149460e0391cb8bb9c48421326822f2948ec8a8b18570fb16d44ef7d505e4378c16ebf3de9ec233b7296ea9dd52da3c4ee2876170c9c4e0691d83bda2d8d72ca469597c072d86a9e429d47551dc75d95698010ba3e765939ecf985a737d9ab4051f12d6e4f6186ee79cf3d0d47c7eb95af321937d1fd0d9d7eeb08fd600679e0ca83c096ac3526bd3159305133a0b2e785850dccb42f97e41de642d0b403df0d238785fb2f4bcba6ab2f46690bcb236ca5beda16deb983c5778d6c0db3e5d3ec25d612cb866b26032786d8234694ef5fbe412b5cf747eb97268d864dfb33afbce056a2dac1d23609bf5c057f4d6c2af25ac94bfa914f8c2fdc27ab4e24569d93dec01a017c9e20698dce39eda7faf10a43e2b2100d5b1c77dadff0ea05bc2fc4ce4b470ce3f2cf5f1383f2b745e472bf13ba875c177adb91f05ac5416d9b22469dce8b3d22c85372b5454ab5c2dcbe276a2434b2c4dfe5ac008a46295be0c857f04c8127055ed7d0bb86dc43755bf959e2328c0f6ce96e1e160286a56c332af9c912159cd2ad36539c88d694e646177662501de58aa00ef0e273c6b33a1ff96a924407b8340bbcb09ad02a1593b1fc1f749021cf8b1e1cc70c2a94238c5db329300e8df04d0739c80fc374a2501d7abab0ab89ee7c465edae336f734e02ac9749d9ca73c2d26f3d4b02a2ade50544b3fce5c9bc573209b0fe89be5565da21dc3917b15c2ff8f0236c1e81405bd72f1ee1fcdebc72251c2312dc861f37cde1f5768f47141957879ff16d9532da7e3013da59cd04f6d03201c70e19df1a9009d045650c4d4d61a8af1fa2e760a87f4ffc7f8fc273300a87570656f42b0856bbf70267bbb701d32c9422779e42a95cc4123ce74c3dca3b49aa8bdac38620a62da54d5c4dfad8796e9050716ea992e89caba5f380393e90692e907b08c8054e908de80d99db986497c71a82719113a3fd3c96359b3a27f29eb3ee8c25b28b0b6596a07c500a94a6aa5dbc78cb88b2920b650341f990136593a3bbd13b23c9aee25504e607b9615acbd2a64a3e5eb43cc35832abb960ae25301fc5a7927724b0923711942f96a25c0643093bac9307731f81f9a138c13c9640983b09cc0fc7096612abf92e02f3237182d99e40983b08cc8fc609e6d104c26c21303f1627984974d9b711981f8f13ccb604c2dc4e607e8213668b708fca752f7b34bd1c92d5895fc385f708c1fb12275eef47c39337e92608b84f7282db6e2c97f6bcb6f9f5b0139c3d7b0d17da1c41fb294eb47e03cbe48fd1d710942f97ba94067d7e80156d3d17da3e82f6d39c68e169ba5b2e68b0d9fe4e02b155106c9fe1c45627e8a269a15c165e3095bc96b18ec0fb6c295ac6604b148c9d0cdb12450741f9b9f8f6df8c2e3b5b293d4cd07efeddecbf8bc73f499ce46824285fe144b93b42ff5d78ee8bb5271fe2827c8a40fec2bb595e93bff0bb9fa07c951365a30f4adb52568ced5c1877138c5f8c4f3fcfd819b195c87682f24bf1e98c3a13d8196d2228bfcc89d2deb0652a9549dfb0d54b407e85136434df9371bd92cdf73c41d07e95132d0c9061136a5ebb9b987974ce866f15c1f7354e7c3b3525d37acdafb5b7e892b0fe11e64a9b902b2380bf1e9fee28895b13361294dfe044091b9561a453782c80b97ab3ed7fab24c8bec9896c9f2a7d796c2127640477f712bc2362ace86c2de97982fa354ed475aa23b2376117af4cb29653b655c93481f72d6e78f67f2228f12431db0c7b3d81f73a27bc68de25e33619b64a7d9ca0fd767c7aef1309ecbdb71094df294515776f3c98535192072f45e07d97135eb091b8e58e33ce0e7570813c4b40be1117908cee0e1bc83304e4f7384182cf41dd9d5e41fffb77f2ba945a02eefba5e852824df532f6ce6c53bd5d04e50f38516e532817f111a905e35299fb9f35b256eeed5c60d711b03fe404bb55140f1badc7f7ad777b0e8abe15360d7c9a60fd5129aa7ed07dc2c97388d613943f2e650985cdab85173aaeb4e5dc6e82f54dee125a78b27c253e7a5a4d50fe243e953d890ff83513943fe5440985e183aeb2b81226d8ca09c29f71226c11519faa60ec8ed8f01e25787fce8937d8ab4d923b3ecf10906fc5056412c7e77b09c85f7082cc896207e981710ad83c6e5a795b0c4f12fcbfe4c46f3f12681ae517bfd99c15269b2b7580c0fc559c6032b6b06c300f1198bf8e134cc6edda6c305b09ccdfc40926e3741e1bcc3602f3b77182c9b859860de63102f3777182c9f81e0f36989d04e6db7182c9389a6783798ec0fc7d9c60326ed16683d94360fe811366b4bd1f49dcd07590a07d8713ed3a51787095be906f028fd9f725b14d8a6c2500ffc80930dc0c68125fd7b381a0fc537c50762510e566b162decc9e83dcfa331487d5aa3864023da690093cd19d09b0db3493f27a6141c6b89b3a83191aee0da499d00b479990afd5ce847ae971c6677b8af5b2f575aa6cc17f37bb82774f0aeb75ec93a2f0e2f52ce048c18ec330ff15cb5b26942c6f697f81e293d2b726f965ab13cbf1a6779da5fef699eb57ad47ae6461c96945dbff57c87795ed584c9bf07f028ccb9cb7ff53c03519f9362a053fe9ff016d0261bab2b00000 serializedProgramBytesString: - serializedSignature: 8cc1c6642d9ed800b375dde6231a38448bbeb03f0fde5073bc38b21bfb6d8453fe66f794df0ab3034544f21eaebcdbb8dbe859e8833f3e83b081487e0e21b60f + serializedSignature: ba4245ad51ed0c420bef63454db31d76050be9a5d1375d0f4ffb374b7112afa87402c6bda1b56f3ae0f098f7cf5ac144122108ddb666fb29aac49b17a1e7f20a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/59dc74ea4b302bd4f8376146f54bb8dc.asset b/Assets/SerializedUdonPrograms/59dc74ea4b302bd4f8376146f54bb8dc.asset index adf21bb..839f7f8 100644 --- a/Assets/SerializedUdonPrograms/59dc74ea4b302bd4f8376146f54bb8dc.asset +++ b/Assets/SerializedUdonPrograms/59dc74ea4b302bd4f8376146f54bb8dc.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d07781dc77180f701040190602f602f628344120f24255114459104404110c1864251a4280044232810805028525db2aa93388e9d1e279113a737a7cbe9c5e972ba539d5871ecc489a354a5177b676e0f6fdeddcebd3bdc1be08e31f001fb6eef6e76e6dfd97a7bfb4ab24aff6476e97f6755ab6a50b5aa43f5aa1135ac3f35e8f0aafe758edcf8d36a4c8703fa7fb73eb74b6d2a7027fcecc8acd2ff9bf5d1b89ad0774eaa1e1d0ee2f936d5a73f37eb7bfbf411c4f6ebbf3e7d55668ebea94335aa53eaa4aaceac2820e22cde346ee2326057a642ffaf5737f4d93e540a12c9e2a96afdaf4d9f19c77357b5d2ee7517d44534ebaa3ed7a3ef1953435ae6259458b16a89c20fca09169a70910977ebbfb9faef0a39062b8e98e3c5faaf4ca9d23a735ca2ff2a41aef94c652e31e152135618d98f9ae3658e2cf586395e6ece0f8590bdc284f3cd35f0b9cae8fa6923f71d13bfd239ce2c0e21b7dc84b5446eb509b324ae96c441586774bf4a8eb52e99a702d29c6fc25526dc63640c93632da3a4cb1caf2676ba7a7819eff530de6bc27d267ec463a71b3fead1690d3986f38f99e3b5265c67c2f526dc60ae1b7358977cc8c46fb4e85c1151a7a0fc72652d30e1ede6de7172ac19962eb75cefeab349e5fb61507a6e5edd41ee2f35e17e93f604b9c68d87f04e737e921c836e1f35c76526bc8b917357b09c8a518f1cf7bebbcdf5d7c831840795dfc7ef217107491c84078c9cc7c9b14e77ce8f7838b8e91ef2a47bc884f75ad23d4ce2ee257101e956dccfd87bc493ee11131e35f1d7197deb3df7d59bb0c1735f83091b4dfc0d229fc63fc1e877cc93ce3113de5740bf26cf7d4d26bcdf739fcba5d9c43f49e4d378b76edacce879dc93de7113b678d26b31e11693875ace22b77eb8c5840f90fc7dc0842795df0f4e91b893240ec2132adf0fe058fb41f91c73ecde775ae5979fd32abfecba7286f3e54cf9932be78cb297c333266c35e79f26c7349d3673fe19720cfabe6e8eb77ad2db96e3b7e04dcfb97646977613767874a924f1109e35e79f25c7103ea8f2eb60376fb67bce3fe739bfc3c43fefd1670d3986f32f38f694367ad8d0fad3cdbf69d69f95eefd7355acfa73c1873d7266a8feac74fb29733ce90ad79f0b5e65ec3de249f788b2d79f5e7da5ea4faf7e61eb4faf7e52f5670da3674aeacf2ab76cce53b1eacf297f72e508d59f556f99e35b3de9d9ea4ff75cd4fa731e894f40fd59f1a2890fd3373da7f2db14081ff2d87f8ec443785ee5d789e71dd68b2a3c72dcfb2e7878b8e72f32e95c34e1c32a7f7cb28dc443f80823f79ce7fcbb98fb2f78cebbf7ad21c784eb82b702b86e31e16d26ec32f7be488e21ec24bc779ab09bc4759af092878d9b5f3de4da1e722d84bd9e7ce975f265f1273cb2ddfbfa547e9dd367c25d26ec37e75f22c7b4fe1830e75f26c790de65cff597cd75af9063d76e2ae7558f1c77ace0ea35486c1f54b93acf8db3e58b6beb1a724cf274d17b3d36159297175796c1599bfbb586dd7a049ac58ba0a6093bbde4de5978620944cf857ff0b303939dd08de1a8166099dde9c0b9a3093d3ade6b9ddd599da9227a37e0ff6e7dc5200a7dcd9fc4477c49807243fab78f4c4d8debf8269cd982c9a9417da656375883785797daa30bdc058f94b33ad921edb07dba729dd44981bc2eadb6ffca4226c13496f79e562dd39965bbaa635ca0a3fa7808356cc3ffd750d33ed4be59c74de09cdfb076c37a1d5ec7d4fcb68fe9cfb634db0d32bb8ef6c9362ede99d273b3a9515b03da6771acf7c51c998d1c01f4735f33c5704e167b8deff6e5c417193a950c4c12341b197b1059262f6eafcae23c42ab8f60741bfd16dafddbe17da7ba3dd0163b19c8eeb568412e873f78e0ed0f7ceec62707cbf24ddba7b2d8c55f57c0b420b020af26b3d22721d884b2b23975a0a8177fc6861fa751db6610bf73dd205e173d03e662cb949f011998763e8975e325a3dc843e39ac9b515f9ed4818072c4ea6f340ba9c6812db181ad9869b0856b9220b0155376e5c0c28f9d602543b0900e1cc1521b41ec850d8912ecd0714e97e7189e1dc476125acc6e947e4aeb7cc5b4a7ee8332ee1e97e4097cf03689da04339f3765758e791623e18190b46eeec31afc292fb367741566f44ca8c3b9c61c8b6bd4816b2cb0d0ab037a0b3d86557a0c039b98c4cab8c41671892d9e7e6273b9c49670892d9d7e62e5b61286cfef7a454b58bbce64e7193af421faf499091d03775d36f11dda85a0dec87718eeeae012050f89777bc8d91d7b393a364cc6155b43ce912b6c3950353bbd9fe9b511f018bd3a741bb132b0f312b585a8b4d1c32aa07d56e871cb26820956db6a7c9c915b15c0894b0beea90058084c39cfef61de188a3453a1afc65c994e6a5cceccb3e44c1de4cc1a5b3506c6c2b2808a4a959b73870e54a9392e33751c54585064708ed657d3ade66bbaf9367da09cade3dcd72b7c252fbccae6868b66da0de1dc084a816e6e74378475183bbd24ecfeb281f197c22a70feb280cb9f8d45c89f8536e1e0469b94bf7ffb79fde3135ec90b5f64119ec57542cf8b667ed8c9445b57cc4d7704bb5ea0913b9bd4aac37ed402e2418bc29390c16eb5d956bb6167e6980a3f252a6f054cf196a0776f41ef86e55951bab7d1bbb6f6b2b515534f161baed42ee60ad6364bc13a622bb501056b894d385409db2d55425fc42a6129277c8745f8674ba3095fc661a9b160f9d2885896db844346dc6a6b5901e26d539ebd137d6b93d5b7dc4ff5fab6cb5ac0359c2b9ed47e62f38f327febbb95d77905477b9785f6bc8859b992a3bddb42fb9d88b4ab2dc2b3e83c33398be3ad67a235ec5093851bff64957d06a750fa5cfdb08acbf7ba22b4eaab6dc2a1358639656f4726e393bc8197bc86537baf45ed4c44b5d772e5771f577e6101ea3c28ba91cadc3a5b3ad07f867501bed9d20accf3516cb1daf0fa51bf55e57c6aeb6de564d94c979336334f3ba4829f49d8cb092ce2dae801f3b137df3c642f2bfb99b2524807aeac6cb011c4ca7e589460a15e06f46426d10af87ccdf426da31eddcac789c1e222caa5b6fa90cb042b0b23f80ecf75adbb1e26bcfe5d846ae02badb5201f94b534005b4896bd20e5a9ab4e5b6de494093b699137e8f4578d7dc68c26fb1793136ff0fcfb01747ebcf047be8215b0beaa5b293a7b2c54605fb2d83a25482c623f9a383e23ec3b8d7c6cb5a920f6349869e9a9cae5cf9ddca1584239682f07a79b482b0cd261c66398e86f1a58099aced5cbb5e6f6bd7a1ffd0a97febf41fb098c07bc6300e16f7386fb04569e97770e937d8d25f40d2775e516b215a4449b786cbad465b6ecd8f965bb772c28f5984bf55154df86db6d28f038b33a2a53ffa5a0d7b698645cb951e063bd9b6b9094bf40a9f65814b1a18723b6dd90287b0bedabbe4e2cac73f35b2ef336fb7f8b2a68ccf9a5d9c333707393340e9d7919dca5d093708cb0a2238f36e5bbad07580c5bdb1ba0eb53667c37158ffac343571a6c882ddf278e846a6055df2b6804626de449e3d27b2b63c869c3811a60568e1b3b88e739e93719d670f27f9545cc97b6d9261480d6f06c49d09d867130ea5ef4c18d201c5f4768e476b5c1e77703cda8ac0e34e4eedf6b86aefe7d4ee2882da7771c2cf1641f8018ec9837199dc6dab717172eacaacd4b8c57838115cf39e0b53acb6f0c40e7235e343316bc67b38c1e7630a3e64130c797c21268a7b398d1f8ea9f1614ef0c598828f70281e8989e2a8ad1ce154ecec0c92db7170048be5fbd1efaf16b91475da7859fb2f5daad02039beae5c2fa69ecbeeee98d9dd60130cd97d298ce02e5e70a3cd8f70d67d6056fce8aca98381f9be22fb10bcb754ea6195c599ff9d01de124fa34dd0f4e6fe318fb17bd167e5b4e0fcf518e7af7d31fdf53ece5ffb63fa6b13a7f1404c8defe734be1c53e3665b09c32740b3d3e339a3d3e856ce94d2b0725e712a6e391bb495337c6213b44ca4187a794a5b5091bba20aad5b2986425cc17bc0e66d300df468186f0b983c3fce958fa198e5a3852b1f5763968f1336c130d6802779b1c61a276d92a157371246e5805edd294ef0684cc1a76d82615007db41c51dd49de1848f1541782b277cbc08c2db38179988eb22ed9cda934550bb83137ead08c2cf72c21f2f82f0076dc261eae77a18070f98233ac7697da3085a3fc4097fa208c2cf733ef8645c1fbcc0a9fd5411d47e9813fe7411845fe4843f5304e18f70c29f2d82f04e8bf02c2e5180063809cf988bffaedc73b6b26bed1bc15aec9a0c4cc9cbeacbf58eba6c590fb9f34298eae7793edbbb6d82e110b62ff13e22737fa23c22bbc439ed8b4570da1e4ef84b4510decbd56f2fc7addffa6c92a1affb4a98dc0ce8ebf6db04c372d357c308cef282073816afc565719973c07717c901076d0940b67f4918268779c1576c82a1a58725d9be87bf8dca5d6dd6a61af5a0a45e9f1ad7274e2a58cff038d6058f9a3565b5f898b8599f3fa5cf38bb6c408cbd26b14dd877e27a895c9d97ff664d94fec9a39c955f66b31270d9b56c55cedbf3235803837e4ecc80eaf3699b7b6f8c8fe7ce44b16d88b3ed3d36db5aa672d05df54557f9391a404ef5ab6ed3ee354f5d995b3bd88a39045302d7f06a97459f1ed14ce25d13a6fd1cc4a407755fad5bb93baf78ed3eab63a32e1eb8ca59fde536abdbd81ca5fee65831a2dbbf4e7dcd63384f3064eee13d37df63c35c532caf1ee618bc972bbb766fa37637616beece8fb4e3aa417f8e45f7ede95b39c259f915362bb716b0b25dcba3bb5978f5a4e7a26839ca69f93e9b96f02036f77675bb0a7ab7dad17b1c6bd84e947ddde24541364da77c3dc6d9f37e9b3df5a17cab4d5f7c09f5ec26fb30cd56bd39c659f895360bdf23586fb6e1d95e2d71126d02b9b97b1a7538a4a5ded0612f5edb83527bf5b5c15e907f26b722bf33c092dc5a71fb4af162f8d63847feab6ce41b42f95633d6b3fe3a7bb66aad09cec6afb6d9b8cd63e3519d8b6398e78e8d03a6f4b7608e0ce8cf978b540a26393dbfc6a6e7d15079d182fe3f9e88d6e31a67dfd7daecdbebb18fb6dbde3c69327912d6062a2b8a058f73167c9dcd828ec83d1daee424adb7739de3f0f5360e07590eb691467e299bf02d24e079f8171d44b1e90667d337d86cdacfdae4d722df2298d119c7fb726dae5d52fe03e928b63cc1d9f201ae568f66cb784c5b8ad1723dc9d9f88d361bef9e767e41ff6fc23362b24bb23dcd8c62d1539c45df64b3e8be69e75a3c8b8a91774f73967eb3cdd223a15aba563cd78d9af72a778663367ab3cf70d6bd3efd76dc36069ead76fc59cebe0fdaecab63ed8bdb8a4f2f779ee3b4ff169bf67d4a76ac31e1f9ee2e48da99a9b964c607614715412dfd74cae8f31ca76fe5fa3ab33326931e7dbfc071f8908dc3e150a5f9a8d6a1d7d36ece464df52eceb66fe3fa71e14a725bc1921cceaae9e4d78b9c4ddf6eb3e938db8afa9fbfd15aca7fd63f03e0be61c6b7af7e293992516c7e89b3f93b6c369f172cab4db1ebb4e28cd45ee6887c27d797e2528d3ab3915f0f87ada1a7df1abfc259fa5d364bbda3ea06cc55270727c8bc6c6ef3e660fb6c2519ee8a62c1ab9c05df1dbebf046946ef2f39f671f1d173a85cff6670a7e76328674cdf7f1aeb30a786c86e0253eba6ca5fe1bdb44003d8311a526e9f2a4185f788f81ec57f1183ffc5cbe9eec95fc80a5b5d524b6a136a5df85d3bfcdf3f506e2c726569d2b8abc4cd66e9f742aeba7beb966471738b9dd3f4a6c25a7c1fa4566af7a1e8fb923b024e9a199f0cecaad58a989ce6149a0898462f984ea1bd9f76a300b7ed2dc277908073391db631e54ca6d694c2c6c62575c0fffb2521adc6dec9a84eda1985b72326676682ee25df88de3a6a9e4da401217c319d8bf00724114269e9c4dbbbb1894b031c45e07c5812ce52840365bdd11445fb2a8134407ba32407ed0725a1d9b6264b03a08a4c0ed00f4902824dc272ed6970cd950670ed581ccbcb3cc2bd8386627db55121da7c3708d6cf1d53d771403986f27abddd22dcf929699aff30edd6d4f8aaec9a481e5533cd56b3c65ab06b42d791356c9726372ab0f7e6eb36e953f02d72ff9f3bec75d061ff518070c540706aaa1f93aca920c72ee91303797ee1eb84c6f976a4cabcfa69751823a6534755922ec38f4b225ba19c3d877a8ccf792739e800ba4e0e649914c89d04e41b9220571a90cedcc0b01a0a9c15db2387b25c0ae58304e54724512e54b94dddba7102357f3bb9f415e76d04dd4fcc841772c539df0b050bb49817ae23287f5212e5064b810efb805e146d9714daa304ed4fcdae97d215958228f74ba15c4f50feb4244ae785e1abd8811d4a7db7671ec1f633d24d8cbfa7c84e5b160f5d9514ba3282ee6767a2f0721d1dfaf81736e61343b9520ae52582f2e72451561b94032ccc8e3c9c77c8c1ac9482b995c0fcf924c1bc3d8530371398bf902498fb5308f35602f3179304f3ce14c2ac21303f9a249882236d3198cb08cc5f4a124cc1aeb818ccc504e62f2709e6be14c2dc4460fe4a92600af633c560ae24307f75266072e3edfcb550a2c57c8314ccd504e6af2509a660032406732381f9eb9230d7aab0936cf9eb1405fb9b2d52504f11a8bf9144a882fd4e31a82709d43793085570cc2e06f53081fab12442151cbb8b41bd9740fdcd244215ec8f8a41bd8740fdad244215ec978a413d48a0fe7612a10a76a9c4a06609d4df492254c14ebf18d45a02f57725a1067f3557fa96c52802eef724c1157ad49bfef9a58504e5ef4ba20cbf20c159b447df4314457b580aed2041fb7149b4f3112dacad74178c0e9b9bd33776af22d0fe4012da22955ba645bd7206166aed9482770b81f787d2f0fc0b10e8cb85e95b82504ae0fdd16c362a549c68175c6c95db0e82f28f93d1a8d856b909a2ed92427b1f41fb279268d78546ebdd4d49b0adee95c2da48b0fea924d68da1b1da373e169ce6d82205b79ec0fd4492e10a560862708f10b87f9664b882d31e62700f11b87f9e64b88275ae18dcbb09dc4f2619aee0932531b8c709dcb7920c57f0099318dc2602f72f920c57f0499318dc6304eea724e16e090dd73f2395db194bb4ee7d5e0a721781fc9792900b0d7667ac19cb4aa1ac26283f3d1328b92565f9f306697c3b6e1f41f9194994cb0b78a56ba928c626298cb7118c7f2589b10aa585da4b23052fce54106c7f2d896d89e2de7a4bf70cea1c02f0b3920077588a6f9c6fae102ce407a4606f20b0ff66369b1dfa04748fe4285face03f4250fead24ca15a150a677bb8acb04e4e724416eb6801cc3266852c1e6f00f60811fbde99ed69710c07f2709787140cbdeae9c6f9a12c3b75c0a5f39c1f7f64c14f4217dd110fa69509d99be1af31c01f9f749012958a0c540de4140fe8324c8ed1e905094e14b98e06b8c47b0d6f476a1dcb0de72a5206ab1c5117d04f53f4aa2765796ec99f99525626b99b61078ff24092fde137dc1f9ce2e29b42d04ed3f4bb7e9f661679a770e994bf0fdcb4c146bff22da617349fa26dc3204de3b92f0dc0ebbdbfcf4188fbbd91b9d0708e07f95041c6e6899de1ee77e02f2df9202328d3dcebd04e4bf2705a4e0aa263190a709c8ff480ac8346e58751701f99f490129b82c410c642b01f95f490129d8251703798680fcefa48014dc34400c640701f93f490129b89c4b0c643b01f9bf4901792085201f2220ff2f2920ef4a21c8b304e4e72541ae52f94347478cf7d94edabbe517084e18968bbfd791c3997bcad3ac1a6fb22792dd046b46126bb497bad2b881fe7682b2441265bc296041b45d52681b08dad2992cfcf0fa7feedb2c6fb69599fd04eb9c9928fce126dfd238d9d143509649a25c8228e14b904044c82fea4a01c00504e05c4980ee2b036e11776ac85e5c0fd78c9f60f5c6cdd5797a98c02d4f4e414f23ca8b04658524ca79caf95e3567c38a067cca03caa60fd97c82ac72263a4613eab282dd3e6efe57041711b4f324d1ba834cae60fbb7454de32eb30304e7fc9968840a77e1cfe017a34f60ab0ee74794f016be57a4e03613b8559270c37de95d7a1ff52e2520172405641adbf22504e4c2a4804ce3e8671501b9282920d3f8a8770501b9382920d3f884720d01b94412649dca1f4e4eb20bb4f8fe6883bad95e9fee24f8974ae2afb674a482faa5824f92c47aa5e709cc65498229f87c530c662f81b93c4930d3385eda4d60ae4812cc347e2b471d81b9324930053b526230f71098d5498229d8bd1783793b81b92a4930057ba66230ef2430572709a6e08a4e31980708cc35498229b8864e0ce60902736d92600aaeec1483d94660ae4bcec21ac1e6476c61cd2e8272bd24caf5cafbfc28fccb57823d4eb197afd612b01b920a368d6fb52d276037267729986065d02585f67e445b5ee6117e9f4f78033621d088f4a0fe4eed58ab9a541f0201ca3dfab8053d72426bbc475dd0bfd1f2e3a2feb5c567f075d863ea3a4eeb8da1bc5e940d4b7440333de083c7c29bc03d2a8c7bd484f8e2809a90db63d564165a65e5de65ae09f5c6734da8bd4e6a32417b9dd5e06a06bf2ee3e63ebb0ee398d119b417c80d6bc2275076b7d6ac1b43580075097339bb555f9681deb553b7d44ed52ab579bb5de5e20bcb849c0d96b639e32c57b295eea1a2f964218b9c6204f7f76bdd7bb0a8406c214b0bdbc7fb775540ae64b7415edcccf6df42f3bd240b6b7f337b8ae07b8535da02299708b52711362c4c5eee9ed6578ca07263a8661cef86fa2a5fde20a69bdd914ccf2e9eed5bf33dbb66ba9e1d5da36d929eed4873ba9f1ed94d21acb3e783d7e6dc55a3e80fdd53bee094f3cbfa736f0812eb7154c74b3baa8f06d0d641947a55b93fd0623abfd5f8b5571dfade5eb380e814b6e8200f7ecabe0048cfeeecba140100 serializedProgramBytesString: - serializedSignature: 92b4adcf1f63670caa2247d5e75d75ba48a6ea2501bfffbd541982641796783ac15fcd72ba91c12a92a8e2f3c1fc8860565bb908899668cf1cbba61760853e0a + serializedSignature: 3bfd24f06ba2fca60920cf2b3e40a12708552bd6b45d573ea21e3b998bf72bd3dcad7f831c0fc52808d8cebe57f01246c56e9e41830a32decd176b2ca0d6940c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset b/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset index 6e09c6a..28d6e60 100644 --- a/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset +++ b/Assets/SerializedUdonPrograms/59ed7a5d6269dd14c8658bca5d8f46b2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9dd95a1bc915804b80101830b6318bf1c2620c6db34860c0db8c132fd8c3cc7809db24f14cb08c85912d30110233936d9299cc64bbc84dbe2f0f9117c84daef200b9c843e42d92734e57a352a9aa5b4dab243519f4a196baab4f9df3d7a9536b435d9cc14f640cde56d802bbc726d8327bc9deb22df8740f8e9bf0b2bf39e79fb22c1c5fc17b12ae8db17e8f3bf16724d203eff3f06d87e5e0ce5db606c7345d5f6429f83c0ff7a6e01b9e5d87df14a48a34c04dcbec3e7bc21eb3ee48a7878815ba69879f8ba05d912678bfcb3e87ab29520a3389d3a56e785b842b3b746d139476d23d639f91599b706d0deec9b20cc87c41129bfe1a65f481d987e3fcd8c08f67e1b7997faee7c776214d23fcc6a5eb27f8f904ff5ec76534f1cf623eadfc7852c84795de4dc62941962323ca8fe7b82e93c277d03bd22fa53bcfd34d09df1d9978fe2affdec88f1724b917b8dc3f4be9fa24b98ebdfdfcfcb4904e3cefe4d7c48f03527e033cbfff48e906a5fc063576389c2e4a722fda72ebf6a5744392dc210fb997f8f919e13b1e3bf8f134bf3e5b42f91ee3c74e76781fe91264c93e322c3118b619d48f49e98ef174d7a4321e91ee1fe1f767a474f2fd6efab6f06377009b7b04598e8c183f5a92ce96ad7343bf94aec587ce6dfc782680cebd822c4786e3db97259d2f739dffcd0a7d4f932efab5246f9415fae8283f8ef1f3d785ef78bcc2cfdf90f21b97e45c91784cf0eb3785f4625d70ae2beb423442adc60710c7936c9bc509185a546af3e6dce9ddb0a1e8467cc39f11ca36074dc8360850b42ecbd476e5a0e64f295b9733915641ef7bf49e841469127aab388bbf176581ca65e095129ac61d38ff905a566c1cd37065827d0c47bceb3914f93378154a59816c33d0bca6d812bc6f93bce7a076714a2f93b01995ef590099762bbf09671ca0dbf03d431a2ed2fb1e699a22ede7e15c8efa1c5bd0ebb80bc77dcaadd8f62c7c56e5b9c491a9755437f6baf37697c229a6fb600d6a1fa7b6fcbb12a9468920fac65bbc1a36c4a927f687a292f88ea11d64b0719ee732260959a4e0dc148b53fbbd5044d0bf8dc516aafddbe63d0b9d3b375bd464b0b8cf9205f912b6e6b2ff88fee5abdbd142d3aeb238752dce7998e60616e55991ae2209ee2644a30d095454c61f51e1a7aec46205f1dbe9d294ce7f013452cb54580034545b820ffbf09b81c44fe13d09b767789cc33a3647e664e16c51392550688c501737a45eeaea60d7a96037551ab677747183dd7460571e36fea809366b087ae9a02358af2248bdba4f8d122cee86399feec2bd1b40628fdad65db85fd56d73678ac38c7189a99a670bf1ec577626fd69a423dca0227cac3af1f8701e8a9dd8ee923db4cd359cfaf5cfa88a1e8d0c578dd25b867376377d8eaea6a96f67d7b3091e077364895b4a77aec74bf6d276628a1313e5d14b47bb51413b81b44fa8546d9654452d3582633ac127030a6e52f907cd303dafa27fcc83dc249c4d05f49053257b480779c890a78794ae99ce479a554589c44f9752941dfaa23ca6128c8ed3598ae0985e708b4e705740c1ad2ae7a3298fa50a8676bcf696a42421adfff08e9d895139bcabbdac87bcaca7c8386f1574ded4a64278bcd23db845def7cc30f7b1971a204ef6f595dc3ef66a7a705e3ae8081e57793786c5b3acb863f95ff829f2f066bd87b7ebaa0e0eb88a8608d84aacc22b01bf395a4c5a636fe80cce7bd98b4b7eead7095deee7bd725f2567702669960e74f193fb4955eee8af1794154696dca3977c4a27b92fa8e40e5575a242cc56a5395c2828019c285b2797de64a3ec0edc8f4347b786c8a9628f689d6f973473af8cfde81e8acaa8af90035421675d9a4e1356e8aaf369956f601d1fd44519d93d7af5eed1a9ab501703b6845d3ac143010577eb045f0a28b847277838a0e033ba021c294301f6ea845b65107e56251c7b65b8d6a21c00cac2dbf4c2cfe962de95a031efbc2ae651d3f1ba2a31ef21b57329f6041aedd73c729437c68daa5c5419dbc628b64db8c4b67268ab8b651774653e1eb4ccfb5492b1cc274aa9bd637ac1fd3a95e341551ed0494e04953ca883311910c6459dca5341551ed2a97c35a0ca9754c1807a729b550906faae437943c274c921618642c2a44b48289fcebac030ac73acd9a08e35a2937c2da8644b27f97a50c99775926f04957c452519bb0bb80f2368776154251cabdaad52eaf08c5ef098aa0ed398e96555eb70796bec7b604bbd44294ee337ab84bae957176cd7e4b7a83a40bc4f01c28412ba7030aef3a4db013d6942e7ffdf2b83ffc755c27160f07da6989d48316789c9593012f71dd98b23e8aaeb345381ae3a7f90720e1cd8de486b934f01e53d4a3d7130d7919336f1aed08c4b1ade5f107b3b5dde11c525d7c22b624f50be6b05724883567e0644091da73b2a4ecb86396d41da7b90155a8472f3f7b8130ace6152c7e1ae8ac3cd030e8bec3efb08122521f714d89aa3e096a6a31dd250bb79f864df8e7ac9faba9569e1e4ad1f8ba67416dd5359f49e36a23841fb2d7dc3b2b06d7a457e8dc7e2310a5e574b538d68fc58755567d57d7f56a9f410ebeb1dbe816c4f513b0bcba41cde37adb36a4e65d56da9a12dd4c7b6e22d94985d0649daf2f118ae6249399be2fcd974782f9cd159f64065d95d6d79e1a2d7438a9edb6c83d99bf8442fcc325db758ef8bfaaeb41f0b6775163e5459f8466ba15e1bd12f7121e20bf8f40949d8a0689925ebb7c86bb740c606ddb77328cb9d195339dae6973fcae1efd774cc3e5031d3cffea2572c317b59dda6b4c3fd21c7cf9a6e37aeeb2c995759327de8d297fddcbb6cfd58714367c5872a2b2e7b5a51a8f33ba28ade5a5c1a79bff2a3ef4d9dbe1fa9f49d97e2a598ab182d1f514f1823e436b5d46b2ef1b2b046945a57bced8dc12b1269a1d0ef6cd77b4a7e89df76589c96201207fd0feffdf598ff26b47218bf970e7a9cdebbed3f66faddf6eb4c1eea1d76e3b59715aa3ee584d0ab14adf3b649bfc93cc62d726401695a8f396a963ec2526de6a55a17a7a5a1d1437a93b7168f31b77ab50ff9df686a0b78cc7b6e5464854bc99e39c8f3e8720ee324c0d98f5c86474cec91d44b7865a9407788442c5a9740f24f4ce2c121ba1381f36becf971a8ad4e18904d37e4913d3589ac554026fa550a940903a80dc1b77e6012540bcbefe6707a5ccb94380c98fe599fc7b46012d30905a630fad5df04bf5a3409ac4d016c89fa9999526cab0154ffaacba35a3289aab920bc8709d19f0444cb2611752abd29cc2de1bed012ae98441713bc2b3c81fd4b0aecb1a824fc4191f0f23c265aea735cc5a30ddcf437c7f6695635cb1b0269f4417bab6a4df34f98307ab0143d70cbb50f6595d4225a9ad86679340f96c26b2d97ae8a556217d9f21948f24378f5d03b8143f81fb2ffefd1750299fe0821c439043baafdd864548b9234a7dc24e9419e526d2e886d6da5a87e98f8d620f4c39e9904d5c51dde9e75da82446e735c0973287b4da19c10507e6a1265af103bbc63cd2a9fe22d9acb0801d23302d2cf4c22c52666476a349c550063d8da4d618b0ad87e623efa69460ae503153305ea98006ad52428b19352d89da840f53486af5bc0f7bc128dc71aefa6e45c97e00c361ec650b60b2893d54519f676f8b480f285499498f52e5d0c6f53111360ad998435acf0bbc3ef2430e89703a6507708a85f56aab1d93b58b32e7c2cd318be1e53f84e09f85226f139530298f13ab5d08eec74f1e47af9c0454d816302b87593e04e31d5b8c4e91d86b9a3d329207c55cdd65954de68146c3685f2b88072c324ca3e563ce150fac6cd5530ca18dc3153708704b8e95a863b1542b88302dcd7b50c77328470fb04b86f6a19aec1986b0cee79016ec624dc3325c35da804d0f74d011d13806e9a04ea74e5af56a32b6f6c84de2be0db32890fff2c8e3cad1bbe914fab80ebad495c038aea6b77d9719a638b7dc8ff54f251eb93d60980b74d021ef41d1f550f9f18443c630af12501f14f4d226e61e2822cae433f60695ae93606adc314b466015ad62434946bcf64866f6cde2240da3109a9adc0b33cf67a85a0156e13c0e54c826b67ba09b52d9e247c5e1711e0ed9a84e76c14d2ed9ba850db6b6c03ca5901e45e25408ab393f23eb10acc511aeb259e1440be3309d2df62acc1c9086395fb848072df244a677837558de19d317c3d02becf4de28b31b9af17be3e5e9300eb0b93b0ca33f63038716b6cec312e20fe59252263061221de77476e6fc51501e5cf2b1119278f5464ec12f0fdc2243edcd8864f9ccbffb0c518b21653c8ea0564bfacfdf868b0bb632c3e8e0a887f651271b702b12850fe8b31d743d80dbf2cc0fcb296601a6c6e8cc13c27c0fc752dc13458cd8dc1bc20c0fc4d2dc134d8a73406b35f80f9552dc134b86dc518cc0101e6d7b504733a84302f0a307f5b4b30674208735880f94d2dc19c0d21cc1101e6b7b504f35a08615a02ccdf9984891b3677699473541e8fa3ff4c7a349ee94f2091df63f1c778f15bdab1bf253dac6c3f58af2b56cbb3e02dc5033096624ed6725993b71f6c3fc9c9e35f9a7cc470f92509f924e9987fc83d4effc205ff72a39fbf2ce62e13b9bb4bc37f43dd1851d7ad4cd93ca61c4fd5ab2cf5b64fef7dad2ea512a7ff7a7394edff23963b2f7672d36e72e36528795b386e0ccdc267540a7fa2ff03e7a1a4c588870000 serializedProgramBytesString: - serializedSignature: 74fd1e3d29b3ea3ce7b302cf38e6f9c979c438651859d45289c9bb50c70e9759d00e3a0d40a055ed6c29127b126dac3662179cee8c9947d3c1464c3a799ee902 + serializedSignature: a9d2159b189abf38e5ff07d99e8383bf9e06bcce492a9fd42a20349f39a2bfa6d60299fa442aacd659128a79e72b11c7397e37f13f6b29342890620bb893eb03 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset b/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset index 6d5ba87..c22169a 100644 --- a/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset +++ b/Assets/SerializedUdonPrograms/5a3bdac96bebc3e40a55936bdee90c68.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df75fdcc815c0676d96051b178c4d33b6715f17d8a518f74237ae180397d877c118168e3bc004b0cf8ee324977ab9f4de7befbd5cda5f937f213f27ef8d24f6ad346f25ad9845720e3eecec6aa437ef7de7cdccd3cc885d9712f0133b0e2fa36248748b66312226c503310fefba219d835fe393757c502c423a0dafe390775c34ba5c893f8763b5f03a009f96c4325cf9504c403a23f36f8b0cbc1f806b33f0098f4ec15f06ce8a95c04523a247dc1437444d6c878b885179d192792c8676c5cae0b54b3c81dc8c540a0b49c9ac1a78b90d394b326f0e94b6cebb2b5e9266cd41de045cb3286641e67d29b1acbd5cc837c248cacc7483991e85bf72f37d85995a9f37c15f29fc5d313faf37d3cde43cccbf6acbdf4264abf2b79ae94626bf92e8a3cadf661ebf667ede6ea6c788eed53e6da972b1e5988b2d3b5c6ca9f6684b8d991e27bad7b9d852e2522f56fe16225b956fd952cbe45bb6d431f9765beacdb489e8dee0d3167bbdd86d6972b165a78b2d0d1e6d5967ea5c66bea76d2961a6cde635d76dc753e6f11be6e7dde47c2b1fd3b479de4df373dc4cf798e92e9bae567ea3ed7a7bfede026c69616c69b5d9b29f9c6fe563dae662cb3e175bda98fc426c69676c39c1d44b3bc9c7b4c3664ba94bbd58f98db6ebedf9765b4a6ce949916d27d635a7c8b143ccf587cdf48c993f483e637ada3c7e8b29f72c2923c99471c44ccfdbca386fa6e76c651c24655bf9985eb0b13d65637bc0c6ceca6fb45d6fcf2fc44f2e0ab59f5c126a9fbf48f231ed14f9fdc4eef3763fe964f2ddfca44b38fda45b78f7935e5b1df69a698fc8ef277dc2bb9f5cb69571d94cfb85da4f7a483ea60336b6dd36b6763fb1f21b6dd7dbf3f3fa493c2623bacb10638d8b0591928e8316790d3dad2bdd834e145d8a2ff8735816bb0ce1dd020850447e2332ae5c865eb25519f9d5c52a88deddf2751cce989142879c45bce52802959b85df0c095b97e078bf8c7a31709d819c66003723afba0743c05df8cd95320ac5ce42e89b11c3f0ba20e5dd03b59d67ba998421aefd9a21906944e07370c402ba009f67a586b7e5eb23a969466a3f00c796e5fdc03cdc117441fa5896e6b47d11deabca1c3691a9755407e2dc7123dcb7aaa907ac41ed5332367cbb46d6a246107de990d90c4b52b2177bd351136f33343a99b8ec580d192d12592ce758ab48c9b86dc841d0bf8d4e0bd5fe6df0ee80202e9f2d6a3258dd3ba505d91a7ea3e23fbb12aff5dd89e79ad6265272a86d70312d1f5894978c553b24e437211e2f49a3a276fc31157e19c2dc2e227ee3bc19799eff0a289523536e05c4f0367218de3c86bf5938b9475ef400dedd910a21642c721a7e516d2bdf516369149f90d09d43aa9be21cf6752aec65c5c6eedecfe4c35eb66257163bfea809963304dd74e008ae57119471e58b5a093a0332eb5d175cfb3290782447d98770bd2a80cbcf1427d89a6c4cd53c374a9e8dcab0d29f461ce11205e13412ae5029596e5312f56304c739c19b020a2ee5046f0e2838a1723639197aaf28ce761bbaa7ab90370ee767642881c70741e238948df23a6509d9eacdbd22bfd36df1ec745ba5d31d204e175433cef9ca545589072b15bdce7fe1c7519de57c7596abaa73e3dac41c85f5bd38d158e3b9efadca1b32f8ed7937a8e8c95580d78bdcf3aa6f9ffbe58a4d066efaef8b578471df63956b8cfca89175ff3404e994d4028f4f984157feb2f2d7cdf6153ed9ba4961d716eb55f6d66b65052e3e6c909d9eda6baaa5d7844b67ce2737aaba0becb56b54b1217678636617849e674584bd523fd4c8d19b24f8dea442d51ee44ac448117b131a89724b7bf9fdb656e5b772c5a4ce618797d2e4824f4c183fcd09c6cbeaa597155602e70d9b386fd8a9f2061c0d167206ac4528d38f076ce6ca6b5095b7437adf9848c35f06eada6815d817e3b2ed639987136fc6cab31f3db6707aec52e9b18de8815122966f7861e11a6ce534d8add260bb92c40db317295c8b4a4e8b3d7c6f6068312eeb7e2940d9dbb8b21b55656f22658fc91e71da9c87f3db0b55a9cac56e71af2254c056e9105ec50bdfae128efdde3e459f9146a3f66707177b39d57c393b387807fc74e3d7e40083eee40760b5aa6c6cd907553662d987ec1d9cbdb47abeb41a8ee8618e68b220a2b5aa7290c21115d14a497458bafd8478150e4d061c1ceb38aa4739aac70250ade7a81ee7a8361544752747b5d92fd5c27cb581a39ae2a8a60350ddc559dba2b2163f16e62bbbb9725a55e5600ba2f7998de6f061049493e20c1c790a763f83bee829487fe64b973d9c2e6d2a5de84036e108780b1f4c1a392dda555ad0017d4e868f4b90391d6828ddcb697042a5c1064187b3176400b7ecd3b7f771257670de56581bdacf957392abe15c6fc350690aae0ce66707382d4e71d676cba93cf42b3fe51ce4ca39ad2a07fb97dcfe2a6b2506e2d7a57763dd3ec8696d7ead3fc4697546a51576c8e8cdcb8ede94d64c617c0e739a9c5569b287f8b91f8df09a4579be1fdd929c6ee754bad5114ab9f564dc4c05677584d3e7bc4a9f7d0a56def52a8cd851858629796f322374de928f98563d9123e0b4b48ccacc8e09d88af29d8d3623a549d00ef5c87feb8efb99bccde0e2eea3640ca31e7dba72b7e5c7547e83b57249a5bebdba2ff2d57d9c13dc1950701327b82ba0e066ae09757b119cc7f3532ac118dfe2d628e58cb18fdbc034a7756f40ad5b38c17d0105b77238fa5701471ba7f5e5805ab7738207020a3ec1e1b8b20a383a38adaf06d4faa44a30ceda5df32238cfb2de294ef0f580824f739c6fac02e7330ae12939e555ccbd03748edfff5cf34d1560e580855b3f55fb06dccae706a1b35c9ddf0a58e7e7b83a1f5a853a3faf125e29a178d07a90177c816bb4c3011bed454ef04840c19738cea3abc0b993d3fa85805a77716ef78e806ed7cd097e6740c13d1ce73babc0b997f3e7bb01fdb98fc3f162401cfd1c8e975601c7650ec7bb02e218e0fc792ca03f5fe104df138a7b40ecbe68f74d17f770b96d51def935cbbb3de32947e35df68aec5685315692fd9a51180e66e0aec48f5d5739bbc655766584b5386e2d57d3c5ea8195f9c82939338003ecc0ca99bd2b0b5e437218cb80ae8fe4d99443ee63a8a3720e6f065eefcb01dc6e712e0d9a4387cbd5e0748de3745fc5694433275cbaec86a2d022949bbd263fa1e01cae731c26541c3a5638e4ee82e2764d19165ab326937269d05aaaa6cba49c857e2cb9c15932a9b2a435902574b91d1f89e65bbb1f0b6e72166454165ccdd32719daf6c970720e2e71f323bea5796d8385d6da2067f394cae63b1adb617fe0fe8aa7e587c82d8ec834e7c7b4d46e69ab61d7b269d9301ca3e38ff75a75f3e304fcc6621845182b668b70eda0ec85f0d39248c9dd04e9955a73df8285a5cf8146f8d0cff00a77f78d552f0bfe49b22961bff92af4a122372b541ed84c7c905ae77d9b9ef301aa846991250b48cbfd13cf9ba538db5d1a376b755d4a6ee33856a037b96bf10a96b65eed43fe1f9d300458a35cac5406ad78f9b86c9aaef2dd26089aa400eb499b557878129daa13c04cca190e5c7cc59f447c5d1ab9bfaa138efb86c628e0bab63e8b6b56272e6f1b32a280ac22914536b7161e162d5cb525595cf36be561d16a94ff96c812719bf0be551b290b7b12d039a66f9151d463b972b928e54ddac778b9bd306c9a3fa06374d231ce253d74eefc39d9e699f4e893f9cfcbcacb86aeea90338da1ebc2ff795499c6a8f2dd08e18a1584c9be675167df532d8c0d17c64dc43c9c94efa6abc55e7e906793cb73faa38417e30ae993d224ae5ad23dea2d2b1b022a3d05efb5c1dba80b5e2981b7bc967e987be39cd687725017ca3304e5439d281b4c94d39e1a7576465d6bf3aed785b59a607d540c0f9d30871afb845d6e4fa9d143b5f5941b09cad7c233e89c8e20ca0182f27178bcf24404515612944f74a2dcadf04af54e46e7aec73130491bda8bbad03611b4ef094f83ef88a0975e20289fea4459e3abc1b74412e67e02f3bd6182793282300f1098cfc204b33d8230f71298ef0b13cc288eecfb08ccf78709666b0461ee21303f1026981a03236d301b09ccd7c304338ab795bb08cc0f8609661467337713981f0a13cc5311847990c0fc7098604671cae31081f9119d30ad7f8382054fc95b494b36eec7d4062eae0b9c20e03eaa139cfa7f176903b65517b00401f6319dc0543342b93b22f97f9e39a6338ad4b6de7396a07d43275ab7794baabcd6d9f4725d28cb08ca8f17db4bbdcf5b6a44ab6ddef22841fb6631bcd4dbbc6514ef74da08ca4fe844b94d70abe3b9ff5a3b7a7d660941f8c9b5f4c6dc35728dc38fb635f25e82f2533a5116be46aeb1916b5b236f20583f5deca1c87bc0a4f17e5c5be33f45d07ea6188ddfdb2d641467303713949f0dcfa81ec529b76682f273e119923436706d43d27982f2f3e11c92347aa8b621a98260fd4278facd282ef0ee2028bf189e7e338a13c29d04e59774a20c1628695c39d716287513b45fd68976af02adf14f0111debcb8228cefc07bdee69bd611c05f094f8f1ac55d1e5b09caaf16bb1bf03e75a731c8d73675779ca0fd5a7806ab286e9fe92028bfae13252eb8dd773c2d16dd875ae204dc37c23bca6b9c69d286b68ba0fd667806a128aea7ef2428bfa513a5f59526cef5f479f394e8c18b1178dfd609cffa7e1e6e98a151a5c6e98f2a5d205b09c8ef8405a4c6f05c1bc81401f9ddb080d438c46803799a80fc5e58406a0cc5b5813c41407e3f2c203506e2da405e22207f1016901aefbbb5813c4740fe302c20354e096b03d94f40fe282c20353e89a60d640f01f9639d20fd4d57447179b785a0fcc95aa2cc5d93d41802695b93bc4c50fe5427cac2d724357aa8b635c93a82f567c5f050af8f0344afb16f22287fae13254ed53be726a3bea5703dc1f78bf07862149f25df4650fe323c237814371a5c24287fa513a5bfc7a55a23190e1d21307f1d269851dcef7698c0fc4d98604671ec4e1298bfd50933d8f298c699226de37a1f41fbbb62a3f5beb140a3d76adb58708ca0fdbd4eb4d69407d705447dc5a78a80fc4358404671c5a79c80fca34e90fe22cf286ec86a2728ff14de2149a3976a1b924e12b47f2e86977a0b9da2f82ce51682f22f3a51ee32512e8307e27fb77ede7715d513b07f0d2bd8283eee5f43c0be1556b0517c2c703b01fbb7b0828de270b58180fd7b7886ab283eec522b9e9b2feb48e3bdc43f44ce7763785919487afeb70449975dd0490ffffe3fc9fc071ee3db312a4deef370fd7581cfab8c838c719966bf2923857e49be1ad2dbd772e59789d4f34bfb27a28da95bdaecaaf9cb6a7c3587ca5277fb78dfabc8532b296c87cfb5fdffc27a37ab5dba698dfc129711a87943387e39fb22bc47a5f027fe3fe4e65f703db10000 serializedProgramBytesString: - serializedSignature: 5763d46b394a1931a4f10ca23a993ed39667b83c1db90536165cc029aa042e0d2cf8d01c8d721038dcc239437e1bfc3e79ef9aef8ea1529a5c3682f6c59a700c + serializedSignature: e6379038a1d08cd5802b607db2135244dea56c0a577a486358f79e986639442ae39cb27de96325c5c61718139dd2690920fa8eab8cde88aeb78aa1753b2f7f0b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset b/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset index 129d3e0..9c39979 100644 --- a/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset +++ b/Assets/SerializedUdonPrograms/5c0755a6f8dcdad44be6fcd9caf44379.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e055607088400216c93043b718c6dcc0aecd8cee9e28a43ca5701e28f93021984a344088284cb7e8254e545f20c798bf88992eede59349a9dd9d582461cb154ececced1d3fdf5313d3ba2cb61f0b1a6e0b2ce56d8029b6605b6cdf65815ee16a0dc85affbe4d5bf600750be866b11daa6d844c848fcdcb0c6e0ba0c4f35568791876c0bca32b5afb212dc2fc3d8123c61ed0efc95a097d503830a6c913d67cf58ceca869058a741355e67a15c5602aef3ec1db49688299cc4a1a61c5c56a1a5466dbbc0b4d7ef25fb99c4da85b62d1873c02a40f315514cd4e16a914c54f4f0b29b97362f93f01783bf8cf08c7d9ff0e72e5e97e0f716ef8f652f6f13e9f6f1f621a18f578f658ab70f0bcf309fb529d1f1c6f5f3fe23c2339603c2dc9e2c69a16e40a8c37290d3c90acf38ef43896e9cf71b95f84808cfd89ee3f37a7c37e1645b64113f808e8a6c9f3904dccd08a6eb8d0c375a241deb72f50cd68bd3d6c13cf68180c2720a6497757697cd2a2de7929512f85ea06b117a9489e8987f8abf7d53207315f89604b3af41fd63f21a34fc32b44c83819569d4269b01437e29515987692be03a25b606d77da2b7096cfb7b8689842e228f59019aae07ef428d07e83e3c5788c355babe214e4bc4fd32d4d5299e5421a2cc43f99666f3cb7e00f7aa39d738646a1ed58eacab77c385a7a6459006b977c8773e68e4343482d0c7c6b81bf638146dfff469e203866e90b169817469ccb84b5453dd2c7328a6aff8108c2ea35f42b57dbb78df67f70265512383eabe42123434fcfec1fb877ffc13ffcb6e16ed2e7368f91c0f112d0858a437698dfa28048b60db3d79645486df52c18fcba0b5da41f8dd7e65ea175d01315a999a15606588fd2ddee5159445b8db664fa1acc2df6b62d6a79f7c8ca701938a05348c4d1dc85d2a90139d06393caa04819c3892ab01327ed40826350886f1a043b05b8520657bbf1945b000756efab344ad655a331b34f7e81967f3d2f1a01188e3534aef0f899760c47b8f646e20ee5025ee86cc72e625f2f489db6a25a748c9e699d119458fc228f2099ececbb6fa2f7ceca424065a9086b8adb2b8be4efbec73f0895f79ee16dd67711b7447c241adcab4c65fc3e6d7a926a6422f753aabfaf1e21d6e11732dc7bb4ce0a21c35dac555868d9543aa956e901c701fdca548bd55ab9ecff2e37acb4fa86647dd0d2b20a11db84c3ca3279e5419066dbfd73a6818d8b647543019886e1cf83ee2b66c1c6acbc892658cf9840b6741671dbd3afd8cea4c36827efa74c4736d209e521147e58f29f1942967f594fb5566456f817e326a56fed733dedd3c8cfd058479437bee4318af7a9d136c66975a8edf97c9ca2698ea2553348e745637a04298deafed1845589728c82b53fbf2ae2b2da33e4ea8df0a48804ec2a54e1369951761e5472ac665271ad73bd1a0ce3d3f3ea97b66740bda27aa056d51322811c469b601df3d30a60d80f0771850a4708990628b6e5c504b735b73608eb2700ee9a49c5049795d92720e0c000f2bde711971838adc3d612532953a38afcc6b23bd88c2e7b08ecfab2a3ee7243e1b738aba78428e5c636b1462aa019ceaebdba587119d7cd754f2cd06589bac93c75c27adca20d28a22415627c1a72a090ada00a4f39c656af57b4f3895d6fab44b93a33a1c3ed3e1e02e67de62269e95b85ac28567874e35d05e978f7a2ec172e4ee5057488a12c8f5867a4f7379b0751b281e925c48b7314696587c5124b7adc3d872c4943ca7c3e1ba0a87472d79ec1cf0b04d9a740f054eeeb161d1280e5fcbc20c73897a1ec0d81784063ed598430b505e99c4a84fca70f65ddae65420f214e10ead2cfcdcec73a63f37f3a733c73d420993426591d3824d8ad285cba43f2e8a73893c5a8074469db89d6f496fa056f9a937eb726839be7d4c6b0ae7621267eb56db50f457c72e8167f463052030c29af7f473a416d5cebe163e77d84b9c3b44c03b7368c331321a9c1b5e0e785a801f747f89f8f76db3c0e39d27f87d254dd1e92dbdb33c207adbb2ef50fa74d638bf29dafe6424fb6984657538cd6358bef53f8f98798c98184c62192fc0e431c04c998c0298fee022bbc50194b731cd69465e9eff24a78cc9a698106f45b8e3c48538c50517ca3b26a1bcc2a174738d2a746a2d939d3107eab82950d302a8d367115483966a0cd4010154c724a8fd1c549c788720f568e3aec11870b629e098005cfe34a365a169eb62d00693a6a0ec11a09c3109e5350e65053aa10536d2850d6987ad7fb96c14e2cba620ee17209e3d4d6bed58c44c9b82d216a0bc6b124a4c5dbd0e815ba3f6819632055ab700da3d93a05d55acddc8449d9cb7ca7ee4bf2bbd6831b44b00f80b930067a5185a0e788f6610c88c29207b0520ef9b0432cd7409519577397ffb1e4b00ef4127ac5074f38b64857d02900f3b01a46ebd168134b8693406644200f2cbb302e479b4c89800e4572681cc85b876f3b19b5130b3a6c04c0a607e7d96c034e8e2c6c04c09607e7396c09c3d87600eb20b73a291c7138d6f59d301827e4fe51e1764b89c55e8f394b60d457ed850148e0e1cfa2906668751cee0826986bfd7ff4e1445d24fa56dfa69c759854ad2939c5ba402b4e2d08f4a2eb2fcf8bb07e19f16e2768ecc583c077b4e468c4ce1c7fe0fe93496ae583e0000 serializedProgramBytesString: - serializedSignature: 1a1a640cf3d976035e7bbbd109f28d98c757c2bf3381aaf7a9a9f31fa3b445ae0fd72a122152a1208dc680439e8acdc42a297ed674b74d19c4f5c1390ceeb20a + serializedSignature: 7d7a3c8eb486ced2a02bdfda26ef481ad439bf253b2e67edb8d058c7c5ae2e3de5880bfa09860c38736635958ca6ab8067df35f8f31395812648291eab7da20b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset b/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset index df091d1..cad2a30 100644 --- a/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset +++ b/Assets/SerializedUdonPrograms/5c19b3345b6ec1c499b2f608135b32ad.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1dc5f1f8f7d996e5de7bef166eaaeedd968bdcb1656330c655b605926d2457aae9cdf4de7ba80102841e02092d81500201020408104a0209247448f8dfeeedeacdad76debbd3dd3cefe9ff933fd6e9eef6e666bf3b3bdbf71ae432e72731ccf9b58c2d66d3d908b694ad675bd866e7afe9ceb1d2f9e79ea9eb8b589573dce8fc5ee3dc1bc6faa47992ff0c4e74717e973867d56c9bf3e476b6ce39968bfb4b5899f37789f36c9973c6af6e70fe9739a1128d9c8796b262b6902d609d131dd38858261eaa96d7123c5e8926ceef696cb773b74c28c55f922b6e75767e2d71ee548b7b958ed22adc0ab65244abd2b9b7ce79a68a553832d70a894d964f66e20fe61ebaca633779e4d16c2aff6e28ff6e22ff86e1f9751ebb835384ed0ec22a993d9cff59ceff6fe5794ff7bcd173f2bc977b9ee8a0c9680664f496c73ef2d8571efb39ff1b3b7f1eea43ff54f7facbe30079ec24e51e26cfdbb8716fa8746e2b8fe7c97015e0dc0997b8469e0f94c7f3415cda836b50462538e7c773c133e74ab91f68320681fb50860cdfe054793e58d3fb02207bb83c0e93c78e52d666ed7a0e78e60279dccf10af2106d943e535279db38b345d2ed2185e24755771550c2f06723b806b50462538e7c70bc13317ca34ccd1640c02f7a10c155ea5f9084def4b80ecdc340c95bd42869718182a9d8618649b18d6d5def35c390d3f66de3cd79cf9f305cde4313f4df854329acb634108192ddc346af4798ab0dd4158f59e4237fe229cf281fc78290873a93c369269b945bb9e25af6fd5ae3746ae6723d79b68d7950d5d0674b94c7be672f9cce1e0dcd1b3f1a79a8c2b64b82aa03394a7ee576bcf5d29af6f037182cf5d893c7795f65cb6f6dc55c873576bcf35d19ebb5a7b4e5def0bcef9fded6e1cb3ee95d78bdcf36c95be75cd2ffbc9e3b5ccebabae95c76be4f51de0dc498feca3e4fb6f67c97ccd8fd76972ae4b23e7c5143a8e64def254f937c5f67acd56ae776536e9e23ed764114bda393fde20c3efd4e4dda0c9dbe595d754c565b43c3e22c3ed96e7a334bdd4fd6aed3ef495f0be4a8367e4f523c0393ffe16795f37edbefebe31206de0fdb15ab8dfc9fb476ae747a5489b965a9c6f94cf1c0dce1d76cd6e4ec36e5c1a76ea7e54ec943c8c9dba8fb11baf85ab0b3b15d7dfb3a41f5436aa6cf26629e71810565de7c7fb98d7f6ef7365b450369fa5c9fb990c7f2c3887729fd5ee3f2b8fcf011d15eb3f806bcf816bfcf82b29670f38e77aa9f8297fabf4ba557befad9a5eca1e8e03e7d0dfa8f71dafbd4fc937f157b2fb8273e0639ba9774c08c8729281d564706daa3c4e01d794ec9bc0356803b25e54a0ec71a23cde02c2dfa4d9c62dcc6bb3d302b287f1509c613ca61be2a164df6688c7ed29e2f17310fe36105edd83f12896c76c4dfe1d5a3cee30c443d585d3c543c9bed3108fbb52c4e31720fc9d20bcba07e331431e9b68f2efd6e27177887828d9f718e2716f8a78fc1284bf078457f7603c8632af2faa00e74e1e6cfda216ee7ee62d7fef67de7ca8e4ecf2ca69a3da137aba3fa0f1d2ef3fa8dd7f501e1fd2f47848d3e36179ff044d7fbd8c3a0ee8a19e83f7376bcf2b5f5501ce79fcbed5c23daae9f7a83c76d3e4ecf2ca69fb9896f68ac3af350efafdc7b4fb4acee39a1e8f6b9c7e837052f755d97a1cd0433d07ef2b4e7a19f804f396814f68f29f6449bf6d7a5edd3f519ecf44c23da5bde729ed3d4f6bf154cfcd62c9bcf2b43cce663579ab9dca3775ad9bcf91c71734bb79411e9f67de3af5f36edcdacbfa6ffbd9f2fa5c797c5193f3621a392a9c49c779cc5b372f61de3cf212f3d64f5e9232ef95baa9f69c4a8b3f32afad9580eb50de2eafbc8eca9655fdf263e6adefcdd7f452f7abb5fb7dc17be17d95069f306ffdf21379fc3bf2be6eda7dfd7dcaefced5ee2fd0c2fd8379eb97ea3c48ddfc65e6ad9bbfecb2eba4ca538cddc234ecd4fda8d82979183b751f63b7480b571776fb83b8f0e31296cce32a3ea5e09aca5b4b594dbe1ff996bcb6581e5f01e15f91c765f2f827a9d349e09ca78deabf32e978803caabaa3d2f555e6f5e3afcae38186f71f04ae4d95c715e09a92fd1ab8a6def37a32ae852a3f2e97c73f83f0af81f0ea1e4c2fd5dfde5893ff86168f377cc643d583603c94ec370df1782b453cfe02c2bf09c2ab7b301e2be5315b93ffb6168fb743c443c97ec7108f7753c4e3af20fc3b20bcba07e371883c36d1e4bfa7c5e3bd10f150b2df37c4e38314f1f81b08ff3e08afeec17834d2e47ec8bce5fb87ccebb73e62def25d7f5edd57f58855dafdd5060e6b9271e9a6da9375ad07287dd478c1a7529f93c1b913a67b8f14b2d6caa3f2e59f316ff9fc999451eaeadc7daff6ee7f326ff9bc165c87f27679e5f5d823cf5519f31fe6f5f9ebc07528f7df32dc29dab9f2ddade4f15ff2faa9e09cbfb7420b57268feb65f8d3b4fb1bb4f7e8f737caeba7a760ac97bb4ab793985737e5473669712e4fda4caf53e5b14293ad6cf6734df6e7aeec9eaa6c3c54937d5852f6e036886c55ee7ea1c9fe42ca566363159aeccaa4ec7ecf69b2b174dfacbd1b4bff33d2a4ff975afa7fe9eada6b5fa4bfcaaf7a5ab564e6764ab93c7ec5bcfe49d9cfd72ce957be0661f9f11be6cdbfdfb872fb9d23cfb3b4777cc7bc3efc3b4deef7dafdefe5f15ba0836aa7fea031ffc17d77ef73dcf7f656751795f6ffd5d27e0bb80e74e47fc23c5f732ec71afaa9fca2d2e4474d8f1f258336f25c1f7752e9a0ca094c3ff55c5fed7eb5765fe59772edfed7daf3ffd3d25f3d3f46bbafcb5769fb95765fa5c34fcc5baffe49e3a6c7a74abbafe4a93a924a8784d716c4398857a201f3b6eb95fc6aedbe92bfcd1b2ed19079ebe501f368cdf3e9f2a81e2f35de792c3887f152e39e2a5edf6ad74ff786af49dfaf41fa72dfa7fc3be607543d230a1f22c7f4138d99d18724b2594dfe4d6483b0fca8c6670f07e78edc41aa0e93a5bda399c6af9926b7b9765f8e83279a021dd4b105f3e4dd841cefeeff8afbde012acfca3c9a68c58c3e24d14ad3b12df3fa10752e7dc820d5b72c9f4bb4d4f468291994ca708a771a1f524b3ff55c5fed7eb5765ff9904aef7dc5b4e6f9d65afaabe318edbe2e5fa56d634dbe4a8736cce343126d346e7a7caab4fbba0f51e9d04eb385769aadb467debca6e4576bf7751f22c3893955617c4807e43ee64354bcd4fc9763c1398c979a5f759cc6b993576eadf4557328a40fe9df07d81bb50f9173c1c42c3c930f01f3e8125d40587eeccabc3ea4ab2b77a89a9790a5bda3bbc6afbb26b787765fb66912dd800e32cf247a326fdeede9be3b47f67fe6a87249e5d1de9a4d6f01d7a18e6aeedd29dab9f42143d49c1ce5437a697af472f518a2c62d54bf6a3a1fa2eba79eebabddafd6ee2b1f7298f7be625af37c1f2dfdd5f363b4fbba7c95b69d35f92a1dfa32af0f51ef53dcf4f85469f7751fa2d2a1bf660bfd355b19c0bc3e44c9afd6eeeb3e44864b0c64e17cc840e43ee64354bc0669f11aa4c56bb0375e359c077be5d64adf2e207d793b6f3db0b7bafa10adef21a1e65f9c0cce797ebf24852cd567a0fcc97ecceb33f693325e74f51ed6c4fbee849a83b1d32b2f314493b7cb2b6f986a2baafc3554b3c775e03a943b8c79f3bf3af7d3e78ef95a15f7e1acf69c0ff5de11cce37f13c3c1757eccd5b8e5ba32f27f9472b23479f99a9de56b720bb4fb05f2980774ccd6641669cf1469320bbdb65b63374393324518c03d31523e5309ce9d780dffd61b5e8d7d63e147e400fde173bb98379f36d6e2344a8bd3282d4ec3bc7152f299b4a3c468cd3e557b4cf9b9315e5b488c01cff1e358cd7ec7baf1c92df686537e3e314e86df0bcef971bcbcbe55d36fbca6e799deeb225c53ef332a0e22aed087aab8f505e7d0cef5e70b433e3f2ae4f3c3423e3f3cd8f335ef3b3d4df813d2bcefd83a3e3f2ce4f3a3423e5f18f2f93ceff32a0fd694718a8f2ce386a9393661ca38e59b27b2643e9824af4d92722ac0b993370bbed4c24d641e1f9098e8d5273159b3b329e03a3f4e90f7cfd2e44ed0e49fe9c6bbb083574ecd7b3439ea7936599373b6761fc63de85cf583348e5398b79c9ae2322bbc4beaaefa070f94f7a77ad92979e23a94b7cb2bafa88f578e182b4a1507f5bee95a9a4e77e58ddca5859ba1a5a99ab7a558176b36b6025ce7c7695a9a2a3d8781fbe05cc49b873f079c43793335ae33a5de5bbde16bf49be5b53925a746ee6c4dff03c173503f3dbcece71da9ea7c2b0cf18236a8e4a44b9f543626c7cb132540867adf1c56bb4eb544de5373048e0161d5757e9ca7319de7ca187d8d9493a5c95bc0bcfe69812677a1765fce45482c023acabea5c4fec96b8945e01a3fce9772f68073aed73c29a3b1a6d762edbd8b35bd96306f1d463e27e62dc0f71dafbd6f972647f1cf4a3252f76aec6e0ef3f8e8518dc0b33cdce2107670a44c93313ec2aaf92e4785789f2ac7549fc89e64fcc75ce0e379d5ef05e68c88bf1d26633e0632f9f5a592dbb9e05c85e7d777789f1fdb22c5fbdbc930aaaeaad60a75062ca42dd4f89f9de09ed449d49d657c8796a6789f8aaff2256a3ef689c9e7c73ee1e379c56b19e0b5cc8dcbb82e4026bf7e80c6eb00101ef252cf4f48f17ec96bdc6acd76202f351edad7c04bcd0d08ca4bbd578e9b8efb527bffc92cb5ed76f6192e850e89e592975a9f792ab8ce8f07326f9bff4057e7f1d7683a9c924687a37d864bc56b2ff3e67fd517a2cace0a70eee83861801b7ec23c4d87d3d2e8a0e4ae9072cf07e7fc78b0bc7e0138e7cfc9f1eac44a79ff42ed3975fd22edfa21409f4ef2da2ae6ad17a9f26e7532acf85b85e5c735cc5b9ead71394c3a5193ad9e5bcbbce5861c7f4fac93d72f06e78e9c89db5c9e13655fe8a483b5e7547c54dfd925e01cde2f93f72f05e7fcb8415e97ebe012aa2fed728def4679dca471de00aef3a31a9bbd029c374aea5de317d3d883e25553c6ad669e326e829e6fd3d9572a1b57f53f556f3c1dc83a1b70907e66fc07e09dfc786688777bee6525c418e96c56c6d6b0ad2c970fec8ade35bfdb13a827d36f4c20c68cf92ffe3358bc769bd338dcea0830ec0eb054ec3db08d15b202e3ee005dc578a27afb74f17b8d13a25c08bd3251eb150fd67a0557aec2f95706b636a876aecf123b23f0cd0dca9d3b23d83ce7c89f5acdf29d8af00a4dca32e7b5156cbb7356eafcde2ae4ad76d4ae1d325d94f83608fa338b1d99ee2e0d95ce150574ab735e21345c227eef109a9609ed4b9c6bdbc49e119bd94636cd39ee126fab1df72ae76fd33b4b2532b38ee6cd1ab0ebee96102a998a9dd870ed73854dfe5f8aec8b1411532b78fee03f8d7245cdfdf45a29f17f0c5d27c32b22255246be4096f05c2b60b9a2fdb8b816c1e071ac1d43b37dbbbc47b1a294713193e1c9dd5dc42099c24da7b4d8b277f947576479a356c8724513b4479aa8a502cbe5e58891f12051c8ca6a94c715d5f1274cf8c5f0c5920ce277c3958b70c113a0b128fcbc0920a65a943a7fec72fe5738810f126a70b4fc451b9d7f5cd95ae993c785650bc4b50bd0746a62901b98208bf1bad27d62e3d8f640a93137a989451273aea8317549618cd8bb4475a981ac33a9ecf2fafca2d1e3f3c65e9b654e9766225deaf2362c651a9a52a659a6cd3fbdbf4f952ecd6be2954c17fe6366d802b1ed743a60041b990836df37b6cd75af9b6df3818fe11a4333bf56296d30950618c12c1341d14bb5348304173a1a1e2a6b897563d8da37c3368261d75ab1f3a30346b1b181621ea7d8d6a456534d2d31b9df2c381b13dc2ea4e02698e0f6210537351954cb4c67497e6f8b90b2c6091bdc9cf858dd50ddad99eda9239227d3ab8059533353da70849d8c5ae989d3114f9ce698e4ce6125b7c02477092bb9a5c9a0c4bcadccd7d1eb5646725fd3d97719d98da5aa62072d215b99e8716729ba3fe9e8d5ee3a527f4d739edde470d821fa03b63bcf9bba9a5213edeedbdbf71034fb30530758308d30c2ad4d96cfb1f7c4925d37fe6eb8f1b7c1b255afb0d9aaad49328f4b6f3f05400f5c703b4ce53e06951341546e6f92cc4b48dec35bab0d66449d8d4bef8049ef1785f48e98f4fe5148ef64cae5c2762a4973f952e79adb413b43dc2d17addc64bf5fb9d830b6aaa63e85855fe4e4bfdd62ebd975ceeff962a3d9ed429fd47e60806f3f3050f801dee343af33e6293a63396350d8ccdc05f3418323f0415d4dc2456b98d56efbfde4fcd412de0217de0dd37c3f83e60d026ade1d033e24ac2bea8131196a60b2c7a4760a263d31e1c30cc2cf0928bc17267cb841f8350185f736f92151d21c47ea87fc0e6ecd127b6e9779da7aeabd6e0f1dd7488d6e2c768e1b8416fc3ad722fda0586a7f35a2860fe8c51205e60ce67f888e3e167c9a7a3351c69bbd699ef0a676e98c79dd3e58c99b6f2a79b9b1ae92756dfefecde2d622e70d3c354b645910a46cee8b79b80283874b04f470fd4c194ed49336efd30cc78bcaeda291c2ffde2193b754bc3bd9851d262bf159cb3d0d259b28dd8c465b248cb6c087d146a13d668efd4de6c0ad6ea4c137e471dfc0e777371031182d62c01d35562929159f15e083ac1b04a7ca945518c5d25b79a9657f79b8fd0d30d99fa849ef4f6a7fc18702cd5634c6049da31e2b50e7a640add717eb5a5734daea38f1fa8eb518a61c9b43d268a0298d447b2493c30cd0f1074f27beeec55f457f02330f31a47b3f466f10567c4c34151fcce4bf53140e83b1dad824436decd406c16a633958c933d950f218354f51f2ec67b22ad10e2d27b5aa54d9d15b9908eaf9525be014df163835ad970eaf2b66ad43306b9d66523f80a10e3525b768d066729c088e81d76d9c68baef642c66e671223f3a60c9330ccb913322c891c34dc27912cd341472b9a2cba06eb1138b54e484233622bb7685a1185772844949eef0661b1cde730d8339bc5c8c408981401e2730274454f2b0a8cc3544a543a36051c93709e75d177c5674a8bea2024cf2fcb0920b31200b4c40b2820129c2842f3408ffb17130e12331e18b0cc2dfcd0e267c9449380fbfbf295f7635e74b3fa3d36241512365ccce8fc19e538cdc8e36e9d996c9054ba696091fd1755b26bc10c811abdeb152ccd40140db3619638a4f2be62e4cd39d2d9f8b13c4d98e3509e7e5275fd152ab5ac833ad09401f76a41383a39da3eb75cb9ca8f2bfb738bf79e4390ed706aa9c2b7c6c6a9be3e6b7388dbbe1b2a1c76792f571feab462a97982f246e10256aa578ce9d75c6d1f2fb05cefd71ceb1d039f60d540b188799f2729389702b3e309c4d8ec7301f64c2bc3a12cc7587d987ed741a7a6e35a78f1852dcecbca942cae5d36ed73bd7b689bbeef35b99fa1820af0855074c8e0998db5a61705b1fb408e6b6261a84e78aeefa4c8ebb4f7542714bdf5d87ba1e1fe1f657d75bc9cc63eea9df8ed5f226999285933bc4a4909e242bf124996c12cc0be4557e044fc0054f3109e6dd38abfd081e870b9e8a095ee3fc6faa099e6af2c129844fc3cc7fadc1fc6f6f19ccfca7639aaf33689e1d50f3624cf3f506cdb7b50aa6f90c4c789941f884d6c184cfc4846f3008bfa45d30e1b34cc27989cd978e856d1ecdc6846f8a40780926bc3c02e1734cc2b9b33ad44fee9c8a0b9e6b12cc6df9303f8253144cf3302ba93058c951ed8359c97c93701ebe922195103e1612a212b200c3c477a3ab5509e1a183564278e969637d6f21867a2b86faf070a81761a8ab4ca8d746863a3e75befd4d8478d6aa3664ad733a05cb5a8b3137b62d0237b60413be3d02e1a5988fdc11d2472ec52c7267481fb90cc3b1cb80c338ad26058e03302bd96d72c09d8359c9729370aecc117e90a4a8df1e88093e32a4e08330d64745607a2b4cc2794df1683f5aa7a8251e8c25e23186442cee122c115762c28f35086fd13598f04330e17b0cc25f09287c1526fc3883f06bba0513be1ab394e323b0943598f0132210be16137e6204c2d7998473e776123394cbbc273168b9bc8dc1a591c12a3fc14ad0f5585c4e36c585dfe8e3796b90779561ef3ac5f42eee345639fff29cffeb6a8d11f23b7c4f842a413688161b302d4e3569d10e685129eb286b04fbba6bb011d3e0349306cd8006ab9cb2ac4af410072b5e37615ee274930bea11cc4b946379ed8c08f2daa198e67b0d9ae7f50ca6f96198e66746a07905a6f95906cdf706d4bc12d3fcec0834df8cd9e73926fbe483732ba42f5be9f88615d20f8d936d03f7da72711cce2639bf67009fb54e08aa70fee21387b63ad73609ffb24b748e9689abeb03fab42d98fee79af4e7bdea498da63937aa856755711a27e3b3d2d03feefa6cbd9d53294254cb8163b7c5e4c6af9ab91dbdbbc59341e2b4d514276e20e7d5dcd01a9f7cc7a7c6d9ccfd19e1fe046b7f1e8e19d90506236b14d0c8aa30e1171a846705145e8d09bfc820bc7140e1db30f3bad8645e037c650fb7f99ceb1c8be43537ab1cc946cab0a39c631083d98e19cc2598c15c1ada607660efbc0c7be7e5a1dfb9134bea2b22f084bb4cc2f918c3952cdc18c36e8cd45518a9ab39a92c482a18a723304ed744c0e94893705ed65dcb6a97755f8e0e56d61d6512cee7685cc742ced1381a937c7d58c9c71824e78a1538ab5926a6a22f61c56c6e4d6136425e5fe4485c230a9f2a3655bc213975dbfb44eab1c41b4cd66f1c4bbc91f1b1c4018c45a61936ce782c66823f3398e0ae31c14c708f49384fce9bfcf8811b71c1c7615adf6cd07ad3d8605a1f8f697d4b48ad4fc0b4bed5a0f5cd01b53e11d3fab6905a9f84697dbb41eb4bc605d3fa64cc95fc3cac2b3905937c4758c9a762a4ef0c49fa344ce5bbc2aa7c3aa6f22f42aa7c86c9618b858d99dd7dcb6d337039c1a778dced68dadb54921b5df33d0cdb5a2bb50e9803de8b65af7b0dd9ebcbf1c1b2d7999845fd32ac459d8559d47d212dea6c93606e51f763c9a40bbf07177e0e06fb01036c3e552608ec7331d80f86857d1e26f9a1b092cf3749e60d8b87fd24638a76d40526c17c2ced113f82538ca55d88b1f85558161761921f0d2bf9628cf2af4352bec42498537e2c24e54b4d8279b3e77116bed9731926fc371108bf1c4bc5df864dc52b0c9273c53a7bde216ac36aa574db4d045fb1f484c98e8ce5e293cccf62c7f0fa62e5e895a674e7c5f4537eb2428a251a5761829f0e29f86a4cf03321055f836581df85cd02d762927f1f56f27598e467c34abe1e93fc5c58c937607eec0f11f8b11b31b59f0fabf6cf4c92b91f7bc18fdd3d890bbec9249857985ef423384527dccd18e89722007d0b86e38f2171dc8ae5ef9743e6efdb30ceaf84e47c3bc6f94f1170fe3986e3d59038eec004bf1652f09d18e7d74372be0be3fce70838ff02c3f146481c776382df0c29f81e8cf35b2139df8b71fe4b049c7f89e1783b248efb4c82b9e77f8785f4fcf7633cde8d80c703188fbf86e4f12026f8bd90821fc270bc1f018e8731e11f4420fc119370de4efc9b1f24291a94bfc26cefc3b0b6f728c6e3a30878fc1a33918f439ac86398e04f420a7e1cc3f1f70870fc0613fe8f0884ff16b3bd4f43dade1398d69f45a0f59398f07f4620fc294cf8bf2210fe3426fcf308843f63109e2bb6f7e333c832dfa711c50aefd43d1a5ff8b1d2a538b1df61e6ffef90e6ff7b2c9dff13413a3f6b12ce3b0abff4a3758a8ec2e74c0624b670dcb04f0c88ce70be32913276857dcd785718df4687424bac03ec0fa624e629f18d9f24fe1a4fe2e74d82799de05b16b24ef00226f9bbb0925fc4247f1f56f24b98e41fc24afe23e6007e8cc001bc8ca9fddfb06abf82a9fdbf08d4fe13a6f64f61d57ed5249977fbf00dd8c274fbbc6612ec7eda205c6bf6750c74834478d07fc670340c89e30d93605e836ee447708a1af49b18e7ac909cdfc238378e80f35f301cd92171bc8d096e1252f03b18e7a62139bf8b716e1601e7bf62389a87c4f11e26b84548c1ef639c5b86e4fc01c6b955049cff86e1681d12c78798d66d22d0fa234c78db08847f6c12ce2bfeedfc2049d142f8c4249837d6dafb119ca24df3774ce30e2135fe0726b86348c19f9a048bcf1b2542d60b3ec324770e2bf99f98d17589c0e8fe85a9dd35acda9f6392bb8595fc0526b97b58c9ffc6ecae4748bbfb0f26b86748c15f622c7a8565f1156676bd2330bbaf31e17d2210fe0dc6a46f5826df9a24f30f17f5f3938c293e5cf49d4930af46f70f598dfede249877e00cf023384507ce0f18e4816121ff88491e1456f27fb15c3838642efc1f66ce391198f34f26e1bcf8de2f64f1cd5bac461c4342e2489804bb9ff90b57b96b80693c2ca4c60d31c1c3430a6e84a11811124516a6716e488d1b9b04735bce8bc096b331e1f911086f6212ce1d474158c7d1d42499fbfdc2907ebf994930f7fb4521fd7e739360eef74786f4fb2d30c8a3c2426e89491e1d56722b2caf8c0999575a63e63c3602736e6312cefdfeb8907ebf2d86637c481ced30673721a4b36b8f693c31a4c61d30c193420aee88a1981c1245274ce3292135ee8cd9f2d4086cb90b267c5a04c2bb628e637a58c7d10df3fbc521fd7e77ccefcf08e9f77b607e7f6648bfdf13833c2b2ce45e98e4d96125f7c6f24a49c8bcd20733e7391198735fccefcf0de9f7fb6138e685c4d11f7376f3433abb0198c60b426a3c1013bc30a4e041188a4521510cc634de3fa4c63958f65b1c36fbed87495e1256f2102cff954690ff8662a49786243d0c13bc2ca4e0e1188e0322c0310213be3c02e1b998891c18d644f2b0a2fba09045773e5674af085974176045f7c1218bee42ccee5686b4bb22ccd91d12d2d98dc4cc625558b31885a9bc3aa4caa3b16cb226826c320613be3602e16331d8ebc2c21e87a9bd3e02b5c79b84f371ef323f299962dc7b8249305764831fc12976029e88e1d818018e49582a6e0a9b8a9331b5cb23507b0aa6f6a161d59e8aa97d58046a4fc36ca422a48d4cc7785486e5518cf1d81c018f1998f02d11089f8931d91a96c92c4cedc323507b3626bc2a02e12598f0ea0884cfc1846f8b40f85c4cf8f60884cfc34c65475853998f49de1956f202ac42b92b6485722156a1dc1db242b9c824984f193fc28fe01453c6f7c7041f1952f062acda7754c86adf12ac6e7d74c8ba7529666fc784b5b7a598e463c34a5e8649de1356f20198e4e3c24a5e6e92cc37a43ade4f02de880b3e1053f984b02a1f84493e31ace41506c9b97d9cd304df443df3ab72963177ad0b5fcd5218f1ba9c93127c92ba17566e5f1e57febd691a8d384af02bcbbc0ee8e4049f3842a705b612e860935df19e905312e1b7505b89093f3502e187988473c4a7191239afaf2711644ae86fe38980bc6d155683393d821acc6a4cf81911085f83798ebd613dc75a93e7e8c773d3bedbe48a6f745f2e3682af4a994716b14d423ffebeea001ee44c3f25c4589cd93a2c35ce0a9b1aebb1fc7036457e28c3de760ec5db36608ee4dc081cc9464cf8791108df84093f3f02e1e598315d10d6980ec5aab817260c1bf0ef15a77c23e9a54e36e259d6cdde95e2ef1291f17986dce03ce266ef929a90c9ef422c16055c9993257788d023c4d7589688bbeb1d89db4576e47293cf143b47b5adf57a36537e2986bfc17d3699855d77e2eebbeabde3ea57e8c470558a5870f7b19df19d5a936f2f15ee4cc9f44a5de63c551ef00b148761d42f32511fc6b0ca42edddf35c96b39cb36d86bb2ead52f0f9e1205a57605a5f6cd27a5c8dad78371d5f2a0a870a119b72590470ad4a9cbfdcc7394d9d325c1caddfe385c616e1d2f9b74382c4a8128bd125a618cdd40a3b68696e1cb638b457093b2b63873b0fad91f1dc1dc04abd77a28ae9662ca6979a623a31454c93b693ccb7b5d304e635bfb1ab4b4eda82c5eb3253bc4669f14a6aa9c74a55c053c50bbb53b7dcb5158bc9e5a6988cd16202f347f8b898a50589cde1586cae30c5662a9a2e305fcd63ee37c34ae55782fcda1c1ecfbae7a72a2c7e579ae2373b8007af5bea05971e24b6d5586caff2e33d52d96630ef91aa14a88bf7d886c5eb6a3f792e95570c9ee7ccd282c4663b169b6b4cb199ec2bcf4d7588ae9765f59648f25cf24e90b8edc0e276ad296e93b4b879f3398c1fcf37fcbb83bbd902c6bf47b6068da95746749e642716b3eb4c311ba8c54cb7bb8d323fcd13f97d23e3df808b260576617a5e6fd273ae2feb9a259adaee57acab6afcfa42e7ef1935f5a77de9e5776371bec114677c731fe8b7bce9b459b663527983201a1f81697ca349e309815b164aef8dacf69e5c783964dac12b48ac8ec462f53353aca6a7ada7cf14beb952589eff9ab9b91c8b2ae58ec2e27893298e23d194e32de5b54e2015d779e29bf03384bea61229ea32f5682c1e379be2511cc24fec4bcf700c16cb5b4cb1ccf3ddee9895b63e14852f3f16d3fe5693f60501ea7341f5afab47d883c5e036530c9604f0ccaec5cd30b4dfd34bf017262a1b3c0e6370bb9f544c557b0d9a8a75f579c76331f8b91f5f81f5bf98d26e5ff6bd9c80c5f20e532ca7f9f2884b9cc06b85b66b8455eddbdaf989580cef34c570bc6f6f18ac7588c7aa2ee5d849589ceeaa7b0f463acbcc6409763216bf5ff8c97b41fc265edba0efe13d058be5dd7e5a2d143547ffb1aeab573d158bf33d98e5062b1b4b44cba0420ca996b354f57e9a343d0d8bdfbda6f89531da31ab6d6c91a8596f946352cb447f42b9f37bad885d5dad24bc073b1de3f44b13a7a5c49cf0b1bdd484c2733803e3709f89c3f27dec03a8bdc35e8cc6fd261a337c956bf3c5940a5e0b517e01ef47cb549de44c2c9e0ff8e933d06b22d3454c6b9767b01fc0cff568eb286761717cd04f1da5761c93ad6cae270fc77df33a83172b75fede2aaefb8b5ddd7ab4cfc6e2f710d69b952a7eaeb74e3ee0bf6e126daa9d83c5ea6153ac56446c9958fe0b1a3e5a26e7624c1e313129ac29abbc730bb00fa07bfb2ecb9db0bc576c9db17fb9eef592f3b038fc0a1ba330c56181d072a728630ef3943bc9be7da53b8c290f11844990989d8fc5ec516c9c2c78eacc9275a92dac5a1b6f32d72dbdd36483c4e6022c36bf36c52607ad1f7b35f0a691a9d721f92de820da5e8869fb98bfbeefe45b838cebc1e752dd89268e1761717c3c7c8a54479e221763dafe06ebfbc5c758e03456af059589b121b70d517b3e54ddbdd42598f6bf35693f27a0f6d39d2b5b04f36a999bcb6beaf87ed28c22bf5f8ac5f809538c0f09645de97ae3fcc5795f91b90c23f32456ea06f784d5ec70e7ea7c47cc46f9ec76613151e5c6cbb1383c156c2ee57c51f3dde4b46fbdfacf7052b85acc584ce72783687d05a6f5d3fe7abecd5e3ddd0ca9ba79753fbe26dbf997483477fe9c21f23b9f5191ccfdd52cb7bf734bf842b71630a2a6ef6084a79f21799d6b50e9e42afee6d21a4fc827eca796f08c03b07103e6fe0c4e70f8db6463c5f0f921e5c5ca40bead16df9c2a135651255ab3231cb2e5e229b534215d2c4cfd2523408f098c5dfa38a9a50a7c56f23a91cbb8df5deb5850b68c9192e5901ec049d7b798fe8ea76a7b99aa0d720732b994ab2ed6945e8bdff3b73534db50e75a64614f8c497757c002390722d1d6395905b06d9655f92d426489744e69dfaa7f2e4a7feb702140b5d3d38a5b0a1a7426715d85a9b9d5c62ae9667e7410656735c8e3a9f12c25b21e02d92a96277eebe8963a6f592ffb2d660b1fb59eb98b8daa9dc8c4016493c14990cfd909323f1620f7f44a82fc0325c8d61e90bc46c155d8287d274716075ccfb44be27a9edee7295cb00b802b7d1073a799c50159def824b2172891f1c24ed541f5c2a15c8eb01ec178db300ed8f6344a627b91125b476169dc9ea095950a111b05d02a59458d4b269d372689ee254a748d053ab7d7bf2a265590b74627e1fc91124e3b01c7dcf51a371f76fbb824b49729a17546dd7e9c33e45e90215fa1c4d7c937be5db169333c323609ef4f7656750b6301f2897e4990af525775554524be159009a002f21a25aee6c2ee6688de95ede2f5716ad2f31e3a85e9754a4c2d3dd9934f1b8a5be369587612d59f2951b5f264c06ae1fc794f9b1a1d8e03ac26a0cc7c83125657b4ccd48796e3566b7b0bb43cdfa444d8bf4e08bd5592f858e663939258dfa2c4da81f96999c6a7267794a8c9656769c2f55d32ea3ef2108c363e46c22b301cec5671759ba8b2686326839c20d669fe1738e69193a26291e3734c21c7475d2e2740c7534e9a523cc74737694ea83ee9304f17867abac0795aef30c9495b54e704ec9fcaa943133a2790a7c909dccaccf1dd1792e3b3df37a78ea5764e8445557200db3cf09cc75ff5f6ffe763cb797c6cf91d0e81ef1bc67fdc72f35dca72b3974c63772ac16656814e84a9bd687d151ba5ebd3a3963ede2d0b559969d2aca9a7549dea27b2752959f9c7425495e4af9468bb18d0e2333f56f1cf8dd0e1ec4885f30596c4f99e4d380b6289f34b80f37d9b7016c612670ec8ec1fd884b3289638e7039c7fcb04ce8d2850a83ef79d8445510b2a9c0780ccfea14d380b6289f33880f3a34c0c1d6130bd9639920e65372a947f04283fb60565612c51ce063ef3135b5016c412651f80f2eff4f35c56b1d18c2f15514ba94b441f4599d352e7f7b68a7e09fe40fc401e06b2f73f32314e8c173cd8be5fb5a6444687b50d15d67100eba7d4a3c6aa67865be146fe6d85ccd8e4042a78bb00bccf28e1b501f0caeb4d963e08e0fbe7be2c66a038d26c9c4d85f26280f25fd463cfab0424371b5765ca0a5752a13b10a0fb9c7ebc6f9508e26ea6806da1406881e3a8304e0518bfc88405e6d51b0b9c04d0fd7bdffa415794bbe82f8f0ee53d54280f06d5edff642233e77baadbea76862c92ac38990b2cf2cb7d5bd986023354d92ea6c29a0bb07e95898c8e1535de0a0f614627b3d03e00e5d79428fb3138a21c74649987e52ad79ac113839ef3d300e26f2811f341f64d9ee914534503b1d65acd18b4a79b0068dfee0b6871ec84c806d0becb447113b4b021ed7b242b6e8a4065e87b1bb1920e3490617d1b58eb0f360dd0928e289215332f039c3fda84937444910ce78f00e77f6dc259184b9c23810ffd9f4d388b62897319c0f9932d238bf994354db2def3274146670d2c4159184b94538155266c4159104b94ff0456d9801265dd87698b62d842da0ab036dc9716eaed391a1bc39ea3ff02948d2851f24963de163a9f8feed220c3d68a0a5b23802d8b129b5a22922fbaced630be2b2dff4a4086fad4c98626ce06001b53026c2aa4c1152d8635f931a82b7606c0b22981a925557ea79a127a3db289a61300cc2636c11c1343982301cca636c124ec4e23830977986866134cc27a2219cc110066739b608e8e21cc2200b3854d30e3b8d2a110c06c69134cc2013332983d01cc5636c1249c4a4006b30780d9da269884cbedc8600e0630dbd80493b0338d0c662f00b36d266062f385f4c107c26c4ed69cec0e60b6b3092661014406f36800b33d254cff93a6093338d9a4e9e90063074a8cbc637a2b98b396dc1d26f9d9cdf875e5b607f83a52e25383b3792cf91d18ae6eed2d90e23ce12f1fe0ec448953edee53e104aa60de254df8206dfc06c34ac0b86267db801296e164405f0116da8512289fc6e91dbba98ee1a86116c0d5951297da92c93b497aa6b443ef5669250cae5f24f6956496b818a0ed968901597f53f9093b80c94af1450065f7cc0ec856637b31c7a0b46e01b0f5c844e686ed6cfffbad1176624ca542fb3d40db3313f54aff7d9571ec139a0970f6b20927e97e6b64382b00cede9438bbfbcef8de2fa51342fd9a0aeafea0aadec746a884dd1b64501701a87d6d844ad8a82483fa0790fdfbd90895b0614906f53900b53f2554b59c54b5d4f9efe4f7b1fd7ef99910f1c90922c4eb81331860cf1456c2b174b216d3df81b50edc9743195e94a4eb28c8606e013007d90493b01a4506731b8039d8269871dce3602380996313cc38ee90b519c0dc8f12a6da887114ab9f1b31560290432841c21d0395d40cc1231bf09d02e00dcd84158eaca756580e400ecbc43a335561e7d5f19d60254ffd1a602b0695f4e19458fbb0da9574f7bb244b58319bcba63901ab45cb875f83dbed4c753428a7c57b2315dee500ef084abcea3b4cfcc51b045c25bb9c722d5016153806b27b2e75a1c33f62b48e6d627c3ec774e67eb3a75cf84dd261e08154f03a01787994f0d4d68c66ab2344d78c0a5d03802e9f121df7e87e3f0206c3c4cf071e03901664a2e4f6d30fe4ddec89b01ba3980a6b4750b414da8895b477880ceb63c05a8bf6e53c8ff8afb3e80a508eb477c202215ab2090b1700b4a33231c28e65feda73dbe338bbfd5700e7689b7016c412e7e700e7189b7016c612674f50d28fb50967512c71ce0438c7d98473642c71ae0338c7db34d92b3f960bfae701df39c1269c05b1c47924c039d1969ddef229774720eb2a7e0ba09c640bcac258a25c057ce6645b5016c412e50880728a9dfb0f12ceeb205b49b41064f6a999c00a575aba1f58d8560f575c1600acd3ec991317c79947bf0528a76762b20cdf9fd0bb9aa8fe8caeaf01308bf7ad5dbaa2dc2f52117620936dfbb80114483332b16f66a1b0bde40851866c916cbce874608b332901f664fad4ec54ddc6705098b4d3782c15d8b5c03267d9b384358e7388c7021b9d9d89c207568f923b78c05949f15d5add05c02cc9e4ae09eb7c4cea8ae39eec9d41469f631b50c2ba2619d08900e85cdb80c671dae15720cbcfb30d681c779e690c2c747ea61709fae90489e3b7fdee0456bac046a871ec59ba07405d682354427f4a06f5260075918d50e3f895cadb00d4fd6d844ab894950cea3b00ea621ba1120e8290417d1f405d6223d4387e82e93500b5d446a8847b7f91417d13405d6a2354c2cf9390411d0f2affcb6c9ad1944ff9e91cb241bacf808d1e6013ce8258e26c09ac73b94d380b6389730ac079a04d388b6289f32080f3a04c2fa3a9bf9bff1c02b0aec8c40089bf890ea49ff8261b6d5a02601e6c134cc26a3d19cca100e64a9b60c6712bdf6100e62136c18ce3a0f2400073954d30e3383d6c3080b9da269871dc98aa1f80b9c6269871dc986a0080b9d6c685dba413c18ba9b02e0658d7d9889574d50719d6f75812eb7a4aacbd0d58cdeda359f2918c6d42bd940a6e1b60b36536c325ac4e91c1fd0958ee069be112166264703f017037da0c97b0ba4506f719007793cd7009dbff6470fb029f5b6eefae2484bd0153a9d0f600680fa5deed2eb9c965b1735cebb0d8c8e6398f6ca403d7830a5c2b90e10fb3a94f9f740d3d599ffe8b0067854d38497b4cc9707e037056da84b3309638f7035e72b34d388b6289b314e0dc42897318337df310eecde8ae5b76572cf3b29c47e62059aa7bf776543d58f15dc97c26700a5b29b1f70f518d82dd2f8483d34f52415e006cfbf03840269c3d4506391f40ae8a0364c2fe0232c83f03eea23a0e9009fb0dc8205f01206f8b0364c23e5b32c8af02c8dbe30099b0ef960cf22d00f28e384026ecae2183fc1d80bc330e90099b276490ff0c20ef8a0364c2414a32c8dd41156e771c2013ce422483dc0c403ec2964deb483b28c9566b3f0d9cc291b6a024ed4d2343390b58e551b6a024ede72543d91aa03cdacead14e3b8e27507c8ecc764a270527b5df0c0fcf1ad8c0f28ba1fd65aea28c68b24759ce63cc837b5db21ba2cb7b32ada5619d9085a1eb0dd63e30099b0554606b91b80bc270e90097bcac8203705908f8b0364c29e3232c8df029f7cbc2db506d2d5b264b5860f00ca136c4149ba52960ce51890f54fdc971b34666c0add042a940381559e4489b29d44c9adcebb3b7086f661259bcd550a109e6ccf5ed5715c3f733e40790af5d74c2b9cdbebc48ee9706ec2420176770c671ab403f04ecd4456aebdd177dcb3f21c80f0344a841dd2142c2aa6a4d998ec63ee0300c6d3edd9259db09543b64bfa4a50d53983fefbcedc1a37303eff6abb5021b98532e1478ac93c621b60877bf76d471d1498a1e913c554588703ac675262ed28b11639ff93d3d84b587df99ac45a00f22c7b369a271cd924ab39ae0728cfced446f3f5f52b27b301cc73286136714ecae5b070b11c028e5f31d30ce03a37132ba5544f6499f10307585f4f1cf73fbf14a03dcfc6c5eaa423986425f82050ab3cdf46aca4d315c8b0fe0558eb059974047cfa4c353ac5a63eec93b60258ec85367dee95f443ee649f7b2d06967a914d3849b7aa21c3b909e0bc3813df32e3b54fee2bd73b81b68bac9f911a275937c71900e02536adf523dd8c86ac46fa2780f3529b70926e994486b309287c2eb30927e9579dc9708e05382fb70967512c711e00705e41897330abdd8be49dfee24ee6ae147ff31ae8762132d9895c2aa8656084b2880a763fe059afb4651607691d94ac6dff044079952d280b63897232700157db8292b42a4f86f2236095d7d839b93b8edf33d90eb05e6bcf2419c275f864431dff0128afa31e12568dcd32514daacc5443936cbedb6400effa4c646fd545c7916dacb95ddf266e158202e8064aac7d0dd9dbdd1a864f58d8cce6883ae7d6947d4c8480c97a981a02bbbdd19ea1e2387ed8600140f9339bfa3e49e7b59359e62100e74d36e1249ddb4e86732fc079b3bddb6e122ecb229bddf92c407b8b9da39e84164b36ea990065ffad99980e56584fa783ad06f6799b4d9e349f32bb9379d21900e7ed36e124fdea0e19ce4301ce9f67e28ba4c9594edc43ba42ea5bbbe9df00ea1d99f09d0a6a79caeee4f8f9cedf039077da02328e33ee2e0320efb20524e14e0b6420b341b5e817b680242c78c8407e0d2cf26e5b4012f6c193811c0e2cf21e5b40c67103a02e00e4bdb68024dcf2870ce41c00f297f68c0ac5f10ba31f032f795f26aae7413b37e2d8b5f100807abf8d5009c72fc9a0fe12407dc046a884b54d32a8b702a80fda0895b0e64906f56a00f5211ba112b6d4c9a05e05a03e6c23d4382ec9be12407dc446a871fca4ebdd00eaaf6c844a58e52783fa0b00f5511ba11256fec9a0de01a0feda46a8715ccdf97300f5314aa8dd58ba0f6671e5d507b2e2fc31ac5300d2c733d1dec787e4e2de4f7f0440f91b7bf65822cce8648b0f37815ea8df52a2ecea9cf04c0cb3b6f77b7733d82ec627e0c01064406fa4027a3cb0cd27a877a2f36ec2b2d491bcdeb9c205ce63ee2c918a1866ef9600e19399287c5417332f6276cab2db9bd133d4f05c4985741ac8e64fd9338596b05f94acb37903b0cea76d9c4947baf688acc6d90e58e8333662255d684886f5d7c05a7f67ef945ac22e12b229b50b81c5fedea6a5dca45316c9da47cf034b7dd6269ca45316c9707e01703e6713cec258e2ec0532fb1f6cc259144b9cf300cee76dc239329638cb01ce176c9aee4dba8510d974ef8381ef7cd1269ca45b0891e13c01e07cc9961d1af2633969ec7580f28fb6a02c8c25cab9c067be6c0bca8258a21c0250be928921387794681e337dc4a4be8c179d0cb2fa9f32b1d5057ff106619d4af66619247e9d740900ef554a787cd398adc0fae6899a24ef794feefc153f7c1d00bed7ecdc088870dc926c23a05100ebeb99d82a951729d03a33b44a986c70ed5400f0cf9900985fcf009e0800be9189d51bfeaae2f1abf2dc0c40be690bc838cee5b801807ccb1690715c73791700f9175b40c671cde5ed00e4dbb6808ce39acbfb01c8776c0119c73597f70290efda0292b027920ce4c300e45f6d0119c71e9f8700c8f76c0119c7cf793f0e40be6f0b48c2959564201f05203fb0673935610588acf7e71180f26f99686517d5b356f65900e08799183ff4ae9e709599c1dc5d8bd5142bf29e70b2c9ab1301ce8fec99ee4fd848249beebf118cd47c4c89b2a744b98d6d726ee3df672b15999ccf14de208455d276638ca602db1fd8e827d45f4f87beb254eeaecdb3f632f177b9f37badb0d1f8153d1d01c6bf67ea53b62ebc558ebad5d21ed7b1c36a4af0f88e201e0560fec39e49ff84ddbd64763908a0fc34d3b3d3fd7dd992102bd9972dcb4071f45926b2bbbf4a7b7e2cbf8dd109c0fca74d30e3b8caa73780f92f9b6012f61691c16c0f607e6e134cc23e4cbab91900e61736c18ce3f7305a0198ffb609661cb7e16b0b60fec7269871ec846b08607e69134cc26e0f32985900e65736c18ce3beed0cc0fcda2698716c58360030bfb171d933e98cf4622aaca300d66f6dc44a5a9127c3fa5796c4fa9dbdabc9096ba253a9d0360716fbbd4d2b2249eba2647d9f2f014bfdc1269c05b1c4f903c0f9a34d380b6389331764f6ffda84b328963897029cffb365291f694b896c1acd5320a3ff640bcac258a29c01ac927fc3d60a9405b144f93f6095094a94ed587258d8bbb95e86e62491d52ff703081b5022acfb923ec2de78b2257dbb01d686b66472d2f14bb24cfe2e40d9c8169485b144b91a143d59b6a02c8825cad10065634a946a823647551fbff05b02b277762640e6d75390b300c826990039b69e825c024036cd8497f4373f2e8e333cd60194cd285106df808c70888d6cc7ac690067739b7016c612e73900670b9b7016c412e72a80b325254e1e033eb2532d8b1d3efa532c477ae2d74bd91c606b654ba59cd43f9295dcbf01285bdb8292d43792a11c07da376d6c4149ea17c9507e08acb2edbe44e9ad4fc67192eb3f00ca7694283bb064876fb28da36e67a88543867108c0d89e12a39aaf916eb9df2cf900ec02265df0b7940aed6880b603255aef9e97eab85808db22771aac2f2b7d9703a81d29a1b60650ddf593d599caecc554f08602789de82d32b9bf259f82b55ddade6102e334cf1aca99ce917f896a7d0ccbf4d6006a674aa8ad84b4e45ade69ceef4d622bd172f11019ba1e54e8da02745d3231e2187c6a6b1cbf76de1f54d8bbda889574e20b19d63780b576b3a98f88743097ac8f6825c0d9dd269ca4a39064384f02387b64a23de41d85ac2feda1a50063cf4cb487ea367f9d70210bd9fca24b00da5e99c8f0fee7af13362fc93a8bef03387bdb8493b46b8e0ce7bf00ce3e36e124ed3426c3d915d441fbda84b3289638a7039cfd6cc239329638d7009cfded6c2111d641c95a487f033e74804d557ad2156a6455fafd01ce8136e1245da14686f3588073502666c56193b9bc9619bf1ecfbe00e4605b40c67138b81b0099630bc838aefe190340ee670bc8387ed962180039c4169071fcb2c5e100e4505b40c6f1cb16cb00c861b6808ce3972daa01c8e1b6808ce3972daa00c81176ae93242c7ac8d649ce07587329b1a6db344aefe2206c899375705c0f60e6d9049370a7573298370298f936c18c63d7dbb90066814d30095be26430cf03300b6d8249580091c1bc10c02cb20926618b9c0ce64500e6489b6012b681c8605e0e608eb209661cb782ba06c01c6d134cc2b61019cc6b01cc3136c1246ca193c1bc0ec01c6bcfeaa038eedafe3b80725c269609f0ad2494d40ccd811b47056f0580373e133d45dea5555ce1fab17d440e00398112643709b2c209c433339f28b853f60879b336ec25226c3e92adff9900666e4ccc846d8ea9a7b6b913d8e6244a90ea139e79ac7e7dc2730f0038d99ebd61e2f8f185f100e5144a94b5bf39b9cca131dd517abd80ab8edea555db85b5127a4bb20556bd01d8a9f6d8681cbf9d5606504ea344d9d239f16e2c9a5c47591dc3719dc600dc749ba6ae92ceb1246b247e0a7016db849374d91419ce16a03e39c3269ca4db8a92e19c0470ceb40967512c711e0870cea2c4c94f7860befa2c7e989a029f38dbc6e9fca44ba28aa9b03602d657622356d2857b64581f14d69a9da5099f594bf874e1c1b80f5b27f477abd623d82c511b2c1348d639e7f3445b661b5bed0059e1fc0b96162b9d7fa6eb09d1b73983ed625bc5552e6fbd905de9dce59a55b33cfed5eb39dc341a4bd3c8114fb9cd800d8e9c8da2f554e6a9c3e624d26d65e14aa970fe5ee75cad608b40bfc1426120bb9d30bcca0a7b146608f9de1a73ed50f34499b0c3a3538e58d50c439502ed9689bfcb9ddf6b456af0c44b887e0d4e63b3a3e37c116e8dc3678d3896d684cd1dec044b8c727eb92dcd11356dcc1172616fa53c53d7d3cbe4a9955ada5c9e2409736ead88ccced2c5a8a4263d3688dd5eca84d492b4314d1f3fdc665ba448955cde1f5bafe33f8fa7bb4c7661a69d137c4fc9a54ecabbc2f9be5a55a207b34a84c9fa7fb82edcf421120300 serializedProgramBytesString: - serializedSignature: 84111d6724d392eaa1ae805780e5c3d4a8061bd43a6cc1f8f85cf4bcdd74e8c729bac8b0903f9ad3cf1aeb1533cf47a3f36ddfc0adf1d152673d79648aef5f0f + serializedSignature: b332976333778bee818354cc5f91cf03d3b7a8a59518d53c47f64d2f2865eb927d88b6397d201b7ca370407b920d72ef3d8ab271904896d72f11e5e3dfd26b07 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset b/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset index 7327a8c..910ca36 100644 --- a/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset +++ b/Assets/SerializedUdonPrograms/5c320b13b077cc5498970193f8eaad45.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d07781cc7759e230982007befe49122454824019000ab288a24085260170a29b18804d108114d0058a0debb254b965c645beebd48969b1ca728dd49e4c44994ee244ee214274a6f4ee2c499f776f6eeeddcbcbdddbb9bc32e6ddc879bdbddd937effdefcdcc9bb733b363aa84fc4bac915f4745a3a81395a245b48b7ed1277fd5c9b4577e9c23f7fc113128d32ef9dd2aafad11c92c77c2dfaac43cf9dd208f86c4b0bcf382689369375e6f121df27783bcb7431ec1d94ef9df217325c6c99b5ac46e71581c127313b3b390388a370da97309902b31417eef1223f26a0732058554e1a5b9f2ab495e19c26bbd926937df09710ac5ea95d7dae43d83a247d23c8b14273c3553e00fe12453553a56a57be4ff78f9ff14399652241e53c7d355ba57fe9769f7ce52e93445e36ddaf5d9e45ed3f5392a9dc15c9fabd299ccf579eafcd3ea78814a6ff4e1757e165e6fccc2ebc22cbc2e0ac8eb62952e55e912c573893cfc863a37469d9ba07e53fd2555da40645d42ce41ba4f95f90c3996ba1d534bf4965079ca7cca5ca6d2032aefdbc931a5b35c5d7f56bb3e5fa55769d79768f956a874bfcaf71c3986f4a03aff0e75bc929c87f490bafebc76fc824667bc4667bc4a27a8dfefd4ce9731e7cb353c5c1c4a099eeeb94672ae51a37358fd7e1739967a9a40f1a0f735abfcefd6f4d3a2f1d3a2f170b586bf7bddd5cf2aed7ab396af42a5d7a8b449e57f0f39a6f48e697cbae76fd6f8bc59e3f35a8d8f635a3eb7fca3c26b2747353ac7b5f2932a3d4174715ca5abc93548d7a8f416959e54b45e24c7524725af68f94ea97cef25c790deaacebf4fa46dcdb5157afdfd02db8092d79cb4f4079a6c3709afeddea4d9c06975fd25722cf91cff5d8d8eab8b7606a34e8251bb8651a78651874adb348cda54d96f6af9ba348cba547a46c3c82dbf54bbae301aff6d8211a4bb196cddfb3e408e130e6f98b6aaeb1f64ca6d25e5523b3fabe9e2acf0d613178f9784078fd237353aaeee745d946b7cb8d79f55f252f969bef9e418f27f4878db8ff9e4d8bd2ee98c7d48a343fb0553dbe6f66d6efbf5143986f6eb0d2ddf5a951e51f93f4c8ea96d7f841c537cdc725ed2ca794b1d573a72cc70f5efd77f5609afbd9f53b43f4a8e25edb21d0ecdb2c7b4fbba55fe8fa9e3dbd4f1c7c975f73ca5ff8c46ff750ddf6c7d71b54acf937ce755da43cef5a8b4979cab22e7a09c4f04c0699d4afbd43d9fd48e5f084063bd4afbd53d9f22c7900ea8f39f56c735e43ca4b70b6fbf7ebb5676ad56cea056cea04ac3fa58badd0e09afdd0ea9745878ed7603390fe9058d7ff7f805a69c8b5a3917557a492be792f0d68fcbc25b3fe058dad824179f8d225d3f643a699b4addeb9b9ce3e99fd4ae2f0a81d566958e68328ca874923aff19753c591d7f961cbbf9209da2ae7f4e1d6f513cb96dde56e7785a101e5d7fcbad6b776878dde1e03579870fad528dd69dc2ebbbdde9d098e2d2d0fb92bb85b72f9a44ce437a97bafe79724ce9e9e5dfa37ebf4c8e4186ef3bb864dcc7f50d7e7c4a3a93dfae5d773174f97d4578f885cbbefcbe243cfc4ed5f3bb7cdeabf27f411d4f20e721bd8fc1f33eadbc57b5f2aa99f24a99f2dc7cf733e5ddafd207b4f21e60f070f17b50c3e341c59ff2ff32eecb854f4967aadbc786a91f0f6bbc3dac646956bc3dcf94fd0883d1231add57c931a40f89b41d3ea4ca7add296bba8b836ea78f32653d4ae8d0faa4e84edfa68e4b547a9dcaf7451f9cdcbcdbb4bcba9ff698f0fa7125daf92f05d0c5752a9d4864e67875cf5f1f82fe76429feafe71f5fbcbdaf10b24bfc46f46bb4f19ba1d3d21bc6dc4138ac66b044f5dd61b1cb966bce953ce54e1e5e92de71e0817b1f73c29bcfdcd932a9d22d2f643fb9b1dc2dbdfec14defe66974aeb54ea8e41ea159daf9878294960a4f04639226a955e4e153207a3daa0214df7ceecc14c203d1ebee06f15163b2c3be30149c010516cc178e5b0f4c0d61b238af3139308df75f8dd2a737423d1af6616f1b58c2280b91ef9e920e1d021797e2f46532120da2daf548a033285bbce4817f484fc78a91c95c5f64847aa4334cbef01a47746b29d99339b48103ad5ef6994349dc86eaf3ce3023a208f7b90c326fcbe889c7620f70df2dc30c699fbe47076974c2f636999b20fcadfa6329b1564661ecd015eeebc134676d5b45b4a03dc57a18ff6638d8c864600faf15f55d5705c15461e9ec8d0c48f31741a19e8d01a148d750859c2736ebda8c23eaf3103c1f032664a68b66f07ef8d72b0e9278b191950f7429420ade157f77cfdc5632f9fff5e8957b41a5185dde7a22ca2f9010bf42a12733228f88b505232ae1a18d5e14f98e04757a7a988f03bf9ba315f78058cc79ec9ab8004f894cdf2c765f9df834534ca63a7534bb78319faa90662a5087166079a8d4d0ee431269027141be4ecad8a1fc8135272a541863f3382650c82d978e0101c6b4210bdc9935611cc74bfdc5fbbe4bde7241217d1962ec8fb4dee9a3fa630b458ab616ac67322e299343a91e138e2101e6742b8bcf80d8153bb7ab2f42a663cc17d5d9a61a33b7698319dccd6727f1e38044b4c08e208ecb455045be439c745afc7abdde8d73975ad52b581c328895f4e7f64a704b6d4a9882a3c0c2e0c5f1cdae34d684f1a1dbf21b7161506d07303b7a8d37dbbfdb0ed69a901bd6a406f06c75499c614f0c3109f60520d867e5b46a929e1e6d0f82b686660a39f85ca99efdb94703c702a2a33a908509c6d624b57cf2c5e3de526f54c29be7ad2be546eea9913583d7359f564e78153cf44138a18b36a2e228a70ad1fa9b4cabce13184894babf5ea6e06713e82382f43b8ec2c70104e32593858e702633f6e688426f3563e9923beb000c4a770c4171580f85413716853178b4c17fc87f22f8378194f7c1ad7f02f2940c33fdd5427b0c4fbadd689a081d5bd3847b4431c9646799b7022626eb9fde87300476e64ad51a69dc8059c6f53dea07f59feb56d690a9f34c655085abd081e1eb62f455272530e0d5c89b92958864d41b478e61a9919268307f707e63366440da0cb3f2db9ec9327bb717a6e3fda5d2bdedb22796b57bf33ea45295f2f669a788036e42a934120c7b9755630a770bc507fa525193ccee5799cc5e1b4d284d36cc4e9b4a896ff1db2963afa035f1430bb8cd7e0e181332b3b0c56b3393eae36f13183f0710e3ba076d57ee4cec11c8e8355260e66199138a4ec3d772ee6725c5498b8984ab880d2baa461e45ef63caeec6b4c654f26659fc6badba59e25801ec2943b9feb9cae35744e89909dd3021371e89c561b2a6135105a936e06f57296f1e52ce4c05b6b026f8ea1c1694695b589f3aab6e7daec2ce29a9d4a93c45095aa726f3f169b0a03afa55a647a2d9f4d1874e7e3b52ce13085e70759c7423e102de508af3729ebbbe3048e9faae5672bf95e83e3ef6ad920af959fed32f5e6d8803936ca5fe5d8c741bf96c49a09e9b06cb9e017fc1e427fc879369454756840a649d91f42330fb921b2d7a74c23897d5fb9cc714136ffc31845e9417f29a9f2b76911ef24de09a527c52d18276cc67ba1bc8b2913ac9434cba54cbaac1b51925a56d6751887588f39cac51e496f10a55843caed93dd1a2d0baef5e020e2bc47ce73c8d372d9cbd7c9ef247a828eb40e253707dc7b09514d6207d925cf0fa3e4fd889473a55f524edf03dda683799f92b54693954ac2c90a8f5ab6c83c5be4bdc0a5a331a717a23a5b2e4b032e876479ed193a7134592973011fb5197ca44be1f8d822736c5498ef93da1c52f2f72066e789dc2e866b9426daf19a13894b4a14bbf1597112f91b406f6c3003efb4e656a5ecac5b45ed5af1ee1ea4dd25396995df1d0ae10d19926d41c936b308afc79ab34ed59c26f41bfb91eb4a99f3b0f20dd39c65da7aba8e5d50b6d0aeea0c203082f6bf4ac90c75a05cde7156d5be6179d541c7b9de4d2c6804d14ad7e47644a41da98cb058010a1b3514a88c1c0a805335b630e5ca6e5b91bbc1542def12eed37ca79b6847ae2e60ae5e3cd78de8802423292ef5fabf1323b3c0e5a60c2ed33c98b9ac9132ac91baacc1dad0a0d550e06058d544e06348f9f48e069c73700758e2801a1f386d148c032ea1abdbad6ad779e18c0781cfcd1a9f35596b6d8dfc80249b11cd9da93a700edbaa7645774b06ddf45d1cdd4d3247add25203da8a6b5f83a976aa3fd5a9a75b07ae856e42efad0fe53e276942a9aebee17cbfc277d050e31c6b1e52d60734eb5520d2a1e6d04ab71020f33ae49c93c92c752df67e9b55dbd3efd17a976a3fd2ad8e5ba7c0b97146f543c6ba9244fb18464cfad0974da237dd27e5ab54bceafd30e584e37513da86a3f93ad23a3abc2d9788ebbd6855aaf7692596d2a1f2ef54356c2d0ecd5a517b3daa06426b3e9c92a52765d3b44e7835d64f6cc6b18b73f277b76ae33a31f6d1aba4d77b662a1b27fd66d24bb85cb8a826a5ad017d5707ed299cf57eb1165b825a9ff66a03f6582ece7b94c5f6aa184812f11d509aef47c9ba1199b4e49d3862e9c6b66a8db2e53694be43b50abde8ab9d45eb2f47c4932a47afaa451deabb17a5e996792a91832e2559182f3169f012ab70505fcc67a33476123ed25b63f2948dd11d5830607a2e9aad7c2e02b38c1bd56d308ceac6841cd52de71cf88d26071ea88755fe555c099b4c250085c9b284c9214b596132318cc9d87d78ccc7989a70180255f3b0a77b0a6f7ab06a64b161f40e7f6613dc22dc87c885e18f33cd959c6eb79a743b05f98169444ee30c5a388f0dd99db2a9bb3b94beafe64abe8eb3dbb016b58a2b619ba98404d68c30f42bb86a7dbda15a8f0d59adaf311187eab0dd604bee5f46015bf802aee5d0b9c1840e1ca63bbb3028ade6cad9612a07c278e7e4e7a43440e8ca200527e9a4b4ea4efc84297b8da94dc1f86a7711db94bde8f89e4521bbc51d6a30e204f09b5579aeab0b344794eb15be9dd9e9671bc6766617b6336b33d02824cf5cdbb396b38c3a9365401872009dc611a50ff7a144188ba834950941badd223348f7d6847041ba2a93b96130fdb85573739f0b354929f6cb6bcee8b2529d6f4145a49f1f7973f91b143ce10ae633ed41435a22445edc70a6526d521b84aef70a26740d1b9d840f5daf3369101f44f4155183355a477f40e66d451fde899335a4b04be7d98d31c03eacb6905747b8268ba61b026b7a1f6a7a7d86a6ed70cd59c47a934580a6f69b04d14d601f6f02355cab74c0d42ac11386461c12744891e0e1170c919d6715ad29bfc8f1965ad5530d270c3414aaddaae5daad8386766bdac470edd6064ee44326911788b413e88d58b80d72125777b4a78ec23b871b39710f1bc49d34299cb89b38e2470cc4d78424be99c3f2261396f0e47038f5b0eb0846c8bb535d6d18c4b67042351a84fa5648a1b672c49b0cc4bf1392f87526e2e007c234b2cca9593ae5f93ce56d1ce51603e54418cad7735a3e6ad2b21006be7d74b99da37e2c5b7d74eae0a018c67896e32c9d55d6956e8cee946584ab8f37700670b3c1005e9b11ce007670c46f3110df31331cf19d1cf1e306e2474212df65220e6ec909c1b825b05823bc5b52c719c429ae51392d1b13affa0f60f07d2094da779bca85597eb09d933ecbef9b6fbc717d98597ef506e25538f1a238be163763ab1ee3c1bd48a53e359fc519f4a4573ee5330b0e025ae186696784ee73d9e49ef3b9f670ed696bbe2df55e932de06418bb03756edd45e6cc3cbf551aae5e0f0ad8d0f202f2e16f01b09556306fbb4db803747bbc72fabed1a46fd04abb897d5ddd6dbcba1bb8f6ac2308619f066b1f67a19df95ae87e13658887760561d967dad0018ef0b93c091f341186f02454a97c273a1fe234785b9e1a3ccc69f07cbe1a3c62a20ccfb07a82b05ccb13be8903bab700403772c4fb0a40bc89b3bdfe3c6daf99338f813ccda385e3f8f63c393eca111ecc93f0310e8aa13ca1b899e378384f8e6f3110aec2c9a3c55c1ea54799c347c3611fbab11a0e55383935736e7990d21609f5c72c0a807dec4c8bac82d0e6bae0e39cf55ccad37a4e98948cf365edae27d7d76e3ab3239c195a473c3330067350f965132a46658d08773d79be1c71aa3b69521df464b00f5f5e3dd92993ee70fa71316763ecc6d92ace5cc1f09a828d0497851a03dd25ccb332b2f1c1e9e756937e60700b7b03e6bb84ed34a7fc7bf255fe198eed7b0bc0762b47fcbe02103f6b220eaeccfd227f57a68d03fc817c016fe79ae007f36c823b4c84a19f854dfcf48eab1a3a2ed203e9e55ce4cbe9349503a41e0e22c0084fb8cb4418daa147fc2ab75ec05d7c01e738a53e9aaf52bb39a53e96a7526fe3083f9e27e1f326c220e1134108fb0cc67b4c8421e8f96410c21379c2bd06c255b890057ac0d10bf0391b4600bd4e8c8dba9b81b9f9d36133ef933df3763261027f4f9910357676f07e8d8ac476913de067531aaeebece38cfce93c8dbc9f23fc4c9e84074c84a1ef818d7ff3ed7b6ee7b87e364fae0739c2cfe54978c844186221ef0842d8271632cce1fc7c0170bec0c1f1429e705ce4e078679e705ce2e0785701e0b86c220ebd236ccc9b57ef38c2e1f19e3cf1b88363f9c57c59be93a3fcde7c29dfc5517e5fbe94ef3651066f1bdec491afb77d0fc7f64bf9b27d2f67d41f288051dfc761f2c10260723f47fc430520fe0007f887f305fc418ef247f2a5fc1047f9a3f9527e98a3fcb17c293fc229f1e30550e2a31cf14f1480f86326e2d02dc11b29f2e9bf1ee7087f2a4fc24f705afc74be5a7c9203fa330500fa290e0fd8163d63be044c11313f2ea50b7e2a7173079841715a52ed556b2f9cbdc1e14a760a908b8e0bbcfb468551cbdb38f93e6792af43b8a308d7cba73ebe69fc1064f450a9e481658ade57501ec52948b0e0cc09cae972d309a0de2b7e681d15fd18860d83d3d31c4e9f37e1d4621927583e59279cc5e940377d8f3f42f9e3f00c87c3cb261c60d60fc70dad05f572e07341382b04c0ee83ebd94fbedc6bc5db39295f3149b9d947ca9df2d720ce9e72e46d13ce62739dd7f4d6937eb2a7a98591e6594e9a2f98a4b93e84344e9df593c5a62d3ec7c9f5aa492efd8146a62da657c105d3019f875b4f5778ddbe83c3e08b260c566a18e8faec52fa3c80ad499780a5cdbc76c3f0f93cc7e7974c7c6ecfaa2bfa68ad30bd02bd2b8c642f70927dd9245935eb21ec163099eb424ac203d80fea5c16ba5f7b27c7fd5782b574e93d590bd1d299a88591e65d9c345fe5bc353367b46f3a209ccd159ad5a668415b3b5ecedcfba57773f2bd66926f7d88967c6fd696bc30b5e53d9c045f3349a0afd72e749b1da4a72a5e5bfe2287cd4f98b0794ec3469f1be2e003fb9f8d48afba15d709c132bccba2356bfb17f48aff14076f5e7e1da8df2ad0d3be323a9b5b16ae7ebd97d3c0d74d1aa80aa401b74f6d16b0c90cdc4c375fcab4233a09210cefefe378ff4913efb51aef75c88f33ce184ed94ebfa74df6e3d4af2d0f23c5fb39297e2a98afcaf747617d555eee5cfad99738b97e3af79e29dba8a9983dd30738f97e2658cfc4eb2d7ccf949be57d9093e0759304753e12501dedc4edccba536d9d1fb7c12d3057193fc4c9f8b326196f086485d9240c6f85b98d303eccc9f67326d98e0b7b111ac762f38964f13e7f18443ec221f2f341ea24d723f07af31b9be4a6d38f7212fc8249023ddac4c55cb3b59b5e39824a987bdbf9314eca5f3449b92265b9de0d0fe8a6087e2d67ae9efbc7392e7fc9c4e5d519eda3eeb9bb7e51bde845bfda3fea1786d34f709cfeb289d3110dcf1a4fb9dead07b26f3b906e05dc3b1d8dc0996c5a3b6da1452a84eff2490ecf6f98f0dc1102cf201b39e8d63288ed6aa664b95acba738e97e85f3ccec49d7887a85a57485abb79fe6e4fbd5fcea6de163849fe138fd3513a78518c1f8c70373f3b13ecb49f186490ad8f9cb1c0f7447935ed4dd798d85e2f6731cb7df3471bb27c33acc5eafbbf9a7bb4b49147cdfcf7392feba49d2430125dd2bdc2d84c1eedc18e161f93bed651446eedcfd8b9739c97fc324f97e11c4ebcf45ee628e475fe164fe5610cf318ccca329e51738297fd324e5ae405206abbbc51ad5bdca49f85b41f4c8d5da6c31fd62d7d02f7252feb649caad6c9f012f796c16ce16f48ebc43aadf80beda1d7bb667e1bc103ee3973889de3449b431078986d559db331ebecc49f23b415a4f3b4f2e6d3fd3fc0a27f3ef9a647e5a8cd66c177866eaeee3d89e25aeeef77c83d6695e92f48628e6ed50c2595ba9fc24702fca7aa4e43ca7e9475ac3924615be4fa53a856df6178341d9b09137d4e4e6546dcfbe36e3f76419e3615b5c81da0583806a08ef0e48740a7d7d4d1dd2773761779f865562b4c1796d02cc65ab946dacf3928142ada5a1d2055f3da32fe14c244a95442e2d89741290bed224fd7dd0ea04a5d53155b873f8ea1cad293b177f00a58d35db50f897bf3b04dc177f256019d369bcddd9912c2bfd6cdbabaf4502cd8a405672d9deb43e1f8dca09840f2ad702fe4a4bc65403ee7f68131ce7b56d8ec6322311e978491c40ab284f83f6473641f3dfd82c0e50bd31230dd5b76d4215f6ad6a7100efc8a434787f6c13bc3241dfe7e756ca3840f47a220dd19f1403a275b18308f6737421fa539b10cdf26de261c09e7e07501c80eb21cdfc776c0217fc15b471806dc54480adb44423ae076573775cc361cdbbd8b0aca71edf3ed68ffe9a3338f3b8dcf8ae99a871fe6782b8cc15196e6705d39c57306d584560dfac225415af0861d715a1fbef8a2cce517adc6a1e6f56c3b8f5cfc58ff690b23a294ffd0580f09402c169edbe6bb3b59ba7acd08920f46104de2fca073bd46b3c2ccae0c1bb9d86dbbe99b829f3b480f38308984b2b084b58ddcee32f6dc239270b9cde80d23a7b5096da82f21081f2af46174a1a81abb607e5645b50de4aa0fc6b9b504e215dd085d4d492f4bbc9ad41b7c716745504babf194d2bf446d22d5a61ad2d288f1028bf67134a7092c0bba3ef98885fa59d44e0fa5b9b702d5296d715a833a1ab552c762b736dc1ba88c0fa7736615dad606d531ea3fe682cd7252716abfe2e5ba0af21a0bf558c569403ddeb165984d29a5b348340f9f7a30b65dcdda2dd04ca7fb00965f8b1cfc6188e7d9e2070fe63312c33d8d8674b0c2b793f81f29f6c42099112ef6be9ddf92cd6409b6a0bb41202da3fdb046daec8e63051f6ad5a60992d30771230ff254a606e8e21983b0898ff1a253037c410cc2d04cc7f8b1298b53104731301f3dfa304e6a61882790301f33fa204a6456fd21a985b0998ff1925302d063dac815949c0fc7e94c0b4386cb406e66202e67f45094c8b0fccac81b99180f9df5102737d0cc1ac2560fe4f31c0e462437a40c36235b716ceb88e80f983288169b103b206e63602e6ffda04335c00d8e2f8c75a6c681e81f2ff8a0165b0309b451fd31a94dd04ca1f8e6615f7426935fc6b0dcc1a0226bc0b3e32605a1c4a5a03730301331125302d0639ac81b99a8039264a60c6b1fb594bc01c1b25302d3aecd6c05c45c01c1725302d0e25ad81792d01b3244a60c6719ac14a02e6f8288119c7a9ac5713304ba304a6c58769d6c0dc4cc09c102530e338d1e07a0266994d30272b30a1e04e1c4abab4bb3317d4150eb8125bc009025cb94de01628e07a642680cdd971c27fe769ab01b78bb620ed20904eb40969b61851fc1f514c25504eb209e51291192332ef9553279c37ddf6e3519fb03c8bbdcd16b47b09b4936d421b7ed2601c03c3f71038a7d88473aa482f4d715613b68a222d4eb1d67b2f21e04d2d468b192c141cc7c1e33102e5b4d185924eabb618d4b036adba9540397d34a1f42e99b208a5b525531709943346d325f256f03886da661328678ea6557a5f4c62b1cfbecb16945d04ca5936a15c2abc639f01b5d781fee61d4a96ae4fb3e85f5a5b9fd644c09d1d2dffd2e2b31f6bfee54304ce3936e18445a7de951419dbddc4c0faca095c7347b3c389ff72e72481725e749cf3383e8c682050ce8f8e736eb1efb6e69c9f21502e888e736e114a6b157c8840b9d02694b92fd08fa3033493c0ba283a639e38ce225a4aa05c6c13cae521a0e45f596ab111d8620be26b08c44b6c42bcca00713ebb815b6c1aced802bb9e80bdb418034faebdcdf66a598b963c620bdc4e026e32cae05ab45c6be09e20e02e8bce60208ef33ffa0894cb6d42b9cc002530318c5b9bf5897dd8c20e5c710f8fc71080afb209f062e10defc18d50c92f63f7a54f7288ff7e337713605744c7b38de394eeb904ca95d19de060f14189b5090ee709b4571733ba9faefe40c889f45f694dc0fd04dc5536c19d9d012eff2a348b404eb705642301b2223a0e551c5774b41328afb109256c5da7efcb0904fbe44d87e5f8a35338af4f8b5fb59e4220bcd626840b4358230d045aec88ac05026f26a0ae8e22a871dcfeb48580ba268aa0c631647d8080ba363acfa72c3af6d65ad247089495d11923c5716dc75504ca2a9b50869f4962b13bb23693e4010267b54d38dd99ca994b65fa5496f8d9628280b7ae18e31e3eb89c1ef758ecbfad8d7b6e2240ae8f0a90711c401e2440d64405488b33e7ad01394080ac8d0a90163b186b409e25406e880a9016031ad680bc4480dc1815202d3ae3d6801c26406e8a0a9016f746b206e4bd04c8cd368184f9bb70b3133d77d7055b9c893ccb16641308645b6c42062f526c15cebbfd2eda74aead8d4c2612a8b64627161ec75542cd04caeb6c42394df0b170b7dac62f7a3399c0b72d3a81308b6eb53528ef23505e3f9a507a276a5b84d2da44ed1102e5f6e8c414e3b893d12c02e50da36995de5594160310d656519e2250eeb009e5dc2c50ea5619c7f9408f1330774609cc383a41170898bba204661c3796788c8059172530e3b810f07602e6ee288119c7be7c9080596f134c77fd9a3b172d1da0b812b731bb85c0ba275a8f5d2d0673ad05371e2670eeb50927049c9ccdf5e21c362b2370dd6813aeabb44aed6270e447608f8ea304e406db203b91a1f46d07e49956c94c3d8208b736a8858034178c8f2e61a3e0e4b606f23e5b20af2320ef8bcea83d8eaf665848a0dc6f13cac2ac03b6d824585b07bc82407cc026c410ec879591976515bf80ada80b5dfc629ce30868076d8296d43aab36710eb1387f457753fb09bc876cc20bbb2c770b77f54efc1ecf9612a00e47e7015a1cb79cb88d4079a41823f460bdf6fa58863bb613306f8a1298710c77d411301ba3f36cd2a23f69addf7e9240d964bb6369c3273dc062fc3a96f104a8669b40d5186c8edf1dc6110476d3e8c4a92fc06c432a677ac79846d181579d893196f7de789b2d25f41225b4d876cddd8d4afac51199097c4700ce1a68136d8136968076d42668f92db0b7d811595b607f2381f658b402c4717c4fef5d04ce9b6dc2e94e52e59ca4b82f2d994f80bc252a40c67169c93402e4f1a80019c7a5251504c8135101328e4b4b9611204f8ee67373bdcbb1b80199b50ee70e02e6a92881697191b23530ef2460de1a2530e3e80aed21609e8e1298717c33d53e02e699288119c7c5f3870998ad5102d3a25b640dcc9304ccb35102338e2f08394dc06c8b1298719cacd546c06c8f129816a3ecd6c03c47c0ec881298169f4b5a03f33201b3333a8f78e3b8d6e23881b22b3a0fd22cb697d61ea43d4aa03c6713ca95829f48d8245169534f8186aed0c984eb09d0ddc57e9ce17d10e7a6bb64f673f2367862d48f53b9ac0e3aad3d29ea21d0de568ce620d8248538ae159a43a03c6f134a77e7f5616981dde80407b7518bc05ab3d15d04d89ea8026b715c6f0dd86a026c6f5481b5187db206ec02026c5f54818d6377359d00db1f9dee2a8e6f62598e50969668c4f76410afc3e123b8e9ce363b0e209562af80791c1d08439b3c3e8016382ccec82a7b427ec2e17f4a7e4ce713b8a366bd1c020ee059a0d78eb47be555e04cb66320cb0035870a9fe93c153eb3f09d6bde37c1360b98173d8c602512d3153eb0d5cb41011b9e834fdd8a69b3fc773635a882b53f898df2cba98f95a99a58e999cb953e9f9d26a0e34fed76802061ae113d05d36b36894cf3d32ac90c354ed2ecf2f13632c9472b552b401757b2fc83a077a57634d3b968c62d52f30ef10e715866765ec1057f25ff0f524101edc2610100 serializedProgramBytesString: - serializedSignature: bd929bdabfa528e452ffb17461f402728a5f8ab9b2005087745d28622acf5cee63ff6d6c80e728ff73ad7d8dfd2d1fe5a60c4e9744eb7b09e623e4fdbf54b90d + serializedSignature: f270a81f423549b8199dd8148e8dbca6e10241277e3b6ebbee20c6019a4925b721a85e2a99c4acdffd05f63e191c740a91dd0f2b6217b1dfb2ae905f70694308 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset b/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset index a0f7909..ce8ac85 100644 --- a/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset +++ b/Assets/SerializedUdonPrograms/5c3949f8e99590945884ed76b6833995.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d697414c711807b85562b214e83100281247348206017891b04e842881b09c9e632081d5858088c0486dcf7613b899338f77d3bf7e52476e2dc9793388e73382f3ffdf2929f792f3ff223ff92ae9e1e6d4d4fd71cbbd3ab5d25d2d38ea667a6baebabeeeaeaee99d9a224e33fb10dfca39ff5b076b689f5b121768d8df3ffdaf9f62affb5f6ecf413ec06df5ee69f03fcd80656eb7325fcd4c796f2cf6ebe37c126f99537d920df8e8ae3bd6c98ffdfcdaf1de67b903ac2ff86f959b1627e511feb60c7d9315619abf011d12f2e9a906931d02b56ca3fdbd81d7e7458140a32498a4395fca3971f9910c7aef242dbe79d65e7855a57f9b1417ecd0d36c6655e12124bff55c6c43fccda94ca2d4f6571feb745ee17c9b452f93f3e77b6dc56ca73705a154a2b91db65f2ff43e81c3b1db6cbe5f1c3689f938bcd51e4d8d755cbb423a81c76babd0fc78f2ad795a37dfb38e87c4e919390c78f29ba2df5d1379e9dbe45cf28b2576858520c56280c562a79ac94793c8e74816d0dcaa346e1b454e11857ca502b8f1f47dcb01cfbf809a58ce5681fd921f644307bc56c9dbdeaa85d963ac516750ae3bbe5f193689f739ae5d50e6cd9ab15d9b3513a6c57c9e33dca75abe4768dc2af586ed7caf45eb40fdb7a642bbb6d34a0b47a9406db7552ce29b45f6c99d12177933caf4feecf92dba44cef47e7e1f47b14392942ce66997e2f3a0fa79f96fb7315794d8abc26b99dcfa6fc55e2df326d9edc2e50d89e518e2f94e967159b342ab66c64ce3ab8411e3f87f661bb9ee97dc546e6f615cd28cdce778b926f334a87ed56e66cc75b2d1b963caa9c6fd7a96df2fcf3681fce1f42e582ed765496ed8aae1b99b3dd2794bc763067bd5dafc8b18f9f50ae2b47fba83dc76f2b7212a86c5e6dfc2ee6ecb36cce3bd1f5769bda25f3bc0fedc376b7c27f274a87ed1e85ff1e4b66e229457e8b22bf4591b7571ebfa05c67a75f54ce2f47fb8855c94b01b82cb2ce2dfa8bc7b9f3e576b1dcee97f90ca07dd8ee432c2be4b615a5ed93db3685a36d8b76746e3b3a17b61d0adb0e8b4bd9538a6cfbba4e8561a7dc2e91db03f2f825b48f7d65973c3e88f621bf0ee5fc83f2bc21b46feb8de50c2b721e53cad58d74ef66693fe455b76d5dcbd13eb27fe998a2939f3c475a3c2622d283bce403ec3a4b8a93a057081a3adb57fa07cd20ba043ee0a75e643bc9c3d3eb5c802672ed1371f124f70c4ddac8b54ac48276eeede273809f312a848eb8b378da9505146e8cff0ea3b07b82a77789a81d02ef517e64130fa846c5551779f77496ff3aa5f4f36cc778e83ecc3bd59b3c2b90779117db7da69f4a10a2abd7f47099d608e22a4fb1815ee7fb63a284bde2f39628e9b0287d374f9b14e399713ea269e3dbdb2237b7ee37f8ffba3c4f4964fa32ea071254ba355cb1cdd4c1b581d227451cf07f8b4c8745007dc9886c86c549d1eb3cecb2c4ff195a4e262e1cb52563b3401673a435b1a41803f5b80886d7d1ada1be7e5bbcb7f120c74b173d1930f772a141dac22f2d79e4d9e7cb5ffa67dca95a334b8a2166b58f6a5e60415e436c894b82b70af178710a0aaae28fe9f08b50b43787f8adf346c579e10d50227a26a70162d0b51f11133e93b27093a2337b80b96c9202010981d5dd69fa158d025ba4035b9a6bb0fe9ec40b6ce9945e69b0f0a327584610f42b034570968ea088c2468d12ece36956c8d3298e8e8a7e12bc1dcc6542ef39224a6fcd6a5267db0c8f8ae9c49ba21cdeb42198dfa8d0d6932e17a4610069aeac94558a755611e39011a356b103e15e1ef11ce620d2d2ae092d209f09d1cbc279c779bdba22639e13fc0c8881d2e1b42dc3db1e7302db63aeb0c77a14e247594aca12719d25c488a66f9a5c373525eecd79de941e69ce4931f2aaf2f4c6546e30e82e89cb68ac21668d29ad6da7dc76cbed71b9ed6389b8deb40b848ccc0a4219ae446738312d772ae7210f38e5ccccb650673661cba5446ce29517cc32958230000616ac90ed0afe209db0cf22619f4c72a4ac93d0582705cd6ab146e1d41c59d41259dfa022952905853a446456aacb0c129768badefff01f97f0325a781925bc52231c1086113e5b5789c57c57eee3f6cca21bd0b832707453c5bcc2eeb0b14db9ce34406f99a650319d69aa68d3ccd199464cd9e732f4c49d5b78e32c0fdcf956337dd8e9973f659ab954ab59a16935cf16876b35f374a6119ef49c51d3b8a711edffdaf8b5f7737d6e89b9a19bfc7addb4a3b7b1560636568d30562dd34d86862b1165bef93ac2d0bb4cd3a8c11dff453b6aa80dccbe8ef98d1ab22f2b659505ba46053d2dac04bbc6eed0202ef0df14ff03a9f6181ed2604adabaa7c4d5ee1274bb5b48e5bf4a97ff5c94bf75d3089e490893ef5d943359ad7126cf958473268b28e16b34c2ff9608277cb1467852e47832879d489019467dbb80e5ed3285410dd9bbd78bb651e1d2cc73228e2057a1338b98b563ee89c22b2ffef55af3dfff71c4659a386d9a2554655ee7559901ca084fbcc0ecf59b51de6cc354e64a2a6859af095ae0274cd0b29412de1881f02a4af88608842fa3846f8c40f8725d33146d339763c5363939312c2695c23746b8a7a55125a16f8949a61fd0f917816a8fd5947d5211d86705257c7304c257ea8483f19bb43c55c9495a720d55ece6088a5d4bf927b885c415ab8470407554a9b74650eabb29d8dbb285bd8a2af6f6088abd9a12be2302e16b284beeccd2926b756e4d749c578cba352a96ed1211e5b06bd0185d9cbe4b474ceb01770b0f082ed36469296f59afb38c8838ccceef53653767913d812dd2c2ecf97d13a5a42cd1a06b7c6089bd411a5f0bddf8d6519e6e5fb69e6ebd4e32cc75ed0f52648f79d246cacbb546e0e53650c2db2210be9112de1e81f04d3ae130a8eb08c2bb9c169cd4790111ff5f9e162fd02fdb16b49ee688fd4027d76896c22a2986238d1e2d3ebb12d582a5d31fc4e2c601e177cc9582f23c29aa5a756559ad36ebaa95189c4d4fb77f92e731c0ac699d7166dd1c176de53aa8ab5c62c4e8d5c147512ea58a79d5b36ee61771445120aab63551b5ed5096b5ad9972bd872370bd5b28e1472210be55271c7a68b84139ab1e7a1b25f958b692b753408e470064874e388c2f4e04a9231e03919d54a94f4650ea5d3a77276674c6a6c5dde9c60df6f278742eaf476712addfe9157e27e5e177a22a31e57b7653e63f1581f9f7506dad2fdbb6d6a293bc9c590f91f936875e5af05e9d601897df1344f06e5af03e5d531033730f4c4b53702f7545df10ee0ddc104e8b8690f46808d194976a06fb756607eb9c0962f6d3b4d95b758261179e0c54d742ec9f306b216d54033e1741036ea7849f8f407807e51deecbd63b74ea245b6baa01ac59430b3ea0130ca3f68b410457d382bb281603d9b2384855c04b1155c06e5d06b0ec3b1884491d2df8904e304432f0c09c6b956f8de2455b79db8765f23bdc13c0eadf65060bd817c4423678894976bf48c7d7a46f650a13411da6ca39ac2b67ab52ce749e5639af711f67957282ff9e1237828c7b94944e771e712e1f85d1ef08a5df884ebf14a99f6a912e6991a01a64669da354e92feb4abf2f90755a79151c127d8e3510ccde3a99e9768cd2ed7e9d6e3b14ddf01dbcaa6dec2995e0d6d14b0ba3cd714a9b519d364d21b4095bd3b0ac301a9ca034b8a2d3a0258406bdbe1a5092d46bfab95dc3def77092d2eb81cc3d5c277b504ca98cc9d86d3a3d5c0fa5df18e523f431678fc8794844aa96ae560af43dd3e5237a29ddaeea746b63f68d89f6c317bac737e887372cade1e19b3bfcf31a9702b7ab3d247da49e9a6e881b46c3539486e33a0dfb48ebe1fc714ded1647ddb5d55f4ab073a2aac57d14876b3a0ebb490e3a7b3863a849a63e5c45f3703f881546a77e4aa7eb3a9db6933ab94be1d408eaf784d2a3eb2539171cc2e8720fa5cb833a5dda43eb3291a52e51f414f7523aded0e9b82b637bc15cc7a49890f7d35137711f46a3d39446133a8d0e646cb5ec348ac27667284d27759a0e4ff514f60de9f8bd1c565f05251c61037296aa7beacc4e764bf6253da206c29d98b7c4d938da71be40af5fdcf63cca3f2f09efe815b3398f7879db4c389da538dda4fa1b939c20de68e7594d88767c155de34d287b0ee7280eb7a8c8c23f2aece5275f92fdcb209beef1d5794ac387288fedaf21154d4c57ec7b1fa5e36d9d8e9d91c487b617b753c3c586998d2e2f507aded1e9a98e2ef5f96736bacc34cebd4869f0329d068722b1548fd0eda6e869c259290a0f334069fc729dc687c9bed7ad39b69c8e8b5a7afb31089a815b4a66f5f412a5f32b743a9f31d8bb7465dd0b4753ef072922afa422302ad7b07ed8599f83c61499fbe2214ad35705f151edc2aa960527a746e2d758fabd38defae9fc175c154683614a8357eb34d0cf14419ee1678a2cfda8f4f0164af0df9878894ea79003331a27840fb33c44523cf8909a6a7ffe6fb583125ce5c421e753532dc8ff1d77af61f43beedcb72467faba333f2d74be6413f226583b7f9de857bb25a446b62c4e5a3c0532d3347d2d432fe9284a8ae7511a33ac4dfea5781de4364b5f87c2bff2c912704cf6fa31b855ed826c18c353a1bb6f2e7ecfa76f1402ec9e3782973b42d5b2966e6e306b79edb904bcafa22805f45f6f1211bc91a04764aa3e4c3b5110a09e2c49837a834950d68b57e1f201d18d15021cf8b1e1bcd1249c79a29bb2a24f5c87ec98bd10606d40b0de641256b910602f3f605c8580e98522c094882bc2d5e836aad79bfab1a5fbebf92242ba2d463e3784bc21b5ffae85be2ddf4afe66e6784996ea771a7c1b5b83470d6bf074f80d448f990e39f5a1620a42ceb7fc8f4783298806df0a100ed9c193f0250f9bf42515cc7a85c0a004a80e07f15023a5e69ecdbb4ecb1c9e261e44b54cbc4d0572ca8f9804b94482b4aafeb898fba3e70f369b43993085720742f9682e505275d289d260ad3486720142f9369328576a6a65d0553ca368cb4da1dd84d0be3d179e738c9f0458af784c931b0459650ae40a04f21d2641564a909749dfd9e78069d0779699823917c17c2c9f601aac99c660962198efcc2798cd0508731182f9ae7c82d9548030ef4230df6d126695d2f9c01d12936225616675429508e8e32681424406efa51c60f0289a3d2ef59cce8c0edf0253f81208df7b4ce25bce82c699ce9539837d798b29a80d08ea7bf311aac1866e0c6a3d82fa3e9350bddf995878131c0c817bbf4970f05670fcc656626a3e3a64734d212b46c83e601259bdd24b43537dc8d1a984bbefc860c3de6d0af65a04fb832661fbcd1a15feb8a714a1fc904994c1678ddcf78619455b670a6d3742fb619368570746eb7d83a851ccbda630ef42983f6212f37c967ecd37869d7ec5b8317835a6e0cd43f03e3a9d9ed439ff6e709c6e6cfe7d0942f9b1fcf0a4baf97783688dcdbf3721b41f3789b63a305af56130839ef38029ac4984f51326b1d664d54115668cba17c1fda449b8ab02c3f5bae9de28e4d3a620ef47903f359ddd57ceea6bb529947310ca4fe70265b09b1a0a7125be16a1fc8c4994cb986e2ea09b17e5f60c9bb3df88907ed624d2c53e0dddd6d428c67a531817238c9f3389d15e98b36be6e80cac934b11cc274cc284a51c3c4b9abe8b32fd884de105f5b310becf4f6787e3bc0fc4e0ea91b19ad88e507ec124ca8a40280bf7cece8308e4174d82acd380bcc1d24f0f1fe25b08d567da74731102fca55cd4d47407e4d5e80bafc93723905fce179085d88b5721905fc917900627e98c81dc89407ed524c8b50ac84b4cfd02d80bca53fef457c51aadb3c666ed3b11eaaf99446d2f796ccefd9287b165b9f908ded74dc2b327e6ec7a0a0f37d9cf16c1735fce35fb993505b20641fe462e6aa8fbd69b71794ae1c18b2178dfcc4597146c6454785d523502f964be802cc420691902f9ad7c0169f0ce786320eb10c86fe70bc8428c366b10c8efe40bc8ad0508b211817c2a5f406e294090ab11c8a7f305e4f60204b90581fc6ebe80dc568020f1cb43be972f20771620c8dd08e433f90272470182dc8e407edf2448fb46aef4b36c306161bd49b59b75ccb0658b5684f50726b186bb8bb3105f48b110a1fca14994d9ddc56910adb105df1442fba35c367eb8f920fd1ecd9976e3d60184f5c726b15a5ff152d80fafc611ac9fe4c253069b5a2bc439a13684f2a7265106bf7b58ff5d0f06e1769b82bb19c1fd9949b8c1ded555b853c0e508e4cff305642136f7d908e42f4c8284770b0e8ae55928a2c14e669129542508d52f4da24a3167a073935ce79e207de6cc7b28601fc2ffac49fcea8d08d6edd7adae377e04f9ea47a3a88d8553eb11ea5f99446ddf4f4c8553ce77d41b9d1c499a82d98560fe3a9f601aac99c6602e47307f934f300d0651c660ae44309fcb279806572e8dc1bc1bc1fc6d3ec134b89e6e0ce63a04f3f97c82697005d318ccad08e6eff209a6c175756330b721982fe4134c832b99c660ee41307f9f4f300daeaf1b83d98160fec124ccd51a9899bd97c660d064ecbd342d08f31f4d625eca9cc3506bb5686886cd3fad6233e62b3e52b5fc943f31c7376a0479c6b3817c5f5e836671a6c13593d610e88da4d6f76a2c945cc7b984a3e2f800d763406cd3dfb19184fb1963d0d585f9222e6f9940d55bda8b802ea66f4d6391d58728bed443a7a9bf7e74dd9ae36195240c2c66b4fe7f06bb4bb38b6a5a29befea58f5b7e48aefb1ce7270f8942c14ffcbfe8df020189ca0000 serializedProgramBytesString: - serializedSignature: e59662263463577b5a59866cd6693bf7c3094e974348ed6c316bb24433532712ceefa5e2bffb03f5c0b487d5697c8036e1ba06aceb1cd9b838318890a280e804 + serializedSignature: 2b5a375ab31b7da71011fc712f9738e628c065f1f4d9be3e83edd722fab8ec03162f092e7b9326c97f7de4e1626b6fb2eb7e2ed6b1c7d613155f4b8ae861ec08 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset b/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset index 9551524..f3733a3 100644 --- a/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset +++ b/Assets/SerializedUdonPrograms/5da22fa35a4f38a45ba4ea99ead71670.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595953134110ee09594240443cc0b3d427b110773dca77c40bcbab80f0625931c2c68a95042a0916fe005ffc3f3ef80bfc43beebd73dbb61d99ddd25caa085ec566676ae9eeeaf8fe981824b78d40d14abb4440b74932ab44e1bd4c6d702ea165edd0afb5f5107f57b94358cdda02b392bf9b9a6cea25c44ab4b3dacdca235d40d195f261fdf8b58eba3c5bd75fc7ccc52452caad0037a492f685a9dc921b12a8bba419f62b9d408cafbf409a3be30c59bb832348d6219235d196b81e970de6b7a2362b530b686351d6a82e63ba1387291d78a4c5239415dc0afcce3fced28e1fc0968d568935c1e54d70780385c990f2e931e2e687e80326fdb83189b206090b022f8f5e80edd364a784e1d8bf0bd20650d331a427438b9c5b7c416cc5c13af1f514f17fd8f45bbaca006466ed233d4bcea2ddd02e0af635456b16d132af66905e5a6d07b0bb69333f3446255c6d72c81a6b6b4167a424037d16e0a87cb527e144e7de17e117d3db1fb362cff3eea6dd92d297b07dfa63d5702c8cc3c9a0d2ead5f9b75a8a6079086b97787d8cc8e34f23734c2d00f0f076e5874d947d49784268e30d441c69140ae69dcd2a17457df6d7225ae2e25101c5cc6a48466fbd678dfa3bb99b2989161755f10097634fc636cf6f3f7afd5bbce6ed1ee90cb66a22ee68896052cd39b5153090ad922384ed16346e3f02b13fc25ee5c3e40f8f5bc86cc1b5c01fa64daad003581e60a3eb6f16b62f23ca6aec992b66418ef29a11b8f099504dee4e199c7621ac00513c023070d707e44c90278a42fd70ec0fc98112ca72098c7431a824326047913d5b08a60057d3af57928a30d392f39ea71eecba7685db8d75970daec10c3e7927e6e091fd9688f42aab918da66a4c704e93949936df19aa695a2492ba3071f38b44736734e2133d29cee5e4ed8f5957933dae3a991219b8734041d03821ebbda7183bbfdc4e394636cb1133825bc4ab1293c14903b60ee15b66f48ab4b2e0f296f80fb078bd702e39c38ae8083777dd1b2294c64dc46eafb9698e649a1830cafafcbed254c764cd2e5cb949e84970289425a409aede9d0497a82b51adc79a9e0b217a8d9dfb4a67c2e2679b7a1bdde68f30e654de085fca90204d88babb2bc8629bd7cfa2f41e343a03713fd392110666bfb700167a39a0730eb129fba78f961178f117f64e9a2b7d74c2ce90f131281b6c1de8680eb4388987f7060fbe7383f19b5ef99848dec84577358f478e8d47f1ef93c8e7ca729720b2e781c28ced8f4e671d154553ca58e29d53eed06048aedf62737aef22e2f77f622caef7bba066eca26705301706b81e5f5f01d251865be4a9e3d28cbb6a07422504edb3e5138c35ec7e016a65a836adc1654c50854676d427535b03a9d97b6c56199891e10e9a0fd34f843e661b3c54204e07336011e155bdc9010be407eff30b006d9982dc88622909db709d944ea11d20ea65803af640b3c45872661f43861bc4091dc6a26d5ca6712b158676e9381dc6decfe5cc20dcfa849bd93c5b9cc8cba47835d6bb269e6a7586c4dfdd433a6afe6bee96b3fd24693a47f92421ecbd08acb37ce432dff25d67ba07631d369b96054a0794ddcc7cdb323ffadeec81ce717c9a14e49a91f0000 serializedProgramBytesString: - serializedSignature: 49842293c75917ecf2f7d6fde909b4690583586377bbdd6fdc57ef8f437ecfff969d7efd78f0cb25acf8eeb423a3eb40fada380e097089978761958a1368d70f + serializedSignature: 59c103075ff0fd449a46b277b02f1c60a31f2738c11de9d92f952f13b6e9c1aea8f1370293a8383487f54e7f942b36d883f6818333df3381ce5c66ca0d144004 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset b/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset index 6b2e4c9..f35c45b 100644 --- a/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset +++ b/Assets/SerializedUdonPrograms/5f233d794fe70324a8071fd2e0e5b8f1.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5df95f144716af51010f443c106f501151811910f116b944bc153189c6e070a824a00450933db347f6c81ed9fbbe377bdf77b2f7f9dbfe09fbe3fe09f97cf6b7ddadf7ba9a79d353afa77b66de3043021fa6a6bbab5fbdf77d47bdaaae2e164595fe8934ea8f6bea8aea56cd6a508daafbea9efed6adcb49fdeb1cb9e72fa9695dded19f717dad51d5a6b9137e764736e8cf7e7d34a366f59d0fd4882ec7f1fa801ad3dffbf5bd63fa08ceded67f63ba566489be6950f5a88bea82aa8e54a521710d6f9a31e722205764a9feec52cfebab63c8143412c54bd5fa63405f99c16b939a69b7de0d7513c59ad4d746f43dd36a42d31c468a4bff59a6f08b728a3253969a728ff9de4b8ef13e533698eba7c83194cb4cb9d75cef23c780c2eb9e76dcfbf69973a7c931948de67c3f3986b289b4d564ea9cf1d0b4f15aa2ff4e9af34b3ce52e4273b9b9e7aca7ce0a53ee36d7cf916328eb098d7a53d691736ed940bed779303fef91c3c5dec5f44232a6a5af78e8b8f7359bfa17cd71b9294b4c59417870f5b1ca9cd3754a5f35e7569a324aea473d7abbe4d15ba52963e6fa65720c658b47d6160f3eade6fa1572ac655dac3c74dcfa874dfd01223b9447ccf9aba41e3d3fe8a1b7dfc3d77e956c4b6d1ebeda1cbe96d47ae82c55fe7c1d35e7afa964fb5aedb9fe98e7fa1a65b7cbb5a63cae92edf2b8298f99f38f93638ac31369f071f5ddeed177bb29d799f280b97e9d1c7bfdb5ca940755b20fbbe7a03c64e8dc20c760eb6f0b88e3fa34385633386e4883e311c2f311536e34e50973cf93e458d32d79c11c6f3265874af8d8a8471e574f9c3ceef5b0f2747ae4e934e54922cf49536e366597479e2ea30357f75b7ce4d9eab9466da1c3d0bda9fce3f5530ecd88abf3c586d652f31dce6d53895806656d82973297971a5376135eba4dd9a392edb94725e22094dbcdf521cf7d2b092d1b5fb673b5841fa0792be4fdaedfece0da2e8960a6715af7fd7135a5a28ba012f41e415322f7cef4c910902e850ff8d98dcdceeab4634a13b064248398efccea68da6acd483646ca09dfddf819d735c691683cb589d7529a00e626f4ef1849a766f4f93eccc620a11ad7579ab5038ce35db774977343ff2653b9a61b9bd029d998ee301ee8a680de2dcd766acd742241eae5bde78aa6e9648693fa8c0be8943e9e400e07f0f321723a86dcf7eb73b398a7ded3996a972e9fc3d652659fd6df6d6d5e3590d979b42788dc79270d75d5d4a3a501eea3689f6f6a643e3402d097c68d1b2e8962d47f2945136f62e80419487cfb0d8d16842c9274ae55453137be92826078195325b4dbb78377bb4e24fd64b12303eade8c122434bcb166d7bfa78e6eff6f49b268fb551453fc2d6944f30316e83544d6a750f017a1a464490c18f5c21fb1c18fc3d0813cc2efd41bc77ae115508a3d53b20222eb90fd115365589771fd6d540b715f3dd257a06b7b6422608a966240b20c814eed46d331cb41bdc80635665b57e7c5d2b989097fb097ce4991003b8a79d0061f93e4dac2a46991c99c5ca779fdc5a9d7cfee7cf93f2576bd2c47bd64d21aa799c536cd2ccfb713a48ffa7e7a59312757422ff063c7b09cb1ed743c70082eb12188b3344f8a22989a1ebbdfbaf4bd7735120f31e779a0efb7a5d3fe98c2f0a2c983a91dcf0ac4b3d69ae487e38843b8c48630ce253d2d8af0a03ee70c007af1ea38c64cc81fe348fda2b68aa74d7609f270f55d4ccfe3b4e903e4c41ffd5581d1af44f461f02ec92da799529b6670b66e7c5e347315e7d221cbbf8d524ce6582fab03eb650deaa5c9472fd9f3ca69a5cca29518c4f4b59640f93ffd53b2cc23023817437ca94de515f393b466d65d407a54edcd99d8eea2ca37e70cdb592cb3a906d05b6f610afb30af6aaa78d52cb7110763a8b6658960cb30129ed5c04044066840a44bba425c8bea3c024a69bf8c6f7f05d7fe065bfb301939a47f63fa2f3d1f50731a6b85e1a89cf3848d164fd8b2c802b78f27acb41187fa9b6c51c24bb892275cc111de9c25e15536c220c6962084d7f0842b6d41015bbb9cc7a010644c6e0f095b556a668fdebf0dbd1fe660afead0eb3cb06d36df877439a699f176a7cd73e7cfa30077cd7d4c4e5f834d54a5e0e43b1066f4b09af3c05a9b07ae351ed8a2ffa688b7c113e4213c1737cfa6c3f8dc1a8e87ed361eca53a24062e41aa6d5b55cab3b6cad569156b9d6338b38eb6c7c8027ece44cac0ef50f9f5cdf0f2313e87026f58d778c45f8d52d4961b88667b8cae6bae8cff91c007a93d370eebbcb16beacce56afec83bf74ed730eb79e33bbdd7e0ed7965387abe67868b0f1b022c5e1205a856d7303d7e61e5b9beb587773dbceccd936725cecb57101531dd0c668a83636d9fc03e3ec98a87ff80d0426d032733bb48175138bbd935b18cbf7f884a6ccb9d13dd20b1dd02da9b98f0ea6876c44a795618373eccd9c6935d94c0b280c7379938f716db1b502c6d56cd1466c0d052b0160476abc6fe49bdcca3519f56bb2c3f311aac96db626210b8fa9d42cfc5fa5e1b2f01a1b71a80fcf57b249966b39c2ad5912de6e8b2898bfe473321caedd472a300911becf857549fbbc0356bbffb629fbac757a1638efdcc1e9e64096bad9c9116ecf92709d4de9982c0e8b2add9d631d503deaacbe16d7f5c7f0892c9ca763ec4e6cc17d7ee05c4fbecbdf200eda10b2dac321b4877aa572ca1d672bbb6c2a852ce870109556f02aadb71106951e0942f8104f78b78d30d8d6d12084eb79c20d36c220212ceaca76f6690f47fc780e88efb511879879c21a86bc94db78cafb6c94614ea42308d83e73228d5c283999652869b285121cc6dd160d255c5a25f718a4337048e9c290025622c125175a9a6d9ac021e1ad820aea9905f4eec0e8f728770a23579c71884739a7eacdd2a9623655e2c87a4854957ed38a6e6f977e6ad15f91a7022bb20f150949506ef8e2d4d8c2f515a773d057b4727d457fb67dc57e8eed333960bb8d63fb6cb66c1fb0d9f606f93095abf94c7feb3e17c4f3eb7874dab904e07c9609c0411b6130800b410877f1840f719672315b4b396cb3149c65bb396f51301711f05210c4b7f1b81cb1210ef33a978310f699003aca45942b398828c738e20339207edc46bc52392f3a65334839c159f760b6d6dd61a3bc5a39efbaa49f6d331fa1a6be4e7286f3589686d3c9c1ff7896f07771f03f912dfcdd36ca90bb5d0fc2b24feed663230c11fc4610c23e11bc97d31eacec4b99046e55dce82375a94f333ef180ce6f5697233a8c41d81cc580e58455b84e835962bd49183339c54970d3264197524c9b0ebff7757807ae1ee8b1d42cca9478b182e7973f9f0b09fb38099fb249783690847dd869c4b1ceb4d6de5dd4de45fdbd573dab0901b9ece54d9efe0c23f3694ee6214eabe1ecd25d8ee35aa59fac4381698791b09f93f0964dc263ac846e52721f8f80eb64cfbb63591cc9cb645b4a1946aa339c54719b544758a968fb8e3c3d980c39e9d5f33e1278e5a45abda6ef1d0ff974f42c27d1b04da241e5ce10b84b7ee91b7d8e5581c7ddc6c80212f5cfd5ecd5a9a4a3c12bc8ff98e6f521d66e3692c0d5515c44061201ddc43d5e59e98b0cb9c0e11c87c3880d87eb823838be9bbcb5c4355c5730ae3f8731de844123535b3fcf21326a436497272e77e242c03826fcd45fcfa1ec77f4f7bb39ea3f2e707c8ed9f8ec0cd47f9c439dcdccf51cf3d9575ce4e4bb6d93efd49c6526cfc771f3775e3df5193df9c915867e18492f7192deb1497a948daeb6289f6c85b3297d9b543f789993e9ae4da6f6d0fda0dbd37bafcea0ce121980b328770887e5099d8791e40a27c9b84d929e2cf2b4f9f4b6014ecaa76d52b67aa4a416978967e5226e5fe5247886b3b830fe9cec47a30a5ebc7657c25d307ee7d73b85916490936482d345621aca3b09e5f03d33e7ffce59e9ace21a27c1242741e6bab0ad47ccbe777d8c93e09e4d8231e1fc30bbbc88f3ae5c68fa710ea7fb41e2463722e048ebdaea557d2e5874c88da69fe02498b249509726be03f77ede94694cb8ce71f9ac8dcbfa9cf5a78e4c6138bdc1713a6de37490e534358b71face7ebceace6638f7051d37861f5b66dea33ec9e13013246fa07642a5efb5481eccf3fdac3273296f7252cedaa43cc16a1b1e97f561749bc2dc6dc4d3738dcc2d94e575dd9d5427dbc8f61427d9039b641d81f2be4ecdc328723ebf738f439c6c0f6db25d62b5c6cdc3b97d565cb92fc5851967f8d9662e347b8b93fe914dfa33737dbbbbf3645c398f0f9dfcdd91d87e2ddc8c5c2ee6efcaf46f04df95e8454ea635a54b8891333a8ae26b01b13999d2ef6c05684fe2661c135a576ec6917e9fabe714bfcf55ea7aaf4cb73c4a27852df76a26d917952ebd4cfcf64e6546229796461a57e22f34499f07ad468c561745f13d807d195a537a2ede02ad2db6db50f84d5e1c02ee682d5289616d4a37ec38ab6de799b46da67bffaa0909b8af44e660bb373034a71b9956ce641dfc80db7b889fca99e565b6ef4faa8facc2a8f41ce697d3486fd4eb33f89247a171fe566af30d81ec261186ede1330661f86d6ff008198308f97600a1d70d28310828ef90f47a58f3001ded84ae34818959c2816da948f0a425e6e5359b1dc39625c58d354180c82476f460ec70607fa724eceb0dec4e1e720fa1e747272d7250964941799240f9822494ab0c94ed1e40132fe18a81572905de4e02debb24c173dfe81d31f173d66387aea4a236582305e33a02e3bbe7d39d9387358291b15e0acadd04caf7e4034ace229323a320946291713981f2bd92506eb358e5c2eebff711685f9484b6da407b8775f9c1a4592ac1e8592e05e63602e6fb0a094c41cb1403b39c80f9fe7c80c9c54feffca120986d52606e27607e40124cd8e60d1e343ec2078e6338241c2ec27cb28400f6c1c2e9bd0f1461efbd9e40f9922494eeb866ff021ad7d410f03e2409de661534f5494ecd05fbe92e29500f12503f5c88a00a763162a03611503f2209ea3e953c0147d7efc0769999ade21405fd9014e87504f48f4a82bed280eef4e900bb4b7b3cf52947ee802b91024e11e05e96046e8fc75a810caca0b3ad3c1df2598797274bed93023c4600ff9824e015be963a2307dd7229e81611e83e2e095dba5cb4f807956504ca4f4842091238e3206789222cec18378fd98a6f96a894c0f64949d8dc143eb68052f89504bc4fe5c37d83cda9b716e19c7a2781f2d3f319099347e582508a8dca5713283f2309e5260b94e9975f0a762e8d52906e22907e361f90a61f56163ba41d04d2cf49425a131852fbc24b4170c53aa64602eee7e7339a16ffc3de2a02e517e6b38f2ffe87bd4708945f94847297e2e791c2cd228902dd2305743301fa4b9240075f322308a3d892994a02e397e7d3f5f3362f2f16458f1328bf220965b3c7f58771e1ea33f87aa4b30dd1a8f55536fed5a3c49e7ea2565c2705fd0102fd57e7331748eec00e166107b68140f9354928ddc992b6053459524bc0fb7a3e7a7f1a4ddf484f8eea09d0df90047abb0568e71fdec0ffbcbba7ce28e77fd92fb4a9e6c504e06f164e446d2bc288ba9640f98a2494759ebc007af747e6bf872ffcf9802881f95b9230bb2bee6848e09f7c8a82b94d0accc304cc6f4b82e9fe473fd766c715ffeab72090555240361020bf2309a49b4eb52ca074aa8280f75d49f0622956687b9d7d34d0761a0b27a27613f8bf27097f660f59049f5b893d11d84a20fdbe24a4e1d2aac34598566d2650fe201f91357549ce3d53a5f8c08b10f07e988ffe9d9bf6cbd34b3362fd7b0b01f24785026431264a7b08903f2e1420f71721904709903f29142005fb6a3120f713207f5a28400a4e808801798c00f9334920c3253dc5b8cbc20a02e5cf25a1ccee5d624168c55689b613687f21096d66a31d4148c5463b5b08a4bf94841416a9d20510e7d1229d279a822b962ba4805b4280fb952470eed8e6c0029a35da41c0fb75e17437ed45d8dd5413287f930f3b6ccdbf1d8a7528ab0878af4a82e7e68f9c1d16fb187b1901f2b54201b218c7d84b0990bf9504d2f6888c125c089b52ec2560feae90c014747131305b0998bf2f243005272ec4c06c2360fea190c0149c4e1303f31001f38f8504a6e04c9018982708987f2a24300577a61103b38b80f96749306d7341c9ffeec52dbb7475f8674ef0dfa3efe30a39d1be5d6cfcbd8b40fb174968c30d2105e3a7d810720d81f2af8503e5a1228472a35a303b9dc76021c4dfa83934a499c46b6036676b88f86d56e06c44beda20744ff3795e8d610d67fbf2b84a6c4a1e853847fe335ab0ddfcfd69023efed4feaec8eeea1ecd4ee44cb3b9d805dd26697af9782b29f7d14a145e785ad0f2ff03f46ed48e665a8dfbe5d39df52f2ad84b1f98829f92ff03a00e06a8aab80000 serializedProgramBytesString: - serializedSignature: c6987963a8191777b0ff92eeb50c37df8dbc58524518976eba04f4a18815ec854bdc85abc019cde803ad0efe129f44765e205d283ceab076b1652b2898bb8d0b + serializedSignature: 591337d36362fa0193e0dc6db46e2516d48ba7ba76637239b8390f85e3ea6599894b1ac931ef66c201d67cd3e278650e762dde439a1e027e1ae6d1773feb2101 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset b/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset index 759df5c..3f6bf56 100644 --- a/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset +++ b/Assets/SerializedUdonPrograms/602b9df42b374404fa24e7e4f8948f00.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1cd959c0dfcaaab6e46ecbbd9cedf39e8b766dcbbdc996655b6ed2c992ec73395b9656b2eed44eb274f65dae91a31d2484244002a143e825d40402841e204080a3b703420ffd80a386f7bd79e3fde6edfb766676f65bef98483fed68decc7ceffbfeef7bfdcddb8a94903f896df2a357748956d1247ac480181763f2bf56791c95bfce991bde2926e571487ef6c96bdbc43a9f27e167736299fc6c976753e28e7c725af4cbe3b0ba7e5164e4ffedf2d98c3c83d041f9979177252ae5433de284e81017446362898f885ef5d0940e4b805d895af9795cdc9357334a298824a52e35ca8f8bf2ca94ba362a9576efbb2aae2bb346e5b57ef9cca41891326f2989b56f3608f58f700ecbf4b1511f17c9bf3afd7f85febf56ff8fef5fae8f8b03debf421f9704bc7fa53e2e0d78ff6a7d5cab8f3be45fb5fc1b46e795daf22a794cebf09dfabea70c393bf3c881631ae995d6b2af69d9ef3564edd2329e46e7705c879e87eb2386bc4fe8f3f5fab8ca87c51a83c16e43f7dd8edc8a4a47cf8a661dbec760b006855372e0d88cf469d6b26f6ad9ef3364ed3518ec3518341b0c5c799f0cc9e01183fd467d8fd4a9f28b75d8067ddc8764ed33d81d306c3ee0e833abc591356b42871f34d8ed43e1941c38ee4771efd7b23fa065bf6ec83a64b03b64b0db6fb0d3f22aeb43b273d3eab0119fabc71123fc300a77e5c3f5d13c71e4cbc31bf5f1a8963386cec19e8fea74fc9471ff061fbb96e8e331749f9bcec751d8311406c716adc7b8115fabc161933e9e40b266e9639bbe7702dde386c3f1a4befe0c3a97b6367cd890e33e774adf3f89cee1d86e306bd7c7d33a7c0a9d4bf9d5b50ecbea1643ce19c3b656148ee58d1af22e3bf21adea5c3ab0cbdcfeae7eea07378eee3fa7c8e71ff397dffb43e5f8cc2b1bc1943de1b861e6eda9fb7a4fd0514761e85c1b1c348fb0e477edd5bfabcdad0b7cbb0afcbb9bf76a3a1877bec41713faa9f7dd6b867b33e5ed6d7efa27338ded4e1f7d0391cafe8f0e7f4b95b0eb8baf6196cafa0706ccb8cf0da72c8605b63c8bd6830b8a899ad33ec4aeae32dc3ae5bfad88dd874ebb8ddbaf0317dec17f7cbf5da3774d816e31afcdf60e83860d8de8fc2b10d33c26bc33ec3f65a43ee25c3f64bfa395737d7f6adfa98316ccfe8e3a00e7f5e9fcf35e21932f41f44e1588f19e1d5e32d43ffa5fad82972f3c5e328ac138561df1847e752fe1cd7c7dce77c7c62f69b861edb447e5f7f12c99e67c4715b3ff33674af1b8e7518f5eaa074c64c661b72bb0dddb52fce71cfe71bf7f7e8fb5f40e758ce8be8dcd5a34e7874aa5f45c8ee3564f7eae376e12d3bdcf0261f9e9750dc970c4e53c2ab53b3c1a95278cb9909748e757e425f7f099d83bc571d79f5af1bf2dce7ae0a6f1d77551faf096f1d77cd8867ca88e7d384de6e3cd78d78ae8bacffe03ad0f5a775fa784378db5b371cd90dd77ce2db60c4676babb8f7a6d0393cf3b223bbca4dbfa06d1f4f585542f5484fcbd2a64fa65a4add04256ad0aeb3fba47fa7194457c307fc6c56d1de9115d5841460e9b9f6a87ef11dd933da69edb92e4fd423bd5bd5679fbc6358097d25378a8fe44401ca8dc8df0cea764fc9f053aad70e1def6179a549363086d553376557efaafcf54ae995d18ec8c2372333f1b48c0ae4dd946ae7dee9671274d1cd67baa44c6704615486b84027e4f988d2f0a2fa9c519a6694f6ed32ec8e1acf189355c07179bcab62cbb57d52fe6f8bb35b23b3eb681f48a0c29de10a37994e486b40fb946ac37e36451e448a00faea577436ac4ca912e9b59c94f82c43a790814e4bbb96b143214b78c2768a94ead774e5100c6f63ae8576ff7678ef11cd796db19381e45ea92cc8a6f0dc0f7ee8b5f7efd979afca6bda2e91525d9a553ea6e5030bf29289a53912f29b5055559906454dfc091b7ed5e5b85842fcce7dc3eabef00950ad6a266f022416086802666494191904790a8475a947a1dc9c50cae6a44f1a84d528c4b915a89f9a14e40a1be4da5243f62f55f241aebd6f571632fcd809d61104fd74a008ceb211542db26bac04dde6d74559cf9e95d7fae4fd19559643b8e353ee448013e6bd333fd3d9f7adca324da9c075a8b95868dc7374a356fdd454d913aa5e255431a2a392aed292746948ba068bf569b07eaea1789da1b8ea51da23abb2f9891af5ea2d614e836be34a4a9fbc979a28caef1bf36cbea1faff2b722c0916df7cdd4151653ee10e0b943b141a03e502d536178054596873013072915757d30316d01e5043c5b5988a6b49c171d552712da5e26a2c38ae3a2aae65545ccb0b8e6b3615d70a2aae9505c735c7966355d1d05dc21c9bad950acbadab6cb9558d2a2ecbb1c23faed52ecd4a3aa7ae5139b510e9542eadb7a53aa4c45a5baa8371ebbc7a9aa9be864ef5062aaef5545c8f141cd75c2aae0d545c1b0b8e6b9e25ae940aec29a137e3766a61febcc9e6cf6ab474798e1d416273275fd40fd516d9ac5cbab00828a79e6f4b10288e124fb326488f0c73c6cddad4d56135d8929539aece2136d7a27c4f40929c57eb52a6952ef9132f694b3c55d5c27827af668f0549e82d2aa1f995a19c620155bf6da5eab76d05d76f0ba9b8b6537135151cd7229bb3abc0d28fa514d6cb049f680cdccb4c8b7c432161fb988b6d2905f476504a994993a69366892d69548ca5e9c066e70fdcff8ecb676f4b7b66d4a0f0b47cde36df903fb960fdd676838c3da97609b39f59a84654f22db5251f106eb6296926dd2e3ae91a29bfd85d04bf5866130eb97f8fc81d6ff98cfcc9115e470b5f4e69beb7089aafb00907defb22f25e4909de1f51f02a8be094ca98a5ec6a78bbd2e18b4858dbb6d54c3b7ba63b28ec7d047f15a84cb6da8650e5bc2b2529c6f20d4e153606772870117658d15c23820d95851d265b63f37a207b2488d71fa6bd7ead2dc9549956cac1e70ee9544f09671232bccf1f0d9c482dc23ef0ec173f952ceb6cc902634cc78465d2c15a86d6d069b3de261d4aa4e3d64c6e4a3e484b7e84aa575a2df5ca9b1516e179ea950d36e1e0ab2722faea464a705b44c19b6c82a1263c59849af051ca474ed97c04621d12f026c20d193cacde351897deeab478205fb9b37f613c6933a5c3699b0e5013de90bf69f9174c17b87b52dd1946ab24a555bb4d2b18761c91713f2bcec940b87f4cea702f548c8f51097dc692d01521137a0b25fcac457822a4f0ad14ab733656307e05139977d594e694aacea785bbc0230cb16d54bce76df1d629ef9d541e32212ea8977bc279ea762abe0bb6f8aa94a7762b1bc3f95e13154f872d9eb9284764e32bcceb53949b7416c14dd236e15065c0dad14855c60e4a725754c93b6d929d6e7bb4627d1795c6dd4104e749c2668a454f5416bb29c9bd5125efa1285f8a48792f45f97244cafb288d9f88a8f17e0af295a8900f5092af46957c9082712d228c4354f25d8f987c8729c14f46147c84127c23a2e0a354eadd8c9a7a2d94e4bea8928f5924a7d4b011bc9550fa190cb32755bc798b5bb6d4b5f6f2e07d9264628ba02710a26849f5058fdbd218526220885bf6d349dc4af97b26a2bf9fb009869608b84ed46e4f1b257ca808c24f52f9e976d4fc748a2a67872396b3a729959f8aaa723b25f9e9a892cf509e3712d1f3ce522a8f4655f91ce576634570bbf354161f8f98c52f508227220aeea0403f13157427a5f26444951fa7044f4514dc45b1b81395c5454af27454c9dd94e499a8927b6c92611ee5d92098f3cca3f45282ef46147c8962712f2a8bcb36c9304afc5c10955b68c14f502a3f1f55e52b36c950cec10b9851cbb9ab36e15009be1084479e4af01ac5e3c5a83cae532abf1451e5276d82a16a7b3988e03c75e00d8ac52b5159dcb4484ea9d9ded22ff4808187f0333a9f23f55c94e3c4f6d6fedb45be651e54fc542bbe8fca57af16215fdda2ca99cf8d58cef4535a7f5e11b41ea0847f7e11846728245f1011c920a5f5171641eb214af86b45107e9b2a71be286289334c09864d7972c6bc4f18390af7999bd4d8f7b82c276ec88ede33f2813e95afa0070d57a8e7f25df15ef32e420863e5539495efb059d924dc097bef443c9eac77ac7567c2da54f9e85aeaf76c18cd9fa6347fa74df38d81353fa535f712c6eb66c368394269f92541bc08c71ac68bf073f9ae14cb8b46292bdf65b3f264402bdbd5b85279593a4659faa5364b0f105ed7a3da108e4dc3baa57043593ca51f87f9e3fc6543b12c1aa72c7ab7cd22e808d9c7ffa8128f4a457f29c1ee291687098ac37b6c1c36193e7c4cfa1a6ccf78cf28ffce898cd2fc8eaca84c5db34b6bc3e8f90ca5e77b6d7a1e33f4ccc689d3e89cf2c129d981beadb8d19ad2e1c54a8749cabe2f0b93c370b96ea68dbd84f7da52cc9a6a8ab2e8cb6d161d3152cc4b12a71ae48e3ea9cd3d71415e1d52eb3c9c350bf953a378697587b2ec2b6c9635e7b5ac90542a8e15d39415efb35991267354540b0a2b0f6628eddf6fd3be35507910a4e62d6599f02c65e3575275949b579d75ee789f1f473fe8a70f8a3edd4f6fbf7f679be4e9bc24d3a56a988cb47e46dddda4ed81ab0352e2b4b20be4669fc9df3af15eeb95cf422d1f86c35d8ac357d9385c61e4e0f8b67763e25e551a0dcbcf5b2a95c3d0c0757a1822f728221fb011d969787fabb2d5b1cb6db574cbb0ec6848983658f6a930163c4759f0d5360b7684b2802e656cb61556fe3c4fe9ff35d153c0a6bf7f0a84b5e06d94055f1bc402ecd5516b80427b992f50167c5d100b30d1a816149a8f5fa42cf87a9b05d0aa0ddb0b1955db440deb3dd882f6408a5583bd44d9f70d36fb4e07aaa5cd567b874cb9ecc8c083acaf5fa6acfd469bb54703597b4cd64c03bac76c6be386b7cfafb4a891bf8904bc5fdaa6ee849676a7aab5e16c4aa4d46b5be9fbb5acff6e8410fba8f42fa0da7dbf9ef4df9bf09b04bd3761eecaa542b7a9f3b3c2d66268426d066c9dbf4df4967c35da22579624adde637bd82cfd664855f705ef8a947aa56e6b81dee4afc50721b659761f0abf3d9723c05db39e8019ebec926fe7cb218ec9dc3da012c569260eea6932dfb8fdde2fdaae04b86f531461ab4ee71d24285e2675910ae3963555156948936fe10437df02ae53de0a7df941f5d8682c80a511b06fe504b6c802ccfeba4d1cb0dd44d8be8d13db6c0fb6ecd67d7180f46a6516d2b7973a339ed2179d45adf1f02a81bcea3b38812df400cbce5c78b7861c8805b48f29683555867073b2aa58bb00fb91a69b47b005529bb8ab76749954f206cce6927ab5bcdc34ff4edcdc4906ca6cf6bbccfa3119a25248866aaa24037b78922c61b3bd087beb3f0dbd88ef12ffbf1bf86968e07f374018d6109cd2eb7b384baf653ac59cfedc98ea33e79b358177e40c1da26c3e5ce729d30e0631b09072ed22aa0cbe9713e7521f9cdee1df1d7c286bb850ee45283ff420517ac7a8d27c285bb8505e4628bfaf1428fb7529692eabf27a25234a36af5c87507e3f27ca959e1acebf4eccbef11dbf52731582fa03e55509ed8921ce2710ce1fe4c409dbb20ce5efb2150f579a0bd72284eb873871c1d6177d44e3778a0fdc662e70f310b81fe604d7a8b3ed1099717b3c330f8c154b1d17cc4710cc0f97022655479b6520234cb612703d82f9114e98e11a3cbb63d8e0d98650fe08274ae8b44f89dc0d9c184bc6355cd0ea11b41fe584e6b61271b91864a69dd113fbb9a03e8ea07eb41ca136c7106a2782fa63e508957114880dea0504f5c7cb11eace18423d8fa0fe443942651c6463837a1c41fd583942656c7db2413d86a0fe2427d41516a87eef52b0fae9612ea47b10d29fe2441a6e5c9d717488ad41ff2442f9d39c281b344a8878508174650fe7ce52170f5c15173881c0fd0c2738771a7687f6c309312d9ce5b1136ad13fdc16bf2cbc11e1fb594e7cab35be1179d38807a123e8619b926845607fae14652335d811ff41b86508e5cf73a20c3f11c1586bb30dc375209c1fe7c4099b203b917ab793eed21b23b2a15bc085ae16a1fb855264ea600d1ec6de385bf97818a1fc454e94502c4d18cba5e2387a390701fb254e6010d18c08b09cb878d07671415b82a07d82131a2c7deb472fc4c6b78c9b8d90fd32273268505313aff1c55787f0fdca83ac224a36b6d8c285328350fe2a7789e75410ee7784c4d7ff6a10b44f72428375067866107fc98ab3a14ffcead80604efd738e13d2abcbd617b7d8bf7417ad81603b420d4bfce5dcd64bf9cc8fdaa99128ddbb0356c56227cbfc1896f8da59af1eea8417fdf26eba8361bda5e84f6f552d4e0c196a930d6e06c9dbccd08e56f72a20c3f72c3b82c80adccec46387feb417a66fc17dfaf45287fbb1428838de4c471a47b1742f93b9c2861fd16d5618c5f35b31461fbdd07e981255b2fc196996f2194bf573e35f6de1866e62684f2f739514257cb9983cea8e398eaf138ab2118bb8ef55ce06621707fc0092e7c5387d10fd99a3ad710ce3fe4c4b956787be2deb7b7fcd7ed30d6d86c93fefb10dc3f2a67b8715c14751dc1fd634eb8f8bdfc5135f8d62ffbdf251cdc6043b806217c831321cc75381e3922c53caef6620361f11bf65d8890fd0927b2f596eac779c315467cc6c419791c553ef8702d42a94080ff941370b83626e330065b1b732b42f9679c2861018aede5a5f8ceee5423749fe244b74498cbf5e82d2519b333dbebc52710c83fe70459d86a70c6c15eb65afb2042fa179c48f18ccec3b3127735c2f797a5a860828d48c6f1edd83308e55f71a284850378d54fb76e3f320e606ce182361f41fbeb52542d94ff39aa3bbbb333562d6fe702791381fc1b4e90e1478218ab15b691a02e84f36f39719a8315cee8248c4f3ebc2341a710dc4f73c29d27a8d78ec6f42df1ab661208dedf3df812d3698c330e99b135c6cf21907f5f2e20e3d8ab694320ffa15c4032be9dc006b20f81fcc77201c9587bb381bc8240fe53b98064ecd3b0811c4020ffb95c40328e3eb281ec4720ffa55c40324ed1b2811c4220df2c17908ceffeb3811c4420ff951364b8919f382e383d8450fe1b274aef76ebb95b9e9760e357b64ee10604f1df4be18fc1a6bae2b85df6a308e55b9c28615d93f9966b7ca7b9aa10b6ffe0c4167e088db1edc836847609e1fc4f4e9cb5162f8c5f7dbc18e1fa2f4e5ceea098b382c7d9a9b944d3586cf01a11bcff2e9fca238e7b426d4728ff87bbf298bcdf74019903315e895b89b0fd2f27b6c2a6f6e3384db01321fd4c293275b01e4a1c17d8df46286106810d2534cef0e2a72e91bb134f1cdfd19e8b0026380142d4d9c5a19d320bc7af21bd00c1aae0f636b72983bd2eeeef59af40006771020cdf1389e35bff6711ce4a4e9cee9821d53a8cfb94e963086455b9808ce394e92604b2ba5c40c671ca348540d6940bc8384e996e41206b394116d67f61f44db6fecb5584b48e136963c85a7c5f0cebf0d308e6ec7282b93f8630db11cc39e504338eadcb3482595f4e30e3b84df00e04b3a19c60c6711173338239b79c60c6f1eb9c772398f3ca09661cf794da8f60ce2f2798719c683d80602e28279871fcc2dca308e6c2728219c7fd544e22988b3861e28551e65280b8cf6d2f47101773420c370d16c73d008e20944b385146dbbf94b117c43665d183d02e2d8597065b8111c72fa94822948de535fb13c791a31b0a674d9521fc648ef056652c98db2fb273d54de29480f705338a6cbf3c3f278ff0d44d09e4aafc0d9706d7e5af2d3ca11666b589bb523d080579034af6a8bc3aae96c5a4e175fd65e012f3b54b247db6b44be65d6693ccbb823399f0dbca249967137be7e97cdfc4930cf4650c49f25b2e92c4b7ac24f37c7f7432c00ef2c980ab181cf694feae1ef637f5939689fe24b93314b86f426905fe009a9e17b0cabb4fc6dca78eddf2ef968a3705754f02be24d1a9709aee57358e878f8a517de686fbcb047fcd2f6d79c299c8b295532345cb697e163985033c3f2875ef57f420d4cf527ffbe85c5b9f275552f076f7436dff0a48779decca4d1b95d3f7c8941fd019ab43de3ca094829faaff03ef42305587f90000 serializedProgramBytesString: - serializedSignature: 551e24476a6e6403a64e0d6a6a002e73f22358b77efdae311e0374d50684e373f9fe835dc880cb714d2466526756451fc461edf23472621b2376d153cca3310c + serializedSignature: 71b5456ee724409b53336a5866247b3c24af1a4dd5b50fa35d47c5b06afc4030c525a01c1652ed55ed343ca9f7903cc4299b7d327a01a7bd7d8e7e06cd26d408 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset b/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset index 24518f6..79b64e2 100644 --- a/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset +++ b/Assets/SerializedUdonPrograms/62b9319b03042ce4184b13094e4832d2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c14c5dbc7e70e42470141ba82a206911a0845544a68d209200a08210921124820a159b137ec5d51b1f7de3b2af6debb6247fff6de7d776667ee9e9dcc73b9cdee73ccf2aa1fbd6cfbed33df79a6cfcec47b32e79fd86eceffa6b3296c38ebc1a6b12256ce163b7f0d777e1739ffba47eafc24b6d4f92d71fe5fe05cdb8d75aae149fecf2eb136ceffc7384795acca7972192b747e4bc5f57c56ecfc3dc679b6d839e267e73bff153b77c5ea3a0f4d63796c229bc05ac75ad520315d3c5429cfc578b8620d9cff0f63ab9cabc5c228fe929ee2526be77ff9ce954a716d9163b4ba6f269b2d82b5c8b956e83cb39495399af384628305554cfcc1dc9f6ef27737f9bbabf35f43f9771df97703f937bc9f9fe7a19b95e2deeee05ea5d9c3f92fcbf9ef3779dcd33d8eff258f7bb9c7b1969a4623a0d15bfef691bf39f2b7aff35f3d47ebed34ec4f75ad9f6b43d554799c2b7f07c8dffef259e79eca2a796ea0fc6d237f0725ef997aa63cb7bbfb1bdb57daf90e387658c65e95f7b590bf9d4198b791bf5dc0b9c152e75dc94c31dc43feee297ff7d2f8bc1790cf1019672aac2a8e1ab3f47ca791fc1d5ac3fda9341acbdf6101349ab8dceb744a716f7770af7acf7037fce23e9566783cee97bc47fc1d73f505f3f7b5f359f2fc07daf97ac8f9fac8f906def34e5ee35e9f096c99e97d26364b3eb3111c3b766675d03466cbfb3e0436433d75fd23edb9fde5f98f4198e073fb23cfcdd19eabaf3d3707796eaef65c03edb9b9dee7d479956f88637efd13378c753e91d747b8c759a3d3f0a554d746c9f7cc93eff9141cf3df0279fe3370cce3e37af9fe77a58eb42356a8e914a6d6e1f8511bf766defc77a4c6b648f39522a939da7daede6a96f4737ebd58deffb9574f9c877a9bbc7af5d7cafb551e7988bcef0b797eac6697bafe91763d07bc175e577170bc3cff2538e6bf4721ef1ba75dd7df371ec40dbc3ec17b5fec0479fd7fdaf15729e2a6a916e6f9f299afc1b1c3aec19b35b09b58033b753d2c764a0f63a7ae63ec2679efab153b15d6135932dfaeabf964a9d4f906dcabcef3df15ccebfb2b5c8d46aba54e96a65722efff161c43dd35daf535f2f72460a3627d72f29cb8aecef1df43a5ce77e098dbd5576ad4d3ec5aa8bd77a16697f287efc131cc6fd4fb7ed0de3703e7afb41379ec89cc93c736507137d91f4ba7c65b8d159b0ace4d97bfd3c039556e2d00e7a00fc87a5aaf05f2da1479ed0010070b34df3840f3d97dfcb1f78443952f301c8a2d0c872a47cb0ce15894221c8b4138cac0fdea1a0cc7bef2b7bea65fae85a3dc100e5527a9291caa5caf308463498a702c05e1a800f7ab6b301caa8c6fa0e9576ae1a80c100e55cfa8328463598a702c07e1a802f7ab6b301c63e47995177d0a8e9d34b815d3ee5bc93ce5af3886e950e96cd2749e44e27d959757b5eb076a3c0f94bf0769761ca4d971b0bcfea3d7fe6a65d4f7c00ef51cbcfe93167e95577d0a8e9df06d9daddd779866df61f2fa384d6793a6f31de257ab354efaf5c3354e87cbdf23343b8ed0381d897052d755d9fa3db0433d07af2b4e7a197834f39681476bfac7b064be6d7a5e5dff599e9f85dc77acf69e63b5f71ca78553d543791ba321b8879fdb9f25d2563365576debe673a5f6a99adf9c2a7f4f61de3af5296ed89acbfa6f7395be0ae4f5d3349dd36ad0599bc2c679cc5b379fc3bc69e474e6ad9f9c2e356519db42b5e754ddfc0cafaf293d711eea6df2ea6da3fa3d54fdf21ae6adef156a76a9eb1f69d773c07be1751507d7326ffdf25af97b1df2be71da75fd7daa7e59a05d2ff2de17bb9e79eb97ead84fddfc4ce6ad9b9fe9b26ba9fa873076c535b053d7c362a7f43076ea3ac66ebef7be5ab1537539e5cfaa0e06c2c340dd4ba52db69025d27ddf26f29caa979d95bc5ffccdafa9baced9d2a65fc0b11337ad54ff95c946593f4ad44b555a398779f3f173e4f572c3fb61fd46d54b978073aa5e7a2e38a7de735e32acbdaf96d716cb6be783779d0bee57d7607c2d95bff534fd0bb4705c906638543d088643d54bd71ac271618a705c04deb516dcafaec170a87a5a7d4dff622d1c17070887aa97ae3384e39214e1b814bc6b1db85f5d83e150f941034dff322d1c97050887aa975e6e08c71529c2712578d7e5e07e750d86a3aea67b15f396ef57c9ebaa7cbf9a79cb77fd79755dd5239679af335867561c5624c3d226557e934e3d40d9a3ea9937487b7e05c7ce3d6dc7a5d05275019597dfc8bce5f38d52e328d7e6b6f77bdf1dbb8979cbe795e03cd4dbe4d56b77b3bc5f9531b7336f9e7f20380f756f93f7fda61d2b965bc9f337cbf3bf8363fedeb5defb98ac9b3355f7ff43bb7e88f61efdbaaa73ff9982b15eee2adb7ef1dad65e950faa5eafe26675d2673adc2d7fd76adaca676fd1b46f91daaa3d77b8a67d44527ba72188b62a776fd5b46f95da1be47d476ada4725b53bfda56963f17eb4f7dd68fcff5543fcdfa1c5ff1daead1d3647fcabf4aac5953836b55356cb77dec93cf953c27fee62c97ce52e702fffbd9b79d3efddae6ea7f552234b7bc7bdcc9b87dfabe9dea75dbf4ffede036cb847fedeaf31bfdf7d77c7f5ee7bb753751715f70f6a717f0c380f6d7c9879d3bc3afe4afad6b95adc3fa0d9f180643044dea7da71795a3c7c54837d7afbef41ed39755de5b7abbdd715d3c4f30f69f1af9e1faf5dd7f577d3fc43e9ab7858cfbcf5eaf51a373d3cc769d7d5fb54fd4bc5c3239a2f3ca2f9caa3ccd3ae4fe81faf5d57fa2778ef8b6d609e7ab9ef34ba01b9aea7513d5c8f69e17a4c0bd7e3de7025383feed5ad16bf7781f875fcb4a3cadfb17c40d533c2c8438e92363cc1cc79c8932c997e9f04f7f2dfa798370f79cad5dd49696769ef7846e3f78ca6fbac76fd59f9fb34b0e169f9fb1cf3a6dde7dc77ef50d77def0eaaaf46a5d117349f3e069c8736beccbc79883a96794817355ea9f290e7353b9e77ede822f5981a2ba8290fd1edd3c7185ed09e53d7551ea28d4329a689e75fd4e25f3d3f5ebbaeebab3ce4094d5fc5c34bcc9b87bca471d3c3739c765dcf43543cbca2f9c22b9aafbccabc7988d23f5ebbaee7216a5ce835162c0f790db98ee5212a5caf6be17a5d0bd71bde702538bfe1d5ad16bf4f82f875fcb4b31a67cc441e22fb75636f32731ef2164ba6dfb7c0bdfcf76de6cd43de7675bbaa71a32ced1def6afcded574dfd3aecbf940b177800d6a6ed2fbcc9b76df77dfbdb3ecffdc791df3a6d18d9a4f1f03ce431b3f66de3c441dcb3ca46b27afcfc43ed0ecf8c0b5235bc5f11a2f4f340fd1ed53cfe568d73fd2aeab3ce408ef75c534f1fc875afcabe7c76bd7757d9587bca9e9ab78f88879f310755d71d3c3739c765dcf43543c7ca2f9c2279aaf7ccabc7988d23f5ebbaee7216a6cfb33162c0ff90cb98ee5212a5c9f6be152e32b2a5c9bbce14a70dee4d5ad16bf6f81f8e5ed3c35b72f481ea2f73d7cc1bc7d0f5fb8f7747d3285969c2390c84fbe64de3ce34b57834f55e376ef3ac0fbeed8ff98b7efe124701eea6dd2f4ae67def4f595e68f0782f350f76be64dffea389d3e772caf5561ff86559ff3a1defb2df3e4bfb16fc079fefb9dc6ed3b57a3979a1f9ba5e9fda0f9d90f9aee8fda75e90fb1ef59b57ec784e6cfda333f6b9a3f797d37e1375f2535633f79b9c77e91cffc0d8e9d70ed96edbd5f8d7da3f7cf00f6c3e74e66de745a4f0bd3af5a987ed5c2f4b5374c4a9f9d228f7fd3fc538ecf25f2b9dfbdbe10fb1d3cc77fffd0fcf70f373cddabbcf725fa67fe94f7ff038ef9ef5ff2fc079a7d7f6976feeb3d2fee6be87d4685418415e6a12a6c39e018fab9fefc4f019fff35e0f35f077cfe1b7fcf27def7670df7ff58c3fbbeade5f35f077cfed780cfff14f0f9efbdcfab349828e3141f59c6edba515e0f52c6a9bcf91f964c07f9f2dcbf52e75370eca4cdde5db4fbfe619e3c20f68fd79e38d3fc6c1a38cfefffdbbd5e8769ba7f6bfaffbae1ee9de7d549f0d174d4f36caa57a74e4cbb3e0584ddef5cf50a2fc7b8cc635539258e39b38daeed7d54ffa09ca7158f7bd9293d711eea6df2eaf599e4d561602e99d15ef5bebade3815c7ce7f39576bf7d5f3da1557e5868a53354f5ef9d812709effd6d1e254d99907ae8363116e7e7f5ce3a0f4d43cfb8de098dbbd4e8b07659f9a7fff895727a1db50b3bf1c3c07edd3ee17f6395a39aaceb7c4102e10ee844e4df193cac7e478791c7e6ba3de07bfed50752a391732de8479ea54f1c6e03cff55f9c44670ec68f47b51ea64697a5b334ffe248ea16e33ed7a33f9db1cd878803cd722794e5c57e7f8ef5652e73b70cced526d937a9a5ddb68efdd46b3ab25f3d461e2ea1ba685dafb7ed0de77b5a6a3f8672519a96b09bf6bcc3c7974dfbee0597e1f9cebead70fe49c25d60c689ceebe678c1ab796738612f34456266d6edb208d77a8b9496706b0536ac45b81386ee532e59f68897bba32af1fb792dcbe06c7fcfa5901ec50e5d4d9b5d050cf9e039e3d175c6ba8bdeb1cc33539f723d147e1372ed4dc8f8bdc67e6a836ad9c4b116fed32ab53071cf3eb606e4791aae7ca31c1f8b6c0be75886e5b4db7ad16576d9837df68e3c6ed800daede00d5cfdc41bbff33effd0365fec0e4dc983a2aff3231690bec87cf64a5782615db4be5ef650883f61a83f669b06d97642bfe86cc3a68cc3a4806bfb95a83148b0edafd9f79ef1fa4cacb4bd260d64eb3453d535b6632df8c7704e1ec28ed5a2fc321c3572d7d7794e1f9c5fbdceeaa3e24e7b3303837c664cb95487c6def8dafc4fb55bedc8979ca7b71bf3acf7fb7d3e2673b69dfb9eefb76577342ae728f17cb7938ec6a707f43f0773a6149877567a0dbd9b569f06eae0d8355bea2b3eeacb156cfa9711dc5fa9a1aecbb1661bda397b53886efdf8179f3f21de4fb6599b887cafbae4358ee00c2bc439ab6a6627983665f17e6ad537771eddb63ad767f57edfe8de0985fbf3e804d37b9612f53658a9c1fb36703f7fc9ebdb4b8bab18677297fd98979f38d9da4aefa16ed16244e77f6c66922bfdd8579db01bb306fbaca66de74b533380fedd9e8b5672f35c679ab66cf6d5ebbd81df2b9aed2be7ae098ffee2acfd707c7fcb9db59229f9ef3a6fb3b44f99d62d54d63d54ddaa6da427722fed90df8a77a46b56dd5f8f8dd69d821c7d8d9bdc8bdfc9c9a9ba2cad4fb91f8dbcd1b7f71d52faa7cbe3bf3fa7c77d7ee21729c9a3d207f1fd2f41fd4ded343bea70138e6d7f56fef7938d53719ebe5efc3c8bdfcdc23eef15cc56683fc7d54f3839e9a1ff494bfbd343f50e9e7b1e4bbe6aafcf27184616f8da15acf4095b9da3c3fdf69fe49664cf343e5bcb1612a5f5169fe09965e9aefc3bc7edcc7d51da6c2f71412de1c2dbcaaff284fd3dde4d51daecaeca735dd67bcfa893893eb1bd469088ef96f3f2dcefa3134cde4a9369b0a73ae16e65c695b91bcef59664ebbb949a68967949f3ec7bc795f7fe6cdfbfa336fde378079f33e3976131fa8854bad41912a5ccfb39af3821790781ca4c5e3202d1e77d7e2717737dc79aa0f43b5f75fd6f45fd2de23d7b548a4fdc10c4dfb796abc48ce7d60af22f7f273af316fda97f30aaaa5fd3d9837edcbf534e27b6abcd5fa1aa6b4afe622a8fcf44d84e95e1a53b55687ca0bd49c92dae605ef30635e305296ff23f5f21fcc4330eaaab555545fd110e62d778748fd0552ff38edb9aeda739bb4e7d6fbb447adcfd101dca798cb77c6876af13694e1beff9ee623ef233e324cf39161f277b8f6aee1297ce403c427f2349f50bea0d2d9088ddd0897dd681597322ed8479afe87da7b46326f3a1bc9d074365aad85f331ab399da939052a1e3e45c2394a0ba7fa9e5b85578db5d7d6f73f73df9b58b727d5bd9f6bf7aa77aa716c533855bfe36869e7efe0d8898f316f7aef4bdc3f86257d558dabffa9dd2bc7dde36325a346e098ffee9dd4107fabf736f4dab0f7e5dabb27c8f77d098ef9ef3879fe1d70cc9f97eb31edade2c4c4508efdc7276a1a13a586f4a1bd55ffc52419a6c6e058e9f0f34de4fd9b347dccc657b5fbd3cd27e45ca399aacdadda802a8d8f67de343e1edc07d23893edcf84df9afadfbe718f67ad96c76a1e824a23a97c33db0de7585927e7c116e7557d428d959b7c54f6353335fe20c70eeb344de3bd3f8367307d153793b5b899ecda3c4e7dbfa0e613a4135e95067e65a9f3fe541a322d26d61933adc725afc5a730ef58d514d7f6f12aedfca169c9feb8783ef3a64d399e1887eb06fc09cef1df69cc9be7aab145439e3b5ed59bd4f8e13fc8bdfc9c9c6f90d20753f08ac598b19e3041a6ff09a9d2bfaa0b4c07e1967dc4f17d34b6fbb8ba13eb7aef4bdc3f23a9115363967f7aef89a9f2623f8dbf9cbb1297ebabd5d90a1c0336099bbef6da34e94cedbe59d5c3139376c7676bef9e2d7ff74f3e23fee6bf6a7da9cf81ae3acf7fd537bd1bc131b4477ff75ceddd73e56f01787781f62eb5f6d4b7e098ff1602de4c9e2b023a85e01cff2d66de31b362696b99f63ee50b59c970a86b89768d5a874cf6d74dcc06cff2fb7604fc653f6a226f964c1379f34c701fc89b6359ae76b99ab7a4c6f452b47f62f599a75c88a9f493226dc5e4b1cadf638d58daf95d4c96777ada9b2cd7ff9abc3e85864a376abd9c4fc131ff9dcfbcedd7f9aef61459ff9fb2c6ab93d003e38735a6c303347f5463afa5cc9b0e4bbd1c13b6fda2d9a6be6754df6f83b1e758634d43adafb3111c738d4d6ef8f25723e12babae195fc4d20f73b9166635aebf580bf322701edabbc96b6fbe2a6b528539557a50f31aea8163537a68cabce941cda74d951eb666def4a0cae754e9a139f3a687162cfdf4a0d6ba94fd0bf125cc5bbf5ee2329bd6c67b5f4c8ee5c6976a7123bf818f5726f9c5d5f7e4abbcefa8b3b5f68e8391772cd3de21bf578e83ef94c5dffcb78a25f37f87c934355f2b0f5c5771dd129ce3bf72bd9e447d61857cd6540750fd316d809f28866a1d9f4fc131ff55eb057d068e9d704fcf76b5a7af61e6f01fa8855fcef38d1f04c22fd7fc891facbdfbe01adeadfa74947fa97162ddefda21e7e598aa580fd209c3be6548180ed1c27008789fc62f26c783e3876acf1c0a6c6908fee6d7566be1966921aed61efa0c1c3be1de67ad6bef3e5f693a8703ff51f6f1f3dada41e23e751ebca74e73ef7b66cc45781ca985ed48f97b14885339b6173f5a7bf7d1489ca877a87cf718ed1dc780386b08fee6d78ed3f8c9bea4b85a4be83370ccc325d7c1dd77374de77884df095a188e07e7c17b12fce47b12fea4744ed4744e04ef577e08ee675d357b543eb006705e03ee853eb3d11b9733d769b6c8e7e22749dbb3c031e6938ece7e6d5c76fb8d96e7e57ceec4b8bfaeafaeabb58adb69d74fd1de7f8a16779f320fd3fde4f8f77eb2cd133f557bbfae7faaf6fef6da75b50ed3f7e018f329ce51867fe64a8dbfaaabaa3428c7df626dc079fe2bd74e52f974357bd4da4a3f21fa6b803ef76155174cd5c6edecda3e4bf527aa38d2d6798aabb95a9da48db27c8db575df75808cf36afd1f724da3449de24c709faa53f0325e8d85e499df93b2ac97f11a6bef6af5571a67cb77827959e26f1e5ed5f7d8129c87f981bc8f37c93ce94bcdcf72de335b8d879469d7d4dffcf71c104e75cc9f31f51bcb7967b3d5f7b81d98a71f39d651dea7f7239fab3196f11e3f4f7bb79ae3a5f723731b541f8beae3536b00fd0e8e1ddbf67fd17b5f4cce1f89af65de3c59f5d35dc8bc7559b9368f9a6716576b08fd028ef97b8a5cbbf6bf1f79df45dafb2e92bf176bef53e37b3929dea7c2d79079c23a47ce3d8da97a3256bf05fc629db438eb8cc4d93a2dced6c9df4bb438bb0489b39ad2b5f2958b93e1f2ddff753bd04aa5a1ee5773891e0df0cec78096aacfaa3c458df9d6729e680cb67dd2b54b3ddb05d8b313b8d6d0fbae5897ead7623b338fcffbb65ffa506c975ad8af9ecd06f67405d774fbb3ab5f8ba9792ab5b55fceb98a81b9287efd2226e76ec4541f7c8ab98de29e86dafd2aff566b696d04c74e5a9fa7d641567353eaa6b0a9ad573bf14c562dc326e76ec4d4d85baab0f5026153f7abb05da685ed32376c85aa3c51f3515285ad9d573bf14c6dc326e74fc454da4d15b61c10367d7ec7e55ad82e77c356a4be1d55df1cf6a9c1c7da7bf5636adec8f7299e49e5dbaa3c53765ea1d979856b67715f37ccc553b5e7ba6acf6dd29e53753cd55e80ebe399ecea247f55dbfc4aa9fb2b38e6ba1ba43d7f799f8bab35d83e07c7307c4aef17afde7cb56ef8853eed94f7c7af967ed6121c2b1d7ebe550aad54fe97cb8cfda2f365f8e7bf896bc4e41c9a981ccf8dc9393ff16b98b73fe51aa961e84f890df43e9b28479c7b0a54fd42ce8949ab5f4b8e95a97c3daed6ecfc0c1cf3fb0627df53b2210ddd3dcc9c4ae4f826efca4539c9392cb1bdc0bbb92dd7699cae4bc16988f6ec0d80d35c708edf23e775c6e53aa17564bf4a6ca8572351e6710d3577b0b31bae051be53dc398b7fdd21d6837047f3bcf94aaf24f6fe3c8b97689badc8de03ed86faae671a4eaf3ccf3e10b23cd7156bace3d5f7a3bae11537b04c870c74648db6fd2e2eca6147136c6fb6ce2fb13de0693fdefb1bd7d8447ed73310e7f6722bf546bf6a9b9352a7fba0dc4db6dda336a2dbe8de0d8e1b5b019d004cfc5d51a733f6b7a39da75d9de3ee05caf6d75d4784127f9bb4ab3e357cd8e19aecec253bdcfc5d53a7f9f836343b8127d4c4aef6eef7d420fb6a9d361a6d603dc088e1ded32d5ffaa3353ebfc7d038ef9af5c1bad4e1be60ddb6ddaf5b62c2dd60b557a4e630e405cadc1f73b3876c2b0a8aff7bec4fd602dbd1ae7d6c839cf8976a85c8f2f7e2f607a2f786f43f037ff056b078abfb95d2f2276dd9fbc3736de6c574ccdc57950b34bce8d8e3f00def700782f2c43a41d8b55ddfe0a96cc5f5295e96a1e875a27ef1d70ccf506b871b778ae3cbf5edad8181c2b1d7e5eadcfd63dcdf7a7e30b0f6bbef0b06b5b794bef7d31b96f4cfc118da35c634fccd14d65cb1569de972a3f94739a626a7f13d98e8a3fcabc79b4ea5b30e5972acfd900ec50fde88f6b2c1e972c7ef3be2f914fa8fb378163fefb58525bfced6854dcee7d57e29d709eb80acf93c973358e993eadc5875cb72bfe14f3f6fb3c09ce2bbb603e26ed5cd2467b8f9a1ff18cf61e395f3cfe2c08ebb35a3836c877a83511a680f3fc3ed3fca1543e2b7d28fe1c60a6be0593ebe125be81917d0cf117bce7e3cf83f3fc57ae3f97282b5e74392cadebd5177a2a4ea632cf786fa28e04ed9275a2f84b9a5daaaef6b266d74be03cff7d45b3eb1569d71aaf3e837d20063be2727dc2a5eba5ed6a6e54aa394daa4ff155cd76d9cf137f4db3fd55709effbeaed9feba6b43e50cafbed0534ca76bd77cf6efc5d45e41b28d129773c5ebb4d38ed5b7a0ca36b536d8a7e0d8b1b56a80a607e74ccb67d57a5bb11952e30fedfa2140c374ddcfdabc9e6b5931912e47b36256c02a584fb1f002afa1a4bb5dab7ab2e68d5a45fe2356fbe0ce265e5be564a2158e8061b7d469622fd62aa796d2c7b85b6a5b312f47bd7db8f87f817347a910ed50a7da2beea9f60a6e5c99f36f31d8eab5d2393f4aec14cb377b2d75aef460e39c5ffed45cd69bcd74fef5aa4c775e5bc6963947539dff5708bdb98ed9d5efac29487c5b58fd99298ea6bb6bed22e78c025ae11c97090bf3c5ff970b4b8b85f5639c7355620fddc5ac840d737e578ab7550ffb52e76fd33ba74a64661bcd9bd762e7dd2d725534e539a1e1d6f7143ef95f8c6c8e18e1e8ebf1f4c1ffa9db53944e27548b89ff18ba990cef9c1d23357a0b6431cfb93eaca7e8bf9d528da0ff30560fa1d9bf5ddeb9ac6fcab098c9f0e86e2f42908ce19d724ffef0c8b71e9b91e50d5a0eeb29ba5d3ad410b45460b95eb6989de327085959757b714375fc31137ed105949f41fcee7da5e23eff11504f147ede0810d3fca63a7fac74fe2b736e9ee4fcbfc079bc4ce673d562a61797a92fe0562f3a6b3210c31b37e11535b9a99bc5bbb18dd253036e90084512704f51df6a93c20db177898a521d595b5209a573fe9b638e3d75fd2f6f8eefdb7ff75e032fc932c74f23113fb5792b1643754c31d428d309a0e61c3f55fc344e842b193ffc1f33c326888fd7640346b0ae8960e3cde3e3dcf6daf9389f26dc5d6368e6b7554a1f4c65014630cb4450f4274dcb20c1898e8507c87a62ed186e9d36c3668261db6aa14bc7068c623d03c55e4d648bae9a590d35b3b84588707d4cb84540e10698f03601851b9a1caa69a69324bf562e540a9c7bfdbb13efe5eca6676b667f6a85a4c99a4dc0bca991296e38c26d8d56e991d30a8f9cc69872eba0ca4d30e53641959b9a1c4af45e66be965ebb3292e735add32e23dbb154956cbf25e456267ae2bb8b59a4f4aa771ea9bf8639cf2e70382c173d02cb9ce74d9d4da989b64f3bb7ef20687662a62e307f166184b736793ec7de118b76ddf9dbe1cedfcc24cedfb85d3ad974075cb83926bc7d40e1165846d0296846b00da6dcd9a01cf3a3dc1253de21a8cdad30e51d832a6f8b297709aadc1a738d9d02ba461b4c78e780c26d4d995cb3cc6572f92c8f8d75ae1538f7178bee367e7e9ac89c5555d23de7bd337526b74bda995c76b54caeb61661995c3b53d471c25dd389ba6c3ceada9ba24e644e996c7fc03e96dab53f764d3bb2ba3173fb231d1bb0e8e9806506bb05cd0c3a9ae247e4f199af7df566b9b588193ef8b98d86e0df7fcd71d383a5aa7b61efc762653b53ac70763d0d2619a2a5071e2ddb63d2bd024b7732c5b8287b33d92b35cc39e27fd72e35f64e842149a117ef6fe6b39879d357743e231d7d39ccdc49559349981b74c61267dfa0897307cc0bfa05f6821d4dd2bc56cbe709ebb5da7f9d7ffcd46abb6044fa1b88f8aac9ed8411191098c8ce98f4c0c0d2bb60d283024b6763a8770fea7c5d310f196cf01066323b8587ec8a89ef118278379338ef74d93371730dbedd0417df0db37c2f83e5757d5ade1d8bcd2141134e0f8cc9500393d526b35330e989890f33889fea53bc17263edc20becea7786f83784fd15c3c9c65b6fbc43c5f67941332fe36d879adde5b2e2659708bd4848d29ceef7c61053fcfada8799e4fea82368f552f687b8a46ef0896feac23fa50706b1a8916a4b9cce75f08645b6633569fe86372783e50c03f55a83618cddb5273640596bf7fb1b834c979038f4d7ebed4f9ad9626eae3692207cbe1461b72b898cf1caeaf29c189be8ec59b35c18d70febf4c54f9f8dfcb65f44e15ef4e8ecd07494afc23918e86924d946e46a7dd5b386d9f349c360ceb3177ec87e5bf630df96f9798bffc3717131f67101fed53bc3f9690f8370335766aa448210330e109a614da4a945549d09d4494940ac72e106d8b039d5f3581ce8f1d03317a130df4ca7cd21b6412e7bd7993d2a197a2376f7793302f73271b0a9b5e9c1eef8a888b24912f9204afcc4c930c5709e72f114c792661cab7b9f363f7abe439def92d725ec9b396acac6ae11989876730169ea95878a6254b2b1fefd9037bcf74ec3dfbd4ea3d7b62de3dc3e4dddcdde624ca99e16c8160bed0971fef652a1444377566678ab95965194b3dedd09cbdf37531b7af96bdaf1b62cedaf763d864b0d4366099f4102c279869c809f2e2fe7282a12671de2ae1bdef81da98c330e5d94195876340f63701a9e30f489e497c2b911082b75e476096cf3558be5b963fcb476296178460f9285332168342a5a4c93855d6eeadaefb2d08522779beec6b7a63028522b9776778b115dc562c6b188d65e74526f37de4da634cc2bc39529c8e70375c786f2c05cc37a48066f5fca580b126717e7f09ab5e8af614238fb59b4bc6570aa85797b9fff470fea95fbd144e31cf6a1c96524b0d2935ee33a58ec7c40f3088d7f1293e017338be3c6bb5fa030fa7a9ced6891dc47ab1439c5f77d8acd8f157fe77b9f37feefa2572b235cf263a89691d55acbbf33bdff9ff523125abc4b9d6c9f94f3587b8626fa1385f64248bc4735cdb4d58fc7a1fe7fa20e737c7f9edec2b354cc4fcaacce057bdb84b2d0ae6209330cc8b4d98e78682b9f6303bb1154e8a7073f74e6236ce62e74d6552977fb352241a41c5b279d4c939c3754b841595cebffea263b2890ecf43ca0d7948cbc6fef29029a6824e0ca16772d074a873d752f1e181ffda6a45da45d712661e324dfd76ac30ca37450b27b7349d3263091e25534d5122261f64b209a1373afd454a65da9152c5cccd879ade8f45cb34133d31e9607206e9a5f3cd9799dcb2b4c92d17e45a550b55cacfa2106ad30dd47a716a7c5de9869a3985a6527439eed0fb6019d84a4306f6aecf0c6c0666f92a83e5f57d5abe2f66f98106cb2f6fe2cff2fdb052ef2053a9c74ca6a728356662a61f6c30bdaca93fd36761e28718c49f6ce64f7cb6499cd7e8f8b7e6411b76fb63e28785203e07135f1d82f85c93386f921e6eca3174e1425cb800f3c323d2114ee182f3302f39d2e025d737f7e7258526717eff510ca9a41ecd0255528b304cc798922b6f39f8ada4f2c2c8c6f6403186fa580cf571c150cfc7501f6f423d2f34d4d16913949808f1a475822169ad6fe92f692dc0b2b11343c8c64a31f13521881f80e5912705cc2317621e7972c03cb20cc3718a0187dfc96b8b302f39d59401b7f2e7258b4de2dc98d3d24192a2fd538e099f1e50b802637d4608aeb7c424ceeba167a663758a3ae8522c12cf324462d5b6fe22b112133fdb203eb8b53ff12a4cfc1c8378dd36fec49761e2e71ac45ff429be1cf394f342f0941598f8f92188afc4c42f08417c95499cf74cac4dc7c7ab70e1034dc23cd7e44b09572bf0f96408bf057e952cbc4b6a51abf257341f8485e5225358f8854e9eb7fa79d7c1d8bb2e36bd8b0fb0cf71feede5fc57586d90865fe12b592d1564fd58710866c53a93152d80158b64e5a740b0afbd058762165c62b2a011b0600edb47784695cf72fb302cfbb9d494b7b5f797fdacc612f1652124e2c331cb2f37583ed7a7e54760965f1182e54762965f69b0fc7e9f961f85597e5508961f8df9e7d526ffe4337967cabc6cb69337cc94f9d020d9e870cfcd10bfddd99eceff47803cab500895397f1531de3b5ee5d4e779feb2527462168bb3453ef3b46330fbaf31d9cf6745252d52dfeb754a8469900ccf6cc3c08c9b67eb0da845e28e4a39a3c46d8ab9e1ab646e87ec2af1a49f301d6b0a1377906b1317b456ad58fbbc3e73ffe9e1fee3af617b1ce664d71b9c2ccba7931d8f89df6010afe753fc04cc036e34794097b43cd86d3af7747efbca73ae371fc4fac97b739d5f3f717a2216a73761717a73e0385d83bdf316ec9db7067ee7495854df16426675b2499cd7f2f8fabf416a79a760a4eec0488915c4b320297f9c4ec538dd1502a7d34ce27c56e9dde9704a31abf47493302fe7ee61d5cbb901b9fecab93330f17b0de2b37c8a9f6912e793e0f812ea8126c19d8529df1f54f96c4cf981a0cae760ca0f06553e17537e28a8f279987bac37b8c7a6fefedce37c83784ff1d9361f0bdbbc8b1fd46ee183874d49dd385acb1799cf165bdd05b1061bbfbd008bb6470dd1366980bf685b8be5a21b42c8452fc4c41f0b41fc220ccbe3062c1d7c62b9d824ce5bb77c3dfc609fc2aec3ec7ed26077954fbb2f3189f354f894c99975e14770e14b31ab9f36587dfd407f565f86893f63105fe953fc722c3f7d36687e7a05a6fc5c50e52b3120cf1b8064efee0fc85598f80b06f1ab7d8a5f8d31793128936b30e597822a5f8b0179d900e4ccc1fe805c8789bf6210ffc9a7f8f51893578332b9c1a4ccb36ebe8942d0acfb46ccecd7839a7d934999d37ec340fbbb3dfcd1be1933fbcda066df8299fd96c1ec057bfa33fb564cfc6d83f86f3ec56fc3c4df31884fddcb9ff8ed26715e0af3ddc98295c27760d2ef19a463bea4efc490bc6fca4e7c22b90b13ffc020feae4ff1bb31281b03f3be07b3fb4383dd0d86f8b3fb5eccee8f0c761b86d953d87d9f499a0fb67c9cb8a07dcdf809abcdd78cf7637c3e35f0c9f6c9e7014cfc3383f8069fe20f9ac4790f18dffeae5aef215fc1897f0ec47b903b89f1a995ac4a8ee115882f32d5489f9fbec187b0006e3204f0389f015c8f897f6110ffcea7f8c318bd2f4df4b84febcbf8774a8cf7f1c633d7f0d757fe0816bcff1982c73fb2f413bc47b194f955e01c650366f7d706bb67f9b4fb31ccee6f02dbfd3866f7b706bbcb7cdafd84499c5751f87ed981aa284f62667f6f30fb139f663f8589ff608acb61fec49fc6c47f3488dfee53fc194cfc278378b3e1fec49fc5c47f36884ff229fe1c26fe8b417c934ff1e731f15f0de22df3fc89bf8089ff6610efe253fc454cfc7783f87a9fe22f99c479deccb75eab96dbf30f6792656585e894548b4357062e335fc602faa721a047f90ce82b98f85f06f1af7c8abf8a51fcdb4491375aab9799eed45c5e5efa61f61a16ac7f0cc1facb67b05ec7c4ff3588cf18e14ffc0d9338afc78a1d024df5d858ac36f5d837b140c46386ae3c9f8178cb24ce4bb73ab180a5dbdb2665ee397563c1bb3bdec1986419987ce793c9bb98783d8378b351fec4dfc3c4eb1bc43bf9147f1f136f60103fd8a7f80798784383f81a9fe21b31f14606f1ecd1fec43fc472b7c631645db56419014b04776ea4ff72e1232c704d0c81fbca27b98f31f1a606f1a93ec97d82e5715b6179dcd6b5cae33ec502d1cc10882a9f81f80c136f6ec2ef53fc734cbc8541bccd187fe29b30f16d0ce2837d8a7f81a58a96a654d14aa48a02f0f94f586b997d89d9d10ab3a344d432e6b07cc63f15aa1083cb558e6513d90ae66e3f5a293e2faaf065c7ff303bb635d9c187a6d5acd8f4ede14f2cf55d47fa0a7383d606376832d69f1b7c8d89b731882ff029fe0d26ded65477f129fe2d9639b5c332a7f6b5ca9cbec302d1c110888d3e03f13de6751d4d5ec7d7cec993f5eca520e5b93d7fe5897a389fe4512a4ab0a2c42774fc3c4fbfe562a5d079ac4c966fee94113ffef803067e3b0cfcf6b502ffa3e13d3dc5dafbfc0b88cdb7646872cdd5f9a26ee0ea4d10e97a8548fd0b3d8b71f239fa6e1e117429d14eb1ea4b898a6fdd3944e3449ace313e91664fc6366ba8b089383f61debf83c9fbf9d445bedeee1271c8e9247358ce8bafbfebc78f7fc612f68e86843d649cbf84fd0b9648ba608964a75a25925f4def117befc482cdabfc0d13de25a0f0ef18f66c03f6bf7c62ff0313ef6a105f3bde9ff89f98bbee6a72573e25779ce3fe054e925053f12baa759bb85f3a17d4aa61f117664f37933d3c60fafb27b002dfd9ffdf18e2dd0c889ff489f81f2c48dd4d416a6f405c2cf27dbe745e2adc7e02fc2f16e01ea60684cf00277b8bb464d63360328b9984b9d5bd4c2d9309feac8e9bc439c2de58935a5592f58ec3e1a2f3d5efa77c75b0f7f731bd9ff724e99575dc8eda55d2eb6216e5982c6a68488b95bede9785456f5f5317d8247fd15b0f13ef67106f39d99f787d4c3cd720dec5a778034cbcbf417cb44ff18698f80083f80c9fe28d4ce2bcc23010ab300caa5585a1b1e93dbc6376f7103a669b6084061b089de99350534c7c0f83385f18ce8ff85698f89e26aff429be3526be9741bcaf4ff16698f8109357fa146f8e890f35750ff8146f81b9fc30cce587d7cae5b7c102916708c4b3d3fc05a22596f18fc08a225563c99375117ebcc2d3d75c98288cf6a845b5b01566d14893450d0c45919fb76d8bbd6d94e96d7c6c29d97ed30b613fef6d8dbd77b4e9bd3cb6937c55b5d75f91db067be318ac889f1a683cb92de6b67b9bfafd66f973db7698f858534139db9f787b4c7c9c41fc5c9f9677c0c4c79bb2249f9677c4c42718c437f814df0e73a08926076a0c12a6dbc551c5dc55b1fc38d1f6588026190254778ebf0075c2c4271bc43bf814ef8c894f31751efb14df0113cf37881f35d79ff88e26719ef34d8d051c55ef82294f0baabc13a63c3da8f2ce18ea7d0ca8f30afca1de05337b4650b3b331e57d832a77c594f70baabc2b867aa629b1cff387ba1bd670981542c361379338ffcc6e763add20293eb3eb8e59bd7f0856f7c078cf31f03ece27ef9e1892b90191f4c290148480a43786649e014951a13f247db002b4301d24a9b6bec390148580a42f86a4d834ce50e40f493f2c33991f3433c9c5cc2e31987dfd7c7f66f7c7c417986a0e25fec407606e526aaa67f1152ff9f06095b1c3b8180c9716d5aa1a3f100bea01a6e8f719d44158137a21d6842eab55137a772c108b0c81b8da672006633ebc38a80fef81995d6e30fb559f66ef898957982a360bfc89ef85f9f012930fb7043ecc279b2c63f39d7fdd21fe4562afa0e25af9ee102c884b4d6d2d9f411c8a89579a32189fe2c330f12a539f8f4ff1e198f83283f8b8527fe27958925e8e25e915b54ad223b054b73268aa1b89e15965aa16f9c4330a133fd020fe9b4ff1d158aa3ba8a65457c0f81299e5e2af22b69c15c8ed806b93eac660413cd854381ee02f887b63ee7508e65e87d6cabdc6628138cc1088329f811887c5d36a3c9e92b9a21a2a86937b6bd305391eb3e27093153c3873c4c49985cee1703131c69d8254e6ebad13b0b71e617a6b2b0697ef34bfbd76239e13313b8e34d9c12bd3ee0644c5a2172b48d7ef24ccb58e32b8d6da727fae35190bd6d1a660f1f698eacfe745ef2a99ecf951a1ecdf2f134bd7bbf3f07841bcb25699c2142cd0c718023d7889bf40e71bc47b6eef1cc696b2cd39d5ce34d93139cd788ab8ca77410c3eb5eed818ffe8c54bb167274e2097d53c792e4c3bb71743325c8dbbcb54c999ffb3bde813f64ef084d7bb89e1159e9e46ca7d18f24599c473b91251889b27091e17e393af321d4e6c52e054ccd18f3738fa773e1d7d1a267e82417cfd527fe2d331f1130de2332afd89ef83e54b6bb0228f27af5291e3943b6e32c3c9a70655cb76f93aa27e72a11998152799ace08e1c24a3df17aba29e1cb48aba1fd6e1734a081d3e3331f15343109f8531392d2893d9a642a033cf0217921602e96f8dabb65c0d6f2bdfd34d1d87c64cf20c9149f6647eb6f2ad8dbd58b6b8bf29def9ccba33d3e9fb4cb1ebee1c4cf8ac80c27331e1b3030a176049e09ca049601ea67c6e50e5424cf9bca0ca4598f2f941958bb17cec8210f2b1f998d96b839a5d6252e6f9d885e9f81d4fe788f00293302fb22f4a4738c5cacba518e88b43007d0086635d401c0bb1f47d49c0f45d8671be3420e74518e7cb42e0bc18c37179401ce598f01501852b30ce5706e4bc04e37c55089c976238ae0e88a31213be26a07015c6f9da809c97619caf0b81f3720cc7f50171acc072fe1b82e6fc2b311e3786c06315c6e3a6803c0ec4846f0e287c1086e39610701c8c89df1a82f8212671de50bc2d1d24a9f63ec27ceff6a0be7718c6e38e1078acc65ce4ce802e7238267c5740e123301c778780e3484cfc9e10c48fc27cefde80be773466f57d21587d0c267e7f08e2c762e20f84207e1c26fe6008e2c79bfa3476700e6307b0cdd1a761da892fdc1e8d87d2f1d27c9cd80998fbaf0fe8fe2762f1fc7008f1bcc624ce67f63c928ed529f6b23dc9e4403b72079abf591c88ce711e4dbb2b6c83e80adb95e15d6141acc43ac04e3645318f89c7d289e20d783bf614ac4ef078d03ac1a998f21341954fc3949f0caa7c3aa6fc5450e533b00ce0e91032803331b39f096af65998d9cf8660f6d998d9cf0535fb1cacdbe7f980dd3ee762add91702b666cfc340bf1802e8f3311c2f05c4710156837e39600d7a2dc6f995809c2fc438bf1a02e78b301caf05c4713126fc7a40e17518e7370272be04e3fc66089c2fc570bc1510c76598f0db01852fc738bf1390f31518e77743e07c2586e3bd8038aec2ac7e3f04abafc6c43f0841fc1aac85b031600be15a93306fac7d18b04d731d66f147012dbe1e13fe38a0f00d58bde093a0f5821b31e54f832adf8439dd672138ddcd98d99f0735fb164c795350e55b31e52f822adf86f9dd9701fdee764cf87f0185efc0587c1594c59d98db7d1d82dbdd85897f1382f8dd18936f8332b9c7a4cc5795fa2e9d684cb1aad4bd5835fafb80d5e8fbb00e9c1f0276e0dc8f41fe3128e40730e59f822a3f88a5c29f03a6c2873077fe2504775e8f15dfbf062cbe1fc670fc1610c72358e5eef78095bb47318bff0868f1064cf8cf80c28f6128fe0a88e271cce2bf035afc04e6cbff84e0cb4f62e2ff8620fe149671b078c08ce3692cdf8fc583e5fbcf60f97e3c1de114f9feb358be5f271de114f9fe7318e4ba41213f8f296705557e014b2bf5d2819122adbc88b973fd7870777e09cbf71ba463758a7cff650c47c380385ec132bb46e908a7c8ec5ec52c6e1cd0e2d730e12601855fc750340d88e20dcce2ad025afc26e6cb5b87e0cb6f61e2cd42107f1bcb389a07cd38dec1f2fd1601f3fd77b17c7f9b80f9fe7b58bedf3260beff3e06b95550c81f60cadb0655de88a595d601d3ca87983bb709c19d3fc2f2fdb601f3fd8f311ced02e2f804cbecda07ccec3ec52cee10d0e2cf30e18e01853fc7506c1710c526cce2ed035afc0596fc3a054d7e5f62ca9d832aff0f4b7f3b8490febec248ef1890f4d798709780c2df6038760a01c7b798f8ce21887f87b9c82e415de47bace8ce0e5874ff8015dd5d0316dd3f6245f7ae018bee9f30bfeb16d0ef7ec632bbdd026676bf606ed13da85bfc8a99dc23a0c9bf61c9a46708c9e4774cbc5708e27f60b07b0785fd2766769f10ccfecb24cec7bd73d289c914e3de7f9b84b9217dd3115e820bff83e1e817028e7fb158cc0d1a8bbcf7cc6876ff10cc8e99c4b9d903829a1dc7cc1e1882d9754ce2fcfe41017da42ec663f7a03cb2301e8343e0510f13df2304f1fa18933d8332698099bd57086637c4c4878420de08131f1a8278634c7c5808e24d30f1e1218837c55c252fa8ab6c85298f08aabcb5499957284706ac50363309f30ae5a88015cae626613e657c743ac229a68cb7c084c70414dec624ccab7d7b07acf6b53409f32af3d88075eb5698bf8d0bea6fdb6209707c0809b035263e2104f1361893894199b4c5cc9e1482d9ed30f1c92188b7c7c4a78420de01039e1f1478474c796a50e5ed30e5694195b7c7504f0f0175274c7c9f10c43b634c660465b203a6bc6f50e51d3120fb8500a40b66f6cca066ef8429cf0aaabc33066476084076c1c4f70f413c1b139f138278574c7c6e08e2bb9ac45b38870571be5dbc2e5e4dba072edd0d739479411d65378c48610844ba6366170535bb0756952a0e5895ea89f1981f028f5e98879404f690de98dd0b42b0bb0f168fa541e3310733fb8010ccee8b892f0c41bc1f16976581e33217c3bd2828eefe1891c521101980899787203e10c35d1118f720ccee2521d8bd3b16974b83c6e5602c0bac0c9805ee81f1a80a81c79e583c2e0b1c8f7b61762f0fc1ee21583cae081a8f4331222b031319861159150291e198dd0706b63b0fb3fba010ec1e81c5e4c14163722496220f09982247613c0e0d81c7688cc76141798c3129f361f5d5e9f04831acbe3766f2e1414d1e6b52e65bdc1f918ec955b8f038cce423839a3c1e738ea342708e0926f11d9cc3a3d3e191627ed9448cc73141794c3228f7ece21cc6e6b24caca39fcff2d858e75a8158a5bd873caf96e0e67a43c51b92abb37b9fa8618d7c13f79846c75d513ece5788e922ee0cc7326c5598c9585c1e1f342ea760ca270455cec712fa890113fa54ac105813b0109886099f1450783a96819c1c4206b20f1683a7048dc11958e9726ac0d2655f8cc76921f0d80ff3bbd303fadd4cccea3342b07a16267e6608e2b33124670544b2bf49980f969e9d8e708ac1d23998539f13d4a9e7622cce0dc8a20063715e4016f3b064787ec064586812e6e3bb17a4239c627cb708135e1b50b818738b0b83bac57c4cf9a2a0ca2598f2c5419517608eb12ea063946299d125216446076009f0d28009702106fab2a0a0cb30d0970704bd08037d4508a01763e25786205e8ec5e2550163b102b3faea10ac5e82b9c835415d6429c6e3da803c2a4dc27cbeec75e90867e3c25518e8eb4300bd0cc37143401ccb311c3706c4b102abfcdf14b0f2bf12f3b99b83fadc2a4cf996a0ca0762d1776bc0e83b088bbedb0246dfc1188bdb83b2380463714740168762c27706143e0c6371575016ab31e5bb832a1f8ee546f784901b1d8189df1b82f8915834de17301a8fc2d2cafd01d3cad1188e0742c0710c86e3c180388ec57cefa1a0be771ca6bc3ea8f2f118e98743207d0226fe4808e22762e28f8620be0613df1082f8492671be83ed63e938e023b8f0c998f0e301854fc1849f08287c2a26fc6440e1d3b0cad253012b4ba763c24f07143e0373b9674270b93331f16743103f0bcb9d9e0b9a3b9d8d99fd7c08669f6312e783d72fc4830e5e9f8bd9fd6208769f87d9fd5260bbcfc762f2e5a0317901a6fc4a50e5b55871fe6ac0e2fc422c125f0b21122fc2ac7e3da0d5176356bf1182d5eb30f1374310bf04f3ebb702fbf5a598f7bd1dd4fb2ec394df09aa7c39a6fc6e50e52b30e5f7822a5f8929bf1f54f92accf33e08c1f3ae3688f7dcc9398c4d6694d305bccac39c23fe371f7a5fe49c2f14c3fd7cbfee79354c08d8e8d8dfbc1a5de38c800fe37c4640ab6ac14af5726cccff1aac2af451c0aad0b5981b7d1cd48daec34cfe24a0c9d763267f1ad4e41b30e5cf822adf88a5a9cf4348533761a43705247db349b8b173f8453ac25be1c2b760a0bf0c0afa560cf4ff42007d1b26fe5508e2b7634cbe0ecae40eccec6f4230fb4e9338cfd0bf35e694ba32cf2411e5bb3020df05057237a6fc7d50e57b4cca7c70f08774524caa55c831937f0c6af27d58f5f8a780d5e3fb31163f0764f100c6e297a02c1ec458fc1a90c54398c9bf053579bd49994f43fc3d1d938fc393dfc398c97f0435f9118cf29f01293f8a15847f052c083760aefc7740577e0c83fc4f50c88f63caff06557e0283c1ea0483f124564ec5ea84b00239261e0f41fc69cca3eba4832485473f8309d70d28fcac49984f50cb4a4738c504b5e730bfab5727e822e4580cd60f21065fc0c41b8420fe22c6a46150262f6166370ac1ec9731f1c62188bf8231691294c9ab98d94d4330fb354c7cab10c45fc7986c1d94c91b58c9d82c9de49e6a6972cce4e6414d7e0b33b9454093dfc684b7718477d184636bc421ff3a631a2b125d4b6e37d422f1f718d141c5bba1e63b8fb8dd506312778e60cb9d33fc8e29ac585c2d156796b21e6c8ef36fbeb85ae4282e13fd435c37f94c9ef3abbe152962239da7dc8db42be5b3c93e25b7dbab54747b79afb8f6e538219c9322147c87e2658cf74525df3e5574bb294dafea74e7a95247c70ff57730ea2d4dd4f312d4bddfc44c70feab622b448fd942699dcb728c737da27365b1e0cbcf987760366d47ae878f771d968b4ec602e7193fa17c170b652b5328c711fa163fbb44bc8687caed2a2d15af2e65073abfbc5b95eb8411b7ef61a1ded614ea932d4951f942a15cdcef274de5cbb3dc3f3677aa7a1f23dfda443e9731247718ea8475a920e3722c14ec9656b311e627d895a4969f907c8085a48d292403b490c0d41c3c2c66353fa1d98885a6ad293443d178714350ce2a9cff8f1369a1d2f1a105225f4a159ef4c259fb7cee432c7ced4ce11bed1c9a736335a4532e8e16d73af6fcabfb09ed475868db9b42bb870fdfcc17e559ba3199aaccaa4deef13116ae0ee9a4399843064f7366353fa1f9040b4d475368f64a2bcd0d75881609cf329796fed35cf28a9fb07d8a856d3b53d80621b5a769221c65323cee90a9aa3b4d977583a294b9617839c8675888b63785684f2db6bcef8531c6738202c77b5689ba62498a9a8e5723bc907d8e85ac9329643b6921d3535289cc21c6891cacc4f97b41483eb509b3b3b3c9ceb169a597516290bc40d6e0544935d1f97b84a88d72b9cd596e7d8185790753987745cb2d9826bcf1b458b62f52e56f7e2cfe12b3784793c5837d94b45ebb4b907651faad283fa1fa1f16aa2ea6500d4f51f2b8a118294a9b45c2f3d2afc99b4be6b062ee2b2c8c3b99c2d80f8d39de6a99e7dca4c23ace096b8973c75231d5a57a191b762de16b2c1c3b632df7dae6139b3367f8060be52ea650f64abb2535aac61a5e1879f9b798f5d926ebfbf8a8a1fab5bfb639c2775808ba9a4290ef2367763d2e59feb8cfe0799b37fda4734f583ef83dc660d7746231557ddc6f2cd636cffb010b41b774f28aeaf93a1e77e9f6d5c02b61c5d38f582877338572585a3962be73f33c616d81f0aacddbdef8090b61f7745abca93cd15f8b3755fcd5a62cfb190b570f53b8764f3b97f7172a3cb66a13a65fb030f5ac7d5f534d292e9325f3af58f87aa593a7f8290ff05a147d7bf8372c94bdd3698d51d488d30f756d4b8bdfb130f7c13cd75f993f46b478cac404f15296aa3d4313a77f60e1cb3185af98d18e8b54b149a2c550224712a78b7e123e26344f8e65d4ce4b82e7607f629cfa9a384d23e6848f1fa526149cc35f18877e260e3336731e409d3bfc8dd1c835d11899665d728c48ef76d527ffc142dadf14d2116995e0e39d9bcb443d52e580784f68a66a95ff62e11c904eaf8f5ee71a2e425a3df6604f4e3ae7c3ad8df14990c6300e4ca736563d8cc97e126e27bf8f7b57a121bf9eeafc5d21cea717bada8db2c4b0f00dc2fa235385cf2d97920fa45f0b0b37d6e258a87637856a66c89e89a53fbff787cba40ec664b089496f8dc97091d3b865abaa954d75ced594a7f466b921e5367531fbf730d9df2351abf08e99a99a06ff42cfdb633e42d42e55f951d3b37e2ccfc22cdfd3cf681f7c7b6dfa83c20c513d2c447ba53f36cb3dc3ffd8aceb4f947e561f0bdb90e0e924b5957888fdd8df00b37f683a23b134b5ce706a900db1900d4bbf9f4ef73a3ffd74f4bed7080be1705308f7236c39b9394a90166638e3088d3122799837fb9b679a1c8f2f1775ea32cf8aeea9f3cdea6bbffb0959132c64234c21dbd777c8dcba98770ead9fb00499715b9bfa49538cc748138f63087ddfd46be0e5eced43f06707a63455a42ee58f94fd125b61a447a5332ee5bf2698ca536a974f6e8d8560743a7d0978ff62cd7d0999ee476e8685748c29a4436a51774c6f6e5ffaaa7e42d71c0bdddee9f420987b4ad289c54c8e77b4c0c23816eb0df21b83358f56d5a41846aeb20d16ce71a670f665fa0c40771595e0334fab2bf909454b2c14e3b156663aa1f03b5eaf74fc58de0ab37c423a335efce7eacac67072f46d31eb279aac1f538d3b367f349ddc409f399aea5a58b9426b2cbc93fce4ebd80ce07cb6c07970bef36f99c71bf1b8c2efa94d5ed0060bdd6453e87aa6e98b357b5c18e9a82d66fb1493ed03d3cc01fccd28c0425a9bb868878527bf767333d3ebada9dd984b6d7b06da63619c8ae57d7ee666faa9cfa68ea1facebfb1185f72698488793eaf7d9278821f55b29e3b3b97847d6ad731d5aae8e1695724cff3772f72ece1b9d0d444cb3cb90719a630cd01532fcedc7f768971a85572c021365ff301f7c932a19cec23e1790d2fd7dcd6251f91eae1f02a154fe9bbba61a130b58f7a80961a0c5dcd61524bbde9abb0c562f565889496437a174e7a4b0be9741eab3d65acc67bf275c263dd6ae94d355bb14f1d771908930fb5ae4616a66d93edaec004d9bb10139bd68b6cbf447e9ce92dd46a7c1f4ca5a6f77517026a94ad46b96920b336c9b5154ee6668b4b99fb695f510963f5b3e2bd783ccca084c5976b513d07d345fe53ecdc0cfb74a2806bcdb824ae7d29713517be954c928b65c75fb9901c238b862820db2d9e44b61f25b2c602d91cd64bfc7fbc7323af9ff1e419054c6f8e48629a4989691b901055f22b9345c508e1676e015d14096ce7ce4d629b4589ad83c7bbf48439cd794b919c35315ab4b48a98bb646ca5139828801cb05312e46c4a90ed3c2079f5b5402e36522e1a561c2247ca4bd565a2c2eb9e89024427940988fb53426c22200e179ea672ba49c28ce59100f5dbee495073e8eb68cadbbcc0a25234e4ed9184359712560b5034544f886344ae56cc5646025a9b7949680594d0da080fe38d0d77f079b8fcb490839ce33cba8af1c973d12b59df0525eb3cfa24eaf63ff3f1cca5c2046eaedbf31f05587ff54fc22aa484d550c05239d804911ca3d10e7813e46245f4ed80f1a2ffd9ada345a9b9e43c92c0549ce92a4494fc69cda024a8f976d6fc7b4702e4cd1d92204ba8bb80922079f73637a144b63da3d205f45bb324ae0594b85a7970b9e5e354e6ce025cc8262756da9bc6a638cda828a01b509844579ab952324a0da3678726111d90b9c4e88efd45affbfa7ed07dbd3073bd66de5ed8e4229751a9dbdf0cfa64cb28b1f1fd62bdeb8226677be6cba6511480b504fdfe8b2881d513c9923fcedb92d1a889bd3a3a096771a6fa27bc7955f49ad7330a92d0ca29a16d0b32faca2d04de0600af827e180eab83a9dba280ac655112d912ea92d2dc9d03abac51e9d8993130896da99dadcc9c4880fca953126425bdff79f3bba18ee7f149badca4e54c7dce1c056c57838ec5aa4cb707a257309c393f896b1975c5162f18a2d3249f05864996676afe4f741b4e65a0e1b42253b8a29b7b0d06b9d74afad2b3a641b8e8825c0d40aea21e3c492653b848771430dd9e9bc4742025a6f6ccdf2496688d9d1f3c3989f1a0cd3f761ebd6ec9b5a07d7a3025c0a6463f8cd294a91741cfda21d435b6e4e416d82e8d56e25c332709ec50fa7174de06a814b88a23358ecebf5051980ea3ee9474f3b03cf16a6cdbab28409bb424096d75a61ae9aab519ddda59456912dbe199cbeef9c04ad446cf676525511d4189aa1163a0a5c92b16c5a2691e05486bc726211d49ed4fb0b61fbd0e9f0a50e33f2ad3395674bf636a02b01d4d89ad35abde1b1bfdaf4eea8afa7dfd2c4d5c5fc5a5f6df6afa638e7f55cabb91463815db0a71b68ab9bb507abe32edeadc629de5c7c0af44b3535445b3d3fc522e3b8d0ec86c1fb33cb26b288bb3d398ed961d686a6190a773023ddd47924a2f3bccaea194c94ed1e7949d463f6876a0cebf6c1fe345d9354e55cff631fa999d7206aef9aa9ac9a62cc1bf6bc946668aebe7938af8e793d9d566a564a798649d8d56bdb2d39a0e949dc6a7c27aead33b3eb26bfd95597680aebdecb4fa18f45c265559985dabaf4bb26b51ea66a73db9265d9bbc1ad9bee7a1782daa997b4da371d93e27d466a739f943cfe94d43a72abde26b059855f47bd26f3667a7dd2f915cf003560c920b75f4e20b7e1cfbff7c2d8e5e7c2d8ee33884b72505b7ee7c7c2686e47b3bff1549ffe7c71522d5f19bb43776a8f6c6298e732c1671b04864e6ee8da67737f4d49a3ba4139c5a7dde124b363c4ea01f5a98231ea872fe2b63a957cd1a507d1e4d78385b51e1bc028c479f6813ce8191c4f910c0b9c6269cbd2389f34c90d84fb209679f48e27c00e03cd9269c3991c4f90bc0798a4d38fb4612670790779e6a13ce7e91c4990b709e6613cedc48e2dc07e03cdd269cfd2389f33080f30cea591b6aeb8b855a2f00efa3e23d00d1c3d79225f19d99096f2c41fd119acfabedb974389b50e16c064af2b36cc2392092386300e7d936e1ec17499ccf81c47e8e4d38fb4612e74300e7b936e1ec1f499c9b00cef36cc2991b499cef029ce7db84b377247196009c17d88433279238af0338d7da84b34f24719e01705e98895954184cef72ff7d582f3a985554309f014dca8b32b1200206d39b6bf6a343d98ecc2f4105fe625b50e644126543e095eb6c41d92792283f045e79892d28fb4512e51ec02b2fb50565df48a2cc06282fb30565ff48a23c13a0bcdc1694b99144b918a0bcc21694032289f24980f24a4a94db1b50a6bf4fe69ceafb448407379b0aee4100ee5536c3251c6423837b14807bb5cd70099b9b64702b01dc6b6c865b6d11e908c05d0ee05e4bbd3e5f05733f61f04e96e693a3d5846732803da800f2e9c60ae0759400d59cf8fece7fc5898dde9373eb3334df98acf43f0280bc3e13ebf7e13d9eb0932e4309bc1915d68900eb0d995a968e7b6189980d9f119f24ebe93c19c0bb31538bd4956e3149ba02e0bb6973b68da01c6932ae4f85f228d0257733254af5b9626f998c9766ca0b9750a12b075e780b25ba4e125d99735399f8753f9af27e75976a8a21a16792cd907b0ed4206fa5ae415632d3278bd1ae41ee00fcf3364a802da57ff25b160b19af37aa9092fae1722a8c3300c6db339143f6da6272c87c80ee8e4c8c8e631ee82da74967bd9195d4fb8092fa4e9b60f68f20cc1900e65d36c1ec1b41981301ccbb6d824938584106733280798f4d30090727c8608e0730efb50926e1600419cc0900e67d36c1241c7c2083391ac0bcdf269851ecc41807603eb039fb83bcb330a33807732c68753f488992bfba32d5b2de11e8a2e00bec28580f65a285dddb3346a32e67a89948967c0b00c6f599e80de718b988bbb85d86f09179e16090fb3d9c89dc2fbda2248aa5721fe0898f50a2e48b6db99db76a51c5a162688bb0924d3612d800407b7473408be2f0697d006dc3e64db4ae5499c8090913ed7e5428f702281fcbc4007f3aa381de697d841d11dda8b0fe0c8a95c76dc44afa650e19d68b01d6276c5a868474a502b2cacf0da0bdf2a44d3849d7d120c3f938c0f9944d38493f5e26c3792348ec4fdb8493f46b5b329ccf039ccfd88493f45b70329c3190d89fb50927e9002d19cece00e77336e1245d34870ce70880f3799b70922e4b4286733ec0f9824d384917cd21c3791cc0f922f5f4e70ae65db8dfbb081e193cb225c0b98a82f712253cb893433a3b1bf07b978afba2e791bb80cad1cbf62c45d29b727e10d930d8832079bf62134cc2bc920ce67d00e6ab36c124ec3f2283791180f99a4d300967ae91c15c0b60be6e134cc2f94164308f0130dfb00926e1a01a19cc2301cc376d824938d84606f35000f32d9b60467186d02100e6db36c11c1841984f0398efd804734004613e0260be4b09733b0637614b773bb90c342e1fa142db13342edfb3653522d2929dece3e56300caf76d41991349947190e03fb005659f48a2bc0978e5465b50f68b24cafec02b3fb40525e9f73b64287704283fb20565ff48a23c01a0fcd81694b991443913a0fcc41694032389f23580f2535b500e8824ca1b01cacf3281120eaa8d711ed97286d2ce6449949fdbb96418616f3bd99cf76301d64df62cdb44d86f44f6a1caa3a0bafe05254abe7386f79b8be1cecd2e0d326c5b5161ab0b3cf0cb4cf4105539f0f89c8d3989c53ddd7de8d5ef30e7668e77b97317c7ba94ba5b836c4e471ef0c8ff65a22733fd0d0dc960926d2bb337f0d3af6c8249d82d4c06730480f9b54d3009a71f90c11c08607e63134cc20a1119cc5c00f35b9b60124ed92283391cc0fcce269851dcd76c0880f9bd4d3009a71f90c1ec0960fe60134cc2e90764307b00983fda049370ca1619cc7e00e64f36c1246c0191c1ec0560febc399774d2bfb0204ce6645d70dd01cc5f6c8219c5a594af00307fcdc4023bbc6b78b9f840854f8189fa023be7007cbf51e26b01f02d626a71a492cc2124ebafec0f10fe9e89afcfbc83138b9d5b398d02f1d0812cea03144301ce3f28717666dea5e78be497677efa33098b1fb2decc0d6030edcf4cfbeb74e746be5147399bc4dc0fff8ad9d24cf82b19ce5f81bffe4589b3ade6afa52cb9e7093e35267a83bdd3817ffe6d1b50c22a1219d04600e83fb60125cc41c9809e05c683feb50d28615b9d0c683be0a17c20d32aa0519c30b32d001aa304ca1748f48ea1574670f6461628c3e394b8d4d839ec294abfb649387441563d7a0278629d4ca0f57eb8325226f1d11e1f1dc3e07671c4354fb244be00786d5d4ab4fe16c78de2ce14fb0194599428abcf39aa4cb4e1a3d7566f02b0d5cb74be394d625b256667babdefc5620ad722e7ade5e268b1f055c22a512115daf7401db33e255ab75fb354c2cc13af4f6e0de7f62845cf33b3816736a0c4a73a39d29fb215c5c1b4a6c01b1bda8473402471fe01bcb3914d38fb4512e7d30067639b70926e864486f31e80b3894d38fb4712e7a70067539b70e64612e7eb00e75636e1245dd9880ce74c80736b9b70e64412e7950067339b70f68924cec301cee69438d56a9a353730bdabc91076766c8811412d025d722d6c844a386a4906b51040ddc646a884c99f0c6a0b00b5a58d5009c786c8a03607505bd90895708c9d0ceac9a083645b1ba1128eb393413d09406d4d09b59d01aa3b2c97cff2d85836ccb991f78aaaa1baa5e20e423f255becec6490f8db5022cd61d5c78cbc239d6e4ffd22f1b71b10deed3c5fac30c78d9dc0f8b0dc0af18a858e67abad41a78ab9a26a4219a15f77a6f2eb1f593212da5246422b4324549fe6c057de26f5e61e54de7c3700d9ce1690841e4906f20e00b2bd2d20092b576420ef05203b5082e4136ff81486790e8112368e4573b78ce60057474a5cfe964d21fcac956c0ac3eda0b2b41d254af5214c5f6dfe5c46bee2209b4cd31de0db9e125f4d1f65793d9174570c325f7c1024eb4e36c1249c414706f36100b3b34d3009bbe9c8601e0360ee6013cc28ce9a3b01c0dcd1269884354732988702985d6c8249d8714c06f3680073279b6012360ec9601e0c60ee6c134cc22e0b3298870098bbd8049370f93332982f0198d936c18ce2ba9baf02985d33d107c4fb788a13ddba63b698a6e45100e4ae94201b0935b5270bef4f275ebc940c595780ac1b25b2ad59f22b21a59a217f5b4e056f1a80b75b26126ebf2d34e1ae0620bb5382549fa1fa995a18c505cda6814eb51eb6018de2727bd301d09e9440d5eaedea43693ea160052862b6ac0ffab3c0a8782f4aac9d989f8906708994a18e05a5b478f9beef24782701bcbd29f1c245a6e6b0f1ce8dbc909a240c59cea2bc2ad213a068ea4389b0a944c85f3c5ff8a7d2e60bf79081cba202c700b81c4a70358d307aa7634571e3f8a52019f7cd443dd34dc6c3c5e7d22a314f1035cdaa4827e6cb814ff6a304196cb989286ed5300ff8682e255a350a9eb3458d823706f5cbfe94f8b64a59cc10ae21d3880a5d1c24ea0199a89aa73395056eab44ba7967372aacaf038f1c682356d2d14632ac8703ac8332512dc27acea3bf6a7b3790f077cf4491c3275e6d392b1067034f1c9ce9ca50fa6bc8107a26d91a326b00da3d28d1b631a08582fa42e30322b9d4f865a06eb9a74d38074612e7bd00e75e36e1249d584086f33490d887d884b34f2471de0d700eb50927e9c00519ce2f01ce6136e1ec1b499cad40de39dc269cfd2289b33bc0996713cedc48e29c0c708eb00967ff48e25c05708ecc04cef4d7328ce2ce945b81a268944d38074412e7df2c8973b44d38fb4512e73300e7189b70f68d24cefb01cebd6dc2d93f92383f0338c7da8433379238df0438c7d98493f4e33e329cb300cef136e1cc8924ceab00ce0936e1ec13499c47029c133331e486c1f42674c2994864d3142e0455f849b6a0cc8924cad6a07139d916947d2289f25be095536c41d92f92288701afccb70565df48a2dc0da09c6a0bcafe9144792e4039cd1694b991445905504eb705e58048a27c1ea0dc8712651703ca7427d07867cc11f6c29f1123c25c0030cfa0c40c3f514dee499d91495e64d3b27f634978fb66a229e9dd05702a531f4973d3a3bff3df5a80733f4a9c6a522cde32879fb5c0444eb86a0cd936a0c500eb4c4aac7cf1c60ae67edcc76fa8a4f4c26c2a5c6d01ae5999f042b891fc24e7762e3846164070bbbaa24c246eb2e1de6100ebeccd59358272a4099a6c49936b408b7c7f4a946a7d98dece7fdeed3dbd054e94bf0d5a01fc720e25cc9602269fb7c11372a523b5d8b97da8c3a3ca39cb8d5a2e10f365c2a397bccf0518e766c227bd5521efd794539ddf28e795d70398059b33afccd8b620645ff7ee07da37f32851aacf587a89c45d255a38d1ff8ca51f286a0aedf144c285c8c83cf140e089459428837d1e4dd88941d60e9f01d016537b690573d7dd182e80f1bf1733b85c543e4bee334d86926ca5ff9d40d1339f1265aad510b684a54dae01204b32917316b27416718ce21ac27b02940b3255b7542df2e40e3dc3597299a8e876b2ed0a609652c2548b97a9b5b60a59cdab6c117a2719d0374115e900db8012766f9001fd07005d681bd028ae037727005a661b50c2fa2619d02700d04594404ddb22a6334c41988f920d535400a88b6d841ac5b19f2a00b5dc46a884f92919d405006a858d5009f35432a86500ea121ba112ee584506751d80bad446a8843393c8a05e0ea056da0895f0330232a8e702a855364225dcc98a0cea5a0075998d500977672183fa1780ba9c12aaffe5a7088745c8fa49ef027df72b6cc2393092385f073857da849374f720329cb782c4beca269c7d2289f30380f3409b70e64412675390d80fb20967df48e2dc09e03cd8269cfd2289731cc079884d387323897309c079a84d38fb4712e70500e7619438d5f83c1f54e6136df82c9172cf263851ff0ce6349644b99a12a51a9f4f6f6a779f486efe3915f8e5e136c18ce2e69fd300cc236c8249d8994c0673308079a44d30093b91c9608e04308fb2092661e73119cc9600e6d136c124ec342683d903c03cc62698519cbaf815e8f038d6269851fceeed6b00f3389b60124e622083f9198079bc4d3009272f90c1dc04609e4009b3f6bb64115692c8b673da06144527da8895749d3932ac97016f5d4389757b0356f3d22aa3e423decfbc080ba97c2ab82f01b827d90c97b03a4506773d807bb2cd70090b3132b8d702b8a7d80c97b0ba4506f77800f7549be1123659c9e04e00f584d36c864bd8b94206f723e0b9a753c20db69321a1df92ed64d80cf8ed1994689b3a07c5890f19f39cdf790e8b1236ce79a42482234e7c9f6505ee4c4a70fee7e0112671b2b1d02b811f9e65134ed2ad78c8703e0c709e6d134ed2fd0fc8709e0d0aa0736cc2493a584286f32980f35c9b70926e274186f30f80f33c9b7092ee6c4486b323c83bcfb70927e9be5b64387707382fb00927e9ce466438e7009c6b6dc249baef1619ced500e78594387734e0accd1adf8473a0c856f8de1a40be280a900967ed9141fe01d4022e8e02e428ae555f0220af8b0264c28e6a32c8b301e44ba200997090900cf23900f2a551804c38584806f90000f9b2284026ecc226837c2f807c79142013d693c9209f0f205f1105c884b362c820bf0b205f1905c884df1090417e0640be8a12b25a8acebb4cfc28c617ed4cee9b33cd21348e656039cf47d20962adf6c10340afa604ea6ffb55c25c966c55bfe300ca6b6c4149da294e86b201e873b8d61694a4c33564285f045e799d2d28493bc3c9500e025e79bd2d28498769c850ee0250de600b4ad24e70329467009437da82927478860ce52280f2265b50924e0922437907407933254a77df1c7d5bac7cb6c02132dff9978f71456f64ab2b28b56fa1c457fbad2ca3b89ee91a96c47a6b26dae86a25737e337fbc82f1b9a6e9efa643d8394d36b9f27be0bbb745013261e73419e47700e4dba300398afb423d0d20df1105c88403866490ef0190efb4a5d245bada2459a5eb0a80f22e5b50922e8d4886b23da8bfde6d0b4ad24594c850fe0ebcf21e5b50922e8948867214f0ca7b6d4149ba582719cade00e57db6a0245d0a910ce5c500e5fdb6a0245da4930ce51100e503b6a0245d189e0ce54b00e583994059c8cc1b6866ece373b2ad8757b124ca872851b69028b9d72d1053d38b44075ec6d63825fb54f7008070fde64cd8508ed41bc9164b3a04d4271fa644d9b20694c39cbff95fa49d1b1fc68930de09f2c74728317662dece0d7e13171b2e93788940e805ebfd3a85d04bc97af0af07781fa5c4db51c3ebca54a0e5798626986f4505f666007643260aa3de5b5c61341714468f51226cec1ca821393e31b1c0b985232c8a6082ee00a03d9e896207ab4faa909226dfe55418a7038c4f5062e4021c609e7871b178b440dc7aa0f35b257acd173b7cf8d565ce79c2d99bc7514d87cd0755a1273767ad3263ab9791b571f241b1f214254a35e20e67140f17e337dc146ef664e7a858bc609a1089f2fce24b40727f9a126b2b89b5aff35f72a9a231a2d42e662b335566937567ac04209fd99cdd19de066414d7ce9f0f503e4b5d04a9a4eead416e397eb93f80f91c25cc06ce01bf997fe692c7dc4f5aa2578b6c04703d4f89ab99f4bdfeb2d4de32bced4280ef054a7c6a3141d5aa4e1629c3c56c8bc5d5f245d8634e58312743bb1fa84bbe98890a503a3d94de6f880927c2922d96fd39c0fa928d58493fb622c37a11c0fa322556b5920e3e41769a27e90fa46cfd34a1c2d910e07cc5269c032289f367504cbd6a13ce7e91c4f924c0f99a4d38fb4612e79d00e7eb36e1ec1f499c1f019c6fd884333792385f0138dfb40967ef48e2dc07e07ccb269c3991c47929c0f9b64d384937be22c3b90ce07c2713dd21398cefa2ccc781781f7b86ba43c87a93ba806afbbb99f0467c2a8cbe8e3d61c73019ce5bc018d07b36e11c18499c2f029cefdb849374db35329c3783c4fe814d3849370724c3f936c0b9d1269c3991c4591724f60f6dc2d93792387700383fb20967bf48e21c0d707e6c13cedc48e22c01383fb10967ff48e23c0be0fc9412e72eacfadc0eefd7e57c747391f32fff9bcfd85c26244724463fa70a6a19f87c606f2ad87d5912f66794b0fd7d6f4ed87a271b323e1a54a13eb7052569bf12194a06b2804db6a024ed5322437935f0ca2f6c41493af04686b22ff0ca2f6d41493ae84686b21340f93f5b50920eb891a13c1ea0fcca1694a4836d6428f70528bfb60525e9141a3294af0294dfd8829274fa0c19caab00ca6f2951d67ef543c2bd36c8563f3c9125b17eb7393d14ca91eed745f609c1c3a08ef93d25caad59f2138262d1d1b12853a396649f5a4d057ef803253c3589bb8a2d60fc9b737feb154671c5c241c02f7fa444ab3e6d49ef2ba11ccad562c912791b00f3279b6046f1a3abed00cc9f6d824938fb9d0ce6b600e62f36c124ac1691c16c0d60fe6a134cc27589c960b604307fb30926e14ada64305b0198bfdb04338acb46d50130ffb00926613d930c665d00f34f9b6046b1313900c0fccb269884cb3e92c1dc0bc0fc9b12a6da21d0cfe70384de4936457b4f00f41fdb80127a2819d02100e8bfb601256c0d9101ed0f80b22ccb8012b688c8800e044063b60125ec492203ba3b001ab70d28616f1219d03d00d03ab601256c1d9101ed0180d6b50d6814bf6ceb0d8066d90694b067890c685f00b49e6d40097b97c880e602a0f52981f2314cf7a5cbc489a16cbe905acac6390f15b028ae06bb2d4bc26b40094fad6be82e1739d539bdd0393d5cb4e0b95039cbc80291745fb501900d2941aab91e6a452f3e7e5e92b8bca52d92ff1348dc8d28b1aa31769857a63fca4ed8dc241b632f03b3931a53a2ed6c40eb26730e6f31db5be4a7fa4aefdec2298a75d13a204b68420998aff05e215ebb9c4d726ee153bbf88d5c309f25978c2643d8830ae1ce0061534a84fe568b8de258fb2480722b4a94fe579a8b62ef675b50306d6d134ed25daec870d607389bd98493748345329c2f82c4dedc269ca49b2c92e1dc0070b6b00927e9468b6438bf0138b7b10927e9668b64383f00385bda84339ae39a9500672b9b70924e6420c3792bc0b9ad4d384977a126c37911c0d93a13fd4cbd04d262d122d21b97debdb0a2dc7db723a87fb6c9743fd334e66e07b14a0075fdb7582e6151c1dc2d22168b08201cf020dba5ed5980b66d263c164bfe50cebb723c614640b672fc23006bbb4cf4dcf32527b7c41d8996831cb5bd4d05d4c0488e6f36017ed9c1269c032289f377e09d1d6dc2d92f92389f0238b7b30967df48e2bc0be0dcde269cfd2389f36380b3934d38732389f33580b3b34d38a33973695f8073079b70927e624886f3328073479b70f68924cec300ce2e9438db337d4b3dde947445b6b4e937b781cafc4e9968642aa8a51a4a6fbb287a8dccdbc0649b9d6d0149f8191719c83500e42eb6808ce2e2542782a49d6d0bc8286e383a1380ec6a0b48c289dc64209f042077b505246155880ce45d0064375b40127e404806f21b0072375b40124e3e2403f91600d9dd1690841f0c92819c05aa3f3d6c0149f8292b19c8c600644f4a90ed18f661413ecb6363d930e7c64ae746f5b1c152710761b1f30815d25300d25e9998ac9dce402f69c143d6eebe1ee497bd33e19dee6759ea7714e3b338a68a21dd42b6107c5d443ec3830c691f80b44f26fa87fc4e4388e2248455006a8e8d5009bb38c8a02e0750fbda0895b0714906752180dacf46a884253e19d4b9006aae8d50093be6c8a0ce0150fbdb0895b0938e0ceafe00ea001ba1123646c9a05602a8036d844ad8302583ba14401d642354c2f61419d4720075771ba11276ea91415d0ca00ea684aa36bdef23c16e19f38edf66497c7b50af5be334d59cdb0b1d1396390f970b53968bcd460b9d5bc8e0917dafd105c0db33137d4df8e499a88f5f9e0a50ee65d782547d22b9d2ec14902f0eb10d6814bf799b0a800eb50d6814579a1d05800eb30d6814579a1d03800eb70d6814579a1d0b80e6d906348a2bcd4e024047d806348aab7b0d054047da06348a2bcd0e034047d906348a33e28703a0a36d031ac595664702a06336e70407b89b2b69df11d9de9973c15c91bd33318f2975eb9d2fc74fdab349b642e2500072ac2d20093d920ce49e00e4385b4012d634c9409e03408eb70524611b880ce4700072822d20096b9664207b0190136d0149d8e62103b92b0039c9169084354932900301c8c9b680246ce39081ec07404eb10524611f3b19c84b00c87c5b40128efe90813c0f809c4abdeafb0231845bc4f8027c4b1d732b9cbf0b84e038e6aed545b8ea3bd98864539644382d13b3dfd5472e7ca1bd15725e86d72b3334a9700915d23ac02ba7dbbb8f0661594eb68fc60280769f4c74b36139e730e7d1729115f04c618ed8c18db0964936b7e34d00740625d046424dffc8a5328253b1da831c735f7bf6c988e2c6cb070194fbd9b85c29e9e80e9987be02face67da8895747b4632acab01d659d4b54d358970b8a863f21d85ca9d87973997c730352b337ab5cd1d41829f9d8975b8d22dbf49172c252bbd2f07a5f7fe36e1245d4e970ce70300e71c9b7092ae614886f374905fceb50927e91403329cf7039c0536e1245d12920ce77700e73c9b7092ae4e4c86b30dc83b0b6dc249ba763619ce3e0067914d3849572726c33905e02cb60927e9dad964380f0638e7dbb49ceec048ce176e0e8aa2129b700e8824ce2c8073814d38fb4512e7f32c89b3d4269c7d2389733dc079804d38fb4712e75700e7429b70e64612e77b0067994d387b4712e7228073914d38732289f3268073b14d38a3f99dda790067f9e6fcc6c29bd0a3b8c4e979a0ce59610bca9c48a26c021a974b6c4149fa652f19caff01af5c6a0bca7e9144b917f0ca4a5b50f68d24caae0065952d28fb4712e5d900e5325b50e64612650540b9dc1694032289f22980720525ca2e0694e96ef0ed9d8f443877f38c18d53a9b00f34a4acc2d9969e1f2f1ce03cb05897216e5ede8df62498cab3235ad6b92730bf73d7e2317cc67c5428a4ff4224348f61dc6f600e181d4cbeb295f9b2f92bbd25e2c6f21834736093606e01d9489d99a78a7065ceb2043ab1037a3c23a16603d98ba3c4fced65c26b0b9454c72a666b493f77600e5219bff7bb5e8ee03580adae387da02328aeb6816039087d902328afb002e012057db02328afb002e02200fb7056414f7015c09401e610bc828ee03b80c803cd2169051dc07f06000f2285b4046b15fe82000f2685b40467187f32300c8636c0119c51dce0f03208fb5671b45c20a105937c60900e57199989be1ed8d748d19c1ca84a8dbfece40af24d92212535812e7f199d8f0a337db9236fcb801e03bc19ee543099b8864cb87ce06c30c27666a98a14484688e636e259b2ebacd4a1d93a23ccc7016f0c83594185b7bf247777b596fbfa4daf8981c26d9f6c7e7039827d9b30607619f2459b93d00a03c39137e995e15a837657d920ce6c7a012748a4d30a3b83acca700e6a936c1246c7b93c17c03c03ccd2698843d426430370298a7db0493b09f920ce6ab00e61936c124ec3d2783f91a8079a64d30a3d8a5f1028079964d30099b9164305f0630cfb60926e1f83719cc0d00e63936c18c620be87100f35c1b97cb23fdf8846cb9bc5f01d6f36cc44a5a9127c37a29c07a3e25d6c62c39af2d9f2d7038cc17732ea3b885716796847641a697644e77463ae93483422ab43f027f5c6bd3d23a03282bf0649e7a2de86dbfd0269c032389f33180f3229b7092362fc970de0012fbc536e124ddca980ce77300e73a9b70e64412e7bf00e72536e1ec1b499cdb81bcf3529b70f68b24ce2100e76536e1cc8d24ce6280f3729b70f68f24ce6301ce2b2871b667d56779a45ae43e03d314c86621750305d2959998c4c5e7612e172039c40c4de222fbeeec3196c477952d9fe493f6be9379e2b1c013afb605654e2451d60339e535b6a024dde49d0ce543c02bafb50565bf48a21c00bcf23a5b50f68d24ca9d01caeb6d41d93f92284f04286fb005656e245196029437da8272402451de0a50de448992afdc59c1bc2bbde4c9b60e1936b2cd3779435861bb997aa11cd544f4eeba9ba1160dd960d92880f0163bd77a219c8f49b6d6cb2900ebadb6e48da433d8c9f2c64b4095fc365b50e64412655b50ccdc6e0bca3e9144f91bf0ca3b6c41d92f9228f38057de690bcabe9144d913a0bccb1694fd2389f24280f26e5b50e64612e5e100e53db6a01c1049942f0094f766629d0d8eaa58acaaca4df50e8245f973fc392c09f2be4c80ecbd85829c0d40de9f8989ac554e0bbc54c4e07487c670c7e822316555fd0e736ee66df4e5ce5de5e22b73e22132b2ee8dbd411df3814cac73804f285825fe225d9af1c33811c6ab419ef960a67a8992ab514f10c93c236bbf90cdc5b81124f28732915b0edc4273cb5200723df5b712054ee8ab9c5bb809cb45af65218be2b712db00680f6762d24a2edb92561eca01c5c82399fed424fd329af0d327b212fa7e50b43c6acfaa2f515c0ea20824f20d94289b3a074bc46c342ea16f7b40062e9b0a5c3b00ee319bb6201c48595b24db82b001c82d1fb709e78048e2fc0e78e71336e1ec17499c8f039c4fda84b36f2471de06703e6513cefe91c4b911e07cda269cb991c4f932c0f98c4d3849972821c33919e07cd6269c3991c4b90ee07cce269c7d2289b30ae07c9e7e0a60b910e066f28520f298bbe843f4fa861a036c2f50626bcb4c5f899937d7ca40572fd9274e1703a02fda32584b5ae09075bc1d099a922fd98292b4b02143f92740f9b22d28490b1a3294570194afd88292b4354ed7b30eba7f5fb50525694b9c0ce5f600e56bb6a0246d8593a13c1aa07cdd1694a42d703294e301ca376c4149daaf4e86f26580f24d5b5092f6a993a15c0750be4589b29d01a53ba09bef3419c7b261ce8d95ce8d6a9077a9b8831029d9f61d2701a46f534f31a864ee1a9653199f5250c81632fe25d944e7bf22f11719be1c2a7c9d5812df3bf6ec5a16c595fc1f04d5f377e927bbf07582f83646ca27f982a005cecdfcebc6a208f607ed04f0bd4789af398393fda638a7b82eff92b632d253fdae0649f97d4a805bb3e40cf322f9097286a65a91cd071a04e07d90a99dc992f324d5e50c6124cb0347038c1b333ba7dcbc34f228f98077ef3cc28a4e3e15dadd01da0fed9dae4f88962cf1b70045cf4799da2073cb595bed76e0991f67620789f4e652926e75409683fe09607e6213cc2856c9ff02303fb509661437d7fa1ec0fccc269851dc5ceb2700f3739b60467173ad2f01cc4d36c18ce2e65aff0330bfb009661437d7fa10c0fcd2269851dc5ceb0b00f37f36c18ce2f6c2ff00985fd904338adb0bc74103f2eb4ccc65f333df97d03bc9e654ee0c807e631b50420f2503ba2b00faad6d40095b436440b70740bfb30d28618b880c682700f47bdb8012f6249101ed0c80fe601b50c2de2432a03b00a03fda06348a5f4eb403407fb20d28610b890c687b00f467db8012f62c9101ed0080fe621b50c2de2532a01d01d05f298176627e66c0a9c524f824aea18e05a5023119dee3a856cc5a0f66c3fd96a9adb7bc9369163177f5ac11622612bf99072203136b9650f9ec629684fafbe69c23e79dc4405827ada242590efcf38f4ccc51e27ec947d64b5865a6c6d9c9b66b1f03fcf04f7b9783226c7c92cd00b907f8e55f999801d28f6d490b95f502a5fadff4c5ce88c4bcb9e1c2ebdc0266a1c0384c4ecc7625473abfc562a26cf4a06e0d92fb3f99d8e0239da9d9707b0fd2f14db25cf413e0abffda889574c95b32ac1700acac1ef1fa98bcb8e13967b9a7e21ebd62a71948e2314a68fe57808be2a8d136c007e336e1245db29e0c673d80b38e4d3849774b21c3f90248ec756dc249ba630a19ce4700ce2c9b7092ee9a4286f36b80b39e4d3849774e21c3f93ec059df269ca45bc991e15c0a7036b00927e9767264386f01381bda8493742e1d19ce0b00ce469438d5c783debd7db6948f0717028c8d29319afa37cd9f0ff2fea545ac82b98becb9fd4c84e342649bc5de07aaf24d3291e0b1e43ecc79b45c8c0cf15d2d88d7f120fbd4fa52d05ddcd4269ca42bcc90e1bc1be0dcca269ca49fb392e13c1524f6ad6dc249fa0d0719ce3b00ce6636e1245d10920ce7170067739b70922ebf4786732b9077b6b00927e9c2906438bb019cdbd8849374193e329c1301ce9636e1245d20920ce74a80b31525ceed59fa6b66e7b362215d20a04777fdec475912eeb694706b3f304cd8394236307c2528ef5bdbd4d73430929fc96c0d70b6b109e78048e2fc1724fab636e1ec17499ccf029ced6cc2d93792381f0038dbdb84b37f24717e0e7076b009676e2471be037076b40967ef48e29c07706e6713ce9c48e2bc16e0dcde269ca40b5691e13c1de0ec4489b30babfde09cb7b544f8c1e11931aa0a1468e177a6c4dcd039e0a1e60745a2f5ce85a2d725d20af8e50e94c05ab1d4ebd8780b203290745be200903bda02328a9b3cec064076b10524e127056420c701903bd90292b0502103990740ee6c0b48c24a1019c8320072175b4012ae9e44b73d1300996d0b48c23569c8401e0f4076b50524e197e964208f032077cdc4e80fde5c849ff97bbfb724c3da8c0a6b21c0da8d126bed76bc22ac1691ed78752a6822ee4689b4b50169eab99cd16b3e1e0a86d3badb04937091493298a700983d6c8219c5b91efb02983d6d8249d8b94106731680d9cb269884653a19cc0200b3b74d30094b733298f300cc3e36c1246c5692c12c0430736c8249d8d94106b308c0ec6b134cc2e62519ccf900663f9b6012767a90c15c0160e652c254ab75f14e0d2ee20e9265e83b4b327c2300befe94f8fcedf91bc53db1ae03280750a254eb19f29d03956a86fc7039153cbe60a7823730133334e06cf6a10e8d2ae7116ed2729117164aa451ddfff76c80735026ba82bd5bd8263f0888fa6a862301c8dd3767fee85def95b00e49b6deeb01a0af727026ba7fcb9c9b38463e236885ec3df742853dea84fd4264ab11ff0d8a9c3da82b3f95ccdd5c1efbf6870c1fd9573e1d41e2ded39ec44dd8774e96b89781c4bd57a6d7eb487f3de228ee483d06a01d9289b27cc0165a969f0492fbd04c24776c7cdcdbd689e2c6a01300ca6194283bb2da6f404f386c4696d81b81127db8ad60090b2832b0bf008fcdb3152c61564006f63e007684ad600987d6c8c0ee01c08eb4152ce1003019d8c100ec285bc146b1a6da1b801d6d2b58c2410e32b03f00b0636c054b38144706f65b00766f5bc14671139d4f00d8b1b682251c652203fb06003bce9e466c14b7bd3f10a01c4f89b2a973b0408c2b1589d1f6a560d7a24a3a706413b9eb0170136c5ac98b746f0db2c1badb4107df449b7092eefc4286f3158073924d3849d7ec22c3790be8919a6c134ed2f5e1c970be0f704eb10927e9ee056438eb83c49e6f134ed28d74c870760138a7da8493749b27329c7b039cd36cc249ba910e19ce8500e7749b70926ef34486f37c80731f4a9cfc80dfcc97ed891e26be3a8ec23463734ed7d6878da3d8e67e0bf8dcbe36c124ecbd2483f92880b99f4d3009fbd8c960be0160ceb4096624e7c20398b36c8249d8974e06f3260073b64d300947d5c9609e0e60ee6f13cc284e03bb06c09c63134cc2d17332982b00ccb936c1249ce34106f33400b3c0c60d1c48f7bf22dbc0e131d07b39cf46aca4bbb491613d5060ad9fa5898fac263e5c743bf08e874261bf3b34db838d627c34d1dd7ba5d0391ec74ac553731d20339d7ffdc5c56ce75fd3f998f8f470045bc92ac459ae5724b4173957b96595ac5757e79642ee1a0da46b64c7f85f7c0af93c877b89635bb9f3ff6c81a1922d70cecd77fee561ca8e35e6c9d5f8355eb6f806a54a4474215be890e01fe0f27d66b8da78e7ff45e22ef35ab6d9c27217f732716da8f3ce2a418cdb53e0dcebde53e12872572a9304bdefc98e3531dc9327efe151188b3597b1c6ed1ecf8ac5952279c754e7bf7922ac3d77756e8be53aff73e72bf448cc54e82117335e248fd4f99a35799ca5562be2111333a7d9b2d0bcada610b909843f3f5fc466b1501d5363486b0e1feeb94d52c44a4f9eb0b7e8f017f3786f28e33dde932f4b1beb1d82efd56cd17cfee6385129d198253f4be3ab81ab845064bf6f4f72ee2817c62d156606f1ed464ee8bc7aa5e2bd3dbbdbe9d7e185bd04e667f19e3d6aebd7fe2d5a40e9d7ae9a3ba14dd31e9546e8ccf1a08739795785f08782842fb8a97c8128536b26d1514c15c3d5863a472522aca542751153fff0f292d7267976544ac9b3169faf6ec9a906cf317af11ce3004fa2eac513d5c2ffbc3d546f2fa3e4b96d1ade0e376afccff395e72faaeef98bfff3fc503dbf9c92670be0f993b446da7f1e6ff2f88aea1ebfe43f8f0fd5e39766aa663335d139c28d9de8fc5724fefacfdb95b75756f7f6aaffbc3d546f5f96a9f67ebea7ebf03f1f573ebebcba8faff8cfc743f5f195943c9ba33efe5f0dc6e4efabaafbfb81fff97ba8fe7e50a6eaecdec19665cee5fffa67aa7bfcc1d53dfe90ff3c3e548f3f9492e7d6c0e3cd4b8ffee7ebcad70fabeeebabfff3f5907c9dffdb5a54aaa739cf16c9b1f264c391ff93f57fbc64beb239020600 serializedProgramBytesString: - serializedSignature: c1d6a5fa19fd663c80b92510da44eb809fb3a55925ff0c89693afc870e3f6fbed61436af335c8ab104b2cfd7b93ea978487b01f83ea2da79321d2b131cdc0401 + serializedSignature: c42a2d291bc9b0bfd8980485c62af95f4a67b22d29955b325778fa4efdd29a94a86862737abbd7c5b4aaebcffe5463263ad0d527bf104e1befe8180cd258f901 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset index 61f1d19..b0c3b24 100644 --- a/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset +++ b/Assets/SerializedUdonPrograms/62d157ce28de1064b8095c8cd096e77c.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d07781b47768007a4208aa4aa2d8a94ac5e2c5812098a542f96d844518d129b6cd9b20491a0088bcd2cb2ecb4bb94cbdd25b9f47ee9bdf7e42ebdd7bbf45e2fbd2797de2ef1cd7b3b4b3c2ce62d16e03e40eb9cf809836d6fe6fdf3e6cd9bd9d9455552e97fb143fa63440da82ed5a286d5989a51d3fa5b974ea7f49fb3e5eebfaee6747a5f7fa6f4b1436a67812be1dffe5893feecd35bf36a415fb9a846759ac1e3832aadbff7e96bd37a0bf68eebff697d566c85be685875ab7e754d35c61a0a8818c18be6cdbe18e8155ba53f3bd56bfa681a0b059924f150a3fe18d447e6f1d8942eb47bde0bea36aa35a58f8dea6be6d4a496790f25ae5a58a9f08b7292ab26857c6ac97748579affb7cc765c2d5dba74ae22e7c6c8f717c8b6a68024687ed54486ad0c2a7bedd2be6ab20fd22a93d78b9eeddb1e1935641b8ebf6474396ff65f33e94692d746933698f40973ed1db3bdc1a4b5e49a5a722ea4751e16754ed9abee7af25d47aeb595c54dd793efebc83e48d798bc5cd99b4cba965cb386ec83b4de5c9332db8d265d4daea927fbe0dc7b9e323d49b609dbd815b3bfdfa44de49a2673eea8d9de6cd22172ce16933e45f28dbff1c61b1f32fbaf9b742bb966bb49b7996bc6c839747fdac37a0791b1c3a43b4d7ad3c3f5a649f7926bf69a748f39779c6c43bacbecbf6fb69f37e93e22639f49777bcedd45f6bb8ce0f884d97edaa4fb194e6e790f92bc0e9af480a7bc074c9a60ca7b88c83864d2673ce726c87e486f78ca7b83e801e961733c63b65bc97e4893e6f8cb66bbd9a42d9ee30fccf611b33d69b6874dfa9c498f9ae353645bb7c9f809b3eda6274d7aca9c0fdd80b6ebb86b07a74d7ac6a423267dd69c3fe3a98701939e230ccf99f4bcb966d673cda0493bc8355e7d3a3dfc3a3cfb5ff1c8bc60d25e65b7974b26ed2379f699f4a2b9668e6c6b762b5dd6974d7a85ca36c7318f780cfb818bba05a6b4b64970d8b16754f0aedbbdb270a78d7d017cc0bffd98ed82ee1e67b5004bcf398cfdf2826a576dd69e73736c352977177ea6f41919140a9979b2786f5e1650b849fd9726ddfebcdedf8b510374fc197da445c3cbe0557775137841ffe54a19d1d94eead021ad1bd0a2ce0ae4ddd5c5ce3fb3904a102278af19d0329d08664aef7181ceeaed492ce1207e3ec492a6b1f47d7adf02c653d3da0574eaf411e696affb9cfe6ecb73c820b397d11ec870fb9d70c9ada66ead0d943e8971c3476aa4123502e857ce9b66b8228991db3bf36ae2230c1d27134767ebc8388cc86239fbda541263f0813c82c5eb98afa1ddbe0bf1beed4306aabb1135c8d630fc8be7aad5ae92387cd85a402d3fa8202f11db9427c1bff8f1f88a5628a4177dcc861e87114365440fc766504a4a9f5b3c7e807ad08b3f8f7d2b9c5683f89af2942b5c040e61950d218e2cc74511ba61c1a0f6ff97b57a596933e8d5219f79f439705ebfd6e065d3034099a6f5b76c70e1caf0c70c4a357b30db29d722e50324e009b3945c4d54db6a0263bb89c7bc26dc898c626aa32e706dd4636d1c0aa536ec25e56a6485a5465a617335e7306b3d0ac016233cce095f1382f0959cf0b52108afe184afb3088f15297c954d38b482f53683f10aaee705d772a5de1002923a9b70e0f484d5b77b25d7f092eb6d5e01b37b6b59bc42a1a15e2fcecea6735a5b7eab7463fd019d8e6329d2d81ed3018688fe7ee4c9253e59c04984d6a3820f58e5b58089c22af4670de8cf765a4be77eebd43227745e0f71bcb3a873b2e5108fdb3de626cce1f1d29ff3b1ab6df68d3b0745ed3b57b2735e06cf2b3e806b0cdc973561cde44f6c14ca9fa3b7c6460f774e89d21bd6fb9c49951e3c9a411b69511dba1c2dea1a5aee559432a1f7dd37f6039af95d79156f9c2c6279fc896f0e4c7c0b1287519a7c99b95a5a6bab25dc79a38c361e64ac6ba7fd5460da5b9176439e56be434286da3a1b35dc39f318dab61b598663dfdb0213df8ec4db4bb6ef62cbcdd5d67a2ebcda114278b58113be3304e14f70c2778520fc494ef86e8bf06263e58d36e1d042f6d8ccc72b783b2fb8812bf5de10906cb209076fb84fffaff5086fb009dfca0b6fb4098770026ec0edf7f286cd016c12705f3f2f9f263e9f269b73c236305f26e794dbb033facc9472a7c7bdcd7d1043c871bc1792f634773f39fe4e6a7f6027954027753cc74995a3fc9cb3da6cab3d7432e50d3a9d806fb2a44e19eec7ed0832698b3570407181a77f1938825b6ced0c86a50755fe78ac15c66330815387cd39af9d6de2dbd9535c7b6eb6b5e73ae5acdcc9607da55087d76dbecfa7656fb5d906f611a932b5ecdc0e7818adbb53e7b4a0ff66ccf4aedfd9fe76d312b8d526d166f6293eb428be6c9c3d6db3d5334c8bc04283654da06ce72cf53067a96dca1daab72381161f02b681b31f03b7167243aa625ac40eaed33fb2cc4e7f27d7e91f0da1d3df656b55181cddaf48ab1a317505b5d15e748df9b7b0635aa36aef9414c66a077d2c69792582ca231fccc4d071b467b95270ad7bb7cdb4a0f64f5850b56ecc51c5e8e3b5b5e3bcadede15afc49aec59f5a6af1a79150b30fa1215c900a4b10c691c094707bdf6bd306a678ce0469ef5b78c1fb384c67394cb068aaeeb4b53a7c14789acbe71c97cf79554aa8b0df960f840ab0d62a2f5400825d3ab404737f40d61a8343992f2a604870c6dd2961dccf70b97549e47680abbb6eaeee7a4ab29183b67ca08a2e2cd3c80f710af4720a5c2c4981662e9f3e2e9f4b2519790b67e4976d460e37d3669761da494b6e499c1c28e738c91b5b15374eba62b3206bef08ebdb6d63a442f973bd5eabadae6094090b9af3876e6f3997573507f8aa39cc09efb70ab7446b3ec2db38e1d74310dece09bf1182f0235c3b1ce0dae16049edf0a82d1f1885c0c2a3658d578e71788643c0739c133e1282f0131cfb9b1cfbe74a627fd2924f1267155f17f54a856ea63a6bd8d264a66a1ee7a5606ef155f4170f74f7f8503913ef43fa9c399c865f58f64d7058f9bfcd527b5883565f770b7dddb3aaf02d6249ad38cf79ca6649d0cbc1233a79bd5c359a1844dcc5f46da7396b7d91b3d6db2559eb194e97976cba8417969eb5e50b4dfd4e084dfd595b13c4b9f7e98a3641187c2d6207dd9263949077f6eefa729adadda29b5a0a9b5a5b80a61646e9b92675ce56637817e391688d7103e3ebe82816500648a525f01b50fb5d177c8a061e790916148e62ed9d51fc8480b4265c8d9eb73570d884e7e9bcf3759b6d0d3cce37f00e9bb9e06d93bb15311767a6b94fcb4d61efb2bc39f074e0ea1fc7eadfeb53fdc5968cabce4ece5fdf0fc15f7771c2274210decd09cf8420bc87eb3e5fb6759f5051ed7a735c0789c7f4d5f774daac1bc4097df084fe76447fc2cab5663cd2a63f9bf5306d4c1b669b3e724287f56318dcb7eaab8be96c2fd84a09c1c403c50413f0b05df1c1442f4763ca46238cdb61176d39c2f0053afa650d74fa2c92935be45d4cee2af24e5df879e54c7dc3feeb5a624ae70df23a3007ef7a71f70a7f173313d8c5cc2eb998b04ac6b9984bb6ba04e2afd80aebadca59be2a2f73e63fc799ff7c49e67f8533ff0529f3bf6acb1196922f0641e6b31cfd9a4d30dcc67b1844b0cf6dbc7e9b605899f26a10c1095ef0759b60b831fe2888e0242ff8864d30f41fafa9e5f71f0336e150e1af0729f5282f78d0261822a48f0a22789c173cc4e1f8e810700c73c23f2604e1239cf08fb50b2f6ac2f3a64d380c973f2e086f9f5b04cf71a57e8ba5d4ef7fdf95a24afdbc4d3838a6b72ac6337ebc2ae5fec32d5b3ee0193f41593ce359a554ee2350b607a9f8c7a83ab4639fc3cea845ddd17fce7ccf1ded9fd3d8e12ee8b812f6d3ae31fb846731fef7054eaf4fb4e905a3167b9e4e3967b4864e29613665081fb198f62929bf3ff748eee397c5e8f722a7df27d9f41b09b9de7a4dbdf9e9b99cfc8a21719b23f1361b8923cb24e1e8efacfd847744bc6ab183112d2ba30704c568f112a7c527dbb43817c85e3b7419c64c1433138abd96d616ef70babddda61b8c0aede36058afc92d47b75b6830bf128e9677392ddf61d3f24a885afa6b567c2ec5689de2b47ea74deb4b25694d75cd6fad5eeddd474678ddf36514a3f13d4ee34fb1693cbce46fdc69573ae96abb47d2b77466762a7700bd505a97ff219edd62b486a3635ae2226a0f72b3d778b9d047c5c2f058a31c874fb571389553f3d9dace5d77edb77adbd119d68cc2e07dcc736e181a8d711a7d1ae7a76c83e8dc3b5c0e6fa7ec7dfa783ff6185087bc7ddad686861739a4392ddf65d3929fc0863949ba82d7d171de7824b0c1942e3f9470ac40e9c3a8bb714eab4fe7facf52fd901bb32ee4ade7e36b347fed5f31badde774fb0c9b6ec759ddf24b91ab1178c4794fbc609794bbdab3185d26385d3ed3a6cb00ab4b6e091c3dba95f322a794721e2e0e5afea06779fd69f6098862086438029f6523d0e589f468ae34d6ebc6be21a3e6953dd6a3d7f91d0947c797391d3fdba6e385803a427f70cfb4bb51c545b5e5d5f401a7e9e7d8344d0b47030b9e97df8ee0adc2cc9227f68f09e811bfbea714ff3cc971fa5c2e3a96e2047b5fc16c401fe70640769637c5da55295a4f715a7f9e4deb6b01db412fde28481906ee6c44bffede839a81c0705a45e951c634a7f9e7db347f5b99a3646e155276de22683982ac67928dc36738d25f6023fdae3293ce5ed3ad53f746d4189e3b8a52c7f4b9c1fd52aeb5f29a6497c4d817c484417e9623ff8536f227d958c66f418743b607cb5d68a4bf5c7d5ee1f4f9229b3e677d4706d9750db9e382711cbd4deaa81aea699119a9f21ea914bde638bdbed8a657bbb28febb89ba9b93134446057741947ad5e38883fadd17fb198f348c434b683d774ae33c804e62693f8686beb52290bbfa4074a30a5fb73c87968291628bc24ecdd8a7fc76efe4bfe4a7ddd6a69eb48fbacda055fa497ff6ad91aa3912b4b93c6477adf6c9a7e09d46a8da9d5aa243e407bb0446b2a5c8a2f85dcaaed3654fceb8c1c01d7ccfc087ba3be603e859ecc684601ee4c6208af9706dece74bcbb24f73dba61d5c4ab5a81ff974942727ed5c01917432f1305381f8c67e17cb9249c46843383e1b33b3107933e192d9f4e97a471e21d029728e05bbf328bef2b24f1f9af3a8f02aa0f5467517da524aa86254b7306e55d66d8761f831cefc3765140f76ed248bf4a125df6398d2860992058be5a120bc48ed9971045010dfc83f0d623dc3bff17d6abfb0bf1e46341584fd7a31ee18cf81cca1bf3c686f87a90c7ade45fa3486c97f05848828d9712051c798234c144919e2c911780244ae875b38322fb60a61506455fabfe7f8f575a61bcf27500e19681e078a1af97f442355897509be05eeea8566f0ecb79eb7f6d8e4f6a0f52fc52fcd2769575d9df2009abcec0ca9de1382687ec8014b2e304d9374a225b6d9065d4b4cabdb9d72687ad5e0a5b35c1f64d92d8c0497b5d71d6c1677dd443ec06a2677f2304e43757c6fe8ecb614b48616b22d8bea532d83ae5b09d96c2b68760fbd6f27710ed116ca06d04d9b755c6d28ec8616b90c2564fb07d7bf92d4d109998a5b51364df21892c6e90dd930d738f4b81da4d407d67b9401d8e20a86708a8ef2a07a85444412508a8ef2e17a82836bd5d04d4f748825a87d2b26b4ff2d77c462ffa7a9ec0fb5e4978ab8c954d9b1da2b6d62485ab87e0fa3e495c7ce4d51d412bdb47b0bd4712db1a161bbc3e257a21eb6502eebd950277520edcac14b83e02eefb2b05ee44042dee0201f7039502773482e04e13703f582970511c969f20e07ea852e004271cc7a5c07510703f5c297082375846a5c09d23e07ea452e004c7a46271dc2102ee472b054e70dcb0450adc4102eec72a054e70aa5bac733842c0fd78a5c009de0d1503d74cc0fd8424387ea42ae8e16aa5b055116c3f2989adde60f33eae2de8dd6aa4a01d25d07eaa12d0042d4d0cda4502eda725a1b9336f8e8059591b8b4be1aa21b87e46ba2380e7eb1670f586f7b9f7e8ddc21b22e07e56121c54bd6b6379abac23b07ee82a01f57392a0ecb787057d98986db512643f2f898c0f320427279352d8b6126cbf50196c82c3f6ed52d8d6116cef93c4062c8a59414d1f5c8dde54f92582f5fd9258eb55eefdd3ecdb7fa237a0bf49a0fda22434775c3a667407db735fa211c538ae8180fba5caf83ec11b8162be6f07c1f6cb92d8ecc189e00c885870729820fb957234d1f4d2db30dc43a2e0c41639ec27e07eb552e004272bc5c09d22e07ead52e0a2b8ac663501f7eb95022738001303f71401f71b95022738961003778580fbcd4a8113bc5b2f06ee0c01f75b950227b83e440c5c2f01f7db92e0e0dec8ace7b55782f3716277e90708b0df9104c68f142e44f01efd0182ed7725b1d9470a820b69c4460a5d04d9ef55c6d204c35db131e94682edf7a5bb02ef03b7d997e0456fe1d62001f707d25d01d81b9ce2be0f308a9346e709b03f2cbf4f135cc72be6d3ba09b23faa8c4f13b434b19b80ab08b60f94a369c205637ac723d911a858d3ac25c0feb8dcc0a2e8cb1401f62792c0a08d3899c2cd16fa7312d1bb637a9d40fb53496890f57cce6fa388c1127b11453f81f567d2b09c213a34c968faaf2708ac3f2f27ac28faae9504d65f48c2ca5fb31645db7a92e0fa4b495cd9b095bedb3d8a77021a09b2bf9244e64e2f8e2ae745f9f4a779a2b89cb48e80fbeb4a818be2e2e51801f73792e0d62abab0740085a4f0724744f4c6983708babf9544c78f31bb22b876682fc1f67792d8dc2153b688d1ec47d713607f5f6e60518cd3561060ff506e60824b5ec480ed24c0fe5112987d8251d0c6c49cff6682ec839571fe517cbfc21682ed9f2a834df0eeb9589fb98660fb67496ceb95bbded6fd492defcf6945b1b19e25f8fe45121f6c4c6b59a34a70c981d81dcd6b04d3bf4a62824719609a7154b90f694d98424c2878b031efb750226063cf1178ff56fe3e54d0ab89213b4690fdbb24b2b5ca9d4fcbbed43eda4b465b08baff9044075391057e42260296364c70fd67391a277dd047d4c26e49213b4990fd97b48539c81c89a2b8b64ae15a4b70fd7739700d451ad72682eb7f2471b94374e7d7081695f052f7ab52c09204d887ca0d2c8a13dbdb08b0ff2d37b0283e30d64980fd5f3980cd2bf7779ba239cd1827c0de2837b0284e646f20c0e0c65305267f7a223867f634c11693c4b64e799f39c9fd5d73c1469a9282f7ac7ad3fc30602b4cfc548101ac320690f0bc752691330195b02ce74af8ac8b4b30cfce240aac404f14f993508900af92777e956f83a92568bd57f1cc94a692c234fb0b7d49783a3c069309c5fcd0b4bf4ca8237f69d55011317b4b9c0ccdbac2f849409ba685f5e32d75b54fad2477425dbc99f55f41ebbd2ab90bf43d1c82ed152e513cc6ff086539e6791ebf5a757e4d7416cf84622ec7aa61e626575e06f34dee7e3c2d3a3cdd57e65af49e522dbaf812d5485ab4236d02f17b64f706d0ce5e0f5e9db367cda23da4966cc169df703f632c00896d319811e1a575e8adfba86b06a54e29f71ff494ce5f23f6edc3fa5ac7a7a455bf3e7f0ce5c1bff88701ab33782bf2e20000 serializedProgramBytesString: - serializedSignature: fa9c2ac4792fc53bebabf54d5f5a47e6eb8cb83b3598b2c2e3412736804de36c0f739d24f48e474bfc1c56ac3a3cf933b3fb3a219846e8dbfe34590fc1c25408 + serializedSignature: 2eda7b4055047efb4dcb6576e96b92221bc4c172a7d9142be8470e8cb3b790997c397593e968427b3c179f7f99660571fb417ca0940929a2c3d4e80edcca8e00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset b/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset index 1156c78..670600c 100644 --- a/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset +++ b/Assets/SerializedUdonPrograms/638b7ba182e1be2469240ccd8ec34157.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c5545f6f82740484215a40b1814350a921010bb94501504216043219010a2692601c15eb0f78e5dec057befbd63efaebbabbbeeaeaeeeba7ddd5d77fdcf993bf7bdf3e6cdb9efdedc775eeef5ff231f32b9edcc39df6967ca9ddba954c87f79a3e5af4562bea81063c442512d9a44a3fcab42860df2c73972cfcf132d32ac95bfabe4b5d1a238c393f06fbbbc41f2f72c79d42adae493abc47219d6a9eb0b448dfc7b967cb6461ec1d915f27f8dbc2baf8b7c68a1982ae68a7dc5c0bcfe19442c520fb5ea737960575ea1fc3d45ac95576b94521049a9ba3450fe5a20afb4aa6b0d5269f7be83c521caac06796db97ca645d44b99cb94c4c2f55b09f58770822d7438548787c9ff5de5ff8fd0318487ebf31fa363b06e2971df27c67da71bf7f5d7f77daa8f0b74b8993eff337d5c489c2f22ce7723ce7727ce77d2b20af5df9849671dd61bb6d73b36e5cd9661be0c977ac81aa8c3c148e72e3a1ca4e57ea68f87e970b80eb7d461b1beefe73e7476653718b21bf5f12f8cfbdcf3bf447a42d884f46d72eeef34dbb0a9493ffbb9715fb3879e2ed311869e5f18d7b7d2e77fa58fb746711779c837d3ce0d9bd173230dd9ee3ddbe8b0455fff353a86f00824e308c7d6cef39c3cd079bd3ebfad0eb777ce8f70f3ef0e3adc0ec918a5c3127d4ededf635000db5a456abe6cd53a7da975fade43969bfe6d22359fb4e970953eff253a8670b53eff1b740ce1681d1ea9afff161dcbb8babc6fc4bbc688d73dbf16f171eddcd178c6cc2b638cf4f4c3ee2883dd518e0ef9c50ebbfcf11eb2ccbc7534d2b9b41dba1c63e8728cd665a3d6e59900ba1c2bfce7f3e3456a3e3f5e87c72119c739ba74ad26e23b01dd5b86e2937a77dda8cf8fd561b9e02f13271a2c4fd4fa7fefc82ae81180e5490158ae3358aed3e1c948c6c98e2e05f710f19d82ee1d97cab2c02dcb6ebedc29072c4f35589eeae85f38d5915578400096a705607986c1f20c1d9e8e649cae7579dbd1a5c8ad7f26e87067063eae9ebbe8f04c43cf337578963eff3b740ce1ae3a3c5b5fff0a1d4b5b8adc7c61b67560df2be89c1be2b6d72b3d77d3e11064bbd7fd5b07bc7f88a37fb7c58eaeddfcb4ffbbebf05c83e1b93a3c4f9fff1a1d43788e3eff7b740c717fecc4ddbd8c88e77c239ef375788111cf053adcc388ef9bd4f8ba5706b0f12223ee8b7478b111b75b375da2cf7f8bee73cf4378a1befe0723be3d8deb5f18d7f712fedba6ed74d80fe581893a9c2492e506c262e1df3f9d6c911bc48fbb4cf8af472e37b85faec3f54886ebb75d8aceb972a6e8f02a43ce553abc1a3d73b50eaf14a9e5128e657ee909be8bcc9f3dcf46f1b9d78bd0df105e61d1c5ad73ae3574b95687d789d43ae73a1d56e8f01a915ae75ce3e8d5ab58a4d62bee7d9fa7ded7ef117decfa69bbe9fbfea88ff345b2ee80f3dfe963b75f771bb2e90a1db7abe3663abc5524eabb5e0fe8737d8c6bae2cf79cadef77477a5cbd7b1871dd9e8cab77b111d7ede8f93bd0393ffd4937bda6ea7083915e1b74783d8ae37acd78b148a94ffb341b32ddfae40643e60d3abc53a4d62777eaf02e7dfe4fe818c2bbf5f93fa36308a7e970a3befe17428f9b0d3d6ed6e1bdc25eafdd2752ebb57bd17908ef17a9f5dafd3a7cc0d0dfcd1b0f1afa3f68e87f8fa1ff74741ec2993a7c48dff75774ecda0fe1c3c6f58775384324f2d0f0627daeab482d1fdf39d7fbb9ed45d4d27256c0b474d32c5b69b27707a5892d2d1e3118b8759e9b6fbf46c710ba3ec28d22d54770f3fba32259c6e11e59a637bfd878f6fea4befddc7366da3c66e8f5980e1f37f432ed79c278ee091d3e693cf7383a0fe153fafadfd0312e9f7f47f6e1f3ffd076b86dea3e3a74c78dbcd2c66c375c8657e8f3ff749e1b7a23badfad2b5dc66e5bd347d8db05f33c15b7db9651f9c56d8b37187c37e8f06991da163fadc3393abc5ea4b6c5bafe1fe0d68b1e6d667f771cc5d266f677e565a9cd1c30c9880bb599032a8db8c2b499fbea709e0ee726e3199ec9efd84f87f3853d8fe13c63a61f55f73e63a4df333a74fb6f6e79ff0a1d4bfd06bbe52b533ef43b366d1bf3746d5820bcebede7d133cfebf059c3ae6775e8f69d6fd2d7bf47c760d778e37e37ed6fd1f7ff0b1de3fb171acfbda0efffb7707cfd17f4f9453adc9f487f190e5eaaafb9630e07fab8f7201d1eece35ed7f73ac4c7bd87ea70898f7b5d3fff4591ea577731cebbf9d97dae3df999ca0b7ed3fd2b742cf51b32da896fc83a223eaabd7cce88ef391d5678c747da45b57f2f19f1bc64d8758b118fce9f5bb863dcb6f2e59ec3f33541db95ee96f392e31666fd40cd5df525e499f707cd5b976ace6e7b5ca5c36582ae77970bfff9b1dab8d726af46872b847d7ccee62398fdf10d467ed8a043dca72a44e7e0deff10b2a836e04691eabbe17ceb722e32ce537150e5f2162443e7cde16edab9fa631f40a7df30773cd6e2030c737d88cd8d6bae2cf71cce477ec66b5e4672faa17310bea2e5fd808ec116b7dee8899e83fbfeabd3f72ae3fa0c74ddaf5eaf5af47a5587af197abde6e8b5a53bd7dd5b24f32bd26bcbf1c6f5b901f47a5ddffb3f740ce1267dfe47748ccec39f29e7dfd0e7f3446a9df626b2f74d742f846fe9673aa163696ff1b7866cf7b9b7f5fd9dd13184ef685d3f46c720670f874fb11eff2f7ec178ee5d2daf0b3a86e7d619f70dd0f23f35cebfa79fcf47c75d2cf1986b075c7be6a06390d355a7a75bef7aa55b7fa41b84ef6b1905e858ea3262922373c452e3fef9199e73fbadb5467c3be8fbddf26eea0871b9edd74a42575786d778aa97ed6e79f84073fd081d43f8a1911f3e746cda6a3171df27c67deb8cfbccf44bd12d3f4fe59f99b2a5a812cda254290bb3e97e97f7b84f665ed803a2bbc22ff8b79d8ab64dac958fd6d856d72c546b77dac438516e5d5d3338af07d2bb42fdae9277d429a1ddf2d2a278342d0a50ae5efed4a0a541adf2fc0cb5b2081607d5c92b636487ba4e3db5548c95ceedc186944532da7ab14a1e55cadfcd4ade52a976fa9d994c826544e633f3a54c679553833ce3026d96c7f54ac305eaf76aa5698dd27e963cd7a6d65c35caec3f45866b546ce9b6b7c8bf6d71566a64761ded8b9da8f3ce922a3799a64a6b40fb525507fe5f8a74448a00faaeddf29c62d8a554b51e67a6a5c4ff31742a19681c6769196315b2bc9473e5a254b59ff3d30806b731dd427bfe76784f10e33d6db19381e4de4259904ce1354b5ebafdbabd8f7e393fd5b471a2540dd90dcd609a175890579237204d82b709f9f95dca4051137f9e0dbf6afa17e410bf735f9dba2f780274558d5f6a02e441f7b7125242feaf574b4babd4c2d4e5629e3cae928240d90aa59ca364bdbc9e965e6520bc40214f6f5033a94d41ef64835e986be8996b192fe88509bb92d0e19f9d60114130930e14c1ce3682ca7b5ccc4a30dd1d73ff9a229f5d2949ac566dec2af9bccd7df3660ac3273b1a4ced3cbb2b9ec556a732984614e12e36c26a7ca72e27841748cf661f696e525a93f257209e56d59ac27d0b554e813cd42c756813d3d5baf57a695bd256579237fb1ebed9f754ec7744ecb3af2b952af9b65451a36b87b1a6ca4279cee9064c5357eb947de0455629e97365593d4cfb98600d75bf4b7b8e7a116095d2c43b5d7af94e97de2a5d60292da7b654ca74b5a44c19a4cc6636038a0c0340774270812dc9d5e4e2d20e4972a8b2c1db6890d6d46a1fc5eb5eefe4ede33b79fbaae41de991bc4135a392b2d09694407c733f49d9974eca224a70bf9082bb5182fb8714dc9d123c20a4e01eb65cad8651ab3a30572f506e47b592172e5f0ff49daf07a97cbd4dc67c1d44372a67f7b451871a366f49075277dc74efaa3833f1c1be890f51c4b7ce48dcaf5e14ed5eb6c20327b7f0537886d085a73725786848c19bd9f2878aada643f2873378d59421c707772ae03db5ce06a75265fcf61eb9a2fdda140b71c244f4eb8d4db327e6db33e770953979d4a0326a1f5b7e8264dfd2c2a90c384933c444f4eb8d4d9bf6ca4fcb69c3e99cd6978ab2d8234a4d0e6e11c5e3c68d9b1828cacda928479051ae58b142c7e6fe0a16653f5b94e0d06de5a7a016d082fb5382a1564b1b0b01e583481f40491f990de9036d958cca8295ac958cf9aa71932a47308aded88ef10f68b04799e31ff622bdad2ad283d28ccbac02556007d910aa2275102bc2d40eaf33a456637470cdceac7b9737ceed6c05c24ab344d11c2eccee77306d28b2836d591f32e7f6d6f436b3fdb674b61f4249de21ace42d6c92a113334aa48fd1fd28ffa5092fa2850fb5653555959e9893ac9669b2d4d6a74f1f857167cbe6cb7085d202ce8316992759bd33eee8041fe44aa87a7f1acaa21d6f058c577553c30cf662354615ab68e94c15d261b60c0f79b2d49218659018f0525db7eeca7a33ef8fa1f3fe70aa1d1c6b6b07219e25d25ea8ccab558e3747fca68a1a3df710a4bddcd25602950390db291a679ea35e78cff7d94b09bc38bd65fa6cc1447b5e1c27a8f9166f1da8fc526c23a89c9cc60eadc3c0635fa5ac80bf57eb1253a9e24ece2a85a99d6021d830cb2c8df2d9acec7752eccb7dd403d9d09e4ab11154c99b602b79bd54c95b224bf91235cf51af8e60f18ab3434e90d2b61515f3ce99625e222d5ba94a7f6da2ec0789796bca41d825ac833092b269579b4dbd954d15ca924af9fb705163cc9306b16a1b2aeedd6c710f3278d23ac075c8e16d81b4d9d6a60db84abb8b7457697d670b660f57693bca54587618a6b75762130c2dc09ef66a355df8385af8f61492bd2c48560644b2038564624824a3282493ac48264d0a8264b44578a9eab6e67e4d4afb66e7274b3d07da3286b5ce9f22bc9694049d9bdf914af30aaf1ab43c0b75f7182ae6a9b698374fa96b26cbf6a93ab136042c040ec16bf1524a8769361d0a940ef355ce58abfce220719551714db7c5d543c555a956acd4aa36aa45e5c526493b48ac63a90a6386a5c2d8d8355885514e099f69117e4c40e1e3285eb3fcf29a2d692d97ad51105ee32993f6b698f47d41309376a284ef6311fe4a40e11328e1b32dc207150513be33257c8e45f85785c184ef42a5f4beb69486b1de7a95b2700aaf0f83f251a5240449f15d6db143fb31d7522dc352a634e15368e1bbd984839b082f9f9a6e625e103771770ada7e36683097d8a62a6928105355e55d25dc25c64170ed618b17da72686dc3ba377b52462db019e5f8be4e9be0b6e9ed6f8ff6a2e2aeb4c5dd57e0f6c8d950b352c55babff76f409a2c1449b06d0f02d4c5c30464ae055d6e0232593284bf7b759ea8c9454e8a1ef64295b255bc1b9aa27d9a26addea80d64eb66851aac6ca73395262ae2e0ae6b9c1ebc1fe06c2e10562db2849a6f829bf6d0a958607d9d2b06ba2ce84be5975a074aaa0eac7832df563a780f5e354ca8cc53633c0fd84f9801a694695840389bf4038cb259707cc7ed3a8980fb1c50c6b7656ca9fc5b24687e110085b6109728018a7db628436f45091de86ceeb13ac0d9d4199b3c4964503683d9312bcd4c609e6174b03c99f45c9afb2c94f6dc7e6c9b46f5513eac1dbb1bda9d45866498d2ffb064b8d7d28e1cb2dc24fe8174cf86c8a58b58d580f55e5b4a9ea0a9a4467b06f8cfa09c26b0e550dd458aa81bc80d5c0be14af15165eb70e08c66b2ec5ab3664d19847095e495521d023a992e9d4de44d88fe25467cbb40139cda7cc39cc668eb025b187ea0b28e987dba4837b9574f267ab79e0365967b7a846bd25b13779100d2aa91c5c6fc9c15d02e6e08516e1a56a7e7aa1e898b744a86dd9bd3d9a0691ee6a96aad9f0c16976f8890de66c0a411c401b2f657c265dbc4219de23c37583c8194ed8dcbba49d71523ed322aaf434db6a9941c14acffe54fe3ec296bf8b0574989cce6ab152bb41b56335fa058323e535382ed61394c52a03ac55c7b5ea5ab0d6ee00caf4168be9ef0734fd40caf456aa682fd2fd8526695033eac1178b9a44110f62de4194796d16f360d94810f30ea6cc5b65336f98baaf5116df2ae1ac0186657ff3651d56accc2a9654921e2b9c5b217feaf552c020462fa68c5e6d317a7440a30fa18c3ed266f448234d97a5f43646ab746d4cb8ecc5bafe6b517d4827d3bb9082b9d4875208d658101c1010c1120ac15a1b02e8264f5725b35e1bd4a650d4eb26bf5855e80ea020262ea54c3cca62e203014daca2841f6d115e3c3498f06514bf63a86a619aca164e4580b393933582bb4bcb29f38eb5983735a079d594f0e32cc29b030aafa1841f6f117e6340e12b28e12758849f1e50782d95ea2752b5a5f95a6f714ae5e196a306ed033ab9e36851261331485e5849e975924daf51a1f44ab6da4db2be6c4c5c1b1b50e73a8bcea56a0121d40a1db572140fb94f5631b46f15297c9fc0dfe019ece852a21b99ec6846b98887d97209103fc5a6ac9994ebe8a43cdc261826024e1521d78bd453924f0b2bb9c12619eae9d3fdc028a105375282cf0829b8896271665816cd36c9500d9ee547e5eeb4e0232895cf0eab728b4d320cb09fe347e50369c1ad94cae78655b98dca18e785cc18aba8daff7c3f823daae8d536c130a8005f76b02eea0830a8702405fac2b0a0d750a02f0a097aad4d300c7d5dec47704f5af051148b4bc2b2389a2ada97862cdac7502a5f1656e5632995d78754f9384ae5cbc3aa7c3c551b5d11b2363a81627165481627522cae0acbe2244ae5ab43aa7c32a5f23561555e4725dfb52193ef148ac57521599c4ab1d81096c56994cad78754f9744ae51bc2aa7c06957c37864cbe3329c13785147c964d3034acb09d6dd886f56c0af42d61419f4349be35ace47329d2b785247d9e4d30ace8810df5c3aee8399fd2fa8e905a5f4069bd310b5a5f4809bf330bc22fa290dc1512c9c594d6776741eb4b28e1f76441f8a554a9b9376ca9b9cc2619eaeafbfcc0f6a8abd7532adf1f56e5cba9fcf140c8fc7105a5f2836155be9292fc5058c95751301e0e09e36a4ae547c2aa7c0d25f9d1b092afa5603c1612c67536c1d0d8c2b77ac236b61b28ad9f08a9f5f514e827c382be8152f9a9902adf48a9fc7458956fa2243f1356f2cd148c6743c2b88552f9b9b02adf6a930ccb85e1db34e41e29e6af40bb87dc668b12165fbde08792c7e65bb753b6bcc866cb1d942d2f85b465a34d308caebdec47b0c730dc9d36c1e09dc0c721c27a2777598497aaad1672b95279aa5a36e0cca0075fd7031fa91861e1a05858275de0f315b615cb99f4a0a656eeb651549b03e4728594bb2e7f817a4ba03d7bc9bc6e2976a56af381f4d54a7e621b9a48067b3a6c12f695507e645369710f550edf08590eefa5cae19b592887f751c2dfca82f0fb29e16f6741f80336e190f0ef78154b3382d7e8081eb4450085eb5d4b6e2d83dc8ab29d19cf263a9e87a88cf35ec88cf33025f8fd90821fb10906efe5033f823dbc97476d826102e3433f8207d1821fa334fe28a4c68f5359fce32c64f12728ad3f09a9f59394d69f6641eba728e13fcb82f0a76dc2a141fd4c84ef553d4309ff7916843f4b09ff4516843f4709ff6516843f6f115eaa36e589ca4ee8eeb236fc7772617bd09dd03f1741f78cf94204df113da8ce94dff1822de961e5d9af123767487a8f95672fda844377123e8417aa3bf9129563bfcc428e7dd9261c1ab4df88702ddf2b148fdf86e5f12aa5f2ef42aafc1aa5f25761557e9d4ac2afb390849b6c954e319c5c96c34a27f36a38f78589e06bf57e6f4b586bf5f28daa5eb64dab5ec2694755286f50c9fa6d1692f54d4af81fb220fc2d2aabff316c567fdb2619d6307ee7a7747aac617c8752f94f61557e9792fce7b092dfa324ff25ace4f729c97f0d2bf9032a01ff1632013fa454fe7b58953fb249868afe1fc2b2ba7adf44ed905acaf715b075c291aace393cf192246cb030435d999b584d0de7ec9b69db36ba84bb6df15135519026eb63caf27fda2cdf8db07ca16a11eaf5bbcc4ebd0f5acf927f398f83dbe56c3591ac9f4d1bf1b5d4fd8a8358f40965d1f7368b4a098b28b67eec6abfee9f52baffcba6fb8476e9ee6cf0b144bdc6db9a787d6d5f9def4c5bf067c78258f233ca927fdb2c81cd4bece5015e989ca1de986f162b85f3f948d0b1555bb15cb81bd4d365aa22e51e6cdd2279b62ee086129f5196fdc766d91e461a8db37652327db409d7220b131b97d1691f7c2bb19f5356fd60b3eadc8455ee569b78a3cd5989f7a056882aed07ce4adc99dcbe73be2afb35d24a671b963189cd68e0ed930ae1bc5e077293cf24b7b585b7581628094deafe56cfbc6b5e496eeebac4c392e4b6a3f64d47b3919f7e4191ffaf8dfc18cf32efa47b6a399fa6721b94896ce7995f529affcfa6f9cc2c968405014b4236d2e973cada1fa91a8d6e131c2b60333ca7ceaa526f4783ff006f47bbfb8178b72bd96b75bea02c836d12d22cab612efb6db2e582fe62adde046b91a25327dcd76ffd97722fffa23d39e05714a73c1ba7851d56477a130acfe1d714874e360e07317298113abfd0392608912f29229d6d4446faaec367e83a3c3b3ed96f282dbbd8b4dcd6a8c170aca92dcc6c9546b5f2ef9569ba26b7bb08a2e96f294df36d9a4e35344dc689ebd9197a0f2127b755eaedb3697de9f3d9aa777f4759d9d56665b961a5f37eaf531adab4a595f21cada9577dd8be74fa8ab2a0c066c1645fe9344d1c216fafd2bdc9b51d9a425f53f615daec1bef338552bd4fff69849f0b62c5ef292b8a6c564c482bf7c95893bd5fa0bd425db1a792978ded4f8f6f284bbad92cd927a3254e8e9bad5a9dd6449d3057a65732177a5bc66ff3b794cddd6d36c3c418dd93c6df754cadc3572744642bd7fd81d2bb874def593ed36a8e80cfcb8187dcac6c59eee12fb72fa5da6bef1f297b7b5279335bbd21772cc469dfaa65fe6d9457d3cba477ffa13d9ee07794cdbd6c36ef41e64ddba827ee114c56671cdf8fdfaa3f5156f50e53ebe38587416a4bfc5c102bfe4c59b199cd8add0c2bcce5798e1dd395a7dd9061dcc5cb52536e108bfe4259d4c766d14ebe2c72da63ba47e0f75a103bfe4ad9d1d7664745463fdca9199d8f0ad479d486f46858f66dfc1b65e3e6fe6cb4d7fe53551d00e3d651a8f1ff4ed9d88ff2abecb5df1cd586ad94fe94636b851ae184b6a04c8c0d5457b4d7927f5096f4b759b26b401fc36d9ffcf918d9a8c1ff49d933c066cfb40cf6d428bda00572c71452edaa4b8c6154a5dcc5df527d4fd939d08f3f1ca49feced13e7b24ff62fcae641369b67fab239580f2097d6fe9bb276b09f3102bcdde864b5e00d664ebcc696681bb0ac2016fc87b26088cd82dd3dcbe22c01fb95d5a69540bc3d63a6f9d86c94bb1f289bb6b0d934dd670b3e4bd9e93dfad1be56bcfdf9efbf94a54383b571907a95c2f9c67d6adab5e9b3dca3d6ffa32c194679f5c1e7d6ddf1e8e4d50ae50bdb46e5db579a7ea4ac186eb36276402bcc3a025a33dbbc796a2dd1be1882580d135156abb7b4597d4896d2ae358475b9e192477129b671d9c6a887ccd4e61bcfef44e939a2fde3c4669bdd91ad7467cabeada8f6204ca9f4d37273ad17eb4259ba35d59ab77f85529d1e676e553eb5f321e7d43574d949bd7ccaa691d96b19b04d734472cfd5ec59d195b2621b9b15137d95b14c630ac1cb58fbea8f02cab66dfdcc0752fe56a699a65cfb5a859495dbd9ac345798a45b395db5dd0daa2f979d5513ed1d0d2aa22c2bf1376fc36159f66c2e903f7979b0d98eb30338ace599a73c546714bf7404386d65897a23f3e7ee21fe06a913e4a3ca44cf26f327aeb79738bbc247ac84ca35901490b19b81ea0a61becbe1ac8b74c7369c120e2b7767a8f6bf46590deb2d670be703a57e3f356e5bd301676dd6f9ffe8b8f972789efaa029962549ab2f6affd42cdd0152b5b74ed54ea5eadbdda3da999b326b310a62eb6ccf43e9db29e0d261d3dd11e0ae2e5685648998299c0dc69d0fa039dfa2cd1853a64fcdeda804546a0119c5e1e10c9bb8c12a7b390d608b7635bf92320bf23b95410a8ce6c434340d53728d93a30a1e65c59f82af8e05c83dba2541eec8097250469053448d1ea498aa9cecda5800fcac2809700c27c09e0a20d40bd8b385bed70a29280ea87e189144559adbbacdfd82731c303dd33589a98c13535785c9e9d3b5c4240fc13f17ce584e38fdd2f290b9f8a3422f7b8947ae7abb53125c3927b802056e959456ade7aee280677d8f249e71b9f6bbda5437380e98daf29398c67362eaefa3f8257dad38a0dbd839896e27fe9acbdf77b6e3006e252a9a1338c10d48cb73a68b3a4d5d89937bda03f9f73b776c7b997c61300ee05ec94b82db85135cef8ce0e280ab1fc2b56bee7dfbaa9874b77b1402a6827c43b8b92ea1fde364c1d8d2237a902ba789356a15748b92576d8ef0c1cb5391d37c373c425792d6c529f151dc4a02d5657eee4ef6144a023a36251ee374f66b8e2f69bbe6f681a96b50864ada354e5312b8e92c0935b05612c8c729b174494a320ca7242712ec1300653091b0fbffe763fc6530c6bf0740f8484370eaff3df9c711dda59ef07a85f712b3b1b27e3674189aa643ea5e5a6e0b60d3a628a58dd8d68f81ed6927e0bb326e73ba57947096c712e78b08e7c45ce0ac258162f521774ee0c359c4857331c23989bf4746e7ced419e6b17c280bb8503e84504eee589478e17f191fca715c28cf4328a77424cad4350c8c280fe442d982505670a2846f41ac5208931fc49ea55f6863c3d6970b5b11c23695135b2f79d0ece12eb3a11bc485ae0742378d135db12ebcf5f2a67ab5b01a1c9bd44fb47bbb408c059acd01ba14e19d9e8bba71b9eedf98ebbb525b6c46946c2df670847246c7a28c7b8bbd254239334abd1c56b79cad905f8970ce8a12cef258e27c0be1dc9b7f8d592a4e3f6fdeb1167a3627e93684751f4eac0333e4d254379db5c8b339ea4f2098b3a30473a718c27c0cc19c132598e36308f3110473df28c1641cbf648379338239374a30cb6308f30604735e9460328e5fb2c1dc8060ee172598711c76bb16c19cdf913053bb96ac30d93a974f21980b3861769307f57afe1c6f8f16bf1ecf4084ac92131944bd4a5dac14ce9e136cb08670c1ea85602dcc45f7d0df9c22def880b1d83671615d88b02e8ace84d82e31ac011f4728f7cf4573e277d67bd718ce79ef8d601e1025988c39930de67404f3c028c1641cb66083b9138279509460320e5bb0c11c8f601e1c25983bc710e6ce08e6e228c18ce3a2ab0908e6215182c9386cc106737b04f3d028c16474d9d9606e8b602e89124cc6a15e3698e508e6d228c1641cea65833916c1acca054c6aadc64f610dd1d608e6b228c1646c80d860ee86602ee784395ca40f73a47e04cc0de1bd1e78cb06b6756f52c373ac5e67772eb49721b4d5d159ebc6d8b5645bebb6234259938b1545fe7dce38b6ed8b10ce1551c2c9fa560f1bce1508672d27ce21641deaf5a153c666a9840be91a84742527d231227519b6fbf56be725cc3a5d9bb677c76746f7ea1b2ef49b10faba5c540e54d5607e9e8715e7262e9c77239c8771e28417ca9ddcbb5c3950e0993a6f61c4776eb33782777847bafaa92e14eb1a4d36276a2a82591f25988cce3d1bcc690866439460324e76b0c19c8460364609661cfb4a5310cca628c1641cb86383b92782d91c25988cfd2436987b2198474409661c5fffdb05c16c8912cc38ee7eb03b82d91a25988c8b6ad860ce4430dba2049371b9171bcc5908e6aae82c436474d9d99621de8f50aee644d953a38488572890ae6cd817810d5c3e173881c01dd9917930f5dd0ac63cc8f666c54508e59ae84eb731baea6cd36dc722b46bb98b77b51a1a4e7e60b4420db7c1236ce0867381eb83c01dd591f394f15f81b405427974478e9da72f4d88e3e2845311ce63a284b33c96386f42388f8d12ce71b1c4f921c2791c27cebe1a6799f2241dfb9bd416bd4bd48c65959a6f6c88a14b5e82101e1fa58508ace3e86ccdcf0108e7091ddb59c43def388e55be8c509e189d7e37a363ce56c82f46284f8a4ef7318e5b46ac43284fe65e4ce0bc180d4abafbc1e3bd09d9e0f5e682978fe0ade3843752a4ae296a425fa80eb2928875e9d63a2ecc1f20cca77062862f18786d3e1af7fcda15813c353af526e3283a5bbd791542795a7487dd188b3bdbb0dbd108ede99c680be5013c0c9f1589efd6cc0508d7191d39d896eaa2c7716dc65608e5991d8b32ee2efa1e08e5591dd9d44c5575e132e16ef8c486f2352e940f20946773a2b4bd0c60dfad353939c13aaace3641712b427a4e94c62d599714b08d5b5e8f709e1b259ce5b1c4f91ec2791e274e77ff2db75be9f4cffdbc01c458e8d9de006a4058cf8f522e651d1a66cba5e7209c17440967792c71be82705ec8ddeb7137758c6fafa71bc2751127ae61be9d2230038f16b1d6926c9fab791481bdb823fb40f1ffd6d46484f292e84c9ec5716dfa2a84f2524e94db182e117e7b37e8583b2368b6b1f6b711e8cb384143050e0fbbdfb6ad14717da5b42742b63e3a13bb8c431d6ca34617209497476782228edbd71f8f505e119d61e138be995b8a505e199d61e13816f05108e5559c287b699463e57fb8b536572bdbd872e10c84eeea68ad6c8be33e99fb229cd7440927eb4a60369cd508e7b5b928d8653f9982bd1d42775d9406d258f7d1601b48bb1ae1dc10259ce5b1c4f90ec2793d27ceed2cce4fea421798756c903ff0370cbcad5222a7a94fd28059cef64e3918e6d8890b7631827d432e6ad1f29f4c2d3a17a1bb91135db077c4c7c572b8ad16c1bc294a30e3b815c44a04f3e6e88c0f31ce8cb3751f9f44286fe144196ed525e3fc23dbaacb9310da5b39d18eb0a00525da14bc46b1b76ad79b3dfb48717c93b713027c5b7406e4e2b8bbdb3608e5ed9c286168bf4e4304271ef6c19c9b78f7227ee0062070774469d08375dd1b5b91ae42383772bbeb663e9ca3e61fdb629a13fb237477462b27c6f17320fb219c77450967792c71d6209c7777a4cb1e7fb7e70584f21eeeb61a2435aaad74e0a1056ae13f8c08312e2b605bae3a0881bb373add46467f91addb782742795f74961530a2645b56702642793f27ca6291ba10ab5a750fab140be8d738e27e6aebdc3622bc0f4477808371ff0db6018e1310da07a3d3ff8ee316a2e310ca8738516e29e8d598152a3736a6e1cd91c334850beeeb08eec3519abf64ed19b1cd5f9e8e703e12259cac3d23369cb7209c8f46a9a3c9ba5881ad777428c2f91827cede82da41b851df12bf66280fc17b9c13de60915c7304c36e870b3c0c3c47b8a381b5a2260199b1cbc906740704f4094ea0fd33d495a9053b7e6df85908e4935101194767683502f954544032f67ed8403e8d403e1d15908c0e101bc8eb10c867a20292f1ab526c209f45209f8d0a48c621393690cf2090cf450524a333ce06f22504f2f9a88064fc2e241bc8e710c817a2029271a08d0de49b08e48b5101c9f8052936906f20902f75ec645adc37c97b18a17c393af3928c4e39dbbce42508e52b9c28611b16988cc0bb14cc163012d496728e0de13a2e847508e1abd199da65cc8d6c53bb672094af71a21c29b2b59b751c77d8380c617e3d3af390717cb3620442b9a9230b7fea26a38cb9926d93d1bb10ca373851b66f9351c6dcc9b6c9e8ed08e99bb95c2ad32c6f6d55407fca4b65ee4178dfe2c4dbfe5d3219732ddbb2c33684f5ed28cd978fe51ce5649b2f5f8f70be13259ce5b1c4f91ac2f92e274e588656a59cf93af57e79b2318a5f43d417417b2f173565e6b61dcc98251f72e7cc196b4ab62d48ef4058dfe7c4ea7ca762ad80f77ee2bb636b7784eb036e5ce697a6d870f5e4c2d505e1fa901317080049c9f726a60bf8c05183982d9c5d82e7aa1ab0450985ad6de3d76c0c46303fe28409bb5a4233b15cad118af306cb8508d9c79cc87aa996b64d3dde98e8b3c4b9bddd1ca1fb84135db845fc8c338b6c8bf84f43683f8dcee019234ab6fef31884f267b9e899f85fc91bc7f71cf741383f8b12cef258e25c8e70fe9c13e728b20e754676c6e96dc79a5545e03451ad29e33c492f73ba945223cf54f30ea9b1f99c6b11f45fe47a10f8a7f9d1994684f497dc6efc121531f4a96bf583f304fd35d3f8b9f14310cccf3b7230ad523359209a13a3936c383771e17c10e1fc22177e6a9bf441ebe4add4a8d00cfd40ce3efdc1f6a5dda108edaff88bbdff8f72c6d1533d18c1fc759460c67133fb4310cc2fa304338e1b91ed8f60fe264a3019e776d8601e8860fe364a30e3b84a733e82f9bb28c1645c19c706730182f9559460c671ddc66c04f3eb28c18ce30ab87908e6efa30493f1250136984b10cc6fa204338e7bc42c4330bfe584b9b5485d9ee5ec68e0acc5ac5080dbd42048a605318c7529db80c81508f21f72311de2ef5d0cc64e26dbbb18f721947fec4894a9831f8c28d95e24381fa1fc8e13e50e16947ec6ee9d11d026f4d734d1a22a09e6aff67ec185fc7984fc4fd19d7266ec96b24d399f82d0fe997b21043cec7e113567cb6ed87c807e08dd5f38d141e2af4e14e69cbcd1c696df3a23687f8dd244f2584ea79e6d227929c2f9b78e9c334a5fcf1e478ff36484f3ef51c2c93a18c286f34684f31f51c2c9fadd2a369cef239cff8c56ddc9e8fab0d59d07219cdf73e274b79fa006445251b28164db7e625704f25f510119c7fde0462390ff8e0ac838ee07370781fc4f5440c6713fb80a04f287a8808ce336669508e47f7331faeed71562ecf5b03942c72198ff8b124cc6a90c36982722983f4609661c5df4c3114cf82662646032fa956c30eb11ccbc28c18ce3d6f64d0866a728c164f42fd9601e8160768e124c46d7880d662b82d9254a30e3b885c49108667e9460324ef5b2c13c0ac1ec1a25988c4bb3d9601e83601670c284b9ab46751976e0a88ff5cbd69b2168859cd082edec1ac7d5ecaf2294451d8b12af26626c64d85613dd8b5076eb4894a9ab891851b2ad263a17a1ec1e1d948ca3426c282f47287b70a20cb74a887158836dd5463342db3317b9d4dfdae138be6d3112a1ecc5897298305f4bf59f4719478bd8f2e84404b67754c1c6b1f00f436037e3046b7e0f15160bb6a82df4da12efa47bb9528c70d95ca90b11dc3ed1a959e3f8824b1942d9971365f0b570719c64bb06e1dc3c4a38595fbf62c3f9aec259906f089f9e26dc19aea8d7ae789d2eae63c40c014bfc6b14d9e5f278b66a7cdac45299bf0e963fc1d2e010f9633b9fa7bea53a4dac11cdea2cc8ab56b21be455d04c1634f061fa4196e8a9b34489c71ae512eb9695252a1ef36c85c06f3495a85501cd82dee4c5bcdfd94bb44d1e352736272c21b72d2cc9eba1746824ae16eae7aad2ceb68ad4fd4a4bd4f2762f4d1d2d5a4572017ca53cbf4691284890489eebade4d5ab5d7ac18d00fb1c49ee3d9099f2f2fae8fc03dacc512d25685ba5c2cac49b62a5dbc8dbf226c85f8eab3226e1a48cd12f9134e823f77c6699907bbca5f5872c9267af35eab396ef3359e41455787e85a6d9aace66b234b37d7419eae1912aa550c5fca4ed1f00e9ae935d65d381aa7a582853de110e7be0b4e8ec0cfff2ff1ff1ba3f0056f70100 serializedProgramBytesString: - serializedSignature: 868a87172d55da5d67473c92e374b55fbbd91a628aa68eda7bce90555090cb463678d16d3ce011b920ac13d951814cdf1a2f371655ff4a9b0207170cb0168c04 + serializedSignature: f90434fb50c4cbb1fc1a1624873e8e71174caf0b8c9df8f7e50102a2b95a6213066fd2b720f27b1f24dd3431ab3273bb64c4662be9ccbe5afd7ec16a4cce220e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset b/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset index 740ea34..cf6e555 100644 --- a/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset +++ b/Assets/SerializedUdonPrograms/6477aafbd3dd3c44b93da0cee7ff6506.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d897f1cb775c64a5c91b4ee9bba0fcb126549dc25a95bb2245ea2288912cd43b62cd9d24a3c448914699292a5b449ecc6b95c37e9e11caddbdaad7ba6e9edd64d4f276d9236b17b26ad73b649fc0fe42f68f1de60b86f3178bb33bb83e50c6bf2c7050733f301ef7b0f0f0f180c764e4ac89fc46ef97141748b165127fa44bf1813b7e57f2d321d95bfce919bdf2526643a243f33f2dc6eb1b9c09df0b32351233f3be4d1a4989277de11d7653a8ce77bc480fcbf43de3b208f207750fe0dc8ab1215f2a63ed12ace8b736275626501880b78d3a4ca4b805c892af9d92ceecbb3035829282485a756cb8f1e796612cf8dca4abbd75d124fa258a3f2dc7579cf84189198d710b1ea79899840993099afd26af9374ffe75abe3052aad52e7e0ff852a5da4d2c52a5da2d2a52a7d4061f590634897a9fc5e26bf4fcb7f48e55f50c7cb555aa9f21f53c773541dabd4ff54aeb95a9d1ed7cad84ee473f376a86b2f92635a7ead3aff843a5ea1d29d046b3bb9d63d07e9c3eade4b3eeabe92c84bf9dea5302e936369698977d5f12af99774e00a96b147d3fb1e91b5074877abf34f927c7abd5eb7943aff143986b44ee55f51c715cedfdc17d5f16a721da46b481daa54ba56e549d992cfabbc1a95a6c9f569956e5069832afb2a398674a34a1bd5f98c3a5ea7d2f5e43ca47bd575d708376e3ea4f5eafc75adde75e4bc9b0fd7f53bb2cc7d55bb8eb63997d77d242fa9d2fd0a67805ce3e6437a409d1f24c792f38a7e0dc7bdefa0ba7e881c43ba49abf70dedbee5e418ce0f2bb95ecf23c3bcd26448ded0708a9541bfff9076ff21956e16b9beca270715f744e136b846a547d4bd3745d6de213daae51f21f9903ea2cedf22c7906e51e961916bff6e79c799f24e68f9c7493ea4c744ae4f70f19a55fe8886d7a2e537937c489b18bc36953faae19dd4f2db483ea4ad1ade56c203a4ed1a5fed442e484f697c9dd2ce7768e71f2472407a5a3b7f5a3b7f463bdf41f2213dabd56f9b56ff4e4dbe4e2237a4e734fc73daf9f3daf9b3241fd22eadfc2e953eaaf26f93635abf1a91ebff4c369f93974c6084744ab6fe8c181729bc087a4abfa19c7b67e1200ea0e7618f28209a8362a764b8342e010c91541fc66953d2f3371823a9358905a4de2df89991570c23e898b7882f788a80ca8dc8df0112064ecafc768c2221101c9667eaa47286f1aeabb2fbb8247f73512ec862476428392083aa3bb228c0bb2aabedbdb290481032eaf7744b4c27a21d95392ea1e3f278046bd8839f77b1a60358fb0e993785f1f56de9429b657a0f4bf3ca3e21ff3795d9ab2833d7d11cd872f94ef8ecaaa9554a03b54f614cf89e4666422340fdbc31d50c2b52d046122f7834f11e878e934962e7e060d42365899cbc0691c218aedbc3607019bd129aeddbe17bbf0c7af3c9626606d4bd0e25c86af8e5cf35bc51ffe3254793b9a2358a148666eb0b88968f58c0ab4dacf220e4172199ac48434575fa1326fa71f8d35346fa9deb86f1bae00a98873d53ae02129ba63b5cf06c4332b485a988313c3daaaa673ed32b8fda251d1edda5a1a04aa4dfdbb916128153c01c9302aacaad80c21e279f02aaa6e5ca2a007ecc0c56330c16aa03c7e05c138338221bb2ca609fcc7342a3363c3b8cfd2978c50179d5942c69423561ee4a97bf4e9c02bb8375c8cf344ce6ecd19836b33c1f598649143bf5e4b45161d206ce41f596d19ee1dc18a264e4b5c12d1a02e15dba4b3113bd1089aef10857b80a1c8549138538acbe352306ed628ee13194e6cec58667d88ba665ce129ec2e9da541e130ea7668bd5080f7f2a9366352f4135dbaf0c6714f30c469106a3586a602e0dcc2dd3c4aad6c4028998c22a4d168813e5c3336681234816740ee15bdf72df6e75059ac19e0266505a5d3913a83269051bcec00c6b255c6dc01382b9ba2fc0e9d69dbe780f5a9bcdd040b40fc60bac42f5dba906a7f66a93da97943f447762db11917fbc675629447b9b7c4788354c8458a80e1c830f981844bf393a230da71bfb877e44b2192daef1edd6d622e3f579ec3abc3a735a9a6feae1c0e7ad13dee1c5ffca1f4f8f56cdf7680b4ce0e03bd71b9c4d7ab1d721c88f678f7b3bd1557c910b4d56079df20ccc6c1437ae83478dab356e4eb0ad76a3c83731117454b7c8c05e1ad8db64a81468c8a39a8dbc6a1673e09b0de02220f81293def149da64c4bccd49d4c3a894742a64cf030fe9361878e47dfe56b49e034579a052e4e0ec6fa9498bb826e26ec4b4086732f2cc6338ff34157a2ff2a0419789bcbadc86ba3c5c942e4b9786d3e83253a387d00056e47807fb7a8b5fc8b7f8e59c3bd96e70278980ee6485c9107111cd73560dd1efd3ca765c703620ce4b677e53388f99bc4361f77115a877106b01f9d7957af39795df3c7708c3cc01f4428936e1ff99ab7d2960cdd41c6c1e3bb1796c36d6cefdaf5962de906581aec6b069984a4832c39487b18468c9cf35cb9526fbc685531365b1ef1ed12ace48e2729d9233d0a853573549acfb2869bbe892f2b94eea1a3e1fbf85c74fa3e54daa2ec8b9cfc5ce6fc13049eb2f4cdf8d7add4ff45a8eda739a5b65727b10b0ef11de80fddd84c1ede509d85773e07506f037e70403af318143dc06f37bc671aa0e5ec383af318143380b2bf87c0e35600222c050632d5764bdb522d771143618297cf658100ad773e08d06f0cf7f79c78120e01b38f0bdc69abf793c08f8460e7c9f01fcedb7de7a2408f8261338ccd58247f03c0185c3ec6c94a79c4abe9ccd5c39074ce52cc0eb26a5cbc8a0db19906e63589608d15a9052b770d41d3437ca407ad9ca811f32839f0802fe20077ed8dc1602816fe3c08f18c14f04027fc8040e3131acc2d46362af36f3c4c4db4dc8e092611da7a7b7d381e7f3c03b4cc0106cc342c652c7eeb51cf8f110c0771ac053d815bd4fcc6424ef4cd000de204604eef220f7fa36598e13ff75636438204bbd8bd7971abb9f30d98231f28155a6b58963a270446b531a2e127ad8643610c134fb31f6ddbcc9ece2da674ba9ed7337e7565acd0e315008b487036f0b01bcce040ec10eac94b613eca44c2d17e3bc99596292fb8c31dce99e76038b290c30f32d2629ad46cbd42f339c3d250aad6529ad78ae59a73933ee08c18ceb39f0d321803770e06742006fe4c0cf8600be9703ef0c017c9f091cba777899a0d4ee7d3f077e3e04f0032670e808e03586923a828326df86a3bbcb567d5ba9735ff9bd18bcc551b0e3ddc9b372c8c437b0d25d22f061cebe7b42b0ef231c786f08e04739f0be10c01fe1c02f84007e8c037f2c04f0e31cf8e321809fe0c02f8600dec4813f11027833077e2904f0160efc7208e0ad1cf8932180b771e04f85007e9203bf1202783b077e3504f0531c782604f00e0efc5a08e0a739f0eb21809fe1c0fb43003fcb810f8400dec9810f86007e8e031f0a01fc3c077e2304f02e0e7c3804f04739f09b2180779bc0613617d6a47be684611ecd3c02eb9d0e1eafc85f982d9e92a91b52421e0de8e88abf2073c93d5c6d474cb57d85ad2dbf4ec1a93f3c26858053af7776cd53f0fca035a1ab5f82dfed5d6f71a5089420bae9e574336ad24d4bd1ba9954b67507ffeb94778dcb4f787cad6b2bf7550dfd2cbc1b362ccb0922631f27e36d938ca74b96312373c112b36ff566b05c47eac932487c819378cc2471ba68895bf0ffccb4a5f25205a9fd635cedc74db56f656b9f3b0fd52453d0c4fd00de826b7b1c7210291fe7a47cda24659f7027db9d8500cdf214d89b93d78ee58fcb5e1106fb934ac2665cd53995478e5c9d06f73461d8ea458e8709130ffcaa68937dba3dda28b6bc51e16ca530a6264e78cd07a9ff135cfd274df5879198b94ca7c663e8117be4c5d7c4146a35bb534031fd5a18125ee2249c3249f89a66a98d86c530fe96c2388ce42e88f16fcb1c234ed9eec4157da0647a58e5e751d59569d45225ce9535888e2e733aba63d2d1add074945b634763bd12e33ef67e53121d7a874c11bed4af4d17dfcf3cc97176d7c4d949ade5d2683878dba577e73b134e04fe1427e93326498f15d9a3b62b6f5b6a7f1a44b22b9c64f7381dfaa901d5678718c5fd4186d5e63b7ea5f0735d1049af7292de3749dae1d35a3bf1a9db14f68f8e8c9988d86c8693f77d26798fb39aed44896e489feec8dd25657b668665bbc6c9f61326d93a7dcb7616fdb7774ce5573adb725fe7e4fe4993dc2d3e6db8157b62d831290a76dbcfc9f87e938c177d7824af6e0bdde1e78a7c3c84e9b706383e3e60e2e3214de77a1fe346f467315e1942eb0f27ca1de4eaf941533d9b7cc5f167312e9a9411d10de3d83e78045f7cb433c4c9f7ac49be064d3efa2a4231fd3e871544821b9c04cf992418988e71c38cf5eb94342071ee2ecf5034c4ce19299dd99f64f724e2f90863443dccf1f4535ccf59d8929b641dfad127ccec58f42627db874cb26df7ed5d5dbfe29d0f2ab61fb8c5d5f4f952faba427a286f5f37c2c9f8e170b431145a4d47b99a7e249c9a5e0bada6b7b99a7ed454d346dfb1618f1ca74f183c4c697651297f13095821de86ed1946fe5de8b3e06852a4f0ed91f4b42f2efcf21b943f2af9049e7ba7bd69e1e5c01f13fcf6ab83425f3c55ec4e9ca52e78a6d2f95fb0eddd75b45249e46249a6f1559ad926e9c741ab739556e7a4f08d9e5d455a53e15abc404b2bb8852fedd14d757700ce09e765ce84b3373ddc9ec18658109fc60526fc3d08e06e4f19c28ec360544e0733a10257f8a94cce4903ef3f6d939c4a24077662ed57cf93e240cf3b849e176dd2b30ee90113a513b2e392307d42d65d053a821d533c687c290134562635707dc635acfd930b71cf7bddc5d8cfddc3d7b02710af5ff7c2f85a60d46afe33d4366b3d9ea8d6d0fc6a4bb0b96c5060eeccd310147ce2ff797f9d86fefa934042b7dbbda11ff9599b7e6435eaf48a0acf6ecb8bf2058332f0d46b50ca66c9d5399ea4c68f78c5789373c429ff5c94c8ac8f2199e709993f1f25321b6248661721f317a24466630cc97c9490f9924d32570522338e1e730fa1f25336a95c84453bb29f54cf1b6f89ec9a036bd42db4455d05a1eed3e5b0c2eb2af499ca3bbd6cd10a2b6d51b98950f99999a532ee0d7a1da1f2b3d1e968ea6349660b21f317a344661ce3c93642e62f4589cc38c6932709992f4789cc38c693ed84cc5f8e12997b6348e62942e6af4489cc7d3124b38390f9ab5122737f0cc93c4dc87c254a641e882199670899af4689cc833124f32c21f3d7a244e6a11892d949c8fc759b642e5564a6d580d2591cd28479e3f87c052eb446e02a5b04ae2104be6693c060d36b716cd8270895bf518e863dc49249ab7fc5e600b2da1699ab0999bf1925322d4e6d5823731521f3b7ca412637e5a6bf026d914c6b53c1cb0899bf6d9bcc5eec5a9cd587d9f576dcb7ab5a2373892d32e711327fa71cdd8fbfc9e03806e9db0895bf6b93caf5869edcdf9b72169bfb295bb4a608ad9fb349eb32adb9cf9e469e2414fe5e391ab9bf18338e8dfc38a1f2f336a95ca8a88482079148171b5e53b1465cd216718210f7fb33d9d1c43f9a9c4fa8fc83725039222f1a512f5fccae07b8ad84ca3fb449653552e94ade8515b81b43c2aa09617f544edbd35fe68bbfed35112affd82695cea263d8b0f89e3c1cb119c2acb045562521eb4fca61777e97f4c5cfee1a09957f6a93cab55a13ee9fde0771b635e5dd84d2d76d52ea0efdd2f8e9a4d9411e6cd030a87d479d1b437ade838a01ad3584d63fb349eb4643a3cf7da79ddfa6ddeaf4ee4e5bd41e22d4fe79392cb6f06445afc8dd58cca223986f8bd6ed84d637cae15be928a7f05e241629b5f6806c01a1f42fcad1f3fb9ba18c63cfbf8150f9059b54aef1f4fc4ec734dbfafd3421f42fcb619b7e9712c48fca0642e55f45a799c791caf584cabfb649e572913b63ce6f601bbf9e7c2e21f16fa2d3b4e3b846a89950f9b736a9ac3534edd23696b7d8296db545f71242f7dfd9a47bafc1726dec766b550dbb6da9e161a286376daa618b410dce881f2cfab6388d4f2ec767dd63903984e02f46276288e36b045b08955fb249e562a412a6529e412a33c2ddcfa25ff9616be4adb545de0384bcbfb749de4a913baa1ad6ecb04c0d7aa32d22f71122ffc1b6c72c66bf95dc6e297e5dd24a42f0976d12fc80709e38394f39b33350f19b7daa22947da51c9d8cbf61401c3b992384caafdaa47297a1bf0ee31ba22cfad46db6485f4a48ff47fb3dbb69bdd26d758935f2aced949020e4fd934df2cc2fb7348bb8bfdcb29610f8359b04baa111e73dcbf43686b5d0a89610f9f5a81019c718730721f2ada81069f159923522f71322dfb64964b0c0288e3b22ec2554fe7339a8e42732e8de4616fda4b51e7b33a1f25f6696cab85be54642e5bfdaa4d25d7ce34e6b4c0ad8e4734c4ce1d72c7abfc621fe8f8deb09b5ff161d2b8de336130f122affbd1c54ba569affab7de26895c70895ff119d1e3d8e56f908a1f21b36a96c345069e38b372dda73932d25ec244af86674bc6c1c7746da4aa8fc4f9b54ae2c4065dcc7f18b0891ff151522e3388e5f48887c272a445a0cf3ad11b99c10f9ada81019c70991c584c86fdb24b2d0b652b3618f8f870899df891299163b1d6b64ee22647e374a645a6ce6d6c83c40c8fc9e4d32838d92e218551e25547edf2695fa0c53f611db6c7d69a68e50fbdfe5a0961f80e67b73ce22b5d6de9c3b48a8fd1f9bd46e50d43af3a093b39ed81584d81fd824567f2f7902b39d2e69764de91d16b3e60bdfd2f0b5153f04b3a85066511be0fd93da44a1af44a9f5bdff536d111bc339dfd4b654f10e2b0e3bf14e586294c134fbad6da9cdf2b2043c5f0df2e59bf93181f5fc683f026a13e61637129abd84f1357126490bcbc7dbde823c5a49c152d1592dffbba077a57634d3d5f885827d22fb1585e7e5c54ea3829fe4ff0145910e59a8d70000 serializedProgramBytesString: - serializedSignature: e1ac7c25fffcab96352d7efc75f48ba811cc35128d4c4a32a022ec962381565906ef49ddb4ed7203b03b4ad8c16844a514cfa6ac256b69baecb7ce365ec04c0d + serializedSignature: 2fc4f556db70dadce2b9c7d3427d8a117fc62073b0b02e3a607dce4f6e4deab489806f581b7f82874f83224c99e17f3f269dea6e1caa108cfa289306c546bd0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset b/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset index 3523437..aee56de 100644 --- a/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset +++ b/Assets/SerializedUdonPrograms/6563634f1ad07a544ae7bdd00ef6b840.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aecbd07941545f33edc73c312054410148405c969113080a86441499211949c94244b3422a88011c36b445c141504140594a492c18459415051413163c6fc4dcf74dd5b53db3577667b90df77ce5f0f0c9d9e7abababa3a4c4fdf588eb0ffb3ead97ff512dd446bd140f41443c53831d6fe576bfb39c6fedf0d417c5731c17e8eb0ff1e64a7d513d9194acaff6a5ae5edbf3bd8a15c31d12e39490cb19fa39cf4ee6298fdef0e76d9617648c60eb7ff0cb3735909bb504fd14674119d4539ab6c06885e4ea15c1567c97a5985edbf5b896976ea3087941492e32495b3ffea6ea7e43a69636cd290af9fb8c8a9d6183b6d885d6682186d630e76100bf7f95138ff10eee35af59ca19ed3ed3f45d4bfe3eadf85d5bf717e192f6bd7df27ef4c941730afb3ff24ed3f8755f87a375cfc6715bec10d5b6508465184314b3d67abe71cf5bcd1fe9365177f28007fbfb49bd4f316f5bc59e5b5797d3c5ac595729fb17395cc3c14b6f5628d74f3c7fe52f96f55cfdbd5f336549f3bd4736e5ace3ed0eb9dea79b7c21fa4e42d4061f91cace21f4661f91ca2e21f416189f7bfb4acefb7a8b8bb50dd8a086f3dcf27f53cdfad670ccade43f20f55f917a2b07c0e53f18faafcf7a278f91caed21f43615d1b60dddea79ef76b740bf6a3d3ed0425eb71157e403d47aaf845282c9ff3d4f34195be98a4cfc9903e03e5d3a5cfcf90fe5086f4bc0ce90b503e5dfac319d21fc990be90a93fe875948a7f4285950dc4daa3f61ae5d5b59326cb2c21e9a0eb13f4e9b10e08f34415775e3acef937e600f6bd14856dfb4e3647722846076fbb3a693a2e1d11970a2aae13c2e944b874265c3a2b2e3b08178cd1d16b434e9a8e4b17c4a5a28aeb8a70ba122e17102e17b85cb27a102e18a38bf0d8ab93a6e3d20d713949c5754738dd09971e844b0fc5651fe18231ba219b85341d979e884b2515d70be1f4225c7a132ebd5d2e85a6123bcd43e565fe65481eea93a974caab0fe25559c5f545bcfa125e17125e17babc0a976278f525bcfa088f2f48a5535efd10af6c15d71ff1ea4f785d44785da4782d6278f527bcfa098f0f4aa52f21722e16f97dc9429486cb805fba44c53f49b00620ac4b84d72f0d2058900e7ea906930e63404d261dc6805a4c3a8c01b59974a53f51874957f626ea32e93006d463d2610ca8cfa4c318d080a4cbf1dc1e7bc7830f7bdc0db78639c72237dcfd55155eec867bb757e127dc70ae50e156aefd141ba8c2d728794fa9f619a1c2cb5158e69ba9e29f266d3d12b5b5e21c1b85e2ae51cfd6283fe441f831b0a56754fed22a7ea08a5f81c292bfea0f62a937bf582652f3954ff6aab832aacc1b2a7cac7a96403cfde6b560dfe00b9e4acb68714680f2cbddbcc5be41ba94cf6201e51755cfa733e4f7c328a69ecf18601477f5784c799fbc33515e90b3c2adbf934f86a7abb6bc349dc7f9b7e5e2e339642a3ea9e25792f82c26be10135fd81b9ff24ba31197d1de32b131aacc2a14b679962c4330c6aa7ccf22ce180fd2979072e354fc73a84eb8dc38a6dc7852ae1029379e29771929579894bbcc5b0ee2c1473b6199bedaade331d0cf56bae1922d02d8925f9ad25f2c5778fb7eae7ac2fa630d0acbf658a8e4bfa37054fd621309cec40c38877d38ae11de75f72aa2db49c45626b998a55ab8e54ac13c27a1d227abfc6bbd784e3cc65be7c53b16fc3fac6f6f15def5e15ac20bd29790f439482e4e8736b85f78d7a36aad18fb1f236f0649a7f2609c7e8ea4aff3e68b3da0d2d793f0f33e6d730ca9f31455e60514b675571ac6014e77eb33e80ed2a3d21de071ba83744e77cf7bf315487750d77922edb713c4262f57382fa2bc102f9fb385d7f667bb1865c0e693046faaf0ce55a712dc0749fa83ea391f71045d3f948e8bcd4771f2799bc2d980c292573de1f1b7295e5712b957125e600f1b5118fb1b90b789c88335a246ff809df2b1f384c7c796deafd25f08a74bb121bfaec44614b7593d37a13818b7a6a1386c036aeed36ca04a037bb802b5c134621b57109b85fdaf80baf7d403c62d5c8fad9a7ac0387a95a61e57fbd4e31a548fab507e48c3f5d8a69e8508fe74528fe99a7a6c0f580f18d7afd5d463864f3d66a27a5c8bf2431aae07ac2f0a13fceb483dae33a807cc33aed7d4e3069f7acc42f5b81ee587345c8fd5c2eb8b56a0b0dd07cb1d26f960cf6f2d0ae37e0838ebbc38e53730ed0e7be9cb98f49b883ed59e79ec66c2e366c2e31695bed9cb3fdf18b511f18072387d8bb77cca57ad4061bb7e2764937c7309bfb92a7d06c15947700e3276753bd1134dbf83e849edf5c7ee243c609f1ff47417a3274887b17523e201e5703ae8898e81770bef187837c1bf47a4fdb6ae3ca4c31eef4b4cbe7b899c7b899cfb483d611efab248f715d8df7f45a4fad68930572fe8dcfc3585bd80d8cd02f5cc13de39759e5bb70a2d5cf915c62b9c9d2afd6182f370069cbb7c38be2ebc7373d813813ef288f0ce4f1e51987bdd7215613d0773f3855e5b03bcd84282b7ce8b775243951fe6976b8577bef706e105e94b48fa1c2417a7431bac13def925f058cfc89b41d2a93c985fee24e96f7af3c59e17def92584c3cccd1f15deb9f9a3aeee2ac15a93d3dd5b197407e951e90ef038dd413aa7bbb7bdf90aa43b58cf823dbf27d2e3a7aa8f781fc5a9be25768954bf3f1bfccbbb4aee63e9fccebf651accaf1f579cb6a2b05dbe32ec7fe938ee564f9897425f5924bc7e1cf6adf768e4ef457500bff6218a8379e9621407729e48d7f5cc3c95f6814a5b82642d46f9210db7d747ea9945f097927ac0be63a67ac03c08d703e6a5cb44fe7a3ce9538fa790ac65283fa4e17a7cac9e8508fe72528fe506f5807929de970439b0cfa8abc70a24eb69941fd2703df6a9676182bf92d403f6f30a520f9897aed2d4e3599f7a3c8764ad42f9210dd7234170570beff84ee7296b84777ca7e5211de6119f78d3c5a71a3d7c96ae4b55584f16741e007ce03dc00b8acf5214b6f39cdcc6070b38802f7f5178c7e71715c6952ee793577a65c73608eff8bc1fc563bc755ebc6ae083608cd92abc3eff008ac7b85b54be6d240cbebb848adfa8e2f35058cabdcb9b4f7ca19e9fabfcdb49fa412287a67fa9e261ed1664dc056e5bbddcaa437b7e45dae6ebb4cdd450ef316adc45b0c1663711ec4d0a7ba0caf70dc1fe368d9d7306830de3ee6682bd5961c3ded87704fbfb34769d9f0936d7ee87bcb2d9f67f2943fb6f23edbfcde55ae368b43ff457d2564e58b74ef95ac9dc2e3cfe29653f3b44daafec4079e5f325e1edbf2fb9b875404692c87845787df82b04f755920ebe0faf715e56cfd788ce5f7365d754fb67b560ee026dff3a69fb1f503ce6f896f0f679083faf6c0bd6c1d0f63b098f9d4a07f09ef047af3e53edb024033f283787a42f21e9f09efc6b6f3ae83455fe0dd2fe507e3e49a7f8b0a7ba9de0433bbc29bcf3ea3789de687df2483ac883f917b4c3dbc416de26b6f28ef0aceb53f80b483ae0ffe4cd177b5778e6e5a1fbe8bb4c3aeda3b45eef917abd47eaf5beb75e293dbfefc5cdd7be3b50fbda765a13fa37e707609e11850ff95e71d825f43e64b748f7dfdd28af7c7e20bc3ee40317b7019c594c12197b89fef612dc0f49fa87ea89e7897bd4f323e1edbb1fb9b2ebfee5caad0767b7a08fee137a1fb28f70fc4c787d0884950f6900eb3bf0211f131e1f2b1dc05e38ec6f64f221941f949b43d2979074f021df7bd341a7a9f29f90f687f2f3493ac5071fb28be0433b7c2abc3ee453a2375a9f3c924e7d08b4c37e620b30ae83ad1c105e1f02f80b483af5212a5f0c7c44417d0897cef910a8d717a45e5f907a1df4d62ba5e7835edc7cedbb1bb5af6da775e14cd17fe143be551ca0eed4877c25d2fdf72b94573e61ec5b85c2366ee316c2eb4340c6b7447fdf12dcef48ba9a6bc6be411cd4dc36067d260f856dd90d5bb8721bc23e2ef4d11f84de87fc4038fe2cbc3e04c2ca8734863339e0430e111e875c1e8d36a87cbf78f5c9fa10ca0fcacd21e94b483af8906fbde9a0d354f91f49fb43f9f9249de2830ff992e0433bfc24bc3ee427a2375a9f3c924e7d08b4c32fc4167e21b6f2abf0fa10c05f40d2a90f019cdf84990ff98d49e77c08d4eb30a9d76152afdfbdf54ae9f9772f6ebef6fd0ab5af5ce7c17b2d131f42f71efe10debd873fdc3c8d37f860fd2abcfee44fe1f5197f2a8cc32eef260dbdb29d6f2864feb55e3cf8b62285b7ce8bd704ce7942fffa9bd8e301148f71ff11defe0fe1207bee9caf85baff2bf29ff950722514f6bf4e5e88974fcbabb7b8c268564d787d2de0c5bd76168f13dc0449577ce231c4b110c1cc2265b208269c1d843e0976f3771a339e4471320ce7075f46619bcb69d9defcf0ee9bcddf15f1c7e5683f85fe087582738acb5018d529d5fe1bbdf8f07d58bc08b1cfdf85c7cfc58b7a6d215e149593cf625efb75c2767d4e1fedcd077e3e5e5ce57f0585e5136c6e25e1770ce1f9aa37dec957c45b06eae0d415fb50a8db1c14c6764ecb270dcb17362b9f6abb8296ff375cf994bc1d19f26fce206f5901cbff63569ef685d0e59386e563def2d00753631ce8478d714dd45ad6688c53be395e52a4fbc10615574ae1ac4061bb6f9e5991e42b293c3ec009233ef163899d6d42f1f25942a5bf46704b10fc57dd7a9fd9dc8b93924370a0bcd848707692f41751ddc39e5587730ea0c7d2c23b4e95563adbe5726f0efb836a6d143fceab3bc073e231de3a2f5ef3f65e1ce75d915f1d405e59d2a6655dbcb3f248be72a44dcb115d1f4f6cec43142f9f65489b02cf79281d8505ecafbc2ebc7a00bcf244afe515ef7bbdf953fce0bbc3d55e9c14ee8984ff1e540ef3a3f9d5d98fb33678ebeda917b641c0c9d43e7e36a6de97c72b200c905751e49f53a9bdbdf849c233a78a5744f1f25989e8b4928b710ef8ef24c1cb16deb94236c1ad42d2aba86755c4f17d1577723ace498738f9acac7036a0b0e4a5ced3a7e630c0ab1a915b8df0aa2ebc7398eaaafc2e226f139197477040ffc9b48e202d65771585c7479f5d0f9595f9de35b0833f549b04f916e84f9257f99d780da4f71aea09dfbae5a1b05dff96d037d55a235e3b7f59f10fb24734cf4ca5ff8bca6ad26516e7afbf9974d5de30a7b0607e5bc787cb2319b8d4f1e762c5837181f9bd40df17a5fc19face473c85da80c4c5e13bc23c14b675df5a7de769c1baa476feb256169289e7f8905e48affb543a9c75f89b4957f2ac24930e737b689b62f9db261fd7473270ade3cf95b64d3eaec50372957324bb5eb7ab7e619570c3b7823dfaf5ad768a2b7ca39987c2b2edb6b858ad77f1585649374ffbec10f2ea1179f55c796d9ab8586ddafb60a973adf1faa86d3aa8b806e938e7df1253c910e49bac387c37ba95e48773ac333572d4b7fcf11c2427c72dd7b630913303a5633990bf1e2fc7f9b79de75cc05467eae30d89de1a2a2c754f453bd873013d3752f9df4061c093f16f12fc5354bc3a7b679522e98d55fadb24be898a57ef65ac63517e4897cf5385674fc6094b1cddbd27e7134e79282c75230887d3503ba9b25669942631de25d8a7e7d7793b380f0476d238cdaddd3e91f653380db0a4cce3845757efb965db27085fa62dcf9d8af2c97435cf48f968f46d06dc5de3dcf753403d02aff8192a7d170a1750afa083943f57f39b40bea129e1d954f1ecaaf438d4070b7c4333c4b9ad8a3b93e09ee9e27610de7c16ccd3cf51f977a3b07c9eade23f40616c13cd44babfdb7c3bc0bc05ead75c78fa4a5cad01ad729af232bebc8bd306ec07daf32c529fb3dcfa9c3f95c86ba169bf13501a6e3f28d35278fab91396cf562a7e0fc9df9ad4a9b57ab6f1e677ca43bce451c1fb8cb755f9f712be27927458ab9cabe2dba9f88f483cdc99f4318987bb5ef691f80edef8783b8403e5209f7c9ec7f0ad48d23ff4a6c7d13d2d4e7bcb7683737fe077ce17a9be7c3edc95318fa401969479124a0bd8e72c75cf87a5ee2189c35d2e9fa0b07c764ecbb3d41ac7ca461c3aabb82a69ce0fa8ef16ac93ddf0431d03f0a9e6e6bd5ebd2bb1aabbe1d9b532974ddd9ba0fc64bc8baacba7286cebb9e34a945fa67fe62d27d0b76cbef2d41aceaa9121bf1f86fa66d9aa6980314561d432c0503ec3aa6d80a1be5f8cc31d3cfb515862d731c056df445a750d30c0e7d42b3886551f6105b0112b4785612e08771c6d4561db26bb40df50f34bab813f7e0a177c453782db4de1c2bbb30ec17061fccc98cfafce3007853a7727dcbabbdcbaaa39a1750aaabbf21d5da7122ca8670f82a5ee654ae507ac0e69fe5623e11d3ffdb8c37c14fc6c4fe1dd57eaa9e4a9ef9f2e803db1a62a1dee565aebc58bf72278ebbc781740fb83fed1bc52dbfe4d885ee08ea8ad282c71e15b85165e3e16cc4d0f049001edd887c8e8e3cae8063a68195e46d0fafab6d9e9a4cde01ea955282c79ce75dbac1bec79409bc13d566bbd784e3cc65b47f0bee1b959a791f6e94774d7cfc5e80efbff2dbcb22d988b7f4ef0a02dfa13bcfe0a0fce0ab4cc80d794a4c37cd9d6cf942067a3d59a559443ed56457181bbaf56a0b07cc2bd5c6b50d8e6dca3962bb7c7408203f75ead4561dcce80b795e0c13efa1d1a8eba3a81bc81441ef019a4e29f20f20769ea3e98600c42f1f23984d8e6109773ef7a0407ca0d15defd60b5f6890f43b261be333c1de7a4439c7cc21d551b50d896db13f63aaa7ae57aee55b4dba677429f2f3e5278f6e5f3f1bf84f0577777c547a9f82f100ed6eda5444f97ba7c7bf570f9f4ba19e1c827dcafb3d68b171f4df0d611bc90f54fc903fc31defa89415e9c54fa12823f078565bada63ef11e45b63e87be8bd8350f38138dc7bb40285a57dad27f9e09ea3b5288cf50f382fa0b07c8e4532d5581b9f4064aa3b81fa3424f97289cc5c2273029139413d2f4332c1674f2232d51d3f7d16927ce4aea0f8642273129139493d27229930864f2532a7ba32fb9627f9a61199d388cca944a69abbc4a7a4653a7a964fb8db630d0a4b9960d797f9e4934f74bf88f36f597611aa23c4e3b257a8e7e5a8ece5aaec7ec415e2715995ef427897043e18dbaaceb6d5f816477b5bcebf25561fc2f72a2253e5eb0f363c07d980cc7790c4c3fecab3241ef687be24f1b05f43cee909d87ff99ac49f4de29b7adb5f9c2e3c3ec1e183d3cf20e9301f817b3bf2105f193f07e96c96ab8b7eaf92b2b0d67d9bc45f2bbcfb36d7a078f99cadd2e55cc7f64ffdf692f86f11076ce3900edf9835f7a63bfb3d32fd7ba44bac03b8cbe273a453bf74d843c7fd16f2e23b71a12d609f632dca03f1f209f7e2c2390f586f7521e53aa378f9ec4acac17ae40252ae93b75caa7d56a3309493e1ab49baba5b47c07ae83912df9389efc5c4f766e2fb30f17d99f80b49fc58d71e07c2fe0dd8c78d22ffd805b6b816e5c1b608f6bf0a8531760e2947ee8d89ab7b63e2378bfc73a75bd271f19b519c7cc23d301b50d8967bf13ee1f4898142613524f26f23f26f534fb817260f856dbc01b3ddb075a6d7b6527833880da8b580d51c715732acb3446a3e2fdd23e6699dcde0cf145a9b4fa593fb67e2aacf592d907c75378cd5322dfff22bbd38a9b9cf8d489e9def62358e3a639aad8fa1f06da9ce66604e51409b49619f42ca913b74e2f03e21229b1954c6adeb5058633521f243dacc2035afb3d4bebae84af00c6d26c593eae92ec2537da71b87bb86e0ec7d23c6c65e44616c137097107c47dc989427770939f9e5f35e549f7b5ddd0c5e8e38c9e775c456ee46f1500edb8a5a47c6ef41d8f7b8d8438a136cc0e27c0edc61944770603c6ccdb4dff5a4fda83cda27af17c1fb246a5f478f92cf4ad2eed0f7ee4378c0e106a2cffb50bc7cc25d8eab503891c6b6e07d07ad33dcbd48eb0cf8f04e7119ca4feb0c7ad5f821eb1cc5238fe800ee7e9a83c2c83f0dd9e1e5c9f9b1816a2ee1cc456c3923c8dcc7e3c7609d52403f96c26e4aca917b20e370ee2e223f364ced7f8e80bdbf66447e483f365cf5414bbd8385f958547e0c785aed187c3af6517dce27f551df5aa5fafb2184436df126de1633d9d230d02fac2da7133b99aed2617f711189efcfc45fc4c45fccc40f60e2079278755fec28b8b75367f3509702da7c0afb5452ee21d2460f456bf323df70db64949a6f5ae7323cf2080f156fb54732f3541cbca7b071af591acc2646c299206edeacf427602ff249927f06c90fdf1dc2dee422927f26c90f63f650263f1d6755df16c398fcd793fc6a0c13c399fc74dc51e38d803d4e58a7fbad351e107adb7bc0dff6c62f2538ffd15ae3d28e6edb8f075dd2b93bdc0908feab078a97cf052a7d23e1f208e2b200c559c8576f4261c9459dff1f5d8a945ba8f2ff80c2b81d006fab176f742d52b74ceb8edb89dc47553adc5f3198948774b59f629dc7c821f38a7c3a7e8ce8b8278a974fb8036e23c293f2f0590ff5fb4f562764174354da2291f205ef2d4471d887c0d98ec52adc99a9cbe20c757982d4a5178a97cf25a42e8b357559a2a90bbc9f58aaa9cbd20c75e9c2d4655986ba3c49ead21bc5cbe753a42ecb3475794a53177887b25c5397e519ead295a9cbd319eaf20ca94b1f142f9f2b485d9ed6d46585a62ec355da4a4d5d5666a8cb054c5d5665a8cbb3a42e7d51bc7c3e47eaa27cad857e5329aef691ac1ea82eeaf74fe2abd375797f118ac375817311df7be3b9b1f512f0417eef5f600f117c28dc2bb714856dbf26b73124e665d92aff3901cbb5e13958f05b4eb01ff89397531ceee85ceb95195fef8d8faf43f1f2097782927b52e2cfa3b6781ee5954fb8bf6e150adbfc27ec279ca0dc06afbd3861f9843be7f25058e2c099b773080ee43f40f2af67e46e2472c1def03ddb57a33899f717b7eda02e8095b21bb88354d9cd651b02d84d0bd2fe9b49fb6f76eb91abee75cb9ded2d17df42da16eab995b4ed16148fe5acf2ca99f80dc1d94e70b623f9321ede67806dbc84f407183b08c64b285e3eb7112edb182e50ee65d276f0ad38dc839687c212670b8343ee458bc3b7d370071adc6dd0829483f4cfbdf1293b78c96b07b9f0feb625696ba8f752e1a9f72475de71d2446f39da16ac7eb78b40fa9dbc8be0ec24383b91fca06dfdbad0b7f5eba48d56a1b08e4ba6b626f7d4c5d53d75939733385c5bc3fd6cd0d62d4939480fd8d693601fab971b9e12e07c594a9f6f6af409f7b9ad4579205e3ee13eb755286ccb9ca26ccaeaed2da73bd30369a93ac1dd73aa4e53ca07a84353842f31e09eb865282c9f70bf5b1e0adb7ca7aaf3ec53ebf9c8a2dfeac0dd6d5b515862c178dd8270823be20e2859b01669e9934f5737b86f6b190ae372bf31e53e20e5e05b01b81fea100acbe71ea2ab3d6efda6e17798181fbe3186b9d585285e3ee10eb78d282cf36d27f25ef6cabb7c2023ef23469e3a6f1fffd82b2f95fe49dace1d9d4919d0eed0b6fbd2767ab96ac7543fd987caef46b2204dca0c72ce1dfafa6744cfeaec771cee4f5b83c292eb1697d715c509ce7e95ff300acbe701827fc01fff0a98ebc139c873d2f5d5ceff40fee7443ef82cb8d7ec511496e5601d715078d7f407158fa5aa9efb493998b37f49ca7de996bbb2a1b79ca5dadd52ed68c16f77da7966c2dc12f64833d435c5a1bf0a7f45387ca538289bb72e22b22f4ecbbeee5008d9c93466a07691f9573269d806d5198738dcb59687c2763dae52babcca6ffeaf302c751632fe8dc2da8dc2f2f92de2abf682ace6284d96d9423007aaf4ef08a63ac311ff1e61f62498df33988354fa218209feef0784d98b60fec060c2fece8f0453edffc47f4298bd09e64f0c26ecc1fc4c3095cdc67f41987d08e62f0c26ec85fc4a30e1bea2df10665f82f91b83097b12870926f881df11e68504f3772fa6afad765065e09eb03c14b66df51af5fee79a433c9635dc8b95b259b8e76b370acbe75f88bbfa0d5e6b443ace52df5e39bf775f04959171a344dacf80afbe84c807fbfe9bc887fbabfe41f2fb0794ff8f8ffc4b897ce80bff12f9ea5b7e397d4cc9bf28987ca70c277f3491affa4dc2f2ca77c2f289ef0bbb38a0fc988ffc3144beea63893891afec259140f20704949ff0913f96c857fd319124f293ea9985e40f0c283f8b97efdbbf46a9f27007daef286cd769a6cff7ef50d6526772138515c61f282c31a62b3e792aff78527e942af718e1544478f696ac11a8de387d71e67aa6c61ee8cf70970df8a09e24fd3292de8ba44f20e9bd497a2e49ef43d22792f4be247d1249bfd09b2eb68bc03e345577e84b5cdd2f66b07b91f29385beee903e45e8eb0ee95cdd219dab3ba41f2782d7bd9c6b8337245c1bbcc16f5da9e6fa89a222ddffaaa838b8536f2dca03f1f2097764ac42615be66ce883554939b84fec4514c61c4a10bc12aa1eeabeae5915093fc085fbb896a1b07c927bc712a5889c355e39b3d4fd17b3f633724a1339ea3bfc04dc4b06e7ae069172c79172c77aeb9f4a5fc2c82d43ca972172fff4e687b55d02df9928edc06fcd0fb673b26ac3166e99d93d7cca40bb9545b6a3de5324e05eafb5280fc4cb27dc0bb60a856db9b7ec2738500eeeed22ef3b52e970af1679079b50dfae27a0ff6f4478f27912e2aed66d894ae9b8c449284e3ee15ea60d286cf39e33ded5d79c8504ab32c23a01c561ac4d282c9fe87e2ee7df125f9d7fb8b130c1ca56183fa0306e1b38ebbdd58b7763b68b770becdbc3fc04f45985d85c792217d2d5dd0516dc7b40dba52a69979e285e3e4ff6b60bbc8f4d95af26bc3e43f1b0a6211d9dace2d037134e391907df60d8757d17ce215dc970ad4eb8f642f1f25983701d4acad70cc0b586866b4d1fae57315c6b11aebd51bc7cd6265c8791f2750270adade15ac787ebd50cd7ba846b1f142f9ff508d7e1a47cfd005ceb69b8d6f7e17a0dc3b501e1da17c5cb670ee13a8294877b65fe225ca7235ecab759d7a238757edd42bf8ffbee5e2f76caaf97151ebf3e1bbedff39bf3c2de0b9c51bd2e2de713f86e15c64772574d42dd5573abfafeef56159ffabe685cba1ed60d5eaed6acb49cfba6fbf084fbb3d47bb704dc9db41b85e513be6bfe0085b1bf83bb90d6a1b0cd7deecf24bf3a4398803b91fe466194df9ae32d97803b77fe71f927e0db609d2ec8fbee7cba482239eacc127c63ec97572b8bb4a1a5ce3425e07ba7dd282c9f6720db3b43d519d63dd0ee4dd31ce6f6277a6e8aca370dc079667ece29aeeaf7c813cd0857f8366b3caae76ddef6f395e9d71fd4ef2059703edbaf3f90bb8b12eaeea2dbdff1e64be547e7622df8a66187378fa5ce5527e07bb5dd282c9f67a5311267f9f3b87336c3e39c103c5a121e2dd5b305e2d14295b9cb8b958a57df03245a132c75be3ed10a61c13713f8ce43cabf4d08feed88cc76ead916c954e79badbb097f88bf4785db132cd52f12709fd107282cb9a03b1aad7b5d1b82f791d67d6e18eebfb0ee77c341eee3116a0f27d101e908e6cfe7a5e39c7fdbf8b259527d8ccba3e64529ff87b0136aaf06ee894dc059a4ad282c3160fe047eed01c44f539f142ef8d28e04b7a3c27da780b8ca67263a11dc4e2eeeffea79f305c6cd53e1ce04b7b3c285f79ff343e282eebb105c7547d2dde0bf60cf08da03be6ffc1785657e38a7fe48001eb6edddfd2ac1073e17107c753fcedd703e624101f1d559f0443782afeec949e57f38981ea15d02eb1bc62c72174e42dd85735f7f97f77d30c6a96fb5ef69a3e2e12e16584bf64472619dd72b1d97e889e2e4537d272ab72b5361890f6b2ff51db995e7cd9f5a1b43febf42d831e60debca3e1ade7d11ef3e284e3e7b13deea5e9b7bc11e286ff88e751dc90fefe71e0ac91bd69a176a78f74bc7252e4471f2d99ff056f7b3a47003fa97d4f7d219f8de13605fc582be03363e4b71836f411e436199ae998f588fb8e1c7d51e80a5f61a1217237e63083e7c3bb215856d5ddc0ff7228e45187ef9a16fe8f6c46721d945bc7802dd59613d2a028f7dd622376feade69789f0467b81f13defd201d961ffe12065f9dc1b6161be22ff5e25bd94a2f03515b5d82e2e4739057a61396cfc148875554dc10a4ebc1284e3e870aaffd0f75db705e73bd5c0713ed3f5acb42b4d372468feafc776218a913ec430c477552e7bf13e87d4f62388a93cf91a44e23dd3a3d584a2fd722bf2f6e3d1da24e2b49dbc1fef1284ddb8d524f72d74e02d2f1fddde0bb703f198de2e413eecad980c2763de7c377472389dcb1c2bb37a2fa736acc2377efa4f0063278a3bc78bef5b475f4e0786f7d2df81df582f419386faecea827d05a31310eb585f28b0fd64332e5739581ecd521ec638dd73e52775da0bb72acb56e9e4530f6c19a1ddd0963ad73f3ec6ea1c2301f9884ea31099543ef32ace751bc0ccf4bebe54e25d352df5325d0fa19de0de5c13b76750f8e1885f2ca27bc0b5c86c232ff8b69394fc3efcea877060bb2559e0d042b17b5636ee6764c4c403ada88e264189f1b57bab136a7b116c37b377576ec3958776d75c3dbe1bde03637bc13eead5173be056a4cb5d4593d0bd69b9abb9dad97549a9a4f38bfbbadf248953879d4193f4bcd71ad57d2791e6eef3e17c059d6d7bc78d64e9417e6c87eebc55cc207dec7aabd4c4bdd436ec11955f88d14f51d4696154206f81778aff9020adb7a7cf8661ecb82fbcd5f413c543d17ec0fc181abe7dba49e70be1abe3779c840c666151e43f4a0dedf66c550d8d6c323c009ee66e7ec80d3d5bbc23b16a9fbcc7d7d86f20989c922b31f51f79b5bbb4859789ffd180acb7cba79e96e6f595f5f3455e4f3450b0faa3c6a5f25e58bd43ba504dce9b50c8533f8a247e15cf61e8285fc6f02f8faf922f43ec1da8be2c2f8a20f85d7177d24bcbee863a1f5458fc1bed36455a777dc7c8fa9f59cb54f3dfd7cd427c48e753eead30cb62965c2372297113c1827c0ce3ff3e6b3547f4ec01d69ab5058d671bd172fd53e52a6f257e2019286db2eac8f84bd45b8c72c0f856d3e8f93bdd4d4b929f8e66b370acba7ba3b2a2b8ec2b2dc4215afce603c0e73847928bd807395541da6933a4c77ebb068bc375f2affb56999d6e742bf9faace30246692faaafdfbc48c344602f6210ea4db6011ec89dd41d20a524f355f16f85e3198474dd6c44dd1c4217f631d14daf5b340ef11e12e7c81fabd2f47b51792b80e617c29bc733fb5e79ab81ee9ee7ab7ad1643bfd984e2719b423e1817ab137ed2cf1ce6b9a7706f10deb33037b8b84f34f7e64be95afad4812a8e7c0f929823bc7b04731416b4fda5245f1ec907e76a371399f2dff09e68729ac792868407ecf7de4878dce8e22f294e78dc487840be863e3c94cf5d02f7d67ca56c077ce4016473127b0de18fc739b0919b088f9b5c19293d43be9bdd7c59491496cf5b54f93d24bfbab7202b0b85e5f3366ffec42d281eec44962b44f0e67ae5a7e26f2772e6a278990f7c3c8c153037ba03e942bd2b4cc05d556b511e88974f78c7b40a85b1aece22e5e0eeaa03286ce75f56d86db765a5dce7d367101e501ede092d4361f924774725d4dd51cb062adc915edc5439b8bf08ee7c041dde4fdaf63e142f9f700fd65614b6e53d599ee0c31d1aef10fc79a48d1e40f17ef80d897e9a13fdc09d467f1179f3195b79c8cb03ee904ce1e591f6ca533cde40f2904f83fc5985bdf997eff3e687df2a482c20f917b8f99f5a8ef8c927dcddb10785115ee21185530485e513c6f7a2282c9f8faaf862282c9f6abf32ab380a63fda9df115bde1ec5cbe7e384dfe384df22e1e9c34e583e17137e8bd5f309c24fed772696107e4b483b1ee3e565a96f54134b8577fdb754b5cb74559f3ce1d177c672fb0a665fa9fefb3ee92750be048987f22549bcb21bf80d2eb0d7d4d807efa1d57ed15238afa2c6be049c47c05c67a7e312b3509c951e2353fb9a6a8c7c1abeab22be54377ff79d9f40bf5f86785551717077c75a9407e2e513f65057a1b0cd6d15bc43ae4aca2d17debdc8e584c3d304ef6917ef19b557be12be2781f2682f3101ebb115a81ed0b756a27c2b509c7cc23d191b50d896b9027e17e55b6f1d2cf8cecae6b30bd690dff9f0794ec36735caf71c8a93cf67099f67151ff89607de79add1e0ae45b86b501cc24dd991c25d5986e0eaeab04e236b3dcab70ec5c9e7f344d6f34a168c0d605f60177067040ecb27dc61f1050a23bb49c07d2cf45c34e06c20b81b08ee9fdefca93e0c77daa83efc4c806f46527d79a3f0ce0736ba755f759d379f75286d47abc027c3fd16bb5018e7e538f8f16aa3b0b6a0f6dae2727a16dabe1d8ac7dcd53c3cb11995ddaccac21d3ae7a3785c16f2a9bd1bf85dbdc456926fabcab79270d986646e4318d2ae60dd0ab6b81de5ddeec511ea8c4ad6b1997565fda0daa305d2bbc4dc91c6b77e14da3562e225d446e0cf5e4171705e1dee3f588bf240bc7cc23d0bab50d8d6cff3e5090e9483fb17e8b97748877b20e8b977b5b79b80bb2636223cf97c4be4eff36f233dbf85e2e413ee2ad880c236efd56afebb7a1ec17a0761ed4471186b130acbe71ba8cc1b0a7f878b2fdd9d070bee37f8018571dbc07d125bbd786bd4fd07eba1ed5f23b83b543938d70e77fc50bdc31d04f45cbbfa1e3e0177266c24e9bb91ded51a738dd269ca3fed1229dfb106e6f7f3481ae2ee39070dfbb9f81cb4f237da73d070d688d60fee50a067e1e1ec1bdc61b091a47f88eaa7eea35c9b47eab737cd632df88579248dabdf1e4dfd60aea4abdf2f4cfde89d0abd51bc7cd23b1520fd1354bfa96efdd64d27f5db97e6b1ee2e52bf7dc2bf7e1f6beab7cfa77e709f0aad1fdc7940cfdcabbddec46742eb173c5c3ed37079c987cb6f0c97fd844b5f142f9f07182ed3915cb54ec467e653bf4ba73b33ff0a6993578467cc7f6e206917eccb616fa080be7c33b94f29550ef65c97a130f65579282cc704f50ef379f5fddbe62da41c8c0dd497817f5d81c2897479b85f24f0180277cc90f649f973ea330f3372de157a9fa9ca85f1992f80df82f67d2f6d032fc2598979242d8ccf7ccfc7ce7f67ea07f7d5509f02f33dea33211dfb4ce5535e2467611dbf0bf58339d73c9216c6677ee053bf3f98fad17b6f7aa1789dcf8474ec33d598b001fc3ed4efa3348f0df04e621e490be3333ff2a9df9f4cfdf609bdcfdca79e47c267fec570a1febb2f8a3f523e13cec37fe962679546615906be9139a8d28f4361bb4d374d74f1362d25785f113c7547b0f58f0f9e7c7e8178d3f7ed708fcb5614961c0ebb1c36174718905ec49b7733ec712a7f6aa9bb21b2d4ef44507f2b5feda7d2517c02ee81f9158525febd8a33bcaf407b379be12ee339240de3aa71330bbe2dcb30a63dafde5dc72cf58c79f3e73bff006b3b18c7f250d8e6bff5a0371ffc6e35f5f7b138c1c3f7df287fb665a1978b33862a5d6c011b9f47d2008bf4310bce22e03e06ef65347d2c9620fcbe13f9fcd1d636841f3a93b2b50fe1f73a92fb9d86df640dbfd77df825bdfc701f8ea9fdcda07d38d05e20be4b08e6287047d05a9407e2e513ee035a85c2b6deb6d3f729500eee075a86c2f2097700e5a1b08db34d9d23dda66c797b29524edd0d94753c0a439f9461b807e85f144e101c59be9c9767aabde10e25257f5b80bbf86285847e3fe157d47eeafd53befd047cff10b4cb6114a77ef32501f706ad4579205e3ee18ea055286cd77b670f8203e5e0fe1fd84fe84ad2e17e1e3a1704dfff97f08e3b6a2c95264cf71392563a2e29509c2c07f7f06c40619bf70ea5ff97549f8d41f998caff289111473262280ecbd884c2f289ee1a72fe6dcb7a49bdff7a69ba92abde9b24135eb949c52b99149efd8724f4e17908178f4f20477d1fb613be1980ef5a95fe937027cd8b288cec3499e5c575c236eecbf08ebc31c12becc583f61213bce9596a5fe4e5f69a7c32fd046fb9047cdfaceed7ca52dfc6c48ae9ed2a5984d8554f142f9f7057c546925e1cd9959afbbf0c7be5a0936222e5075f015f3f8fa4810cc911612615dfd831698cb7d55e6eac045317b8c784ccf393ea1d5912ee17d948d24b897ce3e22be4fc53b224aa0b9c7f9a47d24006ad4b499fba9464ea02778890397d52eda726e1ce938d24bd8cc83786be0a67a7a02ec7a579bc4ace3fa5d24006adcb713e7581fd615a17fc5dbc4cef83e2e513ee24d988c2446ee2371fb9c73272cb11b97d51bc7c962772d5d8122b2df28de931a4b377d49a00faf84ed8cfa77d1cee36e1fab84acfaa203cbe275f1fafe8c54d8d8d70df1d8ccdf05ecf6f6c5473683a36264f4cd739565668c7c624baff24652f15519cface2b7992f08c8dc98a285e3e2b09cfd8e8846d3dbe3d92e040b9ca5e3d262b130ed94a4f3114b6f15e9fc7e055217855900e643cec4df627e5aa927255098f93090f75e6f58da90c5e352f5e2abd86c8e75bdf80ef1fa00f574fdbe31b03098feae9f2c96a284e72536d0077d9a5b8903b52923509662d52b75a2eaf377b3078b549dd20bdaec8e76bdfac45ea56275db7379b131e75d2e51d191087eb7611e152cfcb25598f60d62775abeff27aab2183d7c08b974a6f28f2f9deb760dc83bae5a4ebf65679c223275d3ed900c5e1ba0d205c4ef172499e42301b91ba3552bc5633788d099ef269c90a84c74052ae0929d784f03895f050f779bcdd82c13b8de0c17d1e7036ae92377f4abf707793f2893b839c3d863924ba7b23561cc5c927dcd7f1320adbfce576a0277f53e19d7fc2ef62cc23382f101cb0b5095ebc989ad36481cf0b528f33513d4aa338f984bb3c5e4661297f07c9df9cd483f6c366a41e807398d403e610ea2eb5acec10f5383b5d0feb7214279ff03bd32fa3b02dffddb924ff39a41ef07b23f308ce0b046783c299e6c5b3e03b8d00f76ba7ead112d5e35a14279f2d483d5ab8f2dfeb43f2b722f5807b3ae6119c17088e9afb397b1708cf52bf77965525443ddaa07a744271f2d99ad4a3b52bfffd6c92bf2da9475b520fc07981e00c55381dbd78f0bb3c59557dea310fe52de2932f880ece453ae881e2e4b31dd1413b97fbae6a243fdc63f2030a631d00ce0b0447cd8f9cdf024278f07b3e5927f3f580f39a4ede82ea408d57c90e8adf0a1496fc0e79f359b09f67fbe1ddb03618a4d2be4779f0be47584eea2c79f23cc249ddabb25bddffb75bade762b0b6506b00edfd42aaad2d74d64acb819cbf4f927b5992ea5e96bd7984abba0f25ab1a0acb6767240fecad4b3a2ed919c5c927dcd7b201856d791f5c2742d503e4c33e7212ee33f91185e5f3020d3f644fc90b509c7c7627fcd4bd1e7baa85e407f2d5efb7c399d3a4da8b88815d92fb3992ea7e8e3deafdc79ea5044ffdee3b9c554df60a88b73fa49da8efc6f6fce5f2d8abd603b113081fb8d72349e2fb7879c64e44f9215d3efb2abedb5058cad77c7f06d8816d7c06b1b9ad286cd7ed6398e72a1be7f6a7a88d655527750ddb07181bfb70b617e348dbd887bb5cfd7e542a1a1bfba87d38fe60631f0d543cd47b875885fffb36165373f8985a5b18f964bfb1e23865abca0fc42a21ee92ef854a07354818d6c2b0f706bf2bbc02856ddc7d2d085e7fc415f6a8d47bcf18ec696c27e90711862efd4b150fefe233d557f2b828cdc3f9b7e43adbd5ef3ed82399eb93176c09f4a5be534a5e4cf405bf93fcbc977312eeae5981c236ee27e309de40037dddc6a487d15759c56b8392998dec91b1715f3c584b0d521cf250d896f3a9da578b5551f14350fd5559a1dec58b79a47e90fe2f2aab4997ff74645465d22da29f47513a705173b324fc76721e0acb7aa8ef9f3f85b6d0e964597edcd8c97cbdad2cff7a5b8532d4bb70867a03876a4c3abcf78075318c5343f3738dd540691aac584d7f2e31b5ff95cfc621bdb6086ec3ea7b99e430b74c16ecadc1b834dcdb86291b1d99ae9793c76ed7fd5b4859f55bd259b5ddf6deafce4fc5eaa2f422084fa6c1d907b8d7783b49afefc5ce970e7b6dd00e0d09ef5122d527e937a04975274e561d128feeb674ca639e3984c728c2f312269df04ccdf54733fa46f76f39796c7d7fde84941de3d5f7e7ed89bed17d45c9b1a41ea7109e63493dc630e9b41e30968f535cea92787c874d69c2a191d0db737d2f66be74ca419d314a5e463840fc041f0e8d3370b82c2007a59f642ee100f113790e16e3a3521c72037250772d25e14e933a247e32cf21d6240387490139a8313ba9beafceaa47e2a7f21cac5b337098129083bac322398db405c45fce73889d9a81c3b4801cd43d34c92b080788bfd287c36919385c119083badb2449eecc48f9986bd21c92ea1e8dafee2565d5fd19e063be82b9715d945e04e1e17a9ceee5994aafefc5ce974eeba1becd4a4e67ea81eeb670f2d8f5f87a20297badb71e5f4f24f5b81661cc20f53883f084f4fa5eec7ce9b41eea7c5952ddd191ea9f107f9de06da2a9f0b789994c3ae5a0f61692d7130e107f830f876619385c1f90833a07989c453840fc6c1f0e6766e0302b2007b56f9f9c23bcfd13e26ff4e1d03c0387390139c03b0875bf44567d127fb30f87b33270b8292007754f4652dd5191d580c4c31d15eafbb6d839283fa4cb27acafb6317ccfcec097aecf38beeafea024dc755187c4dfeea3b3161938cc0dc8c16f7eaddbbf68a9d2d43deb317827a2be49cf6a88c232bdb548cd590f0d5471f03ee72e54bfb0fb1b3a6eeafd4af2ce34ae235fc6215949f53d5412eeeb80dfd886771277a3bc77a3bcf2097771ac4261db47ff5891604339b8eb62190a4b5eed5418eee8d88dc2920bec07aabb3a929fa2b02def879fbdf993e87ee0e403480ff209f7719c82c25286babf21a9eed548bdaf7e90c8509c93f3918cf9a82dfdf61a951e52ef0de08e04f5cefa107c83f168303c6f5cd2b2e45e6c7b314c0cb26765394e05e4a8d84b7413ad4503d1530cb5678c63ed7fb5b69f63ecffdd10c443c97a223b4319e7eca773d2d7feafa62376a2ed60c7db00967cbfd2dd0ee4da51c3ecfc12a3835d66a2682c1a39d863ecb42136ce047b2d314a0c162758c511efd6cedf83ec1ca31cd04659f944acc92742921b6dff3fcc2e36d12e2849e6daf1e7da3163ed3f13ecb82176b8a3fd94a5068a53443ffb7f2f4a2f5bec687b82344cf4b0ff1eefe00db469e7cf99a94a17d9b1b44c371b73acc36e8c1d030a1d6f87473b0cbb3b7f4f76980e73d877b0e326da71b23623442bfb39d59196bfee13ec7feb64f6502ad373bc2854bce56cad4033b5b16b23d9e738b6f8ff5ae468b488547d96ec1ff2bf448ef326e6c67c2df1ff74e83a19f9e2a383c238c55199e5896b24729c7723ddf269307c1df3d7506fdfaebe4f134d7ceba2d78c6cee0a4e0dd22dfcf3bece85eabdf3eaa8a4b76a8d458eb3ad5a3143d5fc142bf16a59c7e743f0af42329968288952f55b3af53b5bbbddff43f5bbf94639f9c237409633f8791bc0f959d01ef63fa6da7f463b22863899a5d7eb64671b6bff19e110ced7460d25602147cdf907d14c543945c7748a76f6c87b1c153bef97c1c7e9555d38558bb4aa739c9951791f83e4643953a6989a374197d9d5a9c9e967366cba20a96f97a24ebb14441ad732715dcb14fdafbb40669fefd72ec552f54ab78bfc4fafc3e28c6d67e2c06930a1d360b1a363db927bc16c5b1ef4ac4f74a8d75f095f1bf463c06930a9d3a07302b5e77fa8c12e36c34bd44cb1603a2c195887a51c1d9e90af764138705accd268b1a1d4e2b13a5a45082de7224c3d70210eb8b42170610ef83843e0223a833ae6bfee92326d9c832207dcf0e624bf95a94bdd9ade9eca327d323305ce9a8aeada46aaf0782d2bda3865f9c629c6219733452ece219737453e466750ceb776fffd3cbd6063a4f435e5028f91270abf6976d811b2844e7bce9787fd8fa8f6f26f1fc1bf5ad96547da7a98ecec094cb2cbebb69bfc355a21b0b7afe868335be836c1c231e2345c5267f952ed2771cd4e8dff44def84be9c0a5c44a41dc74451ef8580eb8b22170690e38db10f838cec35431f5306538e4aaa6c86539e4934d918fe790ab6990ad30c8e538e4eaa6c8e575bec8b1f09147d417f5b4e3dcade4b64eea2867ffb181b31a9f28dc9d485921d9ebb9bce0793ad9cfa13637c9c2df47d508eca36a3a3e4abeca3a524c39df7582aead9d097290ce5a936fea1339e0da86c01538e03a86c01539e0ba86c02771c0f50c812b71c0f50d812b73c00d0c81b339e01c43e02a3acfe20c71638f9267912547dab2e4aedf500751fe817565745ea661aae6685fcc19831bf9fa93e8f8a9e386ee7f8598cdb3468e8bfbaf2871eeaeaacefee49aa8b14e8bce84a3207b2df2c09d5c5f3bdb53c97c765c82b7e3937504e5d82bcfae198dbdd538e4d34c91abebfa9e33a5fa6f37f2dd9d7189137e85268fb355264a583ff1b373f4c67c86e076e8fd3970665943a74167ea38e2a878af1e42bebd98e8ac848645ecaf9aea3cbd56cbcd1c2dd7f57119663cb9d6a8a9eb29b235ce0c324835e33b4a2d0eb8b921706d0ef82c43e03a1cf0d986c07539e0730c81eb71c02d0c81eb73c02d0d811b70c0ad0c8173745ec559365e7254bc0a5dc3443f176a2d34a3b8b39c6de0e345a2e0258ffd659c03b5751cda91a6c2b9b5863a737056e4971e157300cc714e584a8bde20dae90cc259f3e6f8b44234ccce0d6212ed1d9338f26438a33845e77c8e7582f935d7502e2bce23d5a20ea911ef901ae984c9d9f7f93a6172f62dbf302fd844ba3127ab1327ab73816535d1c9923dab8b4e9634bfae1994d89e17762a27ec024e58b7820b3b4d27ec18c75d186e5f9eaef346cea651ee51f246931c891219af408fe45458be0f0d3615eee9b889d37dddc491e0cfb98d3374765152b857519aecf137d59985b3e537e9ffb059443f70f5d674e61c6787b2a9b11114846d1f116030ebeb58e9d121c8596a33ce5d5ec8b9cb7e05779767eaacd7d9fe1d7d54acb797704fb348753552fb56d1db6a7f9dad3a7bd30d7d4c213a6e012cf362c732ff0b3a9c1d36d79986b3cffe5f1eb3c21b54053b663540d7d8d93232ff81aa20d2060acfac4bdb7a8384fec056107cae3dced2b587f316a1d77fd81ede2342056b91c1ba167136ba4fcc579360f286409b587c9b0c75daa4a012b856395be7ad65ab0cd3796b59c9e15eaed4590fe59df5399cac119cac910596d58293358a9375498165b5e4645dcac91a5d6059ad74b2e4fa405ecf60b43e68ad41ce71de8e5c7844fb271cfae92edad8cbd25636f95c353ec8f89e8e05a70f077973f9f753f92232d86c7f9cd3b72a0961c486eb636db8361b6fda666d75c872557099aeea215605ed74c6e0bcd01a73448d811bf8ffab05e284c02693eb988cdccd39f29c39c33a57d74ad5c5517b8b85a7748d236e1979c5449c0ebace6b3cbff755668cb2a58b4effc50ccc9344a6b766662cb8d66fafebfcf22db0bc0183be5a75f853077006ef003ae8c0a5cf9aa2f159a15e5e9fc7214f35f586e7eb90e559976941bca1cf59978e3a60b93d29ef96303d6fda8903bf2202f0ce1cf895118077e1c0af8a00bc2b077e7504e01770e0d74400de8d039f1e0178770efcda08c07b68c0739c97f3ffed9239fdd565c116683374fd5debbbe5453ffa856e660e9c5feea96b22a9c5eb82b8a1997cf3f4e280af3704eecd01df6008dc87039e6508dc97039e6d087c21073cc710b89f0e58be1ebb3108b0cfbbb0fe1cf04d86c01771c0371b025fcc01df62083c8003bed5107820077c9b21f0201db03c31323708705b1e78b00638c7390e352a9fb3fbef0fb845bf257ebb4e5f5a972fef85aa65c9c345478e2b37340ce1ece84e433b1aca01df65083c8c03fe9f21f0700ef86e43e0113a60b9ef7f4f10e0413cf0488ef1bd868c47e980a513b8cfd0095ca203964ee0fe20c077f0c0976a80739c339147e7b51b77923d5a1ff340601f334f647afb151563ced38cd635bdb44179b51a5d27c86b39c2ac13c670e0f335e0ffdaff85011fcb813fa4011721998fd381cbcd873c61b8f9305ed7259cd3bc4776c0f56e5837d69e5fcb75f6a046396636cef3efb636ea04c7ace8a676e30c9d61815dab9334ade1b488b6533c2c60e03d729cb9ee701967548f44605413744def9cb73e3a4768e899d6ae4ef9f14e8cccddca8e1b67e35f1ab17f5c18d83f3e2a329d5b397275e04c24973391c7223091893a70e94d1e0f3212fb1c399fc4012f32049ecc79cac5a69e720a87fc8429f2540e798929f234ce389646601c97ebc0e546bebcb2d57423ff0a4e274f9aeae44a9ddb73be06393a5f3be80e1445ebe09e129a7750ce672a7e9f1844c14b9e9f73ff625e422d1799be74888206e73bafd219997c5dfc74102f94cbdbd8d55cbf7b46d3efc2ce34afd119b0f371d0f0236ac0f9a73f1d6c2cf78a423869908e6963979d62a3c8f16e905a29849dacadd03583d68e563a765447e82669e62c39fb99ce35f3aa08dcebb53a7079e1d3b3a9cc196ca8380f3e8363fe9c8679d875d64cce77afd6f8ee502f61afe374b246a393e93ada3e3ab99e035fab019f1b12fc060e7c9d063c2f24f82c9d4770beeabbf63ff108996e0b3fd7ae9994862fcecbbf7482eba2e5dec270314c9d85922c32df32eeef47d6a7f4830640e733b7b6c8631cfd5ac8dfc42b5a911f2d5f70bcdcff2dce9c6f9cad33787949a1fcb1f67c57e1ca2fc906a8d15dca1fab564fe39cd6eca0c6fa7c7da210df27e6701e6e83c6c359213ddc8dba0ee77c2277646f11c9d4ec722a24ef5acf75fe3d59356f0f4776fa3e6093aeb45184dd3fd924e0428fff823d678e3771fe77b3c6ff9e6185f3bf3773b6be45049847fa18f12d1cf0565d274a38f9c277955b39dd6cd38d4d2175731b5785ed86ba99ab0396b30cf90b2d462bc4db39ca2fe9b4dec0e9f1e99bbbb39dc965faeeee6ce7c6c05cfb39d6b6d06ce7dfb9ce26d028b55934d48e9d9cda27cc76eedd1f64f73e59ba41289ddcc1e9e465539ddcc9d9c82b1a1b291e0b672377e9c0e579e05783d888cf79e0ffe9fcb4f375f1d1799d9c7fe88d76a5ff9a4e5f5aafbc53647a9d6cce95f3c577eb9a5b4e575f17f9e7690de53ced0d217fd553f27e5364da30d04d79c233cf67652ff056760fd737ded2f48df521fbc6bd9c337a5be78ce4e71bedc438c794fddc4ab6d3acd9ceafe74c50cddbcc0e5f211a8aab42b99cfbb8cabfa3a9fc5f212b7f3f57f9777595971f99b4762a3fdaa9bcf4b713ede770a7ad8792eafaf9dc6c679e913f75b018e46cde678b298e5f188da44c71ece8d2901efb015d0de534f53d917f9a2ad51a669a3a8f037f5f032e42823fc881efd28087dde39acf81efd680c743327f8803ff40039e08099ec781efd1802743822fe0c0f76ac0b342823fcc817fa8012f1412fc110efc230d78e190e00b39f08f35e04542823faa01cf716e0df92f6fada3a359b893c5fb44d079c127427f635d26f9dc58ff98ae69a41ffb54e41f1ea6160d373c3cce817fa6019f1d127c1107be5f037e6f48f0c51cf8010df8a290e04f70e09f6bc05787045fa2039793b72f0433793b2852bb5a2126554bb94a7ca9a9c4d262e12ab14c072e171c5fe93a4a8805c7931cebaf35ac4b150fc7fa298ef53786ac9773acbfd5b06e1e92f5d33a70b926fd4e18ae499fe190bf37455ec129e4904e21c78453c84a0efc070d78b592e1c057e9c0e550f8a3309ff23dab0397cbe99f8218e04e1ef8391db09c62fc1c04d8677abd5a072cbf8bf82508b0cf77116bb846fc55d388854b856bc4b53a7099ff3791dfc7e638b78a15ec578a0edba5b212c2fdaf81fd9fe61a1b9f5ff059c735dbef42b33c939f23ea16e7b0eacc16eec74bee86d84467e125272f72a9ee56cb5db74eb2ff5ddf7e0eb7ff9ee06cb5c98db66cfb0f6c194bc4531cc4e1cee46a8c534e62bbcb7e99dec84e6f663f1bdbcf2aa16c6a3dd73a7f685aa7a16c9d3fcdd4fc3ca7e6bf746a1e18899a0bae4cb9121ea966bceedea75c7b8f56b8f2574587aa7dcf6c557ebc833bc26121f746c335c70b5c4ffc5bd3138b970dd7135fd480e73837ebfd973f29d4d2393a2a3720c24ffdffd1393aedd4ff5fa1ff39217fe9dcc47f83ae59a4e6e4cbb68c9ef75fbe4936ea80dd5b1c03007fc2036fd2b5b573b1e105ff615b07f9c15a7d4bc774f5d7b674dc922d5d365fad7c7fd395d1da665d7348ad256c2145081d670a409b44b261c0b7707d3b69e5efdbef84ecdb5b39e6591ae6dafd0e1fe6db38e68534cce71d1f8ef9766e40286c690604a1a3eee3507770d48b68a80f2d178efa4b1c78510df88613c381bfac039793df6296f9e4f7150ebc7804e0af72e0c74400fe9a0e5c4edb4b04f1983ed3f69d9c1d960c02ec6382afeb80a59594d258c9c20ae1ace40d1db8f3139c16337f2b6d19cddfdee4d4749caebbcabb2fc2cedfe460f47f71aafc16a7ea329caacb9aa9fa6d4ed5c7eb543d383255ffff67bafc0ed7b5ca69bad6ea4ae1bad6bb9c1b2b1f811b7b8f033f2102f0f7391f79a2a18fdcc5596405431fb99b6bc88a3a1f59395c437ea00397b3f7930c67ef7b38e04a86c07b39eba81c81757ca8039753c5ec20ac7da6891f718d5845d388a3b3c335e2c71c78550d78932ae1c0f771e0276bc0ff0a09fe09075e4d03bea36a38f04f394ba91e81a57cc681d788007c3f075e3302f0039ca3aaa51b3ae515f36187ce896a1884737161e627e106b9cfb9bad4d6d54526647ba48691f50527ab8e4e96fc3e6e80fd7f43fbcf907c27ac648a7b46456a360c8b831c8bba3a16a5118b316a1ae19e572c38832f3906f5740c8a220603446fc73226861c01bfe2bc447d9d0baa16ce4b7ccdf5b50611f4b56f38e6391ae67daa8763fe2dc7bc6104ccbfe3989fa261be3224f3ef39e68d22607e88b3cfc63afb9487f9fb295f7691ed1bfa293fd44c4ddfddb83eceb3be38dbfebb2df259431c20793a4c9e201b6fc78d74fccb54673b7098133b34a44ffb81e3df44c75ffec2409a115cf59b9daa5333559f8b34bbffaecfa64b91314e8e5c7512df5dd4b8f5cb15eed6e634a764983afda8ab93349053b9f5e169727d5848b8ff3570ff0bb744fc89d3e3e93a3d560b6407ee522ec77e365171ae4d5c214e55794f0b79acf2674e3367709a696aac995f3899cd3899671acbfc95ebf2cd23e8f2bfe9c0e5ab82b30c5f151ce6347536a7a973a4a6925853e1f4f43ba7a71611e8e90f1db874ea2d354ebd628b704efd4f0ebc9506bc7d48f0bf74e0f234526b5d43c8d3486dac829c46fa9b731a6d754e43fe0e51feafd9bad8cff4a162f93ec8ddd7e989f678c2b8887f384eed749cca0a77c2d5c8fe939ee87610ee2d4e530d267eff723ccef59b7aca6b0fbd434cc119088b61d0de6f0a7e8a47139dd562a6e02c2c8e45071d8b92024f807b6a7615c3c88ee964cb7e701ed70fce2f503f887375eca8ab6379b61f7477167f139ce9506b650723424f1f125cad3b71b5ee5ca05a277572e429a22e1a3939ce2fd615ec6edeae96ff4f4af91c48cae25ae6023f6fd030726f5088e3d12dd342342a6f509863d03dd3823c4a6f508463d123933790d246d8865170d94539d93d75b28ff178a26e065ea818d71f7b71fdb17781fa6371ae3ff6d1c991fdb16fc13bd6313a6172fe72a166fe32b275b8f94b090ebc9f067c6a48f0921c787f0df8c190e0a538f08b34e00ddb85033f9633e08b75065cd9c9e77edde75ebb364a5c2edc55acfc5abcbbe868ff6bb09d79b8bade007629a7aad55c18232fcd711bc0ef73b542b27b380e368cc4e33889037957d2c61960073bce144b0f3bc496e19a7990ce40cf0dd7cc65b98a0de63cb5f44eee6f86e5fa3670982a1ecfb118c26d16b7119d441ff5c168b8397b399d2cb98c1baa59c66d88875bc695e7da6a986ea5d5215c5b9dc06969b84e4b851d2394b721ca094f78933f9193364227adb8465a77e504c248ada0932acd6ea4657ea35d45ae4aa3f82a75710c5a9afa44e78e81418ef187a9d2499cd44b74528b3952dbab030b973b6f26263ac9616456d2c8cc717e09586aed685d50d64164bafc2becf56497ea7691b4072e475bf2355a6d2767d41cb9839995396f3046e30d0e9f1fce1b64737e6c6c04db515574e072c5322ec8b69dcfe5a05539d6e335acad90ac4fe6f47d9946df853b86d377350e7c8206bc4948f0ea1c78ae06bc4d48f01a5c634e346ccc9a3a60b9969964197efd558b439e6c8a5c9b439e628a5c47e7739d1f49ff2f0fafb7b243f2dfe10faf4fb5e4f94baa00ad339d66e94faffb09e79c645d6ec4bf3c8211bf1ed7da5798b6767d0ef94a53e4061cf255a6c8399cf3bd3a8221a321077e4d04e0a7703a996eaa93469ce7bd56e37967770de7791b73b46798d26ec2697b6604da3e9503bf2e02f0d338f0eb23003f9d03bf2102f033b8d69c65da9a4d39239cad31c2e5ddc31961334e277322d0c9991cf31b35cca70f08c7bc39c7fca608989fa503973b3737079915f97cca7f36a7925b342a913f10164625e7703678aba90db6e0947d5b04ca6ea90397efdae70651b6cf0facb6e2947dbb46d92b078553766b0efc0e0df85d43c281b7e1c0efd40d3c43c381b7e5c0efd2805f393c1c783b0efc7f1af03223c2819fcb81dfad01af352a1c787bcec6ef89c0c63b700ee55e4387721ea792fb742bcf31e154723ea792fb23504947aedb3f60d8ed3be980e57ed8bc20c03e1b679d395d3fa873de63c3e9ba0b073e5f03fe6a48f0ae1cf8431af07bc78503bf8003cfd3800f1d1f0ebc1bb7025c10c10ab03b67820f1b9a600fce041f3134c19e1cf042dd7eb1ecaa035237310f40c79b7a88b05bfebdb8567e54d3ca0727876be5de1cf8631af0eba68403efc3e9ec719dce2a39c1b49efa888e22c779b125b3c0ae4c5b913e6f2b0f25b8df5ac85de1303aedcb315bc4b5667e663d9ddde75122dc571117720a5facdb0dbd329cc2fb71c3c613110c1bfd399d2dd1e9ac34db9af0f3885d9caf5cc2e8ee224e774b75c61a52771773ba5b1681ee0670ba7b52a73bb972c8453767bb3e037ec0368cc60672729fd2c9755e5fdbbdcafd713679fc6c9873ab6b1889833889cb75129dd77c760d270bf787e0fa8692359893f5345fbbf1ce9db5d30ae8378670129fd1492c42dab15d686f319493b74227af9853c35ce7aa12f9cd593731c8f19be342c91cc6c95cc9f9c6a1119da918cef5ef559afe3d7e7ab8fe3d42072e35f66c909981cfcffd8ee41cc77311388e515c63ac369ccf5cc2e97a8d46d78742eafa520e7cadae21af0d073e9a035fa7631e127c0c07be5ec77c4638f0b11cf8f33ae621c1c77196f282aedbca607a821ac670c673725ed4c929ec9113fe16f5cb38691bb881539eabce152ded6877189307e0c6879e6a4ce0e46ed4c92d2ee03c370c6469f961a4e6725237e9a49672a4b6d40c6905933e9193be996f5977482bc889af499cb42d3a69eee13d7722d4d278889bccc9deaa939da56a2a27fbe3434e51a67092b67103b8be45c3c89ccab999ed1a3753fca6706e661ab772df61b872bf9cd3d44b8623dd15dcf8fc7204e3f3959cae5fd1e87a75485d5fc581bfaadbdfb9391cf8d51cf86b1af052b78403bf8603dfa9015f1f127c3a6782af1b9ae0b59c09be61688233b8bdb43723d84b9bc9e9fa2d8daeabdd1a4ed7d7712a79db5025d773c0efe81ca3fc600a7f471ef5278337703a7c57a3c39b43ea7016e780de8bc001cde6f4f83e37c0e05f74496b2e8cb6e66864e6c81369564ff1df9da9ea29dc0fe81adbd2b9efc6fccf56ed4ad523ada21c794180e62bb520d276db7885a5c2e49f81b7099167ff79d5fe337daee07ebaf2034b1eda2a983ceef0d68d9c35efd1bd74b82d9c35dfc481efd5806f09097e3307fea1067ceadc70e0b7705de5236e6b2ad76e92b1ce0fd249630cd3456ee5647dccad5b463b5b37136d3737c131ff098e99869d55dfc629709f4681df8454e05c0efc130d7893dbc381dfce69ec539dc6ca6a068468be9dbd83e3f119b7069332267a5ef27412f8870ec348bf9393be5f275dba0df84231130b996f8293270c9fbb383e07747c8e43da68ed6cb6c2a635def80fab93ff711c3ed771a8a8d1893f978269e66e8ed5173a566590665a3a2b57f7f515b659b8653a0c8b7b381607752c4ed2e826139b8269e75ece557ca973e477867315f771e05f69c0678704bf9f03ff5a377886047f809b0a7e13c154709e0e5c0e2ddf5a86a7d01ed421d7b183df59f97ff53826849efac3bc80f99c80ef3502ac020878881370482320510001795ccbfea069d946215b760167933feae65cf785b3c9873917f293ce85640be15965657bde70b9bff13bd171abee17c7cd9c38772273560136801fe1aafeb3a6eaef84acfa42aed17e89a03b3eca31ff55c3fcaefbc3317f4c072e7bf06f41d6e53e5f0f3dcea9e470042a59c4a9e4778d4a368454c9624e257f18aae4094e257f46a092259c4afed2a824fb81702a59ca81ffad019f1e127c1907fe8f06bcf9bc70e04f723aff37029d3fc5598a1cbb4c2c6539a7122b965f252343aae4690e3ca6012ff56038f0673895c40d55b2826bc844ccbc2157722a496a54d23ca44a56712ac93254c9b39c4a0a45a092e7389514d6a864effc702a59cd8117d180377c281cf81a0ebca806bc7f48f0b51c78310df8f490e0eb38f0e21af08521c1d77366788ca1193ecfb12ea161fd7348d62f70e025758d99170efc45ee0550a9202af17901b481637dacae2143b2dec88197d6801f0a09be89b392e30cad6433075cc610780ba78eb21a75c81ff80ea38ead1cf8f1bab13224f8360ebc9c063c3b24f8760ebcbc06bc4748f01ddc52ef8418b32beddd39cb16939de45121f7545fe22a75a2a652534356ea650ebc82067c5e48f05774e07233af62ccfccdedab1cf8497af01661c05fe3d45249a3961d21d5b2939bc2548e600af33aa796ec0874fe860e5c5ec5572596ff65a073155fd55841aee27b93eb6a27ebba5a55a1bb10347d021befb87447fb2d9dc86e4b984ef9166720d53406b2fce17006f236a7e6ea9c9a6b1448cdef7095a8a91bb11f0957897739f05aba2e1412fc3d0ebcb6067c5748f0f739f03abae9d7c270e0bb38d3aeab336d39dd4a1b7236d93ceceed93ca4e6dccc33e21464fb7037a7887aba797f48457cc081d7d7801f0c09be87036fa05b6b3d1a0e7c2f079ea301bf3224f8871c78430df8cd21c13fe2c04fd18df621c13fe6c01b69c0978604dfc78137d6801f0e09fe0907de44035ef1b170e09f72e0a76ac05b8404ff8c033f4d03fe4d48f0fddc3ce574cd3c65a808374f39c0bd6f3b2366f8beed73cec336d5795879a80bdee6cab3ef1738d1f22c49184ff90527b3994e26be1d5a2fbb60ef8d0f72d670a6c61aca2c0e670d5f72e0cd755e2f24f8571cf8591af0ae4bc2817fcdd9f1d9baf976a97076fc0dc7fc1cdd96e1d3e1987fcb81b7d06dd1ae0807fe1db711d4d27023e87b4edfad2258df1ce2b6545a1b6ea9fcc0e9ba8daef33c174ed73f72e06d35e0678404ff89036fa7012fbf361cf8cf1cf8b9ba813724f82f1c787bdd347e5d38f05f39f00e1af0a1ebc381ffc6819fa7db8f0c097e98033f5f03def1c570e0bf73e01d35e0f5368403ff8303efa4012fbe311cf89f1c78670df8bd21c1ffe2c0bb68c0ab6d0a07feb70e5cfed26b571bbc0801cfd579c4b8c582ffc3815fa001ef1912fc5f0d784e733b685d258ee469f59eeae6fd69a2ad933acaf9354b8939c9912891f151c41e027fe58f97c9f0795d3d67f9cca1ba67daddbc931cbefea7dfbbc57c8e5669cfaa778fc9b3ea2d85f83f5037eeecbb88694c49b6760f4d75d9a36ab2a68c004b2740ee6cf5e476b67a1568672ba6932367cebd75f371f75bd0d6ceb7a7eeb9df494e62413f8889eba44b5fd247e34bfeda12ce972438f0beba35fcd670e0490efc42dda64c48f02cae51fae91ac5fd2cd8fc73d5425c95faeba601dbc355a930077e91067c7648f0225c67b998eb2c030ad4598a72720672720615484e314e598335ca6af24a386515e78c6b489075818ffd1ca303762eee886035538253c930dd7bdc57c3a9a424073e5c03fe6a48f0521cf8080d789bd7c2811fcb818fd480af0f095e9ab394518696729c0e58eef55c12c1abb7329c4a2ed5edc5ef0ca792b21cf868dd8ba090e0c773e06334e077ed0e075e8e6bccb1ba31457ef2d3d9f9d5f8f48b11f77795f16bfa09a2e09fdb94e7bcc5388db72815d25b9cc06972bcee24c0de709a3c91d3e465dc16a69ca3e6dada9451eeb82c5f43b9af99b2ed196b76017e07ab0257c509baedb48fc255b122079eab01aff57138f09338fd4dd4e9afb2d612bd5f03e4a20f8ab29ddfeb19ad6642613fcbabc4719bc4f512f9bb37defbe79ae57b779efe3c4efe3675183e95393e93757ce45b015e7618b9d99c014cd118c0864fc21940151db89c464de5a651d30a348daaca29ef72ae31f31f8ec02b9b36f61ff92b67230af841fbc95cbdafe0ea7d6581ea5d4d27476e435fa593237f9ff1ea58817f9fb13a57a96bb84a4d2f50a56a708d79adae31e1874d9b44f8c3a635390633fc5e5d3589f8874d6b712c66fae941fed8f210f57b62ee1e49c119d4e6185ca763e0fda165b9b335d1d96949330923bb0e27fb7aee95e5e49477ee2ad23752849159979379834ea6dceca96fff1f46423d4ec22c9d841248a397da11d30cdab23e277936bffde34a9e9c8a2eb8f4069cf439dce8462da960eb8f1c4eee8d3ab9eeeda1057de1dd901b496fd28ca43d0e841b494fe12a7233d715bd537893efe51b71b26fe136a9f0a40d7f031e466a634eeaad3aa94589d482dc20d78493781b6f2c63d1fd1a61649dcac99acbb7279c796ba73ae030c7bdba2f18c2c83e8d937d3be784c62beb71ef2dc133a5dc50924fe724dfc149f65a710f51d08b8bcfe024dfc94b9ee4b4ac3b9c175c72534ef25d5ceff14a2ed8dd8bcd38a9ff0b26b56037059ec949bd9b73f35ea9f8c6cb30729b7372efe17c85576ef88b94cfe224decb4dce68ab9a6ee29fcd31b84fc7e0d87c0c745b1561e49fc3c9bf9ff39605ff29f0169cac07825973afd4864218a92db9017d9e66402f7c28dc80de4a072efdfc8341b65c7d7e47a6b50e58de77373f08707b1eb88d0e58be547f2896ffa5ba4330c44bf5b63a7019ccb3132a10f03d4f5ed1a5c359779e904f409267df8e33a1057e336f6940c3edc80162a2babe461a51b841ef5c9d64e9fb1e8e191eeb6caf439653f7478234b5cf71b50e3ae0e3ede0c220c06d79e0f338c68f1a323e9f53f263a64aeec8e9e271435d74e274b1c850179d395d2c36d545174e174f18eaa22ba78b2586bab880d3c552535d74e374b1cc5017dd395d3c69a88b1e9c2e9e32d5454f4e17cb0d75d18bd3c5d386bae8cde9e219535df4e174b1c250177d395dac34d4c5859c2e5699eaa21fa78b670d75d19fd3c57386bab888d3c56a535d5ccc515e634879800e5812591b04d8e7f8f7404e17eb4c753148839c73961db44689a37184b287b3a332d62e3ddcd9c91913f1d1c8f5ba96d01e897c3e268f44d617fc914873aedc51c7c1baf696adf242104392cc19e0211cf08b86c043757674b6b4a34b8e8a1d9dabf6e5ba88c1e212e1aeeea3b5a40d4134f626dff38671cba08d41807d5639c339e04d86c023746d7c8e6ce30147b48d7bd968ad9d1c6dc4f936c506b6fc31ea157b03b21f28f7ad646f94ede6968352feadb939b05fd8e2f885939d9c51f0e27cc0486e94da6a384a8dd235630bd98c97ff27cd083f1904686354287d0c60b85d2fc0eb90ca9fbe14ba9bd3a187a9ab6d2720a572e8fe8dbf2d70e36f771aff6cd4f847a3369cc95ca23319796c6f47109319cdef095daa03963b332fc5cc8f998ee6c05f8e007c0c37737ac574e63496dbdd7bd570776f9c0e58f6e7d78200fb1c1b19cf01ef3404be8c037edd107802d77a6f98b65e2e87fca629f2440ef92d53e4491cf2dba6c893b92ef84e045d700a47fb5d53da53b92ef89e61179ca60396af10de0f025c8a07be9c53f4ae08147d05a78edd86eab892ebdf1f18f6efab383def31d4f3d59c9ef746a0e76b38757c68a88ee91cf04786c0d7727afed850cf33383def8b40cf3339757c62a88eeb38e04f0d81afe7f4fc99a19e6fe0f4bc3f023dcfe2d471c0501db339cfffb9a9e79fc3e9e38b08f47123a78f8386fab88903fed210f8664e1d5f45a08e5b38f0af2300bf95dbacf8c670b3e236cef6be35b5bdb99c3ebe8b401fb77326f2bda189dcc1011f3204be9353c70f11a8e32e0efcc708c0ffc7d9de4f86b67737c7fae70858dfc381ff1201f8bd1cf8af1180dfc781ff1601f8fd3a70b95173d8709ff601ce4a7e37b492799c3afe88401d0feac0e58fd3fc1984f54e1e78be6ef7505e1c610d174763a3ffc86df0ff157857f06f675750fee6d09160c9edf63da46b62d912ff0469e2bff9773979dcd0f9afe9d0b98043167143e4873964cb14f9110e39668abc907300f17804bf51c4d14e98d27e8ca39d8c80f6e31ced2c53da8bb8dd914271b3dd91c5dca2af7010609f45df139ca28b44a0e8259c3a8a1aaa632937d12c1604d867a2b98cd37371433d3fc9e9f99808f4fc14a78e1286ea58ce019734047e9ad37329433d3fc3e9f9d808f4bc825347694375ace4808f33045ec5e9b98ca19e9fe5f45c36023d3fc7a9e3784375ace658978b80f51a0ebc7c04e06bb915c2094154e2b34258c7ad694e0c02ecb3a659cf31ae60c8f8790eb8a221f00bdcbce024d379c18b1c722553e40d9cd1558ec0e83672b4b34d696fe290ab98226fe690ab9a226fe1ecee6443bbdbca01573304dec6e9a2baa92eb67366572302b3dbc181d78c00fc254e27b54c75f2b20e597ee3553b4833fa7ce3f50a378dae63388d7e95dbc0a91b04d86703e7354ec9f54c95bc9343ae6f8afc3ad70b1b18f6c2373873ce89c09cdfe486ef8686c3f75b9c3a4e3154c7dbdce4ae91e1e4ee1d8e716343c6ef72c04d0c81dfe35471aaa12adee7189f66c8781767cba74760cbbb39f0332200ff80731c4d4d1dc71eceef3733f4fb7b39bf7fa6a1dfff90f3fbcd0dfdfe479c92cf3255f2c71cf2d9a6c8fbb8be728e615ff98433e7161198f3a79cdf6f69e8f73fe3d4d1ca501dfb3967d7dad0d91de018b73164fc3907dcd610f80b4e15ed0c557190637cae21e32f395b6e1f812d7fc581778800fc6bce719c67ea38bee1fcfef9867eff5bceef7734f4fbdf717ebf93a1dfff9e53726753251fe290bb9822ffc0f595ae867de547ce9c2f88c09c7fe2fc7e3743bfff33a78eee86eaf88573763d0c9dddaf1ce39e868c7fe3807b19021fe654d1db5015bf738cfb1832fe83eb7e7d4dbbdf9f1cf285a6c87f71fdaf5f04fdef6f4ed3fd0d35fd0f077c9121f0bf9c3a2e8e401df24c85167c4004e0960e5c9ac840531389e990e5d03dc870e88eeb80e5d03dd870e84ee880e5d03dc470e84eea80a5390d35b4bb2c1db07476c30c9d5d21ce2c869b9a45618ef20843ca45b86e3232826e5294031f150178314ed997982abb3847fbd208681fa30397efbd471bbef72ea1033ed50e8e0902fc2f0f5c9253c7d808d4518a6bc571a6ad782c477b7c04b44b73b42f33a57d1c477b4204b4cb7036926b682365397d4c34d5c7f19c3e2645a08f721cf8e408c0cb733a9962aa931338da5323a07d22073e2d02f00a1cf8e5118057e4c0af8800fc240efcca08c02b71a67295a9a954e690af3645cee62694d7184e28ab7013cae98613caaa3a607964fcda20c03e47c64fe68067180257e3a67d330da77dd5b9b9f5758673eb1adcfae57ac3f54b4dce906f3035e45a1cf22c53e4da9c25cf36b4e43a1cf01c43e0ba9c2e6e34d5453d0ef92653e4fa1cf2cda6c80d38e45b4c917338e45b4d911b72c8b799229fc221cf35456ea441ce696507ad29e2687c55c5ffc26f1b0753febcc328e7e700c6a91b8ba2fbeeea765b1771a2cc9cd65217670afe0bab23cb38a9fff0eb8eb8fcf0eb68d2d29b53636eaa76670453b5261cf85d11809fca0dcbff331c964fd301cb1e797710609fbb394fd701cb5d8a7b8200fbdcd37686ce27b491fde0685dcd89cdb7916dc0d1f6fb7b75fad276bbfbe299afe634e5ca75ada6dc1870bfe918d08c437ec014f94c0e799e297273ce173c18812f388ba33ddf94f6d91ced8722a07d8e0ebcb11dcc0be2103ee1815b702e6c81a10b6bc9a9e3e108d4d14a072e7fa9ef91b8f90f0fb7e6982f8c80791b8ef9a311306fabf3ee6da5771f7154bc7b2fe17e9d2e3d6193883dfb63ba195d3b59d7ba3e3edc8c51b66c10f217338b7bdc194e8e1c156e2869c7d9d7a208eceb5c0e7c7104e0ed39f0272200efc0812f8900fc3c1db8ec764b3536dab05d7e1b528644454a1b62449ecff9a86511f8a88edcecf349c3d967271db09c7d3e1504f83e5e1d9db9516cb9e128d6859b2e3c6d3a5de8aa436e6a079fb1138ecd883c8dbf58f7028ef30a53cedd38e495a6c8dd39e455a6c83d38e4674d917b72c8cf9922f7e27af7ea087a776f8ef61a53da7d38e4b5a6c87d39e475a6c81772aa5e1f81aafb71b49f37a5dd9f437ec114f9220ef94553e48b39e40da6c803b846dc1841230ee4c03745003e8803df1c01f8600e7c4b04e043b8d6dc6ada9a4375c8b5ede0b62083f93c1e78980e58be50dc1e04d8e785e2700e788721f0084ec92f992a7924671b2f47601ba374e0f287a15e09a28fb63cf0259c69bc6a681a97728a7ecd54d1a33945ef8c40d163b899faeb8633f5b19c3ede30d5c7380ef94d53e4f19ca6df8a40d39771b4df36a53d81437ec714399753c8bb1128642247fb3d53da9338e4f74d9127730ad9158142a670b4779bd29eca217f608a3c8d53c89e08147239477baf29ed2b38e40f4d91afe4903f3245be8a43fed814f96aae11f745d088d770e09f44003e9d03ff3402f06b39f0cf22009fc181ef8f007c26077e2002f0eb38f0cf2300bf9e03ff2202f01b38f0831180cfe2bae797a6dd73b60eb99e1dfc4ab73b2c5f40cbe39eee5ff9f78497f382e6e8049d6407bf0e3219bc9807be9153fc371128fe266e0afbade114f6666e51f69de1a2ec160ef87b43e05b391b3c646a83b7e990e5f9d11f8250f6393f3a97a3fca329e5db39bbf8c9d02eeee0d6903f1bae21efe456bdbf18ae7aefe218ff6ac8f87f5cebfd66da7a77732ee370042ee31e8ef6efa6b4efe590ff3045be8f53c89f1128e47e8ef65fa6b41fe068ff1d01ed795c17ffc7b08b3fa8039644fe0d02dc93079ecf018b8419f0439c83b68200fb38e83c0e386608bc40072ccf4ac68300fb1caa7c9833b944c2dce41ee158270d592fe4586745c0fa511db8ecb58582b0f679bdfd18c7ba7004ac1fe7745dc450d78b74c0c5ec60d120c02578e0c59c432a1604d8c7213dc1e9b978047a5ec2e9f918433d2fe5f45cc250cfcb383d9734d4f3939c9e4b45a0e7a7383d1f6ba8e7e59c9e4b1beaf9694ecfc719eaf9194ecf6522d0f30a4ecf650df5bc92d3f3f1867a5ec5e9b99ca19e9fe5f45c3e023d3fc7e9f904433dafd60157b6832706011ec403afe1e6b9151286f3dcb59ca22b46a0e8751cf8491180afe7c02b4500fe3c075e3902f017b8d6cc366dcd1739e42aa6c81bb8054055c305c0460ef86443e04ddcdcb19ae1dc7133a7e4eaa64adec2595d8d08ac6e2b075e3302f06d9c4e6a99ea643b47bb7604b47770e07522007f8903af1b01f8cb5cb7a967d86d5ee15ab2be694bbeca516e6048f9358e728e29e59d5c13368ca0095fe7c04f8900fc0d4e278d4c75f22647bb7104b4dfe2c09b4400fe36a793534d75f20e67daa7199af6bb1ce5d34d29bfc7219f618afc3e87dcd4147917a7e666866adecdad63ce345cc77cc0316e6ec8780fa7e4b34c95bc97eb826747d0053fe4965ee7182ebd3ee258b78880f5c71ceb9686acf771ac5b45c0fa131db8730f7d10d63379e04f39db6b636a7b9f71c86d4d91f76b9073ceb58347e99796bb8b917645dcab2ca2fd3eb49dae752da229e753cd7313997e69d98425f7a1e601ae8ddb9bb6f1e73a64d9c61d8218bcd40603fc05d7ffcf33ecff07395d9c6faa8b2f39e48ea6c85f71c89d4c91bfe6903b9b227fa34396b7087409d2803eb7087ccb59465743cbf88e637c8121e3ef39c6dd0c191fe218773764fc03c7b88721e31f39c63d0d19ffc431ee65c8f8678e716f43c6bf708cfb1832fe9563dcd790f16f1ce30b0d191fe618f73364fc3bc7b8bf21e33f38bf7991a9dffc93d3c5c586baf88bd3c500435dfccd311e68c8f81f8ef12043c6ff728c071b32964773b48c871832b674c092f15043c6318ef13043c6718ef17043c6098ef10843c6498ef14843c6591ce351868c0be9809d0bf44dbd50610ef95253e4223a64b9fe1e1dc1fabb28073e2602f0621cf8d808c08b730a1f67aaf06338dae323a05d82a37d9929ed923a6479107942904ee37310b9144739d794f2b13a6479287b6210ca6d79e0d29c2e2619eae2381db0dc849d1c04d86713b60cc7788a21e3b29c354f8dc09a8fe7c0a745005e8eb3bbcb4dedae3cd78a5718b6e209dcc075a5e1c07522a7e8ab225074054ed1579b2aba22877c8d29f2493a64f99dcff4209af6f9cea712077cad217065ce366618da4636671b3323b08d2a3a70d92ed70561ed7342a52ac7fafa08589fcce9fa06435d57e358cf8a8075750e7c7604e0353895cc3154494d8ef58d11b0aec581df1401786d4e25371baaa40ec7fa960858d7e5c06f8d00bc1ea792db0c55529f633d3702d60d38f0db2300cfe1547287a14a1aea80e5b5977726ccafbd3c851b79ef321d791be990e5aaff7f41f4e1b3ea6fccb5e2dd11b462134e1ff798eae3540ef95e53e4d374c845ede07d09c89c4121c579f0d3b966bcdfb019cfe0f4f180a93e9a7206322f020369c6e9e341437d9cc9e963bea93e9aeb90e5e7830f05a1ecf3f9e0591c709e21f0d99c9217182af91c8ef1c3868c5b70c08f1802b7e454b1d05015ad74c07227e1d120c03e3b09ad39c68f19326ec3e9f871431db7e580171902b7e354b1d85015e7722eee89085c5c7b8ef51243d61d38d64b23607d1ee73f9799facff339e4274d913b72c84f992277e290979b2277e6909f3645eec2213f638adc95435e618a7c0187bcd214b91b87bcca14b93b87fcac29720f0ef93953e49e3a64b9ddb63a884ff2d96eebc501af3104eecde962ada92efa7094d71952eecb01af3704be90037ede10b81f07fc8221707faef55e346dbd8b74c872f9bf2108659f7d828bb9d1756304a3eb004e1f9b4cf53190a3bd3902da8374e092cc9620caf6d9961ecc19de5643c31bc2016f33041ecab5e076d3161cc6297987a1928773ba78c950172338e0970d8147724a7ec554c9a3b86ef26a04dde412ae055f336cc14b397dec34d5c768ae095f376cc2311cf01b86c063b9167c3382161cc781bf1501f8780efced08c02fd381cb97ecef04d1b7cf4bf6099c51bf6b68d4b99c3ade8b401d13b91ef3be698f99c421ef32459ecc21ef36459ec24d963e309c2c4de5da704f046d388d33e9bd86267d3967d21f1a9af4159c3a3e8a401d5772e6f1b1a9795cc521ef3345be5a872cf7c03e09a2699f3db06b74c0f227c33e4d18fe64d8744e199f992ae35a1db2dc1fdd1f44193efba33338ca074c29cfe4daef73c3f6bb8eeb825f1876c1eb395d1c34d5c50d1cf297a6c8b3b8b9d2578673a5d91cf0d786c073385d7c63aa8b1b39e46f4d916fe290bf3345be9973fbdf47e0f66fd181cb730b8712e6e7166ee598ff1001f3db38e63f46c07c2ec7fca70898dfce81ff1c01f81d1cf82f1180dfc981ff1a01f85d5c0ffacdb407fd8f433e6c8a7cb70e59d6f1f7202ed0e7ba8d7b38ca7f9852be9743fed314f93ece3afe8ac03aeee7c0ff8e00fc010efc9f08c0e771e0ff4600fe20e70545d2dc0bcee798cb3853e60f71e0b108c0f338238f270d8d7c01879c30457e986bca64044df908079e1501f8420d784e7b6927ddc591bcebc48bdcc64e9b24063b38f2ee903176da10e79e90d136dae00cb79814b2e957d1e8c1d1854574e1dc665238296f332997af86997870f7943caa6b22a9c5227ed4683349568c80c73801452312f0386764c52230b2451c78f108c01773aa392622d53cc10928119180259c8092110958ca39be52a68e6f1937121c1bc148f024075e3a02f0a7389d1c67aa93e51ced3211d07e9aa35dd694f6333a64b9a97a7cd26c537505b7d7502e08b0cf5ec34a0eb8bc21f02a4ec927982af9590ef94453e4e73865543054c66a0eb8a221f01a0ef82443e0b51c702543e0751c706543e0f51c70b621f0f39cbd5531b5b71774c8f29bf1aa4128b7e5815fd401cb73d3270701f63937bd8103ae6608bc9153727553256fd221b7b183358250963fa7c5006fe628d734a5bc8543ae658abc9543ae6d8abc4d872cf3d709a2669f770edb39e0ba86c03b38e07a86c02f719397fac9082e22e75ab081690bbec2d1ce8980f6ab1c78c308c05fe3a65da70469499f69d74e1db07c63df2808b0cfabfdd73975348e401d6f7026d2c4d444dee4904f35457e8b1bbd4f331cbddfe6804f37047e87b38d330c6de35dce369a46601bef71e0cd22007f9f53c999862ad9c5b16e1e01ebdd3a70e914ce0ac2dae7dee60f38d66747c07a0fa7eb730c75bd9763dd2202d61f72ba6e69a8eb8f38d6ad2260fd31a7ebd686badec7b16e1301eb4f385db735d4f5a71ceb7611b0fe8cd3f5b986badecfb16e1f01eb031ceb0e86ac3fd7014b22e70501f679c3fa0537949f6f3a941fe4903b9a227fa9433ecd0e760aa28c387f2ced2b0eb8b321f0d79c2eba98eae21b0eb9ab29f2b7dc6cfa8220caf0994d7fc701773304fe9eebdadd23e8da8738f01e1180ffc0b5624fd356fc91731cbd0c1dc74f1ce5dea6947fd62137b7837decb893349ad66abb3b3f65ff85a3ded794faafdc5ec28541b4edb397f01b677dfd22b0bec31c78ff08c07fe7c02f8a00fc0fae252f366dc93fb91dce01415ad26787f32f6e8a303008b0df15dc9ca20745a0e87f38450f3655f4bf1cf210536479f647bbe41f1a44d33e4b7e8b031e66081cd301cb261f6e681b710e7884217082031e69089cd4014b6b1e15813567e9c09d3bb34d6dae1047fbd2086817e6c04747005e84031f13017851ce4cc61a9a49318ef5b8085817d781cbf9e7f820ac7d56cec770ac2f8b8075094ed7130c755d92639d1b01eb529cae271aeafa588ef5a4085897e6743dd950d7c771aca744c0ba0ca7eba986ba2ecbb19e1601ebe3395d5f6ea8eb721ceb2b22605d9e637da521eb1338d65745c0fa441db81cf6ae0ec2da671d5381637d4d04ac2b72e0d323003f8903bf3602f04a3a7039219991349c9054e668cf8c80763647fb3a53da5538dad74740bb2a077e4304e027733a9965aa936a1cedd911d0aece81cf8900bc860ebc981dbc31883b29c103d7e458df1401eb5a5c4bde6cda92b539daff5f7b67011fc5f1feffc15a5a684ba943bdb4a4b44592607512b40d8542a05e1a92105202499360956fdddddddddddddddd4bddddf5bf337bcb7eeeb293dce5eeb37926bf7f791572b9bdb999f73e3bf2e8b139e8763f5be3c7e5a0f18d6c77f2f82cefe4c6b65e9f90835e6f62bb9327667b27fbdbba7d520eba3dc0d6f8c939687ca0ed4e9e92e59d1c64ebf5a939e875beed4e9e96ed9d2cb075fbf41c74bbd0d6f81939687cb08dc999d9321962ebf65939e8f6505bb7cfceb6dbc3a25ad65be973d211ed66f6dcc36d3ccecd018f4d6d3ccecb96c766361ee767c963731b8f0b72c0630b1b8f0bb3e5b1a58dc74559f2d8cac6e3e21cf0d8dac6e3926c798cb0f1b8344b1e45361e97e58047b18dc7e5d9f21869e37145963c46d9785c99031ea36d3caeca96c7181b8fabb3e431d6c6e39a1cf01867e3716db63cb6b1b57c5db62d6f6b6bf9fa6c5b2eb1b57c43b62d8f8f6a59bb73dc988e7434e3ceb15d54c3dacc76533a0d3763669b606bf8e62c1b9e18d5b046774b3a0d37a336dbded6e35bb3ecf1245bc3b765d9f0649bbcdd9eadbc95da5abe23db96a7d8a6a33b73301d4db5357e570e1adfc1d6f8dd39687c475be3f7e4a0f19d6c6bcbbd59ae2d3bdb1abe2fcb8677b1c9dffdd9cadfaeb62e3f90659777b375f9c16cbbbcbbadcb0f65d9e569b62e3f9c6d97f7b075f9912cbb5c66ebf2a3d97679baade5c7b26db93caae57cefe5e3e9c078cede7085ade127b26cb832a2e101e3bc971df650cc2c2b53bdd68acd1523d5b6de7b65def5ba4dfff713bd16cbbcefd6ed8d30dfa0739ef8ef257fa2f9fc2b4f46d1e99042c7e45d79aa8bcebbd2c75c999b9ed932b2ccb049dfd3d94a5f95ed517c26cb47716654c33a0be8b3e934dc4c16d06a5bc3cf65d9f09e3614cf67896296edeebd90edddabb1b5fc62b62dcfb6c178294b18736cb7efe52c6f5fadadc7af64d9e3baa886f5e6ebd52e39c8676eebf56b59f6baded6ebd773d0eb065bafdfc8b2d78db65ebf99835ecfb5f5faad2c7b3dcff618be9ded6338dfd6e577b2ecf282a886fb792fdfed928187ff45f62f5868ebf97b59f67c6f9b88bc9f0311d9c7d6eb0fb2ecf5beb65e2fca41aff7b3c9df87d9cadfff6c3c3eca92c7feb665e0e32c9781036c2c3ec996c58136169f66c9e2201b8bcfb26471b0adc79f67d9e3436c90bfc816f2a1b62e7f9965970fb375f9ab6cbb7cb8adcb5f67d9e5236c5dfe26db2e1f69ebf2b75976f928db34f75d0ea6b9a36dbdfe3ecb5e1f13d5b0cee8f84397ec333a1e6b43f2630e901c676bfca71c347ebc8df7cf59f23ec1d6f02f59367ca2ed89f935db27e6a4a89657f55efe964e97c7da1b3e39aa61fdf277efafdee96ec4bad8bfe0145bcfffc8b2e7a7da64efcf1cc8de69b6c6ffca41e3a7dbc4e4ef6cc5e48ca896f552fe4f3ab09b59cacf8c6a585728f9379d869ba95072968dc57fd9b2383baae5c1fa5e2d914697ffb3377c8e4d363a2c91833ce6361e1d97c892c779512d6b7d6ca7747834a38f3ddf369d76f61aee9bd270876354a0af9ca22a8c9ed5d7c9ce363f8f33da5aada99ce17dc4d7c98e5b7ce52835cffb8dbe6292f7af7eb7dafca65ef557d3bc3f93cdbb155e8b738d6655b71b7e66a4f76fa009ad50a3bd4f95a9d9e61bfccf86da585f075c6d74c0c9eff8fd2bf04638ad99518cf2fe9fab74beebf0db4b8d0e3a6833b9d5a9dea7aabd7632596b2eb051ef12455d1b74a778df5ded5dbbd0f4afcaf4a5524d50d3d59e8666638262adaaf3fe1ea7b49ebcc668c6f5a7f43b2db7903a32ad41af35baf632efda4cc677a16d7c4b448d6f33ebf8c624ee72d3715679af748f1b8d24ccf1fa3cc3e8e0673733d6d226d76632a68b6c635a326a4c43ad636ada8be411d579efd627e48e35968b6d63e91a35964dad63092c32b5e6d59c36bc3b97d846b454d488366ff588aa2224d23ea628f9cd645497da46b574d4a8fa65304f04e39993e86173b368263dbeccd6e36e513dde5229ebb7fafd1c9d9085b288f9c93ed33737abb5766497db46d63d6a64db5aefc57833964ad3077df94463b1ac33bfd1d71679bfabf57a3e2b41a0dcac85f5e667bba4a5df6a2663bec236e665a2c63c24e56e86ebed08af17f566f56e3a26db0a6d7b276c2b93915c691bc9b2b61529bd914c4e3c47f671a437bed6ec22aeb28d69b9a8318d4e5b225b77b7326d3b93915e6d1b698fa8916e9172f77036c8eefe3537afb4e60e5e631bd7f251e31ad9ccb870f7374aede57da0ccecfff4fd48ed69f228d21d5feb7783d7da46d9336a94f919dcbd312dde3dfbf83219c175b611ac60bb4fb63d4ea55ae0fd76aed9e1e5f239b3b59cc928afb78d72c5a8518e597c16f4fd500acca9a3ccec2cfcdf87af7535a1f95e3ff51a54e63d23e1a92f7575cba6c54cc67a836dac2b458d757833634d26afef95debf6636bae8363219cf8db6f1ac6cdbffb6663c0d89e74d3f77730c737f761fef49619d99ebeb224ee4ad9f396eb28d6a95a851dd9a13894c7d27fc4cea1d0c3caf025d82ae8d95ee3ad89c06a2b57a944ce5ab39891cd722b14ceee3cdb6fbb8aaedbc19c5798a6a34be7fd5e65fdfe36f9ad17634243eaed7dfe657bb5c49e62db611ad1635a26119ac6999ef8da35bcb6434b7da46d3cba68f8aee19ee424acc1d6af0646fa6a19bfd1eb9f577eb36dbf87a478d6fac75fd6eaa1dc8e51ade5ceb998cf676db68574f4736f17c9cbd6c46b796c968eeb08d668da8d16c95966c8ef0e6898ac43c529b13d90cdfc9646c77dac6b6663ada92e4e701c737c5e875eabd6bb7f3dead326b4ff44893dbc8dd1377976d646b458d6cfd9491a5ca5da0ad2a31cf4595f7f3cc1cdd81bb6dfd5cdba6d56959bac698553658ef83f96f82f77378326bcbd9f01edb98d7891a737133f343ae7474e1fdce95b6ee5edb18d78d1ae360eb8cafed4ed3bd8b82b1967863adf2aea837fab5a63361ae3504f7d9c6b15e3a1a824ce4b32d25f27edb28fb448d72a07594d9ea075a37873c60ebfdfa51bd9f6c95b54cf439e958f3e2b4f83d6863b0413a3a9ee6f61c99dec3d6ce180fd946d0379d27ade9ac989e2ece3e3f26bf93abfbf4b06d947951a32c4a6b3e99ac74a568dfd657dee67baa476c23dc301d5d7173929899aeb8b9fbd79a95e051dbb8fab5fe8cd69274c6b9063c661bdf46e9ecc4389643b64df171db98378e1a73a5e27adf3426ac865509ef9aa9e60ca1f5557e1df8dcd85f5b23fb4fd8386d12c5690a9993dd4ba97942d97378d2c6a17f14871ddbf819613f3d4fd9680cb0d93fd359b1c7995d92ac55fb69db4807468d74545a73ff78efe21ab35a079e62762d415c6bf733b6710e4ae7649aba5e179b9136bd7b78da4ce7f7b9b5da3f6b1b637e3aeb78d331866739dd4f7d9d96aef288f9bad4fbb9cefc3ebdd1b54e5ff79c6d7c05364b5473e3f3d7a5f003e9dbb2737bd79eb78daa306a54bbe458326dcf5fa6d7e796c90b362683a3988cb79e7b2725d6545f1b8196aa64ed5f8559abcbcdfc5aa7424d74a6ad8e8c68279371bf681bf790a871efd6ea7197e7788cad6927132e2fd9b80cb569715ac705e7bcdcadb12fdb7a3f2caaf783b296e6f9e679cb9d26fb155bff87db3430d9f57fa6d27be32aefdfe6cec4998ce055db0836cd6c3e49b5b5e34a923ca2e6f775e978dae4621e7dcd36eecd6c3a99ccc73d2e8df3096fa578dd36c2cda346d8bfd5b2a9dff79ffd861cdd9b376c3ddfc2a64d4a476af2bdf939f9699a6ea25bb47f6e53f94ab7c54cc6f5a66d5c5b468d6b67c53b51fbfadd6c340fb9f1f17bcb4664ab7434d8c566acfeb802ed7da9f7bbf4bc3672337fbe6d1bc1d651232848730493139ca3ee43735af8f053998ce11ddb1846448d61baf5799b9a20abf73d852d782f248f30b7efd89edee4fe6542e85d1ba1a2284225ad5a2db077ad59239347978b79f83ddba88ba3469d97965c14a4ccc10b7226c5efdb7a3b3277bd8dd24ab5aeb71fd87a3b2a77bddd3b67bd5d64ebede8a8de6ebd78e56a8d8f63f218269995cdd79ab1d6e50f6da31b938e4ed31e0fdab24e33eea8808f6c231d1b35d2c266ee6326bebdd55ecfb5875daef6871fdb46312e6a1403d25c738bbc6ba24eb7cdd9ddfc4f64d2f74f6c7ddfc67607ec773e5bab7debe5e853db28b64dc73fb0f9516466f16dde97ae35d2f5996d6c25367d78cbe7a6f06908e6b506e301a4dfa968b22b686866a6cb4d6cd7e7b6318e8f1ae3aed631a245ce7e4eccadbf6e66df9809952f6c54b68ba2b24d5a6b727e6254b964d07cfb998cf84bdb8827a4e7b51cee2672e1b51cd55a26a3f9ca369a89b68887f467a5ccc7636b2f93117d6d1bd1f6999d3ba22426fd71e5423e3319f537b6514fca2ceb837dd4e10eb9d2e8407863f9d63696c951639990d59cd2f2ca997edbb95849bfb38dbd343daf30fbec92a957985d9bd29a717d6f1bd794cc74c7e9ad65c9123b5ba5c6b4a5bb53c864843fd84638356a841b34b973a95e1ebc58821f6d3ddd21177a7c7f479d7c3f5ad28ba67342cd64843fd946b8a3ed29b2c74b4e36bb4e3c9da5e6acf0f5a7235b1c65f677ee67dbb8764a27cf857fbf66264631def4acad3c687eb18d64e7a8914ccaf00ef973dd1873b29e6e9a695e1e5b9eef9bff7c6b66c45f6d0476e1cf88dae2313761b328f27e9ae1fda94c9cac7277e2fdcd36c25da346b85d4e46d890f50873716f7fb78d7c379b8523931936f93cecb3b0cfa2f8746432863f6c63d8dd9679a0f9f54c473f6f67b492358918b3d9c6e3a325afc55c49e39fb6f14c4b67ee6c3a1efd9b32b30234a81d0cf7a6eb3367247fd946b24766fbe3686d4b8362695b72f164fd6d1b7b597af13bf6fd71e6f13badb30bfc631bc1745b8c77cb3eb2a931ec726238ffb58db63c9dfb3505fa94edfdc2b63219c17fb61154649a15c8ef77785f9a6620e15830742edac81154daa21232cde2196db59116fbd7c1c661461487e316ef39db3687ec64d342adb93e932cb2c927f8b6cd23dbd146be2a1d7ff9e8392f1d5b619c335d27db1867a6131b9ca985adf92724731b5b675befabb3e97dcb76c0dc9c26bbd87abf6754ef37b2ce70cd9d9972ed07bb84adcfb3a2fabc71abfa9c7bdfd7256dbdae492f27433827e1b33cd2cc8fdae61d1dd793be17532e76685d6d639c6dcb2f97ce18d3cb66d0ba91b67ed65aca36d63951631d97e6583389d98af7de2e6d1b6f6d3abe04b6796e24681b9a1f5ff27bf8b94c46d1cd368a3a9b9fb25d0f38c9f4614e845ea4b951b5b6e7dd6d3ddfcb16bd60efb9cec4ad7b5eaea2632c18fd5fc6d6ff7a8ef76d736368dd0cbeac6d040d99798aa7ab894b67ddccc51e7339dbb81a6d39aab21b577a6b6b2e46d6c336b2b9cd479547e9cac79833749dd76b3d2b0799098b123be8746d3199c767e582c3f2360ef3a238540be5906edecdec79f5b4f19a1fc56b5dd592e622b0ec05d1b9c93d0c7e9f490f57b0f570413a79e5826fcc245348746cb16d4caddf57ad681bd9425bc68cdcd93ee67a63a95041c6db5af3896cbdc3a658dacc564657b271dadbe6259d3d271c0b77e65ed936ba7da246b7534e465715b31464c263151b8f7d33b38be5ea6eb7e69eae6a1bc37e5163d823ad7d4674945954558cf4ed2ecdb5c193f8d56c74fe1745a754249dec29f4b251d8df16b5989b1a2c7263877bdb881c908ba766722c72c17b6a56b7d13930174f4d3c74b2a7b0868dc241b6cc6ad9f90405369c2a15785064673b68cd98d7b48df9609bff7c76631eadfc68a3b6f3045dcb36e24332f35e68dddc18eda96bb7a2e5f66eaf6d1bfba136afb75c8edd7eefd3b522664f601d1b81c36c19c2328f0a9630ce756de33c3c337ffce67c6cd391e55c680cd7b38de5085b8c48e66349f79ee5c60ad0c736a2235baf03cd2c5e2dfd35379371ad6f1bd751dcb95582cff706b6b11f9d9e65323acb624b15189a9b519a93dbd66592ec6b1be3319965ae8ace169f898f416be6c43c5bef8fb5f90347ed75b633b2365fe9c89b594977cc97c20926a6ba799fd8a87aa7fa6afbde6ae2628f9c7a4f26eabc763219f986b6911f1735f24ceaa3fa994f722f69fd6c3d3e3e9d6896a88a1fac9e6e64ebe909513deda39af72d62f572635b2f4f8ceae5faaa255d3cab9f9bd8fa79523afd6cea0fc0ea677f5b3f4fceec896a39deb169b695d6eda206d87a7c4aae7bdc9c1f5c263d1e68ebf1a9513db6d78bb0d5aaf6e7eba6ef3698fe4e54c9f5c56df61a6e8daa413606a7453168294becb8c46e7181f744cf68322a5b96d46c32702de9fde9d0a19bf7e32873a5aeb534d1acdd3ee9015aa560760afe3ad77fb18f68ff242fd1f0f7fadb677b3dd2f37ba90a329f6dacd66ea185d33d604b7454fe7f7d3b68d88d89dbd861460a37ff9335a6e5b05283b6d286151db5ddb6bfb773a9369fdac3bb57bb787f5a1a4594dfaefe6dd4e85a1ed36ede1f7d95f69e2d374fa4b63b4ef72466c9c48882b63cd25a61d5ee467a86beab7989bbda71800ea737fe95ad91a6967b71a6feb64ed132b44a13b2b8b644f5dd6f60bbc45eb0c3f2de8b69806d4ee2e8536b9a1c9798665afc567c5aa3be7513d3403083b5d81c862d4435b79a1135ff9852affc30903edd955ab24bc781fa6e9cc544b6ba41364d0d5c3cbb213ab4bc8d353bc10a23e7f55ea3f94e801c382004793613e49ade8b60f92e3687df60e91ba11acc77680a9316bb514e483891d59b43581aa31700b370bb10e6394c98bd92a432c81438c9fba924c99f2e352ed405881f4c08219e2bf3d11ee404c82b3608419ec704b94a12c8284d998b0ff3156785f8ce67e25b2e099fdeeceb2e542536431a9b0bb8beef15e2ba80896b0583cb8f500bf20c96283fbfa0ae7f569ed809363881ed986d436c17c6b7648c69574bc6d7b0ee5ec496bd601393ba6dae4ef864eeed0cb62b60137d3113db8a49b257643e58e1499fbf18d426a99e5d003770eb10dc2571acac83609fe7feca3af19c10dfa54c7caba9a6dbe4626fce2b757ec69b382944781913e11206a1feb89f09c405389de1f1bc9c09a7a7c2336d9949f6e23f963a15cc086f86f3cdca2e40eb3e3e8476051b5aea43195a6b271b496b7464267b655108ed4a26b495ad92a68dc595267182ee7e1078e702bc89207157b1b71fd1aaa7c9aadcfcac5f8d7646f9f90680bb9a096e5515a52f9e6094dab506a43e6a152702bdab9c593dbb9e1802bc860970dd4880c526b252fb16a192096531d53bc905a879178750af95a9b72b7002e4d7fd4290d7c5b73d0e6cd5ed617b7ccec410e1f54c844b1a841888e6029e176e0df1dcc0c4d3c3e029365b92f1e6619cdbe4217501d8df8f86c06e6402eb6a8069a7db19892f9fe904a055cf0f01ddc404d4dbba2509d549e119c23539fbfdd810e3cd4c8c6b29542cf953bf5f5449bb29cc3313bdfb8aa673ce0b71de129f9eaebd58c0ba9e1de2bb95896f69159874fc62c98d466bb2d009483b9684906ee3dbbdfcdd5a90072130e08c32f3a0bf5f736387760f986c6e675b5783c3bfbba69a0a30d5dc11c7c230b05d2f0c7dce0d71dec9b6bab6a4b7d3c1163a89dcc244d086366abb00f1145043dd159f7f497bb182cd84d5f56e26be6e06df28e3741b5827dcf1f4d48edb01a67be2da8468d79b603d7501d2eab009b997af326a4ee7e6aa2967ecc721c2fb980897499acdf4daea9aab57e97221aafbe3b3afa2e12679fa7701da13f0883e10d786d7ddf3c102733e58b24b4ae3a39b34dedae092cc18dbc36034ee519e2cd699df362a3fa17d52588cb74f92d7f30731ac25af994d425e9a612379691cb5f232f0a0cb6b61a6cc4bc371362f2b27ef6c3e5d90d5a7f3bd4fa77adee465e4469797819f6c9e75ef936755cde4a53d39a75e697793c9cbd8cd21afd507acbc8cbc02f2b20e5fc94b635ececb40c793d76a87ded44fa61f3d92d74a8b61eae7d275c4cbcb42db9fd72ae785bc56c432849f495ffb9bfa3de99c6953bf27bdcf64afcfc9cb81b1202fd2b0959733ff88bc08436c5e5ad6c7bcb4fdd1f25a79f809e393715b10c6150fd4f1c90ffd1f0f1d1ea843871fd610ceefe243f077ca8fb04312f53df723c5e7a81a957eacfd343524b53fab37e9cf2493bc5fdf21fd7dc17e39aa674b25eda89f4b67b0add9556fd8293c843cca57d9d59a8ff810f5a392818b53ee608e62c12c5321ccc7f86e78c9728a0da656f71cd6d4d12977385762e1dc0f64f3714938873b89f361c0f984249c839cc439b76388f3494938f39dc4791fe07c4a12ce022771be07389f9684b3d0499c3d60ee7c4612cec14ee2ec0f389f9584738893382703cee724e11cea24ce72c0f97c1c38abac40b1fb7adf493c627667e1bcbd4388f3054938873989f342c0f9a2249c839dc4b90de07c4912ce422771e603ce9725e11cea24ce8301e72b92700e7112e79e80f3554938073989f36615e27c4d12ce0227712e03d2f9ba249cf94ee27c13a4f38d38bc916d3093731953d5738b680b51e710e69b92603649aaea00ccff01ccb724c16c92c6d201986301e6db92600e7410e66880f90e3ff1b4ef63a1fd3ffc5f3798dfd519ff36fd1b1ac05e2c80cfc11afe2e3bff4f73d298bcbb1cec20ca4bc084f19e1494054ea2ec051acdf7a5a0cc7712e58f20951f484139d849940781542e9282b2d04994d300e58752500e7512e5f380f2232928873889f23a40f9b11494c39d44391c36e69f484139cc4994eb02ca4f9928574aa02c57be3b766324ca21de92338d7958ecc202390ab6429ff1533cd965124bf061413122d43216d43b60cefc9cad04f62332f4259312ced7258644b5f9b969055f1acebe2c9c3a5225c0f9451c0ffb50efff4a13eca2bbaa3bec17bf735db1f10d80fc328e649e76e3042adaf071276a2f7bb0b0de0358bf8aaba68c96c2aa44f0560c3249d356fe06f0bee667adf4e155b79b47fa1dc0f70d7b6ed4ab73adf7169656d7cb8b6ea4d4e00c62d36820976581dc05407e1bc7e6bcc6bba8c6c862734adfa10ecae477b039ff2e0e1bb86d738ecd69980399389764e1dc0ab6e8df3371aea1d28d9c4cdd53ea13b97bfbca9900f607a960873908767700fba354b044b5070dec5400fb9354b0850e829d0c607f960a96b878d1c0ee0a607f910a96e8194703bb1380fd552a58e2699e06761b00fb9b54b044ad280dec5800fbbb54b044bf4e1ad88900f60fa960893e9e34b0e301ec9f6d69b04b3dc8ba77889d0128ff62a2d4aee8a149c4d74a59328ae60edba62c6cfd5488ed6f26b66555980daccce08b4933fa1f0bdddb80ee1f1909a7a236482e1e43cf01fbe6bf71d8915a469becb85dc05c6efee948c2fa12e84dff9388951aa941c37a3860d50b9c38ac839cc4ba2360edc0c41a24c8b569f983915237469d3a90303e0acb544726c660851fd86e56f807005d2726ba206a283d3b1335e89fb6412f87a097ce9260ba68b2ab00985d24c124eae66930cb00e612926012b7ee3498d301e692926012b7403498d30066574930895a4c1acc3d00e65292601275ed34983b01cca525c1745177b92bc0ec260926d1378406b3126076970493e8c14483590b309761c26cd94011466f50ad93c358288b40a7b92c136550352593b45244a0b4d43dab83c56739694089cb100de8da00b48734a0c4ed3b0de84000babc34a0c42d3c0de80800da93ad120e8dbc454a8725e8ca42ed23de6d6d15625c818971dd88553d3dcb654c215bb42a2f2520a92b321167671c76d1f9fb46d848adc444bb94f742977c6bf4dad37ffba5e768c0a6b0800d85c77de5b6dcc4275b255d4c7db615c8de2a71d824b5bb4c18291cbc1d93618d76ac7c0e2472d538cee8da26599b525d3034ebba1da179399cd1578bc3fdc0becbc406635ac10f6661ed0e587bc521a336a8c91b77aaba98974ea54b08b3b7249844c9a4c1ec0330579704937846a7c15c1f60ae210926f17c4e83d91760ae290926d12d8106734380b99624982ee6f3ea0730d7960493e8ca4583b931c05c47124c179359f40798eb4a8249d40dd1600e0098eb49824934fed2600e02987d983083b453f9e624eea7fd715dc5b1371c1fd78fc3f66393c4a685948733a5915670713790c60da40125ce9534a0bb00d0bed28012cfe534a0a301689e34a044ad110d683100dd501a50178bd66e0340fb49034ad41ed1808e03a01b49034a3ca7d3809600d08da501256a916840b705a09b48034a3cafd3809602d0fed28012b549bcc2f40074808cf0e95285593da8c92769993d1eeb1c621d1847dcaf7655986d7c8c623abbd33c8c16c2d97d10135d0f40a71bf11db462c2477ba08701be7c26be3e2a35d3f11c35c3bb7c9a9aea5129f69a1ba9b6f5ba3ecec8655593077bdce2eb89a7a34758f911aac0c5b0200ef5dc60efffa055d79d6686808c16c6e113975e94908ba18047a810e560591b22aade9d367f1e052bf71069405dd4741e0940874a03eaa2a6732e001d260da88b9ace46003a5c1a5017359dfb01d04da5017551d3b92f00dd4c1a5017359d0701d0cda5017551d3790000dd421a5017359d8701d02da5017551d3792800dd2a0e95dcc076a3921b01e7f5ad65c453961a98fa4c3fc334379b7b7ebf97a5472a033dd20826da6ede8b990659857998eb4d8c5015733b442bc9d85585d08ada029a8b752c970468c56dab74f39b72379b4c6f980f47c611c23fd0fc1dfc3bc67b2b08881ea97490f47403b3c8fb6986f7a7d274b4c25c5b6fae756fb52e00c4a3e258ad0bdacd6a5d02e846b765c439ca26b5f64ad72e249457c29e710c13654f8566dcc4d6c018cd5c77c53e1e969db1713b18d86c3d181e9dcf5460d002a497805c08e32462a5d6bea061bd01b6e3db30b106c5e8079a8d5299d76a6017f7ade4313df6340798876111da96bd7eeb045165de97fb1f4a7633700f5d5f98314be2d8fae4b79badcf012075e399e87ab5302b865dc7399178d6a1554ebf02169aede2d84d0e34ee58e5a6033af1ce3873fa8e714ea4b9bd5c05d23981bd9bac37f034b87a35c164d01a63e6c9e926fd983f47d21056b0106e0573e34426c2a0f87cba5af1614eeac44f80877b7b4938dd74a67e16704e9284739093388f87cdf8644938f39dc4f910e02c9584b3c0499cdf01ce299270ba699e5d15e6cea992700e7612e720c0b983249c439cc4b903e0dc5112cea14ee2ac059c3bc5e1dc3230610aabf32e2bf33e5069ded6dd1edf2e141ff7c3d1726726d0de00549b2734ba62a36aab4f004d56bfc56083a429e23600a8bbc461fd19681efc8a249d512c7249d31e5501c25d990875baf079de9b0ddedb23bd5f2de0a60b6f60011bad4260bb3181e5452c34d1ae56faf1d65f53eb7d70920ab54aa90f3a51bb49cbce7e2e2c44bbb7a5534cd8757d5a773131ee2520b9d398285bcafe965a7e9be8fdbb8805734b703cd843124ce26e930673538059260926d1424e833914604e97049318354183990f30cb25c1243a6bd160760198159260125dac69303b01cc4a4930895b231acc0e00738624982e5601fa0fb6ec55926012b31dd060168364ce94049398e980067304c0ac6e4b98c91116d4c79c16637131c0dc53124ce20244837939c09c250926716b44837905c0ac910493b869a7c13c06f20fce8ec3e13a4857b667330a38178b7c9d09dba23952627451419caf461ad7191a5a4d80e338030f7c6d5b0654252b895d2cf8753a38cdd4494159e024ca15e081df4b0aca7c27513e0052592f05e56027512e04a96c9082d2cde288db02ca462928873a89f2714039570aca214ea2bc0450ce9382925abf82867213d857ce9782729893285706940bd8ae5a7eac64a5f9980ea69ae2b55d91f85d89f73bdd380de12816c2012a44b8308eb0d342d55ec24e278397dbde716884f4835aabe61919d41faf000eae4749de0c30f761c2f4f3ff97ab994a9b1d66a9d10964dae3ad3641c53d7c7bc163bc6f1c8921aad2b2e9a04b2bd15383963deb47c0ba5f5baed5d81cb5360a2d23ccf370dafe1f136577959abd2d86079be64add192470ff381eec4053eeafd1e3541886df9ef4e6a7c179e680381eecb05e4af3458bdd4379126cc20f8cc3773d2a2dde24d3191d22a5b7471529468809299b2697c3536e828dd2416dbbd263f7634a78f2560712d62301ebc17118d21abd454a1f1a83c24953bccee82081e0df22ef62bd8ccdf3aeaa35724cb6feacce92d8f560e53f847dc42c6f262acdbd87bd1156ff43db76ff894e0744372d9acbc1f1b04c1d16c7693dbd7993ba99efce827939c8e5e1926012259306f3328079842498c440151acc9301e691926012b7f63498c701cca324c12406f7d1609e09308f96049318dc4783793ac03c46124ca29f300de6a100f35849308907491acc4300e671926012fd8469308f0698c74b82493c87d3601e06304f880366b98ace7a909acdc8c5ea910703cc1325c174b1b6e94900f324195eece353bc3dc80155342785a160e838592ada7c27d1ae001aa553e2d0c4b78c36399eb2803919fcc3aa8d760f603d5522d67c27b1ce06aca749c44a8db1a4619d0a584fe7fb2df956cf7966de9cab6273fba2adfc9b80d9ed8c38dd1bb4fccd573b286d10d6a6b8f6e5de701e48e5994cac2baae677a7c148a927a64e2ca3f03f209d673131aea5a29c6f32d99bbab77d5a1564f46cc9705ddc9bbe09dbfe7324c3256aa56870c743f4fab992e112e75c1adc67615a388f09b75fc4d2e5bbe24c5623d5b65ea7b5dfe86cefdb6a0d5e3d106fbfa77c17b25af86994d21e27fa8ba8c82f62213f1f96b9f3d96134618df4f654eff2181522bca02dd581d81cb9a00e0d6621388c5d280926d1ec4c833918605e240926d1218206331f605e2c0926d1558706b300605e220926710da7c11c00302f950493b8c1a7c11c04302f9304937814a5c1dc04605e2e092651694283d91f605e210926d1f196067308c0bc52124c17e33b8702ccab9830975151656e7580c2de8a18e3b13b0bdc662a047735135c50640c8b388d4b68927c8d918fb042c5101f47b328dd0838af61e25c230267724dacc92aac673dda608e01ec429631a41f6889ae65825d57b5d693048310898a0f5a32965d600ebd8e89b86f04e264dde738353ba19a1b977827fccd48afe1f9e653b5de6f2ab826921a963cef09b0af67c25e1e260a3de336a8ed8dedbe219e098136d37e0213c20d4c804139c73086bee5a4042e46d2df00a68f1ba50175b138596fb082de240da88b7e2597c19c79b334a0444d130de832f0c8df220da88b290167c2237f2b136857959a66a881878b96e0aa8b0a71dd16b77b78fa892f8886375ada8b51f068df1e8776c916b994bc8a53c318688ff57500f30e49305ddc163d0330ef9404d3c505e77980799724982e6e875e0598774b82e9e271f23580798f24984467051acc3700e6bd926012f59c34986f01ccfb24c124ee336930df0198f74b82493409d360be07301f9004936812a6c1fc00603e2823e4b054614240aa95889614701dc0fa1013abb61ccc338a8d1a63f399eb5da2551d45de4f33bc3f5ae9116276cf80b18d0a413ecc04b94edaf239de746da6c9671b3838541a1508f1d47e0e0b700528e31e910e987892a701de13003f2a1d30f1744f037c12007e4c3a60e2899f06f81400fcb874c0442d000df072b05b78423a60a2668006b827007e523a60e27e9706784500fc9474c0440d020d7011007e5a3a60a2568106f87e00fc8c74c0444d030df00300f8d938ccd8c93548462bdf9d626c923fc03815ba58d0bdfc78261915a27d8eedd7ef1769d197a4baf6d2c0d11219ac01e09e67820b6a37a4175de262a4e8dd80f28538bca46c5ad9a6c9368732e74b9ae66b4dc860f2a234a0c4159e06f43f58805e9206d4c594b05f01d097a501753161f1e700f4156940899a2b1ad01f00e8abd2801275ad34a05f03d0d7a401256e9b68407f01a0af4b034ad4a5d280fe0440df900694a879a201fd1780be290d2851574a03fa27007dab2dfd57920f9dc39ccc0fd100a7a4b725c174313fc45c80f98e24982e66c8ab0598ef4a82e96286bcbd00e67b9260ba98216f4f80f9be24982eea3d6703cc0f24c1743143de1e00739124982e66c8ab02981f4a82e96286bc5d01e6479260ba98216f7780f931fb48a90ba2d77a6f690be54463b9acf3bad360be4157b59964ac983a8eb9c4fb5b7f150de8b2b4795385403f61024dcd76af2f0ed267a12d1dbf241c8e9b194aeae0bcfea964b82e068def01703f930cd7c5b8e70500f773265c5d0f3535d186ee6e357336a529e8bac36cfa45dc0937a25dc18a556a990baa2bf9732cb4df4272a22f996897f65ee8477aba47a0ca7cd8f755a221a3e528e909d2f81513d9f296cd929f16d3ddcdd13400f8357b16d4e81a54252c29c5dee52e3a159600b66f98d8f2329805e79aafd173213ac596aae48851a221630a0bf75b1064f32d1377906238dd32ead4f200b442ea377408717e270927559744c37906e0fc5e12cec14ee21c05387f9084b3d0499ceb01ce1f25e1a47acdd170ee07387f92847388933877069c3f4bc249cd3f46c3798d0a71fe220967819338bf059cbf4ac299ef24ce2701e76f727547c413124d77540e56a3df9968974ba02d48011c43f1d3b12c78c5a078fb8309af77da7239c1fbf09eca37c251435affe9c80ad102fdfa9f12a1121f731ad43500ea5f12a112fde768508f05edd2df12a1123d3c69508f01a8ff48844af4a7a3419d0150ff950895e8f149835a0950ff930895b8d5a7415d0fa0aaae02a1125d166850d705a81d2442257a30d1a09e0f9bff8e12a1123d976850cf03a89de2801a782e691ba82ef057a49a8f8f733102fe3578fc3b33a1ea4c36e54995407567e7a94aaeb59e066ebe0ac17561825b5185d995662b3f4115facf4d8b434d42737af80e74f54b3031e6dee981b8d9a7393d3c038ffb924cdc2de55f4a368bb858afe12b90dcae4c9481e239588e1a130f7e7ac9dc898b122d99fb9ea0915a8a89b66f0ada79898adf152945abdb33ec2700f6d22ec1261e0c68b07f05d8dd5c824d3cdad260f702fb557726ecae06b6be7c940a7235bab7a3ad5521ae6598b8b4b92f2893ee7fc8fdc496bd00deb24c788155dfb6b1c2e6a699c2962ec6256f0a67fde5d88f6e18b650e25d58c5c3450b59581ea4af071397fe227fe9f0cf44133c128d89c737085f2096fca559eb370580cbc7712eb2b9e4243fbe2ea661b9071edd9eec65649a99e3b40ac497bd98d42134783d01de0a4c78da1f2b80365ef95a257ac4513e0bdb20787c578c438b146cab712ef433c5ff5f2861f5179c625692b5d971310bd86878e857e6e3ac351ff125536fb65337dfc9473f1ace935838a7c364b00a1367fa1516536def2efade4d82d3f4aa12b1e63b89f52e984b579388955a669586b50ab0f66262d5ea98a627a252b307ad52babc09e6bea1812c63cda69bc36cda9b09b25fcad64a670bb1eb27d335d211951f3423dd8f20bbab339107a9afd2dd5eb9781cfd01e4770d49305dcc0afa13c05c53124c17b3827e0130d79204d3c5aca0df03ccb525c17451fbfe19c05c47124c17b3827e0e30d79504d3c5aca09f00ccf524c174312be8a700b38f24982ed645f80760ae2f09a68b1ad17f01e606ecd3fb3463689be6bdd4dec88167723b71af05907d99207ba8d04b39b4a7c7848f6657bf16f0e5c561cb1c68fc3bfd566382d7a90309de43006fc3b6b5a9fb4dd518a8c473f730961c1e0b1aa17e71cc8783dbe97cf815c8e4464c90416dad4c520311b73db4f42bbf8217fcc6d28012b73e34a0bf01d04da40125aad968407f04a0fda50125aada68407f02a003a401259a2868407f06a003a501256e9768407f01a083a40125aadd6840bf04a0f9d28012556f34a05f03d002694089260b1ad06f0068a134a02ee655fc01800e66025dd600ad3169fc1b2180aad8fb5b1f3a69e82e62a1ab5321ba2171b874052e33da3166be01e713695f958b5686d8f5a14cacba0048545d0e3f55c542be9f3c2dcc653048e63089ce86d42326cdd950816bec708958f39dc47a33683d37958895ea7744c3ba3360dd8c9df24763d55f3c43d5806943c7a1d3c07561cd9e0a66cfcddbd2a0115b7ad4452c94bfc35abe451c060d6d586b506105c2f189dda5eb068dc3619bbea58c4c73934d6542df1d9bbad31cd39904f56390cead244225aa3c68503f05a85b33a1ae150175aac7a3d8eb7685719a09fe2df22ed758e7a96a7366aa67bb72d11c15e6c00e748464b8c4e98006b71ae01649864bd433d1e01e04708b25c3256a456970f707b823d93b56dc5e851e23a38d0aa5c6a852cad52c136d5cc743492b6a3a53852847c591eeaf7572eaa2946e0e07d2d171a41308f4a5b3171f02da939e744bd8688d91a1362955c95199c4858a964d6e3bc03a360e57da4109575a6d1a5918d74195e6c2f8341c54c7b133db340dc8261785de89856d382c3bdbc85d76889e76b46567266c8eb66d4b75de488371baf2fd93892ae5ae5d4828af8215bc846f2cb6a9948999e7966649614778c0c7c71137a49795da44e2fd7a832de4e0ba36746d5864b68b03a63de40083b0063b19d1f60a3cd41324c17431a2ed75803951124c17737aec0630b79704d3c59c1ef301e62449305dcce9b131c09c2c09a68b393d0600cc5249305dcce9b101c09c2209a68b393d3604985325c17431a7c75a00730749305dcce9b11ec0dc316ee5af0de60873d4f4b598d4f082835958bb83ae68278958f39dc4fa19643ede592256aad99786f524c0ba4b5b56799b1297318d160673a00a51eeca76546c0027af20e840dbcb7523be098d1e7a4093c95200b95b1ce6b3421554bd9aab62d36cd2cc6707816673f7b8ed40b614bc3af96e9d79f4836262c447fc3916da7361b69c16474d36ed8beca7869e96528d0d53454f3269f9b5896d428ab63e308010a7019a1c6f0472bc471cbe1eb6153fb578f330e6769f56b36d1f704a28938473b89338ef039cd325e1a47a25d37036c0cc5a2e0967be93382f059c159270527330d0703e07382b25e12c7412e7923077ce908493aac8a3e1dc08705649c239c4499cdb03ce9992700e7512e76e80b39a8953fb5d95279d91469ba3a87bbe490b55886c4f36b279de9b0ddedb451e8519de1f7d7ca4216b6021db0f90cd8ae3a14d37a9cf70273321de0867ef1a4938873989f34cc0395b124eaaeb0c0de768c0394712ce422771f6019cb592700e7512e7ff00679d249c439cc4b91be0dc4b124e6a4a1f1aceeb60a3542f09a79b29a3ff049c0d927052f378d1703e0f381b993857f05ef886327d89eea86f00d66633df7e4eaf6a4d0b3fdd0820ce6dcb68b5e4d992e8f14e3b895f078adf79525052336dd35016801e68be1494f94ea2548072811494d490161aca4300e54229280b9d44391d50ee2d05e5502751be0328f79182728893286f0394fb4a4139dc4994733a8728f7938272989328d70794ff63a2ec1381325d1fcd64ef76a2ed9196c4fc1488c5d83fcef4fa7e07748783627836f975316d543548ef01ec537a547afd116a6ae267ba973b2d4bdcae2a84782013625e0653c05cf3357a2298a4c2bc48c90a9169cc44005358b85f817dc0414cdcdd948ece58e85d5eeebc26290f64f4e038e64fbb76131399270709d2b0f660617d09b01ec296453d7b5679ffbb2e8b1b00b443e3cefe9a7e580b356f312db0e53cd8281d16c7d63ed8285537ab3226ee39699ba31761a1393c0e8b50b98a8ea8c4e67cb974314a7d3868e08f60d7552f371987833912b74054afb87358f066c19c79641ceb37c6ab4df42ed70d8e4bcc9dd50903dbdedefb152a86c8349a4beb4d80f52819a7f7a989ad916e2a3f3124dc261117a5dd59988f8499f4e8b6d43725cfa42e66a1391566d163e24a1d39d3f8ad57a81a337ba232c4edd4911fc1e37f2c7b490a665594ce18e0d152e99e02f08e63c3d3a32e330b924e9c3bdfc0ab5d9c378106ef1616bcfd01def13242fbc79bd8f34ad37899b98eeae9d19785f65a586c4e8863864c6fdb3ec4c9ac9ba782cfe6899260ba9875f33480799224982e66dd3c19609e2c09a68b59374f0198a74882e962d6cd1301e6a99260ba78de3909609e2609a68b59378f0598a74b82e9a23ef33880798624982ed61d381d609e2909a68b75072e029867b5adbacd6fca2f72435ccb69a9cb46c361f26c26cad554e6316bc4079d1617b424e82fcf910694f8b0d3807605a0e74a03ea62e4dadf307b9e270d28f1704903da0924f47c6940894a391ad0ce00f4026940898a391ad02e00f44269405dcca0fd3bcca11749034a3c6cd280fe01402f960694b8b1e785fb03d04ba401252aea6840ff02a097b243096c49f31b5589aa340d357a57b8e790304185102f63425c57b5d62c1c93cbf62816e249b0d65f1e87a669a0d136a13be2d4c5092a6272a0a1f9cf9d030ffd154c986ba8646f632d99f3d558a56b0057798f7aaa1a0f67541703b3ceef1c82bd9209b6a74acdb5195d8fc03dd5ddde30975ec52e3e9f8a30886a73ef919e07d8ae6e4be531c6095195c78b5828bf05e5f135ec8738586aea603b5417d702437332dc0216986bdbb24e60f2169d6afea52d2a532136e83a49305d8c0eda01605e2f092671a6a4c1dc1160de200926f18443835907306f940493680da2c1ac079837498249b404d1603602cc9b25c1245a816830f70698b74882e9621a9f7d01e6ad9260127d3c68308f0298b7498249f4efa0c13c1660dece84b9b66a1af91b6a2a936b5696aae43c32f408605a328aefe18079471c256a355edd88af55775d013c08f0dd29475b447cd069daa27f405b74571c69a4025dba36a53534b1f34cf1bead22f1bb8614d8a9f5ac88ca109ae4ce01dc77c71d8139d5e351ec75bbc2782107ff167997eb9b31cf68dcf5dc3a8da91aa129ed2e00b4f7b465297a6c8eaa42e6c512a910e5bd71592b83d57f94a941adbb5c6ce4718ef92d7dada76da50e0098f7c5e1f3615bac9a56facd672e59b43974225829ef9706947872a2019d00401f9006d4c59a95c300e883d280bab86d1a0c401f920694a8ada701dd06803e2c0d2871cb4403ba19007d441a50a2d69e06b404803e2a0d28d1a64403ba2d007d4c1a50a2f69e06743b00fab834a044db120de87800fa043bb75750b77a82a95adda0f4e172b27199d52069f0e6b2e08d5121bc2765e4f62a350a66ad2299619a9bcd5587dcdb9184b61c9cb79f8a230d6a3a68934d21c44d3dcd08320db03e1dc7fc19a89ecb41af6433dcb9e8cff405007d461a50177d9a960395f2b3d280bae80bfa3848e873d280bae80ffa06007d5e1a50173defee8247fe0576406190e9b8dcbba8b11d65381e0af6f917d94130958bed45254a972aa94a7cdcbdf3cf8a2ac4f612135b6f95be5b03465e123745b4623907c20cf9b244a82e56203a14a0be22112a71734483ba10a0be2a112a71834483ba1f407d4d2254a2a28e06f54680faba44a84475320deaad00f50d895089db791ad42b01ea9b12a1124d7334a8d702d4b72442253ae1d0a02e0307cfb7dbd2a779a439d94f577efa54e29adfb50b09e5a560477a278e023b85deff41abae9fdd0be1ecfe6e1cf507d3b56a0e73d259f12c78acdf938473b893385f059cef4bc239c8499c17c14afe81249c6e7a263f09381749c259e024cebf00e7879270527376d370f685b9f3234938073b89730bc0f9b1249cd488631ace5d00e72792700e7512e702c0f92913a7365acd55da7f2e3596738231ccd59bd715a65bee61d4ad04183f8be354ae23e1e62580d5aa89dec55aa5a131ba9e54ed7a40f9795be667c0e6a67143b668119a17c3e3fd8524982e562eba1c607e2909a68bb55bd707985f4982e962edd6c100f36b49305dacddfa0f1c27bf9104d3c5daadff02cc6f25c17431dfc26f00f33b49305dacddfa07c0fc5e124c176bb7fe0c307f9004d3c5daadbf02cc1fe38e23b2c14cf6ef246e920e6661ed039ba49f24621de424d65b405a7f66625d2b026b74d4db98c44792d3ae1117a91759705f04b8bf48864bdc4ed1e0de0d707f950c97b888d1e09e05707f930c97b8dda2c1ad00b8bf4b864b3cb2d2e0fe0470ff900c97a85ca1c1fd10e0fec984dbab854d58d8f5982297966521bd01f6b57fc9c8e850ec3532dbfbd65af36a0e7b2a788e85761d40fb3713ed320a0314477aff4ef75854254215dd33e269610fc0fd23c94a3fccc99c4c87831cfe2b09e77027713e0638ff938473909338e7c39aae961284d3cd046cf703ce0e9270163889f37dc0d95112ce422771f684b9b393249c839dc4390070769684935a108d86b3147076918473a89338ab00e7124c9c5dbc173a94b0d6bb68160fd4a52c50f52a04b52413544b4525c2aeebdda48bc9d4d6ed10a2ecca44b95ec4239cae3a0375464457c6b12cc86bc383bd940b9089ceb734c89d00f2d22e4026da99689017c0f6be9b0b9089f6261ae43900b9bb0b90890b1f0df2150079191720138d2534c8fb00e4655d804c349bd0203f0d9097730132f16c46837c3540eee10264a2731b0df23700797917201343816890df01c83de3383cb7ec134036c5d00ecf6702ca15a4a0a4da0d68285783d3db8a5250522d5a34948b402a579282926a2fa0a13c10a472652928a9962c1aca9d01e52a525052ed043494cf01ca55a5a0a45ab06828af0294ab49414975f3a1a12ce81ca2ec250525d5018d86726d40d99b89327d9fe8a9caf783d64de5278644d5aedec0827b043cf2abb38dd675de9bb5dedf2d65e129f1fed55f44c349f387ce5721ce359838d751612e9ef0df314a9708f4f18e36266dfdd3c404768db8d19cd4e995ea87b1004f020bed9aec79b541cdf45e56187001c43106eb7423b725aad234d7e85de7debc3a196475ad3896a8a02e5375b3aa0fa2499b8672f52e21cab5992883f0de2aeb7adf9e6a38fc0212ba4e1c1ad04042f5c5fae375665d9fea9129f6065061f49ec1bf45de07f5f4a033a1d59a229754d31f2d5ca223ec00d6750132d1f44783fc3568a1d6730132d11d8306f96d80dcc705c8c403030df25300797d29075b37770db701ca0da4a0a4a6e1a6a1dc1c16b1be525052334dd2502e0d28f3a4a0a4a6dfa6a13c0c506e28052535313c0d651da0ec27052535ed360de5078072232928a909e16928ef01941b4b4149ad9a4343d9005afe4da4a0a4d673a2a1cc0394fd9928973128fdd34fa5d2bad0c989b34db9f7ca3d70352a0437a02d23a962cb12b58885f25240399089b26702a57e5c679a80c70aa5431f632b46404b00f33a201c24473f4f5424d31eeca76146cc8f2334d7f66063731ae64027b3946f0e8a8b0226cee5bd175a7d36dfacd3b5c618e7a725aaf5ba3ddb7b5dc55c6868b1cd45f06817b6e56627591e5dccfe5c09b238988972c5165016793feb9fa8baf3851d4818f7871972485b620c464ac5d88985f14bc038348e6dcfa076b7ed7916e6c6614c84e9a7144cf557d2d88956c8be2cb4b3415d315c2a5a6a790c1ada85f0e06f1a870748cb68533390139d1374d91a0ad69701eb6612b152eb8fd0b01e0158379788959a3e86867527c0ba451c9b28db3133dc4411b7f4b44dd4c3b003d8928951eb1bf497ce49f8784ef048e80cb85a8739dd6ca78abc9f66787ff4bb23d4d48417280d69056b79da1a906ed5b6074ebfa91af6169fe6813c1236515b33512e974039d86ce87defe39836f7b4d37a29b86f8f60c25b37ed852775071a53be9c512cc4e34021522475934f75d8a26df26f8547bfb82d67d1d84ab4d0ec435f03ca91fc59b4d67cc497472d8141888c96551a3c5a94d10c58cd47b56db8013618d3cc49ab26d60516a7d14cacabb4f078271bdc0a98306926b7652024668c2498c4d992067339803956124ca2aa8e06737980394e124c1733e6ae0030b79104d3c548f79500e6b69260121301d260ae02304b24c174d181663580395e124c62623f1acc3500e676926012135dd360ae0530274882e9a2e7f03a00732213e60a4a29f41b4ed5108d4be8e41738783ad7aac700e2f66c2b50548a8ae05fb7d3536c0f18273131ae9478b00bbdffc33a88a104c6a473a781fc18404e9661ec2d35601b4da880b60311179e4d59582bc1d85b2a032ba6a52ae42a862fef44c2ba0d2886a7b015c34d8dbf934c37aad5de8ae8574c33f36e018ffad4b60c60c1e6a8d9b76996cac701e50e4c94ab453cdec97ec5a9753aa9c1d0349ff71b61bedc511a50e20244037a3d00dd491a50e2d243037a0a00dd591a50a20d8806f46800ba8b34a0446d3b0de8e9007457694089b6201ad05301e86ed28012b5ee34a01700d0dda50175b10cea1900749a34a0c48d3d0de83500740f694089b6211ad00b01681913e8d2de8b72a333f2cfedc1699d868c96757b5f15229bced6b3d7a664d71ee17d44b75e6e0096192e449f769adcf50188e571587e748eede458cbf6a3247e1a6056306176f55e5427b49723955f48cc3dd95b1a7055b6ada2cdf5788a67c0eb72465b3a5563dc0f35cb70d72e249497c14a5cc55e569aeace4779f3605d627e9cecac0e7d4b78b467c6113f11a4dd096d8fc54612e73479d8d1c5c0459fe059109a521db7c9cc669e482edd4c3c22d2fcd65704af8d3d2562a5560ea461fd1da4759644acd432a134acd703d69a387271d98357a624cda8c399dba7ee2c9cd7c0f669b6249cc39cc4793ce09c230927d5a446c3590c386b25e12c7412e7aa80b34e12cea14ee25c0038f7928473889338a702ce7a4938073989f34a15e26c9084931a4349c3f925e06c948433df499c8f01ceb94c9c3d12380bbcffe799e080b9aad2797dfb3e3057ce63e7384a2f6c25f96849434a8bbbb8063c87e7b30dbb517117d186b512452e664b3ba9ef048ff8823866cc742de5c39c743c381de473a1249cc39dc4f902e0dc5b12ce414ee2bc00d472fb48c299ef24ce8701e7be92705243a66938bf079cfb49c259e824ce3561eefc9f249c6eba140e079cfb4bc239c4499c3b02ce0324e11cea24ce7ac0792013675e04cee840d5628f91fe9a5aef83da8733f0232955c971c1c4188d292cdc0f02ee8398b8d751c9fe231a69906b131d139bdfabba27cf4b80bbc3c1d201bb18b6752a48f0216de9dc98acc377d1e3e96215a23c9489b26f04cae442f4c566b69d6d7ed673f15cd3e4a8c54e67a5869aff8554b97d8805fb28807d988cccc7c90b5abe1ac99d73cf646565180f53c2e152aab352cd7ab429e13438ca1e2105a59b69519707a93c520a4aaa398f86f24e90caa3a4a0a4fa3cd150ce03a93c5a0a4aaabf130d6531a03c460a4aaaaf130de5a380f2582928a97e4e34941701cae3a4a0a47a2fd3506ed4394479bc149454cf651aca6e80f20476f0970e38acf5ded2ee3881fbc31873812eca4c7779a0f990ecae4288273221ea11ccf3de6cf0de2e3667f24683b146f991c53474abb3d08d027427b1d39eb65c147c8af9380d632d6dcb03184f6edbda2e5865089dc38879697ab0b0fe0c584f9153719d98778e9619f151382a9e1a47013c9d77a1d2cc8bb3e3f2fb5cc482f720c8e16971e82875f267bd1aa7aa83837f8bbc8bb52be33ca59d15b59e92ac58a32d40eb805c9e1e473e109bd922f911a7167ca03de4ab837ff2199260ba984b760d8079a62498c4f8611accd500e659926012b7453498bd00e6d9926012d3afd060ae0430cf910493e8464383b932c03c57124ca2659c06b327c03c4f124ce23e930673058079be24982e1e26a700cc0b24c124a6d8a7c1dc11605ed8b64a0ebf293f951a11252d2bdd45a04dbf288e2cb199c4b2131f745abcf05b209b174b034a94501ad0b701e825d280120f9634a0af02d04ba501251e2e69405f03a09749034a54cad180be0e402f970694a898a3017d13805e210d28f1a04903fa1400bd521a5017d3ac3c0b40af920694a8a4a3017d09805e2d0d2851514703fa0a00bd262e73709df27d8e623207d34eecddc16679ad8c9095d452cc6473705f16da12f0d2bc4e2a5a6ab0000ded5ea01cb95e46e95bf45522dbdcffe948c2ba1d04b6de20116bbe93586f0769bd512256ea619486753a60bd8989b59fb285b64e5623d5b65ea7b503ed6cefdbfc6a327a200dde157eb5a35af86994aa37fb06dfc78986fc22d6bc7b1e6cb56e96632c19e6a487d386b0f5ba45124c173d9cfa01cc5b25c174d1c3a92fc0bc4d124c173d9cf200e6ed9260bae8e1b42ec0bc43124c173d9c360098774a82e9a287d39a00f32e49305df4705a0b60de2d09a68b1e4e1b01cc7b24c174d1c3696380796f1c87ce20f7d7ec14d55d43da4a3e8c9c23ceaca358c8ab418f7a5f1cfa7d9de83f68d5f534ff03e1c47e3f13debaaab54ae898223b69f2b9234c090fc4813898126abc377463a5ca4f03984e0630ea14b0290bf121a0ea7b908958a7340ca2e2b11c6f91f7d30cef8f96da116a6a22e5000d242db3e23815827c8809b26742560799b934590263995169b2783dcca80fc7a1cd0f1e778dac6af1dbcd6dad5c3c3f758155fe91b8ada5e9472613d579b4b8e4ad60f67c348e0380cddf24d9db64a0930955f701988f4982e962caa06300e6e392601275a33498c701cc2724c124ea4669304f00984f4a82495c8068304f04984f4982493c6ed2609e0c309f9604936883a7c13c13603e230926d1064f837916c07c56124ca2d69e06f36c80f99c249844ad3d0de63900f3f938600667f6194621d75cae6ef760fe06305f9004d3c57d666f70b97d51124c17cfe6bb8364be2409a68b67f32701e6cb715439c2054877c25718cf51db984a3175aab9d82517431535cf00f02b32dcc2536d45c4f3114d3fff1028925f65625d2f65129869cc71c5dee58d5ec7ebbc2ef976ce8614c96d0f15ba1a01f26b4cc8cbabe852e7a38df49628574b9bef080fffeb4c807afa9a6e24b3126ac6f93678f716a5ed00db1bec1cf3fa4beb8c95bddc34129429c339b28107f12416c43d01e29b6cd92bf3465f610c68c9e0dc5b5836046c6f31b1e91ce4bedc2d348f6eb99ad5c46986868f16b3b92ae07bbb2d8b3a26dbca5d8ccf380b50bec344d927658b1344bd6b69accbc86e4edce4d0ece6c7c326e75df6031f2416d0eb734dc21b2e1647195a06bbe7c151e6bdb6d460263ff0439d74e2de09f444ef4b82e9a213f7ce00f30349305d0c631d0930174982e96218eb1880f9a124982e6e93b604981f4982e96218eb0880f9b124982e86b10e03989f4882e96218eb6600f35349305d74c35e19607e2609a68b61acab02cccf9930575599a5fa1bee64c2e9bbe040f985249cd450561ace2b00e79792700e7612e744c0f995249c854ee2dc12707e2d092755e541c37934e0fc4612ce214ee29c0d38bf9584d3cd5212f7a910e777927052cbf0d070f600e9fc5e12ce7c27717e00d2f9838c44bec52a35e124d597f83916da772177c28f71fbc0d98e9b9890822ab134efa2373b87587f928895ba4cd1b0be0cd2fa333b0d459089a652cd4b3ce2a1fb96eb59693e8419f517490bd470274b4a5c0bebfdaf927052934cd2709e00387f938473b093384702cedf25e12c7412e75a80f30f4938a9a6381ace7d01e79f92700e7112e70e80f32f4938dd2c1675156c94fe9684b3c0499c5f03ce7f24e1cc7712e71380f35f26ce5e2add18753c64127d96966521dd004cc6ffb565056df7e32b878012442d4d44d95b257bc9571a19f41b696f69fa1e0115480726d49552a0565b1f796a7d779a0ae45e082ee82805a48b89528e02909da4807431e0ff1c78b43b4b01e9621a8a1a00d9450a481793a3bc0920979002d2c5943d4f00c825a5807431f9de7f00b2ab14902ea684fc12402e2505a48b49f7ca60fbb3b414902ea6825c1d40766382cc53e97b79cc355fa37d3d26a9ca84f9b7be499a1ee204308585fb29c0dd9d89bba57400c9db761717a58f41e7be0c1365e09f144c018d2a93c223c433112de7c74450c72dcb44bb410adae9aa690e85f69d6de10c40bd5c1c13822e4da22fd41dd0736bfb71afb90e26841e4c94eba8307145f86fa977f94255e27d4c67ed1ae95d38c3a401aaf11a0ff27735982bfd347f34c0b4f4675b01e0e5d99baea01ed1e4c4e3ad93518df07ea3bf41d76f9f645203e9879f0692962364ac0a41f68ce3a14f4f79e7a2b264253077acc04419d8366d1baa642307b900042faa180ea82b32712ea3a212f405f3a47b7238111ee995e278a4d3f13da66a9b68327817c8e0ca4c94f9118f743647524c7f3adebbb6827d0098dc91740b14dc8255e2302267ea49efa21ffd5100755589508976501ad4c301ea6a12a112770134a8fb02d45e12a112ad5134a87b01d4de12a112172a1ad43a80baba44a8449d140d6a2d405d432254a2c58a06f51080baa644a844eb150deac100752d895089e72f1ad40300eada12a1120d7f34a8fb03d4759850fba964959fd6f4677bb0a5ee0d68b6d64f4135b86e1c2a197bd883ebbe7d7fa810e57a6dabddf29baa51640f009eee1f3c00fa3051aed6a254360d15236a0068010f9f83556a7d69405d4cfcf20500dd401a50e223cfcba40340fb4a034adca1d2802e02a079d28012cf5134a01f02d00da501259ef669403f02a0fda4017531acf11d00ba9134a0c4d3110de8bb00746369405d0c0b7f0f806e220d28d10a4503fa3e00edcf04ba9c0a5d23f1e8198333242dc5e0a92a843780092ffd32bb13bc0fefa97cef3d6d1725ee3cff613946740077dd8112b15237f434acb780aa6e9044acd410091ad65d006b7e5baaed926112cff08b58f3e98fa0b62b886375d74ee5cd95e28dc95b9f57b01c56f7422650af6de34c5e6e7cf3ab120f78150f19cdff7e0558d307b391618cc878d381993c64f92c64eb00b22171c489eac7b6d8d4890d8c67535599f948858a21f683f6b8de038feb5026c89ede0b1dd8a52d91daca539fe4565ba2fcc4c0c452d03423da32208bc3980883bc618109586f67e6272ce8c9eb724cee5fffb190ae08abf27026d2f55390ce36f2d860dd3da6162e8fc9256c140bf4c9007ad338826d7127997e042851cd418b00dd0236e99bc511c114ca7010a260735570319fd338c0b9791c1b75db99a7c8fb68ad59c2f46236cde8dd89f675daaef30050796c210d28d1be4e037a0800dd521a50a2e69d06743a00dd4a1a50e29244033a03806e2d0d2871fb44033a0d808e900694b8cad3809601d0226940891e2034a0f30068b134a0440f101ad0fd00e8486940891a781ad05900749434a044eb100d680d001d2d09e8204737f67f8292648c34a02e1e3dbf02a063a5017571dbf436001d270da88b1bfbd701e836d280ba78f4fc08806e2b0da88bca910f01688934a02e6e9b3e07a0e3a501757163ff0900dd4e1a50178f9e5f02d009d280baa81cf902804e94e19ee83b818501dac4a589e653b23560dd3e0ecba74d4eb139fa5e949637ef7838cf4f6acbdce2c9388927791aca97558872729c45d474424cdd72790454bf513ff29d289fb4c8f773c1325fca84da4d85e9838bcc258d09871c1ab4be2c68db82244e8933157bb4ef71bacb11513e69cb513dc8e75426ea55325a8e0a99aa3bda0cda1960ee2009a68bcbd1120073474930899b791a4c05307792049378d4a4c1ec083077960493a808a1c1fc1bce43bb4882e96216f17f01e6ae9260124fea3498bf01ccdd24c174b1c6c21f00737749305d547afc0430a7498249340fd360fe0230f7885bcf6983999c4cddc524d58b60935426112b35830d0debc7905275ba44ac839cc47a22602d6762eda392354e338df6332801345785519f0d2dd8955cf41cd90be6da8ab823ea6cc980751ae03aa3d50fd47dc443292df74d3f405bd99676a554391de6a407c9be807386249cc39dc4793fe0ac9284739093381b61b99a290927358b1d0de7e580b35a12ce022771be0538f7948493aa87a2e1ec0673e72c4938073b897363c0592309e71027714e029cb325e11cea24cedd01e71c264e9d574b3bd6d4aae926598befcc101c44751217fd5de3bcaed120d2d261fc4f85106be390c974b3d20e671e2d693969efe810e2ac9384739893382f069c7b49c239d8499cdb01ce7a4938a9ce0d349cc3016783249c439dc47918e06c9484738893386701ceb992700e7212e72db0519a2709678193389705e99c2f09a79bf564de03e95cc0c4b9acf7a23c297fad7f1a0a5ed1d0d1dcbae702ba856d99043d798e24baced20e93578136736f29280b9c44b9062837f69182925abc8c86f26f90ca7da5a01cec24ca83412af79382921a664043b907a0fc9f1494439d44f912a0dc5f0aca214ea2bc09501e2005e57027518ee91ca23c500aca614ea2ec03280f8ac3e5b035be70c99e9d4497c3b12ccc2741828083e328a8a7bf7886811cb43d2771090d1ecd37be830ae11d1287b7b15da181d5b4622a2cd18385f52ec07a681cb368e06d5cddece99c8892368b3e096bfb6171a8dcca553af93fc8497f680ffc9670ac3c3c8ed251e9e98ddc93cbbd01e4115240baf880cf0390474a01498cc0a4813c08401e250524d1458be75d04208f96029218ad4e037924803c460a48620e051ac8c300e4b15240122d8e3490c702c8e3a4807451b9710c803c5e0a486216241ac89301e4095240127373d1409e00204f6c4bcd65f241d1c5c428c701ca939828b56749b9f1c1d05fadbb39c6bca50b91d2b0d15cfb17a810dbc94c6c6babb02c73f8ef18a58b30273bb64c307585eb4de37e554c778b355f06ce57a7c4a1094ac6eb776694aa318d0691e4749cb42ac3f783b49eca4e5c3acd5c12565ef76bb4bab7c8cc0668a7c9c86f905a9459abd388671c5a4ed81341d17bba54b4f94ea2fd162c9167b0d7731d7156e5fd9f0acf3d6cabc1c37e26139bb643d5293f302f3540afc4fb40037381a119660b01df597124314bcf7243f561a36dc9e7c1e6e76c49305dccef3a1f609e2309a68bf95d1b01e6b99260ba98df752ec03c4f124c17d518f500f37c49305dccefda00302f9004d3c5fcae7500f34249305dccefba17c0bc48124c172b5c1c0a302f9604d3c50a174700cc4bd8e7ee6946f3e3bb004ef3da2d53f5e66df7946c9b03b64be3c036b05d60db1ab05d1607b68276816d2660bbbc6ded867e537e2d34e21e91560b6d0ca870af884302f3db85048e0509bc320e6c83db05b6dd01db5571602b6c17d876016c5733b1ad1b31dfa5676749cee24f433c8a857802f84f5cc344bc9eb23b024cf5b84c56256aa4f7f1b9de47f5b252e4fd34c3fb5369ba5a1187fd9ae66dd11fe4f8dab65cb7317089ba6e2f62a1fc1ed6edebe288020bc29574330b16bfdddc01d0452dcfdf6076bd3ece9a13b56abe9957ebbd9ff53450ec3538526deb3dfeba164565e27713558d9963f57523bc9e5473313fd58584b91202406f68db18466c30a6458c5631a50f2c6237b6650daae44831aac297b6e92a0019bd49124c1743ef0a01e6cd9260ba18ec340460de2209a68b2178c301e6ad9260ba18f4b439c0bc4d124c1743f1b60298b74b82e962f05311c0bc43124c1743f24601cc3b25c17431086a2cc0bc4b124c1743f3a600ccbbe3c82c546854cbbeff6f4c6a669af2633ca8e7ee61d73969306536754849fd6207ea30928cee424d3b83efa04288f73221aed6c2e3dcb4aade30e6234d531a6f0d8ff47dd28012171c1ad02d00e8fdd28012951b34a0eb01d007a40175b124f1da00f4416940894a0e1ad04d00e843d280ba58122e0f803e2c0d2851d941033a18803e220d28511547039a0f401f950694a8f4a001dd14803e260d28512547033a14803ece3eab4f4fd8d17537f5a1738177d80c0b6dbaa7e898a442784fc4e11216382ae873bbf64eaaf13a83be49cdcba88bbbd04dc0c5e6c9785d6cb40ea94a6927af716a64a49a6e88d13c11b17661613d191efba7e270024b2f5cc5c530aa636112783aceec4583c069b154b5d7ec4557823ef419592b7e8193aabc599d43a0cf4a03eaa22a6f26007d4e1a501755799300e8f3d280bab889da1e80be200da88baabc5200faa234a02eaaf22603d097a401755195b72b007d591a501755793b00d057a4017551955701405f9506d44555de3400fa9a8c4490a5aade406d50334c73b3b967fc7b3b92d04e87988ed7d9190d8333be8fac5c55c6e5d34493cc135488ef8db60c39c4984eaae2ae2b2b68eb1278c8df8c531faa3549538d9e7eae4a0d394c8ee424625dc492d033411ffa1613eb062958671a93089a41a678df549108ec6e68871afdf9a0d17fbb2d5d6d5355cf2ea69dfa1c16a67724c17431edd40f00f35d49305d4cbcfb09c07c4f124c1713ef7e0a30df9704d3c5c4bb1f00cc0f24c17431f1ee4700739124982e26de7d15607e2809a68b89775f07981f4982e9624a969700e6c79260bae831f20ac0fc248e337c3a3093d3ae10779cb4a0afae70b0fc542256ea469e86f56690d6cf98587bab50f7e9fbdd4d53c5de9b752af06b1ae73530424d4d842aba9c84ad2f78357d1e47a6bbd0adb156351a3d5310ef59a22a4d638d6aa68a727274b742faff6042f88209b9570b1342d8759c0e889baa6559486f01a45fcab031157b8dccf6beb5d6bc9a63a60de2b1f43916dace80f62b26dabe2953429de9c2bca4bc7641febb295e0735d8e0df22ef5dadb29ee7355c6b6665ead4b03a0bf60600fbeb386a62a66b7c763370ec38c0f98d249cc39dc4f934e0fc56124eaa8e8a86f308d8c17e270967be93381f049cdf4bc2e9a6a7de5780f30749380b9dc4b912cc9d3f4ac249cd7f47c3391070fe2409e71027714e019c3f4bc239d4499cb300e72f71641ad3baa9398bd3aebb9d69ac1a7450bff275fab5e623fea95deb9ffce21523bc8fea6fd1ae6393cc6ff4c19206b38c05b34a85307f63c2cc8b78b06d8a91b9e66bb47a6492d2aa113fd15ba9c25851aa43ee1416eef3e0c1ffbd2de39751474a353ad3b4a4abc034f0075b15ad218e533ab9a0d6f09778af75fac1c91e9372e3e9ac3b342ea17b0aafd36ebbf38dacfbd7d320d77420415e1320ff198703b996c779e0ae1bcb52452b90b6029c91fe6a4b07f2e4c7ddc554eb6700cabfa5a0a44681f2664e5884fe918232df49942f8054fe2b05a59bb514f607a9fc4f0aca4227514e0594aa9b1094439d44f904a0ec2005e51027515e06283b4a4139dc4994fd3b87283b494149cd6e4b43d90b507666a25cd17b51a5c278b9c08f4977d94f7bd5c8cf5c4f73b0d94d8518bbc42191617c6773271d176b7afc0e12b90413654f152a87671a7d7a85d1acd7c775eea6f924dd06d2b824fba19ead92ab19070fb6ff482fe43fd46359180702c6ae4c8c2d57dac4506d74462446c5f5a03de080752929abb79b73e54d70fe5e5a0a4a6a3a405e954dd89e77938232df49944b01caee5250ba59e0ec5040b98c1494854ea2ac0194cb4a4139d44994ef01cae5a4a01ce224cabb01650f2928873b89b2160e8ecb4b41492d734643d91750f664a25c498576ef4aa307d25d1da7824213319dc469209f5121c8159820d78890495b72bf543f226224102dbffce320a12bc621a183daa9843e0512ba921ccda58b45c7af05995c998952abb1eb94ef1ae87f2839fb9c7be81a400a5761a20b1cac6d8e81d89c3f37ba98de670bd00badcac4995ae1482f30f3133ec2b605687c8ac2981a8ada9785f82678d85763220e42aa75a0bfd6a46712e34bf575a345f9ae0fd2db8b6dbe683eda62a1f9892aa10b59ceab13e168d9bb2d310623a562ecc4c2f8053ce8abc7f1a0b7bc856f3a83521f74da1c7a3448e81a52d1523d336968bf01a95d330edb65cb6893d34d534bf2fcc3ca287f37605d4b22d67c27b1d600d6b52562a52a496858a700d675e250920c6fa74a92d7540872dd38b652b6e369b895222e4ab4add4bf104eb51efb316f30a7213f7632f049c242125880b7d2bb8eeea7444bf5b73348671f26d67e2af9b49feafad590f6b62a396d250df92816f2fb60665d9f89dc6b5be95213752ab6606b5a38e0fa20a71b30a105d913ed2929b7f3fed70fbd4e4c59e7fda9f1be6e8cf9b896699753546e08736c5f26649d5b41bb73cf37a928f59a5f632283ab120f7d9583f0560209cd63c39b6656713f919f5e9c5c4f4c712048de864c78cb2b7b628af021a601a405115482f4f58b63bb6e53d8e1ea4c3cf7fcc70279369485daa8ad2431cc78ec9e249683246e1cb7622e7df306312f37cdb83112768e9bc4b1c4e41bdb51706c74fb1c3e009698fe4c78abb43043263b2b50956e34981f82240e90049398d98806f363803950124c17731b7d0f30074982e96284ef1f00335f124c62b6771acc7f00668124982efacb75816d7aa12498c47d250de6920073b02498c410551accae00738824982e06132c0530874a82492c764b83d90d600e63c25c4b45971bf18b89ebb2e2edafc6f53c58dd87cb70432855c9d11ac4d99416ab51065837958175aaf2cd69baa942aeb45ede8984751478cf6dc6c41ad4c90a23371a3c1aa5ed7002f80c2475f3388261d20b4370b190f8bd2a44b90513e56a2dacfa4d8be10c61aefc34d97c1164734b694089fb521ad01700e856d2801275a034a0b701d0ada501757139ba15808e900694a80be5d5c002a045d2801235f534a0f702d06269405d2c8df308001d290d2851634f03fa30001d250d28f1344f03fa14001d2d0d28f1a44403fa28001dd396fad1e44327350910edd87924e847c74a82493c72d2601e0d30c74982e9a242e45080b98d2498c4458806f37080b9ad2498c42d12cf711b60964882e962ea958301e678493089c74b1acc7d00e676926012951f3498ff03981324c124aae66830e703cc8992601215c734980b01e6f6ecf06afda53ae0af4c959b46fc58f5d400556212355a506ab50a314e8ac337249df84a3d8ca0be8bcb719579107a30398e0c75f6621053923c99a8f3677716ceab0167a9249cc39cc4790ce09c2209e76027711601cea99270163a897345c0b983249c439dc4390770ee280927d5ca4ec3b93de0dc49124e6ad2291ace2b548873674938a919e768381701ce5d24e1a406bdd2703e0238778dc369d60633ec3a665b201a3668c90206c2e97d3726d265bc17fa50a9ddb9f545a50a7de369e0687ef1fd4116779791feb4d86b64b6f7adb5e695be7a1ad37249ab80590132398d89564f541a976e605c02e9c8043ef7941cdd4022f760625b414527e80b93a6942857d3f14d0188654c8879193cd673cdd7e8877b92f20b4754369941a9a9f8a6b0703f006130d3db32662379ebee62d8ebaa9078bf3c8eb21103cddfc1bfc546f35eee51a94968e3277baf74e7b4c48e53984d96ac46a6213e1b0e9b1532d6fce44920df5bbea8c15b67b2e2e186c1445029a5fe1bf50c4f93d253602298210525f5fc4e43d91da4b24a0a4a371356dd015239530a4aaa8183576f0ba4b25a0a4aaa7183867204a0dc530a4aaa618386f21140394b0a4aaa5183b7cf0494355250525d156828fb750e51ce968292eaa6c04b050428e7b0d3e6cff3de6cf0ded6679d32e5177da8705029375285d06adb52feb0396a261a5e520ad841d6f193e36b2546b99ae94960bdd169d69b667cd5867b72b832c8e15eb26ab4ba18a9b635c8627d5be8da8b95f6c9d4c51b7443babca87b0bca7890c986380a33694d6558e12a78dbf5d20db703c6c6788bd946eb24c7243e905c858db8e5799185f634403b576e9d60225a5a2afda561069dc744db5385a9f46727bebccc78bebbfee01f02e688f93252f3a5960925aeedb4c28bdb83fbc1028958a999646958ef84e3e3428958073989750660dd9b89b54702eb20efff79c6d83b37be3994b6075d0696a17de23817f9d6f2a9aada6ce86b93ace4a38d8cba6c21bf0496a47de358d5079a4d53b2234c2c1249732c5c0710ee1747706a7a27756a627dda16a92bc0fc9f24982e2ae0960298fb4b82e962de8e2500e6019260ba98b763498079a024982ee6ede800300f9204d3c5bc1d9d00e6c19260ba98b743d71c0d601e2209a68b793b1448e6a19260ba680f5a1a601e2609a68b990b97079887f30f91b52aaa02b0ee7690fa84869016d6570133e5116deb76e037a5fd37a81192c35828078282edc83852e66612614e9c2b6951bc8fc3e37d9434a0c4f99206f449007ab434a0c4b3390de88300f418694089e7735ee03e003d561a50e2a24403fa28003d4e1a50a26e9306f431007abc34a02ee6eab81b809e200d28f1bc4e037a2f003d511a50a29e9306f43e007a9234a0445d270de80300f4e4b8529886ff8e51da661e9ede1b173bcbfaa7f8854e5bd6b705b8a730e1f68e843bc934566b5422a3cc695e5fac071103d4ff5850df5221d4539950d756c95558b542a4d6bb4ceb9bd089db1e33e462c4d00110c7761a3b5f57bd0a53a34cf048f8a97ce62662878abc9f66787ff4bba133180d69050be90890d8d3257ad11530b7ff342fba09e0f3798644ac548f111ad63b40777aa644acd4543f34ace580f5acb6d4ee27c3242a5216b1e6d35f61893a9b1dc8a5f378a5a6ec9990b032e9a62a4ca7681069c185ebc1a2740e13623fd5d4fae907ca4cf656fb6dbd4e17abd41c880de06c1bfe14467552b75617b1909f0bc78173d939127db9c5dc73fe06cb3d491d02927a1e139b1e415de2f8995a9e649c0a92a19528729e449a81b900409e1fc7231f9c9c6637a9f5625be953b163aa5ea202905621667958f52f60fb98542e9e1f272530961812d5e6e78a94458c0693e665bf31c8ef85ec6402811a4507255419898d2544819624f50e8077511ca9265bded637f7b0134dd0b4877d0ac4255d1cc7fc8a88ff6f6ea916800ee092b8b37ba61fee4db4ffd382bdb786a5eb5226da8216d1fad23cdbfcec0f444f1a33945f514e973c0bae1cb5385384def9ea77ab136735aa7c3fced21a54c39472990c654cf22e823a53d37612978206e172b9d306d15390366d1c08d3c6156da9e7424b027506eeda8584f26a407925df7c18ce9dc5069d6f289c65201799b97656a2491df35ce935454cee46b36fe9bd7d00f52a39756487381942b12c6cbfae9604d3c5108a9e00f31a49305d0c22ef0c30af9504d3c520f2a501e6759260ba1844de11605e2f09a68b41e49d00e60d9260ba1844fe11ec376f9404d3c520f24f00e64d9260ba1844fe36c0bc59124c1783c8df0798b7c4ad53b2c144dd7f01f381a719587ac05274ab44acd4641c34acbf8006f4368958073989f51ac07a3bbf3040606f9aa86a0c36ad91774fb7a9d32906d0ee90541a7ab89341e577823fd49d92700e7312e7a580f32e4938073b897302e0bc5b12ce4227716e0638ef918473a893388f029cf74ac2493564d070d600cefb24e1a426b8e6adecb051ba5f124e6a767b1acee5403a1f9084939af88d86f37d90ce07e3a861a351b5bf1a366f00c687e270c7cd4f399fc7008f76942c82f3f7c332ca9237f519a5fadc3fc742fb0ca07d248ed9d2365716791fad35fe4765debbe41292b4f09bbdc157ee514938a9c54d6938ef049c8f49c2492d4945c3590f0ffbe3927052b335d3705e0c389f9084b3c0499ccf02ce2725e1a4567ea7e1ec0073e75392700e7612671ee07c5a124eaa93020de704c0f98c249c439dc4b92be07c56a2e197aafca0197e1701d6e72462a56a3c69586f8795fef938121306b1f573166b93ec7e4a2eba7c5d0872fa8234a02eba7dadd63904faa234a02ebacb3e07405f92a4951fee64bef15bc0c8f1b2249cc39cc47916e07c4512cec14ee21c03385f9584b3d0499ceb03ced724e11cea24cefd01e7eb927052a38a68386700ce3724e11ce424ce1b5488f34d49380b9cc4f917e07c4b124e6a1d5a1ace5700e7dbecac8ce526b3879ff6ba514d3569afaa99791468eab97d00db3bec3ce1cde991c2aea316892889b4fc8c1b4104d1bb6cbfa406936dc6cf0c1ad45cd05d0eea279628729a4b9a2a6e2a48e67bec7ca1cdd5f54c3e93d340d252a55c0420df970292a81ca681bc10407e200524518749037924805c2405a48b553e0e02901f4a01498ca3a4813c07407e240524519b4e03793680fc580a48e22e9206f23c00f9891490c4443d3490e702c84fa58024a68fa281bc00407e26052431a9190de4f900f27326c8a50d487d89fe6aadacd0291f5d2cc13707907dc1d6ee34780dccf12e4a4d6c4ec3d69785ad3760fb92892d4fa51f9e32d77c8d0e52c1b226a52a391f3171869cc2c2fd0638bb7c1547d2dcf40e882eaeda1780ede6eb38fcdbecda71acb495ec3848c3da8385f5059810be6162cdcff18430c5eb5745623e1eef5d5b612609e2997d322b17fccf9dc35bf02dbbec59584ba648e9b2a73af9737ba821b309c8f1776d9949ae6970a07b36a03dc0e9f57b493089da761accd900f30749305d0c1e1803307f940493a875a7c1dc1660fe24092671234583b91dc0fc59124ca2f69d06737b80f98b2498c493130d6629c0fc55124ca2169e06730780f99b249844bd270de6ce00f377493089ba261accdd00e61f71e89a8238a0ea66754d2eda2c978613f99f717862dad476d89c9fc9c3c590bf6120997fb1151c417d576de26884f2ce3165e5a2c9e460d07ffedd96f5d79265d2c54a2d67833cfe1387ce131fefffaff3d4b7e03f90e67fe3c83137c8fb3f6835a6a9a0530712bc775508ef3f26bc8d23a68268f9b5cbec48d3e972f3b57546c2c9355b4fea44c29e0fc63c1db64075e30ef5f4bef3761050e0be097a4d90de0e4c8ce967484c85aaa70be2798a86f64a90d08e6c096d6edf1a8c94ba3fa0cdaf23617fd0898931a8f71e9ca4fc3d6bb68e12c4b995e628711a9cb83a3391079a80f44e5c439dac91b904c86f1749305dac91b90ac05c42124c174f5e9fc1b67f4949305dac91d91124b3ab24982e26fd790324732949305dac91f929c05c5a124c17b5a74f00cc6e9260ba982ced4580d95d124ca29b180d662f588096910493e8264683b906c05c960953db9c6abdd1377aede9bf53951f41d2003f5d40b5e91e0d27ad0ec73015e25c8e89b3657389df94362e535d1e86b1508e03ad520f26ca20c1642659935cac53b41a3ceacb4b034a9c3b69407b03d09ed28012cfe934a0cb03d015a401753119d58a0074456940893a4e1ad09500e84ad28012f59c34a02b03d095a501259edb6940bb01d055a401259edd69409705a0ab4a034ad479d2802e074057930694a8f7a401ed01407b3181060931b4a3635880b4fd383bdeaa4290bdd9ca90006495f70bad599aeaf198ac4a8cedbdccfb883eb95798abeacd15349c34d7f08d41ebb97a5b2a4330729eaa0c59c442f9332843d68843e76943993c5f524d1bb4c7fc38488cbaa624982ee6503c1560ae2509a68b1120a701ccb525c174329722c05c87093348291d5628aa54f313295a92b162da16e2ccf91f0be9b2b00cad2b6745276ae3692bfa5f80723d26ca203a295fb5bfe8a44d6187d9276ea76ebd612ff6ba5d61ccc3c1bf45dee53a15fa3cefda5ae31c4b7dd46996ccf3413ed78fe35039ac9d1e2a7f5521c80de29833d3735770d1c1eb0c40d9370e947acef4a388fcb495ed472a6f8399338f89728d04ca466f56d42520329937894661dabcb91428e336940a96b861a281ed0060fb49054b9c5569603bc254b09154b0c4d33c0decdfb05c6d2c152c51e744037b3580dd442a581737fd8703d8fe52c112dd1c68605f8639768054b044871c1ad81700ec40a9608916271ad86e00769054b04427471ad8ce00363f0ef7079b0eb569fa4b6ada2c9a99f944d0f3174803ea621accd30168a134a02ea60f3e0c800e9606d4c514c24700d021d280ba98acf52c003a541a501713b69e0b40874902aa1f7817f3d917760e810e9706d4c56a0b8300e8a6d280bab8287505a09b4903eae2b6694900bab934a02e6eec9705a05b4803eae2d1b33b00dd521a5017b74dab00d0ada401757163df03806e2d0da88bf9ee5707a023a40175b11a436f005ac404ba7a04d0e89497a52a39b52571374aab4c3704fcf78ae38865b2c92936e71713703183d309709e1fc9c4d9538599c3eb949f1347e7caa98bcbe58c66f81807868f514c84cb782fcabcd157184b91fba9ab75170370a3e57890ba983bec454039862d8333cdca5c61d6e87a6f81097c9b8989ad68057b97007063db7239695ae8d445e5db19b03a8f938473b893385f069cdb48c2e9a66af84270b5dd5612ce7c27713e06384b24e12c7012e79f8073bc249c854ee25c0be6ceed24e1a46659a4e1dc0c704e90847388933877029c1325e1a4e64ea6e19c0b38b767e2dc4025c7c4eb0ed4793f9579af2bcd257394bde64c7b50c0ed0d7acd494cd46ba7a09e692ead567b9b537ca32a6b51965d340e6f0a923c998957bfa84e48a97b98965221a65226a63c15a6b40af497d3d418a553574d329dd112a7552015298ff704f3db7af3657e69497aca2bda437f2be838a7b465029764551d75a34f53d67d078ff85449305d4cf4ff03c0dc41124c174b9d7d0630779404d3c55267df00cc9d24c174b1d4d9bb00736749305d2c75f63ec0dc45124c174b9ddd0c30779504d3c54c38b703ccdd24c174b1d4d9d500737749305d7494b91e604e8bdb9dcb0613f32e5265f460daba0edaa43d2462cd7712eb6b604b2a9388951ab941c37a34609dcec4ba8e4ad63a0d04add344a36e5ee87d482b9d673571048b41cf447309fbd6e89996ec92d2f8e8268d171bb59b56f5969bfefb8e5dfd0da2390918e5deeb12556d3eb5872771bb787f32bb2bbb797fa27edfa1c3725e8f46a9055ef7f46f757b15a6edd9debbba670d6ae078ef92722d249b268424af4337efef79097560ede21ba97b9bd7a1abf79efefd74ef9e5479fdaef5feceebb074d26f757ffd9bedbf33cffb6479e2daaac438f23a78dfa9c28c93a9efea9ed778bf9befbde35f5563b9467f53b99ae98d533fb77a9cf8fdda25abae0551f4fb52635a6feab118f6a5ccf834eaef8e6ea1c1fb8e39de37347db7799f48fffdcac5fd6ffafe8a49ef6b819d67ded1f7a8e9d5ab265d3d29f17e89797eaa1352d0d2771499116b5ad1572f6dc61be6661c6f1e8d99de3b2b347927f9b3baf77e1647ffdada1405f408efd3758927c6efbb66e64b655933ef05f72f59bd9dd761d926772ff58a6e70ef52dfeb9e74e7a2de0d99a5bebb4233772df5da55d2b867cdb79f7cc752aff525acc2b415d557edf83c3be54e4df15857404ff48ce4cb49ea95c9e54317c2d5ddcdf3173852fb3212bebb6ad2bbc96da61a26c24fadd4cca742e90aafef01d7db7baa09541986d3d318d35cefe74a635af1bfafdeebef5cf3ee522ab9d46ab177556962ac999660f5bfabbec9b7149b6bf23a2c1ff9aedf72d05e43e2ee37bd4e5729dddbdcfd9522df2f35eeee7e85147c2afd19b1e9f5bea129687385c86bfcd5c8f7cc0dbfbf67e4b563e06e9426668c5e91578e3464fdaa2d45de4f33bc3ffadd116a6a8243a69f0c2de33ee50ab316cd593c939424669b71e659a832a35831adeba698f5395865eb3d6235295567fc392b78af386148ae5fbc97a84f485970c548afed0509295b0e7e3fc18ca6c1dcbfc9de9d2b339ff6ef7670cd64e567732a6f66e65d29e9bb5a269dcef5c817491499f9319061bdc9ea60f84f5ebcb6569ad5dd9f97ca8c8cfaad0fd8cebbacc310ef2f3f8355ffc5b9abfc7dd86cef8fff2af87dcb6dea5d55f3ad55e8ad5387e8fd754dcef6832d8dc8dfc2eacfcf48f8783498dfb634d296c767df5b766fe6ae0c98a0ef457b1e7fa5beef89db6ec4741523c6b8644ef02ef6a71afd5f97ff07a72e9bf8be750b00 serializedProgramBytesString: - serializedSignature: 83185ee5ad7b36e34d1da7e69ba77b52114ca09c61e62cf06bf71a2f3f33a1ecc5eea4fac3b0a8472e109d131207e28de83114ed3d3c76a00b6aa5f45d2b4505 + serializedSignature: a6e288311fe34192bd04850628145a95526ce3034926c6cb1117440daac4b4c953374fdfccaf9059110027f29e44fd12da3bbf95df8347a5230d5ca0fce50008 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset index 69b58f8..a111a1c 100644 --- a/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset +++ b/Assets/SerializedUdonPrograms/6657daa4973ee1249aae293810e8bccd.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd4fd350143f77ac1b53105111303ef00646a00512dfe5432051241bdb8b316340c1990d966d107cf4d5ffc8ffcd047fe7b4655d7bb76e4023206b766f7b3fcec7ef7cdd6e0993f051b3680a94a5159aa73c1dd0091de36e057d1597f3e48d6f531dfd11da12e666692a62277fa6d504da4d3c35a8899da7b48fbe2cf339b271bf89bd369e78f4105f1bab54129bf2b44a9f698bc6d5580489826c6ab8638af552836897e907666d118a999832358e26879986cc5521b4b7ee0b7d15b5aa98dbc79e3a5540734f280e6ef05ed149ba44eb9132eefd80db2bdf18f9c652f8b266c6c5c5c51f4389961be05ba21a9942f04d1fe6f076461b8249a712ae30d3c2b609956b20a041232f5837698916b5684caa219fdc2bd296b0a22c44995980c5ef100b16ae82cbf699b281f175f10436661933f3f4113defdaa50518e74b804a016c2b70079b76d0d684de2ec40eaf8c5289cd1edc93054dc72bab18f100ade1b92212e6a43d13496d917e13634d89916344c932fa73e116d6bd8e7b1dcf1d1732bd8c7ae7ec34ee848067a65568c3d29be2a30f16f9171661e853861b8649936344fd0a59e2014327c91892f41d1a0b4e1a6d1b5b24931fd5cf1082fdeb18d6d0f3ef5e93f1bad4441b056b8fbebb51e4f13d91086289bc68cca23f1429787cdfc5a63b2f0f293deec94b7c5afe6372bd516b7d9494f8b5600913669a057b1d61b86e6ec39acda829ad6adedd32f67e83a06792ce4eb157279e6118ed7eb544168b97160eb70c3c2369b1a183c1a174c1c1d95fe5620d8e76cacebab2aceb16ea7a076671e7020eacb74c462c133eb744f1ef845e42839ec58f8f343165b1e73de649be318c4c404216b0039f011d1f567b484e65ed7c146b69c30e8ed76cb9be15e297e9cc2fd989dfb08e5ffed2d33ddff37b9e5368d8330ee5acc79eb179b972ed52ceacf8bd0dbccf64f53c1571e564f600144fc55e4cb7b5c759d1b2a4df8ec1b902f69641498f431a97526c9d35a15cc7ce6dd9c14f0d32e5506ef511d3ccbb0adfe1c3d10e34df9328898ed4275d4edc873776f88ad24267b5799fddfcdaf55e80c207cdb4ab91470b484becdc374d47d8aade4b5dc26447536fafe84dd1523c656e03bdbeb545653f8780974724bd14ddc0b0e58d9e0d12c9c55fdb745ce6848057b96fe055935deb3de0399022d1c0c51f0ef400f10f31bdd2f45ad5c251312279e85caa7f5de81d04a38433ffad937cd4efe5331d3ca5956af529d2e26dcffef32c6871167cce2024bda46131642fe28eecf0c121c0e53a67ef4c5b8c677a51e12a713e2071ee0036162760c3e2e0450d6845b2ee2070ca07dccb38811b72812bbb3fcd96dc179958614bc5051bf9601b8f13b694502b61fa88ec70d1bd035025ee4f09b6d88927fc756a2664a0990e39d5a981a3aed6ecfb9f647d095c4ad2b7eaa1c95946bda3fe0e8bdd694617ab497f290f58ab72ab0ab04ed3eb14e3a12e5631f9edec5eebff8a9c3f9bdca49636c6e5a89687e51de2fc2b555dfe13abcb1ae32fe3a454410f1c0000 serializedProgramBytesString: - serializedSignature: 18e75b829e5ec66dd4ba0302f2c9f8c67c596d34a505338f355d4fc9d293945f3f69fe5b23b82f549990856936cdc0352233adefa651c23905ef0e749f422801 + serializedSignature: fe8634ef23d6034397714a47a0bd39c491223183563edf67c84081b3fe36f78144ae2ecab366c3442975d9011328f0794b62a1a463d9286066b4fbed2a4da10c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset index 11ed7a6..80f256e 100644 --- a/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset +++ b/Assets/SerializedUdonPrograms/667c46fd2864a124ea921d98d4914fe5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5bd976134710ad913d5abc22b02db305484850007bc41242c8826d6c8813b66359ce0327c708231b81bc449601bf25aff986fc474e3e24effc09a9aae9b15b33dd331a5b2d30413a9ad1f4525df756757775b79470005fd645bc2cc01cdc827128c153588735fc760befabf8769fbcf48750c7fb0a5ecb9877114e47d4a4d7396b14afb3f8b4090dacb9054b78af727e112af87d16eb56f0895297f153c1525637562ac1343c80fb90b38623442c70a54d9166112e2b8dd729d8c6dc0a2b458d389c95c34b117336396f1595f6ca3d825f19d62ae62d619d3ad450e61396981ec5abc598f89611f73efc24f133283dd3bd47dcfb45fe21e999d0bdf195ef12e5b2bef46e917ed8976e8bf423bef4a4f80cf9d253227d583ca7157a50fe8878ee15f70109eb80289313cf099147b212b6c556fb11792cc3063894697d19c3bdbc9ad18e45a29309d716e861d46c034db8810214d62db1ef34e00a5c565af7a8d527e97d8baf652c5165a1a3c126fe093441cad5f05d915c7313d3efb06793735631671ceee29d6a3d864be86c8f7c5216b0d91aba7705e6f1bac1f21ea3dac1925190c88dfd75e650a6dbcb5631c52374039f6bac6191af2f59d30a6b3f8b690deef36bd8eba7f0fe9a5b0b62afe377559bf38232b58eeacea64b77bbb467a6694443da3bd46f3e5ae49d588487ac51d10dbb1dea23d69f014b7ce4d01d646c9ec45c1997dc69a429ed3238f468cd05188c8f318850eddf2edfd7e06a2816353364eee38c60d7c2336f8efdf5efdf85b77633b42be0d0b4619d888016462cc9cb5b230109e1106cbbbb408afae9b754f4d31469153b48bf5baecae5e21b20c93353b301389ef326cd223cc38c3aaa3a0e33a84499d5ae09254b0ca9c6d35c55a43dc4e732364680ee71d0e406580d4e0958b5901481455e31ed4681d39926a1324dbad3a6891e8bc24c93dec1b56b1a7aa919cc68188cd241c760978ac14ce79ddbb57d2d62a4543348e1f3a9008313136a067bb53e18ae838ec16e0583858c8892836afd3e61677c6a91461ae1b64e78bf5238c4129ed4091f6883f0944ef8a09a969b7184a7555ecbaba8f90e7a2de5adb39432968defb7b4ccbbe06742edb45976dad100b86815746e9b51d987783dac188fdee22b609f8cde3e3d2afbf4767a547980f09f831bd5c7b70e2d96c77c3ca88d33a41951a2dad799a657c51eafcdff30ca5eab8bef3b1c1d549af079edaef38a8934f2565f73785f662d287d498caee16d855b6678879f5dcb3834205a33d0fa168279141480260ade2648de3aadd4cefb36853229067bc92bd02d6c49d5826dab7d70945b78bff0ebfcbb4fe5df34e7588f3be2df4598869f31af8ce52bbceaa474399e9de416761136d708f7cea32d8f1bc7d86667259bed57331de3fdaac19e06e9e3ca29c83fd267f523fd80ca96bcbfb96cd496254c7337dd6638b7ca1e1b1c7375e53c6bb92b972dd620dcae275ab6eb49b6eb7900235aea6c3ca8b23145619f8062edf7c38ed7357bd07da035dc2b6ef7858888c76111df2b9cb30877316f8905c97e492554f2741e1cf0b194dec70ee9909d5221bbedf33b996b17c93a6ab0c8eba50afc8695ca6265bbcdb9baba6139cd79cd41591ca4591dd2d32aa4931a1bea381f179a921d7f127ba2b37c25cfa29a7e24f29ac89fb78018abe89571f01dd6e13b13c7475bc1e78e3545de22aaa096a6911dd121fb5485ece63e90fdc2625e7410db900edb67edf64a77bc2f73a4d1397cc33a7c6755f866f681ef0ea37b29461b176d85b13430f6338d734487f37315ceeb7bc259e23277f1b3c20763db62be58e798d03b5d69079a9c0ecd172a3437b4b371707e98e6e8c38d3cb605aaa89af110a5f06d59b4ce9be188a88e351f720d7ada0487a7bc428c689eda5e457d68de9947d84f76f6b1c2259c03fdf1683082dbeb4959140a77ef92ea2fb3d778a72f2a74adaf1e83a7822981c893854c67d5b1eac1469a27ab8a1f2040c2e169f7c21ebd295a0b3ab84f76a97d28fe5ebf2be0be589d5a14502f72753a9e6844cb8fda75196301def1511b7e11404e3589c43ce5c17c13dff4a22eee13ee8f4cdb75f2dcead150b03f0cf208f49a57fc7596f7d4df3f38b079df343f2ffb773ee023bbc3ab7a582cf0ceebff7ce42bd0c8474780c9416fa028d0403166b237d39ec373b1f4a0ada52a567b16ecd5fb39fccd34f5efde5640eca58f77711f77291b3749d97176ee45111bac61a1d6e2918239524f9a22754022d531492a35bdd2148c1f3c0f4c4964154c92d52f3c901a5e66fff36453846b8c38db1471201177c924712382b825315df8379164e58d76d88c292a33129597df25951d1bfb864c51d9235179c524956714130a29d1e043a7b59dadc10fcd571312c1574d124c21f3564bfb20c648cc9a22312d91f8954912a9a1ba6f13f7e0cdd1dd125dd74cd235a89da3d7441163e4a54c916749e47d6d92bcbc20af868588ba8dc0e666bcc32da3e3e3315374f749745f3749378df0af02a71807af73db1261df98248c10b81bd2fea39183475a5222ed8649d272100c73f4a7b446bbacb1d9b85f22f35b93649e1464d231156d7079e3a1b70da5ff1193516273a688ed850f6607b740e1e877e41c49e11c79ed365c5e1976e53523763e6460ca2bb658f2312263770b372bf8a65f9cdd035aa294517699efbbdbb90e1f50537815e77c235c66f45eebf720ed41fbfca4d6363f69c7feb10ae97ef692fb42ace2f061fa878c9f7e95e2f52476d31c7783125ade154e1bb175fe0f719dcbd8ff0184d773623f3d0000 serializedProgramBytesString: - serializedSignature: bcb1ad304f11715846bc7ed74318b5d5dba8ef9b8236ba4ea25b2fedf799a7da19fa89a6f7dbd65b030a7c8c87756c9014e3189faec43bb515285408e50b8305 + serializedSignature: d57ef2a293261d7a9067956f3b38726739d76dddd8185018a5fd211752d87af602d544d8b73a890c3eb65e279e0b3348786c51b60eae970f01f9a0fae5d5ec02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset index 6ab724d..7c3fcb8 100644 --- a/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset +++ b/Assets/SerializedUdonPrograms/68d999abd6627d04999b5bebe2438687.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed585b4f1341143e53d816a48a981834f1c10713300abb40a26f265cbc101508a57d21a62cb060b585a65b15ff82ffc8ff6682df39bb4bf732ed508148806e3ab37339d7ef9c33d3e66cc2473d4753a1755aa4692ad32e1dd201de16d137f004a3687e8d5ae8f7d1ba587b4e8f0d94fc99500fd02e63e4531b94df68077d4dd64be4e17d19b41e463cbb87af875d6a1044655aa2555aa17175dfc0a222447e38a7d82e358476817e62d513a558882d4be3684a58f165ad01a5a37d9bf449cc6a606d07342daa83e7b6701c9a645ab129ea281fbec7c7397cade3e3e33f96122bde81af4b4db279413dedc3dd11a5d9d1cc3a9f0b959810b16d98d404038db565f1659be668566bed43558ce9bd28ad8b1d3561cac252227e6744b072753c5e0c2a1ff36f056906ab869569fa809ea9b66806cedf4c71a9406c1d707bb481b629fcb6a07676a7c92486354db30e9e41d435301339b489715d342c49fb5d34f544fb65ccb525070e90050be88f445ad6f616de7532374297e975d4075fb7f920c4239896600d6b6f0f7098dd20f23f1061d7e707c2341cb43947d4af0c12373e0c8a8c25453de0311394d5c4dc2cd93c545b190ff66f63d6c228bea3c25a4206bdc79a8bfd9ea0c4f36be0e84236f39b17099d629ca488ecd47b8d43614aaceba06f25cd9d235b8e934706737b399bf94daa27b133e6ac6659d6a0c3caa7e1523ab80a3c59ba50b8929c837d35d9d72bf8f4a0e4e5b04c82a25e9d382fe98815b968fc10d2afa1c869aae2d997952a2ae7218433a3b87b79878e5f37203251e1b09a0501367b949b1cd00dbe9c063e87850ce97cf2b28b4fbad910f8a52c7be6c1bf2dd787cf18ed8ac6eec909c4fbe21655305bc32e6b38e505d6cd2ae0516a04afaf25a05aa05c130a1ef964b3f6cae9e38ac5b21bf0139f8d1bd06b5b42d27ce11aee71e1da3bb7b3d76445703a30fd9e7838aae73aebcc3675bf6714428b225ef0343be0ca597a8b518deef2399b87ead93f4693598b91f86dc1786937657ac060457e998101e3530d13c3931f6c0c8851ca2a387d09d1d349991206d111740ebf3438b4e6e19e5da9c83e1efe70a2a798bfb9a01bed698f906c568c4a1d3a827a3cdb0eab5b224b18e24ba779311ee5935d22a5536af525d2e1527bfb9a5741877d772751341c2e1aa31799d945c12b40cc97c3f4408cae9293967596abe47022d3add31872cdb3dde16cb94bc1bf402786293516dac2307d94bba20b5a57fa4e42d98cab7ad1e769d39ba739dac7e2c19bc2a07ea9325867e959b2b9d803159b0bdb95b6ff5e3a4cc7a5d697817cc0dcc355a025ff99b6648ff51757ec5b982f160000 serializedProgramBytesString: - serializedSignature: c9d37617ee8749be96975485fb939932f674905e9698dc21446fafe95302c0680b0ce21e09c6482b9f1574eaeb92653f838daeb1f347b122daac5dce9325a805 + serializedSignature: 13dd9804d308cd3fd8973d5c2930d25150514751b18ca558ae1e6c33cbb9bb1c839c959a0654e9faeb4443878524cd06c0d062c8a3b8d82a16137f1dc5e7b008 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset index 3360535..a1adcd4 100644 --- a/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset +++ b/Assets/SerializedUdonPrograms/699261d683532df468f1ed17ff8c8cf1.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df7571c4712807b915608814119e52c010aec020a4846208284b08c02c9f2f97c3222db2061822c9f4f67fbf2f972ce39e77c3e5fce67bf77f7c3fd3ff79eafaba6475b3bdbb5bbc34e0d1e09edd3f6cef44c4dd5d7d5d5617a86a284d2ff6287f5d780ea51edaa56f5ab617553ddd0bfda753aa53fce96bbffb29ad1e998fe1ed47987d5ae1c67c2bfaad826fddda5b766d59c3e735e0de97402f37bd588fedda5cf1dd15bb07754ff1fd147c596eb93fa5587baa42eaacad8861c2206f0a459b32f0676c556eaef36f5acce1d41a5e02209ccaad45fbd3a6716f3a6b4d2ee718fa9c7d1ac299d37a4cf9951935ae67594b87297d62986363957d0ff57e8ff1de6f732931699fd67c971ee7e733ae69f23db2079dc6c2f37f99d641bd2b8499b4cfe79a203a4c5266d36fbbaccf64a939698b4c5e43f64b64b4d5a66d2559ef35799f48cd97fc16cb799ed87cd76bbd9ee36db0f98b4dca415265d6dd235265d6bd25673fe45c756e4117ffdf5d7ff67f24f9b741db1653b6102e96623e392d9de499840bac593bf9b308174ab27ff8c49f7916bee25fb20dde6396733b9962bd33d0ed20de6f8cb667b3fe109e9468fbc2ac217d24a4f7eab49ebccfe2b641bd27a93264d7e0fd986f488d9dfeb9177ccecef23db901e37e9518fbca326ad65e49d34fbfbc936a4a74cdae891d768d28447de61a2b77b3df738480f9ae307cc760dd94ff5d9648e7b84948bcbdfe5ec1e07e97a4fb9adf3ecbfaa8cbfc66318bdceeb7832a8a655022b7e8dca3fccba67e60eb0186be00bfe55e165e774289bd6022c51ae1f63e89c6ad03e618b729b636544ef76fc1ed4474ca050b898e712af645c02949bd49f1112a267f5fe4e8cf010a427744ead0e1a1378d613da4d1fd39f742903fab2933acc8f68e79bd79702794f68b5338fcc65128473ef393d5aa6d3da4ce93d2ed069bd3d891af6e2f72dd47404b5efd2fbe6b0edbba15bbf369ddec6ab65da3ea37fdbaed96790d975b4373adc7ea769738ba9435b03da27b0fd592a91c5281140bfe251530d9727b0c57e29a32496183a41063a325d46461d228ba5edab5709ecebf46510f46f63a68576ff86bc9b2865501f9bcd1e3b1d28f2436845aa94553cddae0695c0bedab61c7665a30af2aab147ed57ff787c7912b4f4f28f59f827e3a64dcb34a9c463126c31928b38c9c5854a5e66f319ecff8e89fa4cbfdee73486673177022368adee128fe87dee2003e87347bafed28dc7cea30ed93d0b62fd760fac19136a321c2c098556823e724829217d394f5a6e2b151c7df48658937b51f73194e3bf1ec36067a7d73559d2a5483ab3a3954b078e60dc56638060995dad968c4a53ca579a15b6e2c1414d4f88c593ab61cb563830a2acccbb70cab1703666d8965d03ae688a6d4503f42a2c4a811765144d395f342bb9725fcdb9a38f722fe184afb10a7fc19753ade2b0ace5caca0796524ef8ba00849771c2d75b845754f913fe00c77c4300055ace09df1840815670c22b03d07c35277c53009aafe1846fb608ffcfbf1ff6257c2d277c4b009aafb3084f60cdbaa616a33b03c30fe8dc8fe863e7b2760fe0c8ec311b66bf8e78f8d8e335748bab6330bb168c5e5c245f6fa38da126dc6eca1c0ebde138ff2de1f6bca9ee505c1725fbf5397a1b6c1501e8edb4a9e4ad043bf84ab09113bcab40c1959ce0dd050adec409de53a0e0cd9ce0bd050adec209de57a0e0ad9ce0fd050adec6093e50a0e0ed9c60986eaff2088e3da837af9b21f629ed91cfa9a4baa353f98f1f9b76d8225b59d891ed9226f5a472a61bfd47b6eabc235b0d13d9725d9f8b6c3b398f3868f308b87b378104c3f58720fc6497cd52f09343f954aa1a5ef06e0ee1611b42b86937aa376eea5d6163f4836b0f87eb4881b8f672b86a6db8e0fedb2c69b56581f901b48f03942810d07e0e50d206088ebe652a3e54f7868210f901708003505720802a0e40bd0d00c4cea7f5cf413c7606fbc610afc3c250cd61682810430d87e1a80d0384b7260cf993e807a7750dde6b00ec51cd24c70153a7f737695f4ded6ff665f641ceec63059a7d88137cbc40c187399e276c3c61ec0bf44ea9abfab83b482cf5bbfeee6f3fcc8e70a63516685a2d27f8648182139ce053050a4eda04c3d402743a0b9d71a9e384370520bc9e137eda2afcf9763fc21b2cc21338af06b2c29f1469bf1b1d82bdbf034b9396795825708a0f7c26786d203a7abfe2f61e36ac8aaa165283eb851fe57cea4c000e7b8c13de1a80f0e39cf0b6006ac3099b70a80ded16f749966716b12967ef255bf84b3672f6740400eb2427fc6c00c24f71c2cf0550120f7225d12956124db64bc2262c012de846fa699be455b89947a3b68d17dc6c130c775760d569a1b76e5ab8f2bd6029dfca97ffdbe8a77ccfd884c3f1b0ce35a36f041292e6e3a7ffd3ca795137eb45afbdfa6a33f9c29b0c7ebca8cd72c904deee599c4513b0663b35540bb651bd68a198c0bb4fd9964514a611d4eb96d417d3a6c2aaddec8b330ad3826b57db6da58fb7cc9e5c94d2bf6219a706eb03976d3e80f7f16ab3d00f422f8f276473872be80ed20a714ed1c1c5ba1e5bacab57ee12e65e7de6055dd0831a3b54367804e319bcee536672aa565dd39f31ccb9a6a5cf6a7d064d21cd601e2db4f4d56b7ee2e859ce825e9b056758ceb028645a1f346734ef44cd9d75521d5ab767743eecb79f9dbe9e2a38ebce71d6f5d9acebf654e4f4eb3a76ddd4565e434d6f685d2794bb221884b4e2beecda67cf0bcaee4eceee7e9bdd7c30edc12b0f63f84af7c85b774ff76a4dd76ef9d1f93ca7f3804de74e4f59d1abd292eac4baecd6ff3e356e254dcfce961354f97471b63e62b3b5c547f9387bc62cdaa6966df1fbb91c3fb63dc4d976d5665b5b20b62dacfc16eaa917380b1fb559b8cfe3a929aa8e557dda42ba982053cb549e1f2d1fe6b47c934dcba605c400c88747062166bbe7f6ea5a378e756d244bbc4fefa2f9b1aa9bb3ea319b552716601574c3e6306238919db7c2d6b3f063cb45ce9637db6cb9e3c396d4b4d2795d22030bae2f61e570845376f8e17a89e3fab88d6b73464b92aa6f0ecd73a8c1149675b6da999e436fa30755a72f7396bdc566d9d59c9639fd98219f96159e130c8d2b1c8d6b361a07d8fa93f2326f2408aac5e8e1347dc2a669579e7d9b6e1c9d409c9ac6a519439ea8b5782d642f67efa0cdde46b664bad1a271357ab707701387d6c3d86a3a2d69764b83e8d1f471d65c0fc6cf6c356261dcfb394d8782d1f47a609a0e709a0e2f2c920511a31792134c247b84a33162a3716191690463f355cee6519bcdc7595f85a5ca7dca59d2ec583f6bbc75ceeccd4e203d6f4093831eaddd9262fd89c540c9b3184966f49997f10cd89a55095c899e54f93faa0ed79ec2a59193da8a41fdcb7de629bb049872e61e5c1f55de09c9853ec39ccb0a279ec2f9a36a903c176bb32eb74dfcf3dac5c6225796268dabd0ef354bc769a9162570adf8a1057a536e2d26e06acbec3ee47fc1bb23e0a28237db68014e3f6cd20c90fab5d461f33be795722d403d8202dca77c03786b03b857abd66f1887adb3fa331d53aa385e9484127852125331629a8f181ef807b1d023fc5c60d57161cf7a64068e0a0cd5b7b57ab017e40d7b03093e37f146d3fc291a08aa2d5e529da582a55a297beb9284566af23e6f4092d0804c01840e37de626dbf2159db5761995df38c518e7baf53c80b0e4ad26a7f693e462c24029c54a900795312d94a836c501f30a692b2b86aa4701d24b8a6257195195ccedcec1cce0c0ea197d5cb616b91c2d640b03d2d896db5c13685a77421341879c0f4f62dc49794c3572e856f05c13713465c1b4d1b7736c821db21856c2f41362b1dd79c61636a941b3d0f6b26b8e624715528fba31921c0bb2205af9dc09b0fa37a8e23289854bd2d1bd1c4ba1de504d9ad3090a5f7d404239a18b27a82ec19e98896de53ab8b604f6d17c1753b3c5c75b215520cd72182eb59495c7cc7f668043bb60f126c6f95c4b6c6609bc596735ecd907b84dd28269a0d410501f85c180d417ad756700c2ad6b5ad21c8de1646649bc5d3ea653d4c0c5725c175273c5c0db2eda618ae6d04d7dbc3a890e93d33c146402c861d23c89e0fc3c3523d33415c625d8d0304d70b92b8e277437e34dbc62401f56258a004639618a8a304d43bc20225380f2b06aa91807aa72428b7979f7abc20cab3156b09b6778511e09d2e4432a23dae0d04d7bbc3c35517d11ed71682eb3d92b8ec43a02822db4990bd571259ea7e12442f5881702fdc4f2a26f8de27ed71a9379b8530c72fd604b41064ef0fa392ba73fcd19dda7980207b298c6620352c3a11c161d11182eb0392b8f81958c1a6609b14b67504db0725b1951a6cde677d05ab665c0a9a22d03eb418d0043d4d0c5a8c40fbf06240131c718a412b22d03e22092df7ca9f28ce6cac24f83e1a0e3ee8e886bc704a0c5f09c1f731e92a3b4b4e09a1ab2b36b83a43a07d5c129afd0e4014ab699c20fb4418c8d287f0827701c4bc6c3f41f6494964b6a9c8e80eaad6106c9f0abf724671d2bb8e20fbb424b2cc71a8202eb171e81e82eb33e1c732c1a1bb582c3b4c907d360c0f4badc888e2eced5682eb7392b8b22f9a8aeefda8d504e0e7c3f3b78688de8fda44707d4112170c37dcbf8e13c208406cd0de44807d318c2620bd9321d8048855c95304d997c2a892a94ec6b1087632aa09ae2f4be2e227bb059f01105b6e7c8260fb8a34b6f43f2113423cbb2485ad8d60fbaa243678506f5e67f429e78d25d1bb9d729aa0fa5a18712cb5d4258a5dd9cd04d7d7c3c325fc948918ae8d04d7372471d9c79682c3713164bb09b26f4a22cbbdd445b0828a2d752923f8be25dd62da3b1a515c21b48a60fb76385ec7ddb613acb462f84a09beef48c7b921e5bee42f843e9a58d7b69520fbae24b262e3714f297857bd68f52c9182b58cc0fa5e18ed68fa003d8a7366cb09b2ef4b22cb1ca047f179e01d04d70fc2c325bc865b0c572dc1f5c3f070093f9329862b4170fd288cf8953e0e109c31131b075411643f0e3fe40b22130bf9c709b29f841bf2052717c52ae53e82eba792b84a94774546346733d613603f0b3f8a4511d97675cfbc70340993593f87628f9962afce98ff75dee0b9c6580763db6e35829303ce3b3e0755ea6d9e09208cefc7f6f396e0ec32c1b6ecd27e410df094ca6460a512c4eb436d96e6b68f2fe1b22ca592805bc6f7b4fdbf84722f36e55e948079ec585d00be975ba35f29fe85b5e1dc817fe395eb65057fad681a8f04350bf16b682cd2e54de075135bde983e1d9cedbfa6b1ac28b175a13eed5fa397257dda91368ef83db23bf3b0ce5e0e5e9b53474da33fd08552237879f89b8eb9496c8f41b3c84b6bd55b6368eb044a9d526e8115e35f65284a4228fa8d24cf3cded8792fd7123e42242142bc9256899250897ebbe4dd817af7ef2479e6f9c8f57dece1bfcff4f03f2c7978a01efe47499e793f6b751ffbf89f327dfccf4b3e1ea88fff453a8ae7715ff73ef6f0bf667af8df963c3c500fffbb244f1f2b4cef632fff47a697ff73c9cb03f5f27f49f2f4fde70eee635f7f35d3d75f5bf2f5807c1d3e95d875a67f61ec923e7e18e5c1bff8ff0122e2aa9d0ab70000 serializedProgramBytesString: - serializedSignature: e4c34756ed4815e0e4029c2176d1e2068311c5b0ed0a908270bbfaa9476eb0946a55903fadad66aa700faaedd193d9d9e85c5532671fdd614fa630e540b3db04 + serializedSignature: 38497dc0c809997dd4ca87a1619346fd133d81fe730f5cdc3c3651bb5f5e43f069bbda848a43ab78501a9f5dfe214dc30f557b5875a2ac673ed3a99ab4917c02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset b/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset index e92b8a2..62a9325 100644 --- a/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset +++ b/Assets/SerializedUdonPrograms/69b7ebf82a40e4e47bd6530d68506ee3.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5adb721b45109d95b5ba58be2048ec0487e0708bc9c52b2754def105e214b99465f925508a12ad4194ac2892ec0abf40f1113cf013bcf315fc049f00a77b67a3d1ee8c56723c7262229576b473e9e93ea7a767b6a59427f0726ee0b22776c4865815155117cf450bdf36501ee01ddc85f58f4407e58fb8d6d076432c278ca4d755e702aedbb8eb8a1e461e8a67281bdc5e163ebe6f63ac8f3baaddc7c7472f278d4115b1291e8a0762d1399f20628f0775659d437639395cd7c52f68f559299ac4e3a6455cca68e972db01940efb3d163fb05907687b86311dd184cca72c31f73b8d659bb848cb724a96597cf2f2bb2bcb9c529755ea1c599fc1a7a0dc93ccdf2272c3725a9195919f19799f926d243be53a8cde5dd853136de151a3f3e518348723930926d19954800998a6697b80b20d011a942bcc614fdc16b7b4285f746614bd37f85a438f060b9d8d4ff1676c0a52ae89b7afb84817f5dfb287919334d0b22abe4349a39e883590fe3822650fd336e166bed8c5b5cdf29e40ed78cf2493c89da263762033f0f603d48480b671df640dcb7c3d624d7dd67e1b753d5e7b2dacbe75942f79b6b8ed1d7cd7cdb92b21d3eba8777a537db0b4429a36610d69efb19fbe63e4341821e833b37219a63d8e4cbfc69878876110645cde4c02196b41381fa8bb253c8edf3b3104c7b7316ea1debf03bcef88af86daa24786e85e620bfa0cfffd4ffdc51f7fd55d77d0b4dbc2a36dc3b99460da306049de8ab3109330dc04d74d9748d128fc8e0e7ede2acb13843fe8d7e07ee31390e19d69900087b6eb4d74a02e7751ddc2064a6ac6182965e4e16045b3652629668235a5833537695893e3c8305873afeceac34a2f3d82790382493a98109cd221c8e7afefad22183f7085dfd631f6272071c4bbe821c6eb0e68c33125afbc19c1548f6781f15cd61e1bc7d3c884705a837029274fb551e2ffc5cbcd4714253a0cc25d1d7dd3935e000fe1603fcba3cff80b607664b2e60cce9f34bf899a8c8e1a8a51f3ba5057e4e3603fc4050bcee7c7c4fea12fc65ed6cc5e56c71e3f28ed5b65af82bae069638b5b1b7c448de368ea1732779f9f370f5983e11cbf3732c745e6f89a1056b43479424ee709c4c4fb3ac5a31417cd14e77514f3f3ecee0417e83aefd02485dc77fc25fa0174bd1edda3f4fc9d63fe2ec48c4b56c1c4cdb48e1bc2f5fc28dc14ccdc144ccb7f41b7fc2b4697541d725554f17e0ed6aa1c207cf102c36b6c228da3d66429a3f5a90e403c08f0386168c684c3a2098760ef0b773e3555d20f8afb1c16c94fb75ff5dc82f70639b01db6c2875d47dc7b55dae37378ddc0546417c9ed8f895aac9e1aa36d7b18db80243d0e59bc1d87f8df62c91d8c7cc423e8ae2b3cda939c92f654a04f26d1dc07608718d885e54f9989e4d4122d14536a29be091c37cb9064858eb5558537d5ba649bcc1995acb4289405a4e7f4dbdddb6de9456255265145caa3e38473fd98de94acc58734db94de87c67fd60a043ce0dc370450a0adca85d13feb24ce927424bbc902c207f013c8a9926b7d0d78eabc6175f1a6172df488f06f4eccd78ef7701d5f15f31c875e423daa2579f5e82aa1f3d31ba7f992eae52b064fe9875a7d882c51a8bdf43f8f82258a821f110885306894c82b2edb5cd90bcc5795bb04bf390ddb5e4bd1f95f27b9961f58fdd9518c3b4e04e094931b40f9b14d2897249481f3b7d069b413dc9a3d508bb640cd29a02ebf89a05af4546ba0661550afd8047556824a13ef33a4a16c3a2d5b03ceb5059c5080fbe434a3a5aabc551fccdb8232ad40f9e9694239b1e53c670b4a5781f2339b505ed1c44852a2c769ea96b8277fb63e6bbe9a5200fedc26c0947caa8be0f7ad323ad2d076fc01e8e4202bd8826c4a81ec0b9b90cd1bb79896ecf2f69d241d05bcab36c15bd42c687396cfeae23d670bccbc02e68a4d302f6bc01c4c5d9a7fe2b30aadb5453e2dce4ccea344390ffa3f9f92623045e320c9509456b6d0729f37c11a7ad7b8ec271c3ceae6dc11e365e386cb4cce065c530d89b0d33c31764e22c3a1b3f475b21d334358f1e8e7b5336d3f657d33927676d345ce8555c07c209c9e5e3bfcafdd0ef771ff0342a4f4e6b12c0000 serializedProgramBytesString: - serializedSignature: f5349f2d12f76315e2a71b1ffca2b2e53fecef19ce6423f1fc5e2828827ccf8a38d5261b7d4d72cbca42a9c385ac7eef922ed4dc6d05c23a73b4c2f1d230150a + serializedSignature: 19c1e675b88cc9bc97a516897aa31d476ad49cedcd54b501c80a7d68c759e1674a7513c20be76a461690fd8f7b88794e30907fd1b8a467dd64f6b20116cc800d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/6bd746c79fee65c40bb545d665d16e67.asset b/Assets/SerializedUdonPrograms/6bd746c79fee65c40bb545d665d16e67.asset index daeedc8..fb85d32 100644 --- a/Assets/SerializedUdonPrograms/6bd746c79fee65c40bb545d665d16e67.asset +++ b/Assets/SerializedUdonPrograms/6bd746c79fee65c40bb545d665d16e67.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d07601447b2ed050b103907830d1803b2014904833339c844136d631b84244020215981e08873ce11479c73ce3967fbce39e71c2ef8f2fdffeffffb533d3d6ccd6cd5eecceed46a563e64ab35a9aaeb75757575756a51a4ac7fb1e1d6afc56abe9aac0ad52255ae6ad43aebafc9565a6dfdd857cefd79aace4a5759bf4bad67c3d580145fc2bfa1b1ded6ef12ebaa5e35585f36aa322badd4cf17a80aebef12ebdb0aeb0aeeaeb4feafb0de8a6d677db4484d5173d51cd52bd6230589c5faa37a732f0672c5da58bf27a94dd6d30a9d296052a41ff5b27e2db09ed4eb67d556a69df796aa43b458d5d6b332eb9b3a5565d15ca129b679aea7d27f283be961d296d6ffadacff9f37d73d4ddacbdc7fc15cf73669beb9ffa2b96e61eeb5317f63da7d4cbacc7cf312bab6108a1598ebed4ddad6d08ad9cf75dacfa47d0d8d973dcf77609eb732e96af3f72be81abfefc8b7a3f57f9ef5df3b76da62a34786e5e6fd57d135c8e0c8e4cdaf831f975feff354f9c5e581f3d7dfa4a51e8c4b6d9e2d7636d7ad3d6925c27a80f9f6350fed81265de1a1bdc2d0dee883f64e883685539979fe3aba86b41cd128b7bf6bf98b8aeb09a46bccb7bf31d7834cbad6dcff2d7acfb90f699579fe86879e73ff4dcffd6a9417e7de3af3ee5be6dac1b9c6c37b1dba0f692dc3dbb9ffb6e7fe6188f760e5d6953af3cc2ab3365fa07b900e31efbde3c17da849577a705f69d20ac4afc2a44e3d5d65be79175d5b74f31ef2a107bb78f4c079675793367af2d368d20644a3c1a4f5e89e936e407fd79b7c4df0c83ecca41b3dbc1c3dae43341c1cd79b77dfb371ce5b68ee0f47cff3d1df906e32dfbcefc17183e7f9079efc39e9e188e6080f6ec9ec6d4b93169af408f3ed87e81ad223cdfd8f3cf78f32f73f46d7901699f418f3fc1344c7b90fe9d1e6f9a79eef8b4dbad9f3fd66f41da4c79ae79f79be1f69d2f69eef9de7a34cdac1f33ccfa4c729b74d3dcea4de36c079ff0473ff73740de9f1e6fe17e81ad2d19ee75f7a9e9fa4dcb6620cba0fe9c9e6f957e81ad2dd4c7aa279fe35bac67cbdcf3b78de7370f906e1889fb7f73c77701d6bd2533cb81e8dee43da4eb9cbddd1e3719e72f5b685bb2bb76e3bf89fea29af534deaf54992d58576263d4d25daeed33de5d11edd87f40c0f1ea7a1fbce3596d7a17ba672b7471dd07d48cf62e89ec5d0759e0f4132503227c3614f93ee65d2b30d8f6fcdf5de263dc7dcff0e5d3bef43ba8772eb40d07c4c30e9be263dd7436f3cba0fe93e1e2c82f29ba8b43e7574ca769249279b748a49a71a3edffba0d95d69dd6d37cba6dd6e79926fda98f43c43ff07740d34ce3134aef341e37c43e347740de934935e609eff84ae2d1eed9defa79bb49bdae62fb477fcaf199e67f0774b740fd20b95bb1d29316917935ea4e26da4f33ea4172b773be3dcbf44b9db998b545c57f3d1b78edee6a3ef1c9d3572e43bb8ee61d28ee87d87df160fbf2d26bd54b975de91e73273ff67f49e731fd24ee6f9efccf57e9eef2ff7e0e1dcbfc243f77293ce4279bec2a4b3e3327674de9b69976b875f3c74bb1ababf37d77d4dda5925b71b8e5e3b7a72a5a1f3070ffd2b3df49dfb73ccfd3f7aeecf35f79d7cf64a333f5729b7de5fa5dc7abf55b9f57eab8d0f140fa7f79dba2bff7a7fb572ebfd3c741fd26b955bbf9dfbd729b7be755471db978fbe75ec5e3efaceb19526bf6d6b55dc1e427a0d7adfe1778387df0d2aaea7905eafdcfa3a0bd182f446f3fc4fe8dac2b1b3e3eb3ae5373345f9cd46fc20bdc9d0fd33ba06bab705a4dbd7e77bc974aab3cdbb4b1b1bd72e8effbebf7ddda338098df926bdddc8f317740d340f36349dfec98224ef437a1b92e3364363aba1e1f4a516a2e7988683ddad88c6ad86c63786c6bfccfd45e839a671ab496f41346eb169742db069749d60ee2f46cf318d5b4c7a33a271b3a151656838fabcc4a4772877dff80e931e80be87e77ff5d073f4f640e56ed3fdda39c72edd69e8ff0d5d437a17fadeb13d772bb72dbcdba4f7a077ef42f720bdd77cf377746de5bf9bd37f38c8ce7fbb311e5ef729b79dbb4fb9eddcfdca6de7ee37749db68fb073dd1c1df063e71e506e3bb714dd87f421e5b673cefd87556a3be7e833b6730fabd476ee41f4bec3ef510fbf4795dbce3da2dc76ae0ba2859fffc35c9b7a9bb4ee3bf6c31bbf7b4cb963088f99f47194efc7edef20a4eaa2e1a4cfa0779d98ceb3e8de218a8e9d1d6ad2a73c7978caa4cf211acfa27b381ee4f07b42b9fb5a5e39391e4f221e4f1a39cb6d3c7b5ec2d07ada43eb6982d613e81edbd7cb8be908fb0c55a14a55ad2ad285051126bf4301ce97a9070180742bf805ff866ab60d6a93f5690515895fa4e3fc0d56cf7c141989ef136b8ff23d59ff2eb5dea8d444ff99c8e2e1041690b92aeba7020d23d45bf7a7eb51081848a8b49e145a8d7ca5fe6ab91a6955e8a51e2a8b2db655aad1ba5a68fdaed5f4965bd94e7c33954830e4e0fd66be45d31e11a9b6ee3880d65ad7553a870bf4eff53aa7153af725d6bd063d3eb34eadb23a6b356aa3e696287b9df537c573a1818cce233d30c2ddb7875f9c629a624903b92fd276f33f25d21425a287a9fe69aae17645dab29c965012ffc1d0363210482b3134466ac862ae7ba354918eb5cd4f4030b88c8912d2fa6de33d568d492a0b8d0c14775f2d41bc846ff869eceec776bbe0e93cb768a355916edafaa5102d19b040af20d63381427211f2f2b62b868c7ae18f51f0ebe18f055984df7eaf52bf17bc005ae996c95d007a58db6e3c675baf4ed1195a6b7d5a6365789116a24a376c95fa4942391503d1d61aeac48634557639b05b5060b7c936d8a9ad4b32b0db6c932b0e36fca311cc67104c95070ec1961482da3b5b2e8aa0e3862db03469a6f5acd47abf42db74b83fcfa2586af1067a133587b8ebe6fe2239b610aa1fe1c196c6b59dc67567e454669a330ef1ed28c4f598c2c159413ceef83a7f4db2be5d6de57abdf6661aadef29473939d2ed7d23dd41233d8074df83e58843388f42588f10558b22bcc8ba67bbf653f5d34aed0f020fdb575ca8e72281b7b852a366cf4ae2be72909dada70335eafc242f838ebecba0932e03f015e4f3cc95522baa9474aca7b2494a49ba743afb2e9d2eba744624291db952694d944a3158a7ae54f6f33dd987bacd106e4315b71e325d91c5866634a256a3e1013ef5c8bc03cdb5ba3be135eca353147037df05dc5d17f09084c626b3dc71459a4f21dfb1693a04e9b948e07af6f2ed22f54ceacf077590da52e8e910e4aa2631538b8d61869c8f0ad944815bd9d2837311d8add8b024c628b31c812360ffcaa38bb3b72e4eb90c7005df8e2af82ed128f8d121177c1faae0bb0629f8e0398a177cb2d2df3e50e907cf0557faeda976104abf2f015571579728461e6fe3b83ddf3876e0b8f593e0d691e3b68304b74e543dd263516b9aa41eed6ff128d51cebf41bf06db8b56947aa36e999088549f4388c7c79ca2959c5eaaf2b967486b8ead599520a3df8b6505429bc2b296a548da6526a640be69700bec3bc7e090df7400d77ef04e152678183b00b558bc16cc11cfc949e7a17bec276e5080fca907037aad0f50a94c3440b3d68446798e95f81ab6dc724a7e88a50ea0a23078f4641746907c28dd5b594d49ac15a6b7653c1a352e9cbc0e95b774a2da0ca0e216b81572f06f27ad183a20cfdc5a12a3134fa6feb5f02f17c9e784f4ae9f454a463b3a274a9c6a6a7ebe569156aae55d5d7185726b10fe80c4e425866a5ce05dc2f731523c72bb952166cc30735567af9d7544585e89a4a0a18ef6fa12bc5ae295b2e2a37c15b2eba4a0ed3dca3850d57657b71557678a655b6374519624710b54a183a0217709985799d31317596c1aad12b209d01f404dead79de7da81aad6f364dc76ca6f57bd3b6559be1ba92854493919fb4c92852a93a4c99e597d3b5ed298d808287e956099d0af0ffc07be2fa13bdf9e2efcb29f54842a9634194ba1fa7d4a328a5eeae957a831eb76cd0d57b9d6987013cf7f86810f5de81cbc5682a171d92e62208df1db956780cd10a0f8811f622492bdc9f220e75763742c18f7114dccba088673080436dac1f833451cfe8996efd5f631969782d08720339e1c611c2b54943b89d38e176a7846ba785833a0d6d45ba420de278ee41f1840760251a359c03d4018178edccf1dad30faf0303f11acca9f95e849a7fd032989a0fa188438f08d6b0841e5919cac1b60f055b47ad16b5ba71abd5cd1e18fc495a3da0971004c4028273916e01b239efc2ebde05ebbcc3b4657fc3353099999a73918a3fd754eec295db04aadc6c0b5f62d19e66268f022e132d9b0f3dbe20a5b62bc77722c5b7a7e6bbcc6abf9725e10fcf00cd86403919c6e5641257e197692d71dcc720bc8673757272923ab9f998f8af4075720427d9144ab201c654d75aa6da0eb5cd32ce177403d66907ad4ed90e7318f5b690ca1d1434f467d8d08497c1609e411107f6347f06707c20b08b396ed37d71dbfc64206e23396e335271db3c5eff1588db288e5b4932b51d1f173010b7d104b722ed696777d6a26d5c804e70830eeb32fb7b8069fbfea0bd69a30eabcbe8a988c9f3c019f53154790182b3886c41492514cf4cbe7876e388cfa6883f75f69420c4c7729a36c7472daae97afc2381346d1cc50d4c162c234d3090d04f741aa1da6ddd9a65faaa54d95b3b053180bb73dce751dc7b2bdc048216976af3bbc474b76c4d49bfcbb50787fcfebeec57c03abe27c76dbe04b7bd386e0b24b8ed4d7183f1868514b7ee89dc1896fd7996fb70022e9210705f8edb62096ee3396e4b24b84de00aef00b1c29b48b1845ee0812ab117f84bdb60bdc049147168690edaf600c90346069660b6ed400a318ce73399e203e606261293310f08ef955a8d58956e2ec18435e8c67a9af5f7c640a66b0ac51b5a2458c598d8dca940cddd548278918ecec1fe5a4d376603f0356a8f00fe5eafecc8fd42cd3bbe782193d11858eb196c881076d72b888d52a9c723c2c83de7fd4ca34a4c47326527f3261f165de69a3139cc753543b7d7e5690ee52e27ca2996b49c4a9533a9572ecf5ce94ca72a2b74fb5624132340b76f06c7a08c60d0220d06259cbd2e27ecf51bed83d9ebfd38e21504f1fb3a04233e93220ec3152b55866370b328cad048c33058e88df46c8a1b34d2ab296ea134d27338012b25049ccb09b8c6bf809b89f8451201e7718ab79650bcbb3a0553bcfd39e25504f1de5d82119f4f1187210f5861e3adf0505cba38020c792ce018ac2318ac4983c1428e410dc1606d1a0c16710c6a090655693058cc31388c603035169cc1128a01f884b05b66827f0915130fcb2cb08c7f9db2d7ca2fb1ac44851633888f7900c51f7c4cd8f193f031138927f1310fe4aa4703513d9eeb1aac7a1cc4116f24889fd02d18f1a51cf1f504f14bba07237e30477c0341bc7b8f60c40fe1146a23a550f6202d6cab607ba9b519cd1a3994e3bd89e2ed8efc24cb437a0320cba8dc8057009bc166e4152ce7281f9129e5528ef29199525ec1513e2a53ca65146570026053d3947359c7f384cbb92c1f9369962b08ca457a7206188fec4f6f9aad9c49e0955a207e242adca94f9ba91222bb563091b32006c1d4eccbc075b956728a775c868ab78a53bce33355bcd594e2e9893b4db350238c599cc955ec043f65b12b8f58255516b060f0443f84932c965d431106cf07f690ced4f359cb113f3904e2551cf15342205e4d11073701b68c0e738ee13a4e8ad34290a286237e7a08c46b39e2678440fc300eff3343c6bf8e62044b50cef253b1922c41a9a70883f5848daf33b29e0d1ce57332a5dc485186a6e45c3f6024694ad6538401bcf3a8e2cc34beb281e20693d2607f6b7275b797784f9ef8460ea30b32c4681341b808848fc02ae0312137871712c55ea427b7fa5d7f1b3c471e8d326a45ba79b06fb8ffa5c0c1b3c2b9728753ba05adfcc57e742b492b7f04a55b7aaeafec3e35e1ad254b6ff0e4124acff47ce3912acc956e5cee5aeafd1e6b3d1d79d2c0d9af028c0d9aa879950f6fd3aabb4539fbedc84bc7a9f1919cb5bf54c2da1f45718368fa6514b750860b8ee604bc5c42c063386e574870dbcc71bb5282dbb104b7223d491f5ae6ec377af1d955e136785711e0150d0639618a76f8b961acc3566d1da458d2457c1ca55050b9ae5699f5898fa708431fe11a4a5333e8239c4029a95e8051de244aeaec9816ae8a5e4ba9a85ef85190445fd2cd0b6d8349a5bd4e2bad442638953d91d22ce8da5eaf32efda9ec411bf2104e22773c46f0c81f8295cd3709344d3702a67376eced06e9cc689718b8418a77325726b0825720627ca6d12a29cc989727b08a29cc589728784286773dcee94e0760ec50d5cd4bb286ea1b8a8e77202de2d21e07914370849c109261985a4cea728c3743f3803c5f73aa2529ec1055cd6efcb34eb175294a1d37d3f550483f44dc1eea237e75bf89c5fc429cf0312ca7331c7ed41096e9750dca02e3e44710ba52e6ee1583e2cc6f2528ee523622c2fe3583e2ac6f2724e731e93d09c2b38011f1713f04a8a258c4ec06936998c4e5c451106b30ac7e3846156b7520cc0ac3ea53234ab575394c1ac3e4d154394ccea359cba3e23a1aed772dc9e95e0761dc50d2ac77314b7502ac7f51ccbe7c558dec0b17c418ce58d144ba8482faa0c2bd24d1ce59732a57c3347f9e54c29dfc2517e2553cab772945fcd94f26d1ce5d732a57c3b47f9f54c29df415186ae1e1c419d6957ef4e8a38b46a707e6326adda5d04e122bd83084c92ca7ea04e6e3ed11b145264f4ec4d05d133088748e4928ba0ddcd15f15b1916f13d146128e2b7fd107e93277c2f5797dec9b42edd4751065feb5d158eaf753f97f5f732cdfa031465f0b5de5711f7b51ea4720e7af50195f34cbd9f87386e1f4a707b98e2065ec84714b750bc904738961f8bb17c9463f98918cbc7289650109faacce6f63c4e11861afa99cab0863e415106113ff793e52451f227b92c7f9169969fe250fe3243949fe6087f9521e16728c2302fe76b3f8493cccb7996220ccde4377e082769269fa308c3fbdf5295275383f43cc50dd6a47ca788152ffb2a67728a7b3ac91c056b5b36682fc3998252a857bdacd24f96a9597aeabc3dad3e3e7d05dea0e871135d82ac9e798193ec7b4a32d81b84f69ea819e68566af17906da239e215d6cadb77e35e9f7be376efd3c5d6b34acb1f0b22d58b9c543f5052edc39497730f8e4fb3b70fb325f22e7958685d95585f7a738e8f62f43e8b9fa01344ae9738b97ea4e49ac0961670afb55e72cac85e9565ef663bc59266832907fa6bf7aeb7c94b3388742f73d2fd444957b1add49cfd15f0ee0a36be50422bf5942fe8e1946c7b33be67833db25e6134b3cea5b37639af327b23016b7bd18bbde947f2d2c64f709d0843bb5fe170fa39589d4ddc39db6d8d5611759ad70aca020491ea554eaadf713636b86ec3f680d9d7ebd738c97e4f49b64858af61d78bc9aa51cb0574e3df04b15fe9e8edeb1c0e7fa07038481087e919d76fbe860741e4371c227fa410e16708b98fed72d7e28d8424f17df982e4f6b75c6e7fa1723b36600d9d68e5148e790f827bba92bcc149f2274a12d81c8ae36a4b50a3edca444bfbca515020596e933d0947c6373919ff9cb96ed587ae5b6f71b9fd4b7835615368b97d9bcbed5fc3c336bcdcbec3e5f66f9cb6d3b94d3c2ad59d636f508c6f69dd07cd85d1b6bccbc9f8774ac6699e1a9dd86bb16b7489ceed61aa517f6acb91ccf6fbf7fbd2f726dee324fd0725e9b8c0a5b92ac3d20c22cbfb9c2cffa46499e1ab1e8df19460b5deedb4526fb79dcc7f4dd4493fbc8248fb0127ed7f51d21ec04aeb7f093eeecde07cf3bd517f528751633fe4d0f86f0a8d0695ac8f9e1803c19e05b7ec27685c25d5316061d10b82e2471c8aff43a13835208a5c0eb36f293ee6e4fc176729c297d33b92c3cb499df71844da4f3869ff9792b694b514543eb0759cad4739411eb0919b024a14a6250da60d9f72f8fc1f85cf525fedc6e894bebc3f699b0a93cf384cfe4d61328fc524be40cac603b719d94020bdfdbf3fe7a4573142fa31acf4ce4a9b54de519d4a150f73280591e20b4e8a1825057f6e9fc3db9d67b0d1879b76ca4f7f2448cebfe472de82caf9225f3572549ab6ca4d23794f3b6c1cbee2706849e1e037b23045c7af2a7509367d64e16b4ec6ed28194b7ccae82edf4a3d0e168d48ca379cbc79e9ebf6e810747b74c6ba1dac85f996c3a11585c3a169e0b0c0fa74856a30de58eeb4bddf71c8b4a690999d86bf063d343b825d9fb474693f4dca4ffd9e93bb0d25f759aaa94636e00849c7e72fd7ef9669aae529e3cd7cfde22589ef0e4fef0d1f46eff9070ef97c0af9b19efed06862ecaf7e5bef28be4bbadb7f8083cb666824cb438c67fdc849d29692645628929459f7ea549d72ce0bb6f7824fde7f77ef264fed251f44ea9f38a9db51528f52a9e29553b7452913355a260ef93327417b4a823d599b97dad3ce56affb779c441d288956a561c5257bddd9b5fcbfe7b0ea4861352970e93b33304ab7d5525e96441a6158d83f7012760aa6dfa966593490b9f72b691089fec849d49992888fb6a71a07b2a3cf7664bae946847ee1a4ed42493b330469e76764a9c290f94f9ccc5d2999f91106de43e746c4c2f5cfc369a1fecca1d18d4223fd286a304cc2b0e9e1e0f3170e9fee143efc3cb26433aeb23fdbeaaf9c543d28a9bc23c15c74c2cf48707a5189f425fd1b27694f4ad24c4682d36b8583c8f2774e965e942c0b5859b891fca9beeba7db5bf6f34e58e5f90f0e83de14066569fb54ee3679a282be8bffb6cb9f4dcfbc856b6dfdc462ed947dd41e78499b74de2b95ddc72bd2677f172ba73fc89fd6e6dc07ded556c941e92c54ce3cbfd427b5f5b1e06fe51cb535340645d760867c89759793957d504b058a60d5eb3dd82b343275bae758a88fa786affc9e9847c5470a5184044be7ffec3cef99bc317d4438a66521ad4f3b6f6e926e0fa5dada946a8b227d8efab034b529752efa02b796b40e512727c7635054de6d0273943de3dac7799429397ad7c87a398ed0049c990e29c92d42534a28727db49ad983ac75ba80ebd570abaeb7ce6b510c85d04f1a2e67d64283a59db69dc247c7e7025c3f748ec3b583245cf6d198f5ca39b23917c0817f0e383b4a82d351833359c713ebf56bb01a6889f9a03c27c0faa04d1cacfe9260b5d66035e658453b18e9d20049786007d729baadcc6d43be5dc73860032501ebe769f770503e113af720502e00f9415b00b2759e87b8b7cf9abe27160c7dde67b41d908dba4dadd3f4cabd3ee470f0afa296f39db00f5890d0d2151016ab20a5c92fc8482f0b7c787305be4c45810f4727dec9a23b47c5d0c91af42befff1443ff676700e17903826ddb064bda36e7d844bbbbbbce7a29f9a2e9919665f1e4a15f421edc7b0239b68bca4dbecbba0df423603a16ee16d4b60e9184738081b3ca7aa9ca44efd76d8b83acdf1615e2a376c572f0ce9482f74404ef5049787ba6d0d6dc87720d82b2a029a174c71e05a11c2f05651982721749287b6828ab756bbe56371df3b5d56c2017ab8b01d9450ac8ae08c85db3a19365a635f7ae7473cf9912d4c9d65250f646500e93eeb378a1f4374036460ed6222958172058874bc2ba236135fdcf1611d458b1ca5f87a01dd1b4953fd7dbf6d108cac26c54fed45aea1d651b2b07ebf652b05e8c602dca06ac8e736f7710a929bcde5e93a0b68af599ea11acc5d168aa9a83b6ce41b08e8c56cf5e104e312dbd1dc1394a12ce5e29e074374f2373b281ba0381395abec70476d13b8dd38677d9b6e940f041ee55f27d11906324816cab815c6f3d2ed3fb35381d5031c83a4841b61d826cb7e8c49076cfc16a7c3a82726c366ce22a164c9cfd656a0f3930f3a5c05c8ac01c1725300535530ccc831098bb4709ccdd7210cc7908cc3da204a66004490cccfd10987b4609cc713908e68108ccbda204a6600f470cccfd11987b4709cc913908e66004e63e510253b0bb2806e68e08cc7da304a6e0140531304b1098e3a304e6a81c04732202734236c0e4062d9a4320b81702736294c0146c80c4c0ec8bc09c2409e630e51eaca8b55ee1e2eafe77fa14d5e063a540af40a04f9604bd80d0e04cb6fa1085bb540aee6908ee29d1992f22d8c7179b2f32084139351a8370def9228256586cbe487f04ebb4688ec40b6aabd8b0c74508d6e9d1d0d6e600eb5804eb0c4958fbfad656f7ec504113f0a614a8f720504ba208aa60cb2f06ea5d08d4fdb2e16861507f7d8ed6f908ee994dd933733b5aa23349c45cad431098b3a204a6e0088018988722306747094cc1b1293130272330e74409cc5cec512d4160ce8d12988271563130c72130e745094cc111003130774760ee1f25307371a1cd3004e6fc288129d8571203730402734174e6e6093a466273f34e46502e948472a872c7ffe3fb1bc3f27f3cd5d65fe044d00888054ece45602f9204bb83011b18afd4703bb42b13f700090fb83c29e014026eb12470d47a3af78ef74e3ac97a1d4e488735f4357a530cd1a169b179cecf2068976403daf800a073e051ea239144abfb5629688f45d01ed094e34eb93fb5a70782f2404928ed554a6b94775799b9961d5da9eccdafbd9b868ac1d95f0ace4e08ce83e4e10cb2e82b172751dc84e05c1acd71a65c74978623580f6eea4aefdd3f38f7e0ec88e03c4412ce3e2abe9a0e6fa24d1d8b90cbabeaf642801e2a09e82004683c850cc7cfc64adcdfc1bd7cb14e6b71ee81bc0702795936c64501dc1afda16d4bb9232eb2a0b962edff6c04ea724950072aeffe63653a1315cadf39bac2fe6a6f29808f47009746274225d841158b505521285764a3d91ad9cc9badf108d0324940ed55f56568c7d005a8fa67cda112abe46d1190e59240ee4cb6ff8b953d437aa5453a711b54ecbbd667c30310eb5dcd44305748c23cc4d3584163b481a8fefe7a5c821d5931d3f020827a6553365beea96782cd96d86e8f8d08ca559250ee426a6da2c71ae4c01a41dd15f3691f4180afce35c0057d5c31c0af478057368563d6dc7a651310a06ba23bca25681cc446b90e47d0ae6dcaa118f7f48b5c9c63b50382b22a1ac16eef1220c1e9be624b80162158abb35df9fd6f192ba8b1625bc6de8da05dd7b4953fd78331bb21286ba2357028b8999758d7f67104676d366c69f0757fb93870b81ec17a9824acfd7dc34aedbc2fba31c8ae52e03e81c0ad8b32b882f6550cdc5311b8f5510657b0132006ee7108dc8628832b6873c5c05d8dc06d8c5e5326bc4198d818c36108d6f592b076d1b04ed52e3f8c1ad42504be4bd41439007b4a01988f00dc102d8f5570ed9f98c77a2b82736353f6a572ff3ca80204e52649283b6b281b74d5aeb45e99ac21856be7c8c25cdca0bb3582ef7049f89c1555f6a82b7f00662ecfb21a82c03c221bb1fcd4adf7fc6c54eeeba4003d01017a6474260009ba406231a7b508caa324a17436f17006f6ca9254f5e61b3c390dc17d7474e600086aae580bbf1241794c74469d7271038fa108cacdd11c75120ce6898d3acd47b01e1bbd5e3bd850c17325c46ce8b508d6e3a233e2948badff1804e5f19250daa7c6975ad460652a35a532f77aeb9d11782744b37a0b364662d5fb7204eb8992b01613d59bdf56ce5e2fbd496bec442b079566041f3697b3594ed1b3a54ab72124eaa10e9682bf10c17f52b4427a82da2c6624ee45709e2c09a7b30548a2363bd3cdc099aab67ee06f301a8d9ae454bdcc0dc45aa85173fc5841dd5d2605f65404f629926077b72e4a7578af464f628fef31d91c1ab6ee08c653b31113489c2a99eec69e82c3d2a55270df87e03e4d12ee3c0df76a0356ee354ddd1050a767335615df4d25ddf52ab918ab3a1ac17d8624dc3b1066c0ef32a05c04f63904ec99d1095f0bcef113ebc09e89a03c4b12ca810494f6781484b1d759ed3eb853b5aab9ed0dd402017c7674a2acb9b8b3ef4e08ca73a2196515d450b1286b1f04ebb9d109070a6aa898353d0041799e2494ed94bd781d9caaf5dac97706a4c540eb24055a1e02edfc68546baf9b24d82b1273928a11ac1748c29a6c6b9ae6b63bc52c04ea85d1f13c73d156d620282f8ace48be20946223f98f21282f96b7a0ee3d531a74756e3044e2b350727f4bba7608d64ba2e3ba0b7633c55cf75d11945b24a16cadec101d841bcbadacd6e6a0deb547605d1acd71d15c74884e41b05e16ad81394138c506396e46705e1e4db73d1737392a42b05e213fa384da857f9d7925f79a991802ef4a49f07aa4a8e2598a5a8aad4bda8080bc4a124867f3d8f848d1af677ce84804f2d6e8742605678a8a7526d72128afce4663e4deecb0b96e6fbc0f82f51a4958c3dddc30178dc13508ea6ba3130e11340662e1908d08caebe43b9b3095d199482306567729b0da20b0ae8f4e9023170f7eeb87a0bc211a3d22eff8a4e019a462e3930b11ac374ac29ad9de63821a2bb6f7d89d08da9ba233f49b8b1ee81404e5cdd10cdae56238e41804eb2d92b0ca2f66100cf289cd189d81e0bf357a5a9dab07705423586f93847598f29e6b5aa13517b080650bbfa61ed6d908f4dba315ff1774cbc4e2ffb72138efc8666c203e997c8e71be4a033482b9a8b99b11d47766c30376a0e63b1694072c08ad98077c2582f6aee83570636461bd480ad64d08d6bba3135510dc7a5b2caab03382f29e684615043d5bb1a8c24004ebbdd1abf8a36527fa8835550f2158ef8b26ac8233fcc4603d0bc17a7f6e778305a31062dde0e908fe07b2d17558c5761edc2ba244d7ef89ad893a18c1f960349ab4e660244621581f9284953b42b9b91d79b43702f4e16c4c27024037283c833a3e872097974dec89807c4412c8ee1ac86a0dd55add2ccdd659584d745873afb3da05c1f8a8248ce1ef2b21d8ea974ac17d1582fbb16c845d1a2c3dad54f56c23d57cf6e3ef89a07d5c12da71ca1bd1a2fdd370bc5cd1aef016a9c2b81a15c613cda93004c791c50ae30154184f36a7c2103453628571042a8ca79a53610836c7628571212a8ca79b7286a47bb28a604c596cb2ca4908ca67a233d954104ab1c9a64f23289f9584d239b629752ca3f91ce23c1781fb9c24b8ed35b8b01b6199d9b7206e4bc5606b27055b4b04dbf3d19ae920a88562331d6e4470be10253847e5249c4f22385fcc86c54c3d44445b4cc1bdddc52ce6c308dc97a20caee0e0a618b88f22705f8e32b8b9d8d69f83c07d25cae00af69dc4c0bd0481fb6a94c1158c9f8981bb0581fb5a94c1158c8789817b2902f7f528832b38622c06ee6508dcdf44195cc109d262e05e81c0fd6d94c1150cbb88817b1d02f78d28832b78e68618b8372070df8ce6fc1cc1a64c6c16c44804eb5b92b0f6227436591c41b0a32b1645b80081f97694c014ecd88a81b91581f94e94c0ccc5f8d63204e6bb510253b0e32a06e67204e67b51023317b7ec2b4560be1f2530055b7331305720303f881298821d513130cb11981f4609cc5c5c99bb0a81f95194c014ec688a81d980c0fc384a60e6e2618ee721303f9104d3bb66bc4e79572634f7e194a310d49f4667b694a03d159b2d558ba0fc4c12ca361a4a7bb3c84aadb9829bf08aad526885e0fabc2935cf3db94c50f3c426973d85a0fc4212cab60a6f9b3f5fc1192eab552e6e59da0141f6a52464d46e71eef3829d7492f53a1c1aba5e37287076866893d2410ada4a04ed57d10b0be7ea6650db2358bfce86bdc4b0ba5b6abc5786609f5c6caf8c0108ca6f24a1744e5c8dafd86ade557f1202f6db68547def262482fd21b14d48162358bfcb7663e57f6327415320e6853e8ba0fd3e3a565570a84dccaaee82a0fc4112cae0d3c97371e4f27e04e78fd9b0a5a92b7d73185d3f43c3da3acf437c5a02f1c95a87aa8cc895a6da16aae9aa428351a7fbde856a966ed91bd4724bcf965a3fc1cae210eb87ba1fd307ef4c551b55adbe0bf4ca35ed6aeb29e4ac5e150fb75ef90954a3b5518d02d3435b6f7d51a666a3fd0d0a929c055b4046140a629df55d7b8d61a5756fb2c6a04147c96c64806ee2eef60581f6572830db5ae0b7e7eb1adc40ae6487c28bc5ba98f25aa7e5847c438fd4d944a8d47a1ff25734c27a2d36d6fa65fb5d85db3c2ebb7cabad1ffbcab99f9a269456726a3f4391c4e8da5a159a9ea592c8ae1af0fd4abdbab342532d4929696af9789d6d9fa4548a0aa12c9ab3fcbf837237c5aed5b497ae7470ba60b90917cfb55e2ed799827f79ff0f1e4cb4d9d0d70100 serializedProgramBytesString: - serializedSignature: 1ea1ecbe7667f9917d73fe1954091e57997f49da84f74456be12b3358eb565838a4d404917f6fcd9520b18d2447dd9abf254c442a8e14b5c3d6b5ec7062d320d + serializedSignature: 1f2e4047e8f89aefae504e8d3c0ea471787995ecb5071d4f922349c9ce938e49947e16d48887d5300d2c07318bf7dc1eccebed3d43a8894698be6468f26b0b00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset index d2d8167..95fd7d8 100644 --- a/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset +++ b/Assets/SerializedUdonPrograms/75f3b7bb830f4324a8b2f49814f3493a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15ac0e108853e2b013dbb163028615603b97130763e290c2d805883fae14c820885c4210497699ca1ba42aef9157c88324799ca4bb77168d7667b45aa11182582aed68e7e8e9fefa9a9d9142168397710f2edb6c832db3399661fbec9815e1db329447f0b6ef9cfa97ac04e5215cb3d0768fddf01989afbbc6185c57e1aecc2a30f22ddb83324fed9b2c07df57616c0eeeb0f6003e39e86574c3a00c7bca5eb0759632467d486cd3a032af33502e230ad727ec145a73c4144e6251530a2e9bd052a6b62360dae9f78afd44621d41db1e8c29b102d07c4d14a3bb703548262aba79d9c54b9c2f0c9f417e6ff232c63f86504679d9c3c70c09f740d75873d176c6f5f2fec3c23d9671a14f98977d425d5ca8c3b29ff71b11ee71dedb2eba09de6f54b8c77280d7275dfd9dfa948bef88708fed631c9ffbbc3ec4db1097906990f67f007d64d909b3b0d1f82c80993a23fd0d14498743b64ec15271da0a98c20910905849866cb0c216d982d44ac68db8c0f7325db3d0234f44c7bd53fce99902992bc03b27987819ea9f9187a091e7a1658ead4189a376d93c18ed2b17956d98b6006e92635b703d217abbc0b6b7a79f48e80eee311b40d3f6d623a871003d81fb0271b849d777c4698eb85f85ba0ac58e22448f2750bea7d9bcb297e0bb6cce2d0e999c47b9d3aaeaedd0e0a8e9294883dc5be46b1f3472111a41e8c3e3dc0dbb2d8aacbf7934f101433bc898940c6d1af3763aaaa95b6016e59e0d0f82c165f44a28b76f1bef8710d0ebc9224706d53d49125435fcf73f7ffc75fdf75f6f99b5a22d328bd2db351fd1ea018bf4a68ca487427d114cb33b8d8cbae13764f053badb6c23fc76bf3cf50bae803065a65a0518338c9d25cd4df633349480d539b6024c6489ed02673243221528cde5cf7ca348d3942801564021b86e3ca4311e9da6c37c89302549ba7ea2a91413922926da6ec5f847a27a8a899ec955550cbee408c61408faf1a042b04b8620ade80a5a11cc409dbd645aa1d63ce559ccb859a2fe02787ec3f3b1b360578d71907c4e0f006f899bfa98f79c495dc5dca2ca3479845ede9c053ebd22a65cd17152743bd8519946b7c434d268ad7d128bfd175e66cc2508da9182b829b3bbde8bc968cdf92d3e4ea51af6db44dd8414d46bc332f4e2ed8e7ba2e105c70f1f23675df8c9b11b54c43cbff955e84564868db6372451293de5bb0d3ba136eca88af8b0ca5e02108fa9888fb480788f84b8459b095b6d342a6c3b262a59e81bdcac701763c68d84dcae926457631ee1fc59505956af0c420c14c69b8ec9a6adcda4a986bd788cd09e0b98d05a95cce232cdd04ed7c18568469f46c61bd6c8046964ba8e467468a24f16c350139332c6ddf16b421dbffa658471b66bd290e0a69c54534ea8285f3f2fe50115e58fce4b7950461933dfc74cf22078c7e5044ba04e7cac3b05e5eec0fb90e10efc0e5b6339527c051e16b15e1c535dca78f88ca8f91c52f17943c6e7928bcfea9c369fc7e0a6369765786fd1236db10ea7eafada96da941044be61957c3765f22db8e4131dd0ad93675c278dca20d20a22c1884a825b320932ca7022ce2f6a6b955a7f81e159bec1704aadfe541aebd32a4d8eaa70f84486c303250eb23457eb6559be0dfd0eee31d914d8410be548aae4b82d93e35b9745d6ce2bea11a5c50da453b60ead87f0ddd94aafcf7beb244ba924bb2393ec51131ab24f229704fd04936d1bdaf29022834835a692ea5399548f1b8a904bc0c33edfcc9369287884f48bfe11781b062e9057a827dac94b4203efcacca25498668d9f00e2ec47a021447b0b00784da8fb9f07de65eaf340ef62b0d9a3213f29aa9ba707e4efce96aa4c3a7f99d4c760112e91430b90a6a5c15593740ab5ca4fee59c8a265c54c93d6e4cf059e5487bbe436147c7bdb26b0cea38e814ff93bdc31aabbebbeb3f86d87cc1201e7d4a40507e1685a762029f10517bed0d15dc4bf6f99ad357722e2f58a04c5a1f7c01ed622bd7db797d0c2add3389f16ad7c4a6129d5502b0f91690cb533fff32898c62888bf8b0a0f3a41238d416356a7674f93be76a0710f3e3b30b87a62d6c8c256b630d96169379fe739398dd54489b14640682652f452a4b0219fd309f92487dc769222c1dec853c3bc3e50277481da27806a7522a81a2d551ba87101d4b44e50fb38a838f1010f0f366d7c62d0069ca90b38260037af13b824076e8fa7a58aebd12453f3d8a2d10663baa0ec16a05cb84828dbe6ce83baa00c0b502eea7667557e2feb032eae0bb82e01b8fb3a81bb29492ec844051029c1fd8ffcc79c57cdc94302c00f74029c50269a22efa20dbc882ef00c01bc873ac11b9558a76a874ce31a32a10bc89800e4e79d02a44677d606645400f28b7600a9cad997dd222302905f760a9097d1224d01c8af740299f2716df71989463093bac0ec11c0fcba93c0d4e8e2dac0ec17c07cd449602e5c4230130298df7412988b9710cc0176654e34d278a281c7f9c20142fd8754fb206190cb5a84dae70c9fc3b2403b4b65f550c1a29f89e0d23bc8895b7d9afe3bfe8f45715c3af2fe81e1224f3164929ee744235e472b16fd54e52acbff1dabf90b45c44cd1795706346f1347532ed1dfc14bd4c7fc0f028bcd320a3f0000 serializedProgramBytesString: - serializedSignature: cf25d50f122991a840cac349f3f01724953be805a6933b2bd601421fdeb438ed914120af1758bd232900e5a6ba184fb93475d7be742b419b46b272bfb90df10c + serializedSignature: 11095b858c4c3a4c31f056203e29f213f7961d22e1ece364a7451293c17baf44d53539542a33832f95513380e1f071fdb35acc6617f261b05d5f3bb40d168a0f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset b/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset index 0b403d9..cfbf8ea 100644 --- a/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset +++ b/Assets/SerializedUdonPrograms/76c1ffa95bc4cc14e9b51b5345f90c04.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1545f7f7e702a18b88285d4141a320a984264a09255285800a2a842484284d42b562efbd61c7de7befa8d8111bf6aed8cb63efe5dd999db9f7ec64cecdddcc3d9759de7ff890cdeecefef6cc77ced49d9d6d90c3bc9f582fefd71436910d63bdd96456c1e6b379de5fc3bced5cef9fbfa78e4f600bbd6d95f7bbcc3bd78b75ade34afeb363acbdf7bbc4dbab618bbc2b17b3726f5b2dce4f6295dedf25deb595de1e3f3acbfb5fe9858a35f22e9acc8ad978368eb58b6d5587c41471518d3c16e3f18a35f57e0f65cbbdb395c2287e931c71aa9df76b9277a6469c9beb19adc24d63fb8968cdf5ce957bd72c64733ccd9942b1e9ef1399f883f99b9de47667b9cdf6fe37937f37947f37957fc3f0fc388fddbe49c2f6046195264fa82cefffef727f177fbfc13172bfb7bf1f6bab6934071a39729b2bb779729beffd6fecfdf94c0af6273b57e0db306e8cdcef2ab78572fba4bccfb360df6311ab90fb7dfceb072b3bbac8f32a8e45fef9916d53b025d9b9be92d52a8d558b14d3b0b9dcf6ab237c328d1672dbdf42a3a5cfa7c17549c2f60461d57d06f8f117e194eff2ed5320cc5372db48a6d973daf12c79fc79ed7863e47813e47853edb8f295a7812d4f6bd73c23af590bf63d3b1b5da5693c2bc3bd006c867aeafc3aedbae7e4f117419ce075cf21d73daf5dd744bbee79e4bab5da754db5ebd66ad7a9e379609f9f7fc98f63c339f2f8407fbfd14b29f852b27383e4769dbccfcb609f6f5f90c75f01fb5e7a6415faf7cf52f97b37b97d51d379b10e9d1392d8389805cbc15d35b62f69bef292d494ac1a2bd68de4f66519fe554def654d6f7d50af4977b93f546ebf94e15e93fb4334bbd4f975daf93c705f785ea5c12ff2f8eb609f6fbf47eeb7b3765ebfdf309036f07cb116ee5779fe0d6dffcd2469b39916e757e4356f817d8f5dd31975b01b5e073b753e5dec941ec64e9dc7d88dd0c2d5879d8aeb6f2c510e2a1f553ef99ad4791b8455c7f9f61316f4fd4f7c8de6cae7b334bd5765f877c03ed4fd5d3bafda227f001b15eb3fc1b13fc031befd4aeabc0bf63dbb9a3d24f75579abec7a43bbafe2a8ec52fef01ed887e58dbadffbdafd3e4cc25f69e7817d50c6365d248f8f0cc9b2c4c06a0f704cb59d4683634a7b3d38067da0991f26e77b796c94dcbe0ec2af07e1d539e8b36343b287f1509c613cc619e2a1b4df34c4e3ad24f1781b847f138457e7603cc6cb6d134dff1d2d1e6a0be33121c57828ed770df1782f493cde07e1df05e1d539188f3de5b6a9a6ff81168f0f2ce2a1b43f34c4e3a324f1f81884ff108457e7603c7667c1b2e865b0efe5c1cd4ed0c26d60c1fa77030be643a5b33ea8d34ac5594ff74f355efaf9cfb4f39fc9ede79a1d9f6b767c21cf2bfeca7ebd8e7a0fd8a1ae83e73fd4ae5765d5cb609fc7ef362ddcd79a7d5fcbedce9acefaa0cee6cbb4b4571cbed138e8e7bfd5ce7f2bb7df69767ca771fa1fc2499d5775eb7bc00e751d3caf38e975e00f2c5807fea0e9ffc812e5b6e97a755ef9ef4424dc4fda7d7ed2eef3b3164f75dd2496c82b3fcb6d298be7add6aaad5edfb6f914b9fd5bf39bbfe5f62f166c53ffe5c7adb5acc7b660f2f85e72fb8fa6f34f729d2d54bbd764e3de2cd8369fcc8279e45f166c9ffc2b35e748db547f4ea5c57f2ce86b93c171a8b73ea8d766b5dc97ed4b319e04db7bfb04ed8a9f5fa79dcf03f785e7651ac4b66681f6a5d8e7db76c8fd76d6ceebf753edcbbdb4f35383e1c4101b685fc6f743b4cdf99fb06d2ef63d765b2a3fc2d84dab839d3a9f2e764a0f63a7ce63ecf60d86ab17bbfd34ff9bce12795ce5c719e098ca5b652c9eef0bce91c7f697f78d25c28bbff9ff9972bf010b8c9b897d2f6ddaae4a6263b9dcaab6a3b435d69005caf1980a5f69b8ff2c1007d52ead02c7a4b618ad6da6dd272b11d73c35de28c701628dc1bd1a81f0ea1c4cafd972db58d357e349ef80fd54e2a1da41301e525b8c19ebf15063b0a67880b1d55853105e9d83f1a896db269a7e0b2d1e6a5cb03ef190da3138d6a7eeb3599278b402f76a09c2ab73301e07c86d534d7f732d1e9b5bc443b16c6d88c71649e2d106dcab3508afcec17834d274b76481fa5dec83724b8cabc3fa5dbf5e9dff481e3f30789ecd3170989b884b7bd59fac6f3b40d9335fdea383b4e763b0ef8569bf3e89d63cb95565794716a89fc5bea7d1a1a56f7387e2e0bd639d58b07e9e078e43bdf541bd8efd647855c77465c1327f01380e75b795e13ed1f655d9dd4a1eef2c8f6f00fbfcbedd83e1d842b93d4886ff543b5fa3dd473fbf481e577d8854ea5d65dbb39a6daa7e58aca5cd9284cf741e2cb7dd356de5b35d346df93ca5a3eacf2dd5b49725b4bb3f8368ab7a771b4d7b1b5fbb93aa27966bda0727b4bb1ea36963e97e48f0de68fa7f5e47fa77d3d2bf9b6f6be78d91fe2abf6a6925f64dfd9425f29edbb160ff43f9cff62c51ae6c0fc2f26d7716ccbfdd7dddaeaa1f9fa5dd6307162cc377d07477d4ceef28b73d800d3de4365b639eeddfbbcb28ffbe5d566969bfb396f68782e3d0c65d5830cfabfd37a56f291f5169bf9366c74ebe1ddbaa678c870579c6d3615d1df6a9ebf2b4f3ebb4f3d07e705e318d5fdf534b7f75fd30edbcae7fb8e61f4a5fa5432f166c57f7d2b8e9f139423bafeea7da5f2a1d7a6bbed05bf3951c16ecd72bfd15da79a57f64305c2c9705dae5a1f3682e725ecfa37abcf2b478a9f451f152cfcadfd338e707756ba5eff6207d79d9a7ca77ac1c50ed8c749421074b1b0a98b90c296489fc5b08c2f26d1f162c43faf8badd4f911a59da3dfa6afcfa6abafdb4f3b2ee8f15011b8ae4b63f0be6ddfefebdbb9de2dfb79b1a1b547974a0e6d38782e3d046f5bce6136d5f9621ddd5f34a55860cd0ec182019c8b6323b2ac8132d4374fbd47579daf975da7955861c1c3caf98c6af57cfbd5ed2ae1fa69dd7f5551952a0e9ab7418c48265c8208d9b1e9f23b4f37a19a2d26177cd1776d77c65300b96214a7f85765e2f4364b8d8106657860c41ce6365888ad7502d5e2afd55bc8605e315e73c2ca85b2b7d0b41faf2ba4eb573325186c871e35831339721c35922ff0e0761f976040b9621237cdd6c758f2ced1ea3347ea334dd12ed7c89dc8e0436c8e772b13d5830efeee1dfbb8764b8839afba2d2688ce6d38782e3d0c6f12c5886a87d598664ab3939aa0c19add9315a3250cf2d8e0ef244cb10dd3e755d9e767e9d765e9521cb82e715d3f8f563b5f457d70fd3ceebfaaa0c29d6f4553a8c63c132649cc64d8fcf11da79bd0c51e93041f385099aafecc9826588d25fa19dd7cb10192e3691d995211391f35819a2e235498bd7242d5ea5c178c5399706756ba5ef7090be9e9ff6e80cfcadbe65883ef6a0c6783f06fb5e989d2624d152cf085479328505cb8c2952e304dfee9d5607ef1d53e3bcaf06f5627b697aeb837a3babfca6f2d7de9a3f2e00c7a1ee3e2c98ffd57e2a63ee5859abe23e95d59ef3a1ee3b8d05cadfd854709c6ff7d5b8edeb6be4dc2575b234bdfd353fdb5fd39dae9d9f2eb7fb011b9b689a65da35659ae68ca0efc6fd66ef84a60803b8c766ca6bbe00fb5ebc7ade160caf9e7da3e13f04f6c3eb8e65c17caaf2a38a53b916a7722d4e2afddf0beab3e3e47e85e69fc7cbad2ae72a83be20f6d5757c3b4bf3df597e7c7afd1d0c171f9fa992e1bf04fb7c3b5b1e7f5eb36fb666e757c1e3225cb3e0352a0e22aeb00c5571cb03fbd0cff5eb67585e5f6e79fd3e96d74f0d777dfc7e9fd511fe833aeef74e3dafdfc7f2fa72cbeb67585ebf5ff07a9507e3759ce223ebb89d950fdbd471aa6c3e8025f2816a771e28755e06fb5edeccbd490b77000b9401b10382f6c4e6687e361a1ce7db6a79fe6b4db75ad3ffca8f77eedaa04efc3e9a8eba5ecc17823adf68e74781b8879dab3e4be3389705eba9b93eb3bcd9beed79ab6478550ece0bb2537ab1799ade7a4defcda08e7856942c0eea7e0bb4345de0eb15e46ae1166a69aada858ab56a1f2a1fab02c7f976be96a6cace42701eec33550f7c0bf6a15e8dc6b546da9d1d0c1fb74fb5435f0aeac475176bf65782eba07d7af86ffd742c506dbe2a43bca00f2a9dbad227998fa9e7e54b8086badf5256bb4da5da32aa4ff43608ab8ef3ed728de9725fa38f6a1366697a87b060f97488a67ba8765ef5310f0336ce90c70e4f1c8b1d068ef1ad1a0f7a17ec73bb54fc1a6b761da1ddf708cdae152cd8865921af2fd3eef7be76bf5c4d073ca3528cd4b9b8df2d658132bae021702d0fb7bf851fc83e02eb9742d893e4f6448bfba9b1d093e5f6d444fc8bc6a4707d1b9f635185bce66279fc34a0c7b7a72774471427d195e163474ac6df817d7e9fb5f23e1f26d190fd42f1ee5533f0b7777d5ff9fcb76f5719b60712966f8f06c78e96d7abb66a37cd278e66c1325cf5c18f021a47498d55f2daeee038bff6152d9c7ade7d06abfbddb1f672abca0cd5277816ec7b9afd54597a660ae9a334551c8fd3348f939a6a5e6637cd062cbc6a5b9c95820d1a67b10fdb19ca46d577385ebbe7f1fe3dfb77d6f4bad6115ecde7ef288f9fa0a5d10932dcbebebdfdd51c88edea08afc6d6ce4e21ee3d81a6cadfbafdea3e6f05efc387f96138715db23242e5e773e5563de3392f61d78064ef7d6ae5c18045f21a95d6e7033dbe5d09e27b53125d193e76220b960727cafbbc2beff37d128d0e2ce8972769697e92af355071bf20055b95a6f2bb9335cd93a5a6e2a8a71b127e57d55652f34e4ed1fce814a9bbdeb767a09a73bc7df2f0bb2a3fb83085b8f5049abadfe9f950b5ad3a04cfc7ed7856b3e32a4dafb08ef0aa0d7c510a76eb9aa7b260dbe7545f7350e760b894f386f4ed4113fcfb0e52e59eaa872fae43472f4f4fd3e27c9ad47f9719e323f4415e4f7a0fe597a76bf738ddbfc76ef769f790fe113b430b7f860c5fecc779b7336478552e9e9988b3f89b87956dc27859a88751bacdc0dfa9f04b957392348c9d25e3a7e6e85f0a8ef3edd92c38fe7bb61fa7dd55bddf4e6e2f49d1d6bac225f3b72be47695dc5e05b42e97dbabc13175cf6b583c6f94a8fc76a5dc5e6661cf0d72abea3068cff5067b543992cc9e6b2decb9516e55fedf41a6ddf7609fa7e1b92cd8ff56e5c379897bc7ce0361f9f67c162c3bcef7fd60c8df9ab6ba6e250bf64f56caed052cd817bf40ea5c8584fb410ba7da805de5360fecc3beef79c1f3621ff45186b4d574d47ca81f3526e780f420e0376c5f4dbb9efc866e40c269fc86a9b253cdf73a47bbdfbae0f138bf73c2f11d5a9a82bf2a1b2e44785e04785e04c2f2ad2afbd7827d2f7ec57afcd47597683c2f91e1d45cac9f82e1e3f1ba2818af612abfa612afcb9078ad02f15a05c2f2ede55abc2ef7e335bca5a6adaebb428b972a23559beea760f878bc5605e355aceaa86ef2fca5c0ef95dd5702bbaf04e192d9bd5a6adc2c8f5fc502f54d4cf134b4abd53de2365f19b479b84aeb5be4be6afba530f61b68e3a87a623bc331d8e64ba67baba60ffacfa22fc3b7c726e2b853cb7ade47bd3b9867b8cfca14eeb35d8af7b95d6eef94db3b129a6307cb63ddfd341e99ac1f946a9d743533e7155557aabf5558bebd96057dee5adf9e51ab346d75dd752c985764bd1dbb9e05cbd4eba54e3f24dc0f5ab865c170b5f29e3aae9735d704d352ec03ff1ea9ae33f9ac6a4b7467b57d16cce165ea59f1dd72abe68e845927e81eb9bd37892ff434dc3b95b1baee2986bf8f05c701557be1062ded6ef0d3a464831f7e0fddffaface37e4af746a9abdef354fe7813b85e95c5b732b3efde96081bbb0d84e5db5b58d0776ff1ed1efd8da6adaebb9d057d57e6cfd81d2ce89377f83a7ba8f87fe36f47afd1ae93f93276a7bcfe17b00fcfdf25cfff0af6f9f66e795caead10bb47eeab7524ae06c7f9f65e79fe0f70bd3aceb7f7c9f37f82fd46c06e557ee4817dd81ed1ca45b10ff2d21eaabf728daf3b46f50be5367673c2a7c7c879d5aa0f1f3fa7fe06f9289e8ecf827daebf52b3bb2bf03f10be960ff2fbafd5ae2dd4ae4dd6df4d9687ee97d7ff9542d8074284ddd68ff3d81572ff41b9bd43c643ddf76f6d5f696f238fab7bbe0cf63ddd716d35bd0713e9a1ae8dcfe17a486a7caa9daf011aa6f361def708d30753efc2aafaaeb51fa73dd5731df54edbc35adc1f967157e33d6a5ecd2320ee5b826350e30bb0cfb70f25ae117f7bbae33b0735e2736d1ed23454f8d532dcc39add8f027ba41d717f55ef0f7fa81ddf15d8f3a83c36a876bcc45a24baf6ee2c9e4f1b7da3d9f298c6f031dff6092aae8ae1e340b72d380635be00fb7cbb1ad8bc5aeace086ac419aed634566b69aee2acec7e02d8a338630ce1ba48cdc0f53a4365d36e066d13c3bac6f9f87dd6807bae917152e3fc8ad3932c382efd24080fc761d5f52b93dc5f8e2feea99e3da836463b10a7c7355eb03d2c6d32b6875389ef5320be4ff9b64c54f588641e53ebb57d07f65578185f75fd0949ee2fe33b51951daacd02e3bb46f303185fe50775c6372b26ded51ec52a59195bc072f84be8311efb54970f5557d6bd70a878df9dffe23f3b8adb2e62cbbd4b2b4dab774e166b832e62055efbd4b47a6707f14eb3bafb30f1bbcc0b512d44ff89d5bac5fdb56ec18d9be3fdab044b8fd678c7478a954bf9e2a3d5de99de6c8cb7e557cdf0504ff3fe0555a678b79dc3167b7ba5deef05426f866776ed907545892f53aa5f33d1d3f457519deb1d51401778fb73848593c4ef25c2d24a617d89776c9158d3751eab6243bded3271b7da715fe8fd6dba67a94466b6d1bc982a76dc5fb2552553b1171b6e7d8ef0f3ff4b918d91221c7d639e3ff84fa31c51139d542b25fe8fa15fc8f08e6689d4c813c8628163f92c47cc139a588b60f838d68ea1d9bf7dde455e45972c2e66323cb93b89182452f8ad3b8f2f7a7887e5ef6405a356c0721af3a875ae236ac9c072bd6cb1ea4b9828646535cae586eaf86326fc629afaa40ce2f7c3558b70e113a0b1a8fc820920967128f5fe58e6fd9f038c9d2f2251c1a60ab3386a7ee32aef1f37be567ae572f1260279ed0ab52eb331e80d4cd0c55a1ea51bc5e7b1e5bc93636f1a8f45027b8e682db54fe29cd8bd44f3a9a16c43a9ecd36c70cbf9a7ecfdf9c56f8e2dec3b30b7ffe559e6f4692ed2a73e77c552a8a129859a673a5bd45d0f244b9f16f17825d287ff9819b6447cbc2e1b30828d4c045b6c1c1fe7b6d7cfc7f9c4f75d3486667ead92fa60320b3082592682a2c731398304c77b161e205b8ff563b879ca0c5b0b861d6ac52e151b308a8d0d147339c52d4c6635d3cce21621c24d30e13696c24d31e12d2d859b991c6ab34c67497e6ebe5029f3c28677273ef6d2532fd6ccfeb4159227eb3601f3a6e6a6b4e108b7365aa527ce5678e2b4c094dbd92ab7c494dbdb2a6f667228f1de6ee6dbeef5ab237959d32ee53ab2234bd6f40e5b43b632d113abc1ed4b4aaff69092fa6ba877ed6c8fc312314eb0d8bbde3404959c68a7944bfbce826657661a180b671146787393e773ec5db064d79dbf23eefcadb16cb58d6db6dac2a4cce3b26d2a1540675cb80d66725783c9b130266f6952e635643766e89b195137c1d5db62eadba5437d2b4c7dfb74a86f6dcae5c277e692e6f2c9de317fe076b8385b2d7abb89f1c06af1a1a785f1f614167e8297ff968b4f46957bbfc78a0f442d16f6242f07baa75c0ef410e5001f09a2b7192b29da61396307dbccdc1e2b83764c4319d40113cf4e8378478cc94eb64c3a61ca3bdb2a77c6947bda2a77c1947bd92a6f6352169d2653160a51dc6f8b99dcdbd6e4ae98dfe5a4c1efba61e2b96910df0e639267cb647b4c39df56b93ba65c60abdc03532eb455dec1a4ccabbd3ea938750f5c78474cb8c852381b73bbbe6970bb9d4ce2bc33d92f1e3821fe9ff7534bbc252ebe3366797f83e50d425ade13739101061709d566ec8531196860b2c264761226bb60e2bb1ac4cf0829de1b131f64105f15523cc7209e23ba0447b2cc760bcdb313468a8f9a560606e5120f5778038c5ba41e4f4ff4b6b38415fc38b7a2ee590dc91b96bbc5f980c70ea267339ca53ec7823e167c1e5073513b9b9bbd83196ff6ba6533d63cce35393ceff40c61862e1277d6e9725084df7f9e3835c1bb034fcd12d9680fd389cac34ab8a186122e16b284cb376538d1a19db751331cefd3f0b91d35e2ef2532794bc5bd13cf1c6db2d2302f7e5d0c359ba8dd8c4e5b2c9c363f05a74d87f5983b1660e5ef7043f9db3d16aefc2dc47c6d84c1d758485feb83593ed260794548cb8b30f15106f163428af7c5c44b0ce26b438af73389f346065f68c9aa1dda1f531e6dab3c000332c604a44138200331f1b106f1bb1a8513df15f3f07169f0f041a6d2540ce0559396a6c9c68e821564b291235532a63ecec5975d4d6d9c6b82283b79c394ce56acc4dccd94e4bcc2ddd3647e889a797753728b11d54c3ea4861371eaf7907a62cac93889991f52a76203963c83b1ec5e6ac8ee2bb3c265f72126f1964c7e71476f498bf1eafa3d82172bc73662fe4f6fefa7495698c7d3434d76f2b6e45e063b73798b9f2f99d54024ca3e22517a27c95ba6c673f8dc552b3e83f1f80cc38ad9a98662b661c862b618cbd07c79db5a2d725e259900746587786dfbc3bcadefbb5e9b43fc3ddffbcd235f252705f37cd9553c805be4f5ace77bfd8a5dbc23650258a577a632dec0e38a79427196c8b973c575fe143b8e969fcff7ce0ff0b605deb65ba8d26638e6cafb9a5c84bbf27e763e3902c3bcbf09f38cb460ae3fccae6c299b2d8bd3aee2b9299fe93847eaf239c715deb145e2ac7ffd02a15b25aca8f1fe854b8e9158b135dd506c5ddc3c5cb135ca54b388e734999c5c30c40bc53d7d793dea941929d72965cc3cb120f9ddb1daa4c4942c9cdc4c93417a9294e149b2872949c403ae4cce8ad44bf07089529e72a25430f38cc8baee8f25cb68133df1046fcf0cd24b65cebe995c65cae46609725bd58a55d269ed08b5312667e6d4c47710357326986ad159b8438fc50ab0d98602aca245b8026c1c6679b5c1f226212d1f8f597e80c1f25e2dc3593e01abf50e34d57acc647a925a634fccf43906d37f0e69fa444c7cae417c42eb70e2934ce2bc45c7070a6d3bcea598f8fc34884fc6c417a4417c8a499c77f90f329518baf0045c782f9330f7ac85a9082771c1bd312fa9317849e116e1bc641f93380fbf88218d54b11474fd1ba953314c4b4cd995174b611ba9bc3272b13f300d43bd1443bdcc0ef5be18eae526d433d3863a3a7d82fdb0ac75b0216b8d6a1b2e6bed8f156387a4a1189b8e891f9a06f119581979986519598679e4e19665e44c0cc711061cc6290b497094635eb2c254006f15ce4b2a4ce2bc1d7f642a4892f47f2a31e1a32c856761ac8f4e83eb5599c4793bf49854ac4ed2069d8d25e2b18644fc3b64225663e2c719c4d76c1d4efc004cfc7883f829edc2891f88899f6010dfbb7d38f13998a79c98064f998b899f9406f17998f8c969109f6f12e72313a7a4e2e315b8f00293302f35f9f2ceb52a7cfe90346c85bf88c11790c3b5aac255cd07617139cd14177ea26be0ae61eeb510bbd7e9a67bf18a70baf72fd7fb5f5eeb21183fc357225928c886b1a206b3e20c93156d80157365e3a74cb0afbf058b300bce3459d01c5830ddebfe2c148f26c2d5db8bb1e2e72c53d9d6315cf1b304cbc467a721132fc52c3fc760f917212d5f86597e6e1a2c5f8e597e9ec1f2e24ee12c3f18b3fcfc34587e08e69f2b4dfec9e7614d9365d97e5ed9304d96430364a7c33fb6b7d8eec276f37e0f076556b9109ae3fdc55fe358e01d9b2dca97656210b3521cad0859a61d8ad97f81c97e3ead2261d150ef448d2859559c06c8f8ec677830e397d97a076aae0851239ffbfa5d313f7e35cc1f905d2eae0c13a7c34c71e20e7261fc84d6ab15eb283761fe4f6fff275cc7f670ccc92e363859a3904e7604267e89413c2ba4f80a4cfc528378e390e24762ee7599c9bdbaa7943dfc7e798eb72d94c7fcac7208eb23c31679db300e7314e630ab3087b9dcda618ec6ee790576cf2badef790c96d457a5a1243cd624ce9b905733bb26e47118a96b305262e9e52c482a1ca7e3314ed7a581d30926715ed75dcf6ad77537f50957d79d6812e7d3f5f8cac356d3f54ec2946fb4553ed9a09c235e9e9bc132317f78122b66a3e395596f797c82a758262a9f856c88b84362be6df08ae44ffd6e3279bff1a91f5fbc375b9481e9b20c7b26780ae682b7185c30b7289c0b9e6a12e7c9796b2ae5c0cdb8f06998d5b719ac3e21a4d5a76356df6e69f51998d57718ac5edd379cd56762e2771ac4b3fb85133f0b13bfcb545085143f1b13bfdb207e5dff70e2e76089798f65629e8b597dafc1eac103c2597d1e66f57d96569f8f597dbfc1ea9521ad5e8959fd80a5d51760563f68b0ba786038ab2fc4c41f328877dd359cf84598f8c306f137438a5f6c12e7f5305f83daaa1ebe04537ed456f952cc47565bfac86598c98fd99abc0a33f9714b932f3708e78817fa33bb60a4dfe1e63ae16732f1a59cb73535838ded9a350c5bfd31b90d58ebe50a53d2f0ecf5a4217bfdbc7bb8ec7525e6514fd97ad45598473d6de951579b84b9473d8325932ebe0617bf06e3f1ac2d8f6b31e5e76c95afc3483f6f49fa7a8cf4da3490be0173eb170c6e7dcce0706e7da3499cbf1bb02e7e427b37e045a6de0d7889d5f5de4da97ccc52c36689fc3b97f8cd809b4cb1e14f645f36c586c7e11511879c2471d0d7c8a9effa38219effde8ca5f8ab86145f393c5c8adf8289af3788bf1452fc564cfc3583f8a123c289df8689bf6e10df1052fc764cfc0d8378bf91e1c4ef3089f311bb37532978920c50de8909f38fedd41a46e54b21f2b7d7fde705e5c235fd294a61ee79175664bc8d1519fceb4ff28dfd1099f96e2c6eef9ae2c62b88e96c84c88afcc9c1ec404cc3c4ef1ecc13de3378427149384fb8178bd4fba648b545136c1ce38f771681872e61a2781f16c50f0c51bc2b6414efc7a2f8a1298a7c77787c458330917800bbcf47d87dc630be82c39290fefe20769f8f4df7e103dbd3c002e903e28d73f3c2e8fc3145186b1ec2acf9c4640d5fed2af9fdc3dcfb61cc6d3618dc66f5f8706ef388499c37e63e35142b39623db2fabd2bcabf95d5584caef77e4c0f0026e1463e8a11f8dc40a0d19ee108acc6087c612a5839812f2da2f298e96ebc31fc15b36b0c3f8e31fadac0e8e7908c9ec0acfec6d2ea3598d5df1aacde30319cd54f9ac4798dc5bfbf64d5a579caa4cc9f48f12fd5da3e917a1a13ff3e0de2cf604c7eb065f2ac4139472c337860ad0263e3ac9450d73a9be1574bf8d1e4fec65117fe19d7ba7b3cf6f662a334cf61a5dccfa9e4e02405daf398f02f96c26b31e15f2d855fc0b2c06fb659601da6fcbbadf28b98f21fb6ca2f61ca7fda2abf6c52e6e5d85f6928c75ec1ccfedbd6ec574dcabc1cfb2715bffb09175e6f12e6d5d7bfa90827991ff11a06fabf34807e1dc3c1df94b4c1f10696bf63a90827c9df6f629c1ba4229c84f35b18e786317bce6f63381a59e2780713ceb2147e17e3dcd892f37b18e72669e0fc3e86a3a9258e0f30e16696c21f629c9b5b72fe08e3dc220d9c3fc670b4b4c4f189499897fc9bc52c4bfe0d188f5669e0f129c663734b1e9f61c2ad2d853fc7706c91061c5f60e26dd220fea5499c8fb06c990a922443315f61bed7d6d6f7bec6786c95061edf602eb2b5a58b7c8b09b7b314fe0ec3d13e0d38fe8789774883f8f798ef75b4f4bd1f30ab3ba5c1ea1f31f1ce6910ff0913ef9206f19f31f16dd220fe8b413c477ce080bf7299f9318d74acfa967c4463db54bc741f9cd8af98fb77b574ffdfb074ee968674fedd24ce1f036d978ad5495e67ffc3e440e24316b3368a03d139cef62652c6a130be8271768caff24f61253600f6a72989794af4482589c5aacb66e1bf4cc2e25b3bb66d82bf31e51d6d95ffc194b36d95ffc59477b255fe0f2b00764e4301c007338c66f7b4353b6652e666f74a83d90d30b377b135bba149990ffbf4b61cf6696412e6bdd91ccbde6c16063a370da01b6338f22c71343109f374c9b76c4137c5381758726e86712e4c03e7e6188e3e96385a60c24596c22d31ce7d2d396f8671ee9706cead301cfd2d716c8e090fb0146e8d711e68c9790b8cf3ae69e0dc06c331c812c79698d5bba5c1eab698f8ee6910dfca24ce1bfe832d7b085b9b8479676d88659fa61d66f1504b8bdb63c2c32c853b60ed8262db7641474c79b8ad7227cce946a4c1e93a63668fb435bb0ba63cca56791b4cb9c456795bcceff6b0f4bbae98f0684be16e188b31b62cb6c3dc6e6c1adc6e7b4c7c5c1ac4bb634cc6db32e96152e6931a27a4928c493ee1b903d68cded3b219bda34958cce3b51cc0c9c6204fb285bc13a65c6aabbc33960b275be6c29e983b4f49833bf7c2aaefbd2cabef5d301c7b5be2e88d35eef6b16cdce560164fb5b43817139e66299c87a1d8d712453e66f17e96161760bebc7f1a7cb910139f9e06f13e58c131c3b6e028c2cafd32cb72bf2f56eecfb42cf7fb61e57eb965b9df1f835c610b7900a65c69ab3c10cb2bb32cf3caae983b57a5c19d0761e5fe6ccb727f370c47b5258eddb1c2ee00cbc26e3066f18196160fc184e7580a0fc550ccb544310cb3789ea5c5c5982fcf4f832f0fc7c417a4417c0456701c645b708cc4cafd8596e5fe28acdcafb12cf74bb0727f9165b9bf070679b12de4d198f2125be531585e596a9957c662eebc2c0dee3c0e2bf7975b96fbe3311c075be298801576875816767b62161f6a69f1444cf8304be149188ac32d519462161f6169f1642cfbadb0cd7e5330e5236d95f7c2f2df5169c87f7b63a48fb624bd0f267c8ca5f0540cc7b169c0310d133f2e0de2fb622e72bcad8bec8755dd275856ddfb6355f7899655f774acea3ec9b2ea9e81f9ddc9967e57861576a75816763331b738d5d62dca31934fb334b902cb26a7a7219b5462e267a4417c1606fb4c5bd85598d967a5c1ecd92671fedcfbec545232c973ef6a93305f16ec9c5484cb70e103301ce7a601c781582a9e679b8a7330b3cf4f83d97331b357da9a3d0f33fb8234983d1ff3910b2d7d6401c6e3225b1e07613c2e4e038f8598f8256910afc1985c6acb641166f66569307b3126be2a0de24b30f1cbd320be1413bf220de2cb30f12bd320be1c7395ab6c5de5604cf96a5be543b006e535960dca43b106e5b5960dcac34cc27ccaf875a9082799327e38267cbda5f01158b3ef06cb66df0aac6d7da365dbfa48ccdf6eb2f5b7a330e59b6d958fc6946fb1553e0653bed556f9584cf9365be5e330e5db6d958fc794efb0553e0153bed356f9444cf92e5be59330e5bb6d954fc694efb1553e0553bed756f9544cf93e5be5d330e5fb6d954fc7941fb0553e03537ed056f94c4cf9215be5b34ccabccdf3702a554a9235c5cec64c7ec4d6e473b036dda36968d39d8b89af4e83f87998f86369103f1f03feb82df09506e59caedeee465c53cc7e55e23a56734fc5fd5fc1995d80a5c61adbd4b81073a227d3e0441761e24fa541fc628cc9d3b64c2e3129730f7dc632192fc5783c9b061e9761e2cfa5417c1526fe7c1ac42fc75272ad6d4a5e81a5e40b96297925c6635d1a785c85d5a22f5ad6a2576356bf9406abafc1c45f4e83f8b5988bbc62eb22d7612ef2aaa58b5c8f99bcded6e41b30e5d76c956f34d5cdddbcdd18ff427be6ebe629cc5f3080d7a205695edce0f5185fe42d082b673b1ed79e0c5fc6c0ce22ee57e057967931853762fca57d3a2bb0e5146ec272f09b69c8c13763e26fa541fc162c47bc6d9b236ec5cc7e270d66df8689bf9b06f1dbb182ed3dcb82ed0e0cf6fbb6b0ef3429f3e2e703435ecddd2e90976486d2eff6063eb07a1776b70f29ee76b7e96efcc3361fc5ec3f6c730f26fe711ac4efc5c43f4983f87d98336db075a6fb4dca7cd4fad354fc3fd9d71230933fb335f941cce4cf2d4d7e0833f90b5b931fc694bfb4557e0483f195258c474dc2fcd9d2d7a9082779b6b41a63f18d2d8bc730e56f6d951fc7287f6749f9098cf2ff2c29afc1587c6fcbe2494cf9075be5a730e51f6d959fc6947fb2557e06f38c9f6386cfa39c2276f9f791277bed4cdec6f7fb0373c5df25f1cfd2ccf22ef1fb0325f190892feff85fe8a9f45aaf4b44e8de6cbaf76f92385be1292e16ed78ae9bb8a698f18fc3f85f6bae6023c477d2e68a3bf8d726dafef09326c133be7d055e0ca72789056f592f66fc232889bb978afe8fd20caa4ef1aee2a38a61b2cdb318f55f4cd4873086c4c32737dfeb8f4df7ac3dc80b5e26c638790f41b713c61e3b1e3cc37b6ff3455f827f932e4cfc9ec3e2f7ab297e4568fc867829b950a4ba1f53d51b4a1637ec4c422b4c4c9ec762f29b2926fdb498c0e5f0ece362560b139bb5586c7eafbfdf8d11b9b0c6cb23b3859f6c4cbf7b018bdf1fa6f88d6258dfbbf6173dea977ae1d5c3c4761d16db3f4db11d14c2377959bc28e594844ae9281d5fc4e2f5572a790e96fff679ceac1626362f61b1f9db149bdd53ca73433ca215c2b3aa8517d9e7b9c49930717b198bdb3fa6b80d88b71e2679f5f9682f9f9779f7aff472c922319ee8c7c71f45e4f695787f4d91355a45d2d2307d25c82b588cfe35c568372db582f78529c64b8232cf7b968b2f1156b13234ed821ae98bd9ab58ccfe33c5ac8716333d2755c912628c28c1aabcbf67a7c9a7d66376b206063b47a7945f468ad1d132d93a5535d578efef44ab6963d65baf61718e99e28c2fc00bf344309de6c9f672b2f22d8cc5af6316373059bc6b889a36687715abbd6e365eb39a56d90e13ab37b0583534c56a58929ac78fc508f915e732431985f753cc3573ba52ee4d2c8e8d4c71ec83a61cef91cdf402a9b88ef1e25ae58558289efed4ae63d3dd4a780b8b4796291ec516e5c4c62c19dec662d9d814cb5c34967af93db2ce165e3acaf27730eb9b98accf0fd1420d6b7f7d4b8477b1183435c56052889219efb5d7ad905a9874f9e07b188366a9a462b2f678d854ac6f99f73e1683e6a99415b5cbf5d4465cf0123e78265de9f40116cb16a6580e4da9449ce4059e29ac2d135eb571fb1b1f62316c698aa1dee34de689e17abcc9d2af3e75d94758bc3633c56b60caa57cb858e1a9559f387d8cc5a9552a792e4c7989b732e8fb8b9f60b1dc3c95de0a458b31f558d7b734dd80c5b9b529ce4342d78925a2473047cc29aa66c9dafb3469fa2916bf2d4cf1ab64b4cf4416b109a2455d259f794c11e308d5deef992276f5f512fb1cfe19c6a98d89d364624ef8b3a3e484ec397c8e71d8d2c461ef8d5c0650970e5f6034da9a688c48b1ad5522f2bb5bedad2fb1986e658ae9f094da5b63c5ec3ddece5225203e5298a956d757583cb74e6554446f930c1331ad9d7a70a42395e3e96dad7c8dc5b11d56a7258f63621c81dbc9c371ef2a3794d7a5dedf0bc4f1d46257bfa710df60f16b8f8dd7258b9f5f2f252e48bd1596de54fb168b550753aca6a5d933b1fc17367c7a997c8731e9686252c0cccf64fc6313e2732e167ab1e2b3be83a3b3d55e583eee576e1c41af7fc9fa3f2c0e9d4c71d80d89c33861e552519b1e18a853124f2f94ed30a63c4418266162f63d16b3cea698f542dbced8b8b93fa252fbac3f4fa6b49ea5c70f98d55db05148dc6af8165e30352ac5530abf555bfb795ffdbde947ccfa6db016496ad6a77b4e80593b4c4c7fc262ba6df8a732b5d3a9a61ee9948e12ed672c565d4db1ea57af12cdcf37133ceb6ab4e7ea6642c17733c2c4e6172c36dd4cb1d923641a0df38ecc17f1ad91f1a98ef781528909458c7fc562bc9d29c6fba3310e5a90da28656a71de58647ec3c86c8fd5d5a99351a56a8dd76b5ae8f52bcabc23feb58b85c7d4ee3df935a4787728441c7ec7e2d03d5c8d3656b497677bfdffa0fdc3bd14ae11f3434c7da0fa5afd0766758fd49ef426ee1a665e0ebc2ed999f4c4f14f2c8e3ba4f6d4c31cc7bae6fbd52f8ef5afddffc262b963b8b689f97936f553ecbf31ebb3eb37e320553faccf4849dd23424dbc7fb1580befcfe1a2d6e1f39d1275500dcbd9de3b25d2c0af8d7bc747f87a07460313c7f9fde77accb96f94c65b1dfc5dc8e40a3b35f01f918b9f1d631cfd22d9d1367cc05bd5a595a0f6a8115f6daf14beb1508cc4f4f67ca25a5ca5de68ad2b16a651cdde605c13c6aeee38a9375df9dcf47251d6f3da7fa6e73f4d648c949647ba3b27bda9c574679eaa9d64aa36c8e9c1e47bbcf5f1a6baade8c9efd6d0ec43ed6a9185b9c364bb2f304ece508af17732a6cbe16c9ebfcbc5c09f3f64c43baecbbcbf1243d875de5dfff0ba7ef75d84801a6baa536e32e8b498e43a0897f38b9985b242685fc25893ac06b93c557a51a2db42a04b78dc3cd9839f2f244b64e91e0564fce554856c174a649d05b2e92c974d37a09becdda542fade2851015730fff5fe1a2f325100b9ba7b02646f4a902d04c8e1a0073c558eb24401d38261094c396efa5b5e2440f6eb9c00994b0972f30048de72e52654c9da99238b02ae15ad13b8f2e8ab06850b0ef670a3a394557fde2d812c9f12d996de8eea6beb7568b57cda7a30e3237d51c0d6af41025b017dfb8dfb13f4b252215125802e949da0a864d2464509748594e83613e846880b7839363bd00c8e02aa39a0a9db8712556381ca7f7cbc30228dda73fa24e01451c26923e0989fe145adb8cf1d9480d697125a3bb4868c72d9550ccaae7e94f89ac57dae4a8c8496892e7a1410b51c9b40d49f12d1d6297bd8b2c874d44b0724e00d70b3e35410099087764d801c48ddac4de67d1385419511f1bf0dc313d876a5c4d692e1c3925100d5726402d420ea8eb9ea3645b7bbf4331880dc8ddeaf8a457b3f8a2367a38a13a076cfcc00638d97f5f8eda334a0cd1fed294c83e9fb90aa9ee4e555d4c6c436344aa01a4289aa55a0a4aa11f5207f44a7a6444601d66ad0a71c4a09ab03c31aaffadcb0a8f53057ed9e40382c535da468f5223f1c9340544c8968fb7a7959b0011b9dcc9b3b3881753825d6b62c9531d9e8f43adb8a5e67932c4d5c7f67aafeb33ac2d1c6e79ff0c63007bb401c5d249abfda7c941dbc20ce593e02ce27c94ed2f6ca4e71d241760afd82ec108f5cb2eb68e864a7f08030dbea69accdd5055657e77b57ebe3dfd975b666b2433e99c9aec7886876a892263bf4885876ca43dbd9293ef1ccae67c3263b8d55557692c913d9493b88d921467394927908233be4bcabec3a1e566523ad9d6c64a0383141d23cb13197e31ef9fff9dcc5dceedea1511c025f9d98fff86d8712ea018aca7894fd171cfdcf69d4aadc3bd7ba57f02b29aa4d60ba6bb340aba1632a11a9d75c3c966872ed41896d1b593cf8337ce7b1392cf5554fa7b3223ab413a8d03e0a86cc4653a26d6f409bec45abbcda8f00d287732b2a9c0ce01ce312cefc48e2dc09e01ceb12ce8248e29c09708e7309676124711e0d708e7709679f48e23c15e09ce012cea248e2bc16e0dcd3259c7d2389f331807362267056a140a1f9bcec246c77b6a4c2f9304be09ce412cebc48e2dc0fe02c7509674124715e04704e7609677e24719e02704ec9c4643d0c6630a3f789e050c87f00e55eaea02c8824cac5a046dfdb1594f991443916a0dcc71594859144792b403995fe951fde1ce76b20a94704dc603e48bc4c9c5b201e54f10ba20772192829a7656292335e87639fc0a8f57668fab0b6a6c23a1c60dd3753ef8a722facf27065c8272ba8e01d0be0ed4709af358057bdc964e95900dffed4f331cb59704532fec4c7e7113d705d01b8e9997863b9aff0b4e0229419f0bc9ba9005e0500ced8980d1c28475a8134a142f93d4059463d5378ba80e4572019f3c2322a749500dd4cfaa987d345107fbd676c9567420f9c4585711cc0589e090fccdd643cb004a0abd8b8e5a02fe5afbe974b87720d15cabb4147af321399392fd0d153a733e49164d5c95ec023676ddc6e1e14cc50376f1215d6d5006b1525d6ed4019a9bc34f599993c2c3799b0514ef644f14a80787626ca52ac360fb62909cb52b24200bea8579d496f0d378f38cade7a19407c00f522314bbc93e572ba71f4506d0b501d48ddbe5cc2d427c5d5d4693560514387ae0715ba1d01ba39d42f26cf0ebca231448c31d65a20320243b24d01b4b91b035a14c7b19b0068f332d16e0cdb6a247d1248d66e2c03bd9af92e62257dec4f86b505c0ba807a1532ff02f532d210f9260eef3846790cbc1bc8f007b9341f9274c6195923a723f0c8852ee1249d2245867300c059e3124ed2097c6438e7029c8b5cc2493a5b970ce77100e7629770f68924ce3300ce252ee12c8a24ce5b00cea52ee1ec1b499c4f019ccba8c725f94dd5ebe7b50730c6b37942d4b85c70045076610994cb5d9917994739c841d67cff11a03cd81594059144390f64f0435c41991f49949d00ca435d4159184994ab00cac3a847316789d37c1990248bf547a082e90e4ac5c3dd9ce45c18c1c1e1c300d623dc99eed73f828f667340b65e41bde44df0e14406462b5b51616b043cf0c84cccd8cd13cfa6cb18ffd0e6625693a979416ba8005e0f001e45bd406870c4dcb05c7604aa927600d8d199f86647aaefbc12967a646fbc0e06308f710966bf08c21c08601eeb124cc2278964308b00cce35c8249d84e2483d907c03cde25987d230873008079824b30a3b8e4425f00f344976012ce152283b90b8079924b3009e7ea92c1ec05609eec124cc255a9c860160098a7b804937004920c666f00f3d44cc0c426e4ebcf1109b3395977b22780799a4b30092b203298270198a7bbf1e2276106277bf1f32680f10ceae517e0ebef89a5d4138bb1476f28774b80ef4cfa4fe1fa6fd7cc95372f13836b517f5bf10e80f0ac4c4c55c9157576b20f7844f9a5a47e00e7d999f890167f4a388705d754c1e75944ef21ec12f0b4e61cd780123683c880c600d0732981f29780828fbf08dfff227bf09a0532f47999f8d243f045ce11d20f831fef2961700125e2b292cc13f70768cf77e77563c23174b25a7c5f807265669f69d7c46bf1e8d5d62d01b60bdcfd8c0be13810d9675c4a403573a14b0b16937ed9816c24e876e0a917b98493f4ab386438f704382f760927e9675cc8709e0f705ee2124ed28f0c91e15c0a705e4a89b353cad5129c4b495a21758f11413d1c544897b9089570fc920cea6100ea2a17a1120e799041fd1364ffcb5d844a38ec4106f50f00f58a4c2cc8a4c691f86fbe0053a5ec789a014f9170b96c012de237a810df090a832ba94796f8f0c74c8f4015f5a24c9da96af96d80475ee5ce947ec2b94564c31f5d81e75dbd311fed065192aea34106f35ee097d7b80493700a2119ccfb01cc6b5d824938b9950ce69d00e6752ec18ce290f1dd00e6f52ec124ec0791c13c14c0bcc12598843d75329847029837ba04338a0bd12e02306f72096614bf1471088079b34b30095fa22283f90080798b4b30a3f852f38300e6ad99f8485b11db343fd2763000795ba6be26a65433048f6c3aeb6800eff64c78619f4dd40b970090776462150d355ac9c7229782750a36adb96f078171a23b29b17665b587dca6783c867942c55e3619ea05e443c2fe31b85aff10cf826a5abc64df243b0be0bd8bfa6b786ae6db2c0157695753ae749045058e81ec7e3775a5c3d7162a67b3199f6acd337ad457e8df1ac0bb877aee9b5fd1705463bcc38be220a337f76d3b80edde4c9485890762f385b165426253ad6a6e0265e17d99f8a49bb92c24ccd0cda9d035009e793f253a9ef8dc1761fd5bcae0c23989d7a46098e8d5cc2703a40fb8f81104d2c516c93e82301464f2075dc44a3a9a4e86f55be0ad0f6dcc1703a2bfb6c14e00e5c3eece7027444b36c3fd7780f6119716f9261d5b276b8ffe03703eea12cefc48e2ec0eaaa6d52ee12c8824ce2900e7632ee12c8c24ce2301cec75dc2d92792384f06389f7009675124715e0c70ae710967df48e27c18e07cd2a5b7830a23b9c4e33da0a1f4944b3849271592e19c08703eed12ce8248e2bc00e07cc6259cf991c4b91ce07cd695cf79904ec5261b916f06aaa1e75c4159104994e70294cfbb82323f9228a701946bddfc5e0ae11c62b2657ba68172f3854c6085cb9a4d60f3856009dbd49637eb0fb0ae73e79db528ce72df0a64fc173331fd957f4f25b874cfa6335f6e2ef0cb9732356b137a6706e0913d1c7e0cc07b79e3666a5f8a7b27e97a086ba850de0b32f52b99f8485281c8b889a90919cac864beb80af8e2ab990098cf36adaf4c5d0d00aea704d885e9d3ba923df085930c491ff7be4205f67690b55f7367b5c228be2d3902f8e8eb9968fac0c67962bd6b38f530baab686603986f64a2c42cdac4aa9c9500e09b995c61b83c85a9af51fc6e6e312829df720d286157910ce80100e8dbae018de2e4eced00d0775c031ac555da0b00d0775d034af8dc870ce8a500e87b99a8d5fb6c62b5fae9a0567f3fd38be8a532aa4e58b3938daabf0ba07ee022d4283eaaf81040fdd045a884353c19d4f500ea472e4225ace5c9a0be09a07eec2254c2e5f6c8a0b60435fd272e42257caa4e06b53580bac145a8846d5232a88d00d44f5d844ab80c1f19d4a600ea672e42255c5a8a0cea6c00f573972670932e2e4536eb631b80f30b9770e64712e76880f34b9770164412e77280f32b9770164612e78900e7d72ee1ec13499ce7039cdfb884b32892381f0038bfcdf48a0b9beea71bee0258bfcbc413f9d4e675e6477261d3c701ccffb904338a5f237810c0fcde259851fc1ac12300e60f2ec18ce2d7085600983fba04338a5f23b81fc0fcc92598519c5fb73780f9b34b30a3f89ec63e00e62f2ec18ce2d708260298bfba04338a5f232805307f7371f539d24612d9ea734700acbfbb8895f4f56b32ac9b03ac7f5062ddd680d5dc731f292fc9d8c76df7a1823b08c0fdd365b884cd2932b8bd00dcbf5c864b588991c1dd1ac0fddb65b884cd2d32b8bfb004dc7f5c864bd8ff27833b0e78eebfee2ead4a381a40b6b4eaa100ed7fd41f92487c3fa69845fd9bc2ad4086670d1d7ada44ba3618d9d3a606c00f632ee1241d3125c3d907e06ce0124ed2a5d6c870ce02381bba8493745d45329cc7009c8d5cc2d92792384f0338b35cc25914499cd7039c8d5dc2d9379238d7009c4d2871f66270c120b5855f93f1570bf3d709e30d771e99a9b2091ffc1a8d1aae8eeefa61d7b204f6a694d8b7377871aa7d2638d64a3847ea272ac88700df6e1605c884937cc820ef0f20378f0264c2c14132c8af82e2a2451420130e1292417e16406e1905c8840f68c8203704c5c56651804cf8a0860cf2ebc0935b450132e1d82c19e41d80276f1e05c884dd1332c88d01e4d651804c3823810cf22800798b2840269cbf4d06b92f80dc861272b80f1844714da09f41f5b6a52b284987cec9502e025ed9d61594a40f75c850ee0a506ee50a4ad227106428af0128b7a64459ff6f4144718595a341b9d92e13f5bc5a9c8e07e6972f607c22c6148fcc302f0215a27657dba1de857c55fe2562f477315b48dbc1259b79b01ff0ddf651804cd8c125833c1240ee1005c884838e64908b00e48e51804c38e84806b90780dcc9955603e9ea2c64ad862d00caceaea0245d4a840ce5850065175750922e724386b212a0dc261328cb99f97309199bc55d4185723e4ba0dc9612651b96f8264af04b51195a0d986c42f10c80b0ebc6ccd8508ed41bc9de3afc12a0ec4689927f6a8bcf9259e4059a2dc64b39853962bc7491f0cae8cd7fe904e06d470f6fbe17847f7a104e371a2fbc727904e1b501f0b6cf443958fb8b79512f07a70084dd2911b6ada3565631252d036751611c0330f6d8b8d5892fe57f318fb0b7bd860ae53da09db8037589e87be32cc6a7542e162624be065513c112b135f0c31d37ee803114ccd08c28b257d51f0158b329b16e25b1167aff13afa195b04de5b3acf300c89d2841aae53e12436995b5aa1cd8a78ee2478b6e0625e5ce1bb3471decc344711db483805ff6a444c9df2f5d20b27585bc6822ab948df2f20856383d00b85e99c8d0b9b59ae09b4ee9580a60ee4209b3a9b7c303f3f946c5726e51f47caf39c0d59b12977adf5e552695c62f866e4a55cb53006d4e26da91615b91a45363c8da9193408d9deb2256d2797064589b03ac79992c08f8bccc1a74eee6a6b00ef48d006d7e26de32c53b949303a56a21e5e0464b2a4fbd1594ab052ee1cc8b24ceb10067a14b380b2289f36c80b38f4b384997e324c37920c0594489537db295f78d784dcebb968b45c59491fe10d950f0e500605f979638205d7093acbfd419d4e5fd5cc249ba2c2c19ce1100677f9770164412e7028073804b380b2389f3788073a04b38fb4412e79900e7ae2ee12c8a24ce3b00ce412ee1ec1b499c4f039cbb51e2dc91d57e12149c97ce4744e77afff8df7c3064b1904c3c552f15d43230dfad980a763e4bc0dedd9539c1a4fd77b261e61f00cac1aea024edbb93a19c038a8021aea024edb793a16c0b500e750525e9782719cacb00ca616ebec01ac56f841f05cacd627766af47f1db8cbb000f1d4e3ddd500dd2558a16e7dc4c0dd05550c1db03f8e108ea09d8b3c4e972e62f8a324704e4f33e167afbb345c63e30824df7ce00e1c84c9490ead925f7baaaf8e94deda59419205b8fa2c4dacd5042fa8bb1f2f9c4f3bc2cc27b400b923ede20044cf670a321f0db1277261f46f1bba15301ca3d5c7aec46fabd7a32cf5c03708e760927e9dbe46438ab01ce312ee1247da39c0ce7cd00e758977092be554e86f34c80735c26a67e4198a97f7389706d19b25703fb8126d47837272b127a2cd964c5de00eb844cbc4b54c036cd7789e680acbfa74b2569216576272b496f033827ba84332f9238c7039c935cc25910499ce7029ca52ee1cc8f24cec500e7644a9c9d98feea0cafbf7d914d6dcc695b50b34fc944cdaea05627796e4438264f56b35f0940eee50ac8283e7efb0d64f3bd5d0119c5f7e19e0620f7710524e1aab064200b41d69eea0a48c21a9c0ce4f600e4345740123e4b2703391580dcd71590515cac7c3800b99f2b2009677392813c0780dcdf159084ebbc93815c0a404e77679a0c612949d6b7690f50cec8448731ec60701487823f6509a8652e4225ec3c9241fd18409de92254c2663b19d43700d47217a11236e1c9a0ae05502b5c844a38e44106f57900b5d245a8515cfff0390075968b50099bf964503f0050ab5c844ad8e42783fa3e803adb45a8848d7f32a8ef00a8d52e428de2a2556f03a8075042edc8122f1e24b67005786efc54395f899ff3e72f9321259b4b7f09407a6026fafbf843e2a83ff0381ea09c9389d762f2b48c9f8199493753c17b02c09b4b096f5b161cc02b172fc6249b98085f9b21ed8abe4205f73a301235cf65b8845d5232b85700b8f35d864bd83525837b0980bbc065b884151619dc9500ee4194703bf0ace105860da8522150e5fde37bc3d932811986885e25760ea8c41652bfdb195cd17bb2a75cc1ca84e018e6cf5d9e13c146d46600614d269af82ac3f36cbd54f69082edd20c0def9551219d0fb2f922775e3b247cfa44f648af0678e76217dfef205d3d84ac5fbf3bf0d0252e62255d2a880ceb37c05b97bafba217e14034d98b5e4f008f5de6d2626ca46f7e908d42fd0b3c75b94b38495f5520c3990dbcf360977092be484386735f80f310977092be354786f32880f3509770f68924ce5300cec35cc25914499c97039c87bb84b36f2471ae06388f70e92544d225aac95e427c14349456b8849374797f329ce500e7912ee1245d8f9e0ce71500e7512ee124fd5a0219ced300cea337e65cfc60468fe26b0d59a01a3ac61594059144b90ca03cd61594f99144b91740799c2b280b2389f23680f2f84cccb7f3a7848df102fa5f22de1427875d0c2aa0133231a389df7896f04ea53d4f0689deb3a218807722253cbe64f602e07dfcf16f9978009cf88444f4f0b505f84ecac433a1f0cba013cef9205b067d08c07a322556f5813d5ea540efccd0126a64733c2e05004fc904c0bc4d0ce07900e0a99978553bb55e4df49a3caf0190a7b902328a13b75f06204f7705641457aa790f803cc31590515ca9e62d00f24c57404671a59a0d00e459ae808ce24a351f019067bb02328a2bd57c01409ee30ac8288ef87c0e409eeb0a48c249ad6420bf0320cf73056414d7e0fc1a803cdf9db593081b4064a33fbf02942b33d1cb2edcc47ad9d701801764e2516cf05569df98e1ccff669b9ae94b3e125e46857314c0792125ce2e12e72236db3b5dc3b089d4a5c233f95b16fe37dee6d2f6bd5fa2027b23007b1125583e9e0c337829f3bfe6c6fd718af8bbdafb3d53786cf4cacbad00c68b2931b603d9dd8737dd33b746fa23ff9ea0aa76a2fbd8eb4400f312775e98221ca324f3cb6280f2d24cf8656a4da2bc487e77753c78c67d994b30a3f82adf9e00e62a976012f6c5c9600e03302f770926e1081119cc3100e6152ec18ce2874207039857ba04338a2b1a0f0130af72096614873806029857bb0493f0c92319ccdd00cc6b5c8219c58f32e50298d7ba04338a3da07c00f33a17d736209d3a4db6b64139c07abd8b58491bf264585b01ac37b8bb6404614b946cc988e900ed8d2ebd584ada16251ba4eb0070dee412cefc48e2ec0f70deec12ce8248e23c10e0bcc5259c8591c4792cc079ab4b38fb4412e7e900e76d2ee12c8a24ce1b00cedb5dc2d93792389f0438ef70e5ad48d26111b219493fb104ca3b5d41591049940b8157dee50acafc48a2ec0950deed0acac248a2bc1aa0bc8712651b9698f7115c79384333e5c8fae583401979af9b2f9a123ec5247bd1f43880f53e573239e9bc0fba35b14126bfdf1594059144791e40f9802b28f32389b202a07c3013af0d705495f1150d4a441554c99665aa022203391994940f650264de260a721200f9702640f6df44414e07201fc90448deaaf42f541f0449cc22ce0048b2a18c6b00c847dd99491cc529860b00cad59428f9727efe101acfd893189fc33ed60bceb376f4b2720780ed319796642ca49c1a43b624e32d00e7e32ee1249d6944867324c0f9844b380b2289f32c80738d4b38f32389f30080f349ea2a874f70a991ad483e09a6584e78895ea3a705c0f6942b7d6cd2f291acf6fe1f40f9b42b2849cb4632945560b8e219575092968b6428b704289f750525697b920ce54500e5739428f90aabfce5e7455ea0d962a625a730072c161abd8aa623281d9f7767bd8d28be73b633f0c3b5d4afe1ab119fc4d0993a9da1f11ebad7508047be9089e9d3752d1331525e009f2c922e14b10f15daa100edba4cbc9492da501a690d4ee6a70f01982f52c2ec6a2839a7783c867942c56cb497aa659e40a53c06d7501fe25950cd48573d205b7ce72a509abe448937b818bdda4e1462f3e512e09bca123c15c0675fa66e2a2998fe1a313599aa98e8beb00be0bd42ef918985e7f9db3b8ba5ef1d28300e0dac1333c2dbf22f955744b0f1be3980fa2a25d456422db15ed150eff76cd16caf161791a1eb4c856e0b806ebd8bafef91ceac24cbe61340c5f39a8b5849a75193616d02b0beeed2b87a21e5cc21b271f5c741e67fc3259ca4d303c970ce0638df740927e91441329c37009c6fb98493749a2019ce3300ceb73331b2149c26b8a98c2c95018cefb8fb623e616f9dec05801d41edfe2e25da66de0e3f3d479ce6f389168adb1301eb41056c07e08befb9f4be23e9435eb2c7187f039cefbb8493746c930c6737909d3f700927e97373329c9301ce0f5dc249fac0970ce7c100e7472ee1ec13499c27019c1fbb84b32892382f00383f710967df48e27c08e0dce0e6701c6197926c38ae0dc0faa94b3d74d2c575c87ae8f7b104cecf5cc249ba301919cebd01cecf5dc249ba921619ce0b01ce2f5cc249bace1b19ce1300ce2f33f16a1f368d2698d1a3f7f0370f80fcca1590519c02bb3300f9b52b20a3b816cc3000f21b574046f1ebbb8500e4b7ae808ce2d7770f0720bf73056414bfbe3b1380fc9f2b20a3f8f5dd1500e4f7ae808ce2d7778f00207f7073d52cc2aa876cd5ac7d00d61f3331cb3dd50138c27122b2e1b7af00cc9f5c8249f8bd3432987f01983fbb04338a03c34f0298bfb80493b0274e06f31900f357976012564064305f00307f730926618f9c0ce63a00f377976012f681c860be0860fee112cc28aeb1fe1280f9a74b3009fb4264305f0130ff720926610f9d0ce62700e6dfeebcd41fc56f9fb603cfc9ffc9c41b937c6151a59aa109d7b3a8e055013ffc3773eb0d8e89afd15149f94e2459f6dd1e60fb2f13036cc18524b8c19bc61aacbb0290ac1121c88e12e41c2f102f03f964fea572202d5822c2c135c25e771915d26a501ec628912adfecb789fae631c0371b5082dc0264f2052cb138448600922d10712a00d8901260b87581a3f8e5e7090065234a945d98bee48ebf68c964cf180e576d832fe72f16de4a38ac46f68afe5d006c96ab6009ab2132b039006c6377323fe1131eb2ccbf10a06c428972336f27f8d9a3c4122784aff0913d676c0cc035a50417fe15be283e69ec025a96cd5cc249face3819ce3d00cee62ee1245dd1800c670dc0d9c2259ca4cb9790e13c01e06ce912ce3e91c47936c0b9994b388b2289f33e80b315254ebec303f38521a287a91968006d4e89a9fe0b9011f66dc85ecdcb03ded7da45aca44b449061fd4c786b932c4d7c442df161cc5f5ec49f0d592d3b7ebdd948d157f13fac55eeed8f113ded456c8607649af72f5c5aece7fd331d8f892741c3d932b6401ce57a15427bae77965b56c372f9ea215b70d768255d235b5ce577526731fe09b0c522e2b087951dab6b0dc46cb9c4f97c4fa9ccdbc2b564c70b0759ee85e11d2a3890385ce807fb73b54325164987a1da6aa14a817553c4dfd5deef992235b2c5639ecaf8dd829f95ca8e25fbe854760a8bb7e3611231cc8ef18ff8ce12b4ca5965dc57d45234c3c44327be3467b6183a5828f6cac483013d6c8d603a49a608a7d1d4bb829f9be9a55e9567d97cef77768cf7339788fbf947b813c7c4b02ef78a79def1b122ae65deb565625b1a6796b3a3172c56e4fdf2c7837ac747827acbb587e6ca3d75bc6e4deeb5c9d5da70d78c994bad3969cb6f75c5a8249e6ab3589948ad1a71b4ae98d61d3f3cefb64c922a39d93c2d36e5f86fc9d35d26bb70d37631fe219bc95ecafbe27c11f585d2fdf94fd6ff0375a66a8aecce0300 serializedProgramBytesString: - serializedSignature: 3efa1b84793942c716a626a4971a142026d7904c91c9b20ad456dd40730051c84da7699da41f3268fdc526b940ea3816fd2b355e07250bc1703a58fdf92bdc0a + serializedSignature: ef23458bfa82ff0be82dea56216251b3b802f91d7b240e1e6f912985123dc4090eb0b56953139b94bd9b3bc19c45d3cec6984b6456de3ac75fe83e416cd78d0f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset b/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset index 8be7300..767e6f2 100644 --- a/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset +++ b/Assets/SerializedUdonPrograms/78b75a58aad622e40bdf6e6d713d2487.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d777715c7159f1508213a02213ac26078a6e83d15ba4180240b01a2a8611b6c21d043c8960446a239c5a4278ed37b6f4e777ab3d39dc4e939271f22277ff99c7c819ce3cc9d9dd5bb6ff7ce96f7f64a6f154b476fb4b3b377eefdcd2d53f795a585fcb176c88f3ed1255a449de81583e29a1893ffb5c87454feda574efe197143a643f27340dedb216a039e849fadd64af9d921afc6c5847cf2a6b82cd36175bf5b64e5ff1df2d9acbc82dc2bf22f2b4b59b3e543bda2559c16a7448d551d40a24f3d34aef32c90cb9a2b3f8f8abbf26e56310595a4d5ad1af9d12def8cab7ba39269a7dc79f198126b54debb2c9fb9214624cd4b8ae2dcc172a1fe1176b246a7ab743a4ba775f26f8efc6b47d720cd317dbd56fe494ab3ffabafcbe45f25d0d7ff63daab753a5ba7694dfb18ba867bcfebeb751168afd06946d3ec40d792a695d1d7353aadd7b4e0fff53a6d4079f5280fd33deea27bc745b756a71b74f913aefb1b75fec91032dd1741fe4d11cadeafd346cd4ba7bedeacd32d3a6dd2f74fa1f24e3ea4bbf4fdd3e81ad2c53aff8cbede5a006fbb358db3aefc3d3abfcb95bfd725cb1e44c7b90fe93e5dae1b5d43ba44e7f7b89eabd0e97e7dbf175d439ad2e9017dbf0f5d43fa804e97ebfbe75ccf3fa8f31f46d7906ed3e9417dff11740de9769dffa82bff90c8e9b09357a5cb9e77d5b143a7cdae3a9a0d7538f987511d4ede32571d8e7c4774fe0557fe519dff982bbf45e73feeca6fd5f9fd88ae43c779ce2907e9525dfea208d639c736dbf43303e85ada78f9195739277d08e1b053f8d875b965d93e332b695f1769c5006846d850e53c191ca480f41cf8809fadaada09190eae4b0244a4e8557168425a7603192956590b10df2dea7340961856442f79ab78c953053037227fb328cc8dcbfc76152521d00dcb3b7512b861f5d445e97acfcbdf7c2a7db2da11192ab3d2406fcaaa80de45c9b6b76490481012ddcf74499a76c41e95390ea0d7e5f588e2b05b7dde529c6615f71d326f42f51fc6640fe2a84cefa8dabcb2df90ff5375f668c8681ee9c06dcab7bb074e33b54a6980fbb48ae1afb7c874b408403fe79236c3d969d5e379d6d312af63683b19d9399075db34ea1564565e5e8348c3a5d5e54130ba8c5e0969fdb6f1de2d3b3b7eb2d0c84073af5112e45af8e5eace57ffbde3d5bef27cd11a451ac286b53640343f60815eca5ae1a1e02f4279f9ec0c30ea86dfa2e057dda0ee2984df2e37acca456f80392a32e53780b56932e082671b1257d550eb9aba3daad9a3ef3883b5019982209e36cc408515aa19bc41364814534394510d3177aa1b22d8f3f835c4dc49b9720d013f348295060483783021388b4250f5d8b2ac08f6ca3cbb8bd4a6ee0eabb8ea445ee01ba4f02b05d875aa61fe4d55bf3fcaf3a434b35c28a7e7399dccf8b9a915e25eb3eba39c6ed2f9aa4979d83035fb6caad9e74fbd07b34d7e24201cd24d0afdee0d1ec3913093282f34ba1e7f1e4c08965308024b56cf142208f7ae292ae078a363b848f2badd8d210de06205e04a8f70c12c98209c434098010897905c55bab802860c942ba8c6010db09e9816af7656d631a06abca14a5cd348c5e7df9652fe0d5ad7aaf3712c71f0550bc12aefc3e8e9aa940a71336452b7b9945280125943d3a21430870dc34b90a02966755846a9039895b5dd07fde238f22a82b44f5a11962b45e063c5a4029594c70115a826f0ca2cf1caa38572bba2e5665734cf54e50ab62ae79baaac61ab7281a9ca956c552e3455b98aadca45a62a57b355b9d854e51ab62a971055a621be58c3623afc64a78a08303cbc235dc19dd87de55a02c934842a0b66acf9b8da60c1e06b5464d44ad9bd66e7ba5e5d8bc9fb0daeeb46d775464f08e59eafcfa3d7e0badfe8bacea8153cfc7c83abfe863c7a8daefb19b5ea859f6f743ddfe8aabf51f87412604933c50cbd293e2c3559dbfaf0d6068245b0b62acada207c9740afa431664bdb40591a6013ba2b109d238f272495ae5644e99044e7c2a470cb288583cc8d94c22df72a9c57d76acdbab69caa0d42372ca31735e0aa3651de542ce51526ca9b8ba55c43599e12e402abe57957279dff8eca67af4a616ea991cf4d3ddfe32eef6f63b0dabfd3050badf35b94ced70a6a8d351a4726ed5e696abbadc5b6dd2a8ab29a1ba5ec669ee3996bdd1372ee2ae79bab5c4d5509e561e68e9c8772135f6826be86220e03d66dc23b3bfc9afcf110af34135f6b22be9d200e3b8da2105f6722be8320fe7c44e2eb2913551e612aa7294f8b4be209edfea34fb1ed0c6d9075829ea20caadf647e1b28f494d77bcb143b387acb46bbda5598cd93cfa9f79a0aa6c091b366df25d32b8a0bc8072e82b77af8b74c7a121fd41d513eab8d748ad3250574f7e781b736745eea95de9416cf269daca5dc054cd7c298c2b31e09a6de2f7f33f26f845c7784bbb0e1c6dea1eaf12d1566dfb2d1c44923c5c92ac44987eef80dabdbc3e26959805e158dc2cf7d2647da4439522b9a23dd6422be8b20fecf88c4379b22e36e323212c47d22e3fd147170627b08ebcd80f5c23ec6326518fb44d050b247290e2c5d5f514e61b4809ebd479a7ab3345b4c50ed27a07ae195ad7ba240b5d5d4c80788461e298bd6c8298a3830035b253d3d2e982903530f1e1a5799ab7cc004d64102acffbcf64ca41ed7362a38aa6ee5d46fa1296ce300ec63ada1ac8b0c12cdc26f074cd46d03db4d4d73380693df411187a63942486c51c49bcdc47752c4c12dc336598fdb87113384bfa7d425a0d62bdb7d50af51e56f8d89e2eceb282e6064049b748b1a19a54d945b8ba59c31516e2b96723d658b6abc7585d5164d7ededde18e6f060cf643871b0cb42b7b052fc5c1a5c9ae1ba8368696384631ee6ee276731337528497a94b8689ae26937b3a1e837bda6512e5048728bba9da80bb93546d74dca5aaf489bb7ba82a41c04e0e01f79a6a3bc551db3eaa3698f63f4dd55625846b99062f73c4b14c839f8f6399063f1fc7320d05ef3a33bcfb2978415bcf50f0c6a2ad07a82ac1d6cf8ae26dfd4193ba74bdae2e31a8cb410a5ee8287453f0c6b2ba7dc854650f5b95cda62a7bd9aa3c6caab28fadca2354956087e744f17678d444fce11888b798883f1203f15613f1476320de4611872e399c312caa4bfe10451916c7606d2cb023b8c54cb89d220c232538e6e8197f750953ff37b727ba4e4dcc5d9363007b6ace1eadd95373f014dc0da211a6447f5e9f3e7fdb6b94b1df3113028f53084043e07af17ee530929b9ef5bb1397a41d2649fb29490fb924cdaf17cb0a6d0553be77651f312bb91e10ce213d7fdee393ecb849b28b9464bd462dc663b8c2f518530957262e1c4e987018a070c80a6789c25934c04b06f64c148cdeafa813b4307aef982cd926c7f4f6b2449792222be5baa54ad76979e0bd10f92face8535a02d3f49748cdc6c78ef2eff8a105b33ec392ab28389d34e174c9a42f9c388dc9b22db22a9008e8e69ef147a8781c3a4d385ca670d867b41befbcbd2ddd90d2827ee5b3c7e5ef5dc9f1654530eb633ff97b7ba2c873ca24cf20254fb3511e7b4bdb55298d2d075cdf89c97fe37b51643b6d922d1bcdc7e5a38bbd5cabd24d38429df3de6168f8cb1e771b9f31e17085c2e158281c9a5cde7e541d6d1ed6ef0d088f4398724d91a43d6b92768892767fc1160a7e7ac215b9694ad499902812759924ba4a49b4a76089ae2b9f331c42a2c275b1db24cb3025cb6880bfc15b686d597a245add11f42f7c8b15abd15e8ea3e0d663c2ed090ab7bd91717374004ad9d176dcd71b15274daf499a272969868cd250ed84fd52a75a2d007d06efe4d7038dd2e274592eebef3361354261d5570056adca93f16213473c3f674262944202e62dc28c3b4faafee7b8b4b0abe4186baac79c0f9ba41ca3a43c1ed9d2bb26e3969f7d47d3f1e2bcc1232689af51121f8a2c71bbf26d20f76d4f3be5760f70f4451e3549769d922c15a9e735ae3db657a642edebbc89dba7a6b79fd8c4d213b96092f60625adf96485d9af3a31d57f1c1485e7c74c3c8fc7cdb3ffdc5b149e1f37f13c1137cf4fc7c673bf89e79b71f31c9ff55e34f17c8be2f95224eb75ae0b8d8d85c5d3b8bdf18009a1db1442fb853387d52d7b482764441f503eb757f52747f438c9dea1d3af7cdbb87e1ce694dc48153b7b59217f2d0b965dda54c482b9e3336afe0aaec6455a1dc0c84cf21cbc851a3818955c41cd3d93338cc11ba3e16da8a6b70f7a773b15fa22ba2029a839c43a348b88a50bbfcddefbd2bd0a2d91434b22ad4ea3cc3449ef42ab56e8562d4bab4331db0bd4a6602e9e86da66d13a14fde55a368153fa48807af5b2b3d3dd9e54ef56d542b7f7aa34b611614f20db04036b0f3abcb2531170dedd16c3eb38a1158e48fe06d5a637189afccb12a2a2bc2c03adf2064ee8ecb7afdaaf41bb213f9300ce8b2207ce1b39c1a952e080fadacb322d7ac038a4c2556ea13509a00904da9b3841b37789e4761c7be7209300d7bdb21c5c6fe684ab7252c720cc3b413909103d877cd4339c10adf03543275a8ee999ecbb8900ef0232c77b9ce0cd9b04af55754392a4612f2a0dab28771177ef2f89ebe5c741c89afb8ce0f3da643ff9baca057a83ee3ea43a175c6a9cc3a1dac93e602a74bc4b4536c994a7a3913278be9451635311fb79a910a12837c8a20747191864bd55fc7f8f7f3230fe791b80d0ae41b0fdd6dbf99d7ebf1eee8ec9427e53071977fdc5bc79b932cfb32d0c235c21dead09858077704209664d1ff6ed54e630a0ccd6d38d8d0fc22d5c10d62008df3915da78599bf384471bf1a623466dace082b21641f9aee98532e986bd0541f96e4e28376a28476421f08ff60695680b7c8c00577101bc1f01fc1e4e806b34c043c63084d9ef972e9d0dcc4a2e30b722309f2d2530eb1308e63a04e67b4b094c46336703732d02f3b95202b33181606e4260beaf94c06c482098f72130dfcf09e63657849ff08c60bbfe4f62fe6e04f90738215f23bc03cf30e75318c3553b17a80d08d40f9622a88c9aca066a3d02f5439ca02e12f644d988da7d10380f9e8091d36a04dd8739a183c83013009b8d00fb0827602001ec5ab9a92658c725b3b7c46d7de687d1f32de7026e2102eea3d3051ca37763036e0102ee63d3051c639f910db84508b88f7302077bc98c7b13e2036a3e1750b310509fe0d6b07e356d062f0bb5bbd7366dd8cfc7065c3917700201f7494ee03608efbce36db52a176e6b7712fdde4104eea738c1851114ec2cedd0c3367bb9145694e1bcca0de5116125870dc2c55c10ae44107e9a13c2a02586e44f8dad41507e8613ca6a43140602a7e58397d55aa2731a3a79663d1f01f9594e209dd7728ee803c470e4327730cb86af4bfb5136186bb960ac42307e6e2a4c3bdcb600c67e22db90ee0882f2f39c502e11f618f8963ae8f0a40a316e8d4cde3c610582ef0bd31964f2b704306a22db96809d08ca2f4e2f944937eaed08ca2f7142b996f08fe1de6290c4b0b30bc1fae5e9d4d0299bb5aee382723d82f22ba513c119e716d98cfd0082f2794e28e7097ba868573f3cd9af4cded0700e82ecaba5e71f9b7835916d747318c1fab5d289e04934ea0710945fe784729170bae5e774a1c1bcf75cb041b78e0bba2508ba6f7042b754e4ce07c0c419f844989cc8ffc6a5e4e9de6604e0373901ac9ed4bd93b290fd16c236c908ec0fc7472d6c82c9f3878b1190dfe204b25247e65649644c65c2a18fe4c5e57204d8b7390173b632e3b80c4c4c08f806cf31715c9d58b83ee32672cb10c02f4c45840ed7ed66dcc8cce6255b1094dfe184b2f03136e3d4452d17ac7b11acdfe58475b1302dc78ee922c99b42b31078dfe304cfb45b02082471e4528980fbfe740197c475eab908b81f4c177049dc9f330f01f7434ee0d68bfcdd13a3c6f0e17dbd216b27876d00f82082f6479cd046ebe4301ee360ebe41c4550fe9813ca751a4a7bb8376ed451ef997a561dddc705ecfd08d89f7002ebbcdec0deb59de48d7aab10643f9d0ab30eb7d4cad8dd61eb276e4450fe8c13cac2c72e8cb0d672c1ba07c1fa2227ac7667c8de453185dba2d8e67daa11702f710367ef76f47e413de31e5c36e05620e07ece099cd38b0c36e499d28bdc87a0fd45e9f9c8a46e6c3e8460fd2527acf4aef1fa190d6e3302f7579ce0c21a5bd0f6d2e4c1b714c1f7eba9d04ddcc39ce927aa5308dcdf70825b4d808b09e2351cc65e663317903b1090bf2d15201935920dc86d08c89739810cbf193f89a39e6508c6df71c2e8ac72e32f984962a77d3902ecf79c8039ef4631cd4fbabffb95d188d9c0ac4360fea194c06434653630d308cc574a094cc6151e36303308cc3f9612988c0b116c60b62130ffc40966b4359d5d095cd3694550fe99134af7cae3b84e67ee01914604ed5fa6025aaca5f9df87eda44765717859f62dd5cf84dd6dacd0b2bd7bf72104ed5f39a1f5ae44ce6c60378819f3d6fb0c98c5df40395668e548b95e4f9232bc8a2965d8429b321e7a49853ad09a0ad8f0e37fbf3ee07e837e497df813f3667af60b82fceffbf163bf272715714f772af0fc412ad45c632ad281f728a5eb916ee40f3c5301cb70a980d5a654e837a5a742bfa5c3fe8281a5da76c724479d22ab78b6bf946040e4be6c200d966fc18b0ea37c07973f4db05c7f6a7f07f3b468df3d129bcf89e3db0d284983e533fbaf053ead92862ec98c96ff1fd0eebad9959ad6a8efc1c0df97715a161e544cc14ff9ff0011f861188ec70000 serializedProgramBytesString: - serializedSignature: 6d1876821c8f4d2624f0299a9a81856f5f4b7fb720433739a0171f7b91005eddba173f3c3604b9fd6191b5a25d8545f1d14d86d3f9070241dd01a87af181090f + serializedSignature: 916acecbeecde43ec443ea6a9df7309360502878f1286368b517cc6310dd62df38a6fd161ec2eada691225347de9b3ebd80b246510ae25cc36aae22b4c602004 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset b/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset index 3737436..82043f4 100644 --- a/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset +++ b/Assets/SerializedUdonPrograms/7c9a1e6d6a4af784c80478b1f1ba5f82.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5dd95b1cc711ef05964308a11b5d48e85e9963179090641d884b12922514408a6247412b0eb13697019db9e41c8ee338b79d3887733ba793388f79cf431ef21fe45fc8631ef37d49574d0f5b3b5b3dc7eef6b2430c1fdb3b3d3dd55dbfaaaeeaeaee69cae242fe445ae4c72d312cfa449bb82926c4bc9893dffa643a2b7fad2b3bff865894e97df99994f75a4493c793f07334b2437e0ecaab25b12c9f7c20c6659ac2fb2362527e1f94cf4eca2bc89d927f93b254a4423e7453f48b21715d3444b67990b8850f2da9bc08f015a9969fbde289bc3b898d824ae278ab417e8cc83b4b786f5636da2ef792b8836ccdca7be3f29945312369de438ad5972b057e1156b255a5db54daa0d2edf2af46fe45e5e53f545e99caab56dfe9f33bacb2b27eefb2952aad5065e0fb4e9546499e1b8d5d2a2d27e5773374f73074ed729524afd107ffd52aad52e95e45e39cbadea0d27d2affbcbaae57d7dd3ef86a52e97e951e50cf5ef0f16cad4a0f121ee0d91e75bdcee37e8dc7fdf51ef7ddda16b5e452f6ccfa5ef6b6cb33152a6d55f47b89aced7c485bd4fd3e8233a46d2abf9f5c43ddffb1ea2edfea28bf51951f2074213da4d2b8ba7f915c4b7a151f38da5bee682fa77b4e5db09f3dacd233eafe25722dcb94ffdbd1e6cd8e361f51e951221baabf32ad78d751a7dd0fce3aea3cabf87ba6ae632a3da6a14d75ff3991adfb906e21eda56db1ef6f72f0c3e9852d7fbbefb7ab672e936b48132a7f905c43daa1f2af3870e874c8ad8e9487f4b8ba7f555d9f50d72f90fb763ea45d8ef2e5a41efb3ed5976b1afe4e3af86b26f9909e1299faefb44ff6fd730efaa755fe75720de9f32a7fc821533bdf9669866ca211f47297a5df498a0511476181a6f875c7f693de8e184857c207fc1cc56a97a5cb5b9004186f78137dedb244bd83f5863b23eb49bbfbf033294ba490e88dec2afe9a5505346e46fe4e1257be24f32fe148009c794ade69938a92c2a7ee4a157d49fe6652b925ab9d91c38149312a3f1790de5dd9ecec925e2c81db773e332c695aa39259996303ba20af67b08523f8f9105b3a89ad1f9479cb38469a93a3a45e993ec6dab2795f94dfb93a4715647c1bf9c1892edf1a02d962ea97dc40ebe3a8cb1f496435248266eb86ea861571b4a26f6649e2230c2d2313454764d16847c82219791d220e9791e12c0483f398cd21afdf16de5dd271b9f1c22303e2de8d1ca425fc622259f7de9d77ae463359eb14711ceaeff160cd0d58a0178b6ccfa2e0ce42345a9180863ae18f70f0a3bb1c2922fc56b914960b2e804af44c990288d4a13b9f976e6b1e092fcb07af6150098dcc924ba2520d13628ce3f46a9e0edc320edcea6283eb6d4ddcc0ad5ee12b0d2efcf008d66810f46a830ec1720ec19ae2aba725fb190f5bc7230841e6be2c04ffdecb2358abd541f736e810ace0105cb73af635370d8441698303bf09ad06d6b99ac7a0fa17e5d0c35985d122a207f7e6914a52960d8e20842dcd4e0de4e1ab47f8766431e7dd041d84950c840950c08d8c5cd1b2d4381a0622d510afe28843e626ce27802d1b935ee089b828b3e6e58de5ecdaaaf4b55573da807340d346b5e1a6ccb382b001bc9bc2917b9be424a9fc590a9904b1e8cadaba700da74c1f602bdcb50626545a1d10f24ab305950626894cb554a75c359cfc41225bb9c63b45bd452fea753ac2dbf2245cab23bc3d4fc2eb75841bf2245cc71106e077b08eada9278b78ad9ef806ae4b618d778c76a951a95ed6b2479bfa3e26d3495962d9a19c6d2bf9d790eab47acebdf3ecf4dd797661e7d92f3ff36f93ae9bd4732823f433ab62b87a641d1338193122ff1ec8a7c7d5b0c6fb09ff066cb76f19ec4119245c0c58a15aac93d0464e4228b6975759427de8df170a2e9d46dfd2d98bd269f3259ddc5bab93cc26cefc8164f6f9b1ab7bf5a66fb38e70539e84b7e808efcf93f0568e300c8a0e88ec20f1bff2278b788d9ef8361df1830c71186b0421be9deb5ed8e72657a57b59b3b2d0110a3b668305ba72075671d4e0632edd27f7d680aa3a3fa27c2f3e8cbdd84c33747db781d32910fb1106a704e0d4f4f4fd96f34daf7ed0dcddf4d63f6f774b869e7547b334edb05ed376e8d4f828a3c6b703aaf14e8e38ce1888ec082f9245b95e4f791747195a020263672f020cf27673c461840d6ba36c681f2004dca3c3a499c1249bb20b268d3a51b6701629124c947b7580b7b28033c45d00dfc71187c0169c6856580c936ced22217f8304c34d9c49459ff69a5193ea7715f5126e669a1443e29e785958cb5f76bdf3684ba045f632dab04ca7b015906f8feddceb7237c5f1157c882946d73c20fcaf059be70246bd6568a1dbd14237b1adb3bff54a9ad3b2ae87387e7aa06cb5b37c54e3033ab086d2e25fe73bf673fa8d23a0a7abaadfd64426d09bc2d5798bde75014b1b8f50f75e911ef3a1426654965994754caa18321f8d86dd1a8d8c6542ebc4cafb38cafbbc0f799be44a27e1033a2b7982b392e0af86b15d932aeeb6da1bc4661ed4d5d8c5d50801fa98e47a1697e6ed5d90e95152909a0fe9dccd49dedd740771378775fefd14e3df595fe6e2df8fe8bcf069c60bffab3c98173eca11870122ecf0e10788c2fa78d69dfe16688018d3f17386e1e77245307e8ee9f839ebc24f9a955cf8794ea7d3e7389d86f5e6db8134b759a7b9e759cd7d1648735b74c4bbf96e116814d6aa237ea100c4db38e250be47e439ec8deb28f7e64b39a103a4af0080b4eb88f7178078878ef840018877ea885f2c00f1e33ae2970a40fc848ef8e50210efd2111f2c00f1933ae2570a40fc948ef8d502103fcd1107670b9b6ff375b6cf73c4c138c38e5ccfa943172b7e86230c5cc296dbbc8cca591de5a17c299fd381616d85757836b004fc9c9573f1b34d8eeac6d41b2ee985682b2f3deea69b8e9c77d25b419c4fdd12b0dd6922906cceebf8fc18c72798c2f44a95739dcae2cd1a238f21b5c79ebce5cf41b78e83618e03fd1c24bfca63cb6b59e62d14a4bd1774ed1de1dafbbab0e3273bbea1d10d17390dae944cc74c10bbc0dd14e62c122d9c9365fb64554bc8e1ac36ea82f2c1dae1277e33ab193d3aa44739a40773eac3e988cc5dcf79cafaa773e1b757c7ef4d8edf4e913993d18792b4f4c3eecba3d81bf41627bdb12a9bfbf4534178e8d3f1708be3e1a283075aabc581d56b4764f17b288f24d90aefd666ff5637574efb759c7e9ce3f4444e76cbee6530877043924aca67f9fe95b9c72b081f033a3e6eeb24169c0fbbed435872444ccb12964df2a265af0917a27f5dd471fa098ed3ab3e75f305b4964bb2af4d23f64392f301f1aa2402a40aa3a3b94bf7928ee717399e7b1c3ca7ed03e538cd9d253937abe2cfdae4cedf651d7f2f71fcf5f994693f7adad4cabcddea5a9a411d8f9fe478ecf2f083d3d2c75bbcf661af84b9ee84acc59dc7c2707245c7c91d9d87f3c7c988d4c84576ac5a781eaeea78f8946e54e247e3aee16af832daba195c6b4896889f7b41c7ef18c76fab5666a32b2b2cd4b3c10900c07772e57ea1da7d4dd7eebb5cbb477deb1aec5d7888fccccbd1318c8527645b73959169e95dd7a190e45038e51b8561f4f1107d000e832b31865f7ed2be200837433a6eee71dc1cf2f066d6e8581fb3d07b7c2babe46f2402131603487b513cc97869298e1ba312c2ff9a29d43f2bd9016f0891d63d61bf34e24e615ce8df269e12ce35cf5c5f2ccd6d257090e5ceff8a66f64bb4558a239b96441a7789ad354e613f4d6595926a591cb74435e7a84ddead8029c7ca725e8782bf586711b8aef600442ad1632ca1a90757ed499fee1ae0e8b72201fb6dcb02bc400f38f748602670c11c86f4f053152d4b00b52993e058ee145e2c9e5073156180e76e591a9efb26e1819d37dcf27de614156c3f0b036c6f44d2b04d9b844db7eb210c207d48ba5ecab46e81e34f60406485f03038cd9c1e7c1012d8fe4674eb6593b06d4002b631ef53a3c165f42b8fe4b73080354374ec1593606d461d0317dbafbaa33d159d124f49a01706d02e206855510771e74c6ea10e2ff1425a3f4684c5c101f118f71a2e22bd09e79811f77b975acb412b57c67cb1ac7153ccb736c53c3b694ceb2262017c6e2c800d8d31439d7410c5073f0908a266c5ff777c9380f8064e6fac3ca740b0ecd6bc49bbb55dc9d50a67e7703a5b1fe0279cf5e773524a4d8625abf5c35c2ed6ac95b880059350d66305f6ccc08caabe07f5f211372a2b1c787b4d81b79980f76a31f4705c7564f78567837a58650aca7d04ca45d37a08a7c2c1ea9ca585ced57163e06d3105de7a02ded2eaea61d8ede12e02e5b2693d4ce1bc251459549e3adcf6700b01ef8149f01a941eded77a66dafc3171dc1c9835a6c08c11301f961298ed2104730701f351298169d0461a03731b01f3712981d91942308f10309f9412981d2104b39180f9b41860ea064299fb798c76f37a5360ee24607eba94c034e8808c81b98780f9199360422cb0206077fb82b076c23e59b919beb0b08ac0f65993b075323a6862bbb8414370dc9410f613217ccea410603216e623d313b5d6a3e1ebee5102d9e74d42166c86f2640823f25304ca6726a1ac535042c55308a44d3b95bdb05e38e0a2a6801304b8d78aa1833aff1dfe88672b81f20b26a1040eeec90b58741a419acca68e1074da3a02d8174d020653f0e96585f42a5df827756b08845f3209e1c60c08e941f34008c6914b219c8bdc44e0fb72e978608351b5b1cedc49a07cdd2494b05c0f0516d1eecdad814ebc8e40f715d376704ed00884c61d23ea518321609d29082b09846f14a323fb5b6435d8918d45d30709945f3509e52e064aef17880d8e0c0f9b82b48140fae6ea6a67d8ddcc2102e5d74cbb197ec0d38b36337c839d8d04bab78aa185fac14ed837a23c4fa0fcfaea42493bb4c1396f631dba9d40f90d9350d622b5b531dca920a07db3741c4a18f56f2f81f25b26a1b422e8198c56a6b0d8ec1a885d6a097cdf36095fa3d2c419dc923786075f2c6187b68ec15d6b7bcc5a08b0df3109ec7ec6c52ca28584ade873e28ab0fefdea5a9bae2d23007fd774c7b7f7fd8f0b7a14d202ba232816be98663b81ef6dd37e3bc99e9a630cb43da640ab27a0bd530cbfed6fdc6870e7a331fb788240f93d9350e6364d6130b636d6a58f1148bf6f12d27aa15b449d0bed26940801ef5d93e06df3e8da45f2cbc6629bd304c81f98f6cbe9191e6b5627fc03f26a02df0f4bc7c518dc756bccc51c2750fea81850fa5b543018651bb38e0708943f2e3d6f6d105263defa2881f4bdd5d5ceb077f46602e54f4c427948644e622c215dd8bde33cd96e12f5726d4d697410987f6a126618228d639868fd9ba4653caa72494dbf3d11d62107c6a77f8d01594e80fc5931f5754ecd5bdac7286402b9d6f4354160fe79312cacbfa1545708a13c49a0fc85492861ba706945234785753abf31c07699026c0301ec97a66da59b77a7e1a4c16192b170f23001f257a5026418e3f2dd04c8f74d02d9e0610dd7c26b736d04cc5f971298617c6d2e4ec0fc4d2981697012d81898670898bf2d25300d0696c6c03c4bc0fc9d4930838d204f847004d945a0fc7d31a0f4371967502b8d4dc63d47a0fc834928ed3d1b70243ac4dfceb765f5ff72d9a8576f37056c935833a73e26e030940f4039362ae588b9eca08b69dfca8df97ee92016717b2b3de66bb926e6fb55af98e77b24315f3bb6623ece0a8b69ded88b69a2d598cb9e8798e7c6642752fcbb5a311f67edc57c9c3f651d4bb949693894b46a4b0aebe0ca2439a2320e8745e07f5e097232bb3b4dd06f776a7f04258ef0166ea6603db3106762729c7af3a7efe5eb5da41287998b35cdff9fa8dccbe210be46da0ba07bde2dfab3d09fc2ba5aef70959ea46f382c7d3e9a0ede27935e0aeb8def294d2d2f1cef1f666a7963ae5a1ebc457f31a9e516356bd4e8a07dc90777bc1c9c3ca74b2da03ea40f85b6fa3cfcffbd091f483462cca0a7d623afee23af29a43a2bec9faaa8fddb803effa6481ff83c24e07f26013df889fe0f5c3b2b47f5aa0000 serializedProgramBytesString: - serializedSignature: b8fff784bd81f1621d7d766b80d16a7dd656679a60efe12abfd2a0d445a51415da3e9c210a9827ebdf9a4ffa2333a63ba5d1ec126f98759c15c73c28be913f08 + serializedSignature: ed04b333238b4d17b84923dc88317466f90be1ffd10948419e4083dc3a9ad7c2b66a36116703ca964113dd8f5a6c1a8ba8d67922b7d124deac70781126dc500c programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset index 5bffd70..861f336 100644 --- a/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset +++ b/Assets/SerializedUdonPrograms/8175c20f542fbaf40811f752bfbf8759.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7d6c0e702c109ee50a0a59052200950a01429105c4b0215da420809a424902641eb2d2d2d757777777d75777777f75797c7376776363977ef9c7befdeddb3db7ddf233f32593b33e77f66cee8ce36c815f25f6ca0fcb540cc1313c560315f2c15abc44af9d7441956ca1febc83e3f5754cb7099fc5d2caf0d14bd533c09fffac7bac8dfd3e4518da8954fae1625322c57d70b45a9fc7b9a7cb6541ec1d932f9bf54de156b241f9a2f0ac41c315b748e754c2162817aa8469f8b815eb1a6f2f704b15e5e2d5589824872d5a5cef257a1bc52a3ae55ca44dbf72d147b29b52ae5b512f94cb5a890329728894dbf6f2fd41fc20a3e95ff1bcbffdfebe3d774f8a53eff83e3fc57fafc8ffab8910e1bcaffcdf4df0dd039b8f7dffaf8231d66a17bb3f43d3fe9e3c63a6ce278f6751dbea1c3a6fafacfe818d2f29b3e6ea1c396484e16bade4a87d9f8fa962d5bfe72a4b5354a6b6b1db6d1cffce2b8b72dbaf7631db643e7daa273f0fcaf8ee7dba37bdbebf0337def6f8e7b3ba17b3be9b083bef777740c61471d7eaeafffe190d519c97a45875df4bd7fa27bf0f9bf1cbc3ed1613724ab9b0ebb3b74f9dbf14c4ff44c4f1d6ee548f37f1ccff446cff4d6611f1dbea99fd9e278661bf4cc363aecabc3b78878faa167fae9b0bf0edf26e2d90e3db39d0e07e8f01d473c5f08956f1bcd74c81884640cd2e1601de65a325429865fef6a196d1c32862119c374b8830e872319b25c342a703c3b023d3b42872375b863fcb359c2f16c1e7a364f87f93a1c42a4fde9ccd39e107fba69c7cf8c42cf8cd2e14ea2def7999e19839e19a3c3b13a7ccf6ce7ac6b1c32c62319e3753841c7a7fd63d6eb8e6726a26726eab0403f03be1797cbd7ad781b8fd6c793517a6c1953743855c4fbdc693a9c2ee27ca89285e398619069e7e759c2ec5fbfd0e15c9dee8628bdf6790867ebeb8dd0b1fcbb498e43ce170e39853a2c72e8a4edd0a4b73e5ea0c35de37554d7b3743c38ddbbe97077875cdb97ee8118ec21e2ebb6853adc3309934656955597ef20fc46871bb48e59e818c2fd74f8be0ed7e9fbecba74ad0ef74669db1bdd0be122fd4c13742cd3d2e2047dfca50ecb0c32d6a073dfa073102ed3729ba2e7edf3102ed1d79ba1630817ebf3cd5dc6bf5887c58e73a0cb7297b2ecb4941ace2dd5e96b818e212c11f1f9b044c76da7eb2b1d2e4f11b7cda71c9db3d35d93e6b3b5e85c8de35ab5837bb50e57e9f32dd131842bf4f9563ea4c59659653857a1e3c9f6319e7d0de72a753c769b6e058adfbe0ee14a1deea3efb7ebd8e58e78edebd0c6cbd2f6ce4279ce4ef37a746c970bf03376fbce2e3fefebf020115f7e0e1289be01aeb7d3c787e970a30e3fd0e111fabef6567ccac760df73940e8f44ac8ed4e126fd6c07742cf374b6ed0bed7a69337af6531d9e82ce9da2c313457c1e3b5187c78af83c669261df7b92e1dc71223eef247bfe64c3b9e31d79e25824d7be0ea1ed138f71e489cd3a3cda71dd6e7f6bffdecad9d6390da5c5f60f67a073a7e9f074740de476b26c5927cfee739c899e7d558767a17376bc67a37367a2fbec6b1087ddee3f4787e7eaf0431d9e2fe2f255f6c1fafc053abcd071ffc5f87e94ffec727e134ad34d3abc413fd3451f5fafc34bd0bd97a07b21bc54c4d767975aecdb9ca18fbfb58e5bb7b1d2dda6ca918eab44a2dfbdc910dfd5e8dc55e81c84578a781f7ba50e2f17e6ba2d93382fd7e1158e73a0dbd7846ed7a419cfb5e8dccd3abc0e9dbb06dd675f03bdbaeae35b106ba7ec1bd131f283d98febf3b73a9e35e5952790dc2774f89823af3caac3dbd0bdb7a17b21bcdd91576eb7f8b57f591f7f671db71d6da5b1fd358e74dc6de0f98421be7bd0b9bbd13908ef72e4957b75f82ff4cc5de81c8477ea67baa1e346287d0feaf0be34d3773f3a771f3a07e1030edbda7eeaa134653f2c127ddc0be8dc0b3a7c5187cfeaf8baa363089fd4e77b249165dffb9ce1dc53faf99e693cffbce1dcd3fa797b7ce24924d7be0ee1333a7c44c4d7110f211ef8ba3d36f492a8cf732adf237bda2c1f47c7a8ecb4b1fb192f3b6540d9c98aa93ed454d99a2d962daf5c354807a313e90e9bda4fa61e3005d18de117fcebafa2ad950d9f2a29c0306a395f8d89d68aa1628871d4b2ab6a27d8b14f54bf8be51de54a2844e688e2ce8428207115f2a7140db9d6c8f353d4882d0cba96cb2b8365a7b55c3db558e4cbceda4287940532da0ab15a1e15c9df554ade6299ecc43b53a904c3b3ce67e64999d6e871a53c6303ad92c7152a8585eaf71a95d25295fa69f25cad1acb5e299ba11364b84ec596a87bb5fcdb14679146664ea37910993a6f0d55db662a90da40ea73553fe87f1609c3226af8bd57cc2a868d72d508cae6044bfc8fa1e5646050659a9691af90c5e2ce0d11b96adc655e0241f73a266a68cedfa978ef95840c98bbb3d2a0dec2f02f2b5eada122570d13f548a15632a8202f47f546dc243f2bab511e24d2893e66409f674f1319356ae6d0088e08e10d4c7655edbe4358ed9a6e253b45cd49968a3912d03eda3bdaf1ae529e1152647bd979322c53a980f325da3cc9e34a9e6b9ad4f1a9679cabc61e26b9682af06b01496a90d75837707262bd8da9b3ff9a20652e9771ad5135cd6a19932986acac84b2a16268ae62f867e94f159e86a6fcaddab08501fa2debbe72759f7bcf0543aa831c79d06c9996ca32894dca54f153f41a995c0fd06ba51ab2f14952cdd2457aea7eb56e9a562a66c5893ea925ed93b24c3653630365ac369b2fcf598de849ea6ab9ca9983e3f4007af47d96bd66a96509ab550a925b363b6dcbb656968549538e5452f66f6cb23fb8c43606b798073e08ba6dcd551f2bc1e2cd698b3731c50352da99f2596b95cfe64b2b2f9527e17e2bcfd5ea1c5ee32ab73535e536358b5114a087806bab94946279af7b1f01c387db3bdb02e6acd44165a52e09caa54e02954d9a99cc07083b1a53e5344e07da38cd29c99dbc4a6e4165edce54d6ee9251d66e4965edaea6acdd4abbd0e592fa5a595dd6cabfac355073a0927391ad5b51fa75a3f4eb9e917ed9947e3d4cfa652bfd66a96a1e17e0992aef55b9d2b0b5296648694f9357750a6e4d0b6e63120cf9652baf99ae2d95e45e1e93dccee4c454d6ab6475625425334f35dd962a4945f2f73ad524a8d64d39ff2ad0de266e46afd747793de8c8f2a799f293ed29f36fedd1fc1d4ce6571e20d856ae55ff5688e4630d6653c202b45ee9f4cf9539fb0aaaa59b3c0d94693a9a4c0304b735276be704f3f4a5cdd389b27b3f8f76ef4c09eeef517017936035ac21bc8f397435e556558f9487e2ac664a4dd62b395031d588153e3b29985468e81c4350b5d7a024eec87baaba28c398cbcf00557e78e3a7ca5a3793fd55a5bb3c14fbcfd28d10e821837dfcb5fef669575103954d0626b189d7945216e96e2aeed088830c423452717fd34a17a46a9dab265c0f534e681b9e27c07a0c53fffdcd0b834d9ea05d2a4fe03d55bdd4f2bb4a91a7961f8bbae37cc7f110c7f150c7719e9e09a87f3edff17cbee3f97cc7f3431ccf0f713c3fc4f1fc10c7f3431dcf0f753c3fd4f1bc754c38c1dc944ed03b7aaac8f5341539708279267fe12c5303e932b5155596f34d65b94542598616d406539c49ca712f539ce0268608a251e7a2f5d49b2235d423a93e14a9612652d6a8d35c7968d78b05d2ccb57ae6160cef86d8d686b87355ff00008531c6696be1afc7835714123c9eeaae6c97a4d8659e1ac82cce5f44e91fae4a3f4f32a852bf0d95974778cccb7da9bc3cd29497b389bc9c49d9df962afb3bfa50f6fb51bc4679e4d59fe2b593895747c5ab7e380e93abf1e407724ce9003f30da5070f23a24666e9dc39d510ea7a3dc8e623ac623d30114d3b126a61dd2609a497edc9eca8fe37cc88f034dc2a10edd59781c1a1c445965bc47ab0ca6ac32c16415ab3d601a807663835c539c70086f6739870f62261b24193ec8a348157824954f919ac4476a08456ab2819431b726213594caad53bce6d661940da67ab4c10e940da6996c60f544270b6bed1cd8017b113776184ed961ba0f397604456b86475a23295a337969ed48d19ae543ae1d45d19aed91d64e14ad3974f9860ee03a47dde486d4688ad45c1f488da148ede291d4588ad43c13a9e68ad41e6a0aaf5266bd52d917299517dd701a678a11322c4c6078adb577360907fbc20cbf273f389eb2c07c8f16984059600195570ba5ef9d2376556daa22f9f72469ac425736984829b3ab47650a286576e353661265f3ddbdda7c3225790f83e4981bc9534c9261ce7e61dd05c79c3dbc39ed7ece7e2a658fbd4cf6f077b9cd344ac7bd291d1765a4e3744ac7c5261ddb8a649d914c5627cca07249b1d7fc379322b88422589211c15914c1a5fcb9643645afd42bbd3994e432af92e75292977995bc0b2579b957c9f328c9e55e251752b9741f2a97aec828971651b9b4823f97cea7e8557aa5b780a2b792a2b72a237abb52f4aa4cf4fcf792bb517aee4be9599d919ebb537ad698f4f46b21f31ea6582195b0298397e5190b296cab296c6b32c2b627856d2d7fe1da8b2a5cebbc16aebd4d92e110f6a2f0da275b44257b83d7642fa624efe755723125797faf92971824e7aab556412e4cc3af9db85f987680a9b01a67940e14e64569a9e2a7668b4a28bb1ce4d52e4b29c9077b955c6ab2b85a00b798d5e2f6eb4185b2b739435e83254ba5ea754e388f6baaf12a86fa578ae29f489e170e493b2f1caaf2425f217c4b19954bca4cc4d5cac025ff28e2f62e9ceea91f9636f58d8a7abf0ca8274b1d457e1955911cee4345b2dc6456b52e339cb5510bb40303930cabc3e5df4a8123d236f226916ad98ef7b452262fa74c7ea40f26dfc76472b55a76d93fc0e4fe9a1bf6d74a5818a256866e9fb6611917876c56798c2f2954fe5a61ca5f300e0e7b68791d07afa0841fe383f04a4af8b13e085f49093fce28fce0716e84af3215bbeeff8c6237d4e76277bca9d8f57053ecdca728bd127782ab12e73e155489ab32652db0fe890654793d4c1ec499d74ea0f3dabe546c2771c4566d8a0d1ae3b0db5fca01884369c13526c1d0e63c251dc11b69c1b526c17078aaf05ebfaea6849fe683f03594f0d37d10be96127e860fc2d751c2cff441f87a4af85906e16e17566ca0849fed43caf7a3849fe383f0fd29e1e7fa20fc004af8793e083f90127ebe0fc20fa2845fe083f08329e117fa20fc104af8453e083f94127eb10fc20f330987c1e44bea2e3806932f15990c266f34c503522e1381cc351c4e41bcdc0788471884e7aa773ca0e91ade3e4ad02e829de76ad4dfb02e07622e5271d7ef07e3658724d868b5a7819e22686ce9c1b6af39b1214204927aaaddb7c9941d600814769df534047a2455a0aea60a146c6869edde74ad62036b76a9b6ad692f25f76d613705f7284a9feb287d6043e2e6d7ba75109b4df1c0fa23d8c3d8cbfaa3a329cf73a3c9f358cbd9b0bf992bd1b99bbc3ac614238ce4c0b6c209cd7c18f6e82d127f25d2db4c4779ac294ae822c34ec55efbdfc751c26ff141f8f194f05b7d107e0225fc361f849f68120ebdb9db4d66f6da9b3b898aed0e8ed84ea662bb9323b6534cb1414f15f678f6d2533dd52418dc3c6c1aedc9cd9f66920ceeeaee74929cc45d9d6e120cee0af6c64e705710a3c95d958bfa7d64ddb8ae334cb1c3bcc3bde9a8b589167ca64170ae7a5b359c61b622c1b72fcd7d2656c6c6d0fd22d5b097b77452cd9fb34c66866cf1403a66ee439bf96caa583ce8b1589c63120ccd908704d10c795864d24f39972a7e8f988a9f9f3b5a9d678a190e61d37eaf3d94f34dc2a18702bbfe930d78670457d2115c40d9e771ca3e4f64649f0b29fb3cc96d9f8b28fb3ce5837d2ea6ecf3b44ff6b9844afd333ea4fe529370a866e13b019eaad9cb28c9cf79957c3925f979af92afa024bfe055f29526c9b0a00abe1391d2bb1e480bbeca241846f45f4a47709211fdab4d82e1f0651fb2dd3554aa5ff198ea6ba954bfea43aaaf330987c6ee6be9a43a4963f77a2ad5affb90ea1b28e16ff820fc464af89b06e16ea7096ea272c95b1e73c9cd9421dff668c85b2807f28ec181b87ac7e8564af2bb06c9ae5cd36d9409dff3217fdc4e25fb7dafc9be8392fc8157c97752923ff42af92e2adf7de431dffdcb2418aa978fd3119ca47ab99b2a829f782c82f750b9ee531f72ddbd14e7cf3c72be8fc2f1b9471cf75338bef001c703148e2f3de27890ca765f79cc760f9904c360c6d7e9084e3298f130c5f91b1f383f62120ea3c7f0f1379ed1e347297dbef3419fc728e1dffb20fc714af80f06e16e5b0e4f50e5f4478fe5f44993601896866f207b1d967e8a12fe930fc29fa684ffec83f06728e1bff820fc59aa58fdca56ac9ea3a2fc8d2dcae7a9287f678bf2055394e065ff48a79424f1b22f9a04c3e19fc2bbe378c9241c9a67f0594d4f6dec9729c97f1b24bb6af8bd62920c435cff3119175ec8eb62b6e6003a8e574d71c0a8d89674ac996464f835ca9ae0969dd69ce7d29aaf53cc63318fccdfa02437f02af94d93e4f6ca92d4e66f2d9a361edb7bf5750f8cedbd65cb41e37aaba5ce095126d9fced2d5394e0601bc5bc2fa47e9bd2278bd4e7ce9be68c555ad4ffe54a9f77287d1a1bf479e6e999aef47997b27c1383e55d7988f7a86437359ac1dd76f3ef53e5ac99a19c357259ce3ea08437370877dbdcfa9012dec207e11f9984c33c43cb98b7b7b13fa61c66ab74042771989f9804c3545a763a82934ca57d6a120c1db9d6e9084ed291fbcc241896f2b5317900d8f9fa7f5b533bf1e6d2783f37e105b7d1d6ec365c358fbf3009076fd7ce6b3df7a54932f4a2daa793dd92f4a2be320986164f8774042769787e6d120c03121dd3119c6440e21b936038ec64f070460b26f170df5216ececd582df5192bb7895fcbd49b2fa3e56cc309b3b56d88b46e3dfd09d2d60a389b56afdc30abd3474b058247f96a92b8bd47c6f89128497cac01d2679d45bc26e668b7fa034eb66d26c26a1199592f1f2af6a75ced2d37e316a91dab9a47e4d4afd3767ddea5a1f831bad7fa4b4ee6ed2ba4050eb5ee25fafcc4c5b7792dd68f96f4acb1e262de7d7d9d65ea28c17285b6906ee65a258af679a567767fdb2e7792adda5528b35eaeec15a7bebab55136554354aab4af48c930ffe10a8f3da02f96cb994e486c34f14879e260efd486be31d762cbdf0d7b8fc48e9cf544ab732a514f63ec331c67f1bd14a21ac1e59a42c09e9049dace5762064bc3ae74c77bc94e4d7925d75a3f72f94debd4c7a8f7261a11aed594b95ce4b54ea52ebecdd92bf521af536693423038d6ae5996a5d731409bcfa8ef62af4d7e3fcd0f9374ae73e269dc7bbd0d9ae1fd7eafd6896cad4af223fee43eb9ff8a51437fafd4ee9b7b549bfe119e807dad5aacdba97a9ab55f26f583d6a6f319fe829eb3f24e746933f284db6316932cde16770acd8cbcc52ab39c1c354890a95eee23a7f932ce5c9aef8a3ef9f94be7d4dfad29b76247e6e2cde7e6bea84d075be9b74ff45a57b5b53ba4767e0454a94cd2a34575babe42d16af7ee26f4aab7e26ad66935a393f3456dfd6a84df00774fb225d4fe187e6ffa134ef6fd27c52469a4f16b06d7a71ca7655ba652e133db7507ae650fec5bd9ef59f32c9c4bef4d399e80bc37c467db733e93b21237da7a5d156e62bb3314ac301260dc7b8d470126a9dcd90ffd7eb9a3eb1a5e677dfa001a5d7f654cfde8d5e05f2a82624cd1a529a0da4344baf2f315fd9aa5ade0be319cb92d4f15cbd8546946683a8310b2fbda439061f11461f298bd27a30e563ccde006b5c286f5ea2f25db11a6d30db117b92f43c4c66ad9dc69486b9260da7a7288bcb4599d675a21a35aa541abbd78c53e32694c679548f29b54de1d31635f2a7481230e540f7ba659e679b52fae59bf41b97967ee36509c56534acdcda8cd26d8849b7c9c2dbc8e914516aa8fd331f3775a369734ad3a1d4e88c2925f395c52ab4e5acf72121d5d3e45fd6e3e5865a116f20e05fbe6c416934cca4d15097b68bef1396eb9d40ac717dff746849e9b08349879119e960e53ae7abbae98d5a0f75a54d2b4a9be1266d7248df1f9f82784b987a82998d276453a91de15f6ad7fb96dad6546a47fa97da0dbea5b60d95da1d4da95d92566a87a598914977342ab311ac74d2e786505b8ad02877bdebe4b35785296b9c74a4fad1936947e9bb9349df9dd36a45cc53d78a559acdf33741b523da53da8d3669774c9d1f0f7a96ae4094d6d5124bc56495572a550c998d49d05ad46fa864de4ec98f3cd581a23ec6447d07b20c99363a8af78c76cf0a3429540ccb7c6c0574a4f4184bf585dd8f3ce1129dc9589bff1ea113a5f53893d60b3c6b5def1bbdeb4fcbca8444678ac4ce2612e5495b8153e2e69cecf6f904dd66a76bb222113f93e87eee313debf8c1ab0bc56b3c55eebdf4daead7f5942abd6054c29f5aa32ba5c704931ebb78d423755bc08d743fecd88dd27f223533e6bef73349ec2b1f072189751c4fbfb43ba55581bbd1e8e42dbb74c612fc6eb3f6a0349b94791f64185bffae2795dac9fea5d6bffedd56546aa7f897da4cfa774de44f4c7d297592ca5b30673057957538aa11b9bde4a5585e5dd9a4b7d8b4cf43fc95b2e441e92aaa9b5749bdbde65409a2710361fdeb1f0388a07c15f02813ce7dbdacb9c10a4dc3de9e6cb02a372b757d54228f67aab19ddab4b73935b5ce07a3f639d62efd0d4f9ddf698ac59a688d6c5992746f20fddfa6e934b06a0b6dd506b9f08e82daa32c93dc943a15d321b686e63c94f8352ddc2e34a5dd12305bf71e526e009532be545fef1aa40414690129c5cd47d581495c5795c9aca1f86a614d38349585be4956833cb0c30c4e58d627fcc026b8e69eae3d0bf44ea380ebc8ec7a5c33397125fb506414404193dd06358b13542b0d0ad6dfad45bb7ad7c8bf574602d5fb59f5a866f3a3721641e8e69449415140754b9b7a547338513556a8e0f162b5ba330a70e09f0d672ebf2b4ff635d628e09adaa01ed72efcb8acd15b682ad8232885aa8db5321dfdfe01b860bf4d1bd73c4e5c6d49870ecbc797e9ce4b1490ad6b5c8fac901f59aa2f5a4401d931289715f1b7ddcdcd8632f9130558052a7f35c972089f9c203cd31ea33bc274df163ce024b14e26cf7a57025afb8ebeeed6f2967f5ccae7e3be6a4e42a32027692b3d278d7a322745f33527653ecd49d35fe6a4510de5a4e948ec54d13ddf9c34ba7b3929daa3f50351e601a43c18885af0ff7c8c28afb73cb52b40f85e43b07ce76e9cbeb389b21b580e5ce022e9b11c31f44888217ed77ddb2b9ae26a16e7370f4c27f999f84ed88ed2ae68760f12567e04615d8960ed1124acbc08c25a82602de4efce2f520f5895d24ae57ba0404ee203770217b89310b83dc30257c007ee502e70a720707b85056e720473dcc908dcde61811bcf07ee5a2e704722708bc20237318239ee44046e7158e026f0811bc8056e3302571c16b81df9c035e302771802b7242c7023235854f745e04ac202b743049b23d508dcd2b0c00d8b608e5b85c09586056e4404c15521706561811bce076e2317b81a046e5958e0184744d8c0952170cbc302c7383ac2d61c5988c09587056e281fb84d5ce0962370fb84058e71a497ad39528ac0ade004d73209b8e815d4c6085b4510d89c5b70e4738e8c74e0c2762bc256c989cdfa38b35ae3aa27d5e60af84a71495db64f585119017cdf227c2b39f135d7b90ebf4091cf59a3667121bb1f215bc589ac9d425685a66af1d42f241cde135b174184df208455e1f83ac68e3e5b613d1561db97dfd72d4af26e1a631f82ad61f200c257cd890f566b58af6197eb351bf6eba1d6a285e88d067f82d0d584d3a6631c2769cd85ad3dc256cb89ada9c6b6529f58c439e7d0920bd758846b75b0b8180793d8700d46b8d684538b3276b4d86ad112846d2d27367b718d5515b02eae616ba9ed8760ad0bc7f14771f6b41bc2b63e1c6c8c13326c6320ad10b60dc156008c631f6c15c04e08d77e9cb8c017af12e645ca05ea8ab5d2771567e3763817c6b711c6fd3931b6d6b90ebaed16c2f80da2186b53b60ae22204ef8030e131f648d9e09d87e01d1826bc28364d0e47f00e0ab6b2601c3c62ab2c06205c0707816ba98ab8963777f5e1c27516c27548389d2bc6f5966c9dab3b11b64339b1c1d04a8de11dac0952286cc2082f06591fda891ec43710c4c3382166e9bcb781b790f6e5025589406d0c0a146343830dd4f108d4e14181626cceb2817a1a813a220850eb230aea29046a5350a0a258f48e43a08e0c0a54149d790502755410a0d645b4e83d89406d0e0a541473d40a04eae8a04045d1471d8b401d1304a8b51105750202756c50a0a258f4562250c705052a8acefc1904ea78fe61998ab8d1fbe8ade1f914e13a219c6119c685286c230a97236c277262cbd6d84c5f7c60f5646caf5e1f85d09d14ec3033232eb661e6ee08d7c94114d0c4996fc62d25d8160cf446d84ee1c446bf6d92cfb98909db9281dd10b853c302c798e3d8c02d40e04e0b0b1ce326266c8b3af740e04e0f0b1ce37215b61c370d813b232c708c936a6ce00a11b833c302c7b80c8f0ddc4c04eeacb0c0457113932908dcd9618163dcc484ad1d3711813b272c708ccb53d8c08d42e0ce0d0b1ce39a5936707908dc796181631c136103371e813b3f2c708cef9db0811b83c05d101638c6d90336708310b80bc302c738a8c4066e3b04eea2b0c0316e62c2066e0402777158e018a765d8c00d43e02ee104d742587bdc27ae648cde2cc31708daa5e18cfd32560b6c034a5908db65c1ce30300e5cb2cd309c8e705dce8fab441dc2773c378884ef8a446082f97384eb0a7e4f963863cad88d67f3643310b42bc380c63868c4066d3682765518d018bbef6cd08622685787012d8a1be1ec8ca05d130634c66e3b1bb44908dab561408be2c299c908da75614063ecaeb3416b8aa05d1f0634c65e001bb46608da0d61408be25e2ecd11b41bc380c63828c4066d2082765318d0187b9d6cd0e621683787018d7171161bb4f908da2d6140635c5fc4066d2f04edd630a045711be03908da6d6140635c1ec3066d2e82767b18d0a2b8c3c12e08da1d9cd0cc3b2647719b9b8711b23bb99155ca83758e3daaa287ec3584ecae60e70418c76bd9e60446225cff0a62e629b1c719c5c1c74d08dbdd41e4324b4015efb8065ba15c8f70dd134e2e8be2bcc02d08dbbd41d49885fa910ac13c25cc3669d71121bb2f889c963893ce98d3d866d23b236cf787838d7166800d5b5b84ed81601b1b8c3d00b6c6c6d108d7839cb8e0655afcf98fe86fb5fa2642f710273aeb0b16f048b12aa265ead64af539064b10e3775372b9f07d86f03dcc5d93c2c2972af9d86a157d9160fdd44c1f2e641f23648f7022b3f6485e19d7f3b4bf1405df868af6be0b37238c8f065b45304e1bb355113b205c8f85d35388e21c6831c2f638273658ae5ca9fc1bfea4d63c1d46af67fa2102f70427b8f622d54ef0d15d29f90e82f86438bd07c6a997015cd8ba226c4f85e3eba23837fa32c2f634b7af036ca5628dfc0fc99c2da23cd6bb2b02f74c58e0184747d8c0ed8ec03d1b1638c655466ce05a2270cf85058e71a5111bb86c04eef9b0c0457117ad8608dc0b618163ec41b0816b82c0bd1816b8287e4c701602f75258e0a2d8d52f42e05e0e0b1ce3e4331bb8a908dc2b61818be2977ca62370af86052e8adf97dd88c0bd1616b828ce789d8bc0bd1e16b8287ea1714f04ee8db0c045f125ef0b11b83739c1d91fe95d234f54f3f6160ee482f52082f55610b02ad540392b2cb69d3dce46b0de0e0a16f31734d8e615f647b0de0976da2f8a03457d10ae773971c18a9d627909d681ac957aad9202fe1b7690791d017c2f9c2918c65786d87c5a3f84ed7dfe628ad72431e6b28d5cb8be44b83e08a2559698cb8672ce596de602f73c02f76158e0189bb36ce09e43e03e0a0b1c63076a1317b88710b88fc302c7d8656703f70202f74958e0180789d88aeab308dca76181639c5e66ab55ef43e03e0b0b1ce3820636707723709f87058e71209c0ddc3508dc176181639c7a6103771502f76558e01827fbd89641df85c07d151638c6e965b61cf70402f77558e0181734b07d89e31c04ee9bb0c045719cf73404eedbb0c0312eda622baa372170df85058e71f497ada85e80c07d1fcee025637e63c3d60261fb21086c89ebc7a3b879cf1d08db8f9cd8da89c417db66cadf65524cb45f6abb1721fc37b7a74b7c9137ba6fcabc85c0fd144e918de20ebc97216c3f073b9b1ac5b5bc5b215cbf0481cb1250c53bf9cc3657ff38c2f52b27ae361ad702c960625c15305ec650cebbd481ad32b80ee1fb8d135f5b850f6ad499ca9fc182adb9f2e655aa0d074981d7c5a3e7ddbe43007fe70498b839c14475890d19dbc62b1f21647f84d363602caa6c3d860608db9f9cd89a216c4b45a95ac615c5aae13604ecafa0814571c7ca4b10b0bf830616c585827b2360ffe176fe89bba246b150be88906d0902d91ab56470b58a9e3597b12d6a380321835a800d19ec69803bec78979089f2318bcb5c756db2a8d68f452f0fbe8f80c63881da8ba14b959f8b662dfa1882d520485851ac416f40b01a06092b8ab5e73a04ab1127acc481a1286e64918f706571e2a2871fa3f8dd97a5085b634e6cf6c41e446c75d1578a05758d0f36706cef577d8dc03509a278d60f4446d1f5df887035e5c455bfdf73fd63d1dcefa31142d62c1c8f16c5cfb45e81b0350fc2a395a871dba5f216a0b04a44f563739722702dc20217c54f1b2e42e05a86052e8a5feabb1d816b1544a550a3bae9d5fcc3dcf773213b1321cb0ea252489c1d607cf3856de15f4f84ad3527367bec160f4532bed5c7d65ebb16016b133430c6b7f9d8805d8d80b50d1a18e3fbc96cc0ee41c0da050d8cf1b5473660072360ed8306c6e8f4d9801d8a8075081a18e3f25136608720601d8306c6f8b2191bb0d50858a7a08131be64c6066c1902d63968608c2f97b1012b47c0ba040d8c713d2d1bb0350858d7a081457164368680750b1a581427e60402d63d68608c734c6cc00e44c07a040d2c8a8b0a0e40c07a060d8c71f2970dd84108d8564103639c246103568b80f50a663ace7ac4fafc2aa3dbefcb85ac0342d63b9c9157c69cc6b69cbd13c2d6271c6c8c3d4b366cad11b6adb9b195a9695f6bdfc840dede649b517a1761db86135b0b61bfef542a6fab55370ee3f56c6cbb5bed83a0f50d031a63b7890dda2308dab6c12ecf8be2871dfa235cfdc259cc12c5a5058b11b6fe9cd8e0608342c6f8ce1c5bdbec3d842927080fb6421eac97b525dcc8bc1a9bad48162068db85012d8a8bf226206803c2f1638cb3e36c7eec25846d7b4e6cf01e3af5924e743fe5fb01c23730d8c646143f31d817e11a14c47050fd5b74acab7dd8eacf7108d8e0a0814571b5cf68042c376860515cedb30101cb0b1a581457fb0c47c0f2830616c5d53e4310b02141038be26a9f1d11b0a14103631c931dce056c6b046c58d0c018077dd89a15bd10b01d8206c6b8da872d87e52060c38306c6b8da872d876d8b808d081a18e3a04f1f2e60ed10b09141038be2086c1b046cc7a0813176be73b980f540c046050d2c8aab7dba20603b050d2c8aab7d7211b0d14103635c83c1564b6e8f808de11e7d8dff14e05c7933ac62b65f5465fc3420db0e535f217c6383c86fd6f2956ac1fc395db602ba16011b1734b028aec1be1e01db39686051ac331f45c0c673af5fac54b7978b596a7fd922013b3246afe5ff2a42362188259ff15da5282e8c3a06219bc8bdb143fceec53345001fd31dc005ee1504ae209c459f8cd3706cbb146c83b04de2c4d65ad8fbe3c146e390cc2245c112c05a875ec905ef7c046f7298f0183d1d1bbc2310bc2961c2636c8cb0c1bb58c16b92e5103e3941f844bdceda5afd6a7788068b290a45a9e258228f67ca109e5a2c0be242f9e38ef85ef2c7743ea6e04f928d972a7516e42d55b22be55548598dc883398ea99001daea0c9093a272ca219b48f69562f9375e550ecf80f46261af392f92bf0bc572f5f71c19cbf2bafbdacbfb6a0c572648590502be37542cd35421afe4c4b285e9833a1673d03727c5277772623088b8aa2e96f834274a6b9ff2ee7ac9c956d9e7a86c632fbeccc9709fe19cb4963e590c2a9595ccd7a90f2998aed876ce4ec80113549eab5532ab55e188299b436e831a7a962855b5b5157fb194542cf320948c5ca8046330c3627d4a048ae4525552acf253297fac23fb7c6a99501a924b9b06593e66f67915be95e3541a59ae079e877c6d7df903cea6d234b57eb44f6899c42ab93022f55fadff74b0bb36bbcaa69dd56a555c34e60858ad0a89827f59ff07d254a82d81f50100 serializedProgramBytesString: - serializedSignature: 965dd30d370640460eb1066435edf22d7f8d97748f7b84f58be8cce532902455ee74c6539179fd0463bdb296e89453b9be8180a7643babdb4071db2f23ab950d + serializedSignature: d6857d96b5c3c6fecdb897e46226fca186375d0fbab9b7a84305cb512881d61b72044ed585aaa9fd2ef1d74581d5b3a5f70190e9c2a3be43108a12b54e8f1f08 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset b/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset index 9138179..5bd0781 100644 --- a/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset +++ b/Assets/SerializedUdonPrograms/83db23b73f5e139479d286b7db62594f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ce9521b47109e1548422004e21287e340ecd872c09200c7b90fae24a4cc515c7f1c179661c14a40102130c913a4f2147983fcced325ddbdb368b43bb30730c222964a3bbb73f4747f7dccb5a5489ec1c79880cb165b63732cc736d92e3b6265b89b83f410bed6939dbfca2a90eec3b50865136cd4a7257e1e1a83705d84a713568596a76c07d21295af3313ee17a1ad094f98bb073f136a19add06893cdb315b6cc3246bf0f892d6a74c2f30c94cb6883eb2cfb0d4a4d620a3bc95351062eeb5072426587c0b45def397b41621d42d90eb4a9b003a0f98a28b6edc2d52099ac679eb6f034c67fbdfc39ced324cfefe3cfad8e7cbb7e047e094e37e2e823cad34e5ec710d29470df29e461dac5fbe8179ea17f63d5c14b37af37203c639ae6f919071fed8ef24147b99df608bc75f0ba43421d7c1e96c91f35c8027e009d14d931cb13208f4298aaddd2df4891742c62e915ac15bbad82391c030189a56c921d56d9349b925aca909114f89ea36b116a9488e888bb8b7f5c5d207307f03505333f81fcefc94bd0d04b509263cf20c5562fd92418ee7307952de8f6005cc5641b703d267a2f816d774d3f91d0259c6dd680a6e5b1879063037a0ccf07c4e13a5dcf885393b85f84bc2ac58f3244905948cfa937b7ec15b897f5b9c12193f328775c55be151e6c35cd8334c87d9e7cf99d466e4223087d6c84bb616b9e22d39f2e4dbcc3d00a32511a102d1a93d690549737c5f21483d75c088697d12da1dcbe2dbc9fb2279eb2c89141758f9004350d2ffef1f7f15fe33df7a2f5a24db33c0e1bc61d1fd1bc80457a5963c045c15b8468b4b5808c3ae13764f0d3f0bfde40f8ad7a25aa175e01311a99ea1560e0f0be0c1556e15722b64fd80cc5be37c4e61ae4bf612efd1490589c20760fa07e6caa408ec8406e6b34c8fe51c50be4b60bb96a20e3478e604281a01f0f2a045b6408d2ecec85560437d8125f39e4f8fd36a426d4a812ff9bd0c69a1ee52ef29788ea6bdece1b559c8c3e76a02a47b483101d83ebd57952a1dc2a41b9802827656c261c6c22870ac25199fa6822fe9356f5b967cff6dd2cb47d0db29cd194e814dacb66dbdecaeb0cacbc14296f54ba0608c7914a753199ea308e7505515d5cadbab84c751d37333e5f2e72e18230133872a53d87d7b071ab4da616ccec9184d37fe1e3524d42ad9a844c35c9460f2b2b20fecfcc5a5e84574e6f601fea530c297efdab54d3aef2987ed97402f585cba52a4c1a90f62f105a8b90ee53de3aef319c6b75a8381890719022c9abd46b95f0b334ba4b139972a89e93aa9e33578c169d3293a4cc3dad26591bf316a8b444ca721b87aa9e6d8e4bb4d9764a1c781bee6060c31d22c3fd88312d5caacc3b2553316a6238888a87d42aee92a9987adb6860d4c1b223a25284bae1e30eaed6c79d83825c7f77487f832ee1fc5950e9a65be57eef5dd1fdd232c21866eeaac64027f1b49a788f8c3846d1f783709d5213ee55c1312a8b83534c9c023b27c039b8df06356054de266ae774b75da73c7121e72cdba205e36e28dcfb54128cc924b8ef30a5dad4c2e27e0338f0e2502c0bc365bf8acb0f645c6e2a039618ae2c8e8fc0a7b7490e93fd0acd8be400d80e4bfda904ab538f42bdfb85c1614085c33d190e0f02d8db7e087b0bc36946c5e97d19a7391fbb5aa5b903fa46187fa85109c3f9a08af30f659c9bcc5e19d9eb1cf194c3e200478a3d3a8fc09162f1a2e6028c1fd611dc1a598a09729c51ed1c970575537ffcb7454894e0fa8a2cc81b0fb1c4cb222f13398654383d50f9a44e9cca50770eba4289906ead8dee083aacc2e1a10c87671a7158e331cc2479ac194a8947b4df21b50f51c2491d87af61e050bc407d57a0a5b83599a7695581c97608e4a784d8f7215823c6c08d0b4bf63f33cc32f599a17b927ed9e3233f29643aca095a12a5f397497d5416e712d9b400699a7ddd36491f895a8de46922387e496bf2e7021733b116b90d85df36b7082c5364e60b5d74ae029f5294481db6039afefdf9ed083c2602f619cb351c9ba391cd0050bbb4b438812f7ee2d14801f530ae132c34e615a8ec3eda58bd60a61900db25c0e25107f1efaecd4d2f77e0e40e285d14c2cf81bd23da883181754780a185d2dbc6f9841820b2be4e960d6459b5514d3e1a1568f7f97f3ee01410499c9bc77aedf84c7121af332e0c70fd5af38b3254f29abf4d3afbbfca0175a22e5ac48308779988d12d84d8824e2871d3acccea4f9297685181d6a40db8942ee0a20270938db0c11deec4554f1b2c34a10db60b504ee9847244e2ce41b64c343af6902e505302a8d36f23a81a2d551ba89d02a84f74474b04153bde23486ddab838d6065c5417704c00eee39b8c9622f35a6d30a10bca3601caa7370965c3dcb94f17940901ca4f1a0165b07964338ee14901ca4f7542392681b242f3487cd9a7cc7ee46f72df36b78f08007fa613e02ee5d053e6559acf3a0d01bccf7582d7efe3e80db2c2b42e20d302905fdce4e0d3fc2bef0e01ca2f75429966b54daaa2b00d8579c7748487159b0fc09800e0573a01c4986e57302fceacb501d6a10bb05601b0af7502860b7ad1d29a17b21601b26f744296f11938eadfd3d03a78dcd105669700e6b73ac1ec16225ecd711b14efb48dbd7101be199df0dd95d862fd7b02eab7edb55aa6b6cddc1e766bcecd0a28cbac681e59653cce2a86b6accf6ebd756095e6e894a1bd5556046e8a94d60eaff2f45e226e54843944f7a6e97fb23487001872ff38b836ad5ec769994cd2ab9c9c253db492a7372c6fb3fcf3ccfa4b01faa09966e85c7513346f11c75de80afd134485ea44ff03768b256a05430000 serializedProgramBytesString: - serializedSignature: d337bdfeb0ce43061d068b3ca9db6de84d1df42af1c50d8746ae4630f309b5d3a3365dba4765485c4e9894d4df0e307ee34df55cd8f806484c2be74bfdc96806 + serializedSignature: e1ece69fab82dfa140f30fe0ddd8080152bbe7c7bacf9adada80acd823c18e7cb745e29ccf7c8d3588ce410bf77fb3d4513547ca9d6c1b1f41f5b427dbce710e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset index a670808..3c41871 100644 --- a/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset +++ b/Assets/SerializedUdonPrograms/853a35cf0f51df6498d68490a1f662e3.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b53d35010ded3362df50678c3bbbc89a33601479f1c67145199f1365078711c2810983a2d302d32f8e8abffc8ffe60c7ebb3981f4e4a4a1952822cd34694e72f6f2edb77b3669ce257cd47dece6698626a94273b4421bb48e5f933836b10567e1f8076ae1b8867d0dd7eed368ca4cfedc5157b09fc6599bb630f30b2de35897ebb3e4e3f734e6fa38e3d1557c7ddca50a9834472fe83dbda311752945c4bc4c6aeb31c57ea901ec9fd3575cf5c52856e2caa511ec6671a52dd79a303abcef237d12b79ab8b68c392d6a40e692481cd8e1b9e2931c0afba75436c6f291b1bc3ee6f02de2eb44ce95fe16f53794171d2ff19cdddddd9f8e12545ec3ce1a6d922b02eef610be70667ae0c4d69c36e68ea8dd02449b1060416f4e62b3450f69c28ade55752662f7a4ec6bb8a32e425999a1e2474c051bd7c0e64742dfc6f82b610e07bf8e2b157a8323cf5aa47104f3a321651e6a1ba08f4f55ec3745de22cc8edf99e612d3c49c330399018b9b180901ddc479432c9c95fdb658ea8bf5d318db929c5a47563dc77147b4c57d6fe1b74d67554366b7d14ee6a4f12065c230bd80376cbd2bfc3d89c8df8808435f1cd0695870a5ba7c8f45e204c3a0c838b2480432c68332da313641aed4de6f31047bf731ee61c8ef8316e357b286fa58e096e8b3cea250ef8664105b1466e30c8eab62058f2f6b6cbaeb0a91b2e35ed8c3679f3faeac41533d2c29d97bc116e65c5e04d58d94c075a30d7b36a62ad255aceb95674ac25717332b56575852d2fd21906fa5b7f82254711ca793730fc92be9357ceca801eb143c26819938ca96385c845435d3c4313bb20d5960d8bff5ae85c04e6f36f89e416fb207a72cc1b962690ad34c4882306781d0638b4e59ad2a1b56b1410992f336c97c7ada92ce1e939e5baf53d277c6f49492f51492f49c4dd273ae2f3d8e8d6cd239cffe41b205f7d5e5bedea936283d722724ea5162a5b165768516b0ad113fcb2c486fcc6e6ee39c9d6a20b7f97a547d2739edc41e1262c7fbf5347793685db4918283356c43e0a9a1b7d3e2c0e30d846f4170aa41fb573cebf9b0a9b6d75076f73a0513938643c9342c257976dee6d9933e621b3ca73e8b44b637dfe671ad8e3a6ef7aa844d29ae015392228ce50799c1676d72b9f028af87f5877537e1055b5485454b6259faaa72a1cb93e3eaa13d44a47911b4b93c7f55b2296c4c6dde1dbc918a3f3095b447a12c202d85f8b8797a91a31abe9cc8b9bca6a87b7db229dd0a7edb53ccdb39d47b350b04bcd399a9b8885589df62ad493852e59bfda029ff8108087bcf437859c2a47a06605664756963e30fa7b821fce5a1b1acbfe5309e0f83528176a4476d89bc15333fa481386a965f8ef27b2cc691fdf26a2f8b1e97d791ffbcf2798c0f77d145272c141e178aab5966f39048e3e621689e6c0bb0a1f3779e22cb1db95e3c8843fde47b41f23d80ef5a96f0b102ee34eafadd7a4d3f3d2e806dff1e6cf9086cd7b384edb486cd6cd9bcec402b67055a2e02da8dbfc3b50c61cb8c6b1481ed6696b095356cdb7bcf1fff26cfd4f1e9613cee616e75b60c075988823662587bccec7f2bf7d6a0a126c7fd96c2e5f729ea31f5d663779799bededf8e3a6544aa71a47a189ba7bfd3cf9ce91215972971acfd1fa5e0bf665dd64ace88ac7173887c209c89dc92bfd05b728ff30b1f38f2c93e200000 serializedProgramBytesString: - serializedSignature: e5fe765a5db3baddba9dbd44b161c91bddcc8ed6efbd81cf2fe9b248d856e184d13022377147f95a73fc16ae897da901ebf03567f4e202616cba02110b9de00f + serializedSignature: 97ffdc01eb958f3cf62078b1d8fea31cddbf5a7face63518dde749410c6fc6d543b6a4dcacba24cc671e12f76c43b55cbe231ff36b4669b3fbef6bca33a7720b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset index 9e75ce2..c56d259 100644 --- a/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset +++ b/Assets/SerializedUdonPrograms/8732b730b248f4344a2839981e1ff9f0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9ceb53134910c06703210984f026e00b7c82a79228eadd799e1e0f514e544e1e5f2c0ba32c5eae8250095a5c5dddf7abfb8fee7fbb2aafbb77d6743633d9ddb0138c6728b2bbf3e8e9fecd74cfcece422c27e0635d85af4df15c2c8819b121b6c59e7807670b70dc851fe7ca4d5f156538be85ef02e45d15933e35f133658dc1f7325c55c401d47c2fdec0b148f96bc286f365a86bc315a6eec0af0da5ac4ea8b42116c533f15464ad111f119b54a922d32cb4cb4ac2f7bcf81d726d520a1bc9515616bed620a74279bba0b45bee85784966ed42de1ba853162590f99a24264b314127c2390c8a4f9722c5cef1989547fced82df71760d96c516e5f9a83cf630193df29892754f786477b3b2299686c798ac73925de3b143a69f62d7a087f597bc1e63ba7a6d49b0b42e96266da1b4d30dec51e9edea9554a4c5a5cc33ac0d9e3ee19cc75c5b5cdd338a36fb585a86a5e131edd1ddad33c0eaf4b3343cf6ca3a934c064f9ff0c81a66d7987f56da81e9f18f1f3ffe2b6ac7cba82c77cecd8f5be4098f606c16c4bec811a4cb22b8cbba35fd9d95c64e4c2a3b45cd1e805bec830085c76c903f1e88597143e931e3569ae9bd40df05285124a1d898a7897fea9a40e54af0633377af40fa438a16e8f045c899112b70c45aafc47570e0171e299bd06c0942862dd6e17b9fe4bd02b5eb4bfa9984a1c15be739c87422d72ea4b840f7e1ba441aaed1f707d2d426ed9721ed80e2e83b88a4f3703ca4d6ea6d2fc3b9aacd75894cada33a80e9d29d30e976d3225883dae7303e7ced9163e9110ad5e7a51b76e628fafd5dd7135f193a410683e9b29471dd09bb356937440e2fade77504c3db586fa17a7cfbf17ed9800c7677962ca8f6307ee2b566cd8a1c4dc5a77ccc6a0415e54d5ba375121aab1f8f77e651492f7a4b859e6e13d65b881ef3f6484a01ca86c78f50af78f1d7b1cf63b104e11bab33ce5f051dc2980a2186676bad85089f8186bfc9081f1e20aa7bcd0350cd2f45fcea6f2cfcdad7d1eb50d0cb6327752bfb34e5d1094b6a2477aafa85ee10b78cf6cb06a439b74b0f28b74873ac13d1315eda50d661d4a864e3feea09dc5f69ea2f9c98a2d14bd78f7115edee567b8153ae48e5c27b416f60aa198d17f8b5afa3d7a5a2472bcac2673056dde575f3e3b52f30d97e227b31f0780da29b8e7a42157bf07240379d7bc34f5c1f7e92aa2ea585e72ba35deaae16d76059f018f20a50dea65b4f4c5f058905681be5cd510bd515666d8dc61d3a18b84387a8432f08119966baee4ca988a34f5baf3f2be2ee900d4f7d3830f511a27ea909ea8db4d391efd639d268048ed4a3128edd9a55d1f00a1ed10b4eab04e3201a0b2238ad17dcab128c8cc68308cee80567548291cf892082fbf582fb741d7832820eecd7e1c065d09447b885197c544e8a3f445efc198ad380aa450cc8a783704ae9050fea389d8980d3904ef84404c28775c22715c2ad90c24774c2cf46a0f9a8ceffcf1dd1ffb33aadcf2bb44e86d47a4ce7aa178ee8aae33a6fbaa8f2a639513bf3559f12cc882df8d98398bf2556688eabc04dd5afb4fcc51c752d7d7a6d4eed723a8cef9ed0d9774965df4b219433956e7673acc6079f0735b9154a0f23690ececa94d67ccd305c4eeab84ca9b82c85e452d589136a340ec2d91cc6d2533a4ba75596ded158ba417777255a1414e53d1c6abd0c674ef5a2d8aeb3903fc6886e4c9fd659745965d15da15bfce062c65df834d363fe52c358754667d5372aab6e37e5a96fa555dbb435b12f4b3da58d6cbbce5abefc0e63c984ce922b3a4bfc493afa57a4fe0732b591c6debc4d186d3846c35832a9b3e4aaca927b9ed9816be3e8bf442b8f5da8e2a77b502f6ab68fceea2cbba6b2ec7ea0796f0ee86ecb08b117c9bc57cd0963db399d6d332adb568e18dbb157b057a38bee7e335a027e2c0bef7e1e501b6528b94aa31baf2a22470b9bbca8ae56fdf6c751ef5d1865188fd7a1e5d71497fd77cbf1e519dd6ef98e886ae3d4cf0a8734d6dfa1dd7577334e659dbf4dfa4de284b4c89505a469a5f7a5599ae7bd1acbd182f34a93a3c95f0bdcb0ecea508fa1f08f841d01ee8c66e1e2734b3a864d4e851de2db8adff6cb3512e0ee2b46f09a080e2d277c96e5e2013f89782c8ff46f9844d44588b07a018ab4079c9518c249c43dc2972273c4e6f641ea43461f05e943506f8fe0da60842784d0d395cf4df3591e02a6356e345d3776aa33937a46c9e3cc74f37f3e69e47150dc4208e36e8c252fbf6dd2cbd3d4534e1f3afdf58e8cde02aff3b47594d7295235bedf1fc49066fcbf8b05c76f4d62eb96d89c86df4321bc05cf9b43963085ac8321fbee7846da4d73d8d2a6b0a519b6ef4d62eb91d8dc45b9fb18cde0581b3105ad8741bb733c63ed7a1b8eb54e86ed0793d8b0e9da71d67e636c94c1ba6b7a0ac02736879e27dcc690c54d21cb32643f9a4496946ee908d8371bc58ce11a66b8ee1d4f149b35876dc814b624c376df34361ec5966863a204aa18744e63b7b4630cdb4fc733dadaf15623c5b0cd99c49662d8f08fe80edb34aa09066cde24b084046613b0f68435c4602d9884d52b61bda1a709b59b28edb8dab418b84593e0dc05fa5ecd1e9941642953c8620cd983564432be416570b964cc39130cd852ab81b56334eb66c01eb61a98c15b5963c04618b047ad0666f0b9ac31607d0cd8b24960ee0a13b71dde8233b667c81f60b87e36894b7fcf7fab0d974a1986ed712bdcf2c3a7b7458cce941953c07a19b095560333e898c680c519b027ad0056dd426dcf5b8b4106eca94960eefdfe8ee06fd2b5e318eb175fcc3b0c799cc89e899a5706748fcda71b3eb7735e2018900c70927a226cf28d6deaea027b9920477f3e527d1136d88b498d65faeff4afa299967a749722ebbb28de5e50597a943719d20d7a25477f6df325dbff8b70fe29117d70986669cb76037ade116e830794e9d16099cac4ff03d9572e3e5b4c0000 serializedProgramBytesString: - serializedSignature: 0eb4338d246089b3935c5c9b14036931dc95faa18bcdf22d0bea8fa5adfc8a2f6c53b4d3c90d40bfd61f15476fdafdf20d8d8f4406ca2d3ef20867c9f0fdd80c + serializedSignature: 449b99304f56844f853b90a6290f9f4e7f8aaa324508e9029a347a130aa1acc07a327de2fb28b0b664eccc7bb0d1030384c9c40c4bea958a7c4c1b42b7614a00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset b/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset index 8e74be5..11aa121 100644 --- a/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset +++ b/Assets/SerializedUdonPrograms/8738b1b65f9c8b740b34ad9cc92ed876.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a3d501b47147e2738fdf02720c640ecc4729cc4474c381932ee9026601b93f14fc2df4cc664b0309287b12408120c4e951469dcd0a4813629525127451aa7c533e9dc6426e33a699d3aefbdbb8345babdd3c9ac132996462bddfebcefbdefedeedb1f854cc097368cc902ccc0248cc03cacc01a14f1d7247e17f06d3d39f99fc2067e3fc0348365c390f06949af8bda00a6d3f8548232b6dc84fbf8bdcae5b390c5dfd3d8368b4f949bc34f166b69add8681eaec21db80dfd5a9f8f88056e54b2f334b24b8b623a018fb034cb4a1188c945fd98cc624989cb0aa8b453ef2e7cc16615b0ec3eb6d9803cca5c668951a60b3fbac6daddc0fa1958073344f9430168745afa1348a2c321009b49822da3aaeb28c0c58a79e6a80c6330ea6ac5a0d621e83dc969066bacb2d0de6a889fab2048b93cbeb3820b4a983fc51e2427ac62c908dcc46f6a750f2e23a9772ba42c206c1edd9885394cd759de3d54bbbaa69f49e4aeca363328d3ea4d05cc71085dc7e73c6b38cbe9166b9a65eda731afcc7dbb88bd7b02bfb719addaf60dfced86396753e6aea37ba792e55b5dd771d355b486b4375ba89bbdf6c8bfe111a23edc6b0fc35693c688f6b8ca13af39b426199d276b4bc665a64c3b96370a263d6a33550c06b7b1da42f7fe6df17d053ef2b4c59d1972f719b6e0c8c3dfecff31301dfded4ffdb869636086c9b4b33ea679114bf20ced7495046f1374bd35498a56d2afb9d11fa1ccd95748bf556f95eb0577409823d371076883f838873fb6f193b72b176d75f2f6ac48cdad354bce36a2ca5f49121e61caab03aa9fda32d2436ea4475f35e9feb38c17e9d143bb8e48076bf5e3c2604cc2a09f0e32065bdc1824102dab94c179ccb39643d7b8749563e888d09fc80aaf5ac4dd2d5e6e6e32be37cb6d684d4b05cb669bb3a03c796d12005fa785e4e9c1cdb4eeeed27676a91a35646e6f75717b92dcdee1c25392784233202d244f0f0e52ba1eab30886c9140ea32c84e2fc8432211726c6c2c1d08322c83ec9242e672b9b4836b1b1d083222838c4b21fffaeca7f1c4deee602ab13ff57c9ced0d04199541764b21b1378e5bb8438b3b7540c664903d52c8a1c5782ab1b833914ab43dbb900a0ed92683ec9542321a02a512e7be7d580764bb0cf20d29e4fe54860cfc3e9578fed577754076c8204f49217f7df1632ab1f3e4452af1b7f17b1d909d32c83e29e497e38f533c01247e58ffa50ec82e19e4690f5f3e21c88ec3292820645c06d92f85dcdbfd3c2d248121bb6590035ee3322d2481217b649083b542eeedeecaa6f508be358d7e5eb317808f70d1b7c6f1a78c21d7e4f19284dacf67285417707142d16d0ef55ae698e57f5af326c84f6b7270521b773f2bac0517b5cff1e98eb31974b3cedf26f92145c4b6c891854cf334d16c969e21afda4e85885ee1d7eb27666d7d3ba66abfc479246ca37a944bf2562afdc473eb7f4df3b3c7797606b5fb604c52d15bfff3f196a4f1f636086753219363d8a53a273b7ff5ce115a8b3be5c1f7cf9680db7c9b8002a8e72e33870ff992618d37762bc23ea302f1658e59622ccaa9d15e8b39fee7ebe4a38f51e315def194f01de1ce1c4a925f122ac93b25216f8e3765d4ed1b99c6a840e3799534d2d4b8846f02ce6195a543d9aba88e32e27455c48140dc3baa895be1a9d399a31b7be0b60ac45d50495c374bdbb0872ec591eb7c74956f68fa3a05fade55495f1fcf7b9bd8a8cc116aa2c902484c20f23dd503b8800fd4c03a582f373471dd0271efab248e76b75b4cd42667dcc002ea758d1e733b04022faa24f0bc1d73ad1d7b91a32e2951464636f0f913fb0a7ce9188c68d21224d5111c5345704820d850493079b284d62f37c5c0ee11681b52495b1c646bc1a25d4519791155e46902791fa88ecb252e5ae1454db3c5e53681c84baa7ba1185e9a6175d82e9037ac923c02cad8073e5b0d1e8f7581b40f5592462ba707e09c8a65f8e0adf1c3465ca06f44257d5ddce7cadcdc6280f6258d4c5d58a0ce543d5c8b5c5ce07ed7c8a4b508a4255592d60b950708cdb203e902eb26a009ee5c92b4bda67f4386e37637303c7abbe1739c66780436c37702326a386937021d281b018f618c80cb43a386559051e346dca8e9c4cda879581935c54bc3e77cc5f0dca459d7613d76bf2fa246b780f6c719d426c3df47576326ffa7e00a04bb02f296e97f31344a5d5b739fe1f227365e4fe22ececdd297b997ebf0f08ac97fb66866fbc7a0e2d6b69fa7a679f4bc253c0b77b0b235c8e9a5ff03d785863578340000 serializedProgramBytesString: - serializedSignature: d99e392106d36406a9ebd540e25d1cfac4c243ec89e980e42013811c076aa3074bc8544920ab3f78773e2a271742509c278ebd7ef59a961b0917ce882765b30b + serializedSignature: 5febe6a1e200fe55a6c33e37ea687802287eaab7a9ad818487f76d31c33e60c8fddee60c1865c639c1acb3d133c8250fd29c6a5a271a32b5844f3073fb899901 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset b/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset index 5a59432..7a1ebc1 100644 --- a/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset +++ b/Assets/SerializedUdonPrograms/8aa7408108b6e3e4c86e2fda4d829017.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c164776c0e7c308d1aba9c6180c18d124d1c1050c124580002309b00123a10202490849748c0137dc0beebd9f7befe79a7ae9cd492ec95d72492edde997c4492eb99b373babef7db3f3be6f57abf769573ef443a39ddd7d33ef3f6fde949d9ded5120e4bfc40cf96b93d8288a44bea81035629f68927f15c9b051fe38476efc06d122c35df277953c37438ccf7027fc9b9218257f97c8a356d126ef3c20aa6558afce97895af97789bcb7561e416c9dfc5f2baf4af49437558862b15eac132313c33388d8a46e6ad57109d02bd15bfe5e268ec8b3b52a539048813a3552fe2a93675ad5b9469969f7baad62bb52ab519eab96f7b488062973a792d8fb3b4385fa4338c1001d0ed4e165f27f2ff9ff19740c5a2c94ff73e4ffddc6f583f4f5cfeae3fe44fc601d2e96fffbe8bfcfd1e1101d2ed1f73c878e21bc1cdd73b90e97ea6b9f4772ddf88462e69cff163a967af4f82e9176b19176b10e97a3b4971b6915e97b5ed0c74375d853872bf5f917f5718e0ecf453257ea70b88e93d70cf858c70dd3e10a74fd08149750f6949a46890e4725e50d74cb6ca40e572179ab74b81ac58dd6e11a14b71ac541b856a7fb123a06be6f1872c718ac5e36ce9fa7e35f31e2cfd7e158e33e97fd38740ce75fd57c8febf81e3aefbdf5dfd8d6ddb2bf4087a546d997ea701dd27f9d0ed75b386d4071eb511c845768d9afa163c9e99c7bd3e4d3ccdf46237f1b755886d22dd3e1853a2c37ee29d76105baa7af0ec7eb7002ba06ee7dbd032c371be96ed6e11694ee161d5e696179158abb12c541b8c960b9c961d9f34ba7ec73da883c6d35f2b45587db505adb74385187db8d7bb6ebf06a74cfd53adc21527dd10e91eaf3dc7cbf2152f29df360001ba834f253a9c32a949f2a43879dc63d3b75582d681b9884aee9a80dd418e9d6e8b016a55babc33ae1b5815d28ae0ec541b85ba4dac06e8765af1fa6c96790bc4f16a9fe66b248ad57f5866ef53adc83f2dc1bc5c1b56f1ab22ed2e15e43d65e1d3620597d501c96d54b874d22d5ff37e9f0808e7f0b1d63bfd9a6cfbf8d8eb1cdb6eaf3efa063c9b9f79746facd46facd86bc83fafcbbe818c2433afe3d740ce17ea4f37e7dcdfb864c9b0eb2fef776b94fc9c0285787b81d76b9a56b871bd1f579282e1d8769497983dd7a305587fb90bc7d16fdddfad0623071e37039bd848e6539f5dd62c89da9c3e922d5beddf3f93a9c419c37db6937be4087fd8cfb5c3b6a437977edbf50878745aafd1fd6e11174cf11916acfcf1bb266e9f0a821eba80e8f2159c77478dc907500c543788d3eff01d2c18d87f08448ed5b9e70980f70fb81b345aafdb975209dfdb9f5229dfd5d8bae9f83e2203c65a4714a64b6bf9348de491d9e165efbbb0ec59d4671105e2f52edef7acdc2956796f90d4639dda0c31b511a371adc6fd2f77c4894fd1943e6191dde8c64de6cc8bc45dff391a1ff4c23cd978df3f9c6fde679b39eb8f1543da17c9aeecff66dd0f1b6366cae48da1184f393653db452c7cdd3e1ad88c5ad3abc4da4dacc6d22698310ba63b86f1bf70d43b2fcb6b7a374b840877768d91fa363086f47b217eaf04e1477bb0eef12a975d8f53777a36bef46d742788f48adb7702c6d75709e21dbbdefac481ddf9dd5e1221dde2b52edceedd3bbf5e63e7dfe13742cd31bf48e71fdfdfaba4fd1b1ab3796f359aa1c5039255f0f20dd1fd0e1c80c65e5ea3a0e1d23fb1bf83d43a74cf26c71d38cb27fc828fb8774f820927db10e1f46716e7ff911a2ec1f45d73e8aae85f031a3ec1f73180e9d64c876ef7bdc28fbc78db27fc228fb270c4e4f1a65ffa493de90378ceb9f32cafe29a43796f39921e7c746be9e46ba3fadc3a919cacad5751c3a46653fd89d2b19ed539e2d6ebe48fa2190fd79c0fbddb42fa1d2ce49a859b655724451257b5d05ea46c8a9dfe940f7cecc138120ba17fc827f5354b26db283d22c055866e32ad45c5f9b6ca9675b67e34627faa37c17a9df55f28a7a25f40b6f121f7a9280cc35c89f5a3495d82ae357aa9948984cac9767f2c55a19c25d95b2c9dc2a7f52a56c92c936c84e50ad2897bf9b95bc4a996def959954826947f39e8d52a6332bda28635ca0cdf2b841e5b04cfd3ea8725aab725f22e3dad41c6d931cf62d93e161959a57f716f9b72dcd728dcc9e47fbe42815ef4cc1bac5542cb581dc17a871e3cf4aa42b4a04d0f7fa4257c39e056ab6f5164f49fc8ca1e3646052b444cb98a5902552e2668b02352fbdd14330b88e5e0dedf6edf09e2f3bb0e974b19381e23e4f69902ce17b3e18f8fdb64f1bd6e4a4aa364714a821d8d80caaa5030bf2f212233c12d2ab9093d3b310326ae24fd8f0abe1605916f13bd7d5abeb8217402fd532a51640021e7dac93176c90ffeb55b65bd50d4d3a4b0d3ad39e122a0471b90ab2b709cd94510a730f1be6ded9c69cd9afa4c3dcbb5daf2466f86727d8872098290f14c1736c0455ff6b1b2b416f07ccfd6b99bc77b7247150b5aa07e4fdb60e5b7aa630d93dd3606ae7d94ff11c6fed4606cb1145b8a78db09a8ddfc34ab842c6395dcce5ea6cbdea97400fa54a495f2fad628feebf803ed4f52ed352f550fa80ca497afafd7dd31fa0e8c3540b676ea992c9b1944c2194cc409b027d0c0520ef84e05e94e0412105e75282078714dcdb66a4503712db598db45c1694b34c235fffbd4386b5f20ab398f3dbe34b95d4ddfabef4a638c4b7290e55a63841884ec81365707d6cc5079487f929bea174f1f5b50986d4cef523b81f2db81f25787848c1fd294b1e11d29207d80483798fb4b4b33f91ff3cc2fbd0c207daaa8952e554965b4bfb1487cd5bbae9ee531e1272e48e7137cab04ee502e2ab75c7387d5ae9abdba8763e49c605aa44965b5bd8aed202269bfa2a23b23b8331ca19442bcf94531964b34965a8e5ac36692e49dba77affa05f53077ac1f03865bad90bb617ce585538a33cca65ce028570b00da1e29afdc172c70611b08a6aa4ef41c438916eac1b740831c4e671a1a7024b2d3c0348f0aefbd59fad223971e671c2b9b4131e4a79f8f1160fffa81c8907f1f0c3a8766942c876e95c4af08521050fb719afb2e87a56e3a57ae0e56abd2d146a9d329ec64e1e5d4cb4f1b29af92465e6f0a0972faf54a5184119e9648b917e15d04847da84c3f517f9b1a534bdb251365b1ad275b6e46d413bd796a6f8b6a5bc8cb6143eaf942d8db6958af282d99ce53247e0c11aa8a9be494f13f619ae4ce953f4c650cdd3745bf304fe7f87fc2994ffcd660ae2e1d19df33e419026eb3c2a0f336c791888f250a2eda75e9dae17476d353a4dca636d29ab091ae1edaa17423303b3317d958ff0a433864ee77c4ac3029b86d0ee55db668d036836ce962274da600592d91782f9788ff071b4f00b287566d9d419a4d48189c1165df5af304c278862e36dd55df54b8eb256f74c431da77708f2ead4f36b47de3a016fb41c521571af747207358172555176a9b3618795b0ceee7c4bef16fed99dc81ce544168bcc03384ead28973481b2aeb936eb1aa24a7db79478c86357e5ca393404740a1752e9cfb3a50f4ec174851d4b772295ee7cca49389db343aa7ca0a4a09b1624c549548a0b28c7eb925e1a32e5c9b694a18f068bddc2f4d12ea2545a64536998a5f08ad551b57ae2d6dc211735c59607e8dd5e2cbcbddb497d82f56ef328e1975884b705143e952a964b4316cb349b60a8ba97f9119c470b9e4e95f7625b79832aeb645f69bc34e075d298374be7b53150d9ceb0a5072d1cbca567b6abb0d23848bb3a9352e672caf3b91d21ec093ade11cba7d25f6a4b7f304adfed6cd68648bd804a7d19e5779b44eaa3f652d5f204ed2a1552e916f9f1bbe5c279c61124c559548ac5b614fb1b29628d83a43a9bf21ccb2d9ee3d97ec13cc71c4af80a8bf01f05143e9712bed222fc070382099f67130ea5bcca8f6b4a33f5349f125c1252f0028be002358306af55666bc4eb671d96bdc3aa5eb235f4576d87b5b30aafdae6a997c6fda74f752d17da8a040ee1bd5d7339d5927e5f371cf9aa578ba76872e8a25944d5ec52ca8781bf0428753272877057b9d6cbb62348ddbe98526c9d45b19233af373f397de8c4208a5d4219f3fa90c67c2925784348c197d904431f162a89f7618a29792c2d79b14d32f401e07988f53943803ec0129bf0a1c279b539238f69b4e0cb6d5e434d8fef65f51afe6704dd0d1b3a6f06b3dcc6ccea652a949729104166303b925fca332da56c6a5327d8d432aa2a6c0e5b158a6c92a1b1dde2c75ad30c188aa96a7065c86ab0dc2618aac1557e0457d08257508e6c6b4847b6d226183adfdbfc089e440b5e4515def690855742e5f8ea90395e6df361ea61525d97f830be55823b7c7bae4ae5b9a6a5f15c1cab03d7d88a184aa2ca4f1157d245bc96f2553bc3faaa52caa554877429eba87a5413b21eada720d78684bc81125c1752f01554e9ed0a5b7a1ba9d2db1db2f4caa8d2ab0f597ae5548ef784cc71854d300c0ef6fa119c6614b1892abd86b0a5b79962d11892c516aaf49a4296de955415d917b28a5c45096e0e29782bc5787f48c6db28c62d21196fa772dc1a32c7575b0417a875215077bae205236a33baf4bd80361b076b2f0036efc84b8cf668e7270f541bbfc3563c3026815d3ac28e492aa9b23f14b2ecab286b3d1cd25a7752393e1232c7d536c160ad47fd083e400baea1727c2c648e6b29c6c74332aea39ce335219de32e4af089908277db04439b095bd2846a33eba9d23b19b2f4f6d80443b7e0941fc169fa0f7ba91c9f0e99e3062ac7d785cc71a34d300cdaaff72338cda0bdc9261886c037f8119c6608bc8faa7a3786ac7acd548e6f0a99e3fd54d53b13b2eab550826f0e29b895aad3b784add36d36c9d0a4c2a642619bd40394f0db3a41f841ca3c6e0f691e87a82a7847c82a7898f2467786f446476c82a1bdbecb8fe034edf5512ac77787ccf1318be002b59c399b6fc1245fa0e8586ff81e1b056b6f18b682b2bd04933907545ff83855b7eeed84ba750d25fcbe4e107e827266f7877566d75235f7819035f7a44d30b4710ffa119ca68d3b4539b187423ab1d336c1d0143dec4770252df83a4af02321055f4f99c5a361cde206ca8b3d16d28bdd68130c7ef7713f82d3f8dd9b6c82a1d7f8841fc169ba976728144f864471b34d30f8bba7fc083e4b0bbe8572454f77822bba957218cf847418b751f5fad990f5fa769b60785af89c1fc1699e16de41097e3ea4e03b6d82e110b6fc335782b8ff82ac04b98bb290173ac142eea684bfd809c2efb109079707bbb6867279676d92a1c17ad94f69a669b0eea51cc82b211dc87d148b57c3b2b89f32c0d73ac9001fb025008b615ff7c324cd5ae207a93af946c83af91025f8cd90821fa658bfd549ac1fa1eae3db9d501f1fa584bfd309c21fa30cfcddb006fe3855d9df0b59d99fa02afbfb212bfb93148b0fc2b2788a32c00f3bc9009fa62afb47212bfb3336c1d095836d9e3d2b358bd521bccd54268ac51a39ccad9203c75ae34d28e7314bbe5ad35922cfaf97679ced2e21c6beecc2b635065c8d07aea97b3704e9803e4b69f9b14d4b588be93f97f93a9f4060a9dee813de044b9f7bf3ec26b59a3dd86ad7e728ad3eb16975557bd9b9efa1e1b7d06c6fb895b45f997cb76da3d2ba56ebd8a2b55fa9b44ffd941624dda25e49dda9b43635c68fe4cc73986f1022cf53443eb511992c52274696aa7733abd49e4d9023e70dbe1d62add27d97fc7bb727a7c9a99420f9fc1695cfcf6cf95c6ae43399a693cf7da259e7b255fe94ab6de8bc1696bc8b8eefacfaf602a5dfe736fd661bfae1d237cb64a52e13bf3a74d4925ea434f8c2a6c1251df018ae75b579b697a0bda4772b8a203abd44e9f473369d2a489dbcba381658a2cec28b84556a1a11eea37549f5f47eaee92ceb7c99e2f0f3360eb58c7eb32cb4dfa46cbd33da9757284ebf40d90b27a726796d914c0a3402b9c97b82b42c1de1f02ac5e1176d1c96f8f2d64b651e6af4a60deeb611e1bc75c75aa2d728dd7ec9a65b59609fb03c06fee0758ac12fdb189ccdb29d53bb0cc0f5c1f2e167bf82aef2356f5065f09d8ef7886cb6d7553da23729fd7e85ea1125771835f71775746c6def3f38b1dc5ef02d4a835fa534f0db8749ed0f55cbfe2b3c64ad51f67cc0eae13be6ebdea634f8359b06cb7cd95899bc78a7eec3253ff2d055defc1d4ac35fb769b8c697862bd543e72aed4ddcd1c57af977b27e7565cd7a97d2f937a8520d6697ce88a3a8dd2ad38f3d38faedef511afea64d437af6c2fbea5e6acddb45ccc1f81fd904d1ea7d4aabdfb2697571809e87b37589b318c37f8f23bc87fc80d2e8b7839553a9aa6dbba5ad38fa94aaf8aef2291f525afd0ee5f7a95628ec581ecb0aa2c1479406bf6bd3a090f48a61f3df31fedfa672ff7bb6dc6f08ecdfdc316855fbbe6441fc18f71ce7c794f65f522d5a30dfe77a77f36cab27f7ee460b341daf94a4c504d1f9134ae7dfb7e9bc42d0b3677e6667e85ebddffe7ec7dbee4f294dffc08f6f713e29e38c9f5c5dcb655cf26b3ce9f5b3d54eb82b88069f511afca14d03fbb805d20c3e6e71f4a3e23bab843ea7f4fbae4dbfd5c21d1b97282fd1a6d27336a684bbdd6742b673c19f0d85ed97e4ca9f44029e442e17ce2693475276152a507baa16b6eb9479837760de28d305d6e5ed337899f700fc23417f4bd0fb4a77473f2bd7b15d0e4bacdaf9dfadd1fb09bd5cad912b4b9256fbaf76374dff184a3547976a8f02b5bfebf40e5a53e65cfc09a4768edd86827f4ccb11b04ed72525c0dde4ac480f0161d8606e35b9419da9954232e620d356bd339500b7d5ed840f6c3a3bb8c1b46b8b701e957ddd4b88dc9c1e855032dfe3c4074fead7cb8bf17e91aecd6e68cf4e1c905d8a907d9f13592f65714e3301cd7b1ce0c03f17ce9f72c219aced29b9c3aa3b37182f6bfaaa4712d89f65bb02ba1bb6c60bd9c29e802c37c7106e8e023aebe3b39938d3adfc20d5af3aacc6432d4a5e8dd9eaab7dc7a396f31fe0563bcfe387f27c55be3c9f1667bfcedb34e475a0054e766fedddd242e8defef937bce759083dcfbf0008cfb81d35e58dfe92d31b4dd365d9202f82c973db06d61b056c306d3ee2a3bf36099661e433cc976efba478b27e7e2074c49bed432de60f39910fd7c8abb5cd9af31b78ec3c8b0f640e17c88b11c8bf8a0a48468b6403b91081fcebae72024ee5777a1bc1664518910fe0427e2d42fe379cc86718c8f72174b6a96dff93e08cd8277161bf0d61ff5b4eec233476675ead49a1a7572a307adf5c2e947b10cabfe34439dd47cfe19be2361a11f4bfe7843e48439f6f5871727f7f3678795cf0a62178ff900d780bb30f8fcdf2e623785f71c24bff7587f875f7fb2170ffd8954d4ed6bcdf342e944b10ca7fe24439d66872dad06ad11251dccdc6510f23acff9c0d0ba5c651a99d22460b65eb140d4128ff8513e5384b65efde5df79508edbf66b3f2c3f29de4f3fe743e95b1f2b3f9d42710d67fe3c43a2643f3645b73c66aa967b9901e4348ff9d13e9c80c484deb9c1f43fb3c8360fe284a30e7c510e60d08e67f4409e6dc18c23c8a60fe679460ce8921ccc308e67f4509e6ec18c2dc8b607e1d259871ec20d52398ff1d2598711cc1d72098ffc309d3fd42e92cb578a0bb4cc25d8af0fd6f366c7117698d38fb3b383b437db860ce41307f1c25988c9d213698b311ccff8b124cc6310f1bccb908e6ff47092663fbcd06730482f99328c1646cbfd9600e45304522423019c73c6c30f310cc449460328e79d8604e41307b640326f510c37c1f94b19a8fe5823908c13c8713a63bd79ef93146168792955c58af43587b72620df6a08db1f3cef6a06d024299c389d25dcb3127fbc348b625092311bc5e9cf0ceeb60f55e14c3cadd82a0e64611eac21842dd8fa0f68e22d4053184ba0b41ed1345a88c637636a875086adf2842656ce5d9a05e85a0f68b2254c6a93a36a85722a8fda30895712ccf067503823a208a5019c7f46c50d723a803a308358e83d03508eaa02842659c306183ba1a411dcc0975b2485d9c08178130779b9feefef2ec2a047a0827e839c23b85c2b1f5306321cce12a84f1a8108676e55c6bea3c16eb0247b699ac4508e6b028c164ecdbb2c12c4430cf8d12cc38ceb1ce423087470926635f960d663e8239224a3019475b6c300b10cc91518219c77796a62398a3a204338e6fc5cf44304773c21ca06142c275c27949d1910def2bb181637b0951207063b2f16cd4df325bc6f97db645b6db11caf33851da5e42f43ffc646cc5d9869f5b10dab1d946ebfffd4ec6dee6242eb4a710daf3bb727144fc57e90d4028c745c34a9dc912bc4f3c2b5ab63d441e40682fe0443b2a4333652e3363ed2eb12d347b0ce11ccfbd8cc7bbab08a0ab52537171dc59e41c046f0277c77dbfb1e7a6f3c1996a25a6b93db65c38bb82b2c11cca05b30f82796157f63f534741711c9ddf84504eccc6dabceef48ad730046f5236e02de846f0e6217893a333888ce33bc4a508e545d9b0c345ddc80e2f41f0a670c21b626999bd7b74c7af35ee8d00e645a72233ae4b66abc83b11caa9d19d0d621cbdb075c0cb10da695d396591da678ce3e3b1f310cae9d198b2b04dac31a2659b586b42686770a2bdc037daeeb321ef2104772627dc89bee17aa7daf0866a8c7eb6820bf27204393f0e90192d990df2e50872411c20334e8db0417e08412e8c0364c6068f0df21d08f22c4ec8f05d1073f4b556380b728bd4116c1cec60669c60666bdc7a2290b3bbb27f1bffadab47239473a233bd1cc7f54a1508e55c4e94b0879893282cd52e15ee1ef4cb249136f903b61abf4add1fe19bc7890f66b2f1b73aba9367ec8520cee784786e06cfe86aca5a95d770615c80302e88ce345f1cb7a92c46281772a3a43a3dee5b48ce471ce155989d31acdc3908e5a2e84ceb312e45646bab2722941767e329d2dcec3f45625b6b340ac1bb84bba5769fa39b551be2e3bcd7cd6404f1524e881dfbbe016353c3f67d839b11d2cbb8c7d79991c6f7c33b4f21908ba302328e1f30bd1f815c12dd679c8c6f54b2f9cf2a84f6724eb4132c6821136d0a5e93582d4398a7ec6e8bb57b20c04ba3d3db8ce3dbbf172094cbb2e14f939f88a2da7ad686691c17c83604b2282a20192b371bc8c508643127c88b0c903b2dcd4ff7de19e42c42bd9c1375a181fa0009b2f51bf48cfe41847f05f748dffbddf878cf38e522782b39e1d9f664a2fa00597ad67e800bea8d08eaaa2842657cb6ce06f508825a1245a88cbe930d6a3582ba3a8a5019fb036c50af4650d76463ea7956f6a79ed91aa47311bcb5d1793017c7cf44962394a5d9ec97d6eb517e95e651a504d71848bbfb02dd5b11fe75d19d1a64ec60b18db8b621b4ebb38dd6ff9a7d46a731890bed4184764374260519df7f629b14bc08a1bc821365f01d1b1807006c3b363c89706ecc46b7cabbc15593be247eb69840f0cabafe815f7c27a8772090e5510119c709eaa50864455440327686d8401e4720374505246303c306f20002b9392a201937546303790b02b9252a20193be36c20af4120af8c0a48c6d5a06c20ef4620af8a0a48c63de3d940de85406e8d0a48c6c1211bc84711c86d5101c9f8a13e36908f2090dbbb72c23875c2228e5b613420945773a234bf25e35dfaddbd578c1421d03ba2f3908371f4c3f69063234259c989d2fd60b46bb36d22f9319d12516cf5aaf15dd77c27c25a159d69e0386ecc3f06a1dc19dd87158c68d91e569420b4d5d9acfcf0a5834df264836ab8badb9601f722ac35d998699f97fd050c6c6dfb5404af361b3699b9ba9bef18c7f13b87a711d6bae8344871fceedb8508e52e4e94038577ebf33251ad32020fd3e257b9fb2274bbb3d196b7c9f10ebce1defd97cb0c4468eba3332662ace06cedf75684724f74571e313eda607300b508ed5e4eb4e66b35de170fbafb24c94984ba211bbdd0d9d9ef85b28d8c8623788dd118747adf3c621d74b26d8ef13442db14ad655d8cd59c6d59d77d08e7be6c3c08a13af6715f99340e816c8e0ac838ae4c1a8c40ee8f0ac8382ea8998140b664b3b314ee1de4387e10e07184ba951335ff3bc871dcc2fa7684bf8d13ffc8807d02c627fa6c3d82eb11cc035182c9b8ce840de63d08e6c128c18c635ff53204f3509460c6f10b9ccb10ccc3518219c79763d6229847a20493714d091bcc2b10cca35182c9b886990de62604f3589460324e3fb3c1dc8d601e8f124cc6c7246c305b11cc6ba2049371853d1bcc1308e689e83cbe63ace46c8fef362394d7460725e350920d6525427932ba4f42e3f8786e1d427b2a3a0b72e2f8d9f2f311cad39c28cf17e6aa92ee6da36311d8eba2f114d4b6f496d166d91e303723b4d747a7fa3336526cd57f1242790327caa92275eebe41a47e3cc569efbbff52b3150a786e8e217c85477891ea96376865ebb505e64b14b5c2f98054bd3c93dffe159a4a314b6c953fc14a69bbfcb1c527d4ca94e5e2b07a54d2a2e4d528d98df22ce4ac551402ee1bc168fa6aa3c9537799cb2e4b95d3a952efabb4c86b827d40302ff0b777f2027c842bcfc7ceaa793e3f389fa74cc4bcae581d55ab52684677bbf7645aa89a97186065ea7e972dcfd717dbc0e4124a0f28c32629dfb9ae4a966a950acb95aea04f0134d589f9f297d342e7b7b7cdf9faf159a33e72e333cb041b4b2fed2630a484ddfb34745aedc8a49153a1e17e28fb6a45156233699a593fbaa6f54f532a05d0ba776bfdcf40b9eb6257663a32017db20a59f2357af7bef5f2e21a9529f897f353be1f7566fc6b0100 serializedProgramBytesString: - serializedSignature: ca31469809d2adc25f80cc5f9411e79ef46b1fa00193476d136a3016ef62615eb212db2ee63033eb83b1f391ea3a4665bafdb1a727d3e2db12552497d440ab00 + serializedSignature: 6161844c9f598467445bb6357363ac5540fee28cd1b4b7f5d936fa67f0569c5c1b77a918d0216816bef5fd85d63266dd64b910401c02aa5bdb99ca3bb75a890d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset b/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset index 0d1bb8a..4aa8c2f 100644 --- a/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset +++ b/Assets/SerializedUdonPrograms/905104020868932469f33458578686f6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec9d057c14c7fbf0e72eb8152dc54a28163c1082b49402c1bd58692985900448090192a085165aeaeede52777777777777f9d55ddf9ddd99bb6727f35c6e6fee3966fbfedb0f1c6bcf3cf39d679ef199683fe6fc17e9edfc3587cd6005ac2f9bcd8ad90a56eefcabc0f95deefcef5dc9fbd35985f3bbc4f9bbd079d69b65d7f025ffaf7b6427e7ef09ce5525ab72be5ccd8a9cdf52f7f94c56e2fc7b82f36d8973c5ef2e76fe94386f456a391fcd66a3d9343695b58eb4aa41c41cf7a34a712fc2e315a9e7fc3d8aad779e96b84af140fab98f5a3b7fcd749e54bacf963b4acbf7e6b1f96eb4963bcf8a9c6f2a58992373912bb1dedd5b99fb0fe6fde488df1ee2b7bbf3a7bef87796f8773df16ff83ebfcf63b76f82777b8277a5cc5ece9fdace9fdfc4756fefbad9f5e2ba8f771d69a9c8680064f415bffdc46faef8edeffca9e3043f3009fd133d1b207ea59c3cf1aea3d78a63c4bda6de6f649408331f5c3b5c224bbdf7a37f89f7c5733644fc0e02f1192a7e07c7c359b951dcdb55fcee2ee44f10e10d02d7fc77a2b83f185cf3df49e2fe1070cde50d8b87b571a5b8b71b885b7de68f678112cf022f9ed187c57bc395f7278bf787826bfe3b45dc97f1da03dce7bf53c5f3ddc0b52e0d20db11e277a486adb41f1ddb51e2b783f82d88bfb3ea6a71af9d17cfacd1e2babdf86d02c2d8456134cccf28abca9399256d6734f88ebf2fd296b510df8d56588ff6e4d49aee7f8f8d11cfa789f787836bfebc1bd0b19b783656913d56c8dec9d3510d23666f43c0357f3e16c8e5cf453ab271e2bd31e2fe0870cd9fefa4c459b0884c07baee24eeed29de1d09de91f7615c46f9e352fb634597e9cc1f97027f5c2233145b9d217ec78bfba3c135973fda63557bb2f8bd5b84375ef95ee6c941e09abf375113d79971dbdbf81db807f46752ff31cafd5c70cd9f8f1569798a783ec91f169b120febc0afc5bdc9e01d45373655e13d0e5c3b3cea142b76ada6b1e43aaee6348ed9c3acf8bbeebf61bacb741905ae1d3dea1fa1c896dfcd16ef8f07d7fc770ed0a78db8b71708770eb8c77fe70a3913c0b5136edd854246cfeaf19461319127b1bc1ad91b7cb3b7f8dd87f9f3ea3e5e78f57210d9f314d9f3c4efbe40b62caf054b266d66a2f25ce689494a58d226e72b61cd57ec18daef7e481a2f00ef2e00eff2df854a1a2f1469bc50912dbf2b54d2b850fc2e52182e127286f8df8bf198a5f090cf551e22dc58de5bc07c79afde117e1b8cbd37cbff5e9d8b81cd70bd64792a790bbb64d2569d6fc6dceefd36907e87202f55935d535e9279231f5c7339d207ede57f3f517c6a62565ff8c758d9de291e3f36d77b67d1d3e27a6fef7aa9e42aeb27e3157d45bc1b4ef7bfc7441e62322f4e549e2b7691b05e29c32e52c22ef2c26e2a7516793052ccaad5c398b4bbd1883e0bc1b7bae7d29ee723cf1789dffd90e752f749ca7d19b712a07331f26e89787709f3fb9025e27731b0d7c5e277a9c26ca9607637a24769003d96297a2c13bffb031952b732a0dbfe4a9a2cf6338b3d5f08bed53d9769b214792ed3a414795e539a940760b1526121da06911520de2bc437fbfb65c5ee4b7e158aac0af1bb0ac85a257e972be9bbdc4bdf1dde46e25419204eab153d568bdf2aa047151227795fc669ad226badf85d0364ad11df9429b2e4fde5e27abd226bbdf85d27ee4f06d7fc7783b83f055c4b5f00194e05d7308f94232c0f08c07293a2f326f1bb11c45fb6af5496f2be64799022eb20f17b209075a0f846da5f6daf5aefde5be95d2fd82cae13f9de55debb0dcbc4b52c3b1a82b827fabe81f8ada8e1fd44321a8adf4a03198dbc346df67282777b82776538a20deabec7afbb0bbe9b016bc9b196489769cafddae2fe74e57e1de47e5de47e3dfffd98fd6e01ba6cf17f133998f9eb29077b7ab6785e917108f3b73d6a2bf2e4f331ca775bc57d590faca37cb715f9ee50e5bbbaca778722df1da67c574ff9ee30ff77f27eac4eb485f9ea44cdcf10cf577bd72d64df48aa7d60d2af1dc1fc7d1ab25e7bb8b83f035c3be9d172a1177ecb13841ce9bb8e54e41c59839c9b13e8b881f9fb0ca55f956c8f526ce52821f32fefbb56b25faf96787e34f3d79bd780fb50de4cbfbc1da5fdcabeb98b98bf6feb00452ff97c8cf23c17840b9fcb34b88ef9fb27ae13bf5722e16d549eabe16d0269039f1fe87f2f72bd783e4bb99675785dda3456e27c8cf8660eb876d8b5967d6118bb836a60279fa78b9d9487b193cf31769bfdefa5c44ec6f50616f7dbb5149b3c5ec8d90bbc2beff3df7399dff6cff564b491365f5b91772cf3b7e78e55e4dea83cbf51fcde047494ac6f8edf739fcb7bfcf762e6ef3bb9d8d36ba7cf858c3a8a5e272ae19ea8e825ed612eb886fe4686b7b73fbc368d70fe5276ccc7dec07c3eb6f536f15cfae22459b243aab3625bc1bdc3c4efa1e09e2cb78e03f7a00d88bad01ee78867078b67278034384eb18d13149b3d3c187b5f3cd669e221fbdf603c64397a92261e272788c729201e2781f7e533180f5196c8b23726ff54251ea76ae2715492f190e5fa699a789c9e201e6780789c06de97cf603c447913aba349f9672af138d3201eb29e7196261e672788c739201e6781f7e533180fd98e91be6818b876f260fb9b95f7ce63bef2d7bd86f950ca99e997d341b627d4743fdfcfabdaf36d0acf6de2f702458f0b143d2e14cff7f1eb5fad8c9a0bf490dfc1e7f3fcdfc77cd53070cde3f7b6f2de258a7e9788e71b153933fd7276be18b1ab4b154eeaf3cb144e9789dfcb153d2e57385d817092cf65d93a17e821bf83cf2527b50cbc8af9cbc0ab14f957b3b8dfd67d2f9fcbbeee6390f7ae51c2b94609e75a259eb21ecafd7e7df00ebf27fdb893b73acaba7aaa757351b78edcaad8cdade2f716e6af53dfe2c5ada3a8ff66f7167264997a9b22e7b6c472b2a727d0f124e6af9b8bb22796476e67fefac9ed42e6194237d99e9375f33bfcb626e5b9f7a1bc997e799de4b896ac5f3ec7fcf5bd9315bde4f331caf35c102e7c2ed3e079e6af5f0afd232f20e16d549eabe1c9fae589caf353fcef455e64fefaa5bc0e5237bf93f9ebe6777aec3a4b3bc3d89daac851d9c9e7e96227e561ece4738cdd69fef7526277badffed8992c5e7ecab62e2c53659d0994a90523c43d91ff2377c5df77ffcd9f89723772b7d0693eb8e66923c708743a9e2b7e65bd54e6957b98df8fdf239e9faf097f1b8883ac975e00eec97ae9bde09e0ce7be785c47c8b24b94e591fb4158f782f7e533985ea2bc8cd54ba5fc0794783c90643c643d08c643d64b1fd4c4e3a104f1781884f520785f3e83f1906d92ba8afc4794783c62100f592f7d54138fc712c4e37110d6a3e07df90cc643ad3f48f94f28f178c2201eb25efaa4261e4f2588c7d320ac27c1fbf2198c472d45ee33cc5fbe3f239ecbf2fd59e62fdfd5efe573598fb8c4ff9c5daae170593c2eddb7897ba9d603a43eb2bfff25a1cf38705dcb7b1d9525eb6ed297bfccfce5f3cb42c6104fe79c95feb023af307ff97c39b80fe5cdf4cbeb21e78cc832e64de6f7f95780fb50ee1be2bdfd946be9bb9b88fbaf8afbf9e09a873bddff1e93754759e79ca83cbf5a09477d2eeb8889c67fd57257ea365fd1ed7ef19eac33cab4b92e6e33bdcac4ef7445b6b4d9d714d9af79b27bca796bd72bb26f88cbcefb09912dcbddd715d9af0bd9b22fe04645f64d71d9fdae576463e97eb33f6c34fd1728d76afabfa5a4ff5b9eaebdb647facbfcaaa4957bad6ba7c83ecab799cf3fc5ece71d16f72bef8077f9efbbcc9f7fdff5e4f693e398b59530de677e1ffebe22f703e5f907e2f73da0c37be2f74385f9875ed8bdc5d8536f59779169ffb192f6b780fb50c7cf983fcfcbebd9c2b6e4dc3599f61f297a7ce4e9d1f727f1dead7e9eb1741853837ef2bb5ce5f918e5b9ec97b8ceff5c328d7dff8992fef2fb4dca73557e0fc53ea47c990e9f327fbdfa53859b1a9fdb94e7323c59ff92e9f0b9620b9f2bb6f205f3b5eb63f26f579e4bf977f8df8b7cc97cf5f2c079f44be4b99a47d5787da5c4eb2b255e5ffbe315e3fcb55f6eb5f47d07a42ff77df7037bd3f90159cf48870f91fdefff637a1ff20d8be7df6fc0bbfcf75be6f721df7a72f3443ac67c880ce37b85dff78adc1f94e73f88dfef800e72ceeb8fcc9f777ff4c2ce1573c4facbf908328ffeacd8f42de03ed4f137e6f721f25af8903cd986933ee427458f9f0403397fff4e3f4fd487a8fac9ef7295e76394e7d287dce47f2e99c6beff45497ff9fd26e5b92a5ffa90ff29f2653afccafc3ee457859b1a9fdb94e7aa0f91e9f0bb620bbf2bb6f207f3fb1029ff76e5b9ea43c47b913f99990ff913798ef91019afbf9478fda5c4eb6f7fbc629cfff6cbad96bedf80f475ec3457e6ef4cf81039d6f60fd3fb907f593cfffe0bde757ea38cf97c887bedc81d2ce725d4f687118dfaf9b9d7406e344b792ee2148dc47570ffcd7fe5fc957c70edfc1928fa3ff3a56d883c1aada3d8f42de03ed4b13ef3f990d8b5f02183e59c1c6133d1da8a1eb5050399b7659bb0061f524d3ff95daef27c8cf25c867383ffb9641afb5eced319ab7cbf4979aeca973ee41ffff3583ac8793e43c135e4a6c6e736e5b9ea43643a34506ca181622b0d99df8748f9b72bcf551f22de8b3662463e24f67db23e44c64ba6ff78700de3d5c41faf18e7267eb96afabad7c0870c94e33d263e44e97b88eec07c7d0feeb5f3ce908d0964c97989c2fea34d99df673415326ef6f41ef2b53fec6833e6ef7bb81bdc87f266fae50d5dc8fcf9abb9628f5780fb506e0be6cffff23a993e77ccd7cab8b764d5e77cc8705b319fff8db604f7f9ef8e0ab71d3d197bc878d656e4c9f539e3c13594db46792ed620445bb36afd8e3199ed946fda2932dbfa6d376637cde332dd7700f7687bf1cd4270edc46bd7b7fdefcbb16fecfddd1a01fde177b25f5ce653991f659c3a2871eaa0c449a6ff5cbf7c26fab7a33b2bf629fabb637ea8a3df16dc6bf91dffcd56ec37db8bcfb01cff7bd2cf473b89f70bc135ff95eb0ca72bfaeda2e8b9c87f9fc13efe7bfd7170e30a7da88c5b2eb88676ae7edfd6f0fb0e86dfb730fcbea5d9f7b13572497e1fd377520defef534378e353fb3e16df54bf6f61f87d07c3efdb1a7edfdaffbdf401b13a94e423cad8a172bcd6a48c9565431716cf8787887b5d859c61e0daf10d23e62aef75613e1fe45e43bdbbf9edcc9d2b24eff3dfcee2799122b7b3227f9117ef11ebfc7262e12872e4f7ee7c2528a758797e30887bd0b9f2db148edd99bf9cecee311bd9d2d37da4ec4714f376a2397e76525e344791375391b7d52fc71dab4a1407195e4f254d7b7af246bdadbcd75b4953399f43b2eea5d8d805e03effeda1a4a9d47334780eaedd78f3f74b140e525e1f856b1fa1f7cbfef763faf5f5db9c941393db4fd1ff7cf01dd44f7dbfc44bc751b28d7981265ed006a59c9ad227918d89f1fa682e9021c3ebcfaad7e9c4dcbde800e6afd3f507f7f96f9ec234cf933146caa9adc8cb677eff94afc81da43c176bd2a383818e625e5f7448fc5e7430b8c77f070a3913c0b5a3d36839ae5447d16ba812ee5045af5d99bf0e25ebe0672be1edad84f7b62247f2af1d67249fc5ec4eee0f227c74c152f02d7f0fccd50c6c07f78b341992c4bbb2def680417862ce4e74372043d61b87c5ef457703f7f8efee4afaedeef11cdb25419873807c19d683cab38785bce142fe7070cd7ff700df3e04eef1df11e29bddc0357f4fb7efca23def538b93fc7a3e257b6332f8f7fd35db62f13719475ee91403fb18e313a0a701c09eef1df02856381c7715c59823057803065588f29f149a4ebe3e2375bfc3e01e4c83d64e4fc0947e6649927a51fef0cde9f0a64a9f63386f9fbad64bfce68717f06b876e23c7e9617de7859ee49a6631539636b9023e3f714f3afe17edabb2e5b9a805147256cb8d784b20e33f6ae5887199dc0fc362bd374bcb83f195cf3efc43c91a8dcdf6331b876e23141d681a45f91dc9d384c5ca8c87a565c4f52644d12b26459267d86ac6b4c5674963acabd3de4bf65f8b2bea0d3e139713d55d161aaa7837c9f3dafa4cb0b01d2e5c5e07a47e55e1923fd761c9d0ede9d0ede8569320a5c3b71985ca5c896dfc93d13c6836bc8221f5cc3749a01ae1df993c4be0393def7cb89f945b94fc07070cd7fc17e19b13496dfcc52be11fd91d1d920fe33c13da8df4245bfdf3cfd264f56f4cb06e1bf04eea9fe45ae2955fd4b6dc056f62fe4826b50de4ebc5f3c7f59b1a357987f8f86443e50cc318beea5a48fac47cd51d2678e487f11ff29aadf57f6ad88ce4d2c67cae4043aaa3e08ece952a30f52f66e898ab9ef51b9efc46470cd7ff715f7a7806b2e4ff605c9fd1de6836b47ff9932cfcbbc54047494f3f75e15cf162a3a499b2a06f627db6b85ccdf262902f7f9afdc876514b886fac8b05f13cf4b94b045db23ba1884bd58094bee59311e5cf35fb9cf443eb876c29e763112f652256c594f2c0561972a61efef0f9b89b988d165e01bb95fc3ebe01dfecd44e5b99c6b34499105f69e70ffedc461ba5cd7a7a69ddc0b6038b8e6bf602f8868b91287150abf15202cc84f843d331b095bd943222ae60c46c1be0fd1554ad8154ad862af0826dbc44b90b4aa54c2aa14bf606f87689512d66a252cb11f4454ae21cd07d7309e6f223a287b4244c51abfe83aa0c33a4587f58a0e728d8c984312dda0c8147b3d44e15e0d2af78dca37d2176c027a6c52f43850d143ae117e0b7c23d705bfcd62be7fafbb999e85b2a74354ac878d6e06f2362b3a6cf1eb502d5e072b32c59ab42858ff163d4491b95589d71621f35de5f944e5f97bcc97f7a4bc589956c47c65da54b99e54f5fdfbb1e47dff42a6f7b3724fa9c9e03a027ced14700d7594be763eb876ec78af6de2bd647c3fe67f75beff50a6f7fdb22f51fadf51e01aeaa3868df9df547c97dcdb271f5c3b61cf2e43c2c6fc662abe4bfa77cc77617e325119a79433b2ccc07cf45eeb802ecef59cd7115d303f9aa8cc53fc683596985f4ce48f0e50e2277c732cdfcae71395e74abead163fcc9f262a27141f1d2b87c15e3f31bf8d95e9f2b952a6d7e45766c9b51689eac26f896fe51e1af9e09aff1ec6fc75d8c33c1b985bcb0b63aeac3bc8beb423143947d420676e021da56e478a6f972a61c9fba5cafb72af8dfd95f7e5fd65cafb72ef8e32e57d797fb9f2bedc8fa25c795fde5fa1bc2fd7f4af54de97f75729ef1f27ee5728efcbfb95cafb726d5c95f2bebcbf5a795faee15fa3bc2fefaff5bfcfde17cfe59ab875e09a3f97edda93c4f3f5e0da49e37d9622f24ef6cb937a547bbe41f9fe03f1fc14459f53147d4e55f43955e8f31b22ef34441ff5b9aacf87e2f9e98a3ea72bfa9ca1e87386a7cfbc2310796722faa8cf557d3e12cfcf52f4394bd1e76c459fb33d7df6dd0991770ea28ffa5cea93c8ef88f9f951657d7f54accbdf97d70b1cffb2efba04b2e4dc83f31419e70919970b19f78bf74783eff8fbbb2b72b6317d5fd1052ceeab2f00eff2df8b98bf5e729117f6fce715d9f2bb8b99bf6c12edc7e825f130626c2e05e15e02eef15fb9ae7e02b8e6e1ca75331a5e528758797101f39517fb7ecd12f29071d67e0fe328f74e50f6678eca7e7518c6854a189783fb09f8eef7b122477e7785c2f77ce4f918fffd589c2ef733d96f600dfa9eefd79729eb39e473f77b19f74e5e1c1688ba2ffbc49feeec53166b232d96b69b282f3513f2c4faf70589c601e4dcf7cf847e721ee27070cd7fe5fe0807806bfe9d6c0fcafd0fe6836b478785b20c9263095d41bc3ff7f42baae7fd2edc287ee5373d35df7c817c23eb5389b87ca9c459fc46af01f28b99bfcea7ec551895eb6f86836bfe7b6d5c4654aeb553f62a8cdd17f58de80d8a2c3967f37a204b8eb7e8f62a4c1457b1de84ed08e2f635f3f7918ab519313f18749c4bce2b97e9f46dfcfb4589faefe5f7df29b611f4fb6fc52f9c43f8bd1247b12e24366e12348e3fb2b8bdf16bb19eb1e4ed24becd166928f7bbca07d74ede2812eb5f8b12f5ff4a5f09f7c6127263ed909b99df8ec47ac7e82df16fa272feb9dcdf6324902beff35fb96fc72870ede85a7c0612f61d4ad862de73f44e10f69d4a58727f8df1e09affdea570ba4b84bdd2ff1e93eb5b26f9e5c67cb65cdf227c76d1c224d2ea57efdd25320cb186449e2912bd3b6e374b37837bfc9d3fc4af5c1793687e72221dc45a8225d2fffd2dc2b907b0bcc7635222d63f96c874f9477c2bc7f6fe45bee5cffe04b614544759eeddcbf475a3fb4078f78177f9effd8a6dddefc565f1c58a6cf9dd037e3be1afc4eef30b4db928bf8dd9029cf3c8df4ba60dfca9f8f641e6af473e28f4fd4eb0ae95409694f110e021e7283cacc87dd893bb64aeffbd4884f9cba2443ab70236936adacaf987bf19c890f3a11f01f17ec48bdfd21c8fdb52116fb75cd7bd2bed37551d7664f17c99aa8c6ca1cfa3ccef931e157111e540a9dccb3eca6a1eb796edacc7805ef2dee3e09ecc4b4f817b429f98df957d42c3c135ff057b5744451918957b528c0472e57dfefb04f3e7cb27bc382edb8684fd9c12b61ceb7f1e84fdbc1296dcd7623cb8e6bf72df9d7c70cdc35ea7842dfbff5e52c216e3cbd19741d82f2b61bfa8842de70dbca284fd8a3f6ca96344b6975e55c2963abd06c2167b232ccb56c202691e932be794bdaec815fd7ed137c0376f28ba49b9c06e647c63beef29e6f37da5b3802e30ddf3c1350f43ccc92893fe4d8c2d446ad7607b208e913afeb0227559cc57978935f3917a200efcba7efc9de572ec39411e8dc8fdb3651e7a13b0783341b80d95efe0b8d45b29ea22c76cc43a934863c042b42122e07ca788dc6367877838e549944d11a9a75ca79f0fae9df45a2eceb15abe4d7cd74d890fffb758cb143b8f09e81a3bff09ea5a3f455dc53cf5e83b8aaeef78ba968bfa6f7982faaf9411690274007de1097db85cf3f3ae12bed8bfa2fc7d2153bef79ef2de7bcaf733fcdfaf90f1946767497b7a1fd8930c436787cd819e92b198372ee7ad4464b92ef7210bda7e692b7415654144968d7942bf0f44dc3629d7727c56ecf11295fb700c03d78edc950b15791f015b92fbc388be82885cef3051797e3590a17b1e643f14b9deeb6390061f0b5d45ffdf4ac96d708277e55a6bc94bce6dfe44e125af67fb758e7eaaf0fad493bbea0445de6706bc0621cf83f092ebcf3e677edbffdcd3b742b44522723ddf97405ff16d44ae7d1bade8239fb703dfea9e0bbd236d90e7729d8e8ccf54f05cea5220c2f84289c717221e177b695f21db773a2605d5e546e4fc554dbcd17373e4f38589e32dcf68c1e22dcf688974449ecbf13db946375b84f795268d3a81673ac6bb24d625d219b149f9bc4b009b936b64e55e27721f74b9c656ee1fb159b90ff61789852bcbb7ae885edd1599eaf31c456fb90e53ee57b245b9ff5d021d7ad4a0c3b749ea20d7e0ca3d50362bf77f48a043cf1a74f83e491d84df8bcabd53b628f77f4aa043af1a74f831491d645b52f6f76c56eeff924087de35e8f073923ac8fc2ff72ec9f7bf1ffd3dae83fb8ee36bd68ef67f1b9b7b2bf719190eaef9af6c6f3bfe69addccba3aff24c8605e3d8c71f87d8f3eee05bdd73358e727e91dca7448d23e85370df71e2b8ee7dffb73119ffc4df8df4d7871311eb91b85b803cdc6b2e43ee2d70803e8cac0808230f09438cd364652961085f941505327241b8f219bf96fbafece7a5cd3a596feb0b9e4b2e7f2b6923d78f4d549e775764abcfd5b4c9163ad5d2a74d569db80eee3bce9ff50ffbbf95f69725f7dc180eaef96fedb8fdad7fdd1fc7d83319168c63be3f0eb1e7ddc1b7bae76a1c3b89e7f5983f9fcbfba0ed522d9fab7520259fc764d694cf45f99625f7013958b9df30810e836bd0a141923a88f5525972af8fcdcafdc609741852830eeafe21980ea24f2eab89a283bcbf43021d86d6a043932475485477d0b511e5fa3eb9d7b8a85f64c9bd3a0e01d7fcb95ccbe6d8e7c1b29d25cfa9866bdf92ed339ca8842bf7fed80aaef96fb3b8ec88cc832de2f7b2443d274baefb1e29e48bf224ab1578b7157897ff2afb756489fd3a0ebc5e912dbf53d69e6789323522d6cf65c9b5fdc3c135d745d4bdb3643d713db8e6e10df3bf9f25d7c81f0aae65bca19cc3143947f8f5ca6a07e22eda13eed9c509d24ac655f68765c93d4f447fd82639de3e353979da7b62be6c96dc276418b876e271507b2fac83462b614dae212c2957b67d545b80eb26659ac03580f2bdce805b672093ff662b3693ede9bc799da283fc4ed6f10f07d730fc4e8a4d7412f2a6039d617ac83d42c6fae565c9f6ce11fef063df75f6a7e3416728f1da5989df7c257e722e8e5ccb56435ac4f4964c3b2972453cb7481f95641a6775f4cbcf92f3908a12a47532e92adb42a3c0b5a3dfc1723e63d074eda6a46b37216fb4a27f77a053f71ad27a1725cde5be07c5c9a5f996957e3935e6a7a065ca08213f272e3722f3760f10cf1ee257b6bbd47cda0bbcdb0bbccb7f651b6514b876b86eddacc896dfc9fafe7870cdf5126166c93d1086836b988eb24eba1e5cf3f0e6fadfcf02fb0e6449fe825596acd31f09ae791862cf822cb907c154700dc3103a67e5813044df61a486b2577288d9846c670a9b38443d5b3e50595e3be28ec78c6725ac90ad64fddc46004f81396c062b607dd96c56cc56b072e75f05ceef72e77fef4ade975ff666d9357ce3ee4be8ee5ee8fcd7dd0db68aad773e2df1fa57663a1795cead12e77d2e6382f34d15cb63035cd9cb9d67458e9c0a56c64ad922d6c61d7b90a117b87f173a6f94ba428fcaaa16c41dd582e0ca9539ff97389f55391f72252b9dfbe39c3be5ce9f0ae75e91733dd9f9e55f2d64fdd93ce77fbf94394eb0656cb57335cbf97ba52b6fa1a376f5376b8ad27ce7aefacd0c4766b9abdd72e78e04bad2b92e73359ce9febdc6d5b4c4d57e8273afcab9c763b3848d727ed7b9a1558f7b85f36f5d98b30432bd8ef303dd8fb8c35d3299463bb1e1daf7736df1ff52647ba488db35705496970d6bf573473b8faa9612ffc7d07332bc313f41c8e8ef228bf8ee0d60fddcf1e119d508068f63f518eaeddbe33d880d4c18173d199edceddc18c453b8f69b050b57ccf9eda7dafea8e5b17e6ed745fb1aa296082c9797e38e26058942eddab5dcdd7955fc111d7eb73b676606f17bef95baef054f803a6ee1e74f0077487496f38f75ce9f32e7e591ceed62d7ff4d715e2a77fe2c71d5ad9642b95c5c5d1772f522b4264531cc511d6677e47bd676b1f2793578383de87ab158c441f773eb453b2530472c2cb7c21415b52699615e9f3270f06eb9432fa8ad4f97066ebaa4121a963259ba946990e90c50b3c74f942e0d63f18aa70bff4fcfb01162db35e98011aca523d870fbd836d73d35dbe65da27d542faee5d724a10d26d20023585b47d09d07343b8304a7391aee2fea89a931dc2169864d5d866daac52e191d308a7534147339c5663ab5ea2b6a718d10c17531c1cd0d05d7c304b730145c5f67508d339d25f9b315ae145ee0063727de23dd4b756b7a7b6a85e4c99a55c0aca9812e6d38c21db55aa989d30a4f9c8698e4d6a6921b6192773295dc586750ee4cbaccd7d2532b23b9af699d7419d99625aa64072d219be8e8716719d997945ef5ce23f9af51ceb74b1d0e6bdc1af16ae77b5d675362a2ed92f6f6ed5d9ad94cd705164c238cf00e3acbe7d83b60c9ae1a7f5bdcf89bea84f310774ec64db7c70537c3f26b474d7e8d04c9afcd3195b30d556e8109ee6428b8a52e8fb8e433db10f5da765c4e701fc387103a5633b6cd7be873456786b53113eb80e5815698357531f5fe3bea24f3b4e9aa89f0e2c58bf7a826bc332ebc35a6763753b577d299949be796919ad46ce79ed7673ec67d5aea76b4c665ae70afcb411537d117dcb0a638bfc58e865c97c426d89d699ae8ae37e06334b49a89d917de7f7591167c0fd7eae995c172491bcc81f53474606d313bee656ac7ed30c9bd4d25b7c760f43184d10113dcd750f0ce98e07e86823b6282730d05676382fb1b0aee8499c50053b3d84527993bcebc6454ee810beeac13ccab697c92a56935ad0bc623df9447574cf22053c9dd3492fbb9752c3ec522f34554bc977ca6a88517895a48cd5f245f480dd69991b6b4e0931173dc69b5d41a63e545775dda73931d9a0693cdd109e73d0fbbc65e8e0bffd7f9af9af046b8f01e98e6bb6934af1550f39e589618a6c912819a2ebd3026bb6b986cd6a99d80496f4cf8708df013020aef8309df43237c5b40e17d759ec26d346d21f514c94e5a19e7c48c87067b70abd7e4e4ac8519ceef62570b7e5fe6d8c46125f6292398a6e2eb3689c6b0e4a7ded0c7824fb16ae096ea7a8f37caf57876e98cf9c67e3a83e7bde57cfd5bb511595e8158207ad078f8e5eea3e94e083c3527086f5d2d4fd4c5f3442ee6e1466b3c5c24a087ebafcb706e4bb87cbb66385e98ad763b05f8bfd788e49de5861d1f9836c94adcf83a684a36b774d31aed58d768072461b4e9d01e33c70198ff1da7f1bf4322c1fc6f1e66eb7c0e658d75e204463c10133c4197896ab90f8267957c8ccd445dd91490cd202c0a930cd90cd609e6b50c3e49d7a8e23d0453798a8e3a2fd9e3d546de2507a79064bb1dd795ce6fb9fb94ffbbd2f9179f3959e84a2f76eef2dc5fecfc9bbfc1277f153a798f7fdd371091a11891a9a64476c52c649ac6421a458359c86e3ae1bc113c3d190b49d0081ea6f3d26e976229a9974ebef32abdfd7b7bea78697df20cd72773cba5d315f3c4bbeb92bb2513070429eae772a3e4e3d25157efd9aede7d13e8adabf004d7bc9a958dc2ad6c389637e668f2c6dd01f3c61e982bda4be78a78afcf58b7a55b9ed0ad64bbc99aed4ee1ae10c9bbab737d80536bda14c8e58cc0223f5713f9bf02467e2416f9bd7591e74954e046becc8d3cf7b755ceef6237ad8b95e826f2b9d9ceffd0a3cba78bdc19efcb9c3b6b5dbf50064259ebdad1b2801e7b14866f1f0dbeecac60f80a30bf3acfd0af8ed609e6556b3e626ddaed31064bf4f9ba44e74ea112f4ed04813f56573cb8e3427b92160fc1e749ebddbd7b50875a736558357c81eb3a5b558b59c2e9c408b971980b5f88b9f0c2980b5f5463d133cb099f57a12a9daccb75594eecc0c76399b0489309cfa91d2c134ec03261b161269ca813cc2b3725c9089e810b9e84e158acc151af4e301c937579ce1d76cbe45ca191ce5b15ae4b0f9eeb96e8f06a73dc52a69f279438742ccf4dd1250b27579a4c7a2fc59364aa2e49dc01cb4c4eae50eb6bc11265ffa4136519d34faca8297c2c59a661c55599aeb8e2396375cc9115b86dc372d79195052abaa6630e7839e68079bf94e85a0ce01af7c462b74217bbe66e31b3c0a9442e505ac1fcae57fbe2b5f320319d8169b052a7414ba0c102d71aabf0c51d01b4988969b14aa74563b7c05be3a8c82ddf9fca9581c29d85a5730596ce9529a5f36ccce757697cfeddf583f9fc393ae13bb839c1ac08dc0bd37a8d46eb631a04d37a2e267cad46f8fb0185ef8d095fa711fe5d40e1fb6046b31e339a0d2919cd3c2c531c90c839f44fa373d8178be9462ca69b528ae97c2ca607ea62dac28de934278673624d4c5e0c7add7db39db8168b7f0789eb7e1a1dfab9b37f32b90e04ae714b6d1dc8419aa4e9e7ce35aabee22399d036b3242696f16150dd92926402c04afe0598511cac338a562c5e3295c4c63626b83d137c2162ea996021a6c72189b221d7c32b978a8551a4ae4121a6c1569d062db524a68a7ebbd4b558846971a84e8b1d80163cb4254eaaa71e761116f661bab01b33584be183aebc39eb5965b07a493116eee1ba70f9acdc256e9d6801704da9d78a4ab0d08fd085de06c4ba262df87b15ee3b41f459acd387f74bf16d44d47e29574e807ea9255859731456d61c9d5259b314837a0c9e99d4b226de1f262b9f4b029636a53a2d786973ac2eb63c92c7297e580d6c0b1ed8fe58948fafc98a478a8d2bb81781d10e12d56558e827246bc59816a9597119a6cf893a7d5a68f334d44276f005d16139a6c3493a1dda27ccd93a5d522353aed38ad79a4f669a564ad360b5e6153ae1bc94e0e73b9ab45256625a9faad1fae9805aafc2849fa611fe5b40e1153ae1bcf0e2474c1a8d27576292cf30955c8501395307a4593020ab31e1676984bfdf2298f0353ae1bcf4e207649a8eaaacd509e7bd60e72463dd097a8bd7619ee2dc640427c8eceb75827909745e32821394361bb0443c5f93880fb70c968807e884f3f7b7b1eae5663f7725446a0bdd2f70beaa538b79fff575fed314b90916816fd4e9c98ded428db145031adb264cf8451ae15901851f8819dcc54c5334f1f106dd940039d69d2d1a80de349c2a77b8d7ebe58f57c8b3dd02ac8af5717e173b7f57c46a54d92cde80e112fbbb1217bb2de9e5ee775cb63756c59f0f709eefeafce639bf9d02e5868374b1e6767589c6ae72b95d5d6a66209b31cc97e9302f4c0be6d461f2f1f7a5a27b235b69d766b3d5a0cb255b7ceff5cd2e71b5e033b28225c716cc875caef1218fb709e6430ed609e75ee28a643c5f82919e4330c1571a0adeaa13ccf3f055c9085e860b3e5427980fd15f9d8ce005b8e0c330c1ee29ad8ae0193a179540f8e198755cabb18e13da06b38e2330cdafd368ae6de426d0fc484cf3eb359acf6d174cf3a374c2b98637e85c0ad3a99e204b1e8da97ea346f5ecf6c1543f06137e9346f8c68ec1841fab13ce8b4b7ec2aa69c5ef384cf82d69107e3c26fcd634083f41279c57596f4b26ef27a8b29e88d9e1edc9084e60822761567287c64a166607b3929375c2f9fb7732a406e01e749b7a0de0140cd3ddbaecca671104ad01f0410a1b2b5ba762a8efc150df6b86fa340cf57d3ad48bd2863a3c15aed3b1ac75bf266b55750e96b5cec0dcd8036970636762c21f4c83f0b3301ff990a18f3c1bb3c8870d7de439188e473438b4ab5a13e03817b39247750eb84b302b394f279cd79e1f4b064982daf3f998e0c70d056fc3583f9106d3bb40279cd7439f4c46eb0475d00bb1447c4a9388395d8325e24598f0a735c2bf0b28fc624cf8331ae1b7770b26fc124cf8b31ae15bbb07137e296629cfa5c1522ec3843f9f06e19763c25f4883f02b74c2b973e3e722572b97f982b4a0e572952863e562b120959f6025e895585c5ed2c5853fc8f6851a24acabb0b05ed68505270414555b7694faa0fcd59816afe8b4f04f5ef4ea28de7074ea1a5c8369f0aa4e83060c4e0bd8cbb58caa80c5ebb59897784de7827a04f312d76179edf534e4b5eb31cddfd068deb26730cd6fc0347f330d9adf8869fe9646f3950135bf09d3fced34687e33669fefe8ec932f7a9f277cd97cc737cc137e6857d136f0eecd757ffbb0e1cedf6380cf2a7205f125537c5878a5736fa9eb5fd6b903c325eedde2803eed164cff7775faf375a6718d4631be14b744c42357c4a3bf8887da56f27cb6dace59eebe51292690792d262f7e95cc9b4fb7defd32489c6ed5c5891bc87bb1074ae3f37de74f9dbaccfbafaff75fb0f6e76d98917da031b2da018dec764cf8871ae175020abf03b3808f7416d025290bf65ab8fd9cdf81e29e67cd07b07cf1eea080ab24efd469c9d3f4632c4d3f314ed3bbb0303fc5c2fccc38ccbbb1a4fe3c0dceea1e9d70fe3e3f7cdb6490e15e8cd4971829f7786b39d9291550f761a0be4e03a8fb75c27979f43f56bd3c9a3b265879f4804e389f26f34d32a990609acc8398d6df6ab4be7e6c30ad1fc2dcc4773a3791cd983b455a1e8ce4397fb822d8bfa623dba9f657b855f795292da27e18d3ee7b9d767cfff625b1f0e4bcd920e13d82a1fe4183fafe80a81fc584ffa811fe7140e18f61c27fd2083f615c30e18f63c27fd6691e50f81358bef9c530df3ca913cca752f173c28da6523d85f1f84dc3e3e2f1c1783c8d09ff5d23fce680c29fd108efe7ee0e9af91de9f90e38c15749f043db5b2814a2c892467e583abe1f3d163eb6ace1595dc270767f69548a544f963ff164790e13fdb746b426c513887e1e33a77f34e6346c6230737a0113feaf46f8e480c25fd409776b61118df3e7e74314c60aa278b1136c59e14b58842291ea111a3d3958845ec6844735c2b70614fe0a263c4b23fc9480c25fc592a2962e29b8a0225f3d205e43089218af61a1d6d685dab45aa8d537ed0b12faeb58e875b0d06517157734de105fea1d646f60a1d7d585de84e956f7c6e7de0709f94dcc90ea690c69c48c6086f4964eb87b067b2489c27e082ef86d4c700343c1ef6009d15097102d7c5ec83fc1bfc42d3dcb58f0158eef623a34d2e9d0cc678afe4517a919e37b58f88d75e1c305640b9c7a80b7c950aa8b50ded784ddcfdd769ccf39b765afe702f75f6b98ff10ca74eefedc24527d7b49772a98eb0f75b59f1d22bcf6c3b7becb7c5cb03ad4073a4be2a9d95413bd2c193dd55c78cc90003ec40268a609209a42001f610134d704c05208e0635d007ce6428b643c5982990b9f608ebda5c6b1172f08e6d83fc5b46e65a8f56798efd911ab05c22dcbe2abcb83f89ccf3152ad35a4862c0c46ea0b4cf84e1ae16501857f89096fa311beb43098f0af74c279c5a76d4477828f467882036dbec6346fa7d1fcf2809aff0f13de5e23fce980c2bfc18477d0086fb42898f06f75c27927c6ce11c34e8cef30b53b6ad49e1c50edef31e1d91ae1c70414fe0326bc9346f8f50185ff8809df4523fced80c27fc28477d608ff3aa0f09f314fd945e729bd517db8e786be3610c46ffe823988ae697010bf62ecba69d83d5c1c8cdd6f98e6ddd3a0f9ef98e6391acd3f0fa8f91f98e63dd2a0f99f98f7e969ea7dfec298f4d23019af139e80c9df98dabd4dd5fe0753bb8fae0b27a0daff626af735559bb714b46af7d3a8bd717130b5233ae1dc4be4622de405e8d663a9ee0114c522d85f13c15aa5c1229885457000d6fc8d77014c761b4acb5276a9b5b0b0f330a7bec609a5d2d7e736da813c37650d6a631a0cd469d092c11dde780f5c252b11cdc962837dfdea60099caf49e09cb260095c57279c1bea20c3cea37a98d6837575ac805ad7c7b41e62a875034ceba11aadb705d4ba21267c578df0d7030a6f8409df4dd777b93c98f0c63ae13cb70f4b86778281ca26580edb3d19c10932cd0e98850c37b490a698c67bd43c3493aa1f6a86a5ed085ddd3960da36c7d276a461dab6c0b41ea5f35b2b8269dd12135ea0732f0185b7c2848fd6085f1950f88e98018dd119105f3cc18ff8911be7cc728ab3c96c57b416c167a60531add6983663b1e1ad746c9dba932e545e7e8e8b3d00b3ab78ed6e7c24957db3da60b19ba08b9db78d937ade14ac978d76fe2c725e5e9262ef5a5b4c9f893a7de4f68003d2be3d603b4c8f49787bd9dba5335ddb03b6c734988c55ada406e9dc1eb003a6c5949a4777666b564f06097b672c0f4cc5f2c0b494f240475d387ccf9ce9ba70b8f83d2329efda968d456a0616a9992945aa139670b31219f0c0341af02e9806b31319f0c0341b70674c8b393565e42277e8afca7524260b6aba601aec557316f246eb0b7c9a0409bb2b16f65c5dd87c76ec72b6da7d13d6c4c6bac38c135c771f9f37102f728368d40dd3686f9d4670eec232e7c67a8374e88e85bc8f2e643867634dec76eaa1e760a1cfd385de586305a955f37b60e1ee8bd5c6799fc44ad70ae63869cb1f049d29db130b73be2eccfabe30a708fb0b125e2f2cbcfdb02a1adf4a5b1649a9c6b23716ea025da80d94505389671f2cc4859847e5fd2b703eb6bf8f253e112e88167d312d0a755af061f43eceff4142e88785b008eb3454e3a9df4733880eb9980e45980dcbe5aa3962794c8f40e1f5c7c22bd685c72b1f72cfd0094ea53b484803b0904a6a2a8f6088a9ed459a8785bd18af138c15c719f1c68497ba23dd7f55b81372bd5c146c22e7404c8b253a2d3af87c7172daa446271fd36b295642c1f238deec4c2d5f0fc2422f4d545294bae117bad3a337b0a0cbf6066361ee8f796eff2c4eefe4baa00bad8760a12ec362bac2ed399f02fcf78080b96e28166619e64fe227eda55256ec8af5d02cd7f4d0dcbc31580fcd6e588f58b9618fd8309d603e67714532827be08277d709e65d472b23d5f77f7315548527d87b63b84e38bf5c15e15354fcc237d46ad7eef9851ffc502d80da78007b60c65391a8f2c81dd062e7e6025625e6ea9506cc9e23b088556a22f6d6b5074c9bb0fbc96d82446c2416b1aa44ad017dc4829501a374217372ab2386e3a90598e435a692476392d79a4a1ea393cc71af8b98afac1c8ba9bdde54ed7198e40da692c763920f30953c4123b95fb67319d93ec72b9b9f1b99786ef2c6643cf7229cd7445d4a705e9b0c054fc2041f682878b22e853bf114de7fbba4703a0e77aee174a26488cdc6894dc18a81cdc9084ee0e5a76282b7180a9ea613cc7de0c1c9084eb0ac7e3ae6890f498327de1313be350dc267e88473b33fd4d03a666295c2c30c2b85b3301c87a701c76cac8e7c84611d798ecebdecc2ddcbe2ede25ee8dcca913a52dae52c4745f884c99e0c5fce6276b2bd3e25f6d225314f89a3934962ae3322782e56fb38c6b4f6b1376695c71a5ae53e98cac799aa3c0f73b5c71bbada7d31162718b2988f697ca2a1c6fb610eeba43438ac0598f093d3207c21661ea7989a4721968aa71aa6e2224ce5d34c552ec2249f6e2ab9582799afb43a23191809565a956094cf34a4bc18137c96a1e02558263cdb30132ec552ef1cd3d42bc5589c6bc8627f4cf0798682976190cf37845c8619f23643435e8ea5de05a6a9578e41bed010f20a4cf04586825762a977b161eaadc234bec450e30a4ce34b0d35aec434becc50e32a4cf0e58682576328ae3044b106d3f84a438dd7621a5f65a8f13a9d60be43ced511d31d72d6633a5f63a8f306acb6756d1a6a5b076049789d61126ec4045f6f287813c6f90643ce07621adf68a8f14198c637196abc19b38c9bd360195b30e1b7a441f8c158d97aab69d97a08d605749b6117d0569d603ef7f3f664046fc1051f8a09bec350f06198e03b0d051f8ea5de5da6a9770426f96e53c9476292ef31957c1426f95e53c9476359f0be3464c16330b5ef3755fb582c0b3e6098058fd309e6930f1e4c467082ed628fc7403f9406d02760381e36c4712296bf1f31ccdf27619c1f35e47c32c6f9b134703e05c3f1b8218e5331c14f180a3e0de3fca421e7d331ce4fa581f319188ea70d719c89097ec650f05918e7670d399f8d717e2e0d9ccfc1703c6f88e35cccf3bf60eaf9cfc378bc98061ee7633c5e32e4b10d13fcb2a1e00b301cafa401c78598f057d320fc229d703ec8fd5a3248128c865f8cd9deeba6b67709c6e38d34f0b8143391370d4de4324cf05b86822fc770bc9d061c5760c2df4983f02b31db7bd7d0f6aec2b47e2f0d5a5f8d097f3f0dc2afc1847f9006e1d762c23f4c83f0eb74c23b39971f25939809a67a5c8f59c9c78656720386e39334e0b851279c0f567c9a8cd609062b6ed209e6130c3e4b46708209063763823f37147c0b56127c615a12dc8a49fed254f26d98e4af4c25df8e49feda54f21d983dff2f0df67c27a6f637a66adf85a9fd6d1ad4be1b53fb3b53b5efc11afbdf1b36f6efc5da303f18b661eec340ff9806d0f763387e32c4f100566ffad9b0def420c6f91743ce0f619c7f4d03e787311cbf19e2780413fcbba1e04731ce7f18727e0ce3fc671a383f8ee1f8cb10c71398e0bf0d053f8971fec790f35318e77fd3c0f9690c07df6cdb04c73398d67cf9b1a9d6cf62c2a36910fe1c56e1cd4a0649820aeff35815bd5632821354d15fc034ae6da8f18b98e03a86825fc2ea0575a386f5829731c9f54c25bf82195dfd3418ddab98da0d4cd57e0d93dcd054f2eb98e446a692dfc0ecaeb1a1ddbd89096e6228f82d8cc50ea62cdec6ccae691accee1d4c78b334087f1763d2dc94c97b3ac97c06498b649231c10c92f7b16a74cb640427a8467f80f547b44a467082fe880f31c83b9a42fe0893dcda54f2c7582edcc930177e8299739b3498f3a758f1ddd6b0f8fe0cc3d1ce10c7e758e5aebd61e5ee0b4ce30e861a7f8909ded950f057188a8e8628bec634ce36d4f87f982d774a832d7f8309df250dc2bfc51c476753c7f11de6f7bb18fafdef31bfdfd5d0efff80f9fd6e867eff470c727753c83f6192734c25ff8ce5951e8679e517cc9c7ba6c19c7fc5fc7e2f43bfff1b86a3b7218edf3167d7c7d0d9fd8169dcd750e33f31c1fd0c05ff85a1c83544f137a6717f438dffc16c79401a6cf95f4c785e1a84f32e23ade31868ea38223ac9dcefe71bfafda84e30f7fb830cfd7e964e30f7fb830dfd7e2d0cf21053c8b531c9434d25d7d149e6596057c3bc525727989bf36e6930e77a3ae1dcef0f33f4fbf5311cbb1be268a013cc9ddd704367d710d3780f438d1b618247180a6e8ca1186988a209a6f128438d77c0b25f8169f66b8a491e6d2ab91996ffc6a421ff35c7488f3524dd02133cce50704b0cc7f834e06885099f9006e13b622632d1d4445a6345f724c3a27b27ace89e6c5874b7c18aee298645775bcceea61ada5d3bccd94d337476ed31b3986e6a161d3095f7345479672c9bcc484336e988099f9906e1d918ec59a6b03b616acf4e83dabbe884f371ef39c9a4648271efce3ac1fcb893bd9211bc1417dc05c331370d38ba62a9b8b7692a76c3d4de270d6a77c7d49e67aa760ea6f6be6950bb076623f30d6da427c6633f531ebd301e0bd2c0a337267c611a84f7c198149a32e98ba9bd280d6af7c38417a541782e26bc380dc2fb63c24bd2207c00267c711a84e761a6b2c4d454066292979a4acec72a94a58615ca415885727fc30ae5609de05d9ccb65c9084e30657c0826b8cc50f050acdab7dcb0dab72b56b72e37ac5bef86a158618862182678a5a1e0ddb11cb2ca34870cd749e65ea022199513ecafb107967a9586a93702135c65287824967aab0d536f1426788da1e002cc2cd69a9ac5684cf23a53c96330c9eb4d258fc5246f30953c0eebf038c0b0c363bc4e30df526963d4744ba50958c6de6498b12762980f34c53c09937c90a9e4c9188ccd8630a660158c2d86158ca9188b834d594cc32a8987a4a192381d13be350dc2f7c4b2e1a186d97006661e87199ac74cacac3adcb0ac9a85697c84a1c6b3318d8f34d4780e66d047991af45e98e4a34d25cfc5241f632a796fcc948f3534e57db012e538e312651e6673c71bdadcbe98d338210d4e633e9686279aa6e17e581a9e6498860bb0343cd9380d176269788a611a166269786a1ad270119686a799a66111a6f6e96950bb5823bc5f67e73252ceb6c71102f1a3ebe0718df3c4e100357f95fc910267e8ac29a290738f143833ca8f1418c0f02305d2a93576c44009962dce32cc168bb1fae1d986f5c325589638c7344b2cc5589c6bc8a21463719e218bfd31477cbea1235e8641de660ab90c937c81a9e4e558f25d68987ce53ac1dc9b5d948c609ecf11c12b7482f971b31727237808aef14a0cc52586285661282e35445181a1b8cc10452586e27243145558a6bec23053afc632f59586997a0d96f5ae32cd7a6b31c8571b425e8741bec610f27a0cf2b58690376028ae334471009643ae37cc211b318d6f30d47813e62c6e3474160762286e3244711086e26643149b313bbec5d08eb760767caba11d1f8ca1b8cd10c5219855dc6e68155b31abb8c3d02a0ec59a4a77a6a1a97418e694ef3275ca876392ef36957c0426f91e53c947ea24f36955f73a0f3a2683ba332efc284cf87d69107e3426fcfe34083f0613fe401a841f8ba5e683a6a9799cae1ba08b731959c5b66f37c00ce74f99f3ff0ab6d8f9df6b2897a4bd33e02127fe1d34a9e3a690b653e061b753209f25d32990ae38605d03c76346f7481a8cee044cf8a369107ea2ceeebab2edd8fd54eeca2f74c3e15f16b8dd396b6a48afe0275a3e9674f7d3e349743fa54f6bccc64ec27ccf13a6bee7649d646e034f26531b781caf669c82097eca50f0a9188ba74d599c86a9fc8ca1caa763829f35147c06c6e239531667622a3f6fa8f25998e0170c059f8db178d194c53998ca2f19aa7c2ea6f2cba62a9f87497ec554f2f95813ed55c326da36acf9f05a1a9a0f1760c25f4f83f00b31e16fa441f845584abe699a9217eb24f329aa6f25939209a6a85ea213bc8b73f9763282134c67bb1413fc8ea1e0cb30c8ef9a42be1cb38df7d2601b576029f8be610a5e89f56a7c60d8ab711586e3c334e0b81a4bc58f4c53f11aacfbe863c3eea36b31c19f180abe0e4bc14f0d53f07a4ce3cf0c35be01d3f873438d6fc4cce20b53b3b809b3e62fd360cd37633cbe32e4710b56827f6d5882df8ae1f85f1a70dc86a5e237a6a9783b66d1df1a5af41d580a7e679882776229f8bd610ade8541fec114f2dd5847c68f69e8c8b80753fb2753b5efc54cfae73498f47d98f05fd220fc7e8cc9afa64c1ec06a1dbf19d63a1ec454fedd54e587b02cfe8761167f1853f94f53951fc124ff652af9514cf2dfa6921fd349e6434bff248339c1d0d2e398e07f0d053f81b16059862c9ec49c7f24cbccf93f85798d68561ab686c74a96ac64b44e50b23c83695d2b0d5a3f8b65efdac9689d207b3f8725621dc3447c1ee35cd790f30b9841d73335e817b13c583f199513e4c19730c80d0c21bfac13ccab110d93119c6008fd150c722353c8af622c1a1bb2780d53b989a9caaf632aef60a8f21b98ca4d4d557e1333e56686a6fc1626b8b9a1e0b731162d4c59bc83496e692af95d4c722b53c9ef6192773495fc3e9680ad0d13f0039d6077fbf36404275836f521c6a28d298b8f3095db1aaafc31a6723b53953fc1546e6fa8f2a798ca1d4c55fe0c53796743953fc754ee68aaf21798e46c53c95f624dcb4ec9c048d0b4fc0a13bc8ba1e0af3582fb75732e230b19e51c8a398eb402f78dd16c92f3acd0799fcbf4ee4f7724163a61737923dd10f84c04ef99ff8bc4f3243aebe868e74974c9e2f324bab86fa647336c2ec4ffb00cd3d530c37c8399753753b3fe1653b9bba1cadf61bd6a3959e6bd6adf635af730d4fa070c744f53d03f622af73254f9270c74ef3480fe19d3ba8fa1d6bf60a0fb9a82fe1593dccf54f26f188c5c4318bf639d04fd0d3b09fec01a40030c1b407f6290f34c21ff85411e6808f96f0c72be21e47f30c1830c05ff8b754c0d4e43c714ef45d49ac61043d388e804731c430d71447582dd6ddb0d2d230b43b19b218a5a3ac13c970c33cd25b53116bb1bb2a883a5de70c3d4ab8b41dec310723d0cc5084314f5b1d41b699a7a0d30954719aadc5027987b8c8234788c4698d6a30db56e8c811e630aba09a6f258439577c0541e67aa72539d64defd3edeb0fbbd19267882a1e0e698e08986825be804f3cb49ce83761a6bd65a746d3c80965876999c86ecd20a133e250dc277c4ec6faaa9fdb5c60a80698605c04e580130ddb0006883b1d8d394455bcc0067a4c900dbe902e07d3f330dfb7eda634c669932e98099f5ec3498f5ce98f0396910de51277c27e772af64602fc0056763b0e79ac2ee8449dedb54f22e3ac97ca7f27d92819160a7f2ce5812ce4b431276c17cc8be863ea42b067abe29e86e98e4fd4c2577c7482f4803e91cccf52d4c93ebeb81d51a0a0d6b0d3d312c8bd280a51726bc280dc27b63a6526c6a2a7db042bdc4b050ef8b65c8c58619b21fc66289298b5cccf32d35f47cfd31db284d836d0cc078ec6fca230fab832c33ac830cc41a5f65ce83ee8ae0c8314c8ecfcc66c562ad2a1f835aeefe7b823b3ac54766163b9f78635013626f8e7157b4f2376638bffc69a97ba782f575caed05eee855b9f32e5ffdca4792b8dcf837a39d5f39f253ccc63a5f15b2e56e08deb7f1d1276fccabd41df3f23ff1f4cb7362b820412cf82adbd5cebf2b41e8b3dc313729d32f758ef355a9232748cb341fa3be5c477d24c3560f4f638bd8fe2ecd2a4171055be9fc3d81f171c1327724907fc59fd42c418d191f315ce18e2d163aef0689df202c7ee5baf8ed86c66f9c48e5eaf15ce25c718dab5c4b2877745eec8e392e4f10d759d5de0d12a7c1589c56e8e234188d53752dfc315ae93cad107647159721585c56eae2b22b1a173902bdc2bd2adf8ea933148bd12a5d8c86a51ca3251a8bc4e3a4b3df20b1da158b55852e563d03f809199f72a161222f1a44e3dd308d2b751a0f670c0dd5d373acb085428d7fc23d7d22af966acc866131abc2f28c6e56c26c56e5ced728757fbd591a0b5c8f5d293ee76589aa338d97de1d8bd16a5d8cc607c833231dc2156e69edc5aec82dcf2baae90e4b642c0f25921e24b6c3b1d8aed1c5761fc29ace3837ef4d7767e62c11359939aed72f75fe5ee4a665625bc7ad2308913d30226b7544ba05f6995e3cab3fe5cf6605d27404a6e93a9da6f86e2b3595bd454ed381e7ce6257ebd5316df5361b240623b118acd7c5a0abe217d5fc24f59dec125de2fc7b699af41c85e9b901ab99eac384b5d1c96efea874e82f75e927f202b877488fcf2bc0e277802e7ea3025b92b4796947a9783cb39ad0682c861b7531c4f7c0aab9ee5de8def37c1b6fbd9539faa62fa5c660f1d8a48bc7ee8a2542add5dc3353e89f9c15262a7b5369fb8dc5e275a02e5e7b2495c3463a3a148b3ac58ab4e4b0d4bcc7382c6e07e9e2363a419ac1d88d61ab9c0f0a45ad697d0db523fa7ad3782c969bb1d22859cb1c57a365a6a7e49f80c5608b2e063303b42bf0144ba6ff21937d1413310607eb189410d607671ad70729fdd5248cd3213a4eb38939e13d84416acca970988c71d89a4cae2f7063e8c546e69559ce3d8f487f3628509b2ffe5590184cc16270a82e06fd03c5002f4374714bad74998ae97f984eff82a44ace09ae87495cbe64b27e3a0d8be3e1ba380e42e3985a0bbc26594162321d8bc911ba980c09504a068f8b5e5a90d8ec89c5e6c86462037d91796cf4d282c46606169ba392e9a5f35b37cc4db3ddfec40ae7dda9ced3252cbea769e21c92befc33138bd9d1ba984d4aca478c73fbe30b45c9255bb1d39c7fc7eb39dbd367ccc2e27c4c327e91a2cf356e95e9ea7d9d8dc5f1d860ad5a3e8eb8c87949c675b25be71ae3eaabcb85e9ae4dcdc1e2715c322da420f6b93d2d722f2c96c7eb62999b742916b47d945a3d632ea6fd09c9d4f412f9faa0faa79a5bf6c6627062325656dd2324d70ec77d43a2ba78ea56b60f16cb93b0bebc9af3d24ce7e545cc1bb72c424baf4cf5a7ccc3627872327d60892c31581f58badb52fb62f13a059b1f909c7f08162b3cb55289d37c2c4ea7a6de735e538ecba44fdf0f8bdf69c9d4ac684676a9c77c1760713e5d17e7b9db39ced434166234ced0d1189b64a9924c0b3cd3254b2116d33375311d93545e9ec2f8190dbc449133b3f0d651a6ca9745583ccf4aa6e5a07adf0237a6d5530fb60692b99f5ebf5c84c5f1ec64fc72f538c6ebda13dc31ba2ad7ba786fa5aaed2ce7df2bddfbc9c52eb5b67c3116bf73b0994f89e2e795a0f10f921f6b496faa9560b13a5717ab7969b64c2cff057d3fbd4c16634cce4bbe86c17b6383d730bc3edce4fa7653f7ba4bb0f89d8f8d8ceadbf8fa039dbd58578a1a6289db53e58dad541fa54fdc3b954ada2dc5e2b62dd8ecd1447193e3f295ee1cd22a77f4a8cc894b19f3c64daa97aa5eb9e99e1c14202ea5585c2ec04a8dd4d32995b8a423bdf6c7e27821365662965e5ea992be345a86e97f11d672344ba364f44f47ba9461f1ba181b1f493d5dbc19ffa39dbf1395f2a9a6d0722c2697049b89944c0a058f493ad2aa1c8be1a5146955c8d691a5d50a2c269751a455d098a423ad566231bc3cfd69e5f7e9a56c83260ea9d722566131b922fd69153c26e948ab0a2c865762add3d4d3aa82e94ebfc4e7f3d4746e6690785662f1bc4a17cf3d8d5232ddf14c473a5761f1bf1a1b733649e71231b76311db877973b5a738dfac4b9b0f5d8dc5e61a6c4cc2243553894d3ad26c0d16cb6bd35fcf2f76db702b99b7fbe76411e7ea63d1a9a6d85a2c2ed7a5bf9e9f4a5cd2915eebb0385eaf8b63514a719473c2e3b3d6e227bc26e361a0c4f897f1de255c027eb26c1046eb31463724d3ef8baf51adb9df37d3337b376031bd5117d3f294ac6126b13504b78574e4a30330723799cf8eac6946577afac2376231b8591783094c1ddd88fba5547bfdfdbe2d59af97aa77df84c5f796d4660d25b71221b5919c5447ac0ec4e2782b360f25c8ac21eab9420761dadfa6d37e2ad3af389deafa9bb5eec8e3325f8a79e5d234e759b99bf370efa35b0bc4dfd68587edd31d24e69bb198dfae8b793756f3fcc459aee74cbf856dc134bd43a769d71abd06959e07637adea9d3b30b4b3ca249a5e521989677055b971274456aa51bc3e9ccbff3827e2c8f7a9df2568cc1ddd83c8b7431d87e713e148bf33de6b587416c600ab507fe5590181c86c5e0dee4c7e67898c1c7e6bcf861f7d355333e1c8bdf7dc9ac1dd1cf83c4479993abf705d1ff084cfffb75faef52631bc68b01cc21ba9c1344c323310d1f48651c9f13e4fd50eb1cddabafcac5c6b14d6ad5759dff239186ce3fc7b86ff25500d3dd5a8fe75dfa75771eb9752c79c2875cf7d5d7b7462c7e9f87bedcd1885becacd8686dfcbc0f4cc2830eb03a51e6fdd73dc261578904892c56b8795f96b992e3f33df9ae1ce35c8f56e2966345cef564d123af9ea082c5c2e3e55febc6efea6257739ce4392b7c5faa22b72ec7bdc222c762ea8a1849590ee91c4efabf16d38778aab611a91aedc737178cf44ad19a6ad6e2e12cef90469d0db5ae4616d67774ba7b02a68a5a74846fea273b02a6b8d5660f1f6f2cf27f15d71c22cca9ba10fbb802a41faa51dc6c90bd75e2dab866e635ee2a98b79dc3fb858cd5ad1dcde529f10825ae662eaeb89595bb6e90fb162e7282a899840259d338b2472991b577912d60b9b1c200a29bed84522c26b18d77ab02c5a2e3b5d2894c18407e9d1707f9989d20fb87026471af38c8c7e97d9e04c99b135c8525a2a8e1c8c280ebea8e715c4fd0fbbcea450407b73c54c544f6a238b2272991f16336e5d0985a38c001fa70602b6e16c7f61425b63aaea579734d2a42528e8e181387f334259ce63eafe565c77867f04c175a5532b1b400dac5abe2d09ea18456df8526fb8365a5360c88724be2889eb5b35a91170a9097f78b837c2ed31954d7a40a03b485a0a47c9e125a2b1fb4194a3dcceb4ef50e8ee5dd096140d77bdf38ba1728d1b5ae666fb23fa540acbb2f77ef8d73f1ad76420d03beeb4179fa22752b40d6d1c25b37cb0675b39728713574ad6d8cdb4fb7da0d3e4cbd1dbcaf57627a9912531ba6eb2082a56858eb6c3b55c511be42897047d4afcd71e72d9430ffcca330c0fb6d6c1cdeab94f01a272c4fc380aa69cb38aad7a81be90b9c1897fbec4a66499865c3806ddd8238b6d7e90b82f8149b15ee38e0f29060baba388ee90d4a4c2db5d605e74b7a75b425210177c2c238b83733d78c1ae57e580c269d4e76ef2c0b05b4cde571686fd15b1bdef60c5b36dd0806f4dea604c7cf7394ad0058d5e0f5ff3037a3cadc6654ddda8a7075467cea23f1c1a8e3730678336c0c5be7cedcaa10e0953904fc3019eb347f07ce01c849d03cca4972d038278916694e8091859c1aea8239498c83e5180d3a9a7c9d67f4f500e76b75302127a5bc9e9342374b4ee0264c4ec07eb09c0095d79c4055919c4045494e12f34772921c40cc49ba033527411d3407e9f257a5e3f50abd1eba567b4e8aadfdf8f434fdb4b25c3e3dedddffcf678ee5f29963ef71080345d9efd506dea7ac0dec2c52de9b2858ceca58f2d38d17b041aa3eedabe933837927f994bae1c91a804eb3fabe3ac28c64229b4a3da14d345ed1fa80baa2a5a2c5e7032f6043aa0f2fa50f672b2a9cb7019c1fda8473682871be02707e6413cefea1c47978248ef3639b700e0825cedb01ce4f6cc299174a9c1f029c9fda8473602871ee087ce76736e1cc0f25ce0280f3739b700e0a25cef900e71736e11c1c4a9c27019c5f6602e7121428549f6776c25651232a9cdfb038ceaf6cc2393094385f0238bfb609e7e050e26c052a4affb309e7a050e26400e73736e1ec1f4a9c2b4166ffd6269c79a1c4793fc0f99d4d38078412e74900e7f799989d8bc1f4af6f1fe0144564309751c13c08d43a7fb00926a16592c1dc0860fe6813ccfc10c2dc0060fe6413cc812184b916c0fcd92698842d7532989500e62f36c1acb6da3e0430570298bfda04b3da8afb10c05c0e60fe6613ccdc10c25c0a60fe6e13cca12184792580f9874d30878410e6c100e69f94301b3817cb6b5eff1a82de752e4522fb2b134b9f30fbf3f70e1156ccdb52a1bc1c74b6fd6d0bcabc50a2ec0832f23fb6a0246d2e92a17c0a58e5bfb6a0cc0f25ca678055b25a96a01c184a94fb0294114a9472f27911f3e60debcfd3f47671256cd9d4a602390264efa82d20095b356420870390599420f9d295c2d8d47c75f90319b81e54e0f82ebe125cad4c58e060c60f16e51b517355b9c2de16bcfcd94a77450cff207c3ef10600b2362548be3c638503b0c2b70465001b1dc2f64b1700ad0e2534b9620b1f43842d68b8f53361b1d2940aeb41006b5d4aac70a11ecfba4b1c5c19cac864dd10f70078f528e13505f04aff337e701bc0577f7b56b3a138d26c5c970ae55450a9694089b28940d95f64e38a4c59e1522a74e7032b6c98090f3848b1c50cc06b4f056f3760778d28e1b5f0151fb2523dc74597210b24cbbc4d00c4c69410e5b268ac6927634aea031750613c0c64e42699f081b9ff191f780840b703253a39388559a0bf24269d294e969ddf03309bda0493707a1e19cccf00cc6636c1249c044506f31d00b3b94d30097bb6c960be0b60b6b00926e124283298af03982d6d8249383d8f0ce61b00662b9b60120e1790c17c15c0dcd1269861eca6780dc06c6d134cc2495064307f063077b20926e1f43c329811d0066fb37dfb223d51ded9e4841eb33315ca23c1907fdbed89d23fd3318c3370a701ab6c97892c5ee6bcc4314ac958ff10214cb2fea18e597198ed33d1cdd6df377e2d1f87bdb7f24450ec74a0c498adc9defa8dece21b20c22d21497b318750e1ad00de73674abc358f734381191ae7de4285b514586d474aacea169dfe2d3cf93dae52b51347423003e34f80303b1396192f8cbc09031cdb04363ac17cb4304eeccb01c552274aac7212417f37d3cb8d7e33541c918d403e01ac72974cd436936b0585b1aba31f40d9991265f25bd4ce72ed92e35eec8a5b4e8b761115da09a022df85126de70095a672974f21939b2d17b855a735d415fcc7a35435535075ea1a06c884c51519e49301e46e61804c381c4206f91400b97b1820130e9390413e0d40ce090364c2216732c8a703c83dc2009970289a0cf2990072cf3040269cd64306f92c00b9571820134ef721837c0e80dc9b12325f1ae39d18234fdc19e9f63110d616c8d670d46371687db607b4302e7ca90ba0f5cd646f163fbd88cf5be6a7fda8032cfe11ab306ec0d317f466f5cb443f2befcd5a2e022f743b09c33ec0320858666e262c3368ff3fe9fe08642300ed40d1d2df46aca49ba190617d04f46c0da0c4da25e96a510153cfb5f26326ac18912dbebe05586f1e25e6e0675c1156e6c9c6b2ee073807da8473682871be0d70e6db849374fb71329c47019f3ac8269ca4bb1293e17c09e01c6c134ed2dddcc970fe08700eb10927e97231329c5d81ef1c6a134ed2636fc8708e053877b50927e9c122643897019cbbd98493f4d81b329c67039cc32871b6ae01a7dad314c6a31be60198bbdb04338c4737cc023087db04338c4737cc0030f7b00966188f6e980c608eb00966188f6e9800608eb40966188f6e180e608eb2096618478e0e02cdca029b608671e1d8260073b44d30c378744309c8e6636c8219c6a31b160298632961063b8780b0f821db3ff10290c9c7d982322f94289b01ab1c6f0b4ad2f3acc850de07ac72822d28f34389f2566095136d4149bac11019ca0100e5245b500e0a25ca5e608ad7644a94fc005d78f8d21cb70378b5fb900c1bd9b618dc3024b62994d852dfc09cb077886c1ee7ad00ebd4ed99b1a1b805a1dc03e76350724fa344c9e711f32dcc17390496b031b12d32084fc5201bd16907ec6f3ab537f44fbee6f3dc3c1a64d89a5061ab05b0ed49894d8e2bcae9d76bdca9d7ffb58d82ba803279c6f6f5829e286ffb2ac20e0ab272fa2750539c9989de1ebc9c9eedab2d1216298da8608e07d97c964d30092d930ce6280073b64d30098768c960ee0a60ceb1092661259c0c663e80b9974d3009a7b590c11c0160ceb50926e1b4163298c301ccbd6d824938444b06b33780b98f4d3009abec64307b0198f36c824938ad850ce60000735f9b601276f092c1ec0360cea784c90f75e2a753563a8fe37b788e6653d85c850a1944b27de95a0088fb65c222f92bba7de9d489d384be92ac93ad2780b9c0269884a53819cca100e6c24c0c44404fa95fb19bc1f96b7c6d1d09d64b41bf512125567818e81ab0914446763d20eb76fb0a58e5224a7cc91f82475876936d727e04c058448911ee73fcdfda7f230f202ca644d897f98726e2e75a4e76852c63feedcc836d7e4e58ce936d7efe18f0a125991815ca75abf225ae139820f096ba3eb5946d70ee17b330efd85d012c793125ce8e9a927e8ec3a3c051bbd8f5b3f277142b714731d7b816cbad95fb59c2a10db20a7e1d30e4b6c466b884431d64702300ee529be112d654c9e06e015eb6d466b884451819dcf500eefe36c325ece623837b2d80bbcc66b8844d0732b8d700b86536c3251c6e2683fb3b80bbdc66b884c3cf6470af0770cb6d864b381c4d06f71f007785cd700987a7c9e0fe0de0aea484db86a9bbd096bb5370d7b144abe2c880922d4ec8054057d90694b03e4b06f42e3029bc821228dfc5da3fbf99703a38d972047e4c98c45549894b778652f2de328c05d10a6089559468b3356883f5bd1256ffc9fa5e0f009e7375262cd73b2151fe8e151e74bccf054c005e95bc1f96cc879e019cc21a4ab4c1cea8236c47910dce8c0128d752a2e4b36b8a4481c4b37a592696db90596067806d1d25b6662cbe2d7fa5cf2766645090cc3bbe0500aea7b63bb51a2447a6c23702d50860db90e9ea50b2bbc3934e799c4185f603501d3a80126d0306576bf28f0b5d51e1ab417600d6b89112991c5e4e7e014d1827dd7e09706eb209e7c050e27c1ae03cd0269c834389b319f08f07d98473502871fe0eac73b34d3849f7e124c33917e0dc6213cebc50e2bc16e03cd8269ca4e3ec64388f04380fa1c4d985a5eb5027c2714bb2439daa4097db567b5b478413c8c85a475700b48752a2dd41a0cd530067a0b3830cde4490fd0fa384d72e69bbf4af10219c2f4ab63e6414b0c8c36d844a98cdc9a08e04508fb0112ae1401b19d46100ea913642259ce94106753700f5281ba1128e0691411d02a01e6d2354c25a2919d4c100ea313642256c519141bd19f4461d6b2354c2290b64506f02508fb3116a18d731ef05a01e6f2354c259746450e700a827504285cb72bd5920fcf3152edc8c8cc093354a3f657184275222ecc3fc333bb905ae753b46e2302b53eca722b45db25eaaf3417de0244af0ad58e2d94b9eeafc783d52cffa2715c86781059f6c0b48428b2403f90c00798a2d20092b5064209f03204fa504c92777c7e7904c765e5c12c2f923ed01aed32871f16db7e5c658531d0a65ceff708671f8e6cf7503e84ea744176c9b7ec29e24b229b02f80bae4199428d5add32b99b729c67f6b814b07b0d5c09999aa9af39a61a1f30a9fe1599ca9aa39d92ccf2741e63e8b12614ddbb3f93337e941cc64d9bb08c03cdb269884431964308b01cc736c8249d8314c06b310c03cd72698615cc8b208c03ccf269884ed1832980b00ccf36d824938544106732180b9cd269884b54b3298f300cc0b6c8249d8814606733e8079a14d3009a7ce90c12c01302fb20966188fce5b0a605e9c891ec9416e23521e9cc7158e2f93ce405392ac357e130079092548b88b72bc673243f8c87a280b00be4b29f1ed00f049a9198247b677f2a100de65dbb78fd213e51da247d8ee26dbcdfb3b3066787926fc61fe7fd41f5e076cf20a4a9072b3feeaa3de1e91ff56a76f2f609f5752626d2cb0f28017bb60a5ec52471d3270b5a9c031608f576d4f1f99b169d66467b6ae06e3385753a2acef5cf097573a04aad814f76fc23144b2618656c0f6aea10466b61321690b86ace6b81a78c46b6d861bc6edccf70770afb3196e18b7335f03fce8f536c30de376e65500ee0d36c30de376e61b01dc1b6d861bc6edcc0f00706fb2196e18b7331f070ab49b6d861bc6edcc0f04967b8bcd70c3b88bec7ec0726fb5196e18b733df1bc0bd8d126e5ba6ebadf2565af8fb09e0ea0bc2626c2915d25dc0f4c4dba97baafc1b9e8e6315ae3dae64843b71932d5be1b35725b83b28c199edc41dc6aa550928a0eea4449bad411b6c276ec2228a6caefcfbc08bde65afe586b197ab1258eedd94689bb044fdfe84feb40115ba28f0a7f76462242a99151cfed29dd0976ea1c2fa17b0c87b6dc44adafa27c37a19c07a5f26c6a9b0d94db33335564ab619600ec8f8f767ba384a7e973a42b4646bda8b81953e408976270d5a287094f3e90a77be09affef3bdc0084702c80608af0615a7076dc2393494389f00381fb20927e9381519cee520b33f6c134ed2538cc970de0a703e6213cebc50e27c0be07cd4269c0343897307e03b1fb309677e28710e04381fb709e7a050e2dc0be07cc2269c834389f30880f3494a9c2d9c0bbe7287032b728514b3396e8f5289d2f319beae393e5e26213e95099b4cfe701ec24164b256fbd700e7d336e11c184a9ccf039ccfd88473702871b600b5cd676dc239289438ff02d6f99c4d384927e090e1dc1be07cde269c79a1c4793dc0f9824d38078412e7d100e78b9438e5c2ede496e00ca41c27225b8453174caf79c9269884ed2032985900e6cb36c1241c1b2283c900cc572861d6b4d2ce5f9e134ea8215bed7915a86dbe6a0bcabc50a2ec06ba3a5eb305e58050a27c1658e5ebb6a0cc0f25ca86c057be610bca81a1447928c8e06f52a2eca24199dad18f845525b2d9c95300e6b7c280997490980c7353e018dece8463c875ff9ee2dcf64455b039ee00c76af7353923b48a0e25d9962e7fb038ca772851f666feb51dfe4509fee9ddc12683133603c82683bf081cc5bb94d8e5fc50bcf304b6aaa06b205c7adb940aeba9c09adfcb84ffd55b73b02561e11bd4bb1d58effb949875abed929f3b4aba369f6cf6e85700ee0736c325b45c32b8ed40cde1439be112f6ba92c1cd03703fca44b54c7adfd2847d5b84764ad65e7b0a38818f33513fc875eb0825aef54d775ee70227087b2d755ee61ff353428a3351db259bd25309ea079f6ccf1e05288eb4aa45b637ee95a09febd34c8c0af477fe7895ac6277a654c57f683fc8cb805d7e4609136ef00aad33ccbbe3ee06e07d9e094b2c62c96c793d2894e7d47403d9fa0b9b6086f19c9aee00e69736c10ce339355d00ccaf6c8219c6736aba02985fdb04338ce7d4ec0260fecf269861ac57760630bfb1096618cfa9e900607e6b13cc309e53d309c0fcce2698613ca72607c0fcde2698613ca7a60780f9c3f6edd6f04479475c1096e564e3a147838eb71f33d1121f9cf99638d9b8fc3060873f6d4f3bf4cf140de30ce6f900e5cf94283bb1ea1dc033997f316201b2816006ba82c97a8d1e6071c0bf50026ec160971b57d47f624398fbd3ff06107fa58408cff5e2420a63e8c27cc2f6b700df6f99c8e472c06c85eb1fb111c971e233bf17256cffcca6023c0378d1dfed299008eb986405d27a80f28f4c65f525bea226cc8314734056ff93129fd9ee9f619c8db42fb0ccbf3291c9936b4a86b1277308b0d2bf33d12a87b5ce31b183fe0a58fc7c3af2ca11d9a06e7700f31f4a986d6a287caa6fb416cebdc17a83f945ffda0694b07a4406b41b00ca0f17b40a28e1e00519d0010068c436a084051219d07e0068941268f2bbd4ce72eba0bcfc5fec8a5b4e5bd62fa2423b09549bb23261abf1b9f2359f3e4b0894acbcff0700ad651b50426f4a06b40be88baf6d1bd0309e8ffc36b0d03ab6010de334edff01a0752981b6aba1bcc7167111fa51b2455ca701a8f56c841ac695716701a8f56d844ae84fc9a01e07a036b0112aa14f25837a1280dad046a884d3bac9a03e0aa036b2112ae1f46e32a84f02a88d6d844a38cd9b0ceabd006a131ba1124ef72683fa2080ba838d5009a7309241dd05344f9b52420d7ecc0fe100335957df230067339b700e0d25cef700cee636e1ec1f4a9c17030fdac2269c034289f33580b3a54d38f34289b316c8ecad6cc239309438fb009c3bda84333f9438a7029cad6dc249bada830ce76100e74e36e11c1c4a9c17019c6d2871b6ae012714c7cbf5302eeb1a0160b6b50966189775cd0430dbd904338c1b5bec0a60b6b709661837b6d803c0ec6013cc306e6cd11cc0dcd9269861dcd8a20580d9d12698619c0ede08c0ccb609661837b668026076b209661837b6a80f60ee6213cc306e6cd110c0ec4c09b37d0098fe594c8495a42d54588702ac5d6cc44a7aec0f19d62740d771574aacc96fe1ab5f304b5848912d98fd14c0ed66335cc2ea1419dce701dcee36c3252cc4c8e05e07e0e6d80c378cebe82703b83d6c864bd86425835b0fd4137ada0c97b073850ceeafc0727b51c2ed9234dc0296f8e02bc2ae6ab29d9f9e0636dcdb8e757ad53193ba07b25315b200da3e94681b3b1725b135f8a3195f7bb8daf974b2f3c9123a7064fb42346171707d6d1a271d42e949c9c649ef0276d8cf269c434389f3358033d7269cfd4389f30850cef7b70927e9981419ce3b01ce0136e1cc0b25ce8f00ce3c9b700e0c25cef6c0770eb409677e28718e0638f36dc2497a500519ce4500e7209b700e0e25ce5301cec1db73a84feddd271c3c21dbc5f1550073884d3009a79491c17c09c01c6a134cc26e0e3298cf0198bbda0493d06792c17c12c0dccd26988463a26430ef003087d904338cfbdadf0c60ee6e134cc2314f3298370098c36d824938c64906f33a00730f9b608671b7f03f00cc1136c1245c544306f37500732425ccce1a98a98c6186710473270079541820135a3219e428805c1006c884b50232c88780cee6d161804c585b20833c13401e1306c8842d2f32c82700c863c30099b0454606f95800795c182013f66e9141be1f401e1f06c884bd5e6490ef019027840132e1080219e4ef01e48961804c38b24006f97d00791225e49ace2d8bab4e3c31886c8bee4b00cac9b6a0241d552043b93368bd4db10525e9fc2a32948f01ab9c6a0b4ad2d92b6428ef035639cd1694a4f3aac8504e0728a753a2eccefce743143a248a193f86101e2e9cfcb185843d0864d3d3f704b0f7ccc4f2e025497592877da7f3bb581ceb8c4c2cf8899f71020fc90e62bd84bd0664d6fb2cb0de9999680648ccfc65fef94a56150832a13f2683fc10803c2b0c90093b19c920b706906787017218dd4504409e1306c8613c08f93bd0a8d82b0c90c3586d7b0f409e6b4b738374d1305973e31a80726f5b5092ceb72143d91bf8d77d6c4149baeb2a19ca4f8055ceb30525e9c6df64285b81d37bf7b50525e996f464282f00197c7e265016b9a57625538fecccd8663664d3e9a6b238cafd2851361728b9d5797d03c58cafc6aa70efae74ee54b8af922124db93e22c8070c1f6ccd8501ca935926dbe380514370b33618dfdff73d67802b0c6424a842d6bf08d32a6a496b8800ae3588071d1f6cdd49ea83237b6842df1ce54288f02a5751125ca660265aef3a7cacdc24b9cdb5599cad243a800be0d6cb1787bda62c6364624abeecc03054c0925ca6c0d4afd849d91b1e1be99a22fa888da6b9259ea0a90d5176fdf613c283043f3abb75061dd0f38802594585b09ac039d3ff1ddcf26b8d5a312b62e539e94ace1783900b9747b361cfd55f5309e7ab22740594a8972076093d09f66c00e9752c19b0ce0ed9f891581b9d5da39ff9d4c7d1c80b98c12663d6eeaa20c1f2d26d892e122db42a601c05546898bcf6a2974eb8aa56e5112afe8c4e735856fc82b1be05b9e89cd5de5b862bc3c2e70e195572b5460c72e6135872c236f0695f3721bcf88209d5e4b567b6c0c2ae52b6cc44a3a979e0cebc3c05a5766626733bcad335b191e236c9937a2c2f939f0abab6cc2393094381f07382b6cc2393894381b82cc5e6913ce41a1c4f913b0ce2a9b70f60f25ced900e76a9b7092ee244586f36280738d4d38494fd423c3b905e05c1b8e5347c2b84c7633a8e6afb369a7dd2194fd9b64dd240f029ceb6dc239349438df013837d88493f4dc47329cc780fae80136e1243d9d940ce7cb00e7469b70926eac4d86f3278073934d380786126777e03b0fb409677e28714e04380fb209e7a050e22c033837db84737028719e0b706ec9c4b603708a827fb59ad74a5aeefe9bb79e56bb22c7c4c6a166b9d43230df782c15ecfe2c0efb605bd66490f641910dde9d07cafc436c4149daff4486b22e70015b6d4149daf74486f20e609587da829274808e0ce555c02a0fb30525e9e01c19ca7e00e5e1b6a0241d492243d913acaa3c2213cb5df84cbaf80e4d935d01cb3235878e6c565373e0278fb473ff25c29d6ec9f65fba93c5b11e65cfd240c2ddf2c9e61bbf092cf4e84ccc37ce75e7dc95b9423294bdc996bd6c0576780c253c3e88c86715c3c3d29788cfc3d7166f0bb01d9b8969dac92d17203d20902c03df01601e6713cc30aebe7808c03cde2698843339c960de0c609e60134cc22a0f19cc5b00cc136d8249b8531c19ccab01cc936c8249b8b72119cc6b00cc936d8219c69d3aae04304fb1092661270619ccab00cc536d8219c686e2c300e66936c124dc698b0ce68b00e6e9f6c01c12ca16d01ea00be30c9b6086b1053412c03cd32698616c010d0130cfb20966185b404301ccb36d8219c616d02000f31c9b6086b1053418c03cd72698616c010d0430cfb30966185b40f900e6f999d8e128f188f82077b71942abac4d05b22d180fdf9689cdf638a84a06372e0bf7667b3b004bbc201323e1f1639ff87e85f2f17f6d67d7b660cacb8599d8360566f0fff6c138a5c0622fb27b4f43c2ea3c9943781358eec594783b69f07225aa5c80e56ca23b017ba5e21afc2b84095d03d9fa60ce5302be841270d714ec7706e34b0aca9cbf173bff4f717e8b19f1ee9c0f47a9364a03967ca93dbb1f86b1c36424b0d9cb28513664f13de74a9d9bfca50dce83e2104ea7e904a05d6ed3be0aa4078a90f9cd1f00ce2b6cc2497aa80819ce3701ce2b6dc239289438eb815ae95536e1243d1e8c0ce76a609d57db8493745c930ce7a300e73536e1243d268c0ce78500e7b5996edd27bbc50fe961a164e7b9dc08fce87576eede4968b15ba8b07e0eb05e9f890ee73cf6dfdc52ff5290f56fb0c993e6536677324ffa05c079a34d38078612e75300e74d36e11c1c4a9c8d80d7bcd9269c834289f357609db7d884b37f2871ee0570de6a134ed2c50764382f01386fb309e78050e23c1ce0bc3d1cdba012ce7122db06b5140c72dc1106cc034289b90798677267260640563a04aad81c77386eb5fb880c1ad949982d810bb88b125a3ba69e1dc3edcd13f25f9b59f206a893de9d8996bc845aaa9d3ae61551613c55fd72e039efb10524e10a2432904500e4bdb6800ce3e63e5b40d6becf1690613c596b3a0079bf2d2009ab3d6420df01201fb00524616b880ce40d00e483b680249c9e4806f25f00f2215b40124ee92203f90d00f9b02d200957669281ec0faa3f8fd8029270bd3019c89600e4a39420bb292017b1ea33e3939f434f5841229b43df1a74673c96c9535d8b024d6020444b3681e16260c58fdbb307621857163f078aa82732d17f14742e481867829c0fa03e692354c22e1032a8e700a84fd90895b0f14906f54400f5691ba1123644c9a01e06a03e632354c28e3b32a88702a8cfda0895b0224506752b80fa9c8d50091bab6450cf04509fb7112a61c3950cea1900ea0b364225acfc93413d15407dd146a8849d7e64504f01505fca44e3149fe314f631a6fb581ce5cbdbb79def89e25bf7935a25d93c91e34197c92b9938eba0bf0234030b12c8fa9b86013b7c757bda213cc884d40ec98e8d5806bce36bdb7f57267e2e3b697be84f2a90e341867edd169084850c19c875c022dfb00524615f1219c805c022dfb4052461ff1119c87d00c8b7284136772e96ba47db16bb559b0a47dd95cebf0b5d819399b7b8b02c8435c7c6a0c47e9b12615be61f7ce3036b6b451bc66f9519ea805b4a85b407b0ca77a88fc5ab64de395945ae90625620ecb4dcbd3fcef9940f0daf0ce1b0f0cec032dfb577d73ac202880ced625092bf67f7ae75845d7064bbd6bd051cc0fb9478dbd450beaba7b2f777ea9d84c3c4649b57fd09807e601b50c2216232a0bf02a01fda0694b0cc2703fa3100fa916d40091b9b64403f04403fb60d2861994f06f47300f413db8012363ec9807e0a807e6a1b50c2413632a0df00a09fd90694b00b990ce81700e8e7b601259cb04006f41700f40bdb8012b694c880fe00807e49ddfbb4dc5dc55ee26b608e753fe18a17ba5d28a56e47de1ce797ef10b6228448f9d91012e957f66c341dc603f86602945f530f0517c63a4026bb1f2ef3890c5f1f537300ef7f9938a227b9a5070343797a6123b044e61b9b6086f1f4c22600e6b736c10ce366fcf500ccef6c8219c635460d00ccef6d8219c6d30ba300e60f36c10ce3e985b501cc1f6d8219c65d937e03ad9e9f6c8219c6d30bff02307fb6718fee01a15c45f43b1822fec546acfd4389f55280f5577b37eb27acd693cd3d1e041cc16f99d83235d9ce39d2c39fc9fa916e04387fb709e7d050e27c01e0fcc3269ca4db4d93e13c18f8d13f6dc249ba3f3219cedb00cebf6cc249ba7b3719ce7701cebf6dc249da9227c3d914f8ce7f6cc2497acc0919cedd01ce7f6dc2497a900419ceb90027ab63114ed2634ec8701e0b7046328133f9338d085b4564271f7cc7e238a336e1241d3b22c3f932c0996513cec1a1c4b92ba828d5b209e7a050e28c029cb56dc2d93f94385781cc5ec7269c79a1c4f920c059d7269c034289f37480b31e25ce9af65af067f4306ef67b05f09bf56d4199174a949d40f5bd812d28078412e533c02a1bda82323f9428ff0556d9c81694a45311c9501602948d295176d1a04ced283dc239226467bce503cc4dc280794028313f0f30ef408959eef6c5035eec4296b2cbc52be19b7ae3944f31784d29e1c9392278851eeef795a1bd669b52613d00606d9689ac1f3f0f01ee1df25f3f76a21054af9a53626ea3605ee33ce02f1627a81b847113ca9dc11cd11699a8642577f45e1851de048aa596942893db212cbca718ee0932792b5b4086d122c700903bda02328ca718ee0740b6b60564184f319c0540ee640bc8309e62b801806c630bc8309e62b800806c6b0bc8309e62783c00d9ce169061ecac3b1a806c6f0bc8309ecf7e3a00d9c11690613c9ffd640072e7edd9130fc5915680c8badf2e02283b66623c3dd7fd5bfe7aca8c6165ae50b972c8ebe1aca2c349b66defc12c8e339b12a75c9559c492d9388574c08dcc36db00dbec6413cc306e58d116c0dcc5269861dcb0624700b3b34d30c3b861456b00b38b4d30c3589ed70630bbda04338c1b56340530bbd904338c1b56640198dd6d8219c60d2b6a01983936c1246c4e92c16c0760f6b0096618f73b6c0f60f6dcbe6d734f94778a2061f143768ae0316000b7d7f644e93f088f1025d941784b8055f6a644d941a0ac624b9dc795e83cb859acc29d2653c916bbc296d30ee92ea2023b8ec5c1f6c9e43ca3156cad0bb22236c768261bcd26b151ce07fc3c23efde74e75d3e898bbf37d2d1a4941673972c22cc5f0357d077fbce928302fd7337c9b06ea1b2de8ec02df4cb045669bd558c9fcfba84f15ece098eddeafae707b181b4d65a9b0a6b0b30892b97126b3381950f64543278e4d30296812370c90e7faa0becb27f264afee46aa4616c290d0405d4004a94c96f96a62bfb09d19295fd138195e651a26dcae263471eb20c6672b24d2a0603cb1c98c9c287cf1a9ee3ce1f5eed62c4abfa84850f59557f2750f8e467623546be92ed33609364e39753804d0eca4457487223ebfd43d9aff437f08f836d8219c67ea53aa00534c42698611c59ff0358e6509b60867164fd4f0073579b60867164fd670073379b60867164fd370073984d30c338b2fe2580b9bb4d30c338b2fe358039dc2698611c59ff0cc0dcc3269861ec2ffa02c01c91895679f07e76c21a27594f7b07507d1f692356d28a3c19d6c781b58ea2c4da83a9ebcf2b9c0fca183c0713ebef1c193b95d0ff36a1af25eb997f1cd8714118b65421ed3a21db52e54e8079b41dbdf6d531932e30243be2e407e032c6d8b4d5f490501e387e0fb0d4b136e11c1a4a9c6f009ce36cc249da034086f34890d9c7db8473402871de0d704eb009675e28717e0b704eb40927e9c9af6438b381ef9c64134ed275496438c7009c936dc23928943897009c536cc239389438cf0038a7dab21b2d696734d97602178262689a2d28f34289b215b0cae9b6a01c104a940f01abdcd31694a4eb38c950de0bac72862d2849cf702743390da09c690bca41a144d91f4c549c4589b2398b4f9ff536e72d76ab3f152c435368c9fa32d7b238c2d9766e1e4d38a3896cf3e87b01d639b66472d2810cb24c7e3528c5f7b205655e2851e680a267ae2d28078412e52bc02af7b60525e9e60164285b82527c1f5b500e0c25ca6d2083cfcbc4fe881c55095bc3bce1dc096ec5a884adcb54b5886eeb53507eef9b0990fdffa3208f0520e767f6148d15aeb2156e4f6590290984936ac8aaf10f808cbf5fa62787e9d1fad7c191ce0b3d2a4284f51280754126dcc0d0ffa81b3813b8818594205bb2c4cbb1654c493761594085717750eb2cdc9efb1f67e87027b2559ab9a0ceb928d3b3e3923fd08970422dd9814ee5c0468b28d166275d1461d367095d00d9f4d9034191546ccfc616615cc3390d144a25369d844dba3d25d949d89f009c8b6dc2393094381f033897d884737028713600c5d2529b700e0a25ce1f817596da8493b4a149867312c0b9bf4d38f34289f3228073994d38498f6726c3b901e02c0bc7922dc20989644bb6d681aafd727b976c11ee7d43d63ffa25405b4e8996e7418e8b0b9820908e16f8c8b0914d916d0832fe0a4a6cf59d0bdef1c17b3b57b0290e87aa5002eb0a80adb4652c339c872f9f0d2aecab6c41495a1d2243f90b4059610b4ad2aa1019ca6b01ca4a5b5092f617d12d1a006572952d2849fb8ac850f6052857db8292b463830c65773032b4c69e9331c3b8addf8bc057aea544d986c5a767f3d1722ea6c2f9986fd00b056768149d6c68ad3100ba2e13a3e8b9bee908f271863092d9e53a16c7b83e13edec9a8e3219273ec8d8d6d1b3a9d0ee0ed06eb0e72028d21dbfc8ecf42800f3009b6086b1303a05c0dc6813cc30ee317b2080b9c9269861dc6376338079a04d30c3b8c76c198079904d30c3b8c7ec720073b34d30c3b8c7ecfe00e6169b6086718fd96500e6c136c10ce3291ba7019887d804338ca76c5c01606eb5e7f456c2f60fd9e9ad77835ecd432951b663f1ee8ef8ef0c57d80ab7fb638c8b91bfec8d812f7095aca2834a36f3fd3c609f87d973242ea17d929d935501bae30ecfc43959dc2ebd532f2b33d509b7850ade7a60874750c2ebaab1c320cb04e0bc22c2e6e5995122d02f032f7a64584013768a90813e04803e2a2ca0099ba564a03701d04787053461670a19e85500f43161014dd89c25035d0e401f1b16d0849d3064a08b01e8e3ec5df74958cf201b9cde1fd4868fb77bdd2761ed826cdde75660b927d86bb984fd5f6496bb0a58ee89f4fd0c6362132a0a5c6c5e8fc23217fa28e7d522e7df9ec8b1ce6f8923aa3884f3a8789b55423d89126a33166f1c57fab279b827fbac00004fa604b80bf3ef9cb38455b8185706caf884b50132c4b341c63f8512710b60a35ee7b7dc9828631d39644b6b3e06767aaa8de7d2918ebd92f58f3500e5fd69366225dda99e0ceb0320cb9f4e89952f9d8aaf689aeebcf4ffbabbb3d8a8aa300ee067940285425b40148306433463812e144a7932a15024d248541a444de96e630b4d4b0b0ffae0932f3e98f8a2b2086eb88b28828a3be0860b2a881b522aa262c58a206ee03967663affe9dec4ffcdf71542d399b973b9f777cf5dcef67d8ecd8d4bd5779d4c8353fc1e49d369a9012f69d369db81f35e499cd4a09734ce7dc0799f24ce3c959c43e10ab9461227357c358d732594ceb59238a921ac699cbb80739d244eead01f1ae73ae05c1f44f6631cfa339046bb02ff5b33a8515bfa534324f01600bf5f1b38b18e4f033f04e01bb481136b5834f05600dfa80d9cd84b4b033f0ce00f04312b3031e8fb609915b806181f0c6234d7f44ecd2e9a1bab1700de43724317119f1868edabb5501f7b5852d6cf7ce6f3002d42cf2668577d4412e76c959cbb817393244e6ad0231ae7cd70b23f2a89933ae78ac6b915381f93c4498d2345e33c009c8f4be2a446eda17126c1b5f309499cd4785234ce5ce07c5212273510128db318389f92c4498d3f4ee3bc03389f96d99f4f6cc0a6f5e7ef815bd233ec213cae2fbfcabed1641771a3f722a9805df5b2d6cc37b15153fa6aef2e7e560c71b3a44e9599cc91d0b44e9536e07c5612e70c959c7b81738b24ce592a39c7c115f339499c792a39cf40e97c5e122735063e8d7339706e95c499ab92730b70be2089931aaa8bc67927706ed3910883d8a3494b84510575a5ed1a98a9b1d268cc6320d4f18b416413c59e7a5c215e1834a65ddf0e978597a44012fb3a6990d900f9b214488d51cc2f07c81d522089a39968905500f98a1448e2cd86063917205f9502497c06a541de0690af498124cea8a741de0a90af4b812486d6a6416e03c837a4401203cad120d702e49b41f411f55c5bc7e87c0185314a63b1de0dac6f31592f338933e9cb4cd779f2fd9f514f7c80a7f5244d832ae54e26757627eaa61e217b4ebbd17b9d9ef8d84fabd1a703ffae2022f9f67faca8be1efb32e828d92d099318169986590e986f4bc2d43896640e60be23099378cba2611600e6bb9230898f5a34ccb980f99e244c62db130db31030df978449acedd330af04cc3d9230896d5034cc2580f981244c62ad9f86b914303f9484496c8ba2612e03cc8f82486f10ab80d6f4da15a7b1c57e3254263f9693095763bebccd502af70631b738c79474ac35a089d9252cbc8d268ef74950596f4b4c917d3bb2aa06fb7b93ff2d80c42fb42be35960fc544e96a7592a53b366c309fd99244c8da9597300739f244c8db79a4cc0dc2f0953636ad62cc0fc5c12a6c6d4ac5301f380244c8da959a701e617923035a666cd00cc2f25616a4ccd3a0530bf9284a93135eb74c0fc5a12a6c6d4acb980f98d9cd4acc407235a6ad6bb6086c6c120867cb93a793ce69cdb6037197b75508d1bb446b6661387fc564e3a566299a4a563ad87d3fb5010b386624dbf89610116d82f17db57eeab158370f0c17c606e61325fd889d90dd25a151da295c81ad0b02d5a4ee6c970353d1c5c0be71cdfc259694bab2b934d7e91005a386937a553702d6d95732d253e77d2aea5abe024ff4e6eb6398d49a7ae07da23413c3ae50fd247a71d70ba7f1fc4e9debfba91c6d6a42b80f22893f2a228e54a7b2ad798c6019dec1a534b4e8293fd07a9b0c4124b835d0a25f647a9b0c4567a1aec7500fb9354588d53631601ec31a9b01a1fa83201f667a9b0c47e791aecc570f36a930a4b1c3d4283bd00607f910aab31077d355c0a8e4b85258e2aa1c1de08b0bf3261279881ce38ca51391fee52185cdb2e0d54e36ccd4b00f43769a01ae7c52503e80969a01a3b4e8600e8efd24035ce8f4b05d093d24035cede1c05a0a7a4816a9c27370140ff9006aa7116e778003d2d0d54e37cb94900faa734508db3392702e85f418d8c2af11b5aef67290d96defcd3260ef93713323d0a996bff359a787ed880fa47f35980c9d0caf48f9cfe518dc370af81b2f82f9372947d11c92a53e1af850d665e47cf7d230f8e167a6d28c09d9194442a5f6523c74e1828765612e76c959c0781d35d3cc470ea6c825b07379c9024cee92a39f703e73992387355721a38d9cf95c43943256706700e91c4395325e755c0992489334f256733700e95c4499d8648e35c0f9cc3989cee855bd805ebd5c7946ce24cc3994c7d45f24aac7153efd7b43af7092873c99230354e7d3d09982324616a0cfe731c30474ac2d418fca71d305324616a0cfe7314304749c2d418fca70d30474bc2d418fca715305325616a9cae750430d324616a0cfeb31830d325616a0cfed302986398981307809998bf8858466f67b11e83a6e0b11259a9233269ac1b3cebb0a44e2b2fecb2f202df86e35a71cafdf647fab933cd7ce3ba662b3d49b97dbdd0d4f86f2db32037d8bf033b1637d9bfddbd1ff2617de799d5a6debfebd657e1d75d673f755bd668b233ec22e35cd1181d2d1ae1d048fbd34d3c70d3bd579845763977b0dcd6867d708dba6854db6b61d043a1ff1f1c6569745f5df77371c75ac27e5b4a7dbe25e7b0d0efcf2d097b1a0e8df5ffb3cbbd546bc963cbce35456649a75210d94ab78eaea357c2a1e484cf625178c3a114bff5f1f8bc89df1ad1e9d3f8f75cf77a79b483dd1db75a7b041bfcded7dba523db9d18cda5a087a523dbe0962db3afabadc30afbb33a7a74237b15ff143bf1c3a1e1dd7c33b2d5f1775d5929f55bed0a68c80f5271c6cbedf617994aff69855fa2d49e27a5f65bae74664db18b85f2ec8fc87494cc8e892899d16c5775d157b1f7fb5ea72b91bdafed3c57ec42dd5f916affb773a9af3d8a9cfeeefb55beec56fab52ee8734ffbdebf9ecfcb945e8e4ad654772c06f3fe8f77c73d7ad87d313ddf17fbc5f6c857440befd576e10abf51ee4fd27fd98c4b71c18a0600 serializedProgramBytesString: - serializedSignature: 97c8b90a2b01bf36501da32f4816ad1edffc2a2e930721ba2fff7d24a3ffee03688c57c05a55fd29bee0b0ae0346f77d3ee486efecd497eb639bcfb36bbe7304 + serializedSignature: 05788dd7c07ab64c266e80a8cdfdf10e99ddd74bbad5347ab19917a83e6aa16e3d0336b173007748d5d9631bda66b8b41c0f0b8d8de202566dab103770607406 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset index 428c02e..ba6e1cd 100644 --- a/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset +++ b/Assets/SerializedUdonPrograms/953e2e6278cc9314f9f2913d9bc25309.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5be9521b47109e15080921409ce28aed248e21c1b002e2dc892d202624c4a6b8feb82810687148094324e122af9037ca1be471f2333f52e574f7cea2d1eeccae56d2088b582a7677ae9eeeaf8fe9d9111193c1c77808973db6c556d83cdb657976ce5ec1d30adccfe06b979cfa4d5684fb4bb8e6a0ed21bb1730123fd3c6185cd7a15462651879c98ee17e4aeddbcc82e775186b41096b4fe0cf825e46270cda65abec397bc6d2c64800893d1a54e27506ca65c4e1bacc7e87568b98c2494c6a4ac3651b5a4ad476064c3bfd5eb07d12eb0cda8e614c911580e611518cff03578364a2db00bfa7e0af0bfe868432defb78fd302ff7b2ebe1ac5b7876fa1afc0fc78c086540c2f8db453b29d070ea127ceca88b768fd03721d4e1bd838f49f372b432e7f5980ea10eef113e664c28238f7ff9f028e3c5a1db25a91be4f5e375d28cfbd09cb0e5bce6d7a1d32f94b1df24c76315ef6fdebcf9376a9055fe0076926317cc44c18d8f59edeee38c0c761cc238c29999a669cb60a217404062bdbbe41b65b6c416a5d63b6e2405be57e89a831ea7441427734df1a7670a64ae005f4b70bd12d4af91e7a2f39d42cb3cdb803b8e3a640be04c2f5c54f660da02b8afc576e07a41f40e816d6fcf2091d04ddd63b680a61d45cea0c601f402ca05e2709baeaf89538bb85f87ba32c5b45710d596e17e45b379652fc2b36cce1d0e999c47793051d5db21cb51d32a4883dc9b64bfef3472131aa1f038c5ddb0d3a408f8874713ef30b4830c06cb754e63c10eab55758bcca4f565cb83607819bd12caed3b08ef7d1f6450dd6992a0a261fc44abc55a62262e17c65480587ea022bd1963d443c19ffd68b433834cbaa13764d0c7b072a785d063db3951c941dff0f023a8b36ef83dd867b05b8ce01bf30817cc820ac28804c24c8c67165eaeba5d5c614f05e50e997290aab1dd42e53c07d97fe56b4778d5606a35e70241ae990469c69bb204cdafd24ba74c2f719e057a5872ab25a1564b544538d920e12e99be29373dd4aa6f27c1dc864ce22768cb417f8b562bacdf048a39981be96569864a525a3dc2df127a6bb6843eb284fb42badc28672a1b89c9104fb4dac3b6610cf62904aca3725c713372b796b587b04d29bc2c88071582719933a0cd0ed4e20c7d6a67e8961146d50caae475134fa98927647aa79deed15be569ce4b86f0de3654b3b70d93453ca8c3dbfcb853d94b8f4cad581c51a5506eb546d56a4dca88e38ca3b518e3b09a70af8aeb7413b8ee53111f6b02f17e15f17109712324f1940aef8906f11e50713d29e13a1e92eb415564996a426419924516b2cbd6ae2865dad563bff02bca7b0c5ff3b84c63e33a40543bba2a3864e1a94875f3ec00be98be21797c16a7adec5bb0a5be19e481ed0e532d75fee0a842d7b0cc6e50b57765783d6a10af970cdf561fb00d6611a765f68b0f761e13bda336d111951cf76472645df855e6b4f93c07ee6d2e4bf0dd012e7103e5a765b5f6c596ea0d5918f94655f2bd2f936f3fa49e6ca9d7483b626ba901fb6dc0f243e09256e1f2810c97a70ddaef1ab7df66797b1849c754927ea89254e451dc708a36be4e2f4b7f8341398a1465ae39d558bf9666d9fab84ad2fbcdd0e93ce7d43e373be70bd12a7f4d8cbc62f9293c79e3bab8a170b7d9b4f2a1249d5049fa914cd21f1b90340b4b6e8ee4c3d64be0135f99db526ec115cb97dcdf754a3ca992f8814ce2c735c5e92cf09027dbb58f011a8fd3416b500cbe868149e1f7d4b3086337090d2c959849b9758655b61f41676338fb1978137acc0e007074bd69f5a730cdd42765279e2ca1de439320296cbc70fc099dac392fe265d205cba43e208a71891c5a80346d346e9ba433a855e7303662d27e67b64e6b0ae602cf70bb3ae436143ed3b4093ca39f4800017ce571c01dc3a2c5141512384bd00bd23922e09c2934e188184dcb0e24459ef6e1071ddd45dcbdb236eb28b2d6ed8dd72bfa290e5d017b588bf4f26e2fa14deddbc6f927a295cf282ca5126ae5213283a176f67f1e05331805f1974c5d434ed0c8a055cce9f4ec24e9cbd698983a1d808fb9e66ae46cb0bbcad3fb6a11a41e6fa773b4a80ddbbc4ed87a386c17ae7d56461f68c3ba404b0aa09937636b0b6d085b42802dd30a5babde8b69b5b5982ed02202680b3a418b73d06c02177ae18aea82ab5f806b51275c090e57f5bb008d6e99d00559a700d9522ba259def5d241aba5a574c1d62dc0f6a94ed8621cb6d7fcdd8c46b0b4d9585400eb512bc03ad10f9636cb8a09607dd60a87f4a6174b6d98cac605d83ed7091ba6176750b8f2bc3e6d3f5b1b1440fbe2666cad1d77002901b62f75c2d62dc086ffca72d5a679191300fbaa150b804580b527587d02585feb04ab9783754caf5eaa0f13da71b36408c07da3133879f6df8e99598700d9b7ad8864e2f193c6ed9236e7ec1100fbaed580b563341b10007bdc0ac0ecf4a2a8db25b501d6cb6ecd094c0613a527aceac0439d3edb871e035c4eacfb9959d49ee7a7f8950310937e5788dba330a783fe34834f27b2a2282efd149aa69f669cb8c8246de4f425e9a315937e86799be55f66f67f07d307cd344d66bc0b9ab7895b900a1429432f529fe87f8750fcb8683f0000 serializedProgramBytesString: - serializedSignature: 57b18cbe9d75903bcfcdf55158185abb3e1c8fb701b8ebafd6734330487bbc13b85168f57b75b1048665f63a41cc902945ba81db3759be75574b7fe560874809 + serializedSignature: 8fd88c28dd70c6a3c05f871502d35fa37895c209df1599d9585ac370be1500369ed5a4c46f1ba7a3f8b563328966985be7613e7ab3ea587830a0415b5658e90c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset index 2420e83..d4bfb40 100644 --- a/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset +++ b/Assets/SerializedUdonPrograms/96ee11c7074d21e4f84d189ad35d45fc.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5b5b6f1b45149e75b2bee4429ad02629bdd042a12e6dbd4e6ff08090d22694407a516e12aa506b522775712e386e6979434242e29907fe0aff821f0312e205cef976361eefceec7a1d4f4843bdf25ee672e69cef5c66e6ac9df1047d9c4b745a110be296288965f1586c894dbabb45d70d3afca7a0fcbe68d0759dce15aabb24ce24f4e4cf796792ce73f4b4239ad4f39958a56b0df58ba24af773d4b74a4f5cba46df2ab572faa9d3b29811f7c45d31e11c4b20b1824e3bb2cc61b99c3c9d6f8a97545b05533c8887aa093a2d52cd0eea3688e9a0dd03f115c4daa0ba55ead31075a2f93528e6e7e9ec40265c5c79ed9357e6384bdf41f99ca16f81fbc97bb54f565ef3f27e4879663a75d9f647c318c329c62884c628483abfcbb67fc9f201d9ee0de539a0c3df118507959723093ce6e4f3a88e67d781a63f23ec2b625b7810e2420a930c7a261b2393ce667cfd9155f2b04d52fb3611d058c432ecad29ae8a2b5a8b38ee0c297cdfc2b9422d6a203a161de2b7c810cc5c9d8eaa62ce3b547e1bdec0065da39a9298a72bf77a24a6c8401f84a8acd0b0757289aa58a2f336e83d22b6a32d934462d30ff759209abe676e504900e8363dd7c1e122cecfc16915dccf51591371629322c54dbabec06851d91b74af1b734942a6e751efa0a6723f0c046a9a2169987b0fb6fa5a23ff854618faec9874c37e0fd1e4e788265e63e8071917139f4f63ca9f7adacaae080ff17e2182607a19a312eaeddbc7fb86b8162b8b1e1956f70948d0d270e3973f5efc7de3cf9fdc76d1ae0a0f53d8c904d1e280657a45673c42215e04d7ed2f33a361f81d1dfc3cbd398bfb08bfdfae8676e91590c5ccd4ae00875782c1a4b9289e504583582d895962a202b6eb92c9658854c734579365b7e9798b0666724b581faea3fd3d2a7b2a636944b7e5ac5c1a1435936f9288260565740acaefb7829223529c82f2bb72b514c41f3d82050382493c9810ecd321c883384fad22b84c65fed26916b535ccb76c5b1550576d89e531b50f50bc8305ff3370128f372f732f87f0d6633d08ac4bf0157bdc9a34d3afd30cd6e84bfb68db5cb7052a156a9bdeba79d17c316cdd7ab88701f76444b864164c10ba1a08cb79b9e509fbdc3ff4710b21c6d8130cc4b33afd602ff88355fd74ba51d2d96630ee16ec91390a56ca0b745d03175cbe2aa7d7f8b1e2353fb28b4f0b630f7bd2d914db3dfb52f0767680f5e6eacd72146679b07836197c4e67f02cdb9846196556c69bbc29879c4721e719ad9cc1dd4deac6ab85e7d82b3d239e75bcba6ec48f46cd7e94d7f1cc71ee98367484290f9b29174c94c7f74a7940e7fbc87f3cda17df5fa49ded175457a1f655ec9eb8fc3e51acd0d84c6f1a23b4b4d3de23de73273a9e21276133e7149bd92b6726cb1ed4e992cdfdb86e7d7bdd3867eb7cb3241ed2b12e38b1f810491dd6d6737a66ddd4c93bb95ec5aa7d4a8a584ece6c39432639ded2c931b38b6c3b4a77c1eb77d0d73772ddec4b3147f5f7a8c6cf5e7049e738f44eca6193942774527edc85b6fc34f0b4a2ab78eec3b52b5457a3789546aa374c529dd449f5496add0516384f75ab20a4fa0db7d0d13379581ac9464c929dd249f6656ac97c6db5db651a59f662c5dd68fa88098fd3264d9b2dcf47608be4f0a5e0bdf64b60b54ef741d6319df576ef99a326c9ded64936bfabe9606e575721fe8e93b5b486a8c9b3d7dc6ecb597825b7588066aad24f1b12112efd16c3b054fe2c58c3d035f17d0c32f1faccd1e1383c5bcc626cc6fa3e7af0d38ef0e0c4e514ab391e7b83ec6b0bd98e0addd53b5aa3f14acaf4fa612db24ae836139d24854e4725454baa749daff8a359f79c9428a0454823a81c3649cfb256fba456331e02c5c52ead29998b77d4d1125f612565d17c027765cc747879fc503a4615af78592189a384731de1512e834090a4edc17b3736ad6982e73116a73b74fc4a2539375366f4dfb50951161071778edaaf06384201e79c4d70c6000e9be90c863605f05701b46b002de786887fdab3e8d55d4a3f1a674730b3bd4026a1017a8fc3711753fc41e3fc3dd5128b11c72a766c4d4543dc6a4dfcfa09bbcc13fffbfff339b9cce6739e41180ca630c489a2cd387106fa0a34b6498dd22efecb619ef6f28ab0d0164d263b11b89b8832a084e10b36e11d96f0f2c06b0037a0cdab646bc0b9b68053e7af0f6c02372e815b958edd0c6d3454e6adda60c11694ae02e5459b500e819afe4db035d8066dc1d6a7c076c9266c67359191996822b5be293e973f5f3a6c76995100be6c13e011636cdc944dac8197b3059ea38057b209de69095e533cc102275d12cea25d5a73fcac02ad6713da098de3c765ff2c82396c0bccbc0266f9208139f50a825950c09cb209260fc4ce3e8b08e96f9d2cae22ad01d6af0076c52660a72251b23d616e7e756ed5ad8fda0236270e4da6a4cc9992ab6c1cf25f1ea218bb92f5530ca35252feadc61d2cd62a44b9826b2bdde0e117173744bacc703ccde45cc03555989086ea3dd3502ff21b3a49f792eb188ad18ac73f7239d4f25f57f59ef1d8f99da91ed85e32476ce19dffc9c6c66474f0f4eaff6b6e1b2d99cdbdd835a791dae9f9bfc2f68e1d4c9bee9dec1fb6dbf478b7369d9ea38f6cdab44fcd5f2b8468dfee403abd1ec232b75a6dc31e5ae973dfc39f08fefd713212a7902433539ba6a775c85a03d50d117c726e704c2029bf4c7dfda8c2736a037fce6ca0a5fb2fb53a883d983a0000 serializedProgramBytesString: - serializedSignature: 1c2e2cf4807c7d93dde76ea797cc09f338393929f03d8f84402c8f0d45c2051d6c9c8b080f147428c0c3751494c1a60c0e937149d3a6d6e551a719e9fcaee20e + serializedSignature: 217ad5f1810defe2f98199c41339a81a7b29852eafe1bf55610956d6a66fc9dfde1d17c7923d0c64d25951f6f7d8208f9daba3251cb5364659bba7f8b5be0301 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset index 168f622..03b884a 100644 --- a/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset +++ b/Assets/SerializedUdonPrograms/980a7697571ae1540827c8b930f79790.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a5b53db46143e32c87708699b92f4169ab4c529010998e96ba7104a9949930cb679c9741c8345e2d606c6364cfad6bef617b56ffd619da1e71cadecb5b4922ce275631a7b2c597b3997ef5cf6ecda290bf0653cc4cb01ecc336ac41151a700a27f86d1bef6d7cbb4f5efb33e8e0fd255eebd8f710966266d26bd9b88dd73d7cea420f679ec311de9bdc5f0607bfefe15c079fa8f5183f0e8e32667152151ec15378028bc6ad1812073ca92bda0cd2cbc8e2750b7ec55e8785222616772de2a58c3d5dee6ba3d0deb8e7f013abd5c6be239cd38116d23c648ad9bf692eebc4b719fca4f153909ee99e177743f417a567fae40664b87f4e7a26adff14cf197137a53959896e4eeaf7dae8332fc9e1c9670abae6e5e5e53fa6c1e8fe80fad6e10cac144d7890c00dbc99f10e40a4d329a1dc32b3ed21d467484061852adbb8079bb0a1b4c21da328c9bdcdd73a8e68325162e663f157800509d7c2b723b95017db77d903c9899ad8b3068ff14eb35ec03a3ac5731f950364db423774a082d733a6f702c50e8e8c5389dccd3f671f69bad1d0c6160fd0337c6eb18465be5eb0a40e4bbf876d3d8ecd138cce2dbcbf666e41dd3bf85dc5b3222053cba80e8ab07637f43c333d426d487a8be3e39d45fe0b8b70aabae1e5188b62c4f82360897718ba49c6e4c5c6a5b1eea6fba1b60db038e756020826d731a8a1dabfa9ef94a9d4716c943e6a74c8e42bacc5c0ca600eebb50916ad17c627317a45a14af44abce22795df34676d92d28fbfa1c29fd7c6f204f12fe31c1ad38af12635fa04eb5d3ffaa030809d160b7f49b13cc6c91086604a81a09d11d58452ac9c4f2c1a1c427c268c786e0cc467c388e7c740dc5439161758bf6b75ac51abac5d2eb21dac800fe167b13c7a7c4f79692489bc65761fefc72c05b51f091789e615edb4853e3e038c2d2e3a7712d48afab5a09a30657b9574c958524ae77ddb429aaf90d705971ae7c849c5c134d5a139cf1cde2efdc3c23eadf2effce413678f4b381a973c7152cdb2eaf341b5651642936634ff30f432aad443d9e1a6222c6c0a8bf7282f910b9a812c341f9e85b22a3e64a5f781b633c37c0ce2e3a01d5caf79227c2bc06f219c5f2e2ca57ea04ca9bf7d9b24a5e6c388df1a43be2e8421f5a10aa912d0f9c189d81beeb0fd9b1c6f95be97d7f0fd12e8fca0d6f77d6a933d485e7493e05c0c93765125edf73ebf95b9ba729e62349264e7e8b33d3e80196c97a2648eea198fa673619ade5669ba3ba2a6bb1cff751ed5419bbde2c2713c9a0e17a349749d0fd3f58e4ad76a7f9df032b79cb7dd2d146977ccd6a4bcbad71fb9d38ff27d5e351cd4e78247af097da8b78114cf592fa23b9813c4699005fd7d0738b78994d43864f06d18147b3b4cb983339ff10c7aea82c5616927581189771bbd982c5041cd0ffb056d34858f20fc2ce93890f7af7aac10a785ca6a6b92dd64ed46afc082472819a191470b91e69472dd34fd98acea1d7fa62c4e262b57f4a67829686b9b9e51fb50f2dac125e0adc26cb21a9f9c3444e28ae52057852a0eab4cc0db708fe1009564fc0ee56b707aede29b5e14e43ee2fe15695c0775a3d683c188b8c139e835d7cd1da6d7f04708a7e7b74df24f650f2f29bc649062d5a9d1a6aecffee7d9cfa6ec7797402878c9c2a664b1a433a2f36cab9aaf98d8f4f3799303b3dc5084674651e22a513ecb51ee42f6b94ec8d43b146d802de8022c2b01764f276005e163c345690d6c7da099ba400309b4fb930fccf5290ccc9404d91793876c630a219b9120fb5227647302b2603ed31a9eda725a5a02ee2bddc0b5f0810878c72d1dfe7604bf4ca1c7e525e096750257141ed704f7bf2e75710aacd5dfe674c1664ab09574c296666a75ec768ff3a60faa8c04d5039d50515dd3e0df3deafd9dc1f405644e82ebebc9af9a1a83511b64fc97b2ebb1cfb7699fbf229bbd144801a5909d48491901ee16fca6c08272ee8f4ca52e36e975693b6e9180c63790ec8c2a9a66fc5e99fea6d93f45f0d9b035361b8e63ffafd2f44dce028a1156b1a856bad6faaf82fb2f4e7e919b2ef28eb12a9d1f3dc5c10d168a5ee6bf3fca3989d82b0000 serializedProgramBytesString: - serializedSignature: ff7c4c3f9eb37843705fc9b3f9218639134a20d0ae39fc16444ac4c834441d586cbd742af6b4060c0f4a3383c17cc15746fbc513abece96475cd0ce1c84dd705 + serializedSignature: cc74fd24c37132c84dad9214e8a72185a5f05b6d975a64ffef392072a77ff1c370bcebff16f1e3c9fd6a601c9ab792108276390d25512192ca6f54195ff6190d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/98f9477c31453ed489ed3e41301ab8a1.asset b/Assets/SerializedUdonPrograms/98f9477c31453ed489ed3e41301ab8a1.asset index bab08c4..70be3ab 100644 --- a/Assets/SerializedUdonPrograms/98f9477c31453ed489ed3e41301ab8a1.asset +++ b/Assets/SerializedUdonPrograms/98f9477c31453ed489ed3e41301ab8a1.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c49771b4510eeb12dcb6b1c27dee32dab1db248b143d8c9623b8e211bde200448144b760cf282ad84e406571e8f1387c0990beff1b873e26ff003f81f5055d313b57aaa471a4badc5447e9ed64c7757577d5d5bf7b45d1713f071cec26559cc8b29715e2c89a4d8129bf06d0aca0df871efbce777c50e946b704d40dd59319aa7277ec69c3eb8cec1ddaec840cf276205ca75aa5f1029f83e077d5370874f57e13705ad9c06e8b424a6c51d715bf43add79482c53a75df9cc41b99c26b85e13cfa136454ce12031aaea85cb02d4ec52dd0630edb5bb2f3e27b136a06e05faec8834d07c44149bfea913f445b84544968db28ccaef43f21e5a8b66ec27bfab7d1a64d924cb6ed97758b9c7363fc9fb6659b6c8b255966db2df88bcef91f7a3ca3d96edcab8587fb4001e0fb8ed9d8680b67dda787d9a7cbdb2fe98728f3493061cbcf6c7b5f62fe4fd41a59f8749a7cb73ddaf05c834a0f13ba0f1d12feb4f28f75057d765e0d7d43e23ef0fc9fa935a3f95ff7aad3ca2d41d96fd4f05f40f9257a73da8f4ebd268e7d0893834ef37c02612625bc488f06951b8abf07ae6771248ba112ff819a36133608edb4080b1d425f20319312926584bed77da14bea7e89a8016eb4474cc3fc49fbe2190b934fca41437b30bcf67c94ba1a359879af3e22694d8eba1b8008ee3be466519864d83ab4a8945b86e13bd87c0b6bf653e91d025e97de681a6eb3137e08907e836dca789c305ba3e254e53c4fd1c3ccb90ffde040f7e0dca67349a5ff61df8ce8db92821e379e41da7e9b9eb9ebd699a066990fb18e9e9ab19a9c48c20f48d63d20c1b62e4e9bef7cdc42b0c5d27830e764ed2b840903939cf26448c7cf0bc0fc1f032fa25e4f5dbc5fb92b818280b8f0c4ef71192203bc35f5efee3b71fa637ae4472459b14314a7906f38816042cd21b777a7c14824588441ae2c8a80ebfc3c18fe998b35046f8dd76ebd42efc04345264ca9d004a7bdde0790b9ace50debd4b0c4e11432e6369c9ba6f9ee248344a50fb03693e764d60d7716037951becfcde2508eca6977265c1c60f8f60b301c17c3c9810ace710a4acec33ab08fad330efdb35e8fb1890784ab1f509f4e7d2b6604c7169724ec394c7b395f01c6593c9701c99106ee0106e29bf4370ad2b9d27baf078621a3b52b08eb61bad3c980713821106c1389acd01c674fe854fa459630b15da40bc919b1e5ad27e576603e0d72eb3b4bd91127700a02f65d2e98dbb45092772e425aff350ae1217f87c45021d3c56f0d477bcc4278b710cf5c19909b102b32f05aec65b70de22bc527692525617cf26858f720a8f0f0f718119f778a6c88456c45730e639f85d02ea38620bf0874139299f67c3f6a8b84ac1da672b51b3ad34717ca12b3b6cf20f3af17633f1668e384e6817a38171d4c0eeec94ebe3749ac7693181dbc3818b5c3d50600b0f5aab09b45e06b45f7eeebf1c06b436ce7bd106db6645bdd70c5c9f9083c7ef4fa5ad2cd2d8d934af18bf84bb7b438cca99c3523f798089023c4029b837d976bb491d06781b0aa50e073875a0878b65cc35b06e8ba824a06df86c03371dcfe848f0733a4873dae7132e3f0ba6f9e9e020a4875b55910f609abf0de36614cdbc0a34d7807eb1368591a45e8ff5b4cd3d19226e16c7e110b9dc946275eecaddfb9ca1fa47727e15051971d08a56e1760b1e6634b730447b7c8f491d923ea2869c6198b4ab7cb29b74f2a0c9678cb03ee3dbbfc2f88c4e8e3882352afcd9f50b8709ea01d9f52153b03d6a0ab66a8692081d6c0f9bc63bc68dd7c106f75952a147d42cccd85da6b18f7363b7d2d85e9eb6d731bbb931d1e19f607da84e79d04cb9c7a47327f938152ad7eb35b17daa58b6fb4c6c8f9580ed7e13dbe3c5b23d6062fb7409d83ec211475b7b4d30db243ae15633e14113e13345121e3299d259ce94ee09cf417b6e5575aaeebe1806e2557af9868178ee65cbac9bc6051cd6aed3931d70cd0fe007dd4206ca2c9584f2de67119e3ca3fa07392155ddcfd4eb96a1e73a8c1ec6cc874d789ce3f0981642e326bbefe24ab505410a1ddfd7d021410911be82f44b91ed1754935b979b7a859172c424e5794eca1f2dcefa02d52681e213920be966fb4c439906aacfa14c52db15a29a84b6c19a60c6d02c497631c22f454aa15fa326e4631cf2e8ed3070b95a33435cacd386c8e2cb5418b95a93b6e325c841fa1586dba3266ee31cb753055ac355c02c4932b9b65d1a6bd8ab8cc74c325e28c6e26f921decc23cb99970a52dfeb849ca094ecaeb054a3947ba585dbeed8449d2494ed2d902259da5655b427aba6a99d59326592f72b2c68dde04fdec2368b42665be29b6187fa76ecf96c2179e3271ff3ac7fd52c5a250e9728e28fc38b4209911ee7bdce7e22ef5c0bb5d11a325625c14be0cc6b13768919e06ad4cc037ef9d4f30854bc27cfc6a55e8db2f7b3d89934f0a6ed6ce2bf3a64a57f8968bffd451544ae4d102a469bdbcdf247d0367b541ce6a5d8cd6e867f6a84df9b9781347abe77528fcc90397c06df92a48be0e58d716037947517d1437ca3922e0ed4a95e0dc21aa969bd0ecc8908fbe371aa98b23fa6fd984a89120c2ee0968521be008059cb7edeb8fbee3540b10fdee64217aa73c26e66ea42e1150b500d1dfa445d188465c4f5b4b7584b4d0335efec0d341a1fe19bdc7de217a493d10d16666b571feae1a48c67d9e66dce09ec70d3a356e30c76c3ec4e73171cc87defb9fa72a714c55de471086bcc84ebee1b24ddfd043f3e5cdf026340a5acfc4f5f18b3925da9ce33fda0b116e2f3ea447894457ca01e58ad4c54ce072c22294515b50461528af5616ca5ad7ca2605ca6b36a1ec9550ae194d5c65df2a98cdb6c0ec54c09cb209261e0ed2639ef732da1a6cc3b660eb50609bb6095bbbd4411c7895f4cfa38d5b28d6808bd8024e28c0cd54d20fd6bee9461428af9703cac2129d891a0c29030a94b336a11c66a0ccddb1359ff37f0069b835685b6d413ba8407ba392069f9b435ad4526b39e42105ca399b507610355c87e2e141ee2faa6a4f0feb15f03ea8ac1ed6bab76c57a0fcb07a028f45ef680dca3e05ca9bd5a395b50865ab02e52d9b508e3150167362c662eed96f0bec3605ecdb36c13ecab80064224329d126b872f71f24ecb7e4be4e01f84e651d839a365dacc1b4a94b81f2ae4d283b8469adbe299bd41e788e02de47d5a38716039435285b1428e7ab27d64fd660ac3fa840b960134adc1ed5772dbdb368d98357d6001cb405e00105c0459b00ba7be8dfd0523223bb5da7e6fa2176efb86eed69638302e6927d30cdeba1dc539256131f6b9ad9ad80b95c4d605a0c39d6c0ec55c0fcb89ac0b4b8ed610dcc7e05cc4f6c8259dc26b145a3b7b639774481f69e4d68c365991653236b59e66105ca4f6d423924a1cc8006e239a1fdfe22a35901f67eb5025b8bc64fff8b6d7f9c548ce35e03feafb246472ac778012f53dc237e9d525efc7f3db704ee7025807e82caec71bf18fd91f52511eec07a30cd42cee2292269f3942ed93c95e27c21276931670ddb026625467f96be9fe5ff42b8ff09993ea8a6bd74127509663e29ffd2eb0e344e1253f889fc0719a5e73a3c5d0000 serializedProgramBytesString: - serializedSignature: f086d164df801d3d687aa2a650b78e5be0f1b89dcf5da0c187c3f7f51bcda569eb9e945f4817297db16eb004964950e108ce25937bb4b686ede7c89a8107f603 + serializedSignature: e504643cdb39babd5f31bdcc73941a8e66429b69717d9f01b64a950f586e2fa5c09de3377226a216f17fc42b31c2393f670e4d1edfb922b63f887a757b63320b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9b695472cc2e88545a4e1ab3658a29b8.asset b/Assets/SerializedUdonPrograms/9b695472cc2e88545a4e1ab3658a29b8.asset index 6f9d387..5fc1fdb 100644 --- a/Assets/SerializedUdonPrograms/9b695472cc2e88545a4e1ab3658a29b8.asset +++ b/Assets/SerializedUdonPrograms/9b695472cc2e88545a4e1ab3658a29b8.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: 9b695472cc2e88545a4e1ab3658a29b8 m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed9deb5714c915c0ab81e12120a2202a88f882411e3380804f54d075d95d1f51200fb3518451d91570757435efc7e6b57927e69d0ff9982ff9bef90ff69c7ccc97fd13f2613fe7e49cec39c9bdd5ddcc9d9eba3dd3d373b1dbeccc61baa7baebd6bdbf5b5d75abaaa7a94a29785983f0b1a0aea91935ace6d5b25a576bb03703db5578dbdfdcf4abea216cefc2e7221c1b543d4572e2abcfda059fb3f0ed91ca42cec76a09b62bfaf8759581fd59c89b816f987a07fe327096550399e6d57975455d561d567b11110b3ad32327cd42bbac7af89c56cfe068462b8585a4f4a10ef8b80e471ee963aba0b47bde0df5a6366b158e2d419e87ea3ec8bcad25d67f04122d6d93fdddd9d6385b94dae0ecbbdb5d64bf83a4e17637fcd5c2df49f21d65659def554ede7a679f9655e7e43de573aeab5fadb3dd63d0af93ecef2169b8edf2e8d765976fb5f994e996b5c5d93f5d827ed5ceb6dba0df3eb2df4dd270bbd7a3df5e47bfbfc03601db0f9df48447a69b6fca93ef631f5d5d193d4ede339ef4fd44be6b4f9327cf59cff16667dbc81cdfeaa49f0bc0f0a081e121b27f90a4e1f68087e1019b45d5c7b66dd5ae0d5e866ebea9fc7cd5e912181e6618f6fa3074f3700c5b2ac8306960d84ff693240db77d1e867d368b9ab46d5bcd5586a19b6fca93cfeffa77651c61180e1818b67af278196d77b6db98e33bca60386460384cf687481a6e073d0c076d1689ac6d5be239c3d0cd37e5c9f741090c530cc3b40f43370fc7b0ad820c470d0cc7c8fe2849c3ed8887e188cda2f603dbb6da8f18866ebe294fbe4f4a6078946138eec3d0cdc3316caf20c34903c363647f92a4e176c2c370c26651f7896d5b7d17c3d0cd37959fafdeb5c18fe17186e1091f866e1e8ee1ce7218262c1d75bd0a71d0a27aa0525a516ce54a0d0fdd9cc50343145d8b1ff8eab3ecb0e71964cd98a2b3791dfb65a1a68f1aa3b3dd5613d17b467f2ec2192b5ae87461117f2b280295bb0fef0c092d1f41fa451d996270b9024786d51bb0c55cb7e032b901ef7c290b50ec7d084f336a0e3e1f6879b740edc2338b998461a837cf35906947c9ab90e2027d00dfef6b0dafebcf275ad38cd67e16d2b23a665f83a87d1ab64f756985b63f847d5399730e32b38ee660994bb74372d74de7c11ad43ea5ebe6a71e79111e41f4b5d3ce655893d2a38bf70b3cf12943bb91c18679d69131a291597969a32aa5dbee6b050483db5868a1b97edbbc27a053f5b3c54c06dddda92dc879787aedafff5cfac7bfff9ec8376d4ca5f4d0aeab88697e60515ed2da5920c1df8444a2268d8a7af15b26fc382cb6ae6f227efbbc157d5e7007d4ea9e29df011676c773f0f5b6562e0bcaafab7755813fd298b94e232dec308ba9c541ad3241addf6ca8c55b113fa8f51b76e5a0e2cb4cb08121584c078e60b589a08ee2be284ab030dc72f7a621ef3d20f144f7a18f21bf293cf3678ad339431ea6669e8d9a678f31680ca61147b8c6441815b4964509cfa94bcefc27f61f1938928514cc75cf499f87d804eb0d5a330f12ecf0933bdb9f7853c9c49b35f1a46e352aab21e78184c903e878ebd6a6d4f1eb103bbe0ec716e1fc8c8e4f30fd2a485c84b251de395d42ae56e5e7f027bfb564f22d9afc2152d7c36ac611af35116f92279eab2317f4d1151d79dbad2376dcaba0f75da7bbf73bd79ff8b69289b76e10af94661cf13a03f134266e3729dbe051164f6404d79b0463e20e43bff55f7815086fe0853798ea49f366f7df57a07f7c4bd9e3b6e0fd775bc9b5a19de9bb8b95cff97c8b891e360756e6855c65f60878dde91ffdce426e97f412d7635dbe3f610cc1ab3d8453d898e9c99eca6b83d180f7236176698776a98c1a9cdb1bb94b1d17ea0ac2739470bb8cebbe892b65b7a9146c0c6ec27b0cfe1e90ee03974a6feab445671136880ecd9c0e7b4c3ab4383aa4e10fcfc6d2ca2f7b2b5776a7a9ec4652b6bdc23be76810a4cc16aecc2e539918ba639d590e54c63653a3a113377f1aa0bc0113ae7f76781b5cc50d98ba95df283ee870a995f3d03ebfab62b4a257c5764e871e930e6da466626bb3a419a23fd1fef2b5d8c169b1dfa44513d1e21c58bf0cde5872fc19a4d43653a9587b0f182ac57f4cd148372fbc9d137ed0201c3bdf20c27772c20f1984ff2ba0e61da68b5ad7d53ba21735d79d79239acac502b8b05e5ab4d5ab2f7c5c4496d0926b207699dc8c9ee83329ee75712fefe2dd2617eba6606e13db6d3cb6aea52cc2b9c1db6e1cf60f7827bbccfeebd7fedb55605c711538dfece17c7324a46f3a39c1032105779904a3d3078d1cbd92fb79c97b39c94361257773308643c2d8c7094e8514dcc335cd6943d3ac02b6fbfb4dc2315c1c2945eb165ef001ce83a3613d7890033d1612f4214ef0d190820f731e1caf80077b390f4e84f4601fe7c1c9b01e4c72a08f8504ddcf093e1e52f011ce83272ae0c101ce8327437a7090f3e0a9b01e1ce2409f0e097a98133c1552708af3e0990a7830cd79f06c480f8e701e3c17d683a31ce8e990a0c738c13321051fe53c78be021e1ce73c7821a40727380fbe12d683931ce88b21411fe304bf1a52f071ce83b315f0e009ce83af85f4e04993609c04785d19a6127065c03c52a3e3b9613dddb00e839e9b70ce3b9075518f0e300f1e292ea1b4736ee68d4ef2c7264126364e710cde3031403fe7564fe794dfdaa94d0257ebb2cec4e85383e6f40e0cefb10590b612709af13467cf25933d53ac4fd1828b7a7aea015866df4147ed59da985ee7bd3a93774e58cba638cb2e9b2cc3a6939618a48e72f9fc8e54aa3e9ee1acbc62b27254b96bcaf9ebc3dc7ab26df95dc787a6a9516a456eaa36880567390bae9a2cc86c58e0decf416fffb53540fdeee81b75f13a9bdd38f3827aa2ece9d46bda0f19b0f0893e7bd8b105edccff2dda829e745dd9b86fcaff7a2cd5dfe5d4e7731ca7cf9838cd0b735a837367a028b408e5e6f254aec5aa83b765d9b1c79a96f20cbcb3ae656541464acf6da7372c2d7e233996bd0a7ec16b2d772f5cf1dbca71c985bbadbc70e6b6dc3b8c8b5961f2da30f11bb5aeb84dfcddd4758e45ae2c20ade7f35f364b3142a9ad77bc5a95d2cb0a0365d6a6e25ae0f46f6db5b90e05bfd3d2167059b75120005739ecf51a1c83e52e92a2e514bba761480b706fbfadc02f2aea36347da8ddfa485dad55aa2e51956ed7c18520a4162de0311cc8ead61d6d8e1faee775395c0b92b870a093bf564e0304f7b43820c3978becb392c8b61a6ad878ccea57532207eb73d26d56fe3d18186e2cc702d27b5539489f9784d4580069da09f1e280e9ac95c3f405494c0d1b45c7ed72fbb03a87e88624a29d05cdf9b46ea1ded6639d75bd14bd4cc6e07180f767ddb0d7253cc25f29105e991ffd95faab9cc2901a438f0bea29a887a959ddce79426c7de349d434c71f976c84c8c912438264e0ba96f469e7926c4791642efb64d17e38c906ccc912a2c4dcb8d43c9e4ce3b8f44df5ff3d644ce390f14b08e1a403c16ee36e4ab6715d4ebdb3fdb4062795363b8cab401e5dc2fc22b121afe5eb2dc5d0725abf5195eb3a6e6d46d7b1e4d44befd466fe144f5a0e659d14ca468272319a3574248635749860bd1d9d1a3a1ec31ada4a502e49a2ec2cb3861e8f61fdec275097a308f5580ca12609d44c14a14ec610ea2102f54e14a14ec410ea4102f56e14a10a76546250f711a8f7a208f5680ca17613a82b51843a1643a89d04ea5b51841ac741e91e02f5ed28428de3386a17817a3f8a5005c7fc62503b08d45549a83d06a841eec212c5db2285773fc1bb2689b7fc29953846029304ebba24d666072b167c47437565af142ed2560e5c420a9c22e01e4882c32beab661b923f7f0183178ad52f06a09bc7724e1159bc8a3ca8bb68b0d5228eb09ca872f1265fe9ca860ac293627da4c503e7a9128372d186a9742d94050662551f6187aeb60c190e0a48858307482e07d2c89b7fc60288e23f83182f54974da52c10966b1b6740741f9ae24cafd861a8a4a64f5133bd7d46bca7e7ef7cbd6ef5711c04f25016f53b99b6f9614fd4955ee094262f83aa4f06d21f89e45e752171c428a5dea2d04e597a3ddd70b764a627d7d9ae0fd4a34fbfa38ae2b1d2358bf2a89d57d3e61e1c4c79af9370f31b8e42d02ef6b92f0da0d75920aa4bdb8e04c7cb714c8c304e4d7a30252301c1203d943407e232a2005bb1b31902902f29b510129389b2406f20801f9ada88014eca9c5401e2720bf1d15908281ba18c8a304e4772441061bf308f6db6201501341f99e244a9c93a60fcab8a41fe961affb14fca8aa72e01aa5c0551370df9504471f0bee06da9b34692156ebea08bcef49c2eb31b484c146da82eda3d8487b9ce0fdbe24def247da71bc31668860fd4174ba1dc13b8cc51a80ed04e50fa3dd0008f6ea620d402fc1fbbe245e37d2e46a6adca735da08c81f4505641ca735b611903f8e0ac8384e6bec24207f121590719cd66827207f2a09b2c3d0055181f90f3914bdbcfba560ee26307f162598829d8e18cc2e02f3e751822978998bc1dc4b60fe224a30053b1f31980708cc5f4609a6e0285d0c661f81f9ab28c1149c5b17833948603e8f124cc1d1b918cc1102f3d75182297803a118cc0902f3379230f1b70874863d7ed3160982eab792a87a0cf52ed8ac90602824867780e0fd9d24de2d9e9ac83c13b572c89aa590d51064bf9744166cca573076149bf2ddaa5e9a6712a6d15b7fc0ea50e354876491f5cd247b4d240bdaed6409bf94b31fb5d7eab0c3ff8a7a49e1ade28b70d6a2dee61ebb9742ff59d80d057980b7bf4c24e72fed8f88c7325f2df72be6f34a3ce7cf646971fbf8fad3e4e39594feff9a2fb3fd7f42bf3b6ed7d5b4433f11721e3c6f0bc7b5c087b08f4ae12bf13f357b558318990000 + serializedProgramCompressedBytes: 1f8b080000000000000aed9d597713c915804bb665c97807bc00060c181078916c636cc02cde00cfb0052f99849980b10578c6dbd88681ac644f261bd9f7649290f59cbccd4bdee72d794b7e04bf208773f290d4adeeb6ae5a755bdd6a5dd34dc63e564bd55db76e7db7fad6ada5e592a4903f910ef9322dae8b11d125a6c49c58164bf2dd883c2eca5fe393957e4daccae35df93a23cf7588d63c39e1e770a459be8ecb4f6b625de6bc2f66e5715e9d9f1069f97e5ce64dcb4f907a47fea5e555913299694a8c8aabe28a688a34e41131ad32ad996911a857242e5f87c5237936ad94824292ea54937c999067d6d4b945a9b475dd0df186aad6a23c372bf3ac8a0529f3b692187f5221d41b611c2acc639979dc81d2b698c79d286d074a83e32ef9572eff86d06790b56e7e2e31f3c6cdf7b8acb89977d8e15aabdca8796cd1e8b71ba5b5a03438eeb1e9b7c7283fb2dda1cc4af3b8d7cc3b62d3c14a77a377cc3cb66af4de87d25a511a1cf7dbf4de6feafd0f8732adb2aaccbca32ef42b358f6d1afd0ea2b4369406c70336fd0e18fa95dc3238953c36d3cb6d32ad7c63b67c4f1d74b5641c32df9fb7a51fd6d4a7c696e782ed7cad79ac26ced799e9173d303ca2617814a51d4169704cd818260c16a54f0d86a51f100cad7c63b67ccf5c306c2718763830b4f2500ceb8bc8b04bc33089d2ba501a1c3b6d0c3b0d1665cf0c86d138c1d0ca37969d2fdae182618a60d8ada9cf365b1e3b23cb0f6d25ce3714c0b057c3f0184aeb456970ecb131ec31589477180ccb2f110cad7c63b67c2b2e18f6110c8f3b30b4f2500c1b8bc87040c3f0044a1b406970ecb731ec3758c4560c86b12704432bdf982ddffb2e189e24189e726068e5a118361591e1690dc33328ed344a83e3a08de1a0c122febec130fe2f82a1956fcc96efb90b86670986e71c185a792886cd85308c4654b47851c66f3362452495a2d063b80d6bad9cf9035a105d0e2ff0733862846b8f64d6b42eaa9c5231ebbaf41a3ddaa87247a40ae93da25e67e415f34ae8786e117fcb2902945b90bf691412afc9f40b2aa286a0785e9ee91297e41172dd92aef686fccd96322d8b5d9061755a4ccad71525ef96543bf7ca7c5582f0d99ee7ba946944f78b32c502ba223f2f280d27d4eb03a5695a693f2ed3d6d55863498e3686e5f1a12a2db7eeabf2bdaecc4913995e477d904fa51b4309cb4ca3b236a07d52b5cd0f2df2222c02e8cbc7cddbb02ca94645efe658e24386869381c1d7b829a35b218b64a5f588a41a9f5dcf21e8bd8eb935d4b76f83f771194839d5454f06ccbd4bd52063e1e1a5bf3e9bfde7f3bf47b3abd62b92aa5b6ac9533527b0202f1169cc91e05c8568b42c058adaf14774f8d5f0736213f11bd7cdabebbc1ba05cf54cd9068840773c293fde56caad4be597c53b22c71e29c81c5348733bcc7c6a51504b7450e39b0d35bf1771821adfa857062afce809561004f3e940112cd5115451dcebac0473c32debddb0cc7b4f9278a0fad0fb32bf2e3c73660a616ea78da99e67a5e2d9aa0d1abd6944112ed3115671f81c2be14971d99cb785fe232dcfaccb14c875cf4c9f92b109b41ba8cd949460849fd4d5cec4ab5c13af56c413ca6b145743ca02518d055260811a9dd21536a5415f4270b9ceb46a2af4d6a6dc3c1332287d559e9b91d7a755e003e9d7a4c4195936c81b5225649a6b760e6793d6ba36699d32691bba89fc6a469932a6235ec54f3cd3f8c6d4d97915d21b6e17228245a9f75d338e70bad69978bd6be25b3788174b338a785c77f38019b6b9b97962f4cd53a1130ca56dd77488ff953f39c22b68e15b74eda47ab30383abb2e37d53180342ef814183ebd6d0480405f9caa76c5ea9a3a7a6b6377fa8505850052c9a5c0755cdc229d2f71a5255e9e8a989fff40bf151c6c4c4b219b6385d05e42eab15d3fbaa7c67c6b0ae596a639c84ae40cdc1155f1b08d2ec2f51bd41772a83f2a84199bd9a7294b0be9b336a0209b70bf09a3554292dba52c047df94bfbdf26f0575beb0f27e53a5cd986bfa5e74a8a574d8add3a1d6d42125ffe06a28adf0b2eba8b2f7e8caae44651b1b06264d0dbc94594f95b95757268ca8a0cdcc792a63abae8c1ab399db3d197cca11de4c0bdf4655609f53a3e9296aa3d94ee9b05fa7c3766438b819671552f091e02d0bd7a281d2e2804e8b2aa4c590acfd9c6c44b3a64bf0526a2365dc368d71ffa30b751c8cdb44093fa811bec563cb69a6841fd208ffb747cd77688427d5cd7647bc888ed21e2e15afab84ed16ee423918172722b0dd81434baaefdaa9333358e2884e71bb8913b48977e94cac7cdd24ab89edbbbc9655770fae7fa9806812ccd16e8f26f5f66b57f66bcea95c7e1528dbb450b6e9f0699bdd94e04e9f82f7e80483d1bbb41ced92db69c97b29f79d74a3b283876ea558a47cb2d84709eef629783f05b9c72fe40394e45ebf92db2818c77cc2384809eef329f8904e30f47fb0e9463bc0f4d0ff1dd6098790b5df8dd675b4e00465c101bf163c42813ee113f4514af0499f82db290b9e2a82053b280b0efab4602765c1d37e2dd845813ee3137492127cd6a7e01465c17345b0603765c1219f16eca12c38ecd782bd14e8119fa08f5182477d0aeea32c3856040b1ea72c78dea705fb290b5ef06bc1010af4459fa04f5082c77d0a3e4959f0952258f01465c1577d5a7090b2e025bf163c4d81beec13f4194af0159f82cf5216bc5a040b9ea32c78cda705877482218eff88d0ccd7c0da8e7e388c07cd5d6a4e67598e2c6fca6bde965967d4100cf2c099fc12dc5d73336b08983d00f4323619a6185cd73100179059589f144ecbea0609586f5d3727671f6a34c79b73ece7a6a5b4798f539d23547d2674f56913d943e9cc9a8ca1fda4d4c049437cce8b96a39496933a2dcf902d0f385f5033952b92bfb10514539fdd5888a0dbde48d6357ef98f51359bd2d56cd4c6dfcb9d44e5733a53acbbe63c55cb695d2d7b84b577217b1f02b56fc1a8f95dd386ba59727d9bf552830b540d3eaaab417aa306d68624bc7fddd000f4bba3769a833718dfb8724c3c10c6ccfa756587b4ace1037575975917a867f643a0d36afe7d7e63e39fb3d7706bef42daf3458ad36b3a4e53cc9c96e4b523b228a811c8cde4299e5f8dc9df885adc1a53925765ce6b2a077c5a1349b5e093daa869fe2721a0ec456917b8d7329b39f33f17f131413f17913b895fe816f97cb5d059ad0bd90dd72e7f9de8c70162668d2c5992b45ad67ad96afa71b06a8569d592a45a346b2fb035e5d7e2069456aa6f43deb70a1b02ae281f2505c08297b174071309999b246f39f9f6ce742a01d6fef1223c1214dbd0745599754dc465522c5a9202feaf7342aa5502eecb13ebcabb439dc387eb523c83eb0d4e5c3082ccde55800384cc127118a0bd2732d03ec109adde119a755918900984ec2627b21acd6dd917b29bf2836806d62d6e479fbdc50762b4b950401a2ccd409ae18454990369d88c8bc380e9792483e93627a68a8da2c376bb3d2ecb209ae544d498e3ce8795877a4b0d1097d5568e393471110678afa9f6158bda849fcf115e9c477ddd3e8b973b0e81786d4c3c94ea41eabaf273b67189da721634cde181a78d7145c2654890701d6f253cb7ca8483474c905d4a82701089bc3d76821c8f245c04e19961bf7eb89e82613fcc03fd3f8fc8533022878a960f99100c6f7897d31bb698edceb0d392bcc8dd12012c13db74f1f3c47245968f4cb8a968217e1216a0ad4ee6de667432b366bbb4cf1c67cfa0a5f850c6b850562394f3dc91df8ad66bb241abe6821645d0de0ce66ddd1dc2db3a89b0be159cdbba2f84b7f53684728113e5ae025be88910b6cfa308ea6210a10e8410ea110475298850fb4308f52082ba1c44a8c74308b50d415d092254c68e8a0dea3e04f5ed20423d1642a8ad08ea6a10a1f68610ea6e04752d8850c338926f4150d78308358ce3a89d08eafd2042659c286183ba03417dc009b55503d5cbce4056bc755c780f23bcef70e22d7c4a258c91c000c2fa90136bb589150abea3a05ab2e773d7c08b072eca054e20708f38c1c1aacb6dcd1a51e68bb3d8e06de5821743f03ec9092fdf441e569ed52f5670a1ac40283ff5225166cf8932c69a6c73a2b508e5a75f24ca4d0b861ab9506e41283fb31928716ffd722dc0ed45283fcb89b25583d25b5cc938bfc416579e43783fc789b7f0b8328c9321c710d6c7c1e99618e7ead91c400342f9f960b6d030ced69f4658bfc089759f062b28b1aebea87b49bc228c7fdbf1b245a62508f0173901d789cc9eba59811f44cd7c051f1bbe9d5cf8aa10be2f05c783324e72b079d07a84f2cb9c285b35b7bab7108ab1af670ba18e23bc5f09660715c695cf1308eb5739b15adf7f9b3b35b7a47fe82904b77c04c1fb1a27bc064d9bc402712fceb856d4cc05b21d81fc7a50403286436c200f2190ef0605246377c306b20f81fc46504032ce77b2814c2190df0c0a48c69e9a0de45904f25b4101c918a8b3813c89407e9b13a4b7310f63bfcd1600d52094dfe144090bbbf8b98dcbea8b908c95c99ca72a8b07ae920b5c2902f784131cfeb71356a0bd4993166cad2e8ee07d97135eabc6137a1b6933fa47b691f62984f77b9c780b1f698771eb5617c2fafde0743b8cb3ea6c0e603b42f983603b00c65e9dcd017420bc3f0ca60308e3e3306710d61f7162b50278ca01847db6a81181fc7150408671b6682b02f993a0800ce36c513302f9d3a0800ce36c511302f9334e904d9aae070bccfec65dd6875adbb9600e22983f0f124c465fc906731782f98b20c164ecc1d960ee41307f1924988c3e930de67e04f3574182c9d893b3c13c8060fe3a4830196792d8602610ccf782049371fd870d662782f99b20c1649c416283d98360fe364830192736d860f62398bfe38489f7605a176eda7206db98a712e17bca890ffe312b5e440bdfcc643942f57b4e54ad9adbd6dbc42f6324c986b71be1fd0327de2db696487cef7908be84af0c21fb2327326fab3a8ca137dbaa4e9d7869be773805d6fa133487a8d91c1279b63024c87b22e1f0a595891c9f9e70f128b7f105baf526d72579e565014f8accc8ab66d431f365ba49b06d04365f7bf9af27ce3281aab3b43f03ba88fe4e5a285a7b28c6b7f7ea6a9abf7e74dbaa72b04a12429097bafe7f01bb9b6657cdb44935fe2969794338ac04aecaf7a014fc44ff075972e705c6a50000 serializedProgramBytesString: - serializedSignature: f33fa33ff07784982a1b99cda23edcdbccfa76322615f541a0ed6b9ec69fa67a4fbaaf879f2753fd483dd235a03c49deff6302ecf138c346ca8f88350dcf3c0b + serializedSignature: 82e01c0dcc4d6c6033bb567f3109ad535128a6f9c7d7616e0eee272fb03bba97444b5f8fc85ef47fb7759fbba7166102678da1efa67ea43c5493f922bb35240a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset b/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset index 85d67cc..74f2f89 100644 --- a/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset +++ b/Assets/SerializedUdonPrograms/9c35d0daca8026640ac57db646fe3b2d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c59531b47109e058484b94f81c1181f09c4c648808fc43931604c7ce08044123b2e2c1b81957005b0cb7e4ce52595ca1fcabff0631ef2901f909f90aaa4bb77168d767b76b5420312b128edeceeecf4747f7d4ccfec889a84808f350a8765b128a6c598488b55b12db6e06c1aca4df8b3af9cfb0fc52e94eb70cc40dda8180a68899f61ab178ef370b527f6a1e54bf11cca1cd52f892c9ccf43db2c5ce1dd35f866e129ab0e1aa5c58c58100f44dcea0e20b14c8df6e43d0be5b26270bc25de406d9698c24e12541587c312d4ec51dd2630ed3cf7583c21b136a1ee39b4d9151b40f319518c0dd5083a1176119165ad2c916a3d7c07946b94e24f791d9525c2d1e06a7b4a96f5f27bc655dfa8b4e5ea9b6419d3d437cbb24153df22ef0fcaeb3a59b6cafb67e5758da41193e71c0e6db2ec936d87946b2c4fcbfbe7946b2cdb65d92febcf2bd7c08ff5d6eecbfa43966f5dbc76b878ed9465972cbb65d9239fbbe0a2f74b113216854bc422ebbd03f694113b2241443e10c5bb99d332d8c190743d1ef0334cddee8329ef0001c6cad3e443fb62524cb056de6735297c4fd331034fe488e8456f17bf7bba40e636e02fabb8e81edc9f230f4727cd41cd98b80725b67a2ac6c1e91ebba82c43b71be0e6599182e30ed17b0a6c7b9f0c1209ddd9dd661168dad16613ee3880eec0f50671b844c757c46996b89f877bfb14fbb620fadd82f235f5e6957d17ceb93e5312329e473ee8e8eedba1cd51d30c4883dc27c8ffde69e4383482d0d75f946e5897a028f1ab4713ef30b4830c06d37949639c20b30aee4d8804c5db450f82e165f44ac8dbb78df77571d557161e1954773f4990d7f0cf93a9bfeefef3f86ea450b44991c061c31a0810cd0f58a43762f57828f88b1089d425915137fc16073fa52a4b4708bffd5c8e9e0baf807a1a990a156061ca938293d7f0dd20e653c0c2063cb0257e101ebd24914894a0f50e9c41ece9c0ade1c08d1d35b8c1d1c40fdcd8815c7970f1c323d8a0413088071d82b51c82943d7f6714416fdae59cdd82b62f0089573496be84f65c9ae68f29a6fb575c98f27836129e436cf2188e231dc2751cc2341f59338a701aeed989e52cd5e6281b19a3b47393e864480efd733696f7696af79238f047bda968d49b09f54b4218e152a78908a38924ba5f0be382ffc227d2e0621e1d4343bc9e5373e3f10cb3a505229c73c58b0e446dbea364d83014e5d0a349f74f471c86f819e39c34c70590e17b61a7fa4ebfdb648ac89133655884728db8c0fbcf659ee1df97bf6eda0ff0c9eb26418b0eb321e6bde6a5c035825368f511de6a3ac96a2a8b679d4dc6b8708186dac5a54328d90a70b9053773b416b64d7697a1b669e06d559e7ba24a541f551a38bfc07065a58f297bd4ade0f9db6f3767bf1870ac3edf6450d79bb3c6449fa8c6d8e2646ca575a0338a533aa3e8e58ca29b8c624524e19b05e86d63c5108906f29aea7009c85eef0d63188d3a3efa383e3a143e5e5086be2a8da2740e9a741c9ce638e8629178209dbb742e9a755cf4735cb42a5c606feba0f5d2fb6ed1f53dc0f5ddacf4bd42816a5dae08a11ec2f4dbca05055a154e1d6150c0ba6da282f6143e24e012f96577bac13bf2203972af47b86016746edca653dd594e75e86c3b34b57d2341db2f2196b7737d22e921e14dbc7066eb21dea627dec111c7e7cf31305b1eca837aca9d1c6574fef34c4c4fa295e3c2bf4c02dcfd74eafbe9d2a9e422a79216f2a619f2a00c281a8d409d3384514c37d733f2ff1ea398da908ae9e19c954c61cba8b306e557388d7a49fe82e74e404e51dff98598c3e4acef837c6798f9047e783f1f263f9f10c1d96139b8d7c586b8ce9546d88815c2957a395b20cfcd19b505bfc973611e5dde05017c2757dc82c025d2fc15e1b72070585e75faeee3b44251ef281711d5f94df8c1f472d1488f0a7e0131a87f1d7aa775c1f30a133c45c8e0d9af73c5b1c3bae2806eb44970a3cd94d63055d8c628b3db06735801aa9b9432e4e4eb5dac09a6804fa96a294c70c28c696774f22539f9b20721d709956aa0b49774d0b0d7e875351af6fcc193f9f0bb48526441ae57f4f4989407379014ee6c59a67c3b773072bbe556676885357e682d430f38f50e83d3a00ea7710ea7b4619c705e360d5da1444837dfc61fa1c3e3705687c30487c34dad3fa839982dd71ee97f85e470f4bd1a60e9e590684827d12427d123839a9d3bb407e87d200c22e774885ce51099700d11d324ab2d9713eb52702fbfe0ebc7a7bb2edf2a8c04e775125cd3456dbe4f3552cf8a1fe1f10cc56ab4663da7fafbe58ada1774f25de7e4fbedd8a2d18cc81e4c8757c56d69d359b99a525c2457f1d34b914ff4f9343f5ca488c29f45d3f959a2b40b2d1f520bbcda13099a842645f004c4b98f7d6f829da3be5307de1c3cf9b821f41bcbbcef054bdd631424056723638a95a8d2153f1df4eea78a4a891c5a80344dba4f9aa41fa2566ba5566b1234f7bf5ca2350573f191da5be0e6c4a03d1636016745d6c2b9c20a35cf50c00fa41f3481b842049c8d3765d84b89463505c0acd20c680ffef0138dd42411f79b26c1095a7daa06b0feb6f2607d6c12ace2df8c55036c31822d1a7111bf5db64856dac62d6fcc6da551ee352d99ec12bd55770ca695ae4ae3fc13d516473c716824843d8d043a6a3e21e007f22426049ffecfc7ea248ed59f210803ced04651e3739351a347d8afcbecd46c0b1ef29b5c24ddfd1f660368434114192d46b85222499f325a7d7114503e97b6b8ef9ba31b84326a0aca9802e5944928e30150ba97310c8239680acc5605cc5b9504e6781582d9a180396d124c1ce99e0967fbb5ddcc27252d1f74cda6a0ab53a09ba99cf878ad0ae3638b02e5ac49289d4d2ed8f11a8dd90e6dccd48c011731059c5080bb7d9c36982e582f3338ac34988232a240396712ca41e1cd1c752f2bdcef948d427bc914b4bd0ab4772a27524e5461a46c54a09c3709e58084725d3bc351094ec1d92e2db81bb5d0b829581b1458bfac1c0bbd518516daa54079d72494c30c9487795163d06e874d81dda3807dcf24d8e798410b99d8a7df9b6d81d3d8bf423f6959418d02f0fdca090c57ab3030342b503e3009a5b38bde9be46fc947aa0f3c4b016fc12478ce4f4274a3fe1139749b29204f2b403eac1c8736b87664cc264f29507e5539505eaf4228db1428174d4289f3875707afa51e8afc8f468c81d6680ab45a05b4a5a388893afb5363a24147361613db152053950264350e2ef50a90e94a01d2e032873120bb1520974d02e9bce3d1a53b27e185595c01f3eb4a02b31a5f98f52b607e6312cc7049cf6415263d4d0a94df9a84f28c84725fbc10b8a9c5bd4ea4ff473a466dd45862d4a900fba852813518498d011b152766735d1211792c949d63233e938391c0f7f7f64eb5768904fe6f93fb0297073372b75b46d9b596a01f9a5e17e1361efbd30cde5286ff30acdee23d61a36c1a2cc736394ed2c36c996bf2d14a827e5e7a92e57f220afe174b341227435737622ec0c3abc4147e22ff01078515991a5b0000 serializedProgramBytesString: - serializedSignature: 62ddadd4983d9ca0bb98fe2a3c0245ba0d1c4a86f1f78d2d53f7a2c0c7c7919c7a985b7804d2f17c4242b31d5e2589fc62175a1c07792dfe64045e69cfb59d06 + serializedSignature: 00bcf00cdb7d6a2c35eb574cc046b00e7d6f9cbf63f307b4818d058c6766fc20d6143c39c27009315e5140724ad7e266fd6e797e2860278b252694fd9d898803 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset b/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset index 76ab078..71e5e6f 100644 --- a/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset +++ b/Assets/SerializedUdonPrograms/9c3ba83a5a742c84e85f136d3e133b16.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15c5d6c0e7463aa8a820bda820512010124251a437a9d25410219010220122a18a057bef5d51b1a3585051ecbdf7deeb53df539fbd3febb733bb73efd9c99c7bef66f62cb3f9949f5cb69d39f39f337de64c4e0fe6fc97e8e6fc358d4d6243591e9bca4ad862b6c8f9d750e777a1f3c7bd92f727b225ce6f99f377b1f3ac1beb98e14bfe5f97444be7efd1ce55155bea7cb98ccd757ecbc5f3c9acd4f9f768e7db52e78adf9de7fc5feabc95a8e37c34950d6313d878d622d13c838869e2a32aef5e82c72bd1c0f97b085be53c2d154af1407a88472d9cbf263b4faac4b3858ed2f2bd196ca688d642e7d95ce79b25acc2913947486c50b98a897f30f76757efb78bf7dbd9f9bfa1f7efadbc7f37f0fe0ddfe7f779ec0e48f36e2e7857cadccdf9bfaef3ffafdef5eeee75bd26de7557f73ad14c91d108c8e8e6fd76f77ef3bc5f6e0af518cb393f0bfdd33debe9fdf6f27ef3bd771dbd964bbd0abcdf7640af76de6f7b4f8f0b94fb1dbcfb172af73b7af72ff2ae0bdddf444720bbbd776f27efdd8bc13bf23eff6de33d5f0bae9d74ca19e55defec3dbf4491db51797ea9ffbe649c90ba5ee6a5d3fa343a7730d4f94b458ed4a5b7f7febaec74cc91365aa48477b93fbcad3a79eff5f19e5fe15d6fefbdd7d6bb7f25b876beabd3d27bafaf771fda447f3f1fb6879faf94cdf604eff1e75729cf0700d9bae77b79bffd90e703813ebae783bcfb577bd73b78e1495bbe125c3b71ae2bf3eb60ef7e0710e7a119e2bc8312e73c4527f97c0090ad7b2ee33c04793e10e8a37baec6b9a6e5c530d7ceeacab24afe3666d995a58dbcdfe119de4f27a3b1f73bc2404613376debf54cf36e2e78578633d28dbf788f5f77f6d26d97d43be2df09573e2c0393f7eb7af7af51eed743eed747ee37f0df4f964b9d802e9dfcdf243a337ff9d3d9d5b3413745c6aede7bd7029da13cf95c2d13bb307f7d504ff9ae0bf25daef25d7de5bb5ce4bbdd94ef1a28dfede6ff4ede4f969f9d98affcacf7a3f77c947bdd60bf2c6c29ddb3bdbd70ba7ae15c07aef9efeedefdebc1354f8f7bbdf065bd30c67bde4d91d32dbd9c864dd3e8388ef9db23a315b6dd155be9eec9dccffdaee119c0cef97359b65dec9797c853e46df0cb6b7483f7beacb34678efc9fbe315bde4f3f5caf33c102e7c2ed3609277ff4670cd7fc721e175519eabe14d0069039f4ff4bf9798ec3dbf49b9be394dda6cadc459b6f736826b875de3cf32b0db27033bf93c2c76521ec64e3ec7d84df2bf57237632ae5358aadcaea3d8642f4fce2de05d799fff0e627edb1fe4cad85ada7c5d455e4feffd5bc135943b55793ed5fb9d067494acf74ddd13cfe53dfe3bd293731bb8e67a0df364d453f42a54c22d54f492f6b0095cc3f2468677bb12de7c9cbf949d2c63a7305f19dbf80feff9e4602cd9d4eaac18e427cb6ac02f596fe5837bd006bcbe4ec14aef99e45200d2205fb18d02c566f70fc6de178f319a784cd7c443d6a3bd35f1284a138f3e201ebdc1fbf2198cc70cefb7be22bfaf128fbe9a78c87e47a678c87abd9f261efdd3c4630f108f7ee07df90cc663a6f7db4091bfa7120fd926af493c643b6380261e7ba589c740108f01e07df90cc663ac777f10f3d7f9fcdac983db3555de1bccfc7dcfc1cc9f0fa59c0d8a9c379174977d8d5b91e743fdcf135e5f28314cd16398a2c770eff91d7efdabd5519b801ef23bf8fc52fff7c9b2ea3a70edc46ffbbeca7ba314fdbcf182649d25e56cf0cbe15d29ad5dc93af356e4f9de0a2759ce8f51f4906581e43416e1249fcbba7513d0437e079f4b4e6a1d389ef9eb40a51d9598c052e5b6ee7bf97c9d77ff40e4bd894a38139570f651e229dba1b3582aafc876c36c96cc5b3bc8b67a4ddbe6733cd9fb2b76e395e789fd98bf4dbd9f1bb7665efbb7d9099e9cb9def3e98a9ce919e4dc9046c712e66f9b17337f1e99c1fced93199ecc1fddef9acbfe9c6c9b1fe0b735292f7180226f835fde8e326fc83a6309f3b7f74a15bde4f3f5caf33c102e7c2ed3a08af9db9755deef5224bc2eca73353cd9be9cab3c9fe77f2fb18cf9db97f23a48db7c26f3b7cd67baec5a1c93815d590676f27958eca43c8c9d7c8eb19bef7faf46eccafdf6c716b054fde9c58755807b5ede620b5932dff769ebdd3bc80bf7c0d4fb095906c9b6ce2c4fa7cde0da499b96726c47a7e322ef57b64b655e99cdfce5f86cef79a526fc83411c64bb7409b827dba5c5e09e0c674e2aae85777acf167bcfe682b0e0fbf2194c2fcf0e92ed52f97e89128f922ce321db41301eb25d5aaa89c7bc34f12803619582f7e533188fa5de6f7d45fe7c251ed23e6b120fd92e2dd7c4e3a034f100f69b2807efcb67301ecbbcdf068afc0a251e1506f190edd285ac7a3c16a589c76210d642f0be7c06e35147915bc9fcf57ba5f75cd6ef07337ffdae7e2f9faff3ee2ff73f672b341c56a6e2d246f6276bda0e90fa1ce285b1dcd3e74e70edbcd336ddfcdf2aef5796e52b98bf7e5ee1c938c7d5b9edb3feb0132b99bf7e5e05ee43791bfcf2da3de8bd2feb98c398bfcc5f0dee43b9877aefdda55ccbb27b1beffe2aeffe95e09a877b83ff3d26e54b395729cf0f57c2519f1fe1dd4f373fa1d6bb52b7cd7edddacbfa618d923647a66ca6c393deef0d8a6c69b38728b20ff164cbfedc518aeca353b2732722b265bdbb5a91bdda93fdaaf7de318aec6353b23b35516463e97e9c3f6c34fdefce90fe872be97fb8ab6b872d91fe32bf2a6925ae75fd9423bd30a5ec5b14fb59c352e5ca1af02eff3d92f9f3ef91aedc5d5ef464d455c2389af9cbf0a315b9c728cfbd344e1c0574f06c2a71acc2fc5837ec8e2fbae1ee24db2e32ed8f57d2fe78701fea7812f3e779797db32b771759becbb43f4ed1e3388f81ecbfc9fe8f1cd792e9b03e837ef2bb3ce5f97ae5b95ca771a4ffb9649afcfe0425fde5f71394e7aafc1315fb90f2653a9cc8fced6af9bee4a6c6e724e5b90c4fb6bf643a9cacd8c2c98aad9cc27cfdfaa4fc9395e752fe29fef712a7325fbb3c701e3d1579aee651355ea729f13a4d89d7e9fe7825399fee975b2d7dd780f475ecb4a32cdfb17240b633c228438ef5743883e9cb9033592aff9e09dee5bf67317f1972962b3757aeaba9ab84718ec2ef1c45eeb9caf373bddfb3810e677bbfe7317fde3dcf0dbb733337dcceb28d29f3e8054c5f865ca0e87831f39721f2da2b43bac8f94a59869cafe871beab47172f6eec543f4fb40c51f593dfe529cfd72bcf651972acffb9649afcfe4225fde5f71394e7aa7c59269ca1c897e97011f397211729dcd4f89ca43c57cb10990e6b155b9036266de512e62f43a4fc9395e76a19e2bd97b8949995219722cfb13244c6eb32255e9729f15ae78f5792f33abfdc6ae97b26485fde8e9a0dec8dba0c916d81cb99be0cb982a5f2ef15e05dfe7b25f3972157ba72bbc93185ba4a18572bfcae56e45ea33cbfc6fbbd0ae8e0a559e25ae6cfbbd7ba61efe68d7feee68d7725f3e8758a4d1f0fee431d6f60fe32445e7b65483739df27cb90f58a1eeb5d3dbaca798bd3fc3cd13244d54f7e97a73c5faf3c9765c8d1fee79269f2fbeb95f497df4f509eabf2651972b9225fa6c306e62f43641f507253e37392f25c2d43643adca8d882942f6de526e62f43a4fc9395e76a1922ebfd9b9959197233f21c2b4364bc362af192e3b2325eb7f8e395e47c8b5f6eb5f4bd02a42fefe749bd4cca1075ece156e61f7bb8d57da7db9b69649dce7cf69fb88df9cb8cdb5c19dd9bba7a771fe50f3bb189f9c71e4e07f7a1bc0d8abc7b993f7fddaed8e36a701fcabd83f9f3bfbcce66cc1d2b6b65dc37b3ea6b3e64b877325ff99bd80ceef3dfbb146e77b9320ae43c715d45de3d8a9ddda3c8bd5779eef14adccdaa8d3b2665deaf7c73bf22f33ebfed26ede6f6944cf10ee09e78c0fbe61e70edc4ab475ffffb72ee1b7d7f3ed01f7e27db3e323fd453e2f4a012a7079538c9f4dfe497cf649dff90629f6779bfb29c7bd86f0be25a7ec77f1f51ecf711373e3d8ff1bf971c9f79d47bff5e70cd7f1ff3ee5fa3e8f798a2e77dfefb0cf411e437320e22aeb00c9571cb03d7d0ced5efef33fcfe41c3efef30fc7e73b0ef93e15d9de1fd3b3284776b0dbfbfc3f0fb070dbfbfcff0fbbbfddfcb3c98ace3241faf8eebfeadf7dca48e9365f3132c950fe4fab7273d39d7816b276f16162aef3dc17c6580b8867a3fa5d8d9bee03eff7ddc7b7ebf22f77145fe7d6ebc0ba7f8e524c351e4c8efd93445ce03ca73b81631e85af583158e4f337f3df5b4c7ec5b57f7de727cd09b87493ce36727e589fb50de06bfbcdeb3fd72189823d2ea2bc37b4e49d3e75c7945772aefbda0a4e90b0aebe7151b5b02eef3df679534957a1682e7e09ac979a607150e52de8b0ad7173dbd37fadf4feaf792dfe6a49ca4dc9715fd2bc177503ff5fd07dd742c926dbe259a78411b947232a54f3a1b93f3e5af001932bc5759f536d502efd96bccdfa67a15dce7bfaf2b4c5f7765f4fdd093535791f726f3974f6f2a72df529ebfe5fdbe0d74f4c6b612efa4ee89e7f21eff7dc393731bb8e67ac93e4c3d45af779570df55f47a8ff9db30ef79df2f54c2bb5d09ef4e458ee45f37c5483e4bdaddabcc5746f71906bee5efc9f9ea9ad8c1d95e9af4cde2dd73dd7797cef6aebd31c67e2bddfbfd4e4923438e6dbecffc65c0fbde736fcf61e203eff943e01ab2f890f9f3e087feef99dc43762fb8e6bf61ed5bfc04b09671fa4889d327e03efffd94f9f3c4a72eb73d9a2a72e477fff6db56721fa3fafc52fffd24a34ffcf6d27fb6261c583fb4378cc7938a5eeafecb1aeabd87acd774ec3b98e9bc67852247eaa2eebfcca4e3bb196ce123fff74ceeb39475446be5796bbf7db336caf336fee7897f79d70f836bfefbb177ff11700def3f8ab34dc6b9adc2f03170ed30dc4bc65d4de7ff28f62bc3f80c8421f5f95ce1f519b8cf7fbf50d2ef0b2fec4d8a1cf9dd7fbdf71f07d7d0f69e00d75257fefb25f397d75f7ae19ca2c8f9ca7bef49bdfd249faf73ed23a9a7dcb79307ae811d0d58eb9783d9db00594ecb7916396625cb35d9f659c592f54a5bb987f742bf6ced3be9caffb54c5bfe0ff4caff81eb582a0ff1df8b58fa7a49a6f9d7ccdf7efcda93ebcd7f0ffcb58672bff1e43e05ae1db983725db983e43ab34bfcdfb1cb525cc67e1830ec758aac2b52b206c9fc727996b2d2a5c5765e9cbe4dc910ff76e2377890f78eac5fa42d7dc7fc654f5b705f7ecf9f6f56e4c9353092c1e519f496e3aedf337f5e916dce1f58f536e7ef201ebf2bfafdc8fce5cf8fae5ec3e4da8cf6feef12bf327ff923f5f91ff39701bf82fbfcf727e62f037e72c31922d719b652debb5e796fa312de1f4c5f56fcae3c5f873cff93f9dbda7f02aefcf71725bd7e71f5189aab70cc905e223d60fafcadc8fddbe32deb6395f76f0a6f6f8c322701d2f437708fff323f6b71cd75e7f59293578635d3879593e30f2b672be66b7388e7f23e168e8c5343f06ffefb17b8f7971767b936aba3a2471d4feed3e05a7e076d43ca59efff1ee681643ae5816b50e60fbe137c03d349e68bcde0da096b845c2fa1e67f696f6afeff43b1ebcde0da91373c68fe6feb0f37d9e6b94c09179603f29b768a2e6b155de4dacf8e8a2cf9fed3fef74778eb1ff85622fe3b62b6468734e1c9f793ecdbb2ea6dd09f99bf3ddd16dc87f97403b876648f94ebb0aff4bfef4b17fedd33e09a3f977d25593e5c06aec1f39cbaccd797caa9ab3cafc77c7da51cd9079673c3cefba33ef4c735d9bf9271cdd47e958c24675927acf39ecbb25296d9729cafbdf29d7c2ef7367554d245ce83cbb1916b98bf7d24fd1aa46b1fad47c296f5862cdfae03f7e17bb21cbc0b5cf3f7353e76927a67ca4be9da001edb1ce92fe262702dd3915f37f0db9fb876ec6ff49e69c2b85e49f71b809e72dee746704fcee5dd948aeb4ab97e7a039025df977565fb2ce54fcf427e7bf0be5c73d1314bf9b76621bf63ea7dc938a721ab561ee43452d2a321b8cf7f1b335f5923aeebb85b837d72a45ca54f9abc9f07ae417db177651a1ddb1bea28ebdd264cdbd74fca91cf2fcd4ee731b2be4f67efb7336dff63ccafeefdb132ade55cd16d2c7dde927191731bd7816b47ee586f5df7d89501e5dee197afed4f5c9aa5ac743cbc3236671be66f677a655cceb629d9e2dffc9957b7e43465be36b5b8aee3bab0f0d9a0f75dce76ccd716cdd90e84cd7fb767beb683b876e48d9363da9b153dee4a319928d717cbf9824bd33349cac803d7c096c6c93d945767272f2d63cf2f8b6a73e32bdcfbe3cf51c2ba3b4358f72869b403f3e7b31d3cf95f06942bd3a31948f366aeac093d95b0db82e7b05e90efcfaf61d8cd99afed2baeb9bc8d4af84d95f73728ef7f1630fcfb14f9e96c2b93ac2cea5be6d5ef392d983f4fb460a9f29a5fefc8fc796247377efbc879abf68abc564cdf8f6a0dd2b415b8c77f5b327fffa6a51786b76f649f0390b0daf8c3ca916df44bc073791f0b47c6a921f3c74fb6a364fadd998179474537d9c67c1a5cd7715dc50492bb9dfbdd6469cf32fd649ce4d8ff2dcaf3bb94e7eb1486f27b39a7a08cd327bf97cf95366bf2fb8efe7856e3209fcb36ada27fb576c14e4c5b2727c3db29bd3ed5dad0583fee0ed7b626bfc9b4dcaae9d51ed12b13a7bb10bd32f539e49a2ad9f6f7e6e6d3b6fd1ff47e1f42747b0e5cf3e73abf99727c24935da62b63bcf1fa1ce9abf23a70edd8f2944fdc30a7aa75dcc319c294727761fab642a7d4f7e2dfd06e3a337f5ba1b3abcb34c9ac83ffbb9c5d99bf5cdc1584cd7fa54fb8cde09acbbb402f4fb5a78ce92fd773c9f497ebb2d2a5bf375fc09e50e292aba4bf4ce374e99f212d92f1ca03d7a0fd32558ef1679bb6e9ecc91bfbced94db1a7dd5ce6fb16ba61ee7b8012e69319c29472a51f3ad59eba027beaaad893f469f718b87674993e5f912dfdc7296302525e4e1ef3d76179e03bfe2b7da8dd0eae9d70f657c66393f2a41faa5bc0b5b43f7e9def3ddf08ae1d79fbfd8ac8537c8ee578fea472a49fa8e7c135ff95767e1db886f283a68d0c1f8baf7cbe8e6597afe4ba2199af9ef1a7b9365fc932fb39256ce953eb39708de5ab2cd349d8224ca7cde09adbd720e6cfa7193826ed360f5c837cbaafdca7976dbaa4cba72f316d3f63faabeefde97f28613d9f212cb9b64ada5611f3f7338a5cf933a604942bdbfac0cf98f83797758112765bf01cb6f3e5fb2fd6306ce99fec7a70edc83ba0a5127e53e5fd0dcafb130386dfd1fb5efa21bed81f5e8ee7a72ca7bf125e7f37bc99329fbcace829c76307305f7ecb19a03cdf8bf9c773f7529e4b7f62f7826bfe3cc8786e47254ed2d7dad3e09a3ff7d22e47fa587b015cf3b8ca3d0132af65c936c944aecd93e547867510ec15e62f9b943554dab2295bddd2e5dbd7993f9f0d62fe7c36c8e571a05c8f246dedb5ec78e40c56d2e775709fff4a9f6d1bc0b513deac6e350b2f191fb9ceefe934dfa4e3a2f61de47ab8cb6a28ef2d85f35085f35037deb3ebb8693cbb93f25d5be5bb8dca77b2fde3f5b9d99b197875f0cbcf19c6fc7592b7462fd97618cefc75d2702fdc5783859b942bd74d3e9f46c7743cdf51788e50788e70f52b9ee2f22c5eaa7cd756f96ea3f29dccff325e70bda64eaff68afcb799bf6f1d347e723da68c9ff4f1b7165c3b7acef1dabf73a628dfb555bedba87c27d73acafcf56e96f6e2c9176716407b917bb47a0379fcf98b6964a68bbfb76e326734f3b72947bbfacfede6c67bee1425dcf733c443ca953e0ed576ff98d4f739d2bfa16429fd1b3e06ae1d5d4a643ddcc1ff5d8ef467780bb89661f3dff1cc9fa7c67bf27295f033c429f95e1eb806edbcb96b02324a972e92d304c049fa5f939ca4ffc4c7c0b513af52390fd1deff5d8ef4a7b8095cf3f73ef2aea52fe7dbc13597375109ffc30c9ce47b79e01a702a91e37ebdb3939796935c07f731b03baffe9e23dbc2ef2be1c9b5901b6b18a6b71690fd1bf0f3c22c91e3fc1f2a617e6a18a6b7973247fab9be1c5c3b6934cf6bffcffb2c8d2cf94c8e594c61fe7ef317e03eff95bea99f03d7fcbdcf53f15d21cbfbfffa658b756dde3b0327a6d1498ddf34257ed3dcf8956d7265953d9946d6977e1d72f655e2f715b8cf7fa5ffcde7c03516bfaf95f86d4abd33265dd9abc64ffa14bd1c5c3bf19beff9ff9abf3e8d2cb9e7ea1bef5be95754c6ef3b709fff4adf9dcf816b2c7ede9c4ef920effa7b7f58d5e2ebfc96cb75293f28ef3e927a774aba7a5965237d915e0eaeb94e1bbdf01e4d23eb27eff747ef5be97b53b2f919dce7bf072a6ca4ff381d9b5ffcb2c5b889f7cebe75b2889f1c2fd9c90b6b364b8d8fcb6b58e64bdf941b35dfcb7252b69b7749ddcbf17c581e24cbbd5ffd72b57d1bd95fdad9933147d16d8ea25bb1a21bfcbe2178c7d163815c13e7ad7f49dbc7926b60e4bab9594016ff9deb857b17b8c6d22b5d5a786c724a3c792f816b47e78ab6aeacc5728cf14fe5bb52ff77c9fbf3bcfbb2cffe37785f3ee7bfd287e55de09abf2fd714f2f12ccfcef96df1976cf3ca79bef99e8c57fccf73c0fe1ef18e139f85759477ca59aa9fe884b550f2ef0d9e7b321239fe6fc5496e9e8e959e6e8904085b7ecfefcbb680f4757937b8c6e22bd79dc936b08caff483f98aff79cea294aee21d1edf1f957716fae3bba881125fe00f3351dfffad36bef540d8f27b185fe913f36e708dc557ead25189aff49bf98aff790ef0e729de71f45bf489f28edccb28e3abac89cf017e42138dfcdf6ae3db10842dbf87f1953e86ef06d7587ce5f94cd47929609990907944f25feac9bd135c3bef54caf6815c8b2e6562f26599b90cbc27ef2d07e9e0859f237d795e0cde91f7f9aff405ba165c3bdf1e3c5b9123bf937e305f05d7309ed297e59de09acbeb0bf4e6efe7816b38eeb85c79be1c3ce736b4c62f2723af74e576734f96f4917925b8e63a7beddf25722db35cdb0ecee84a7873a1896dd3eb91f0f6b4e71c0edef3c24f3405ef703dae529ecbf54f572bf7bd33e672d678cf5f03d7fcf7885458399eafc99cc3c0bdc3dc782ef1d6192d79d7af6bb20d25fd7dbe0eaef9efa180835c8b057c4c568b9f5c2b16347ec728f1f3da00394783b81cedfd1e09749267ed3503faca77f8efb1cc9fd78f65685e4f7e7b1c08f33897dfd2068a5cf59d1ada4c56b62bfd595e09aeebb8ee9fe17bc9f74f007ac835502af71dbd77a56fc9d7c035ff3d11c4ef44458feb153dd4f9e4f332c459da9cf45b7939b8e6f2e6bbe9b24cf68fbc753fcbd678f7d5f53f19c2cb91fe2ddf00d7520f7e5fae33c9cd4e5eda34f3d668e5489f9757826b270ecba5eede194039a781b0e4fa2e2fef25e4faafab94e7870319bae7417cdf4a7da5cfcc2bc1b5a3ef0a5977fde5dd3fa3babe8996e9f54db4023274cf5bd740df33157dcff4f495fd8b96e07e43ff3b2be5dcc5e7defdb30cd2e0f310d240f7cc1bdfce399bf9c757cf76e3b0aa5079ef1ce66f03c8f124cf075b8ef4f5b9165c43393729ef4b7f9ff72be19ca784779fffbe58cb9e2eefdc90e57bbe7b7513a28d328a95b262a789d94374307663d91f5b2dbfcc7c60b5d8ff257671317e72350f76a9d3f1ac7404684e8d9e2acea45eca0a582feda9d1ad443d20431f2afe2e76de281742dfcaa916c45dd582e0ca55387f4ac191d755cefd91e2c46c7ee875b9f3248f8d757ef957b39d626186f3c72f659a136c85536394b229cedf9542de6c47edea6f668a123f1e5bfd669223d33dbd7ba1734702ad74ae2b848693c5dfcb85a6a542fbd1cebda5e22cf145ac8c0d717e578ad0aac77d89f36f5d98533c647a1df5877863f7dda3c265320d7362c3b5ef216cf19f14d91229c2d1d77bcbcb87757a881eca49d552e21f866e21c30740467b32f205b284ef5e2fd6438c914caa4630781cabc7506fdf2eef22a7e39a2e2e7a323cb9db8818a452b8418767d60ffbf3f33975fd512b603dc4d04adb0c514b0796cbcb152de22051a85bb74e4faea88a3fa1c32f8688264788df7daf5cbc173c01ea89cacf9f00a28b35c5f9c74ae7ff0a11c42a47fc5c36d1b92a76fecd5595655eb554eac945d617a0ab57a39994c550e7e8508b9eda942d62e9333294727ad80d92b148c1ee21da462dd3982416966834e5782d279969de1c57d8678f9efd2eafab4f9746225d6a121a96325be952a651d4992073a99f2e5d1a27e3954a17fe9f9e6113c4b633e98011aca323d878cbd836d7bd66b6cd8799ba2b0cf5fcb6496b83e934c008d6d51114e33253232438c1d1f020afad583386db66cdb0a960d8aa5aecb2d101a3584f43b127a7b89d4ead868a5ac245b45e707d4cf0f686821b6082773014dc5067505b479d25f9b3c5424ab1f36e7073e2d57857b558d3db5373244f665601b3a646bab4e10877d46aa5264e733c711a63925b984a6e82496e692a796b9d418951f6e85bea35ab237959d322eb3ab2354bd7d00e5a436ea3a327f66e1f404aaffa0092fcd710e7dbf90e87e562546099f3bd6ec0293dd1365997f66d05cd8e4c370c164c238cf0b63acbe7d8db61c9ae1a7f6bdcf89b62c2db6b84970414be1d96673b68f26c22489edd5e279983ea984dedd21617bc0326782743c1cd30163b9b965fcd319577315479474ce54ea62ab7c054ee6ca8724b4ce55d4d556e8549ee622ab93596057343c8df6d30e1bb8520bc2d267c778df0bf9dff82086f8709ef1a82e6ed35c27b88b230ca5e091c71a959afa45b321e60d44214bbd5fb1fd984e66dc675ffab8f0c54f01523ba0e4e360160955c075d6af3d6640f5d0c45f15f935e2adf44ca7b26a2635fb79ac56c835b4c479dc588da625a8416e36ff3d7cc66f2754445f5d4ba5a4cb20baf97a49a1054b54653208ca6a6216066b313564814865048ec8c09ef1d82f05d30e14521949d9d74c62ada09b3498d55366927b3616c8cf3acd879bf544c11f1fb70887ab00821d50cf67f91de80f9cee2ec1ae77d85d175622c34cd3043ec8c2567bf106c65579d70de89ef9f7c3983ad34c18577c134df43a3794e40cd7375c279ab89ef2036ea01ec863119a061b246a7761a26bb63c2f7d2083f23a0f0ae98f0811ae1eb020aefa611de4334e48f8c24e7675a0332d289190f0d0e86ca70178b897bae915c0430c9f99d27b42815935ca559ac1d495f760c629aca4f744786835262cbc762b0a34d23d1d1d1976c4344c96697ce58d9d85d67f07ce07928d34c70f2d6eb2caf29c7c35f241e4d7442e0a9c9ef973bbfd5f2447d3c4fe46125dc304d09970858c2f5d008ef21baa18bb668861beefcbd4cb4a3f8bf977bc93b45849d9ae335c94adcf8da696a3651bb698d768430da5e59186d18da63e6d8132b7f476acadfbe8960e56fbe4e38b74dbef53be3c8461a23ee85091eadcb4475c483e059a500cb2a7b6bb24aa38059a510133e46239c0514de1b133e56233c687bba48279cd7aae334d5494f5e9df05dea39c2e82708a3e765d0542f415609f32e1386cc8b015dc9cccd1b7b5f66c071ce6f891364856897568bcf103c3e7db0f84cc4e2b34faa3e0a104e5f2c9c495838936b144e3f2c734cd1650e6e15b31cda8b7cedfee1c91a274886e9af0bb929f38e225463b81d73cf14ac97f0cac9bcfad5e3998787b60716cf7d75f1e433a595be9ecd12c78a82c46e4f2cbcfd74e135175c673905ec2ce75216dabc182a617cc1127fc657de2e11f61e448f01981efbebf4d81ee8315f0c2b9478156ccd35d80bd360ba4e83665a12e3bd7c5e732d06625accd069b12dd0a258a47d9541d883b0b00fd085bd35087b96684d96798bd282e6b0c1581932132b430eac511932048bdfaceccb90b1a2f5bc3c60d53e142b4366636548b14119324c171aafcae7b0eacd9f297583357f86eb84735be03bbe8d66494660924b4c258fc48094ea80d40b066414267c9e46f89e0d82091fad13ce2d93efa5356d50edad11de43cc82f15de2741d9b74ad1e7f5f35681b297d7786ef77cb6e5491c73f37c17bb574ba629d9731582975904efd0085d058ac105a908de034e5cd389d609e032a3439a063c3603960bc4e387f7fa1a6e8ec21665a6bb6308f77e6ebd59125aef39fa6d04db3686d029653176b72ea560173ea449d709ed4dc0f40b59a8b27b4aec7d191ad766aebc39c5f77168f2ff7e0ff5eecfcbd44a9bf3b8a652c4b5977e7779ef3f712d1ca2ae30908da3b5c62be90384fe4f585e23b2edbb57dfebc97f3bcbff35be0fcee14c860f7c192fe604dd2f7e4f89698a5e1240c73950ef3ec5030d71c6647b6c229d2dc02b8a3d20cee28f6e99438f7968aa7eef795426e99d0a2caf9132c392663d97ca9269b77da2658369fa2ab8bc4d2862897e8f1fed312d1d60b3ee9ba2cebda6539d32fcf4b1f3a565f4cd5250b27b7229b627d399e24d3744922168444b9b7401d320996282bb34e94554cbfaf2053f858b2ecaba32756bcec1321bd6cf6b9e9c91d9235b9d5825cf36ab14abb150ca1b69fce983935e11f4351a75c578baec60d7a7fac003b4c53807d19b0009b8e697eb846f3fa01359f81697e8446f34ddb06d3fc00acd65ba3abf5984ef534b5c64c4cf52335aa1fda3498ea0762c28fd2087f738760c267e984f3161df78f62daf79a8d093f2604e1c598f06343103e47279c37b98fd39518aae0725cf05ccc0e8fcf46701a132cc1ace4048d95dcdb2c989594ea84f3f74f64482355b882a97923751e86e9645d76e5dda7a08d545e19d9d81f28c3509f82a13ed50cf57c0cf5693ad47342431d9f3e413996b54ed764ad175b04cb5a0761c5d8192114630b30e1678620bc022b23cf322c2317ea04f3f439dbb08c5c8425e439ba32b265b0845cac13cebb28e766a3759a2e4a2526f83c43c107eb0473eb383f04eb58a213ce9b8a1764a3759a6662159688176a12f19856c112712926fc228df0b1ad83095f8609bf5823bc599b60c29763c2d76a847f1850f80acc522e09c1525662c22f0d41f82a4cf86521083f44279c0f1eaccbc6c657e18257eb04f382ed72a6a993f93288a075f252af7e2dab41c32758ed792816972b7471e10f3afa420d12d661585857eac282d3db73ab4d75d47c8af9704c8bab745ac069fe855efba458b0afb90647601a5cadd3a0118393dcfb0acb581ab06a5d83153fd7e8cab6f6c18a9f23b14c7c6d0899f8284cf3f51acd2b036a7e34a6f97521687e0ca6f9f51acd9f0da8f9b198e61b42d0fc38cc3e6fd0d9275f8c38c32bcb663a65c30caf1ceaeff50bdc7bfb89dfee6c2fe7efe1a0cc9a2b045538ffe2cb772a9d7bf345f9b2528c33968abb2501cbb4e331fd6fd4e9cf973ba534925b303a26e3d4df8bcf4ccddc895b66ab7d9c85e28d2a6f0da9db5b72e357c5dc31d355e2cb20713a4117276e2037251f281dcf9b9dffebd567ee7f79ee7fc1fa9e27eac2e446b651636475021ad94998f05b34c2eb06147e3226fc568df07a01859fa213ce41dfa633af4e59650fb7ebdcc3f92df4eeb9596535ebedbd5be4fc063198533183d98419ccedc606731a16e61d58989b8dc33c1d4bea3b432809cfd009e74d48ee2ad2a409792646ea6e8c143f91be5e5d482a18a7b3304ef786c0e96c9d705ed7ddc7aad77585fd82d575e7e884f398de9f4d22a45934722ea6f5031aad6707d4fa3c9d70be94ec4166b894ec7c9d643e95fb90ce76f874223ff539f85ac50b303c8f68f0341d180ccf8598f04775161350f84598ad3f1682ad5fac13ce93ebf16cccb12f2e782d86e4099d390644720926fc498df0b1838209bf14b3f5a74c6dfd320cf6d386b0d7613c9ed1f0b820208fcb31fb7b3604fbbb0243f29c21922b3124cfeb4c646430245761485e0801c9d598fdbd686a7fd7e824f3b2f6258694b5fc449ae065edb518fb5734ec7b8e0ac67e3d26fc558df0b501855fa713ce5b74fc98896aad614e68b0d3f571bb751d7d3b47520362c52c359c15a4cd7b3d16d1d735113d6174b0886ed009e703fd6f6493efd20cf4df80097ed350f08d589e7b2b843c77934e389f41783b1badd3cc20dc8c09e6e7f9aaab585aebb44e237c236621ef6a2ce4b38016720b26fc3d8df0517b07137e2b86e57d0d96e601b1dca613ce0b507e56aa5101ba492799bfff61366692a6b6ba1d83fd9106f6876382c1be0313fe2f8df0b5638309df8c09ff58237ce3b860c2efc452f213d394bc0b2b4d3e0da134b91b53fbdfa66adf83a9fd9f10d4be174bcacf344939657cb0a4bc0f13feb946789389c184dfaf13ce1b365f30a461c38fef0ddeb079008bc4979a48749b122c120f62c2bfd208af0c28fc219d70def8e0e7fc566bd870239924de5a2cc692d5a68ddba4294f6e53958d9d20cd9b87b14cf28d692679442799bfcfcf133629a51fc5ccec3bccccbeaf91993d8659c20f3a339b16cc121ec784ffa833b380c29fc0ccec279d99b517ef2d724cac582c634e2da50adfdc9ec4cced6753737b0a33b75f0ccded69ccdc7ec5cced7f3532b767308bf84d6311c7ec1fcc229ec584ffae11fe6440e1cf61e6f607666ebc548bc2dc9ec7cced4f53737b4127993701f82975a64d801731b5ff3655fb259d646e077c05bc6a07f74e0f66072f63c2131ae16d670613fe0a960d73124836dc2a51936cf82a16893a9a48743c3058245ec312b66ec230615fc7ec91efb637b5c73730e1f54310fea64e388f69838459c1fd16a675c310b47e1b2bf31a65a3759a22eb1d4cebc62168fd2e667f4d4cedef3d4cedad4350fb7d4cf8362108ff00b3bf6d0dedef434ceba62168fd11667fdb19dadfbf3013d9ded4443ec640ef6008fa139d605e6437d314d91feab44e53647f8af1686ecae3df5812ee689884ffc178b4d0f098322f188fcf30e12d35c287950513fe3986a49521922f30c1ad139a26aaeb500c36460ff19689f26564d2db56ff1a3549ff8bf16ba3e1373f20bf2f31e16d35c23bcd0f26fc2b8c61bba00c5da7d97c48a3660cbfc6a2d95e13cd5101a3f90d564c75302ca6bec5b4eea8d1ba4e7930adbfd309e70877d2254ed36a89c31d40cd73beac59827c8f456d674dd4fa068cda0f98f05d34c24b020aff114bed4e86a9fd13a675675d3fe2a0605aff8ca5f6aebad4debe5a6aefed6445d7894f490d53fc172c7a5d74d540c0e8fd8a09cfd508ff23a0f0ff61c277d3083f664130e1bf61c277d7087f31a0f0dfb154efaa4b75ee2d76182b152b8ff9fa7e77b4e510afd05d28be9f239e0df5561bf31d08033c5be8268ae9c56c2e5be0ed1451df0a3a91fe8746fb1ee23813bedd6dcbf91b9eacf02966f254ee494236776bb5d4d8e770b7041f90f027510f717648a1b8178d8e5d13aedb9f650e37975c156f15727f9b731cb5b9d243457273f8fc3fc48977f704cf8b516a8e79d6f813cb70799a0c774145b00cf71796e17a183647ffc604f7d4e5e476a2fc76dd88ab3c6113aa1bd8572d93b32a905e2c81d0ccd7d03c6161309a099d70ae4c2f5da4b94367be2dac4a734cb4f4475ae53c1fe08b3e2f1e1625efe67b77170933ab105bbe96799b44dc377a052cc4723040051a407b0604b4954eb83813268401833a3ae17c4550ef6c6c39cd8aa0ba1892220d92958b8221a987d94c1f9dcde4a7b199d14eb112bdbdd4c7e0f4d5c0e916104e034c783f5d57727130e10d31f2fd75e47b28e4c7fa9a0e51536f8481d943371111104c634cf89e1ae19f0414de44279c8f360d301d6dda5a2799bfbf976147671b4cf04043c1dbea04f3f99c41d9084eb351a62966da8375a6ed1eeb318be58bbdb9a902a5e67b75b7c3c21fa20b7f1b06f7ea8e627c2fe160d07e0b12f2f658c8437521b7f0858c6bc0eff2366eb09ddb3b60f96898aeab54152c1f35c3223a5c1751ee1177025b213ac44b9c08715733958c6f249dcf4a4539c61b593c8a078b0fe4564dd859529fd6ac93d41cd37b844e6fd74fba5bd6f29b66c6b12316f6485dd82d7dc6914e879a99470b4c9b513a6db8ddf8fd99bb1b6a8384d8120b71b42e44e94aa057c8ae045a615aec8d0ded482dc27225d01ad3600c6e83d55d090c175e3f1707f499df06abffc69ad67f6d31c9e34c25b7d349e65e91c667534fa5f18ad41e537982a9ca1d3095271aaadc11ebc2ec13421766274cf8a41084ef8c59fd64c3befe2e98d65342d0ba13267c6a08c23b63f637cdd4fe76d548eed1d1b94c70ff6536b8e897eed4c373d3bfafce8eb4a36bfb89d135dea5a2d5171b53eba24b773e65b47f365921cde6e85c4cf07443c1bb618267180ade1dcb0207986681ae98e499a692bb61920f3495dc1d933ccb54721e568ecd0ea11ceb81a95d6caa764f9d645e8ecdc9c6ee783e4704e7eb04f3fecedc6c04a771d9d00b035d1202e8020c47a9218e422c7fcf33ccdfbd31ce65869c8b30cef343e0dc07c3516e88a32f26f82043c1fd30ce0b0c39f7c7385784c0790f0cc742431c7b628217190a1e80715e6cc8792f8c7365089c0762380e36c431082bf9979896fc83311e5521f01882f1586ac86328267899a1e061188ee521e0188e095f1182f01158bf6fa561bf6f24667bab4c6d6f14c6e39010788cc64c64b5a189ec8d093ed450f0180cc76121e0188b093f3c04e1e330db3bc2d0f6c6635aaf0941eb0998f02343103e11137e5408c2f7c1841f1d82f049ba318d9d9ccb0477f81efd9846188733a71fd138261b2b9d80139b8c99ffb186e63f054be7e34248e7a9d8d8e9f18663a7d37406b43337a0795bc480e80ce784ac87c24e144361bb337c28ccecec717d4aecab4b629e12276593c427e2fdd8fdb036c1c9a66d82fd31c9a7984a9e8e493ed554f20c4cf269a6920fc00a80d343280066626a9f61aaf68198da6786a0f62c4cedb34cd59e8d0dfb9c6d38ec538cf566cf31eccdcec1409f1b02e8b9188ef30c7194602de8f30d5bd0a518e70b0c39cfc3385f1802e7320cc7458638e663822f36145c8e715e6bc8f9208cf32521705e80e1b8d410470526f83243c10b31ceeb0c392fc2385f1e02e7c5188e2b0c7154625a5f1982d60763c2af0a41f812ac8770b5610fa14a279877d6ae31ecd32cc534bed650e36598e0f586829763ed82eb4cdb052b30c9d79b4a5e8919dd86108c6e15a6f60da66a1f8249bed154f26a4cf24da6920fc5ecee6643bb3b0c13bcd150f0e1188b5b4c591c8199ddad2198dd1a4cf86d21083f1263b2c994c9513ac97c51e0edd924635b5cf0d15833fa0ec366f431d800ce66c3019c6331c8779a423e0e937c97a9e4e3b15c78b7612e3c0133e77b4230e713b1eafb5ec3eafb240cc77d86384ec61a77f71b36ee4ec1347ec050e35331c10f1a0a3e0d43f190218ad3318d1f36d4f80ccc961f09c196cfc4843f1a82f0b3b082e331d382e36cacdc7fdcb0dc3f072bf79f302cf7cfc5cafd270dcbfdf330c84f99423e1f93fcb4a9e40bb0bcf28c615eb91033e7674330e78bb072ff39c372ff620cc7f38638d66285dd0b8685dd2598c62f1a6a7c2926f82543c19761285e3644b10ed3f815438d2fc76cf9d5106cf90a4cf86b2108bf122b385e372d38aec2cafd370ccbfdabb172ff4dc372ff1aacdc7fcbb0dcbf1683fcb629e4f598e4774c255f87e595770df3caf59839bf1782396fc0cafdf70dcbfd1b301c1f18e2b8112bec3e342cec6ec234fec850e39b31c1ff3214bc1143f1b1218a5b308d3f31d4f8562cfb7d6a9afd6ec324ffdb54f2262cfffd2784fc773b46fa3343d27760823f3714bc19c3f1450838eec484ff3704e1776126f2a5a989dc8d55dd5f1956ddf76055f7d78655f7bd58d5fd8d61d57d1f6677df1adaddfd5861f79d6161f7006616df9b9ac58398ca3f18aafc10964d7e0c219b3c8c09ff2904e18f60b07f3685fd28a6f62f21a8fd984e389ff7fe359b944c33effdb84e30771ef5bf6c04a7711ef50486e3b710703c89a5e2efa6a9f814a6f61f21a8fd34a6f69fa66a3f83a9fd57086a3f8bd9c8df8636f21cc683e518f2781ee391c831e7f102263c2704e12f624cb63265f212a6769d10d47e19135e3704e1af60c2eb8520fc554c78fd1084bf86096f1082f0d7315369686a2a6f60921b994a7e136b5036ce316b50be8535289b6423384d83f26d9d60be647ceb6c04a75932fe0e26781b43c1ef62cdbe6db3119ca6d9f71ed6b66e9a8de0346debf7b16cb25d08d9e4034cf8f62108ff1013be4308c23fc284370b41f8bf30e1cd4310feb146788f5d9ccbc41c16854be8c96c181be33c2b164eb2f3bcfbd08fd860118274aee23ef77f957ea7cb8e3a934f2884c44e9716397ca7cbaee2cdf0b4c376b87c82256bcb1092f553ac5e68655a2ffc1b2b5a5a1b162dffc104b73114fc1906ba6d08a03fc784b70b41f817582ab6374dc5ffea248b1336b2819dc663e89798ca1d4d55fe0a23bd5308a4bfc6d4ded954ed6f30c9bb984afe1693dcc954f27718eace21a0fe1e13be6b08c27fc084770941f88f18f05c53e03f6192773395fc330664f71080fc82a9ddd554ed5fb1caa09b6165f03f4c707743c1bf6182f30c05ff8ea5608f1052f00f4c78cf1084ff8909cf0f41f85f98edf532b5bdbf31c905a692f968995672a1a9e4844e3237aade86d69783092e3214bc1526b88fa1e03a18e4bea690ebea24737bee17823dd7c384f70f41787d4cf81e21086f8001dfd31478434ced0121a8dd0813be5708c21b634c069a326982e59b4186f9666b4ce5c1a62a6f83911e1202e96d31e1434310de146332cc94c97698dac343507b7b4ced11a66aef80491e692ab919267994a9e4e698e4d1a69277c424ef6d2ab905661e6342308f9698da634dd56e85154ee30c0ba7d698e0f18682db608227180a6e8b099e6828b81d967afb98a65e7b4ce549862a77c0ac797208d6dc11e331c594c74e188fa9863c76c6549e66aaf22e18e97d4320dd0913be5f08c23b634cf63765b22ba6f6f410d4ee82a93dc354ed5cccfa0e30b4bedd3095679aaabc3b46fac0104877c584cf0a4178378cc96c5326ddb1642c364cc63c4cf01c43c13d3016734d59f4c492b0248424ccc7d42e3555bb17a6f6bc10d42ec092b1cc30190b7582792ce71b4ef1f4c640979b822ec2241f642ab90f267981a9e4be98e40a53c9fd30b35b1882d9f5c7d45e64aaf61e98e4c5a692f7c424579a4a1e80a13e3804d47b61c29784207c2026bc2a04e18330e04b4d810fc6d45e1682da4330b5979baa3d1493bcc254f2300cc8ca10800cc7d45e65aaf6084cf221a692476292579b4a1e85a13e3404d4a331b50f33557b6f4cedc343507b0c26fc8810848fc598ac3165320e53fbc810d41e8fa97d94a9da1330b58f0e41ed8998dac798aabd0fd6543dd6b0a93a0953f93853952763928f37953c05837182218ca998e0130d054fc3589c64ca625f4ce5930d55de0f137c8aa1e0fd3116a79ab2988ea97c9aa1ca3330c1a71b0a3e00637186298b9998ca671aaa7c2026f82c43c1b33016679bb2988d95f9e78450e617636a9f6baaf61c4cedf342507b2e968ce71b266309c6e302531ea598e40b4d25cfc3485f1402e9328cf4c586a4e7633cd69af228c7785c12028f8374c28543ed6c78a4d979b300037d9921e80a0cf43a53d00b31d09787007a914e7863e7f28a6c786c830b5e8c81bed210742506fa2a53d00763a0af0e01f4129df01d9ccb6bb2e151800baec2405f6b087a29067abd29e86518e8eb4200bd1c137e7d08c25760c23784207c2506fc0653e0ab7492b9b7921bb3b19155b8e04330956f3255793526f96653c9876292379a4a3e0c937c8ba9e4c37592f9fbb766938069268b8ec054becd54e53598cd6d32b4b92331956f3755f9288cf21d86948fc654de6caaf23118e53b0d291f8b552b7719562bc7612cee3665713c26f91e53c927e82473b750f76603238d5ba8133195ef3355f924cc30ee37348c9331951f3055f9142cfb3d6898fd4ec5547ec854e5d3b05cf2b0612e391d53f9115395cfc0547ed450e53331951f3355f92c4ce5c70d553e1b53f9095395cfc11a8a4f86d0503c1753fb2953b5cfd349e61e8a9ece86741a0f45e76349f88cf3a08b2238718ab8e47bf5a7b212e19fc0f565b050fc7bb4f072c077f7cf733e717d198c4ebe39dc51a354bc3189958aa7e5e2ce1296c766397f268ba7258ec465c21b01979bfa6698f32bbd0794b011ce57ee11b155deb7290f06aeef8472e13bc1ffc4d5afc089e1ac34b1e0676f2e73fe5d05429f227c3748997ea9d39cafca1d3941ecfb028cfab33aeabc04c56238d8f9d712c1c5a53857905b524d4b18779c574a5a90d85c88c5e6395d6c8a94d8a434338f8b4e5690985c84c5e4795d4cfa2b31e19e3a1633eed3a3d8d1c33c3698bc2031ba188bd10bba18755662a4c6a1ccb9bbd4f91d2bf24599f3eff969e21344cfb5989e2feaf41c8cda90abe76256e96959e5fc99e268c909a6235f93140912bf4bb0f8bda48bdfae6972bc3f258633ee49869f199c2e5f07d1f4524cd397759a0e0850364df674ce2e15fce5b879997b1916af5774f11a9895850d767428116736978bbac3dcc26a967bd661717b5517b73db22e8183a5181eab9aa4d7e5589c5ed3c56958b265e2f722345ec46085287917f872d068e7f904e7c922d106e177f4e76feb0ea30faf5cb8028be5ebba588e256c7ff1bb078b6078ac5c9f54e522e8727688f38bd9784dd2f64a2cd66f60a5bd3e6d609ac07c395a948a15c2a356b9975e99258497aa5761f17b5317bf52e256f552365178132bf35acd3c68376de788d865df824e47ab26767035c6e92d1da7a95bacf7919e9039876b300e6f67d31f80a962deead44b0b129b6bb1d8bca38bcd2834774b3f798bc5d5a21ac72eb8f420b15d8fc5f6dd6cda4be9d22e58ed1b76debc0e8bd77b585f4857ff4e15f54685d74672bd1bcada779a57bb94a4b5c1f04ae5ebb118bdaf8bd15e697b77b0b6e1f6c54bd455a2b55196a6aef4cb082f661bb0987da08bd998acdab6238517c862af4c957da809cebf878b760217b7257b54376071fe5017e7dd03b42164df6a91d7f20bab677523a6f1473a8df70c502efaf52e435aacd9b76f83c4ea262c56ffd2c56a689afea21b8b11a2445f282caf662d9354391a56cadd8cc5f1635d1c7ba329c74731e7382fc9b88e15adb2e1425f5d3d167699be118bc727589faaa6e5c4962c196ec162f9a92e963dd158aaf5f1c88cf571187df95b31edffadd3be5780f64450fd6b5a22dc86c5e03fba184c0edcbb4bd53fee37d9f6eea2ec016ec2187c964d2aa61b450b9a8a352df36ec762f079366545f5721d4fbbec4af8747dae9aa7d31d582cbfd0c572485625e264e7e53942db6261555b766c703316c3ffd67c643d532a4659dadf89c5efcb6cec34481983d7ccf47d97bbb0587e954d0b9fa295957dac6b5a02dd8dc5f96b5d9cf7dbc271a6a6710f46e31b1d8d115996c7a3451d6857997c2f16d36f75311d9e558935ce79b94294c5725c18efa5475532df87c5f3bb6c7a4e6abb60a88869f5d483bda16cee873b8b733f16c7efb3a97daac731d5d7e07af2f7b875f1f15c55db29cebf2bc5fdec6257b3d1bf07b0f8fd80f5e9d3c5cf1df14b7d907dad136eaa3d88c5ea475dac66846c9958fe0bfa7eb84c1ec298fc54f3f9e3616216a2dc796bcb96440f6371fb5917b742a61febc54e7981fd16f894dbc532edfc4acd62f108168b5fd2cfa566178b9acd3dd42c8420b17e148bf5afba58cf0c29edaa0c62170d97c7302effc366a182af28b26734fc712cb6bf61ad4313dbcf660c2288fc20317d028be9efd86ac3e0f62e47d24b44d95ce9bd353ee4f98027b198fc818d11d53c2695e0f968cd8c5bcd4adca7b018fca98b418f1ac520fd4c61cd73ccd398ee7f61751e1eaee9185dcd63f10c168bbfb3597b3b4eb4a5e77b5af3ab955bac0df22c1613b65516edabf4e9116c263dfd2c6d4dda8ecf61714be8e2a6ce3cd38c648453863d8fc52c4717b33121b53e8638bfe94b31ca1ae8052cce5be9e23c32ada506197354ed328a95052f6271ada38bab3a46a16f456533e61465dbe9252c8e7575711c90b461dd2a347cdde424d1767447a1fc7533bf3bd75bb1567d3f4bcde3f53216af7ad1c46b8e130b1e6ed8fdbc57b078d5d7c54b1d09c5d78c66b6caa847fd5fc562da4017d37c967e1cc62d47f1d1a5f067825fc3f46fa8d37f7a5a0b345bdf29eb909aaf830d87c8eb1891463a223390fa32c8aaf620b5e0965903ff06c6a431d63a0ac624b56b69b118f7aff0c59cb2a5f02616b326ba98ed1f38666ebb76cba477fa76707de74f22c11d160d17b992af8e9c28bee05755ac4727defaed998c715e3227e7f9727dea3e0f7ba1a30fb7b129c93c9b3a3d1a93b0b5839a1f1227feeb92e0c9b4d49b1a48cc534a4cf7cb0a21393573cfd7ac8e14a58b5b07ce75aec78a9181a5d5cee5c662a12bbdf240f9056397394ef2e46ebe4b75aeb00b5e63cd716cadbe172329cb21dd9993ae6d31dd86a76a072f55737af00d7389ae35b4a6cc5a6cbb95db68d2d9508b6a6461bda1d3dd1520479312dcd914cf5c3d91ce4e6af02363c830bfea42ee2e04c899b18ce2a68226814e5c2b616eee26b8255ef3f5c762a71d5637a7274f91a694d8b613d852d6b6c82bd9170b91a3bd722d0ec8f6ac9b42b61d25b26d05326ed0d0bef6f68ae5d29858d8caf214aeed2971b5f465cc4942c862d1aaf4d7a4aeb59538572b630170cff129803bd0976c8bc544896ca254b1f96211867fbb611cb0ad3d3885ad1925b6b63ebb534bb8a94e2825cc5d03314ab4b54b442dced1f68a05c851b92990cd29416ee303e92a01b36e2c600d4cc1da911ed604a572189eb4be38c05a3b2f05ab057de32353d51007644f8e49216b6967a9961f0b900f7648816c45df8a932079079eab50e675d3e262770d9aa570b5a6c4b535d3357af94a8e793169781c303f85aa0d757b4d0e96a91da9d4d07f5cfa090f826e55dbe83af04385adf175a9e56244256e15c2a6d214b67694d8ea096c5502d5929864c5b6fd5270da4757c8bbe3bceef8f502319b160f5c574d4fe1ea6067e3a2201620eb744a81ec187d2f80d796c5a2791b07588796a560ed449d49657d19df7af250504fee1c5d3de996697e6c72ae210ed84681aa60972d393f10afc1c71fe7a4b0758aae061d19d31af4800353b83a53e26a2c700d174dd66522f8384da1f089648969574a4cdb33d99b1c2682c65645c501da7e07a5a075a1ef82c3d1b2b88d56543448a1caa544d58ca5462bdc0e38bef22e0ee03e599002b71b25b826029c7e7b591c402d9d9502b57b749322d59b137180f52880d5358ab6577ead18dac905d323dda2c316f726eb2925296cdde91b1778d6942fc6015a33b10ea87e5d45b8ba1abbe6ebd08291c657ccf17ec270c7122bc55d2eaf84292be8ba38af58a7791e5c01979ba6fd9e9be552a9dc2cc6337203cc11e46668f7e5663193956b346d68f27581d1d7bd9cafd5f1eddc000320b919d72ee46639079d5ba3654c6adae806a0d577745decdcb4ed323596d54bbcdcaccb44956eba759499df8524b2afcc54b9e9da0baadcf4ef665a9c81bd911ab8cdcd30119a9bc5eac0dcacbbbfb9813a329245362bc5520bcbf50bc27b76721ef5f87fbee6bb275ff3dd934338dfa3e0b65ef2295b2fed3d7b7697f82f62152c7bd7dbb35891aa4fdb6afa4cf28a8d72119e6cbde8346be86bdf946713d99ab471ee4da41a86bda258890ad1e27b6f66b1bed5a7b5c2c3d99c0ae7909c14ce029b70f68b25cec90067a14d38f36389733ac8ecbd6dc2d92b96388f04388b6cc259104b9cb7019c7d6cc259184b9c9f029c7d6dc2d93b9638ff0638fbd984b32896389b839abdbf4d38fbc412670f80738f287096a140a1fa3cb313f68a9a50e1fc96a570ee6913cec258e27c16e01c6013cea258e2cc0155d15e36e1cc8f25ce2a609d036dc259104b9cb7039c836cc2d92b96382f04380753e2dc314343c99fd17bd3a16c4d85721f506e0eb10565412c51be04500eb50565af58a2bc10a01c660bcadeb144d90bf48286db82b2309628ff005639c2169445b144390f58e5484a94cd3d947d9cff4b93ce045373fbfc59a558c9c13f881fc8a341536854145bf1f09625765667b57dfee1616d4ad62c02584747b59d855b6199b76e24029b5c4505ef0c006f6f4a784d01bcf25a93a50f06f8c644e1eda40ff31f241011c0be54003f0600c76ec97a1a8a232d07eb53a11c019a3ce3a8f712553902f8a15ffe557825ce7d3270db5081eb006c707c14fb3ef2bd0a24b2ecbb9c0a5d254037817e53d62cf18a7be81c76d41c61d65d4d85713ac038911263270f6385f3122f01b902a9859deed2e0f9a25db820c33c63cf18ce321e0a7a32fb44b5c1ab7664f4a9c0422751a26b9121a3fbebe942e74ffc6aea56a0a69e6c134cc2e1093298ad01cc2936c1ace6093406305b0098536d8249b8a8850c664b00739a4d3009eb6e3298cd01cc7d6d8219c7aee28e00e67e94305b838650e60d70b3bc166935770131685bde061a48fb53226dc7fc4d78be7f6725f38f9363131084199f6c88ed0760abd3b764dfa8b456f78d8e047da3195b7220ce7fe00d214ab231f55500e501d428f956ce0ae795159a6d9b534477935762f398c641460cac724750aace8c62e7a4bfa2aabee73b5504f0ddb811545864e5eae500ed81510cdde5fba675e149ce110c8c9035a5e6028cb3b6eca42e1418d1a46e1e15d6a100eb6c6aa7557232c33d7d39d5908a5fa66e0bb0154731c2d9abd68c70d601edcc39d4b576a50876b9e2aa83572ec5424c29ee3a2d0656b833b0c2b951b425b3ebabc771d8a33b4059428992bbf398ef73a1c3ab9032ca514cb215410d00b4d22d012d8ecba8ea0368f3a270b1c6db830bbdc08b459917f7b6e05f006159146dc1a02d41d215e6646dc1fb41cd3cdf46aca4db49c8b0ce0758cba31804cebc441a4225acadc956122d02233f07d9b42bbc2fe5de31b2d19f1100e7029b70f68b25ce0300ce0a9b7092eebb25c3390b949f0b6dc249ba51940ce75900e7229b70926e6326c3f908c0b9d8269ca42e20c8707e0d7056da8493d4410919ce06a02a3ad8269ca41e35c870b6033897d884b34f2c7116019c5551ec78944b0e0eaa656b373e03a5e6525b76e1e6538e6992a11c0f502eb30565412c513e05502eb70565af58a23c18a05c610bcadeb144d901543a2b6d4149ba8a9d0ce5e7c02a57d982b2289628c701ab3cc44e9f05843b80c826db4e6029acabedd9f6dc2f86936e2781cc7e28f54a21ff646f046b34c8a62aea000b3c2c0a0b947d9cf2b44d73c2cc4c56468e0165e4e1d428e55ab5dab972a80db0ca23a2d8e593adf345c29291ccf5e2fe00e61a9b60f68d21ccc900e69136c1245c7a400673248079944d3009ab1f3298c300cca36d82d9278630c70198c7d804338ebe7f470198c7da0493707d2619ccdd01cce36c824938314106733700f3789b6012fa392083d913c03cc1269884036e6430bb0298276e493f07b56153732e8079924d30092b2032985703982753efaad00f7390412ba082d611403bc50e077984a5229983bc9b01c653a3d89cc2f77fd7aecd29f900e16951ac11ea296aea7447d9c7d9dfcb7080f3744a9cad983a7e9ed9cf0b61f54236f4fb0a98c739c336a0715c7c7520007a262550beddd23f3146e805986c4ab62ec8d06745ef6a64846787a37c204733e8293daeae460e0268cfb6673f781cbd5d0e0028cf8976dab6a4965538db8069db73a35d3850956c10c5afe1d30458e07994d876512cb0029df1ae7d0317c5c036cf8fa23282036a533ddb5ce534721779836deeb282854ea88bc5d52251b6128e569653a13d06348b2e88a21f94fd446e1c077fff0b8a830b6dc249ea33980ce76300e74536e1243da69d0ce76f00e7c536e1cc8f25ce128073ad4d380b6289f37a80f3129b70f68a25ceb301ce4ba94790783368a2f33717325934ea53639bc5820a7f6392506d99739fb0a9df3d4104f40f00f4324aa0f264bd02a52d1ac1783bd994c54d00de3a4a786d58b64d78bf6b65c22c7e229545be031aef97db089570728d0ceadb00ea153642251c5d2283ba2f807aa58d50098745c8a04e0350af8a6a0e33f5cbebf9a5ca928438cf613e0faaa8aba96788f834c61c87409900584687ab2d15ae1600d735f66cda235c194c368db10c64e46ba95b96722d11f4e32f5f209ca92473dcd81ed8e17a4a785d997f041e1e3c5ce55c4f73d80c75840e6363d810e74995f3c4bd07510f76be2b8fcab5638b1c22e81f038bbd8e12ba3c28bb50599a10ef83b25f07367bfd965c89e92f3b493d0f92959e8702981b6c8249b8e3870ce66100e60d36c18ce3c9a6f301cc1b6d8219c7b51eab01cc9b6c8219c7934d0f00306fb609661c4f369d07606eb409661c8ff8980860de6213cc389e6c3a09c0bcd52698843e0fc8601e0e60de6613cc38fa293a02c0dc4409533a152d62f0bc3dff4ae23877258f05206f8f6256920ffe4aa911c1239b95dc17c0bb230a2bec5d4badf048007273148ef1e079cf2b8093a7dab569e57930cc762725d68eacfa187b90f14c52bc7dc96a74b0aef82e4abc5b7b7879c0f3045c299b6f24200357970a1c03d9fd6e4a70f2b0247f767747cffd59dd7fb0171952b20337cf03b6780f25d2868cf9a62edc33fae297793b011bbc977a49016f88573f519caf673bd8e1522a84fbaf484f182783ba35a870ee8b625ea7a056cdebbc006cf2fe28da93f260f6b9ce1f7954b43c923dce6b31ce03201fa004294f6ed6d7cc84f3e18da8d0e500740f46314ce15f15e42a035b8871deab7b1180f9501430b35be4d23b960368a78126cec336c18ce300da1900e62336c18ce312822a00f3519b60c67109c1b100e66336c18ce312820500e6e336c18ce31282c500e61336c18ce31282b900e69336c18ce312823200f3299b60c67109c14c00f3699b60c67109c18100e63351ccec6403d33fd84b587a92ad5abf0c0cb43d6b2356d2756d6458f706589fdb92beb5e2ef149c2394289fb7c7b7561c8f441a06cad017ecf55f4468a564fe8bda810cff62147b20b17254f5b3d537965eadf70496fa924d38fbc512e74480f3659b70922e6725c3b91fc8ecafd884b3572c71ae06385fb50967412c71ae07385fb30967612c71be0e70be6e134ed27e3c19ce5f00ce376cc259144b9c3b809afd4d9b70f68925cedd00ceb76cf2fd463a6b44d677ff92a570be6d13cec258e27c1ce07cc7269c45b1c4f927c0f9ae4d3849779993e12c0738dfb30967412c716e0438dfb70967af58e23c17e0fc604bba89f26774c2853564c3c8734013fe435b5016c412e56b00e547b6a0ec154b949b00ca7fd9829274e51c19ca01a017f4b12d280b6389b22e40f9892d288b6289722140f969144b15f00611f4d90a172b102ef9223b61ad0c348cfe4d897527a6dba73149085b2cf6a2fbf7f3aafbd2e3ba87e86e00f83fd12e6048d7f28ce3e160db8222e0b3288a00785aaa3c5780ab5dbb4e4d1d012cf4f32d59494171a4a529d932c5c9a015fa45146b3ef39dfffdc7d8f94bcd386f635d09ecf2bfd47e11f841762bd858e6ba45a960c398f48c1dbf0cdd1280fb322a673c111f1142e601610380f715253c3ed65529825dcec639375782ac1bbfccba0bc0f63525b6dd95660e742201779dd77ebf3185a039f40db5978443bc359ac3859a1cdd1421a24c3490089d4c909d1cb03db0d86fb7e4da77ffdc79443ed90ba8b02e0156f9dd966c4d467606d02a2a94c70094df4795c1c70a3b5c2e08c43b83ef0032f80f51751753bf4305d0a5ce4b5c5055d4ce28c85a97ff02587fa46e205531f79890a1ce4ddeaa9ccbdc4d04f16b20b503d87e8ac2a711b7c22a617f5c50449d4132ab7b11e0fb9912df762ce512aa52c9b21100246b2d5e0600feb225f7a4f94779e2b8e7bc1f40f96b54be8de438e4f0a4df565ec14877a3f1f56dd419c0fc5f1419bba89665ec0f00c0df2801b662fe9ef75c96d9dd2d61f626b3c8cbc120eeefb601251c152703fa0400fa876d40e3e890f90800f44fdb80c67166f10c00f42fdb80c671aff9323074f1b76d40099d4691013d07006575226826f5ae65cda4a740332941095077f67336ab87089b4a64ab87fa817233c746a8715c92350040ddca46a8844d2632a8f9006a1d1ba112369bc8a0f60650ebda0895d00b2c19d47200b59e8d5009570f93415d08a0d6b7112a61239f0c6a3180dac046a8840d7d32a8a5006a431ba112fa7c2783fa1880da88122a3fc861a158cc05a77b5323f5f1eb78f23491e81a53a20beeda8cd0613ed93ce658d08f6f6213ce7eb1c4391fe0dcda269ca4e7a192e15c05cac96d6cc2d92b9638af0438b7b50967412c713e077036b50967612c71fe08706e67134ed2a370c870360555d1f636e12c8a25cece00e70e36e1ec134b9cfd01ce6694385b64c009c5f17a3d8e4788fd0f949ccd6d8219c723c47e033077b409661c8f10fb3780d9c22698713c42ec5700b3a54d30e37884d81d00662b9b60c6f108b1f700ccd636c18ce372ee5b00cc3636c18ca30784db01ccb636c18ce31162370198ed6c8219c723c46e0630db53c2acf91162848d24b2b3aede05583bd88895d4cb2619d60a80b52325d60e1aacfac39a467a9ff8375613565213a8e05e04e0ee64335cc2e61419dc1301dc9d6d864b588991c1ad027077b1192e61738b0cee2400b793cd7009fbff64703700b89d29e19a9d3e48381a4076fae03500edae9468b9a3b4d2e4fee3948bb4b1ce27848ed2c83c84f0d55a125c179be698fa526671b239a6a1608e29d7269cfd6289731ac0b99b4d38490f2821c339039492bbdb8493743c9f0ce7b10067579b70929ef74286f32e80b39b4d3849cfca22c3f905c0d9dd269ca427b991e164a02acab30927e9d16364387704387bd884b34f2c71e6039c3d2971eea2c1996dd7120e49132ed3e1875393407e1394a8f971804cb8b08c0cf23d0072af3840261c432583dc13402e880364c2b15432c8bb02c88571804c388f4506793680dc3b0e9009e7b3c8201700c84571804c38844d06f96800b94f1c2013b693c920cf0590fbc60132e1c20d32c85703c8fde2009970993b19e47300e4fe9490831de71b474f7d1301ca3d6c41493a864b86f20580724f5b5092ce2e90a13c01a01c600b4ad2b15b32943dc1e8d85eb6a0249d552043f91db0ca81b6a0241d02a73b451e58e5204a94f0388c45decd2a16913753b2e5c1e7b014bec194f86a7e1a721c7def9d06b00e89a2f12edd16f397f9e7958c2f4273cfa99bea28c69becf27788f3213feb73b9f31ef727b58476d48a6cd5d5dda0141d1a07c884a3566490af029087c50132e14c0219e4b301e4e171804c38934006f9280079842d8d2e52f75e648dae8300ca91b6a024f5454586f2038072942d28491d8090a17c08a01c6d0b4a521f54642807825ed5deb6a024f58e4686b2114039c61694a4aebcc850ae0028c74681722ed31f3d18d91635b223810f612994e328516eefa1e456375fac0e2c11eb04233b08866cb7540540383e0a6b948df6f2b4ed49c2e112b28cbd1c64ec095bb28c84e248333699778a9d4123682225cace8a55facf7872bb9293d93036c6e940163ba24abd7bd09ff960e7ab725ad064e740fd1780de278a1234bfd695a07340093a891261b30cf5b98c29a925aea6c2b81fc0389912a3f4eee33f9f7e24e30706477c2a3d59b67e13c09cb225aba2c87c4c90b531d7805a7d6a14d99bdbe342f1d958562a3e5eea9498119592648da3ab80454edbb253745060440bcbc9663efb03acfb52626dee612d74fe4f393d182deaf152b632f6f6b90a80dc8f12643be66f71160b0bf46775ac5f14c7d3997f062dccfdb7e47087bf5714470fbc03818d4e8faa89e46facd79e0c3f1bc09c4109b38173c15fe62b918779ab8ec97091ed2a6d04701d1045fd9da979eeb744e2863a9915be0fb0cea4c42a177ef5f11aebb52313bf07f01d48896f5b961abe90ebe6228247e71d1fc09b45094ffa20934d9e54fb7128cb7c3e7d1c1b3dbb8046cfec284acba07d1dd275f064bd9d8d006bb18d584937bd90612d0358e75062950e38f0bef9545fd6ef4d3962d4840ae77f40b93ad7269c85b1c4f900c0596213ce3eb1c4d91864f6529b7016c512e7afc03ae7d984333f963867029c6536e12c8825ce6b01cef936e1243d34830ce75100677914383198d53de4128e67928d298d04536b07d984b35f2c7196009c0b6cc2497ae60819cee5a0a15461134ed29371c8709e07702eb40967412c713e09702eb20967612c717e03702eb60967ef58e26c0caaa24a9b7016c512674780f3609b70f68925ce3e00e7124a9c5d58f52509feeda97c0264a1f387ff9b3ba95a26440e4f4e904c11d42258ca3d820a760f96825d45093bd88655c2ee27d9acd25850492db50525e9c00819ca4701ca65b6a0241d1421435909502eb70525e9cc1119ca16a0625a610b4ad2592332941f01ab5c690b4ad2290e3294a38055aea2445973ef4a844e7ec9bc2b9d0a1a46876c490b85e2480f0a205bc9743cc8ecab2951ca65603dc52aa60a2124a26560641b5ca6013b3c94129e5c559cdd02ed02ca3dc06496d81458e26136c18ce37af7ed00ccc36d8249b8c88b0c663d00f3089b6012d6dd64301b02986b6c8249e89c8f0ce6dfa0023ad2269884ee24c9602680651e6513cc38baa1f81958e6d136c124ec4692c1fc1dc03cc6269871ecf16c0fb2f9b136c124f4c84506b31980791c254cbec59f6384fbd8f676ee7001a58e42f03e194632a7133f820c7e7c14e344700b7559f2716df385741fb0ce1328b1eec4aa8f13b9fb2ab9bbdc458ea5f2d9c9cab4eb3a090193adeadc0ad8ed89d4a3479522d8e56ca8b7b1ba8c95825d70f11b1cde09c03b298a51ccec2aa238f6d0f704284f8e0265ca155f49da59c9f859e52e60cae2144a94c177b4113690c84ac89f80659e6a134e5267ba64385f05384fb30927a9435d329c0d4003e9749b7092bac527c3b91c58e71936e124ed5c92e1bc17e03cd3269ca4eef1c970ae0338cfa2c4299d564098d91e284ada682273643a1594a36747d17fcf664182dfbb02a1c59279573819603d8712ab74d157c06aa78bbe1520eb9f4b09b20dcbce05556ac489dc011559a7f36d00f53c9baaa7de94652859f5f419c079be4d380b6389f34180f3029b70f68925ce1d405574a14d388b6289f37fc03a2fb209677e2c711e08705e6c134ed265356438d7039c6b6dc2d92b96388f01382f89a2f599f296c87b40ae90da36b77928a8902e8da26f94cde943713c54ec7700f2325b40122eac2103f90900b9ce169071dc35d40980bcdc169071f425db1180bcc21690844b63c940ae0120afb405641c67d7a7009057d90292701b0119c82b00c8ab6d0149b874860ce49900e435b68024dc724506f25500f25a5b40c6f130d0cd00e47a4a90c1ce558d63bddd152ce6ba2e0a94d9cc4b92563864fdeda5c02aafa74429d712fba7d02609618bc5dc249c48e38b61f9a6fe05ac542c45249f4e23732d75294b01de40097807e7a2d87954e1bcb2820d7338548a17e73a77b948f962550c21b602106f8862a82de84284382e431802b2fe8d3642251c2d22833a1040bdc946a884f53d19d44200f5661ba112f6d9c9a0ee06a06eb4112ae1182719d45c00f5161ba1c6f148db2e00eaad364225ecd79341dd1340bdcd46a8847d7c32a87b00a89b6c844ad8452583da1740bddd46a8713ce1ad0f807a07255479cc682f569b8e19bd8ba5f06d8e62040a5f4a13f7d9ccb300ca3b2951c2135b61268fc00e9753c1bb01c0bb8b12def6ce85ffe0efa98ee4126f6c692c73b71754c4d0feb60608efa644d89af9c7e5f9dea0155e45e2cfd211f582c8acf25950b9dc4389b455861abbfab9433d2987eac8c63f8f03131ef7da069470988e0ce8d100e87db60125ccf264402b01d0fb6d034ad82c22035a01803e601b50c2416432a02b01d0076d034a38804c06742900fa906d4009073ac880ae06401fb60d28e1200719d04300d0476c031ac773b28e00401fb50d28e1803119d0c300d0c7a21847e2af64769616479f9d43580ae5e394285b64b04d3fcac2587a939d0eecf2099b60c6d1326700984fda04338ee769ec0b603e6513cc389ea7b11f80f9b44d30e3e8ad730a80f98c4d30e3b82e792a80f9ac4d30e3789e460180f99c4d30e3789ec63e00e6f336c18ce376ff5c00f3059b60c6f13c8d3c00f3454a983575d7477a9c2dd95299b56036f3251bb1929e5d4d867534c0fa7214431fd939378fe3aee1bd41c67f8512a5990b54c21e12990bd4b78095be4a89b68362a57cf3566a379c3c0ea2762dfdfa1780fb1a255ce9902adbe1e4beb19c901b048a81d76dc2d92f963827019c6fd88493d4991f19cefd41667fd3269ca4dee7c8701e0e70be65134e52df8864386f0538dfb60927e9881319ce3700ce776cc249ea449a0ce75f00e7bb36e12475d34b86b319a8d9dfb30927a91369329cdd00cef72971e6b2203e44063378d641edf12872274be1fe208af128d9259d0b4e284c6fc7715c703b0b58f18751140ad99f7b40387042e61df97b60a51fd9849374a69e0ce74b00e7bf6cc259144b9c754183ea639b70e6c712e752609d9fd884b3209638ef00383fb50967af58e25c0b70fe3b8a99260ca63fa3c7d189e501a0dcfc8f2d280b6289f26580f2335b50f68a25caeb01cacf6d41d93b9628fb815ed017b6a0245da94c86f24f6095ffb50565512c519603abfc9212a5f411c2039e27404ad98bbc57e2b72c2c019a3f5f45315e84b72627381f1dc4f830dcd2a8bcd235a5c23a1e60fd9a12eb762ce54109ae0a89c887525f2a809b00c06fa200985fcb005e01007e1b4505939d47f938ae446a082a98ef2851ca530eb2eb22c60f641e68f47c6f0bc8385ae44e00e40fb6808ce361114500e48fb6808ce3214fbd00c89f6c0119c7e5da7b01903fdb02328e873cf507207fb105641c0f791a0640fe6a0bc8380e540c0620ff670bc8381e5f3b0a80fccd1690713cbe763800f9fb961c8584e2481b40640369e300ca3fa218b028ac6503168fb014c03f2901ca796dff42415799e1629d1a7f8dab1fc142403237bb5300cebf28717217c9c5ce0b73bd80f97eb44542045ff44706ae2d15b8e600dcdf94e0b8d76c8e0a2e4be5beb2e73962e0bdf865e56f0042563782f303f2596d3a3fe01e802f41894f753a5e21cabd3247c8fc5a3660561f0ce1e65022cdd4d081935ca44366aba8509e04506e458952ce18ca7ada3d9a61a4a88f61f938da97f189eb6b320bfd1064fa3a5158e85c968db3c738ba3ae90550d6a54419cc6f4c7e2c9d3d5e07fa35f56c821947678f370098f56d821947678f9702980d6c821947678feb00cc8636c18ca3b3c78b01cc4636c18ca3b3c74b00ccc636c18ce328e5e90066139b60c6d1d9e30500e6d636c18ca3b3c75300cc6d6c8219c71ed0a900e6b651f4d1b381e977f618c7137c1f04589bda8895b4214f867501c0ba1d25d6c68c4f552c733e5a9cf441582c86e2c8a0917924e0d38012daf694d0ccdc3a1236dfc9dc3a9e0bec71074ab4c13d0fc6f1e4aae160c0b8994d38fbc512e7fe0067739b7092762fc970ce04997d479b70f68a25cee300ce1636e12c8825ce0700ce9636e1243d38840ce79700672b9b70f68e25ce3aa02a6a6d13cea258e26c0970b6b109679f58e2ec0d70b6a5c429f785f3850a722778446b90c846903e622978eda25ce5d11359e531cdf91717106ff78cef02acedb7e43a24b8a08b74f49d6cc1cc04509777b00565412c513e035076b40565af58a25c0950ee640bcadeb144b92ba8bf77b60525e9b1746428bf0256b98b2d288b62897236b0ca4e9428b7070d23d7b57289689247b6d3876c7c7d6fd008ea1c45db32b8cf21c2255c643e87ce045877b52593932e7a25cbe4f34079d9c5169405b144f93e40996b0bca5eb144792740b99b2d287bc712e55ea016dfdd169485b144590fa0ec6a0bcaa258a23c18a0ec468952fa35e0a84ac5d9285cd5d1acb6eca02c064da1ee5180ccafa52067019079518074877fe1c02f5f5524cf378deff6be3700c81e519492d9b9638ca387ac09a094ec19854df6aba5997b01b0c97c4a90cd58fa2da732a6a41ba2575361bc1560ec15c5ca75ff54d978874785f3a77694935b813e4e0125ccad1903a09639bf8bbc39c6658cd09137d9b6fc6d01b8c2287c6e14b1dae473e31d90897bdbb3fd3e8efb72f702288ba26dea94a469ecc4d16dc9f72053f789624550f6c70e12e2243bebe91360997d6dc259184b9cf7019cfd6cc2d92796381b81ccdedf269c45b1c4f90bb0ce3d6cc249ba3f970ce70c80734f9b7016c412e79500e7009b70f68a25ce3500e75e9438790cf80e472e80abc977410e63ee8e47326c64cb511b036c036d99bb89e721316340ed3dc81694a4652319ca8701cac1b6a0242d17c9502e022887d88292b4f34886723b30ed30d41694a41d473a5f97c02a87d98292b4974377a604b0cae151b881f04f3e7085972777e6140be170f236ce7b751e068da3115bd24afd43c271f42e7818c8f023a39869ece99bb2958fe3be296f0cb0c851516476ee08bc9cf165207a8f2f23bd0ffc5ead09cbd10954688b00dad1512cebe755ce4226972b95d502ebfc1c20dc3b8a79f0eca6d0485d8d91c17c0ec01c6313cc38563f5f0098636d821947e7b60f0198e36c821947e7b64f0098e36d821947e7b6a70098136c821947e7b6d70198136d821947e7b6c70198fbd804338ece6d8f073027d904338ec77b7c05604eb609661c8ff7f80ec09c4209b323ab3e6234cde131d411348c8d61439c17ab9c17dd7b70406eb0a34139233dd787ec58b9a3c058e7544abc6d986eac739210b6588c2ad59e732217039b9d1695972c3ec851c6aaa21af220f35c3d16c0db378a0c2f97ba9688613979fc6b6a7c132f51e3d86cea0e32fc7ed14f6e4c12f9ae764e6e3c092c77ff28b60bf466b569bbc05b00df74faaa6878722a63284bedf25920300e112eec1778224738bfa58ea8921842dd16409d61cf1120a413c36465e759a0ec3cc0c6b32a488745c86afc1bc14ce64c1bb1923a7324c35a02b01e68cf9ea1383a28db1d64fc5936ad2c26f51443b6b2f8075029cdb60927a9b718329c2f039cc536e124f5184386b33e2837e7d88493d4ef1b19ce65c03ae7da8493d4f71b19cecd0067894d3849c7eac9705e02709646b18aceef1eaab6aca25b0830ce8b62c4b397d2908ff3c0c78d005e99bdc7ce114e6f90b9c5ed00eaf2f9361dffd1977200846c84730fd00f2ab70967bf58e21c0f701e64134ed2ed8264384782ccbec0269ca40b6cc8701e027056d8849374072619ce6b01ce8536e124ddef4686f3458073914d3849776292e1fc09e05c6c134ed29922329cdb839abdd2269ca46e7cc8707601380fb671868874f0836c86e8208075898d5849473cc9b02e0665691525d656cc3ff1963a28b176ad59fa0f00bad4a6314fd22366c9c63cbf66299ccb6cc2497a003219ce6700cee536e1243db1970c2703997d854d38493dbb93e15c04ac73a54d38490f8f27c3790bc0b9ca269ca47b35c9705e00701e12c5b903d8561988328ec7dc9c0c40aeb60524e18c1119c83c00f2505b40c6d18b521700f2305b40c671f161210079b82d2009f7b293812c00208fb005642c4f0b0220d7d80292d0ef0719c8de00e491b68024f4464306f22400f2285b4012fa48220379220079b49de74813563d64e7489702acc76cc96d58d5d721c56f36a80718213ad6269884fe15c8600e02308fb309661ce729db0098c7db0493b0274e06b32d8079824d30092b203298ed01cc136d8249d8232783d919c03cc92698847d203298bb039827db0493b0674e06b32b80798a4d3009fb426430bb0198a7da0493b0874e06b33b80799a3d8775c7711cb31358b675ba3d4ef4e3e8787709b0ca33a2d8b796cf6625a546b4e98fec90ee252c05ef4c6a78558e8045ce4b43d97c510a72efee439974dc13bf4cdc1ac03bcb6ebf86846524995fc353401979761403c2fed331b8c2b5c32bd76860a7e74431202cfdc5e58bbf878a71f6a5ce4be562bcbdb6f88afb14603d97126b6ba539c4f7f3aef0c6d3fdb5391c63271c7c23f3baf938a8cbcf8b626996dfb3e1486189639dcfb8e7385e3145e2c494cc425f03167a7ed4bbd2ddca68aaa30ecffef27788f33aaffd973bef72c04b682db52d15da1340e57441149553df5a5a399d0e6cf4426aef1d4bc4a7aeaf62580df1f5108b9c8c5f2a2c338e47d63603182fa2c4b81d28392b959a3c023b246b6d5e0c005e1c458f1c5b7ee0ef91c7f18c8c3d00cab59428db31f53cb6ec2b1dc2895eb24ae71500f6125bc1122e472003fb34007ba9ad60098b0232b08301d8cb6c054b38384206b62f00bbce56b0844b16c8c0f601602fb7156c1c7b4cdd00d82b6c054b382d4706f65100f64a5bc1124e1e9381bd1f80bdca56b0844b1cc8c05e03c05e6d2b58c2b95032b0e703b0d7500f49737013d80a311ccd875038e24a713accc10e9752217c3ce343d5a9b7e2372eb00d1892be360a4f20d9af07cd8fe59ad013c1c8e97adb80c671c5f2f100e875b6018de3dad05301d0eb6d031ac795cb2703a01b6c031ac735a26702a037d806348e2b984f07406fb40d681cd78a9e0b80de641bd038ae643e1b00bd39ba453cd934f2e3bc44a20968de6fb467da2f8e67660f622994b750a2dcdab970579096888cbd041c045945078e6c67713d00ee569b3ccdf68de5dee2d1a0a4bccd269cfd6289b314e0dc64134e52cfb2643857800ae7769b7092fa3f26c3793ec079874d38498f2623c3f934c0b9d9269ca4c73a92e1fc16e0bcd3269ca4878e92e1dc1a544577d98493f4944c329c3b039c77db84b34f2c71f60538efa1c4c92ff8cbfcccb7f8616ac85298eeb5e7387bd2fa9aaccfdd1ed8dc7d36c1245c5e4b06732700f37e9b60128e5792c16c03603e60134cc2d17432986d01cc076d8219478701ad00cc876c824938134906b33580f9b04d3009e7c9c9606e05603e6213cc38ee426a02603e6a13cc381edf9400301fb30926e10a3832983900e6e3369ed9467ad82dd9996da781c1b6276cc44ababc900ceb5081b57e5d45f8886ac2878a311c3e8a3357e8efce73e709af0aeef28172e7491e1bcbcac557b31d20339c3fc1d262a6f347773f215c0c0d672b59a5b8cbe59508d90b9da75cb32ad6931f68f124378d469e69e426b671fe5ee824d04adf86701e17371d72138d9d378a852f88c5e2fe42c6f739cf15cff89cf02122a6a54ed88b44a84b9c34e13128130e8e96286fa53699ab6f05d9a09e2b26c1b91673653231d7cbca1211d75cb1dea058a4c762df0a6cb984638a304b9e42f3bcf01b385f709f02739cb896092f18655e38ae0c1e3a0fbb820d4bbe959bd8c117ce30e76ea54891b9ce5d4e43e69a2a614409b17f9ca70a7704358ef14523c54ea8c5e2778af3ff1c61413d729dd71245ce5fee82fdbce452fd3c2f0d167a57f27e6699dc6ad24b7b8a9b46425f6a548466ef9962343a6947f3440a970aa9a333c63473fcf0bcd3244daaf4d88da7456d8effd33cddeb7be99ed363771edffc106c2fb346cff0907388eaa9c03ed7ec4be389a23cab146f72354d6c9c97f97e79e522dc1e5dedb4eff0e2fe2c2cd7727a74aba97d07d7e8394afb76a5b93bbb14d923b3889d3e1dd438a7deaa14f6509cb40537b7cf77fe5d92058976a246c6a50d76aeca445ccb85d4854cfec7eb4ddeaee5c5d2f3943c7704e585df09d63fa5075a7af4e4a5c70bbe0cd69367b017ffb1fc502dff254a9e4d80e58f139d01aeaeeb60eb1f2b9756fe72752b7fe51f2b0fd5ca5f8dcaca873a37dd6e6cb908e11f2b9756fe5a752b7ffd1f2b0fd5cadf88aad7038750520311ffd8bab4f537abdbfa5bffd87aa8b6fe3625cfad115b1fed44e81f3b4fd9f93bd5edfcdd7fec3c543b7f8f92676386f54cffb17169e3ef57b7f10ffeb1f1906c9cff6921cc70aaf36d8937b731c179bf44c8e3ffd5fd3fcda6e83eeb780500 serializedProgramBytesString: - serializedSignature: 7b0121c2fb3b62b3ca691f000fd57331fcaf3503a9ea5ec831a66bf008c0725b6738a9e649c92ced02e4ebb5f378427532bd75be70bee7ac604a318ac340680c + serializedSignature: 67e385b25fb8361d321294dd83a10c14f892db0e4c702d5c4bca455d881fd246e73f899e5ff4fba3c5632c6fbc267d18e971f7686e186db24e645fe20c01d909 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset b/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset index 3f9a0ce..98331bd 100644 --- a/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset +++ b/Assets/SerializedUdonPrograms/9c9332feabe597b4b84461fa1b1fd3d9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c16c7f3f0f7018243d1e2102894b4051212bc502c58710854a08590849036409a04a9537777a7eeeeee5eeaaed4dddd7e7d6ff7769f676eb3f3e4b9dccd933dfe2ff990cbd9dccc776767f7d6ae413673fec50638bf16b2796c221bc416b062b69aad72fe9ae86c573a3fee9e3a3e87553adb52e777a1736e00cbace54efeaf7facb3f37b9ab357c5aa9d3bd7b022675b26cecf6725cedfd39c7b4b9c3d7e74b9f3bfc4b92ad6c8b96901cb67b3d92cd629d6b116110bc54d55f2588cdb156beafc9ec0f675ce9608a5f843b2c5a94eceaff9ce992a716ea5a3b4ba6e11db4398b5d23957e4dc53c9ca1d99cb84c4a6e7cf63e20fe66e06caed20b9e5209bc9bf1bcabf9bcabfe1f5fc38b76e71926bb3c1b54a668ef33fc3f9ff87dc1fecee37ce94fbb9ee7eac8326a339909127b74334dd873aff1b3b7f3e9782fec9ceb591db6da4bc4d72bfaddc3e2c8f3f0ff6f9f62179fc05b0ef308a554b9b2e93c7dbc9ed239a9c4792c8e1db07018307a5ec175dd90d9acae35de4f65129e345b0cfb7c3c0fdfcfc4b5e790d06c8fde172db073c53d9ffb8a6f7e3f2de72cd3ed3757cfb1890f998bcf7294dff2734fd9fd0f47f4c9e7fd92ba7d10f9aae4f826729bd9e32d8f4ac94f70ad8e7db1172fb8c3cff2ad8779ed7708326fb394dce7329c8e1dba7814e4f4bd9bf001bf87693bcf7356007df3eaf1ddf048e2b79fcfceb5ef9715623e57647b91d257571fc6aeed949fc41e5cd9ee098d235533ef30d4dd7deda71757d2fcd8627c173f9f1373539faf1d1203d9b69c7da81635bbbb66764cafd31ae9d33f3e5fe4eeefe58950fea1a43c6ba7232940e8a550b965a7c6d2eb7e36ab93e998c16723b3e808c962eafc6f949aecd06d7aae74c70ed672a2e299e2f806b547c6b24d3f22ded78863cfeb676bc3172bc0972bca9765cc59017812e2f6af7bc24ef7907ec3b7a361da7c978595ef72ed019ca53e7dfd3ee7b451e7f1fd804ef7b05b9ef55edbe26da7daf22f7bda6ddd754bbef35ed3e757c10d8e7e73f706d6ca2ee9fe8ee3755b1bfaef96592dcbec1bc65ae8a13af336f99f8ba4c0f59fe71b1e2f864b97d5393f3667239cdfa26d1712af3d651545e506cdfd27ce52d29b35ceaa6cafd4672fb36f3966df9e03894b7d92baff943727f67b9fd495ef7a1dc9fa6e9a5cebfa79d1f049e0bcfab34f89f3cfe11d8e7db3f91e74dd7ceebcf9b01d2069e9fa95df79f3cffb1b6ff4992b469a5d9fc0ef3d66bde71d9b5f8a71676b36a61a7ce87c54ec9c3d8a9f318bbd9da757561276de57fc6e3a0f251e593ef4b399f826bd571befd86797dff1b57462be5f3199abc77e5f59f817d203716f39e17fb7cdb00e82859c71a268e89f3ea18bfe66729e773b0cff5da55ee37d6f4daace9b559b357f9c317601fc61bf5bc2fb5e71d80f38fcb1e04f6418c6da9de43e6f863e9bcccd660e5bc29268e2d90db02704cc97e0f1c833e20eb8379c7cb6373e5f60370fd7be07a750efaec427fec3d7628ced08e5d0c7628d91f1aecf828891d1f83eb3f04d7ab73d00ee5434d34f99f6876a8bc07edd82d453b94ec4f0d767c96c48ecfc1f59f82ebd53968c7ee72db5493ff856687f2f9bad8a1647f69b0e3ab24767c0daeff125cafce413ba6c8ad8a459bc0be9307dbf6d5aefb9679cbdf6f99271fc6e56cd6e47c83a4fb771a2ffdfcf7daf9efe5f6074d8f1f343d7e94e795dd4a7fbd8cfa02e8a1ee83e7bfd6ee57b16a13d877ec6b3743bbee174d3ff53e3a5d93b3d92ba7bd6abbd1fdea578d837efe37edfc6f72fbbba6c7ef1aa73f104eeabc2a5bbf007aa8fbe079c5492f03ff629e3250ec43f97fb344dc36ddafce2bff59845cf78ff69c7fb4e7fcabd9a9eee36d70cdc0357cbb078be7ad0e8a735debe64bdc6d4cbd8f6d02fb7cabdedf5e00fbceff0eb2fedbe17c2967a93cdf5893d3b816390f25d1b19079ebe67b324f1e89a977c277c0be23b36353f7be8ee3bc691153ef8a2f7ae5c59a6af2367be56dadda4165fd32d69379eb7bcb34bdd4f9f7b4f383c073e1799506aa9de423b0cfb799c8f3a66be7f5e7a93cbf543b5fe4bd2ed69b79ea97f17d1f75f35833e6a99bc7641b7227d5c684b12bae859d3a1f163b250f63a7ce63ec4abcd7d589dd72600bdfae60893c2eed6165e0d852b9dd8bc5f3fdf01c79ac543e17b4a1c754fbd2de72bf05f3b4a78a7d276d3aabf62b938eea9d5fd51d555e69c9bc75f896f2fc2ac3f357031b54bdb4021c5331a61538a69ed33a61eb10d5ceba529edb0a3cab15b85e9d83e9b58fdc36d6e4b7d1ec50f5f1daec50f52068878a71b07d523d47b54f9aec680f9ed5165cafce413b2ae5b68926bf8366872a9feb6287942dfab2743bb64e624727f0ac8ee07a750eda5125b74d35f99d353b3a07b043c5f32e063bba26b1a31b78561770bd3a07ed68a4c9edcebcefd2dde579f5fed78379cb77fd7e755ed523aabde7d91a0387b5095bba2bffad6b3d40e9236342ac8fd4e75bb0ef5cd3bd2289ac7572ab62b9ea637b07ec731957499d377b9f1debcbbce5f33a701ccadbec95d743f5b7a832663be68df9ebc17128374b5ef79db6af62b78a29fde4f1e7c13e7fee43deebd87e72bbafbcfe7bedfcfeda73f4f307c8e3ea5d21957257e9f6b257b79eaa7c38504b9b83123ed3eb5db97d4893ad7c765b4df6b652b67a9f3b5893bd21213bab1891adcaddfe9aecfe52b6aac71fa2c93e3421bb6fa6261b4bf7c3bccf46d3ffc75ad27f7b2dfdb777758d3f3f9de9aff2ab965662dff49e72907ce60eccfbfea1fc078c09880d00d7f2ed40e6cdbf035db9db283e19da33b2993786676b7273b4f3d2476383800ecaf7066bcc07bbcfcefcc47d6e6f557751699fa7a5fde1e038d47118f3e679b52fe56e739f96f6b99a1eb99281aa271ee1e5194f87f76ad14fdd37483bff9e765ebd8f1fe43daf98c6ef1fa2a5bfba7f86765e977fa4e61f4abe92abc65d7c04f62137dd9ea3b4f3ea79aafea5d241f5f17e06f6a1af8c60def77a25ff68edbc927f8cf7bad848e6a997fbcea32391f37a1ed5ed1aa5d9354ab36b47af5d71ce3b7ae5d648df01207d1d3fcd54f11d8b03aa9e11460c3954ea309a9963c81896c8bf63c0b57cbb13f3c6909d5cb95959524686f68c711abf719adcf1daf9f1723b16e830566e27306fde9de03ebb5f96fbdc7e1be4b3551e55fd3e7a0cc9d7749cc2bc3144edcb18c2c57b62c8444d8f89ae1efdaf92d71debe589c6105d3f75df20edfc7bda7915430ef59e574ce3f74fd2d25fdd3f433bafcb573164b4265fa5c364e68d2193356eba3d4769e7f518a2d261aae60b53355f99c6bc3144c93f5a3bafc710795d6c67162c86ec8c9cc76288b26bba6697aa3329bb6678ed8a739ee1955b237dc780f4e5f528f58e918e18b241ea30939963c82c96c8bfb3c0b57c3b9b7963c86c57ee00bd8d423d63aec66fae26779e767e9edcce013ac87eb9d87ce6cdbbf3dd676f27db3fb77b4c3e5be5d1059a4f1f0e8e431d7765de18a2f6650c19a0628e8a21059a1e05ae1e3ba8f7c5e3bc3cd118a2eba7ee1ba49d7f4f3baf62c806ef79c5347eff422dfdd5fd33b4f3ba7c1543666af2553aecc2bc3164178d9b6ecf51da793d86a874d84df385dd345fd99d796388927fb4765e8f21f2bad822162c862c42ce633144d9b558b36bb166d71e5ebbe29cf7f0caad91beb340faf2b2ee2ee06f758d217adb836ae3fd16ecf3fcfe4d1259ea9d54c59325cc1b3396b83206f675f51eb8d8fbecd852e66d7b381e1c87f2366bf2d4f52a7f156afeb81e1c877297316ffe57fba9b4b963b156d95ec46a8ef950cf2d669ef81b2b02c7f9b644e356e2cac8d3c7292879a59a9f956a725768e757c8ed72a063134de65eda3d7b6932cbbcbe1bf79bc2844c710de01edb5bdef313d877ecca9ee1bd5ef57da3d71f00f487f79dc0bcf9b4b16653b96653b966d332af4d4a3e3b51eeafd4fcf324b955716e95d717c4beba8f6f576bfebbdab527e76cef75f1f6990a79fdcf609f6ff791c7dfd6f4db47d3f317ef71715d33ef3dca06612b8ca1cab641601ffab97e7f59c0fbcb03debf2ce0fd45feee8f3fef875aaeffaa96e77d56c7fb9705bcbf3ce0fd6501ef5feebd5fe5c17819a7f8c8326e908aa141ca38159bab58221fa87a67b594b309ec3bcf1c3255bbae8a796240accaab4f6c8de66705e038df56caf3bf6a722b35f9bfb8760f59e195137f8e2647dd2fc60b4139bf69e7e702dbfd8e555fad715ccbbce5d45a97d9d046aeee4355fba08a83ebbcec94bcd83a4dde664d5eb5578ee82b4a66837a9eaad76d02fb8ebc61cf69d7edafa5e9fe1aebfd341fab00c7f976bd96a64acf61e03cd867aa1cf81dec4379aa5ef90ed8e77a3fe6bd3eaedf815e9f5372e27255bbe5575efd62076afae9d7ffeea6e33055e753fd4ed02ee8834a4e6de993ccc7547ff9c140867ade0656b34ea5ea3287306f9d6a0338ceb7aadde51db0efc818a1c65c6568f20e67def874b826f708edbc6af33c12e8a8ea3f47258ec58e04c7f8f63029e773b0cff5da286534d6f43a5a7beed19a5ec7306f1d46bd0beda53def4bed79cf697214ff8c0423752eee771b9827460fdf15dccbaf2b0de00727cb341991c2b5aa4fe99400cfeb23753f56daf402d877f88c7cd3d56794ea333f559e3f4e5eff07d84f226754b2794fb2bf3d06ea69e26f7edfaef2f9aabda51f722ddf9e008e9d20efbf49ded75f4b435567de0cf6f9f67820e3782943c581bee038b4515eb7a34ab3d3e4f674ef33539a47aa9e7112d0e324295f9507db82e3500f75dd43f2ba6c70bdf28f33e4f64cb99d8ee8a6f162aacf5495ef67c9edd9deeb6327cbebfe04fbfcbc69ee5f2a7e798a66e329ae8da32b5c59a337caebcf91e74fd5fcf2d45ae43c9644178c812a4fce95dbf33406a7690c943fd48581a3e398c5ee3d63928d7f5063212f48f2acbe52de5d49e4a8b2ba3ff0996c70bf3aa6e66df603c7da8273dc7e3537aa1d72bc2d906fba5e3f9e8cd585727b5112fb951d50e7643237caedc549642a0e308fa9637d537c8e9c3b3a36df953d76d724f7489f18abe6ab5233bf44eaf44b129d343bc6b574ef199799e49e4bdd6bc6abfacc65727bb9dc7662deb8f4578acfe7db2bdc6dec7479efdf609febf785f73aa6c697411bd4355732ef3c5e397e28a579bc32bf8dcf4a72ad3c173b03e8d0d3bd6fa2ccd3b1b3a41dff807dbe3d9379ebf967cafb54b973b53c7e7642b6ba975d23f7cf9532fe05fb7c7b8e3caee6995d2b8f9f2f8fff07f6f97935e6f502f73c9f361597a38ef3ed79f27c0cecf3bfa5afc42e94e71b807dc7a6091b802dfcfaf6609f5fdfd04d97891b34b9bde5fe45f2ba46609fcb7d5393db2145b94adf8be57519dee7c5cf5fe23d1fbb181ce7db8df2bcaaefb6d7f4d828b797caeb9a308fbee2b8ae2fb4278bc563d67455879231648a8a21aa9c53ef1bcaaf5e06fbdcaffef0ea06654f794893a5daf2647ac6eb59323df3557e6a8fcb42fd5ea665dcef655a7aeeab8b8fb705c7f9f632c9b4a9e138df5e2ecf3703fbf07873edb8f295169a2f5c218fb704fb5c9febe4fe95f27c2bb0efd83be9e8da19aab81ebb5aca680df6417e6eb015d8e7dbab345dcfd16cb9469e6f03f6d57d300eb4d5ceabe3edb4e3d7cae3edc13edf5e278f77d0ae57c73b7a9fcbae97fb2adfa932417f1ebc8e6f6f90d777d2cedf288fab31c137787d80ddc412b1f54679ec66704c7263b724d266861a9f2baf8f4119977965c56e66de78799376fe16edfc2de03e1837547c5179b73d38af7c47c517102bfc963df1181366d9a3e2d2ad09596a3d97d86dccdb86752b380ee3cf3b609febb9ab2647dd773bf3b633dc2eb72ae63c0ff61d3953ff7079f1e11c825b8e769f5e5e9e038ef3ad561eb2ae9a3e2a667401d7c3d8a1624303b0efe8354df9492de5a5d29775d39e7b09f25c3dbf3402fbcedf3b6769cf45cad3f873757b2f459eabcab93b98b7bcd5f5bed37b7f0df97769f2ef04c7f9f66eaf7cf13c759c6f376af9092bafef01f909f010c7751e40bf78fbc4adccd3c63475a9c655c57a7eec0c700ce4cd065dc13ef7f9cb247b35ce747beff5f1776375bd6af7b8d5bd6fa62c8fd86dcc5b27ce06f25279df91b189291fbd9779cbd17be5f63ee62d83eed5ae5773116ed1e4ddafc9bb5fbbff0179be1bd88731eb3eedbaee86fbf956ae75d5a087f6fc07e5be2a3b581226c938c9390633554c55f32ce458f3063de5be8c35f177f7752c31372395f7941de4735e4c726d36b856a5f11dee3366a532ffe34e79ed46b97f97fbcc59aa4d43e62f26f307da66762ff03d2e4fb64fc7dfb9a17ec9f4e9a8a5f94392692fb0cff5536322d43bdc7640fe76de73b187a58c4cb0efc898adfa83948e77d5a2a3ca9faa6ef328f3c49cd86372bf3738af8ef3ad5cff2d5ef7d1f57c9c7963f7e3524fb5cec3d5400e9497e195173fff843cdf07ec433fddc67b7d5cfe939a1e4fba7acc2946f4c6aebfcb7b9d278d5261cedb730a101d9f62def2f529f799739b223a62d71704d411e6c1daae4be6f73da43eaa7d47c646a6c68a3f2df5efabedcb7677a662a15a6f6e13d877e4ce2bd7e43d0b7455f55ed54f27e36b7cdc8a3abf3f90613aef67ae8ae75c464cccfd9eca4a5821ab60d92291784aa4bac4a7bab3f6c53db9e8c622f233beca277f6c35dbd7b9b5c4b4c2e602b17e6735cb63b9c61536bb88b9aeeae913c5ef42e78a322174db06351e71778d4770e5ca9d9f12b03c6895737c8a585d942f105ae69c19c466385b7ed75236982d727ebc52163a8f2d676b9cbd02e7778590b7d451bbe695b599c49712d5ef99e7c874573a5de91c51402b9cfd72a1e17cf17badd0b444683fcd39562dd65d5dc54ad90467bb5e3cada6ed95cedfa667164864661dcd0b9e62c7dd65555532e53bd670edb3854ffeff14a98f14e1e81b6f2bf361a36c51721c5b2325fe3f4337c8f0027e9a943158208b798ee5b26c5107985783a07f1b6b5a68f66f97f7303624a92d66323cb9bb090b1229fce02f5fee7ecc2b571d91e1352d8f658bea55f75a4c4b0696cbcb12b3cffd989091d128872baae38f99f08bd7c9f969c4ef5e5726aef39f008d45e1e74d00b1bc4081f3c77ae77fb973f178e770b1887f939d8bf842d4bb0bc54a588d34cae1029b08cc350bd1da54c54037308116f5bb827af1736c99ede4a89bc6ad48a0ce1635afce491c127b96a8323590f5269565de9c3964f88e39232fce30a74b73912e75791a96320d4d29d33cdd59a0f6989f2c5d5ac4ed4aa40bff6766d812f1edda74c0083632116c513fbecd75af9b6ff38e8f811a4333bfd6497d30990618c10c1341d153b3208d04673b1aee256b8a7563b855ca0cdb08865d6a58978a0e18c5c6068a399c625b935acd34b5b84688e02698e076010537c504b70f28b899c9a15aa53b4bf273ab859442e75affeec4dbbb77d0c39ad99f3a2279b27615306f6a6e4a1b8e706ba3567ae274c413a70526b95350c92d31c99d834a6e657228d1cf9bfe7a7addca481e6b3aa55c467665c9aad97e4bc8d6267aa2377c3129bd9acd47eaaf09cebd2b1c0e6b459d788d73bfa9b92939d16e2947fbee826626333582f9d30823bc95c9f339f61e58b2ebcedf1577fe36a6e41307cb49936f8173cc6d7d9b24ce96891716f832335fa2e2b238aedaef9829bec3b34668933c797ba69cbcbd44f2f2de566a8db1e46f6b4a217170ef7a4921d5ec56265e352b935a3ac771fb7dc597938a9cdfa9a74f66cae9d35ba44f7692f409475f2c75da9932274f9d3ea954737ae319b3bd29d9c5d3d2db7ce1b60794b3e46d61e664e41d57bd6a04a80d63cd49d99761ed12c975c092a683296938c17e46b50c71b32f9e3c1d31e1db9a858ff3237c6bacaed3df50d789f9a9eb74c2d4ce32a8bde9b9193bf951bb33a6f67641d5ee62ca0cedeb2f0616888fd4f1ee86e5c21157c65fe89245219e25528f81dbc76d060d52c2a79345bb7034932b8ab9ff9a20ed55036a0dbde12883e5efae26a710f9329d2d0b303ad5ad6561a029a14508a8d98690cad3f8d00ffef62d1aaf90b4cb66e6368a54e463e9d1cd94fd797ae4180ccce1060ef66aaa07846c3c2074373d8b579473532976bbe3827b60312ccf10c37cbd66f6c4240f092ab997292388485f5a2fd1917f2f9337727197c90b392af2f14c0df5cc220a9e1d9204a2601a6572174dfc42b2d43091a5e8b4c0b25d2656a40f3714e9427f1f457a6f4cf8881084f7c172c448438ef0555fd806933c2a685eeb8b49de31a8e47e98e4d141256f8b491e1354727f9364de34c1978a0cda349185f9ded8107c6f3b4cf8b810846f6f12ce818f0f0a7c074cf284a092076049393184a41c6812ce5ba1f3e3172784ffe7fcab21bc252e7c10a6f92483e6319f9a6763c0271b80fb8a513918932906261b4c6a27613218133ed520fc649fc27331e1d30cc237fa149e67109e2ddeff0e61e96d4f360f619c22be4e5ee2e9cd53cf75475d708dd418b679ce76b9d0821f570d83c99f95bc02b43333bc2d8857a1492cf58198f456f0098ccd4545db5c5de28bb76559a63356c51a627278de73ca57bcac313e87b7fe2d91bd29fcf9abc4a939ce13786a4e9355be1a79a2099e27869af28478dd5a55af7982575ad788f743fef75a990205e2d989714441bc9d2f59d9c350f88802c8e857b3855fe5a6e05761688f79cc30ac4c9a1342693a1c2b93e61aca245f958011264713efda73491dcdffe04bb3bbcc330447e115f38557f07c84bd72cd771eb942c68bb0ba0c8c0e5a2054e9588367d29191487a8dc44ae205869238ab91bf92781416f5f83ac0b5b6b12409673b6282773185539e95260aaf592b12a35a66ce4c4108265395738cbf5d678ae458290722f33d95b43c91b8e04c21c30dcf15424a215343c8fd5832da945f4413523a3b696081e83fcfec6a4a4da3e7eec6cc1d34b53d1ff3de3198f7ee6ef0de3619febc77274cf82283f04c9fc2c762c2171b84aff0297c1c16def7081adec76392f70c2a79020664890948637f402662c2971a84cf69ea4f78be49382fa90b59f0927a92293e8886e032d2f890ac5dd15b5d0eb7757659cab1a448c492812c79bf7d305db1b833192b7f8a03166c534cc92d5ae7d3db239518c75fb71ea99294937139c3fa916ad7014b9ea958762f3564f721cdfc65f76926e1fcfa15ccf05e9dc98cbd70a98ce4e519bc7123e6fe1be4fc6b52b3832bc928d79d4d7a724df632e899c34310ef096f2012a55c24caa02479cbf42aed3f77d5b067066ecf742cccae3484d9063ec3ec0c4cf82a83f0863e85cfc4a2055ff6b6466d95ab62a29bc9f66739ec405143e519a3c4e1a86aab9c2c675d256ba4998c8f23ab66039ded72e7b7db895e2aeab225f117552e71b090b85c848595e23e2edb4d377e3ed7393fcad9e639dbdebe42d92c2c9f5498fc8fe7937d8239fc6c0c73a509f3d25030d71d66265be7448c32f982b1422450b18cdc998ccf812c16af1425f25523d339c2e5960a2daa9c1f7fc931078b8955869838a2b5bf9838d7546c899ebf740e801eef5cc53d7ddf3a1458d52917586b9879f073f2a76345d53c53b270726b4d0ae949b2064f92f926c1fcc5725d2a8277c305179804f3169ef5a9082ec0052fc004f3d5d39b69828b4c313889f08598fbef67707f3e60da8ffbef8269bebf41f3263e35df15d3fc0083e64ff9d47c372c661e688a99cca47a9298b33ba6fa4106d54f6ee34ff54598f0830dc2bf69ef4ff86293705e1fd8c082bfd3ed81093f2404e17b62c20f0d41f8129370fe367a582a79bf0817bc14f3c3c353119cc4050b312f39c2e0252f76f0e725cb4cc2f9f54732a48ac317df0f50c529c2301d6dcaaebc06e6b78ac3cb661b6b93c518ea6330d4c706435d82a13ece847a5968a8a353a35c8e65ade30d59eb934efeb2562916c64e08218cadc0849f1882f0322c469e143046ee6512ccd3e7e48031726f0cc729061cc6b135497094635e72aa290077f6e7252b4dc279edf9b4549024a93dafc2049f1e50f06a8cf51921b85e854938af879e998ad649eaa0fb608978962111cfeee22f112b31e1671b842fedea4f781526fc1c83f0ac6efe845763c2cf3508ffc5a7f03598a79c1782a7acc5849f1f82f07598f00b4210bede249c0737beae708d72990f74f05b2e57cb32b6b40e951f7f25e8be982d17996ce127323d4ff5f3acfdb0676d343d8bcf125ae2fce438ff8b6a74a3f0337cf9bb4a41d68f16fb635a5c6cd2a21dd062a5aca3140af675d7e0004c834b4c1a34071a2c71def32b45e3b6bfe2f5402c4a5c6a0a413dfd458983b0bc76590879ed604cf3cb0d9a1fee53f30d98e65784a0f92198e6571a34dfec53f34331cdaf0a41f3c330ffbcdae49f7c94ee2219cbf67062c322198746c97703f7d8ae623b90ede4fc9e0462963b94850f66e1c35f2a9c632b447c592f9a5e4bc4d1629f31ed704cff6b4cfaf3813c098d263827aa446455368d92f6ec61687d7763b6fe9eb3525c51151fe2b35a1c2d16d1c36d46de57dce9c7a6234c367107b9367e427bf9141f4768c2dc7f83dc7ffede3f8f343d933bd9f506276be4d3c98ec284df60109ee153f8d198f01b0dc21bfb147e8c4938077d93c9bdfaa6943ddcd7e76c673b441e73b3cafe6ca8bc7698b3f5e330c7620e7333e630b7047698e3b067de8a3df3b6c0cf3c1e4beadb438884279884f31e0cbeea79901e8c1331527762a4c4370b3220297f9c4ec238dd1d02a7934dc27959770fab59d64d1de9afac3bc5249cd7cbf832f04167399d6a109e2de6f42d65e918953e9fe5b3e9f15267903c3e470ce6dc57c81b2f9e9018c5edbd237997e27d2637357629f225c0b344b00a4b33acbbf1345372f241210f985c9f3b1dff94829c85e163b0c6e9a6e7f050f310338469ee7f4bc47c0bb7465224068814faae699f8159f73066dd2375b2ee4cccba474dd6b512d64d1635125e3759e1b1d48f7d676139fd31434eef3bda5f4e3f1b33ea7193519c6a81f6a25c121f119dc9b2c46ba39b65c7c812783b5fc69e63d2870787274cf94a177c3f2ef85c8ce293068a5963fc513c0fa3f89489626723c5f5e225330c86e763a63e6d30f5749fa65e8099fa8cc954beae5ff01c7e2166d0b3268376f267d0459841cf990cea801a344ba4613578b1f163e246ccc44d0613bff069e2c59889cf9b4ce4f3d0b0b855b7f4bb0433ee0583716f8ef567dca598f0170dc273c6f9137e9949388f822f31a46ce11f6ff45fb65c8ea5d02b5800813305135351126b78ab35bd6730beda6785aff4bac2a40d2fd05e6501c7fb5f8925d66b264ff099585761c25f37e5219fc2af3609e755e23758f02af13506e1d962310ade07634f957807b9345311db5b36b5e40bb72bf4cc42f35f69e65fc5f1375df32da626e6a5cf06ac7a7dadc9357890781b0b12fcab88ee98eb77596df3196a2e86453be2fa3a932f72df4debdcb47c51075ac6eab680e07b8ea6bd35f08b4f7ae4d7acc5df238b08becfcc73d46ad303f389ebb170f181395cf85ae7ef062cd06d3604babe53fc05ba1b4dc239980f59cd259472785194c998779d23fd69c3f0a7dd843ded238aa7dd8c3ded638aa7dd823ded138aa7dd6a7a1a778a4f0d4ef1ee747f4e711b26fc3383f06f7c0abf1d13feb941f8c933fd09bf0313fe8541f82f3e85df8909ffd2203c73963fe1779984f35ad8572c602dec6e93645e607dcd90028b7f92d47fadf61ed37378bdf35b86f6baaa7a2bafddba5fe3f25373bd174b90ef0c09b2c26782dc6712ce633aff509e71bd5a1f31fd7e8cd50f26567c22c222f0359f5149bee6c3bb36fc307c00d3e4479326eef254e897847c3cf741ccdf7f0aeaef0f61927f0e2af9614cf22f41253f8249fe35a8e4474d9279b7c46f2c78b7c46398dabf0755fb714cf21f41253f8101f93304204f1a8467f763e4af76e95baf247955fc2f9642bbed7c9cdf53a6c4e1fcfe0e28f869cc9ffe09ea4fcf6092ff0d2af95993645e2cff2f151849867a3e8709fe2fa0e04d26c1bc0ecce715855e077e1e7b5a8ce2692f6071a3412c78dc781113de3004e12f9984730f6d140be8a12f9bc29d5848b4febe3ae11dc618fe8aeb19b154bb7c1bc752f9ea44707db15689574ce9ce179a686232414ff6e578b2bf8a096e1a50f06b98e0660105bf8e6581e641b3c01b98e4164125bf89496e1954f25b98e4564125bf6d92cce358eb10e2d83b98da5b0555fb5d93641ec7daa4e2773c9f2382df3309165fe44b457092d146ef63a0db8500fa030c47fb80383663f9bb43c0fcfd21c6b96340ce1f619cb70e81f3c7188e4e01717c8209ee1c50f0a718e72e01397f8671ee1a02e7cf311cdd02e2f80213dc3da0e02f31ce3d0272fe0ae3dc3304ce5f63387a05c4f18d49308ffc994123ffb7188fde21f0f80ee3d127208fef31c1db0414fc0386a36f08387ec484f70b41f84f26e1bcfd71db54902469a8fc19f3bdfe417def178c4756083c7ec55c64bb802ef21b2678fb80827fc770ec10028e3f30e1034210fe27e67b0303fade5f98d68342d0fa6f4c787608c2ffc184e78420fc5f4cf8e01084ffcf203c5b7cc2844fce4f7f9b4618abf0256fd1c84dc54bcb7162ff61ee9f17d0fd79aba1319d878490ce319370be86c3d054b44eb286430383e06cf1999ae5f5e240748e332ce5a6b0e1a2298c7ff186424bac01aca12989794a8c48258987e3efb18d4c82c537a982d6093230c9a3824a6e8c49de31a8e42698e4d1412537c502c098100240334ced9d82aadd1c537b6c086ab7c0d41e1754ed9626c9bcd9677cc0669f5626c1fc6d7642c0b7d9d618e8892180de0ac3911f10471b93605e839e14b006dd16e33c3920e77618e72921706e8fe1981a1047074cf0b480823b629c770ec8796b8cf3f4103877c270cc0888a33326786640c15d30ceb30272ee8a719e1d02e76e188e39017174c7b49e1b82d63d30e1f34210ded3249c57fce7077c43e86512cc5fd60a02bed364621a2f08a8716f4cf0c28082fb60f5825d82d60bb6c124ef1a54725fcce9760bc1e9fa616aef1e54ed6d31c98b824aee8f495e1c547216e6777b04f4bbed30c17b0614bc3dc6624950163b606eb73404b71b80092f0c41f8408cc9b2a04c069924f36fa517a5928c49be959e8d55a38b0356a373b0069c92800d388331c8cb8342cec5249706959c87e5c2150173e110cc9dcb4270e7a158f1bd57c0e27b188663ef8038866395bbf28095bb1198c62b036a3c1213bc2aa0e051188ad50151ec88695c1150e3d1982fef13822f8fc1845786207c272c7054050d1c63b1b85f1d30ee8fc3e2fe9a80717f3c16f7d7068cfb1330c8eb82429e88495e1f54723e9657f60d98572661eebc5f08ee3c198bfbfb078cfb53301c0704c431150b7607060c76d3308d0f0aa8f1ce98e083030a9e8ea1d81010c50c4ce343026a3c13f3e54343f0e55998f0c342103e1b0b1c87070d1c73b0b87f44c0b83f178bfb47068cfbf3b0b87f54c0b83f1f837c7450c80598e463824a5e80e5956303e69585983b1f17823bef82c5fde303c6fd5d311c2704c4b11b16ec4e0c18ec76c7343e29a0c68b30c1270714bc1843714a40147b601a9f1a50e33db1ec775ad0ecb704937c7a50c94bb1fc774608f9af10237d6640d2cb30c16705145c84e1383b041cc598f07342105e82b9c8b9415d643956749f17b0e82ec58aeef30316dd2bb0a2fb8280457719e6771706f4bbbdb0607751c060b737e6161b83ba4539a6f2c501555e8965934b42c826ab30e19786207c3506fbb2a0b02b30b52f0f41ed7d4cc279bff715a9a464927eef4a93e0deceee95a9084ef2c9a32a0cc75521e0a8c652f1eaa0a9b80653fb9a10d45e8ba97d6d50b5d7616a5f1782daeb311fb93ea08fec8bf1b821288ffd301e3786c0637f4cf84d21083f00637273502607626adf1282da0761c26f0d41f8c198f0db4210be01137e7b08c20fc184df1182f0433157b933a8ab1c8649be2ba8e4c3b10ae5dd012b94476015ca7b0256288f3409e643c6ef4d45709221e3476182ef0b28f868acda777fc06adf3158ddfa818075eb63317f7b30a8bf1d87497e28a8e4e331c90f07957c0226f991a0924fc4243f1a54f24998e4c7824a3e1973bac7033add2998ca4f0455f9544cf29341259f86c1782a208cd331959f0eaaf21926c97cd5c46762c117ce3e1353fbd9a06a9f6592cc3f44f15c2aa4937c88e26c8cc7a610789c6312ce17c07a3e46b000d6b986a7656fe7ecc6f8277aa3b06c79dd962b7fc100339b4f65135fe6a3d7ae61aca9f31cbe48549598115726281993d3bd9463ac1642dd4bb377e0ca0e62f8e4bbb98e51ee07052ac515fc2ebf93f0345da47f99a703be18e3d301d3830f9b1c781e96335f0a21679e8fe5cc972972e605d8d35ea178da8558147e356814be0893fc5a50c91bb1c47e3d84c4be1813fe4608c22fc184bf1982f04b31e16f8520fc32cc2bdfa6f0cacbb1a7bd43f1b42b4c4fe32cde754ef4368033c27b1f7fc0955856782f6856b80a4bf3f74348f3ab4d758401ce6e3dcd7d9f203fae55ecdc1feedcf70f4cb502fe658fa4b3dc83e8d3c8e8b5e6a348b9bb3956db34fc200a6225ed3526a7e0d5915851bd38c53c51a708d71d3e34b9035ffa33d63f09edba698224ee472271291e674ed66bb188fb3145c4bd0e7bda27144fbbdee4b2398cfc5d2779ca15892a6d359b2aaea158bffb53931bf37abaa8acd36b87b8f667f1f78574a86076891bb012f9f3a025f28d986b7f41e1da37614ffb92e2693763b58daf42a86ddc8209ff3a04e1b79a84f3ce9c6f62c13b736ec3847f1b82f0db4dc12b9767e2b27a095ec1bf69963c687d974a1bddbb38af3b3037fa3e0437ba1313fe4308c2efc284ff1882f0bb31e13f8520fc1e4cf8cf2108bf170b71bf5084b8fb30537e0dc194fb31537ea330e501cc94df4330e541cc943f284c79082baeff0c5a5c3f8c49fe2ba8e44730fc7f8780ff514cf83f21087f0c13fe6f08c21fc780ff2f28f02730b5ff0b41ed2731b55983806a3f85498e0595fcb44932ef486cd020588fe33398ca0d83aafc2ca672a3802a3f8709ce6860f832daf14c75662c70aa2dbc7ae456a5568abf135f6f5e2e3a2f78556a5afccac447c4ddaf6f973895a1b5e2ea416c89f3335f9c2d7624ae11d51f2e37714f3e2b89779314b3c9a2b2b5523cc1bd37516572ab6e6eb789f78cab5f9e63e1922456f08ada1ac63f8a9a787a81a83a2a995ea90b9dbbf8d7a6fc50df84516f6ca23e2a4edddbe9b3405469cb657f995b715d22bea25d256fe77ae9fac23528f57313c497b57965945765fd58f43c6651139345e319f6920bb573ade15ffae636f10a7bb9a8a29749cd6b97109e7d2f60f63535d9b71363499e0bede236143afeba2f9be59c2d051d9ac9750fcfb21731cb9a992ceba75936ded1bd52e44bd7aa52e728e73e43e49c52e7ef1535744de4433f7abe84e9d9dca467bea667e29990fe14f16aa53a850b1c5d4d6c61dcc08e87951a2f6356b6c0f251ed564e62fb88aeef72995bead3be5730fb5a9aeceba3d957333a4c11fea63e73aeeba98efbd1f0554cc356a9e474f5443ffc13da9b8f86c5fe35ccb2d658a9638eb0c9beb7e88d0245b2fce467f088bd50a6286fe8c8f365d1eb98455b992c5a885ae4d5a0b6b44b4546aa578595b66f6024da98480c09216d79d4e75fc85d63ac83b975a5729f79ef4dcc8ab6262b46a3569835af929a9788327799d0ae66fd2879395b97dade5b9855ed4c560d4363ba5ed62a3f4a16cfb13309597e2c791bb3a4bdc9921149a277705bccd2fc58f30e664d87ba97b5bcde53e5fcd850977817b3afa3c9bea9497393f7038e754b3dffd2fd58fb1e66edd6266bc7f8f0cdf9326ea49692c9de3fea123ddec7ecea944a9e836fc3c1f39c599a1f6b3ec0ace96cb2666c4a796ebc43b4188c1a0d9ee7eaf686b219b3ad8bc9b6e901de50663b7f276a26f519633ec46cee6ab2191f9453b366afea19ab644b4f325ff4a3f14798c6ddfcd731bc71cbab7729abf9491b3c0a9a3e80e3c7aa8f31abba9bac9a98244ab8564c969d9885862886b7b099a3685829f70966630f938d43d194e36d89cb9c8b94ad331c5b4b9d2b2a45976fcd78187644ff14b3a3a7c98e9c94eb83536a2da7c288729f61daf732699feba39cf5ab7f5df3cae7980599260be6fb88597edf19bd9e95cef6cc2f3006bd5349c564b50abfa958d768f02566419f54da036b46bcd4da6af0d8e73d13563a7d8559b98dc9ca0929d529e63b172f13da160aafaadf5ad3d798857d53a9b727f3447ff5f664e9579728ff0d66573f935d3ba61ce5fd5985a7565d6cfa16b369db54f29c9f788997bff47d59df6156f64fa51e4f51974addeaba46d3ef319bb34c369730da7ee06a3647d4c54a653fef42d14756166fb5ab2bc5e039e0078cd376264e0b8839e1fde5c90905e7f023c6617b13875deb398f50e79e9f301a3b98684c4eb12e324dd4ffecaa8ffc8c593ac064e9a494ea2333c500585e0f513dfc782f78ba6a25bf60760e4ce57d5a2fb3270a4b6ba61e7c474ee578b8a5f9af988d835269ffae6963a2a58aebc9afe3de556488d7e61e4fdcbabab535fe86d9978db5f424b3cf2d971237a45e4b0937d57ec7acca3159b52864cfc4f29fdfebc365f207c664b089495ebc54f68ea7c2a6e37bdbf5ca9c6b798b5191b1edb5ee91f54fcc86dc54c61dd094a8e1948e7f6196e5992c3bb1deea4cde3186f38584d5cc9d26eaa7dc4df47dd7f738c3bf31f2434ce4a7b15447ada55233d1fbd153ef63af7b1efa07b3772896874c716096c8e9eb44fed9db93a712a3db54fe87d162493cbd538b2b7e2cfb17b36c98c9b2ea3a45383596cabcf4885feb3039705c5318f2fc50fc1f467138567b0d4343afefe86bdc508c8bfa0fb37384c9cee10c6be1ae39a92dfdb6f08904465b4662f51dbf63bc4cfdc7e18ef10a9b490c6332cac4649e2f26f9a286e3adbbd38d78abeb48b10618811d536bfd4f3cd5cfe81d6fd98e9f09ab3c6b8859391a1b2d614e83992212ad7072b16b2ddf5f1f9275754dc146986d634cb64d493105531bd19dee74ccc06cdd29b5f621b3ada9f5e3a437551b63968e4d6d1c82d9d27c518f2f13654dfddbd804b3719cc9c69929e7ca19c2672bea6c1db5dd4d31bbc79becde19b5db3c3a77a27364b5a85f713de788b71dd5925d5fe56c33cce209268bf7ac43dd03cfc376d7409a63642662112d7532b3e22d17dc47f6f3550709dfd21698a5f9d8689dd42d55f5686e6ba9bc6b8dc81561e5d99698f693b07901f0a9138537ba2d28aacfb6c03996cf560bbfad2dbae8e7e07d7eac688559313995da1e7caa9fda9ed74afc4c58b584d6989553b0564c3ff155f9da329658fc0ccf2f7089343f366c85d930d55f6e81cff7ea5fe53326f8d1be0da6fd3493f63350ede731f328eb74c4f479befb49da6256ef8c8d54a9dd6ab72dc95b8a278b1261a7643bcca6e975b749cd1f5a2d5a7edd2bfc944c415b73db6336cdc0c6ecd56e93ca55bcfda3526a4cd796d301b360a6bf9a335e9f4a3e9fbabeea101d31bb6761edd2a97b63dd532e0c9fdc1ab36c762a3d0cd8fb9e9f1101e97d07ea84d93bc764ef329f65b47781bfda627cf2b3de6502797fd8f2b4b47574c608cdf5374adf6445cdd6677fef887eece882d9312fb511d209b6c14748d7cd57bb6216cc0fd2ea94daa8a4f4b6af75c32c2d085eaef0babe9f568874b68277c7ec5e60b27b166ab7de123551f46dadb4b82daa0766f9426c1ca6df9a84b70cf233f33f9df5dc9e18875db0d1f3660dc68b76075ec2ce176f5e95a2efc75bd3582b72271fb3e0efadbf2ef58a5e985dbba636063bb5fe9de4f328d31dc532319b770bd2a755fb8c96f45ad91bb37277939503518f75c7ca94d4788f2911b9b6307e3eac88d307d37b51909e8ddae62ea737aa6e83d9b8185ba9c26f7992e33cc54feca8ab257d314bf6a8db7cd85453ab2ea3b1eb3aaeae1f66e39efedadaccf361752deb3e93a289f3138bb570fe9c24eab8fced3cd13254c5b27953a6d04f7d28498d971be419319738ce9fbd52b464963bf95ccd0a497c1c0993b0a481bbc49ef8d73fc6a172187c3892e1db1dea1d0dbe5bf3d6485e7fe7dc2ac59be92087973b6242ff961766855bd3f78e61e4474dd6d56e935a369a8f242c1235081ee997399ed1445aa46439a47903ff1667e9529eaaed65aa36c8e6af94b11deae84db56b51c89fd6d0ec439d6a908579dba4bb2b60167367ffc7f812a04be4e0559e738b4425d41dcec01bb4d63b7f25868bd6fa7498674d4f1f2804a81179b58a5b005e524de2ba0897738364a5ac6aadd889b126190d7278aa2ca344d756a04b78dc2a393e73b510394d46be28209b939140564489acbb40b6c429949718d02d709e522c7d6faaa8e6153377bdfc2ac79828805c9c9500596c27c8c19100f96aaf04c8124a905b7940f2ea0a57a154163b1c59147075ef90c0b59c12172ff4d49b8f1ee9cac0f889e248607b15c4bd52fa529617e670107781ecd62b157b93e299380ae8368e4ca05b4189ae95403759dcc033e50a4f65250aa8ee031592324a548d052a7728756544aa1e39c08ff6a284d35cfa51a168b1e18aae8a4c666b3a2b01696f3bab15799100d9b96f02643925c8960c7fad8a02a8d16312a0565282eaccbc2f5115e2a5d805b53b7397ba539976866802ae8804c06fc62600aea204d8da9365dd39e3e365abcada88785bf9b804acd5d4b57d557d8d6eb5f564506dada0c4d542f8d624d136b7463c3e4aad1abc7d5761da87be8aaab2200ffa517b7fdcd03481aa92125553900155588f02a0c5a09a5a4509a8034be54d717d6432e188d11c5c930c4db83ef6a7ee3d02fe68e37d17bc68e0602bc4d16ae6aec8e0e9cbe0dd8fd6695e0dfb22b29284ecac141bacb3522825b37c340465d5121fb3526883cb0ad4e019e4eebc4077e73a77eb6fe559c62098e5b38d28cb57a4c84afa4292e5b31728ab964699ac3ad5eab36aadca66a12ff1890e5f73476d0eeff05df37fbc2f3687f7c5aee510f837f8f83fb73c5b47599ef59569cafd820f78aa00beaa26fecf76bccd45926c98468eae5bf71aba793fbbacca359396cd3c255fdf540caf4be9c73fa5adaa0debe95fa397307784c32a811a1f3db5c4f1d51a0d36e1e1ec4885f31d50a3dfd7269cb991c4b90df0cefd6cc29917499c1301cefd6dc239249238d7029c07d884736824719e04701e6813ce6191c4f930c0791025ce01069c61ac11465aa1e29f7825c17e2ec07e3025f62ecc5b6f7505556c7135d44700d00de9080ba5686080eaf31aea303a9c2da970f2f74885f3109b70e64512e7ad00e7a136e1cc8d24ceb300cec328716e5d4b1dc09bd187d2a1ec4a85f21f80f2705b50e64512e5fea0083ac21694b991443904a03c927e40e312369cf1af1bab86e169a2f1bb44aef458211abcf90dd103b90164efa3d231e20a2f78b04f1cd618c81d1ed63654586701ac47a76b5837f7c252390b300d3eb91b15bc1300bc6328e1b501f0cab6982cbd1ae03bb63e8b19288e341b37a142f92740791cfd6888448fa0fb0e5e20b3b45ad4a452fc15bd36a4bb00c6e3d3314670b08c8695e9cacc6ba8d0ad02e84e48870716c90e60fd533bca52d28c5c40857101c07862ba46a96e191e380fa03ba97e8b93a8b7415e0cde5a4e4e47661eec796b51a7d3e49164a5f252e091a7a4c323b198e8ade0107a2419ca2100e5a9d453b6d632bef691bb0646f42a313d00aad3a807a3aff08caf1b2f6a8135668647e03db82980767a7d408b62e3411300ed8cfa8d6f512f71af0628cfa4f63f7eb13b62729e18b85926be8547062d9b0a5a5700edac74b409c21a5f6a0b0112764a0da3c2fa20a8fd9d9d6eac58b50536b49276052ca7c2ba17c07a8e8d5849fbfdc8b0760058cfb5691815e97809b2da632380f33c9b709276f093e1ec0f709e6f134ed2e12764380b00ce0b6cc2392492380f05382fb409e7d048e23c1de0bcc8269cc32289f32980732325ce4eb55698e0ebe5e048be603e01605e6ccb989ec1946d4564fdd67fb004ca4b6c419917499415c02b2fb505656e24517607282fa36e4172bf05cee7ca2659fb2d02454c5f90952fb77354d99008360c1f01b05e61cfc89e9111ecf81a01b2f595d40ba4793b2626b2d5920619b6d654d81a010fbcca9ec100232258737c1478e0d5e9a886a73ae583303b934df8980afcf21a9b60127a2619cc8900e6b536c1246c472783b91380799d4d30092b406430c70098d7db04737804614e00306fb0096614671c8e05306fb40926e1001832988301cc9b6c8249d842490613ae0e7ab34d300957c320833912c0bcc52698844d6b64307301cc5bd301131be7a6f7eb106673b226b76c00f3369b601216406430870398b7db31eb86308393cdbad90560bc8312633b969875b3523ebc504c9c8bfa5c875100e19de9e8fbce61894fbe72756bae731be59988e300cebbd2b9ac52194b4c2fc6bb6da3d73d763068c5bcdb36a084e53819d0e600e83dd42bd47b3b2608c7aa93758965800c7d2f25ae66ceceeaf8fabd6a6d673260bda980b503c0eea304d613142889ed649971bd0b884f6370f105e2c2852ceb9602b4f7db332f91b0d59cacda5304503e4089b2abd14bf952f08552996af045ed347827d9f4931b01d2072991f6d04aea72b17067757c35fb2d6d8ed919a0c47e28bd4309aab0ef1445a02ade12f8e3c3e9288860439a7996191f99b19255c8b2ddcdf084ad94455468e7018f7cc4ce097c8485125904bd0e607dd4a6453a493f7240d6fcbb3b08008fd9849374557e329c57029c8fdb8493f49b1164380f06389fa0c4d92de5180a87b292164cc36344508f0211f4491ba112b6b293413d12407dca46a884ed9a64501b02a84fdb0895f04d890c6a0300f519eab64dfeaab9cc21504abde25077aa22a83b28829e4d870f26ded84bc4add5ceebe696f6b67e15f0c1e7ec99434138e68dac916e3b8072537d0e39f0a2245d20820ce69920b33f6f134cc2a1ad6430cf06305fb00926e1a06b3298c700982fda04338a1d1ba703982fd90493f0cd870ce66100e6cb36c1247c372783793880f98a4d30a3b8aeeafe00e6ab36c18ce22afc070098afd9049370721f19ccf300ccd76d8219c559e41700986fa4e33344c3d896f919a24301c837d3f5bd1c25354df0c886591700786fd933299ff0c591ac75e81ed0a4f1763a32f4d02d34431f047cf29d740c41506d97bca57c1d586363cb1a1dbc1ff0cf7729b1b69258f983970bb04a7699a30e19b80c2a700cf8e37bd45351968bcbcb9c0b577816729aeb502911ff0911920dd8da16207c3f1ddfd031fb1ee128f5e654e81a00741f500f67e5d56df879f40221a054cceaa9143d8aee1876780d19d2fba9909e0a906eb671d96fd2e5eec896fd9e0e0a980f6dc44ada524986f537e0ad1fd5e7d480e8af673010a0fc9812655fe6ad59f20f7a547a06b2a63ad8951033d960d7cb4120f8245d1f61e543af13332dd2f0fe4386ef16e0a59fa6735e64b173299fb2b2a58ddb7800f8e367f64e1720444b365d2006d07e6ed3faeaa4dd1564ef496f82acff854d38732389b305f0ce2f6dc29917499c3b019c5fd98473482471ae0638bfb609e7d048e23c01e0fcc6269cc32289f30680f35b9be604918e84237bf55c044af6ef6cc29917499c57019cdfdb84333792380f01387fb0e5a31fa4e387c9bad99a82b8f9a32d28f32289f22080f2275b50e64612e54280f2673bbfaa4238f0956c09a96210377f490756b8c41e5f5b860b9cc6b6b4a5f6c603acbfda33d12a8a43b37b828cff1b25ca81ccdb989c58f06cbef38415e2af12b43d145e3351bc3df187148b23a42da3f3a9c03f057cf8f7740c961decfcf72ef1b3e50c095b0b60fe61cf3045c2ee64b2ce904b4140f8d38ed9e913e4883b3e408734b36f8e1141bd1a40fd8b122a1f66b4c69155ec1ce022e6c96df4fcb013c8d27fa7734db9fd64a75b3e2b6335073944bfb7f366e08bffa4abf79d0b713d314d450d59ddf30ae097ffdab3126714e758ce0428ff978e2a107c3b9a141f190f0774477785d80100e67fe91c1552c46a1f0f1fc5aff3ce04719235b40c28e1ab2619d02a0034661bd028ced8d801006d601bd0287e71603400da9012a8e9dd27953650c2384ad606fa2928981ad908358a0dcb5f02a8193642258ca76450df03501bdb089530a69241fd10406d622354c215bdc8a076040555531ba112f6819241ed02a036b3112ae1c81132a8ad00d4e63642255ce98b0c6a5b00b5858d500957af2183ba0f80da92126aed0d7b51ef43ba0f94f9ad2851fa9ff541b8141059937313e099ad6dc2991b499c8301cead6cc29917499c2500671b9b700e8924cee300ceb636e11c1a499c17019ced2871d6fd7b45519cc2bd0994f0ed29b17632604dd60b1ac575139f053edac12698515cecfc3400b3a34d30a3b8d8f9d300e6d636c18ce462e70066279b604671b1f39301ccce36c18ce2409c4200b38b4d30a338a27e1980d9d52698515cec7c1180d9cd2698515cec7c0f00b37bbadf853098dee10d849524b205d88e06587bd8889574a22c19d6ce006b4f4aacbd0c58cd6fee53e42d69fb5a663915dcc9006e2f9be11256a7c8e00e0570336d864b588891c1ed05e0f6b6192e61758b0ceeff58026e1f9be112beff93c1dd0578ee369470832d3348d81a40b6cce011006d5f4ab47cedfac43715f259d4bf03db1a64f87e36f53691aee244d6dbf40dc0b9ad4d38495b4cc970f603d9babf4d384917c522c3391be0ccb209e79048e2dc17e0dcce269c432389f31480737b9b700e8b24cec701ce1d2871b614d2e0774078add2a541868d6c0a587f50820fa0c4b68dc10b53ada4c3c63dc241398d6344900f07be39300a9009479590412e059007450132616b1419e47741b8c88e0264c2562932c82f03c83951804cd8234006b925081783a30099b067800cf207c09373a30099b031900c7236f0e4bc2840267cbd2083bc15803c240a9009bbc0c920cf059087460132e1806132c8e300e461e998f787b53b2454276efe267b79fe1b146fc36d4149da564b86721df0ca11b6a024ed452043d917a01c998ef159fed7368fe21a14c781cc3e2a1d85935a7d8a5fcc6faf60bcbb7aa14366a26340b12892d4768273235fec78ad731d6f8caca47d2b23eb9f5d0e7c77c72840267c2b23833c07401e1d05c8842d656490c702c863a20099b0a58c0cf2200079275b6a0da48b2e90d51ada0194636d4149ba420019cadb00ca71b6a0245dbb820c65314039be3e17a949db58d7dda8508e660994132851b69328b9d7793fc091a6b5d0c9865d960184132911f6d6caf415a2650a6ba39a27deaa8a9cdffc8153e5b5843efa1955dbd4f520bbe75302eee0ec143ad6178b0ad07c59092a724ef191ad4562edfe32190ac8300ea0f2d32ec04f27d5670104c5917a24d91cc29f00cac99428fb6959bec2f9cdb3b51b37dd6afc7c96cfa63b95779ed14be4b139e0baf1ce5d65b4a0efa7027d16c8fa53a8b37e329f559692be761650617c0ef8ebd47494f2353fb315f5527e0940382d1d9e88d539139e4898a1c93c7104c0b873fd1642aea872ea4cdd970ae52520364eafcfb7a07c51515ac6c8bf06f53e15caeb8057cea044d951a21ce2fc4fcca09ac6b6944f10ae0320675282ecc3f477213e50bd385eabdc72179dbb1764fb599488f957f4ca9dd3eb44f99df8fc60f4226507e095b3eb33527adf7ca2b816da7a80720ef51cd30a111f55a69e27326fa1c8f264e0e866f1017073d3b1864f4e8d2af89653ccec0160cea384d9d4d929934549be1cee153ddf6b0e70cd4fc78206894f64b9d97521e353c9d6888bb6b42f899e0dcae382fa2d5ca2fe46733df0d305e9581b42f96989f1339858a75914bf92f70240bb301dc3bf5269fcf54e64201c5547b63cd76290f977b1112be9105a32aced01d65d29b1e61862aa9f56f50201ba88ed2d1f992ffa880ad3d348f71615fe6b40b0d82d1d93d0f1b1a20b3c91770865b1d6920ae7bd00e7ee36e11c1c499c0b01ce4536e1cc8b24ce4b00cec536e1245d5e960c6735c0b90725ce66cece72d1e6592296e0728ba6e855fa3b02607bdab4e209e982b164effa19a0eab4c4269ca4cb1a93e1dc1ee05c6a13cebc48e2dc13e02cb409e79048e23c0ce05c6613cea191c47926c0596413ce6191c4f90cc0594c89b33fc3dee2d5d416deacb7d2f9e17ff30ee13542e4a478b35f81a096862189b3a9600f05d5a8125ba61790be6092b595fe0e502eb70525e9cb2519ca55200494da8292f4c5920c655780720525ca81ccdb39c26fe4fd9e958ea00a31d086ab840db181d74c1485187f483173c7801246d6f954e09f04e1a02c9dbd52e50ec8aa2d7a2cd3fdc0a7f7b2735102c2b59fc81625381678ecdef6ccf488e2574987010f2da744b9154b0cdb291155ff95e91aa64336b9703ef0c395d4d30e968bd345866267a2289078275df4dea13a0384abec192f4f386b98aca1f931909557530f5d542df3f39d0bb9f7153b34cac5367a3eb803f0c10a4a706d9d9d2a61778580352d5ef39c270777af6184332fc93c2f1300dc271dd51c5583e4454769fcf496360bb30c64e8ca744cbc86b1912b512de607af623b8bf6a48aa4bd998480c9fa321b02bfadb267dc7c143f7bbd1b40596d532f3be9ba34649e590970aeb10927e9da346438ef0038d7da8493747d1a329c17029cebd2d1620461a6fe8d3bc255eac8a6618f0765fe7a3b07dc127a2cd980dbe100ebbee998009bc7b6cc09b06b40d6dfcfa6483a9832bb9345d25d01cefd6dc29917499c97029c07d884333792380f04380fa4c4d98de9f3952a45775cb5e854dbb2deeab3405174503a8aa2443f67b2810cd12b8a180079b02d20a33877ee4590cd37d80292701d6f32906380471e620b48c282870ce40000f2505b4012f69493812c02200fb30564143f2f310b803cdc1690848366c940de0a401e610b48c22f739081dc00401e4909b205c3568d2583d68b0a5a1b50d539ca9e914384450bd97b4c6fe07f47a7e3e5d06f4b6514db29bf03fe798c8d5009c7b89141fd1a403dd646a884ef3a64503703a8c7d90895f0bd870cea6b00eaf13642256c272283fa2a807a828d5009db8cc8a0be02a09e682354c2772332a85f00a827d90895f03d890ceae700eac9364225acfc9341fd04403dc546a8515c15ec6300f5d474bc9ce2bd9751efd23809a03ccd9e6905845ed9970ae59de03dfff474f4a9ab06bb95ce89d2a438a3b89cea7d00e7199438f9e790f86838b8a85f811050eafcf0bd496c3de323e9e0156440c93ea1730ec8ea675202e5ab0caf716455b0a8af17df1e203b8b7ade9a778dee058ee462b18824ffe8983b42ae3c82054c2b80f06c4a845db5a8c887b7ae93551d6f6c4cd37bfa1a2aa4eb41643c873a3242a4bc63830bdbd28a9af300d073d339af6db643a29a457f5e5b6f90c9cfa304c897e157332ab99abc5426c345b7961cc075be3dd3a908fb81c83ad7f603282f48f73480d4d6e3206c5f275b8fe37c10112fb4717605e9d23d640d175301d68b6cc44aba4e1719d65f4110d868d3727da4732dc88aa7b700ce8b6dc2493a39800c671f90e92fb10927e9d415329c1300ce4b6dc239249238ab01cecb6cc2393492384f04382fb709e7b048e27c08e0bc8212676b0657dde2cd70699a804a5685bf1994e257da34c58f74397db2297ee500e75536e1245dff9d0ce76d00e7d536e124fd3a0119ce7301ce6beab31bd79bd1a3385de05f80f25a5b50e64512e581a0f4bece1694b991443909a0bc9e12653f862dfa3cc7b9c905bc25af447c19007d032568b5ce2b7ff072815ac95e252f895e6b7c0cc4ce1bd3d1bee97f1967429f245bc6791ac07a13f50cb6d5e9ed93cca682d60d40bb391df32753ab1245afe8790280bcc51690511c6bf9280079ab2d20a3b87cc4fb00e46db6808ce2f2116f0390b7db02328acb477c0640de610bc8282e1ff1110079a72d20a3b87cc4b700e45db6808ce29bf75700e4ddb680241caa4506f24700f21e5b40124ed32703f90300792f25c8c68c2f6852246ce7e3cfa3d77fb83540751f252afe11ee4453d9eecc5d5e990c586f2a606d01b0fbed59f785b0724dd618f61f40f9403abab872c46fb5759599c4dc2f48a9a5bed5f72ac87092cd7a980b703e68cf4c45c2f7e7be5428ef006ddc0f51a2ec215156b3158c4f1dc13a0e0a44f32c1fa1ee7ebc6b256d0bcfbb5460af053efa703a273ba9d66d33de79f46ddf1fc588905e037cf5117be64a1036e49215483b02ef7cb43e2368bee86458c6c8678cbd4f85f20ae0958fd939ed84d043c93a5f9f071efa3825d64eb596f1decc1ec52f96ee0a7cf4099b6046719ed9ee00e69336c1246c5223833903c07cca2698840dbd64301700984fdb04338a5fe79b06603e6313cc282e7cbb3380f9ac4d30a3d89a940f603e67134cc2061032985300cc4d36c18ce2777a460298cfdb043392efe800e60b36ce10271d3e4d3643bc1c607dd146aca4157932ac9d00d69728b106fbbe29614db4880aed0a80f6659b269292d645c93a827f66099cafd88433379238b705def9aa4d38f32289733ec0f99a4d38874412e70100e7eb36e11c1a499ca7029c6fd884735824713e0970be49bddaa01a0fc217b2e555a1c972f1bc348c04211bbe700a28cbdfb2655a29694308d950c2bf00cab76d41991749946b40b67ec71694b99144d903a07c9712653b1021bdcb2fa769f517b2d7c7492063bf478990afef5c243e74c81fcdd55c28cae8358c740a3359e1b21d00f7be9d5398097b29c9a6309f08b07e604b74241dd741161d5b83e8b8d91694799144790840f9a12d28732389722940f9513a66f77054ee6711b8aad344d95dc2d6a7abe42603b92788941fa773a597c4c20fff37567ab91178ec27e9f0d8c15ba8c72e061efb2925c80eb544516529a93f1650617c1660fc2c1dfe38720bf5c71500e4e7e9e8955411148f975bca0497db41ccfcc29ed918511c045b02bcf44b3ba71010f69b9395ead7020ffd2a1d9d15a92e2c3a8432c3932d2c7a27f0d2af6dc2493a568e0ce71c80f31b9b70e64512e74680f35b9b70e646126715c0f91d25ce96421aaf61bafd92d16e32ce02d8bea7c6c647b655c9ea3a2fc1f319f1521364fde02d00b61f6c697c232d56c8de787e01287fb40525699142867225a83ffe640b4ad2e2840ce5d600e5cf9428dbb044376e952c58aad3d58c41f6267313c8d4bfd8b3144f14e748e6014ffc351d2d94399ea635753a4d1e49867132f0c8dfd2d1b056dbba3153e40db0a79cb461ad9c0aedce00edefe99844955ac35a6e2467f1de0f60fe6113cc28cee27d00c0fcd32698519cc57b3980f9974d30a3388bf71e00f36f9b60467116ef4500e63f36c18ce22cde8b01cc7fed59ab90b09b8cac71ed6e5075ff1f25ca6eccb48ae63c216cb5a8ca6f396b69ae04fef91f25d4ad0054b7b9b72a5d6f4164939ea70078ac11f13749b9c7958a4598f715539bcbc5a57c9c4665049b7cfb0074316a747c407f95a3c01ac63f62b4da11b15a8c532f62516c2ddf06a06b4089ce8d8393e28d1713053637e2ed2d32ef04e18f7b4b91939d2d7f312e8e600be556006a434aa8755f6d83b0624e162177036576231bb1924ed623c3da0660cda0c4ea7f2c06e18875b2deee7d40e66f6c134ed2b91464386f07389bd88493743e0519cef301cea69438559785773ec596d265b117c0d88c1263b0158a081b39c8a698e680e2a8793a323c96dd6bae5044d8004756c17f03786a0b9b7092b66792e16c06bcb3a54d384987c590e1cc05385bd9849374583519cebd01ced636e11c1a499cc7039c5bd984735824715e0970b6b1f3fd9db04a4ff6fede0d606d6bd31b12e9928e646f4885a0c2d4ce269ca46b1092e1bc01e06c6f134ed2613364384f06383b50e254b379b1fe746f468f5e1bfd3000b2a32d20a3381c7b1000b9b52d20a3b83cd90c00b2932d200947c391819c0e4076b6052461614306f24800b28b2d2009470e9381dc1b80ec6a0b48c2191764208f0620bbd9029270fc1b19c8a300c8ee9420b761dec54cca9d4b8bfe8f2c0575137833ef918e060fff8b3e1296ef648b3e2e03bedb9312ab1a539c6ab31c61eb1159a3dc4b00662f9b60127ece930ce6eb0066a64d30a3d85cfc2080d9db269884cd1d64301f0230fbd80493b0002283f93080b98d4d30099b3dc8603e0260f6b50926e18b2619ccc700cc7e36c18ce217551e0730b7b50926e10b2719cca701ccfe36c1246c062183f90c809995feb7f742c162b5c0b7e5bebd9f03dedeb7a384ec6fa19428ae9c9009506e4f89524d0ce46b622ba9691a6b4cb6807305c8ec3bd4af1fbaa2dc59bf84257a5f2a9477013f1c908ee663ef823d5ce12d632dec7ce09303294176d50a205eb8ac932d985eef84ad9a84c50dd9e4e94ae09b832891f249ac55c2ee0a919527b2a8cfffed09bc313b1dd97ac4169aad8f072073d251d460dd6bde2a4f145791990d500ea644d983e98b9a2d74684c74942e1670d5768273319fbbbe5654ddd788f84908b63b15d8cb00d85c5bc112b66a92813d0380cdb3152c61db3b19d8d300d821b68225ac329181cd036087da0a96f07d9d0cecdd00ec304ab06a752455bd5f2ed60071db8d92bd7c127a2bd9cbe74650c11f4e09950f3e8715fcd9e266b7692e7acd70bd802f8eb0a74e4a38d683ac4eba2f4039921225ff7aaff7c3c789857faa2238e2a83100378a129cff39e9511c73d41844c21d6dc249baa60719ce8100e7689b7092ae3843867309c039c6269c432289f3588073279b700e8d24ce0b01ceb19438f94e99ecdc8d1ea666a0c41e4789a9ee9f41246c7c23ab8c5f00bc6f7cbab1629571ef7876c25743b229fca300d6093662255dfb880cebf7220834c9d0844fae215c7581b919b44cbe000e6253c43b4b894052e4eccf10ad3fd56ca9036491f3e32f2df6707e4cc76362d8c224b69e5588a35c5eb190bdd239cb35ab62393c4b4fe4aed15aba46568c7fe9acd0b80e6d56ac998cdeaef6bb33775530f778e28bec89e3cd9de36b9ce75788e31398bb386bb13cc387fdacab7186cbe20d36bcef2b9ff1c55ab9b364c51a0bbd5c926b3dd28bc5d0a112c753dc6d56ac9d90b15aeaad77454e74de22799aeced5cd901b57606f30e4aaa926c12f6cf135a963977a8730906de734d9d73fcd9cb9cfd5221b9545ab4563ccd3dc29d2a166b2bfd6895737c26e34b76174a0b0b1ddf2e7464708fca1eee5c16e3c9e7b6190e8ab7160e926bb6ad947bea78ed32b917259796cf5d25668e22e5a1f97f6d16b95996dfef36ec9508a9d36ab5b476fbf0bcd43249aa648fe069b125db3f89a7bb4c76e1a69d84bb2f00998f3707bad98bffcbf87f8faa4e8f84fd0300 serializedProgramBytesString: - serializedSignature: 389290f565201c2fd32217db26e13c34e93939dd74a4b0e5258b29bc5fa3588fd92ea769c439d4b2bac24241acbbb3b2d7530430fba712b1469242d9a783d803 + serializedSignature: 38179eda3c31bfe494d28cb318e6c3f1bf83eefd7a30e80fbe333758c4a3e8a71d1155e86f1099fae952d0afa1fb101b1ff269038b26e1e46c2e318eaa5c5e03 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset b/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset index 44f67d2..6707e03 100644 --- a/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset +++ b/Assets/SerializedUdonPrograms/9cafb003b11364649b4191683bd297b2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c15c7d6c0e702c1bdb8060f1a0881520ac5ad50a024502a144212424a90922075efebabbdbabb0b7577777777f7be5757be99d999dcb37be7dcbb7bf79ecb2c5fc38f6cd6ce9cf39f332e5b279ff19fd820fe6b019bc726b1216c3e2b63abd92afed7247e5cc9ff3967fafa5cb6961f2bf8ef127e6f10cb4df1a6f8e917ebc07fcfe067d5ac86bfb98e95f263a5bc5fc4caf9df33f8bbe5fc4c5c5dc6ff97f3a762f5f84bf3d9643687cd66ed636d538858205faa56d762c2ae5843fe7b22db87df2d974a8940f2e5adf6fc5711bf532defade44aebe776678ba4592bf9bd52fece5a56c5652e95121b8e19c2e41fcc39f455c7baead88fffafcfffcc03d7c5797fcf731df9ff46ea6ffd6c07702d471d2f50ef0f00e7e2d8425d1fa8ceb5fc8b0c322ef6c8b8085c17c70bd5fd41e09c938fcdf2c8d1ef5da29e1f0c7431dd1fe2b90ec317f7f395ec73d4f5811e7d86baf5a9338825b74bdba3595caaee0f03e7c2aee7d5b996d71a30abaf8e6dc1b5b6ead8075c1bac6417a8736d6b3d75cc57cf725d1b7fafaed551d71aaabfa1ff685bb5bc61f1f7077faeaeb553c7e1ea7899d2019e0b4e9738efd579d8f3de8014efe9704c7a16aa63b334ed1ba18e2393d8a7395f0e385feee856f70c75beadf34eaf83d5f928f09cb0a9d0f3dedd4974d3fe760573fbdb15eaddaf9db0eab551d7af54cf8d00e75a8eb8ae6ddbce79af434b1f5c463bcff63c569d6fef845d6fb90a7b7f1ffa5fe5d1ff2a25639392f1b2ba7eb547ffab11fddb8223646a4a0763983b1d24b375aca3cfc0337c3cabc3da04c2dae4d89573893a1f87f8c2268fdefabdc793843b9e25e60513d4710786fb7c7315d6b6016cba0684718da35bfd8dea7c1262d3351e9bf47be7240957fbc7b51effb856bdfbb41356fd1fd5f5eb3cfe711de21f1381ed8d9284efb5fb7af0fcf58e0e0dd6a8f32988ddd77becd6ef9de2c3ee1b3c76dfa0de7dd809abc1d7eafa8d1ebb6f44ec9eac8e37abeba3c0b938dee4d1f52627bc86854e780dab3c726e51cf6f07cec571aa47de688fbc1392d8de9ab9fdf956e6ceeb6f5532749e602a03a7a9a32ed767807b5af71dc1355d4f98c96ad3c7a02bd4b5e940967e7e27e63fcfd0be731b78ff36c786469bd4f91cc4776ef3c4877eeff924e17acbd8db958cedc13997d1b84d1219daffee606effbb43bd3bd9d1b7b1f6873b99dbffee0472a0ffdda5cec7807371bc5b5d1f0bcec571b63ab651f7753e36d7097f808eb79d03c4c73c75cc05f151c4e2f9a338ce8ffb414bedabc58eed4dc63bd79b1427096b813aeee2917b8fd2731c381747535d42c7c1bd9e38b8571deff3f8c67d8e7e4d993a5fc8cc3e85bdd73b893df7aa67c638329b96a9ebf77be2fd7e24deb5fdcd00735db778105cd3e1dcaece757def81389fa64f33b77f3f00de7f105cd361e87a3a0cb31578a79f3a6e03aeedcae27ea7afedc6dc3eb6bbc7b687d4fdf1e05c1c17c5756fa5e3760f75ec0ce4efe93cd3eeed24f1a07d7831e0a9750852975da28ecd93bc1fa45ea0f3d98799bb3da3f3729d473fa2ee4f00e73cbe9b6f02ef8b637fcff3c3dccfb7acf13cf728e0f8a847d663ccdd367ccc23a3b5e7bd273c3ef30473fbe2939efb4f7ac27b5cddd7758c161ef94f3177dbf329757c9ab9cbe4a71d3d5bbcef79ee19e62e739f51c7a91e3993dc725aeabc52d721617959c2dcbebdd413a65fffd2360e00e7a09ddc3c59b9a57d69be3a3eebe1f1acb2e37e47564b9d9674fa2d06f698e46bb9cf31773a2d55c717c0fbcf816be2f83c73d7639e77746935cbd1a55595e7bda929ded3f57fbfbae7f97c2e19d745eaa8f3ee97946e93c1b938bec8dce5c38b8ecead977be494abe3cb1e392fa79073813ad7e5f01e296cd2e12d53c75794dc29e01ce631af32777df15527dc6d5a7ae455f894f79a47de6b4ade128fbce53ee5bdee91f7ba9277bd475ea54f796f78e4bde1c86bd3304dce6f2a79533dd7f7f284ffb67a6e1a388769ff2de6ce27b5bc77801e6faae3bbcc5d6ebc05ae8be37bcc9d87bfe7d8d8b6cc2347bff7b17a7e3a3817c70fd4f519e05cc811e53c4fc76dbba8a396fb8ee7fd7798bbfea6c333d9cce5b4d9df23e77d757f47702e8efd995bbfe1ccad9f4e537ee352cbfb103cf70eb8268e1fa9b06682731e56bb5c47f776d30386f921784ec89d95e4d964f9d427eafd9dc0b938ae50c7eeeafe6c1fb2e68177b4eebacea4f3fd4f95bc39e09c73689fe77068bfc4f3de67cc5d7e7cc6dcfeade58df6c83b3c89bebafc58e909eb73e6f6375de699da0bda07db015b3b027942ce5c1fcc56a9e3ea2461f5746ceab087279c4e2a9c9d99db0fbd3a8967f43d1d47b02e6c6aa399e2525feb06aee976d317ccdd6efac2d1b9e378cfbbb08e6f6a0b6876ba1ebc86f96f6b765061d638fc3a1e95e41dcdf04b255febb7b73aae05f7c5f12b8f6f7ca58ed5eaf8b5ba5fe491ff8d278ebe06d7c5f15b8fdc6f93f881d6e5bfea9d62702e8edf33771de07b8747a74d9ef7ffa79e9b0fceb1f7c5f13b103fdf2999df7b64d680fb42c60270ae7dd8eb333f787ce6074776675db7d1bebb8bc3a1f3c1c05fc47355299ed3f5b82e2c795eeaf19fce372b39c9fa7fd7a9e3fa24f1a5edfcd163e78f4e385d7439a3cb1f986ebb3177befc1373f7e5fca48e3f33775fcecf2c9ebe757a837d399a094c731b983b8da9fca68b6efb770432c573aaafa3eb64208b3fdf3537803d1b59bc4f09cad271a9fb04d28cc3ae4a7ed76393bcd3531d7f616ebfffc591d14d8fcdfdead1fd57609338fee661fc1b73a7092d7f378f7cddd6da47ddd77d1cc9ea1890a9ce3f61dada571df763b85feabcae134b4c93bf33b7affeeee89aabe347d7b1745f4692bebbeeba8feb00753c501d75d979900a6b0fe7fdda30bcfd187f30773fc61f4abe8e5bdde6ff93b9ebb57f7ad86939c33c72b49f1fac8e87f8d4b39162d3549d1faa8e87f97cdf6f9978380b56068ae35fccedd37f295d4f503ae8f68feebfeeef796fb8e7bd979384edad631ca98eff52475dbffa9bb9cbbabf19eea3baecfeb73a1ea18e9b3d323627917134b0b191474e7b96e0fbe24fe8fbf29cdbde53d7ad1b38e73d74fa3f461d1babe38ab80eed14e79ec9e2da541733c5ffb120fe854c3d06765c8af053f84a2cc65cfdc9f25c1ceb30575f903c171cd4f85fcf1f3dba6ecf92e6cdb572f5dc9645e09ccbedd5db91db6b0cf2fc9ee0dc4778496daee7b159e5f1b11c8fcd394ab7fb956edefeaf51296cd6721b786c563ed4bb8323b7f750e4f93dc1b938d68f8727ff1632547ed25b97336dc17d90f6e5b90f9d93e62b3a8d3464ee34d250e9f2631219c7abe37fd451f50dc51a29598bc13996964d7309e0f88278bf3173e55df29cebd6573fe719ab8b35f13cdfc479be8fee5bdec6f35ca1e7395dbee8b476a23a9af27d8c8d698ce424753c39098f5398fff18b5395de4d953e4bc0b9e0a3e6fff4d5b24e53c7d393849faeffe8f69df61f3deea1eb56b9eaa8f2c6989eb7b6009c739dfbad01ef83f7d0e7751fb09e4bd2431d4d7deddd3d3ab4f4c86ce9c8ccd369b695db86582bb71cf47d5d3f3ad31397aa5e1a036306f26ff18eeef7f4fa726be6f665fdbc1e57d775f85eccddded5d77b33573b35a6caec18288762aa9e9ff7b2a36f9e6ecb7601f7613a51cff7d7717a96f35e7f5df730f98b7e67947a3659bf96a99dd10fe8e4ed03d1e3c36733f77876b2f242b79f4ac0b9b8df559deb394f3b807371bf893a6fe789fb768e7d0386023940be9cdbe85337dd4e1ba8eae472ca2c6823c6545d30a6ed1f0bcec5fbca9698ee47d2ed17753fa6db7bf3c073305da836a69c192b9e5bea79bf8bc7a7ba80e7c5b1ab3bdc9866aadb8aa5e05cc855f5ec98ee935c00ce0187daf0b55e0b7db0d4f9532e73e74fb98eec413a0f57cc07e9fe5acda087c7dfc4b59e4a56193817eff6f63cd7c3cd899dcb5cf941ac07082b59f9edad87abb43448b793ce63fecb0c2523d61b84a9faf1637d98bbaed4c709677099e7399da70c00e7e2be3eefcbdc631633c17571d47955b9476e2f8ffc658e5d830f77cba90dc72347bfcf76f4c8a9f0dc9f9e8277327eaa5e3444f75f9caf8eaaed19d3f3be8b3ce7c63e809c98ac1f4e67e5ac84ad61f9323011437ea7e0eb37534fbe97757ff14bfcf493c1d6b07df8abe5a619f0f3e5fcfa1a9e13171867c07794750c1dfa24f9bb843f5129852e8f25047147421042b92afeaf1c4cdfafe6d7a7c9d9ff62027f25bf3384cde247f1d6128e7877fecf2d65010fb68aade367c5fcf71a296f09573bf1c9542689a9fede77e67199ce4a8495fc8a06ba869f57490d8be4eff552d372a9fd0c7ead46ae8b58c52ad8447edc28434bb47d2dffdb1466b14266d6d1bc2001bbee2c7bd0d134995b23b4cf97edad7f62644bc4886cfa8af4217eeae5cb9ae6d10931f10f432793c99185832363984416735d2b60f9720dc8bc0482c16d4cb4d0ecdf0eef91ac30a92d663222ba3b4b0be2315cf9f30f05333b771f9fe3366d38cb97cdfb2e294c4b0656c8cb9335d32026e4e4d41b2a14f5e28f99f0cb6e8ca22ce2779eab94cf058f80fab2f0734780acda17f33f36f2ff5572f957895c3c562a85ace2c7b9fc7a09ff5b289d104f4385d006127562419a4a5d0c761d13ec86d9869d3a774906bb61ad5d71d8e2c74cb0114230950e18c1ba2682b2d6b79e94a0ae8615f1f27626d75ae4e69572b9e16a2079b52c514598d5b51e570efe72a4c4df841e18afece93092c783e82e1bec8907731c349171301a5440b369051693f54c3129fbc677cb624cc6ad73aecf971ee8b5423f953c469afa8e91663246ba25c448306d30b23926b2b287638f2d4e562fbe0d4eb779ad5571baf9b28f21d727c76461ab8e48e7a7418e39da5aca68cb447058d4d537459decdc2bce620121eead96524af8b3c18b08d1a33ad05b449891b696483b2418975a050c610303c2a102e13606ad62398d3c5a098510c90d31c96dc24a6e84496e6b2419407263934335cf7ef5cea92b552155dae4ee24aabadd136a1cf727d6ada547b547eb6cc975c0fca989296e04c10e46b52e189f103dedf1e8698a09ef68147ef0b820c29b99840b87e864ca4ae5b48cb04592e8f3ec27477ed7c9e76493382741e966b8d2cd31a5e510814769115c10e12d4cc245048bbeec84a2db2bb8252eb8a52999c98bd96fc4a657ad1731dfde77b5be3b4bd6060d5aa96f658a16412f1753ca1b35ddf1a8698d09ef6110fef7e6cd9b8308df06cbb87b86cdb8db6039432f63ce60109e2467688ba9dddba076a092ac1d46bb4f06a2b2bd299549e7a9244d6589cd2673530936a6e27f4fe152d7ca5410b489274627ba1a98e1e9b29f4c97831372f14cea8ca5e20e9853e5854d0b1d4d92459da9bf9f6cbb092eb89349b04864033290c83a63c207664078170cf6a0b0b0bb626a0fce80dadd30e1433220bc3b263c3f03c27331e1433320bc8749b8a8f40cf3e3e0492a3c3d31372908eb26bd301ec333c0a33726bc3003c2fb604c468465d2d72459b41a47d63e1c97bcd954d568840bef87a9bd6d58b5f330c9a30c9203d506fa9b248bda80589f1db6363000133eda203c1650f84083f07c59953c8465a3aa916a8ac034b93b5f399bc3abd57b31676c37b180d763c4f3f87199d4a25c8e7c94fb985a90bc6ab27d2d1fd08494b5e129ccff44077a2bc4e4aa3ab26a24a653e5c94debe6f3eb954c4c62982263a0528634c4a88d08017b5eb3d889898d07d7c9d8ce41ba0e7790a1dbc506abc80dc212d63843c23266634912d660937091b0c61b3c6aa8f0a809b551389179fb5fe386e9bf26f2d7967301ebe5548775ae1a6cfca99cc43e891d709d8760f9fa2443be3ea88e21a74992afe79b848bb25fac450853f60fc5b49e62d0ba2aa0d6c34cc245d7eb543f5a37c005176082c552fa84415ed17f562c87622bf83fe1feb9726285188e0a12ea70cce5a71b5cbe4ec0b2a4108b88198688685a3758448cc084ef68103e2ba0f0915864ccf41b19a2e458cda32448646c8b9934cb60d2c1014d1a65122e5291980e1eaa1ab51da6f66c83dabdeb05537b34267c8e41f8dc80c2b7c798cc0dcb648c49b2787e6786e4f6a2bfb4b1c8e803e5d063313c45063c637282e1d9c124bc3173564e86c9a1c7615acf37687d6c40adc76359da02439616b4df7302a6f92e06cdc5a86610cd2762bc1786e43d09d37a5783d64b026a3d19d37ab7905a4fc1b4dedda0f5c206c1b49e6a122ef266315520218767cc203d494e3e0d537d9141f5dc46c1549f6e109e2fbbcdb339e63241f6948afa46f031973d4d9e616c3e883577a6f196e4a16315fc19a66811e496f871d5c57894ec688a1239d890cdd1666ffb2d58a494f88e94a5cc3cd29c2a7c2c5a669ae8c901959db348cfcf9c5e33b952dfe4ca24b9b60956259df68a509b657266418d173c0903c6cd4c195819eed03b99848bfacb3286d45fc4aa94e0f597d9a6704487a7584018b6c3730e960b571a72e15302e6c27331e17b19843fdc3898f09d4dc205fe1518feaab4f0cfc3f0afcc00fe228cd02a03a1bc26c108159b840b2f173b5485aabacf374916f599357e0a8924f59905188fbd0d3cce08c8631793705143113b4425d467c4d0a09ebd9a2b734b67f83337502d67216650b5c1a0cf031ab42be69a3506d7dcbcf9a08382b8e66e58fa5a87a5aff569a5afdd31421b0c846a9a0523b4074668630612ef22cc9ff6f1930a9238cd9e18927d4da9202092c598f0fd0cc25f0f287c09267c7f83f00ecd83092fc13cf200cc230f4ccb239762461c64306254cb6046949a848bdacec17e9c66292eb80cf34631289590bbb5926e2a3ac16bf8ffa5b29e582aeb89f93ce195f0aba5bc7e11c469cbb1f00f3585dfc815fe10a9417ea0f09661e11d660a4f4c3b1cc79f1b1b288c0a2c8cc3b130fa060e633916c611a6301a483b44adb884175b41c3aac4c23a120bab6fda61ed65082b5fced2ca668b65921cf0599b468b456c79d5c783642cd266115b5c99da2cc942c7da2c2b4c71248a2cb17f56d822ab0acbda8e36646d8fb70f96b5adc4bceb182c072aaaf52d770dab8aff2ee167c1ea5aab30e38e351857d8219871ab31e38e3319d75819278637a06941cc59630a511477c733a4b813bb32052feef6c6b09d60c036a653306c6b316c279ab0b597a7713f70fa5cca541756991cb22d617aa5fae880fe518de972924917316235480e19ae966b43d30db5064bcf271bd373b069fceb4cc245dc9d6288bbaf3b078bbbf518af534dbc9a78e22e5e6e04a1b50173fad330a73f3d2da7df88813bc300ae43d760e0f6c1c09d690257e00127266994a963a9ac22ad9252446210d74b647619c79bcb9f59a6ae3809c6f934a7186a5d250b1c67714b9068d817c3739601cfe1dd82e1d90fc373b6094f23239e20c6ec8f19738ec1988f031a738049b870d87331873d2f2d873d108376be099ac85f16d7765fec2c2fae93fee3acd10982ef2043c8f97242b72870b7dc743731e16a9dac5689bfd73367d253b10c3bbefc3ecc44b60b58d039f617325111745234bdf65815f260cc272fc27cf2e2b47cf210cc272fc11272dc276733b1fd42b0c2e150ccae4b31bb2e4bcbaec330bb2e37d9d558da354b2e4a5d03b2aa20961d8e59760566d99569597684291c5113bf2a99ab7b03e88707702496d75e6dc86bf37a04cb6bff85c5cb2653bcb4658915125d3ee6f212b344e54a6581ab744761465e6330b22aa091ffc68cbcd664a4a8a5c617e4e4ca0a833038a849479b42153342c49740bd3342ea9a9c22c98c9063305ed71b787d1f90d7b158d2b9014b3a37a695748ec38cb8c960c49a9ec18c381e137eb341f8a83ec184ff07f3a85b4c1e255a1b9365e1ececff5522fb2bf6553e055be9bd784d6e28af0005f1b313b0d8ba158baddbd28aad13319b6f37d9ec64e1bac19e5e167e1216857718a2707adf6051783266ce9d2673c432ad78d78a539bc03a5896c9ac63a5cc1f9dad8f82187d0a66f45d06a3170634fa5483f07cb9de6f0ddb9215cf224fca88f748cc93b2c56cff9ad0954ff129d7ba1e82f9725162214b5dbdcc948e03652fb078be5491ab16e58188b5a55c6da1f4a4da362a93a9d45831161f6ccdcbaae658e5f834cc65ef35b8ece3015df6742c9dde674aa7a2953615d443726506945e4a3c0333eb7e835997f40b66d69998f0070cc27be705137e1626fc4183f0a6fd83093f1b13fe9041f82901859f83097fd8207ce88060c2cfc5843f62105e382898f0f330e18f1a841f1b50f8f9582278cc9408c452e8dd41995bcc16f2c6d4e8147bf22d0a58bfbdc0a493a8df8a2f43855d6d78a149b898e5f2040b39d1e6224ced2733a0f6c598f0a73220fc12937051cf129f1e093345e8520cf63361615f86497e36ace4cb31c9cf85957c0526f9f9b092af3448ce97fb162c615b6ea73898074c9021a4b763dc0b262f34d65cc4e777f3e4c6e299d20cab995c85c5e54b61e3f26a936411972ffb498c2fe28237612abf1256e56b30c9af86957c2d26f9b5b092afc330bf1e12f3f598ca6f8455f9064cf29b6125df88c1782b248c9b3095df0eabf2cd98e477c24abec524595457def5032349bde6564ce5f7c2aa7c1b26f9fdb0926fc7247f1056f21d98e40fc34abe13f3e68f427af35d06c1f972079f6c2e8b992cdbf04b597a9b307ecc35ed61a82f8a1f73a1fa09332f8f49a5075674de6d8a1ed1bcfe94859f34750f96783f0b9978efc5dcf5f3b0ee7a1f26f98bb092efc712c2972113c20326c1a23522becf1cb635f22026fceb0c087f08f38f6f42fac7c398d6df6640eb473017f92eac8b3c8aa9fd7d06d47e0c53fbbf61d57e1c53fb7f1950fb094cf80f1910fe2426fcc70c087fca245c34e47ff2e3dd491af24f6331f973d8987c064b90bf844c90cf622aff1a56e5e730957f0ba9f2f398cabf8755f9054ce53f42aafc22a6f29f61557e0993fc5758c92f6392ff0e2bf9152c716fce40e27e15535bace70fa5f66b98e45858c9af6392eb8495fc0626b96e58c96f1a24e7cbdd34b359cbd7cb11f4d707027eca28e6b7cb2c2766aedda70a1fabddbf852581fab1f049e06d4c78830c087f07cb231b9a6006c823dfc5b46e9401addfc3d241e3b0e9e07d4ced261950fb034ceda661d5fe1053bb5906d4fe0853bb7958b53f364916c9b2452c716d9341f451b8e84f4ca24583bb652c7c83fb538c48abb0443ec3d263eb90e9f1734cf03621057f81b1681396c5975814b6cd40147e85f1681792c7d798e0f621057f83e1e890011cdf625a770ca9f577987b740aeb1edf63923b8795fc5f4c7297b092ff8749ee1a56f20f98e46e6125ff8849ee1e56f24f26c9a26b393796a4bfd61bc02778003f6349a6470692cc2f18979e61b9fc8aa9dd2b036aff8609ef9d01e1bf634cfa8465f20726b96f58c97f9a248bba53bf0cd49dfec2d4ce0babf6df26c92223ee1f32c7de8c091e1052b0fcf8b889c5c0b02c6226c9a2cf7f901f9593f4f9d7c1541e1c56e5ba98e4216125d7c360e487849183a93c34accaf531c9c3c24a6e80492e082bb92126797858c98d4c9245ba2a0c99001b632a8f08ab72134cf2c8b0929b6292b70d2bb91926795458c9cd4d924511bb5d068ad81698daa3c3aadd1293bc7d58c9ad3020633200a435a6f6d8b06a6f8349de21ace4361890711900d216133e3e03c2db614c268465d21e537b6206d4ee60122e9a1a9332d4d4e888693f3903da77c2844fc980f0ce98f0a91910de05133e2d03c2bb62c2a7674078374cf88c0c08ef8ea5a21dc3a6a25c4cf2ccb0927b6040666500484f4ced9dc2aaddcb2459ec173ddb4f6d2ac97ed1bd4d8245bb714e06da8d7d301e73c3f2e88ba9bd7306d4ee87555de785acbae661828b6286253bf3e429fcee637cf98ee94b927ae2bb3e3aefc6df8153e787709f582c9faa01bb2a2c96cb73e36389ee4f807bef2ee0f72a036e12d31f23506c22308e9c805e8c9c09db0660b6cd37d9d687b9c76de3fbc83b9a55d4c64db91c71ae61cb13b48c7feb37889e03313d1798f41cef8903375b679f1bafeea592eada24fa8a3bfea506b16e1066dd2e26eb26786221aea16389e31b220ec492dc6239b29e9812a05db8bd78ca0a62df60ccbe8526fb46a7117bd394e78589bb20160dc12cdad564d194342c2a4a69512a8999c81ff2313b77c3f2bed49e3981eb5006b6cd0bef99e9e5294331db7637d9361989c3d9329e36c8bc6385da51c1b17606bf3f87df5925f36e71c5fc4940d327fb3297f6866156ee8159993a06a7a9dd726aa46536e4300598958b4c56ceaa8d4bbd4100dc1e6046edae7a6227206726d58cda27e33b72cd937155ce63713d289dc5d5bd6530c22a7ccb824ca4cee198d57ba65f6e4c91da3bfa0a4fdd92b15a88d9b7d864df0e1efbdce1421b453a14b3cd9cbdc62a92c44af2da64fa968dc02c5b8259162cef89d7c456731f1582603d32796998b85c3588652331cb4a4c96ed1ad832a75c74e7ab416c09930ba79346b7c5782c35f118e2a3a6e08ee129b245a1536a26eb38a330cd4b83d4dae6cbb455a5ca7b6756aa2e1d17a87ca62c81344d59b81d665199c9a2febee3a298ebe3ccb4753cd5ab31bc1744dfd198bee57eca6e186a901cde6d097e2753b1b23d66e5329395937c956233649ab6a7241b83d95861b271fbc0b9a2d3fed1f3bf9d5a99334b5c58532453d26ab93d6e758255706565109bc662362d37d954e889b749521f47d71a573a72ec12da24d334d16be3ef05b16207cc8a4a93155313d2583c54e87f4552cf1ad9a22b456b176e5bf13b99b1741c66e95e7e6a5389b9891383a5b2f6943cfff69bb3a79b4f8ec72c5b61b2acb7ef7cdddcab90ae9613302dab4c5ace0cd1129bc3ff8ee7f25b32df9b88d9bc12ebb74b6df33c79af44c640596d1d704bf4204cc2ac5be52fef3097cf7ecaae6c97d193314b57fbc9ebb1bca346c56262994463c514cc8a35262b86a5b46286f2c08d3cc52d0b64437afe3615d37f6f93fe0353ea5f2cc7249c9557f1fe47afae894f04d1791aa6f35aace61386b9d69536dd4fc76caac6da74c979faefc336c909a2f90c4cf31a93e64311cde32db8d94cec54bfd4980bc7e32253e977474cfb7526edfba6f425baf1aa9998a6eb4d9a4e4c51ee15cbbeaab99266b5b1468895067149a2d44c4c2fe9c7c52cccc20d260b8767a0f68fa784746bc43b61366c34d990c74fcd7d47baade5f62abd4e3753dacec6b4ddc74f3b196ba9a41a8dc96e1b650e66e3be7e7a3c60db22488f477aad95f4d3ce5ccccafd4c561633ea1905a297b8447e01661effdb4f3f62267a4677c628ecef67fc2df3149cf2b738c3a9761e66e501262ba767c9cac9ccfdc1b44c595b84597ba0bf3ccadc224a9d47a5d31a4ab71d5f8cd97890c9c69129f3e119727c71152f9d2b6b4b97e4b970a6f2a1f9982507fb6b0f992c99cd5f989d25fd1760fa1f62d27f9acf12d1dfe8767ae562fab6ee82d97ae8969985a6af64a2245888d97698c9b6b9e4b615f92e093261fdae98f587fb99db4611b3253c28533b231deb76c3ac3bc2df1896398da69add96edd4b93b66e59158bbdadc92109fd759ca1faa0035b3c4922bd363d47b60daffcba4fdb1b51e98f9d93345ccf988e324e98135526efc1d41477b6b199b2a6b302b6508e9b4881727b122fe0d3ef317f832417d1146fd28ac4f35c83c07775bb4923fbb937cc3899bcc79fe9e9815ff0e32b2e9df8a19b2bfb846ea29fcc73d132433362dc66c3a3abd91b2a972c476a571a40cf7548a91b2259865c7982c1b9b34a5fbfb1c8f3b06dd9f0bca5c8c9560761d6bb26b149aff9a7b729cfa6015d33d3a4e19522affd2dfd25a6798919f6e2b6a2966cd71266b66a3d6ec24e36439cf89f5a84b95cc31936bba25fb7f4a31cb8f37595ee0dbf2093c2d994a89cc5b508659f01f6c9497b636a77d58b4cdf4dd4c8fab9563369fe0671eaa771c6412687f79737bafcec5fcef35099e89f714a73786b50cb3ef443fbd1a89f6893a6c62cb098ec0f9b98e5b994e6da402b3f124938d6352d8e8b4a0e22ff8ef714dd7aa06fc5f4c7e6a7e8a94e08c98ac96be2e524e7e377e4bd6bc537d664e5f17618bb12d91268ab925f1bde7934b389903ab5f87393ffd6202768d72d3d8320f37e7cd2a29393e4f48cc919c26d3bc53c296f2f359b2f653e3fb5384a67af810501387d6f9ff20a1775fce98fc082094c5498b658a5b9da5a788586daf62b54e7eaeb071609ade945a8b53456875cd3e94b87b2aac0d9a747704cc56ada59858832b12d750f97b3e975aa6b2dbc4cfc1a70c1ba66453d883a5009d4fa714371f640026711da5c3391dc26b5535b2777dc61ae4d4192ae2e4344a70cd19fc4e7934617ddd2c0eeb744a58cd242ce1ccf1ea49bcba1c0554a7748ea33a8312555389aa58be52216b6c6ba508514f8802a8dcba7150675282c2bec61c05480d3bc4219d95ed8417ff107c14502dcc8da33a9b12557d89aa3a52b992f8d170cec9b61fcd932db3322e360aa88a3bc6519d4b9f813bdd7ca202ea748039dfa68d02a81306c6419d4709aaa10425fa2284024e6f7a14001dde330ee87c4a40db3058377794d015ce2ad5308a4e65b34b8338b60b28b1c945c1b20f563765a280e7fbbe713c17d2375cb4574d5283a6a2a2191d5f9a9b13877511bd2f452d0bef0df05c4c89a711838d60b1247163446a4e639ac7115d92edf69c06160550e3ebc4415d4adf9ed35b7945ab3db70974a45c4609a935d3f5f0c932686cd4350ad0aeef1d877679b693a0b319c68a48801a552f0eea0a4a502d24a849b24220463956f08b7a75de5ad95b1d055c1b7bc5715d49df772ef088c12521069f0611057055a00a7a1525b826ccd42b25e67a4501d3c2ae714c57d367f6baa6ae27a28adea90a0627a546025a2301ad418e47b8771d74fa2383c148e36398220f9cc2abb16be45521afcc3ba6d9833f629de69be098645e426f665ed28aa8f9aeee5b37dfd525689ea1919497b295991768e4312f405f489eef749387d639b5fef8f05e1ed2f6c943c725f25274a29aef178118c4b34df3bbf18efe3c63675b9e8f023fcf7795332f50799867e8a6d17e66ee3b8d4fea304fc6182a26755cf3ff7cbec55031dfe25a0141ecd52c7e9c72ea3aca72aa834a6fcef49a55ac2ae964b2c562b342af0e5d1274707fdf56974d266d1ab94aafd67e0c4ca704bb95c58bfdeb6dc25910499c2f029c37d884737824717e0a70de6813cec248e2fc03e0bcc9269c232289537c994ae3bc99ba0743547e96c9756b6296beb7924806af2515bc1ce08bb764c3172b506f84ea8b727c241dce46543817009cb7da84737824719e0270de6613ce8248e25c0770de4e89b35d8a82078a5b2c3f2a4384b20115ca7b00ca3be8274755a9259545aabd8af4ce650e5c7b2a705d01b83bb331156198ec08d07bc9ac911d1ee2113274cda8d04d04e8eecad62c8e12d9cf9325748ba9d0cd00e8eedeb2391f5c0938348209f86e80f29e6c79e1d691807700e8eea5f642acbbd6c75cedcca1ec4785f20880f2be6c78e1f0adc60bf301bafbb381ae60ab413719a07b201bc548a91a36f02e5e7557a0098b11b20a740140f9e0964519f512791e40f950361274e15693a0e703740f534f1313813aebc575f34d7c6582b0d790cce31a036c8fd8d4834dda6b48d6837d07c0f9a84d3849bbb9c870be0a703e66134ed24e58329cdf039c8fdb84b3309238eb80e1aa276cc2392292385b029c4f52e26c9f02a7bb1e392c9235c94e00e65336c1241c222083d919c07cda2698051184d905c07cc62698843326e8c66000cc676d8259184198dd00cce72861765230abf84302a4b371ec0caeca46866f6d46580c75a742fa168b237dde9e71eaed22d8cdf62d40f90225ca6e0aa5d80c534c86f26e7aac8f13f9c362befe7a5629bb3fd652174913a9d01e0bd0be4889d6999a5fcd9ca17fbd34a23c71455304aaeb6d01b497ec19881d15c182a72d28785ece4629ee777214613e4936356a02f0cb576c8249e8996430c70198afda04734404616e0760be66134cc2ca3a19cc6d01ccd76d82b96d04618e0530dfb0096614e7e68e0630dfb4092661d71b19cca100e65b36c1246c8d93c11c0260be6d134cc2ae3732982300cc776c8249d8022783590860be9b0d98d81c22ef501a6132276b99f70330dfb3092661014406330fc07c9f1226dc8e62a50abc446e4591a5a959643d97c300c20f28117664ee7e75f1a29820bdb5f5aa3f0e807e483f50a1fb2b4ddb8d880d4d6ad806296245841733b501483fa2442a26406aa05365f07bcb1d63c479c2568f1100d70480fb381bddc0fe265213f60f91e593e500e527d9984fe4bf7f288a15f47301ce4f6dc2493ad5800ce71c80f3339b7092eec44286f33880f3739b7092ee134486b30ae0fc82ba8ee96fef32f8495332a0f750013d1500fdd29e991b841dc264e5fae700e5575bb23dee4649bac2820ce67e00e6d736c1241cf72183792080f98d4d30094724c960ae0730bfb5096614db42fb0098dfd90493b0779d0ce65a00f37b9b6012d634c960560398ffb5096614d78eaf0430ff6713cc28ee64b51ac0fcc126988433dfc8601e0260fe6813cc28ce5d3f0cc0fc8912660b161f44d352b3347c5646056f2680f7f3966d89c389d684ed1dba519e581ce52f9428730d289d5514456c328fd1897217c072754d6f3e2b7a9226700d2a69c7255fa4c27b25f0d45fa907d1045e11f0320957cbaea45c4b9143058e0170bf518213db7d88153b7399d82e0cfd7a5ae69035a142561720fb3d1bfde7fa1325f84730b4471276f7924d73190570fe413fcd45ef821af740a73fbd92215fc28a40e1d20920fc734b8e84477fa26a5f80f2af6c246eacca9338832d8a73d86e0238ffb609674124713e0b706eb609e7f048e2fc00e064752cc25918499cbf009c319b708e8824ce86a0c958c7269c232389b327c059371b38fdcf718be22ac8f34062af67134ed2215c329c7301ce1c9b700e8f24cee301cefa36e12c8824ce550067034a9cb9ccbd8e42f4543a8dcd32feb7e8f470c86c5dab2a3e04781b52e20d36e32d8a63e4cf00948db62c4a386411c5edf2be01281b53a274fad4c5cc1bb11425fadfc36b01c035a104e77c8d78033f15bd97ce57898b14c6e855d0bb006c4db39174fd8d7b4771dad55480b219254aefbac7d2adb484ee0d1a8fcdb7ac6f46bd58a901bed9624b96d093a5af2e657ae35032949f50a1fc09a06c69530f11e95c21b202e83180b3954d380b2289f30d80b3b54d38874712e70f00e73636e12c8c24cefaa0446f6313ce1191c4d90ee06c4bdd58747f403dda9bd9d607c9ba1d25b856ccfb294c4740d4f778590400b6a704d885b9db3afaeb65f8eccaf9ea09c2160fd957cd9e02583bd8943f928eef9025f3db00ce8e36e1241d9020c3f912c0d9c9269ca4c3656438bf00383bdb8493746c9c0ce75f0067179b708e8824cea6a06ed99512a7a88b5545ba36d907785e374a54ad6b5189ed4766a949d5f1af818ba15a514d274348f655f0f60061f72dd9d53b87bfb21713e3df35b475c8a554284b01ca5c4a94fac331ce4a097d9c2b5b35d59285c364aaf4ce95b51573f2551364bde87b00b43dec993210c595e0b700943d2951f661ee06e41a165f7c1774911ee17005d922bd7aa01cef1515d0515c0d1903a07b6763ba56fa8b4d09778821c37b3fc830fa50e26d93a286a02d25f5d2322a8cb300c6bef64cd58ae267623f0128fb65ab13793157b45a2ab2520a88f222d4ed01c03c7be61e457167b70a80b2bf3d5365a298ac77052807d833558670d611d954990ea04a34d0a60501a44bfdc816049c0d3c73904d3849974993e19c02700eb60927e9ba5e329c47019c436cc249baea9c0ce7128033dfa6e10cd2ad6fc9ea9af7019c436dc25910499caf019cc36cc2393c9238ff0b7016d884b3309238eb827ae7709b708e8824ced600672125ce7e2cb171a9277595c96b93e448d24af9f714fe7f9d143985ad67e5d22c67cc290b03231752c13e08640523b2317c175f4524e6d6ad552027b1e57220cfedcff1ab84688fa242fb31403bd29ee1bb286e97fb3540b92d254ab8c36bb9cc4957b22c4d9e251ba1df11c01b958d245ec393ad58d7ebcd4df571227f78b9dc28b252f639ada56ed34fa4427b3840bb1df52ae032e924ebf80b62367c856a905644b0846f08b08db6675488704d0659f771475059da3e9be5b710e47ca4534fbc498696b0fc2643db03a01d4389b687c14b9d41369137aee219b8a877ae49daeb14c57d38eb806c60ac3d037251fc3a501940b90325ca962c5e412a93552431db234b5524b2a4be02e01b4789afbb27175dcd96f17fd532b16fadf9687b908f8eb7a9a79e74053b59aeb927f0d50936e1245d724d86f34c8073a24d3849370420c3b93fc03989be2012b2c4be71ce6b7af261743f149f0bf04db6c91b0b2967849079e33900e7149b70927ee98f0ce7348073aa4d38874712e73100e7349b70164412e75280737a36bb429c4d0226c8e10cf3008673cf69291156e173624468df04686750a26deb415be901eace43c94092ed31f72800b9a32d20a3b859df4500e44c4a90cd9953cf746a96e26577af67f4ea98dd00ba59f68c4b46f13bd29f01943bd9339041d88349e695bf0294b3ed5ecf46b86736d97ab61b01de39f6f4b547f173b39500e55c4a949d99a99ee908d9da16683f07a0ee6cd31c3ad2963ad908fbcd00e73c9b7092362dc9703e0f7016d98493b4e3830ce7470067b14d38497b39c970fe0e70ceb709e78848e26c0cc62b17d88473642471f6013877a19e23e74c9b59cbc5cc61abc05655d1c3d60024ea8536750e932ec822eb1c5e0870ee6a134ed2154464384f033877b30927e9fa36329c1b01cedde97b33dd6b2f60170719ba2654e83a02747b64636980087899f4422d7b957a247aadee1880b7281bc31158228efab8cec500e49eb6808ce2b8ce0500e4625b401276f892817c10805c620b48c2f60b19c80700c8125b40120e9691817c12805c6a0b48c2a13232904f0090a5b68024ac7693817c17802cb305e4c808827c1b802cb70524e1d82219c83f01c865b680245c314e06f27d00b2c29e492e51fcd0ec4300e5724a945d9977ce5a359bc336f0d79d4d9d938f2b46af8b3717f48c57da0a96b0354e06b61900bb97ad60095be76460ef0559c18a6c74fbba3ff6e028338539fb7238bd9759d891783115cee90067953dd30709bb3bc8a60ffe0c50aea444d9c993e4aba41f5630b1e9c9d6d515f73040ba2a5b9bee68fba3bea27c3680b79a7a44474c572d672bf82567fbe622e66cab53ca080725c80a999e00dd1a7ba6aa125684c8aaee2301cabdedd95c9c303724db5cfc2e80722d7d6ee88c2b7a17363bdfb4228347f6a1d91e005e3525bcf629fcd09ba4a3d81e6f045a373536c124ac3792c1ec0760aeb309661427f1ff0d92f97a9b6046b1ecde0c606eb0691aea30cad147b25ae5ed00e7469b70164412e7cb00e73e36e11c1e499cdf019cfbda84b33092381928d5f7b309e78848e26c0170ee4ffdc569d1a5b69a5f10bb0b96b105fc31f1d76afe90d8057329239da64ad699d60a24f003b2d93f5923951508376e65fd93af00a407522215cde26a2e60157fa8982d570a2c97099bf003f2647d934d01b883ecdd109cb03949b621f80900edc1f41fe9d45e191f73d43d458ea0e81535db008087d8bd0d04e1d441b26d20ee04780fdd929f358ef6a73df602180fcbe6048332993b964816ab658d121fc68de25ec15f02b087db33f643382793acff68194079844d4bf40a23b959fd5900e79136e124ed2a26c33909e0fc974d38874712e79100e75136e12c8824cec500e7bfb33fcf6d067fc919ea5dc01fac925d205998e74656a92f06388fa6c4d990c156515447cb9b015cc76cc9591b592b66c8fa88fa829ecb63b3bd1dfd2cd58f19ddad42bb034f3c2e1bbd96fe5ae34ec2266de19025ee4b00d2e329918a932a39fcb0268245462380e93ff6acdf215ce548d610fc0aa03c813e0f5c5f3b62532c7b782a18fcb851f4f2c0ce00df89d9ed2d9fcf5fad94214c91422a6527ef34f5c21c2e622f7e2c6535b479e1582ab40301da93ec1d8820444b36107128407b7236a662f9eb482b886457daf900e62936c18ce2a70a4f06304fb509661437a03f1dc03ccd2698519c58fd1f00f3749b60467162f58900e61936c18ce2c4ea7f019867da04338a13abff0d609e65cfaa5bc28a1159dba815e85e3bdbeed91a849e4a365be36ae0a9e7d0cfbbd4fde61a5f956c2bc10984d1eb006e0d109e4b89304722ac542df6e875b87500a0cea39e4d295e28e10fade089d73da1257a79602f00eefc6c7e0ec6c90b1d215bdbe760de01502fb0693c7b18e56e5864e3d9bb039c17da84737824719e01705e6413ce8248e2dc17e0bcd8a6d53aa45dbf6425f90d00e72536e1246d7b93e17c1ae0bcd4269ca433d5c870be07705e66134ed269a964387f04382fb709e78848e26c003a34aeb009e7c848e2ec0e705e4989b3b1c4b937b7bf5cfe2f8bece4bfe620415f6553dd9274db07b2ba6511c079b54d3849f72920c37912c0b9c9269ca4c3b76438f70638afc9c676dfd8b88e3ba147af9b77000079ad2d20a33861ba3f00799d2d20a3f8fd9de100e4f5b6808ce2f77706019037d802328adfdf391a80bcd1169051fcfece7800f2a62db9cd9db79148d8f94bd644bc16c0bcd92698849f8f2183793d80798b4d30a3d87971218079ab4d30a3f8498e4b01ccdb6c8219c50fc75c0660de6e134cc28a3a19cccb01cc3b6c82495835228379058079a74d30a3b8ede25500e65d36c1249caa4a0673138079b74d3009979492c1bc06c0bcc79ed5b9515c0ef50240792f25ca8eccbb31a8fed28e1b289c931ec52dc49a8331c7fbb23791752e7fb09a55b2e84e64ed0d3cf17efa75e2d5cc996dbeb5ecf0db12e07bc09e652584151f324ffc0da07cd0ee652584cd47b26525d701bc0f512774b10549a9dcc50ae213824aa4d8e825f47600dfc3d9dcca5b6cfeb0812bb3967927fc3bd7045cd2329bec4398bd4099fd08f53c2151d82ce317d6f1476a223b4fa81ef0c247edd929358a4b957701281fcbc66ebee96c4342381c41b609c9c100ece3b682251c3423037b0000fb84ad60a3b87fffce00ec93b68225ac739281dd09807dca56b084036b6460c700b04fdb0a368a3b680d06609fb1152c61e73119d80d00ecb3b682251ce22003bb06807dce56b084fd5164604b00d8e76d054b38f84106763700f6057b1ab1844d02b246ec7280f2459b56ae91ee984036c2f908c0f9924d384997f893e17c1de07cd9269ca41b5090e1fc1fc0f98a4d380b23893307743fbf6a13ce1191c4b98dc4d920c7237c6a82f049d258616e29d3e3e6d5fcfa3456ce9ccf1956f23b43d82ce66c44b6841726bbf37fc1e26011ff67ba1e8bb5e01a4d611bb97ae2aa905726658b4168a159351bda833ff29a708906ca25f2e41882a87acde5efac06c3d779e8e8429e0cc97dc7bbc95a9e9c4fe07e66961c3b5b21f5ca8b89cf763a5f8059cbdf9bc3ed9d22877d84eece5df1f652feaef3e9890ab578b282df1511a13f0620a226263f20296c1543f03b49a9e2531525f228366e5f2ae325bf277f2c3692ff722aa2436aaba04eecade4ff9c337d3db54c1117c9a5bd2e80c7cc69b02a635e94ca22c7f1c5fbcbe41c8f722975464a4b53db877b64d324b1922f761adbaaed7f0326b43af962424a6c58067c2fb5466f8a90eb10e5fa3ebe4a645fac3ab9db1af9a450338c578b7cd12daf52869bdfc74e8fce9ced6fc19cac4e7edf743d3ab8466f537ab423cde9a3f0c89ee6c33a733c786d8e3fb546fa437c9348277d8b0f7097f920d155b6fe716913f85985b4b5524a5dc9f48f282945bd506444ef50f26ce6ca21bc55837ff20a51131379c5bbaee4345424a7f7fef1f38cfaf9fb943cd398f9f9ffd8db3f48f4f60ffff1f68c7afb47943cd3dc55fbffb1c77f9ce8f19ffce3f119f5f84f2979b67279fc1cb641b9a7f67d47d03ffeaefdfdb3447ffffc1f7fcfa8bf7f41c9b313529f2992dd0e22b2674b933748112b18f215c4ffc729e0cbc414f0d53f2920a329e06b4a9e4d5c29007658ffe3e3dac7bf49f4f16ffff1f10cf9b8f8d75ebae17cfe6e995a5534873f5f26e5899f9cff030fab985940ae0200 serializedProgramBytesString: - serializedSignature: da534f32bfda4dcbc4c4352c1927a6d61847ff174fd4751ecec171d754eea855d3dc417ea32ff4129ba8b8f1d4f7d1c8bcbde195767034102895968c84655c04 + serializedSignature: 79cb81d3a9fd1eaca334b1f7f46944db602af8deced18c7d5352bcd672a559db358de3b0655319bd8f1380cebc08ae84e591124af7efabf646a354e7ccd61008 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset index cdbc15d..bb92a2e 100644 --- a/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset +++ b/Assets/SerializedUdonPrograms/9d916a2228b78c646aa46fe3ba85879d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c5b531b3714d61a6c633031376348b8b5691be702362149dbb44d1b2e21341032dc1e9ae9382498840e0e0c3669f2d8d7fe9f3e74a63fa88ffd019d49cf392b617957da0bb60c4e63c62baf563a3ae73b171d499b44720c3ed60db86cb13536c7a6d826db6107ec35fc9a83b2047ff69da87fc28ea07c09d76d7876834df8f4c4cf156b08ae4b70576615e879cc5e40b947cfd759117e2f41df22dc61ed2e7c8bd0ca6a874e9b6c9eadb2c72c63a57d486c51a732afb3502eab03aeb3ec1d3c2d125338488e1e65e0b20e4fcaf4ac044c8b764fd9cf2456099ebd803e476c1f683e278a1d7fc3d522994461d7c33721fdc6320edf187c33d2bdc5bf583fe441437ca38aba182fdbf8ef61079d84d44794edbced45a9afa8c732e2a025ee2f210fefdfbfff97d777f1b253a2dda9699be6f523d23d9649a9ef002fbba5ba7e5e5e90ea0679d923d525a5bea23d9629a92d96bd9c8f51057f58f64934fb78db31d1366a91153e04bbd866872c87c05857597077113dfd1d85308f70455ea1612b609287404061ad9be40b1536c36e2aad75d84a4a7ccfd1751b5aec11511ccc31c49fae2190b97df82b4aae5686fa45f25474b63d7832c596a1c45ecfd83438cf5307952d18761fdcb5c836e07a48f49e01dbee967e22a15b3afbac014d3b6a94a046007a08f7fbc4e13a5ddf10a745e27e09ea2a14c35e43149b85f22d8de696fd087eabc6dce090a97954070f5dbd1da2849ae6411ae43e47fef9512367a1110aabe3dc0ddb7314217f7769e223867690c1096a89d398b6a7a09aba9b2c87b756d185607819dd120afb1681751d3ce811208d789440432f89f2127f5ead9b87debf029d7d28b721185783b3a0202456e3874631497256ed205a2bf80ccbd1443de223b817ec482f5b33db344ec068b43d8f62385568a95448a9cbba5115d652b6dbed513b2f8354ab2716443d796c152784ddb3abdff83af4222af43a9a8dde2a70f80b9f24c2a3d71118bd84063dbff175e8b529d0cbc7798ae96229e160091b6a08b7eb0877d54938aa239cac93704c47b89b92c35ac2160237c1eec237cc187195b15226bc7786d1da2f942d00d52332a6b0511b1708a30ee8c4476de02932f049df005c0fcf3a67e8505900def60431ada85eed091de1de3a0977aa08a3187d410827f484bb74ced0af728638192fee0fd8a6580ee5144995539064bbe7d8298aa7708781c0713e4d6e70ad6e375073a973806e9526c8147e6aa2266681f3b224dd26cd624e29442b6fc40703239e21c4c75c8887e34687ec0515b264f8af8c22bb0975f6fec3023ddda345eb145b017e2bcc5ebe6e7379746d05962bb49b774c5c78a33e1418f561421d37434d71aad3484aa5117280df9a62eb7ebb588bb4d95bacc9ecc4b807242f7224b631d6a0dc252eb01eb9f0dffdf2d6e1c5137caa3acc91192fb0e07b71e6a5c03dd0485eec7a66ad092577e2d72cd07c0563bda1ad9ce39ae8586d158daaad759446385ff2ebecbb4765df64f485339c5537e0fa16fa1e938cb84db30bbdc3cea36381e3cb3869ecb2ef3c1a942f1ddabdba0c6fa2ce0caf4f451893a34f82104eeb09f7ab08e38cf46910c2c37ac2032ac298445c0e4238a3279cd641f1599d500caa08a3ab7c1e84f0b89e7046451833e12f98228b5e3eb152616d550bf5df6f9a6205f8c3271528abcb1facd5510dbe880a93cf0fe9a4bea292faae87d4c1f9b3a5df80dff23e12d6c911447e1646a2619d44599544738ef82a8f6af37900b1b5c0ee83043b94c7d8c70a5edc7a3d698c8c1775325e55c978cf88adae307bf568f76a94649774925d53499667ba5c741ebecfa191d0e2323b50e02fcff4ce675bd0630fe40fc3fd888efbeb2aee17ebf0a6e2891f21ef2276d4133f8a2123c7a84ed61b2a59ff6888acce27d53e4ec9c51a4f5e071634b6e25cb5144e7ad9399c9cc1d98755d87697ce8bd107964e5a2e40de6567896b645545a0f8865aebf5a2ce66bc34e9efb361f438a6d3e3a44a8fb71aa4473c80c5acbaac881dde9e17873fcbc21c6581903e829e4fa807de95598e92e93c0b9ef7e3d82588047878bc019c3ea74cda3f9b9f62fa3712dcbb61a73d9cf6e341659153924dcad2055f67ba0fe2e35c22410b90a644fa4393145ff98ab573ad467294d35f3fa535f97381761a6b53db50f873379bc063be8eb570d950e0614b38e53277c6da2d60df91fdceac26898038ad6dc0eb39686e76d275c479fc076ae2d1481e35326d12b618c186ddb7a149a525c019b1aae0dc34094eaf874d5593c356808c49f6346312b2ce13c8e669687b37e65d4b80f417d9553cea20fea06141ff742f36b8a7a71425046f29a938227a3bcee98a7651ce1be7b7e4e9261bd0bdb221427bd615cfb25a8bace656ea9c288fb9d5edff79da93471ddd411032224ba018f2a5c91892248d15a883ad497bcfb900beec18ab9e57aa123511251a4490d3449584147abf32095b1749a35a6019036ddc14688312685f9bce7fc40a780d1cd318541953500d4850dd3509559cbbe531df60c8b72058dd1258df98cf830a8e1dd1697390c54d41d62641f6ad49c830abf1de5031065eda14786909bcefce66cebcd582b0f549b0dd33091bbe92e6dc123506d7b029b8fa25b8be37095717b7b212ab3d0f313815244c81169140fbe12c403338191803ad5302ed7ef3e74f83b1ccd8fc1993209b3509592f13f999ee9522a38e3a620ac09404e09c4900f1cd15bfdd08fff3a8d65ba13209e0799300eb931483b1d0186c1d126c0b26614b73d8fc6dcfa8831b03b25702f2814920531c48ecae3a8636089eb19d921e09bcc5e6cfc80677e48ccdc8ed12640f9b0fd9ed1684ac4b826ca9195344c9f59e8a41e734b630bb20c1f6e3d9ccac332db8fc4f4ab03d3a1bd80c5a5bca146c7109b6e5e6c7358390198b6b9604d94af32133e89cc6208bb20fe6943cdf4f2a92d49e55ee08665dc744598fd336fb60b997e38101055f1fae5082be4d65f5903947ff28e10e0bf7ca95374dff13e05514d9525bfa7ec3f4d888536d95a4f59c70273db492a37fc7f121cbff84d9ffa5157dd04c3364c69ba0f91d6ef2abd0d83e6cc14ff43fe1586c64154e0000 serializedProgramBytesString: - serializedSignature: 8fc96da7a23748bab055bbade2983181fad69063f9b5a8fed7a44076c046ae956319020f4308107ced679388776223906c7ff6d8e241eb313a5d2a9a8314e704 + serializedSignature: 06760324bdb8ee8cb03694b5346eabaad95b40deff193a9ba7b18ed45245804ee8f60311de2867fa87d66311cd03784d1f0fd07b7d5b1cefe5e27cef759e2b0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a0767478411f08d4fa42f140c47abb64.asset b/Assets/SerializedUdonPrograms/a0767478411f08d4fa42f140c47abb64.asset index 508a0db..a4323da 100644 --- a/Assets/SerializedUdonPrograms/a0767478411f08d4fa42f140c47abb64.asset +++ b/Assets/SerializedUdonPrograms/a0767478411f08d4fa42f140c47abb64.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a5f73db4410df732cff8186a414ea949652e80361da5a6acb7478e0254d42099036133b79e974522771c0603b19d929ed233cf28d78e42bf105e0b7ab532c4b27294aadd03195463adfdddedeee6ff7f6f694146cc2a56ee3b54d9bb44c75daa27d3aa43e7e2da3ece1f66a7efb06b9287fc4bb85bedb742365245f9fab05bcd7501bd010238f690f6547fa1bd4c6ef358c6da3c6ad0778daa052450cdaa2157a428fa9a63e4c61b12d8306ba4db15eaa82f7437a85deb608c593d8d255c3ab819e81f4f520b44ff7949e895a3df4ed618c4b5df0dc158e957d1e2b3a4931a3cba22e4bfa2907eadcf7151e0bcf4688ded234155d2fe0a9ea7ac15282c0b790a945476473a7fa2283a9fc91e94662d6a582a717acc5d30e01c711181890da123b0ce93edd332275455d08c8bd2cef16283ac2b41a9de2cfc8142c5c17773b60e601da1f8997b0a13be8a9d30f2879d473ba0bc33d0d71d9c6b45db84a9b9a781f09bfe7103b4a99a612bb4478cc26787a1edb438b0fe811ea5d91b021ef1722695ba45f43db50d64f1f2be821ca97325b547717bf4d733635646619cd8e1bd7ee2d0fdf4c2bd086a5b7c5a7df5ae4bfb008435faaea6558b4254afc11b1c45b0cbd2063c986e0f1b8eb85e4b1b67b6473556d4610ccae635443b37f7b783fa02f13753123c3e6be2a1a8c2cfcf79da5b9bfd6977eb7c655bb4f366f1bea5a8a6a49c032bf457539c2215905cb2a3a2c68187e65825fb6c1c639c2efd175842ebb014ab2338d1b405d926a47128b5d11b009f27510780c5ca4277db4bfa2888d1c3f1558346ca269a2c6015d30015d396fa0d3234b12d09513bd4640f36546b01a83609a0c7108ce18107458a4770c62fd83cbaa86c462896298174de6617af55baee6396d4ef848d2f6369c76977ed69bb93fefa16ce42c919f146ca23c1029b87d4f4792e4b9924dffee093e238c6d065ead66c86cf3d78233d882b8dfacb85f5dce227d9dc3ae8a053a3253dd280dcf1047ef63b12e279263b1b665999dff3d99fdcdc2266e615926df178337cf313471dfa1706981367b709a83acb7c2c1c96c9c7931ce4244b97411e2202c9962134378d128553830cdc707a6b2893337be6fdaf5564e1cae8193c1f7d088f7bb360ee27cd4fe5534f945ef5e75dac1bd86fe27e8f1ce02dc62767f937b327510c171fc225a96e3b5acc46979c9a4e5d7b18bda24655dcbc9082ce953d00bd492a50ff76ea3af836565d6aa8c5b2936f8aa2c0f1723376404d70664735c524e8670c073f7a0054bd484445e0e93bec83fa0f84f0207118f3febe9304d0b6f87e7f107f209c13f7198b43bfdd6143d0997b5463e2f20cd717fea34e58f6825fd018b0a36ef2eead619bd295d0a3e5c9466cc3e943d23f6183cd62b5371a8dc91e12d900cd3f987b7e730ff3bc2c03f324de02b183bd51280d9977d65809b2f5ee221e6df4ccccbce761c8aae873989402f25657085df7e787d30c91b27792de8df8b111f19855773587438bc2efccf239fc391ef0a8350f60385c381e2a33c57734d2cb52324de37fee44dd5094bf03a9f42aa632b7ffe34ea9d65f55bb2fa3d30afe609e6ac06d395e4be8b5f3e6fce3c7203ceca0b380a00772d4fe02ea7786150f85c7dd0f04792c940391380f2e33ca1fc5443e965ae7df1425772e763947dfa4effbd61da002e0400be9e27c073b18bbcaf497203af9c17782a00de277982775d8337a49f645fce765acdd12f67f382b61880f6c679ece4c1853f6d3bb97cd89f8e3cde61120ed625ed0f3a49bea875e18f82eb12b75b18db92729430db0cb17a40d94e90c93cd3b3d9cf2890e5876cd09d980d2691a19b347d9d6cfd4282556c36d954eb7f33eca63539cb6dc1f21e730ed4aefc978f2b34d6bf565f45dfe1240000 serializedProgramBytesString: - serializedSignature: 518148420f069ac2e2cc7d3829f045329b56a51318b7a8b905046e47ed506443f87faf72093357d3a93ab5f33ba957b63eae185f180ab001b4e4d0a93b728d0c + serializedSignature: 7194455756ed8d14722a219d9cdb7e7299430417a9cd8e20b4c3b98feb3b711669501fc53386812c8cc212ff63094135b4a6793039be27b0512b74288ef6ee06 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset index 4e61184..dbd5cc3 100644 --- a/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset +++ b/Assets/SerializedUdonPrograms/a1125ad687f8d9f41b0da3667d153a30.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d0957dcc811d60063c0800df800db60e30333e69a017c7bd736e063c9fa0ad726713618c3d8b0069b65c06be7dadd64736deefbb7e4bdfca0fc88bce754955a438da65b23cda84696b3f0981eb55ad5555f1d5ddd6a899ab4053f8941f898b7a6ad496bd89ab396ad17d673f83609e53afcda474efd036b13caa7f0b908e706ad9e1257e24f5fa2133ea7e028676dc195dbd61294ab747ec6cac2f729b8360b4758fb04feb2d02a510717cd5937acfbd63dab2371a0048979ba28a7ea122857a2013e27acd770364b4c6127693ad5011f33702647e7d68169a7dd43eb63126b1dce2dc1359bd61ad07c4c141b52c0538264a2625895fbe0af917dc7b20dfe76c1df59768c65adaa3fe741c369dbaea9ab53d79f67f49c7a2c93aadca5ca7a55d6a8ba0b565e041b25d7f98b3ef8dacdea1a54c9db94a2e3f0bc97d5f9c5c191b35543cf39b747f170891d63d9a2ea2fabe3265536bbce23efc9376fdefc57d5ef576507eb734c959dacae83d5617948950714dd2b01e91d50e541571dc859bbac8e33aa3caca17584d51d6675c8cb7baeebbb58db2ed5e67d753ca2ca6ed6c6b9ee28abeb667578fd55757c4295c759db63aaec61e7f2d82bf9b80e4695dc5fd9e7eb9ceb1cbb39c5689f52b4aea9e3b42a7b599b5e559e56659f2a53aa3ca3685c57c743aa1c6434fa5539c0ce15d84f324151ec03882b8bd6869546274b2065bfe1d6b9b274a025ffc50ffce9a36eb720a46d00014db49ba358ba059632aa8d768712cd8cef49fa5c8416ab44143b7375f1afa22e90b935f8cdb2509d83fadb14e93158afc29961eb0e9478d52330b387f05b48651eba5d83709fb566e17383e83d02b68b5b961209c3bafb9a69a0698f3aeb50e300ba01c76bc4e10c7dbe244eb3c4fd14d46dd118f81c46c109285f516fc5b26fc2775d9fb30a323d8ffac1c7546f0f718e9a6e8034c87d9ae2e1371a89422334bc8f2b37ac4bd388f4759126bec1d00e3298ac4c291a230459a2a06ed44a533ef3651182c1652c96d0b16fbfc1f836e5bc5948481f5b9f282f72fa7d411e841c39de380de513e202eb971436de7d3948e971afcbe3b3633f69caf36e061852e4a5400e6bd294787695509c97d9a064a9448f5634e7db045cbb028cbea470b60dd7ead84b2693857635666590bd7aeae12d032f59974145bb9d23a1730e4abe67449da390b2dd6e95da79b9bade801b28352934e00426b7e3d0f83541344dd02d03294c379ec1d13218491618da22f5662dbd2a1b4995c5894e29864d70d7e8e06eac36dcdccc82c38dd3b42117dc7af49a0ce895eadf845ead0e3d6427315d45f44a8d9c5ed861fadbe1c20e7ff4f8b5107e078b64f3e6c0845e9d06bd0ca2b7c7c454a38b29e4c7403ca9530d4d84d74555330775f6ece1269d5da56839ec72ee5b04cf3a48671b9ce92a474d776955679bf8f15628ae3574bbb0ab53799a5ea9ada4544c4be4793799c22e9db668b962b68a8e84e75e109545681bdc99701d67c06db77ad0db09f4ce22e14ab36082b05ee74d08e13e0d578922576a37bb52838e321eeed7246a1954252edeecc62fc9a27eeacdfd34eafac1ce0feac6531cb936a15d510f8de61e76eb7ac0f61dba21c44db8c94cb8c90451a709a2436541d46c82e8b00e22f4ecad02dfb5a7c6684c37c87f1703c1d76282ef4885f0ed318d045d218c047b4dc4bb4320de6a227e3404e26dbaa8484a88660cc3a4f539dd5dd8748d09e18e61c774e6a40da33d56a9b12b3c9e4d81b75d6702a8a5e37ebca2c7acfe7d3af593ab3c8944fd936a5288f7c4c255f809df0a3f490aeff75078255c9a54bc5fa7098a2b9ba29a70a6d03310ae3f04080acdd99eed0dab563b73cbdbd60390da3dc3c4e34f09d99c4adceceb1cdade1a3ae55b43bda4a1f3965555ee4d9a3ba0734e1c45f17e4871ae16202b3a68a2dc5729e50e1d65b4b6949f80d26b26dca9219ca6116c35a280e26423387574ee48871756cef836da7e32da21cfb05229af26133d644a21064248210eeb54de169dca0b87e051f0de70553ee85be54325555e39af26951fd1a91c1d71d88f87f79bd5dda5238cea4efb213c6426dcadb323ca7c5622b1a3bb347db1c71194275c2bcaf8b6a211b2a2410f2baa9453930d1dd5698452c6a76f816787ab8f51dffa18237d0cf8f6eab0b4714ce7787878d6322c00e0c6a8e00b003dba7e700100132eed3d07bcc7fd1154ad92fe513e7b01ef0ed421d2736007cbca46832c061cd77182ed2ff809351e8b01274c89d5c54a13ab9326ca972aa57c4a4719a76a97fd8071d24cb8574718bdfc8a1fc26366c2a7758431ebc00d5395661d7d3ae2a872dc69655c9d7677d06aee206572b7ab2677bb5696bb9dd1f583a9f8753ff07ba4e2fd2601c64d024c9425c080295e4c563b5e0c9ae2c58d0ae3c590c9ab6f6abc3ad0c2f7b0c9ab6f55e8d5691d61f4a7db7e08f7980967748431fffbc00f618ffc6f4447b89d0e7d101e31131e3569ef5b1aed058ac9633aca18533ef4c3b247927d5647187dea8ecea730f0e8330cbe52356c2dc0ef530bb7782f58b830bfa98e0af3156ca5a7665ee80ce2a5e74cb2ddd5c9665e7835735328e967d07e19bead502dcffe76ee2907e1ffbc89ff7b3afe472be67f05ca55385aa1a33024b86092e0be4e82cf8d1214cf5e6dce718f03c67333b7e67a3f3df1dbc385940aef6d7a9ff3d7174a1504db8b266c1fe8b0cd5ace1aa6b385896f60b27141fb78426b94386f9acab7bc09b3297b93145ad21259c94b6a3dac9047fb297cca649ebc1e67898f0909b786f81e9fc2337cff8afbaa79e8017d2c084e974c387d5b87138eb37a8bb1657d0119c30204109c41614eb14177b297c842ecddb9e5d86218be76d924e7b44ece1b1e919c2f0e8e43891a7d1dc0e34cf66ea21c44ca2b26296774523ecb5bbdb3b65ebc6a5fce9abd8dc52cd0784d3bb1b7f2b7a0834befd72a0aa34a10ccde336136abc3ec76e028ecf8ff2a9ccd02995c99761086b7bf6f92754e276b2ab0ace3e0f1e8f3e1707bd5c4edbc2936e9b975afcbd9bce6d4b8be4e33a0e7beb3afe27695ca79cd24e7473a394f07c832b93f87c1e97513a7dfd171faefd0e2cb8e343b51c6bf86c2cb71c2cf1116f254c38dc17aadd6c36f228133ec9bc40d46e80764077894b3d274fb3b93d75be9ede388ed3af080316b369fcf94de14fe5dcbfc7057f19e87729ff32925854e6bc34c6f5c3affcf3a143fd354af24726801d274bbfa5d93f47ba8d55aa5d59a34dd381f28d39a4a73f190f756f201c152fbe66d02f7540c4de0fadb025dbe489b0f4bd22fb5b37c8808388f8784f03c231ad53800b34c812a07bff8539facc920eedf9704a79ec0d966eb83718067ad76079e8f25e13942f0a089f2a0bd0180b983b6737b6e8d929178c0f89f04c2589f7411bf155a2c2bef019de2a8bb97c6b957f420d326d15b764761da80f3b671fe036e9ba9a24894aac0be521ad7dd490af48379663f5df2ff3d5e6770bc7e84209c7586378a238b9271a499805fa00b6cfddbcfdc2d80b7bafaaae4b1c4c6829871d28f20e5c48d7d6c747a2c095b9b826dcb2393cfc801d82a05609201b82409e06e05e09a9a122dd2444510b27629c8ea1964cb929005bd9f1a3f284719945949285b94f52d1389f8bb6d1f03ee4934c3c50539d886a4603bcc607b5a8d68b7945f78cdc95a5abf14644718642b9290d52bc872d0604916ac3129b07a1958abd570cb75ba2136a516f75ec9c2d62205db6906db27d144b3891826bfa7186ccfa281edac1c6cbba4606b60b0ad49c216f49d1df11b4f330cca7549281b2c277f736efac6712ced64703d97846b0f49b3b30bcc7db7520cba1129e84618742fa4a1b3d3909da51ae7e402b02c065da314743d0cba0d49e89c35926de36ba744dd566cc04831003f8d669c1d9183ad470ab63606db66742e2b98a288b9ec00832e27095d9382cebd81521034b1c5a42106da5614a0c57131f300036d3b0ad004239b18680719682fa3004df0568d18682718689f45019a60ee2606da4906da2b49d09cf761c52fcd4833885e4b42e4e77d58f19b938e31f87e28095fa3724bfecc4e1c172b6b19603f9204cc3c1bb814c3097c3783edc7d1c0765e0eb65e29d83a186c3f8906b6f1184ed98f31d87e2a099bf7dc5330b9159b7b3632e83e97840e5f0151ce7eb3c24de9f173e9fd0ce02faae1d2f64dc2495a8b5b8ded4c751783edcb6822a1e00ca2470ab67606dbcfa28b84823356b148d8cca0fbb924744877890ee277137a9881f4952448ce969ac267e6e33883a86390fd229a4816c7db301683ed97d1c0361943d8fa196cbf9284cd99e0f3c72105136031f7dccb00fb75b5018b633cdbc300fb4db501134c2cc4006b65807d1d4d24bb18c3dd465d0cb6df56c3ced6e82509f623d57174cc430cb0df456367e76238623631d87e2f099bf79449d0e2c4a64c0906dd1f24a13baaa02be73d06a2d08a2d1b9d61d0feb11ad1ef65fead1ba26edc2405d82003ec4fd5064c70038d1860c719607fae366082330531c07633c0fe526dc00463981860350cb0bf561b30c1d55bb1078a8e32c0fe566dc004a7566216d662bd332f92c820227fe74a4fb195e254e0c74b52251f0bb0dfdad0a6b042aa77a9dd62feb98b9d3738a4e9dfc1f07fd4e3e7453cde3411296f6aff4038127a1f580b4dc761bc3242276969f9ccf6d2eca19534fd13987759fe7fa2de95dac94c3b689b1f7ffafd3e34b6df70863fc9ff0194d9ebfcb6870000 serializedProgramBytesString: - serializedSignature: 3c657714666f9638961f25c4fc928b54611b8d262f2b850e2f8ee50b64c1cbee50772ae570601377ec971ab6d2d1275f11fc8ef6ef980e8aa3e9f3032c87300e + serializedSignature: dcf3d89c992582e62c444447b2b4d4720458e9a04a4b7a8ae429bb18d1ee0b67eb161df8815d4bcf599a974c17574cadb0066b42fea59961a5298bf8ca074200 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset index bc23815..f1aba0c 100644 --- a/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset +++ b/Assets/SerializedUdonPrograms/a3b924aa5d416d94c86ddd019ccb8441.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c59731b45109e95b53a6cc9576ccb244e702010411249760eae10f045303847f9aaa25254a238b2a3201f48cac55b9ea8e2297f84375e78a7f805fc00fe0974f7ce4ab3bb33bb5a49632c13a9b4ab9da3a7fbeb9eee9e19d9913c839771112e9b6c952db01cdb608fd83edb836f0b70df85b7f56497df6555b8efc0b5087517d974404f7c9d3726e1ba0c4f3556879e4fd916dccb54bfc64af07d19fa96e0094bb7e153825646143a6db0457687dd6619633c80c42675aaf13203e53212709d672fa1b6444ce12079aacac0650d6a6a54b70b4cdbedeeb1ef49ac5da8db823e5556019a0f8962e237b81a2413dd4c7eefe377e438069f21fe1c814f12fbf1ef629f04bfc7f86758783678bfa40f1d3fda6e7e465ae893e26d478567e86facf0e77e7e4ff3762784676c3765d1321679f9206f37263cdb74b07c9cb77fe0c35bd425c744807c03fc3923a3691a64515f838e8bec80e569900f4298bedd33d8e891742c62d909583f0e5b07f33a000212cbdb20bbaeb3cb6c566a796f192981ef05ba16a14599884e7a87f8dd3304325781774998363528bf49b30e274e196a726c05eed8eb019b818970cf45651386adc0d42bb175b81e10bd07c0b6b765904838c5dc7d5681a6e50176a1c406f4009e2bc4e11a5d9f11a725e27e19caeae48ff6c023cdc3fd058de695bd0adf6563ae73c8e43cca1d81aadc7237b69a16411ae43e4fb6fa4623ff854610fad8249f86d13c79935f3c9a7883a1e56430102c731a330499e1289b65798a15ab1e04c3cbe895506edf16ded7d8155f59e4c8a0ba4f91044d0dfffad7d89faffe7efdb3e914ed32cb53d89d0a10cd0f58a49735263c14fc4530cd68011975c36fc8e08f63e1da21c26fb52b53bbf00a885164722ac0c08cd30e9a6bec31545481d51c5b02268ac4768533b941225528cc9579d92d68630d540565601eba43edef00334fb82ff5e8b6808cc4493ddee01b24a24a411199821287ada0608fe4a7a04443aea682f0254730a94030880715827d320429e37da215c10d28b352a725aa2d53bcc5c85b24eaa22da13caaf6368ab76861f19438f1c71b53df4b2ebce5580f10d6399a2bfab85569262ad30ce5ffeb8768db58b74f548ad036bc7563d27cc16ddd72b8d304f7a447b8601654109a12080b38df062573ee1f7899491763381314c46332e2a89f21a9c86eca6935e5b84cf3688cb44cd3a7797b39b50679f3b750875ebe44b91996df058a45181be9cdd108cd2598b387bf450cb73cff46c820ce098bc34e3953194a42a64b447c54c6ac5b95236a552665aa4c1d768072bba77053f844cb0a1b5304a7a0f1556ae997a18713c77875281321682f42e6feed71f7c9e52347f6627415eedbc405962317c17b18fe9a196fe0d3d44c9eb6789658eb3b2afaa5c07cbc1fa79329b79b0cd9cdd1e259659303325781363929514681020d7c2224e74992735a2aa7fd6d1eba6142fe8cb6239e02cf325e4dd3e385326a2f945285aa539d86aab48af254a79407552ef974872e7948461843ee192659295d65aaec4f668239761fde3b0cb7c2efd3f6203aa467f08ceea7024688f5e2647626371e39e26a39865572bc2d93e34ac3e89c115115419d92e0ee97b8eaeb9e14232a29a665525c6f431bd6c1c49ca00b7feeddb59b505786691746aa519554676552cd2a74739b387f4ecefe07be3a76ea65599b5e4ea824784726c162680990f33b50b3d7e0bb75bd764fca319594efcaa4bcd1b69e56a06e8b0889330d5b84999361241b5749764e26d977a125b3669553836164e944dfedccc809151eefa934adb6300b817d90c3920277cf5e12563bf0dd3e4708e765dab7e18c4ab2f76592ad34346da71262d263ed21a196b6297a61a2bcdc68b944de135bac92664adc9f56392258fa230d835259097799862eb39f7c90f1d7671cde8681917f89c646acef520f7caab13c05f48234a992278f38f62ed817e2bd0e7c3d24dc8353c2f34c7da0b8cdba75b61424854c4739414ba274ad2f30bce768712e914d0b90a694e3b8499a45ad46b95623794a482eb4694dc15ce05177ac4f6e43e1f7c52d02b7b9cf343068dfa7619a8eb906ab89325f03352767e0c8414bf64b44c03e8ae9c2e93a9adb1c40f6885669357863ca1a372305d4c8873a614b126ce586b559797b2f40f48700d1059d10c50822ec8ec1ae37c061023817758233da98768b34b42aeef50268af09b4b8e922fe55d79c7e7b679bdef0344409c10bdaefa912bd47ee7045abb0a3c6f92531dc643d132b1bc289675bb6bcacc2c735732b794e54409473fff3b4a780690f9e98c786ec2c817c4a41a74f99267dd91adb834661d75705374f9dfcae22e9f03c23ad08dc8ef719145cf68c4e78d31c5e1c789bc0b569e342441b70a62ee0c45837ab1338dc316ec537399fb05def59635c00f5b24e5027b8356e716f59772d9045e6b54eeca42e284d01ca2b3aa14c1135f96f92b4c136a00bb63e01b6ab3a613b2b0937c8449d4ea0f6d837fc87b4c7cd2e2302c0d774023ca40c387bbc8936f0e2bac03304f03e3aac686d5b64734f531b7063ba804b0ac07dacdbea30cd16bde012599c95df6b4c75d2bac08b0ae07da213bc33dceaea94e0d4421e5968f486dac24dbf00eda73aa1cd48c28ddf59894630b5d9694a00f3b3a304e64c0f829916c0bcae13ccd39e49ef3c2d53ff4c47ab959ed405ec8000ece73a8145095a5938e231ea73a155ef2d1b1302a43774423ac56db5c0cfa383c16d2651bde702e8ef478ec7ce7401f76dbf40d330b869647d17aed636ed0897147fc1788b945804ca45ba37b76cf3f4cb1d5ccb8439c0f4a719bc9ffaa5288c4b4395ae69a81b7bc432493bd92f4ef968254fbf2f3acef2cf897a8fe4e95747335db0bd608ee65998bfeed6bd6e3a7a3ab6fe45c401b544363bb1715c1738e9597f0a989f389af6dd3dd9179cf69d69d7bec373b4a8d3be2d6a5686eba27db305e9e47a70cbdc6c7540f6d03c8eb466fb63867f04178cc469da1f57539b83a71d92b54c547799fd8a9bf63b43879c1bd0d7f230185fabf49f48aad4d2fc179c15e1bc85450000 serializedProgramBytesString: - serializedSignature: a4b93921d968481c57c6b4e3b7a7b8f8829a9b0cd9abbf8b8a2ad0061caedb075d1293f3f253a22bb4a14977a76c07de1e74e124c204ac36ffeed252a60b020a + serializedSignature: 60c8e6bcd04628543470bd20729b231cc5c7bc4db841b8976ed69acde40763a1aba7db7375b9044527570f774167fda7734000bd57c88642751e96cd51c7ab09 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset index 2752940..2343456 100644 --- a/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset +++ b/Assets/SerializedUdonPrograms/a7250c474046ad245ac64456f76800ca.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd4fd350143f775b378620a222607ce00d8cb016487c970f81449030c60b316340c1990dc806888fbefa1ff9bf99e0ef9cb6ac6befd60d680464cdfa71ef3d5fbff375bb254cc2474de2b4451b344f392ad03e1dd311eee671ade2709ebcf175aae17a8873097393341641c99f713582f30a9eea740aca33dac3b52cf379b271bf025a1b4f3c7a80af8d552a05a2022dd0675aa3613514c1624b88eaee9862bb540fce73f403b3b628c5424c991ac6298f99bacc55a1b4b76e9bbe885955cced81a64615f0dc158e3dcb4c2b36c925d978a4ac7b9f70afca3746beb134be6c99717979f9c75062e532e496e8844c217edb853b3cca684730eb74c255665cc49ec2e41330d0a05110ac4f699666b4688caa3e9fdef3722e61455998b2b08088df2111ac5c0587ed73651de34b1209eccc326672f40957a6daa16938673bc0650b622b08079b36713e117e3b503bbc32ca24767b9066033c9da8ac62c403f404cf15d1302fe773d1d416ed5730762a3972842c99c3f542a4856dafe15e2773d3854cafa33e385b8d3b29e0b96901d6b0f6a6c4eda347fe854718fab4e1a661cae41c51bf429e78c4d0293286147d87c7b453469bc666c8e447f5338460f736862df4e2bbd362bc243dd146c3daa56f6e1679728f258358232f1b37703d102d787ccfc5a6bd2c0f293deea92b7c1af16372bf518b5db494f8ad600d136686157b13e1b87661c3964da831ad69dedd1c68bf42d173296767a0d5a9671846735ccd92c5ea6544c21d03cf4859ece86072285d7270f557f95893a399b3b3ae2cebdaa5ba3e8059dda94000eb3d9315cf84f72d51f25ba197d0a067b13abdb25b6a5649b1741bf838de5c737d6e64039af2b216f2923a79fcf84493c316473aefb77af9c608c9c9b496936a6557bfceaec255a47bb1e78f3ca7d170641cc85e8f2363e56ae5e2151e1b12f736f03e97d5392ae2c8cbec3e389e89bf986f83c659d1f0a4df8fc1b92dd096c1498f770687520ce3a270ae81725d28f8a94ea66ccaad2e729a6557113bbc39da84e5bb9225d199fab4cd8efbe0d6365f5156e8bc96f3f9cd6f5de70d28bcd1ccb81679bc8034e7ce83b37480bdeabdd4254cc9d777d78ca6682d9eb1b464a76f6d51d5cf61e0d52b79852b8a9855698e750c2ee0ee3b462265f93b9c4ed69430f0faf72dbc7072807d0048fbd22aea38f8c3e91e60fe31a6179b4e7b5b383706a41a5dc81ea026fcf683b9c2beb8739a0ffa637da26dbc34caaebe5c5a5c769fffe715d1e28af88241487905c462c85ec699e5facd4a40ca4df6e1d9a64ccf7662c275b23d21d9ee0036142760fd12e6450d6845b2ee2170ca07dcabf8fb4951089849c97da98915b6745cb0910fb6e138614b0bb712a60f897fc9be7f50251f4e23b6388847fc7d6aa245059d0839cee98183aed51cfbab325e8294925c1bfdd0e42aa3de53771bc7f63ca39bd5a8bfa107bc55b9530d5867e94d9a715f1baf98fca6f6a0ed7f4dce1f4f6e51cb18c3b2552bc0f30e73fec5aa26ff8fd5648df11714f5ef581b1c0000 serializedProgramBytesString: - serializedSignature: 20b5a5f1abe368065e831c1418164be808555a1d0d0946798a1c38538dc389cc4292758b1e65203f8d736da15782521c6dbd5ec4e70bc2b26f4bda547a0bcc09 + serializedSignature: 30495b65cf67fa10ee8e7fea3d1fb7a81711e26149503f251c53bed56888bc279a883855231f3ced0b851ac3b84e7514511b7819850dfea7a107739212fb3105 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/a73b5f950bf0b154caa97193c9948e88.asset b/Assets/SerializedUdonPrograms/a73b5f950bf0b154caa97193c9948e88.asset index 8136bca..f1ed131 100644 --- a/Assets/SerializedUdonPrograms/a73b5f950bf0b154caa97193c9948e88.asset +++ b/Assets/SerializedUdonPrograms/a73b5f950bf0b154caa97193c9948e88.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c49771b4510ee912d598af75576bce04020ce66c97608610bc44b1c856ccfb2fd2081672bf698086cd9c80b21372e1cf84570e6ca991bff82c789f7a0aaa6c76acd546b3496db1b919ea6677aa9aefaaabababa7bec484ac0c7ba0697453127a6c4a85810ab625314e06e0ad20df83a4f6efe135184f46bb8e6a0ec9a180e68899f4b562f5c33f0b42d76a0e5ae5881344fe55961c37d06dadaf084b96bf0b3a196550f8d16c4b4782c1e89a4d51d4062911a6dcb3c0be5b2e2709d143f40a94d4c6127292a4ac2250b25db54b6014cbbf59e89af48ac0d285b813645b10e349f13c5f8ef70b548264aa2328dc9b449de772bcf28c52d597759e677c97a3dcab34b077f49f95c27d356f825e47d834cdb94bc56250fd31649a75779ae979c5b92274cdb19ba1d4a5ebb92a7a38b69b3d2a659f6f5b9a7afb84c3b258d3ee55947e3170f0e6ef93949e3bca68f4659deaf94e3f3807c8e485a583f12b5c8d2ee81ee73624ba4b0d0ba2caa1f126ecbe0c180a46311c77e605460b73b60765b4080b1c805b2f71d3121c6598becb39a14bea7e89a831a79223ae8efe2575f17c8dc3a7c6d65386d43fe2c8d461c50792819150f20c556cb620c06c8330f9545e8761d86a42de6e1ba45f496816d7fcd209170e879dbcc014dc7336c408e0be8163caf138759baee11a736719f81bc1df25305f0549390bea4defcb217e19eeb735e42c6f3c83b085dbee3865c354d8334c87d8a6cfab5468e4323087d6c500ec3fa14798f9f7d9a788da1e36470e2ca481a6304995596372e52340fcef9100c2fa35f42debe1dbc6f8a1b1565e1914175f79304250dfff5f7d33f92fffcf667b45cb40991a2a97d2040b44ac022bd11abc747a1b208d1687d1a19f5c26f71f0d3d49d3d42f89d7a79aa175e01319a99ca156061e624dcbe822fb2e5d3443a2683941166aa0c624807678483337ed47006fb8f4a70c6f7e52ac1891f1ec18406c1201e7408d67108529cf6a55104fd81967b37096d5f00127b347bee427b2e30ab8c290698d73d98f27836129ec36cb8188e231dc2f50cc26944b8896332e16112f9d3108e7284e332fcf65ad4bff0f1114fe889c738bb4058ad1f8fd82ef8a07d96d6af362c2e9f8b6f64b4e5f6bb49911672e4466d7390ae111798bf225d7de5be2a5b58cb3e3e258c53a82c6b26c4d2c3bc14b8b48c90a5b791a58f0a5c9417e42263863490a79e46596eb0075d7d178b87b434df256d47a3fc386ba7de4f1636ba11dbc0d97ed351cf2a5e2d849b553aaaf6809d9a1925a87f1d7a71ce2d21a45d5cdc8056892b213576d8263bcb411f88e1aadf2936e8fd5682d31d3a44ebd5b1fa2d6776467a6bb4c877e83d12b8f5f53da1fa2d48bd27ad7a1eea14a10f5b625f8ba7c2cdac4126bed0c7183d6411b7ab18ab26a5d2d9d7399d7d2539fb42fff7041e72808d6a63599ac90b21adab91b32e9a0ae68fd03360d92651c941ddf0be01b7ffae7a2d8237853e32855e9f70c12ce8d4d7c4a90f213ccf72e5554e9f5e39cd3acafdb5526ed1511ea895722b675094b966d4a074537a2d537f65a31bac7a421a229bbb522150a92d40e135d1c6e91835f106c7b857c5437a15b7eb080fd748b84347f8428d843b39c2386edfac8670a79e701767ed04fcf2914cce59312d3e83b21cd4b7698b10f3dde901e9dda11e4a9353798bca16fe56d5167e912cfca232c1d6ca99ceaabb7593e5dbdc6439bdcf5139f5f209ddd9a619154bf0cd40f9632871b6b631871f8b5c308fb55524cbe79430d3728f4eca7738296f8796d2095996c403285b2142aa66b006474fa7c330922575925de224fb22b464ced96bb906c3c8528bbe17819f7cc800ac5787c70887c782760e51f97290d804799628a0b5c577d03c47710cb6d35b75b974d5d4392c8befd3e17099c3e1e9be5db8a1b61a6873417c66bf66297c9f23296c906b8f6a3bb8cd920595bf56b048817e7e7f09e7955bddeef596a9788541e4bc0e912b1c223f1944244ba5ab407197a442baba255169bc55cb47358babead13ec818ecd7217d9543da368c746db6a7b3bcc3c0694087d3350ea70706719a933ecd26799cc8292f3ddc2b48dd83ea705237c0d7b270493c437d17a1e5136a814fdb2245916f5a046f23b8f9d8f70668017de2fcbe0683b70aae0bfd7b19fe75d4418fe80fb6199261a5ab7e53c7ff3a428394c8a50548d352e0ac498a5bd531f9b69688a4685572f580d614cc05be4a17abe36d28fc81a543e0918c822cdc955c9203c32647850a09ec25680bf63a11704faf0fe1852434ad3b00cf2a2d68b6e18b1f1ce81ee2770fcdd60e7632ed1f15ade4875ed2e14091e8ad7a47092d3f4f1ae769d5ca4734965272b5bc8b4ca3ab1dfb9f7bc1347ac17104a1db751a69741a132647760fe9cbd558012a550a2ad2defe6b7933255136fa3bab11ee201ea0933c8003e58da3807245da62e538d620940da6a08c2b50be6b12ca640094e50b4fa360f69902b35101f3a64930fb99215ecd5a7fc21ca843a640ed50407def24823a7e0a416d5740bd7512411d3b85a0b629a0be7f124135e8538d81daaa80fa814950279809cac43e984125f49852424251c287269530cc5876b8cd7f83f05e34056f9702ef4726e16d96f062c76b04ae4b1bf7d48c011735059c5080fbd82470410b019579a336983005655481f2b64928f165a92d65e06629e4f76d3d1d1e648da620ab5320fbe438adeff4afe81b14283f3509e505668229d2cc8c2fd117c47df9c774676d78471480ef9804b8553bc5146495d3b7496229e04d1ee7402fdf6f32b8463206e53905ca2993500e492877c40bda2e0ef75a88c121de660ada9802edb44968ddad3cdd06f359d8ca6b52c09c3949601a1cf4c6c06c56c0bc7b92c034b875670ccc1605cc599360622c82ff14e5218195a30d8ce2290cd3ebc599392f4ee34ec13da11caa8e68d753231a053a07b7ed52fa029563fc9b83de7294960e7153f4b22e1e658479c3a132cde013d68c50ce9f3d5a5b3f34ad1dc6a93127692d27c84d15b492a2578acfb2fcf785f33f75e883669aa4f70b1640f30e718cd28af42f978a5427fa1f88eb018e6e4a0000 serializedProgramBytesString: - serializedSignature: 0798ff820da76299b0071d113c50d41d4b2dfbd5156f266dd3cdeddbbb8a150157e2b8e57517dbfa61afba76344dcca1652f14ba49bd60030b72673e6fb66208 + serializedSignature: 4852bd94699a87706b8d079722a842aa926ba6b577bf4e493b1a83fd5939dbb9df4758cac3d46b039684370e4443d3d77ce8b82a5e01ac9e44fa97f4873f4405 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset index bade9cf..e75b859 100644 --- a/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset +++ b/Assets/SerializedUdonPrograms/acd8738ca64f5a9448dfb040d1f2e4d5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a59531b4710ee155a1ddce0d8e09cbe126473ec82abf290872406db09558e7171bdb852b280852825b04a222ef217f28ff2df5245ba7b66d1687746ab058d8888a5d21e73f4f1754f4f6faf321ee0c759c0c32e6cc21a2cc10e1cc07b38c1ab353c1fe357dc85ed6fa081e7233c56b06f01ee25cca4cf9c338bc775bc6bc229cefc03f6f15ce5fe2d08f07a1de7067847ad87f80b709493c5493bf01c36e035cc38b71348ecf2a4a66c73482fa780c755f8137b03168a9878dc3583872dec6972df310a1d8e7b0bbfb25ac7d8b78f731a50439a7b4cb1b080478775e2d3285cdc4251b976e42f87bf71791df66722d7741e93e721396742b947149c47117e598546d85650da0a0a7ffa4d46f8e595b139a58dceae6c9b5278a9ede3115a23ca3df54fcbb13fd2f9fcfcfc1fd7614bfe8cd856a00e1e4f7c9cc2e5c299c9cec63264a411e698ed299ab58e043416df617f3a85a7b0a2b5f85d6754917b8d8f151c5165a2c42cc2e2ef180b12ae86df4071d726b6ffc4de4e0e5bc59e257885679af50e96d101df46a8ec22db1aba7c00db78ac33bd7728767c64924ae4dad1399b4853acbc636c0901ade37d8d25dce2e307963460e9d7b1ed94e3c0094682553c9f31b7b8ee0dbcd6f1dc9690e965d42f4053bb58e6a1999ea33624bd476be7a345aec5221cc66ec96598f53882fc15b3c4470c4590717963133496c5f6d1d6b6021edd3ae51882e9758c6b18faf70eb689c0f6827babbc1a04f6a45980634f59834e23432df59891232cb26e2ddbbbedca3e058f37a4cf1394ed0435d12b390f397be88552ae9bf549f4a8a91c9da9781bddb26aaa76ca625c95c775723cbd4972bc51b69bc4a1c61a0e788f0236e1bbb88dfc9c4c184a9a6d354920139c191d9c9cc96cf611cea448d3094c12762602267df4f81519bf3b31dd3a4b60426f48871ee778db7d446f95bda6c67bf1c925101c4659e7a308eae11b61f86663ca258b608230ab81d077658a1d8b5bc58850746720ecea08d3f219eb8670de4c38a733fa70bf23d00662fabb4ca8d29b7cbc9b4dc10f9f8a74012789bfc9de799d5908bdc96ecc3261364bc1e448535774a4a28e30719b36459e28f1a299f8b089f8ad1e101f3111ff4443dc49497cd484f7ed2be23d6692fa8e46ea624aa9c74d51813c3cb6277f0ba67486529430955982327e9b40059132533de3ab72db925177e868df2e2e9c2a3e5ca7094313264d66759a3c8b2ce0d67e27a4a7aca38ccf5f14849aa8d96f1cc8a372b66699dbdb7bda378634fa4d9af4bbabd3ef490a4b1da5b0541a89a74c127faa93f8fb884554ae42ce35de06f6714a5c4635fc76eae98d66d326cd3ed369f64357bef60cfdfd80ed25ea0157f7b5568f5eb73c7e1d8782e20b1ed9c0b96f78e5d15d133c8e973e745f2423eec7883779f83602b0c79e9e5c32a3072d53c9ec107a553d49d242e045f30fb9c4163e91ebb44bd6c95c29ca4b8d425a88346f1e374dd32fc8aa61353ae3f13e367f496f4a96e24be236a4f7a1f4cf8782c06b7ebf8004c8640dce5d5fc947d2440e4909e12213084b083da813938c228834e4b6451f5ae411e22f7be667972b02c457c404c7a033148f5a89de41748570a2f25f93fc2bd5c34b1a2f6985587d68f4a9ebdeff3cfaf914fdee1308e361b0f029583cb0b9a289276d9855f936afc2a945802d2b515e57290316db56b9db8d229759e9055ee902b6873661230627fc76638f7d6503bd2574f6a63de08ab6801b53807b6413b822531309f64b7eb95c433106cfd34615c0beb60958412ed00a0e38c2185606df1e5c13b6e0ca2b707d733df16c7900bd2cabc036d70f2f1304ea76bdcc5a141b51e02a5d8f975984cd9a978102db63dbc13f84ed803781c1f4b38c02d8139b80e5256001033698600d2b60cddb046b4c82b5cf99777b0dc9227023b6801b52805be847f01729863fa029464e816bb11f51ecc34569d36a7291b70598ab00b6d46fc02c7a9835c01c0530af1f8089d4822a418319fa8b70630a6f3ed564e81dc04585aa6478962d251407442d6c4a624079e32f10b0a10ff8954e45a98b79fc368f5e37a6291677a6995cb4a23fbe5d94f322b6abf5cc76bd28c4e934bd4a516eb483553c7ef37893f55f01f1af71fe909bce70c976072d2f8807e8ca0dcedc1b3cc6fd1748cbb878b4300000 serializedProgramBytesString: - serializedSignature: 1a6952b0f40151df9ab2de3f32e0a770075884846ccfa8e911d84fb03430f400c794e37250a51590e55d00103b4cbbb43c9928ee79bad6d734be4985f585c208 + serializedSignature: c7da0d3fb4688de1a225f0815ebedd11c346eefdc36ce3c5eda9a7ae2115868e2e429e7aa61f71ba44695c5735615e33e9132f92d2c00d2b8d694368a9f1130c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset b/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset index 84e2da2..abd99e6 100644 --- a/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset +++ b/Assets/SerializedUdonPrograms/af30f5be41a8185409ba1025ae8b92e7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c5545d6c0e701217442ef10442428901010bb4817454108d8508c244034149380e0da7befebda7b5fd7debb6bef7dd55d5757ddb5afabaebaaef5bb67ee4cde79f3e6bc77efbbefbccc65bff02393dbce9cf39f337deedc56e5c2fb498cf27e2d1073c5143146cc173562a558e1fd35c50b977bfffc237d7e8e68f0c2a5deef6aefda28519ae549f81991e8ebfd9ee91d358a26efc9d562b117d6c9ebf344adf7f74cefd95aef08ce2ef1fed77a7725da780fcd1753c56cb1b3e893e89545c402f950a33a9700bb12edbcdf93c53aef6aad540a22299797fa78bfe679571ae5b5e59ed2fabe3dc55ed2ace5deb5c5de330da2de93b9af94d86ed45021ff107ed059855d54d8d1fbdfd6fbb39b3a6eadc203d4f9eee818acab57c75d8dfb4bbcffedbdff45deffe3d5b956ea5c3bf5378ebfa30a75bc0d2abe1ee818e27b298bbe252a6c34f46df49f2faa31ee6bad7482bf755c4de89cbeafb70abb2bb93d8deb7dd0b3b6eb7d55d893b8de4f85bd88ebfdd5f95eea78800a5767d0b54b165d5767d17560165d0705d475880ad764d07570165dd764d1b5348bae4303ea3a4c850766d075832cba1e9845d70db3e83a3ca0ae2546b816e9bc1171ef08151ea4aef746c710ae4332d6a9f03722352fc1b12d2fe9f0e0107a1c6ae871a80a0f41320e51617b74ae4c8587a1733aa47c4a5fef839eb55dd7e93492b8aed36963e2ba994e9ba87014d20bc2d1ea3ead4fa6f2718c90656949df00f7b636c2c333a487be47a7c791467a1ca9c223908c232ce951aec2a322a4c75111d3a322607a646237d6e7dce72982e531486e25c1729c0a8f33581ea7c263d5f9bee818c2a3d5f97ee818425dd71dafaef747c75e3e2c7ecdd7b95d27755ed7a527a8fb0718f24e30e40d4c95d7ae2203a78e86ac13958c41e818c293446a997192927db8d2f5ec0c7168199baa70bc91aefafa04c41f429daf3653a1e6a1753dd9d0f564156e2e9adb2a1dae0ce023a64f9c1ac2274e377ce274159e66f8c4692a3cc5f089530c9f38c3f089337cceed3f56f6941ae976a6e113a7a0f358dec054791da666e0b285c15bcb3ccbe07d568ebc8b55f85b256f083a86f01c75be141d43f83b757e283a86704b159eabae6f808e213c1ba5675be399f3d533c3d0318417a0672e50e185eade0dd13184e7a9f3c3110f082f36eebf58851719f76b9d2e55e737427a4378993a3f02dda7cf4378b9ba5e868e21bc449d1f69c473a5118fd6f72a239e2bd17908af36e2b95a855718f15ca1c26bd4f98d91dd106ea5c26bd5f54dd0fdfa3c84d7a9ebba9e3dcf78fe7ae3f9ebd079087fafae8f46c79eef77d1e9a1f9fe41dd37061d4378833aafebc24b5478a36197b6f726e3fc8de83c8437abebba3c3679dc62d873333a0fe1adc6f337a0f310dea6ae8f35ecd3e72b0d7d6fcf923e7718fadc8ece4378a7a18f4e9fbbd4f971e818cbbddb907b273a0fe13deafa7874eca55bd79f0cbbee33d2ed3e15de4ba4dbfd44ba3d609cbf1f9d87f0c12ce9f69061cf83e83c840f8b543f7ed8e0f58821ff5e741ec23f12e9aacfeb74cd54e66e2d64f9dcaf9d3ad6f5d8a322b55e7fd4675db29b7f7f497d06d95ac6362a7c4ca4d6858fa9b0834896a53afec78d781ff7e3edb6103d03e113c67d4fa8fba61af76dabc2270d1d9e54e153161d9e52f76eeadbda1cb7be3e115d87e3edfcfbfacf52c793fce362dd070ad3c6781ae93359d8db185354f8ac61d3b32a7c06c978c6e7d2bdc4d7a97ba93a3f55a4b67fc3e8f8bc08de0e7ad1d0f14515be2052db412fa8f03991da0e7a4e85ba1df492486d07bda4ecfbd2b7a787ae83743be86591da0e7a0e9dc7f206a6caeba1d33253db58cb7a45a4b67f5e51e1ab22d5475f55b22f54bade9c210ecdf7352563023af664f4ac30ee9ba6c2d70ddeafabf04feafc66e818c2e9463ca353e3e95562c43343856f18f1bca1c2378d784cfdde329e7b4b857f369e7b139d87f02f22b52cd58cb737aef734aecf1449fff498f7da9e787e7a80e7b3e5136debdb469abdedb3ec5daa8e7750e15fd1333adfec88eec1fae8ebb3843dbfeda4c2770dbeefaaf01d14d73b482facb3a7639f0b0db93babd0ec9be9ebb3097d74f83714870edf437fcf219edf45851f18f67ca0c2f72dec74f877746d2e217f9e0a3f34e47fa8c27f18fa425885e2c62cf4f5f9e859dbf50522c517fbe876daaeeabc6e6f67f2315d0e7e84f4d3e5d1c722b5acfb089d87f013915a767ee2a779dfcf0d39fab94f456ab9f6a90a3f13a9e5da674ace63849ccf0d393a3e5d7fee66f0d2d771bf1fcb1b8c8ee1fa168ae7db01f8e93ee61722b58ff9850affa9ceeb7ea0e6fd2fc4fb5fe85e08bf34b87ee9f3e8dfd788f36b23ceaf0d79ff56d7b742c7107e2552fbb75fa9f01ba4d337ea9ead0d9983d13162d54fd76fd4fc4a2686ba6df5ade107df2abb0ff6e3e87f7a06595ac6ee2afc4ea4e6c3ef54f81f64e37f54f8bd48f5f3ef091bcc38fe6bc4f15f15fe80e2f841853f1a71fca8c24eeabc6edb6a7e3f211966bc3f1bf1feacc25fd033bfa8f05723de9fd0f984ff27f63579ec312fd56d893d54d846850b45f3184ca9ce9f7baa6713c9f8e5dff07f2f75dc5aa48c992454b99968859ed169b948857b8b947cdc7c7d1f640bcee713d57d6d10077dae48a495ef89b622c5dfe4b1f7eca02f53ef13d5447cfafabec25e272c5672751af746c7107644b67744bac3bddb1ab26ab2e8504be8b044c9ed62e8a0fc2cd119e9d0d960e58583b51f183e48dad415c9eb8a74d636c23313d1b1cd661dd7d22cba97a0b84a8cb88ad433dba9f3457eda0e7e4ad9f5368adbf08f663f5b66c832fdb02e9579f3f9fd0cbbcce7f6279e23eaafe6eb46fda5f358a258a4d603aa7e906b00d0f984797e52aa1c3d5699e82052f3aa4a8f049ab749e8bc54afee9d6c9c5faece4f31ceaf50e775bf5ad7ed3add5aa9ebba7ddfc9b8dedeb8aecbb3c1e818d54b03328d2be87ef89eea99e919eeb59dd3f5c2ca2497d4fb8a12d207b6f77267b55825cae583307a1974c9897e32fb6213c90d7ec1cf08196d9358e73d5a6b5bf1315fae2769f27ad595d6151ffd647ed6b14f91bfabbd3beaa4d01989b428ee498b0294abf7fed5a2e52a8ddef91972b50b2c58a9f3ae8cf13a2075f2a97dc4582f21f634a42cf0a2ad17abbda32aeff72a296f1f4fedf43bb399044b5bcc67e67a32fd9537cbbd331ae82aefb85e6a384ffe5e2335ad95dacff4ce35c975402bbce269b217ae95b1a5dbdee0fd6d8bb34a21b3eb685f80439df797f9e8649aea5903da97cbb2ffff53a42552443673207fc04f9b7259bb9c989612ffcfd02f64a0629da9648c95c81229e72a45391c26e6a6110c6f63ba8576fff6794f10e333da622703c93d405a904ce1f99f9f5fda76f9c8db8a524d1b27caa1b929c709339996092cc82b93ada230261415b5a900454dfc091b7ed964985740fcfe7d75f2bef009d056567ea909209b8655de1f6bbdfff5decd73bcdfd5dee3f5aa9c833c96963a156d5543aacc527d66539242dcca86b85da111672f5332216ed76c571231fcd809b6270866d38122d8da4650b6bd16b2124c6f7ce9bf267bcf2ef348ac9135ea6aef795b632d335368608f3698da7976943c4bad4dc8701a5184dbd808cb1ec07eac84e77be7fce6e53479b54eb649a075522da5cff6bc623fd576017ba8fb35d39de4a2e7d55293ccf43b05a6df59d28769604e6da99429b2a58cec3f5515b0f4806b2ba5946aefdef0e50774de37318b683beeae1277df34e3b2ab40216c6b4328bb98b52de2dc500cc2738be573d0389f1bc069e0a9cc904b02bb7437c978640697ce5d472a158a2da95001454c779bdaed0db521131282dbd992578e6a2d6ac1e4f5db1e5193b447e024ed29937458d6240daa17958ced6dc908277b0549c68e743276a004f78e28b8a3cd3fe468e2fe2de21f5ae64a790cb1e95770f257bbf509ec377da5df9467f09bfce84bf953275beac831e4952d923aba98ab926f7cc158c91269cd728654ea173895facb541a972195f2ab37955a9d6d99140ae001960ec2afde4f5a466d4f67d42e36579043fc851f0ac8ad9b04fdfa3e81bb498344a69e7cd84e52572a69065b920606c8c3244d0955380f89583877b3a5b93c59c8ceb1d9700f97eaa581b3f15061ef18678b9f4af3eeb66481b4dac0e288ad6d693e884e9a1eb6a491311ec19a3441a7496cbdaef4ba4a8f9343f9b8446a01e7418becd32b99937d58339f24e372096d9a083ed9c36f052c48ef20b3a0dd29874ba7744b67cae17bda1c1e7a161b09cb182038eb224f4b181d81daaec6bb58275f8a5ed93c1e087aa5e58a623a57f4b2e50aa9d6fc021658782c927a813bb3f78eb079af34ae5f9a1d41628325b36d85fa29265c6da474b5dc22a05ca237e5121bdb5ca297748945a2c2fb5feba1f75d75a6740ee818c13598f5f45ff70fe3187d283d36a15dd3d763996cb0d528a7c85d83be9406a36c1af4b492d85965eddcb5e8476931daa64557a405c4b6d44bf5dce3ee4fc53dc616776714f722594c2d559303610b8501b6782189cb2db9ac02ea888a64a16cc6339c8e672065df58da3e28fef4e4ee14e56b4b6dadb40cf60db2c50b0e5469b30ff2d838a33830231b494736d81619346a60f5b0d9a891ab7c42346a865029b529955213724aa9522aa536b3a55497e694f2bb6f8bc5fe39a7d5502aad36a7d26a8bdcd36a032aadb6b4a455ab906935cc261cd26a2b2aadb6ce29ad36a4d26a1b5b5a756d4eabd95e29a59754e49a5ac3a9d4da964aad89b9a7d64694a1db518682394d9eb9d1db4d23a8b827d9e2ee2b924573661de0ae067947186dca28d79a4cb9d6949c5c6b2465f5549bd5bd9b5d2b696bb240f09b47f33da7abf1ce348574b48d29479b4639daf4dc1d6d130aef0c0aeff639e11d45e19d69c35b2cf1ce54c36072903b04c0d196b8ca65e3135637b65c771806f356cbd632fcaddb715532eee46285281d5d788b68900153ffd8dbf9f0fe51997c73b410da533d833136ef8011b159227d44eceea2702362e536e1e0e23b512ebe734e2e5e41e5dbd954be9d937bbe1d4b11dbc542acb4381cb14a9b70c870736d99151a11bae49f22d7333408b3b31626fb8ea3629f678bbd9f48af7f282d72ab81c6dbf401ef8069fdf4a9725372575af2a694a5f329cedad235cda773ef824da0625f902df646c5190a47bd5eb5d6631c26f6cd2807ded5e2c07ddb8773e0cd2dc2cb65b77f396b0d107eca27bfd354f06642b0f1eddd65b93f56e4324d95af29aa2d2817d8c3e202c77708e7025bda5c408ebbecc2ea02e1d7ddda93125e7a686f308044b327e742999cbdd22ccbb83c9520b7958d9c1c2b2aec4253bf51519f133d78ad6d487a43683b3bbdbd05b58e34b30e14c1ad29c75e6471ecb292708ebd0d556cef632bb661d27e95b1a076aaec9454872aaeb7a562ad0e1aab1eaf0c13eb442ad67d6db1420a8791be1d954c8b2dc954df2d5c324da284d758841f1c52f8648a4bad8d0b346975d3c85c5c0da577b587b33e74053e85d261894d878122bd99965997dc1a6b5329ec4b2dd84bbb87c33e8d327999cd6418d46d6a1e13982adba4d5420f4385316aba2d5e2891ebecc55cbaf0bd69e13328a3f6cb6ed41ccf9446d90e086fd4f654bcfbdbe2d5cdcf71796afccea462afb7c58ee7a274e3b70a51d01b4f4315d7184a8f1d6c7a80b1d050b52e5009312cbb2365e48a4c882bbdff757998669b45c5bed2167b4781a778a0f908430c555e1826ce9da83857d9e2ec9912a72deedc0aa19d292d0ec8c4dd77ae263562983bf7d954ec0db6d8bba630f0372ccfbd529843c5dd688bdb9f4c9921e34cedb3cf976dac3031ef42c5dc648bb94f8ad5b406b9a5ff5c4a97d5365d7a901476913734e6c4631ea5c31a9b0e03b3f23075c98d4c15a5d581b47f2cf29e5b2475a98f902be65331afa5d3c4e77180c5f2dc745840e9b02e9bf58b52a6adc27bc3ae54cc07d96286d6f59e29331bbb79a5f95e5e0fa84a2efe8052a1d493b3d2fb0dd5a11e032a4d6bf497a2c602f4a0f6f522f0cf2e83f697e57e084b3d3b57caa36a59a1ae94afb6fbe522c47ca06c722c93d74b65efd2d733290f7a9d434311dacd46082a25d815dd1ce54b979c61946f778afdc136f6ed447ad7298c1d7bd86203a18788f40670a781e11ac07bda84c3eb00b0bd7b9437431652820f8b28782f9b6018063a5ca48fafc8217f53f8425af8de36e130b37044f305636601b65d0f3fb3b088f2a0a36c1ed4c1e24161a7d0f6a1623cda16231c26f3799878aaa9788eb1c5a35b4ae3f3d442dd978afdd84cb1e33a32d90998efd5fab342c5be988afd385becfd84adad6ad722b7bab986d2e7f84c3426e4292d6aa9d84fb0c5de2d635ae432d4b4848aff445bfcfd03a5065ea2173e3d96521a9d44e5faa6b498c375469751319e9cc903c6e6a94b5e47c57e8a2d76bc2430d9258776417dc894df8f8af7d44c5657e6c9eafda9d84fb3c5ded16275f8d660bd25ce72b922137caef0d3630b54fb1146d6c7e5794a0c36256c6d602c97ab4061e90b8f46a55ef36262f217b1c41a3ec150c6a805353bb1dc96fa72bd6acbec20003d4bbf6ddf20ef8067f3eb0367da7c40ae94cdb457403ef4f2d25fa4fe22dde12c916df3827c284439c50a5b310445c2d9167615034cab6c0dda33e80268a52d36a8c1e0d31f519afbab28c1e744147c804d3094c6f0f19148ddc3064af2b95125375292cf8b2ab9c95684c8d5e0752d5284a4bfd294df02e47c9bf75873f10532178fce908ba3eb4ae5e1d5b6f48654b93088f35f4027f71a4af04511051f4809be38a2e0b536c130b0714910c119de825d4709be34a2e0836c82a19b735910c14369c1bfa14a81cba3960207532cae88c8e2104af09511051f4a41be2a22e4c32847be3aa2231f4ea1b826228a2328c1d746147c24c5f8ba888c8fa2185f1f91f1d136c1d0cf830f45459d833d86e27c4344cec75a0497cb97a60abf07032c260dbf480bbeafd5230dafbd5e856f68d13b3050f15335e571948fde14d1478fa70adb9ba316b627504e7a4b1e9cf444ca496f8de8a427513c6e8bcae3649b6498d6bd3d88cabbd3824fa140df9107d0a752a0ef8c08fa349b60280deeb2673253f48db4e8d3a9cc7277c4cc7206e51cf744758e33a934bc370f697816e579f745f4bcb329c1f74714fc5b8be0f252d162dd35ee65f00fd87859ab15f8445fe6ee1adff2f7736cc90da9f25090e47e904eeedfd904c320c8c3410467180439d726185a608f04119ca105769e4d30cc78c1a70da32e703c9fd2fad1885a5f40e5d7c722e6d70b6df955be2d5ed322f935c88692e173e9e3c2322a2b5f532fcb901f73d5053256fa98a5b5507842160a1c4a5045c14594ff3f9907ffbfd8261cbce9294b02546c908e49b132a37c828ef2129b03cb4d025a7e82a932cf6efcb4cd8d3714212698c26b94d5859f1161e696c22b4039f2a5365f03459f0d522466a8d32eb30986f989e76c4e1c757ee2722ab6e73962bbc2161be496176cb16d9825a267e888aea452e7c588a97315c5eb250e5e5753b1bdcc11db35b6d8a06c864f86462d9bafa584bf9a07e1d751c25fcb83f0eb29e1afe741f8ef6dc2a167089fb18dd433bc8152fb8d3ca8fd079b70c8c86fda1c334246be91b2e2ad3c58711325fccf79107e3325fc2f79107e0b25fced3c08bf9512fed73c08bf8df29c77f2ec39b75356bc9b072beea084ff2d0fc2efa484bf9707e17751c2dfcf83f0bb29e11fe441f83d36e15054fe5d442c2aefa5d4fe471ed4be8f72f80ff3ecf0f753567c94072b1ea0847f9c07e10f52c23fc983f08728e19fe641f8c394f0cff220fc114af8e77910fe47ca2dff9967b77c94cab65f44cdb68fd924c3703d7c123aca70fde394ca5f4655f9094af25751253f49c1f83a228ca76c8261c9edbf8308ceb036f7699b609821fa2688e00c3344cf5090bf8d0af9590af27711213f67130cd338f065f0a8d338cf53a0bf8f08fa059b60988a83ef8f479b8a7b9122fd4344d22f51cef16354e778994ac39ff29086af5069f873c4347c95e2f14b541eaf51927f8d2af975ca3960679428cef1279b607ff3e8e835ee1b94d6ad226afd26a575eb3c68fd16a5759b885aff99d2ba280f5aff8512de360fc2dfa61cbb3811d1b1ff4a1521ed12d18b907728b5db4755fb5dca473a44f491bfd90443a9d73188e00ca5de7b94e04e1105bf6f115c3e1c4ec2ebcafc3bb2ce1353c58edeb56af9d2d41875de7f712ab96b69ea5d99677d3adb8858a762ba24602a66b0bc33776da809970f2827eb1ad1c9fe4ef94249445ff8874d30f842b72082812621f8430a45f788283ea2ca9f1e79287f3ea684f7cc83f04fa8c2ad57d4c2ed53ca3d7a47748fcf2895fb4455f9734ae5be1155fe279584fdf290845fd884977a87fd83689d61ceee5f94d603f2a0f597542a0e8c9a8a5fd924c3e2a64141786458dcf435057a7044d0ffa6040f8928f81b8be072f9e5007899bdf0ab2cf83e015d1ab8b61d2a6b5bd8429f434baa16fe9672f70da2bafb7736c950a90d8b58a9fdc7e63cf2d30f85f9527ba64690feb054f866d986811d6578c2fc527bae1a514ef13d55c06e948702f6bf945f8c88e8173fd804835f9405113c9c6e9efd48e11899071c3f51c237ce83f09f29d69b4464fd0bc57a5444d6bf523846e701070c27590bbb31510bbb844d32d4ede511ebf65636c1d0f4ab88d8f46b6d130c7dbdb1410467585bdcc62618a60d2a8308ce30bf5044091e1751705bca2dc647758b629b6428b9378dd8806a47099e1051707b9b605819be5910c119568677a0fc6df388fed6d12678b877b845c45e79279b60283cb78c587876a61c79ab888edc85d278eb881a77b50986e27e9b88c57d894db0fc345910c119be32d38d623c3161d99c087674b6b7a6d3f73c9824b716852deac6c80d8df452647f13da64d32ef985ed4572aba3b0d2c3247c77cadaed6cd66e2984b539385f3694eba59e75aa390cbacff4fef21faf53bb9b633b71afc4bc060de895b2a90d2f2285b1a80765d1249b4553852075f26d58e9515ee4b1872d51ab958debb2d8c26f654fcacac9362b6b9bd34d7fa30a7fa1caf737e8ce2c11d5aa3b33b3f9cee477affc37406a3d026be4dd63d0f6c9c9fdc061333088ba416e5fea6fa86cda8dbfa81b9cd6022f86ba909b33f7a2384db1719acfcc09b60c842d861b65ce5f8e9ec94c283a87de1487a9360e7b30729811d95f688f0943a40f45649a8dc8c92de61953056c36ec6ff05b23a62b62b5ea4bc4c17215ae51682b925fbbb37feb2e1f7ed897a23edd46bdd2289da7483d7d76ba7c862deb933b2284a963924f85b1a01f65c10c9b05634359a0eb7cbb96743b218cfefd29fdb7b7e93fc9d03f1927ae1d6709ff2b10556ac3ee4c2d1abaa5939f9a710065df4c9b7dc30dfbcc369afe6ecb2c991f960ad8823b3fe93090d273079b9e3b064a8719724050ef97a75363b6f777b2fdd292693388b279c720b91fe765339d66a8740a6a43aeb5c660ca8259360bc665e81d54cb72a0bab9ad3c5df605a076c01fd1c5f7d9cafc5ccae021940d3bd96cd88ab46186aa89d2dbcc3ad734a56d2440f768d2371d0863532965d3ce369b36236d4ad722d5227fc3db649b8dc396a1942db36db66c1da2079a6acb524bfad136d9523b8c551b5056cdb159353d07afd39ff030ad36f38cfe406098de75184b875196ee62b3745ae8f473c5ce0d293be7daec1c4fda497f7533d55f1bb2faa89614c68ae19415f36c56d0b3ac3aee549de1931f75ded1324bfae04f2d86d178234ae32a6acc26b7f2a170a5f708caa2f9f92ebd53bfdd46db93ba0d75185bca285b16d86ca90a6dcbcce6fe43a3f5ae39b24590b97e4ab58e83c2488ac2aee1465153b76cc06ddd99d277ebe5047c5ddead0dd796df98b276379bb5f42e2b366bb5efa68f39e65a7e6c4269bbbb4ddb29462b1cc78ad363aa1cd5a893f94be72deab94c57f263e328cac63da2d838c96b69d718e547cbd9389ab2714f9b8d3302da68ef43e6c7d2dc7b8e63285b1752e919adad01d7167bb6fb4b6c6ad2befac9518a945336ee95bf52646ddebcaf82d2766faa3d1fc4fbe679b7ef2bf4475ddcc86763294b1745afcba839c0e016e6db0b2b296bf7b1593b3be79ca63fe592af9c968f91917194edd536db370fe8d3a03d8c1aac133bc93b565bc7eef3efb7e3296bf60d32134a59936dacb7d035c3a694958b6d564e20fd153e175725e0835e4d868736a9b3dc737413284b6aa89179bb25d41c76f01633cf9cf566947db5d478419099934c5e95c98e5c73d5e694154bc2f555615e0f3e0dba54d9324bce87ee2a4b8a158457e57b767c0bca96a5365b268a207310d9dac8e1e71b729b5fd992b26d1935d790db9802d45db0f6a5467ae86a611b89cbcd82ad280bea6c164c0e6d811e47d4fae7b20e29dab8cfd69485fb851bc94a2ff1a60afff3c5b0ca605d8e255d2e396a1bcaa2fd6d16cdc9a1f594cf556441620963fdb694f5f536eb470afb6a32fc12022ee7e9da165f0ba3ef444adfe56156bf617d739997cc26338c45db5116ad0832c38a39469d61cd354d265116accc4fa9a7d7abe5368f978f32623265e1aa70f343d97a56f5023e220e82e6a930688f715c5eec9c42d97900b5c221aa9d73057c42bd5a64ef3bdabe2b980f9ba7523637841b2b086e736efde5fca4f034cada469bb5db88e0eb39e6652d6d38dbc5d329bb9a6c76edd05c2fcc9429d624530ed2c3f7b0e4bc4dfab570f3edf9989d2ff6fe25e44775a7494d605c223967d428ca61603151d16cd398e6b5826352560b26cf03ede55ebcd02bac127a0d67f2d5414ac26a0f66db56c2ff19918084685253d696b779a748f9f5ca36dfd761edcc0c598ad7caba66b1773c4bf89f7f375fbea4acb0addd84b336ebb2dba45fd534bfca9448142b8bb42c8f343480d63b4bd740aa7650a9daaa1c26cce5a6ecb97853762d0e84d85adb7da84f1a59dc26b1e9ee0bd01f124fc03bb38b54a6854187acf2cdf7ac4df9a3a500bd2e23abb8f9a8c0b389eb279dcaef7037087f580e7e8a8b5a5500f7b59c70ba4a38b305ac2f5cd5eca753d4a8e0d220f63980ebf46e495ceb3871c9f902a92014dea06a1cf05c5a94c47310279e2ecdde54a5e67ef68f9d2fb52b4ec2fa0d27ac5e121634ea1b5455011d64787da0a1b95393c4180774a3da27d11dcc89ae77b39f2d90adc25aefd6242a5f0c5e7f1b0778e3bb27e11dc209af7b33bcc9f2a11a04718ed02fa934c402da73a8643b94135ae76668babd16b772ada42489ea304e542512d52251d1dc05d48de07895660b7b25811dce5f116860ba71315d560bcb9bb364bdf2bb38a03b5c00bae22243b8b97c24f74e5238de74770e9abfd3c45ab9a4b441caab31bb77d0eb714ef32370f7ac2cad8b5316d2a7ca2c0ddbb2c0154559d6765f59c8c64e5996f2b62c40bfa52c742ba12c50d1951c79b18f9854c0c8cb91ffe38322153028721440808d18e0c72f478fe62c4707aad4f3c7c05688fa4063a8300a5969ea32304d97d49dc474e969d3aa7d4af9fa4c1043732963ef13c9eae9184eac830363b5bdcc32810fed055c68cf45688fe544dbd782965ea5b308d6b6f1e1ecca85f32584f338977056c612276c57a5711ecf89b34f169ca96bb62abd5a930de6de5c301f46be79824b30c7c610e62308e6892ec164acdfd960fe09c13cc925988c65261bcc3711cc935d82393e8630ff8c609ee212cc4d6308f32f08e6a99c30875860065f07c7da471a9e6082fb0b827b9acb7019cb5436b85d513bf47497e132b64bd9e0fe0779ee192ec3656ca7b2c1fd01c13d937f9e32530586574333a22ce6aabe3aa342e02c4e94c314ca7aef26c0e88f2f35481f0cb3f48eb130e8cc053981209fcd0979b80179b11cca6b52b0fd35aa41c7541941b38da95e820a86df7282eea9402f5663fde676b3da52d642612117c6bd10c6730ad141a030a696afe33907a3d94ad85a04f3772ec1dc2c8630972098e7ba0493711c800de66204f33c9760328e03b0c1ac4130cf77092663bf9f0d66358279814b3019fbf96c30f745302f740926630b930de62204f3229760c6b1f3b90f8279b14b30378f21cca508e6252ec1dc22863097219897b6ec08139e2289e30cfd3508e5652d89b260e34843b9501e84505ece8952afc45b1a68e4b340c3c923b9b00e4258af288487062b39e3d83cea89505ec98932f8a246dbee118c681fe442fb5b84f6aa96f5d2b857495b21945773a20cbf3e947184936d41e3db08e7352db99e24b5861fcb39c2c956c7ff8c605eeb124c46cf6483f95f04f33a9760328e70b2c1fc0ec1bcde25988c63ef6c303f44307fef124cc6114e36981f209837b8049371ec9d0de6bb08e61f5c82c9d8b56483f9168279a34b30e338fcf1068279934b30194738d96076416b926e760926e3d83b1bcc4e08e62d2d0933b56fce9acdd97ae7b7a36c7eab4b30e3f84ad71d08e66d2ec18ce32b5d772298b7bb04338eaf74dd8560dee112cc38bed275378279a74b30e3f84ad7bd08e65d2ec1641c826383793f8279b74b30190787d9603e8060dee3124cc6463b1bcc0711cc7b5d82c9d89d6483f91082791f27cca122f51517b8596f49b5bdc09ff95dbfe62ccf4380efe704dcdf000c0c9a84ed3b62715fac50847aed0fb4e4caa454ef8c63597a0bf2ce070b5196d22b93b0fa8b38cbd2f65c30f740301f720926a367b2c19c8a603eec124cc69e111bccad11cc475c82c9d8676783b90582f947976032f68cd8604e42301f750926639f9d0de67608e6632ec1641c8167833906c17cdc25988c4d7636985d11cc275c82c93802cf06733304f349976032ce0db1c11c8b603e550898d4f26c734d316336675b513c1ec17cda25988c15101bccdd10cc673861dadec9d0db4ef91b92eb70b2773becf4be46c066e9b0873c6babb32317da5311da6739d1ea1709f4a0dc6a79e3fa3620d7060dc83d578801b9602f62c5713b8afec8339fe7440951ebbdbcea64e46cb0fa72c1ea8860bd50e81232f856fc8c6d4cb6adf80f44685fe444bb815142e2fde58257428cf53b5b25f40a42fc92bbdecb3878cce6bdad5185f43227daae0aed3803f02af94120b8890d1edbae87ab905fbec2096f4060bf2cdc16000926a8df20a8af16621a38bd314fef2bcb5a7e76e142fa0f84f4b596ec6ca6b63a59977bb1b53b272098afbb04338ebb1d6e8360fec9259871dced701c82f9864b30e3d8bddc14c17cd3259871dced701482f9964b30e3b8db612582f9679760c671406e0482f9179760c671b7c39108e6db2ec18ce36e87db22987f7509661c773b9c8860be538871f7600b61e3f886c6cd08e5bb9c283b2b9410f112e12fd4f665c3a792d9c01571811308dcdf5ad20753c788e2b885d4b308e57b9c28e96f0f051b6b8fe368fb7b08eefb2ec3656c6fb2c1fd1b82fb81cb70197b466c703f4570ffee325cc63e3c1bdcbf23b8ff70192ee3d01d1bdccf11dc0fdd5dc11447bf3d18a1fdc88dc963db86bd8c63a46c1bf67e8dd07eecaed7327658d9bcf67984f6134eb41b0af36558988f5fea5dfa5ff89cde1508f3a72db91e2ffe2f2e7446283f73a39cb52dd26144cbb648a709a1fd9c136df8ddbce3b85cfc0984f39f2ee1ac8c25ce6f11ce2f38710ecd5055adcf1b635c8400ff8b13b0fe280aaea4b2d7fde378b19ec185b51e61fd92136b3bef60957709be1f033780a0f8b5485b235c5f71e21a6d6473df1b9b84fec473b5f440bad69fab7cb3c09f45d99d0bfcd908fcd79ce0f512dd0aa3d28af312dd3d11bc7fbb33f117c7bd41af4328bf7167fe2a8e3bd01f89507e5b881a3dfc67ce18c7ffd93e73361c61fdce1d0f8de3e6e9af2394ff7177682f8ef3abeb10daef5b72cc2975614f1cd795f64128ffebc69893add5c988966d6cff5284f6079706495817a0b10d927c8670fe58881a3fbba7ae0f7df8cb10d69f0a3d296dc73a433d52b037f1d8fa4ebf43707f76cf6799b7cb629b73ba0d61fdc58d4acb3651c23821cd3651721442fbab5b9516e3aa14b64aeb558453b462c4394cd8b6bcaef3a43785ea0ec4714560ab441272821372b6ee40fcbf1edf0df96bab42a00c32a812cf8d8a9e42285b73a2ec27cc493de83f2d16fb1b48f1f208c6fed4202ea0cf21a06d5c03cae8a16c408f46408b5c03cad82e65037a0a02da961368cf2c1591b694d52f177261dc12612c2e845f666fdeeb195156bf7c820be8c508683bd780327a281bd00b11d0f62ddb4cc273a271fcf8e4b50865074e94dd44726e1eaf7b827305989f675bdcb03902d8b1257dd1fc486ffc7a3f8722949d3851e63ea9cc585ab24d2af742583bb764ff3cb55319c7dd9e4a11ca2e2d8b32ee15cf7484b22b27caf0239d8c9ec936d2f90ec259c2897384c53353c737fdb1f8e5f26f6873ae9622a78935c21f99af92d40a30b6b42317ecd10876b7420e2b37087a45f3fab66ab43d1a56eece0939dcf631e362b9e7e37ce4b13d5c8219c756c00204b3a74b30e3b8e7e33c04b3974b30e3b8e7631582d9db2598715c9bb70b82d9c7259871dcf3712e82d9d72598719cdb9c8d60f67309661cf77c9c8360f67709661cf77cdc15c11ce012cc38eef9b83b8239d09d690e46946ca34db72294833851c2418d7700531cf15bcad501611acc89a944e0d9a0e4728482cc05b12d40d801e11bc2892fda3b4771dc5fec7084b6d4cdb921c60e23dbdc5005c23a9413eb508bc782124dd2275778590786895719a8e3bfa9502b047883421709c15ff0621c86637bc1ab180d100f73675e338e8370fd90976ec889527f0230f80aa5f5653ae3648478b81b05813f5197fad20ce3401ddb4b336b10da8d38d1f612a9d3717562fd5a40fb2f0472842b20e3b8b4fb2304b2cc1590717ce9e02704722427c81e22d92135b7ba2a50b794adef5482206ecc0931b70f5232fa25db07293ba2b6e7269c486d1f4e5d5f172a9620a8a3dc19ef646cd0b38d77de80b2fc684e947acbb5b106d0386fb9b610c11bc35d7b9b95cd34a92e7c14bd4a0af5af4304f103d906812c77676d3c6386665b1b7f3a42595188162585d2571dbe7cccdac7b9910be46908e458574032d6d66c208f45202b5d01c9d8966403f9020239cedd59a3387e4fe9108476bc1b836eb6f14cc60a896df4fd0b8476537746dfe3b8ce632384724221e636b37ba9b9b51a63b9cab6b5da5508eb66ee61ade42d53d976fffa23c2bab91b65aa6d22837146936d22e37c84760bb7de89632c00d8de897b06e1dcd2259c95b1c429d0f0dc5685284f718d1fac9a62ec90b255532b90976e5d88a1baf4cf51af50b7c4afe99440f0b669f94e687ca77ecf4420b77505641ca77e4f402027ba0292b19dc906f2af08e476ae808ce31cfacb08e4245740322e966503f93d0239d915908c63476c203f4620a7b80292b1c3c806f2570472aa2b2019f7476003f9230239cd9df7d6368de58bd3fb2398d35d8219c7777deb10cc192ec18ce3bbbefb2198dbbbb3c288b179ceb6c2e87a8472a63b6b3b1851b2aded380ea1dcc1cd77db18ab21b6e5844311d61ddd99a18c63b9d91ba19ce5c69c8f6d1e9d112ddb3cfa3908ed4eeecd52c67554fd72847567f7b0328f6eb24dfefe01619ded4641609bfc651c14619bfc3d0ca19de3d26ce558cec13ab6d9cad710ce5d3871c29e197043838456dffce22a1bb26e5cc8da226473dd5d88c838bec4b610f11884761e27daf6521a9492f5d2f25ab196d3177b72016b878055b9d3788fe3deaf0311caf9eebfdccfd8d5647bb9ff028478412110ebf77dfd064f83eca3afdf5f193c1121ded5dd9627e3fa63b6966707b4b06b37f7de0f66f456b6f783df47deba3b27d2eedec1be6afb34ffa1055e58e35d5a29e608ffd5c25aefe1f865f8f608e11eee4c7c54c6b20db02382b9a74b30e3b8fffb2c0473a14b30e3b8f5d4f608e65e2ec18ce3feef3311ccbd5d8219c7650cd310cc452ec18ce3feef3310cc7d5c8219c735219311cc6a9760c6716e730a82b9af4b30e3b8fffb4e08e6629760c6f1bde09d11cc1a77562b31f67fd8562bdd8450d6bab35a891125db6aa52711ca259c288758b2b87d206e178f91bf475283bcbe52ce5b32d6ec6771c15d8ee02e75770a8eb16fc4369e740442bbcccd55768cfd77b655761b23ac756e8ccbdb6695184b5ab6a561ff4668f773b730606ca7b215064f23b4fb17026dfa84dd140970455acb15bf4a13c71760ff89d0d6bb3fddccd865659b6e3e0b215e5e882d032a0dd071dedd732582b7c28d0acb3691cce8976c13c9ab11da956e2d61642c49d996303e8e70ae720927eba8291bce2f11ce030af1b22c3536856bf838ee15d21d816c7005641c9b4a5d10c8465740c671af900d10c8265740c671af90c108e4ea428cdf07ad72183b996c15ce3d08e61a9760324e86b0c17c14c13cd02598716c0a1d8060ae7509266373880d660382b9ce259871dc64b211c13cc825988ccd223698bf41307fe3124cc6890e3698c7239807bb04338e6f679e84601ee2124cc67922369867209887ba04937171371bccdf23988771c21c26526786168b65de6df59e2ad430f10cf568ea1a12c6f627db18fc5708f2e19c906184a5d103bb521ca8667fe045197db93186fe5984d01dc1fd26b19eadac9391cff5ac6303d69f0b582704ec487756d131d6da6cabe86e44288f7267151d234ab655748f219447bb839271988d0de58b08e531ee2e9389e34bd76b11da63ddd985218e2fc0f445288fe3443948a16c92edc9c6503e1ac76fbc0d43608f77152ce3501c1bd82108ec09ae82651c3066033b00813dd155b071acae7a20b027b90a967150840decde08ecc9ae828de3be60e508ec29ae828de3db1e9b20b0a7ba0a96711a840d6c19027b1a2758b0c0dfbf0670358919a241feb52a86e39dc508dae96eac39b6ad85676cfeb3bd247325427b863b5dd438bebcbd214279a64beb8dc7c672f9d72708e759ee667a46b46c99be5d2289f66cf776f71ec75b96b26d9a7eb5f4d8e22243f8f434e15384bfd7b16f729d2a11c7787574ad840184177bc7b36493a849ece365e13dbd7fe1d2622fef9fed7c42be97344dac15abe459905723652ff7ae82668da2021a80bf05d768ab5ca32c017bcaae526d8a7aa559995cd26b9e9d26f45b7a555257ff3ac45396754ab18cdc11ba2c439ba68cd8b917922391e8a6526085276727ef4a9327a3466a54eddd59ed590dcf948ff26e4b4cf07ef94dd031cd8dcf31ea15a3e5ea489fcf2e13f86796760e404ed8f35f7dde3c279b45beb3c3f34b648ad44aa933b35a9add3eda0b3b654895f2d19016ebb3fdbf837457c92eddb48f74eff95ecad7a8cc32dbbbb9462a053f45ff0790619c67b75f0200 serializedProgramBytesString: - serializedSignature: 177dcaad758d85afc215e5b1e90f70773b30c37a8d4d470b36a80a773ce7a24aaafbb5aa893dff0ad237d6b811f008406783f5c8e94a14c385ab43b9998d4b09 + serializedSignature: 6bd971b0ef2603e4ba944784536c62d2800cd600bec801c6fd9f43353122c01834a3e8424cd9ff09bcb538d8b42c4147d0c41be13bfc621d5c3e01b425019509 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/af4cb03f3d35e8245bd5650be8eef816.asset b/Assets/SerializedUdonPrograms/af4cb03f3d35e8245bd5650be8eef816.asset index b7dbc47..2cff886 100644 --- a/Assets/SerializedUdonPrograms/af4cb03f3d35e8245bd5650be8eef816.asset +++ b/Assets/SerializedUdonPrograms/af4cb03f3d35e8245bd5650be8eef816.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d5b571bc9116e61c4c58031b6b91963c03646b63112f8bac9260e065fd86043cc25d9381b8c91c0f2826041786d6773d96cb249f6e4e417e4218ff90bf90f9bb7bce42d27ff2327a9aae946ad51f55c24b52c9115c76a4d4f4f75d557d55535dd3de3bab8804f6414be96c5133125c6c492488a6d91815f53506ec19f73a4eae7c52e941bf0bd0ae746c5a0cf95f81989f4c0f70c1ced892c5cb92fd6a04cd3f9059182df33706d0a8eb0761dfea5a055a41e2e5a12d3624e3c16dd914e1f12cb74d19eac8ba05c9126f8be2bdec0d91431859dc4e954377c2dc0993d3ab7054cab764fc54724d6169c5b836b76c526d07c4e149b5e034f1192898a5659d6cb12a936c0bfcbf238aad5d3f5f2fc1579dc26dbfc551e1f93e747e5711dfc6b96d7d5b9fa6c775debd5f688abffab01ae699465af6c83bf8fcbf2b456d7abd561d923fb18d38e11b5cfe4f15159f63174cf68757d5a9d17ddaf5dfc1e95ede2f2b843962764d922cb93b25d2200160db23c25cbb3b26e5c3b56f862d9ef3aafe41bd0e4eb94e5b056a7ca8bf2fa09ad8daac772509ebfa61d031647feeca2a3ae1b91edaf6bc7580e313a38a7d50d697558c65c3a88c97e1fbae85e92ed6e68c70a179dce4d179dac8b8ec22baac9a664ead28e91d62da75dddbcc8b787b0322a6cc7441eb6f5ef6b3c61799ea17b41ab3bafd579d14dbaf81d10f9f69b6797d10879c587e0a756c58e8893a122ba41ddb7bad2df7123e906fcc2cf08759b0517b9030418efb944be390b1639c17acfde48abc6f7147daf428b3411bd5dd8c5df0aba40e636e12fa5b9fe3da87f4091039d7f1ace8c895928f1aa6730fc9ec25f3e9565e87613c2474a2cc2f70ed17b066c17b6f41309c384fb9a2740d389625b50a300dd81e34de27081be5f11a729e27e06eab21453331055ef42f99a7a2b947d177e737d2e4ac8781ef96066aa7742a652d3344883dcc7297e7ca39177a11184bee1b61c86f571ca34be2ad0c437183a4e0613a21949639c208be4d54d8838e5644f0a100c2f63a184bc7d3b78df84e0eb250b8f0caabb8f24c869f8dffffcf03f5f2e7fb11dcd17ed9a88539a72c647342f60915e2cd25540c15b8468b43e818cbae18f70f053985ba820fc4ebb34b50baf80068a4cf90a88608a390f07ab7089626e152e2dd048a24106f6181332fd1833c15ac7c1da546958fdfd8817ac4d0772e560c50f8f60b301413f1e4c081ee110a4bc2d6915c145f148de3fa37f4bc1992cd4e0552f64fd12c44e940aa559020a4e7a646aed8d315ae95517c63cbe2d842f26e1e5e6d0a4817a4e037467b85a410de0ef15c872f0788792e04fe19a7260df1a18fb36c27eb800fb527833a11ee550a7fbe1a577e4904d932ddee81e3b9023876e9ceed57b3dbdaca9b77679cb459fc628afa8e3a4a8e23a3029a481514802e345071776c84136bb78c3d606ea8d9cbad1de229b56d59d33d07b74364d3703636212fa48d26dc202fcdb87abd7641ee27fc5239abddb276ebc8de344e0a17792348af33fb63936e9bfc9a4ff53e5d07f33a7ff63d5a0ff291a173b07e3a59cfaefe49c038ef0809a2e8db7ae20aea43b84e195c68ec9f08e72a641b3582fabc434ca6d163d81dd422f69672c9476caa799164e331d95ceee176440db14de77e03cd6b81430e0c2faef5fcfdee1f1ee3364f77e3c98106ce59c2a7ada33a2f0a6e3bff029f0a9cd669fda6622decf109fe71cb607f1639cee69dde273abba0f3a79fc80d6fc52620ed07f299c593fd5ef36593b72a4660f9f40b94e5c60bd0a9cde7d79dbd559ceb563148fdc13c1a7c0ed4b8153f87564db8364db832c77ead75da0f902fa7a453e02930cae87a821960c510fd525bf6964b69b06cf3966f0fc31e4e039ce0d9e5395769c3aa8e11de7f9c041ea82c169faf56f524d07a71a743dc3cc984be098c3b5c8a368d9d1022d0d99b57482eb0773585cf22bc878b1b59a689b04ec3334401c33dc953979064c304c567c92b3134a1a33efd4c962d2b04ffac2dfafe4305ca4be739384a5b84f9ce0e96726ddf0c35bd925b2b28900cea51cdc9b6cf394c9662e733683b7492ba12ca293b3085a5eaefc324171d3a9b89fa43bf074eaa8f09ae50f3b99dac569072baf324c4538a73e6a564db789f89849e210c47b38bd538f8b15d43b9edb262aab72822f9cee719fc0153712bce213a4f89e02e1fc593029bf978390705db70aa1e95ecb1dfe4ced1478c1ef1fc70387e60942197d930d2e4d9a38cd8d14d4c4358e71f72899308f923e13e1eb25123e63227ca344c2fda678713308618f4071d644f85689840738c298d0de0e42b8d74c7890238c2eee3dd66bb82927cc94874cdafb5689da3b6722fced12099f37117ebf44c2174c84bf5322e1618e3046bfef8ad2a3df4513f13b65203e6232e8ef9568d03193414f966ad0974c83fb6e8983fbb289f09460d2576c9d5b0934ad038e41dd0a440adcf8bc0231535d8eb57afccaa5746138be62e2789ae3180d58ef535f109b845fbb74fbe670fc40726ce2d27d46a7154682519304f738096685bac1513726fa6d89c31de626ebb465117393998396b99b9d2714d153c0ed2b6aed488cb59f5037289393e3a4a9ebb4784bbb469c7d736ec997a1361df2d6f6aa49eafb9cd4efb92ccd6bb5df91654f6a2f2bdb7a69ab1cf28c99e479c0c9836bd87c26a5e75b8e2438965648b38e761c7de07578d69f4ab036f908e467d96170889b7078c8e170df8803bf9ce920a2a659e6a8e50258c0b694c18f965a032987c6132649673849ff6471dc2ed0d92450dc2789906eee9a6928d5feaf24b55d23aa4968eb3d2af2cfe45638563c24c94daef0532be5407edc84fc071cf2531e3e5f1f6193c04592ac87f7725ed8987d49b15161c224e3f73919875d32ba63998abeb3a4910df8fda24cf1f79a89cf598ecf49179fb93e754dcc92fdef81ddbc20ffe3158383c5e6e2fdd975937c8f82e417ba8f2d35bfd0698591e0864982c7a69c2e686452569591ab34e5b2fd9b268ee7388ea7038eef7b4cf42c7d7c176f59b74c52ce7352de093472fc7c58f891e3e7151ae12f1269a174354338bd0101b609ad2c5089d3b45be220faf9aff961ef5b606b88ea2200f0fc6055dd9bc20f84f921a0c219be629f07f193828be4635a2cd7a50bbe4852f8ec4ba39448d102a4695aedb0498acb1a0d51a9d5ba38cdf05d29d29afcb9c0e5d78623bc0d85df15ef10782cbd63e01542df7efd164eaf1201f5f044199e874363735ccbae0ccdff8ae096b1ba441f756411b40e72fb9982598529991b6c50565b0b90e14741b66413b276cdceee824dbd85bfdab3b07f68702ddb1e962b34faa7a96bd3ac472d8096d540fba14dd05a8900a67fea81a2590ad578ab590b40fd85806a8cba88df2f5bf42ceec1aec238df4e99d56bdaefb44bf492eeb84f8b53d5c6f98ff4b81d0be8c663810763ccd30263017c602c703ccea5b87c6a9ac014f7c3fff3ec3381d9e78f1184cb2a59232ff4d4a617ea226b5991371b1968e475e336eeeebf94c74f9bf37c546310e18af153973487fe934a40b9266d31eb0965a206a13ca141f9914d28d1533c0f9277950fb45e5ba01dd540fba94dd0baa5fd6d1807f352de2c85c5c1dc6c0bcc760dcc956a02d3e270b606669b06e6339b60f6314126c88ada2d7ba04ed802f58206ea6a35827ab306413daf81fabc1a41bd5183a09ed3405dab4650afd720a8431aa8c96a04f55a0d827a460335558da04ed420a87d1aa8ebd508aac5fcd41aa8a7355037aa11548b79aa35507b35505fd804b54d828a1daf13a48a76dae6ad67d4167042032e6d1338bfa98fdabf576ad5a07c69134a7c2a7c47e4de36e69eeeb5065d9b2de8ea35e83e7e975658314f78c11694c73528372b0165b069e15a9ccb3cab41b9657b40e32a0caeafe8af11540d6a0fba260dba8c4de89a35e88c8ba3e503acc516604734c0b66d0236c278c052361a5b1cd8976c817d52037bc726d8438c8f4426b2b4d73e233e10cefb940f5b2a54a701fc894d803b25c09bd0689380366fb9b408e4a82d20873520776d8720dc2290bf3c9f7baac11a747db6a06bd1a0dbb3095d0b41c73d48630db493b6406bd440cb56c233aa818b0ce0cef134fd4a1e343c6c3965bf06f07e25015e13eaa1ace08f6f5904d8da5afa8806f02b9b00b7b31e33b70d61cf1e78ddb6c06bd6c0fbd4367849d7b4c51cfcce6dd3b206de715be04535f05edb068f9f83ccd4ec0d634403ef8d4df0aeb8fca2d7103eecbe724003fdad4dd0559a6e9a2baaf534fda206e4cf6c02196e03612deec53ca541f9994d289b280461a71fd3bb0eb0baf6e06ad0e0fab94db8dcf9244ebaa9add598b0cf90c7c4d7401caea1ddad01fc8b4af848d3d0aed0be4c6b40766940feb25a80ac458becd480fc954d20d5065753d4ce7f2adb2a98095b60f668607e5e4d605a1ce2d6c01cd4c0fc7535816971f3953530631a985fd804b35f8289af2bc107a1dceb41e6d7925bb5d2415bc07668c0fea65a81b5e84bad017b4c1c9ac73d1308f76fd1389aa571c40c4bcd31dfed38b100b35d31f67624e6b1b610f3dd35100b304519f3788e2ae6bb28e43cb3d921f58be7f1657159389724ae56b5e737e3f412567ce94c98974a78d344ed7a53fb125518e1c777e1ff7954ac5d96e381514e527ff9cc36deeaa19538bdb7f630cbff3b5def75717a9dee78196ccf9fa3df8b30ff4bb6dd8d42d5a7e179e90553e477df9464e1ce7fbaaad34b53bff1c1eab4eef2c9fe877ceb1e2ad6bac373f4954deb76a839b9928bf68300d2f17a70cb9c6bb543f6907bdb8133d6f13597c90048f4d35cac99da241c6d90ac69a2ba25d4a731aafeba29fa2e5156b04a74e6a07d92e8e127fa3fd19505ea8f850000 serializedProgramBytesString: - serializedSignature: 8b8372548a5c79007f4e9b76ab7ac260e7bb8906faaa261275c6648f9114c074bec4de44182de9f410611de8939a17ee1b7b0da51490a07b9c19e5fb5adad80b + serializedSignature: 24fb71446a52116de228c79c4b662a352f84b8438e8307b8b68d3a2897b8cd42da76331b684e604ac7cf7814f41a8ecbb132cb940fd20414984664c51403e505 programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/b112263800cafbd4fb49711eb9ab2eb9.asset b/Assets/SerializedUdonPrograms/b112263800cafbd4fb49711eb9ab2eb9.asset index 2638601..6bf78c0 100644 --- a/Assets/SerializedUdonPrograms/b112263800cafbd4fb49711eb9ab2eb9.asset +++ b/Assets/SerializedUdonPrograms/b112263800cafbd4fb49711eb9ab2eb9.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: b112263800cafbd4fb49711eb9ab2eb9 m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed9ddb5b1bc715c0670542c2dc6d40989b017391cd45f2254ed2367163701cd2f806126de3a41823612be61624fb73fb94bef6a90ffd13f298c7bef4a54ff997fadc9e7376168e7667762556035a37d2c75e6667cf9cf99d9933b75d11cb08f8580bb0d9106b62592c89bc288803b10f47cbb0df83af7de6843f1147b07f09db2db8b6202602eec4cf9c3504db55382b8b0adcf9466cc3be44d7d745118e57e1de229c61e80efc152196d50a37e5c58a782c1e899435102062836e2acb300bf36525617b4ffc19ae1649294c24439752b059872b65bab6074a3bf19e896f295b7b706d1bee3912bb20f305494cfed822e840d8bba4dc27e41e356e97c771b9ef6361cefe223bee6361b8bf047f6d088d9da3dc7fc8f30b72dfc1d2c1f86979de26f7fd8a7407d8713f0bc3fda02bdd413b5dabd3956e274b07ffaeb9d21d52a47b991d0fb130dca7e4bdd7d939a6fb13638afb6185dc11763cccc27ce4c6922eb95d723f2ae3cfb373dc8fb134da58181e2fc8f3988c9394c7bc6cb4c8fd1585fe13ecf80a0bc3fdb84bff71a9ffcf2efd271572a7d8f1240bf391dbf27797dcab4c8693876e1607652cbaaef7c8f025515d07a6153aceb0e3691686fb59978eb32e1d1db9bd325e466587b8451ee40ba8d35be25064c830585a6b7575ce9dc14e0e45b7e1063f73946c05dcc9210850789a3cf9b18ab8256e2a3dcd65aa734eeacbb4dd821825129af526f12f4f12a8dc2e7c8bcc4d9621fc017959749425b8b224be823ddef55cdc00c7f7cc25650392dd05575b1439d81e92bce7a0b637665096d0a5baef590399b6c7df831007e8219cef9286ebb47d4b9a1649fb5508ab50fbb30f2dd03dd8bfa3d4bc793f8263559a39894cada3daf1ebc2ede6c531d30ae406b5cf505df8c522e7611144df9695d5b035439eec6f1e4bfcc2d07632e84457a58c1b84ccaa0abb2932e467d73c04ebcfa33787eaf26df3be236efbe6454d06cd3d42396016fee70f9ffce7c7957fc7abb3764b64a8291f0dc89a1f589497b6063d12fcb3108fb7665151377e4b859fba95eb6788df8e57a278f51b807a8f2e0358d8adcd4394a7745a3ef67d8e9f73b2ebb15016c52508b2b7090d52548739a6c29c3c6bccc17ec50f73f2385f2798f1a326d8ae2118a4838e608b8a20f5e3be314ad0db01738eeec1bdaf80c45b2a596fe07e5587cd9f290e6e165d4cd53c3b88e784b21b599f463ac2ad0ac25924dca952b2dda524eaa7111c57998e8675cf8d9a2e0f6176dff53e5d2d5187c72e82e82ff720372fa597f58beb6fc2ae9a4dd84d269c26c7d418cd74a66c5311a7817bc128f19c7828276ab07350842b1508c1bb5ec9f03c743c51f3ea9ce962fb93efa9997c2f91c7998a466ba8b340425799fa4256a6a44a30065e54b8e7ffc2c723bc5d2fbc5d556e3acfba997a0ccdc077c21eb0d4df4c5daab954f46b9aa8a0f47536bfa0a247d33c7f3de3264a3daff080a64e8b55f973d23d20af821a3903cb35d8ef901618be2dbd917f5afe961938e67362990c4deddc57366be7950bec5bc7a884a4a8842cfa78ec1c4d48e3907a8772b9e7ebb31d120f694ef80dd93a1e5797ce214abbb9c8e84a7e87aae4a37bb69e9ea1dfa86538aa2e99344fec2a99dddaaeed305966c09333df519b865ca7ca9d23b911854ad88c79dcf9b0de9d77a98463cb84e34fcf880955c18e071656f7a8c9936a429f6ab72ed53155aae8ae37e19b85bfef5da962384e41da6b3ef5e8d0a3d3615ca5438ae9b04c3de87dea7eb9293ca12b45b8ad1e5d7a559583028be7d2fdb567040fe4e8a01e57e55f897021a1c5edde6995e99a8f033dbd361320f56ed5e687bb1a5f3a4135d68c1aba9adda7323b2db6ed9c8bd9ddbd9ac6197eb2e61ed714d9e1ba8f1dc268a9b3c4459533c0c0ab2ac5dd357b4a5fb32fa94c4c81b9336cf6f0da014941ef547fe38703d279f7bc8eda7e3364bf214fe68255d0d9a65f679bd990b619d0099e0b29785025188d9e5672744b9ed14b4ee9245f0b2b794807e37a4818977582e7430a1ed6095e08297844277831a4e0519560ec532dd522b85f2f784c2518fb1b995a04fb744cc675e52d1bb6bc5dd141be1112f2844ef0cd90822775826f85143ca5137c3ba4e0ab2ac13881f3412d827d6698a6751adf09a9f18c4ef0872105cfea0af247610bf29caeee7d2c14e3089c2453775878b76689c61a07d0f66f421c1cf36c512389f7e0956009b5c5d9ac6aa4ab9be87adc445ac7e0572a06b35a06dea9089b043e89a09aa8c06bb9ba34bda6d3f4d72a4db30dd31457b470dc887db9829c50a95ffbeb3aed7fa3d23e5f77595ba5abcd5fdee6751c3e5171f85a381364ce94159fb0b2d71ab167bd438f3261cf7af538e67de86fdb165ca35c14215f6f2936b777f593a71b341f5182ed0bca9d3bdf7c85d87d8df3aa87c8828ec8a72a22e89a4e963972c26f91c3ce6799f2b949b2df296ce997a70d9056029ef5e46751979fbbaafc140d5a783db48575f66d04a7251da7dfea3c82494efb10771992c21ca1dc937b4c97978c8ec3672a0e9f6a3d2396f80764e543f2d6dbaef2bf7d3c09a4f78bcb55716acf5902be9685ddaefbc4ec08ee7c4277e059596468249c3db661f0743fa6bd07250ef5c91d97d6e049fc7b42ffd0a8776aeab4cf0f06e542551e975889e4b9ab7de1c9fbac6442e6c89105a4696ae07dcbe932b76a2c43b314f3a72c4dc15aac606a2dea3254ff5353b6804772f9cac20504673a7e5556c292ecb4fc052204a617b480bb48029ce59a063c376dfba282ecfc95e18b9f443c961da40a6f1016aef13c26ff6e0b58a668dbe2359c1522816a3486a8127197f0cf1b56414ff7aca1d795f4902ddf51d7ff88e415dcae85a6f09a4df3cfb96b480756af7440993a69c9d42d50165bb207ffe78d4c161b992f10c29ce393c917ac9af405a3d2b2769f621f22d53672bb01b5d5a54b982794dbab7cc6542d193d8ddf98662ef64b9358fb25d66d592e2bae8e9f935304690ce3b0298c9d0ce3ef4c621c54944efde8296b0e65bf2994a30ce5576781525722ab07600651264ca1ec62281f9a44890fedd918edd5d65db91e6b0c598729642d0cd9a3e66c660cfa4763cdcc14c3fad8245674c4ee27a056e06205fea2571a5b19b62726b18d9cb2347e1cc1b238c1a03e6d46a81f4510ea150675ad19a17e1841a8230cea7a3342bd1341a8c30c6aae19a17e1041a89719d47c3342bd1d41a8430cea463342bd1541a8030ceaef9b116a146791fa19d43f3423d4288e992e32a87f6c46a806a7448c41ed6350bf3609b54b42c5847708a923bbe45d526a1cb8b8297082817b66121c2e10bda08586d7f434c9019128889317ba8dc1eb36052fcee07d63125ed09c2657de68056e378532c9507e7b9e28aba7870db6dac6a6877b18ca3f994439ac4019fc6090c1d239610a692f43ba69ba79719e34f43e4b6b0c5caf29706d0cdcf3f3acd6d15f406b6728b7ce02a56e2d32fa0b68630ce50b93284fbf1a14c531f80cc3ba6d126bed0f1d182c9dc61e3ae860180b2631d6fef302d15b624b30884593102715551c95a8d06f8ced8b2fe56f90be6f1df61803bc6312708fd08db8f76594e835401683f7d224bc3109af42cff497b5cd8ff7a77a8c96ca9429b01718d85726c1d6378c34384f69ac8c7633942593284fdf498ae24ce524c3fa9d49ac2905562eb0fa2544a3d57dc614cc4b0ce6eb668269b0c21b8339c860ee36134c839370c660a618ccbd6682697060690ce63883b9df4c300d3e7e600ce62c83796012e6b80266f53bb8fadf6636da1c191b745e15efcddb5a59247288c5a355168fb4f671f0b4efe3b9e91a96fed20113dff66b557d9223fe2227beb28fd20b32959357ac32f4834ef87b2cf5bcdee92f33f8fda7ef1195a5ae49bb0db37f23dee952e534ccfb5d9d3e56c9d06f60bdcff93f12f67f3ba20f16d314bdfd9707cbdbc271d472240aa4147ee2ff0302217b66e06d0000 + serializedProgramCompressedBytes: 1f8b080000000000000aed9dd95b1bc911c05b801098db1ce2b201738953026cbc9b64d75983d74bb2beb892ac770318095bbb5c0bb2636faecd6b9ef327e4318f79c94bfe9efc0379cbf72555353d5033d33da361d420392b3ed44ccf4c75f5afaaabaf91a84a0b78c5a6e16d53ac8a25312b3644561c8943f86b09d203f8b18eecfca7e204d297f0be03e7a6c560c09df81a8f75c3fb0a1c9d8a02dcf95aec429aa7f36b22077fafc0bd3938c2dc3df8cdc155b11ab869432c8b27e2b148c63a03446cd24da7322f86f58ad5c1fb7df10ecee648292c244da792f0b606674ee9dc01286d5ff75c7c45d53a8073bb70cf89d807992f4862dd7faa05fd21aca45ea60999d6b0bcb84cdb59de359976b0bc76968729d6b3167ea7d931cafd8b3c6e9069232b07af9f91c7b532ed52949b64795d2c0fd36e57b9dd56b9b14657b94dac1cfc9d7595dbab28b78fe5f5b23c4c7be4bd69768ce5fe8d31c5b45f21f706cbeb67793e72abb6e5719d4c6fcaeb32ec18d366990ec8f3732e7d5a643a28cfcfb3634c87986e032c0fd35b2e99b5aefc05795c2565d4c9bfb9cf55cb7444c16594e58db03c4c875d5c86ad3a55dbfcecfa8d29e48eb3bc3196e727f75f2eb929451d5ad93528e3b6eb7c9bccbf239c6d6b42a1e324cb9b6079984eb9749c72e968cbbd2eaf5b54d9211ea3c8f419c48a1d712cd264182ca9d8106adf191c3c51742dbee16b9c8a2d40983a06018a08b641f1b100de33af8c603dd496edd297e87d07aec893d0bbde22fee1290295db879f1c0bbfa790ff90a23706e03c9c99159f438a776d838b3f871fa7944d28761f42784eacc3fb31c9db06b5bd5706550943b5fb9e559069f524079063033d86e37dd2708ddedf90a639d27e05f20ad4af1d42cf761fd2b7549ab7ee27f0b7aacc75894cada3ba43d1e55bdd966da665a80d6a9fa6b6f08345aec22288bef6ae6c8635698a647ff658e207865690c120ba2265cc11b298236f5ea429ceae7a0886afa3b7866affb6782f42c7e25717351934771fd58059f8efdf7ff4efbf2eff33eeacda82485357de1f50353fb0282f15ebf248f0af423c5e934145ddf8632afc345c5dbb44fcd67579ba2ebc016aa967721a20865df4065cf28c0e4fcf629f1de7ecea7a2c9441710982eced428314d561ae5261aebb6cccc171c50f73dd59bdce31e34b4db05e433048071dc16a15411ac77d6994a0770066ff751fee7d0524de9067bd86fb5503367fa638289d713155f36c209e83ca6164388d74846b14843348b851a564bd4b49d44f2338ae321d0dc7b78d9a6e03f2acb1eb033a9ba7018fe582182f0fa0362f6594f5bbd6df844d459bb0994c384281a9349ae94c59ab224e13f4ac51e2ebe2915c00c2c1410ece142007ef7a25f33760e0899a3b6ba6bbda9f7c4bd1e45b893cce2c4bada1ce02095d636a8bd898ea54a66dbc9af1d2c5fa11ec999345f723edbec39db0bd48bdca2c88b443d1b9fd175e1ed3d4eb4d734d659aa6cbeee49f40f5bf16d6742fbc713a8b6e535d9a0e3ea87c9d691a54f46891ed4f97dcc1ab57651ed28276ce513fbbdc238ac9a8913d2d5f85748fb4c0fc5d19cbfdcbf2b74cf28ccfb965d2b4c8f8403928b8aa5ae0ba701579480f79c88c4f7fb74edb04b820b147b53cf0edf16c128f68a5fe35d93a1e577b672f955d5e64749edfa8f27c5af27c768971a398c9bcda3369f5dee599cdda80de4f96e9f4d4cc77ceab21d7a40ae748ee864225ccf784f37e7d386f5609c77e1d77003cf34d9ce1cd82ea9e1212fa125a74250ca84a4037c181213607f7ac364ca9adba520755a562ffbb053f19f8fdd6552ae6e312b1b5d7174687369d0e432a1d924c87259ae11cd2f0d84de1299dc9c16d6174b9ae6a7ea460ce68f3f30b73fbe4fc6183a17f33c5cda36a770742959ff009d117d706dde99ee3edfb7b9a683d4c31c18c1abad8d1ae323b65ee5d89d9dde3a6d2197ea4e831dd28d961d2c70e51b4d459a243150cd012632ac5dd2d7b54dfb23b5526a6d2d62fb163c573472405a353f8ee153750a7dcf325b5fd5264bf6e4fe58255d0d9a64b679b8988b649ea044f4614dcad128c469f5272744b4ee925f7e8244f4795dcab83311311469f4ef06c44c1fd3ac1e988826fe80467220abea9128cc382b96204fb8c1f067482e7230a1e5409c621ef423182bbf48287741adf8ea8f12d9de03b11050feb9ade62d4a637a2f3b7bb11fd6d5427f8838882c774823f8c28785c27f8471105a754827121edc7c508f6590c9dd069fc93881a4fea047f1451f094ce913f8eeac8d3bab6774f28a654b822a91ebbf111de2c4dbb8e6018b405d7e0f46f87c60b780f9e099650dc355b8ef18a73b412264ccce818fc54c5604ccbc0bbee6391c0876654ab42786e3d94a6b33a4d3f51699a2999a6b86c8e53681cd666e5ea5578edd33aedefabb4df08ed6b2b74b6fcfd2da3e3b0a4e2805d0d2ff77c0b6356dae0c8f180815b4f7e2e8c96733a2d97555a2eb9b4e4a5721b7d02fe9325d2e78b41bafbfcce94a68ef3ba3a3e50d5f10b61af0bdb2bb57c9dd6b20b4ef7f6e8f9479ceead9c5df9002681565b5a257fca81b66fe86adef29c8fc16fd222591ede5f909ff9b3729ee39e1b86c8828ec8a72a22387638df1b5d177e3ba3563d4fa99e5b24fbada255f9d56913a4e5816798fadcd6d5e7a1aa3e3983165e8b6c619d7d4bc1e98e8ed367bad86c92d3215cbb0445618d50eef93da6fd6551c76145c5e1636d1f851eff90ac7c4cfde6aecbff77cf5626f53dd492e39ae26b96809f58ac81c2d821f179077e7744520b20234d2b5c99331b06ef7261d907e071a8cffa99b706ef5dfd4ce89f34f7ae975ef4a1e3a05aa8fc71967924af5df1fbadde07ac13b246b62c204d0b61ef5b4d7fcead5a95a635b9a90b7a53b0169f6369d56a1f0affa8a525e0b1dcb58de16e9dbd47b4221b615e0e1fbf830b02cb0b7a6e618604d8bb9425f8b08535dacfca61f829fce02b11afcaa0b4472661e122d2138aef968025ba6c577c0347d98a4055a8425489b84bf8a7256ba0177b40d91b4a5a2878bfa549d809c9cbba430bad58979be68f7968480536af54804f9df764ea1e28d349b7ff7f773219ec649e2284693b26532c78663216b432cbe669bc86e379e7d6beabcc281f5fa877c486f6622a7491f850c742e9aa497c5d129f35243b848bfc86b573e650264ca11c6028d74ca2ec57a02c66350767ffc6b08e9ac23ac1b0ae9bc4da21b1eeca08597079a85d53a3ded96f0a6313c3b871950ddde993197328bb4ca11c6428372f03a5ce239d31d3204a6331b399a1fc854994f8ccb985d17a18655f3eae620c59832964d50cd92fcbb39b31181f8d7533e30cebaf4c62c5c753dd0f882ec3c902fc569e37d6306c5f98c4d677416ffcb0027d7194417d5e8e503fa840a8230cea97e508f56e0542bdc1a07e558e50172b106a3f83faeb72847aa702a1f631a85be508f5760542ed6550b7cb11ea4205424d32a83be508b5125791ba18d417e508b512e74c1d0cea6e394235b824620c6a3b839a3509b54942c582f708a92d3befdddc2c1db8b829708281cb9904d742316487f6ec5ed26a1292c88af3ef233106afd914bc3883b767125ed09a2657de6803ae3785b29ea17c7919288bdb5233381432b63c7c8ba17c75955ee944697000640c652b43993789b2578132f8693f830d7dd814d2eb0ce9d7a67b6afbf161ef47158c816b3505ae9681fbe62a9b75e5ef455e6328f7cba7b3a9c4bdc89b0ce581499417df58abc4e58c4986f5d024d6e29fdf30e89dc69edf6864188f4c622cfe8b6c2a6fb732c1201e9b8438a468e2a84481be6d143f26607d1bf9fb36f7a96280bf3509b845e8162f0ee52595d701c518bc93f2e9cb2b71b633c4509e9a447943a22cd0679e4eb53db9f71bfc8c36f01e53601b18d8c265f8687133f24a7c5eb885a17c6d12e5c5c79b95b87e3ec6b0be318935a9c0ca053a3f2e6fb4b9a74cc1ec64307f534e300d36786330bb19ccb7e504d3600f6f0c660f83f9ae9c601a9ca31b8339cc607e574e300d3e14630ce61483f95b93306f2a603abfa340ff0f2f8c7647c6e6ef2986f67726d1861b7d56e2d65a9b786f3e189cc18ef5f7e80e35d21d52dacf7ba47c9fbf4f15b1b79f0ad88eb13ec1db2639e2779ee3b7c3a0f4ac2ce5fcd3bc69faaa4cfc068e30df24e02f1329fa4bfb03a28aa95bce7ec9ec5f8a8f0fab6a1a5c3fbd2f35fa58254d5f2efa3ed7ff8fc2fa6f9cf442374dd207cd37c0f296709c009ed0079b4fe89af8ff00b8c55cf7d8780000 serializedProgramBytesString: - serializedSignature: 1ec90a087fb1b0cb3d26e3d155ceea0de803eb83acb88c19570fd61b3a588e45c571544cc077b40bfe489a0844ee0d112b98701ca7ea16193bdb833b3509a30c + serializedSignature: 0e2698903720a1cad1994ea0f1e477cb236beaf2410ff70d833674d669ee60d8dd26cccab41c1a53995c1fb03ca4281fcc035002c407c8597b1d257bed77ca09 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset b/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset index e4ed10a..57a72d3 100644 --- a/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset +++ b/Assets/SerializedUdonPrograms/b1eba2206a63bd141807f7ae8b008063.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d577f53c915c047b6e502a619700183c134b12e920d988e71c3988e5b922d01630c78d76d6d43206d379bbee9c9a6b74ddff44ddf4df90e79cc631ef211f2b04f49e6cc9d6b1d8de6e8de2be9882b67e59f35baed94ffb43333f74a2571215f9156f9362e86459f681763e2b6981773f2539f4c67e59fb3e5eebf2616657a57be4fc863ad6297c795f03a10a997ef43726b492ccb2bef8b49994eabe323624a7e1e92d74ec92dd87b47fe4fc9b32265f2a231d12fae8a2ba22eb2d543c4b8ba6849ef8b805f914af9de2b1ec9a353ca2850125787eae4db883cb2a48ecd4aa3ddf39e12cf28b766e5b14979cda29891326f298995ffae12ea837092753aadd2e97a9dee95ffe5f2ff3cda2e43db1be47f54fedfd6db255a46a5fe8c656f443aca1583d4fd6b88fd6b8dfdae8d9b745aa68f5f308ed7e8344a1cdfacd372e2f8169d5610c7b7eab4d238eedab51f9dbbdff0e980bee622da967e44fe8158e0eb4a0d1deefe1ab40dc72f39fe466eeafdb53adda78f5fce60e33e9dc6f4b9570c5db1ccb697bc62c871afabd3e75ff5677b4959061b4b73b3b1f4ef861cf7ba83fafc6b681bdbf0843e7e1d6d83bc8786cf2d865d07d17e2ce7a221e735438e7b9dcbc62f3b574e0e65b0ec6991ac77f83ab70cf92c83a5ff12de6d82d9deb48ad4f6a655dbf486dede2e52db1bf7fa069db6e9eb870d1fdce3edc6f16d06afb8c124eee88f261cbdd17b480ea40923bfb7a1fd58de7543deab7abb51a7f5c8171baf76437e87482daf1d861f9d861f9d5aef5b8e1fe5ae7d6d3a3d64f8d181f66379d753e595bb3cfcfad166c8afd77247325c13a4fc1c16a9e5e7b0b6f32dbdbd53a4961f97d71191dec674194c8ea0fd901e35181f757455fdd390e35e77ccc8b31d3a6dd2e9717d7c146d437a02d95666c83c69f03b8174e1e36386ce5d3a3d65e83ca5d3d34867d4d079c6d079dad07986d0b95ba7dd86ce6e9d9e453acb0d9d3d86ceb386ce1e4267b34e7b0d9dbd3aed433a2b0c9dfd86ce3e43673fa1738f4e070c9d033a3d8774561a3a070d9de70c9d83864ef7ba1ab48ddae08a6a61a943d148c489e1a664e8bb20e2aa52418fe3377476aff40e9a417439bcc1eb8052bb2cc3d30529c012b98ea9b87859b63a9dd6c8b521528decee53ef13f28c6925743c5dc59b692ac0b819f93785c2ee25b97f5045ed10784fcb23ed12e0b4baeaa66caa9e927fa952c6a5da1919ba4fc9ccbd2f5581bc9bd2ecf433bd5c8210ddbc6658ca744610b3728f0b74416ecf280b47d4fb0365e994b27e48ee5b56e3993939a2e995e943a52dddf745f9d9a6735423b3db681f4850fb9de18a9b4dfdd21bb03eaedac3b773e471e4881a3e8ceb6a581657bdc8cb6939f13643a791810e6f48cbe850c82229fb3a455cf589c3690483fb98eea1bd7c3bbcbb644093c9173b19c8eeedca83640ef71ebad878adfda5ff44535d3b24e2aaeb6df4702d135890178bd4a649c8ec42345a9600434dfc111b7ed5558f1410bf73deb43a2f780694ab9e293503d434d0a8fcf050fecfe893e7b43933ba5584cb2fab56342d9f12e53a6489593a522f7329d82536d8958586edddba64825db9e2571236bcec04ab08825e3650044b6d0455b4375af0d6026ca7260133335cb3e24592615cedac27aa75265d6b75e0a91aa2a83d1faa553e64239dca89325b4ea8f980bbac393126f73901e9803a3aada2987654a35d4f329d09b970594df4de573664ceaf75b6fc52b17f8b1a2c7058b45e0f35d4ab82c8d60d2a5bf98ca0323f6ac9fc0464fe460ba90490da64b85365b8a366baedcaca29653594b2cdd92baba0946da1946dcd5e5925a5ac96525697bdb22a5b8555257bac804de755d9a43c2b9cc148768d2734626d061b7bed6850b5a321cd3b3f3650257f8d2dcb80e2369b5966f634d0d9b39612bc3d47c1d536c150181afd08aea605afb3098622bd43a48708ff95af34e155b4f0f5b6d2aa76163254c225257849dde9bba436097b98e4a59f2aa51ba8acd965c91a98cc0d92351b6d59a334167ec4965d0c0b53a57566c6082a866d1699065c4123d84db6ac017a7b2c46095bd634d359534309df6b111e09287c33257c9f45784940e15b28e1fb2dc24b030adf4a093f60115e1650782d253c66115e1550781d25fca045b8b58dcd20bcde569155ed9e62adc8deb16a7ec37758052e35c377550f8162fead8146d67c2302f816d5b6f09841b5400d54996acd430bb48d12de9607e1db6dc2a15b6b17e9ddda1b65c1bab5469b70a80d714bf1496c4acf62f9f662777a48de42abdc61ab80aa0d7f9ab502a62f2ab99f7ae5b5f7a4970fd44ac17d5deaccf333573758fcf617f674a8d2bf4bd896c682594495f59d5489e9b49498b7ca839598269b701840c2b27eda84249498c995ca7c49becf8be7d442408f5e9a79600bc02b68fdbb28fd876dfa3793fa219099c8d286dd940d4782d9d0af969f2664e004c5f976201b9a291bba6c36d4faca874bca16983a0e62c91eca92a3364bea7de74876d6ecb5352f2a8a2be46469aff20ba44cc8738307ebb036df62761cf6f6e4b8b0cf727a9b40b51ffb6c190a4dc2095b231760f0bcdf2618fa49b8a524d77ef2804d3864fc292b4b53f2715a728c32fb741ecc3e48093f9307e14f504cba7365d242997d360f66b75266f7e46a769b4d32cc42f5fa29da19261adba93ad397639d89532cfa736591a0b270200f59d841093f9707e19d1493c15c991ca2cc3e9f07b30f53660fe56af611caec0b7930bb8b127e310fc28f524c2ee5cae41865f6e53c987ddc261c666aaff8a9ee4db4e01336c1d0405df52338430375d22618467a70eba8cf911e8ce8038cf44e5190aee708e9340569384748672848236c90ba2948a339423a4b411acb11520f05699c0d522f05e91d3942eaa320bd334748fd14a477b1411aa0203d9923a47314a4a772843448417a9a0dd2799b4a184e3e232c8355c8453caac24b53ede286fc9b97c3c51b12fdf3f2820935ae82794a38425d97e948eab1d4115c9041f010e5e5bb6d5e1ecbe0658f1c2dc2d38c8fb4bfb00f4690a6adc975a14cbe27a505f1e602e5cd0d9b37a70378e33c1c99c917bf79352ea94c079cc2b948f975d3e6578fe157d24a5c122f0998a85892bdc73d556afcfa46e75ff6a5f012e5df84cdbf6e5ffef548c6b7552d73eeeaceddbfe49120be5da67cbb65f3ad8bf42df7fa659315c4932b942793364ff6199e98f6dfd5350aca214c922dcb72981fe257293b6fdbec3ce99b78b03680ce876c5a806b944f53369f12be7d1af4f4291f39729db2fe8ecdfa8bbeeaf7a09afe9c50e72caeb46257e5e7641ffb38dbb461cae7bb369f3b03f44541f30ccb0ae2c108e5c13d9b07301eb5afbf26d768b3f1c44b66108f46298fa66d1e3d29dc9537771d0d3f5ce6580965ef8e5a8c80de7468e5cc01b53001670c2bf2537aa96231c5f3d46f8100d570dfbcbbcc6372c1f7d5e72b8fc72822cfda880c6491c7deada697c460ed6785fc8b4460d031a09f68782439cf2ba9cb52465cdd4b9358c95bef070e41f7ace40bf68caee48ef7e387cf09faf1c33bc25c85c9f649342f2f6ce5b41d9554ec9db74ff4537715da23579624ad6e2c5a6d9ece40ae96ea5c2d89abfb9b5ab22c4dde56cc626d9e8fb07a3d79e308b8a25a1b290016056fa8cba1e159f696ef75c3659b12e03e9e9587276ea1503981fca21eaec0ab225a9200ee739c70d62938374402b5d7c936a918502d942551cd73a2aa4b41d523a5c2e39b8fa477f3c68365bdf292253ffe8600dfebe580af226a083f97b7f62cbb87fcd25b5e6725eea1346f5e5563b841c46889d58d9261b37c0197c9585a6b14f3a882b12cca5d3238b077ea09080e9eff3fefb713d06f2f0284f36e37a7da9025ce366423ca4bb808be63eca1dab3a0ca039c66e8cce531e1aa94f6a3d98f43d9b421db506fb5cc8d0f943a630c28eabd92c5b25856b9ef3cc5cb86af9a0b5f35c2779f135fad2e7dce20614e4d1dd013ba093e944d5c288f23940f0a817252b784e63a46ea289611650517ca2684f23d8588abee92e5722c6520ddc107b38a0be67604f361986032964c36981b10cc476182d9598430772298efe584d9a061cec893668cf0879a3363acea6cc1d03104f47d6103ca58ddd9801e4440dfcf09140604b7503c991c8499b7e2f7ca710f1bc80d5c20a308e4073841d688e428673265845aa0914e0717c21d08e1073911ba9302a0f88e02e7ca8635013670512e7002817b81139c57605efce1cf3a84f2454e94f5bedbc3e4a349c5d72a56229c1fe2c4d964f4d7ee57d88386a155da777720b82f15a2dafb9bda600cd4d9a636ba11ca0f73a26c36cae92d7553c8733e96b0938be2aca595ad296843883ff2383ba9d4d923c6d2ca367bb41ba1fc2827ca6d1694deb75a3096ce162ea48d08e9c70a8114b7a5ab13e94984f4e38fb3c217ffccfb7a84f213e1e9e9196790d8509e42283fc98972b7052518b1acbe62634e5c10ced78aafb611540902fc7278faf9c345d8cfef41283fc58972ab30673b57d7b4f11104f2d36101598c43cefd08e46738411e34407add98e0fd980a2b70b6db17f621e09fe5040e8fc1dbe7a3f097f614e7dc7c1982f8b9427449fec227c62e892d7c1a40283fcf89b2d16800665775356f4758bfc08935bbe127e32409dbf0b30721fd2227d20d825a4d9ad3a7145fe41941f0bec409cf0d98a816b3d823cf1604f295b0802cc6c83386407e392c200f1521c84308e457c20292b1836103994020bf1a16908c31251bc82e04f26b9c208385e78c959b2d3cef4528bfce8dd27bb858ccb72e542094df2844a9f4378fc91804b14593bb10ca6f72a2cc6e74c388946d74730621fd1627525827c037d3303f07d4c0056c0d02f66d4e60a06872a574f5eafb3b968a10591542f61d4e64e94f9e0dac8212b716e1fb6e213a10e71956ea5957778a22ed19fd2268edea11ca573951bab71106e940f0dc2363f8cd16e89c4370bf1766b88c834436b86711dcef87192ee368870d6e1f82fb8330c32dc6fb354f20b83f0c335cc6f09d0dee6904f7479c70e9c7aeccdf8329cea5dd7204f2c79c20b31b5a32c6036cc1d62042fa13eeb29969e2a3d8d77e362190af85056431aefd6c44207f1a1690c5b8f6b31981fc59584016e3da4f0d02f9f3b0803c528420b72290bf080bc8625c44db8240fe322c208f1621c83a04f2576101d95584206b11c85f738274bf49865ad64dfd026ed610e83817ccbd08e6eb6182c91898b3c13c8060fe264c3019432136984f2098bf0d134cc6009d0d662b82f9bb30c1640c89d860c611ccdf87092663a0ce06b313c1fc4398603286466c300f23987f0c134cc6809d0de65104f34f9c30b788d46fde4abdc3a3d8bf67b801617c831363b0fbdd187b71b6fbdd9a11ca37395166b728c188946d51a21f21fd332752986ba6bf97cbf91a29367c6ccf97958a55f343040920f2172802e5ba08c47c655a2cc023aeb1805f5799e97cdb3a6b2cf0fdd3b1acbe30cef9ad824d3a97e7e4399705dc013621ed985069f2770be2a040fd7860909fa1c92c13f238b3b4bf424646ec7579266fa5331f3f9460f3d4db3fbaa45767c8953874c6abdaffbf41beeb6c57c5b42ee2fc5cf482163ea57e87efb6320a5ed1ff01c66aca9422af0000 serializedProgramBytesString: - serializedSignature: 0f6213b96b84813c3e3c45c5be3a5d62b0ec403185e37a0d877074e52e848b278d981d8ddec2cc9f777689ddd3e8c50cf7ea3c05328a66d7fb51adc11805c703 + serializedSignature: 642c8c364964a07bc465f9e1b11c07111b79dd88b42084eee46efaab07bd9dadfff23082696c483769c39f439b9e09c6e206a75562de39a07eb260b299ab070f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset index 171d4e4..7431ef3 100644 --- a/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset +++ b/Assets/SerializedUdonPrograms/b35f97b1813cb064d852c92d1c5c1751.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df77f14c715c0e704870a02098c105d7409217427d18b01551045809a0bc6704802644b82a8101cc789d31327717a777aefbd38717a4f9cdefbaff913f2433e1f67deecaceeeddebcbbddbb7d7b5ec7d24737b7b3bb6fdefbce9b3765e74e2509217f624df26548f4890ed12c06c588b82e26e5bb0e994ec85febc8ce3f2ba6647a55bea6e4b926b13ec79df0531f5b215f7be4d1b4989177ce8a61998ea9f3fd6254beef91f78eca23c8bd22ff46e555b1f9f2a641d129ce885e511babc9216248dd34adf3626057ac4cbeb68b07e4d951a514149250a76ae54bbf3c33adce4d48a5edebce8b0bcaac09796e58de3325c6a5cccb4a62d97f4a857a23ace4ac4e97c9bf72f41ed2a5f26f812ac53a5e22e66e9dbb56a06b63fa0fee1940c79242897d7c4ea77124c3a48340b2cad13d761ea4f3f4fb417d5c9a2e6fee9e79280fd2127dcf103a06fd9a5cba5479d4af1ae555a13c4817e9b2eed0c7b53aad41f7d4e874b94e17eb7bee4432ec7c482bf5f9bbd031a4153aff6e7dbc42a70b515915284ff982bee73c3a8ee9eb21ff1e8bf91c1bdbe6dbd0315c7741d7cd51573dac4665dbb6af4179abd075f63948576ab9f7ba8e2f42394f3df5d47f5df5d28264b6e834219cbedbacd3b5e8dab5e85a48d709a7efc2b1f48db85d9fb6ef6e1499bed16290bb09e56d447990ae174edfddacd30de89ef5280fd23ae1f4dd3a4bbff9ff76e9d2e451bf1d28af09e541da289cbebb4ba7ade89e569deed4e976e1f4dd46940fe936e1f4dd6d3aad174edfddadd30654563dca83748b70faee169d6e150edf9d6363db9c44c7c8774bc0a74cbed58374e8d1e931e1f4ad6e9dee41d7ee41d742ba57387d6baf5577a58fb9caeb34d45d8f416e17caeb44799076b8eaae43a76d3aff923e3eaad37d48d63e742da4fb5d7aefd77acf04a0b7add761c3bdf9c8b3753f6228e3884e0f09a70f9ed0e9ede89e43280fd203fa9e143a86f4a048fb1a2ebf1d1d231f5b60c7115bf7e3e8185d17b7dbcf499d9ed2e9699df6eaeb2f0ba7cff6e9f40cb2e58cbe76d8be361e53a392e3729c90123744023ac018b444afc327fbcedc0327d5d7c20bfcd4ab6267e410e586146018bd0caab1d18c8c26adc6d1cbca5825d2bb43bda6e415634a2814e62ae2f18c2240b971f93b8a865ed332ff981ab9c1e06b4c9e6996c0c7d45d9764d83c2f7f9d528664b1e372f8362a1bc5ac2c0ae45d926a675e99cb2418a6b9efe99332ad51e484ccb181de90c7e34ac37ef57a53693aaab4ef9179336a4c3b2947b5ed32bda54acbb47d4abe379539a0919975340f26a97c6bc86a5753a7b406b44fa871d8b335528c1a51c3e411dd0ce727d448f8918c9a7896a11564e2aaa3b164b4286431475eab48a879485f0641ff36665a68f6ef5cbc2f642103d55dab2c48d730fcc49d66ed140935ad5a93c3ac6c50415e436c798684eceac7e3f393a0a41b7dcc845e4d2d0642440fe7ae2b292979ad7ffc0075bb1b7f06fb245c56aaf0adc8302eb70a14c21203c224145366d4aadca5155c49489e67926ccfe98deee6161ea785cfa7845704203c6e72abb2b0dd2add24a8c59aec6e0553f81d2e1266afaa24bc2ab70694572da0aa675100d5534a095f1c80f03253ddab91f225d6ba1f9479d630b54b9d1d53631bab27859a9890165dd54135dbb5d97da2cab34f542b9f802587a034a37ca59c8a404b0c1128e627025598ea5265be88b52ebd4e938ea9d5e5513901bb2ceed3e35bbbdceb8a1c68648f93fb647a456901f9c39a78f6b2b27bc3d2393e69c009b5f2d725bc4ff6f8ad80c5c412e595cb94573667f14a9336d93cd366715a2d9ccfaada8ec7cd6da24695fef46243b5aa8526df572bc1e742ecc3bc8cafcdbeb9dc73a4aa55b552936155d6612841add2148b2062ac30349524305e39e79bab941e3bb2f8e6807a9e04b3d72b4a97897c3cd31dff6ae8f8b788b26635650d0ced2bc0105fe52ca63ae4b50174c85526475696dd5f940e39b312edc1919f8acceefceb3c3b7f9d72ba842fa7cb475faac1545355bf3e80aa5f4209df1080f0a594f08d0108bf8d12bec9203ce653f832937068119b4d6ee3165c470baea1b4de120092e594f0ad06e1953e85d752c2eb03d07c8549b89a33c9bf7297f06a93f05a5af84a53785301b59f35bc3925bb474bfefaea6d9ec355a30a57990bfbb9caa7c2cf2a13bdaab0e959d78da9ebfcd383479ff5ee900093a20745523c246f3b20ff1e94053f44406d22a0e6528b82bada0035092eb9c34b7c69a47d7d0d25b8b940c16ba9e69f08a0f9af33098759273c272e6885ac8e92dc52a8e4f51490d600806ca084ef0c40f84693705894d9e5c5472a69c19b28ad7707a0f5664af89e00846f31098700b1d70b926a5af056cafff615ea7ff526c930f3d82f8899073c30af80918daf994783a91c7082835ed064e996b751061ca20c809d00fea74e8d543987a9728ee455ce76ca418f06e0a04d26e130206df3520b5906a43b28addb03d0ba9912de1180f00425bc3300e1494a789741b8dfd9450b5599dd0556662ba5f5b10090eca4841f3708f73bbbd84509ef0940f3dd26e1a0216c3b2a7476b187d2fc64009aef3509874e01362315d47deca3d43e1d80dafb29b57b0b55fb80493274d467bc349d2c1df5414ae5b385aa7cc82419fa9f7382e87f605383fffee776cacbfbbda0c9e2e187290306280306f332e008e5924301b8e4514af81d01086fa384df1980f0764af85d06e17ebba20eaa6eefa6eaf67c5e75db692a07babc7bbc3867962eaf8ba2732100f4dd94f07b03107e8c127e3100e1c729e19702709a1eaa32530556e60993600861b0c7b6d08efa24e5eac394abc36e3debc1135440436cbd303d96b4dfb5cbabae490137d506ca5931657cb4e8eff1d22993ceb0f87645102b5a67e5414a3c2043d2ac2c1134c928af892eefb4a1bc847a0011ee629fb5a20672fc2ff65d959ad665349f878f9857f6ae096a652fbb0ed4ca5eaf89a07aca32c94a30d7e37278fe34abac80f73785f5587c40959d5ebf2c64abc398b46fad216ca9d065647f9f62df6a6c55c16b4fd5d819538da947579742a9b17ed9399e94489a65eb1b536db6599fb38fed363dea8829f67dd96be57e534836d6c6b8b0b72305a51945fc2cd57f4c14d87f9c33098695cd492f82b3ac6cf69904838f5cf722789c16dc4f05f81ba6000f5370f323e5cc47d06df2754a554eb31c515c54fbc766647a4a359eabf2fd35958fdd26bd1bd14fa73140d9f01c930d6dae46952ed3d2f3ba34ddd2725afe0ea82e75328ba674bef38c73ffae1ffb0629fba64cf62549fbdc35724cd788570bf2ab9d214afbe9fc6ba74b56edacbac9f2c462d6ce1d947d3326fbda0b68415eeacbab6c3f16de4959386bb2f0a8a71aec53e7524abf1115be0bafc3fcfcf32ecaba9b85d61faeb50e1947a0931e2942fddd4d59f85c9385877c5b6847f6ab869d90b44da67d937eac3a4f5975cb6455376995490f67cdb9f772ba6bd0de8548db9a29c38fa5f750963e60b2f4206929ecd04eefe5b66c9cd675075aa524018880993eea8c8eeeb343f21c0cc7fcd87481b2e979269b8e788a296d52871165b7f509c26245947b29db1e34d976d2651bded26159d7ad5b5bcae07bf86ae719672ba4cfd0f2fcd87c91b2f9f9d418c5eca39df2efb2bcc8b6fd94b8ae2cf36e413ede7889d2fe2193f6ad7947c8e1b95ea0432dd198a2497e3e97a22c7881c982aebc7bb162c7c2cb949d2f34d9f9a8b02793f6941c4fc82dd230f6b822527ac2dc3377657a9adfa73c0d16186eaaab9bb5d5a36aecd2218b02eb416efa1ef0637b6a3aa2ae1d565247e4b5dedb305e04ba98c592f4f2847971228836324c917fd8447efb1c797b326e4fd9e909bcc5d5cef1a773a9fc8dc560d1b44b593f25ef3cabee80a3699150db759322f7528f9d0f654f487f837e6f60ae6fccbdcc039f3ba2beeee08a702fe8e4fbc9f75c56987cbb197937b6cefbc25be6a7fc4bb545b62c495aed5d7ea659fa62a8d5f9ba564b126a1bf5f63cbd29b7162f81d2e6997dc8ff26504b40af1ee712abf4394bc9b57f77871260c7ff00bee7035ccb1ad24d096b31e64999551a2f4902fd977222b2be660a6e4fc94b66220167453c0de7659c702a159c091dc07be58520e88c6c7e572201ea899234a89773825a48809a8c0426f8815ed525bc3bb0c09edf06fbcc2ea84a75fab7d490724ac91b717749ea83294f37cd5f81bb94862cded290b5c9356444ab0622c4a7c748e6b14d12c648affc3f1fbe2461f8f22a80d06ff7f62a523cc21f522faa1bac7ab43e1b7c51b6575759857c334bb9236a547b31249fc85126d201f6d59cd8ca34364b002c01ede4c315e7c2d58e70bda6385eb6970f5b1d17b61684edb5c5c1d6ce876d1517b66d08dba361344ee893aeaa15c2241fae462e5c6b10aed715c7cb7645d0cb2a11b6d773625ba8b14de882ad671bd1f4b59508da1bc2689ab644d661462d17aedb11ae3786816b20d2b84e205c6fe2c4059b0d4dd3980ebd9506e605e3111ca79522806f0eb779b644d0df1a10aeb784db3ca3886b37c2f5564e5cf440a33382b3802684ed6de147355880e9558fde2e0b58ad885e54db8500be9d13e022d2efe003926ce0c6b9c09d41e0de512c708c7383512e702711b877160b1c6317c1b6ae7600817b57b1c0314eacd83a894e04eeb16281635c9a649bc61f46e0de5d2c708c932d36708710b8f77082a347738c11ae920b5b1c617b2f27367bd9c8bdb19531ba9572412b41d0de570c688c9ec606ad0e417b3f27b4cc67548c3ec6364bb80de1fa4071e2d9fe088ed8b6206c1f2c0eb63d111caf55216c1f2a0eb6363e6ccbb8b0d5236c1fe6c4668fd646e7361bdba758a35b1317b85308dc4738c1c12776cd8b48515f1cdf8c107eb4384db63b82f3840e84ed63c5c1c6382f658b741508dbc739b1417bb9aa6e800f6e44af273d8b407d8213140c73871d318c1117dbfcf31cc2f5496e5cce5901e32a075bd03f8e707daa38d12b8acb91cb10b64f73622b47d8e043f6b778e7036c7e760401fb4cd8c0189f4db101db87807d366c608ccfa4d880ed41c03e1736b0286e5ade8e807d3e6c6051ec2bd722605f081b18e30a2d1bb0c508d817c30616c5355a81807d891358a9b0977f005834e3571b82f5e530614531761d43b0be1226ac28c6ad0482f5d530614531662d45b0bec6090b1ef1983625477bf35e2dc2f73827beccf58a2836cd24c2f5754e5cf60312b8645238bf932a8a4fcbd72170df2816b828eecd8821704f140b1ce3f88c0ddc7e04ee9bc502c738566303b71781fb1627387a4db623820fe21a11b66f7362b3679b691559371bb0f5a5ad08d877c206c6e8616cc0ba10b0ef860d8cf193ea6cc0762260df0b1b581457fd972360df0f1b581457fd6b10b01f840d8cf13b37d8806d40c07e1836b0283eb95c8f80fd286c60519ca2cf47c07e1c36b028aea0cd43c07e1236b028aefc5723603f0d1b581457ff1720603f0b1b18e3ae7f36603b10b09f870d6c5f04816d42c09ee404e6fc4eaa246fc867fb9ea0d508d72f3871d14b3c8c5ec6b6b97323c2f6cbe260639c55b2ad8c2d42d87ec589ad5a63833d18d65797babf369fb1b15ee3c2771ae1fb35273ee8a66f88f4b7e9b3a162fb468d3e84ea37617403b64456cf62fbc6a08508d76fc3c03510695c2b10aedf71e2b2476537e7fe1b46341ffa6e45c07e1f36b0283eec2d47c0fe1036b0283eab3c8880fd310c60d6680cbe233d9a8b3d4b10b03f850d2c8acb89cd08d89fc30616c5c59e6e04ec2f61038be272e25104ecaf9cc02a3430fbffb2a5b8a318dbc7ed5721647fe344464fc4bbf8b0b17d6cb00761fb3b27b62ae1fe7a07e7ff9263f4b9fbb8e0f58a67cc7fb349c273fe7f600768707d4ebdc1f871ec868c2502eb1fc22cd10ca06d9c16a3aa9d8ca8f09212e97f0e93807a88c1e7e4fcfccbb3ec3281407669ff043363663f1f0facee82f86f34264b73db47fb4165965a49c05cf6196dffbfa0de75b52b37ad55df3e36286bde120ebbf7a784f59fc3e127fe3ff2cf137e02bc0000 serializedProgramBytesString: - serializedSignature: 3fd4bccd00bd2190c579ffca1102611d52c3e549a95e4e7b76e0cc1546ee3f6f91566be6184423dac0e8cb79b9018aa10ae342d6b5e7f3166580684ab659320e + serializedSignature: ce3e1a15b9ecf0ffdbf867d1f8fe225aebe110ace8798d415cc96c4c29da275e90b392315ff2dc07a81991661bdba310f81b0fc6147544ee086255db0c54cf0c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset index bc4088c..577b5bf 100644 --- a/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset +++ b/Assets/SerializedUdonPrograms/b42eae3a19d2e89448e47dd9c7f5d0e2.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c4973134714ee91359225cb36f2826c4212b222626cc9982d2bc10ba00086f29603953202c9a0c4362e493624b75c73ce317f245539e6989f942af2de9b1ea9d5d33df2486a06115069dad33dfdfabdefaddda3229263f0cf3a0f972db6c696d81cdb6425f68cedc35f4bd0eec1c7b973fbefb32ab44fe05a84b1f3ec4c9b99f8efac3505d702dcd5581d661eb2c7d056687c9d95e1ef02cc2dc31df6eec0b70c4f595198b4c996d93db6ca32d6641b125b34a9c6fb2c94cb1a84eb22fb1946cbc4142e92a3a10c5cd661a446637bc0b4fbdc03f60389b507638f614e95ed02cd474471f02fb85a2493db503b01df187c27f9bdfb8df0fe93f0b55fbe7cf92fef1fe3ad0ddf84f0b74b0bdb013e37e3336780b751a90fefffe6f771de0e8abcf071154f0981568ab7493e774a7846ec9f16eeb11d929e017eacdfa575868567c6793b2af48df27644c27658ea3fe5c843f445794ef0362debc0b6c8b26e81ae8bec80e55049d6b9002ee0ce6c6ffca4ff083794b3b46c1dccec0008282c7093ecbbce16d805a5054e5b2981ef25ba16e1890a11c5c5a425fef42c81ccedc2a72cb84f0dfa6f92f7a1035560648edd8116673d64f3e0100f242a5bb0ec2eb860996dc0f580e83d04b6bd4fb613095d4d9eb306349d48b0073d2ea00770bf4b1caed3f588382d13f705e8ab535cda87c8b408ed0b5acd2b7b15fe56adb9c12153f3a80e08ba7e27ecb86a5a066990fb1cf9ea5b8d84a1110aa5ef70378ce6d047acdf3c9a788ba11364303914388d7982cc6ae9bbc07294ab7ef520185c46af84ae7d1f3718dfa43aa40c45c223f623f72277dd67e441c891eb8d6bd0ee1017d8ff9863e3bf968b941af768039fa6fde430df582b01528a792990c3488e8a81d36d14e767362859d69a655899edf3ccb342eaab109b6874581a6210dba1794e91a87bda85f12e5567876428b66db75adc02cbc77925937ddd60b5a3793401d96d2c85dbe46d5e86c9f6928ff1ba2742722649ce334a39ddbf1661da5320704429e3107856f10a4826242471010dcf1195ab13bfeb465dbd95b2f35c859ef30b5c6a771ca242ab155e2bc99cad4385182e12a15fd0d094669622f8bde5593bc674a630a08295aadc8d57082b8e3d232ae89cc181c5b27b46025603e0080138e511ae3d0b3a08a30a08f309be49f07225dbfc88dee66d9572681bb3675439ba78781df89883fd2e7af65da2f214fa9ef048e5174971a61845fdd589bba3590938b536d3a4cd799f88df3b9e75fa8fa9b484ae6e3d09454b5b3c9720960b81f39bbf66707f3c201714b4119ff1d141771c61ae112e9afc3b4e96608e0b9df6e3ba5c3aa1cba57856904c922401f2dfa06a1dec3c1928a9c82ba6f42b26542b22e18cca3d65c2693de1a42e604e751b30877494a7bba59cd2a9f9944ecdb8a5734aa6d3649a733ea6a92a053b284c0398d3b04eb9ef76a9dc111561d4cb7b8ad0914fb5b836f76f79b571fd6aa33ab5bcaf530bae918c05f5be13ba753ed0adf361475e9ed679f947a6bc7c4c67081f776908e33ac83ed141f66947aa9950ad4395b609839bd42928ab52d015adcf7b37a2736c1b3e5898d4a1c52d608d2b16933f8ea929b5a6b520aa3fa993e59c4a964de66ef9dc0d9cb8d574ce9cb078d9a1635f2c5e0a8d2757a0a4710aae35e2b60cbc1fd1d38ed4eb345a028a87547420dde61ce789663922ee75e4b12d985b014a4170c8e870f84c85c39256a75830ea0a4d47ceef61b40aba3dae3665e95a372941649cd2c938a39271b9a1eb75b6cc6ec3ba45e0a10cd2a1753e27ee7ee21a70242bc0f83d18714e85f5f2a9325defa49cd649795e25e562179aac713fc5be22c882dc96da48d20b5b3da593705625e1ed1e4858a2f13acd2b068e47c1648ec3c7b23078af10275598799f66e05d8de5a86cc9b3e31fb2e1da7ba01fd4c2464353ed8fceb05ad3bd1cdb61bd7a4fd28e0755549d13e2aa28ddf1cf8abdef84e25c229716204d75dc9b2629fea22016e55a8de4a87a9ce9d09ada7381761a1b50db50f0133c87c02a8f9fdadaafed3af21e435e679608b8c7ec3d782f8cc6751d002ad196a5069f7fa0276e47f288ffbc4990b098dca6e99877eb7d010e13c0b960129c0c818386da4cdc98082a405f2c4fb1bf4ae9ad1fe0fbc36ac2b760123e4c5f6bb468b94f2ceb2a5956dc9688dfe85990efec5d89371d8d5201f082364155a25792d3136dc85f37ce2f8ae925eb893e59c966b2da209eedc0399bb593bae6c963ed74e97f5ed6e4b1acb98c204cba5500458a2b2623459c7489dac410b00d7581b44237efbc132d71e3f471d8ef2476a484ac74d52458290e5685ed73d771de766f03b3c6604b9b82cd1660fbdc246ce8f7ea9d9a31d062a6401b1740fb221c5bbb620eb6a429d84e08b07d190e6c17fbd04513026c5f99846d94c38699f3391d6bb41ef01a4c0be3a6c08b09e07d1d8ecdcdf7a1ab5a026cdf984e0b089b7c1069d0d6464c81362080762d0cd00c5a9a31d0a20268df86019ac1aacd1868430268d74d8286e561b171eede7fb9734c006a319cf07fb90f0bdc5101b62593b00d73d8ca8d77a9ee9051c74c99022e2d00b71c16700673a731e02202702b610167307f1a036e5000ee4638116ea10f0bdcb800db4dd3f6d63c61953755fdb7a19a1080bb158ebd198c6fc6322a13602b8403dba53eacdf8605d8be33095b82c376d4f86d8ad17460cc3d4704c06ebf6ac0fa71d39e646fcc3bc73c1eb0de61c20bb4acb481cbfa1cc33bafe7d25c6e0c1af8c32b0c20257aaa28bcaacbd1cf80f13555901fa6f8d36cff1eed2e8a66a9ed79b767faeac5bb4195a4ddbc274cf96825473f907e93e55f65ceff41c19368dcce90196f82e61de2f86bcd2a9975959eb1ff03ad110f209a450000 serializedProgramBytesString: - serializedSignature: d362602640ad0be160d7ab7d10882e2ead6ff5bf97e1c644f1e4978cbe522a43242868551ea766e739b7acd651f445e34f8c19acc1d74edbd03b90b3e5470800 + serializedSignature: 7ef94c59b3361136f72988d4ed809d4d060157a2e330995fd4e8ce2fc3052f7ebcdc028a3b314740ee87e974e2b4a05aeaff1c354dab17aa0b7e39357033740f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset index 68bd303..0e9c21c 100644 --- a/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset +++ b/Assets/SerializedUdonPrograms/b5280742086799a4c8c0a14e90cd913d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b6f1b45143ee378eda4a42d014a5a285010528368bd6e23f18894a46989a021c4715e2a9438f1a672b11bcb76a13cf2ca3fe2bf2185ef9c998937b3b3de38f5a66d6856decb5ccee53b9739332984843f7507b76ddaa415aa509d9a7448cff1b682670797feb2ed1bd4c3f329ee0df4dda15b1933f9efb6ba8efb1abefa34c0cc17b48f674bfa6b14e17d0d73237c71eb017e1146a92226d5e901fd4ceb34afae6590d896497dd3a6582f358dfb32fd89de48846226a174cde356434f5ffa3a10da8e7b42bf8a5a1df4ed634e8fdaa0b92714a79b3c57749247d13ca7f09b31ef85589b194a25f353e6c7efe5587fbc9d650e8e8e8efe0d9420f003646a50974221fccd18a6b233b38dc4a44b0523cc6d613b001c5d10f02055173b0c6891ee7b91baa1666372afc8bd81112d21cacc1c16ff2458b0706d5c51cccc7db43f122f6143b7d053a19ff0e459bb740f867be250d906db365c25a22ddcbb426f1762274766a9c42ee1ced9044dedb11db45840bbf86e8b8435b9ff2e924622fd1ada06123fcf1141cb78be146e49dd7b78f7f1dc3290f965f43b6e5abb0e0f6ba607d086a50fc56fdf59e4755884a12fcd98302c86925dfe4e58e21d863ac904b220681af7741a3dd1769f42fe54cf12088eaf635243ebdf36b1d610413f02e921b543890be6d317abf1b825506da0a5016a1be86d0afd81587498a62d2dabbb1f49768fbba2f1d0238293102c5228cbcecd0c08461980e92da84a6cddc943d52028565921d7acca6756593a77cfd1accb90ba2f3475fb062836c09be92d090757233b63b4094ba73161d5560b0beaeb8415ce2e591ae2051fe2bc52a8bfce05f1acaae691149e11aac23d7a6696a3a41fda656d13cf039182dbf78d8f8fe635da66d3c7f80c6d164af1b73a466d96bf162c52417ce7d27104d7d1aeabb055b1404b3855bcd23087b4f1168bc75253bf106b0781df73df13ee6f163669be3fe5f37d864ffd92abef8fbf1cfa7d73f6d4f9e4b258e55a42ab912b410a6a450f6a5546ed0a6f8b5c71787b33e388c4d2a4100f7cc4f9f3aa4f579770904eb8e4b3353babaa9da3adf5b8968c1bdfdeefcb76ed2406ea616aa0fb02ab423bb8b88af70519f7c5595bf7e0763f8f240dbf03ce89032637975980a43961d9e7276cce0f7c187d7f9c8e4e2e8aeb82c31fc2ef37238546e8a9f4ec607f73087998507ca9e5113e7a698b72c251e7d21d753a4db30f7d9ad51dcd16bd455a76895631b667ade3e3eaa2d7b8faba7eb40d695ae0e7c7a18c4b29567155e4ed61e686ccd0d2879ce754758c25857977e03dbc87dd826c7b12b8d90bc547947e307230b13d7296167a17c7f30fe420c5eebb7cda9dbebc499e07948d46961690e6cc7ce134e565af64cfde0a212f53eadb337a53b6141f33b729bf0f8d9fff34817593c91557793b263022399465836472710b3d97cb5d2160b3fd044e04d9b596004f53d6ad3e2efee34077883f9c98af9d6da14d46c555c9432f2583f6845ed38d121ef2c6493e1ff7f285144f19a65a7f8aac72aabdfe3fcf8255ce82371884924d1a554e1a9fe419d9b3622f6d31bd28ebddcd0ee07278bdcaf1cecc8948bf741a45ce12ed0589760ddba779c2c6d552d7a96572832bc80bae2006d7cdd7e365d5b710368ac1f6599eb05d71606b611a57c887b217c811ba725ed0a918749fe71da00c9da5982b5c97f3826b2a06d717e701d7d65b0d57912e4cb157e521b748ffb3de641caea1e68c2e9c3f1f5324b9b469b6cdc37a2ae4231bf51d8db7d9184d33bbd8f99262a5a06383f6c46c308902cea7e9ab1473b323ac12b2c92eb4fe5fb96e3a2fa57e1d96d7c4f92cb027b5524fc604ff0191c95a1c12240000 serializedProgramBytesString: - serializedSignature: f3a58b366117c8442fa07555c600e8e4639634144a2f2cd5abfa5bd11ea9859e6c55ca4cfc41cdc520427686438396699a85beb78a37a4f0e7d5f105893d8905 + serializedSignature: 7693cda5325875b22b22cc41e112dd8a9bcbb64b97d6a537d4917d2aeb263dd5a111d41fd8f078deed3d6d38fb6e18af730c5e33e4d4729eec482ea3d68ae90b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset b/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset index c16aa98..07c96af 100644 --- a/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset +++ b/Assets/SerializedUdonPrograms/b7519f645cc7a5344b80e26eb2ffaea6.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: b7519f645cc7a5344b80e26eb2ffaea6 m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed9d67741cc791807b010260ce04493141cc11bb0498c42012892444820411a8404ae422912041900240590e77ce490e72ce39e79ce39d73ce77f6dde9ec0b7ffcc33ffcc3efd97ecfefd95d3d3dd89a99aad999ddadc52e6ce0611b93aabbbeaeaeaee9ee99ad482afd93d8a93fceab2ed5a2ea55af1a5037d5a8feaf45a737f4afb3e5eeef54633abda23fd3fad84e5597e54af8d99258a13fdbf5d6b89ad057de56fd3a1d36c7bbd5a0febf5d5f3ba8b760ef90fe1bd4672566e88b7a55ab3aabcea8e5896559449c37178ddb7d09d02b31537f36ab27eba383a6509049d21c5aae3fbaf5917173ec862eb47bde05f5a051eb863ed6afaf1953235a669f9138b3679632ff2827a9b129e453a5fff6d8ed4afd37cbeeaff49d3bc3a6dbed390994ee40ff6f47fb20dda6ffaaf55f0fda0659afb2793f61f757d97427217f17fa7f27da17223fe1ea4ae934dba68d486eb54d1becffbde81c777fc2b2aa368697d9d6f955dce793e35e97b4fbee45db90ee25f4dc87fedf8bf641badfcab90f6d43be2926df03be7c0fd8f42ebbff7eb40de94194f7417bce033e9973d0361cbfe0d45b62a9f2da889b2691ccb9f69a8bbe73e6d974b73dfe20da86348564b8bad6a37df54cbdb9f5556dff1e0aa97b57c621a6ee0f85d77df5133e39ee7587edf997d036ae6fb74e2f7bebb4f2630ed7ea4fd9fdf395b78d7075b8d0ca866b7f6ff72db0e91194ef119bde6de5a4d136a48b6cbad81eefb3db4b7cd71ff35d7fcca6cb32e5a871ebccb591a3a81c476d5aebe3d5ef3bbe5c656c061f777936d9fd03beeb56f88efbe5ae545e9b74e5b5d8fd83285f48eff01deff71d5fa5681b5f6dd336e5b5f1369bb62226ad366d46fb9a6dbac6a6c7ad9c21b4adf3aafa8bdd5e6bd313997aa8bee893b5cea6277db24e3ab2aa4fdaedba105977fa8e61b6ebd1318afd061f2bbfff3a6af75df1ed677c50e542bb9ff2f7eeb105f69aab21e752fb96d974a34defb17286d136a4ed88c3269b9e42fbda6d7a5a79fd8ceb933ad0b91de85c48cf28afef39e3d4d3ccdffb64bbd79d555eff7fd6a69b6ddaa9bcb6d8a9bcbee99c3d7e0d6d437e4ff39ddf65cfbb8eb65dbdb19c119f9ceff8cad58df2ee56199fe1eea3eac5d5750eda463651f32e9f4ed9e451fbdcf3b770d756254cc477527b8bb4baa5921570d236153d3475afcc1e9482e86af8809f2d26db091dfeddd20288c8b0d7c49d13baa5349091e1cac45c54ee16f399d6670c1ba13782597c3e9005146e44ff0ea2b0765cef3f61a262086c87f5917a6dc4c3e6aacbba5bbfa07fbd52ceeb6c4774683ca883b8db3a2b907759173b786636952004f65fd3a5653a11fa0dbdc7057a4b6f8f9812769bcf474c49074de9dbf5be0973bf30aadd4fb34e1f35b905751fd3ff5379f658647419e9409ddbefdc0eb8d5d4aab581d2278d7dfea346a6a246007df50ddb0c67244d2fff58a026fec1d0713255a6737264ec36c8129e7d0d2a69e2daae00c1f83a0635a4eddbe1bd4f07f061bad064a0ba57190d32359c7af8332fecfdf3571eaef2aad6a89226ac599d45b530b0206f6ba23620215c85aaaa192928a81f7f82c26f6ef1bb8b88df396fd89c17bf02aa4dcfe4ad800484783d7ab3cf146e425fda6f4fefd3695aff37a002b5930251350670b0fbcc56480e710585185c78a2674a2c9c1b180a873c73528b0ce4a4897f56849822979709962a6cc4e436963f3cf7d61f4e6d78fc8f5574bdcc36f5924b6e5ccd54523533bbd8c69fdddb87d5cb9c49bd32f5023f34c3b98c6d672b0347700645d044df17450906c362f7bf667ded554de21113ebdcd6d753617438531882dae5634af39c6f78d691c17dbc127184ab08c22920bc802ae42c5f21a17c8ce06aaaeac03e12d745abae57ef73ee28daccd16113866664de34db909bdb9cc3ae80eaea3023e2b74d59c22b7621e5c4cc80238c4cca960cc6d0aa6d8ca86a181fb7d8d8937c61386baba1ac0d3ce212c2cdfc55ff042c6e2e6f713339e14b09e1e0e7e3089f4599f3fc62fbf2b3da575e53cebd567c5fbe2cb2dfa965fc78b6fcb97a9f4dd13323c5c58fc273eb0781c5f2c8fde00a151644c7ed05e750860df45612854a5086bd8237ecb9947068a730f81c087bc1cb9c30016f8be96ac6ac93e8d427a4b5aacedc6220ff1a3eff795cfeaba8fca15097f46f4aff652f079c3966ce8a53a2f99c1f594df891df55c6f3230ba89660fa8d6b53d22d9e30f3d38381965db84e714d64afb3d6b49afa90dea910a5e55ad942aada61e7ba2891d05abeca1751556e763e53b4caa38e0753508361803b20d8a5d321530ad80fa5c83e8e1c6e207554d404914aa24d451fd596d702669f2a8ca1ae3786ba2bc4507bccc20f180a1d325adec8c14ce946b2c1e45d5a64b826b598b27c33a95bcca1093876d348811a89dff5c32cdc0e7fd74f57ce26458f21642f02877009d7196d263aa38919f13aa3a594708836b644717921377fcba88a37b90d4f492f1734f7c2f6715b23f771dbb2ba8efccbcad9522d176a6da7422d28ed2d144ec509a1967339eda0729ae7cba9c3b492b4d6326ebe2bb87c7752f92e40c1e4a87592b07dcb8cdfc2769cbc577279efa2f25e84f27616e6e1d0f58c2d4d9cfcefe0f2afa7f25f62f3df63f4cde40c2b0c7367b08a2b43922ac31ce50fe67b8c878c97e76a2ecf1495e75294279d776e370d6bb852eca64a0123c390c740ac3cd6525ed5b8dac129f3aa23c6ff14d69bc252ba4a7f40689cd7b62c7e33b7d2d429f58ca3fac3597ce46c32d157a371df32c5e0dcf63aceb4f650a60512fab82e3bc4b8eaa85cc0b8f612b591aa45b0d42440c0e6cfb291cff24e2ecb7d61591ef57cc4cc723dc7723fc572217216fd93f59abb7bdcc0e57e80cabd36d045349bf532d7cdb2f29ba6810f207b8b53928d942b31bdf6395157127f829f7611b00275960f988947c9567bd0b4da6501cd42e7c119729ba83a844d58b4eb9fa76f1efdf06ffb7ffea7ef07aaa68aaf9acd9c911ca68c649e35128032a4775e52eef2a9e198bdcb162a5f6801b0fa369ff18fad9ce0bbf314bc8d120c810dace50cdeb1f9256fe2256fa79a87092e87449b07d75dc88dce1da3ea806c444da6110119895272cd6d0755c75013cd518ca789afe29d9ce0963c05efe204b7e629b89e324a73d7d1276a94eed84fb7d6e094e983c68d4c673fbe6d693239b81386ce71ef55e1c6d816d9188f1b63dcac54414bc7196192aa52b87b3911a54a43c649529460a8d29351041fe705efa604cf379b1104d7f2821b28c170230d6bd2c909b21873518d9cf0530510be87eb2d4ee7db5bece55a7c479e2d7e1f27f84c9e82f7732ccee6cbe200d7543af36c2a775182218a381745704814719083dc9527e4439c357717c09a0f13c2936608e8b22aa5ce20b78ea087424f7604f048cbd6c44615bf2388db091ce10cf07c9e067837559566246d6a06cbf39fbb0aafdc7ba3f05acff33acab998fbf27431c728c15011f7e759e2264a30dc8a3d104570c83d5b3327f8429e825b38df75b100beab952bf5837996ba8d120c15fe5014c12151cf714ab033849e677f7982920c2315e0c6b30fbbd98f586360273965d2f92ad34e4986f9c7be28fc17f382efe104f7e729f814251836e1d15eff688efb136734e734d790060bd0903a38e14305107e8633932bf99ac9594a3238f0ab516a33c4817772ed7f38cff67f8e63712d5f165d9c015e2f9001765319c02cd8481426db78c13d946070cece939c5ec166952c1d42e051a37a33967953073497f4390feb4bd3663816ae8123d925443be7922734f1aece88d3e1f4720c462906600638df26b37011a252476f98ef86d29d5683a6e413ba41f8cb9a59411aa79ce7b972dea4cad9e42b67264f5c3fa74d8039aeede0aae1c69794df5fa87ab897d3ef16a55f834f3f6c1bfe3a3961eb24aa0e58561c0deee3347898d2a037766b6a37474bbf45ddcf7118a3381c66390457d178dbd81562511ccf835a421747ab0738adc629ad0ec6a8dd56d30a9d5bbce835eaadadf3fadab8b34517388d26288d8e46f2284dba0c03a6ecce73e4f97b94dcbce5454eb7db5c5b74c611dcc5917869a45302b8291f3293b7505bed9367b6e95b75c73abb4cddc0acdd23e6ec7aabcba09de4bd6d7402b9996bfcdae227480b51c70f721c1ea1383c20c8c1f1c2de77aa9d3753f0c3ca7d06370e8d5cdbf1431c912751444ec6f04efe7ea7dfd4f658969e27bef438da5ee2b47d94d2f6f864fd7bc7d3b8f1b75c7ada38f2e3687a99d3f4c994a6ad21f143b60896bb2eec48a1fad634a7e553282d0fb1d64bf586dede75223084c85b6b70b8318e4e7d9c4e4fa574ea64750a9622e381c1f3a4271f318aa34958cd15c243f773da3f8dd27e50b8a7cacf4347b5ff5c380d709cfe89e2b42fa627f3da3e4430e3936b6add95bc61bac7d16490d3e49f294d1af2d2845a179c7f7435c469f0f428be16738be36b795b0b8b1372f7b557382d9f41697924a447f1f793dd59fb49c9967495d3eb99945ef74cda9ffb4adab49dbe4a9bab1d8de863f1eec6e4eedd86398d9f45697c2a46cc87e39ee0d1f1407db9cb15e523bf6b9ccecfe622bf28f1103706319531d1754ed3e770fe14e7db62483bfda0ab6b8fde9779674cb87e541b86abe26830c269f05c4a037a6c0ff28ce34db17edcfef83554a37f13e6a9903623674c5fdf697c94d31e92e6518fd4a44fc9fee82394e0867923d3087a5b53f6071a9fa7f8171f065780e6fa0ebc6c5a5011593d8ac9b076d11fc20dbeefafc66ae4cad2a4cde32cd34dd3e7e35aad489ac76976e4684dd94bf102c8ad92b6a1f86fff7204b8d1a47932a157cb1ab09d25f5fab1ac79667b9bc72e23c0ed750af0fe4f303467906f4c399307f05353559182ba78613181e1d8b74b5ff6247d793900db6980d554f984fbbbe042bd98331b65dea92c306efc51138c8c1979037e27631e6c2ab5923f869dc4d6480d2d7816655d99de8dee9552d0bbbde8efbce34941c7f36280d0e3fa69e31b5e22e91b60b98d33e67ad3de89f0514dca9f7b3eefda9ce5f117555154cbc5676c424ef6a59220dd27d69c806d548d84de6aef9643592385b215a17c7c2a517aef2304adb2560ae56e84f265c540c9356faf550aa214b3cab908e5cb2551ae25ac32fa58b820daf55268ef46685f2189b6cea21dd12701d63113365cf20dd8f32ffd14c53b5f0aef5184f7959278975bbc57588f8a8b2fda39cd9582391fc17c5529c114b44c31983311cc579712cc863284b904c17c4d3160727dbd7f0a56d0323749c15c8c60be561266bcc0696f19064e2b11cad749a2745f35d5e80b9f32ef111183b74d0ade3204eff592f056a9a851a7f7ae689f1cd42629a80711d437942254c1662e06751f82fac65284baa70ca1ee4550df548a501bcb10ea2e04f5cda5085530fa1483ba13417d4b294215bcd91483ba03417d6b2942150cedc5a06e4750df26097587f28e36e1a57ee32ade42ebcc122351e8c7a5a0d723e86f97849eede6d43f3d22e86bc5eea8362098ef28259882d18018cccd08e63b4b0966394e92ac4330df554a30cb711e743d82f96e4998e1efb72cbfb97885c0bd4712dcfc507081c54e8543375b0a5d0542f75e4974d9c63dcb7f72a306a17c9f24cae813c6c1a5eba268c54645bb11daf74ba2dda8a80963e71e28de93138298d74a613e82307f401233fe9288228fdc8bc15b80e07db0d8cd3ffa8206c1c0486c41c30184f64353d94979a3cc72bc95ac45283f2c89f20e0225df49b95f0220e8351ba590ae45483f520ca4d1fafd72467a0221fda824d27591914e9f5efe2e04f763d2bdfcc4e452fc09bb68bfd3de3da5272f28a7aea80ac1fbb824bc0db11a3bf77caaa8852e96827c0f82fc89a9ecefcb7f41f82c84f293c54019ed3185721ceb6c42283f25897293e2e791e2cd228982ee95027d1881feb42468f77bebb8e6ef6a2a8af1a014c68d08e367a6b2e9176d5e5ecc8bb621949f9544e9dedbbb4d1fc4c0211cd04f2fafda8cd07e6e2afb7a2fcafd6588721542f9794994eef0dd9e69347cb705c1fb42317af7e0f0dddfc7ca901402fd4549d0cb08d058a053f4f27d02b90b81fc9224c83b0990ce97f9c290f2a8be5dbb6d6e40a7db845e2502fce5d2e99a04d7358b754d2b10caaf14a3d1bb01d430d9e8c56d728514c84604f2ab922037fb40f6a9e05cd2f47e8cf62c42fd2f92a8dd706af7340aa7162278ff2a092fb77926c1a93bb149913b11d2af954e7774571976476b10caaf17a36907178c8dda53ca0f5e02c1fb4631faf2f0005efcd502627df92104f29ba502b21c83a20604f25ba50252706dbc18c8d308e4b74b05a4605f2d06b20581fc4ea98014bc711403d981407e5712e41a0b12be1f0c5eec37dddfc1b40881fd9e24d8d5ca3fa5017735ceebf0db55eb341b943b85b07e5f126bbc20bd1c1f87998750fe4012657e2f6013442bd6f88f21b43f94449bdbddb92052b1bbf33a84f447c5f4a7f0e451e65df4d36dfd5227c2fa6349ace06df0429b0ed3d0d3a6a31a2bc3d1cb1908dc4f24c1b9431c7ba7d1e8e55604efa792f066fbac8e796b7a19acd9ac46c87e26892c5ee023f8ba2ab1c0e70e84f2e7c568ba0dc56fba627e6f2982f70b4978d15e705ebea3937310c87f2b1590e5383a391b81fc77499029e58d0c6fb313b2fcf0c6f47b98a01de1ffa5247ef71515dc50dc74784dea3604f357a50453d0c38ac1dc8360fe4729c1141c711783b91fc1fccf528229380f2406f33882f95fa50453700a430ce64904f389528229f8d65931986710ccff2e259882379a6230cf2198bf968499df2b2bca71f16012a1fd8d24da78c321e5f8c2bee508e5ff940eca03658872b59a365f7498825737fcaff27caf60f818fed6082f2470be4f7091e531aa4bd561ce4c2be75b08d32af3dd82c93a7d1afa5efb68df751a2e1368844bfb3f503941b7809182d56321becc90d234bb7ebc4dcc0da995242c8e9dd6faff3fd4bbad7663a6cbcdd75ee22fc83cabe08b33a150f053f537e61c624061d50000 + serializedProgramCompressedBytes: 1f8b080000000000000aed9d777cdcc8758067259154a1ba4849a7dea993c45d52e5548f92488aa2a842b1a99f44b1e82851a4c4a23ba79e9338714b9ce274a7f7e2e4d29c38c56997ea14274e8fd39b9338fdd2fe4ae60d06dc07e03d2cb0bb6f89a54dfeb8430c8037f3be7933ef6130c0ce4b2bfd93daaf3ffa54976a56f5aa570daa7135a6ff6bd6e963fdeb6cb9f99d6a42a70ff467bfdeb75f6dcd7126fcec49add39fed7a6b524de933a7d5804e47ccfe6e35a4ff6fd7e70ee92dc81dd67f43faa8d4027d52af6a5157d465b536559343449f3969d2e6a540afd442fd7956bd45ef1d32958242d266d75afdd1adf74c9a7d8f75a5dde36ea93b46adc77adf803e67428d6a99f78dc485758b95f9473949954da19c0afd77c86ecfd77f8b6cfe7cdfb10b6c9ab6c7a4509a41ffa7511ea4f5faaf52ffdd41db20ebbdb6ec8fd9fc0a9b3610f21bd1ff0d282f447ecad595d269b14d8f22b995367dc1feff123ac6cd87f498dd7f176debf2e65df7c971cf3b64f3eea16d488f137a9e40ff1f4779909eb472fad136949b61ca3de52bf7944d5fb4f9f7d136a44da8ec267bcc804fe612b40dfb079d764bad515e1b71d3434866b53d67c877cc529b1eb1fb87d136a487918cc3363d88f20e32ede6b657a5fd7b10d2f6ae8cd34cdb9f0e6ffbaad77d72dcf3ced8e35f46dbb8bddd361df1b6e9fcd71dae556fb7f9cb94b78f706db8c2ca8673dfb079cb6d7a16957bd6a6cd56ce43b40de94a9baeb2fb1fd9edd5bef35b7de7b7dab4265b8f856e3bbb36d282ead162d35a1faf51dffeb52a6b3378bfcbf39ccd7fec3b6f9d6fbf5fee7ae5b54957de799b3f86ca85f439dffe51dffe0d8ab6f18d36bda0bc367ec1a6ed8849bb4ddb509e5baf8b4cbd36f9f6fbebb599a9d7169b5ef6d5ebb24d2fd9fc71b40d6907d1865bd13e8af5365f1dda6cbadda657ecfe27685bd7b3f223767b874d3b55d6c6333e593b6d7ad527ebaa23abca6d875d21b276fbf6611df6a07d948e753e1dfd63728bcd7beacb67c6d5f92b6c3ee5c3dc7dcbed391321c752793536dd6bd36e2b67126d43da85383c6fd31e94d765d35ee51d3bdd71b60f1ddb878e85f49af28ea7d79c765af4864fb67bde75e5f569aecfdd67d31bca6bc7379477bcbd69f74fa16d28afd377fc2d7bdc34da76f5c6729ef9e4bccf57afdba8ecdb2a3b0eba7954bbb8ba2e41dbc82616beead329973c2acf3d7e3f776e45ca44b1e7b525f7eb5e949e0707ed55d1c36df7ccdc813688ae840ff8d9638a9dd221ed132d8088767b4d2c3da53d6d2319edae4f55a37a379bcf7e7dc48811fa4ab0880f068a80ca8deadf2114aa4feafc3613e943b03ea2f7d4ebc176c49c754f87a4b7f4af574a9f2e76541bd090369a695d14c8bba7ab1d3c32974a10d6fbcfe9d2329dab8ec73ac705fa446f8f9a1a769bcf67a6a643a6f6ed3a6fca5c038de950e8ac4e5f35a505759fd0ff5365f65864741de98b0f2edfb9c4719ba9456b03b54f1bfbfc548bcc468b00faca576c375c903611c23b032df12986ce20038178bb95d16090a53c798d2a6d62f5ae00c1f83a0635a4eddbe17d445f7485e9429381e6de6034c8b670e6e907ded1fbbf1f7a5ae155eda04a9bb066630ed5c2c082bcba546d4042b80a15150b3250513ffe1485df4c5b749710bf73dc88392e7e03541acfe46d80d40a1372f4eb9347cd5451b71538a473c675fe8476a881d6c980a82a0338e83e735592433c8f420c4378aa67562c9c9bec0a87bc70468b2ce4b4897fd685982257960996e6d988c9ed2c6fbeedc99b1d3bdef3df1574bb2c36ed924f695ccbcca75a6671a98d3ff7681fd62e4b66f4cab60bfcd00cab19dbce55078ee0028aa089be6f8b120c86c5ee7f67f5b92f6b12cf4cac33adcfa7c2e870a630ad76c0c794e6b9ccf0dc4a06f7f16ac411ae20086780f072aa928b7c9584fa31822ba9a603fb483d126dba5e9de75c51b49abd23260ccdca1c37db509adb9dc3ce80e6ba6466f9a74d5dc21b76053588994954987997ad19cc0b56da1851553163dc2a634ff295e1acad8ab23618115713c3ccffe99f80c555f316b79013be86100ee37c1ce18b28735e56eab1fc8a1e2b1f2ae75a2bfe585e1379dca965c6f15ce573edbe98a26766bf4b1f85e7e70781c5dac87e709d0a0ba2e37ac125946103bdf544a5529461afe30dbb9a120efd1426d403612f8c326d26e06d36ae66c20e129dfa807eadaa73bf34507e155ffe52aefc0d54f950a9bbfa37a3ff72d7038e9c3047c5a9d1326e1cd9488c239f981f6f1c594ef504e3371ece8a5b6c33f7dc87023dbb784e7153e45167b3e935f521dea918b5e57ad90aaad921734b94486833dfe42ba92637996f156df2a8f3c114d46018e04e0876e974d8d402f2a116b9e791c30d642b153541a4926a55d167b5e5b5d8a6e0963e18ea7663a807420cb5c72c6681a9d061a3e5e33ccc94ee243b4cd9c922c375a95594e59b1bd5a59c9a807de3460ab4487cd70f772ef7f95d3fdd38bb143d8790bb0a1cc2d59c33da4d38a3a905f19cd11a4a38441b7ba20c7921177f3554c39bd24666c5cb05cdbdb83eae2eb28fdb9b73e828bcae9c2dd572a1d6f354a8e5dca4cf86537142a8b55c49fba89296fa4aba647a49bfd6326eb9ebb872f753e52e47c1e4981d2461fb8999bf85ed3865afe7ca3e4095bd1295ed2c36c4a1eb655b9b38e53fc7955f4f95bfda967fc8e89b2d19564de6cf6003578734558725ca1fccf79811325e991bb9323354996b509974d9f95d346ce26ad11046bfa1a8f437737568a4ea501da09fbd8711a7d42d5ca907a9526b58fed9d2f36b81ad5c3d0e51f55881ea31e929393ff6dbb8d20f53a5af0aedfdf9b5c376ae0647a81ac0bd0928613056193b8832d2c6d9c36cc8ecf8f551c3aab8fe1c16a8cef75f9218f709febbf8b5d1b6fb5a1318b0723f5e6b62e27f58875627540d2e70d8c999d631cab440c27d2e680c31ae5d5429605cc789d6c8d422586a062060f31779942f723757e489b0229b3c1f318bdcc3b13c996b981a9869d7fc87a93aaef45354e9b58161eaac59b1f5c83cac316e3af820b2b73835d94b0d25266ebc2a3a94c45f62420f11b0ae7b910f98b922227b6d93e9b53501cd42576230e49ea7da10364fabe04a91b363effff8c047ffe7c381a6a9e09b661f6724672823596a8d04a00cebccbbca5dc03712d3bbeca7ca851e006bda0b99813bc0096e2e50703d2518823b584d1c9c33f04bdec54b4e53ddc35cde0c8b760fce5dc8cd0fb7526d4076a273a61381f94bd492eb6e19aa8da125daa218cf39be891b38c1e70b14dcc8096e2f50f041ca28cd75ef7d51a374671fbb75bfea303e68d2c874f271e87cc694e0deb276f67bcf0a37c60b918db1c318e36ea58a5a3bce080f514d0ad7cf17a33469c84cdd614a3034e9a528823b78c14728c15091cb5104d7f2825fa004c3540e3c9542dea28d7137f42827bcb308c28f71dee26aa1dee238d7e3bb0aecf12738c1dd050a3ec9b1e82994c529aeabf416d8555ea404af50ce63208544114d1ce46b05423ecd59f3f52258f3194278da4c42de53497206f939821b147ad211c0034675a99d2abe2388eb04ce720678ab40036ca69ad2cce5ceceed9ac2ef9e8637eeed28bcb6f3bc5ab821e64e81434c2b25181ae2a5026b7c8e120c976277a3080eb9666be304df2b50f0796eecea2fc2d8d5ced5fa7e81b5be400986061f88223824eae9e0700c1601c7454ef85011845fe2840f1741f8658ef78302795fa104437c02ef0b28283ee9a424c3cc108cb5b9a739ed47ac39c7ab9c320f0b55a68b920c77961e45e1bf8a17dccd091e2d50700f251836e10505fed933f727ceec592f67ef6345b0f73e4ef87811845fe3cce449a166729d920c0ef36994d60c719837b8fe3f5160ffbfc9b1982c94c52dce00a78a6480b7a902e0bef77414267b79c17728c1e00ce159fbc0bc30f4603a64c3b374f566ee785c9bd85d7dcc537d6abf99fe8673604f6e09d18eb9eb0905bdebb1e238f8973806af500cc00c70b967cc5265b80a70f486152e50bb8b6ac8d47c4abb177f5db36bc6e3d4f32e57cf57a97a9ef1d5335b266e1fa8e5a4feed31cf1b8d85d494cf2f563bdce3f47b0ba55fa34f3f6c1bfe3669b36d1255072c2b8e06fd9c069f4669d01bbb37b59bbdc9ef51f7390e9f4e7138c97208ae9bf3f6b1072ab80c96e7412d9a8da3d500a7d567505a1d8fd1ba2da6173a97d4d15bd4db5a7dfadcb877e706398d3e93d2a829d28872464b1d347577de1c51f88892df6839c4e9f6595c5f74e66ddce5d07831b453039804193637cba1b5da678e6cd5ced2b1ce2ed3367097f49939badeea32646faa4f1b9d406ef61cbfb6f899f162b4f130c7e1b3290e37053938a3b0f7cd907d66c9c388729fba8f4323df7efc8023f21a45e47c8cd1c9ef77064c6b4fe4f03cf1a5c7d1f6654edbb752da9e9b697feffc2537df998fa78d233f8ea6239ca69f4369da12123fe48a60b9f3c2f614cbb73ee4b4fc5c4acb13acf552ded0eb5da70253b6bcb506a777e3e8f488d3e9f3289d3a599d82b5c88ec030f2f4cf3c54184793b0962bc6083dca69ff364afb21614f55d8081dd5fef3e1f498e3f4f914a723314732afed43043339b38edb5dbb1fa67b1c4dc6384dbe80d2a4b1204da8b5e8854757e39c066fe734c065361b6b742ccf1d757a745eb42bb2e268f084d3e01d51bc056ef938de82ef2d61914efedee229a7e53b292d4f85f844bfa7efcee9e925c782094eaf77517a5d98e941eeabc1fbed0dcf7e73b6a311bd2fdef5a4dcd5e724a7f1bb298d3b6244ad38720bee9d0cb497bbc0553e769de274fe422e768d12d171b328b319d54d739a7e51e1e3e911f34458dcf114ce8aa3c1334e83f7501ad0b39350669cd114ebc7e5c76fa12afd9b324fb2b51a3913fafc4e334639fd216d1e4fcbcc8c29b91fd7861a3c366f911b456f98cbfd10f6172bfe65adc135c3f9beb7339716544c598fa24aac5df4170704df515a6535726569d2e611bcb9a6e997e0569d97368ff8edcbd39a72d7e24ba1b4f9b40dc57f63a123c08d87cdb32cbd5ad6a07596d42b13739699eb0d44078c00d7eb14e19dc5ce730f304d39a19cdb1ff05355312f036df165a50486a3f72e7dda2bfaf47200b6df00abaaf009f7bbe062bd4c3817657e50596e86f1574d303261e40dfa0719f3b46bd26afe5e3c48d445ea68c1a328ebca7a37da2b65c0bb7df927b9e3c980e3f90a8070c71da7cdd8f095926383fb1cf58005e88f3c715493f1975ec8fb811779c68b8a28aae533663c8f06d9af9204b9de821cd507c1c36bf86170ee625510e83a29a01d08e8574b02751f1a7522e03103959fbb689043592585b21da1fc9ad944e9bd3013b4ca5a29944710caaf2d054a6ebcf45aa5204a31abac4628df278972336195d16f8f08a2dd2e85b619a1fd3a49b45b7dce68c2c461777df770f8373f8be25d2685b705e1fd7a49bc6b2dde07ec88daebf1f382cea95a0ae63204f31b920453d032c5602e4430bf3149301bcb10e66a04f39b4a0193f3f5febbf28296b94b0ae62a04f39b2561c60b9c0e9761e0b41ea1fc164994eefb060ffac2a7ecab7cc4e0ed95825783e07dab24bc0d2a6ad4e9bd2a3a2207f59c14d42604f5db920855b09b8b413d81a07e7b12a11e2a43a8c711d4ef4822d4836508b51141fdce2442158c3ec5a03620a8df9544a882179b62503308ea772711aa60682f06358da07e8f24d47dca3bdb84577f4eaa786befb36bb644a17748413f88a07faf24f45c17a7fedb2382f1abd815d51e04f3fd4982f94219c2ac4330bf2f493005e3553198db11ccef4f12cc729c38d98960be9e249882f1a918ccad08e60f2409a6e0159418cc6d08e60f26096639de58de8c60fe50926096e3da912d08e60f2709e6d13284b90fc1fc114998e1ef382fbfd5750a81fb8024b865a1e002cb978b876eb114ba7908dd8f4aa2cb75e3adfcefae5721943f268932fa8a25670d307e184d14add86db9db08ed0725d1ee54d48a2567122edeb3908298374b613e8b30ffb82466fc557525be752c066f3982f713a51849a32da315bc78145b467b19a1fcc9528fa4d117270a06ec628b134f21b43f359bfede1bb097e314472d42f9214994cf1128797fef7ea796a0033a2a85740742fad3a5401a2d842a67a49d08e9cf4822dd1219e9dc09985e44707f5612ee7223cd7d4e71ca3ed1d8692f44fb674e2827575481e0fd9c24bc1db13a3bf7f20e510b5d2505b91b41fef9d9f4f7e5ff70d72284f28d52a0e4027c6fe8548e73f0e710ca5f9044b94bf16b42e2ad0811057d530af41904fa172541bb5f44ce757f5753518c4d5218f7228cbf349b5dbf646becc446d10b08e52f4ba274afedddae0f6260170ee8e7d6a8da86d0feca6cfa7a2fca725ca5b401a1fc554994ee4ce8a1393413ba1fc1fb7029bc7b70faee936395e76104fad72441d710a0b140a7eae5fb7a965b08e4af4b82dc4680844a4c9929e531ed1da7cd05e85cbb373a1f01fe8de4b8a6725cf3b90ea1fccd52747a37801a213b7df9be42e82802f9114990bb7d20efabe0bda4b9fd4a8ceb08f56f49a276c3a98639144ead40f07e5b125e7ef799046fdd89dd14d98d907e3439eee85819baa34d08e5ef94a26b07d7de8dd943ca0f5e0ac1fbdd52f8f2f0005efc354162befc3402f97b4901598e41d10b08e4ef2705a4e0331b62202f22907f90149082be5a0ce47904f20f930252f0f9363190bd08e41f2505a4e015b818c84b08e41f2705a4e083d56220fb10c88f4982dc6441c21712c37bb8e7fa1b3e5722b07f220976a3f2df6483eb6ce7fbb7da55cb1c9b26ee4158ff54126bbccbc6727c70702942f96792280b7bbdaf205ab1cedf8ad0feb924dafce68b04918acd17ed4248ffa294e3293c5698fdeaa8b9b6a2ee06c2fa97925861b4c14bbf2e998ede6f1cd54419cea72f40e0fe4a129c3be976780ecda71f40f0fe5a12de629fd5315f725406ab882b11b2bf9144162ff029c797493d8750fe6d29ba6e63e9bbaed8b8b706c1fb3b4978d1be8fa87ce7cb9720901f4f0ac8729c2f5f8c40febd24c88cf24686d3ec12017e7a03c2f0b9f5784b17c2ff0f92f8ddf7cf70537173e125fcf508e63f2609a6e0082b06f31882f98924c114bc072406f32482f94f4982297867520ce61504f39f930453f05e9018ccab08e6bf2409a6e01d4a3198d710cc7f4d124cc10b4d31983711cc7f938459d84b54ca7139eb2184f6df25d1c69b0e29c7579bae4528ff233928cbf1f5911bd59cf95ef20cbc4ce44de5f91af0f039fcba08afc870befe7ba5e531a66b75c91cd9af9c2f0def57d9af024f6fd587a5e0fb5c737d5337fe46ee709940235cda7f82ca29ba078c16ad1d8bf1dde394a6b9f5e36da23aa455d2f0d4d49cd6ffbfa0dd6db31b335d6bbea51e7f9ffd1505df730f95829f8aff0785394c6698e60000 serializedProgramBytesString: - serializedSignature: 9c542e98a55d03db0e82ce2572755c687a0d6889fd0e911e49796d6c5193b8d69e158d279b72d7d32b9de70f42ad6c71d7b69e610dacfcb59632b19bdf1ba104 + serializedSignature: 05a5ab2fed755dbe648630b9eb1581767d4f6e44b391aecb2e6f64d146b7b384407b9bf0ca918e6a8c8ba3e482a02bee4d399059c54d55e8d6d6103629f19c0c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset index 25dd6e6..a5922fb 100644 --- a/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset +++ b/Assets/SerializedUdonPrograms/b8e95bf9755820c4380659898968aaf5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c5973134710ee95b592251fb27c201b42422e10012419732440487c61140238be5ea894b12d1904b67149b603794a5ef2907f94aa3ce667a58a74f7ce4aa3dd191d96c64204a9b4b33b474ff7d73d3d3d336b07d2801feb325ed66009662105ab908357b08777b398eee2d77972f317a188e933bc6e60d9653857a7257d2e58e378cde253090eb0e5216c615ae0f265c8e37d16dbe6f18972b7f197c75a56101badc21c3c864790b0c6ea9058e346259167915c562f5e67e00d96e69929ea24cd4509bc2c634989cb769169b7de13f899c5dac5b22d6c53841da4b9c9147bffc1abc532713204e5478848f796f885f03722ee0322ed116950948fe2cf7efbf6edbf227f58a4b644d31675c73c75e3220d4b75c352dff43b253d07058b32efbd52db88a89790cae4fc718717a621f3e1d28a4ab4a222ed937050c93928b51914e9806833213d53da2ff24f4bcf24d3df1e9a3189664cc64ed4653e6c8b2dec3eea7c03f621cd0aba088d0f05b765fd4140a44301611c17b8db0334b77d24a0b0c455b6f3039882ab4a4b9cb0fa25be67f9ba81350a4c943af374f197af0b626e07bf79691895307f8147210da40296a4e0474ca9d55398c481f1c443650dbbddc1a1988715bcee33bda7c8b6bf663d9168c879db2c214dc723ec628e0be83e3eef3087cb7c3d624ef3cc7d16f30ed83feda1879ac1f435f7e697bd88f7aa3e5704646a1ed58e4197efb81f574d73280d719fe6f1ff41239dd008411f3a238661304d63c4fad3a7890f183a4e86269daca031e94c6b557957214d8fd68e0fc1e665f44be8daf72ae6398e6d9e4b0b3c1aa88f023fe590579ad8dfb014bada8bf09c39a41e4bf0905b1c3237aefc6a34c944aeb0d415abb0ab619882344d2fd6477560a8a504a297b43200c6c5b5ed608684f2aad752a997438915a3eaf5c660afd80d92cbdcab69ae6a7591222e79d465f9f49509893029c97169b32ce8200ca820e408ea77a310361aae2c70c49ec7707a135e8879c6edf7151b0e71e4ce574b986e331794bf250cb7765fb595d35bc6a7a29c344769f34d045de6a52096026c2351b691734aeedcbb19a4f91cfb3ae239fb107b52f560db6a2bece31ede2df975f6dda3b26f8ef27feda87d3b7330d1dbe630d8a1f7086851f80bdbde4b748f47029915ac53c43ea8b4558ba630fcacc7a2dd8f5adf03acefbb0de8dba4543a0d07551a2613b5964f701270ea15b85ef353c020afb03c5300397b1a0a9bf8480ce634ea89b17afc2bb27a2ce900b5558092d558a5130a9a52308d7d93e1382eea19a6eef2c2cd7dc8f49e23bd43c9dcaae38b5a746a2b64a891108ad18f33fa37aba2a093e05fa7bd90427b1932a56145980176c42313d5d4500eabec823739364fc4952ee372f401b298524c1d255e0251bd45a6f992174115a7e2b6adadf59186b53eca5a3f2fb9c47670a7d369af4aa7f438a662d8ab525bafd2884aa5bc9ff5a223eba39fb08f0d3183ec0943afb5647015d7f8da8836167bbcf11c79502b556321d30ebe2822f35e34015682adcb34433a6b8beaac6dbc456bebd3b9a689565d53bf8ef2e956290fa828d3783c03fe854186c6132da99d48fc6c5d35aae2e2e6d5e893a74f2fcfa04a1e82efe346941bd7138ee9087fd222e1219d399e6bd11ce32ac2a4ef4f1b213caa273cac83e2b316a118511126657f0e8af8715a6b78fe7d9914ace3b7c4a1f83a6fd63e10757745ccb1c53564a75abde9e02d5dc332eac1275f4c2fdfa84ebe2f54f2fd01eeeceb2e18e4e5826a29922dd7ac2c429678d8e591d723ae9d129250690e291eb2444457b78ca1facdf1d1c882a81a4d39966f07d2633aa4bf54217dabca9228265545a4b5e25a07d599f24aa6ba6e3b243aa593e8bc4aa21b65db71632f55d4e68fd91c395c0d65b10e6d5a9044b5474733922474925c5049725b3bca55314235ff05e9009b5a5359e3b49a91695c27535225d3bd637b2e0a370f249b6c4ea276d8e1844ed28b2a4917da34b25c8d3e5304147a0c54e14733b29ed6c9fa954ad639cf989bc122d25bb537747c9c23158dafc758e21c253627c771c66318bf964502ccf3a82862fb45b601c71fa43916c940fd8d30379f38d8655bdd61efbec91cd4dfecba04fab3f76d68d731ecf1b6f3b24ae91adf96f41f398785442e2d449a83b3f74d527a6529640bad06d21c275e3aa635d5e7e20af5d6a3b6a1e6770b1d028fc448536c4ed6edc1bbc8f1f6708509b8278e6d78e184789c46ce72bc662ae1f78e0510b60319423e65121ef221eb58e4cc30ab483527eebb01a6dfa00253da244c1186c97943af1264750344bd9225654c421462884a1cd514f1da0de0ac48f63369da0b39f633c7a15f77d80e303c61db43fc5edb66bbe31d4df9e7e5184742af795554647a39ef3ccd5b12ef1ae757e57936a9b092a46f58256bb8eca4c64f2515b360258454877e190a21a7fee7d15d86a2bb6b04c2881b0cb1afb86ede579016c901aca3d7f6f4d0cabb50912aaf71b611f68fe3390624c77ac32458fd02ac02ec8941e2bc88b18ecc1a832d6e0a365b82ed666760bbd985b0c524d8beee0c6cd7ccc1669b82ad5782ed9bcec036690eb6a829d802126cb74cc2d62760f39e5f189c10c2a6400b49a0ddee0468062dcd1868fd1268773a33406f74e1743028c1f6ad49d806046cf9f2c1985b647490c64c01179480bbdb197b9b3207dba829d8c2126cdf75063683d6662cfc0009b6ef4dc2465d97aacea2bacfa70d4b604d77c6c6ae77a18d4525d8664cc246f1cdbe7e6bb80bbc585c826ad6245451616107552f9118f46003a620eb91209b3309196deb51f5ea370aba6f380e4980cd9b068c6ceca87caa6f7405903005584402ecde4903d68deb4c4b026ce1a40133b8e5680cb03e786fce7832b4497f5f567a52e33993bef93aa988129d2392b84082c2a0873c596d8803970de9b824cdaf8456ded66bec1d89da34eb9f656449584b6de1fe3f1cefe4f98c4ad256ce6afa6b6825cd2f8dbecff2ff00ce7f5de10f996982f7bde4b3c0c75839c74cd1c7fe0fa88850bc8c480000 serializedProgramBytesString: - serializedSignature: e51ad3e9a7dcf32be0643828b99451db317145ac4e84e6862a0ad6bc1e3d9e4e0c7cc57dade5cc9acc26b62c4aabf09019eaa29d56de3ba730c9f21fecf6300b + serializedSignature: 037b856ce3ae417dbb60a2bd9311c4bb209617da8e27eb905b82b8635b15c5d7c305455b96a8e7d250bcf3c12d0d3bebe1f19f75b696d8a57221a64e942d7b02 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset b/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset index 2a4c1e2..5e18928 100644 --- a/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset +++ b/Assets/SerializedUdonPrograms/bb160c19a747fc9478445e2f3d9933d5.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a6d53db46105e19646330d8bc240e4d4a48d3364aa1c8409abe270d90b6e90492e1ed4ba6439cd8801bdb303664927ee8f473ff517f4eff41ff41bbbb92ecb37427d9e0839ac61e4bb6ee6e6ff7d9e7f6eef61cb3015fc62c5eb6611d96610eb6a0000750c56fcb78afe0dbf9e53d7f0a35bcefe1358f65b3301dd1925eb78c2b787d84bfea70842d8fe125de4b5cbe0145fcfe08db16f1173dddc54f116b19fdd8680b56e009ac41d6b81421629b1bd5dd6706d9650ce07509de62699195a24e6c2ecae265034bea5c5641a5bd7acfe06736ab82652fb14d0dca28f3054b1c60b8f0631aacdd8f583f0f8760c7e8f9ed0e60f45a460348a2e331001749eaf608553d4401122bb618a323588405a91593464ad07b99af79ac5162a113c12efe0c7441ca95f15d145c50c7e73fb007c909252c9983c778a756cf611e417de693b28ddd96d18d45d8c4eb21cb7b8e6a076b469944eef2b75947990e9b2af8c403f4107f9759c30dbebe664d8bacfd237c76c4dcae22bb97f0fe867b0bda5ec3efb23e375dc8e43aca49a57aee50d773d30a5a43dadb7d44b3771e390f8f10f4f1097718f6db34468c3f029e7887a113644c0ed68e8c7986cc6879b60036fd34d60308766e63d04239bf1dbcefc29d505be4c890bbafb2054d0fdffeedef9a51fe2b6eb69ab608769c4cbb16615a18b024cf322e0724849b609afd3952d40fbf21833f410f37ce107ea75e89eb75ee8038cf4cad0e303e6c4cb814d9f6609f9701075c5c71d593973cc07b8123e56356e91504bc98a32e13ec88e0341b658cca1531992b06ceda15d1b127cc15030dbb9aae00674d244130a940304a0715827d320493e7134b4e86df20ea996d1bbfa1d050d0297afd12f472845e4aa554d2a714e9a3106eca5c43d61a9b67e81a2a3b602979acdbb97b8651d7197fa491fb66847d7345b295885241e59fb80cc2a1b30fd54e642b47ccfb7200d3a8e9f500957ebf27c730a38cb0e13aa8104cc8184e241c95f83548ef1135bd076492c93763528325c2336ae14995f0f12e081f54099f90bbea7e27c28754c22f7541784a15af2e4be2d53ff8ea245e0daba8929586800ea832221bc66c4b51eb30dec267ce4efe21979678fbe76d1069f0d0500aab450378953325c7dc7ff850a7d0d7e703ca66582917d27d6da6893fbe8b298f2b931c57f4a8a18a3d6915a1de3b6decc9a806d9557978f8ae9341362a632b53f8d5b9b195641ef06feacdcbc9758fb9d71a360bcc65ffd9119439bd66ef630f71705f09057fa798bffa955171794cc63822c575097239426eda67969f81536a068ecb18c89cffe55c18b8ce801658127dbacfbf1b32fef1409c0b717937f4faa01df6dd64f6e956c53413f8360c0a640fd9a9356cf7146b94f8571d6ca6610eda4fac13dc155c1f526cdf44685f345690e1122897a04ab3ef064878d28c6b9415ceae8edaef725adecbe2c9ac8bb6499d5d4eb81679b210691e8317cdd28f5ac9eef3ebf75db3f664a9aea05fd23c12de7054afb1bc82df4fb466ffcf69fe712bcedea0960fc61c0dea5bfff3f196a3f1668170a810b369c764cc9c30d845ab478be1789f1cf2ce539c8e80353e064601b4cc5de5ea34315396f5012a51f0f7739aac789245793532ed18117d1c4a9e7134adb1f7ebbccf4f98b11c79e3139d90a519b23c0e770fb2559e18090b3a3a7adb83e00d09e0cde8066f8d8b2bbc802ac1af5014f674757de08de8026f58006f56277859b6268fc57b40ff9d682eb9540729dac09cd205e69800e6a73ac11cf3817971201c15209cd30921ed409a43571b5093ba801a1180b2750245116207dfd4f12e56d969c82ee99c6b4d5dc081005c4e2770191640eba0036cb8ef36a44da7b72ad5089fb609c314e09bd7095f520a5fef2d4fe202600bba23da0a7e29e3038debb8215d40f50b402dea04ea861bd19ce54795635a8de7d163bc57e127f7bf6f3b2ddd8826ed60e4d006705217c03101e03b3a014eb1000274091fd55b16c9bd17f1d2026c9fe984cdd9cf8a9bb35eddcf2605c8eeea846c1c5a17c2abacc07e2055ac71297c531788e302889feb04310daa155ed5ada20dbc842ef00c01bc2f748247d33ba9f79a7976d483f12d2140f5a54ea892dcb5f72fc825fea792c6e8a66da1d22700f6954ec0c6dc09c149179738e9546f2490291ded1c7bf5de04911120fc5a37e79a8b0fe72450633cd3c6b99400d837ba2783d6a47aef678807c13921ba006771393abaf9960830ea12c052c455cbb721b4da4a48588a7db71598e82ce5f98ba55cc95a6dd0cb6ae390c2528c6bab8d1cbde54bfd59a1db15abed206cb59d95b54e900cb73a58ea3a87a1a32ebbabc8b1556e91c75a79be370f466dfa57a3416bf44e0e00c365461f0bde23021bf20856eedaa8ecc649acccd2d39ccaa642bc62132d2eb4fdf7c177669fe533fb2df47cc11d624fb0b243667a99ff02a951ad2f2f3c0000 serializedProgramBytesString: - serializedSignature: c70b727d4b8b8af4b2bf819f321a7e25ae624ce0bb270b00d23ffaa53ca31a489299bd44e47195140d374f86a1d0541ef9d102bc383c4267b52009491d78d10a + serializedSignature: b0ff94d86a63c60f989cfa75ba89405da704cc531dc678e11c7845a3e4b8856e940c468d932da5cf5e3df79b913fd21e4fc43f9bec1484b037c6f1e2aaa9700a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset b/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset index 805d757..8d169b2 100644 --- a/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset +++ b/Assets/SerializedUdonPrograms/bbb37b8d4f56ee5408fb40baaca6168c.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d057c1547d7f0e7e2dae24e811609451292e0ee0482074a154902a410a0095068a97b4bdd9dbaeb5377777beaee2e4fddeddb999dc93d3b9973b39bdd73339bf7831fec5d3b7bce7fceb8d5c964ce9f447fe7bf856c1e9bc806b205ac88ad656b9c5f139d63a9f3d73d53d7e7b032e7b8c2f97fa973af3feb5ec59bfc4f9f4407e7ff3ce7ac9cad77dedcc00a9d6389b83f9f153bbff39c778b9d337e75b9f3afd8792a51cf7969019bc466b359ac7da26d1522168a97cae5b504b72bd1c8f97f02dbecdc2d164af18f648a5bed9dffe63b77cac5bd524769f5dcee6c4f6156a973afd079a78cad76642e13121bcd59c4c40fe61efac9637f79dcd9f9d758feae2b7f3792bfe1f3fc3ab76e8f14cf0e00cf2a99039d7ff59d7fbfc9f34cf7bceedbf23ccb3d4fb4d16434013206c963b63ce6c863aef3af016375eafbd03fd5bdc1ae0ef32f95e7dda4dc06f2bcbb76de591edf023abee5f2491c2dcfbbc8e310709fcb68e87dbe4e0b793e547baf977cbe913c7f479e3706f7d5757e7c57de6f22cf87c9e370701f326b2acfbbcae3dbc096b7a56e05f27c07cd96b7355bd4f32a4c876aeff5a9c2963e55d832421e4756614b75c37f941bfe75948f2a1f6ccafcc50da5e7e82a9e4f2543d93026848c666e38f0685a651c6d06be33d6b59fa9f0d9591edf03cfbc278ff524f366daf5faf27a73ed7a03e47a43e47a23edfa38797c1fe8f2bef6ce07f29dedc0b9a367fdbf34191fcae7b6073a4379ea7e0bedbd8fe4f596c026f8de47c87b1f6bef35d4defb1879ef13edbd46da7b9f68efa9eb39e09cdf6fe5da58ef11797dbc7bde2083858b2f13e5f133f99dd6e09c1f3f95d7db8073273c1a6c95dfbf475e9f248f9f6b723eaf428eb2d7a4e314e6cd5f26686cbf605e5ff9c295d930c37dafe11296f4737efc523edf5693f7a526af9d575ea32df27c9a7b4cd491cfb597d7a77af5aab8df42bb9f03be0befcb30486c27af7700e7fcd818f95e7fedbefebd3c1036f0fe74ef7389ede5fd8eda79a71461a3c7e9afe43b9dc1b9c3aef11d55b09b51053b753f2a764a1ec64eddc7d8e57b9fab163b656b0b964c07958f2a9ffc9f94d3053cabaef3e35fccebfb7fb9329a2e61def450c9fb5a3edf159c03b98996defb09995e255a011d15ebd6c96be2bebac68f75a59c1dc039d74bc5fb069a5edf697a7da7e9a5fca11b3807e94dc5f7ba6bdf53652603ff0a9639e01ca4b18d9f91f7670663e9d4142ab1722a2cc96bf3e4712eb8a6647f03ae411f68ec3e3348c61fa72ee21ebf05cf7fa3f9c6b7ccebb3f383b1f7d8a1d27568872a4b423b94ecef0d76fc90c28e1fc1f3df83e7d53d68c702796ca8c9ff49b3e327831d0b7ddaa164ff6cb0e3971476fc0a9eff193cafee413b7691c7469afcdf343b5419b63a7628d9bf1becf823851d7f82e77f07cfab7bd08ec9cc9b16b506e74e1cdcee7dedb9bf9937fffd9b79e261859c765e39db5f8984fb3f1a2ffdfebfdafd7fdd23ff09f510e7303d90fe5ca787a6ff38664c93841eea3d787f47effb1569154c2b1dfb5a34d29eaba7e9a7f286fe9a9c769a9c17cc7e9550e5f9aec8fd06defb091997130d353d145fc54995ef754eeabeca5bbb013dd47bf0bee2a4e5818926cc9b0736d1e43765c974dbf4bebabf93bcbe0879ae99f69d66da779a6b762affda9525f341551eda8d55c4ad96aaac5eddb2b96c9f116d4fd06f5478b4619e32b538776c6b25cbbfad94bd7bcafbed3439edaa90b325858e7b316fd97c77e68d23ed99a77c22ceb9cc47a46eaa3e27c34234d1c1b46177701dca6be795d746deaf285f0e64def2de624d2f75bf85763f077c17de576190c9bce5cb4c79cc42bed75fbbaf7f4f952ff7d4ee2ff13e9718c4bce54b751ea06c9ee8c83c657371eeb06babf20d8cddd22ad8a9fb51b153f23076ea3ec66e99f7b96ab12bf4fa1f2b66c9fc50b5972e07d764dc622b5845bccf55e5c122f9dd4ec9e713eadb2be57967a9534f70cec346e5fd261d4be451951d555ce9c2bce9b86a7f5c65f8fe6a60832a9796826b2aadee0aaea9efec90b4355bb591ee2def7503dfea0a9e57f76078ad91c7069afcee9a1ddd7ddaa1fc19daa1f2b21e063b764c61c74ee05b3dc0f3ea1eb463ad3c36d4e4f7d4ece819c20e293bd1cb6047ef1476f401dfea059e57f7a01debe4b191263f43b343b53955c70e95f7f735d8a1fa2f4c76f403dfea0b9e57f7a01df534b9fd99377f57fd252a7f1fc0bcf9bbfebebaafca11fb78efb3320387f2a42d1d557db2bae500a5cf06f98d6ca94f2f70ee3cd3a97f0a59ebe5719c7c278779f3e71c29a3c8d5b9d379de6f2754fb7c5baf3c711dca6be795d7f924f9bcca6386336f9abf115c877287c9e77a6be78aafd27bb0bcde079cf3ef6ef13ec736c9e3bef2f90cedfe66ed3bfafdfde4f5be2918ebf9aed2ada7a69bca1ff6d7c2664bd267ba9e258f5b34d9ca678768b287b8b2bba8fadc019aec0393b27b774764ab7c77a8267ba894adfad40ed2641f9c94dde36d4d3616ee8778bf8d86ffcedab91efe23b4f01fe1eadab526c25fc5572dac98aa3fe8f514a9636224f3a44f15fe338a25d39551e0597e1ccdbcf177b42bb7c73629a3bef68db1cc9b868fd5e48ed3ee2b1d401f96f8cd8fe335e6e3dd6fefb0cdfdee0eaaeca2c27ea216f68782eb50c729cc1be7d57927e95b2a0c95cd13343d264806dde5738779795684438b2af453efe568f75b68f7557abbc57b5f31ad785fb521b7d2decfd3eeebf20fd7fc43c957e1309979cbd5aafd4071d3ed3942bbafbea7ca5f2a1ca66abea0fa0994af4c63def60f25ff48edbe927f94f7b9441ef394cb03c7d13ce4be1e4775bba66b764dd7ec9ae1b5ab82f30cafdc4ae13b0a842f4ffb54fa8ea5033de4791469c8c152877c664e4366b264fc9d099ee5c759cc9b86cc72e5f6fa58caa8af7d638ec66f8e2677ae767fae3c82f64bf19b1fe7316fdc9de77e7bc78fddefeea418ab385aa0f9f4a1e03ad47117e64d43d4b94c437aa9fe4a65f37c4d8ff99281acbb31550e1da785839e86e8faa9f772b4fb2db4fb2a0d39d87b5f31ad787f8116feeafd3cedbe2e5fa521f99a7c150e0b99370d59a871d3ed3942bbafa7212a1c1669beb048f3955d99370d51f28fd4eeeb69887c2eb11b0b9786ec86dcc7d21065976ae3e80acea15d7b78edaae0bc87576ea5f09d09c2d7f1d31db380bf51a721074a1d547b8a9e86ecc592f1772ff02c3f2e66de3464b12b7767c5b5bef68da51abfa59adc65da7dd9a69358027458228f85cc1b770bdd6ff791ed9f7d649855c4d162664e438a351d57326f1aa2ce651ac28ba49e34a448d3a3c8d5a3afeab738c6cb134d4374fdd47b39dafd16da7d95861ce8bdaf9856bcbf5c0b7ff57e9e765f97afd210adbdad221c56306f1ab242e3a6db7384765f4f4354389468be50a2f9cadecc9b8628f9476af7f534443e9758c5c2a521ab90fb581aa2ec5aadd9b55ab3abd46b5705e752afdc4ae1bb17085f5ecf53f5b3306988def6b08679db1ed6b8cfec7c650a59c7328fff27d6326f9ab156ca78dfd5bb5f07efb713eb98b7ede158701dca6be795d76f2bf3c6af7d347fdc08ae43b965cc1bffd5b99f36772cad55b6ab7621c8567d773df3a4bfe259759d1f3768dc36b83206a9feaafa9a3ce5bf5dc13994bb49bb2ffd3eb111e8d85093b99ff6ce7e9acccd5edfadf09b7d9232139bc1357edc5fbed30f9c3b760d68e47d5ef57da3cf0f03fac3f78e63de78da40b3698b66d316cda632af4d4a3e93fe953840f3cfe3e551a5732a5d6e05ced57bfc7890e6bf07b9f60c2cf03e57d13e73b07c1e9ef3e321f27a734dbf43343d0778af8be71a7bdf5136085b611aaa6ccb01e7d0cff5f737877c7f4bc8f7cb42be5f1eecfd8aeff5ade2f91e557caf6b35df2f0bf9fe9690ef6f0ef9fe46effb2a0e56e4718a8fcce3fa3d20ef87c9e3c649d987b1643c50e5f6c3a59cd6e0dc899bd9f5b4e70e639e3420a1b7211da1f9d95c709d1f0f95f7076a720fd5e40f70edceeee99553f11d4d8e7a9fcdd1e4646af76701db838e555fad713c9279f3a92325b307a4eeaa7d7095bc7f94979d9297384a93d7ce2b2f27cb2b47f415a5b2417def182d4c8f71e5e51ead3d779c572f710e591fabf95829b8ce8f476b61aaf41c07ee8373a6ca8559e01ccadbaa71dd2af53e580b07a59f9e361dabc93d41d37f15780feaa73f2fe7f9e4aa325fa9c12ee883b02fafba3ea6facb4f0432d4f74e6295cb54b24e97389979cb542781ebfc788ac6f41457c6901ba59cfa9abcd398377d3a4d937bba76ff74793c03e8b85c5e3b33794ddc57d7f8f15429670770cef55263101a687a9da57df72c4dafb399b70c73b67c7f85f6bdeedaf78ed6e428fef5938cd4bd0abf3b8979d2e8c16dc0bbfcb9a2107e70820c9314e37b2b9e55f3634e0cf13de9274cd9784ad2fea197fa78ff544ddf53248b7398370d3ac7e53d54b67f0e4d35fe43c5e77381ff9cebbe3f2c5ffbce79f23b83c0b97a9e5f6fa3bdbf2ec57755bd6c9c7ce77c29a32738e7325e97cf9de6d5859d9e643771758aef9ca1bd07e24945989e959435feaf14b254389c238fcaefcf4dbe3f3c952eeafdf3b4703c57da7c81168e17b80c865f2b653fe0231c2f04e178a1fbfe8836da77b669e1b80d3c0fc351bd9f2a7ee8e17891168e174919f21bec7caf2eec8224bb29a9be73a1f6de3643385e949435e9091fe1d0cad56d6433f79d9172fc01bb441e2f66a9e37a7b9fcfa5d2e172cd172e93dc2e961cb3c1393f5e22afabb26937709d9f5f2aefe756539fab357d64be9c50725b837387dda869eef3a3545c577a5c51051325f73229773038e7c7cbe5f521e09cbf77953cbf42de1faabda7ae0fd3ae5f09f45165bfab98b7ac384e5ebf3af9acf8ad9ee5c76b98378fbfc6e530e64a4db67aef5ae6cd4baf95c7ebe4f5e1e0dc91335a8ed518bdcd3d8e39587b4fd973bd7c7f043887f76f90f74782737ebc515e57fd9437c9f3d11adf9be4f1668df38de03a3ffe47de1f03ceeb25f5ae889b55f883e25591ef5fcd3cf9fe6895cef8f5af543e2e59b16b812f2a59d7010e322d19d5087c931faf09f1ed1b99377ea9b62d155e63ab29f7664d6e7779bc29a4dc5b107d55b88faba6dc5b6538dfc2bce90a3f77fc679c9aeba7c23d477bbea7f7f9f16a7cbaca076f65debcec5629f737d79ef12d343dd4f383bccf57c8bdcdfbbca71ca17cd2548ed851ca1def83c9edf2dbb7694c6e93baa8391977789f37e6a141be7b27b049c50b659beacfb82ef98d316a4c824cfb26e4bbd727f6f7ca49dccebc7998b2ef0e66cec3a45d893b99270f13e7fc3bcafebb347d4df69fe5be3351f9cfddda3bf7001b551a756f52ce54d5df61e2769f26cb6f59b41f789edb7597c647da95b85be3d31d5ce7c77be4fd09da7bf7225cef95c7fb34aef7b98c26c9f2cfa46b3579f76bf294de0fc8eb13b5efdcafdd9fe4bdcf7662deb4483e5fd166712c0813f92dd1de2ed9eeacc651a462fb803c6e63d5f2e5c9bf79df4f3ca885d183f2f810c2fa21797c5863fdb094bfc9fdee643526f6414d5f932f5d24df5563691ed2de81beacd222bfbefcb026cb6f79bc1f789edbf788c649ce574a3ccaccbefca83c3ec6bcbeacde7b1ce1fbb83c3ea1f17dc26534759126e74944ce93f2f894f7fba8afaaf9574a0ef455c920b0afcaf14389a735764fcbe33308bbe7c0b7ef95762bdf50f9e4b320fc954fafd4eea9dffcf8bcf75be21b4a07785fcdcbebe17e779a2cff4f93fdfa1569690fa0a30c6bf6983caabecf20ebb45c6290ab78bca08595bafe5f797d0af3a433899781fd2f0319fcf812f396ef5f72edcc6f0364c2f75e91c757e57b53c1b9f3de8cafb5e75e93cfa9b1d5aaffec75a0d36bf2f80612fe6fc8e39bf2a8d610ca03e7fcdb976acfbdebfd7642ad97a3b8bc27ef77d6f4785f5e9f0ecef951add7d31a9c83efb2c7bdcf074a8bf97b1f0026724d97c487e0da87eef7a6bf0e9e479e99a1da409ed074d2d3dbfa809bfae647cc5b96fc48ca2cd0be8b3da7dafb9ed4beada7b5e0dbcadf3d7ef1bae6532a7cd4ba4bba9fbcad85934a63a5ef56a4152f334f5d6bda6f9a9c1799277e8973e8372ace7406e73cce9ce5f5714fdc7d4a1ec3a4094fbbface54fd7e3b697a7da2e9f589abd7cc5ceff3894fe5736abd8e2ee03a3f7e2cef3792df9ba63df731b04bcdcf190eee05b54bf5c7a9f10e6a3d9d5ee09cdbf188d4e72fef7b89cfe5f3aafd36035c87f2da79e5cd527e390ebca7ec52f9a65a9b652c3887ccd5ba383dc13997adf2870d4057e9fbb3cef37e43dc83e9b6ce43ad99d10b9c43fd4d6c950cc5e20b4ddfa9cca3efec2bb5e7be61deb453ae9391506bab4c07e750c7d65e1d955cf6acf7794f7ba6caeb2e4a32aa68cf54e34e72c0b98abb55f9d573aeac39aaad4ecd41546b7728ffdf015ce747b506886a07795e1e4782fb417dbcb716a6df6b61fabdcb6bce9552e7f7bdef257e60deb6bbbee03a94d7ce2b6f9e1ae33d0ebca7d257b566c678700e7d5bad0dd2139c3b32e72ef1da227494e136af0533dbabd6f1e805ceb92cd9fe37f705ef7b899fbdf6267ef6ea58216fa626ef37ef73421e7f6e96a697ba3e3b98be153c4d61ad64a8b0516bb0cc01e7906b6b70eec89e5f4f7b4e31c806e7fcf80b3397f17fd174cf05e7f0bb6db4efaa74f305eff77db7f9487b2be2685fe63f8ea6ba27cb9e4ce5bf6a0d06356ea385abff42d5afabd65dfa43e3fb87fb5c811a1ba0c218aed7d21a5c8332fa81737e046bc288df5cee7aaf8c8ab176bf6b32e4f30b541bcd4b9ade7f017d5499659c3caa752c76d4ae4f00faa8f09858d92eb116912e7b72322c1ba8b60ba58b5a1fa63538e7ba2b5b15c37f81dc36e01a94d10f9cf3e3df40e7bfa5dc3bbc322a18feadc9f85b0bf357bc7af3e5632af479b50a86705db4c6e07d9da1d2699241b68961557d70fc3b09f0cd84b44995a56439b78e5a0b67103857cf83785cf1fe7729be2ffbfe76d1d7976d0f6c527dcf8a17acf34b9d02d7f995bd7593b2c46fae8b9a4f24eb7775ea69f6d603cf437bd5fbef576def2235a645a55fd0de37353f80f6bee1d7defa09b1c6d03456cc96b2752c5304124f01fd2ecbacdeac7a4166e10fc243195f99997f763ddbecbc5a6c5a157981587379bd635db67155e48e62ad1ef5f589e2ffa5ce132542e8bc3a953e7167a54f70e5563b7f8bc192cee5cef5a9624568bea87389736720cb778efcad256c10dbddf9eb95b2d0f9ec6a2741296605ceffeb84bc258eda959facca24befcb3fece3c47a6bb3a75a97345015de79caf161ace17ff6f149a160bedf39c6bebc55ad96bd80a277158cb3689af55b6bdccf96dfa66814466d6d1bc483576dd5d0a5b05d324c71aae7da6f0f3ff1f2235112222399a27e361bd4c91c21c5b2924fe3f433791e19da97952c620812ce1b996cd32c538c179950806b7b1b28566ff76790f712a70a96c3193e1c1dd5958900ce1e2efb3b67c78d43f1deb7b4dcb61990db8695daa302d15582e2f43ac3616c484faf5eb65714575fc09137e314d657e1af1bbcf9588e78207400391f97903402c7556e0fcd8e4fc5b2d7cb54c6466ab9cf322b69b50aa585c2d713eba42a85e29b4b2b8e8860278e5ecb42aa531e4754cc845cb42418d783cb649426ae88d2aac4842cf1465a50e295c13fb96283cd595252815791a8f6bb676eba2cfce7b7d66eed09159c32faa6f0e9f26227caaf3552c84ea9a42a849ba2345d5b940aaf0695a6157327cf81f33c366888f57a50346b09e8960d39af171ae7bf57c9c4f7b19a03134f3db2ea50fa6d2002358df4450cc4d5c904682b31d0df79665c7ea31dcde37c3168261c74ad6f9d101a3d8c040318b536c6952abb1a616d70811dc1013dc2aa4e04698e0d6210537363954f37447497e6fad90b2d47936b83bf11a7f3f3d5933fb535b244e56ad02e64d4d4c61c311b6336aa5074e5b3c709a6292db8795dc0c93dc21ace4e6268712a306d25f72af5e1ec9d39af6bef3c84e2c55c13b680eb99d899ed87f650f527a951b94d4af09cebb2b1d0e1b452bc106e77d5303546aa29d7da7f65d04cdeeccd42c164c238cf0f626cfe7d8bb62c1ae3b7f27dcf95b60d16a87b0d1aaa54932b7a59b9f0ca00b2eb815a6727783ca89202ab73649e639640f66a899195137c4a5b7c1a4ef1885f4b698f49da290dece14cb85ef9492c6f205ce35b7d976b2b85b226abbc9d6c012b17d5e5945790a7b7e8e13ff368b8df80a9dff678a6df736087d52a7033d7da703bd443ac0db81e875c6528af658cce81d363277c0d2a03e86342811300dea68722e917ca4b7edc66d02e1728267c17cf446378dc3b3cf3c33daec2c7d19d614935a072ce03b99828713dc19534b0f9ebe78f074c6bcaa5fd8f4b60ba6767f83da8c6d1b1744edae98da03c246861d30b50746a0763753641059de52d2c8a04a23f3d92436c35171a0735cea3cbd14fc9a2424a9de97a58ea4cda024a3de4c1d51327da7a8592292f4622c42ddb008d4dd14a49cfa2093ba7a7066e1c1d903f3c2ecb05eb8239624e7449024ef8409cf3508670185f734b9b8287bed5ee32eaeba0f83baf560df6e3d44b875379f6e8deb83b9722f2c751a6a4c9d0c41972275ea6d0a3a51b05d96c6a09be0e85f2e64bad7e73812973adfe6f2c68b2fa8b21544a6de4a1d90c37c07e4701190bd2b056438edb060ed8305eb88088235038bee232388ee7d31e1a32210be33267c7404c2fb9984f3c6b331150f2785ffebfca924bc192ebc3fa6f95883e675026a3ec0249c673be358c832db408cc9780393834d6aa7609289099f60107e5240e15998f08906e1db020a1f644a18459dfc90b4248c558dc59aea58c6bf063b21d477dd2e64ae911a8c33cf392e175af0eb5c8baac770a54e562755f001ddaca255613248406bde0aae4d13d1f8644ef4a78844df2e9db12c23dbe4f0bc91874f91a8d424c4f392c5b211987f7f8db835c7f9020fcd3cd94811a4d128074be1a61952b8a025d45c5384130d206b6a34c2f1369c0da2e2ce7f6f94c15b20be9d1c6311262af1c9815d0d399bc8dd8c4e3b5d386db60fa78d427bcc1d0763e9ef0c43fadb33112cfd1d6212ce5d9a4f01085b3c1a8a099f69147ef0d820c2879984f39c639621c9cce249e6ec641aa57f670afe9de1586a30c7941a7430a60613d94a9182ad722ce71296897be5ced512273a05491b466056cfc5ac9e572dab476256cff79f0626ad1eef387c51203b47614e5f6072fabac19c7eb449382fe5f1a115a11a17c660921786953c1603b28b0948bd6040c69984f31c872f2610b636301ed37c5783e6cd1a04d37c02a6f96e11683ed1203c5334e997b09aeabdf1167f52f583a87ccf7faf0d6f46f25787e77dd419622b3f3a5db1fc709229c87952b2a749fd0069ce6453708b4e96740eb982c34aab37e46a2fdfc1b89899875cf9d1010b9e2958745f6288eedf058cee534dc2f9f34b99a19e24ba77aa37a04cec9c528fb97f063a7f1a56ce3e530cb69a66d293a7ee85063d4536cda712d51181522c0265608ab865aa1a058f5d418a03795832bbdc90ccd60d98cc4ec722345f4eb7525983174c4d00bab3fd59163bc039babecb8779f3df6b9dffb9f12b648b308f97ddc57092f56c80735ceefc5f268682f141e0dd9d7faaf8ce250e1212978b985b2ade73078c73b4fc7eb6737f8473cc718e3d02a5363330575e6972118eaf249c4fe66398f736615e1209e6eac3eccef615c5e3d52250568a002a92896b77317fa64834f5f3bbeefbeb84dc15428b72e76fb0e09889255bab0cc9d64f4d83255bb30cc23345ff703a87ca8d779e2a134deac1f394d5bef39452661e2697faeb586e32db142c9cdc1a93427a9094e24132c71424a2633d9d8327f4143c58a0acf51d28eb9879e04455dfc78265ae899e183930378df4fccc3f3393dbc737b93241ae6d25ab524ed142a8cd333933a726f631d2d4d9c3948b96e10e3d1f4bc0d61b12b07b9a054bc00a30cd3718346f1850f30598e61b0d9a1fde3c98e60bb15c6f5f53aec74caaa7c83576c154df64503d7fbb60aa2fc2846f3608bfb26530e1bb9a84f3121ddf832a6cc579374cf8fe1108df1d13be2502e17b9884f32aff01a6144317bc072e784fcc0f0ff42338850bee8579c941062fd9da2a98972c3609e7cf1fcc90422aefb60b51485d82613ad4145d79b92a682195674636d6079662a80fc3501f1e0ef5320cf51126d4cb22431d9f3a41a189108f5a471aa2d6b6b6c1a25611968c1d154132568c093f3a02e1cbb134f2989069e40acc238f0d9946aec4701c67c0611c9092024709e6255b4d0970bb605eb2b74938afff1cef07498afacf2a4cf0092105afc6589f1881eb959a84f372e8497eb44e51065d8305e2c986402c681f2c10d762c24f3108efd22198f07598f0530dc23f0e287c1f4cf86906e137760c26bc0cf394d323f094724cf81911085f8f093f3302e11b4cc279cbc4597e7c7c1d2e78a349304f35f9364e95327cde791f34c35fcfe0721ac14a55c1b2e67d315bce31d9c26f74f77c35c8b73661df3ad7f42d3eaa77b1f337cbf95758a9138cdfe1ab6a9509b241b4d88c69719e498b56408b5259f8592ad8575f83fd300dce3769d00468b0d8a9289789ae8960f9f6fe58f27381296deb1c2cf9d98245e20b2388c407609a6f33683eae4b30cd0fc434bf2802cd0fc234bfd8a0f97901353f18d3fc9208343f04f3cf4b4dfec9479eee2ed3b23d9db46177990e8d90950ef7da22711cc0c638ff4f066956a110b4daf9c52725ae73aead14e9cb26d188592cae16054cd30ec5f4bfcca43f1fa193d4480d83ef5e61d30869cf9e868e1937cdd62b50a5e28972d9efeb56c55cfbca99db20bb59bc19c4a6c34c367107b9bce28656ab15fb973564ee9f81ee9f6015dbc33127bbd2e064f5023ad91198f0ab0cc2eb07147e2426fc6a83f00601851f85b9d73526f7eae92b7ab8f5f24ce7982bafb951657f36583e3bc439067198a33187b9167398eb423bcc31d837afc7be7943e86f1e8b05f58d11a484c79984f32224df0c2d4c11722b46ea668c94d826ad3e24158cd3f118a75b22e074824938cfeb6e6595f3ba7a4383e575279a84f3b1807c37b35063014f3248ce14b36b97309b6693556f26d9ed261f35f6cdf125a233444a15956658cfddc998a3dc697094a3033aca2926e13c38eff2135befc0059f8a697db741eb5b026a7d1a26fc1e83f0478605137e3a86e4de9048cec0b4becfa0758be1c1b43e13d3fafe905a9f8525250f844d4acec6547e30a4cae760a01f32809e1310f4b998d60f87d4fa3c4ceb470c5a6f09a8f5f998f0470dc2b78e0826fc020cc96321915c8869fdb841ebd7036abd0dd3fa89905a5f84c59827c3c6988b31c94f85957c0926f9e9b0922fc5243f1356f26558003e1b32002f3709e66ef79cc1ed8e1e19ccedaec0783c1f96c795188f1742f2b8ca2498cfbbe17ba2849da8753506fb4503ec0ea382c1be0683fd5258d8d79a2473d82f87847d1d06fb9508605f6f12ce61bf6a80dd736c30d8379884f3ea12dfae236c75e9464cf3d70d9a6f0aa8f94d98e66f44a0f9cd98e66f1a347f21a0e6ff3109e7ebb2bce5c70d87e0826fc1b47edba075c6b8605adf8a459e7742469edb30addf3568bd687c30ad6fc7b47e2fa4d677605abf6ff290805adf8909ffc0203c774230e17761c23f34691e50f8dd98f08f0cc23b4c0c26fc1e2c303f0e1998f79a04f32ce7131632cbb90fe3f1a981c79c803ceec7847f66107eeda460c21fc0847f6e10cee7c20511fe2026fc0b83f0f3020a7f0813fea541f8c701853f8c09ffca20bccb9460c21fc1847f6d4a0aa70613fea8493877dd6f2a6e6873ccf8569bc1a7823f66fa0e6ffbe6bb5efa9c003fdb39ce146d8a256cbd68e75b0046eb05e91f781c43fa9d01e9d6e9c1903e8109ffde20bcd98c60c29fc484ff60107e7440e14f61cef023e60c3f55cb199ec68cf8d960c423f9c18c780633e217cc885fab65c4b39811bf198cb8727630239ec384ff6e10fe5340e1cf6384fec008fd592d422f6046fc6530227f7e3023fe8b19f1376604df27d29d1ccb77924c3df1bc408e332a67cb4542534a3c35f64593357c48a2d89d52b7c6dd9082db9099c2067dc9e3ea2e771c6000e44b5888f3cd242b15f416040bf1974dc2f9c4ecba0646996229d7ea4d4aafe7c86b2066f1387f4c3d8d8b71255fc108d43710d863613002af62041a98bc84136818c294d74c5fe305eb46897005ebd731468d0d8cf27709c6e80d4ceb2621b57e13d3baa941eb518b8269fd964938af6b344b84ac6bbc8d496e1e56f23b26c9bc7d6bbb44f8f6ad7731e1db4720fc3d9370de4ad42211be95e87d4c78cb08847f808566abb0a1f9a1417266777e910ff2b761999aaa96ec0fbe544d6b5392601c24d0c6576e1b5e5f6ce8c04758cadfd64faa962291ff1813dc2ea4e04f30c1ed430afe148b021dc24681cf30c91dc34afe1c93dc29ace42f30c99dc34afe124bc7ba44908e7d85a9dd35acda5f9b24f3746c073f7ec7e33922f81b93609ea577f32338c5e0b4ff61a0bb4700fa5b0c478f9038bec3e2f78e21e3f7f718e79d4272fe01e3dc3302ce3f62387a85c4f11326b87748c13f639cfb84e4fc8b49b0bbb76578cebf6238fa86c4f11b2678e790827fc738f70bc9f90f9360ceb97f049cffc4700c0889e32f93609ef20f0c9bf2ff8df1c88c80c73f188fac903cfec5040f0a2938d972a4e1c88e004702139e1381f03a26e1bc353fd70f9214cdfe754d82b9ef0d0eeb7bf5301e4322e051df249cbbc8d0902ed200133c2ca4e086188ee111e06884091f1181f0c698ef8d0ce97b4d30ad4745a075534cf8e8088437c3848f894078734cf8d808846f67109ed9c3394df01511d2dfa611c5929ba95b34c6f9f1d2629cd8f698fb8f0fe9fe2db0709e104138b73409e77dc813fd689d622d91562607127b7f2daf1107a2739c49be9bc2268ba630bef50f85965803586b5310f39098e2278827e3f5d8365899606ad832415b4cf2b4b092db6192f3c24a6e8f499e1e5672072c0198114102d011533b3facda9d30b56746a076674ced5961d5ee6292dcdd399d1db2d9a7ab4930afcdce09599bdd01033d3702d0dd301cf342e2e88e95a0e7872c41f7c0381784e4bc23c67941049c77c2702c0c89a32726789790827b619c1785e4dc1be3bc6b049cfb6038760b89230313bc7b48c17d31ce7b84e4bc33c679cf0838f7c370ec1512477f4cebc511683d0013be2402e103b11ac2d29035844c93605e595b16b24e9385695c1852e34198e0a29082b3b1724171d872410e26797958c9b998d3ad88c0e906636aaf0cabf6104c724958c94331c97b87953c0cf3bb5521fd6e3826787548c1233016a561598cc4dc6e4d046e370a13be3602e1a33126ebc232196392bcbd73ba8f9f60ec820b1e8b15a3cb4216a3c7610d38e5211b70c66390d787853c0193bc21ace489582cdc1832164ec2dc79df08dc7932967d6f0a997d4fc1706c0e89632a56b8db2f64e16e1aa6f1fe2135cec3046f0929783a86e280902866601a1f1852e37ccc970f8ac0976762c20f8e40f82c2ce138246cc2311b4bf70f0d99eecfc1d2fdc342a6fb73b174fff090e9fe3c0cf2116121cfc7241f1956720116578e0a19571660ee7c7404eebc104bf78f0999eeef82e13836248e455862775cc8c46e574ce3ad2135de0d137c7c48c1bb63284e0889620f4ce313436abc27e6cb2745e0cb7b61c24f8e40f8622ce138256cc2b1044bf74f0d99ee2fc5d2fdd342a6fbcbb074fff490e97e2106f98cb0908b30c96786955c8cc595b342c695e5983b9f1d813bafc0d2fd7342a6fb2b311ce786c451822576e7854cecf6c6343e3fa4c6ab30c1178414bc1a4371614814a598c6db426abc068b7e17858d7e6b31c9178795bc0e8b7f974410fff6c1485f1a92741926f8b29082cb311c974780633d26fc8a08846fc05ce4cab02eb211cbbaaf0a9975ef8b65dd5787ccba376159f73521b3eecd98df5d1bd2eff6c312bbeb422676fb636e717d58b7d882a97c4348950fc0a2c98d1144930331e1374520fc200cf6cd61611f8ca9fd9f08d43ec4249cf77bdfe2272453f47b1f6a12ccb7debad58fe0145b6f1d86e1b82d021c8763a1787bd8503c0253fb8e08d43e1253fbceb06a1f85a97d57046a1f8df9c8dd217de4188cc73d61791c8bf1b837021ec761c2ef8b40f8568cc9fd61991c8fa9fd40046a9f80097f3002e12762c21f8a40f84998f08723107e3226fc9108849f82b9caa3615de5544cf26361259f8615281f0f59a03c1d2b503e11b240798649301f32fea41fc129868c9f89097e2aa4e0b3b062dfd3218b7d676365eb674296adcfc1fcedd9b0fe762e26f9b9b092cfc3243f1f56f2f998e417c24abe0093fcdfb0922fc424bf1856f2364cf24b61255f84497e39ace48bb164ff950892fd4b0cc23377724e133c154bd78e3b39ceaf498caf99b914fc2a70de58c5f8c235faae363955cc1c7a35c15760f392c9ecc9adea2eae85fb764b217931e3b387d689d034cf4a7a2dc1672545f1456c06d2a598d3bd1ed6e92e33f9452f4e7005a95f60f3b2163277ee160fdf9c88e799bd61f296dedcd67e0c9f51164e23ee15e03fc483de141e44a705e657979bfc8aaf74f65622fc4a675760c2df8e40f89526e1dc6fdf310472566f4f20c890d0bff6265e38ba0a4b9adf8d2069be1a13fe5e04c2afc1528ef7c3a61cd79a528e3e3c36d5dca26de1971c4d9d827ce0a7c89ac0fde83a2c343e0c1b1ad763f1e1238af87003f6b58f29be762396907c124142721326fcd30884df8c09ff2c02e1ffc19ce9f3b0ce740b26f98bb0926fc5247f1956f26d98e4afc24abe1d4b9fbf8e207dbec3249c97cbbf31c5245eb435944af5efbd86c7a53b314cff0b8be92e0cd3b71160ba1bc3f41d0da67b304cdf87c5742f66c90f3496dc8759f263584beec72cf989c69207b0effd4cf3bd073187fe2502877e0833e6571a631ec6dce0b7b06ef00886e9f708303d8a61fa8306d36318a63fc3627a1cb3e42f1a4b9ec02cf93bac254f6296fc4363c9539825ff86b5e469cc75599df0aefb0c8629518704d3b39831752230e63993f056ce69dd3a3e6a4459b8e0e7314af56828bd8051aa1f01a5ff9a84f37df41af8a194621fbd1731ad1b46a0f54b58fc6a542764fc7a1953bb71046abf82794e131acf7915c3d4342ca6d7304ccd22c0f43aa676f3b06abf8105c0763401f026f6bded69bef71646ae4558726f6396b4a4b1e41dcc9256612d791773ddd611b8ee7b98da6dc2aafdbe4932dfa8a5ad9f843ac5462d1f602ab70babf28798e4f661257f8449ee1056f2c758f357c73ae19bbf3ec1d4ee1456ed4f31b53b47a0f66798da5dc2aafd391617bb461017bfc092ac1d6892ac2f314cddc262fa0ac3d43d024c5f636af708abf63798da3b46a0f6ffb0f470a790e9e1b75854ea194154fa0e13de2b02e1df6321d93b6c48fe8085649f0842f2472c24334286e44f188fbe6179fc8cf1d839021ebf60e9563f9a74eb570c53ffb0987ec3300d8800d3ef98da03c3aafd07263933ace43f4d92f978c12c3fae9e6260e15f26c17c54e8203f82538c0afd1b63911d96c53f98e49cb092ffc528e786a4ccdbd88c940787a49c3009e62c8684655107933c34ace4ba98e4616125d7c3240f0f2bb9be49320ff011750cdb6a6f656a78dc0256240676b883404ac5efe476dbcb9d57dc412079154f4e661b99bbafdd3c562cee96882b656ca093502f16c347d638cf4e743ec5076d70b9c9772639c7d58ed4cdceb1884d11bbeb968a2fb8ef26077ac00d5abd775cfd721c0b17a7b0820f32d9c0f896aec9af1788412f4aa657ea42e72d3e5c2548b46980511f69a23eba82ba1a62a88621268f2562605989b060a963ff6649550d375b2cff069713c4ae86985da34c764d654c0b3997301fc2e36abfd6c9bc17b3a962d8ce52e95b056c25e33b2b570ef7e4dba9ee78eff161496bc51d2e3388ad8d305b479b6c9de8d3d64922569488614d6b23b312de0b626363ccc631261bf1a18ff304dd2211cb5c6b573857d73bc78d15af47a573134ce7b1269df37c86cb4c31b48cc78c7562785aa1f0471bc2a82966ef3893bd27589282cf1712d68ae783a4e15e82359b8a37c3c88f37911fa2795a32371aefd85a26c8544eb3b1fc0bbb939415c492e69825134c960cd32c81db7584b7c52c2d8835db61d64c3459331e0d1718fff3455c2847731f688f3f3bab9ff36c8fd937c964df343455aebce370f5422fb8f420d6b6c0ac9d8c9595fcfae67c9907f90b4928298ad4a32566d7143f710ea690e1e39c595a106b5a61d64c355933d6579c1bef102d129e65ce6783c7b9e49d20b6b5c66c9b66b26d84565a9fe0dc2a776e2c1076ac96f6b803e4b97e79ce2ff775ee41a952c3e8529036984579268bc668a1e5fd2e0cb10515b58659cedd1529ca485e19d159d616b36cbac9b25e9a657a4c52a5d47c9182ad707eaf8cc8a7da617ace30e939c3577c31d793663bbf27b37d1c415c5c4de65bed319bf34d36e31b84c138e10da735b2552055fa1644e30e98c6334d1a8f0a90d37af55ec12aefeb87e7aca65d008358d511b36a96bf9a6b92a56bc51491db940acff35f9237e7cc51855c27ccc6d9261b07a321c76b2dcb9c8794adf98ead2b9c27cac4c4a6ca796cd4a584ce981d734c764c0a914ed464cad005b372aec9ca2cdf35a9a95596f0a248cbbb62dacf33699f1da0841a54ffeaa6083b6016cc3759303f40caec7a5c32ff71dfc1d3366ffcf1f34c543ed80d6350e027145395c783866275d3bcee98050bfca41595d3753cecfcb6d5c03b5185530fccca85262b27f84a11e73b0f2f13da2e05eddf3555dfd811b370173f35de549e18acc69b2afcaa9397ed84d9b5c864d748dfa97c30abf0d0aa8e4d3d319b76ad7e5b5355312e9d39732fccbeddfca42941f203bc14455f1fee8d59b9bb9fda184589d8bfd5d5cd2dfa6036ef81796eb03c3f4fd478dcbe921296aa3e4313a619987d7b9aec2b66b4fd22ebd91c516358217bae178a769212e7ff65486f903f2f099f82f5c538ed65e2b4809813de7f949a50780e3b631c169b382caae134803a75e887d15862a231c56759324fc477bbca93fd314b979a2c9dec2b070fd25b9cae52e500ccce657e5a7df432d7446169e5d0832d397eae475b1a1b88d958e8a73456d9c6643b09d7933fc7bdabd0905e173077a0a95febaad7cb9289d95784b547a6b2cfcd97922ff82f85451b6a599855c526ab768fd833b1f817f4f968990cc2982c3731c9a9c895bd7d4eeeb53915e32eca1cabf8824dded6673eda88b76b161a7b08aa9fb2666336acc05a54aa6fc33a703fcfd08f56bd343307b360259637a41e5f975c36b0aa9232ee597ebf10c4ce5cccce12939df955da898f479c28aef0674a448a3ac311b839905dd1f9e760cceabdb11ef8e0fee9b6fdcd71342cd77ab2cd7521ef128141ac198259b3ca644d065a9ff36ae08d65a6d25af546ad0dc5b45d1d66f464552306d23b326f18666369f810298f3c448663daaec1fa60f0be4eb8849fd7838a457ae0d6792ba7d2d58fcb2330edd79ab49f1e50fb89ce95b58279b98ccd251575523f614611df476216af3359bc5720efaaaa55dc9fcd3545661446661facec143c252c776ab1654e3d6fa973c57d7783f098a862e368cc8632930dfd511b668afc73255baee93fd909e172311ea9aa743288d66330adcbfdf5409953f5aac65ea67be4ff58cccaf57ecab5414a4b2ab478aab4c1d80a56bd72ed38cc820d7e46b405b1c02dff248595fb28ebe58b1a49b01eecf198451b4d16e5862acb25ef461d2e13302bf6c5e6cf54375ce609e96b45eb6acd94be2762b66ec2468c06ab5b61a360f5d6528afad424ccb6cd26db16860847b7c41b2c04ab1bd6d569c7988c91d80f6bdba92e09536b969d4ca6604cf6f753ef0c9efaba756caa94772a66cd96d4fd4755e9e05a5020acd17391542d247e4392a780cb234ccfa6611c0ec0e6ca054bcf5459202fc2fc260fd3f94093ce45213c110fc7e8e368d4213b1da37410363a208ab2c504e798ba2553a757d59782d83c03b3f960ac0e0575745bf9dcbedd644c5e9bb23c9e6a3c5cf56a23f9980d876075a820291355d97c26a6f5a17e5ac6ccfd917efa5dd339aa681666e3617eda9babf2f3eacd87aade1782583d1bb3fa7093d57b46948e54cef7fd5b971e2e73302e4760630dc278839fd1b854a9ea5cccd22383b5ea60f3495cdb2adf2d97297055e1d3d0f99b4834757e4e16eff13c3bd9da59ce327923b568fb559b64a9b13d6a3b985279a6ae73c6a54e8d8ba713054cb5fc2637cdc2241c55c75d7057fce993e030d55a4e89e55a9a97dc36a618943ef8fcbaa9c2fe62316aa4d0395729b8beb1196685693c13bf6ab2ae6a9bd4b6347c567aa14891785abcccf18886d22225cb21cd5735ab75961ecd43b5b30cd53a997c8a17280907f3a6aab538867fadaed987da57220b471799747705cc62eedcab045fa26e31c0b646c45bb7a36fbdb8cea36d955f85ad11a6af0e1002d4e8922ac52d000999495c47e16a6ea34119739b559b39881ad6af93c543e3584a64db0b643c64602a3a5da62fbc3f280eb8568e4be23a8e125717816b31cb12ffeb9eb6c0f94a117307274d63eef22aab65869f1d0b901d7a27416eb513e4a058803ca96b12e4f1f4115881e44513aec20a99d5706471c0f57acb24ae1328713537a677bc376b794cb2862de393a84ea4cf4d9567415c5ce9dd6451360ec8d68d4c223b891219df9242b541e8c58e1259cfdf2f36b9ea49a010723225b6b6c648592044ac1040cb64e5272ee9d91e4393e84ea144d740a073474197c52405fb7a4812cea994705a0938c961b4714ec3be1e9184761a3d34b7d5a2408e335a25d22c6f0b561ca0b5189784763a25b4f6685e19e754ec3c908a9d4189af9d6f7c9b6253852f1a9e8477a69d55a99c58807cb94712e45994203bb264e96da6c81ab8afadad10611e65140784778c4d223c3bfd2d7013d94a61ff2aa9561c90bd3d3b89ec1ceab44f791d9edfc6cbdf96007f3b97baf5030ec28867452b1f54b4cea3c4d55444cfc9a27f6283f87c9c1ac5791f97c2743e25a60e55a4623385d86532175dc9f894e23800bc363f09f002fa56365524e1637fe2d62039aa4112d58594a8b6f3a460e5200b7045c4015607504fd896fe8839db397acb6bb0d01b0780674d4b02bc88ba886bae68e9d321e3d63ec24625115e4c8970a76a21f4d663e313b53f1e93c47a0925d636cc4f1b707caaff3d45f5bf617d4db8be2a4bf5478f04a38d8f73e145680e769db8ba9eb93b4178c6bdf0e120d6697e291cb79291a2689be1735c48868fda4446802e9e8c2a8a41193efa6e3342759487793b27d4dbd9cedb7ad7444695659d8c803d4119d56877cd0894d264046e9accf0ddeb90e1b38735a39ab9764684595546e0668a8c6a36a765f8ee80c8f0317829a38a0eff8c6a1529b1b752d710b174486f1d4b0ef8340fd4cce2033e2ffb3f3e16338b8fc5bc9c43a82f29b865942b28cb283bc8f8e40ebd5dc35633ff1bad2c6643747dba54d2679e8c0425e27baa7c62d2acb1a704b3871f63ab538ae13b76aae2df95e9e8c458ed3cc4b1565e3b081b195e693c5874583b51617d0460bd8abec2ecf5587cbac86236ac729f507438db52e1ac5b2789f36a9b700e8a25cef6c03bafb10967762c718e0738afb509674e2c716e0038afb309676e2c719e0b705e6f13cec1b1c4f91f80f3069b700e8925cea700ce1b6dc239349638bf06386f4a774dc9ffa20243e9d0be962042fb28407b733a3c7505eaab0b3cf5a3c19415cf66549efa024be2fc8f4d38736389f34180f3169b700e8a25ce3500e7ad36e1cc8925ce9b01cedb6cc2991d4b9ca7019cb7a763d83606d31bd107c7b0a1ae03c8d5efb005654e2c519e0050de690bcaec58a25c0e50de650bcadc58a2fc1ca0bc9b7e8e23afdbf005b7d5064a5c61be44f126716f9de829e72fc40fe48120d3b9271d3d45781e8eed624cd853d4820aeb0c80f5de74ad23c0bd7085832b4d3eb98e0ade7100de7d94f05a007825b5264aaf06f8ee4fc74a0343b58edf3401bc830ae03600f001ea750720b8e49092e4088d8d62b00919c4be5410fb00880fd66461078a23cd4c1a52a16c0c0a3b0f514f6a582c20b99949daa2722915ba55c00b1fa61f07bd583ce26e6f876d6a47e8816554180b00c647d2e18159b5c6036703748fd66c3ae88a72170cce8a6196f20e40f9583a22f3204fa54fdd4e93479265277b028c8f5362ec0622739031c8fc9d32f17cfc0adf3700b84fd46c7d1a0a4c537d7a3115d65701d627d3918a62f9b8b73449988a9245ff6c80f2294a943b82e81f7c3a431a1201b2f11a5700c44f5322eec9bcc3aff9f629d5db8a85d093c9c66e7c01ea45cf50afbfb0d233556abc686aabb4386c0c5a261b01df7cb626a0c5b139b72180f65ccd663f712fc40f01289f4f47012968f188b46f91ac80b41f480b5fb0112be9400232ac3d01d6ff52626de29cb8d3e9bcb32dc990655121eb0e22f88b368dfd251db3465696cc061ef8924d3849075991e19c0770be6c134ed2218064380f07385fb10927e9785f329c17009cafda849374343a19cedb00ced76cc239249638df02385fb709e7d058e2fc15e07c83ba3b63bda7ddbd360d34e8c59218dfb4777214615b115903dbddc043dfa21e0853265e75b751af4dfed905f8e7dbb68cfa1d44e98f649d6b4d813fbe630bca9c58a23c0aa07cd71694d9b144990b50be670bcadc58a27c1aa07c3f1d233c789fa4fba25a38ad9815a56b840759c9f22c90e57c60e7a0fedc18f6021d06b07e68cf90d6e1311c84300d44f48f2851f2d99ade5ec8e43823326cdb5161ab073cf0e3740ced1f2446612c755428715894a72b65242b8c5f07007e4209b03163868c257e59497b00ec53eab9385823453e73d7b724c337840a5f4f80ef337b46ff0e8b61d4fd0e64199fa7635338bfab0d10e6bf646b0dcc077ef9854d30093d930ce64c00f34b9b60128eb820833916c0fcca26988435163298a300ccaf6d8249b8541819cc2900e63736c18ce36237e301ccffd9049370782a19cc4c00f35b9b60120e5025833910c0fcce2698842b5792c11c0c607e6f134cc2d67132987023c51fd201131b85ae8fbf208ce6640d1b0300cc1f6d8249980191c1bc04c0fcc98e69f684119c6c9afd8b00e3cfd48d6d70e191e43e4b932ba63bc7af53a135c0f74b3ac6a7c189cd5cddca9b89c57916e36880f3d774ec6e999cc5985c8a091fc012bfdeed13410be66fb60125ccc3c9807602407fa704ca274d7a7b11cb63d87f5d1f44e83fd23152d23bf37b8af443efa683790caebb16d7651f8a00da3fed599f80b001982c175f0850fe95dea101e515b978fc72eb6600dbdff6eea647d88841b69bde3290cdfc63d33ae7a47bed9035633c0d3cf55f9b7092ee044586f33e8093d5b50827e92e7a6438f702381336e124ddf68d0ce7d500671d9b70926e4a4886f30480b32e25cecebe737938c297347f9f9c20827a26c8dfebd90895b02d930cea19006a7d1ba112b62091416d0da036b0112a612b1219d456006a434aa8e1269012fa2bd904d23b00da4694683b316f8be752e18feeaa82b5abcdf35d80b43125d21d35a4fc7fbe5c63b16c753227070b6552c0c5e6d0227e93ca6baf07889b50220e36cf877098175963de7080b22925caaa7ad9bd284997822283f9184bc26c66134cc2a1b164300f05309bdb04338e6df6470198dbd90493b0e64406733f00737b9b6012d6edc9601e0260b6b009661c970edf0460b6b409661c77f5d90c60b6a284a9b6301cc26ae71686070390ad2941c2bdf694d434c1231b723817c06b53b3751d57943b4195707e10d904d54f415da76d3a22f4e05a1aa1b7009f6c4709522d5fa29a387803c6be9e8d686a53cbd1b1c03fdb5362e5cb5f14564cde9f221e9c2744b9abbbc56f704d67e0911d28d135971ec93fbc5cf8a4925d42b97c447d2a700c80eb489d37178a665fee77452212af168f1631e2f19abda8e0b503f03aa5b3a9773dfbbfb285cc2b204dec4c89b8a9214d7455895f6ad815f86517ea8c044f0d09a374132a747500baaed41d62bcee0cb7db2a60703da2e49c1ff80c1952b2dd9a4f02487748472a0967fdcc6495b7eca87d9b1ade0410774b4781dc4f879877cf1ec2865eb2cd657607994f771bb192b69f93616d00b0f648479306d64a19ffb510fa8188bf63ba87c6f89f544088966c52414be0a53ba5b39103cefbcd135354b1460ec2fe1eb2acea1b80b5673ac61b6369aa3ead7f582c27f627ea2471f6b20927699f0f19ceb6c03b7bdb84333b963847009c7d6cc299134b9c6b00ce0c9b70e6c612e7a900675f9b700e8e25ce6b00ce9d6dc2392496381f0338fbd98473682c717e0670f6a7c4a956661fae15e5d3d4e94bd68c770f4b021c60ef2c0cc2c59ec93a399e04be3990ba9303fa64b2f5337e15c91d813f66da347175702c57227e16e0ccb209676e2c71de0f700eb20927e96400329c850067b64d38736289f37a8033c7269cd9b1c47932c0995b936334bd119d708c265dae0e8a42836d4199134b94170394436c41991d4b94eb01caa1b6a0cc8d25ca1f00ca61e95821c15ddb702ae3233b0a18dcbf0a8e03294fc7f80fb25dacfe0332a0e1e9e8ab0cbe9f24615f25d97a9c4b01d611e9c00a472ecd616b8540ae76ed5ab7780cc03ad29ee9fb719c3d3910a4a6a3d231e18fef37e95d93b3f64c6b29077e393a5df3d4a077c6b979f835006f0c75fb3ab60f65d217e3e77d1900e0587b26fa110e30249be877394815c751a2dcc980327557c524e7d9e4ca473cba6fa61d1f974505f93900797c3a3ad4726a5987da9520c24fa004d895e90b45a51abb092765917a6682aa3bed5ae099136b727cb1b77c19c7a54e46021f9d948ef225ac0125b7baa91db33476063027a723c51c52cb52ccd301c0299400f5fd590a59d533ce09a3379947ee0952caa9b6018de3e8f6c300d069b6018de39a082301d03cdb80c6718fab7c0074ba6d40093b7fc980be0080ceb00d28e15a8564407f0340f3d3592f726bf1bca0b451b4b5a76a16214c4bc99a453e066067da0a96304d2503fb2d003b2b1d05fbc1b5ac607f264b029c4d09b08fe699a50c2e0f30c379840bafaa112fdf79c3aded132603649dc5ff05de3a271d3df041bb8a096b52645dc53f030f9e6b23d438f6bfff0ea0ceb3112a61f42783fa0d803adf46a884250032a8df03a8053642255c4e9f0c6a2f90512db0112ae1f83b32a87d01d4853642256c032083da1540ddc546a884ed0064507b00a88b6c843a2c86500f015077a584da8cc1613aee6baafe14bfc10edd40febe9b4d93b107514e78251b013a0478e1ee36e1cc8e25ce4280730f9b70e6c412e75680734f9b70e6c612e74500e75e36e11c1c4b9cf7019c8b6dc2392496383f023897d88473682c71fe0d702e4dc7941988b3f6ee787925c0ba2c1de3f0fc4d99c98ee5368dff02988536c18ce3368d6703984536c18ce3368d7f0298c536c18ce3d8e57d00cce536c18ce344c3320073854d30e3b84de32a0073a54d30e3b84d6329805992ee122706d33b9c81b09f886c91feb300d6bd6dc44ababe0d19d60c80751525d66e06ace6fad154f90aece6201d2f524c05772180bbda66b884c52932b89301dc529be112666264703301dc3536c3252c6e91c1dd0ec05d6b335cc2fa3f19dc1500ee3a4ab8bc4b7ca9f8b477bd072e4e0d2c27c34736749c2f76acf0ed43892fdc063e848d29641bf89c0e3cb32c1d25d8e01bf8c47146de5d006b392556bed56e72f7ec49ce7199c36205cb775e594107ae0b593604a2fa7a9b7a9a8651663c643d4df5c0ce471b6cc249bac23219ce8e205a6fb4092769b70819ce0900e7be36e1245db09a0ce7fe00e7269b7092ae4e4f86f33c8073b34d3849f74e20c3790bc0b99f4d3887c412e74b00e7fe36e11c1a4b9cdf039c5ba80becfa906f5e998ceb0e337c753f05ee8074d7cdfdef7844e893643b1edd0f7cf2404ab4fd195c6a551de1cadfee3acbee0acbbcc9831bb39b6cfc28109f5a2156244bf693c677e5e56b80471f94ee8531fdb636c14e3ec221906da87cfb34e0db07c70132e13c2632c8fb02c887c4013261af1419e4af417271681c2013b6a79241fe10403e2c0e900947069041ee02928bc3e3009970840019e46f81271f1107c884bd5a6490c7024f3e320e9009ab276490bb01c847c50132e1503832c84b01e4a3e3009970ae0b19e43900f2319490836d4d18c7853e9b0394c7da8292b43b870ce5f100e571b6a024ed682443b900a0dc6a0b4ad25e3132942f0294c7a763c050f05df4e2b88cd7312c89f58474e4f36a1c167f98bfbe8eadaf68505fe028c67377759ce0bcc8f733db285a7f37b032da0a2ed9e0a28dc0774f8c0364c20a2e19e42500f24971804cd8e848067936807c721c2013363a92411e03209f624ba981742d2bba5d7d00ca536d4149baf01219caab01cad36c4149ba241819ca0301cad3d381b29099f7404bdbf4a175542837b024ca332851b69228b9d779f7d84dd3fafe64533196038467d664c486e248bd916cba7b1d10b1cfa244d94b2b1e79f79b80c3932638d7cb59b1bc06c7d68c77de2aa12d8792ed49f13f00faecb88026f46832d0ef03d0e7c4053461f5950cf48f00f4b994a0f9fee6ab9ddb85625226c4375ba4c99b633874ae15c8c2ce4b47296050ad2b05ec01109e4f89b00d4b5d26559692a697655418e7018c17d46c61ca1515df8dbbde05282fa44e115d6f5ccef880e20d4285e406c7e5314c115b0078db6ab6bb040a4cd37840b215825e06582fa2c4da5662cd75fe25e759e7890ca7986d4a577643d604b21e80bcb8269b40bc954ec2a13a6495ce6500e5259428d5827559950a3fb5c72f7703302fa584d9c839e10ff3714e93e498a6f865334d00aecb6a361ac7bdb83314a0bc3c1d13da544d3b99bd4c64b5739ff2f700da2bd251180a5a14221ddd4456185a0d9a2caeb4112be9504632ac3b01ac57a53321e0436bf9febab577a5fecb00daabd331791daf152df0a4aa8329b3ac66549efa044857afb109676e2c71de05705e6b13ce41b1c4b90bc0799d4d38736289f34280f37a9b7092ae8c4e86f30080f3064a9c2d59b2d65e2616e92c715894a7aba64e565fba0a00bcd1a6856848d73e27abc9e780a2d14d36e1245da19f0ce77c80f3669b70e6c412e79100e77f6cc2991b4b9c17029cb7d88473702c71de0970de6a13ce21b1c4f90ec0799b4d3887c612e7ef00e7ede918d9c107c7b82faac5b98a5951baca9b743be5b224c63bd2d12c07bdd2ff827384f3e3c8169cbb1778e89d9468fbb0cabd48deb944bc0ba4d4f9cb7ff3d6cf0d4264722c4881a0968631cad3a9fc3817f8f15db6cce3206d6122eb576a02fcf66e5b5092b62e91a13c02a0bcc71694a42d4b6428070094f7da8292b4459e0ce58300e57d762e3a40b84c16d9a20347832ce87e7b661c112eb54936f86b0af0d007a807c9aa66e46251272a4d57919e6cf2e01ce0870f52d78c788912ceb698ee5c717bd68b3cd7c930924d5db915607c281da9a41ab0c03d6f45c5edda3699703388da0f5362ed614825dd45b4f948f8358ea7f25ad0ba949d708480c9bae0ea02bf7d843a1b72ab947c580d7fccbb76b9ab7a9c77caeb04503e6acf706ec2e15f64d13e1fa07ccca67ef6c1946b2d9045f2d701cec76dc2991b4b9c8f009c4fd88493747d1a329cfb009c4fda8493748d1a329c77009c4fd98493749d1a329ce7019c4fa7bbcbc3fffeb784d3fdc9a65bcf0585fb67ec1c3b4fe8b16463e7a702accfa6637e660eab9df333cb40d47fcea69474306574274b499f04389fb709676e2c71de0d70be6013ce41b1c4b908e0fcaf4d38736289f37280f3459b7066c712e74100e74b94383b337d622c2f0eb9426a5be3f23050507a391d052505b524e52890f815945a0090afd802328e93b4df07d1fc555b40128ea62303391378e46bb68024cc78c8408e02205fb70524e1780f3290e500e41bb6808ce326287b01906fda0292704c3c19c89701c8b76c0149b87f0c19c89300c8b7ed19ca45984a9215c9070194efa4b39e53c8dc292e7a2d479ffe4258aa249bb5f13a80fa6e3aa0066d678f632bfb3f2c09f53d1ba1128ee42483fa2780fabe8d5009eb426450bf03503fb0112a61bd880cea2700ea873642256c472283fa3180fa918d50e3b85cef4700eac7364225ac3b9141fd0d40fdc446a884f52832a8bf02a89fda0895b0464506f52700f5331ba1c67179ca1f01d4cf29a17662c91947c9239c2ac395df4d0e05e3f7dc490bf1aba45e0a907e918e4614bcc338eebd48c703945fd66c7b942bca5d909a30a293cde9b811349d7c958ea9858334a069183f473627ee0de0875fa76379bf614cdf332b2d0310c9005e00007e4309b023ab3c37d33b3d6b32dbc4f848e478cfd23c1b00fd1f2550be4796777b88058ee422b1564d31cb67ee7059c2596e64994b7380f0db74147d540b3d2fe0ec2b4b8ede6c264dcd1ea554488f0699cc7794483334a44b59a1e0c0a33e5c3fc9ff4a4b84c523b29596de04b8bf4fe754ed124f51bdb6f5327d00b0fe60cff457c2be25b25ed07d411afba38d136348170522abb52f021efa938d5849570023c35a1f60fdd9de197284cdcc6433e4589d24da5fd29955c15a541e2b4ad14012c7418daf018ffd351d9313b08440cff78751e224cbf9eb002ffdcd269ca43391c870b603def9bb4d3849a7ce90e11c0d70fe61134ed2895d6438d7029c7fda849374162719ce7300cebf6cc2493ac7980ce77500e7df36e11c124b9c4f009cffd88473682c717e0970fe9bee9a92ff463dc2b123648d7a0f01b4ac9e45f38d4977f3209b6ffc124be24cd8849374af19329c0f019c756cc249ba4f1719ceb500675d9b70926e2c4586f31680b39e4d3849b73d23c37906c0599f1267b0cd25e238b36e0790ab37b005654e2c519e0c5036b40565762c51ae03281bd98232379628bf02281b53a2e4e3eb60a7c644b692f18d2456b17ce7712e960cde702a78bd4146d384129e1adaed8e3ece771e2c146b74d7c671c81703a84da93d52815a2ea2b692bd463e12bf810b0900af1925bc165a74e623ea968a3175c96dcae287af0dc0d79c125ff5b7da211c9944b6d5ce5480753b4aac6a1c72762d1b877c1900b87d3a000eaa6500cf05005b5002544badf8ab12c6afbcf83f00b2a52d20e33847e84b00b2952d20e3b8d2dc2f00646b5b40c67150d60f00641b5b40c671a5b9bf01c8b6b6808ce34a737f0090ed6c0119c795e612a095a7bd2d20e3d85cc600c80eb680249c614106b22100d9d11690842b769181ac074076aac9b670288eb40044d6fab33d40d9391db5ecdc5a56cbbe16e4d75d2801aa7e6cefaa1cae329399bb2fb09a7642de124e362d7516c0d9b566a3b62bca5d4682b09248b68cc415206aef408992cf3bd727f2f3b6f1e52cee53f76f07ded88d12219fe0eedda876aec3a258fc2b8a6187560f00ae3b25b8ae321aaf672b19ef52c526e715880c86cfdc5d2e8495d236a1fd4b05f6bf006c0f4ab0bc5b08e6d305ccddf49b672b0bc5ef12e7ff65227d8c5fb1a72dc0b82325c6f620d776e12d76d42d97fec88702a8d2637c7baf4f0430774a479e5dc8fc4cc227ec6a20f3cbe100654f4a94db01bf5c2a544853419ccc0bef05e87a51a2334db437673a0b99db97cd45e5d07ae49b54731c6e00a5c8dee94829fdd5b50751365c9045ef9500661f9b60c671c192bd01cc0c9b601236f292c1dc03c0ec6b134cc2ae073298c500e6ce36c124ec102383b92b80d9cf269871dcea663700b3bf4d30e3d8765e00600eb00926616b2519cc5d00cc8136c18ce326b3790066a64d30e358279f016066a5bb6289c1f42e8c17c78d17b600ac836cc44a5a9027c3da0760cda6c4dacd80d5ff720fa46551b2051f7e0170736c861bc725729f0170736d864b988991c17d1ec01d6c335cc28a0019dc3700dc2136c325ac1890c17d1bc01d4a0937dc4aaf84d919d94aaf9b00da61946883afa149d8b842d603d519e01c6e13ceec58e29c05708eb009674e2c711e04708eb409676e2c719e0f708eb209e7e058e2bc15e01c6d13ce21b1c4f92ac039c6269c436389f32780736cbacba0fe0bf88468c98af70f00b4e328d1065bb82c8eb3829b0194e36d4199134b94c70194136c41991d4b949300ca89b6a0cc8d25ca6701ca4994285bb1e4e850ef8e82691a254ad6e4319125114e4e47af53f0d58e08473c91ad76b415609d624b24271d234a16c97b83483ed5169439b14479154039cd1694d9b14479004099670bcadc58a2fc19a09c4e89522d03c0511557ac50982772f362b6295d793919c8dd41a633231d2007d55290bb0290f9e90039bc96822c0620675282d497224dae2c9c84193f7c7d01be59e9c8640a999f8984719ccfb104a09c9d8e0660ff5bd3108e4d22db5ee17180738e4d38736389f34e8073ae4d3887c412e79b00e73c9b70920e4424c3b900e09c6f13ce9c58e23c1fe02cb00967762c71ee0f702ea0c4c92de063dcca65119d8f839b24c7bcc5af0bb729c0b690125bb82edc380edcbe043468ec624bdb1069d64356036a04502eb2052569b64386f2608072575b509266396428fb0394bbd98292b4e64386f2768072f79a44e96de288e32a0b1301ca3d2851b661c9def064aba5ba9da6364b328c9340c168cf74148caa5aaa6faa7c01f68f93168c8aa9d04e0368f7aad9c8ee8a721733256ccf245bccf46610d91753a2f46e3ba78ef384b0b572b3afdab2d8eedec03f975042dd1e407597912c4f57ba4936d17a3280b794121e5faacfad879708fb790d7c9e58b4afc461521ec3c8dc11a05b461f9993bbf34d741edd20a3ed2ae181133cab704e718ec58e28c22577c94a96db03a885d4feb89e2557839de0fccf07096e14be49b8cc73172a742d01ba224a74d55fe18370b82a590a5902f2ec621bb1920ef327c3da1d605d6e537bfa60cae15864ede9af80c8bfc2269ca4a3dbc8703e0c70aeb40927e96860329ceb00ce129b70928e0826c3791bc0b9b74d3849470593e13c07e05c958e2638ef50d6dad204b702605c9d8e2638e893fe9738215cf7886cbecf3850582a4d4784c7a2bb3e117a18658b26592ffa3f00e71a9b709276f792e16c0370aeb50927693f2519cea100e73a9b7092f6a093e12c0238f7b1092769d72f19ce5300ce329b70920ec926c37929c0596e134ed231c464381f0638d7db8473682c717e02706e487791deff7043c24a27d970c3c701da8d76362b1362256b56ee07b0ee6b53d308e98266644d23cfb124ce4d36e1245d6e8f0ce70300e7669b70922e554a86b304e0dccf269ca46b6b92e1bc11e0dcdf269ca42bbf92e13c15e0dc428953cd472f64e679c0de881ebf31213900e401b6808ce3b0edfe00e481b6808ce312667900e441b68024dc73800ce43800f2605b4012663664200f07200fb10524e16e02642057029087da029270620b19c82301c8c36c01493869800ce41100e4e1e968290abed82361d643b6d8e36280f5084aaced59d03ef5f83514ff05601e69134cc22dc1c960d6056d9847d904338e5d186f01cf3cda269884357132986f0398c7d8049330032283f9018079ac4d30096be464303f05308fb30926611d880ce66700e6569b60c671d795cf01cce36d824958172283f9058079824d30096be86430bf02304fa484196c150fc214936cec7b1628b29f448952cd41e78b382ba9699a38504605af14f8e1c935eb87ae28778109c2cc866c4efa4dc00f4f4947a39b773519ae70ed58037b02f0c9532941769220573b0f717fe41355f6958d6b5eef840d6e843571b2753a0e05be791a25d2a6421a7f618598dc5fc6663a0f73bf8c9f1f76007e787a3a22f4b05a1aa18f0520cfa004d912a48c7071fb3401bc830ae02900e099e9c8a5b1fe1c6f6991b0b182acb4381da03c8b126557a62f56e60eaa5ee028c3e1aaa377f1930dc25b09c1922d81f228007bb6ad6009db2ac9c08e0060cfb1152c618b3a19d86100ecb9b682252c6d92811d04c09e672b58c2263832b0cf03b0e7db0a96b0ee4e06f61900f6025bc11236ce91817d0a80bd9012ac5a7553d5e5395c5795dad7affe1ea8cd6fb3a73a40387886ac3ab011f8e74594289b3b27de8d90938b4a12aec0493684ab0100773125b8e0eb78c47110d76010a52fb10927e9b252643817039c97da849374d133329cc7009c97d98493748543329cdb00cecb6dc249bafe2619ce7b00ce2b6cc2392496383f0438afb409e7d058e2fc03e0bc8a12273fe10ff3a5f8e287a9314b62ba9a1253f557d026ac2a92adc9311d78df353662255d768f0cebbfc25b1bd6d7844fa9247ca248c1781a56c8d4d60be5cef5a9ac580c37e0480a9df37cd160b19e2d7180eceefc0d16167b3a7f4dd71362ccd264b689ad1357b9bc2221bbd4b9cb352b6759fd9c47aee5aed15cba468678cbadf32f67bc277f83301c56583312552de2ef4a59edfc2e74aeae6673407fec6ce1209b9d67f46dc8270bf9deea71e5a7f2459eb0d1a3538658e2153e5500b45b287e9738ff2f13a1919162a4826b5baa0d333244cb48a9b8ce9f582bbe0665e555d8b15158efca2cacd8647d8a78076e0a939168ed3c5106ae78b764f74a6b6a90e6baa84b6ba9f88d4be0ce9b10fde5dc1bd638cfcc149cf87b6a9127c52a93cf5d4f0c71fe73db2a0756b4520e94abbc96ca3375bd6a99dc5b534bbb8ebb64c29c5aad8e2c9e55655192db72c6f7f9281652f3aab4b46afbf038db2c45a8640ee061519bedbf9e87bb0c76e1a6ed85b32f7042de15cef7f52a1311b54c3c53ffff0170683eb330580400 serializedProgramBytesString: - serializedSignature: b6c6fc7b81b19d8c21d51e3f461881891d730b5ec66c6e5eb8636a4a2b0e2eed9db1119f5764045b527aa27718f9bd7617364e911d57af5d4b575f191799ff09 + serializedSignature: e5c80365f0598d6556cee7802a93a57c6fe4fe07bec75e5229ce058138c6db3c14d00206572d9f843083608855ff94c6aa5ae34949189701f0fa463565295407 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset b/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset index a7dc7ac..f13950f 100644 --- a/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset +++ b/Assets/SerializedUdonPrograms/bcc2d3efd1d3673448f4977e57b81bbb.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9ce9721bc7118067490220445014c503bcc443bc20f10074583e9238d1659b3625d1bc9c5876288804293abc0cd2b652950750a5f208f9913f7984542555f9e3ffceff3c401e206f9074f7ce0a8dc10c16cbc55058da40018bdd99e9e9fe7a8eded95d346505bc9c59f85a17cbe2be98176b624b1c8a03f8751fb6fbf076f7bce34ba208db1df8ce43daac18f52989af69a70fbe1760ef589c40c96fc4266c77297d4514e0f702942dc01e1edd864f0172392d50684d3c104fc46391767a7c44ac53a16379cc41bb9c56f8be277e0fa905520a2bc952521abe5620e598d2f641692fdf53f12599b50f699b50a628f640e67392d89a02890ed9449b16b96d96db98dc76c2270e9f0cdbc7bc4b723fcecae1ef6b72bf093e49ac47fee67524e4f6b22c739ded639ebfcbfd56257f527e40b7a60735d473416ebb947abadc3ccea8dc6f53f2a74af5b4fcb7867adae5b65ba9a75bd6f34aee5f54f207ad47f54d8fe29b1e376f93e753cf371d35f8a699e54d56c91744bf5e45bf5ea9df9f14fdd4b6e31d1f64ba78b2fb64fa0ccbe31dc7ed904c9f65fb5067f38922c72b7745e69f63fb0eab7758b16158ca5bacc2c3937d89eda38c79974dd35f7c6cea53caf7b3f2de3e6ed301b80d18b80d54e7d6f24ad4c62d6d48cfd6c6a4f9df3efaa645b9be49457e9a95afd67e4d6d7544f1f3889b37e6f939c838e7e51d65ba78c7c635be99506c1d67c7713ba9f866d2d52dfe07458e576e4af1cd94dc4e8bf2f1695aca9950f2a594fc3925ff2ab38ffb745494b7d371257dbcdce7b11345ce98d0b7e7ab763926fe531f8e89bd601c13ff64767b76f27ab3caf14b6c3f00e7b85a8fb18fc41c8a543e82d8212f8e44961a347aa3d690ca2be91f4ca1e838cd540884aa3d81b0e5080468229a358a974ec42d71531bd1f43b29a6f77dface438e5d127aa3b28a7f545481caedc1bbc0c2b16338fe2145731890ed42cabc58842d967a06629fc2bb5cca3a54bb07215d41acc2f711c97b066a57e6f433094337b5cc32c87423cb7d38e2013d82fd3dd27085bebf254d0ba4fd021c3ba138f70022dd7bb07d49b555da5e84dfba3a572532bd8efa00d374dc0d633d373d006b50fb2cf5bb9f3cf2263c42d3d90dd90d5bb2343bfeb1c2133f317407190c1616a40c179a5376eca6c8523cb15c4130b88d9516eadbb7cbfb8eb85dd5163d1974f7205950f2f0dffeb5f0fdfb7f9dfa2c566eda2d91a5a977c8c7b46a60515ec6e9ad9050dd8458ac25878aaaf81d1d7e3a555c3943fc6ebe5dca17dc01719a99ca1de0e0e9e92a8d91fbe2114d632fa882c2eb1171974eff8ba2c24739149820cc9593a89faa26d04d3ad0ad670dda7f64a906baf5b55d25d0f8d2134c1a08fae96022d8ac234811d873ab04bd106c05e6da4f202d0ff90b349ee3f125909887ba51de5daac15b3072d3cb4b55e77be1b58525be593a38c5c2c77ae8d126835b7a25627a07a6c881f5aedae4de168d7b73d8e2da35adee7ff08a2515a56915482f3ca66b3b6d67ddfb9e40ebfe4a4662c17b1f2e7ccd291cf48eeb30f43cbffa4dae89ebe8a5decc1c7dba910b4fead2358f5c9d55a7d8a0e35642478f562f9f35d4b875ba31eb72cdadb28ba84e9c6238093a94b49a86926ecd5082ebe4418692a44e38bab347474215dc65167cc124b837a4e036138eb406c7a8130c47caa4755f48addb4d82fb430abe68c231a0c1f12a208e0e9d70cc3f588bd629b3e04b3ac1987f4833b439ba36dd6916dea91ba288d3ea190ef098764852f29037f8208fabe533ea20af1f8b86692ceaab30ce5f05d3987359e71f4438a2d54a75ceb0d9395d26c9a36125779b248f8595dc63927c35ace45e93e4f1b092d3a6ae3b11b2ebf699baeea4a6eb8a805db7df247caa0ec2074cc2a7eb207cd0243c5307e143a666722d6c33b9a2938cf3d2f55a9a49957969d8a4f24c5895474c9267c34a1e35f970ae0e3e1c3375c8f9901df2aa49eb6c1db41e3709cfd541f88449f88d3a089f3435939b619bc994a9cfdc0ad967a64d2adf0eab724627194fe5de129ad546bc91864712fc4c7b5e6cc0fb1042a40df1507c0d05f2144be065344c3195ab96529e561eb5545899305b79cd64e51d9d958bc23b772b3f0f339db7dd855f453ae63240dd319252f52f9d5763cae96a0862f57593d56febac7ecf60f51a05c1ae277765a88bfa2fc0af75e9e32d1f0fd7cb8f33268bded15934a9b456d54f3ba240da2d8a0205ed27e245159f05d173d6a4e7bb3a3def2a7a96eae47d6a91d81f8b55d012b9556b5de656571f3fcc99ec7b4f67df0721fbd387d24ff5ea4d412c9d3759fa339da5bfacc99377a1bf6cc9fe7458174f9eae95664db6fd5c67dba721bdb8e2ebc520d25539eb4012c7a120f6e74cf6ffc2d48a6b99fb16e8eadb9b9aff12f0761c5c0a7b48648b507e89d8e0deb1c8d2ca4deeb52ffd6fd3410df6412bac79156a7e4e1af8dfb4f3be30dfb4b32dea75ff869f156efbc2f2db7475d4bb2740679dbf4de67b5512d2224f1690a6a5acf366298e70f198f46a539656d4664ed99afcb5f815d6d6ac6f43c1af59bb021ed3b572108081f986706fee2f0d2f38cd6e8320dfdafcae32cd9100ef16873adcb5864dcc9d3a8a3214b8ede055cda65c27a55844854dd99d8539aa63e13e98e0de611005607f66c0eed904d6a36d5bab24628702cfa21ca0f15714d06d8912bafb36d1c5091d16cf4396687444c1e03cb009a7bba676f592c28e2880fb81c025628a7035d6aad7fd9db5de805539bf775044f512d43ba45659002394f99e2e8d349ae60ff97c9da9e85c9980235526500bccf8ccb1999a26965248ab0f4573e89b0f7ee4d166ce250910325e7046a3d1473647a359f2ee06246ec26783d07dc74efc4ebbc8b501a7668aae616e254d968d63a95a409c662c4bb34960c126f6b4c4be23cfea0e083e17b956765e7dc31ecca42d986d0ce6c78d04d362cbb406b395c1fca49160de8c20cc8b0ce6a24d98bd12660e3e476573eda154698352f2c27d28dd1aca2e5b28930ce5239b2887b41315ceb52e11f39aa4c5eede690beb28c3fad826d651899577f6608bb816f15a6bb55718de2736f1b64bbc450a9711ae271b03636be062b6c009066ec92638bc9fa7d6331a9e277a6d31c1907e7a1693d1a63c5752c7cce807492d0ce5f2598c9ade6474f4a31835a718de9537d952cbafb05944d9610b658ca15cb589d20be7bd968ad3cecb73162c5d6530d76cc21c1395c1122a7102448ab0ffb17cc2fdbc8dab4d0cf0ba4dc03d15add5dc522d2e89586ba9e30ce4678d02328a5d7e9081fcb54d90fdc27c06bf4c220fc5b7b08dfa797c8a01fd8d6da0b55d7a8876587f8101fddc26507b2bf81647586b2bf8630cfb539bd83b84e9ccfe4066b1062f610b9ec3e07d7116d393698939eaf37c3f03f965a3808ce23cdfc740feb65140de8a20c8090672a351405abc76640de40003f9cc2648bc17c574d745b443a37686306f132156c483f6aa773b4620b86966e09edb04c7cf7afceeedf182a08abbd52200b48301ddb409b4cf67542c7f2e60839e6cb08673d816ce698673eb2c2619d30271d4e3c74b0c64a1514046317e8c3390db36417aebecb576f07722d8bd4718cc9d4682f96e04614e32982f1a096614279e4e0673b791605a9c7cacc1bccc607ed548302d9e2e5a83d9c560feae91605a5cc4b006b39bc1dc6b2498b72308b387c1dc6f24986f4510662f8379d04830ef4410e6108379d84830df8e20cc61716e1ecfcb616472840dc2910d22e3b3c4e73e77d6296d3d801a1f095ca9ca436a9eb6a567d0b2f4ef85f86f42411e84af2ed3ff01b1afb9398a8ff6eae6a37a3cf4a6b334cc0370a92a5ec9d2ff3d9e67fb8ba2ec6fcd13b1343d1eb9069e778517c413c8e4feef3fbe62ff079416c1fef2700000 serializedProgramBytesString: - serializedSignature: be38869332b03e0be22bb19799a62f617c39ffa2c29906e3b0887740004c2f4e7971ea2250edf01bb7d7faeec0f6681077e4e5585824aa4a7054847aad30f404 + serializedSignature: a388c5f5a7b752999962ea81c516eb0e0a7cc81fa63739d3561a8cdd77432791035662bf4b0b4e4bb2a5685e6eb1723644fd0866a10a98bdeb60fe371d8e250b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset b/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset index f51c955..0e11a00 100644 --- a/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset +++ b/Assets/SerializedUdonPrograms/bd60f315ac85c994cabd7343747235d9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1645fac7e70542e88100821a3160e1558434c42e4240446992805d08498068023185662fd87befbdf7de7b2fd8bba2a2a777de9d7776cff38aff796667f33eefbcf3bcefbb7967deece4fee443263bbbfbdbe7f9ceecccecccec6c9722c6ff45b6e2bfe6b2d9ac9c8d6173580d5bca96f0bfca79d8c07fbc2d3f7e166be2e122febb8aefdb8a15a63813fe8d8c0ce5bfa7f2ad66d6c2cf6c65d53cac13fb2b582dff7b2a3fb7966f41ec42febf961f15e9c64f9ac326b1996c061b12199c4262ae38a959c645c0af480ffe7b225bc9f7d60aa3e0224562d710feab82ef6916fb1ab8d1fe71fbb103845b0d7c5f353fa789d573cd0542b1c78b054cfcc1bc60880c07cbb0ab0c0fe6ffbbf3ff5fa06df06637b90d387218eb7b98dceec2fff7047df937d65e4f86dd64582fb5ff80b661dfb5727bfd00da7d64d82035bf44db5c33522cb7f364b8446ac1df1bc870298a5b82e2b0ee578aee0a45b740861bcae3ffa8ecdf48c6ff290d9f8679fe17cc4fe3d88d031cdb5d868df2efafd13684c3655828f7ff3989663ad76952aed3a45ce710b9ff2f689bb3edf28edcee25c36679dc5fd136849b283adfa06d0847a0746daf0fad8a0fad8a0f2d8a0f2d9e0f5d2f547c58a6f8b04cf1c1d7f91bda8670d30c7ce8a1d8ba5986e9aaea6d2ef5fe6e486fa4d4fbb69d7a5b30712f74db0ad9c7d322e74c254d972b69ba5c862b64fc77723baa842be5feefd1f17e3c84abe4fe1f94ebf9f13f2af1874a5fb8cdddb762edb3d1b781b271a5b27f95b23f5d1be1ef2d59fae5f22819fa7e1d26357f42db7e1e80f89fe5b67fad5e32fe17b93d3ac0b5c7c8f070a9f10fb48d6d3a42eeff156deb6c2af2ae1df1cb974226f255eefe84cdff94dbc5016c1e8eaedd93d0f5599404d0f5d3f148169f9f8e94e15132fe37e5783f5ecd0f4723bb4a03d85126c3ad65780c8bcf87c7c8701cf21defdfc6bb56d7b52c5696f134e8f135a3d3801fdf732db1df67395686c7caf87fc9ed6d513c84c7c9fdff56f48e93e16ac5ded5323c41b9de09c80e084f5474b745f1109ec4e2cb945c25fe4725fe78649b9f66be6f5f33bd4fbf31bd2fff517456337d9ec0d7dc8ea59f27b667f179e26485e1c92c799ed88169f3442f358d943cd17b10b1df4f23dfaf53146ea7c8f05485dba9323c8de0e6c7abdc4e4736ec1880db4e323c536afd176d4378868cff1d6d43789662f75932dc5986677bfbe1cf383bcf26ec3f07d9efdb749e62d379323c576a47d03684e72b369dafd8748162d378148fd22ee233da2500c70932ec8afc9818e0fc72197643e74f0a70fe64190e40e7efcad26fcffbcc2f940cfc67b77c140fe145727f37b4cdffee17558ecb47764cf1ecc82b50ae75b1d4ca91db03513c8497c8fdddd1365ceb5ce5b881e85abbc96bad53ae75298bcf4b83503c8497297e5de65d2b8f29c70d42d79aea5d2bffc1007c2f57f85e2ec32b58fc7de6c75fc9e2f3ba1f7f958cf7cb6a9fd1d52cbe9cb902e9f8e7f9c7f9e7818edf7e4ec7876b9474dbdde3d075a8dcded463d7ff4e743c84d7c9f37a2af1d7cbf85e4afc0d32beb7127fa38cef83747d1dff3cff380873918f905e7e5aeec112db62105e8bd2f85acf9701feb5a6b1c47ac23f0ef719f8e7ad51d8dd246de98bb6119bb6f4f7e37d361125de67e3a7bf1fdea8a47f7bd94cf7b6bbf965cf48e9cf4fca71d7a01074fa8530cdd3cdd737b3f8326206d3e66b286ec4f64c6f7fef7bd1f910dea2a4a51f7fab9296b7a078086f63f1f58f7fdeed4a5adf86e221bc4339ef0e19ce92613f16dfeeeba709715b684f967ebde3f749ddc512fbc2ee467177a13808ef91d7fc0a6d73b6834e557467cbf05ee9631eda86f04e19dfdfb379d09532be02edf76da8d4a7e7e075727b8e0cfdb2f43e167f2ff543f110deaf70bd5f860fb0f876889fc7fdf6c6832cbe9deed739fe33e0434a7a3c20c3bd902f7e9db3378af3eb947d50dc4332dc17c5f9e5f27eacadcf60c834193757867dd13ebfde3e8069fb44d6dbdb10b7be881bbeee81edd4ff5ed157d3c5e7351fb1f1d3a20ac5f9fc17681856c7386de0c7cd5318c2df3532c4edb364f7d53e327cc4b3393240897f54c6e72bf18fc9f881e8383f1ec2c7597c1bf811140fe113cafe27582cff40f8a4c2763f140fe1534ada3e25c35a192e94e1c3f23a7e3b6c2f16cbcf103ead5c672f257c46d9bfb7123eabec7f06c543f83c8b2f3317a178089f53cef7f73f2cc31795fd2fcaf00516df6ff38212bea49cf712ba1e842f2bfb5f56c235cafec58aceabcafe57114f085f53f6bfa6ec7f5dd9bf06c543f886c2ed0d19be22e307a36d6cf75b2cbecc7b4b8675327c5bb9eedb8a5f6fb2f87cf5268b9557ededd39e2fc37759fc3de6c7bfc7e2ef313ffe7d167f8fbd87e221fc80c5df43efa27808df51f62f44f1107ea8b0a892e1472cbefcfa10c543f8b1725eb512ae55f67f8ce221fc4461fc890cfd7ea44f9534fc5486c365f899e2d767325c20c379caf583a6975ff7af93d7590f6df372bbe05ee5383ffc9cc5f2c841d206edd8594e24e28d4bd672e68dac4818002301e90e07fb67a61e0806e9eef00bfe8d14976d612bf9a9b5bad1d83962acb78595b152ed68ecfaa25dec5fbd5cfcaee247d409d12191844b3c94700930ae9effd4a2a1e4661e3f458c44c360721ddf33863f00d589b3e6b3125ef8efa7a8cce597ad67ad7cab92ff6e147af3b9d98947a67209869dd57366734d6f54bc81c7f8401bf976bdb0b042fc5e262cad15d64fe5712d628c7e092fc227f27085b85aa2ef4dfc6fdd352b2532bd8dfac1712ade1b82f7936912f706ac2f12ed90ff4f918e481140df7d48c4bb0dbb1589d6dfc90929f1ff0cbd42063a7ca64a8d12812c121757ca8a449fd0ec0482c17d4cf4509fbf3ddee3d8d8a4bee8c940726f283c88a5f0c517ddf57a69e48c2539f1ae95b122f1f85190c2b56460412f2a6aad202ee4e4742b064355fc111d7ed145509145fcde7175e2b8e009d05d547ef1091089b655b850b22de24d5c98ceb454ec6e90e6cde2db75c225fd31fed4a82a1e824b09a9590c97ce15099258dda6728a4a922eba24e991ed24495d06254b921e6d7ec59204fee909f62408a6b28122d8554750b4dd6aad129cc3e3bcc6d264b1b74ed4b07e1d0c768317c98e0276d3c5a4ba5671fde494a14ba8ab42b9a897dfdc346f4d2124a1f22b479fa4bd4592da31834af66eba64ef9dfdb2ccbbe5eb53548cfa248516f8c60937ce51e3f594fb92454f721b2882393a82a2b3bc328b0461df52a102056f7086d093374a65a8079827000e4d702eb50914c2ee3a84629c665187943d3085175afe60f958c3e54f7f5df923fa514725b9f133b3284019344024ae3d53a82c90abc902c59005f235bc8afb25fa239deaa93805fe1097eca1bb24147d03b5e509d751c5fbd2e23d29f14106c47b51e2830d88f7d6dd8ca243279b0f17156df3e0839765d0cecf5328fcaecfee4398fec120f9e5a94cdc47972e1039545bbaaa899247274a5f2ac5d7d7a638affb02a4783f4a7c0303e279baec048560647fabd929b113d0ff6b223f7731f76799e8d969958d29f5f8e4590c5e1018ad90d1e7b00291c30a99ae2b33984554aeeb4fe5ba8d32cd750328e561992ae7eb7285b85cc7d7f865866b7c78b923a1c61700d2ad66835b14ab12c52fa2b22f64412afbe056503976a02ef545e4411d92fa7bf26b54892b36892396caf6abb93c305c9707c408ec9824f44dd8a5e48442517eebb3c308911d6c1b44658a41bac2068a844d34ec8af37d5f62bf121b7f8574013458773568b46daabb5aafc4ab1197ec4d5f723daa9addcc40353b44270e2ddccd5962afd2effc5f82784f5a7c28253e52232ee68106105f9f128f6ac4af0d28be81aea411699fcdee8d99bccd78902c49833767a14328bdb6c6964cdfb591eafad42db9a18e9ec8c6475ba597eea0ef14f1ee6f6d9c7ffe75978a22082cf247fd66f370a1b0a256f64da71e2c4e9e32a3daf8a0525ddc899359fa43d7f6bd806963bd0ae876c068916fc2653395270b74c505f41e40bd9530a20139781eff29e6ffc1b2642317f3c43155cc7ba33ca194c9a54b998d289b8a74360d43364d9515679dd85dc756f103528db004b16c1855b816eb0ad748b0c275634abc4423fe4640f1429d383c7bc0fb6a193d7b0ca7eae1326d3d1cacf7640465f6d84ccdde4457180fcd765536493ca02e68674f3dbc23365c4398b15f89defa71449596ca0eaaf8d8944a9f6d324d9fcd28e56d3355de9c52de2e53e59194f2f6992a47a99b6c070337d91654c1b3a3a6e059db2d58c1b32525be93467cc7eec1c44769c48b440b38fb3337da374a0daff40dd1a59ff6f61dcf924dbc083a46bd952e6980de2e1aa322ba4c359e4e9ad154ba4fd0a4fb8301d37d0c65f9440a6700cb8b28cbcb35968fcd0d667931253e49235e1f50bc84129fac117f36a0782925beab467c5a8f60e26554f936c540f9369612dfcd80f8d694f8548df8d6bf9dbe6310f17194f8ee7acb03f5716c4325e81eba3b3460826e4b593e4d6b79b0de99ed28cba76b2c9fdf2b98e5db5396cf30905b76a02c9fa9b17c4d40cb77a4c46769c42fec1d4c7c279d38d4447bb6ed403d7cd0c2842ab88ba8b6a0451d8d408d40f56c568ac74498eab650545c0dede8074df06634edcdce5422576a127969feb1db0749e4f194f81c7d0eda2588f82e5422cfd524f2ba3ec11279824e1c8e87b795a86edc34a60d24e9c69d48f9b3b7c69fc2bec1fc29a752621f03f7f224caf27d75a55040cb27ebc4e15102de53531f2522411e2576a5ccde5f63f69501cd9e42891fa0118ff60b26be1b257ea046fcdc80e25329f1791a71e01b447c774a7cbe46bc47ff60e27b50e2551af127038a4fa3c41768c47f0a283e9d12afd688af1d104c7c06255ea3115f971f4c7c26255eabcb2d038389cfa24aad85da526b9740f5c79e94e58b34967f10d0f2d93a71e84f85b73b137a6ea1f510eb936de6554153db1654f4cdfca79c1f0ae3e50bf94f909eda0a8a619d866159d93d3b07615849313c48c3f0ce41c118cea1c40fd6883f3b3898f85c0a4bbd366b05ab10f7a2c41b0c88ef4d892f3120be8f4e1c30c28aa776da3dfb52fe341af0673f4afc1003e2fb53e24d1af18ff3a6062a9e0ea0727fb326f77f1730f71f4889b768c47b0c09263e8fc2d26a80f97c2a832eb39641ab287f961bf0670125bec280783525bed280788d4e1c1ae6b05868467dfcb594d9876aefab979e0c62f6424afc30bd78a09b7611257eb816f851812adbc594f8117af14096d751e247eab34a20cb0fd289439be528a6690dc1842d18d93f446c42dffe1c5e17d4c80962f1ef0d0669091d4c65d8a333cdb0f594f231992a3750cac766aabc44a35c24a635c11d92fdb992ea5c227373248f63e9ce735acda07b0e06ea6c58498d3e2dd5a531a4c4f13ac3d5245e4d277123754f9fa0bfa70315ff875039f3c44c73661365f64906cc6ed689c36c075823403f8540738171f4055a282ea764caa595e272aa012ecb282ea719e2b29cb2fe7403d6afa0c4cf3020be92123fd380f82a4afc2c03e287eac4e17858b3d7cecb6f87e92e0903d2b01c70a603d28753e2e71a103f82123fcf80f89154329f6f20998fa2c42f30207e3495872eb496878ea1fcb9c8803fc752e2171b103f8e12bfc480f86a4afc5203e2c753c97c99b5643e81f2e77203fe9c48895f6140fc244afc4a03e22753e25719103f8512bfda80f8a994f83506c44fa3c4af35207e3a95fbafb396fbcfa0fcb9de803f67eac4c1981b74fee4a7e34a217db5b328576e34e0cad994f84d06c4cfa1d2fd666be97e2ee5cf2d06fc398f4af75b6da4fbf9942bb71970e5024afc7603e217529ceeb0c1e922ddd5e091109617cee891f0629d32bcf07a97ce8f4169e7df11f4252fa19cb93b53672ea512e51e1b897219e5c7bd99fa7139e5c77d36fcb882ba4fee37709f5c49893f6040fc2a4afc4103e25753e20f1910bf46270eb7ddc3ba143672db5d4b65d74732cdaed751a41e3540ea7a4afc3103e23750e28f1b10bf91127fc280f84d3a7128229ed465a04c8b889ba9ab3d65e36ab750e09e3600ee564afc1903e2b751e2cf1a10bf9d127fce80f81d94f8f306c4efa4c45f30207e974e1c063f60f9fd4c063feea6845fca50f81e9d3094c4b0307e4625f1bd3a655854e095744cde9216be8f4ac1350652f07e4afc5503e20f50e2af19107f90127fdd80f84394f81b06c41fa6c4df3420fe0825fe9601f14729f1b70d883f4689bf6340fc714afc5d03e24f50e2ef19107f92127fdf80f85394f80706c49fa6c43f3420fe0c25fe9101f16729f18f0d883f4789af3520fe3c25fe8901f11728f14f0d88bf48897f6640fc254a7c9d01f19729f1cf0d88bf42897f61407c0d25fe0703e2af52e25f1a107f8d12ffca80f8eb94f81f0d88bf4189ffc980f89b94f8d706c4dfa2c4ff6c40fc6d4afc2f06c4dfa1c4ff6a40fc5d4afc1b03e2ef51e27f3320fe3e25fe7703e21f50e2df1a10ff9012ffce80f84794f8f706c43fa6c47f3020be9612ffd180f82794f84f06c43fa5c47f3620fe1925fe8b01f1753a71e851f807cbb047e1739d32acebfb2b4ba347a18016fe42270c73afe12b890933bae16d38fd4cd9d88727c688b5cb96b246b97a9937ff1b24bcb3606f2a8d748e9817374b38fedb02416693ff8122f09b8e00bc6b8caf8b3f0a918ee7d4b9c9f698f2f44bcad37fe93cdd59f134febad857482b58156f259bc1f72e6230bfdf5bfa35b9ede63cfb8af2ecdf3acfe690b918cf0a6f7f3ec62ae91d638ac31f290effd171a8159bb0c6a2bfc2225e5fd15b8109de0758c8aae4fb0053db8e9ccc96316f0dc7d9c28b5aeed73271f418e94f2ddf374bbc3bb048ae983857e41258c970813667e36f3bc5ef49466bae580db12610a73f519cfe4be5179b9c96f063e1ad60f0087463e72427943987af290ebfeb3844c9fb26fe931f9e678b440e98c796272df78258fb67ca5a58ca2bc1da496996d4d398f75e76a558613fb154ca7629fd17cacb88cecb19697a3945bcc5e22fcdedfb3a93ff3db9ad5ceb68cfff4a79de45e7f958c5f37271bf79f7965f7a57f238bc1064720fe3f7e1f38278f10de545579d177b285ee0ab26cba5c9532ede677a8fa994fb1be573379dcf53d2f4599f673bdad7bf53bee6a4e36bb0fbb3a3efc86f295fbb6752e24e0e59bbf83bcacb5c9d9765642d385da4df62de0ef0eb7658fb23552a9aa91bbfa77ce8a1f3616a9a29359dc11b8fd09a6f14a9559da46ddfbe546bafbf3f50fef6d4f95b9ea6bf9344eb0cbed91c061f7fa47ceca5f33158ebac99996e9dfd4459db5b67ed78254562ebbde2f498c0dbb33572fd735d7ac4cea2e3a93d417cfb99f2ad0f5542a4d332499667680fda9b3ebf503ef4d5f9509a762907de3567a58cfb07e5413f9d075ba795c3627d17d38555ad1a5f4ce7a65f293ff2747e4c4ccb8f0ad1d269114fdab16fd277d4fdf24fcac3fe99e5b5ca345a4566f2da6f94070332f360024fa5ecdc2dffa23cc8d779302ec0fd5e2f7a731a59312bc98a27ffa63c19a8f324dd1edaf4ee98ecd6f8ffa13c1da4f374db343d4da78cb3e1cd7f296f06ebbcd98ecc81894be9c6f730d58b1aa8999f55215aa8be0fa95b436581fcf99df267bdf6b7c7ca145f5618a30f9d625a6b8750edb1f4ee7fd84e6ea5fd9c15a17c1b6a2e25923f9706b1b60b65edfa993caba46a1b673745ba523e6ea0f3719b76dfeb8de25e8ff7daf47dde8df265439d2f7b07ca5ded194f8ad749f72853bd2339148d021d8deddb9db23052d4a2f42fe895741f990ce25177caa38d741e55911ee9ec687f2aebd4821d6b2ac573293ec3cc95aeab8c953c3d286b37d659bb202d6bfd5e127fbbbd656bfbcae374ec0b42a82745a8504768543bf2bbf9d64b2fcae6e1a66d3657cff7a66c1e61da6673774f1fcae64d4cdb6caea7b12f65f3a6c19e6c53d5485eec72f1ec5463a5a5d18ff264339d27d3db411fea20afe7b13969e942d528766ae03ccaefcd757eefcbeccdbf98c2329da742cf540942a43f4564642663dfc95afac9e6d4b4f7ce1c407911d579b139999fd5d984b136a2294bf3294bb730636962ce68afa503294bb73463e90263960ea22c1d45cd5c09dae368be1d66c6f3c194e75b653a827c88b8a3b3d15bb71ee5c368ea39cf2b932bd824b6077fdaa81235cc1c06cf6ff5f209dd5b43d8ab879ae5e975b22e4db72c4ae7392697ff4422308d7bb228eba1af33f695e46656243e545edc6673eaef5783050ddc2ab872655b4d90faabd46338acee5d98f76f64044043223702b3c4f598bd7bb25e7aeed5a3406c8aa8b36a452d53cdb7e19b227056badf3fd7d5896350ad88bd4bff1be7ea573823915ce991afc5498bcf6f77364f8b20553790a9daa5487cce7b543b73536a2b8ae16a5df57928f143c7b835a2b3dd1398c1bcefb18b9b046ec60ad195863f219ef24aea9ad9ea95460b814a2990526e0e1a5cd4c9ad2fb297d7cdd9c4bce96f5f7234b9395d8a21054a6c62822ff9404954ccfcb9cc315015625e5993c86d50daae4ac7db10c07bb65b0c5ea94d78fd4405175bea7fb6d2b5e702ac0ff262b0ca6cc2ea9f90d3dcbc35e7f788011b9bcddc354b19127001d62094bbb6b609ab8f10805c3541ce30752b57ddda3b066a9ced7a11e7aad850b20b98eecc8f61dac626a6eea2b46a16c579932379089607f2e16c6b134ebe80036590d785542ea7712f128f69b1077017a031046d3b9bd0fab69550b12736b7caa80f7263a8b6b7890a5e1086b63b7e59ac92ef58c1ff6e15e6b880eb9dae315c3bd8aefb0097abf96a5a9718a81db3d1042d71bc09dad22b066c279bc07264ce9ac65a1d41b3297af6db391bfd0b6e3637fba3b269bceda21c373713c7225dc0756fdf18ae5d6ce2eac9fc961574f0faddb12e203a15f5584db0df6345353efd7ed225f25179a513f0e0c3bc3ebc8936e1f56289dd7dae14edb3bac7209567f31179765bfe7201d33703639826d96e76c6e725b79efc7eea130335d926a8411a502e3fd8ac4137e2aef64b2b28ea2789e13297eac307517d38255bfd0a55ac49467b12d54ea03a0af52bec969d07653741b5a0879ba9d91dab71b35d3556b4db73731471f5d5b9f60fdb07a34c4f3080c7a4c9bc1a6814b1a057a34e3818c60f099de5bbe30903d1b43b86a3815bf1d1841ef928f1b01425ab8d68924901d1a4bd68d1248ffbd134ba2ba34a4f4a346951140d3c2a1f251bf6d140ad8f688ada249aa2173b9ad6286f34ad8eb868d231bd68d2e6a7ce0e5d9e4add3b114d390c9b78843a0d209a64d02d715fec692336db4b3f4bab18667bedf13f3e11ab1826624d03085f48085efd383d1bb366aa25c096a4f316b755af5f9070fdd9fc065c2252a4416443ef409d253de36acdbee93897698fc40c9b28874a948b6461b284d52b30b1f950648cb387b3a72d9c1311ce9961c259ea24ce1908e72c9b3887489c14ccf81bbd945737eeddea6720987b860966898330cf423067870966a98330cf46302bc204b3cc4198e7229895618239d64198e7239873c204736b07615e8060ce0d134c8b4d236b30af4030f70a13cc6d1c84792582b9779860baf848791582b94f98606ee720ccab11cc7db3d1d551cf0f0290d392c274f1f9e71d8472bf6ca04c2f5fba88b211a1dcbf2351c6bf686b11e596b650de8b501e607bfcd8ef8bf7df596e6cebfbb7066ebc2d706310b8036d8283c1aed880c45cd11fdd2a764d175df855a2133f612e8c398405b610e62184f3b291f78a3b49de1b85c0cdefd80108bc748bc5f22fd716ca0284b22a3c63392ed6cac311ca0536510e63f16d456f11cb741772b4d8dd5b680bede5086db54db4c315b4de2a92c156b9b20878842dc0d720c03561076cb170b006f86204b8d626e081a8aeaf6a2b5127b15ab9865416ea7d6b256c1982b8303c5d1b254e5657c722988bc204d3c5f1c8e310ccc56182e9e278e46a04b32e4c305d1c8f3c01c13c284c305d1c8f3c11c13c384c305d1c8f3c09c1ac0f134c17c7234f46301bc204d3c5f1c85310cc256182e9e278e4a908e6d230c174713cf23404b3d1264c7f627fa9ecb2f326fc67e901b2b72d7cf311be43c23306e9e26d7d1442d9948ddb3adda9d6166f6b6b13ad4b10cce630c1b49833adc12c46305bc204d36223dd1acc2d11ccd630c1b4f8f8680de61608e6b230c1b4d848b706b308c15c1e26982ebee9331ac15c112698163b83adc15c1fc15c192698168729acc11c8a60ae0a134c8b9dc1d6606e8c601e1a2698168729acc11c86601e960d98d4d499f84f9a58bdcdf36cc19c8c601e1e2698162b206b306b10cc236cc2cc1302b0a408ac2fb09c47c2677b0e1626d73058f2c21abc21b6e0f546f08eb409af8025f611a5f3ad4eab55cf005b584f47588fb28975008b4d80a9168bb32c650bf98feb935ff643008fce46df657a33355d1cdfa940288fb18932f8aa1b2eb62a7740388f0d134eab6f905bc3b907c2799c4d9c65a8a4f4c37206eb03358a72b356bbf85485fc0439985b239a4bada2b6f72e0b0b4c2d66b5622f684298b0eead0345c43c9408abb3555d01381fb3ebd5d5de08e0f136016e9876332afe6d358b45c36a5b50ef46504f0823548bcff1d6a0de85a09e1846a8161f41ad415d8aa09e1446a8163b49ac415d82a09e6c136a3fe62ded592f5e16f40c4db228ad03d5d17a08dd2936d1c17a99eada9593c44b2c550e3eb57747d84eb5890d5ad39d219f7543c04e0bcf0c23179fd28f44284fb78912160d2e67c437151c98d5d615813ac32628ff3d72b8f04291e37c6d78abdc1ab81c5be0180277663666539674aad994fb207c67d9c497cfbc55bca70a8126b93239743f54f267e526d105014fcdee8dd4f44708cfeec84e5df7270a0c4128cf09532fa4d5579dace1dc11e13c374c38adae64690de73484f3bc6c8c6fa7d72e1cebe4abcbf72398e78709a68baf2e3f80605e1026982ebeba8cbf0d7e619860baf8eaf24308e6456182e9e2abcb8f2098178709a68baf2e3f8a605e1226982ebebafc188279699860bad869f6388279599860baf88ee31308e6e56182e9e2abcb4f229857d8eece9dd086cb3d503d11a82bed8ff279534f621fcdcbc2ac1d6bdd699b237457d9ef096f14175e9630de670d5ca12d70f908dcd5d918aef7d7ff8b9fa14b97792e7653dc89a05e139eb140179fab5b11ca6b6da21caee44f98d708273409162053258cef6c79f51504f83a9b80fdf5296128acb3ad4fb93d8278bd4d88ed7f75c462d785b54928e720ac3774e4201996b35a8e5a5bee7b36427963c7a274bd4a1a8750ded491b5fb2431febd80f9eb5a594339ce16ca6508e5cde12b37cbecd6e985b6b09e89b0de129e9bddc5ce8b5a84f2d6f0f4049539d9d6bc0ec1bc2d4c305d1cbebd1ec1bc3d4c305dacd36f4030ef08134c17876f6f4430ef0c134c17876f6f4130ef0a134c17876f6f4530ef0e134c17876f6f4330ef09134c17876f6f4730ef0d134c17876fef4030ef0b134c179f80ee4330efb7097310c31f2b54df0873bd8bb81c617cc026467f5d8192844136b7015623800f7664a786fbdfbedd00a17c283ce3932e3e853721940f7764ae8cef0cb6982bad75066f82503e928d5adb1fea5d2c5e2fe95cc3bacf22988f86af677dacdddbddda88e4d108eb63e1e95977b1e4dc1aa17cdc26caccbe9aebe2f8cf8508ed1336d1067f23d2c565bdb741389f0c134eab0317d6701e80703e15269ca54ee29c8a703e1d9ec6bc8b5d1dc72094cfd844e92d7ad3cc1bed2bd9121159c70fb706ccdab4eb1c04ecd96ce43dbf0e9fd8e91aeccf2194cfd944395c731b7bd3fe5b197c6c7d771ec242a09d6d99882e08f0f3e17c22b238726eed89e87884f5059b58fda5748a59675a4a6702c2f7a24d7cbd187e71a5821f5ac5acbe2655680bd92084eca56c563a133a5da5f33442f972989ae2563fd26aad8a998270be12269ca54ee2ac4438d784a7b3cdc559443b2394af8629679638f905a8ed10ced7c284d3eaec4b6b380f44385f0f13ce522771ee8e70be119ee92fe39c6c22bd8b60be1926982e8ef9bc8760be1526982ece597f1fc17c3b4c305d9cb3fe0182f94e9860bad8dafc10c17c374c305d9cb3fe1182f95e9860ba3867fd6304f3fd30c17471cefa5a04f38330c17471cefa2708e6876182e9e240eea708e647d9184cf3bb88ebc5e155125e7a338c2c36e40b6d01be1901fe38ec805d9cc2752902bc361b5d22fe5a70e59c44b380d7c0bd842f397b03c359f9aaa3b5890a9b219c9f8467928c8b8dfb1508e5a73651820793f88e26793bbbfe49ad5c04eeb36cd4f0b1a5cc3adffcf63711cc753661e2cfb436b34304ba55b23474f975aa0508e0e73601962280fa8f0d4f104655fdcf7d6a782e4a822fb259202cef8405c23308e61fc234865462f3d9deda18d22484f3cb30e12c7512e74c84f3abf03cdd6fede4adfe1482f9c730c1747148ee7904f34f6182e9e290dc8b08e6d76182e9e290dc1a04f3cf6182e9e253fbab08e65fc204d3c521b9d710ccbf8609a68b4372af2398df8409a68b43726f20987f0b134c1787e4de4230ff1e26982e0ec9bd8d607e6b13661ea3be55be441e620d9eb5d5db2308de77d918bef07b8a3adff72e5e4028bfb78972708a9b3abe8fc81ac8f1b6401e8e40fe1016901673a435908721903f8605a4c5a76f6b208f40207fca4615e38d09758ef1a02882f7737846c85decb8588e50fe6213e54612650b5bcce06b55d484984a912be1cdb68542acc16e4959610bec4e08ec3f6c82f55e968677cc6be468a5f7b6b93564d6de2f1f8c90fd6a13591f2180876d67cbcf7cb9f829cebe08db3fb3511a56b374be3c65b19d68edd9652384f2b78e45e97ac5b22d42f9af8eaca3dd5f6cb419a1fcb74d94edfff2948bf382cf4358ff938d67197fdaeaacb6a677ad14aacec6dc206b1356472290ffb50932fe83c6b3f9812d6286a5e50f1a8fb0056e2002f7bb6d7090f3a6ca9bb94ecc4af71e066b1ccc717d1038582c2b6425e258bb158db559bf8722ac119b58fdcf2794b6a1ed4c9f4fa84218bbd8c48897195bce0fa861f074ed3abebd10beae36f1056b84bb385e3d0ba1ec6613e508163f16e37d85bc42744640be9c804076ae319a8711e21c9b88f3d1cdbe50d4dfd0cfd319be96321621ec6e1361f0e9d02e2e1e5a8a70e68609a7d50fc15ac33907e1ec11269ca54ee2dc0de1ec6913a7fa29057823a729ed0e0d17dfc3bd09a1ed6513adfa8e4e65275ce3fa6504b3b74d983dc5a57d58d65f19b506ac1702d6271bcdf6f406655d6cb6af4228fbda4499d833b954629dc6fcf71b5dee991c8140f6b309123aa400606c1cd17b1b1caee01eb601085b5e36fa814a3a653fd0be0863ff30b51c4b6c4e71b6d672dc15e11c10269ca54ee2dc13e1cc0f4f379b8befd88c472807daae66e227ae5430eb1f47b086ad1fc236c826b61e7c03af153495d7ceeee1ea81700dce46f947957eb0c6c55291e7a0b163b99bcc5a23671dc2b95e98aa93129b65a0b5ea64178473489870963a89733ac239341b7d39e93d4d6fe3645fce6708e6fad9789ef19fa713570b72f9697a538471836c6284459460ae4fe7c05888306e988dde1daae1edfacb485b2190051d5946aa0d228b8f83d672e5b508e646618269f105626b30ef4130878509a68b0df58311cc8dc304d3e2a4676b30eb11ccc230c1b4f812a735980d08e6f030c1b4f8c288359887209823c204d3e2124ad660b620989b8409a6c567716b302f4230370d134c8b63dbd6605e82606e162698169750b206f3320473f3f0ccb970710c67254239321b286393a73adbd4a99710ca68366ef1f44616ad0e535883b910c1dc224c305d5c40761182b9659860bab880ec620473549860baf8ba7c1d82b95536a645e39a7c2ee751cecdae1180fd70223f7c313f6d1983f76be1bb3a56aba3025b683f47684777ec4417bc3e86c55c6a6d7d8c8310ca31365126ae16d4b9f3e886026c6e8e22be6b8278b9786681922ef699a1661e3f85c1ccc95ae6ad2630460c95c159f37979b81fff09961a07f01f5d7c442c273699ad1003724d42af466837f0bd6059332b8612a60832479ecc1cd1480e636865a2a898f3ee41c2f33dfd78f8a2c34ae6ad8009de44c5bc27989bec1d19ff71a5688a8f2f45b5d37f3c9b62f3eea3c43cfca8f0b8426432c872cbf9f9550c3aa5c1fe1a061f1d8ba678bf3eaa99b7159b28acdb1b9bd51515effdc5063ee70a8aad22df4e171a5542a5491ee959d12262aada52a8929fdb246e105089269dae0cd930223e25542152a19a5fa756b0a8914c2af97f6f3d95a28df9611158f8c4bb3dc7b4dd9863e477731ae4961f9f5a13f25d72b562c85c117dc9536fec8e49e5919f7f9bc4db98d5e24686d8549ea6f68fbefbfa244995a242488bceec7f09a4bb4c76914d8744602db2393ce53df15a36931f5c238c827f39ff075461c0d843090200 serializedProgramBytesString: - serializedSignature: e54639bf612e4b8fd26fe18cc248923f50b26c3b4eeb7b75b62199c86b805112bb778e845b598f4bda58acc5de9bdb68096236e856ac94823172990c19bbfb0e + serializedSignature: 704a32d302c76e20fbad28778785281a60e7be63cfa8d93ea463f422cb942af47d50094fabc6127c3c9fc758386279a3b74937a7c98d7af94eb05211146b5c05 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bf2ab87fa81f13b408e7c2e992cdce04.asset b/Assets/SerializedUdonPrograms/bf2ab87fa81f13b408e7c2e992cdce04.asset new file mode 100644 index 0000000..6661df9 --- /dev/null +++ b/Assets/SerializedUdonPrograms/bf2ab87fa81f13b408e7c2e992cdce04.asset @@ -0,0 +1,20 @@ +%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: bf61d954ecb803046953c666facfb904, type: 3} + m_Name: bf2ab87fa81f13b408e7c2e992cdce04 + m_EditorClassIdentifier: + serializedProgramCompressedBytes: 1f8b080000000000000aed5a4b531b4710ee115a3d40c48fc410c74e6ce765390656e0942b875c0cc63629db5008b8b852204bc2914b122a2427f65fc839ff24a75c72ce3fca31e9ee9d4583766647121a8888774bfb9899eee9feba7ba667b4091ff0107378d9814d588105d8860a1c40139f56f0dec033780bcb37e010efaff05ac2ba39b869a1a4e3b6f818af6bf8d6860e52be8132de6b5c5f842a3eaf216d15dfa8741f7f556c259248b40d0f611d9ec3acb86261b1c3446d5926482f91c1eb32bcc3da2a0b459df85c358b9722d6b4b9ae814287ed5ec08fac5603ebca48730875e4f9923966bec3ab609df8969577ea2785bf49f99e907519f9acb69d90f7a4a4991a80c61b822635044dba8726d42fd7078f582c3cc1567d823897a0053e13df19c0fd424abbe311eb5422b0157a2075db4113b79081c6fadbec5b1db8074b5aeb5f153945ee15be96b0458d994e47bbf823d2050957c7b3aab86e1bcb1fb3e793f3d6b066019ee29da8f660119df1450f971decb68eee5f852dbcb698df1e8a1d6d695389dcbc976613790651d8c09210d016bed759c2225f7f6649ab2cfd1a9675784c68e2a8b08cf7b7dc5b54f7437cd6f5b92521d3cba80f46537910f2a1991ea23624bdcf7efdde22676111823e352dc330e9538c885f2396788f6130c8783cc9053c168369e658d912f8f42a3623080eae635443bd7f0778df876f6375d12343e6bec61a742d5cfef3c662e3e0efdfbde3aadd039fa60d71dda25a1cb0c42f2f66221ce255f0bc648104ed855fe8e0a7a951144f11fea05d8ddb0d6e8014cf4cc70d202ee22bc5d92137e970e3a614a72e058e58a7909289415e337dda8434419cd0419c396d88ed634a1cc49923bdba10d3a147306b40d0268309c1091d829c8bd59d22b88d6541f2b3cab5359e3117e001f651e1b9b4883ff2b1b20c563bc5334ed1dfb034f198537239df83b91eef29c6bb00e05c629385923a0b7176fcfa8c2db4c2bed51ab975727d5b679aadb3d097758697d664194f63990259e6039d02d91e05487603e39489f18513324e9b185f3c21e38cce4979f9f7f64c9c7403b538e43ecacc559520ce01e2e8fa77e04b7d3bf06576e0ef631cd8b52626e7ceea5c85ccfca166befa078f88bb64cdee32a9634ecef9912edf9833c213a7e402ece249ae7380ce153c776b77b0b4862044a44e9ba59e32497d4527f523a3d4fa1923907703c94bd87e9d5b16e1276cd1e11a1baf707c1b85a63993a633a3b64fa8ef6052a7f11482ecb12a33cf77c8e9807bed200f9f152840ff1b43d47703f324ca60b750a2972caf7d9b883231d336d17e64e81b76c7c0a64590fb11fd3e6f2b85ab509d76769dccbb2369a951c80b91a649e1dc694afbcda994b46ac2a7f95cdc1dd29bec525ca5de26f43e34f85a2960f09cf7d79101c91e0659919950c5329710536b7febc8f3b5b4a3aebf7966102eab47b0534a4ef60081aaf05cdac6f32f2c497b8902e9f2894bb0a615b01e739a52e4c4a48962b7c602aadf14a8aeb9848aa26397c983217e1cc001059cebae832ecc3cc635e872a20bd6a7a71b744fb1f12f3cc82f8d05547b8a5f7d7656502d8e0554730c55daeb61fe686409c470bb9fd1548796daabb8d26c7129f1abf4a63ed4e43f27f90d3575c94786e9bcc587e2eb97b4f5ea1c99b7261c79ebe8d8cdeef5597981b2fb9bf0ff4ebc0b64875b04c2a40421187f3e7739fed0dabf7d64b1b8d55d4fcf27f957267b6c54badc8f5ac38c4c196510ffc2f5204ecb5dea781f9bec1ef1a605af33e03c57c08102dc972e819b91c09565f8767af60c54e177a1e00ecaac2b28b30a945fb984923a7a65cbb5460798e60397d100e629807d7dda804532ae31002ca90076db2560b764b0065b724d1ee782bf8b69c3b3093fc88f6bce5b08271480f32e01a6fca8a4dd497606da942bd02614d0eeb804ed8271ee6dca26cec04bbb024f28e07de3123c4a34bbd99f7137630c46c1b402d95dd7d3867523710c00e38f77cec7b2bd404d681b4259259bc7d2bc61e6d7972fc972ddbad8143df9015655c1caf89244bd892d9ef1945a42c94b7cefae927dfa4f5fdc87c1feb588e7695fc2ce13b0421f4dd12f8ace7259aed3f4244bf45c8c557c32d9b9d69fbec109e389dd7496838a5c3f605e85756c5c61a1e8f0fe057b42fa353d320000 + serializedProgramBytesString: + serializedSignature: eb20a4bc56a9320fe99714595380891b036ff08b77977fc82df09aacb626036dbf4580075fbe0c101e4b7c9aebd7d8bbb2609f23e3358eaee28dfda5b2bd7d04 + programUnityEngineObjects: [] + networkCallingEntrypointMetadata: [] + serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/bf2ab87fa81f13b408e7c2e992cdce04.asset.meta b/Assets/SerializedUdonPrograms/bf2ab87fa81f13b408e7c2e992cdce04.asset.meta new file mode 100644 index 0000000..3c779c8 --- /dev/null +++ b/Assets/SerializedUdonPrograms/bf2ab87fa81f13b408e7c2e992cdce04.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0cb53f1275b984a4fb54157395348eb7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SerializedUdonPrograms/c32cc53bd23a00547a10cbcba7eb2e89.asset b/Assets/SerializedUdonPrograms/c32cc53bd23a00547a10cbcba7eb2e89.asset index 4f952d7..e56c9cd 100644 --- a/Assets/SerializedUdonPrograms/c32cc53bd23a00547a10cbcba7eb2e89.asset +++ b/Assets/SerializedUdonPrograms/c32cc53bd23a00547a10cbcba7eb2e89.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5cd95b144710ef5959161039447617115d0501a3b20b18736b0089927810ae1c26418445891c6617cdf196efcb9787fc47f9a3f29ac72455353d6ccf4cf51ccbf672c4e5637ba6a7bbbaea574757f73424f2023ed635f85a1273624a8c8845b12676c4365c4d41b9053ff69d533f2b4a503e83ef1578764de4427ae267c8cac2f70cdc95c52ef47c2556a1dca0e7f3a208d733d0b7087758bb0ebf4568653540a74571473c120f45c6ea0e21b1449dcab2ce42b9ac26f89e143fc3d322318583e4e95106bee6e149999e6d01d34ebbc7e25b126b0b9ead429f92d8049a4f8962d3bd84a00b61170db24ccab251962979dd2befa19768c6fef25aed7b42966db2cf3979df24cb76d9d7b976da62d921fbf429f7403771c343dbe9d729db9f57eeb13cad8ce1945dcaf569a50ecb3392ce05e51ec6b572361689560ffd165976cb7e39e51ecbb432565a9619d9f6a2728f63fca619e3a46c7f49de67e57dbfa75d8fac1f50da39f5589e95cf2f2bf70dcc78ad9ef11c8c4f29f7f87cd0e657bc148c2d242db2f27b60772bd0224fc67145447747a767b82322e946fcc2cf100dbb0b26ff120830deb048beb62bc6c518eb0d3d56abc2f7147daf408b0d223ae41fe24fdf10c8dc26fc1415572e43fd5d8a04e8cc1bf06444dc87127b3d11a3e09c8f3d549660d84d080745b100df2f89de1360dbdf324c24747b6f9f39a06947a52da871007d09f79bc4e13c7dbf264e8bc4fd0cd4ed528cdc86283909e54f349a5ff6125c73632e48c8781ef9e0a4abb743a0a3a63b200d729fa7b8f0462307a11184be7148ba61439e66813f7c9a7883a11d643070ce481aa30499e5aa1b13799a7be77c08c697d12f216fdf36de37c58d4059786450ddbd244145c3ffec4cfcf5f7e8db8349b768e3224fe9c4b910d18280457ac356da4721588464b2a1808c7ae1b738f831d5b1e6eb08bfdd6e83dac5574023cd4c6e05581d7b13ee0368fa001e94c40b62708e98c3f4d2a79d02924a11c0fee9338c491dc4090ee2a67a431c1e5382206eda93ab02317e78049b350886f1a043f0048720e5962f8c22b8087576f2334d4f3768c6acd0dca17b1ccd596004f5401c1fd082e515f1128c78cb9ecc15c4f35489eb3bb39c3969377d52495ec9ada464f3cce88ca281318a42934cd6bdb6fa2f7c92cd1e31d08234c4939cc5212cd6af462d2eea12e12eadd48bb08c7e2abe97b99d1f6e2747c488b74e5c60fdaa9c5882c70ab6ce36ce3a6935351d63a1635e0a5cb025c85c3bc85c732c77ced524d07c0e63bda63cf9158cc48d90d43844278d70b8e4d7394f2367dfb4cafde540eddb9e1f90de3a2d3d6d7a0f69b6fe916cef05848cd71299059ad59fd1d3fd5a346e87f431339c7e96eb227ddf8aa06f9352e9349ce2c223569ee1b225b4dd4a5ea4664b655819ee00cfd8d4174153fa08dac45958dbc1e4f5d5e53cb89195899cf3a403d3f2b8194f33875e7bbd7346352ec5c70ff3bfeb1efc78ecb29a7c316c7c1d7a2d0c7a64fb3d9cede38365c26b156c1e57e671ecfca46eacb3dc582d3496ea6978f53cd688adba117bb911b32ecf9e55a49c0524cb9486d9bb428f2016d93b4271b839c571837e7e8e711fda57f7124feb89b7e988f7e97c3306f1761df1f33520dec13930552ed4d181f1d90e515981b6f15d18df055cf522c1fb708e7c38eb132e9c059d1777721052e5374621dc6f7e180ce9452e2a7a0dab436f58a73954a872dd282aba259b3746d76e057c29f2fcd14fb6f796d02f45f7c3a5ce3ebbb8f8819a1888a2e27ebd8acf7084d1242eb3eee8a59cd353eee628631c1c8cc272564f38cd592501f4b42ebe3a2fee88cf80456ed3a14c7befd84e9dfd2a9eebf40db6c6a1c8d6384cd63828444db9d3596146672c57f66b2c594ea7649b4feaa8d34960be4c341d9436a1e667a237412378b1727a04ebf3adc8fabc4afa1cf0e9b37ace74baece110279ffdfe40623bb73f51db187f2db216ae93164602627c2db8d569e6accecb46f6eb65bd1c65ccb77167d597cdffbe67854eb6a1ee0570fb0c337b2d2b3b0c73844e1190784dad47604db24c16b30d6da76028d414d2d5ed5160fb787c44d9ed58765989fabe65d9f36c09e86cc0c871562ae774481738a42f7b3c6e027829917fdb68391cdf27399ec1f5731f9795b57f1c3efb747c8e727c4e78f8ac8c69f3b90331c1e6b20c3f0b94bf6e0770aaaf773f71e7f571e43baf936f8c936fcc239feadd5e9ddc953a892a834a2b8e041774128c7312cc6b63963abeaaad69f103745da1f511f6c127e114a2b5a99516733a0c6e70187c6d306ed95a779f615ca2a8b201df4f493aafdc41b1a55aabb8a843e46d0e919b7b8838191e971bfa334377f4998136f87e6013b0aa9d6e2fe924b9c949b258e739c93d0b999c31fa7538bcc3e170cba35127db73cf7c3677de39c4d9615773c8ca1ceba6a7cb36e34836a093ec5d4eb20fb511cc6fb36ec99e3139993e9a71195c1ca92eeba47a8f93ea716c7da1b7557649e3ea278ed4b5f3e5411d26ef7398dc8e944d4c801fad293bc7fbcf26c232a514fc5816eeb54f53cb12f49d258fb6e3649e36200aa2b2460b7bf78aa36f01e288eac2de3c11febeed03a13f72ebdf81abf6f465756f146758e9a2bf19f59f344d49891c5a80346d381c37493f54b59ac8d3d6c7d52aad299c8b8f70b413bc0dc53f7766137828a348c457b9a1a386bd7bbb4e049c838a35387b8ea666079692b0172ba894543251406ddc320919bec35ad6827614a01204552ae921fe49cddcb4baf39afe80d24e21fc274a194a446fcd1b606817ecb0717e5b0d10c32116331cd1092bb31a3f1b157056fbf87f3ee1143264ed0042af139f29224c9a8c0869d2efb2cc2fb6a1917e8db82c0adef1f773bebbd9152db25184ab2662742bc175aa1e50ae4a5b0cdee6330865ca14942905ca3b26a11c60acb29a3d04a3300f9b8239adc03c6d12e65e06e6285b6ba3e640ed37056a9702ea2787115483966a0cd4d30aa8774d823acec45613af650c2aa1cb94121a1525dc33a9845c48540edf173208ef5553f0661578674cc27b4ac28b03af13b80e6ddcce35065cd214704201ee5393c085255e8baefd388336d86c0aca0605cacf0e124a770e3b760473d8930a94f74d427921721ec0ef8b1bb4d3eba6c0ed51c07d7090767af497adcd0a940f4d4289436f05ed03d60eac5653609d50c07a6412ac8b8c53972877c443d2db30cfd9ffa4e2b84d400905e0599300b70b5d12b42d9b1cbd29c752c0fbdc2478dd8c75ea5e4b1a5cc3a74d01d9ae003977588034e8cec6806c53809c3fc879da9d4f1ab44963cedda240b96012ca7e09e52634427b54e76cef6688feef788cda6b8729903b159017ebe1f83a7b3dea11f49402e4d26101f22846d02605c82f4c029909998adc07a68c82993305668702e69787094c832e6e0ccc330a985f1d26300dee16190333a380f9f5610273fc0882795601f3b14930e3659d06a1349675b62a507e6312ca3e0925fed50f1ea439ee9966521c9bf36505dc8dfd168dc392c631cc6cf6d947b33aa57cf8ef96f05f75ec429b35f8c5b2724c2b4f7f1d58f9838e68c7458369869fa1fa4e15c1a397cd9ae9a516e7c23849f77346ac35402b79fa7bcae32cffb270fd73be54324327081741f336717c6352126bc4147e92ff01480dc0d0125e0000 serializedProgramBytesString: - serializedSignature: f241aaa4c9705baa0133e08ac608f70dd306f75349f3283b5cf9b9fdfa10330c31436dcd76d2519bea402a09503e5f2be4577ad7a87ed922c3f009102acf0c07 + serializedSignature: ab912fb70d3dc12d7933051cc34415b635b6264203c95536858e4f226a913832fedf297258bc26bfe1ecac3cc79e930b78c27fe071e77b25c1a962a98481d40b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset b/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset index dc3d2aa..c2e1562 100644 --- a/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset +++ b/Assets/SerializedUdonPrograms/c53b49d553e00a648aa3280ae05f8ddc.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5cd9561b4710ed111292d87789cd6067b1bc210136d917b318e380710011274e0ec6208c1cb64832c7c953f29ae73ce423f203f990fc404ef2986f48aa6a7a506ba67b46426a18114b87e9999eeeeaaa5bd5d5d58b0824197c8c9b7059672b6c868db134db6687ec00ee6620dd87aff964e53f6239489fc37513dedd64a31e35f173d588c375019ef2ac00355fb22d48b3f47e9565e07e01ea66e0097377e02f03a58c20544ab359b6cc1eb298d1eb41629d2ae5799e81721911b84eb3efe16d8698c24692f42a0697557893a777fbc0b455ee09fb86c4da87775b5027c7f680e633a218f925c0e8869949234f433ced80bf28bf0ff3b453c8eb10f230ede23486846794fa571b5dab7e84971fb6bd6fe2f997f87380d789f07b19afdd125e7b84bc6e210fd35e1bafbd26afc6ac8d6e0b4f9b15bcb656c06b1b4f83025f0d3ced93f01f13f2fa843c4ce336fee39cffbf6c7483bcdc087f6ee7cfa365f06bd1e897f03620e4f50b79980eda781b34f908fce8c15b092f21837acc7db0e14d76c492c4dc35567ed7b66a7a776a24dd8817fc5ca5660bd07d8e8080a467a5a9df16d8249b90f6ac7ea345e07b86ae9b50224b442f3b9bf8ddd10432b707df8ce016f2903f4f5e051d4316de8cb14548b1d653360e1dfd898dca3a34bb07ae25c3d6e07a44f49e02dbce925e22a10bb1d759019aa687db871c0bd02378de230e57e97a4c9c6688fb05c82b90bf3d008f3b0de92b6acd297b0eee656dae71c8e43cca1d9d2adf74a7969a66411ae43e49b6f95a23e7a11184bef132ef86c124f611e36787265e63683a191c8016388d7182cc28c99b60491aa3561c08562ea35342b97d9b784fb1dbaeb2c89141750f9204450dbff8e3cfc3c9bfff590c958a36c99234440d7988e6062cd24b187d0e0aee228442c114326a87df90c14f43e5ea19c26f96cb52b9ca15d0482353a9020c0cc51629202d105b389ce56010756824d5c883838464c8f4624c056b40066be4ac61f5f6236eb0464ee42ac28a1f39825105825e3ca8106c90214871dbb65604d7d8129f5ba17fcbc09b02e460ad5d9e9f86b113a54269d240c10c8f54a5dd31462bbd65c3588e6f33e19b806bad3954692028d1400a3b4a8bacbf9165446d9c636905f5904cbf0887f1b556fd3a036aeb6e1aeaee8240c71425bd84fab200dc5d9fad65ebb38df4392a9d1654c6914a7f8d32fd61a76e9774ec7fe1e3505f54adbeb04c7dcd67ede096c181bce0a16de50eaea36c65752a9c9b57fb2ad54464e8d184fda733367ef90c749e16953225f259ed1ed2b40139b2a6202b90ee101798bfc5e316f7b6dc35d375824f513349ec5bc69cb4c39c9714b836d3843d3924b79b1eb21b7ff1acb2c9a8caddf7cadc3dfa900df8a6e06f8b8756f87c44f7284325834193aaed3e59db5d42dbcb209115da211a7b844c1eaedb1571d02ce3007b644c628a2934c57851f7f6767ad4edb4a824ed774379bc2628b7aada1e90b5dde982325ad271c518b7a9da1f9439e20a08b7ab9437a452def0a994d72173db24d58e56b75d8ce1e6e86d961c8173f85195b3dcea122dbdbf240edc1df0a5b287c6117271d719d3c2a5ca5975ca348e9a182dc79446d42aee92a998ec6bed0ce31a7c77c87dd9c129221b5c8bba619fbac9f57785f4177708e7cd824a37dd2addbc51a56e7a5484dfac9270af8c302afd2d298e76ca57d494fb542cbf5d25cb3115e1ab55128eabb048548b45bf8ae56b55b23ca0227cbd4ac2832a2c6e548bc5908c328e70b805ec188ad34aef2afad6311aae0fc1016dd09a4b867d07d537a9b7623d7ceb4da5bc321b25dea2d4575432720fab70b825c321c3ac40da0a6dc5c0d65c674297bb43db56e872174e4ace51c0822556488a0cc8754ca5c7b83cb85658baabbe4e214f16aecf483abbdce2ea60e91b37b4d6a1856c85a1d325154e632a7bd189d301949d81a65022a45bace38e50f5388ca87048ca70788f89ab65ee6b65a67479b2820da2fdea0ce41955c99392c9b3a851af2bdc5f64481e3374c972eff103a4d6de61655287e16b1838b99aa3b67350f311d5c0a73c4b52489d62e54f90b1ed7de85de86fd64e7aa6f7b417779a545be5cee8fdb4bba65e52c8743426684994aefc4514e70e71984b64d102a42964be68924ea056835cab812445ef374e694dde5c4c626b0d721baa7cefc824f0902ff818b8feb2c1cca35d08f9b7b449ecd98ad712e42d22606d28d6e08c089ad65d80679b661a79f8fe0639e1502085e8dfd609512b2b2e4998e3b5b8c3570f503d368a50ddd10955d78935cd52d32a775e0fa0450245d0a67482161640cb51245d0ff030ea7ee1908df8bd9ab9fad3edd53b07a5760a035ed14a768ee86ddb07295a3bf01be7ef88834c4262250985f34e7878ac44d9ddb41847c9e39f14c651effecf439c14863818f3370e591101f98cf775fa8c3eaee12d0e60c175c690b2b75fcd49a068896f099723dc69fc4b5418de3fd00925ee02ed09ddc39ab06983ac5917640d02641fea846c905b9f399f3a8042e5addfbca30fd4115da00e08a07ee44750a7ea10d47e01d48ffd08ea9d3a04352680fa891f41bd5d87a0f609a07eea475027eb10d41e01d4bb7e0475a20e41ed16409df623a8e375086aa700ea8c1f41d518da6b03b54300755627a8380fdea213ace65135d795bb3a98130505e0e6740387d6880def902d5ab471d3451b70215dc03101b87b3a81f39a978bcc6bedbc515d50360a50ce9f2794a54b1c1a476c6dddb94580f2fe79427966434aa72e28c302940b3aa1bc2c19a77334a8e03073c01ef01fc65eb46e1f10007ea01360f100b0b82c577a00b9fe3a7b9b00e0673a0144af521af4148f3e6883ad4d176c2101b6459db05987de9d21cf012f527f366708e02df967acd63811d406659300e5439d50c624038cfad4a3d6c1e48a2e30bb043097fd04a646cbd40666af00e6233f81a93124d706665c00f3733f81a97199571b988302982bfe197e3442a96df86915a05cd509e53087b2c076199ec0d8b01dfd55ff485c6b87d7165fb60bc0aef915588dc39236609b0560d37e055663f0a40dd808bb3007ef52b867b52e1a4742791c27e1b19a9f709df89a27d93a3946f8a3f525aabb093c6d525a3cd596a45ffc4db1cace73bbd3f43e72f605c260c8fbc85ecd745b8b63743249ab3952d7e2a29524fd48f222cbff58d47b20493fdd1caf81ed7973f425abe4df38eadc7af39f7ecd5f691d514964b31afb468f564a2f4bed2663feb4eddac9fe55a96dc74f6bdb9573f444a76d9bd4cc68c3467bbe0ce9e47ab0cb5c2c7544f6503c956df6f45d86ffafc01b89619a1da9a9dd85a7e7246b96a8ee33eb130e59df189d014f435dd3bbe02104fca71c480f3fa1ff00c28be7224a5a0000 serializedProgramBytesString: - serializedSignature: 287706b8849868a7c94236564bd4e999bc61d69f3a9fa270ce7d3c0aff67657d9ce9bc69427e25f8cef35d45d759340b68f52587cf643d76687177fc0748be03 + serializedSignature: 2a9b8885d55a62ec536d0057bebe43f07a2320797d1855ad5ef459619859de96e5af1419b8cf393e502d39079626c8525aa756350570bff0efa83498837dde00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c57748f31c248c94b8c074b6c01bc16e.asset b/Assets/SerializedUdonPrograms/c57748f31c248c94b8c074b6c01bc16e.asset index 1557e6c..42f5a5e 100644 --- a/Assets/SerializedUdonPrograms/c57748f31c248c94b8c074b6c01bc16e.asset +++ b/Assets/SerializedUdonPrograms/c57748f31c248c94b8c074b6c01bc16e.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec5d077cd5b6f3d77becd552286596a68542d810c22c2d236195300a01da028584040804922661b5b4a59beebdf7de7befbdf7de7befbddb5fff962cbd7756742ff6b3efc5e6dff0218e6df974f7d5493a9da4537c00b37e627dad5f73d84c96c7fab3d9ac8455b055d65f79d675a5f5cfbe53cf67b02aebbad4fa5d64bdebcbb2eaf892fff48c75b07e4fb6eeaa598df5e56ab6d8ba9689f7b358a9f5f764ebdb52eb8e3f5d62fd2fb552c51a5a1fcd66f96c3a9bc6dac7dad541628ef8a85a3e8b71b9624daddfe3d87aeb6da9608a673240bc6a6ffd9a65bda916ef565a4cab74f3d80221d64aebdd62eb9b2a566ed12c16149b7ebc9c893f987d2995d75ceb7f63c6e2cfc9fb76f2da5e3e7f5ede2f91d76ceb7f33f97713fb1a5b0a9eb5b4fe73e9378177fc792b70cfe9bee07caf5f2d99ed742f6a747f97f76d64fa3299ee2570cfdf2b3acbe4fb97e53d7fdf88b11e37cbfbe5f6fdc0cfe5fd0afbbef867795f6edfe71c2def57daf7b187e5fd2afbbe7094bc1f28af15f2da53e6ff8abcaf94d75e925fc5dfabdafd6b325d5c62db54fe0dcb6e6ff9cdf224fee26ffeae4ad2795d7b5e2d9fbf813c7f13a1f396f6bc463e7f1b49ff8ef67cb57cfe2ef2fc3dedf91af9fc7ded7907f9fc0370cfaf6be5f30fb5e7ebe4f38f343aeb11fef741f051cf757cf6d2f8d90be1672f333f8acfd88a6419b289f2ba2f78c7bff99839745fa4e3cf3f91e9cae5fda7e09ea7eb0e687795ef56cab49f817bab7e352cd4f85a55fb5bb601bce33454ddd94e3eafd0685748dad76bb42b01eded34da951aed54f5a0b7a4ff7d8ab4fb31514fa7dc2fefbb01fde3f9ed2df3fb02dc5b341bcd90e97697d7fdb5f45f6ae955fd3ec0ce6fa4fa6e19e055c9bcd14ed3b4b5bc3f50d2aa0269fadb741b97c8fb01329fe7ed6f13cf65bb1d53f5f82b70af68f2abaab75f837bfefd41f25ed5c76fc03dccbf0af0d54ccbbbca99373bd899373b447e63f13d3c4b3e3bd4459ac3b4348727d3f452786fd2d21c914c33f26eed5d5fc0fb91f2da073c3bcafeae99aa3f236d0c9ae4dbcf9b6c94cf559f708cbc1e2bafc7491cbed5ca7e24c823953e2b3e7bbb4c7fbcbcf603e9559efd5dd2907ad6acbb53cf9acafe23d1aff59358ae0574e5bbd83af0ec0489c177daf727cab4aafdfd1edcf3eb9a240d91877aa6ea07ffe68714f2b403df405dec973ead44daaf52a44d85ed49cc5ccff701b2ee2bf3f851a65138aaf6693ff9fe27706f954ff3f35952a7154d7eddc49cf55cd60fd65cde1f20dfff0cee39bd511abd0d2c518f9a9f8ed052f8fc82f07220a0c5d3fd0aee617de4797c0ef088493c611ebfb9cce377e77b3658deef2fdfffc192f51ee6d78739ec53f59e9d2cd36d94efff04f7166e2d2436aa9f50b225f8fedac9273b45a3f70db857e5d10cfc6de5d1f27c4d2695d7c19a4c83c0737e3d44beff0bdcf3eba1f2f9dfe09e7f7faabc3f48e3ed20c947815d562d55fb9703b0e5d7c3e477ff807b9eeeb4147411995bad43643ec229b3b857b2f3e7ff93f74a6795ae99fa9733b434a6fee54c2d8da17f6167d9f705aa0d35f42d0aa3841d71b8e4f75f70cfe5bedea6d5ea71edbb1c4dbeb335bece49f235e27ced1decf7cead5b6647dd51df495b6b0b592eec3c799579a9f68a5d60f3d980d934b7947cb216f2fb8b9d79c48e4ce6bfc5ed4ede12efd4df500f8e92f9c4c0bd457f4bd5d66a769eb8e7e9e392af5cf9fc428dbea97c2fd2d218b066176b694cba740973da86976a7a93aa2fd9415e2f97f91ccd9c76ebd1b6fcad95fc6bc17729ec8098b4591a3400f7fc7aac7cde10dc73fa8b24ad1129d2f1eb31a0ec8e91df5eacc97219780f6591e9dbc8b63e61d38c00b2481cd8f6f29b1340f9aa7b9057ec78f9be91f6bd7a7fa2f37d4cda2b6ca87cde58de6739f315ef01de897c9a807b98cf49f27d5370cf656deaa4173b45a66b06ee01bdd8c94e79137cadd5e8e8e9255fec0a791d0230bd52a669ee421faf92d7ab41594a7ddf52d663768dccfb5490c7b5f2d969e0d9621b83b60db5ef54bf713a73da19fafb3398d3b7743a78aef2e772b590dfcbb6ac6dbebcbf4e5e8f01e9f93db4e72db9da6e94cfd578f68614e9f9bdb2e7dddaff4acf4781f443e4f54699d799cc690f9e2965f9dce6716b26d3b776a64fd44f997eebe11a8f304f138faabe9f9d4c27fee6b44a64de35e0396c53545f7516f8f62cf9edf9f25be597eb8da76da764bb495ed537b7c8eb051afe26396eb5f3eb5920ef6f93b495fdabfa20d0c6b753be806eda3bfeec0ef08c5fcf654ebf9eba7fcd994ed59bd879ccd9f69d27f991fd7fc26722d33568e94cb78daa3377caabeab3ee4af2cf5d50fcba8df2f1c03602b66da676f61ea087ead9bdccd94eb8d521a5e7f74b19ced7f2bf0f3c876daa2cd706d297cc1e3094214f7721c85ff5ff0ae78b248d2d405a0bbbf6ca0e78503ebf38895bfb49e05bf84efdcdaf97386588297be25290f65299d7c51a6f0f81f7b04f90e93b8cd2f2527ca8765af575e76bef2fd1f053e99b38d327de5f02d241ac9ad8387498afe57309e08ba7dbd2a3fe481f7aecb2e4b304cdcb99b3dfbb1ca4e5d72be4fbd6e09e63f5b7938ed06d598e1d8fd7685ca59599cafb6a2defabb5efaed170bf043c577421ae9769b85fa5f1c6ff7e84b9ef731f9557a9b3b16be5b75b817b0b8b8e3fdb7277eaeb4ccf1e93e9ae93dfb501f7905e4327bd4e3352f0364aa65966e7d979be53c76337489a6dc13d7fafc637d733e7f8fe09666c9f3ba9799c27c177cdc0dffcdd33f2fe2699e7d6f2f9d3e039bfdecc9c63fda7c0737ebd9139ed8567e515bee7f7b25d4ad9dfa8b253755ee9c62d9a1edf62cbd9f9ee14b49e634e5fb69aa35373652fb084cef7dce482a797347dba55d3a75b6d9eba285fb1ea8b6e63cebee836433afebe9d0b1e64b9c66e97df6c03ee2d9adb6e94e9941da4fc627730a71d7487965ed9bf7732479d4e8c17ee04f7fc7d7be77bc7f882bf57f34a3b68dfefc09c76b81adbacd5de7794f7aaaf846d642a7c941c7739e510f7fcbd6aa3ee76f219bbdbc947ec1ef9be13b8b7f0eada37050fafd8bad4bb0b5206f76a6570af4d73fbf3351e551b7e1f73da3af7491e2eb6f3e9fa3033cb26bf4bf48feabb147344b5683ca095d350f09c5f1f94ef3b6bdf2bbbfb21e47bd5873f8c7cafb07a04f9fe11797d54fbfe414057bde7dfed2e3194753ef698fc4e95d1cee039bf3ec11c632771cfd3a93eeb49e61c3bc9f635e1c352e91e97f96ceba42ff2537a2c6dde5ab6d753cc617b25c6ccaf816f557d793df92c81e11b209db231de04e964fbcdde02cf94fdfc364bb489a3e66b74157f4f4bfed43c6737f05cddc33642c977bbf65eb511720e3c65bbfcae7dbfe3267955fde6108d3755677e02f796eeefa07c4a6afe1cd37725d307e039bf3ec39ce314d977b2f793bc2e51f2abb96c556e1f25d38c5675f063fb7eecc3883caa1eddafc973bf944761b993335dc21691e976c4caf059e66c5b9eb5d37757eb46947e7503baa4fc6eaabfda0ea1bd99b61dec13ad5cd3a98faa3f7bd3f02da88f89f6c4457d4cd427a5bb9fb2baeb535d7552b51b3b19e4c1eacc67e0395667c0d89e491f8c2b7faec2681780d16866ebf8cd369d1dd51cec32f05ea5fd42a6f9d9455ebbc8ab5ab3f01c73f6a7cfd9f9f6a8d1d2af06f7b0fd53f3a1726e4bd9e40e7b98afb55273634a4720ffdfd869f2d4da9654fc8f91f967817b7efd563edf5e4ba76cb0adb4e7dd5ce4e5c5761d27af6aae5bd9c56ecaff7b661ce7f454ebcb941fea7996d475a50fddb477ea6ffe4ece6bc75e60ce3e771c78ceaf2f3a7915f756fed9ca0f66b2a9541e8ac6cb4ebd88bdacf1fe1273fad45f72f22878823c8e95e95e91cf777496774cada55bab7ddf43fbfe55f9bca796af9c638fbda6e53b067c07e8c75ed3f2ab02f7fcfb6c17e57cb8bce6499aafdbdf26e66c8781e7ea9ed3ee857cff867c2ffda46c3878aeeef97b357ffd1373daf0a978cdd678e8ab3d57b4e59a8ac47ab46cf9bcbf8b3ca4efbdf7c529d2aa31cc9bcc39ce7c537efbb29429d51a3155661358b2cd5163cbb724dd01e05eb5b3fcf9402dfdbbf2f92070cfafefc9e739e09e5fdf91cf07837b4e4ff921de664e9f871a1b163adf37c8057cf16bbe4196f725adafc03d7f3f1ea4fd597bf70b4bb429fdd57ce1aff67ddf54e552aae5fd8186e3072c594f208eaade40fe53d1cfb7cbb9efdd364f5cddc4f3dfecfb810a97df59d2e6e4f77fb0bafbdf09f2aad6717cc89cede08776defdc6c8747f69792ad93f72e22ef056cff9f563f9fe6b70cfd3293fe527f2fd37e09ee7ab6cee7f9cf48c65a6d602c835046aad8a27bf941a177e2a7150f6bad2c959da7b652baa3afa59b24c63d25e629d341aca9f36ccf93ef639f8f67327ddc4b7abb56f65f9c5be00df7e01d2aa34d05e51327e299fabb9af2ce7f789f723b4bcbe02797de532afaf99a30d48e4f595f65ecfeb1b90d7372ef35276d0482daf6fb4f7239cdf39da88143a12fb4e7edf00dc5bba3a70bead8f036f670e19d039f3a1cc29879c37e08fc42f3047108b31a75fdcd49ea7e259dd4f9674d4b852cac076d59eab79b402edb95a2f30457bae649baa3d57f3ebd3b4e76a7e7faef65cc9325d7baee49ea13d573ee9ddb4e7b28f6433b5e76ace6c96f65cd93e85da733597335b7baeda9c39cee76a2d7a0365374ed2ee53b53d12c3d8f7a04c55f9281bec07e6f417fc60ebde6055871b021afcfab7cc7f67c09fd203f87e17edfd14902f7fcfc72a56d90f3e5fe34b8dc97fd4f8fa51f225d3c7b672d28fb549ca98e0b52d4bb4e9437ed7f8992aafad243f63b4f7d3e4750be4fd5c79dd1279bfabbc3671be8f6ded4c17fb09948db24f7e4ef23dba04a453eff8b59d46771b29a7eaabdb3af545ed6550fb7d72553fa8f60f81fe2ff77df9ee48ed1d7fa6c622bf32675baf9effc69cb699b2c1d41cddefcce92ffd1de4c1af7f38df27e8fec91c6d70ec57905ebde7d7bf98d307d3cef9bcc1585677bd41f681a4fc468dc1fe91f98c03f7fcfa3ff9bc19b8e7d77fe573357fa7f29ea2bd57e52cf1e0d98be772dca2ea733c962c2bf137c82b1e670ebf84b8b77461d8c74e5ed577f106327d3eb8e7d786f2f97870afea1bbf6fc41c6d445c62136f2c9f4f0032c0fcd4fb89c87b55972669fc3495cf278374f0f9ae75d09be87caeda2071afec014b86a1476b6554a095856ae352f59bcafe526b853b26cb2be177e8c4127571f8d7ce77b5d65bbaf499c7a4ef32a58f4ff224fc986e6c006967c69b397538615b4ed7deab7950f93ede9c996de2ddb4f7caae81fe64985ef529ca8675334faccab80573f87ee32d004d7edf9239eb8c6c3f472a7be621f09daadbca17a0d62c813256f48d659c0a6b392fa4d6379bd65bc7ba6a698e48a619996ade5b61b387e4b115e057d937ab411aa87747c874aa9fd46c7ff57de2fd082daf2d415e5bbaccab3533dafeeafbc47b3dafad405e5bb9ccab0d33dafeeafbc47b2dafc4fcb6a2abcd6f277cf13b68f9a6d281ed98637d424cf1a2ec1c9e56f9b9a4bf2abe3573ea2fbfb77477f424673af55d7c1be6ac0f6a3cbebdbc577687b2db5fd3f2dd9339eb8f4adf444b277d42f1f64ef9e3eaaafcc46d011d7eedc88c6d4dbc33c040aea7897701cfa46f6b67651fa9fa0feae1ceaf6bbc774a7e1f576dddb61a5f1d005fea3da7216da7785799be00f0a97883ef551bf7b6f6fd76f2bdb257559b37477b3f547b3f1394077fafec59ac0d556bb3541baaf4a11db887e5a4f05f0deea1dea8f70acb2c4d0fb3a41e8eb1b117fac8e7ac36b2badb29a99371557706817b7e557d5f0eb8e7d7ed99a3dd884b9d4ef80da5ae26fc8675cd63701add99c3872aee2db9c674b0e519936afd87f43dc577640edb503d577529f15e8de77760ceb181aa1b3d92faaafb3cc53bd007c7a5ef3fded3a9cf09bdebe9bc4f3c57bee8022d9f19da7bb7faa870ec95e43dae7cf32efd5c71b09f33dedb49577d1b6baf7deba66cfb6865dbc72edbb172fddfb8a6296869ebd1e27da56e7d01ee2d5ae3d41c6d37665c731b077b8b12dfa8fd614ab6ee204fceef744d0eb07f35aee616346c634ac78621b4d76ab415f6601f6c5ccd4f74d668f4d0687796f7339ce9e303586dfd9d0ddef16f76d3f21f08f257fe70bd6dfbc1997f4ccd5ba979177d2db75bfd18a4e9c720bb7cf2b7b669e5a79abf52347200ff39e6b241f51eec1f8b0f6646d963bd987bbdd7757688fcb635b8b7e41b2f7d18b1deccacb3eabb86e09e5f7301bfb992d6189bc678b5de46e1a27c9c2dc1bdfa0ed25674946fde34afaaf6a2aab6d86b79df2ff352f376caafd60f3c87b8a9793c653babfe07ac498cf547b0037b59e2727ffc840de07b98cf48e6f09125d29f2fd3dd5e3b5f35571407eb34d478210ef617a8bce23b1b9eed62a037da906e1278a6ec4dc5fb18895177706ff13e7993965edac971e567dec289795c8df9655c1bb546473d4fd827cabfdc5efb5e8ed9e3f9c8f7728d51bc00f95ed97553b5eff3005df59e5fa55f5cf9a7e2ca3721fdb9f1b1f2fd97e0dec265d2d9007b28975a3ba2747699561e968e4d7a193c6b08ee53d16a04ca029627bf4e73e619977d794cce53c6a5af3dd1d74d9765bbc8a30c3b2565a8a517abc13de07962072d8fb55a1e1d111ea43e26ea92d2c7af0d749a3969c4959f6bac464396ddaeaa5f32b54d03115a6aedc54ce7bd5a0b95e01facb71378f1fce03a2f20a3ee334ae4a9ea4e5b8d877cedb9a6d3b56cc3f12cb56da8de6b739cf1094006e91b74dd074e04df4e74d24df48183b46fddf4ed6a5ea825b8b7b09d22d7151528db0f59e398721c9fc38c6b930a16c97bd56eefc612fa5fa0d68e75d3dea9bff955cd4d41df3fbfeaefc7c8e7d81c818b75757135df25e7afd51a9ff82c67bac45a056d6f5c5ccd8bcdd6be57cfe5f836a6ec9a614979636aadc0f0e433c79a25fd5937c3336d0e353644964996bc1fca1c6b1d62ca7654feadf793659358c79baaccd5fe4e357fb193cc7f6edddfb279121b3567b83bb8b7f466da21361fd3940d345fa6dbc3056d69cbc5d5bce300700fcb4fb5616db4e77b7ac863ae9687925d5f17d4467bee258f3db43c94ef4f8d3be7817b7e956b76953d99a0334fa3334f4baff19a78ee82d798da77a8e650d3b54755392b1dde053c87756d0133dba37bb1649d92f3b17a9b3443f57fb7d7fe26be50d2d5f32b0269547c3665c71533a71d57049ef3eb22e6f4132db2f998f5b453b6c4778b99d3ee2a91f70bc03dbf96029e164b99c78077fcba447ebb17b8e7e9c6ca7b1963b1c142270f091b42e96b7b8d5765cf9469bc2ed77895b1efe220669df806f2ba425ecb355e9782e7fcba52e375a526cb2a441665ef5620b2c8f88bf14a4d96bd3559640cc53888b916afd4645163876a4d9655e039bfd668bcaa7df0728e35be5a7bbf103c877aaacb7a35b857b25a7560b7d64e3a6c415206d6c3a9a72a169fd2d3c22c2d9dca7b11abbb5e2bec648cad0645e09ed35e87d388e53969c4d45a404b9ec2dbdde71d53ebeca41d16577e9f6270cfaf32ce98f259c6d76b7541c6754c8c1154cc1b85b98ccb956807649ca8b88ce39858dba4f23b0ce891c421be41e3618396c77e1a0f8781e7fc2a630425da1a1923688f7c67fa043d19e34aed5f4860a1c6cf47c8f78bc13dc752adf550986ed23055f3af8ade911a1d158b6701b8e7d7a30126478267fc2a63be3450eddf3aa74c89f723345955f9c9386689fabf497b7facc6e3711a8f32ce4dfc78c0e3b1e019bf9e80f07880f65ee751b5511b111ed5fb13351e4fd2783c495e4f063c9e089ef1eb29088f1bb5f723b4f70ae7d398b39dd4713e5093611d78ceafa723df2b190f42be3f485ecfd0be3f0dd055eff955c67049f82554cc15a5db2a2eca97e09ed715398f159ba47d6788cf54ab3e1d0678b7d2cdd631f65abfd781e73c9daa477ad9ecafd155f3e50ad30310ba07d44177a346772352d63add03cd746393b5740739e9ebfb40e3325e5da24d55fd451dfbce94aed4b5ef2c2ee3deb9dd7796e0fb100d17b5ce44f17d2873b4ab09fbf450700f743ca6d6d6a558cb129bc25cef158b291fde59329f52706fe9f8fc2c995efa57e7c9f99ff9ca0760d8731e53fec02576da05aa6d527b6e944ec8583e099f918cf9335fc5689be6e451c47091b26e7308425be9f1391aed73246d39b71b9beea41d9b91a45df43a425b95d9b91aed736dda0bd41a9fdd34dabb2469cf284168abb6e53c8db68cc5a3d2c7666ab4fb25698f577ba4942da96225b504f79cd6fd201d7fafd609ce023ca9b22c74af4b0959545f7ebea4df09dc5bf9ef35dca6b997da7ba2fc4e1768fc5ea0d169a8d151b19f946f60490a1eef62b564aba58f176ad85f28f3917b2f1736d5befb32f5770bd5fe49551e2af64d4b70cfd3c9f9ff858bb4f417cbf42aeebcc2e992a40ce26ff04dc267a8f61b0cd3685e0aca56ada300b172c47b5886323e4dfc72496f99cd6b915a53a5d7bb8b342ca48c8b941dde99e132a8b5634a861f3519bab0da32cc0d500655bf2fd664b8d89621915e617985569e57c87472fd43d1402dbd8a9544559eca37e6158bbaeab5aa1f7a6ca319e039cc43ada76985bc57b1803a837b7e55b183cac03dbfca383e0d96837b7e55319356807b9e8ff2d7a8f840ddc1bd553ec50f6bfc5c03f05234a0df3415366a5c2d7df48931f18d765e8bbbdbbab058f989d41a7fb5af4df929abb4ab1a3b973bf3618be473e9d3d0f734c46fd274f7269b8f92ddb574b700f9940c2a46cf2a90463de757b507b929b8e7b467683cae757ecfd49ae90aedf96a700f6ce1c5b7dbd7d2a3e97856b413e965cc9fc4fc81a27fa7465fc6e689dfe54c1fbf033ce757197328b19eaa1178ceaf2aa64e254b895d229d4bec4aa0bef0e77b6bf2dc0c3054732445e01de759ed2774a3f7f7687a2f63ff2c19aea5bb37996f5cc5f8ab7291cf62700536404cfa9a63f39ce9e22aa6c9abe09ebf7f9f799ab360ca3f71bf26dffd52bebf6d5a4b5be3b4e20f4a9e952f4fc5ea5800eef9f56180cd8352aef9e01dbf3e20bfadd1f87b443e57edca02905ec9add2f1eba332fd1a8d8e7aaec648a9b02971ea20537e67350e577183d669f7ca4f76bf7cfe3873f6277b81e7b02e3cc11cfd091a5b45d5217d6c28e31025c6868a7e5d6343157b22e09824093cf601f7fcaa6219edaba5db60fe2eb6485e8b343e5479eca7bd5fade5b39f96ffd3cefc13dfdda8bd57df491ce3325649627f8ffaee6aedbde2a7d8992e2ee3eb34d81fdca75167636a6e43ad0d2d95745dcc33c6d4d801edf71bc5c43ece49d61745ac920d10047a31f74785a92feb3e248c936ecc7ff19f9e22db1ab6defab4d47452d76c710e580d1bcc728c27757514fb3755ee79e2779195a24c103da041ad2ceea8950567aedcfa570a8e19abb69e4f14a794f183c6caac37fd598175e55f2d6283d83ceb9f93ca1c2bdb724b094b59a1f5bb52d05b64b15d3b655d22f123c9f46f665a34ed13d3565a4f14a095d67db9e07096f8bd46705a2ab89f6c3dab11e7b7ad624bd938ebba4ee4565bf62aeb6f539e851232338fe683d3b0e7f6f16caa98f22d6938f703847df75f89d44789882d800734b0ab61c301c2f238b25649fc87a1ddc8700377b2a431484016733ccb6103840d3cb31682de65ac2da159bf6dbc87b2dc94b29891e1c5dd5948902ce1470ee9143bf1eed73f6ce4146d301b204c982e7588960a584e2f5bec64f62242a3460d07724675f86326f8c536a4591984df4e5726d2792f80c6a2f3731680082d60779e5345ddb3ff2ab23e5821d8ac55320339992602dcda5d675d0c62f0c64df036cd34bc75b727a9e06d9a902b092fff3123d80c41b02e1e30041b98106c563fed437af8f10dbaed5de3d72265f5f68a5e43137a22aa4729297ab3ad67b6d9385ebc2d13b686b24638df5c8a54a9387253c5d1b3ab45fea931e6866b030de3012d94e11d3c37598c6d1cadfd6a642ed056a24069d8c08abd91a9d885f37959bd14fb4471ec718938a098e7156ce1f3a6be9f56f8e6b2d8529445df1465e19753ac441a9b4aa455e6fb59bb0b2bafc36833e3cc3d58dbd56ac82cc53762bd15da95a6e60143b08901c1811cc13606b62e3d2b7fa746cd34b6384708f1a618f1b606e2c73db87a672fc49b9988f3875b633d834ebc054ebc39c6793b03e7cd5feb36ca0be72d4c5a2b9c638519d45afeae425029b2d27ad75bde99f6d161362b6d7ba1b41d6a0957370b98dab634950f87b083912bbd70dae385d30a2bf98ec60af1f0482f25bf0546bc9381f8334f3feda9426c8911ef6c6c610cb0a420de1a03bc8b5fc0b732d50621cbf27ae955a78a2f97b109826a8da0186ccfbaadeb9eb5aba838fd53f4ac41708b55b236a692118a505eaf2533535811258262f0a5b39debd2c912a533d045e9f8e5182ba1b6a65ac94b687b93107aa5ccc22be5d6a6a21735b5ac5e8abe501890dcc7ba44c0b332e042dfc175a1771385de2f45a1fbe7152bee76a6e2e6a5d2dd4d7177c38b7b1b8cf08e3e09b737e991685796d68b1ecd61b6c79e633e38601deac10ca3655143fba4d0167f1cf12a0c7e2183e59e4267e9b8c0f4b583a9f445d3b2b25e4a1f36c385d6ef75569ad5429a603521db756bd24b94cca01425131ccf582975349592686aeac7adc1fdc9b6215326d00bb66c7abb2e9b3eac2eb7865f4eb112e9646a8e79bde9eba639ee8537c79d31c2fd7c12ee8211eeef93f0b626c25c3907b821dc0727dc15233cd027e1ed30c2837c12ce32d553d173cf26ada7b8a3695e1d33bae61a98939003f493c250e8584b0e37b9f16dfa4dfbc6ec758efffdfcf7f3dfcf7f3f51f9412c76be95293bcdf610b32ab84fc0e830e7f147fc3acc77c0880f0d8078378cf8b000887737101f20462ef53344a51c98f055e1ee8cdf11acae2123cd606447aca8470650d43d4c452d863fa5f552d47cf586bd06a1d2caad4638714b2dfa2529e1e45fa52ee69d5c17f32856d7347afa3c6245dcd354c47c2a81c7a4f13595906d2a5f31985a522fe5cb53ad16a3f7ea802b32dfd25acbd7244677bd5394a51f7e1a0ee4aeac2ce6f8d5c8fc14e9d4460b65a3621053b75e2675e3d3de639861819bb1496982ab5c6f4c99c7fa55e63e26ca7c3a8f879ef13b9dd7d7449cfb65f30c8a652e633db79e786efd4cf5b24bfdb5bb332c5a45e2ef606b65bea9560a0f46aa16367d6e907a36bece46dd4f96e622ee8fd583097eebc1008cf244bf94079ad452f885e693aa65eddd27eaaf71d6b7cb2c61389d0a61599976aba45642beabd05de73f59e8491633eda1f1c611a61583b0666657b49919f94cdbd1c95f9e9a991c2cb72914b90dc6722ba06842734dba2a5c8d8b32a2abb3acc66d8af5aec84a6f4f18f1e7763bb25ed01b2b72486a87f38bd43a3bd5b5ce4e133adb1de8ac5fce30dd1d622a5f3e12e1a14bfc8e44869a88735fee0c56db393a90b7613ca8095f4f27bc9cb5552717cf6b18a6a8335145fdf7df030e48fef2a4a8c3b1dc66a5caeddfe42f4fb98dc03a8742bf9dc3488cf26cbf9477c228cff14b79144679ae5fca3b9b28736394c735f06b8cee82d5b43d02a869a3314cf6f48bc91803e501594c6e80adbfe551c1dab47c83bfbba6991b4dd9e2608ba039c49ae8b1a6b2e525b0c0c4b45eb4f3f1a21d8769e45e0168641ed6422e445b48c6d2361cf231fd5fe457ffc763721451c831012b92e2008a64a2a92a0b7ff9ea7aaacace850533c4f795e2094f3d8ef19d2d8bd98a802bfb62d795bd4454f611292b3b950c587330c9a422bc144bdd340725b87a4cc6746f4900bab72b467c6900c4a760c4970540bc00235e1600f1a918f1e501109f86115f1100f1e918f1f20088cfc088af0c80f86e18f15501109f8911af0880f82c8c786500c40b31e27b07407c3646bc2a00e27330e2d501109f8b11af0980f8ee26e2dcb8e01d72e0c6c51e98286b0210654f13713ed65f9b78a18df579e0a6a6ff36f86f45d37f3ffffdfcf7f3dfcf7f3ffffdfcf7f3dfcf7f3ffffdfcf7f3dfcf7f3ffffdfc7ff8f134cf2f4271eb9318625d3e9f22c9d41291c1805a8570e2f37caac1c28c32e1f45fed08c5abbe4d3d3dc10358bb9b9ee0219ab3633d98be4cc41f77d8c4c37c13f262d302edba636fb24d67c56c39b3f779739e56597f792d817d5d97c006a616fb52708995c402434988c5be3cf6b5efc5be7b99a8f35daefb9b60f1b0cb75a14981c4c694fa0ab701f776e458a0073bcf78806b35dac8ea0eb7e197574c9916994a6547feb02204a532578419a9949204bd94f9404bc26d4df5856141be0e122535d87549f9e51f2bb522ac0938d8d404f060390b2d9d29b5d21689d21a6bfd2fb6eef9cad6a982432f4d44b14967c4bea385f5a233f6f61d85bcbf6d4587b8aeb5870a5de8964217bcf18595f5625359f3c52d87319f8b5b4a4c94f98c103f5cd2ef8c50a989385fdcb929913849fc5feba716f16638f12526e27c13143f12b6d6cc19df33e46d6b8fceca689c95a558553cd25415b9e28c650556c33096ed61a9a0976ab70c5384a30c8a10f3a2086558591d6d28aba6318322a428abe518f1630cc43b7824be02237eac8178b647e2e518f1e30cc4877b24be12237ebc81f8248fc45761c44f3010dfdd23f10a4ce34f34693c371df90d5f08b5d631f6d855348535a203e03b2ed779aa0d9518172799b8e0b116d55802c6725f6055f97dd940cb74f692f7de86bc07882d9f7cba3b4c319ff205cdc562815a25b3635f056b449d6c687107884daa7c0d78fd708cec19e3674967d72b5b6675aac21af6530d0dbba71ebeda4499576d7e4c75ad1eded40ea4e8e16b4cb540ec44ad0e592d98c0ec188545759861deb59f1ff3ad0f213864fcc7ac846708251c969612fa910353bed5988a9c6950113e3af2a2226b4c2a22b613ef53ef2a620719d1476cf9327f1edad23ef228588539cba030f1940a73b650985d5c2a0c955498faacc5d4e71c530be3517dd699d447ec19af9fb0c93000318d4be25c837ab094ea711eab2b7c72105c63c5bfde54fcbc0f38df20c8164a105d05cec055601f4cbf2e30e957dc9b7eed6b22ceed3e7eba762d1b926f055b6859b015a212a913d1f2456b5ce4c97edc80e57b9129dfa622dfa9c275b34a566c2fb9ed67ca8d13bd98d51e0cf00340bc0c06f63711e76b582f61046b580fc044b9d4204aa547513662c42f33103fd923f103319c2ea7c0e920536e5c7ff9f1e186833876f1b295f1600ca72b0d386d6aec0da743309caea2c0e9504c94ab0da25ced5194c330e2d718883fef91f8e1184ed752e0b40913e53a83283f7b14e5084c94eb29443912ab1a3718ab86b75dbe476138dd68c0a96f136f381d6d203e4004b9e18d4b264379d8d4f4c367275a92f1dce0ec66ed595075fa28375a9730fbb08055828bba0fad4d6d3bdd94c007782244589ef1cc14fea3bea4e047a0379f2cf4d668d1f1e3d6b343c63366ff1d6352786e8bdcca0c960c77c42f14bac7872bd3046535ffcd27a374dbaa9a15b00ab1a1d28bbd732c56c36f33d4f0679e2ef0d4f91d67aa842230d0aa7aad84dc84e7c7f9568bbfd7c8222f1479270f9ff453bd6e675e674bef108a9ce3429183e01e53d1e34deac00373dd69ea5eb635f627e371853801ab0177996ac016a206e4896179b500b6d0fa3d97d9914d4b3ce9f98958ce779b726e2f725ec8068adf3807fc2d2fee1a4fbc9c84757cf7183abe0dcdbc757c276315fa5e43853eeec15f3c1d54760a46fc3e03f1e6af75f37438dca918f1fb0dc42bda1cece9a0add330e20f188833f6f8582fc44fc70af4414381b66ce5ad40cfc0883f64203ed023f13331e20f1b88177a247e1646fc1103f1128fc4cfc6883f6a20feb547e2e79888732bfb315333e8d7ca3e1713e5718328ddb7f026ca7926e2dc107e82d5b60007720bf0499630b9f47c6ec1f339df940f6f049f62c844e742661fb6cbfbf555e255be5801b456f662e998331798b8e016c7d32c85af50cfe00e3c830bb1b27ac65056b95b7a2bab8b30e2cf1a88efee91f8c518f1e70cc43778247e0946fc7903f1a33d12bf1423fe8281f8d91e895f6622ced3bfc8fcfbe42fc788bf6420ded7e394e21518f1970dc4bd4e465d89351baf60cdc6ab69351b576165fb9aa16ccbdb782bdbab31845e3720d4c02342d79888738be20d56dba2b8eaca2b3d8d9caec588bf6924dedb13f1ebb0b27d0b2bdbb7d32adbebb17cdec1f27937ad7c6e30e5c33b89f798a1ebe18116168a33f9d62746d77cc1029ff529328caabd743f37620af7be41e1e21e15ee2613710ee707189c1fa605e7cd189c1f99e0dcda00e758b184c91f94b76035e063430d606ce3182f35e056acd5f9c4d0eab46ee7add5b9cd449c8f653f653e57a8dc8ea9d76706f5e24b54bca8d71d58b17f6e2a761e0c155b23a6d4c036e3d49ab12ce15f732a44963c11338b95333b3858165b6e3de15f6659ef6d6f577f4f8a732756b65f18caf66f8f657b1756025f1a4bc05b05bf1b23fe9581b8d70efd1e8cf8d701344df7624dd33758d3f46d5a4dd37d867c068878e07c595826f755999691d8a9c626f476a2d504ce16298bac94c5d66fbe9a93dfef2d80e0bc7add6ff51d73bbe4fe7bc61d8a439969bf151df79863f17e4cfd7e30569c869ed4ef01accaff68a8f22f6fe3adca3f8871fe9391f3069e387f0823feb381f8bfff7aab950f63c47f31717ebf37e28f6055fe57accaff9656957fd4940f8f73febba926e884a7e1841fc304f80313e04feb7f5cd4adbf585deb884cb34cded7117901ea71933cdc60fa9b190da6895e0ca6274cc4790dfbc750c3aeefe4ad863d8971fe3f33e7a3bd70fe1446fc5f23f1fb3d117f1a23cebb67c3fcb82723f5198c78cc48fc7b4f2eeb6731ed8fc710ed6f104ba7fa3e87294ec3586dc579bab337c5791e23dec840fc7b8fc45f3011e7e91bc7fc9b7a2f62c49b18886ff448fc251371de64f2dd487e9acc970d8407884353f80693fa9bcf9dc5925185cbd83e6228610f31660adaabc5e0deef9c6eb39861f38638d02497d53d6b1b148f7d627cecc3d32f96c855738db1035faf174cf3e436f8422dcde661f318efc232c939661abe6252575e8b5b186af1a8aede6af1ab18f19606e20db7f746fc351371ee5f6ae5a6a2a588dcf13ad63c6c1140dbf306467ccb0088bf6922ce9d1fad633e9d1f6f616c6f1500db6f9b88f3beb68db923f7b4d0ed1d1371ae836d0d3ab8c9a30ebe8b11dfda40fc748fc4dfc388b73310cfddc11bf1f74dc479e3b68d9bda93c203f40146b87dcce0c9e2ab5b660a0bbdd46ad6f8729a12e0b32a155392fc582093ffca0b571f6258763060b9bb472c3fc25aa28e3e5ba28f31ae3b19b85ee691eb4f30e29d0dc44feeee8df8a718f12e06e2af7b24fe19a662db9a548c6f60c39ca505291c9f59e218676e35719bc94eb55628e0b2946e556f0ed3cf31a0ba1a802adfd11b505f60c4b733958247e25f9a88f3f459862ea1a1c72ee12b13713e42da1e1b21ed90d608e96b4c95ba9954c95e99962714a248ac47b30d6c6eae160955a906f61f57322faaf08d89175e5add4d9d490f6fa5f5ad81f80071445ffd9ca96272824e964fd6116e83dd31e6756d688f585d67abd0c98259eddf6175afa7d11c6be2a9ee7d8fe961b6490f7b7ad3c31f30ce7b19386fe2b1d5f81123dedb40bc9947e23f61b0f431c0c24f22f602cbcf18f1be06e21dfa7a23fe8b89385f50d7cf30a8f6bda0ee574c94fe0651b23d8af21b467c80c9a3e591f8ef18f18106e26f7b24fe07467c9081f8d71e89ff89297e8e41f1a77854fcbf30ce071b381fd3cf1be77f9b88f3b15fae61ecd7fcb58b3cad98fe07e37c88495b3c72fe3f13716ea20cc54c9461699928ff9af2e12de3709389625edb395e0ea4d25fdbc96288868d306898d7d55c3113710ee5480cca9dd282326eca870b3dca046563665b7b15ac5c74cd5ee06a80e5b4339ed32ccb9c2ab2bb7d0f3935c472dac594533391d344a10e7c8d88bd7dc54b7e8db0fc469bf2dbd2985f81b82e1543292f7937c6f21e63cadbde053fddbaa911ce536e66cdb5ae259ef36d82e53bd66dbee9f9529a62f98e33e5dbc290ef24cf7936c3f2ccc3f39c2b0c5f9e3a69f67ac9b3399667be29cfd6689e33ad445cafbc49dc02cb7dbc29f72db4dcf585765e726e89e53cc194735b91b37264e01c78f38cb5c27898884b3f3ee197f323fd1658ce93dce4cc03c5d8e36e7b4fa6979cb7c4729e8cb76163c52a02db475928b48daf5af51e92b43596f7aea6bc5bd6d2b62281c04a8fa5bc9529576e094d315842e70ff66609b53111dfdeba2d70e3ff2cc109b73511e6cdebd4002606b6c62099667209e77a83a41dc6f9f40038df06e37c86694ac323e7ed31436f3783a1d7d4c4790a43af03c6f94c13e6c3bd71ded1445c9c754f31cced84e15418c08c58670ca7d9069ceef68853178cf81c03f15123bd11df16233ed7407c8347e25d31e2bb9b5a318fc4b7c388ef61f2c48ff2463c0bd3963d0ddaf280476dd91e233ecf409c1f64e985f80e182cf30db0d48cf1064b378cf80203f149e3bc11ef8ef5b47be1966c9e1818afb7ace825d63f6e67781b1ded8815c542435134f258ce3d30e28b0cc41b7b24de132b8a2243513c9ee7ad28b231ce8b0d9c7b5dffde0b23bed840bcb947e2bd31584a0cb0fc9def0d963e18f15203f1dbc77b23de1783654900f373fd4cc4f95e80a56e4cbeef71c2fd3148961920193ec11b24033048ca0c906479846420d6dc2c373537edacdbf16079c304317fb69225679679b00b7e37c863c8e74198902b0c42b6f428640e563ce586e2c92df0563c8331036e256ac0fdfbef0107247f7932e072b1dc56a5caeddfe42f4fb90dc180ab3035af53bd013714235e6920feba47e2c330e27b9b5a408fc4876395a6ca5469f8adbdecd16bbf3c02f33057631ee69ab43ccc230df90ce0a7b0108711ae6b1969724260092b4ad09b26705c2bbcdb2b1ce18cb89761a978eb77e1eeea98d709f735311546b83ea5c2a6de77c23476ad49633b3834169e29a07bcea65b1caf625ed78c8cc22ae73a93013dc35be5dc19eb49d61b7a12af733ebb6016c43e3e2d88d11824fb9a5a5a8f908cc14a7f83a9f463a2f4bd94e7588cfe7e18fd0d9ee88fc3e8ef8fd1dfc913fd3c0cfc030ce09f5de80dfc7c8cf98d6e542605d7e34dad365f9719db8db4d5d65bcc65a285e26dd34a7184831de9ac8c15d7753c98c5ff8e9afc3b61078389d6b55d2db952e58eb585134cb8f1cde9c4c76b3929dbe9eca9ed5962b9266f55a78bc32fd48c88774c0f36f45beac78cec213175cc5630fc61a84f345503aead871ad4c0d03c700d40484fc2aaef6186eadb650f6fd5773246fc7003f196f3bc11df1523bec9407c9347e25330e24718889fee917801d6111ee9b3239c8a35974799da7a3ec0b1779d6709fd87fbceed95f8554237b7f7d4b24ec3903bdae43d9cef0db9e918f1630cc49ff7487c06562cc7fa2c96dd30ae8f3370dd778137ae6762c48f3755038fc46761f6e009067b50b4931eecc1428cf3130d9c7fec91f3d9585538c95415f830beae500c59a2bbe441545659d5a2c6baf2532a4bc50e027ddf80b760a973b0a1eac9d850f594b486aa73b17c4ec5f2392dad7c76c7f2391dcbe78cb4f2d9c3648cf0081c317e805d7d9f0f4bb7a2fd4c83a1d290d93f6643e52c61a8f0cdb3f4bc6346cc9e58753fdb50ddaf5fe2adbacfc3aafb39a6eace7775387d067c3b1017d0f62d64896bb5a8e4de4fe09b8ff172ae89178ec024ebdf48e187182936187bc96d0196db79589f3fca6ab87691728d6203c4ddc884e3b9b975cdf128f15e58cf79becf9e7321a63317187426bbcc9bce2cc2885f68205eb2dc1bf12253dbc437a6c56693b64d4eca301cca3cd9a6781b145d6468b2070ce77274ac25879bdc2eb6e835568d557feba709b261fe12d164a59709d604156375e552535de96edddab524593b784eaa86d87f675986439598d659cfb24481a975ae59ac9ff86eb0c7dab418eb3e2fc3bacfcbd3ea3e4b4cf970cff515a906c27a066bf0b1652906f79526b8f9309a07862cb66e970a9dafa9e5324d6eb5e3736505c21eabb1ea0f3fbe95af71b797537b017b0966e15e65b2703d46845a6a22ced7845d1df3bf266c1986ee353e7d636526c2dc7d74ad1bc27d70c2cb4d84b9e97d5dcc30ff966dd4e75370f22b4ce4b93bfe7a377c8fc009979b08f3d6e106378437e284579a08f365af37c67c466f58856171934f2c2a30966ff6cb7225c6f22d3e59de1b63f956bf2c579928f309e5db4c0aed77fd613596dbed14b9d5606dd71d01b45dabb122b9d36f91acc140ba8b02a4b5a6dc78848bbb4db9793ebf659d897c57ebf61e375562324e78bdc93ae55528368bd58f75eadd32bdd78481d194bc4f9892ed6b495657fe9819b90fa663f753e8d8be58457c20808ab80113e5410a51f6c3aafd437eabfdfe981c0f53c8710026c7237ee5d888517ed42fe50331357a2c00353a0863fb71bf6c1f8c15ec1314057b0896db9314b91d8a15c9530114c96118f1a703207e3856decff82def4d18dbcf06c0f61158f13e4751bc4762b93d4f91db515891bce0b7488ec628bfe897f23118e597fc523e16a3fcb25fcac761945ff14bf978cc15f1aac9156152fd14ae881330e2af0540fc448cf8eb01103f0903fc0dbf809f8cb1fd66006c9f82117f2b00e2a79a88f356f2ed005ac9d330e2ef0440fc748cf8bb01103f0323fe5e00c4cfc4f4f07dbf7a781646f903bf94cfc6287fe897f239987a7f14807a9f6b22ce3d961fbb19f7a6706d9e87e1f1895f3cce3751e611213f75c3728a889017602c7fe697e50b31ca9ffba57c11a61c5f04a01c1763c4bf0c80f82558317ee5b3182fc5c0feda2fd89761787c13001e9763c4bf0d80f8151826dff9c5e44a8cedef0360fb2a4c477ef0a92357635cff1800d7d760c47f0a80f8b55849feecb724afc328ffe297f2f598b1f06b00c6c20d18f1df02207e2346fcf70088df8411ff2300e23763c4ff0c80f82d98aafce557556ec528ffed97f26d18e57ffc52be1da3fc3fbf94efc028ffeb97f29d581bc57788fb6da3eec288c702207e37463c1e00f17b30c01bc47d027e2f46b9a15fcaf761941bf9a57c3f46b9b15fca0f6085d82480427c106bfa9ac6fd377d0f619c370b80f38731ce9b07c0f92318e72d02e0fc518cf3960170fe1846bc5500c41fc7886f1100f12730e25b0640fc498c78eb00883f8569cb560168cbd318f13601107f067369b48dfb73693c8b35875bfb6d0e9fc328b7f34bf9790ce96d0240fa058c78fb0088bf8861d2c12f262f616c770c80ed9731e29d0220fe8a81f88091d66dac8cd5c7368c39cc5ed2c117720c4eac110e6efb4567538d352e3ce912e70b4ff80a5d3a5eb1452aaf9a4a65275e2a85a4a5e2a46cc76b186ce59ddef2f36d5d63dd5560dda1966c75738021f81a5669b60ba0d2bc6e22ce2787b3e20493c36f60b96d4f91db9b5823b983df46f22d93528fe24abdbc5e9a9a208e9d4d5d01bab9310ffec2117b1b33c7ba07608ebd8311df3100e2ef9a88f3f43ddc40d20d27fc1e56197a525486f7b1dcb22972fbc0941baf20bd7cead187589deeedb74e7f8401d48702a08f3195ed1b80ca7e8281d4cf2f489f9a1abe9d79c3b7b45e1a3e68b7e406dce4f53794fb001e1c2ac6f796d070a4a994d42ba3a13140181a74ac60e6c86726e5e2f6ce4037553bc5fe88cf31c2837c12fe0233a0720230a0bec42af2e0002af25718e7b90170fe35c6f9900038ff06e37c68009c7f8b713e2c00cebfc31acfe17e1bcfef31b64704c0f60f18db23fdb2fd23467927bf947f3251dedeba1de5a6c697e0847fc6b46fe700b4ef17ac187709a0187fc5888f0e80f86f18f1310110ff1d233e3600e27f60c4c70540fc4f8c785e00c4ffc2ccca7c0ab3f26f536e3cf2f478536e2d6ae78664d90acff21f934938daba8d55b1fa190b3b8f7c4a1ea335c57ab29ec01137c1b57368a2b0d97868984c728f5972ffc35ac94901b492ff62956a7200958acfc3d7d2b9312c14aede5c020ddbd5b5864df1e4ea4d8f574c9f62865211fa5410803ec54dc4b91532d5af15d2c0a44c63b9325586b2010b56b5a69946b9e3b8f4b93e9a29af3c36c4fb22d92319b57dbad0f64c328ae97e43937af28e770659c7db08cb7237b22c1b9bb2e4ee9f99a62c77719d25f765205936c1b29c4596655353961c95c200baae6618f1d901106f8e8135870cac1658a33f378046bf25d6e8efeeb7d16f85b1bd47006c6f8195f19e0194f19618e7f302e0bc35c6f9fc0038df0ae37c41009cb7c138df2b00cedb629c2f0c80f3ad31255fe457c9db616c1705c0f63618f1e20088b7c7882f0e8078074c554a0250958e18f1d2008877c2605912002c9d4dc479bcada56ebc7129e26d75c1b85e1600d7db62789705807757ac3f5d4ed69f6e8765b9822ccb2cac012af7db006d8f15ceca000a670713719e7e95cf89f96e26c2dc655741e1b2eb8ea15fe917fd1db17ab77700f5ae0756b45501146d4f8c787500c4b3b11a564356c37a99b2e4539bab7d4e6df6c608aff149b80fa6956bfd6a655f8cf23abf94fb6160acf709467f8cf03e3e090fc008efeb93f0408cf0069f840761a5b79fdfd2cbc158dedf27cb8331c207f8249c8b61b1d12f164330ca07faa53c14a37c905fcac34c94f976e483ddc09c623bf2708ce543fcb23c02eb200f0da0831c89b17d985fb677c2281fee97f228ccf2d94461f9ec8cc17f4400f0ef82113f3200e2a3b11238ca6f098cc1281fed97f2588cf2317e298f3351e65b858e7553f3539de9869981c7056006e663c48f0f80f878ccc63c81ccc69c80757327faece62662844ff249781256454f0ea08a4ec6889f1200f15db176f2548a76720a26ca6901885280113f3d00e253b13a764600756c1ac6f99901703e1d6b2dcff2db5acec0289fed97f26e1820e70400c84cac28cf0da028679988f34d62e7b96962bae28d62a18930df1378be1bc25d70c2b3b152bcc06f29ce3151e65b272e74c3728aad137331c217f924bc3b86c5c57eb1d80363f9129f2cef89b17ca95f96e7612c5fe693e5f9d8f8ea729fe3ab05181657f8c5622fac41ba328006692166755ee5d3ea5c84e171b55f3c8a303cae09008f628cf8b501105f8cb5fed705d0fa9718880fc8b36e634b58e6b6084f14eb828a8514656c1f56c4d4693f3c17befa479d4ac7b7f22eb1de78df467cbd49358d2b9b6e88f3954dbd6bc91f0c97d82aa6525349e4f392989fc19298ec38f76f86f886d3291114bda37ea36bd46f12a867d592d53b4718c24bb056eb669fadd6528cf02d3e092fc3da955b036857cab076e5b600da95e526e2bc5db9dd0d2437e0c6df0a13615e4dee7043f8269c7039568877fa2cc49518e1bb7c125e8511bedb27e10a4cedee0940ed2a31b5bb3700b5db1b53bbfb7caa5d15a676f7fb54bb6aac101ff059883518e1077d125e8d117ec827e13598f1f7b05fe36fada96f1d6fddc6327912a79dae4ca44b2f14ca23ae7bd347e3e6a333ddf080f59febb051d0633e4741ebb1f6e6f100da9b7d30e24f04407c5f8cf8930110df80117f2a00e2fb61c49f0e80f8fe18f16702207e0046fcd900886fc4883f1700f10331e2cf0740fc208cf80b01103f1823fe6200c40fc188bf1400f14331e22f0740fc308cf82b01103f1ceb0e5ff5db1d6e3251e6dde16b6e1af2477163e608cc3478dda769702446f80d9f848fc20cc6377d1a8c476306e35b3e0dc66330fbf9ed00ece763319cdff189f37118ceeffac4f9780ce7f77ce27c0286f3fb01e07c2286f3073e713e09c3f9439f389f8ce1fc914f9c4fc170fe38009c4f3511e793c59fc409268b4fc344f93400514ec7887f1600f13330e29f0740fc4cac23fbc26f47761646f94bbf94cfc6287fe597f23918e5affd523e17a3fc8d5fcae76194bff54bf97c8cf2777e295f8051fede2fe50b31ca3ff8a57c1146f947bf942fc628ffe497f22526ca7c89d2cf6e3a86144b942ec508ffe293f065266fd004eb36b60fa3f406cdb1a8e5592966b392c4ac11a7b652ded9616a39bd25965c8adee444faf1563ef64efa99ac54bc2f134fec5990d4d453fb957e75ed57fa4df895761129eb4f1acc4375b949650658b7bfbb5199ef7195b902ab3e7ff8ad3e576294fff44bf92acc5df7974f77ddd518cb7ffb65f91a6c3cfd4f00e3e96b311be77f01d838d799da9489bc4d9945daa63829e75bef56b36241c7bb77f95f4b86ed0d38082c8cad016bc05b83f6b524ac8b0facfe5e6f2a2281628314ace9c5c4b94232b80153dd78039faa7b2346b9815fca3761941bfaa57c33d6c3366ae0af87bd05abc78d1bf8afc7b762c49b0440fc360ceca67ec1be1d6b7e9a35f0dffcdc81116f1e00f13b31c05b0400f85d18e72d03e0fc6e13711ea6a75503aa303df7600ab4855f05bad7d4c54c62e44bb5b0104d7401efb734353fc60ea87503b5548b824bac9bba0ff3de6de5a6dd4ce1bdbb1f539e367e95e7018ce5b63e597ed0a495935986a7d6f3c5e2b0525628697b377eb636b4080376e572d49e4477935b17267f90f069ed1a9827e8ddd0c6f4f221ccf9bb8d9b424ee1fc7d1873feb677433885f3f7114c2d3bf854cb4731c21d7d127ecca4ef53b89e2ccaa8be9759dc2fb5d25588a79c82fabec2ca61add0a2c56c592d8d4f5d0b3ab96e793b0bfded6ed0df7439c3b4fa716c1cdbc54d51a618c73e81b5b6dbfa6d6d9fc42ca6ae01584c4f9988f3dbed2ce29ddd0e921ae1193c8d6590155006cf60f06c1f003ccf62357f079f35ff398c70378b704f8d307091cdb2eac414ab3617599a5ecaa659ff6bac5ac0ebdb0ab910ab3f5b68fd5b2ade2c6405d6bbc582d00ceb7f915543782bc15398e8d9cf60cab1a285f122d9f39864dd4d92f10d35662baa5004fc5c65f1b5442ed9764a560e24e3ad4319530be8792a334de7e9685ea47a01936a479354795a4b364b964db968b9397fbcf55a68a15b22429a42ceb1ef52bdc1df7991f1454cc61e261967a325e744d99657dda72b612ad9832eeb97301c7a9a701886e2c05dd1abe4d602fedfa9bf2ba56d5625fab8f214924cd5527a91e5654c966c932c335159741efacb92e4b2ccb2fadf2229e70cd192548b6f8ba4d3aec450eac985a3ce37dc4ea9105f1519eac31ceb1ddface105815730047a9910284db4b46ab2004e1598a621dc4c4240b4ec4d274b45ebb652646d635a8cd4650c2938160d02a757319c7a633d12c6a72d2ddc68138c54f02b2f92bd8649d6c724d940b40ee45bff8bad444ac202518e3a974197cbeb18f77d4ddc17ba6a8d0aaddfeb98da60962ff478b1c0b652b698b684d5b2ad2ab252f2e713058d52a1bb35a255e05f54d79233f85afc0686423f130a134950582bb8aeb15a3b5da2e499a041c8fa26266b7f93ac9348645d265aafa5d6b5b616072bed5b98b4034cd24e259176b5f8cbd666ded3556640a3dfc6e41e68927b1189dc8b1341f4f5d6da6b5ea95afb74d07907436750e6ea40b5f5f544abe4e975e15d4cda9cccd5813542a6d5c2bbc4535766a0a57b0f937b70e6e4e6fed022ebdf2c618f558a72addda3052bf7fb98dcb926b94b48e42e919ec45562ec9c7adc0cf3b1ed2f3d37132dbf287d80a134c484d2823450aa3d360d02e774e878c1e5430c97a1265c764e1b97a4a664a635f808936b9849ae09a85ca9645922fce5f618ce9e9d4be5439880a4f62be9c798a4c34d92ee894aaa8fcaedb165a578c2d38e935eb2158e11a8139fd4633337080781c827182223d21fe59847de2674dcfb5e52d3f08bc2a7180a23bdd56c67f9e458ad94d3f7542c3cbc9cebda25e996a217b93ec3e4dac924d758542e38b6867ed4c9b2e7e6f34365292dd854a373a75de745becf31f94679b3635279d9c2586bbfc0e4ded924379fe335f71eb02c270aee140e85c2b758db9e803d8fbb1e29fdd2fd129372179394bba3a56bf28b2bfde5eff7b60814092de65fbaf56cbb4d15141a5f61688cf6e61daf6b7ea73203b33a5f63b28cf1e61d37952cb78939da5cc6c529dbd620ca33dd399f6f3004c6627e3537f35aeeea707ab35be96beeb798ace34cb21ecb686702b89592273c4f35826ef21b3ea65033b02522ed6241b5c4302ec53de94e0c7149b88ead16a3e02407f67a2145d57f3ff11d867c1e36b3583fc8a746d73f0edf6338e463763f150e1399dfb9287cd6c30b223f60888c3721320d6d81ed350bab12ed509eb0cbab052a35628540994063baf53b99d67d9b1c7cdff32326f90493e4f841c06a6d9fb3f72c116d08ef7dd4fba07a8c9f30be2762b67cdd36df7883ed535fd6decf987c93dcd8b4588f582034b13a347de12f989493315f8b1b2967898d3a35a23d59ccc2b1aae5574cd25d4d922ef364e3719fd01a51072bc45ac4aa441f1da4a597c9b52fbf61684df1b3ce295ff43e65a87738b31af13b26638149c6224f1a5120fad8ca48ebc01f183e534df8ec95c678176f27821d21058dcc9f1832d3306b25fdd1d274ebef64bf58dffdc55f98e4d3fdaf0dcc1356683541cb19bc06fc8de130c3db5a22130e7065e052f9d56ae39c43ba2ddf3f18f7bb99b89fee89fbb19edba4cc7a3afe87c93ed39bdf2a55c9ad4aac82b0837aabb58f416be1bf982cb3b0b57aee6549b6395eea6350ed0cdf6e6d94acd024d9d18423642f3e9a0972046d5a39807b68e0e8a57efd33310cf5d926d4e7a4d1e39b467861f46ec73124e6989018e76a74eb6e54e47d8c9b7ce345c2069884734d120e4ed430af3b4f265be96c2fcc52f1acf62af0f44ba92126c3ee6ed62a3bf38525c5758d8fe2d60bf996b222b4b452af014b5fb24698647b78db3d63cf242eb35a3e35522dab479d6b8c49b5a749aae129ece6b156e954897637f5be125c0233352fd234c1a4996792669e268d2e419ed0bdda3eaf643a7765e6357db06b779a6298cc4fdf2b5897cf2c935ec166987c0b4cf2ed5847992777e7950a5d4cbdb6ca0b9fcd313ef732f15940683ff1a77b8b6cb844f6eee4b284658cb7ace9685f0b4cea8558af8dad1e2a12361fc740495124dea71e83d1fbac5a62122ec27aedf4d6fcd9bd76d21f1164afdd0a93a128f54e2cdbf2186c58856abf1f6bf1b69ef159f6896c8625f74cc15b89385c89af71726aa22d67a1e8e5ed59303b4a4291cb9e82beadd902c3a9d884d378576de954661f295596582785d7c04c59055b62722e76e36bf6db8f7a2fd1745aa6d6988c25d83e06effd626a4f61267bc9ad30694bddcc9d61abfbea9a1d74aee973bb172f7d29db60522ec1ec3f6f2328de064fb7ded83bed16326f7bf5b111f344e9a1a0c1a42d86c952ac7f82f9e68976c8b61e922d7445ca9ed49d85ef4586ad3119969964989c6294926ecb9b599ba21d266f9949defe69db14fcbdad53d506eed36955b7c1385f8ead93c6ad5cdc329d29da59bbf49c763b7fba585ac475ed7ef522577b4cae1526b946bbea2dea8a3191a9debe03265bb949b631ae649b29de15093d2c49b496f5215d474cba957efd3645567daa2fa93a6152ad7263a199cb6c3233af75ae2f9ba53326638549c69c14adbe6e914e94ad0575bfd50593a0d2244136aa7be695642ae25850dc6e8b71bbb7b7157f7a4dc91396d04ac3deed2062cc042179574cf2aaf45bf7ba56d664aaa5d80e93ad3af50a5f934d3b51d4a24aab6c55bc37cee338d95ae033474edbc3fb1ecc202c932c0c871a130ebd526837b72d9619bcdcb8fcea1b2ffc6e8ff1bbda6b6d84fcaadd96aa5f5e97467c01bb8e4d4629f82da91d30c9d7f829a9a962fe6885a5d5dc23c5db23aec341f0db0de3772dd617a7e617ee6dd5e31e2c135270ef9f4a5db7d6052163774cc6752619a7b86a21d3595d9549fb63474ce6f5ded6a538f550f5de6a4cada282ba9d774f6f66ac0726cb3e5ef7354359ecfd8f737c4b521ff3623d3144f6352132c863e9d6c891abb24652c5ad48af44b331fe3798f8dfc7538916a6c5bdf75274f35c9fcfa7d3885e18a2fb99109d85226a5e8fae66f9c3bd8ab23786c1fe9807d5eb7a2393d723dc98f4c130392008bd505e847063d017c360a309839d500c786d5ecdec1d937ab41f6f35c47f7def87c974607032792b5dff32f5c7643a081bc97a89d6a1e42a0612e3d28dd352f9956d0026dbc1de3c792a3e7b85b8e33d88b3ef5e8accc7b89fbdf122d5404caa43bc4965e203f6e963e50a476e777a5b33974e590dc2a43ad424d5c8b4cbca5ebb096315a4f242e869bd48948349749849a211a8446ea267578b7513b364146d9abd448331790ef7e69b4cb5eabeb6ff385d0f5d2ec6ed266cfeda7b1c9709027b931703b34d53f922d3a9354330298fc0d624d45d26b969c6e349c7a6c8f524ed504cda23319f82f73285dca52a5537b20551c2c330998f32c9bc9a85d31bebae1c28c76ac3311c8f0eaef5aa3dbb976eeb3502e3f6186c56dced4cd62c56d74c16657b351293ebd8e04a619fc04a61278cdbe352af4d30d53d1859dfe6578f3fc757c94cb6beaccd3d1eab23bd199e51985cc7fb6b47eb8a59e876eec32d552f32ef8cc97c8249667cbf641e537196f19541a9f64425bf4f5dd3eafada8becbb60b29f88cde80519a3124aecb53fc5bf4da7f5198de170523af3d55e71b0a5f53f3f918ee46330c94f3649be5bc092d7bf9d3c1693ff146f76323616537e0eff27190521ed384cda53b155e79887a04af45965cc34924e469c9f623d599fd2b3a353cad3be4d6f46230f93f3346f633ca7d59edebe346f94bd48998f4979ba49ca19ae4b132f03f76b9ed2cbc98bf4e331e9cff0e645a98b274cb783ee8b2760f29ce94d67cd7688fbd17a9e0b09d31fa94fc4a43c0b5b7f9d4ecdac7b2c93a951fa244cdeb34df2ba8be2505bdef46b64fa25391993ec1c9364b901d5bfa0572aee8a49716efae3ce5cadef5f1b18b753306ecf33715b1cb0b506658473f5fe6a194e299dfa56802174be37844ce54977bea1f7f15efaf5762a86d005fe3dc37e110a5eda6998b417fa1bd9994731ee6a859bfda7fe6bc2744cf28b4c92e3fba553496e1eb93afd527463d71998841763fbd1d2dbdbe4f644bc7464d80d93e112930c056995925326efed75eaefd3917a2626f5a56ed68042fdb2e50ce21c4ab77b4a213d2f32cfc264becc24f35086ad7bf51f1dc5ef7ac1424c92cb4d92e091a432bd5e30f8b509b33124ae48dfcf3098cccf90ee8adf399894577aed496856fcfa2fc7b998845799243c8c6536229d7317b93392bd373e304a858cef0550632cb7734ce920bd3b86f4d5582be88c0f527b154f3553bbe4cbc48865b5f5b67694b2498cef4f0e32d2c91e9824d760e35fb792c0de87f3caa39e247759575bdf1489c8014194c79e9814d77a5b33967a951f7f879f141e7cbb3c0f93eabaa056c229dd52d1fe784de2356e92f0635489fab4d86aeb6ab74fe96bdc7c4caaeb4d52f5a8d36a52328c177a68daa39baeadb300e3f4066c5e11e63a518ca78a59edddfa797236d5b64439de7cb645afed3cca4451c28ea8d1bed265f49a9b171cf6c270b811f376626343182f036f91538dbca08d6cfb7bd6887a65da519f6eb92fc4e4bd09dbbf965a43dd4537c0a5768b951719176132deecad6d996d7dcf75aa92f173d727887683f750ce9693e7b08ed19f5a538449750b369b92bae4260b6b83d79f72b90fcf4d1b135c5b598cc9732b36ae4e2dcf2c397b52bb24f2e44e4a5caae4b7d30506b616a78e229c9ea5be1893fa3693d4b5e31c98f24f37ce417ab5ab0493e0769304759f593243948d29264d706d657abefc524cd23b303f2c5da43cd5772e132bd3c68bb2378d38d3af8f4b3069ef34493b046d35794cee622b91aa97058cc71ec6394ee5c949a79d5c8ac97197490efc6c80ba7c8e303e6370a5b00ce3fe6e13f71705a673a668a1f848df8907dee2043f064f8ea883ad655ecaa80c2ba37bb071a5b337324759cb677c071576e61bbea60a7ee7458ae59814f79aa418a449a1e2be24e378ae16589beb432ad9d2e57f05c6ff7d6e7a52ac14f0fe32950ce9ade52dc724b8df24c101684be5ac8dc973a6dd7825fdcc33387dfa6ef771d7f625b895ca0bb62b316c1ff0b68ac5d4f227570dd87b32ea3ec1de4965aee13bbfbdde2a4cde074df2f6f5246fd2f6e0edf052eb9acacef4c27505c6f543de56376335409d385f66bde563b7e06a42b0ab9b2b311c1ef6b606c9bcea73bcf0b6948b282ba6d69972fdfade98648f785bbd8395308fb69a5cb7efb71caa306e1f35718bef64aded8dcc977606b78153ed3108da1aaec6247a0cc3dfd9e7d91a638e49378d5518564ee9df78e1b606e3f67137b3ce666ec3ee915b8dc9fc8449e6dea8ce716f95aa25fa8abcba3d545e385e8371fca489e3dd59fdae0da05e35b01643e3296cbecc6df965dac3b80e93e46993247a64c47ce1cde727e6558867f63ed559c206ad14e7b2d688f916f37eb2742879916d3d26db3326d9fafb928d3f2f12e38a204a651f8cf3674d9cf7f3cd79852176673a7cef8bf1fd9c896ffd2c1a6f7c27e7c9ca8565cd6b4e895805562efcbad5a2ce5730737c12dbda1bea71dde2064cbee7313f53faf2cd94d643705ab51fc6fd0b26eef55dcab01df5b74b39687b677f4cae17d39bdff2df37e1eb60eaee719a58ff62b116d69fe3057efcb4941902157b35c2003e2d2274cbf679f54f78d0fa3bbc6dc9e73cff9522a64fb9585362fb33fab2ac3a28bc64c1d738ceec9f9e310e3defc0f882f4d8120dc5fe72ac502e1150b329fdc13acd32b162a240d4cd1ab688af08b0fed52585c96bd81ff80da17475cbb4c0fac753f1531d178b72e66d45b1a53f4da4448a9685f4548ef4e626e9cbbc547bc8528d0fe08bab637dd2d4a6bab97885e7d6c0ac43ed6b210b6b8789779bc034b9fe23b6a575b35064030fe3d8555616de1dd49923acb5a61cfb09028592409de4668346cf44aea350337beabc8ad98718dcdc91b1268de2037949bc4a09d7d6022efbfc25b5a26dacd0647df76b7524803bb96d12b8d72881db4600e79c3ca80d5972f2210ae075999104ef757af0665bd44a126375de3796317d875399602d0ae01d929304ef0d4af0ba08f00a2470aa6553cb0f27cb416599f8b8481c7b9d275cb67cb22b0a4056764e02f9267d5761af97e0bea2ca5a15380a70356d9a84eb2d4ab8b26a55da02665e528a6f528c02a0770f4902fa3625a0ad8ca60a3f4f6e8945280a5035ec9284ea1d4aa8b615502d6403c5efb9e2534eaa768f3b41e89e7350150528af2f4c42f92e25943d0494ee20749ec5c58de7685a85b900dcf728c16dce9455983c626da6255b1440ead03309d2fb942075b36e92abc3d4dcac53aff8787135b377bc54086387673753cc34153015a1270ab0debc3c09eb0794b03616ba97740f46011cfea3c0f990129cce021c35c29d96f05aac123e1553bbc6b58c1b315180714c9b248c1fd1bb0b924ea955a21ae68bc1db5a49264ac095344b02f7312570ed057079b25ba84acc4ddbd575a598ab48b6791cda28c0f7f58e49f83ec9bcde8d177a571d41bd3bbb6f12b84f29816bc392635c051707305ffaa18b640b1805d0e68f4e82f6192568dd7d1a2870a35a14805d074c94cf2981dd4a68e37896dc633a87d9a725164b8715cf2b0a90b59c9e84ec0bfa0a6c57d7a88376f9b424685f52f7b6bc5a2e95ab199dbbe9771590d91d49a1ec83a3005fc192247c5fd18f62792be75cae1805903e2e4d82f43525482d19032b659c267014803ab94912a86fe8dd9cb3981a973aadb62840b5ae7712aa6f29a16ac4985c11cce7cda300cdcdf94968bea384a635ab7b001505c0dece4b02f63d25606d99d9656eef3153c62d17210ab03d0cfabe1f2861db82290f6e327c0b0c581305b05a033bebc7ccb8bbed35ca2a6e5414407abd2009d24ff4167cd29a724eaa2483984401b4cbb74d82f633fd4811daf0511df4548291e22ff43e327b3ad95e4cac4fe0454bd73681c9e55f3369a046cf967fb86112aadf28a1eae0302a929029f3c226343db1a461951b89c30020180cfd9eb95163f48642a380e3fa0ffa093bde56c1000e3c04931ec0c15e5a5c293a899a88e8dbd5f39230fe495d6193f61934647587f67461ea4665e6a94098b84d1a69c4f53043e92fccf7863abe85802f321ccfd6b14af194d32b61da96027e5259e838ff0b6e09c8aeb5b820bb8e5e333ba57f2c3bad8e24dbc58acd6c4f53d4d93ed605647b5a3b9fed626342b6afa5bdd975ac27ccf6642066bb1eb664a731b79d8d2e94aaad57ce3e52d72bfdad9789e26ccfebd0b36359b5bef0be0836dbf5ac6cb62bb757b6e637cc46c7e5d975ba37b2d3ea31b25d4f5365bb9c03cc763902ccf6bc11233bf01590d93e97a766fb3076b2d1c99aec3466c1b23d780db3039d26cf0e70556072b724ec6893bb1c07f2dd927fff3fdfc838906f64fc8783f09c44c1b646ff47698df692dab5580258c3dc9c446d939f2cefd7697b7107ea5c76a9c5e54ca93476d3a9ec5213bfcd1c966b8f980b08d2b15ebf6549f3ff5ffa8d564ec0214167c89fe174506ee546b874a0bc1640c91a66c0f561efb95ec5f4b3cef57866c32d31c8e06c4f05e73df1249cb130c1392892701e174bc2190f139c399184f33a00678330c1393892703e0be06c182638732309674bd076360a139c432209e7700067e330c139349270ae01703609139cc32209e78500cea69470f211b9ee7d73b5133338109b5081b88025416c96099d5c8a6a25649f1bef43e9e06c4605e742d09f370f139c432209e73600ce16618233379270fe042a7bcb30c1392c92704e02dad92a4c700e8d249cbd019c5b8409ce419184f30c50d9b70c139c832309e7bb00ced66182332792705e05e0dc8a12cef62cf558c8e97fcfa19ccc20f3c0ff065ace366102735004c1fc1d80d9364c60e64410cc3f00985b87094c42870719987f0230db8509ccdc0882f92f00739b3081392482603605aeb8f6610293d0342203b31900b34398c01c164130b70060760c1398515ce9d11a80d9294c608e8820986d00989d29c1dca60e309dae0ec2eea70515945f80bebc4b58a01c1c49283700addc362c50921a456450760150760d0b94b99184f25600e5769450da4bde4b44b62b98bdc16136531b3e9060f8c10138990a407e308d02308b12c0d62cb97a9d7f64af17e64f2ac5ee099e2c7afad7097430db53c2676f9e59cbd4a27fe7f6ab7c875e466fc5c600a0853b64a2452cb712f1d630f5a2eb287a296f072d62374a289b5a37fcc33291ad31764104e06a0c34af3b255c3d35cdab66f65ea2da6b85708d84e794114e47e452817d09682d77a4045b6dfa82868f7933cb54b955502de122adf47da880ed0c2a7d8fb0024ba8b164c096018ded599fa63a2447aaa3640b0acf05506667b2a55d613d5c8feaa97e1e7b1e5367a84f91df11eaedf43811d80d4083d08b12ec1d98db6d83850c1e0f9fb18d8267c58820de03e873ef4cf83c21c478d3904b39e946d638940230fb84094cc2b975baa5db00ccbe610293706e9d0ccc620066bf308149d8669281390f80d93f4c6046d1a09a0fc01c400966130166294b06432103ab1b1558dcbe56600dac5f431e7a98a2b8a8b006e8dd207a97710d53617f54a89c09e2ae865613bb52c1b715d0c41c4af83a31e738a85c8c70965a4496a59ce88d9e17fe62a091833309299fc428970eb9cdab92df0820cdadcff61206342485f23eaa81e27a00e5107aed548ee571160e4bac7fbc959c2bdad04ae140b6c3349580804dd1abf07b8036742825a45d0cdae9c6bdb19072e5d1082a580700afd1b070c03a47567d4e2a972da45cb73980ca19970d601d4e3d25b754f36792c1b52595163602957b04255c3d983e25c763b555080329b98ddf8d660ea6ed9a7a5241bd01744d23e94df9643c4d7dd67332cb8f6037340b68ea4e993092dcb933a2e8195a0aa01c45096557a69bf07c0aa2c8e5ac3ba16f9d6cd6fd71d0fdec9c0968dd184b5562e552b5659fdaf340a45a4be6557a17b49fbb50426bc77e2d66f66243530c5da5a3d1d3cf3d41d51f5dbfad68d447ed070128c7504269ef45af1419af115ab8dafaa0dc226933648a82143df3687700e7586ac37da158065b9c942a72e6d08e00ae71e11b3e0ea61d3e9269e11ba093c9a384d50eef5fcecc471c900147b6aab835d0c7fc4cb885ebde6791a1159c5da95c19af025d1c4fdfc17889414c58b5c934f42c00e78430c149ba419a0ccedb009c13c304276964233238df04704e0a139ca441f6c8e0ec0ec6e193c304276908483238c70238770d139ca441f6e8ba2200e79430c1491a02920cce2b009c0599b63dcd63a1e4764152db733c15a46b417734b53efd44cee532515c30733f4b42392d2c500e8e24948380564e0f0b94a401f6c8a06400ca1994507a8b22332892aee0870198bb8509cc286eaa7e148039334c604631f4e31300cc596102338aa11f9f0460168609cc28867e7c0780393b4c604631f4e3c700cc396102338aa11fbf0460ce0d1398510cfdf8350073f7308119c5d08fdf0230f7081398510cfdf82b0073cf4c0c26eb9eb124b632c906932f0028e78505cac19184723df065ce0f0b94a461efc9a0dc0640b9202c509246392083f26000e55e94506631e78ae1c5628f0f6783b39cc7d4362a1c6042ff1119bc2300bc0b29e16d69dd70086bc46b7bd1160f18b59a11ae81a30b2bce92b02da284cdde513197a980909bc78e8add007c4594f0d9310d8a99da0d4918bb75341558d900ac624ab05a69ba3699a9f8add1d4b2e900b8c5f5d90b4372a45b46c9f6ed54836ea284124a3b0073a5f56a315b61a150e9d8194ebe4875031580f3812e965202b845ad0e43855dae8e68359e03a05b42095d1b011d374d6ad85a916c05db55c0c8095689bddf9c78f496a92c06102ea58450ed0de37b6b79c4e08556e9cdb48ce7d91633dc5c51d77156e265d6476a534915b503822cb2fa08e0805856bf9d0c748c45d1c7783380b22c133e46b7476c12f6d864076c1e0caafcf2308149a89964606e0460ae0813988433866460ae02609687094cc2b96c32305702305786094cc2194332300f0060ae0a1398513ce1793f00664598c0245c994606e67200666598c024f47993815906c0dc3b4c6012ae4c2303b31c80591526300907936460ae00605667024c6c95b9be3b87b09a93393d9601306bc204266107440666150073352598db31fde82e1b83e922ca250f2ab6f9c573791c383ed65082db4d03b74a902912046c2205cc4df4e028ce749f0c405e4bef46b68f405c29332fb23e2d65193a06916c16e87dd008aca384b03333c51d9a2d5a5753f0c628471f1a0c405d4f096a6f96eea15e33188f275c299ef0b4e3183f3a894fd0913605255490ff049a827d2821d7438ff2b6b5b6ce6ecea1478f0450ef4b0975470dea32963c7c7673eac65a8099f80d9480dac1ca789222615a4573f27857d0baee470957fa21c4099d7b6421c47b032ddc3f1cb0ea21c4099d296421c49b03580fa0afdc2ad0a8dddf93c145766c674750b93752c2e52d3033e1a41c99697f0c80f2404a28b766c9d15125ab7d287246464864416e5f03301e440963db1430660844329bf11700e2c1f55bada167298a7b20af01501e4209e58e4c3f6461ad0666be184c2eb5085688677c8567b5c8860f2dd78a2e68b1f03a119ae59d1b1001fd18e8b90f0d9f413498b65b226b0a5e07c3c7c328616ded684f9311b432d29292c5d23a1e54ffc3ebb32575cebf13aea7231b48fe08a0dc141628732209655f50a98fa08452c52074bf34318a33f033019c478609ce219184f31f50d18f0a139ca4076b93c1f90580f3e830c1392c92708e0295fd9830c139349270ee00e03c364c709286292383f32850d98f0b139c832309e72b00cee3c304674e24e1bc18c07902259cdc2fcd8df719d2d5318b25e7d2cbd83ec2d561bbea660ad656337ece3919a0cd634480be0c003d9112507b532bcf969f795a6cfde68b0ff258748f362e01d09d44091ddfd45fcdec6dd3b50f948b9e877d2800ee644ae03a33b78eb68c9d5dde9aca7b792ff05e9e1216e706690847b28afd25d0cf53c30225e9393f6450f600c6f96994500e3640e9dcb7cebb9a956c25b343eeac62f6eab825a223e2cc4e633068c078b686d961a30a85f37829b3572d132efc5e43d5c7978042387d732804c2f699ac104682423883b210ec7521f6aae565ac40c4eb22836b3e55c33116b4c16766a20dc6464d901ce9422fb27521e5c032388b12ca762c3901c789f02a5b03425065682a8eac337b1de8e4d99440d6b51bc9a993a446169956c6417b784e98c0245c234206660300e6b9610293301e0319985f836a7e5e98c08ce2a2c47f0198e787094cc2bdc564607e00c0bc204c6012ba92c9c0fc0c80796198c0241cdd9081793300f3a2308149385e2703f30e00e6c561029330ee1719980d8169744998c08c620cd94600cc4beb77541ef565dd3701282fa384b29175c35f978b246440b522abc0a035bc9c1228b52c5bad7fe7f3426b37db5303ae015ea12b2861cdaea32a4f149a596c9859cf93b3eaf62e4b2ee212eb396958a01ba8b605ee0de0be92126e75cab4d262de42d61d0d84709c4ea6c1ed00a4575142da4a42ca335ec2ec883636ed328b1d32e01a5101c7408b7a353d702b85cb7705e3333d3358322a3c1970dda880db1a00770d3570304c8afd61a144227ac64e5300dcb5d4c64e72f22b7ad35e630050d75102651fd2b054ccc5945809ec6956183a2a9ac122a60000afa704b097d6cfea5056a36b8d9c510ec6b22af1e57a5a3b720a9561c3402f7c0325e0fd34c07987b23e05cc13b502c94b8c81a6882f3304fc442ae0ff0103c81b33312eaa7b155d2173864521740b938545f90cc07a13bd71941c993bc123036e2315700b41cb7b337dd7a54796e324f902d9e81a493b03006fa104508fcfb9528eb3cb58a5f8801bea9b5b7cceeb41b5be95125c7e4862b96c0ff5207c64b09185e7d916e8e46d9970f862def3e8872c2f0550de4e09a5330e4285ecb7a31e51e67000df1d94f0a98d5498bf520f053d3c92c1a06f0266fb9d61829374ca960cce6340f7725798e0cc89249c570038ef0e139c832309e77d00ce7bc204676e24e1fc11c0796f98e01c1249388780aee8be30c1393492702e0070de1f2638874512cef3019c0f64024ef7918ea278d85d21683b1f0c139c432209e75600ce87c204676e24e1fc8625e17c384c700e8b249ca381763e122638874612ce6e00ce47c30427e93e1f32384f0295fdb130c139389270be0ae07c3c4c70e64412ce4b009c4f50c2692f995192476f66a70f00ea494aa0d4027f776bd27323394d5606463b4f85094cc2a12319989500cca7c30426e1026a32308f01603e1326300917b99081790200f3d9308149d8539381790a00f3b9308149b85f9c0cccd30098cf87094cc2181b64609e0ec07c214c604671c3de1900cc17c30426e1ae5c3230af0560be1426300977e59281790700f3654a307760ce85831522b8985aed3697f115c125acf64eb3e82f1ffc05b8de5ea184582db686ebe036dfa365f76749585fa584b5aefde44e6f2661f744b6f1e51ba0a1af8505cac19184727fd09ebe1e1628732209650180f28db040496a7f9241f92480f24d4a28edfd15e572ed3a27c5f755f0ed532b59a5e8c3f9f3e8ade4d80974366f510268c7c1c476f6ccb07e57889caa449e6440924581290240be4d09641b669f5f6e6be01cb17a9defa42866f669e6ab2cf6ab23a98b230084efd467bb08c9916ed823d3c671a05d7c9712cad60e6d1c67e1b0c4fac7ab31276407bb8d5eb7b23dd0c4f728e1e33100781ce0620b81a5913dafbc2b80eb7d4ab8baca8a6b877fe0db2b9d91d4d5759c957899f591da095945bd1e633215b473c108e683fa6d13a1bb228a93658702283fa48432f8e04e84931664c19d4e025dd0479470a717dc89b05727eb965e021afc3125a47d3448170b8dac6276d0087ee239ff7b71426f376b771c00fd934c3a9253c5a1d9bcc2eefd0f40fc69e6acd5025621069d361eab2499e88d9b4602f3ebb34cf8e161c7e6269c0f6928bd01541d5857d0817d9e09d30b4e6fe0c3d128c668af041afa0525949d0d509a35741cb343989688610461ab399a0ad42500d42f3331ea521d5389b0588b520c10601829427d253b8c713ea8fa5f85a34575fa4b4935962c8cd40ad0cf7f4d096b47a6dbaf9b67bce23b01a0df840d50c2d5c96480ee062afeb7948072027ab4ae7251e579bbc9fdf725e0585bde99456fe4341e7450dfd5af011575dfd5b100caefebd30d982f74b558424958c519d599c0d7832afe03fd44dd42e1f8e099ef6d21512ab5332361a7bea7d2c619a0dbf93113aebdbacda3bcc4c432694f4e76a0c3df00d29f2821f51e7a8a70f527994be40200e7cf618233279270de03e0fc254c700e8e249cdf01387f0d139ca44bbdc9e01c047af4dfc204e79048c2391bc0f97b98e01c1a4938cf0570fe112638874512ce1b009c7f52c2c9b376eee5881e583ceeb202ebaf70f831378729e16ad07fff4d09eb76ae619d283f996e11592e21265de4f01715b8734105ff27cce012fa91c8c09d03c0fd5f98c125f42c9181fb016816fe0d33b8846d2e19b86f0170f92970a1059770ad1e19b8f340b3100b33b884eb48c8c0dd03801ba704d7db3448143775dfc2925036a084d2fb7907849a49363cb81f6866c330c149ba569f0cce934017d5284c709206fb2383f3160067e330c1491a8a920ccee7009c4dc2042769802b3238b7066d67d330c1491ab39b6e0d3380b35998e0248d8a4c06e7e100cee6618293346637199c1701385bd4a709ef5c5f17c53d4c0fb124942dc302e5e04842390bf4e8adc202654e24a1cc02506e410965fb3ada4be7187d7024e3827500ade5966102338af1923b02305b8709cc282ea3dd1680b95598c08c62bce4ed01986dc2046614e325f70460b60d1398518c979c07c0dc3a4c6046315e723e00b35d98c08c62bce4a900cc6dc2046614e325cf0460b60f1398519c5a5b0cc0ec9089c12406a6d3c541d897930d265f0383c98e618192d42c2283725fa0959dc20225e9741a19949d00949dc30225e9dc0f1994870228bb84054ad28d5a6450b602506e1b1628497b703228370228bb86054ad2fd6e6450160328b7ab4f282139d2759b64a17f96016328ab7ea184467a145dc1070228b7a7845245fb1868fd9f24c251cc657caf7aa5a05f22c2fba8e8493c1d6790306e2dd9b4ee6d2c09e80e99d04d153ea534a56e4671cee77ba09bdd28a1dc9aa59e8bcc13817fab68abf841312218270218bb53c2a802a50d14bf278a0a9c8c3d5325627c72e27cd5c662a195e4d59c4c37db015077cc44351f28bb211ed97b1d9b2e42a2570bf03214f983cc307a0bb4983d28a1d463ce95267473165371e537af585ebb009bb32725b4591ab46b18df5d6113c1ad4f18d28f10de47a9a2796e02f06653c2db56c29b23aaba8ae0a5e22467a4fa936d7ced085ad25e9420a61f17917022832c2e627fa09bbdc301ab1ec097d098220be0db18c0da8712d66d997db691bdcc959f6d6463601b50fc80a83ca6e225f28e2cea01a747032ba06f26bbaa2a01f062cbc4e7c3507e5cca3a967abd3161574506ef4e406ffbd5ef8641e87d229c6f27f33e9d0834b57ff85ad6c1b41d16991df017b0030650c2da8d61c300d31075f372a9bc0d401e180590a3e853ed01dada41e1d99c1d45288f046d6d0e25942d0494faf128932d5d8ddea8bf0080369812b466d6cd62963c7d53f6109103ac01002c379c3d3aa1a144d6a3bf073a9b2199d830b8d4012c2439dbe1ca1b4ed91636a382733a80736898e01c124938ff00957e5898e0cc8d249c9f0238878709ce6191847328a8ec23c204e7d048c2d915c039324c700e8a249c8781cabe5398e024dd8f4906e77300ce516182332792705e08e0dc99124ed35112e6e96338d349086957aa698f59c0a5b14b26e7e879d24a8be0e67b50e9f1a06b1a1da6b02a8328079d64131d670338c78409ce9c48c2793b80736c98e024ddab4906e78700ce71618233379270f601dd525e98e01c124938a70338f3c304e7d048c2793680737c98e01c164938af04704ea09f0baa66f689eee32c1cf8625b3e7349061ad9a9c3592c09da444ad09a3226cd757b36289a536793015c93c212fe6c5024c735f700282787054ad2e06764500e0056e3ae618132279250fe09b4720a25943d0d50ceb1f0c8b3d82e11cff8facd95d63ffe379ffa5d2d488e176be7b958f68a4fb5528e10ec3ba8c03e0e805d1025b0095d7464605f00c09e1a96addaa4d31b648dc4d3a0bd9d16162849a736c8a0ac0046fbf4b040493aad4106e55600ca1961819274b102199407012877a384722b01e558b194ab4c7436858cef2d2ab5924f15bbdfa3394e9a0d3a9b999400aa03ef07b1cdedc0fb7ea09399958945876a4aadd2f5a2c3289ea3792aa8da85993e76ccd94a4e101fafb43ea86133180f6fb1c64acd37705731d273346fa29a063e1a803b3bcce01206922603b70a803b27cce012f6f864e0ae00e0ce0d33b8846d2e19b8a500dcddc30c2e61ac6432701f06e0ee11667009a37a93817b320077cf30834b18d2920cdce301b8f3c213f18e70732cd99ee35500caf9990885c5c30df1b5763603cbc4b45e49a6c65c64c3d6cb5812c605f4b3a12502a8b5f2b3e8cdb8f70670ed4509d7f6cc39445573ef36cbbc055c63254d1d7d318adbb14f053e80859970a3e46e766e94bd00848b32b13299b78a7cffba3ec3a4aee3acc43c5c20efbd2b440821e26990c954d0c600b445f4b16e92d5bf846dde51183601608b3371c804369fef348c48cf9221338dc60230178709cc28c6b61907c02c09139884e31f32307702609686094cc2913a19986300984bc20426a1ab990ccc8100cca56102937052840ccce100cc656102338aa1fd5b0330cbc20426a1014f06667700e6f23081194517dc5400e68a30814978180a1998b30198e5e139c1238a87ec3d08a05c490965b6412fcdeb486632bea8d69ebab0d73ba958ca70928374ec7e0615dc352c09f72a4ab85b09b8d78a4f3889e9d68733aca44502e2e83993fb03e02a32a1a758959fc8f80ea562e1502e63fb085db443a9e75998952774958bb8c47a4eaaa737504dbe958019a3ca4c04c150cebb72e6265203a1a7896cf6682f00e9de9490f2acd788d6b35a6a66f47af85ea0ba575182b503d397373acf47a80681d237afc821cf839ebf3a93c17cd732fce42e98d1e61038fd4200720d25c85b08902b059895a2f273dae34467b598ada083ae840aba89a009589d89c535755ba613ac6b39b3a794a75aa94b18f11cd27954e0ae03e0aea104b75d1de694cdfa5031b54c0864232a209f06bdfada4c1c8f060f9ea89616e7e67642e74200ea3aeaf54a158991d17a51b177b59ed8d5bdc4f19c0cc66954303e0a2af97a4a18730d95dc5ede308be5b32916d3704c6f93b5df8f656ab1ce440becd9221d0fa15e2c0e555921eee16a13426d265b637239d0e67d32b10e0a16837d42221f92aeb2349bef5baed49a8bd999b264c92236c6819eef9b894839f0884abef5bbd2d2dddac7aa111f4e49b607ea4000e78670c4b377ba0149178b931da9d60b3403fb850356fd4835c2c968b223d59a0058f7cf4c88221b81999495bb179516760195fb80f09ce415c5053a1b00941bc314777908e54c14592fde05b84a0e0c139cb99184f337a09d078509ce619184730ad0ce83c304e7d048c29903e03c244c700e8a249c6783ca7e6898e0245d5f4206e7c700cec3c204674e24e17c00c07978784e3424b439c996eb9c02a0dc94899d9c838c73a219daf64516d7f62300e3119430b64d0163864024f3131d02403c322c71450751ae0e259b8bff0140795458a0cc892494bd8065797498faeee194ee35b2be7b3700e7316182734824e1fc0b54f463c304676e24e1fc1cc0795c98e01c1649388781ca7e7c98e01c1a4938b703709e102638074512ce4da0b29f18263849777192c1f93c80f3a430c1991349382f02709e9c89e9ddba972bea01590961251b64e68236f4944c2c5454ebebca520e32a3372e9a04e6c94f0d0b90515c371f03409e1616200977be9301791800f2f4b00049d84692015904803c232c40127ad7c980bc0500796658dc70832857bb9141f9223087ce0a0b94399184724760029d4dbd7e9883081765575a68e88bb2f3183f0da9524ca3f1ac9c8bb4c900265ba05d00003e8712e0d62cb97e987fc4c1cd580c45b27570f900be73c313a8378a61aa96820ee8bc4cf4e476a05e5bfee9e2a0d26a51a933a49364f3e46f83eee77cea79f24ab10d8bb786258ecff399331065f4606c0e60bc20131166b93e72ad2b4ec816f5a0d17701082f0c6f8459c2880a64116617838ee722ea73b878bbc83fa91df723e1038b9c6e0e01ba793125800d846e56515a87643b263a00902e094fb0a928ae5e3b1d54d84b29a1dc52405921cceb72e90d9fcbf87918bc758ce6a17953811e5e467feae05ca64247e97b1bab230ae04c00e0e5d10a2145e8de250b21751418cb5c11be105291f4040148afcc64c81ed30a60ac6be2017daa44d404d2f91db2b5c1eb00c857d17752a9024e454f43bb8136f66aea2067b6d3b7d22213cdbdb89d0058d7d007872a662ace56b5d5a71709566c12d15b169007a0bb3613a3eae4e122bcb72eda8cdbbff381917e5d38e214143267f807c2495ab2f00f9500d6eb33610ed50d2bef68ca052152485b5141da08f4d4378427964114236adf00dad31bc351e93787d56b07834a7f1325ac2d04acc939451ea9b094f14317c9401b45055a0fa08b3767f2dcc0656244be64b33f37f034a095b7500721e731df8a2d0496b2a9c2741a6b25ad14509301d7870ab8ed8066de4a3f1d5623ec481e72742ab3cf518561f4486312665141d80640785b26569d634e383dba30e9f6bcf65470de064ca0dbc30427e9161332388f052de31d618293744f04199cd70238ef0c139ca43b76c8e0bc1fc0795798e024dd3c4a06671cb49d7787094ed2adcd64700e0570de13263849378f92c1b908c0796f98e024ddda4c06e70500cefbc2b4db7138233ce9976cb7e322d015dd1f2638874412ce0e00ce07c204676e24e1fc9925e17c304c700e8b249c9381763e142638874612ce3e00ce87c304e7a048c27926a8ec8f8409cec19184f33d00e7a3618233279270de0ae07c2c13e7feba5b3d3c24921317770123fef170c6d8200c0d41364b391874484fd4e70a77676714c5433ebf02503e191628074712cafd40657f2a2c50e64412ca2900caa7c302656e24a1bc1340f90c2594fd5d7741b5cf5673ae97cb97e8712a2af23061ef7f3615f46b8029f52cfdc26cfb00af25428715ed553249f41678c50078cfd11f3c6fefe4adb45e6768ff6e0915706d408ffe7c266c4e7c3c34ddfa68b9b43733b4caf8921855cc2200eb0b99e892d422afd46702447154b42f80f2c5fa3fcb37ba21f24e0440be141620a31822ef0400e4cb6101328a21f22e0740be121620a31822ef1400e4ab6101328a5b50af0140be161620a3186bf06a00e4eb610192d0c34e06e40300c837c20264145d1b770320df0c0b90849ba9c8807c0400f95658808ce2593e0f0120df0e4f6441420388ccfff30c80f29dfa5c4e982f7601714c6c6c484738ed1a10c1f9207003bf4b09e70ecce9bee0f160ec4dfcd3842b774fc6ddbe152cf59a4d4288c9566c8e0610bf579fc14e36e70daa1f8166e1fd28804c388a27037957a0c91f440164c2e6820ce42aa0c91f4601e428ae14791f80fc5126e2c1e6c869b86478f10ccd2791051bdf0540f831fd449c3306e224016334c3f7cd6549e03ea104ae254bce60662cfe30d9ec505ba06f9f86277c29613f4e06e56100cacfa85b3fde95ccb05ef3295e6ee21730be18a1c6f18c0cc2695410be042af1e7d18ac149e8d2238bc1f910b03cbf085f0cce28ce6d9e031a812fe94da06418dec9cc5ee4b5cec2a44810896a4f3e0334025f5142d898d91136cb056084cbb6c65341d50f40f5357d3ccd4aeb153fe167b5f5171958fb5081350f80f54df88298e5d24eb00da0ea44c6834ee4dbf084d9231c3f9379e12b80867e17deb0a584c63959d8d2ab80967e9f0968ebaefc850250aec94b04b995b45adb8d0ada1d00b43fd46f0310f521e4c9a001f8b13e47e3f9c23354ccc897bd32aa29b8eb8056fe14be80ba84159d2ca06e4300e9cfd4bec96aeb4f3e4b699f57b54a0488ac10239ce88d689a816afd4bf82ccfa84e37ac0163ed5feb77f3b4d3f2245c4c43667b3e0a2af76f6102338af1b29f0560fe1e263009bd946460de07c0fc234c60128ed6c9c07c0480f96798c0245ca44d06e6b100ccbfc20466140f373e1180f97798c08ce27ace230098ff84094cc251f9ffb577e6c17555751c3fa99442174a69b1b254ca1eb490344913504068da74b169429bb6084269decbd626ed2349495a444a2d228b222abb5014288b28abc82608b21750105470fcc7191c67fcc371c6516774d0737ee7debcef7b79d9a0dfdbdf096da66dde5dcebbe7737f67fb9ddf42837905c0fc40134ce2ba9c06b31b60fe4f13cc1015c61b01a6d99b08d3ad60314158addc1ade92b1ca6481153181f5f72b9f5d70a7bb52f67d880d792c0be54e90bd314c94234fd5409cfed0ecd95f019c9fd084933a9ba4e1bc0974437b69c2591624ce4701e7584d38cb83c4f916e0dc5b13ce8a2071ce84be739c269c7382c4791ae0dc4713ceca2071de0438f7d584b32a489c7700cef14c9cf1665ad6930793228fb630512d30244d486265349015075a0053956fb4eddee74c16e5442d28a939ad68284f01a99ca4052535db1a0de57440b95f1228071a86721b788871b7de069493b5a02c0f12e56618cdf7d782b22c4894d301e5142d282b8244b90d501ec04439d3e4ce317b8cb309ce48e9693118f464469793d4bdd07f4e65e23dc6e46be1db6cc9f5e6e313f76033a09ec6447d98a0ee1057e875c6b99f36086c578c3bd61d15b5c4169112bfcafcd7101e5c574a0cf7402d3d2ed5fc90d625fc03e4f4935a50960789f26218bca66b41591624caa580f2535a50560489f27540791013e58c02280772c0c23c1864839a9358604b01ecc15ac1128d6b6860cb00ec215ac112355134b0e500f650ad6089cb561ad81a003b432b58a2a1370dec0200fb69ad60899b7934b07702d8c3b482253acdd0c0ee00b033b582253ad0d0c03e02600fe72f097aec4787b2c15e581deddd7bd54a87f1110fdde519fb5b784b82534d16e5114c942e631bc6ae592c485d619da6c6fede1ba019c4b100ef4826bc38a08577c4eeb2bfadb434aaed43a7456d17ff3fd75edc6a6fba40d479ae9193a7518b586857822eea28265a1fc3cb37e456536f5ca4ee8c48a5fb8eb9a65d74a5eb7808d32c840b413a8f6622dc5f1036c9b64997d4c815b7dede92dd3c09af67ac017cc7b07bc6fc28b02b453b1f6e24d8a500ef5826bc6966709b916ae90f3bb93b475b8b5871bda0172c66629c60f2778e6aa31e91066d264bf6a682ec1dc7847688c9ddd9f433c16e99580f66f31962aa873361cafd99241a7469b49e49c923b8537e0f3e9150cfb47ef14d90cdcf2661383bf22561880bc2e3413a6731b14ecd99ea6477d3dd9cd153591f1d0daf89cf03d93c5e876ce6c7e624f69cb4d89c7f8631fc04fe4ac6f79ca32b21c333209925fce6bd5a2c8dfa270d490422cd50e6168058ba3bcdb8b1386acc769acbff35807276128a5d9c61760e8233a194f32fb2faca1e18c7cb92b4f94cc9f4a7339a656613dfe582f6c587eb5ff4120c45e549caed1a813bbcc8c644b0bcc8c600b642dfd4c90d67c4107eb421eb48e80ee630b1fa2cad2913c786cd5d13ad32de209c1efc742b0be479306055261ba3660d73678726792702b02a26b03879e870264bcb4d460ae93675f6b7785edac5ed33b7b1749b35d0679eb87be7a338ae13e7a3b471fd7a90d69398285d20a31e7b226dba99aa611aa87100ea733ac769a26916adb7bc1c9af2e79958671568ca85b12e93a9bc1badf347f379f2d029f9da4c049eda835ecbc27e3e48f3c94904b568c991672c121fdf45ff22e2dc9785732948f1299a70ce0912e7bf413a4fd584b322489cef03ce2f68c2591524ce39d0d84fd384b332489c3300e7e99a7052fd8968382f85c63e5713cef22071be0238ab35e12c0b12e7ad80739e968040544b769a3dc8df00e57c2d28cb8244590c43504d12c6d82335ad29b34b4fea42730b0b6d3ba05da0c5059b3ab2d3a47427a05ca805257554a7a16c85dda1455a505247741acac98072b11694d4753a0de52580f28b4c9413ed8794d81ba74cab7dd48ca9b3b7ce17ad6778c687136022b484896dbc291c2389868c96f3f74040569b6410deaca78f97b6d11518ed1468c04b77675f88c551cdb26976721d80b22e59ffc8c213f205d10d75b688b5c66fbc51a5f43f2cb42f41e3afd7eb7a4a444b733dfd00d09ec1443bdd8cc450b62c4853d989b0de59a6096688fde92480b95c13cc1013878e07980d9a608698387402c05ca10966888943f701982b35c10c3171e8be007395269821260edd1b609ea90966888943c701cc2f6982490c6d4a83b91fc03c4b134ca2df050de6648079f6ee5581846e9afd20a0fc3213657101b91ca9696c8d14df214ae5d5cc3ef54616ee4d268bfb9c24700f24b90b8cf3246a94303e6d66b320f5fe1ad596597b1f7257c5667b9c8afb4196bfe65a50f09dcb77cc76efd74504996b3934db1f27c12b44dafdf126e6d6074de17c04c8ec6af6d6476e98a985122220bc5e7532203b2f09ed67bcf5d12ccdda35e645511fda3bcab63f1641935ec3445b5ea007cd552d57db7f3bec8ffbdd57c435f8665b404a1e7651df95f3cd05c6bb6ebbc1cd9d6d932364cf8e7fb1fad5bbe02534eaf053ca9d2950fd94686182fe0293b15492feef6d91ec2e11166dfd160da1771a53415ed37c03db8c7c71bcd3e42217b5c991144cb25a25d85a0b7378a3f9d395c1f0d6c4b621596d7c88539f0eaa5da2303859a5615bcac25601d89ad95eee6eec6fb4045afa7a461ab04b59c01a01580b1358495e7f9836de07f3e3ecbdb91606a3564d4e0973980a409a53c22180b34d134e6aaa281ace7f42d7b05613ceaa20712e06e95ca709676590384f009ced9a7052133fd270de0c8dbd43134e6af2471ace3f01cef59a7052b7f668389f009c1bf4040a229ae9d0f4a6d701ca4c129239905ce68744a7460ca1392d3c046a8ff335e1a41aded2705e05a37aa7269c54631d1ace1d80b34b134eaabb210de7d380b35b134eaa9f1c0de7df01e7464d38a9d19668382b6028ba40134e6a3c1b1aceb300678f269cd4684b349cdb01672f13e7e105700e27ee2206a0261ae21ccada306e00c09bb403264a300df03b305c6dd6b4a63f91b910a5ade9cf029c176ac23927489cd300e75734e1ac0812a74b6413e3bc4813ceaa20715683747e5513ceca20711e0b382fd684737690386f80c6be4513cef22071fe11705ea20927d5b196867307e0dcca3605cb350e5f65c20df43f09b07d2dd91cb0de15c1273e195d569e77c1c0b38d6d5fb7da1e6e1753ef759109180d18cddef82890c24b93c85b5861465fdec2cb01e2d7f949a086172295e8d5496bbe4f01c8cbb480241a24d0403e0620bfa10524516b4903b911405eae05648823731780bc420b4862b4101ac8cd00f24a2d2089316c68207b00e4555a401217803490f700c86f6a014974fea381bc1b407e4b0bc81003ed3f0420afd60292181b8406f23e00f96d2dc91f6607d9b89f0794d76841591e24ca66d0f27c470b4a6a88491acac301e577f97ebc3ee2812ba2576227781ae1619b0b8df97b49c4f21abe957a78a65797810c5eab0926518546837925c0bc4e13cc108d023b00e6f59a6012556934981b00e60d9a601295173498e703cc1b35c124aad468303702cc9b34c124ce2869302f0298376b824954add1605e0c30bfaf092651994183b90560dea2092651c54683b91560deaa27075188691e9ac133623bdf68c5c52c6a36ced6a2c5b220aebe8f630173164d31b0dbf46616220e38b4cc426742b3fe0113ed4126d72a2d663058e30e311fc1b3d0b87fc8047a741ed0cdc6a9da36e438390dcf118a0a9a6684753280be5d4f44f8106370dc089dc01d618528278effb410e55783e4dec9c47d705e17e124d4ddea86b7d165dbf12448f00e26d20982b453a6f2699154670dbcccd630bc69d5b930adba2b895df3d2686b2d630b5b92238b89d803d3a4ef5d0079f7eecdf482431135e40e6d307a1960dea3092651074f83f92ac0bc57134ce2204383b91360fe48134ca20e9e06f33580799f2698c419250de6eb00f3c79a6086b81afa2fc0fc898e4c17b85eafe02e324b58ab9ec360d5733f5fd3e46ed914ddd4602f5e6e7cfcf6d3ed4d2eab40ae475a57801af993414e1f48422b8a723a7cbd6888f9d67b6139f92013ed016678c943c253cfcd06e97c68f786c845957288f9822f04940f279123e8c36c7f106de768cdfcaf00f611ad6089169e34b06f00d89f6a054bec0a6860ef07b08f6a054b5cdbd3c0de0b607fa6152c51034503bb1dc03ea6156c8873d4ab00ece35ac1122d9d68605f00b04f68054bb4c7a3817d1ac03ea9156c88463c0f03d8a7b48225ea5569601f00b03f6782dd5fc0ce971dd02ed3241a005798b3174d490de705b82fda00f89e4e3227765a2c47d60ca29c4e28ba76050b6d1568539fe1c7f16a17b9ecb637bbdcd71ba403c8d7a186a7a39a05f2f90b1d9afe06939bd39a289bb41873eb417bfa2c13eb9179cd3e3fce5c17f81c970f62f114627ca5db01f2734918910d2dbb0e76bbd9c056ae4c62217d0afad45fea51591315803495f56dd0b33ecf4439cd644dcbe2fafb895387fd86840ccb685b7cef01c61734e57ca12615a5e1dc0e7de68b9a7052b360d2703e0e385fd284939aa39586f37dc0f9b2269cd474e1349cb360347f45134e6a327b1ace7ac0f9aa269cd474e1349cb700ce9d9a705293d9d370de07385fd3b192cff7b123ae88680a926d32248d1b9b57784dbfc2fdd2afdda0cd52973dbec034090c4738653f2f89f49ae7d919e4d9f66764efe21cfb53e87851d164fb44f34daf68007cbcb1b494dd61cfba27eb32a575f692d79d681c138946b1f847a7fa16ad31cde2a2b139c78b8bf6b19f5b641191b6dfd72418fd51f7dc6d82cad7d9dfdb63e23415c5456eb5da055ab3d822d1bfe381ced7da4f6939ef163819717e6b8f6a956594af252e2e9a284fee949f295bd60a7b679d3de7c4326dcfba179c9b50c3df3150928d4267578a73de46b9777cbfb30ba333934cac3574ef62b1bdca9d776fc43d6971a4efee16a66df6ba5a11b85653239fba45628a23ebb8fe572d33de96b34904d55de9ddb23a64a9b74e8ec5d7c6cf82e7ea451ad7d967cd44b5c83defde4e26e2b55a8e78ad7c2c0b3e11846bf2b552c3f84a2733ceb769991c2bec7d1f9790ead34cf9a38e744cb136e2e6deb3a3edef712535da7b5afabe755281a3cebe35239b2f3115576646de528d486fbbc8c26491ab2c87c5521fffadeebadea8563e825f56bea7f4d5aacbded92d355e216dbe3dd2bcb933712d3ba2b7b044be3fe694c9e13fa5dfb13a5ba3b5515f929599a9d252b254dac4e5395dc096b738f238c3b68d6ad555f23e32d0ca06bfbede744a3d7d2cc34dd1bbcd928faf765d6591d4277e6a2785ddd26ff80d8906fbb7515a7249bdbdaca8d2fee3b7d04ee8db3cf3bd6987f409ebe1f8d065babe71f0d2de701d6051e1b1b17d97f5ea43d5c80f44eefe6671a06c9252170d59d3a1eb37f008317190b75272867b17a3b9febf72ef7dafe8bd8f2959e6ea3b7b17c8ded04ff46bf7cd6348b3b12905ba84accf78dff448bb9ce7f72f1f45cedd68965b9eef914b96eb94f15d57f737b16f1b53d2f061657ce44ff41653c67d69dede22afec05c3a85de1f7905fe7ec551991876c23f22dbe5546caa149cc90bd8d814b73b39316a96b9b94da61e23f6eec742b38d735fd86c9d34fb8e3573d841bd0686e2f03f715a5aeaf783ba73995bae6f4ce1e39dfa572fe5b264f37456d8c1619697b69addcba47be63f9fe5d7ff9fefd1ef9dea5f2fd6eb2f2bda67f46c68fb17cbfd75fbeffb047be77917cbb9fe9a25f713ab674a4afa9b3d77bad94fb33f6ffbb128e0a4f780600 serializedProgramBytesString: - serializedSignature: 4e3f930bde5cac44a9fc96d03c32d7da4d7dfa4fdda2a5a0e1d9aa9fa6a2e51cd414914104d8f22e533f4167c478343a14f65c3202e427d6acdbdf8e11dca603 + serializedSignature: 010561fd8e586dbc9910d9d7e53002aacd8dfc73c094ae0306a53f4a53bfd2d7b45934856ca6fb6d8736570bd53ce0c0243ad117b856be096d66a1cea4c25600 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset b/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset index 7ed9e19..2d37385 100644 --- a/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset +++ b/Assets/SerializedUdonPrograms/c616df865137d78498ef7d6d7fb05e54.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d07585dc97580e74954016a08a15e76a515bb92e081a455dd554108a1cad2a445850e4202c402d24adb62a7d889e392e2c44ee2249b1ea73a3d4e75ba9338bd383d9bdefba63b71e6cc9dcb3b6fde9c5bdee53cee550c1f6fde6d67cef9e74c9fb92c6910f227b5477ef4880ed12cea45b7181677c594fcd62cc349f9eb1cb9e7dbc58c0cc7e4e780bcb6476cf379127e76a5d6c9cf3679342be6e493f7c4900cc7d5f54e3122bfb7c96747e4119c1d957f23f2ae54917ca85b9c1697c525519baaf111d1a31e9ad5e7526057aa4c7e9e120fe5d511a51444d2a02ed5ca8f4e7965565d9b944abbf75d1337945993f2da907c66464c4899834a6259fb72a1be082728d7e1321d2ed56185be562cffceea734bf4b932fd1d3fef3e7744fe95c8bf49742c29a43ea08fab7478ccf2ec0a1d566a1953c6f595e859dbf5553a5c4e5c5fadcfdfd5c76b74f88c872ed53eba3ce3a34b4d405dd6eab014e952819e31f53b6a703eea705e7a4b1fd77a705eefc379830fe78d3e9c37e9701d717db361fb168f747075a5d261037ad64b572a1d5c5db706d4d53dbf4d87cfeaebd3e8d84d4738ff82f0cf3b253a3c6ea4e971274d8b0ee9e3c77478d2f22c9577dceb2bd1b3b6ebaebf3e4e5c37fd753bba6eea72c2b0e3846347b1cb6c87871d946fbad737086f3bdcf4a6ec70d37b2771dd4cef20659e6b57b3c8f685661d9e12d9be508ace43785a5f9f41c79257f93b8dfbaa75d8a2ef9f45c7f2feb237f5f1133a6cb5e8ba4b876d86ae6d3a3c8b9e396bc83ba39f9943c732ded28fa23483f0029251a4c38bfad97be81ef73c84e7f4f5fbe818cb2e329ebbacef7f111d635d2f19ba5ed2f26e11f2da0d79ed3a3cafcf3f30983c679c3f8fcee3f81f1af1bfae8f8b8df85b51fcc5c86ef77a353a86fb5e72ee2be947cf63fb5d9e2f67f3043786e7ca0e19cf9976baf6d419f21e1af23e24b2f38f6bf7a4c8b2bbec03c67d6ed82132bef2a4f0cf7baebe65e8b9a774b85b877b74b857cb7bc5b1b9dcb5cdcd4faebfba7e3d8b8e8bd0fdaeae2e834991c520e7be20b6b93ae0fa3e481dd169e8d0a97578431fd76b5b3f1142e6361d7689ec32a14b87dd22bbfcead661830e7b0c7e3d8e4e556f11d965cf5543f7abce7d1545c67d6ef83cd2356df073ef69d4e13543f76b3aec45327a3df480f00abaf78ad6ed75226daf7be8e6dee3ea76d3d0eda60e6f20193750bc58b72b04cb261df61bb2fb75d88764f739322addbc5c62c81830640cd032e6f530790c86e0316cc437acc321915b5fb9e188877cd317c60cf9633a1c45324675b8cf90e59edfafc37143d6b80e6fe9f3af22dd213c605c9f32ae3f6dc417247fde16d93e71db498be5c744a62c84f08ee5d983e81e5b7be71091566e3881641ef6d2bd38a57abb67654a0d485a0dca1828f58276cbdd27fd3be420ba043ee067978a764e564cd35280a557dcadfadc7332a59bacbde2f5a94aa477b3fa1c90778c2ba1afe546f1e19c2840b909f93b82baf4b3f27cab1a11804efdb8bc522f2bef71f554bf74d56bf2375b4a8f8c764236904664c17b4f4605f2faa5dab977fa9904dd7ff3990e29d3199d9894675ca0d3f2784269d8a93eef2b4d4794f66df2dc9c1a2b999259e8940c1fa8d8726d9f91df6d71766964761ded8314d4796728c44da6d3d21ad0be41e5fd4fa5c862a408a02f794d67c3a206558bbf2327253ec5d02964a0c1dfa665342a64a9ac734da241f5093a720886b731d742bb7f3bbc9f96959d972d763290dc1b950599149eeefae0968f6dfc786371b669fb4483aa4e36f998e60516e4d5a5d6e648f036a1b8b8280d8a9af85336fcaa5bde5940fcce7de3eabef00950a26aa6ec045043cc5df2cb03f937216f3e0da9a2ca3c7774ba533e7e4f0a006573d2290d424b15eadc8ad44f5d0af6121becb242c3f62f5dbc6097cddb95810d3f7682e504413f1d28824b6d0455abec3a2bc1dc6698fbed947cf69624715fd5ade04fb6669b37539872d86b30b5f3ac503cb7591b93e134a20817d9082f2b1ce14e9953cfcb6b03f2fe11556bc2f96ee519ee748e732efb4e6fc295f356650837a85905cc32dfb8ab747740fd9416db936e794ed2e51b1d9574c596a44b43d2adb0589f06eb571a8a971b8a83ce446425b6c82027aeb239b329b882165c6a73c0cac56910e45744c20c41ad41e093f2c7ee17d59ef579d802b2cc464f4d35f62e7af6cd2febae095c38d628925b02e6b0b0b9abdce6f0807bada54654c96d3a7d39edf4cb28e1b516e130aa1b4678059555d745ccaa9536c17072bd2507089bd6d5b4f02a9b274381947a6b413cd96f94a6552d9a181197656ebc2d9ceeb51bef5dd5b5068ddc6e7a870c479516707e488c0418ddf1ce171b6c559a2ae95baccd83c5b202e621972927b2e7da4d2ad7c64b67aa0c586e7378a8b060b234a70b0205439f2ec721fe2975e9b20c7ba4274237e4ae8c7f5a7e1b5077e4e48e523a77aca034d962d3a44669d227efe99387f735a136dd197aa0aec1589fb310288c1e2b293db6daf458adf568947fd04485f89d1c9abf06ab280db6d934588334c890b8a43d2a7f2d56535a6cb769b1426b91569fdd5207f0ce313d04073cc2c45d4d15c38f598ae154c862788d4d38e483c72de54f1a0cdb91c9f0663c9be8786a28803b6d00d79359ab4b25de90b8a3fbe7f966b0b514d4272c50add5bd07d45a0aea2e0a6a5d5e50d7d9ea509565bb59eb507ab8845a91e75dd73d69abeb54c65f9f634790d8609edcb7c3b65b554cf945405520eb292fdfe3556ca717bcd8de40e9b1d7abd84e2f60b1bd91d2a0deabd84e2f70b1bd89d2a2c1afd886d8c664aae71ff7662aeeb42deeaaac2aa3234275b1852a7c1aa9c2a729afc267ab2d1e287cf6d9e281dcbc5f780f47eca623db46c13c608309b6c004cc80ccd84ed936974715b1dd1627f4ab606a3b4abfea312a850e52297428af147a9c8276d8068dae739db1f5e88dda1d94dd4728bb8fe665f74eca338f519ee92eaacdc3339fb044d6a09a8b851cf4c77da5f0f5efb33687b6569ab052d736e0ef173f5561eeb22515b8d0099b8bc230ca901af29ed1558433d613c609eba8184fda62047f0823fd494afa299bf44a95e5ba5473634cfeba65d55de91361627d8aca58cd54c63a9d57c6da4d59d762b3aed65aa03865f18cfccc9db20b63f31e5bbeab2e74beebd40d4590133edfc1facbad0636213e72c29ef75a89bce7a70395f7f6da08aafee0142b41bf71a016f9794f5901dfddc660978a3b33291b656c0dd6366fcee1eefcd8d9b729f64dc27f146b21b4a752acde96ff6018f9dcfccd1983de280f378cdc60130e2514ac90367bc44b6ce5a2478f384d951c176c2507d4d5501acec9f223d3ecb8a8ba2603ba9c0c53563452b15fb4c5ee34849ca6b89f1670df8cba278c3e4d943e976cfa40410e331723e28e3c39a8725cd6e2861031efa362be6c8bb9ca9a0e5dba140813ef7e2ade765bbc6b3d53c08d3f3ff607284d9eb36982bb847328defcba844f537177d8e25e2570973063bfb387329f543848c5df49f99d1bff3d559be46ff9212ae62ebf98fb64c9e80c4a8027846fef1da662eeb6c56c6b91b5eb9e6498588f58626d5063a05da270ad13b8765749017ee1db27b0bf61b7594fda2b4858be5fa7f60e875581aaec8eda120e105eb56a6526ce153a718ed912470d088fb3260e4c048c0b585edda2ae8eabc9ac7acbe41670f2ba1b12e7a2804dd2f7941edec908db4b8275ef7a552aee55b9834b572abd9fb1a537a4ca359bfa6672f7d2c9fdac4d30f4d0af07117c9c167c9cf2d01b513df40425f96654c92729ca7d11299fb20986e2b45f445f2cd06c130e49381031094f53a007a3826ea1240f45957c86923c1c5572ab4d323402478260aea1059fa5048f4614dc4639c65844c7384741be1515f2799b64684a8c0751d9a3cd7181ca81b71720075ea484df5900e19728d81351615fa61c6f32a2e3b55382a7220a7e8e728fbb11dda3c32618c603a68308f698cee8a452ef85a8a9d745e5ee9988b9bb9bf2e6d905f0e61e8ac75c541e5728c9f7a24abe4a49be1f55f2f394dbbd18d1ed7a29c10f220abe4679ddc3885e779dd2f8a5881adfa004bf1c51f04d0ac52b1151f451fef66a547feba7547e2da2ca0394e04f8b2878904abdb7444cbd214af05b230a1ea6507c7a44142394c69f1151e3514af06746143c46a1f8ac88286ed90443adf336619b34b26492565af838a5f5db236a7d9bcad79f1d355fdfb1498606d7e70451d9a3c13541b9c63b22bac6a44d3034d03e5758461ea1636e1f46c173ebf56a4414e68761667552ad7219d77bf8ddb5a6de12e02e3c4c943d4017a6413945d9f74e9b7d23c29d3b73e7bcf08c57669678542def84a1b4b6f93b33f3681dca8a1169d77d7577bdb60746c4b35f77d8a3c6a9c7e7674c4cbbf132bfec2b5eb47a640c300e1f86d35d8ad3bb6c9cba9939c16c7bb38c0a2c02b99967bc0945e7304d7178b78d432f2387d6c8fe427b4c18222f5044de632302b38638d66665ab63975b3274c973999d655e7a9ad7324f85b16086b2e0f36c16341b1664e2cc2ed7a0cc7a413e32a04a3728cd686de9f30b55cecd52367e3e558efbdbd81223fbe628fbbec066df19c33eba76f24fc56c7f0ceaa9f95b7a8fb2f40b6d96ee342c3da9d69dc14ca063a73b337d41953563f2fbad05ca55f7293ddf9bbfc75d5065e4ac2c219cd9d4c5f4b81729fbbec866df91f99a207b2727deed69a64dab4e1b2f5bfc6486b1e80165d117db2cda11c0222f3b705d1446cb879496efb36979daf02b1c6b98b28c6e6979d5a9f97bd74b9495efb759793c50ee39295b16c3ca3ee7154bd1734f7e25c3cb946d5f122405a9b2da2f050b5d4ebf4259f9a5362bdfcdd852f46e31c30a567797c1b0ba7748491dd61b4782e682ccfacd3e0f4b322b0bedeb0a17a28dfe2a45fecb6ce4f7076c91665b18dc83f073762b4ae56f4aedf768513c66e4d3edca6e389a150d6a2b5e7ade43fc771f43fc935227f0dcaef9de80ff9a4d78ef2bf5aebe51612e2bc9f7b56d7e56d8bcbd1ef93bb62ef82adadc57d4956a8b5c5992b4da8cf8a859fae590aaa53a559734a8fd7dbbf3f4267f2dbe02625b6af7a1f0afa97204b89be852b0232fb3a8ee947a70587582a10819505927b3c8b05d64b64ff96ae2b7fb63af12e0bef56c015e64e9ecd7802a7946376b4f08d8b8b3240d29f4959c18b758313a7b198605decd905c98af2ccdc07c9d13668982098f3b5b42920047204ffb2a4e38f96dc84b02c237cb3308bf9a1361f82d4849c0f7deaa0cbeaf591c0ff47a0d431210be8e3cf06b3911867d494c12e0ed2f0678a5c58670736470a15e4eec479c6ea5c2ee8d16f1402d579e51f286cd56ab7a5342dc34ff3a815a9d7539b5645d84b65c5de4064c5d689faecbb320f17aceab0aaccba3dccf7424ed1dc03488fc7af1ffbb8f97863ede370084490dc12941bf91b3045da7fdd5e9d24f8909cf61a63eb5c9cdd021cafb98cbb3cad32b410ccca74ced43adca0ff2574834ceec71aa463e94a55c289f4328bf891325ec951ece29490275fb160e630517c61284f19b17d723f1e8619a0f652b17ca5b08e5b72c26caecc1564694c7b9503e8b507e2b27ca4d1ae558a0923233ffc85a66eee6c2ba1561fdb64278e8906e0e99134ad9d50fa387b2553fcb11ca6f5f5c94492f37f720941fe244591baadc6c4c64c9398e607e472160d22527569fb5bc2ce782598f607e679c60327a261bcc6508e67771c274873e30caecf976fa9f6cf48983096cc48f20b4df1d9f7afd4002ebf51a84f27b3851c20b9d0695d741a7d2590dc686ab860b5719c2f5bd9cb83690999a5e5cc75ae9b0216d4748bfaf10954eb0cc0cef354a5e76de8d607e7f9c603256336c30d308e687e304737f0261d621983f10279849acb59f44307f304e309b1208f37104f387e2049371c6870de62e04f387e3043389836e9b11cc1f8913cc244ea06d43307f344e300f2510662382f99138c13c9c40984d08e68f71c2748733e04d253006943ba19bfd2ed4e48d0c6d47287f9c13a5fb9f4d20e251d5f7766503563670c55ce00402f71385f0c16093128cdd46b629890184f2273951461bf8656caab365ef5e84f6a7e28b96b11262433b81d0fe34275a7821cfb408bd3f2701089722843f538832946a14257ff2ac1ca1fc68a133bafd7543cef252fc8e6856b4bd5c688f21b43fcb8936fc1257c66e25db12d72b08e7cf1522d3076b3831d6ee6c0da73684f2e7e38392b13667433986507eacd0e567f08612638667abe59f47687f61316bf9eca18f248ebcaf44287fb11028d38fecc0470542f94b9c28dd15c413f226c8eceeffd0f15f9cc0d858625b9c701661fd654eace11b4b8c93c06c8da5db08e7af70e284e1b9dc4d2c8e27cef2815bce05ae1881fbd542666fe8ebbca88438bb10e917413166ef6a2eaca710d65f5bccba3cf95b589e40287fbd1028836df54be2b4ef7984f2371613a5b94120795ed98c50fe6621cacdf01bab183d946d63d53a84f5e38b596e6667f6242e32dc8050fe1627ca5d1694515ecbc7e8b76d5cb0f722d8bfcd093bdab00863d39ead037a03a1fd9d42a0755ba893aa653aa45e53fc6876425b11dadfe544bbdde2b5ceff2206bf9c12e7549130fdc8cd362d41807f2f3ed559129779af46287fbfd0256cf0893bc6d152b689bb9308ed1f70a2ad314ad8f147acd77f0181fc434e90f96de262f44db62aea0e42fa46214ad0605d56c61294adcb7a0da1fca34297a0c1dba88c9b13d8daa8d711da3f8e4f3d9fc435cb9b10ca3fe144197e6284b1fc649b18b98a70fe2927ce15825ab73ca56f499e2fa610bc3fe384e7368c285fc40d23c6d152b686513702f9e7710199c416e64504f22f0a51d1046b0e31d6d96ccda12e84f22f3951e63f82cf58e1b08de0ef4458ffaa101e1aac2994c48d852b10cabfe64419adc1cef83a0bb606fb1042fb37f1f1d224be19643d42f9b79c28f31bf448e2b8fc6584f4ef389186db04db9448ff3c8c60fe7d9c60267114fe2082f90f718299c497ad1c4230ff314e3093b8e4fb0082f94f718299c497ad3c8d60fe739c602671d5dd3e04f35fe20433897da2fd08e69b9c30c30d8030368cd80640fa11ca7fe54419ad7bc958b3b3752f0711da7f8b2f5ac61704b1a11d4568ff9d132dec8c8087adff682c0143c5a508d47f708282a4ce7eef4272b7c3142168ff59e88c1b7c951163cdcdb6cae81984f6bf38d1869fd8656c55b24decf6209cffcd89d39d52a35a95499f9bac46203f111790499c9bac4420ff272e20197bdf6c201b10c8ff8d0b48c6312136906b11c84f7282747bde41ab1cc686375b857309c1849531b181c9b8ca8d0d662782998a13cc2436858e20984be2043389af9d3a8a602e8d13cc24aebe3c8e6016c5096612ffe7ef0904b3384e3093f8c294d30866499c60320ef7b2c16c41304be30493715a820de61904b32c4e30195f02c006f31c8259ce0933dc74196326679b2ebb89502e8b0f4ac6ae241bca6184b2821365b4e931c6be10dbf45807425b59082f0db6d820898b60562194559c28376b9473d203c7e5ad8ffa6ec92d08ecf2b8824de27f31a8456057c4156c125fcdbb06815d1957b049acaeaa10d85571059bc40d2e4f21b0abe30a36894bbb7620b0d571059bc4f77c3d86c0ae894fcb3589ff446fa342595a6c083f9323bc590d70c010c790d2df01522f5a05ac341a511886e4f105e58173a25fd6ded7e46f38fe37e4afed7c4abd34a0453c10d3ea2cc81b56b227c5a0d26c56a461d7570d7687bac0ffe8a7ce63695a9dcf9b9c015f2ab54a139b927a5f14f0beb20179e7800abbe4dfa062d700bc53b066dec9a1f5f379b33eebd58799f3fe328197b7b4b52967e4d6964726162ca5fd2c729c139e1f95ba0f290784b37e96fadb477b4da547aa3440f67ca4edaf8574d7c9aedcb456b979b74cf961bd58f5b2bc795829053fc5ff07c4861c350c010100 serializedProgramBytesString: - serializedSignature: 914276458cf8bdbc3270ada3fa29befbdd574f5423a0f302617648262aba2500869c8cf9b15912cad64c40f13c51407feee73725e3eaad36d3ecd308f905c00e + serializedSignature: 4465d3ba99598ae5e2ae5ce92bc982b826d98e774076323b47dc613ac81893d08b63dde4784fd09b37b146df809bf3e7fa053f1c14688b02b2bcffafa79e2509 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset index a15ccd9..c6abd87 100644 --- a/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset +++ b/Assets/SerializedUdonPrograms/c8df303ceb45ae84f85a11591f741734.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a4b531b4710ee155a24210106ec801327761227c8e1b10b54e59043628cf3200fa02c2007574ac86671618b472139766e39e71fe53fe59863aa4877efac19cdce6859a41111b154dad5ce4cf7747fddd3d3d352c6037c39b378d98647b002f3b005bb700487f86d05ef07f80e9fa2f60d38c1fb33bcd6b06f16ee2450d26bda99c2eb2a3e35a089942fe129def7b9bf02017e5f45da009fa8750f3f018e72b248b4050f611dd660d2b991c0629b891aa2cd21bd9c3c5e1fc06fd81bb0503489c75d9378a9604f83fb0e50e868dc63f885d53ac0bea748730275e4f98439e6ff265ad629bac1207e46a467477ca87d547a266dfe12df330a5d46dc8744fb35a59d680b4a5b518c1d53da0735634ba27d5c69cf6bc60e8bb113f87185cceee9e9e93faec316f90e31aac131784c702f85eb4494c94ec3f86404a0d33c6d13cd738c0c3496db62bf68c2122c6a2d77d3294972aff0b58623f699294da64cf1676c0a12ae8eef4072bb06b67fcb5e4b8eb78f3df3f023de896a0716d0911e2b5cb671da3aba6e009b783d667e3b28767c64924ae4a22acd23e419aea0036c89003dc6e73a4b58e1ebaf2c69c0d2af625b93d7f321aee807787fcdb3c5753fc1efba393705647a19f50bc9d41e2ed7c84c0f511b92de1b20377b6b91cbb008413f785d2cc3ac476bc4f9236689b7188641c6e50d2ae4b1106e052d6d8be0d1a3538921985ec7b8867aff5e47c99e8b35d24e1b3d3664f039d6e1ccc66eab524be0d166e1dc4a50aa1da4c4afac89eb49c2bb6ed6271155e81d1df4396adcec21f4d477c45c6a38363df804eb8c027e1c7d9f86e518c0294d4a93248209c28c0e420acfce8e5508a3b4a082f1ff07ecabe1f880630cb56f20c71ace4dfc967986b354a295a23db4f9f3f8b51f255265e7ae94e4742a9909f1011de2855ec78b0ad2d0987a42f4d3e34ae9eb6dd565c1e4b545c3b24f92c184605683a09f17d96fccdc05452482dac0d8d5312e885459abafcabc68663e68927aa443a97326a947bb2075de24f5b50ea52e98a41eeb82d44326e6e35ae6f7efa7615e34319fd04b9e8a79c9c4fcba96f9efa9980f9b98dfe882e423bab836d4fbb8d6e413018d4b1fd7de013a22b6e2e07c09a00df06b40d588574cfa424c390f557c3fe39e2a1e498e707262246f1b3442c7cfb4c1e883eaa431a8b607c014544775be41e69bd261f28501932d366a9d4fdcfbc274a4ef2a7e0bc9f761975b64a9e5fc4fed6b4d6d620e396976c86b268d6eea345a366864b2cabc90942cfdbd38c2aef2f5258e254a551379bb53fbb6514742268d7e6326fdded5e9f75507fafdcc6c5ee01365f681c682ddd66ddca4db7b6956e879740b4351ef349b306976abdb5e1946821aece1930dfd72f8761cda11bee6607e82941b4c414f0df078a3f4e1fc75439afb006301adf74d94fcc99bd4b03d87f7c15c45dc8b45c88b169492b4084b1e44bfc755c7a848a1d32e592773f12c27348a7821d29c355c354d3f20ab46c5f68cc7c9cbcc05bd29598adb34db80de87d2efb2218335fee90419d0865d65f21a0e6926f34faa88cc3183a8d6d285c23939d53202b3cb795003dff4a225ae30ffa66b5e76b1c42dbe1e463902bd46f18e185c8a72cafae0dcf4bf26f91dd9bfcb311f390baffab0e853d787fff3c8e753e4fb8840188902854f81e2639babb9c496aa324168af4356ba8aab4b99ab936a69a1658d17cea3c845d639d715dd10b6bb36611b12b0851353964cd9be6f0fb29c2dc81c09b24f6c42567ce369ad070b8ba0156d81362081f6a96dd09e6b4f64fd07da9004daf4e5c4b4853e8c695909b6b24dd8a8127aa29c20fbcfcb4a125cf72ec7cb96fad0cbf2126c9f5d0e6c1637026bb06524d8666cc2461abc8a95aefa6f791625c0666def9ce1bfeed4aa51ff81362c81366713b428ad3d6a29625b5c98ae2dc840826cdef6c2acf261f7ac2ad98f29ad2b01e6f51a308b799935c07212607eaf01b37838b7065801ae4c11cea70a0dfd5d6e302b8c5e6e73542b1b76efb236e52eb7d9bac23ada98408c12a79f20e0246a173f743faba979fc2be8e790aec8dc9e6772c16b11a442a062e97ad72cdd8d229e4ed34e0a7aa53656f1f8f7dbabacff12847fc0171b6fce9d6437de42cb87cc0358c7c1bb2c14bddc7f018e249ae5c7310000 serializedProgramBytesString: - serializedSignature: ab09e457370a11a0fe40af16fac81f3a53108526333f9442f1c612d686c48162b51ba8df3bd0ad350372f09ad251221ba7fc2304062e07fcfd3eadd35c452a06 + serializedSignature: b615f99deac99b1cf5e6a2910f361b6f1fd3d6741ab859d63ca6c8dc3b5d7ecc0d71087481551c746cb537e170a90802baaf6d926dee76347f3d3eabf679480b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset b/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset index b5bb2ac..5afb4bb 100644 --- a/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset +++ b/Assets/SerializedUdonPrograms/d0a19d57caeb67b47938757e7cb80897.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59dd52d35010ded336fd111011a53a70a1e385382209e0702fe00f8e02d2960b19a794923a75dad269ab83f75ef9163e86be908fa1df6e529a26694381205349a6e724e767cf7edfeed93d81884eb8d41c8a1ddaa6559aa71c1dd021d5f0b48aba8adb7a6bb76f5103f5479405f4cdd1bd80997c3d547750aee3ad492dccfc4c45d465e9cf9089e775cc35f1c6ad25fc4c8c52314ccad11a6dd206a5d5ed00113b32a969b729c6a5922857e82b7a4d518a17d1a52b8d22839ea6f455a1747bdc2e7d105855f41531a74115c8dc1789c9199e2b98a48ada7504bf14f7f3b3a644f3579055a03ae9dca91e0d40717b6630b92c3a1eb1f401cbbc6c0b30ea10e0833027fcb56889167d11de55a30ebd57a52c60445984c6bc4bfcf42cc1ca55709b0ef334d1fe52accb062aa3679edea0e6597bb400c2775d5276b06c052636298bb22ef2f6a0b67764102436a57bce36645a9e56454b9bd03ade2ba26146ca2fa2a929daafa3ad257e5f83e7afa03e92d5bcd81b78f65b336b53e6afa3bfc3f56ab7dcba6da635a061ed75f1c52b8bfc0b8b30f5f198bd0d633a3fa9ef1e4b5c716805194d02b92563c10aa55d6d8ba4f3abdaf6303838462f427fffb6f85ea6a77db1f833c3e69e16041d0beb3f1ebcfff5edf7a4d60d6d89f438439b0980d68f589637aba63c12fa43d0b498c18abae9577ef427b8317381f45be3ca326e7003c42533751b404de3750303b6f02b8bda4d4c2fca048e7cef6458f338266625cd31108fcd0c5e2021b47b936a90eabd888ff8119fbc68e283234d3fe293c7b83ac4f3e5cf60aa0783413af46230eac3a0c12a5df351eb0f2e2de5528b35d212b8951ac1e37351a301e59c4ea3f328650c707e63785528ce89370b0df6c54cc1a7b9913ea7b9d2b925f620149631787e494e7fed64e1872e1853ef434cc246d49605a6d970438794cfd471fb9b81223a1b593d3ea537056b31c6ab454ffa451014bc2c011bf2a90701bc8bf332bd8021ad60f99b90f1c9b69b9ffc2722a09dedcee103869dea19883990f8d4c4cd176f7197f017211d944f9ac9bcfb615c22d011d43b14724d8070ed0f76a54ba7f975a77fcf7a7ca4135efdc3a2c1e175fc3f8f7c0647be1bceaf8888c1944d84b99bc7c45279d929250cc91fcb2e03906bb5b39c58535dbb5c3b0994d3ef748bb89b611237651357b43daf8567a740a7f27932c2a33215169551079593615279dfa6d23a6cd5c40b5989161869e0fdb5fdd78d612338e220f85698048ff7dce4357b4868e425c2224f0d4f4a3738a5f35fb6e3b6fded7c396163a941e25bd90f05cc2d48ddc99d3a8770b54c831d26fbcb0c4e6c53ce84efb241e552256b3fa46749dca37daca2f33968a8f1a7dd6e9a96635d0e96b7849b38ef37e47f2c0d19a3fd05c9dd22295f1a0000 serializedProgramBytesString: - serializedSignature: be867165175d86fcdcc3bcdc7a28617e87c1607c37d3f3cb358917d6fdfa4898eb8b71e003ff7e45225b2109d72aa970626934b554942bce8d51c86f9f1d930e + serializedSignature: 606e136105834436d44e43741a45eb94a9e134d15c39ed9550b04a4109a617c1744818c539e4b32917bab78c2de99b4a352f8a0b765864ab09c4444860e21503 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset b/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset index 8d9aedb..317e0b9 100644 --- a/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset +++ b/Assets/SerializedUdonPrograms/d18e451e2b012944899ec95f8a380e52.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59db6ed340109d4de22485d202054a69b93f1004c2e622dea1855204a5b449858450096d8222252124018ac417f0037c011fc13ff1c80770666ca78ebdb69bb42eb4102beb782fb333e7ccecee382993f051d751acd232cdd20d2ad106bda3267ecde2dec0653fb9f54bd4c6fd2dca32daaed3859891fcb9a24ea35cc05387ba18f981d671af49fb0a55f07b01632b78e2da2abe15f452190c2ad11c3da3459a54276344accaa08e53a7d82e9547799f3ea3b5224af124a6344da258414b47da1a50daedf7925e89590db4ad634c9bea90f94624e6052e7c0d25da3d42ff32b5c84c71fdd501607447c603c8a2b3292207499eb60b555b10a0b1a2241875e936ddd25a31a5463d7acf4a59468f9a08cd07a7f811988295abe3aa7828e8a07e5e1864126a68b9414f70e751afe926407de993b28a69eba0b14245942d91f71a6a077bc699c474f9c72c43a6ed4d0dd4b880b6f05c170d57a4fc289a5644fb05d475c5b79bf0eefbb86fca6c41dbdbf8ad9bb3e840a6d751ef5461f5b6ebba34cdc11ad6de4cb39bfd67e44f30c2d067f34e18664c8e11f535c0c47f0ced45c690c5da96715320537d75b7c8e447b51c4070701b8316eafddbc6fb2edd89b4458f0cd33d2d166c31fce2d7b72ff33f8f7f37fa4dbb4d66964d9b89312d0a58965750a70212a24d308c8cc58afae1573af8735cb9b287f0dbfd6ad26f7002b2b233f513a08ee271111d96f0ad89da1d7a2e4d9dde3a1860c76251390138b87dc6291906714a07717eaf218e5f53a220cef7ecda8298ecb38e06c1911004e374084330ad41d0629a0ee99817bd467c7a71ef10e99930e9877743baa1639f0152a53f14606187d8680f18edd9b10586c9f8aba9c848099bed08ef99ce96493943ef4863e248c34d10e64c591ddd4cc8b8c6428b2d3cea53d5cffe5838fb391dfbec57aab8e7bb1b47dd70dc1fd3712f0e713a641b8a9aeb3839c912031642fc84103f8c74c3c8e1528a417e20bddb90e0dd054c763d65d1f61332d6a101d97c922e028137c2487c7a7682c2d3b36ac0b6614fea7156d898f1f8aaa473eee94f675dbc4de15949ceb1c89505a439320e9ca527fb97031faf0f77cddae18e48415ec6251236a11ed7b2bc0d3f4fb2f4fd6d9a9feac7d90d6a7d305a1cd493ff78bc591c6fbc68f692d194c99b97ba36e46217af1eefcdd9b41ef2c18fd0b68045797d0801cce91a2ede83aae8b2d6935d8332bed97692538d8828b787b11d53e25fa6313ff7a0e786e8dfc1653b72ca624ece2409dc4507387bcb6b0a74ac441788b4f1fcd87969b4d6378dd7a435b2920378242980531e80a79304980f3f65592f3e49a47bcf1789c13691146c390f6c3349c2361e1ad04da74b62e0e592024f79c03b9b2478877c3ec7aa56d13d31c8c69282ccf040762ee90de4bdefa54f51fecfa8ef4b5f4b7b803bbf97be5644b90911fbcfd7b21ec82e2409d984c6d7e6e4695dc4b47ab5fbcfef32649fc00f40ae6371173e1f650dc7110a31cb4461006a0ba1ab74b0c58da942e469c24e7c8e39483731e35339c895615959ee5b4990292f6aeed26087fd6899f129c0250653e9a3aabe6b1eb21b5997ced29d6460a311ac98fc9aeb40db7f997cf9f9a4e4e725306f0bafd03374de10a5f863fc067e006eb653220000 serializedProgramBytesString: - serializedSignature: a9e29969fa6c479882c080bab410e71730d243da422c58ef1b3e569bdcfc46b7bf84f6ce28a7de31018225a8e59043d6e6c5b6a4231bb0b8265de3291579f204 + serializedSignature: 6ee8b78b63edf8021492700ef75eeae497ae79c153811f96be7900f38d7323fc25f4cc74fc13e285a4f24d0f2d171021b26415c4ebb381af0c1c2ee0a4c02008 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset b/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset index ff9330d..7b74282 100644 --- a/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset +++ b/Assets/SerializedUdonPrograms/d64743f497e1d0643b0507eda6089565.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed585953134110ee49b20410413c38442d2c1fd412dd052cdf053cf082e27a510b430e8c95c4140996fe005f7cf1f7f8bfacf251bfee9d0d9becec2ec1ac58e86e6566768e9eeeefeb99e949ca263c6a06c916add122dda14d2ad07baaa1b488bc8ad7fdf2ea57690ff92ed21cda66683a66243fd7d504d2657c35a88991fb94475e96f6752aa2bc8cb1457c716d09bf227aa90c066dd212add00b1a571762446cc9a086ae536c97ea47ba409fd05a14a578125b9ac691aca3a5216d5528edf57b49afc5ac2adaf218b34715c8dc1189fd9778acd82499a5f3347e03dcce654b89e68f212b4775b253dce96617107b23e3c165d17d29571fa0ccd33661461d020c166e0a7e4d9aa739a385936ac8a7f7a2a439f4288bd0bee014df0253b07215bc451f3d0dd43f127699a0325aeed033e43cea0dcd02f0971d52b6306d0514176903695de4bd81dac19e712631959d63d620d3f5b42a6a3c40ebf8ae8886eb927e104d8ba2fd32ea9ae2f73578fe02f28f325bd0f63d944d736e68c8cc3a9a1d2eacde756b8fa62558c3dadbec83ff1939164618fabe3ebd0c3336af11f525c0c47f0cdd4dc6928ddc9531eb6ea56d757364cbbeba1640b07b1b83169afddbc5fb1edd8db4c58c0cd33d25161c30fcfd73fdfbd36b5f7f58eda6cd93cd6ea22ec59816052ccbbba1c60212a24db0ac8cc38a76c2af4cf067b972fd0fc2eff62b4bbfee09704fa67602d4a0a89fd75d7690e7502a50801187876705d4e09119a75818ac2913acbc6dab8d63f1eab0a0261ad8fe961507c0da1ce7483cd7ed5c1220291d25b51688998f41e1e328b3843192363132f8a71d3d7e678fe2e354cbae033ef831633814e2d3713a8421983121c82aa9578922180c81bdd202c6be05121f24aed9c77853c81c8de969e87ebb0353339ec382e7b43190ef4ea330842d03c20efbe88881f89f78ac810e4599732b8b572966e68190b007c357317159be1a64732fe574712361e8aab289567036e550aae8d3295ac29988fb49a967a16a9c15aebbf3f892dc67bcf0c7645dbc4de16179565be4c902d2ec5d27ced2516655df822965f3ba50b78ee84df15a9ce5d9d287bde3c61dd8ae8017f2e70504b0836e425601152cc21431c4ceb982ceef3497a6396f8b002fa6ebc1359d1ded3e342b88a60dbcfcf0b2ef10feb0679e77b4782db846466457fa08f5b896e5153ad70c77f9eb343fe7f7f91b87f29b836dd8bc7d3abc0d9fffc77748877748fe6baf757f4e39bca18c25b9ea79ce6dbccc57095db65bb2cbc1f5fe3b77b581b6956f1dc694a3af7e17b8f124811b8e04ae911c7483494197f24137912474631ababc5eb44d94fd02fdca6f93931c9443494169f9a09c4c12caab1a4a379ead891fb2124d09b86bf444ff257ad2004efb00be9824c023a1cbbca6bb24065e3629f0940fbca9a40f17fe733707217ca23e478961db95afc4801b4e0ab80c9d98d0d2e12e0cb92f928ba6cb8de146b5ad35ccf85c369a9c8efc72be78cee6a050dda3ee2e42d132e383adcb7e733a38aaf48ca35e0490264b7f27981c8a60c566ca4eb4fd5798774dbbb8e9b85c35fc979215b986b052fc58bf007ce061a6ed1f0000 serializedProgramBytesString: - serializedSignature: 000c7de881ed76186033488670c91053d9c2fad8d6fe030cbdcb357ede17aa59a2eb9f9d60963ca1da6edfd3759bd50dcb100df49f4183985868bc58fdb4b707 + serializedSignature: 67d408988bfa9467d5255ba91edf476bc2653e70d87759c80af0d29765fb11e9c92cbec007da70c72ae1b5c71d40da8752454123f0e1dfa13c4fe12fa3b9a606 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset b/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset index eabd22d..2c866f0 100644 --- a/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset +++ b/Assets/SerializedUdonPrograms/d722b6db295ca634790a0beebd593b48.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d077c1cc5d59fb32df7debbe586e52ad972c5c64572416063e346c7c8966c04926c24b9514def35845e4309bd27a12440e83df410ba13134c422f0142fbf6cdcee8decdcdbbbbbddd27edfa8bfcb3463b3bfbca7f66deb437334df285f3131be5fc5a2e168b6231462c136562ada876fe2a76c22ae79ffba4e317891a275ce3fc2e75de8d12b969be849f61b19eceef12e7a956d4395fae17ab9cb042be5f22ca9dbf4b9c6fcb9d27885dedfc2f7752c59a391f2d13b3c542b187e811eb9686c472f951ad8a8b815eb196ceef22b1d9795b2e850226f9f2550fe7d712e74dad7c57e508add3ed270e906a5539ef5639dfd4884a87e64a49b165ee1821ff106e3047855d5438dbf9df4afddd44fddd52fd8dd3efa4c2b919a6efe8fc0734ce4891769e0a873bff9b3b7ff653cfbbaa70bc115fa2c21146fc6e2a1c69c4efaec25146fc7c158e36e217a8708c11bf870af38df8852a2c30e217a970ac11bfa70ac719f18b555868c42f51e104237ea90a271af1cb5438c9885faec2c946fc5e2a9c62c4efadc29d8df87d5438cd88df5785538df8fd54b88b11bfbf0aa71bf107a87086117fa00a671af12b5438cb883f488545467ca90a6f56f1fd45bcfce1f80146fa5b8cf4238c7833fdad2a3e57c4cb318e1f68a4bfcda05f68c46bfa2b5578bb917e82116fca7387917ea211afd3af52e19d46fac946bc99fe2e23fd1423de4c7fb7917e6723de4c7f8f917eaa11afd397a9f07746fa5946bc4e5faec2df1be98b8c789d7eb50ac1b66562038b55f8074567107a766c63ce0deab9258a6f65a4794a3daf71fee708d16676067c0f76d3ca50db33082b941c8333a07188077e875a70a974bf6f7b6f06dfb751e1bd4abe21eab95a850f20ba0fa0b410fe517d33143d3bb8b56c66d0d6dffd49a5df093d43f820e2b156850fa1b807511c840f2b3ac3d0b3c3b3c5db04df2a953e0f3d4378980ad7a9f7c38df735225ef6f07b1b9e9a572d7a866f46b879d1fc61033b9dee7e944e3f43789f8a1f69e8749f915fa32cf1a974a6743231a933dedf87e4c8a4feb555e19f85bd5c3d86e83c86d242f8b8482c578fbbf9db7a7f83b6feee099158ae9e50e19322b95c3d85e29e4471103e2d12cbd5d38aef7882ef7a03e3f506861b0c0cf57b2fe54af3aa45cfa85cb5ea6960a7d33d2a12cbd5a32a7c442496abb6281ee7d7284b7c2a9d299d4c4c361aef1f41726452ae3abb79d2e6e0146957a3b49ae626156e36703a5cc9333a03debaad7816d17d56c9f3a37a3e02c503dd31e819c267d0b7cfb8dfb6d56dfc91281ebecd37d2691d8eca4017b0ffbaffafdb088cc7d122f336e21891d8a66d51e1f3868ecfabf03991d8e63ee7cadfaea34ba7dd4c43df170c7d5f4843477fe7a56deda4c2d62afc8bfaa6003d03ed578d749d1066ba5c754071da9e75b1c475b3c475b7c46d4771dacebf2912ede676140fe18b22d146bee8cadf5ee7b91e6396a64edf798bc157f3f94824dad48f54f88a48b6a9afa2b857501c842f89449bfa92cbb7435fb72c74dedba0ff2f957e2c7a8670ab5146b62a3af718df1fabc27fabf4e3d033847f55f185e8599721cca7003d43f83ad2f1759777c75106efe354f8b1c1fb63157e82687ca2c2e3114df8663c7a86f035f4cd6b8aef6506df1354f8a9c1f753156e4334b6215ab86e29da9d271bb44f54e16706edcf54f821a2fda14ba3534b83c649eadb0946fcc92afcdca0fdb90abf40b4bf50b42b45bc6e61dbd74d24b6779ac7292afcd2e0f1a50abf423cbe523c5e14f1ba8a79743778e8baa1ebda76f57ea2115f8b9e6d32eafcc36da7ad6ee87487a274b8ced61a72a83e42fb21863c5d45a24d98849e1dfdbb6c33d2f7108963341ddf87883f5585da864d46cf10f622beeb4dc4f724e2078bc4b1be8e3f4d856f19fcdf52e15082dee92a7cc7f8ee1d150e21beeb2a52dbf4ed467a6d1387a26707f7beda96ed647cf7b54a3fc588d77a7e63c8abdfeb7cf80ff15eebfbadf1be0de2abcb9fad2da0caa37eafdb22ca167f8730d26df776f40ebed9d9a079a60a291bfb3da2d9c3a0f9bdfa66aa4153db6dca7edaecf60f2aed3483d6b12aa4eca5d9fefc80e221fc51bddf053d43f85f153fdde077960a291b6a693fbadf2212edc59b2a8d632bba3f2c12cbf19be87b5d7fdf50bc6620d970fc4c23fe2744438f57b68b44bdcc3c395b8594ddfe19d1ec63d0fc99a0798e0a7f3168fee286f0a7a629ff8630a6d2ce5269759dfdc6783f3531be1e5b6d834c9b7faefabe49a22c31d55f8d3545b2345561334296b78cf7a6dee7a9f73906af1c15364758ea7e5a357a67a3f92bf5be8541b3850a5b5a68d6a277369ae7abf7ad0c9a1a87d6169aa7a177369aaafd8fb531686a1b87fb75bdd5bb7622a9afd75b18747fadd2b637e8b657a11ecf3a18f7d6eded05c63bcd0b955df92e551e7630f87550219effd363f36af4ce46f342f5be9341538d95629d2d346bd1bb54e5a28b4153b57db1ae169aa7a177369a17a9f7dd0c9aaa0f18eb6ea1792a7a97aaacf53068aa36432e419a342f46ef6c342f55ef7b19347ba9b0b785e625e81da669d443a168c8b65ceb07e98b0c7a3abdeef37dabc2d38df469fa8c5dbe33e8f515a9fb387a1e29ddb895e8fbf49b8df840b82a75fadc8b0cbe418f5bf5f868187a06395f75f1c95da7e23ba8f81f0d7e9709fb98871adf6e1389e3db6d2eddfee71bdf1fabc26cc7b79a4f017a86702bc262abcb7b405b83b79ff1ed569138beddaa42cbb87ac09106df74e35b730caa69e1f1ada29dbbc8a09d6e7c6b19830ed86ed030c7b77a7ca0cbb2392ed4f1b5e8d9c3b8b0beecf91c17f67d1b7da7cb722b9128a35ebfd5f570127a76b018b8c8483f40248e91747c2e113f90881f44c4f713a9edd07623bdaec743d1b323779e5ec7ef6f7ca7ed971e6b61bb66b32faafdb595635001701e341e7d0be1e522751db6d1dadfa041d9977463b22b44ca3a1ceb8378eb6fae24785d2552d74b8b4d19dcd5c564c81d06adab091ebf11a9eba739b7e5f018d215e9826d62b141fb1a155263273d9e316de91b2afc9b7a3fdbe0a7e3671af17a6c8af4af7ff7761a19a971d07b868c6fa37808df57efe718fc74bc29231eabe9b5f7ed284daaf1339547d98c9fa93c097afc7c6d1a7ccd32906eac8be71f7213f123c7bad7a990189726e4c94083e64f06cd41c67b3d169e6bf0bc5ee52931feac2fc385880e8e9f97861f214ffd78d994e7b7ea3d3546d56de4aee819d79b12441fc7ef96460e4ace66849cca6f841af79af531d6cc88df3d0dbfa989f154db3d50fbdba8b901cffddb97153ded8fa7fb9d37aaf8c1281d84447f2a6f9b2bcf70ada79ee3ac36be5b809e21b4cc4b0dd7be877d0d1aaf1934747addd67959077c597dabe7c0745d6baabed5fe865a0f6d6ff45cd748235ef3d2eb11e6dcd828235ea7d76b0b7f33d24f32e2757add5f7f0be1d6dcd56584ee2f5be6f346e839af54f3796f1b32bc65c46b19f498e55d44a3852b03c09220c33b71194676356478077dafe7d6df336478d788d732e8efde37d28f36e2757ab33c6e1589fdd8adaefca3747dd2fd253d2fa0db40dd2fe965c4eb3e7d6f235ef7f9f41ac540f5aced691f23bdeefbf734e2f5787d88113f4b85438d785d77fe6ee033cd88d7f8a8f92af10f23fd2e46fc6083bec6538f2727a16707cfd1ba6eea7e74ae21a75e6b1860c4ebf9fe81463cb6d3385ecbabe7ffb49c3389783ddff68148b697ff44711fa038083f1489f652ad758ed66b24d3117d6c47b46dbac99023c136e5c4a4fddf55948b52b14ee44b6305253153377bfd657a077bd9dec32ff81926d9d689cdcea7e5362ff765d287bece29b5e3ac5eeebde47ca5e65e2c7f973a292a24d185b12416f725b100e12a9d7fe5c845bfd6899f273dfcc149bfc2793346cc7742f8ea20c70cede7fc4ba4b2dc615b29d63b4f4b9ddfeb24bd831cb19353a65309dcf9cd6f163b34dddd06554e8c06749df35c29255c227f6f9092964be94b9cb83ab9f7a15aac712af15ab149724bd6bdc6f9dbc673a982cc2ea37dd30115ef6e6dd0d934dbd106a4cf977d87ffe54863e488ec6e40fd809f66f9b2f7745a524efc0f43d7c8c020a044d1182b218b25c48d13f9729cb0380941ef3a266b682fdf2ede139d863e952e766420bbfb480de2397cffe84b9f7870f4293d7312552b14f9d0cd93e39d54aaa50216e8e5c995102f2ae4e4342b00414df86336f8e5f0674903c2efa6ab90e9bc674073d9f82566801cdab88d2758b635e260b94d6cad7c5da5c4b3bf59e010a976feaf91ea24e56001b06b213321b9894da708950d4d6cd9d0b2a1b321bddd49950d2debf58a6703fcd8116c4520984e060ac1a6360465ff6f0d2b82cb9c38b7833447bead90ad2ad8c67227559dc3a94655642aa5c66f81dca4b85eca901a69e8068f3690b6a3dc46a20ce3391e39a9dc6866cb0de9855b1182dc28747a4dc1e648db8c73a49dcc91d119e74836b252b99263cb15e93bb1be5172a5d8e1011c81f262d91f2d93541311d09b7283cbadf6f538c4732b5fae0d4d49912f7cd22a3710f7a7458ebde0749405a77104a40a54735b819283f2a50dd86cc1bbb5920a34dcde1b2ef0901969f61fec99d0596642cf24e5d28b4041d8c202610140d8c52a552b432a1088a0dc92a2dcd5425978a1dcca96eded1ba7cf9e5d5f0526787b18103423fb2add5376b9bdf6545adbd0ebd0f05d6eb7975a29528fdfecf841bf6d80815f61e1ddd3edf8f5247bcba965a0106c634310ec63ecd0466ac75c9a6be533700bbecdea656bb3a46f5f7eca262108c97a67d23ef59199cc2f0c5528dadacc1d148abe16e40a00b97e865aa605ec435bc07636666016fbdb3a8226e13634e1f636c21039c062b1e0278978779a7807aa45c8f5db2274a4280ff44bb9938d32283288324126f19e34f1ce94d883fd8add85cac72101e463578af8500bf15f9c1f2fc4bb51c4770a40f2ee14f1610110ef61219e2fb3b871069d702ad12ad91faf11e3199a843c8b61cb97052fd5f0d2bf54c34506cd012c81a61ee7fa17846a0a7ada4a1914849116c40a00b15122755330822e75bd2866a3296663b267d69b62964f312bc89e591f8ad9588ad9b8ec99f5b53103cb50188065e847111f6f21eed560f6b7991d69a21b72101c1f8b508798a53626136cc644b605c9a3ddf4bcc091a2e516e19e5cf6bf9fffdf3f440b014e26b6b994f4a58bb2fbd28dc466b0c03f256daf3c8571caa5084ff14978204578679f84075184a7fa243cd842385f76eb1a67ec0dab75ee9adb26c79a6f62e9684d1316db287b9ba986bbc148a68efc737fa8ced674916eec1d8c3054c51b4295b61916e4644f61a6c8baa7309462368b6256943db39d6ccca0712fb63183f612f60fb404831186a62f5957b0ba84ae72779c0dd839820016fca99b3755bc9ae5cb7e77aac5c6c42ebfd7d2970b5c8c5f8e2a3d9363d3bef25608e2032d0398791430e0fcdc5c17b9ec446cc857dee0186e83a3bd708f95f5db551f4111df2d00e22329e2bb07407c14457c7e00c44753c41704407c0c457c8f0088e753c4170640bc8022be2800e26329e27b06407c1c457c7100c40b29e24b02203e9e22be3400e21328e2cb02203e9122be3c00e29328e27b05407c32457cef00884fa188ef1300f19d29e2fb06407c2a457cbf00884fa388ef1f00f15d28e20704407c3a45fcc00088cfa088af0880f84c8af84101109f45112f0d807811457c6500c48b6dc4619d0a0ed6f0b54e359b12bb2c00b1e7d888835b4a797de234d3aead68e2736dc46164b65a6430c391621834cf4618dc74c091d4ea67bca27e7b8edda31866b43638efd63af9051fce71528377f1125125fd86ea9c2f92246c414bb82b25e1c13609fb672ce15e6a8ead2c61bac08b642594641536c9ba652099bb7f05e4f222c76e941c87f891c39dcdf222c7ee941c87dae4e897811cb39cb76572c85ce1e458b672cda7e4aab4c935380bb9a0046d72faf8f0778df306ee8cd9e849c605948c5536197b6420234c31943a06192613ca3cc9b207254b75b6b2245e59e3459685942c6b6db2f4c94016f75e9f9502e6608b243ad51ef15944c9b42e5b99963831a58e5cebe43cf07a2951ad2799f6a4643acc2653c70c64f2c27d31c5bd26db5664b16c294a85dec5b7a7135f2a69d7c84934afe568092561ad4dc29e1948b8cca9ed1b1dba6e2be70dafa59434753669fa6620cd42478e55f249d732573e2f522da3a45a6f932a93963659aaec2cf8724ab20de95b9645ceef0ac991b2076ba574755994aabd28b936dae4eaed49aeecfa027b53126d4a9f87e9249aedc4c234f5aaacb0da87926c733058792f55fb52121deebf54e1ed09250e725ee4da8f92eb08ff790872adcc1ab1fd29c98e4c6fb7d249b654e08d1b5ea43a8092eaa8f4252b2e4b911c01b87f57cbde41ad440bf270b5f3cf8b440752121d9d3e076749fd4b99245b4149764cb6eda0d9527b91e6204a9a2d3669ba64208df756afd426034c0a1c2b9227057285b749819514f1e32cc40ff2487c1545fc780bf12d1e899751c44fb0109fe991783945fc440bf1873d125f6d230ef34727099f9b8cd6d828c314cfc9f589e3949fcab1889d628ae7608af82916e25f7b245e61230e8ee57018afe9582e6c80a7702c3f8492fc348be4939b7b93fc502a374fb7e4a6a7d9c04a4aec332c626ff22876958578bef49e853694cf7328f9081dfd5791f32d8c3237483b0dadacedc89dd4be41708541663b7fe170ffbc58aeb01d04e44d22ca0da79ab221675b6c88b548a7b0216b6dd927fd911b72dbda42a7fd384475b8bd3bb99e9371669d2bec5bd6d2f1a7b2669d0d3de9607d6c03177efb9953f344a91a9ec6f54bdeafa50f1d82ddc5aba514100f52a43fab2a75ce9c578f0f72b1933ee173ac15a6b1b48013f15b434d263cf1ce97e5265c325365f2309bb9806e215c8790d4d5846623a303533c74346b28092eb049d04ea6ab1525ca67ac42beaa70c6a65ea7736b294379a1c550c63c1aca3a1b71a8ea1759ca780194f18be385cae4733ecd67bd8d0fb4a797d8ac9c49f82c9af0064a814b29052ecb4a818d149fcb293e5764c56713c5e74a8acf5559f1d94c95e6ab6da519962a973935ba4c4de2261e4ee44ec9bbf6dddbb4f7e1b696466e80a96ed49606165fd6cbf612fedea0ecda52c93b7e60929f36044e17ef67e9e5c08fdd5a5f23adf5b80cac7510d25376f808aa7c5e4b95cfebb22a9f47527caea7f8c039ce4d24523748a4c608dab7d7d68e79f72ff7a2cf51943e3752fadc94156e47dbf8c0a8e866913c2abaacadb751d13114f15b2cc49ff2487c0b85d0ad1442b76585d0b194e5bbdd66f95ac974d53265b55a68d8ecc9c61d47f1bbc3c60f1eb35b3a38de664be57ebf72565b9aaaceb85a04bbc1e54e479ba666ef5beea61a9ea2c6672f4d2e98e4845f5b66101deabba4e1e1118332c82750c5eb6e5bf1ea2c74b7b44e6631ac5ad7c92ee952a7ab5c23c7f16b3c7af89c4849700f5da16ac56c47eb6a6986a19079e17712c5ef77367e1d4462d765a9d41aaaf26a89729527de2753bc7f6fe3dd5ae96afa9b78e1780ac5f10f368e30ec28721e0f15b6d55b2f7c4fb5f1856107dcdb6d0e3b605b8d9761c76914f1fb2cc49b78247e3a45fc7e0bf1e61e899f4165c703b6ec68af5a8f20dcd5cea438ffd1c6b95b3de7d4ae7c6e7fd08b1c675172fc2955758f2f33791dff9e4df17bd0c60f5c6360dea1522d694175f3b3c4750ec5fd211bf7ae197087e78da2c09314e752523cec4f8ab19ea4388f92e2cfb4298abb43b94b7b0b6489f3a6fdaf28be8f78e5eb4ddff329be8f7ae53bce13df5f537c1fa36a3ac5d75f137081458efc5c886c9c636afdedc84cddab7c5c24f72af51ec42d0f19bf88eedf1322dd01b6fe34a0ba801752e5e5492fe5145c60bdd5cb8b28be4f79e5ebad5e5e6ce30b4dedd3823829d143037f0945fc190bf11c8fc42fa5107bd62b62de2cca6514dfe76c7cdb88c42ef362d9615ee3b1e37a39c5f3791bcfb642f713342fd75dcdeb68fb0a8aeb0b1457d38170b6d4bad413d72b29ae7fa1f0758705a6ab90179e57513c5fb4f1843ec10ae75f81f3dfce1bde429c3729aea6a478c926458ed27cbe747ff2c2e737149f976d7cda1bdabafcb2d3f01a8af32b54895a220e13ebe5d01afabad9b9185f4b717dd5c6157ad9b3843e9e349b127c1dc5ef35ca3225bb9366c3f77a8aefeb36be30d7e8c735f3b714b7bfdab8759079092e0e65b2b75ce5fc55eb0cad4b847b5ab5b7f1db0d14ef37322b47d959e11b6d5c4131b8e6cde23934d38be7d04d14f137adc4b7ccf042fc661b7198bf824be2fc9c0a740b45f86d9f846fb51186dec03b99109e4e13be8d92f85d9f12df4e117ecf27e13b28c2effb247c274578ab4fc2775184ffee93f0dd14e17ff8247c0f45789b4fc2bfa3087fe093f0ef29c2fff449f80f36c2d0487d287c7a19de6ba30cdd0bb816d5af9bda7d36e23083f5512678a438f2f97e4aea7f0520f50314f17f0740fc8f544e7eec3727ff64a30c2e289f6402760a1794072d84f3e56179e0cadcf0d3247e16b5534f927c6a43ca3a15021770e7c92b8339a4a426421eb26531e4c4e79964f16774163f4c95ca2ffc96ca3f5395e9cb002ad323947df9caa77d799492faeb00a47e8c22fe4d00c41fa772f23f7e73f209cabe7cebd3be3c4995eaef7c96eaa728c2dffb24fc3405f27ffd82fc0c45f907bf949fa528ffe897f27314e59ffc527e9ea2fcb35fca2f50947ff14bf92f1465f05df545f9458a72cc2fe59728ca4dfc527e99a2dcd42fe557a8cadd2ce6af72bf4a11cef149f8350a8be67eb1789da2dcc22fe5bfda28c30c48cb98ff8d596f50c45b0540fc6f14f1d601107fd3461c9af03631ff4df85b14f1b601107f9b82a55d00b0bc4349de3e00c9dfa588770880f87b142c1d0380e57d8a78a700886fa5ea7e67bf75ffef94d85d0210fb1f14f1ae0110df4661d2cd2f261fd82843e3d0dd67e3f04f8a700f9f843fa4b0e8e9178bed5485ec154085fcc8461c461bbd33c123c568e35f16c2f9f2847ed827dcf0b31941b8eaa79ed5e893096237d088fddb9615b0d9b46f2684cfa5097f4c11eee793f02736c2e02ade3f66f18201dfea5c91fc2bd9ebfe2e9ae5a7942e037ceaf2194538d727e1cf29c2037d12fe82b23883fc5a9c2f299107fb14f92b4ae4217e45fe9a329243033092df50c4770a80f87f28e2c30220fe2d453c2f00e2df5988e7cbbb521ae7eeb9e4fb3e8235f0c32d562d7f08e89beaca37ff520d88815f7c95289047bf8bfae7b1c6f338e3b9d0782e10638defc71adf8f35be1f6b7c3fcef87e9cf1fd38e3fb71c6f785c6f785c6f785c6f7ee3375db5e2cdd6d7bfea1a75608beb7d5ab5c01468cf6ffcca0e57b82ae6dffa5588e6263f9838da57bdb2b57fbfe23c5720c1bcb9f2860f3d980fd996259c0c6f2171b4b68d3c7fa6cd361be35a915182a42e1dd5d18700b30ced602c8eb9232f5d6f62e5152a65b8d6161cc8bcfb87729284318b3e4be2cc9e3d94a72131b4b28c9137c96e4a636c2509227da74d9291335205b086ecd28e426b12197432137d92772cd295da6b0e9d282d265679fbab4a47499caa64b2b4a97693e75694de9b20b9b2e6d285da6fbd4a52da5cb0c365ddad958c220746626baa4f0336b4f8134cb27481d28c2453e0977a4d02f6643bf13a5cb6c9fba74a67499c3a64b174a97b93e75e94ae9328f4d976e942ebbfad4a53ba54b099b2e3d285d76f3a94b4f4a97ddd974e945e932dfa72ebd295d16b0e9d28762b9071bcbbeb671cc30e73106d71a34d4598f4b9cb79be593f7931e17c6609136111bc2af72911c2e744f522c357b6a10d0cf965bb09964cf98654bca2ef2110e8d5a22668bdde53913b5a2bc3ecedd2803008e915baddc63c1d6c91818ac2c759e60c30ebcc3d2bb10bb071198efe2f76b7bd9f4d29fd26bb14dafd9821a7c256ed7852d737076c866a59f7e43cbbc429e77ed85b2172d07505a2eb169b99fc7dc83aa5027e60938ad66a52483658e4b9c4a7b6fba9b94e090b90a8f8745e452982cb561b22b99f3c9339041e67e2aea5eb41d4869bbcca6ed01be4b0096db4f0948a57f10a5601085cb721b2ed30d6b5a240f4781060136dcb958801d73b581ed789bc51ecedb35227e9c862975228dd46fbd683698d26c2f9b66bbf9cef1b9f26fd033552e275af38afa8da841e4e5104ae3bd6d1a0f35f2d2acb56ba4862bc47c512ea5842370826973865272ee6393739621679c272e6ff3857ba4e6529953c9e588ca83441b144cc9db89d26f5f9b7ee30cfdb0f7869927f3549e64aa03a6e54583619406fbd9345842b60d983fcead396abb6ea5fa86b6ff9842666982cac53c0a83fda91e5fa6b9b8246d2e529482b012c329bd0eb0e9555e6f17f5e1a7f8e8537ddc638d58ed7ce20e044aea53c60f545d2ce52f57072c25da50b7efbb4622542559436ba7eff34bdd03e6c4690485d381369c666464a5f0e976b6b6d0bb95cace028fa4745be1adef977ca079907dbf54d4bd683b8ad2f6209bb6c569dac5629997c9bd2fdc2fcb249eced36c4aeb684ac7529b8e6730d76a38f4011f3e11ff66b6700f5bdb2ce0a086b9aad60387cc6b3a468ed6227eb4b3fd60e720501f43a1bed286fa5c46d4756fad5ce0bb50836b0df3294d57d9349d465a0c9b8f6aa206a5ea9814d00e30d9d5f95b9fbfbacae9dd25d7bcecb52aa0b42aa3f28feabf632b5f22354deee1d07dff4c4705d96b3a96d2b4dc5bfe25dbe4c4dc5b63c95fdac2db4a8317adc6515aadb669b52f63fd9be7bb2f134ccfbd9042648d0d91f146892e96baba7ae99c85b9c854653255bf0b7fe7458bf1941607dbb4589cb2b4ba674867523fd3d1c8244550f575028540850d81658dd69e7b29d3d9b4b013291c0eb1e13095ec85fb1b8305db579b44e9746826fd51fbc8229336a721e74026533a56da749c93918e0ba4a316f40dd6491d57a598556ca891d4144acf2a9b9e0519974faf333dd949bf33257db54dfa05a49d4dbf0690bebe654a39881a3895d27bad4def1252efd4ab5ed9ea9c4835087da751faaeb3e99b9f717baa7b7d95ea7da96a03d37ded45f65d28d90fb3c9bed0635f20d1a664da0f48d55f0f52f7e994ee35de5667a97e5055bd25ad48d94f4fece164526abd683983d2b2d6a66561007d56da8e66db639d49e95067d3212f438be26a53ab6ad9c6c0a49d4549bbdedbfc9f4d5aaf652bd1699ba37c1551da6ea056ff839cffa37a225ed307db072da630d9e8bfbcae09bcbccea6a4dd94498f999aa7992d473a15421ff81fcc1c4db63acea174dc4cf54932d1d14b9fb961f59d4be97b38e579904d1f2c937e74d0f6661ea5d911c1b5059b02cb875d29698fcc64b59a6e7db5979db7f922fd95170d4a280d8ee2ea3fd0da659b0bbb513a1c1d5c99493d0bed45dadd29698f094edac30393763e25ed166a2ecd9b3783b7f9c4c6f3685840e1706cf67e37364f8ec69a73da83d2ef386ad6d89fc7d7520107dbd739e46a2c9620fd383ff5f7a97b752d9c7f31793dc61cc9073ced16c92fe0a956e443a593f34d995e580ebcab1ccdd64acdf49a45faeb6f8f77c06d0e17cfc1cfb018640c280acecc96537ddd9164a5c09721d4cab36bca252635b28f32465eb6015f657a0db16d8e7b0c9ae5c6da657e21b1e91d1e8bb5501a695a0ed27089e50ea7e90990ab6d54ae36c9878d5e72eb6d36a529bd142702b7a6f632d4230959bcc66093dd25b0875a5bacbfe3ed3059ef810c7d3f775adee6d94a26efd192c05245202db965c84cd8c8f59205ce751baa11ae8be334275b5ae43429803c3989133838fe588fe5c0cac4fd0a20efdced2151000c7e346027730206873880192f509d820a59f1ddc6f1702741dc40c7ef12c2e52f0a606e6b1907f3144e309b4b30e173f7e6dd288033bf791c9c5339c1694f564dd836140d3b5680aae5699c60b5922549fb8469a8a200512e2a4fa7734204079445bb55bca36d1caa33f88d3c9426d7bfa758ed385823fbf0b3c47a399e8d369865397130cfe4ee9bd150b9ee54ab94505100ee5ed4373b8b13b8d6f5a570b61c3f44c9aabd8d4ad7d99c20f512a9fb63d1ed859d211b8616390671d34335fb51a837dce9f1329cc33c476c921ea335925e99397e866165e8243f078f7ff3321a0ae5a5ed95e5f96e3cf2c88a9f477473f2923ad27959d68b3cdfe39b3c4f63f13c4fad435e9a3e4c7cc2cc3ed155001366e7fe3f9fcb2a80b9acf3000438ef007e5c2bfd2b4e2bdd53952ab7e4543b89526f108633350d19fa26c990787c85b6c536695a2558ebce9928988dc5862b3b74a3773e279c5d249c15724d6bbeac205041e738a2809159224bc55a01bb79d9401cc105620f04e2af39411cadca64a59308caa36b3b5ddb8e1d37bc6f5c5b21b7d73201df870bf84710f0174415f88208027f1f02fe426e2b5c696db5dda5b01a874f91eaeb94895ad9a36183b33b179c63119c1771c2d94395e355aa575097b4968df7498c1713f9c06cc105e68508cc8bc304e6a40882791102f3923081393e82609e8fc0bc344c604e882098bf46605e162630c74510ccf310989787094cc631151b98bf42605e112630197b9a6c609e83c0bc324c60328e97d8c03c1781795598c09c1c41302f45605e1d2630a74410cccb1098bfe104b3bb483dad97e85fcd68317b7241f95704e5358d0965a2bb302394e77241f96f04e5b59c50f6915002db4ab513063cff17cb19d1f8ce983da54fb33b075fade2a2375bda07817a1d27a87d2de533b3adcd8cd31e4f70c10ab7676858afe79ec98f2fa4b9cb5d2ba51045d26a56cbb3e48058f496439aa3b2f95b6e0f13fb6a64896ae36155c95d648bdef4701b04e30d0dd10465d6358ae2f8671e82f2c6c68532ea1da30a04e54d9c507616ee5a676dc2c27fa28301b85f44cf3e764610de1caed577c6369b0dce6d08ce5b1ab372e35d616339a736d896d02e4150deda10a3f1cc463d6339577dd8c63d3d505ff2b63081c958c9d9c0ec86c0bc3d4c6032aefab081d90581794798c0645c8f6403b31302f3ce3081c9b8eac306660704e65d610293713d920dccf608ccbbc3042663d7880dcc3608cc7bc2046614a7845b21307f1726301997d0d8c0ec85c0fc3d27982d24982b91a360f4e6cd61278006eb0ffc8345185dc351fd9eb70e4660dc5d8ca0bc97134ad8d262775f5de87cb64a3ee973de96890d6263441d58272240efe304b443524576615b22dc0d05491bdb2250b17b21f0ee6f8826650dd9a82c4b9809621c20b6e202f31804e6036102937180c806e6d108cc3f86094cc66e381b98072330ff14263019bbe16c60ae41603e18263019a72ed8c0ac44603e14263019a72ed8c03c0481f970438049ade9984b648cd59cada3be1a81f9e73081c9d800b181792802f391703a5e315a4f36c7ab189ac478947b3099ee2c831dc17ba82d2aa78f85c77b288a9ba4e623281fe784b2bd84b254c42f920507d662411cc81881298d6e08ba2738a11b9cb1b54c759f116bfb3e9d0be45b11c84f72823c28cb2629f184044688d966977e8f207e8adf0480d75b89483e84278ade6e1d11744f7342d7554257298ffaaeb3b6f151b6a4fd108ccf70c3689f6d4f3ef62a7a308e41303ecb09a3ebbeba8e2885ee855bd184700a82f0394e08fb64dcdc242ee3323a0b7ec605ea3f11a8cf87115446a74136503f40a0be1046501947436ca0be8a40fd4b1841655c236203f51504ea8b610495714e890dd4a710a82f851154c6997936509f44a0be1c4650192795d9407d0881fa4a1841651cb3b381fa2002f5554e50fb650caa3953cf3a19c23657df19cdd5bf16566019cd001bb05d11b0af871558c6468b0dd8ee08d8bf8615d8282edbf544c0be1156601907046cc0f646c0fe8d1358d7a97b55fd9c54149dba7ba296fe4deec5637d487eba2b03205d8d4c13bd29bed908d0b71ad3632471f19875eb2adbf2f15e08ccb7c30466148fd2dd1b81f94e98c08ce251bacb1098ef8609cc287a892c4760be172630a37894ee1204e6fb6102338a47e92e45606e0d1398513c4a6a4f04e6dfc30466148fd25d8cc0fc4798c08ce251bafb2030b78509cc281ea5bb2f02f3034e30bd1da5cbd865673b31ee1f08ca7f7242d94e41098c570bf78621977605a7e75c0e17700201f7616396c10673af613b23a1099a4edbce09257dd592fd8cd768ba80e1ebbd3fe2f6a2b3c3199f688b2684231184ff6a88ca4db5d6d1dfc63a0741f96feecaeded3ccd28ee707b11c1f931279cee3114708b65e2191e5176d3ee8ec0fb84db93c36e1941e80d622ff56959c2869768dacaf108d44f394175ef57b53b6daf9764e10eca12cede24db22d92004e267e1191e4e8ce42cd06f11989f8709cc28ce02dd80c0fc223c636dc67973b6b1f6df10945f724209bbbae2d611373fb39c677713161b7c6db8e06b8ae0fb2a3c23ee281e3efa2982f26bee2122bdd12aca43c46908c26f1aa291a1dd5a00c0da86706999c405e65c04e67f38c11c68a9da5e374933ae7fb3f52fef44007f1b768019bd35d800be0301fc5dd801669c246603f86e04f0f7610798d1138e0de0bb10c0ff0d3bc08c232936806f4100ff107680a3780ec8cd08e01fc30e30a3af121bc0b723807f0a3bc08ce33236806f4300ff1c7680193d47d800fe1d02f897b003cce8e7c406f03d0860d1243493348c65956d92a605728b88714299fd619651dcbcd50cc1da8413d6fe1658973b78143b629709f73e04372c72921fec7cb64154c859b11ade1eee595cd03e812a7fd386a8fc992dbc44d1c7be0441d98c134abd6bae52aef3bb90ea3d72987003f9a1b0cdd7de8b00cd091ba051bc8ef4cf08d0e69c80f6b654767bf3542cf44659d6327a1717a4c723485b34aefd8cfa5aeb4d08ca969c5076b3b4f2895016394f7582f94af145312620fba2ee52ab86a8e6e97ba151afe69fa0b2d99a1352ef2e918ce3243697c8af109c6dc2374e2ae42da5855c155fa08adf9613d60119c33a4f7dd260c75fddc05566ff85ca6cbb709900c6313d9b09781dc1d99ebbb5b73bf62e76feae93cebcae9f7434bd5a6621203b34660fb4c1aa38dbf4dd5a0465474e283b8af48759476f223917c1d789df42c62b7591fcd8fdbb5ae8db54dd1b62573bffa259b16720383bf38f8732f1d28f26905311905d1a738123718cce3883c436467f0341d9353c6b458c50b235361f2328bb7142d947556f60bc0155eedab476337ae5b31302b53b27a89d24eb1def12f29608c01e9c007691acf5d606b85d0648b99bba57d5f7c758cf4fecc805620e02b167f8a637c6f35a4cb665e09f10acbd38614dbd4b3eca77cd8c4010f60ecf726f144f4edc0341d987bffd767793d83ae9b87cae90694a458dfc387aee08eb11a87dc3b39c16c5aefa8d08ca7ee19aaf64acee6c1da30f119cfd1bb364263a2144d1afe36204e5004e288759a04c74e72a96531b55f26fe82ead9724e7c87b6241ada51235dd4c31827d0d17d88723b07339c186d3c260f0b8527e5eea50ad8df4c923ed1170031b6f3238aaf0f545f00de2844fdf64a09db7a0e2e28db6653b9857dcd708d8c19cc07a3b2aa3309267c99f81c01c122630a338223a138139344c6046f12cf99311983b8509cc289e257f0a02735898c08ca29ffb8908ccbc308119c5b3e44f42600e0f1398513c45ec3804e688308119c553c44e40608e0c1398513c4bfe2c04e6a8308119c5b3e4cf46608e0ee7f21a23ac6ccb6b1d91f7f0184e58075a60758fc1827d94d56237390db74eec68e72a3741e5363f9ce5368a9791fe8c602d681c4fe2656283d8e8905be5248579a7682e0e4f40408e0dcfe2701447efbb2328c735c45e363dfb599172b5287a65f23104646158808ce2b4f10308c8f1610192b1b96103723b027202ffba50e272c6a2fa5522f7045136f82671c1d71fc1379113bea149e5d06d6ac009011c0cbd9cecc158e1d95c693e42404f0a8fd73b636bcee64af31e827232b753ac7d29d87590ad107aaf1a1b886cbb83062010a78467eb00637964db3af0398272e7861848c60f46c97420c96831d90692ff45b04ee57695315bf628fb7a7441c04d6b88aa1d6fd30b77b06efa7f1094bb84efec0ec60e3bdbd91d3f2248a787675a238a33ef8b109433b84ba77daacd15c8ed086d10d1bfb7701482742627a4eeed70909cbacc8c0dbce95ce00d46e0cde2afdab68ef96ce7af1ad5f989f231123b23288bc2b55d80b1d161db2ef01282b398bf5adb2e69ae5649a2d7ccc41078b31bf324b8a8cf9e3f8a809c131620a3d82dbf1f0139372c4032fabbb101f91602725e58808ce232c49b08c85dc30224a36f301b90ef22204bc20224e3ac241b90ef202077e304b2aba00687300b09474644b9239e8f60dc3d3cae821322b9bfe71a04e6fc308119c5fd3dd72230178409cc287a085d8dc0dc234c6046717fcf6f10980bc3046614f7f75c89c05c142630a3b8bfe72a04e69e6102338afb7b2e47602e0e139851dcdf730502734998c08ce2fe9eeb10984bc30466145719af47602e0b8fe71a63f3c3e6b9f636827279789cae18a16473bafa0c41b917b7df6faa6d26d19cd62842f0edcd7d37851d3ef3bcff3d9d78f7d456d87516e539a34204ee3ee1dc59c638e1c1e610d83a168775dff0780e45b1b7b92b2aa1fb85cfaf8d115236bfb61f10a4fb73cfb767eafcc206239b5ffa4004e301e1b39d85bca593ed2eaaa6c8761ed890e7bf55885a74b0786adf22c6491036cfa29751795d112e472dc6a9633638b722380f6a1c17427d6a66d45d5977415096729f886defe22f743e5b259ff42270d4419d84405dc9bd29c50e6a34811b87805bc5dfae974ac6a5a85aef98b752cd44b09635ce381e84868b6ce0a210386f638e23de1a277e89a8924d529df34534c11d8ec02d6f88be281e70eeb81bfb2e40b0aee684b5ad8475a56a72ca9cc44b843e13267a23a36108b6359cb0f517998e8cf07695f1f23f6b891cc1353afa0e417b70f8069d51ade8df23582bc233611745cfb90508ca4338a11c9465099de5fc866b6e36cba127e314099b7d6d87a6480ee5bf6b2d71df2458d24dce7809feae9142958a8d11ec32b542e5b492fbc63f779b55a55a4302e8cc35a5e895c2a108c0aac6b966d63cdc249a9df7c908c86aeef9f83878899ba3f5bc6791fccdd8eb6cc705633304e3da86e875c27011268da966679efaa0c1ee37bf810bda2311b4ebc2e3a5342e921da4c31098878509cc286e2da84160d68409cc286e2d5881c0ac0d139851dc5a701002b32e4c6046716bc10108ccf56102338a5b0b0e44606e08139851dc5ab01f02736398c08ca2b3d7fe08cc4d6102338a5b0b362330378709cc286e2d381681797878b616308e7fd8b616fc1d41794478b6163042c9b6b5e01704e591dceb93254e92c5d2650bd6cc5d0f4ee0103dd7ad0e08b6a3386183ab808ba54f112c3e54399a958b4dc2bdae06446183ae0d1774ed1074478773fd91b1ad665b7f6c8b56748ee184b58d483e4138aa3702ec84cae2164ed07245a6878ada17c7a2b92c311ac17b6cb8fc85a3e87efd1704e771fc7701605fa264e756774360f4d61c7b23108fe75fb47597c4ea6473b3639cb8de15017842c39eb83e51d0c79645f168c76f11942736c4f96fd4f81a03c938b66603f27404e449610192b117c906e46908c893c30264148fbf5d89803c252c4046d1469622204f0d0b90513cfeb60c01795a58808ce2f1b7ab1090a78705c8281e7f5b8d803c232c4046f1f8db7204e499610192d117880dc853119067850548c6650536206b11906737c4ca61a6333f8c9d72b6799fe71198e784094cc6a1221b982f2030cf0d1398519c91fc0302f3bc3081c938646403f38f08cc5f8509cc285e82f43002f3fc3081c938746403f37104e6afc3042663679d0dcca71198178409cc281ea1f30c02f3c23081c9d8696703f35904e6456102937128c906e67308cc8b39c16c2dccc5daa82ecd0e41905dc2bdb2385f686f8cdab4c7e544cf43b23582f2d2f0389b3236316c50be8fa0bcac213685eaf56ed8ae4c6f0ddd11cecce8837cd62e6f585782713bd832d937a8945e111e9768c60acfe612fd2582f2caf040c93873c906650eaae05785d3d797b184b2d9cde608d6ab1bfa74ace50e1ec58ed865c2750374c32227f9c1ce671b4485ec89d6f0dad1b3b8a0fd13aafcbf09cf314e51dc24ba1b82f29a863886397e9a46e665941158b632ba11017b6d5881659c346603760302f6bab002cbb8b4c1066c1d02f6fab0021bc5e66a1d02f6b761059671fa8e0dd82d08d81bc20a2ce324331bb04721606f0c2bb08c830236608f40c0de1456601917ecd880dd8480bdb92186040572a6cab65970859c1684f3dee193e8415985a0bc857b93ea1259fa6a1c8a456871247a2b492d1068b78667481ac5034d1622286f0bd786d4283a267e81e0bcbd71ae015b2af07908d1dc263d5dc2d822c7203e378978b12c33506ae2b79ed53af1f344b99cdb04445739cff365bb5c270e72cad57ece3f6fd81fe0fcb3c5c76270eac51c07ee753216e89549da5572f9b9d2495f30d2497207148576aa28e4c94b45e319663f3336cfd3c9b279ea58691def1ee20b87f9d608b899c3851564ac5569e394dd342b659a228965b5dc7f0f68e4a56837f2e486de596a557899f3b64cb8377862596beb65cb64577f9ee795e854389528a30d16659592a597937a91a5daa4fb2eddb12379f2ce1e7d7b5495f3ed3a29a9ded69c174b75de0b14f698c4134a0f705de0bc07095c4c4b1d7e7ab374fe2827596ca2f3cbed658ea9ef5fbaf5a14a54a9271d9f9e2694eed4d4ee84221cb35bb3cac0ea653a8d5c5302dfaf766477f30662d3699a5e3fba8eb74d912bf970a0c30eadff5d90ef2adb6531ed214d02aeee0b650506a1e027e7ff0031210d8ac9850200 serializedProgramBytesString: - serializedSignature: 106ad477154a6e1336f276a947d1ef822663a0a320325c6e3c88f3a21e02b9dac1b1e70b2bfc0b5f7aea2e3c036decd602c17838b59e3e17cde42a9808fc7f02 + serializedSignature: 83540be53a05316d827ebba22b3465bea69585d004d162128f933cfaa86bc994a849235e7b056557248fd581399f3a2e32a3f55f641173ec1c70b0e9acf8870e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset index a1e8a1b..4df7689 100644 --- a/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset +++ b/Assets/SerializedUdonPrograms/da113172081f2ba40b9cc46674a846d0.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ceb53144710ef3d590e8e973c0f05a3891a310a7b3cd53c4c0011898816afaa94953a0f38f4125ee1c0987ccbd7fc47f97ff2317f42aa4c77ef2c37bb37b37b0b370718ef8adddb79f474ffbaa7bb676635e1007eacbb7859854598862158810dd8851dfc358df76dfcba4f5ef90bd8c7fb6bbce6b0ee2e5c8be8499f5b562f5ee7f0a90807d8f310d6f15ee0fa25c8e3ef39ec9bc7272addc4bf3cb6b2eab0d30a3c82e7b00069ab3b82c42a772a8a328be4b21af03a05bf616d9e99a2411cae4ae365096b8a5cb78d4c7bed5ec28f2cd636d6ad639f7dd8429a6b4cb16103af16cbc4b77671a7711aa5df96f8abc7bf2ee999fe2ec21109aeef969e49e2bfc5f30551df233d5ba20d95a74378f0fe9252992df124f3d72b7e378ae74ba22df161bf7ffffe5f51df21ee2989a6274b93e87b596a2397f705786d9168b448b4a86dbf37ae6db1053c419de4600f9c0435bc1dc354bd9ed1464aa4eb134209b778d80334873d24a0b09415b6c303188511a5a55cb29a25bea7f99ac31605264a830586f8ab6c08626e0bbf79c9cc8b583ecbb3840cbd803543308f77eaf50a86d1705f06a8ace2b05b3855f2b08cd73da6f70ad92e6f1925124d89609f45a4e9ced86d2cf100ddc3e72de67089af6f99d33c733f876507ec3f76d0834ce1fd1d8f562efb3efe568db92c2053f3a89eb8ba72d73d786a7a84d210f70ecfb38f1a390d8db0cbbbe2f94287e688f56799263e62e83a199b03a24b63d80d49beb21170d8e72f9721185fc67209d5f64d75bb4c25876dc3e451a3432abfc35294b40cb65fae51703886f547c815862ad11be0ac242effb65d97212e83f85b2afc29fe5a4b35c47f09fb509bad086b52a34fb05e0da20f0a0564ea457231a0088f513ce8104c2810cc244566a364ab31c01635d610bfa0520fa76aaf8caac7cb3b9630c03cc5ba1cb6cfb313a3f2174831876313bd491ea194abf87b842b8e72a9c100426aa5a5586937a42ceaa49ce9d459a7429c93be3f6a8278547638cb0b983cae2ed6e02711d6bd717739a413475e7ab088f74de682cad78569878f15aeb3a6237c4a3a7338719e8991e39a978272d904db4e0bdbce10d0aa6c4764b333ac81028f34a4e48646d0b5f7b078c66bb343d6b66dab2db795473f5bd8e86cdf56b932b2fd3685d23329b1fa71516e6739af29e5f47e4d61b73748e02d27a287c8b38a574432e8215bf51eb25e355f9b6a1fc00e3895a676f10358072fdffcf05a244391bb6f305b512eb2531bd7c259d3194352056c73ad810d4ec978c076551c60ba35e8458daf43af41851eef19e48ca2a77359b4a6a07e257b0a7370d43a1cd99e8a914d33b23743dc6f7cde74a837ea1c58afce81d1b6518a7c572ca793526997da5bd953d4ee32fe7e1711baa2357bb962cdf6b166af476ab652be745a6d5269950afb55ac06d5d8a95763b38a30f93d5acc9f34756f5111a7c24f2ae13aad27dcaae3fa6a15b86e531127acafa9621425e413701ffb6df2fd3ede07f1d71a64601c7f8dc13d78c0656b38ec38960e629b31fc0ee3d338ef704ce07d02e77d1cc55dd441f069152068d729eeb3132aae434598b479bd12c27d7ac29d2ac264dc372a21dcad27dca5b3869b2a6b18d47a8215de6d2af9f721c8e2f735d00148167d9f47824a65af24afc9e3d847b78eefcf557c3f0ef86c795497d35df4d759de95cbc32fd829c7b29094611c87d5f8ebfcfb377124edd1497a4b25e94300e562788135f12b47809f059f7e1dcd63dd3a139297d8d442454fb7188f23595a27d9804ab21f624be61ebf3dc7ba9d63c992d5d8ba6af916d4f72af25388e9f37a7578dc56e1913fc2c35b56c90b40777f9964d9e4231eca3be68e5acee08c7417998bcc7f1e797d2bcd5b1739ff892a0d4dab8c1c4aadb2707915e2afa9364e9774387da1c269de204e8bc25be4591e37cf2b08dff13bdebdf3986a487d5927f51d95d437233dde32f2e0d7995e9f71f8ecd3f17957c5e7446844f1f24a97e3a2f05407a234dc024f8e78bf4e924195240f62c6464f9aca62633c7992f8b5787f6186ad771f7bbee01ef454048793c00c54be6545636fe33ca618b67ce403a237a268534e7780bd09d53acb8ce24135cb87a4792e4b57f9f669f9b96d5248e4d142a43991fdd0247564ad261ccea7ef1cd39aa2b9203badbfa0b6a1f8bb612e810511c32dcace9f63e3d24c9ee61dcc1d4e8c36a2c78bda3f1a6402de995f15dee120239b44ce3678315fc42f7d927622437a18360916652859d6899b0dc85065357b99e701c07f18c0a41d201e5c3654eb658b4af792cb1d4c1bbbf4777c4eb0cff436820e87d7a0678df311d9610c444eba8163595a29eaa9a35586d01bfd9f07a40c05a43102a1cbf3dfec37c64dfa8d246b93f449533d8b1e3d30c2495e9968f4f987964ad83f8e8fa8939cec8449b09a05580570df2925b35f67b31f31075bbb29d81a25d8ee9d0e6c63e6604b9a82ad5982edbe49d81a046c3ba2c0e8e4ec3405579b04d783d3b1b2e17338396d09b62f4dc2d62460f36f831ab535db14682081f69549d0520234ff3e80413b33e6cd1212645f9bf6668758216fb718832b6d0aae7609ae6f6a61617bbe1d7f839332650ab20b12640f4d7bb28a16bae7605a5e9440fbf674a2e6a839d8fa4cc1969260fbce246cf5c29b79dbe0e70faa0e09aac9d3b13083decc58006890609b32095b8b808d063ee0f735776ae1d1ba4d01d72901375d8bc8e9cfcd0cda9ab1206049903d3a9d293a7e0ea7688b04db8c49d85a056c45286de32d9cebc57abd04dd6393d0350ae8e4235683cb276380354980cdd61a308316662c0c2425c09ed41a3083bbb4c682402b7c30076019ca39e7c077dea4da1618284bafddf3a376213305a7679c16e5b0478eefa5b32487dfc8a473803867dee134a30f7abe27b12cb52d6f554d57d538bc52497a9283ace610ad38fc12eb872cff5359ef09875f7e1dae82ed4573340f71fe030a537b29674fb7eebb917bdc92d83c896dd35ac24fafc0e33a3d67d3aeab27fb33bf5da78f6bd7f1395a3069d72eb5370c7f80f66c05d2a9f51094b9d46a8feda1f4b6a93bcbdf00fdd3d56824ae583d0021d426f1e935cb5a60aadbe07d92b6f74df3545ec1beae67a177a3f7c5a4a68ffd1f253bed9bd0490000 serializedProgramBytesString: - serializedSignature: 5e2ec77d775a20c790290a7f50e2ad49345534f43236fc36bb50e03054715a07f8a5cbce2b218ee10b4e7bae57c33ea0d31db88c6febc7d4e72a64c67424a90d + serializedSignature: b6084131e4c6e166a2e68f9f4cdaa0e9e8c958e07283db394a28fb3b22aeee70e32a40136336db7e9a4c9488930bf6ef60215ae7dced8fc83a98c39dfb38be05 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset b/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset index b0105bf..c611596 100644 --- a/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset +++ b/Assets/SerializedUdonPrograms/db575be8fd5633c43b95932365680d15.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9de7571cd715c0df22966209840a450249a8212410bb807a354d084908248a1d97482bb112381499224b4e71e274c7e94e6f4e757afd9473fcc17f42ce493ee49ce483ff887cca97e4dd3b6fd8bb33ef4d61f72ebb6bc36167e7cdcc9d777fefbefbee2b3394c484fc89b4cb8f497153f4890e3121a6c4829897dffae4764efe5a7b76faa85894dbfbf233218fb58b669f2be1e750a4417e0ec9bd25b12caf5c1177e576068f8f89a4fc3e24af4dca3d48bd27ff92f2ac48a9bc6842f48b11715dd4476a7d444ce2454b2a2d027a452ae467af782c8f2631537093181eaa971f63f2c8121e9b9399b6cf7b563c8f6acdc96377e5358b6256cabc83122bfacb057e11d6a6426d2be55f54880dff54fba56abb4ffe95c9bf8b641fb64fa8f4271de797abf41eb55fa26457a8eff49e9b1cf78c1a64dbe907547a2fd987ed4195de47f6615ba5b6fbd5f17eb20fdb6ab56d51c707c8bed427f28ee3fe871cf73fe490d7aa8e5f22fbb03dec6078586d8f2836f6773867d02153a703e4e73f0e1df613591b1d5c2e3b64da7c6cbd87d2f5def0b6dadfecc3bf4c6db7907bdb65b255acda54e9319556a3b66de4fc6d24cd8b712d91f7ae4adbaeb6ed445ebb866d9dda1e75f0b6d360dba1ee7b85ec038b371c4c6d863175fe55c7f1b8262ff58e6bae398e37a8f4619fb2bf6ee91ff987f0af5b767dec14e9b6d7a9b63b84be8e39d375f7d849ca1db64da9b229fbb74a6b54db2ec2a34b6dbb1d65dc2d523643f330e2b8ae86c8d2e54b9756abb6bbd4f6b8923d4af6617b8cc8deadb627489a6dc327457a9db2ebdf2972ee29722e6c4f8bf47a76da2a9fb2371db2edebcea8f36f907dd8ee51dbb3eaf84db24fedfc9c3a3e46f6e17eed8ef3cfabf3c6c9bead379533e190f3c891af0b44f70b225537bdcacad6b58aec131b8fda79aa0b284f97d62452b608b227435e6fdfbbd974ef68045bf8cbb2cd4d88072286171e16c14311fb4aff20044497c107fc1cc2db2ecbe6fe8114a089042630ce589635ab4b1b09ec886c22f9eec3cf843c6306853ee5bec55f5db780cccdcadf2409639664fa20464110c8ccc8231dd2d9cde055b7a5eb7956fea64b9994b79d95a150521ae18abc15c8bb2db3ed3ed34f2508799cd7dc9432ad886c4ea6d8401fc8fd59cce1187e3ec49c2631f743326d19e3c3791921f6caed23bc9b5bf745f95d77cf71854c9f477d60664ab7c23fbb98faa53690fbd80630b3f74b643d4a04d0973da5aa61690c5bd9d75c25f13e43cbc9405031a4647422b2485a5a978861dc71d34530bc8e6e0df5f66df13e211b5d2f5df464a0b81b51835409bf337bfbe557df6a7c379aae5ab7886178dce4a39a175890d71aa97349f056211a2d8d43469df8233afcd05d8b8ce510bf75de0c9e17be00cab0654a2f804835860d0b32a45b40c1cbf2c23129142e00cfe72a9938882947b8eea6d32f8326bc253abc15b9c6ebef4fbcf056acea95c20b3f7a829506827e793011dca0238871d773ac04dd8197fdad575e3b2d493cc4d674455eaf0bd4bc99c260c65107533dcf8dc8b3591b3e86cb918970a98e306430f23c2be171d9b5b546dd3ad4f75b729b94672c63fe27e43556e8d9b19a3e8c52a7d575de8c3705665c858cf70a91853c9928477594717ce00556caa91c0fe0d1198cfa20fe4ba0f41159f75e50d161ba86e9e7db548771b8710573e2cdbf3a30ffcdc81f065738736b2a99324dc9c4a1646a740a543a1480bc1b0497eb0443e2962082cbcd822b74822171abc655ff4ffeb884579a85579a846fd3088741aa30c29fd0d502a8a891f11cb687706c01a524e4b9e15b4418766873061c7ad3ae45d36e7029e79f0593b96ed421c4019389758ad84c330bde10eb02bb877a64b8c3332833e5c1447193c9ca1b3456fe7a482bafd215118e09e6be4fb3b6980f60d73b2ddc18f3ed145e5d92b0115fb5ae6820b1519329a12b9a9de6a2d96c2af7264db9cf96842bf71a534bb22bc396648b49f0ee0c056fd5592a329a61b55453bb3d8ef3af3042750f2d652ecb31c99ec04ea7196d1a2682f8f26aaa01db4c46ba5763a46f8734d2ed3ae170febe20b6b4d12cb856674b35eb674bb6cc05dc9fcf7a7cbb3fb02d1df0b5a5ccf36ab2a53a5da9a03fc9e50884336e0fd71a1d0c4cba45e8471ffcee6fa257afab2c1099c30cb46bcc096ac02df91b977f9667780989413b083e028ec1948ab5c6244cc4df60ca47ab2e1fd5241f43ca8666f0f08c785957ab3deebc437767889e6046cb1904bb25d79a25ef3479b9231a2ff77469382fd7686a31db326c319b4c82db3314bc4b5751b17dbe91c38a1a64485f5f49711d85437f6c2db415b5032b6aad4b33cf916f03b9ddba22815d585ae11c996ffbfbbffefb7ac3737daea2899a8b668fa9f6c575b5af4ad53e80724f26de12f684e98cf4d661ea5eb3c9d63a33b4b5bd26c15d190ade6712dc9da1e0fd3ac1e0e7609944a69d82033ae19099e34172dd6c167cd094eb1359c8758b4e38786658619291673e64e2712a431ead26c1a733147cd864776732b4bb231ac1318ccfefb97c572e825abee1dab33a525adf0d2b7e5a2340862397262fdf662ae2f3191671bb4e308416178208f6e8101dd50906dbb91844f039b3e00e53cd7f32d39a1fd3498616aa2748963d9ab2b84e30b494bd4104d79b05779acca22f43b3e83209eecf5070b7c9090e64e8048fe97c1576f73fb42ebecadda9b54769b3e7b52e05f65a83e8b5621e5e2b3bf935f9afe3ba6287d2b91ca4d807cdc57e4227d8da7587bff64f98f0f7a4ee0610c5c0b2e84ca3985326e157b320fcb4c9515ecbd4519ed1498646633848697a341a67758261bce67a10c12d66c1e74c2c46326571de6480a35932c00bba1bc0c8e28d204c0e98055fd40986560ce6695c1dbb7346dfe1f61c1dd805bc2fe0091ed8baa7afe1b85e9a6eb23b4c5bfba449abb1705ae9f261e9653d99d4a396943e947b566aca43a7cf6f3a8f4ee2a2ac709de11e9356e33aadba045dcce15cca6169b1a44a6759a53a7349e717b3a141af4983099d0667d7502ef75735724e4d98adcd3d8d1146a73e934e93a652099a8b748dee8a698c4da6b0ae59b18bb34c52d38d6134e83769f0944e835e210cf7b4f2bb20bd00e46a45968d550aa965d7e6fc9ad3b3a1e18049c3a7751a5e0da4e120c63d093c675196de3496de88fc3e205e94821238f095a9bee95e248cce974c3a7fc054aae1ec7210edb26fd52abd74e5a97983260d9fd16978c6a8a1db8bf48ba45852d1fe638ffc3b5bb34cfde3659346cfea343ae8b0d31e995fe0f9d8e139ae618b7c5f7e9fce527d1a32e5f3395d3e7b02d5a76bc87c69b526ad67ddb962d2ef799d7e13212ccbd275088fda5ec2ba2ea89585b7c4b573b86ae2f04153db668a1e9cb639a86c33685952596134b866d2e0964e83a4b01719db4b86e9b36656eec0dbdfc3560dec7568f5cc018c02e18c9b580e4915172ea6458ce90fd94fe254284c4cdec1f2f18ebfe8916c7b9e6113a7db268be7e4348f51ce0a6a047253d77047a8d74d1c123a0e170379b61e9987293505bd9e51d08849b73b3add46434704b685273032b24b2ba80ceeded3a849fbbba618305c4fd78e879c47975cb9b76778cd74dc5252fe338cce374c3a4f05f1dfd4c764eabfd7da93bf69d220a9d3e01946bf3498b1ffce0e913113917b3a22973cca344844626e7382b6466b8f3ec64d9ade0f62bd7d58aa5609daba8ecbb4d45382defae92c1bae0aa3c1844983e9e07132dc9396d4804f2951fd4ce9d92aa149937e333afdaeacd64efb6d3f0961cdc058bd684b4bfdb1706385d918592c97bf91088c530f604e16a524fa28650c577bc65775f27fab01309f93f705d6e3ab3ec3ff1d07f07894e91d07ee39f8b53eeeeea785ce7b7610ff49b5f3d7c9fc687fb9d2c8962549e30ace62d3146624cb36a8522d89e13acbb6355a937f2e66e9dd7cdf93e1f7b0af25e0baaa4b58492e63409614f409e325ff3bf92d4b3d8a02ec88290b2ff8b0a6f221205f14d680c3df2496f268491ca4cd7162aa4601d3f284976416dc8b630b01d6b248c19ae784b585c0ba81edc7d26a251f47c73e1b44c73c4026105979d421dc199965eb45257e9ccd9ed75a81f108fb1d8b286fcae989711576bee57c81da616b40cb69f5ad8ead1e7e2d151ce81bf53804070fdee3ed761cdaed1701c245bb9943bfb1c8e937ec2710ee2a80ceae0a0d83e3cebb67f25692ca344f120da2da5abcc96ee280973841b62b90b3f2a459ec7da43ca96ef426f8380f23f6662eecdd04fb3227f6cd0afb09fcb43a1b10bea59e9a6183b7990b5e1381b7920b78a78a08de5e02ef21273c5889a77b666b5c584b224785f53c4762f5d242c2584630bec489b1cea7014a1f1364f485e55c28eb09ca479c28772b94a98a5ceccdcc0182f63127dac38ed67dc651d9ad7e53b8313746e06c6ea18d007f991378bd027e3fcd9aa9489afd5b323e658359c905732781f9e17c82d95980303711981fc927988cd59c0d662581f9d17c82d95d8030b711981fcb27985d0508733381f94a2e609ae252e78a0bc66a5ecb05f30902f3e3f90493b1016283b983c0fc0427cc702f0d610359cf05722301f92a27487bf8a33bf7c31f1bb9e06d27f03ec909af5104ed6ca6f77a18abf6392ea84709d44fe52354c6c6870dea1102f5d39c50bd5faf5278531a8280fb0c2738bfa1b9c2efe75410949fe544197c68cebd969515ed012eb41708dacf71b7e2f322fdbdfdc3181825f0919ec5026cc53710789fe78667c792c532035443e0bd960b78278b085e3381f7054e78b0ece445e3729371613d61cd06b08a0b602901f8fa7ab6cee913678c633d6c13677b08ca2fe647ebac9b386344dbcc85b695a0fd1227da3d81d1ea27c918e1b2f9d04e02f7cbf90c97b12fce06f73081fb957c865b88d3bbfb08dcaf72c2dd1f18aebb3f947ab68e15f22017e4e304f2d7d63342c899bdb670a1ac2328bf9e0b94a689b5f460ab105729c508ca3738516ef7b14a5b53568c1d5c1877118cdfe0c468773e8fe5bef3c93666544be07d93139e3d8566aace85beeafd3c01f92d4e907b35202113cb02fea9e0bcb822ac7f365c6c03c72504f0b77361a9a98587e657083082dcc905723f01f91d4e902d0e907784f35f60de72bc0bc1fccf325951b30d2a9f21a8bfcb895a378b690a967214ccb32d568813a8dfcb457bdf594483cd5b08bcef73c28bbbbca8eea50953815e1d563cbdfd2e82ff07dcb6ab5ba9348aa9497951e1c18b12783fcc45c5772f5f9857a7145e673342e0fd88135eb0409f7dd53b5bf87492807c335f4016621c7a9080fc71be80649cfc6003798a80fc0927c826479bbe8c8190f512d721d15f643dfa1304eb4f39b1869b5666f4996c8d4f0341f9334e94994d2b33a26de6427b88a0fd792e2b3face44cbd3aadd8a639ce12acbfe0c46ac79ac78ba893d948e0bdc509cfef19617b4d53b18f33b513e0bfcc85b576e5de5ad93ce85602ef579cf082bdf8a7707b46d504e4aff3056421f68caa08c8df7082740ed2ad18fde2d27b68b5c83182ffb79cf8eb8577c7b4181e786d21307f974f300bf181d70e02f3f7f9049371d8840de66902f30ff90493f18d0b6c30cf11987fe4845923528fcf2c0bfbe1851c3d80cd3640522e8ae60dac7118ecf9139840a93281d6000f8cb5067c3aa535c0cc566ba817c5592f4adda248cf4b7d87050c6826a46609dca65e9a1a83370e44606030cc3bb0bd6502676f697f0698117d7d9acd9a8564e32dad3a4dfdf5335bdb268f528941f85dd4faff05ca5d153b9a693dbecf774296fc949a3f1f91274f61a6e027fa7f6a7bfba854a90000 serializedProgramBytesString: - serializedSignature: 8241710fca891ac27455f91999c3c6b2a660dbe7795f830fd58a687b64e778e042440d64787a7dfc0cdaa4870de707d18c91fd82fa851c8127036e06354dd50b + serializedSignature: 9c4cf24fc77ccca1154c91ccf8c184c65343608452156aa19065c8d282b75c2824776d7e52977231ed006510d76870c621a5d5dc10ffee02770706fb973dbf0a programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset b/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset index c439ebe..95ec25e 100644 --- a/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset +++ b/Assets/SerializedUdonPrograms/dbb59f28325d2bc49aa98c7c3e2eb6fe.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed59eb6e1b45143eeb787d895dd25048280dd00bd0ad285db745fddfa40482daa6ca4d42154a9d64ddbab55dcb76a2f4157821c45bf004fce62de03b67c6c9c63be38dd3dd824d77e5bdcdcc37e77ce73217677cc2e1dcc4658bd668896ed126edd16b6ae16909f7264ef5d6fffe843ab83fc7b58ab29b7439a6251fd79d4f705dc15b977a68b94fbbb8d7a57c9d023cafa06d8037fe5ac32f402d278b469bf48056e931cd3b1fc7406c49a3aefee6b05e4e01d7457a83d24084e24e7c299ac7651d255d296b42e87ebda7f48ba8d544d92eda74a801cc1d412c2c705bd1496e257dcfe057e4727e761d91fc476055a94d3e173a3746a0b8df329e5c86ce65943c6099bbed418d36000c1a6e0a7f3dba4b778c1a5e74ca21b997e45a458dba8096a35dfc1ee982856be00c42e6e9e2fb0f625d36501d25b7e821eedcea19dd06e14f0750b6d06d03260e6803d7b6e03d83d8d19a712ab12907dbac0153795a135ffa84b6f1de1009d7e57a20920622fd0abef5c4ef5bf0fc45dc0fa5b7a8ee1d3c9bfadcd0949965343b9cedbb72ebbe991e401b96de9f62377b6f917fc3224c7daeacc330eb738c38bf462cf19e4395645c49e40ae3b64aa527bedd219f5f9db50883a3eb18d5d0ecdf8aef7bf4dd505dccccb0b92f8906c716fe63e7af3f7f5bbe71cd3da9da5df273acda428c6ac388653ccf998b200c57c175b3151674907ec7447f9e3faebf43fa55bdbad41bdd003919994e1a4086bf0d3c1ce2d7902e76a572703487698bb83c983d924c1ab1558581f3427774308d13d94678c64478e15d131e9f6186115e38d2eb98703ecc0c162d0cc6c9606370cac06085cd346df20391ab382017d7b6a0676de8a524d05d1b7a3909f49c0dfd5c12e8791bfa0749a0176ce83349a0176de8e793409fb6a1cf26815e32a1335d1f1ac2f06f1c1170d6decde3741c06fb5ec2ae83607c8270abcb5b977ce1a842a75fa770383711a83cc1dc80043b9296e2572d17c8be6aa945d2c45927b0715aa8e4c3ed6bb2cae94f8a4cdac5eb649face7b5467d2c302dfe32699a7ec456d56b63caf8e2b5df9cd19be2a5e0dd80dc94d987461fac15c063d9d20000e7d16d695e9519422cfe2a305e6abb99f0bf1580feac2e81853a3bd57d10b327e37117271f1ce203e0cb8979d9d9666cd17898910c7408f15e0bb9019418880f1e0cff7392cf85fddb8bf8c8717a35a7c50aa7d7f9ff79e6ab70e6e3bdc0a3d572a6c2945d4c339a590cae7ca0e7fb3f0ff6f036abb1e289c8ce9f46fcb344b72bd1adc8fa344db266058d5dfa39f1aeea7d546f6b0f5cc377e587e347603144e0a53409e48ebaa1b5e6b26c9f8e1f61f910610b6912764e12e9b6745c4395ed23ec3ac4498d38372de22844dc67691237a789dbd503430fcf61c0b0f0db54498fca625a549642547e9e26953c2cf116106fcabec1f85a95d1ad3a86619b0b51f6459a945dd1dea7968f2d09dc8e0c19fbb8b7e827fdbfc4a4f9642644f0e534099eb1e6c596ae327edee984c8bb927e401fe89dde257a215398576348593644d9d534292b09659331db2b8448bb9626693c7909cff6d43f0e2a078e63804e8588fb324de278cf985793fb7a79bc88a71ace40444971de971a75d334311b30155e9d7fc5e62f68f37b319eee5933ae67587f7bd6099767593f7943d29377ca45ab17eb746a0f67565bac85f68f04af8ab2aadc8ff7737c26c4b947a36d700ec78cdf6cf99a429b50039ed648ccd392d8403269fa369b49e52156f1d9b013adff75b6bb36bbb8e9bc04c4262cafc0035a45e53d118a0ff71f8d69a006db270000 serializedProgramBytesString: - serializedSignature: 94657e3b65c98b4e0299ea5b4541c78b786992c052939c1c9290f4672d96e614f150e5d4b35e1bc793e7d701d5ea17803086808aa885445007e4bc0a7e6a940b + serializedSignature: e26859103dd7db58bacd8151c5a5f5ae7a7110d7394a3561222cc4e69cd5b4a2580b473c343853cab500c63f3162222d252fa64722f324caa068095b7f156b0b programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset b/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset index 8829612..cd6832d 100644 --- a/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset +++ b/Assets/SerializedUdonPrograms/dc3ed24bdd2e124499328dde1c74cf8f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d59531cc911807b10c3a10b0909d02d245680403003e83e574208a10b1d20db7b58cb0292d02224039225df6bafedf57a7d5feb7b7daeef23625f1c8ef09bff811d7ef19323fce8773f38c2aeccaed6647757f6414f0ed37887d0d4744d7756e597595559d5d5a38a9ca55e993deaedba75d5eab7baad516bc2ba67cda84ffd2abdabfeec2327ffb235abd25bea7d4c7db7c76a0eb9125e6d990dea7d481dcd59f3eaca07d6b84aa7f0fb6bd6a4fa3ca4ae9d5447907b53fd9b5467652ad545a3d6696bd8ba6435651a42445cc78be6745e06f4cad4a8f753d663f5ed24560a0ac9e1574deaed9afa660ebfbbab2aed9cf7acf53caa75577d37aeae99b5a695cc175162cd2b55167eb0ec24abd3653a05a9b5fa73954e3790bc269207e9467dde09720c5acfebe30a7d6d8dfe9cd1df3b65d67af23669794febe36a9d6ed6f927c97934ff9447ce1646ce569ddf4fcea3f9a703eaed65b58dd4bf46a7db49de36920769b32e63801cabfa66def4f0a65c82eab15ca7ceb93b3d3aefd4e94a7d8ebaaef2559db742a73bc8f53b74da62f97de02992d742f220dd65b97d6097ad57c52b1eb9ab75ba4a9f7f26828e6b745aa7d3368f8e6d11746c25756fd569bb41c7dd24af9de441dae1d1b1c3d6b172de23b793c870fc640fc9eb24799076596e9fe8b2e52e7bdb5337ea134e590ecf6e7dde2039863447aec9e9344ff2d6eab487e4e5491ea4bd9efaf57af476ead71750bfbe08f65ea9d37a9deed3d79c25c790ee25e5acd3e97e92b757a707f4f543fa78bd4e0f92730f9273213da4af39478e95ae55673db29deb0eebf3cf9363481b747ac46397231e6647f5e70be4589597fd8be7fc63fabc8be4d8d19bcab9e49653d5eca9d771a2fb71abd04682fa1a47d746720c650d5b765bfb8f47a73079aebc6c0647c8b36acc1ab3ee5b393c095a5cd4a1dcb9327c1007d155f006afb68c3d443d56974e9a46d2511ca7e795e7f61a47d28d9995a4defdf83ea6ce9842a197fd45fcc15704546e5afd4d9230604ee50f62140181c094faa65b39c7145ef5826a92cfaa3fb794ebaad869154a4c5a23eafd3eca7b4155db7f66984a103278afb9aa64da11cd5d95e300bdaf8ea7b186d7f0fd21d674126b3fa4f2e631be9a5111d629953ec2d2fcbacfaacfa632473432731dcd810d976f874f8e994e2b6da0f639ec97dfb1c8625804d0575dd6cdb03287d1da6b3e4bbcc3d0ee64b23880d9327a1059c695d76be5304ebaea23185f47bf8666ffb679ef578361902e663260eecda841c1c2afcffdf14f57defadb9fb36ed5faac1c0e295b42540b020bf2da338d3e09c12a64b39579a8a8177fc6841fa715d74a88df3e6f0acf8b6f802a1c99dc06c8acc0100426a0f358adcbeae429acbecf267910508d58fd836658d538b01526b035a5061bde930481ad79a257012cbccc046b19826175e0082e3311c428ec395182fe90cbf9744a5d7b5b917888e3e80375bd29440b660ad3db2e0f5333cf15c8b3d91838c6ab1147b8d240380f84579a2a59eba924d48f119c3509066f5a65f0a8ffaa974f782d2fbccae417cb4bddb28695e7ded15155fc96b53ab217d431ad2aac7ccee6d5267ab8a6f072895b9579f23388eb97932efd9c72ef61c40a3572a2dfab2abd89b580fc713d640697156c99354ff8142c93c379fc408c299cbc16b0cc51811e528f1e024b2ca32adf9eac0da005a6b02488d3605518e2fe9ba8a5bd3ecc9ded90b8880bb30fd0d6d9acd93bd761d9e54586f3fc1aaeb75b9fb0b7ab353529e8e9322f8936a920034e63373081d2828c7d590d1f8f71757e5cbd539307379386c81d5823ba482ec03d8b535fceeccbb9b1a8c93016fd5bc5c371c6a2159c4f6d48e8532b4d3e854b8f538be653ee261ab70b09f6a78d91fd6953687797bcae9c2fad32991bacb8d9306ae4c18630d35b8e76f6597f1d6ffdd5a67260e4861b3abea90e94338ec1dfacd6974c76bca556f3a5d6994a0595b74571e6465ef01a93606882db0d4df0ef15f19ae05ace26cd9c4d762cc826f5a61689c8ae88b6c8f84b2ee61606f7cd6a3d381082b195b5602b6bf06916b832c1905b67b2101cc2ad36efcac99dbffee35edf3fff75c1679a2c6f9af526d3a0d3957e0d6961336db8b9d81479a6dd6a052d01c59d6737709d4d9ba9b381fee086fa9bc5c86c5a7d726e07c0f01da7bb6934950b566b37c080752a9ff0565e7893c925b0abb8b928e3a777ba56bc917377e491b303dda62360e44c524bcebd3698cc0c96e88c32aa74f026de683231f6d223256cf5f0dd3d940233acf82d1f6e99777a5bbed97e5d68bf0d3ee5c2abc0d96693092176d78b1365269fa806c3ee8ee272f5bccb6d36f1c2d1e7d6a2f0baaedb2a68d757645630635be65d08c1b1a233a00749562308d9c81bb3e890c77620570baeb56c31f564d05a7a12bad556935be1f0786751dcea8a2a63ccb2ef9bcc58f63de3e23a57afc9b970ccee0e306b31eae571b1203feb433f93ae10e76ddbb871736fc271733b27785f42c1cd26c1e0f6fb8d639c5772172f79874932cc090f44a972c032cb4eae491f4cd8a45b38c88712427e8a137c38a1e05d9cf58e24b55e2b67bda309add7c659ef5842ebb573908f2784bc9b137c22a1e00ece7a4f27b55e2757e59309abbc87137c2aa1e02e8e457f5216dd26c9b0c07c3a4a95eb78c139ae890c246c22790ef29984907b38c1830905f772d63b9bd47a7d1ce4a18490f71a04e770debb783780dc0be0cec313c58be0ce999819c328d8481c7e0328797db9406a9fc9ec609d0b51cc7e9e37fb7e936038842dcdde754de715675df380a9005821833dd1c6e5c2182b640739e1c345107e886bc4979336e2c35c23be92b0111f310986befd6a14c1017dfb518ec5b5a42c8e710e385224073c6e2a6035b6e4084c36f1824f980457a338c39af328db77d005cb6e5c97bea7fa911bd6107efb3e9c9e4debebe0db7029d1ceb9e1ea15dd0b7071d6c09fe638bccbc4e130cbc1df83da346e599358df79dfc21a4fc3bf081747a3939c46ef36697480d5c85f0bb746a0eb1c5e674fbb797ddc8b41717439c5e9f21e932efdb175994ba88bd70fafe36ddf787761fa391d9f89e78161f68208661e174bc274342daac4d1e834a7d1b3268dce2cd86ac9342a86ed06384d9f33697a2d762f3a90821ef40cc7e079138349cbd9a9e6ec1da33bc7ecfba760a59bf8e013c4df434fce1c5051b9ddb75e452de08ee7433cbb5beb037ee17e0e1b8a86dde3634a77d0ceab37dd5deefe2688d6427c6590e3f45e13a76704390d26e6c4938a43e42c47e48689c8f9d863afada7ffdb399f06cea60abe7df9a59cc4ed3e63eabc383a0f713abf60d27997e59ebd16ca74f7ed17b04eb7d4e7db3edd0a7b12e2d4f31c57cf31533d4f7aea592893f66617d04fe714eddbd8cbf035e5f38bd56b9de7f47bd1a45faf473feaf15e9b0c6a9b44d561a1ade702a7c13837ca72a54689dbf99e316a9fb9705b5de4349d8862ab7e6cb376ffe7e83aa2f20a8f6b05eb67b2235c1547834b9c0693d15b139419161b98afe2f38b65a1614ebf9b26fd4e44ea2d4e2af34e7862f264bd45584f58adfe32f8dcda009e396b3d261b39e7ac1c6e78c93f1999c3f7da43e977953701d59127636bf80e7ad8ccc03d56eedf3eb5d0278cc3b4304519dd24cea0da457feac3ff3475b5d6c891a548e3be98a5a6e96db06aa5b66a450ef7b2742ed09bc26b011b88aa96997d28fe5396b6804bfad9914cbd656f42ccab7fc3189c42f8388101a7dd81c0246d22bcdcb0a7a8ba5080139f15e11716c0d9ecae65568723f0aace56e4c11e7724a1ad4668609b11bcec16c66fb3aab77984fd5c1a60bd515180f59224acb5011e060efe3035feb5275340362d89ac8ef52fa7774b03aeb7115775d623dc1bc016eb8735a23ef9ee1fb6ea3050788493c2599437e11dc670c35ab9d5fc2e1d86da2377e5ed119b647b043f6c0fed0b0bb1983986ca432c36f37f1e26e5214cba07104e385105f632f7257b9906ed05e31aa0770e48e717796fe9497e77a3d6d5f764a3a8b690fe671d0907de2709b25183b4a71733d674e0345410659d14ca6e8272b61428399f74af5e0aa2ac9642b99aa09c9344b9cde095516fcf88a2ad9742bb89a09d9744bb0e7b6b7e541cb660fdd610a7150f62a314c45a02f18124c426ed9fb7d87e73d4b504d42307b3560ae61a02f36139c1146cde6230971398ef9784b92572cfe91ed97b247db4430a6b0fc1fa48126b9d5598758ceb19071cdfc7cf709218bc1552f02a09bcc792f0362fd0270fa5d023f710a81f2847a8075308b59340fd6039423d9042a8bb09d40f9523d4fd2984da4ea07eb81ca1ee4b21d4a708d48f9423d4bd2984da42a07eb41ca1f6a510ea7602f563e508b5378550b711a82f9723d434ce9c3610a81f2f47a882b37c31a84d04ea2724a106fffc52fa6e775804dc2b92e0c2d6e8d3bfd29425283f298932fa1abd7fdbb228da4d52688f13b49f92444b579b28e034af36ad20f03e5d6abf743fc4c0ff6cbae8582e86b68fa07db53c9abce9b69c60ec29765b6e2741fb1949b4d1d7edbd0fff09f6a47929ac9b09d6d724b1b62418a40acf5488423e2f05791f81fc5949c8614155faf790541194af4ba25c1f82d2d15414638b14c67a82f17392189ded61dc0de5b46f0f3b46407e5e12e40e0348a8c43c864b33d639cbfe7fe796da2caa8200fe8224e0560d785a9d04705f34c4a4d1a35741d462d1eb6182fa8b92a89d59554fe967556253d29504de974a01cfbfe234a34f49df76c60c81f7e552f4a24e232fec2059da13d35602f82be50e388d7de70e02f8ab9280a30554e29b1d5ba5401e2420bf562e20053d520ce40102f2eb9220b76a90b05b191e9559ea1bc4ab09d86f48827556a29cbe741efb52fb473e86acd34b6c26b59f607d43126bbca74304fb50b170aa81a0fca624ca64cbd08268c51aff1682f65ba56cfc703bb9f0a3194b6d59ef08c1faed52608dbfb3248ddb20f204eb7724b1c27f1e07cf2a4dabc29de780d317c42f23b8be2b898b2e802c9587186a08bcef49c283be9d7f523ccd4fcdd51184df9744b83d722f68fea94cc1beb04f0aee5602f74d49b8d19e884fef0cbd9180fc41b9804ce30c7d3d01f943499079cb1d4b3e6017dff8d9fbd2bb2bbf97e0ff91247ee7b15a6ea5c9fd437ba230bba4606e24307f5c4e30057b583198cd04e64fca09a6e0c6313198bb08cc9f96134cc1c76ac4607610986f95134cc107bfc4607611983f2b2798828f268ac1ec25307f5e4e30051f9e15837988c0fc4539c1147cbc5b0ce65102f397923093edb74fe35df71c41fb2b49b4fe7b9c4b7bbfc85a02f6d7e50a368d1ebb8a80fd4da93b83e8b7e6046353b15b736dd692f9a5d83ce0fe2db84746bb47bbf1168bfdb3a86bb58633aa9c8b16ec0e1853df8d615af889d41cfeafe670973dce0f8c07cb04fd82a5fd8e2ae1b1cc74d12c538cdf6435691aae1f6fe5950156c9e17f26be94f5ff3dd85d9b1dddb4097fbd7754597e42df50184617864ac12bfb3f0bf3cff364a70000 serializedProgramBytesString: - serializedSignature: 9ddf25ee392a595debf5365f54274b9f10fc64d931cc106c00e17cd9a376fc57739e81f2352dbf1ef4f1ee2dd72e0edbfc8754726aab14ff0ddc1902521fec0c + serializedSignature: 03bea5e54b0bd557998c033bda2c040c42fd42c9a739db3a64ead7ed0f702fb6708614d05bda7502d01d056a4fa16903c5673cf4caab98bb390af60a3c50cc09 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset b/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset index c2c7a07..d11d8a2 100644 --- a/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset +++ b/Assets/SerializedUdonPrograms/dec74772d2e265041a93ed28927b06e9.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c1dc5f1f8f7d996e58e6ddcabdc052eaaeebd5bb862cba6d8c64db22d2c1724b9514d6f06d37befbd9750420b2190d00224f416208104121212428084ffeddeaededcbe9da777ba9bf39efe3ff9639deef66e6ef6bbb3b37daf511e737e12439c5f4bd84236950d638b5919dbcc36397f4d758e1b9d7fee99babe805539c775ceef554ed8109653c793fc6750a28bf3bbc439ab6635ce935bd91ae75821c217b172e7ef12e7d972e78c5f5debfc2f77ee4a34711e5acca6b1f96c1eeb9ce858878825e2a16a792dc1e39568e6fc9ec2763aa1e54229fe923c11d4d9f9b5c809a916611b1da5d57d4bd97211ad8d4ed81ae7992a56e9c85c2d24369b3485893f987be8298fbde4b187f3bfb9fcbbb1fcbb99fc1bdecfaff3d82d4b736f6f70af9299e3fccf72fe7f27cffbb8e78d73e4795ff73cd14193d102c8e8278ffd35dd0738ff9b3a7f1e9f81fee9c2dacbe31552de09e0dc897342e93e501eaf04baa967af92cf9e08ee51d7f9f16a197e123887b2db6bcf5d23ef3f199cf3635b79fd14edfe5ee09c879f2ab92e90d707c963ae3cb6d3189e1690e17eeefb1a8dd3d2b125cbccbe5ac8e3fe75dc9f4e464b791c1c40462b375d1a4f4b736f6f70af7acf1037fee23e95aff8f15a70cfb5f2d844323f5dbb9e25af9fa15d6f8a5ccf46ae37d3ae2bbbbd0ee8729df6ccf5cc6b9fd7bb7a664dd264dc20ef3b13e80ce5a9f0ddda7337caeb678138c1e76e449ebb497b2e5b7bee26e4b99bb5e79a69cfddac3da7aef702e7201f3551cf0f75cfb32ad3d8474f4d976e9a2ee99ec993c75b99d717dd2a8fb7c8eb6783739e4e9fbb7a35ed22afe7cbe36d9a9cdbd2cb69aaf2af49c742e6f5ddc3b478deaed9d0ed52e64952b7c759d2fef9f10ee6f599c3c075286f8f575ef65bf2bc581e9f95f79d23cf8b34bd54f86e2dbc17782f0c5769f0aabc7e2e38e7c7df20ef1bae85ebef1b01d206868fd4eefbad0c3f4f3b3f3f4ddab4d6e27ca77ce60270eeb06baeca598cdda83ad8a9f0b0d82979183b158eb11baddd571f762aaeafb1a47f5436aa6cf21e29e74270afbace8f4f30afed3fe1ca68a16c3e4b937717f396ef7769725fd7c25f97c737808e8af5efc0b537c0357efca594731138e77a6d91e7ca0f2bbdeed3de7b9fa697b2878bc139f437ea7d9768ef537668e2af64f702e7c0f736577596313e598e33b01a0fae4d94c709e09a927d37b8066da0b97b4fc1a7f2da5879bc17dc7fb7661bf732afcd4ef2c91ec6437186f1986c8887927dbf211e0fa489c783e0fefbc1fd2a0cc6638a3c666bf21fd2e2f190211e53338c8792fdb0211e3f4b138f47c0fd0f83fb55188c87aaeb35d3e43faac5e3d100f150b21f33c4e3f134f1f839b8ff3170bf0a83f128605e5f74023877f2609b71da7d4f326ff9fb24f3e64325678f57ce3eca37eae9fe94c64b0f7f5a0b7f5a1e9fd1f47846d3e31732fc524d7fbd8cba18e8a19e83e19769cf2b5f750238e7f12bd3ee7b4ed3ef39791caec9d9e395d3768896f68ac3af340e7af8f35af8f3f2f882a6c70b1aa75f239c54b82a5b2f067aa8e760b8e2a497812f326f19f8a226ff2596f4dba6e755f8e5f27c3a72dfcbda7b5ed6def38a164ff5dc0c96cc2bafc8e34c569bb7dae5c86be9eadf3398d7b67e2fdf75053877f46da7ea33b3e4b104bc8f1fdf94cfa9f6793796ea3bde6475fb0e934fe806ee4f1797d9f2f836f3daf9dbf2f816f3b601de72e3d6bed87d6f7b950fe6c8e33b9a9c77ea9093ae4f612ef3b6250ed0b8bfcbbcf5a977a5cc57dde7f6557946d9ce7bcc9b370e00d7a1bc3d5e791d549f92aa0fff8379eba7f334bd54f86e2dbc17782f0c5769f00df3d687bf91c77f22ef1bae85ebef53f5e1395af87cedbe7f316f7d589dfb694bbccfbc6d89f75d761d57d6c16e81264767a7c2c362a7e461ec5438c6ee40edbefab05b08e2c28fa52c9957557c16836b2a6f2d61b5f97db8ca378be4f10370ff07f278903c7ec8bcfee943376d3aa97c61d2f1607954755da5eb47cc5bee7c248f871adebf145c53f5e865e09a92fd31b8a6def387645c8b54fe3b441e3f01f77f0cee576130bd96cb63534dfea75a3c94ffac2b1ecaf7c27828d99f19e2f1c734f1f813b8ff3370bf0a83f1384c1eb335f99f6bf1f83c403c94ec2f0cf1f8739a78fc05dcff05b85f85c178ac90c7669afc2fb5787c19201e4af6578678fc354d3cfe06eeff0adcafc2603c9a6872bf66defac8d7ccebb7fecebcf511fd7915aeea3d2bb5f055060eab9371e9aafabbd295f5abe451f9da6f99d72f7cebead56dbd3c5f238faa5e02d36275066961629c69bd44f12997c77f4b5daf02e75cd7e7d3c852751315dfef98b7bef09d2ba33b7375ed3e4a7bf77f98b7be5006ae43797bbcf27aa83abd2af3fec7bc65d05a701dcafdafbcef6aed5c95256de4f17b79fd1a70cedfdb45bb4fa5e33a79ffb55a7885f61e3dfc70795df57b67520f50ba5dc1bcbaa9f26a8316e7caa4adf49275ca5e5d34d92a0ffda0c9fe41ca56be7ba3267b5352f6c0c711d9aa1ef0a326fb475776cf49f27cb3267b4b5276df1d9a6c2cdd8fd0de8da5fff575a4ff4f5afaffe4eada6b6fa4bfcaaf7a5ab566e6769e1c13e17f7afca5b49f4482d5fa07f1b7ba971f1b314ffe15e78edcbeaacf224b7b871a433b199c43b9595ab87c3ed118e820e39968ea652ece1d79bdc7b9efedadeabd32ed136a7c4da57d15b80e756cc93c79bef6fc7c695baa2f5ea649225bd323dbd5a38feaefa9f6f2ac4d87dd75e8a79eeba585efd6c2557ea9f4862ba6b5cf37d7d25f3d3f420bd7e5d768f6a1e4ab7468c13cf5fc440b8d9b1e9fad5ab87a9faab3a97468a5d9422bcd5614c78b35f9dbb470257fbbf7be441be66d27f8cca3b5cfd79547f578eda3c56b1f2d5e6aaec0c51ae7b65eb929e99b00e9cb7d9ff2ef981f50f59e307c881c9748b463661fd29e25f36f7b702f3feecbbc3e645f57eec05d524696f68e8e1abf8e9adc4e5a782779ec0074907958ccce8179b7b3fbee7ebbdcf7f6d3c62c135d359bae02d7a18e3d98d787a873e94306aab69cf2215d343dba48064cdeb7c3cb13f521ba7eeab95e5af86e2d5cf9902dde70c5b4f67935267eaaf6fc082d5c97af7c483b4dbe4a87eecceb43ba6bdcf4f86cd5c2751fa2d2a1a7660b3d355be9c5bc3e44c9dfa685eb3e44de97e8cd82f990de4838e64354bc72b478e568f1eae38d572de73e5eb929e9db1ea42f2feb545f71143e6493d4a12f33fb907e2c997ffb817bf9b13ff3fa90feaedcfdd5386796f68e811abf819adc415ab89c879518007418208fb9cc9b7773dd770f7ad67d6fae9a53a4f2e8feccec43f6d7741ccabc3e449d4b1fb2bfaa172b1fb29fa6c77e92811a27dbe9e589fa105d3ff55c2f2d7cb716ae7cc8266fb8625afbfc602dfdd5f323b4705dbef2217d35f92a1d8630af0f19a271d3e3b3550bd77d884a073557e264700e6d258f797d8892bf4d0bd77d88bc2fa1e646d4d787e423e1980f51f12ad0e255a0c5abd01baf5ace855eb929e9db0fa4af63a783da027babaf0fd1fa1e1245ccd3f720ce9d7b06a79bff7724f3d87fa298797d46b19471b4abf7e007bcef4e0c67debe8723c175286f8f57de10350f42e5af119a3dae05d7a1dc91cc9bffd57926630098af55711fc552e7cca8f78e661eff9b1805aef3e3188ddb185746c12d524e96266f9c6667e334b9e3b5f0f1f23816e898adc99ca83d33519339c16bbbb57633222953dc03b82726c9676e00e74ebc86dee0bd5fcd1d40ef7f03e80f9f3b8a79f3a9ca8f2a4e93b5384dd6e2a4d2ff62af7c76b43c9fa2d9e731f2a8fcdc54af2d24a682e7f8719a66bfd3dcf80cfbda7b9ff2f389e9f2fe1bc1393fce90d7cfd0f49ba1e97993f7bab8afb9f71915071157e84355dc7a817368e7faf313023e3f39e0f323033e3fcadff3b5efbbae8efb2fade37d27d7f3f991019f9f1cf0f909019f1feb7d5ee5c1da324ef19165dc10b5be224819a77cf32c96cc07ca57964839278073276f165ea3dd378b797c406296579f841aab557636015ce7c79932fc664dee4c4dfe4d6ebc0b9ff2caa97d8f26473dcfc66b726ed1c2a1cff7bb0660a9c67136f39653b35d6645cb5cdd8b54ffe0a1325c8d2b9fe8959798a3c9dba3c97bd12b478caba48b837adf3c2d4de7b9f286f7d7ee5ba0a5a936fe9e98afd9d832709d1fe76a69aaf41c08c2c1b98837bfff56700ee51da8713d50eaddc37b7fad7e0bbd36a7e4d4ca5da4e97f28780eeaa7df7fab9b8ec3559d4fe541182f68834a4e5de993cec6e4f87d02ce0f50ef83f303549daa54862d61de3ad562709d1f0fd2981ee4ca18a9e6196469f20e615eff748826f7502d5c31856383ea5e304e9b580aaef1e3c152ce45e0dcd16b845affd454d36bb9f6dee59a5e87316f1d468da12fd1de7789f77d23fb6b7214ffac242315566b778b99c7470fbf073ccbef5b14c00e8e9569322a837b8f73ef1da5e6152bdb5076b342b38d155af84a197e013877648c526b5976b9f227aa31ab8edaf3abb4e75769cf1fef3e3f563dafe6890559733610e892c9d8b2eaa35dcdbcbe6e35f3c429b146865f01ce9db88c51ba9eecbd9fc93a68a28c797c907a1f3b15e837591e4f4b5e4b2826a727ed6d92f2f7a700594ac699c8fbd76befef9ce1fbd767f0fece2cd5efa8b457f1be9079e3a3f248b9661be592a79ab3a2e619a8fed8b5ccdbaeda0daef373956eaacf428d9b2bde1db5f0cba4ed3533df27e4a9fb2037157e9216aeaef702e7907b3a1b9463b5890acd062bbcb213aa5fe53670ee301bfb9ea683ead33f4bbbde55bbdec9fbfe5a9d6fd2e2dc15093fcbfb7c62830cbf5d0b97cf272ab570652b1b811ded2bafa9bebc13c13dea3a3f6e66de726bb3cb62fc024d8e7a4e8d2f9c0ccea1cecaa63b68cf1da13d7784169753bcf7d7daf746e62903c6a9f533e9ec40cd57543e6c18e0a2e6cae6816b6aae493eb8a6faf20a586dbecdba465e3b5f93758141d685e09aea27ba28296b829acf902e1e2a8faa78c03a8baafbc23a8bea6f4f33a7315195bc3f21fbad6beb44d5cceb9bab5d5b98f0a22b6ba2f24dd2a7246a34dbaa02d7a1bc3d5e791395af37c5bd9ba6db45cceb1f32697f6d65b83fddc6bcfe742bb8ce8fdb99373f6c77654cbac77bbff0a7fa9c4bf58e9dcc6beb3bb5771da985abfea31d4066534de651da334769328f66de7ad90eedfa759afebdc039c85f13d5f8593aceaa1d702cf3b67f8e75594d96e9cf94ed9d2ec3559bfd664dce719a1d1da73db74b86dfa13d778c162edbb4932fc8ecfdea79510ed7b71e491e969510736c66b172b68a6d61797c828e1819ca741b0ef564dd1b7088b940fc17ff19245e5bc3763a8f969b76c1582cf6d8a86145acd0b80b465731df43bd7daaf8bdcab9a34208bd3391f28a47525ec195ab74fe95832d3caa9deb33c50e207c138f0a2764189be31cf9532b1d77bdd4f9e795b2c4796d25dbea9c953abfb708792b1db553efac2b4a7cbb0ffd99858e4c7737928dce1505748b735e29345c247e6f139a960bed4b9c6b35626f944d6c1d9be21c7788b7a5c6bdcaf9dbf4ce5289ccaca3795312ecbabbf5894aa6694e6cb8f679c226ff2f45f6468a70f44d79fee03f4df2440976464a4afc1f43d7c9f0c2b744ca2810c8129e6b852c4f94cf0b5308fa8f636a0ccdf6edf21ec18ad3c6c54c862777771183640a77aaa8fae4eedb5efe3ecb1bb5229627aa093dea885a3ab05c5eae9861e5270a59594df2b9a23afe8409bf18fa5b14217ef7be0a719fff04682a0a3f6f0288a97ba5ce1f3b9cff95cecdd39ce36a27689d78d92a21242575f2b9a86c0138b5f8ac4b490c71231362d1fa2edd2b168e6d82951e72b3da582421e7893a589734a688bd4b54961ac91a93ca2c6fcd2d1e39367ff4b559e6746921d2a53e6fc352a6b129655a446dfc757bfb74e9d2b2365ec974e13f6686ad10dbae4b078c601313c1967bc7b6b9eef5b36d3e6438546368e6d726ad0da6d3002398652228e65d2f8e90e07c47c3c3651db17e0cf7c998615bc1b06b4aec32d101a3d8d440319f536c6752abb9a616d708119c8d096e1f5070334cf0be010537371954eba8b3240fdb2ca4ac72eef56f4ebc3772b0eed6ccf6d411c99375ab8059530b53da70849d8c5ae989d3114f9c9698e4ce4125b7c22477092ab9b5c9a0c48cc7e86be8f52b23b9afe99c7119d98da5ab60fb2d21db98e889f527cb48e9a5761ca9bfa638cfae77386c13bd015b9de74d1d4de98976cfd8dbf710347398a9fbcb9f4618e17d4c96cfb1f7c4925d37fe6eb8f1b73509e78502ef8e4d6974705554a26d16dd2b3c39736093437f7736feee7626d3110a45db36739b3c5c8effacc7575bf44e49835d13cdc692c3b0a6577a1d30d3686f2228b0ae2225b8d8b9e6f69a4e17a115c216dc6af630d92c4d5672d2dd9d9e6e1f6668948948f39903e16921e7ffbb3fd948fbac9f48bc705f8c25ecbea66cc913b6bf81483e2732408b829e0ffbe1f9b003f6b281d8cb06d5ff651d316f961b8237eb64ca0f8265948d0dd89152bfc6c67e26bb17c994daacc8e46d627d4da14caf61be7fb01c3198995b3a99a884597e67937df0241c623246ce6468e0c8e9163618b7b02e987ac330f5f2eac82b695ed6157b593ef6b282fabfac1bf6328eb6ce065b1ac1ddb11c5f14428eef81092f0e41784f9370de781ace523ba57e727e5284b7c285f7c2341f61d03ce153f3de26e1bca1c367d1ebada5849fd6520ec6649481c92e93da6998f4c1848f36083fc7a7f0be98f03106e1d7f814decf203c4f9475c7b3689b41e631f799e29317e59e4ea8d49abc1a745de81cd70a2df8f535b2569afe5de94bb4b1068f95278aebe92cf39903f4b1e0ab135a70a78214797cb541ae653a6345697f93c1f3f6185f5a91d2b6e315be15b21380bf7f93085ae0bc81a76689acc4fa69df0d30e50951be6fdaab798257c3b78a0a09ff7b9b4c8152f1eee4f057106be76b077b1a0a1f510019ed6a92b0abc20cec2a0ced318b1968b2185e264d0ea1341d6412ce5de414836fc8e7be616a3233eaef198fbf271733fb6926b3cf1666bfd831b5b27a7461ec677a172f53a61bca94f58dfc9529fb9b84f3427c060bd8e53918933c33a8e42118905926208dfd01198a092f31085f90e54ff83093706efb078460fb79265728da1215a4ae10eb7b482d80d2f55428b73697f1cf506d157aa477807c215b66fda77384e3e3294ba72be6eef24d49ce73fb5c93fa3edc428149306f4bcdcb44709ab654219603e61b72c09ca6fe7240914938bf7f81c141e789c669fd4639c572bf26ccfd41dae06946008b4d7a729fb4d0a067be3bd0c15823616ea5c2dc86a53137537dcdbfc1f929b086639e67b1c1f334f2e9794660c297188437f6297c249681f804fe94a296677513dd1c769493158f718e6eb751b9c391ffbdd9f9cdc9ae935337b9dbcb110328354e51b0d9a9270f655562f0739d1396e3fc57b5212eb140485c2b1ce346f11c97eda61b0f2f74c2c738c722e7d8c757ee1e85e593834df6c7b3c821c10c7e3486f95013e695a160ae3fcc1cb69dad97a5558e18f7dae4bca952cadd0a6a5a39f2f92d4c7d97919767d53e93630ce613971a7ce28296fe7ce25883f03cd15516e5e0f064e72e6ee93bebd197bccc54e4188be2e5cc3c309cfeed58e13ace942c9cdc61999481cbf124196f4a12d1c918e5b0a15e3cf84b94151927ca4a661e32acebfd58b24c30d113bda80746482f9399d56672ab3226b75a90eb9812abb4938f116a134dc6cca9f1d5c2cdf57a97a9145d8d1bf424cc8195191c589756fe1cd8644cf37283e6d93e359f8269bed6a0f9473e359f8a957aeb4ca51e33a99ea6d49886a9bedea0fa2dadfda93e1d135e6110dea49d3fe1334cc2798d8eaf1a0eda509d8909df1082f05918964a0396c77d6229c1cc65a3c95c5a08b7e04ec65923aa226ee5c88f091d80b1da1402abd926e1bcc780af87aeb3f89c830b9e8371da9289e03438e662a97b8421752f69ef2f75e79984f3fbab1852e7166b7deb5fe79e8f61aa31991357cf6f9d9b97ad36366f1660a8b762a8b705437d20867abb09f5ead050c7a789b3d0448867ad1d86ac7547477f596b11e6c67686e0c64a31e14786207c31e6238f0ae8239760167974401f791086e318030ee38c8234380e3609e75672acc90177f2672587988473658ecb04499ae6dca198e05d01052fc5581f1f82e92d3309e7d5ea1332d13a4d957a399688271a127165677f89781826fc2483f0dc2efe84afc0849f6c10feb54fe12b31e1a718843fded59ff05598a59c1a82a5acc6849f1682f0351896d30d584abbf9c35286697e46089a979b84f35e9c3333c9402b71c16b4d82b94be61b4ba5d426780fb6dfda448dac19acab4795cd5fb9bf0e8bcb59a6b8f0801ccf5bfdbc6b3df6aeb34defe2930d5738fff29dff6b5206e87808df5ba34a90f5a34505a6c51e9316ed81161b65cd6a95605f7f0d0ec73438c7a4410ba0c10aa778af126344fe2a051bb04c7cae2113efeae12f13576299f8bc1032f1464cf3f30d9abfe753f34d98e61784a0f9664cf30b0d9a8feae94ff32d98e61785a0f911987d5e6cb24f3e12bd54fab2e58e6f582afdd018d9a271af1d2c8e43d904e7f774e0b3d6084195ce5f65ceb52dceb5f5c2bfec107d26e5e26a994f9f5685e97f89497f3efe92d4688a13502d3cab8ad318199fe586412cd767ebadb38de28e6a3957ca6de7b9f1ab666ee7f54ef1a49f38559be2c40de4d2da00adc9cc770f6b9acddc1f7c267a9a56730d6664971b8cac894f23db8a09bfc2203ccba7f06d98f02b0dc29bfa14be1d33afab4ce6d53fa3ece136faf39c63b1bce66695a3d87079ef089f5d873b3083b91a33986b021bcc4eec9dd762efbc2ef03b8fc492fafa103ce15126e1bc0a79030b56853c1a237523468a6ff4d6340b92f2c7e9188cd3cd21703ad6249c9775b7b0d4b2ee9a91fecabae330e1b71a84bfe853f82e4cf86d06e14346f9137e3c26fc7683f04a9fc24f3009e7639177984c888fb9dfc9ea33d9f544d37b7896bd2b933c90c6439d8409be3ba0e09331ecf718b05f30da1ff6534cc279d6b83713add374269d8a09be2fa0e0d34c82b919dc9f89e0341d49a7632ee581105cca1998f0070dc20b7d0a3f13b390870c16d2618c3f0bd98dd9f5c30c69527b2b9a7e4cfd2cec5d3f33bd8b0f61b7f025ff6c937cdefffd4826b693a6ff7b0fa6f8a30133ff3998e0c7020a3e17b399c70d36f3e2787f36739e49389fcefb736670e6bc6be40956ef7598e7633179d210932e13fcc5e402cc629e0a6831176209fb74c084bd0813fc4c40c117639c7f61e0bccb27e74b4cc2b97f7c960577be9762c27f1982f0cb30e1cf8520fc724cf8af42107e8549385fd4f23c0bb8a8e54a4ced174250fb2a4cf8af43107eb5493867f29ba04cae3148ce130ba6f938d0dede7a24d8b6232f9a5c8b718ee14b8ccf31e48b7fc3d10b9b7f78ad291db991bc1c82915c87097f2504e1d76316f86a500bbcc164816255fd86bd6281a9eb94eada01c6ffbaaadf666c99af09cbcc4b6399e1e88b59ec8da674e775a6d74d51f0513fba0913fc4640c13763827f1750f02d5816f87dd02c702b26f9cda0926fc324bf1554f2ed98e4b7834abec32499fbb17742f06377626abf1b54edbb4c92b91f7b2f13bb7b0d177cb74930afb4be9f89e034bd95f760a03f0801f4bd188e0f03e2b80fcbdf1f05ccdff7639c3f0ec8f9018cf31f42e0fc2086e39380381ec2047f1a50f0c318e7cf0272fe19c6f98f21707e04c3f1a780381ec5047f1e50f06318e72f02727e1ce3fce71038ff1cc3f19780389e3009e69eff4b16d0f33f89f1f82a041e4f613cfe1a90c7d398e0bf0514fc0c86e3eb1070fc0213fef710843f6b12cefb9efe910992349d54bfc46cef9ba0b6f71cc6e39f21f0f8156622ff0a6822cf6382bf0d28f8050cc7bf43c0f16b4cf8772108ff0d667bff09687b2f625a7f1f82d62f61c27f0841f8cb98f01f4310fe0a26fcbf21087fd5203c4f6ce6c7a72546dfa711c66618e97b34fe97899596e2c47e8b99ff4f01cdff352c9df95ad3a0e9fcba49b8bbb768b07198374c0694c32faedd2b064467388d4ca48c5d618d13bc2b8cefa645a125d601f63b5312f39468924912739d11c1bf3709e67582ac44c03ac19b585e6a9a89ca69f2d25b98cad941557e1b93dc2ca8e47730c9cd834a7e1793dc22a8e4f7309fd532049ff53ea676aba06a7f80a9dd3a04b53fc4d46e1354ed8f4c92794fd53e996497343d551f9b04f30678db4c04a76980ff0103dd2e04d09f6038da07c4f1a94930aff4ef9b89e03495fecf30ce1d0272fe23c6b963089cff84e1e81410c7e798e0ce01057f8171ee1290f39f31ce5d43e0fc170c47b78038bec404770f28f82b8c738f809cff8a71ee1902e7bf61387a05c4f135a675ef10b4fe3b263c2704e1ff3009e7f5ab3e012b62df9804f3f665df4c04a76986fd13d3b85f408dff8509ee1f50f0b726c1bc5e302068bde0df98e48141257f87491e1454f27f3073ce0dc19cbfc7d4de2fa8da3f6092f70f2af9474cf2e0a092ff8b59f4908016fd3f4cf0d080827fc2580c0bca82f7a518cd2e2f04b34b60c2f34310dec8249c332908caa4b14932fff25a6126c9d80317dcc4249857d08b0256d0b34c82796f5671c0deaca618e4e14121676392470495dccc249967ae9101736173cc9c478560ce2d4cc279c56074c08a414b0cc79880385a9904f36ae3d880d5c6d698c6e3026adc06133c3ea0e07d30141302a2688b693c31a0c6ed305b9e14822db7c7844f0e41f8be98e39812d47174c0fcfed4807ebf23e6f7a705f4fb9d30bf3f3da0dfef8c419e111472174cf2cca092bb62796556c0bcd20d33e79210ccb93be6f70f08e8f77b60386607c4d113737673023abb5e98c673036adc1b133c2fa0e01c0cc5fc8028fa601a2f08a8715fcc960f0cc196fb61c2178620bc3fe6381605751c0330bf5f1ad0ef0fc4fcfee2807e7f10e6f79704f4fbb918e4838242de0f937c7050c9fb6379e5908079653066ce878660ce4330bfbf34a0df1f8ae1581610c730ccd92d0fe8ecf2308d0f0ba8713e26784540c105188a95015114621aaf0aa8711196fd5607cd7ec598e43541250fc7f25f5908f96f0446ba3c20e99198e0b501058fc270ac0b01c7684cf8fa10848fc14ca422a8898cc58aeec30316dde3b0a27b43c0a27b3c567457062cba276076b731a0dd4dc49cdda680ce6e1266169b839ac5644ce52d01559e8265932342c8265331e15521089f86c1ae0e0a7b3aa6764d086acf3009177be16792926946d4679a047345b6652238cd7e42b3301cdb43c05182a5e28ea0a97800a6f6ce10d49e8da97d6450b5e7606a1f1582da73311b393aa08dccc3781c1394c77c8cc7b121f05880093f2e04e107624c760565b21053fbf810d45e84093f2104e1a598f0134310be18137e5208c29760c24f0e41f84198a99c12d4540ec6249f1a54f2215885f2b48015ca43b10ae5e9012b944b4d82739cd3333211cc07d111c1cb30c1670614bc1cabf6ed0e58ed3b0cab5b9f15b06ebd02cb266787904d5662c6bc27a831afc2249f1354f26a0cc8b921005983a97d5e50b5cb30b5cf0f41ed724ced0b82aabd16b3eb0b03daf53a4cf0450105afc7405f1c02e80a4cf82521083f1c4bc54b83a6e2060cf66501615762822f0f28782306fa8a10406fc2845f1982f0cd582a5e153415b79824f3fddcaece04f64bb8e02330c1d704145c8581be3604d0d518e8eb8282aec1d4be3e04b5b762c26f0841f8364cf88d2108df8e01bf2928f01d5827edcd013b69776275ea5b02d6a98fc4ead4b706ac531f85d5506f0b58433d1a73d5b70774d5c7607d207704ec033916b3b73b83dadb715836b92b846cb20b137e7708c28fc752f19e8461bfeadde274219bca16b332b128dc5d40be51fc5d229696f305e46b9d47dc05e425b577263fe9b290958bd00a71a58a0d131f525a2442cb1c895bc5d26f2e37f9cc34e758c956c90fb5cc901f79e26f709f4d2e177717acbb9f7af186b8fa1539315c9126167cf9f756c6bf129e7c7ba95830af647aa52e719eaaf0f9f1981330eaf79aa88fa9a5bec8e130bbf693388b598d58b85f218eee727dae5d89f397fb38d74bd7172e7cd7c3f802ffcd8c2f71e71fd0f113a313b118dd678ad100e6dd9860b29362552275dd18f0cf7971ede608feeb18ff0891ae6b3235fde87912a6e7fd263d276b7a26dfe9eab9996d915af2cf0b95ca0f0fe19ae2d7c34a8793b1f83d608a5fa1163f681b7a9acc946992691ca02c3f3138058bc183a6188c60d8160f7c6fdd52e6eec1ebc6a05ac6a0465e4def3982e7f253b1983c648ac9c48c6c6db2a34399ccf19b43b1b5fae5a3d3b0b83d6c8adbd996941b8b8484cde27e3f25c7227995e7c8bd5d769c8e91ff19963fcca9ade7ef35825d958f1c6e92e5272667603179c41493513e7c95ffb898a5f989cd99586c1e35c56616eab752f768ae5fecfc4bf713dbdd586c1f33c576bc8fb45b54673993696da63eb9eb2c2c5e8f676293d08304b749b3343fb1391b8bcdcf4db199a0c5c65b0b81a510b72dfea1d59d6c1ee31f605c8596475e19e1d573f660317bc214b3d91995ad33c5464fab6459a46a73f39dbfa7b3231c415cdcdeacdb9d83c5f949539cf1cdaf609ef1d6b737c956553a4bf4a3f1b998c64f99341ee7c3277af55ec752f7acc37da069873b3fb13a0f8bd5d3a6584d4de323dc58cc107e61a3b0bccceb24661f1a56ca9d8fc5f119531c87a329c7eb5fab9d9b545ce738715de7dc512536954bf58661fbf30bb078fcc2148f6901fcc4def40c1762b17cd614cbfc8ceb847edb7cf56b4b5c8469ff4b93f68b7cf83537bd92dedb7d06f70c5eebcbe49eb052f0628cc17399b4dbd3d53bfca6617d3dc625580c7e95494e4bf58a78da65da66c35bf3f54fa74bb1583e6f8ae5948cfcc922e7e6d542db55c2aaf66ecbfe322c862f6452b34f6789fe6af661f7c65c8ec5ebd7a6788dcdd847fa8b159e5af589d315589c7e53ffdeccba725c94e5da9558fc5ecca4fd4251d30acb5b5e85c5eca54cbca59f920e8f09fda8c0d5582c5fcea49546937ed4297b0d16e757b03ce9af3653225a4295628be60a96ae9d4393a6d762f17bd514bf7246dbf35bc3168896c43a3922b844f44b5438bf57cbdeda3072797d7cf37518a7df9a382d26e684f790538f825c8f7178cdc4e1e0bdec03a8bdc30d188dd74d346664584b2e11f9ddae9af28d584cdf30c5747a467593b98c6fc0ce6bc8ca03e23d8f51d5976fc2e2f9bb4c7a83f4dae45411d3d4d4833d3c995c0fb79e793316c7df6752cf4c8d63b2ff84ebc9efe3d6b5c6e0af4b9dbfb788eb99c5ae7efde4b760f17b13eba74c173fb75c4a3e90792d2cdc54bb158bd55ba6582d0dd932b1fce7f7fe7099dc8631793b93dc6af64a9978df285b4db763717c2793dc9a5ac61c2038a77ad8cc4a94f0fba6efc0e2f76e2623e07385e7592fe336d718b3f0cb8e6ce75f22d1d2f973bab8938f9d2d905c6b1c29797d9c20d133ebd60287d5d6ee86796a82c9ebfced1b1d4fc26da4b4b6becb3f65925ec27b0ea4a68d98fb3328c101d748276bf860cc5421bf527a2bb7a4ad165f092a17565f254ae1616c8e73e44fa98fc3d4150b538d7618a8d3c2d8d51d27f5d9183ef3628da81ff27cb8dab1926c192325cb21dd97936e68317d9fa76a5b99aa8df2f8e7c91383eb694d756bf1017f5b63b30d754e210bf3b9497757c03c392a9768e79cac00d83689bccc330b1759229bba75be55ffc08ffed6a14280aa5fd4296e31c8e226715d85a9b9d3b3aa983b21708193cdb2b31ae5f3d4f89012590f816c05cb672b0ce8163b6f2993f5ad59a2342963eee79eaa9dc8c401e4030393203fb21364412c400ee99504f93125c82602e47481280e60968d4d82f90325987d3c16c63beeb80aeb64a1c26d290eb83e6d97c4f509252ebe5245cdf2d08b800a59df3e9295c7c4cade0005c2a794d89a0a2b731bd65531292d4f1b9984f319251cb11f9fc799c701cf0300cf1fed2c038b6201724bdf24c83f51826ced01a9f70ac501d55ba392a83ea72e15959b8faf7b3f07b8f72fa2ab44b8963555b4ccb8c01d3171f843262471fd9912574ba62aa3d54ed6e3af8f532b92770a294c7f89ce5f2d8c61b5f492ac24aa2fa346552d2c2a2ea8cac627517d455f159d22ad69532ce0dc22cabdec2c4db83e1c5bff4e437f44f1ee4d5e104c771cfe1671b586b98bdc3cdd9dfd9d5bacd3fcafb0bb32378d83cecdb03b3037832a44ae8fd6646e1dde303783867c6ea0eea4204f17057abad0795a6f40e61a5a4db929795ba7a6d779733dfd4266c64937aa3336d57392e32ae6f1907c3eaef2b7ffcf873cf2f990c7d71c02dfee81ffb87effef947ebf974c3b77846b13ab6499af495cc146e8faf448d167a163529b440af1f7a9f2c0a459734f89312793c8d6a7d4e07bb8a822f51f9468bb18d0e243c72b1cfb4c69998787b32315ce7740bdf71b9b7016c612e74f00e73f6dc259144b9c4520b3ffcb269cc5b1c47930c0f96d1438d7a140a1fadc77121645ada8702e0799fddf36e12c8c25ce5d00e77794383bd591d9bd96399c0e65372a94af0094ffb10565512c512e043ef37b5b5016c612653780f2075b5016c712e53680f2474a941d25ca91cefff2dae52c25a26b81770ef0b02da2fb823f103f909b80a7fc6f1403be78198eed359132e9293cac6da9b08e0258ff17d5201db7c2757cf7fd686c722515bca300bc9f28e1b505f02a1a4c965e0af0b1467bb19881e248b3713615cadf0094094a946d24ca02998daba2b2c2e554e80e05e81a51a2eb20d1ad917de8fa72271553520b5c4d857132c0d8380a0bcc6f3016380ea06b4289aebd4457e4fc5fef19e68a0821d960c3d90061561499b8c053cd56c11161242b46e6008c4da3c8c4850d26139f0ad06553a2cb12d2f8b821cfbaf1b3b1b60054b328bc5d416d99ab86c9e39e4d2f02089b475171c6aa2cde8a737e0c51f607285b50a2e49332bc65ee64d10a4e597216834e8366005acbbd012d8e3d2dd9005a2b4a68aa032b93d62eecbe22edab1e4c857522e8606d6d2356d2812932ac9f036b6d4389d5ffec1dc22153b201fd0f01ce7d6cc2493a024d86331b64fab636e12c8a25ce4900673b9b7016c712e71a80b3fddeecd7f6ce8f20ac69920d11bc08fce6beb6a02c8a25ca03805576b00565612c51fe1d5865475b5016c7126505b0ca4e5174dc1635c88edb3dc0223b47d10af23f3ba238866df66a80b58b3d23d4a36368a12d4146ef4a89924f7bf5f619f115352e0d326c6da8b0350116d88d125be73a33b677ea32a10d924d5c9e026076b709e6a818c29c0460f6b0092661771b19cca100664f9b601296da6430870098bd6c8239328630c70098bd6d8219c795338500668e4d300907d4c860f60130fbd80493701c9c0c660e80d9d7269884cb37c960ee0760f6b30926610f1119ccbe0066ff286062935df4c109c26c4e3634d11bc01c400913ae58d8c6e0b71fe2dccd7612c037308a81b27c96fcac2f5737756b1e7e5795b8237ed6b83fc0398812675789b3d2b9a99279d7d0e00366f1eb4d2f059d6cb9b60125f49764403f0016ba9f6d40e338de53052c747f4aa07c8ea2b71bb83a86031059c0fe0653e252fb53b97b8ba9e30c6987de3dd14a185c81485cf89059e2228076883d93a8097b2fc9aa452500e5d068c776aab1cd6b6350fd6905b00d8b2273c34662e69bcf11b6c0c9d6830d02c54c5e1415f5cc3bdae2d8a13117586abe4d3849379f23c3b919e02ca0c4a9365d28d2b27f9c770db81cc02ba484d73d63afe9fd8425a145364e10415d06fc65918d5009db3a64509702a8c5364225ece22083fa3b90fd87db0895b09b830cea1b00ea087be6b9110ef192b585fe05508edc9bc3155e94a4cba6c860ee063047d9049370260719ccb300ccd136c1249c634406b30ac01c6313cc38f61f6d0730c7da0493b0d64906f37000739c4d3009db4564308f0030c7db04338e7b6dac073027d804338e3bfe550098132961aa8d6547b086b9b1ec16007252149d717c684d498d081ed9ae7f1300bcc95158e1f0066a859500e4942816f0a98906bc03633b5822d5b0e66fcc075d705329b1aa6f77f117af156095ec0a96f2b9d6f0c065518163c01ea75182eb66b44777e1a8d716bd7b15912125db21f018608bd3a3d85cd16c8b84d3605a50a16b04ac71868d9b3c91ee6340b6c9530eb0c8993662256d8193617d1e58ebacbd39b328fecb527a029425f64e9121444b3645e67580f6009b367d226d8f934de67a0be09c6d13cec258e2fc01e09c6313cea258e2cc0525fd5c9b7016c712e78100e73c9b700e8f25ceed00e77c9ba617928e4d92559a1602dfb9c0269c85b1c4792cc079a02dbbbd914e4120eb8efb0340b9d0169445b144b904f8cc45b6a02c8c25cae10065a92d288b6389721740b9d8ce7d0809a721902d035c00fce69228b0c275e70b9cdbb9c012d6d0d69f0f06580fb267da6b1c27cabc09501e1cc5dc0efe551fef52c0863318bc1ac03c248a5e4f35f876b873abdbcb59c696886cded0bef753090aa843a39aedd150965e5d02ec722925bce6ce89bb6bcc1487c15ae71fcfe0f11b09ea0a802db3678d791ca7b58e0428974751c0c02ad0f4da194770a24c7cf73ee801601e16e5b6266b32986714c76d4dfa826265856d4009eb9364406701a02b6d031ac799700c005d651bd038eeb5d50e005d1df542d44c3a3ae2f865c98741c1b4c646a871ec3d7a0c402db3112aa13f25837a37805a6e23d4387e23f57e0075ad8d500917519341fd02405d672354c2810e32a85f01a8eb6d841ac7cf2d7d0ca056d8089570713519d4cf00d4c36d844af8f11b32a83340e57f834d13c00a283fcc443610f71db0d14a9b7016c6126717609d1b6dc259144b9cb301ce4d36e12c8e25cecd00e7e6287af2331b752fa42c88c886458e0630b7d804338edb4dad05308fb009661cb79b5a076056d904338edb4d8d0430ab6d8219c7eda60e03306b6c8219c771f9420073ab4d30e3388b6e0480b9cd2698719cea9507606eb709661cb79bca073077d8b855006925896c82d8728075a78d5849d7199161fd9225b11e4989b5b701ab79db8099f291c8f68a2fa582db1dd8ec5136c325ac4e91c16d01e01e6d335cc2428c0cee37c02d1c63335cc2ea1619dc5701dc636d864bd8fe27833b04b885e3ecdd0787b037806c1f9c4301da5d9468db4bb4c54c5fb914d17a2532841780ac7f3cf52e8bc9dd3fa731beb3e956e7d139ce23ebe8c0f5a002d706803bc1a69125d28d2fc84696de05384fb4092769a73319ce46c0339e6413cea258e22c06384fb60967712c71ae04384fa1c4d92f40950876a5108ed5bf4605f91000f9d43840261cc327833c0e403e2d0e9009dbfe6490ef027583d3e30099b00f800cf20d00f21971804cd8ff4a06f92300f9cc384026ec8725837c2f80bc3b0e9009bb5ec820370105df5971804c584f2683fc09b0e4b3e3009970c0910cf24060c97be20099707a2619e48e00f239b6ecd347da5346b678fd65e014ceb5052569b70e19ca05c02acfb3052569872319cae600e5f9b6a024ed1d23435903505e60e7469c715c4bbd13f8cd0ba328e7d52e2afc66fef816c6c759973864a63a112813a5bb3a4e711ee4038bdb9cfbf89e2b55b43556b251b11dc0762f8a0364c25e0432c86301e48be30099b017810cf20000f992384026ecd92583dc0140be340e90097b76c9203706902fb3a56a46bad89dac6af6675087b8dc1694a42bb3e9364a065679852d2849f70c20433905a0bc726f6e551bd94cd8955428cb4106bf2a8a1985850d6e46e16280f06a7b76e68fe332b86701ca6ba2b0c6d49df9e36e8db301c26b291176a8c337aa98925ae26a2a8c1301c6ebf66e9f141418d1a40bb2c56ee701acd75362edc89213d893b3b04b5843f9ec46190079833dbbf5c771f38f0301ca1ba3daadbfa17e0e662680791325cc66ce49851c4c9e26078ec970914d0c6e0170ddbcb7be9e33dbf9bdb3c1d525378046e22d51a22d377e80036b81c7717ffe6b81d5de6ae34e00a443ca6495a30260b1b7d9889574fe0819d63f016bbddda64f0c17500e61907d62783ac079874d3849bf764f86f37c80f34e9b7092eefd43867303c079974d0bd74837a721ab9f7e0b70de6d134ed22d94c870ee0b4af87b6cc249fa5d71329cd300ce7b6dc249fa416c329ce500e77d943807b1d43e25ef94047742f846f1379f28be55884c7edab054508ba0793a890af600e059efb7653898b4464ad61cfd3540f9802d28496ba36428a70317f0a02d28496ba26428bf0656f9902d288b6389723db0ca87ed9c201ec7afedec0016fa337b262ec4f1d306cd80853e12d5a7dacb458d73635463462ba9e08d0776f828253cbe85d55647569973818b7055e50370ee07dcc9d0e550a16b07d03d16f507b3cc6b3979344a191fcb249e13f71215d46b00d4c76d844a58869341dd023ce4cf6d844ab866830cea1100ea1394509b3b271b181f269ee23058ebfce35e337e63415d40d67e328a9aa41a14e6a5f3badae08636d63e01d8e1539458fb18323757a2462c57d9c40e103d455bd20e6c1002261bd6680cecf6697ba67bc5f1f3445301ca676c1a70235d214466992b01ce5fd8849374690b19ce3301ce67eddd3c9bb0b2443633be1328a47e69e7f41a428b25ab52b502589f8b624a77116b9853ba5781acff2b9b3c6901657627f3a4b300cee76dc259144b9c17039c2fd88493f45384643837029cbf8ea23b24393b991738ae9086d60cfd2f80fa9b288a2205b522cd905b1c17586f0565fa8bb680241c172203b911807cc91690711c02be0e64ed976d0119c7b51b570290afd8029270532a32900990b55fb505246155880ce46bc0227f6b0b48c2f91c6420fb018b7ccd169071dc90b23d00f9ba2d2009671493815c0c40be610b48c2bd3cc9408e02207f4709b2295303bd53c58c763254fda850ed0b8a93dfdb33ab8db040216b4fff13a07c33ea391b99f498c7b1bffc2900f52d1ba112b6b3c9a0fe1c407ddb46a8842d1c32a8f701a8efd80895b0b54306f56600f55d1ba112f60e9141bd09407dcf46a871dcabeb4600f57d1ba112b688c8a03e0aa07e602354c2d61119d44700d40f6d844a58f92783fa1080fa918d50e3b817cd8300eac751344ef151f4b80f641c0350fe218a2557059a95c679aed1a500de27d41bed7af73a5ccc920bb0e630772217613f1319c2d600e1a79408bb316fdf269f85b95d7a426f968ea81abf9c0ae95cd0cbf959147b177b77874daece8864222159b7dd85c032ff68cf6201c2ce3a3294eb00ca3fd9386798746f04b26a504f90d13fb7112be9462864587f05acf50b9bf643229d414cb61fd2db00e79f6dc2493ae5950ce78f00e75f6cc2493a219b0ce77ec0877e6913cee258e23c08e0fcca269cc36389f35880f3af362d1720dd87936cb9c061c077fecd269ca4fb7092e13c1ee0fcda96bdb90a623933e93d80f2efb6a02c8a25ca45c067fec3169485b1443918a0fcc61694c5b144791c40f94f4a94fd0d28335d91ee6dbb130e67bc46857927c0fcaf288633f88bd70ac84af626794bfcbae912a010fad6ce0d22096d926c83c82280f5df514cdfceac9a143f1f7a0700f99d2d20e338e87b1500f91f5b40c671f5da0300e4f7b6808ce3eab57b00c81f6c0119c7d56b8f03903fda02328eabd77e0640fed71690715cbdf60c00f93f5b40c6b109f92400f9932d20e3b82fc7730024df13d20a9071dc97e3170064821224dcafbddab9e14816d9fc223278a703788d28e1f1fddad7889d5df9abb99a53459f0f17c7376d8e1fbaee005d634a74fe16a71256bcc9fa7c7e0b5036a144a986c4f2c56f75749599cedc4f30a87d31d56ec4f19b7b3916e0cc8ac232339b3448d8db436699b90065534a949d7d65f282587e59657fd02f9e6d13cc384e671d0a6036b3092661ab860c666f00b3b94d3009dbda6430fb00982d6c8219c72dee7b00982d6d8219c74d507a0198ad6c8219c74a7b5b00b3b54d3009c770c860760530dbd804338e7b07b70630f7b109661c5b406d00ccb69430ebbf6c2a8efb1c4c0658dbd98895b4224f86f52f2c89b53d25d660df5c21ac89927d73653cb0d87da3e8a4c32c3675451a615d946c55c5fbc0523bd884b33096389b02ebec6813cea258e21c037076b20967712c71ae02383befcdb122efeccb38ce767b09f8cd2eb6a02c8a25ca39c02abbda82b2309628ff03acb29b2d288b63897213b0caee9428dbb3e460b0775fa38866759055d5f38035f688a271e97f0d05e1c006d91a8aa301d69eb66472d2a160b24cfe4780b2972d288b62897205f097bd6d4159184b94a301ca9c28e66472540df1fba70780ecdd270a90050d14e40c00b26f142047375090a500643f4a90fcab2bdb9c934a87007f75fcfad03b0354fda39850cdbda0921a919dada682771a803780125e73218d0f37548a98134fa3ee4705ac3d0036d09ec9aa719cc5361fa01c1445a76de61b35114e2320db59681ac0996b13cea258e23c17e0dccf269c85b1c4b906e0dc9f12278f011fbdae96f5415ee44c93a3d9f11b896909b00db6a5b54cea1fc9aad42f0094436c4149ea1bc9504e051d0f436d4149ea17c950fe1558e5305b5016c7126519b0ca3c4a9459ce49456d5743fc4075043697bf376dcedb8689e3e291ff019405518dfeb94dc21ae6b6a1e3fecd887300c2424a841d00c286f7e98d7c80b1288aa9a4356cbd135c8d4e249d291f8043aaa45b7f9552a12d06688b29d1aaef9179d77b2f14c2360b8b6d38abbe0f01508747d16dcb61f2ecbd4ed86c24999daccfbb00c01b410dcf3bd964aaa7f089e3804137006f247d769e5e5bd470745b65c6dd206c708a73eb1ae76f57e40ce7c8bf485616c33ae53e00ea281b1788904ed423b3d561a04d33da46aca4b372c9b07e0aac758c4d9dbba4d3a3c83a7757009c636dc2493aaf870ce7c900e7b8285a44de793d0da545b404601c1fd5c48086f299d6cb00bc095134276186ce7c6522e11265b2e9ce59a04c9f68d36225d2711db221b2df034b9d64134ed20109329cdf039c936dc2493a544686b33fc8ec536cc2493ac64386731ec039d5269cc36389b31ae09c6663f392b4024fd6bc3c0a609d6e2356d2662619d6bf81a269864dcd4cd22d1dc89a9907039c336dc249baa50319cee300ce5951ac7dc066064394715cd674060059620bc8387efb69200079802d20e338b3a8170039db1690715c2c3f02809c630bc8387efb69380039d7169071fcf6530d0039cf169071fcf6d34100e47c5b40c6f1db4fdb00c805b6808ce3b79fb602900746d10af7bfad0861d143b6adc83c80752125567eb2c1f9838b885f67452780691125a6cecc5f4f25619390ac9ff20900b3d42698849fe22083f94b0073b14d30e3d8837e0580b9c42698841d166430af06300fb2092661394d06f37a00f3609b6012765c90c1bc05c03cc42698844d453298b7029887da04338e7bf5de06602eb509266193910ce6ed00e6329b6012766490c1bc13c05c4e09b30d4baef0711b8c719fba7a22407718253a7f2b74e3f845b27f00942ba29805ccf7f65352e3be3dd832006f65147d91deb5b95ce186b19fdf3000721525c86e1264a57313cfcc7caaf476d9e7e8cddab01f92b0e54db68074269864b53a8ab2dabb2a7711733fa90e31c67735ee29c03ed74491d14735d08c7e2400591645c98d8dde784bee387e64703440594e89b227d3773458e2d098ea285d26e0aae314e766be187a9b73175fc95b45db33d4830aec0900ec5a5bc112f65f92811d04c0aeb3152c61594f06b61f00bb9e126c723be4a9a2fd4d86aa1f15aa0e0055853d0510e1a8235901b416a03c9c12656ba6efb291dc348270ec9b6c8a4053006e834dab7448d73d9075a4fd1be0acb40927e9ea1c329c9d41c371a34d38493fe84286b304e0dc6413cee258e23c1ce0dc4c3dbd8adfcc17dac70f5373e013b74431b9cfffca45c28a36d9acb57d80f51d612356d23d0ac8b03e2dac353b4b133e2345b8dbeae03e6c8dd0dfad5a0f6333456db05c2059e39ccf11cdbe1ab6d201b2d4f9e72f2d963bff4cd7136210633adbc1b688ab5c5e9990bdd109e59a55b3fcfece2d55dc34b2a469e48a0d71931ff7c81503725b1d19654ea271192e30aebddbb6ca453e07922bda5fee109e4b2237a545c6312612ed24b94d8efe7319ef735d25dfb6ca91b6cad196cbcd1be0dc96e08b4edce6f1b0da86f130b99bc84679a6aed72d93734b2fad9ac34998f34d6568295e578c92ccd78a4de6ca85d4923a635a77fc70eb69952655f2f86ab4061dff1a9eee32d98599764ef0edfb17838c30dfb9b94c28c57fb2fe1f466973389c2c0300 serializedProgramBytesString: - serializedSignature: d07f44e9b1ce406fefd5195fd60f322f2b59d2cc5305fd1909f6adc42ae783992051e0f07aaf098a1f96c8529837da18c8b9198647c34b2fd6479a79234d960b + serializedSignature: bb9bc23a3450b15f6e9e9692e89539c6c15dc237598bafca2de428a9f032f77adda7cefda1e05933ae78013caaa4b3296ef12e8e79b0d3047b4dbceef73fbe0f programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset index b387772..6cd944c 100644 --- a/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset +++ b/Assets/SerializedUdonPrograms/dfcb9d6121fc4084e97b5303b0054618.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed57db4ac340109dada6515b101fa4fae69b08d254053fc07a2b78c35e5e4430d55402492d4914fd34ffce339304355d1b8a8a524dc86e7676e772e64652b008975ac7d0a173aa5395da744377d4c75b1db38f3b5ea5f4330a30df62b4b1b74e2b399c7cadaa258c0dac428ac0794fd7985dd96f9283f706781dac98dac3e3e0949a06539b76e9944ea8a21673447484294c688a71a9198c3bf4845d478c6225966c553034b113ca9e0fa3d373177429b07cec5d8327200f32bb227146dc85c75062dd21cedb3420abc0f4b531dc9872e63b9045170b448927596d04530710a041d1161f45b4459b5a14cbaafcc6eeba8c364eb822949565543c0fa960e33cdcce9b1084a01f480439082e76aa748499b9ae68034ebdc848e940ad87303ad4c238107957307bf8641e240e5796e71c32e36cf241491d3ac0da130b9b323e88a58e58df002d92dcee23bb77303f8ab661ec01de753a5b89cbf436ea93ea237a9cba6998768186adb7a638cdfe23f2131161d717932a24d330d1014a78db135001149de1b02bab902c2e21551ba31fb0e13ed470205b084457dc92df1da6477487de97254a1e8a381d98bf27dd240da00e5d3ea68f8bc24c10a5b2e069833d3d69488df7c99689ebfe373580b8dc5c29b7f19ad5bc54c223cc632acbbbc9c689e1fc3acb8bfaa2d617638d8360fef17aab19c967d064a5678de1cc0e67c34282a50f89c7f2996983d796f935332cf693da1eb3dd8f96991fb6393657e953d1fb55a9a843fa99b42c8f888ac5c939d1f84bd934ad48d36a23f2b170077f4c81fceb0472c67801bf86115ae70d0000 serializedProgramBytesString: - serializedSignature: 1d860af11f6b91a9c0ef786a5d93e7c83a7f93696e8efb43d144f66b8965f83e158d086815eabdddc1bc93b505a271b11d255a96dba026f7d8754ba913e3f60f + serializedSignature: ba7a1161d705298bf13848cd6a30df5f46e0dada6c3531ca9d8c61e311941e229a5753aad871783d90edfd3c863e00ef4528af0e632b347b807bb831fbc5a100 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset b/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset index 6a5257f..0e06a9a 100644 --- a/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset +++ b/Assets/SerializedUdonPrograms/e1610184bce31a546b1836594e84ec27.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d49771bc711801b24418222294adc409194048a1b242e804859b6b39ba46cd3d6166e596487e2024a70b8c824a448b79c7372fe415e7e81aff90f39fa27e4f9e09763ee49554d0f511874cf60001435500c3e6080eee9eaaaaf7aa9ee19804d19058fd80cbc6caa55b5a4e6d486da53c7ea08de2dc1f110fe9c4f6efa637502c767f0ba0d79332a1550121f53b141785d814fa7aa00255faa5d38e6297f4de5e0fd0a94cdc1274cdd87670ece8ab540a10db5ac1ea9872a19eb0f10b149854e755a0ced8a25e07551bd81dc1c29859564282b092f6b90734a7987a0b47bde13f52599750879bb50e6441d80cc1d9298f836aee88d720e6dfad8a28fbdf06cd7ef13fad8c7d27a591a1ed1a65678de629f5156417f6ed26513fa3dafab553fa77dce75f56bd6c7a441bf4196966469781cf0e837e0d44f5c91445aa7c73d32dd72339e72f77d7475655cd165673de9434c4fd79e0b9e32739efc0e7d6cb7e477eaf44c08862306865759da084bc3e3b087e1b0c3a2e9be635bd38185a15b6ec653ee9b0a185eb330bceec3d02d6363d8554786a306863758da284bc363cac330e5b068fec6b1adf95b0b43b7dc8ca7dc7715301cb3301c3730ecf694f132baa48f172df997ab6038696038c5d226591a1e273c0c271c162ddf39b6b5fcc7c2d02d37535a2eee8e117e0cd31686377d18ba656c0c7baa61188fd16cf2298cefdbea85ca90a2a845a5d39e5b3278c243d1adf8828fa998339cbf81a239d3acb341735a412da879e3ac7325d6c9f45ea2d76d38234f42b3e555fca3ac0a54ee00fe726cca3c85f44f68c6c549330f3973ea3e1cb1d453751b26c1271e299b50ed014cbb39b50eaf2f48de5350bbfccc2093707af596590599ceec7f08292ed017f0f980345ca3d757a4698eb45f81b402c52247108d2cc2f135d5566efb09bc37d5b9ae919975340701b67427d470ddb40cd6a0f6196a9b3f7ae46d7804d1b76675376cc950d4f497324ffcc8d0196470605ed1326e13b25849dabccad0d8bd5a4630bc8de5169adbb7c3fbaebae36b8b990cba7b982c287af887bf7fffefbffe73f9cff152d3165406a78dd84880697e60515e3a365026c1df8478bc258b8a7af1c74cf869fa5f3b47fcce79793a2fbc035a69662a75400cc39f6578b3031f9fc14af200b2de9082ab50ec4faacc33d9561df8a40d5367908236bc4d26bc89f3c61b3c9ef8e14d9cd955c48b0f33c1760bc1201d6c049b4d04299efb42946079e0e5be5b84b2cf81c42b9a4d5f427953a0e6cf141742b31ea6669e1dc433650c1fc3696423dc62224c2bb53d51c2ebea81dee1c1992407390548c152cf75fa064429d86ed09a0d90e004a2b6b3fd8977564cbc8b88e3d2a0de1ada3c10377980d6c24fcfa58dafc148f939e46dc3f9398a54309d8f991f510dc556555ac29ffcc58ac97713f971d6d66bd5cc46bcd5403cdba6577e65cab67b94c5132d82db4c82137ac9e81d45ff0b8f32e1ed76e109533be93cefd9e4118cd65f29673d117e36e9a9b835f45a6692a0fa6d3e6fb7f9bccf143fa0849d2a1ac0055b2dfda65ad0c62df85b80e70bd6aa718f7a8bd2b6f5ee77181d3a6c3a0c9874e8d63a64e18967636dd5d7dd69ab3b69aabb83d5ed6cadaf6b0dc2d4d965ab73d054274614d812f742d571d1d4f7a8e2f35fa75417c7e1c675d20b43d9e2b821e5b7cc081bc575db3c34ecd72be6ebda2b2ed9741831e9d0c75a26c6fdbbc410fd89f657afc5659b16574d5a74322d3e02ebf7c01bbbda9f616aed31d58aadf79aa15118a7a521bbf05e53d7a0feb22fda358a01d73dcacdd38656f904613bcfed180fe86add4bd2c0bf0b5daf78f24a51f7c1fd6f092d6dddaccfe466f4c4a84971af8b537617f79b5c4c9d7afd1c473fcc3b2629db706ef811102ff14c7b57b266ff8d91ff06cb8c0b56c1e69b01936f10e1b8512baf73c6ecce49dabc3e51a3d7076d82276b147cc5361c4d1986237c84198e864cc269195d89d6dd76c1c3360fdeacd5832336d0b76a047dd52678ba46c1d76c1e9ca98307afdb3c385ba30753360fced5eac1511be84c8da06fd804676b143c66f3e0ed3a7870dce6c1f91a3d3861f3e042ad1e9cb481be5323e8299be0f76a149cb679f06e1d3c78d3e6c1f76bf4e02d93600c5d3f508600183736cc91118f9fe628483e8620630bcef91a8a6ed36c8c653027584265e76c954403a5b14098707cdac6e04313034c2c6e45e202d9be11e990c0adaf825ecebf3668ce2f6778f336415a3ee4e278c666cf4f4cf62cabd2a82a8c276de5fc72eae5b5599b953f355939afdc6dccd22d49db16a663f933ed39d3b2975b515c8687b160ce66c1cf4c16e4ce2c702f21f07b4f1c0d50bf7dba4b045be3cad999f720c07796caabe4871c58f88ace9ed3b6a09da537786ed2823a0faf3be41fff565ba9bfab69cf191ba79f9b386d08733a827397a02ab408e516cbd4af5fb7c15f8cb6e3ee91e41328f9984ae0a75395a1dd93ec99a5c1773161dd87e017ec6beb673e0dbea7e917ca7e4f53f97e42b5b7b7045961f2da1cf31bb72ed826fbad3c6dda22571690a61da277cdd25fa257e3daab4d19da8f9aaeb235056bf12bacadd9dc86c25fdc77043ca4310a04749180979051a0816b970632b7ab04d61674f9629604b87780d4e1a63e6c62cedee10939f7541d80ccb67853b6877204515d20017c5b1f47b9bd8680f4af5811d2a224a48e32488b7a6669044c7f53454c4b92981267553756674b3717012d4b02c279a3f45adae39220f20806f8e38640a6a84db5c53dc23faedb9c58dddd67e5b37737c54baf413d4c2dd0d8e699cde9e248d434bfc767e374852d27ed3352a5ad437ddad871d301b368311c358791590c473ffe3f8f14b3e8b74f10c22d37b0a251e653c9516640b7955d0dd0bbf42e5d8264bdf5d772e76b7bc9c8d3568971d58c3eed6c465b890ecaf71a10653743f99924ca618dd2193d8ee0a4ca36f43e94839a92823ac5a07e1e45a81f3420d44906f57e14a1bedf80506f30a80fa208f56e03421d65501f4611aae0442506f52a83fa288a50ef3420d41106f57114a12e3420d44106f5d751843adf8050930cea6a14a1de6e40a87d0cea5a14a10a2e4ec5a0f632a8eb92505306a8612e678be2ed96c23bc4f06e48e2edd278b1e27d82ebcace975f1fa91fb8b81438c5c06d4a820bda34e1ca8bb6c17629946d0ce56fde26cad2fd27c1795d6cffa983a1fceddb44796e134faf14ca0443f9bbe8b44ac16d11b1567999a1fcbd24ca51c31c8e4a14e83be247ea33fddb31efda08dac4003f894e5b155cc38bb5d52e86f20b499478fdb0f4a647e3f5eafa21eb9242d6c2907d29892c65e8dee14274c10d10b110fd26c3fb0749bcfc7bd179dd1a4bbff7d978ddb995c1db3a0f78e5eb9b237d4ae3c18b31784f25e1f51b3ab6f9e66fd19da1212990d718c8eda880140c74c4405e612077a202527052110399662077a3025270c52d06728c81dc9304192ef4161c25c5a69b0b0c654e122546c23cf47e40df8cdaa6ef229dc881eb9002d7ccc0ed47a70d0ade6c20d6062f3194cf2451a60ce362b8b58c6017175bcb5c67789f9fc7b4636ba98d1e51f63090f9a8806cc488f22203f99524c8a4a1c37381a55fd31585392605b39fc1fc6394600a76713198030ce64194600a86e962308719ccc328c1145c3c8ac14c31984751822978c1410ce60483792c0913b742f9aaa7f1a2c73843f5421255cad0eec205e78263a418de7186f76b49bce196918223a4d832b253bd335fe8cce21d1627bc39a4033650d2d66b9be9b241c8f9dee365cd057f75147fe6a700f97bf0c463f13b9019fab547fcada7303fa2e02f13a9f84bc35bbd5a63e69e7050377fd6e34b97264b83edb3b78d4e1faf64e80732df65fbf1df04b66ab753334dd2d77337c0f38e70bcbbf644ed9152f888ff0fafeac1e2f1710000 serializedProgramBytesString: - serializedSignature: f602a2e1008843f849d37191e41ab5084c55f6434af8591f71769e8f4e93e679185a6cfa934dec3f3cce2a86587dc72de9f7678f2aa014150ae879b899fe7e0c + serializedSignature: 133141524326cd3bce25a44175037d1fafae63a2377433547156f6b66d0d24f179d5e7c0588d9bfd89c4eaec475e30e7f52d84eddaef5bb78609d51bc3aa3807 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e1a236cdd120b694eb4308cf39c2f324.asset b/Assets/SerializedUdonPrograms/e1a236cdd120b694eb4308cf39c2f324.asset index 080b1da..60b3fd1 100644 --- a/Assets/SerializedUdonPrograms/e1a236cdd120b694eb4308cf39c2f324.asset +++ b/Assets/SerializedUdonPrograms/e1a236cdd120b694eb4308cf39c2f324.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed58db52134110ed09d924208a78c37be993a1a4d825b1acf251c00b965720bc58160448ac5425914a82a5bfe0bff8017c85bfe4e9de5dd8ecceee10cd8a41b395d9cc4ccf99eed33d333dc9d8848f9a43b141abb444f354a15dfa446dfc5ac2bb85c7adf9ed6fa983f7479455f4cdd11dc348fedc535751aea0d6a51e46eed30ede0de95fa31a7eaf606c0d356eade35b8394ca62508596e90dbda61975d900b12183ba5e9b62bb5401e5227d456f4d94e2496ce99a41b1869eaef4b5a0b42ff79e3e88592df4ed604c879ac0dc16c482d085afa544bbe790afd21ed9196e9f1d80467fa4994086ce65883c2679da1e54dd0380c68a8a70d4a33295b4565c539301bd97a4ac42a221a085e81407912958b9269e5ac0055db43f130fb2131ae899a79778f3a82d5a00a9ef43281b98b60937d6681de59ee06d41eda8a4c924765778cc2a30dd686aa1c527740ff5a668b826e567d1b426daafa0ad27b1dd46742fe2fd45668bdadec16fdd9ceb1e657a1df54115d7ee86aeefa66558c3dadb631c66ff3d72121e61ea73056f19666d5e23ea5bc413ff397437194b366b17634128537d6d25b2b9aa56230c0e6e63d4427d7cbb7c3fa40789b6e8996177df100b8e3cfcfde0d18feef6ec1dabdfb432d93936eda6c1b4246219afa8ae4410924db0acacc38a86e9573afaf3dcb8f607e977e51a2237b803727232f53b404d4882b044efa4da3ddcfb221e7178785e488d1e9926c5e268cde8682dfc695acdfb4812ad8543bb8e682537bfd130381ec3a049873806c7340c3aeca6099db745aff1905e2c1d839e8d433f330c742b0e7d7218e8b938f4b3c340cfc7a19f1b0c3d8f4729a6f389f8bf83a8780bbf37a4d6259b03463903a4c51c572d440ce733eb50615bd68739499e4a4892eb43cb974c56b8ab80c7d725a9f6cf609d75669be273c3bc67918f05a679c59c3a4bcfb3573da752de0af9f5694a79f0710faaa85fa664257c817adcca78bb613ff162f9eb349feee7d95fd4fac5e8f0a2bef08faf3787d7db450a5c0932366ffceafe2f6e7666f52ef16c637aca074f6a5c80d7f2270e0078e3df9669f62118cea716c2f3fd4e6e3b2e50be44fe38c698ffd46098c7a06d57b29a2e1e4b4239e3b0572ea7491d9fc89b7878e23a44360fb11b502735e2acb488a30071574e2ee64a231873b9007533695277d78b3937d16a4bd4b1123d30d241fd85f787d166df34419336c9498fe0f1b408ce0408be9a26c13c410b151e108eccd18bcbb1006dd7d2a46d3a7149b3e275fc1a3d02b30102afa749e054ec61d2f644468f3c1520efc6c91d28e511a42e4f6e3e7e0a6e3e0edf2898f29ce5b9bf98b8cb168fb999148db9ab49a26494287b97a2698ff736ac7f25c76d157656e57d7441b23923540f69b08b4032a6f97a708ba955fa95d51c5abc0ce346a6b3f4776e6793095eb1d9b1a7dafedb14babbcfc8ddbd02cfbbe0357a03e15d518a3fd64ffbd64563f51f0000 serializedProgramBytesString: - serializedSignature: 76a70fa96c5ac40a267c3f3cf0ce5dcdf6a2beb8ab776c2025761df5157a384ba017652f1f34c6ffc87a98fdd99099e5af41fe5b9c280727d2f96ff3293edb0d + serializedSignature: 78a6731f0fc9a4cec26a97c0278f24ca3b60f11cd5d1496daa6632654012c4194f0f46d4c99a4869aa4dad95b3be7e5dc794520a2054539f06d5455fccb7d900 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset b/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset index 130b9e2..3bb8226 100644 --- a/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset +++ b/Assets/SerializedUdonPrograms/e4d9c8e9ec3e9af4e9bbd288b60f982f.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5d59431cc711ee452c87001d0884904042b2245602b10b48e84092c525091d087128716c07615849d820614092ed1c8e1327719c3b71eefbbe9cdb79c85b7e861ff390bce53d8f49574d0fdb33533d3bc36c2dbbd8206deff4f454577d555d55ddd333942485fc89b5cb8f5b624c0c880e312966c503715f7e1b90e582fcb58eecfa51b124cbbbf2735a9e6b172d59ae849fd6d82ef9392c8f96c58abcf2a19891e51c9e1f1769f97d585e9b9647507b47fe4fcb56b15279d1a4181437c4886888d56721710b2f5a567531902b56213ffbc5cbf26c1a99824e9278aa417e8ccb33cb786e41326db77b5a3c8b622dc87333f29a25312f693e87142b26ca047e115651a3ca83f2bf3c23ce69c7506e92ff2b5d75d5aaed79577d95aa7f521d57a8728baabfa08e4b14cd0af55de7639b2a37abb256b58dcb7fff5175db557948e3ed902a5b555f7dda31943b5479589defd78ea1dcaaea075cf4122e7a767f475cf509ad1eca3a757ed045efa8ebbaa3aaac57f5430130daa9ca3675cd45ed585a5cec5f165e25d5aa3ee5d26d4aa303f597d471bbab9d7d7dbd2a8fa9f397b563d95fc95beab8c1ea7755efa5c2691736b67155eed2ea65dda6db1a1f507608a79d556bf550265dfc24ad3e57e9340aaf0dd76bb4ecbadd1a9f765d36def7b8ea6d996dbd5f50c74dea7838805ecb54d9a9be5fd18ea1ec52f557b56390f79f3eb48fbb747a5c95ddc23956bb55d9acca13eafc35176f3d2ede4e68f5509e345c774ac3b65c957b5dd75c779ddfa7ea475cb45ad4f71b013035e9d16ddba785d3964e5bd7c6ed634aefe093de55f5675c389f5165afa06db85795675dfd9e55fdfec3d5ef2e43bff6f9fd2ef9284c6a45c67f42db519fb6549d3d9e0e68ba74b48bc730e25d9631685a2c8a245e081e316868b6afcc1e948174197cc04f2b76bb22c3dfa2244044c6498cbb2bd2cabbc8c8d818abd6f81ec0cf69d9620e89def476f1774f17c0dcbcfc4d6b617d59d65fc2ac0002fb9c3cd32107c61c5e755b0eeba7e5af93ca2dd9edbc4c0dd262427e2e22bddb926d6fcb6c22410ae0be664cd2b4329405596303ba288fe791c371fc7c849ca691fb6159b782f9d27d9931f5cbf225eccd2bfb92fc4ef539a120a379a4131553bd950ed96a1a94d200f749f0efef6b645d3402d097dd54c3b03489def64d8f26dec7d07232e0ac87158d4e842ce6a8eb1249f4e7631e04c3cbe89590b66f0bef1e9918f8c9422303eade83126434fcdf86ebfffedbe1993d71a768dd2289e1bb298b687ec002bd446ca78782bf08f178690a1875c31fa3e0c7d4633c8ff05bede6b05d7805946164722a200629e8886c302affcf21dbcbf2fbbc6cf0b26276062f062fe8d1520a489623d0de309a8d5913d42514d415f9863abb6ff183ba6255ae0cd4f04323586940301b0f2604375108620e769b15413b091b97d1f6aa3c372ddba7d1a343bd6e557dd8432671735ee18f2d4cf68fb9b0a571ad425c0f6a296554ce4c88975288e3aac42c2be213721a64ad50419449cb332bb206aebaa7ea276506037604124d4a0a56926a6aed8f7c7560e46b107958e6c83587260dc4090da440035b28a62b5d4c03bf06c265946ac1b2623379542d7c9f4277b028fb58111771d1705ece7672a1d8ad8115bb0d15dbea516c54fe4c6a2da7d0c769f13379716599f9a4fdad5f5e7b4fa2f40827090fe5f5d4fcd31fefed81f1ae45bc5bc85971388e4c08575008e382c8f3ac08676c6208cfcee1340b265cd348fd860c70cf0b6b3ae6b421677b1bd3ebb8defd1039f1477f4760f4eb107d5841e4e4d6a4994acaa58166ea83b8b43ab34bdb6c22bc3322e12a8a300ce1062af5ac54b8ce60f8b56c6ad6db5fb9b9bf6aca76c1e1afc3a4686d8922acd435044e141b85df9c266c9a5843690bdcc16ee1cd5eff277f3caaa934ab660ba51a8833b1893caa06ce3d402ad3b26d78f5c0026e9bdb6e69dd34a16e767984cbce82493f5b4da3a939c830f51936db4c8adf4b28fe1da01342f1db4dce655f44e7526b22dc1291f00eca5411a39b7934d5208b44b491c26a7ea54bfe1aa30f3980765aef91cc772dc5805c1da51230db278871e3d549935927f51465f029074d0ed34dbcd14c7c27a570b4dbd758151ef4c6069554d8fd3ec0440238b257b6c7647907b94863304d07b821e26f508756f1c9609cc4e1372482df9ee197026ec76fc6814d9b7a2b9a7a61f16c1a4a0d269f9c207cf23325e17cf22e532481db6d9ebc0c8699332f6b712e038608358dd45043879bcfc53c77761ecebf1ea5e20b69706d825ec8cbd6bfc928769bf4d64ee92d7a3ebdc7d4df31aa3fc8be077260234d54afe08e3b083f94023f047b3736d7e2c077f7d36aeea7d9245d8a92ae0a338b65797057fea6519bcbe28cac0b23db5e539f9d549f10f5a6e46f4afe77f66cdd90847370afd9da8c16868f7d263eba283e6a353ec6519fb3b2f4f2138683161307dd14076448f7a1bedf44fdb8c9c3e9d6daa2d971d8317380ea19d2af1394db0891963e6122dc1391f0418a30388f9341085799091f32717c2a22c78729c2b08a713a08619fc5dd56827012b3da39b11e8b5f1338b461e7c11d0c0f0b395efa3a43e1458632d872948881dfe7e3d514f61294ba412b6783a8bbd7acee2326c2e722123e6a227c3e22e1368a30ccb0602b5ea41956bbc90b5c88e8058e9958ee8bca720745197c39eccf8d3a294c9ad81e88ca76ca84f46044a43b29c210aa868210f689695d262c2e46c5a2dbc4f2a5882c1f37817c3922c8274c1c0f47e4b8c744f84a44c2274d84af46247c8a220cd05d0b42789b99f06993bd5d8f6a6f674c663112d12c7a4dbee8460e7cd159131ea351f13867b20d6bdbaa2b4f3e2feca513e7368811014fa03cc690fe82dae2d3813386bb78664a5ac403990601217d7305b4a0e899b6618431cef326c9c628c9ba0c929938714ab7a89d874779a6709e9449b832f763c248f0a44982714a829e4812cce236565b8e11b5ece59643dfc21546920b2649262849c0dae9b4915a8eeb505c821c7d6ab3ee238277e77d17f7d95bb8dd2ddc4cafcf24d5242555ef1aa4b2b5b3e249ade12c4dcd9b868791a9df24d32d4aa6c34699bc8ba49644975022ef593837118ad30113a71fa0383d2df41d2a13c26fe391c5e9f22af6565bbfb1900b6b1a34c9f3414a9e5123f25efdeb236414578b329807a5c13d96864cd23f4549ffe41aa51fc7d5d579a5b5615cc702ed9afd752e64bb6892ed43946c83a163ecb03c7f439eb9bf1a5383fb197f2f1946ca4b26299fa6a47c2ab49496069d728689775150598bd62f9bf07886c2a34f0883055ad23f90324c49be5f94cda7d182410e3fbb0d66cf6bd7f7b049be6729f9aeadeadbbe0da6df04b3f8035ddd11d36ab96c78b5e510c673683186fa49ab08bfa4b081da17b19b651ce3d6c339164aafc8525f2d8faad52b26a93f4c49ddee8a3ae65d91ee789f3de684e1faaa89eb298aebf32e5bd47bcd789c115cb49b97e3664986dc7b689169d9765169304cbc5cbb155e3349769b926c20ab64d638eb931a99458968cb71ca1254cab56aefba49c6694ac634e348b37308fd1508b730a380f1f61c6a303856b9f6b823269c9ea3709a64c609728b01d91548047433d7706792374c38cc50389c0ae9a3f29d178f9aa499a5a4b9b2aa55fb5d19d3ea26cd345e6dfb2fea5cf8cc29786b5ae272f91bc33bcb43c8c992a4a43f7895c46d4fa95599b26f5801b41764bfe04d2756c764f66d28e0354c4f44df11ee5b5f6b7d38369b14d4a8ebd0c69d2e5df04d4dde0781cb9544362d8934ee01db6892823c6571a5d59224ee296a5ba33565e7e22ef4b689b6a1f08f035a04ec9528dc0a711907ec2caac376b1fde8a45684fd6e1e0072397befd976e01c4302f61ec81cbc22004cce4a2b6c1e5f975095c74b5240ed1e2774e05f32fb19f47d0ec50013fcd830cd71c2646d72013b1ac4ae4dd3886200edddd20c68cf7382b6d3352c337656bc03f3ed5806bc1738c1ab59ed9ada4c550c50bd8183b33cee227e316771746dcfbb7b23fe56ccb15ec235e725a437ebce0070536ca1713eaf47f0848f2b4f64b1a644e8a19a08197313813d6826eda5d3d51474bcf01ecf4853a02f787f60d9393b81438ff480d323c13d796aa3a9a5e53ba821579f51dec951e9f0507541045a8b97daaca5108bdcd110e685d6fcedbe6ce43737eee483b29c0bca6e0dca1739a16c26a00cb64c01db94d980ddc605ec290dd8254e603b14b0f3f85cc0147ac7c764c8b0f28b706b228cd0b3b987431af4cb9cd04312e27c1843bf4d051b47d8c06be402af5a036f8513bca32ebb9d17f48ea270f70419edb58a0bf2760df287f90867332a9d5af10d678c50b285b35d1a948f38a1dc4b84b3e07b2f18a1ede582b65583f63127b40d0adabbc6b44b679f35edaae402b34103f3a5420293d132d9c0dca681f9723ec034f94ff7362a46309bb8c0dca281f94a2181c938ccd9c0acd3c0fc48e144f6134518d9f769507e9413caad0aca6e577ccf3c975b7c33a22734f03ec6095e8bf0a6451b3f814f69f07e9c13de1a05afb578378fbb362cda739c93cd3817704203eed5f5f48fc59f04d568507e8213cae0eb4d13c2de511474a73e2bf4355cd01fd6a07f2d1f561c6c39babb08a37c8f06e527f311e5531b28ca6fd7c0fbd47a7a53a71d7615a11deed1a07c9d13ca68eb488cd0b2ad231dd1a0fdf47a5a69de6e74b47141d9a841f999c2093cc5b870dca941f9594e280f0967faa43f6afc5e982b1dd4807e8313e8ba2cc3df969415c6035c30eed060fc5ce1c4fa934538f4f76b50bec96d91d4661c6ad343f16d7828d360fc3c278cfb8960044cac087835fe7d7145587f096ca3cdf04b3480bf503843fe78110ef9bd1a945fe484d29e66766ea06966ad06de9738c183f9ac9e1ed9270685fe6e93e25b2f2ad500fc3227802081797f52f1e58e9b34e0bec23d6c33c0e9dba3edf5cbe2b3bab806de57f3e1f3bc3729eeab26c51730621a785fe3046f8bc1e7b1db1d1b74551a745fe784ce7eb9b26991224f7b86d87666f66a40be5528403226d26c407668407e8313c870cb66c5b84e7e4283f29bf98032d89ca4189fc4d8ad41f92d4e28a3dd72608496ed96434283f6db8563a53d4568a52d1a94dfc98795aee0ab88968d36ba711e5bd9a941fb5d4e68615e4dad43e6695ecd0660a506e0f738016c213c68b83b378c5e946df67d5c83f7fb9cf08204b3d8e90be23a06a069b454c6258b5a2ed0ca35d07ec0095ab83f2d537c8167ab06e40f3981b4972fba36d092ed010dbc1fe5c30a4d0950b14f1deb35207fcc09a4fd748469eab8111e3569d3c0fc492181598c8f9a1cd3c0fc692181c9b8acc106665203f367850426e39e5e3630bb34307f5e486032deb96603f3b406e62f0a094cc667cad8c03cab81f94b4e30c32d0417e38e8a931a94bfe284b2858032dcdc9b3120b1cdbdcf68f0fe9a135ef88bc4d0d8da8f36261b3e2ec2f94e8506d76ff231b0832df816e31339cd1a94bfe584d27e415466c1d7f9366fbbec978defc98b1ee1c2066cf9639dfdb0ad0c3569c0fe8e13d868f77b186d96ed7ecf51b161de62998237dabc0de651a9cc2391655b5722e0beb944805d4e89507b96133e2bb70932b22402de8b48047a91a15b22ea855cd6ab2ab72b4b80bfa50e4fa2c29be367c5349699d75626f18fdb67fe0e5bb0f76bfbd3043bf0a7f67b50768cf605f339b3e05cbc27939234bb7ce6d150eda39524dc1edfd0f2ff4168ef472d49c21388b1ce1cd85e768efea8f7bcce1bda0a4fc3d613ea8bd812d88c62e1f0e25227bd39ec37d95498d69d3bd9ffa47bb59264f35aad3b3c477fe6b46e8b9a95b0ba685f0a201dad07b7cc99568b680f99172f5b63fd9e803fb99e1d89669cae98a9f5c9a3bb28eb1c525d10f64f39fe6593921438a5bf70e219fa8d9a1b79cc98fd450afcc55f1d432a0543ea9df76d3d47b60ebf0d98cf4eca6bad589ac6bf8d368bf4e027fe7f7c76889d6fac0000 serializedProgramBytesString: - serializedSignature: 41a9f2abf702eb5c5f1541030b24c2ec81c7b2ec149946b4c899644930407c8c8d5c89f0b2fbd98df437227aa861ddd5e4037c229164054df56c2ab644bcfb0b + serializedSignature: b99e1260f53b5155fef0da69e120f6d5f009bd79286aac9c9f1e9bbdf613cd9e20cb9f16f09c225f9905f327311e09c2cd3f5c44266a5162f864c8c97a71a60d programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset b/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset index 02ff0d5..bfb51cc 100644 --- a/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset +++ b/Assets/SerializedUdonPrograms/e4ea5e45ddd871547baf1d3abd65fee6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b57134910ae0e9984282cbaaba0c2eeb24fc6b3e88ce8faae7863cf7a394078e1ecc10003664d0227891efc0bfb7f7cf0c7f85bf4abea99cc90e999219ac6957572984b5faaabbefabababa29b8844b2de0b64e2bb44437a8463bb44f6dbc2de1d9c24f7f85e5cfa983e71eee75d42dd07c4e4fbeaeaa4bb82fe3ab4b3df47c4ddb7836a47e957cbc2fa3af8f2f2eddc59f8f56aa884e35ba4fcfe829cda88b3922d6a5533728536c971ac7fd1ebd45ad2f4af120ae54cde0b68a9aaed4b5a074d86e83fe16b35aa8db469f0e3521734b248ecf715fb1491ea5e059c05f85ebf9dd51a2f963c8aad301b95ca9ae0d0171d8331f5c165d2a687d80320fdb8319071060b0b026f8f5e8162d1a2dbcac26627a2fc9bd8e160d115a4e0ef13e31042bd7c4cf8fb9a78bf247e25d7650033537e82f3cb9d70bba09c03706a4ac63d8265cecd31aee0722ef05d44eb6cc33895d39d867053235d35a2809013dc07753345c95fb1bd1d417ed9751d613deb7c1fc7b781eca6849db3b78378db9164066d6d14cb8b4724debd04df7610d6bef8e31cdbe7be46b7884a12f9583695874798ea87f139ef88ea10e328e04722de3a60ea547ca16c9e54fb5924070781b93169af9adf1be43b7336d3123c3ee9e150b220ffff1e1fdc6d6fcbb0de7a869b7c89525632ec7b42c60595e554d2724649be038458f151d845f99e0672aabd513845fb76b48bbe11d509295e9a803d42c3ed7f07288bfa6ccbe862cfffb10b28f261d51f22ede76242a3e1245795e267ce6f10065813db9a8e6a99e067cc104fcf849039f1f69b2801fefdb1501cf9719c14a0a82793aa421386640d063379d31f141f4aa0ce8c5ad53a4174dfe6113d42babfea9a14c275c0fa4b621ab7424735fbe79b43051cdeac15e7a2289ef6bd125db9f67fb3647c0b98ca6722515b7a9d944904ecb5576cc149a140ad957268d728e8914825afbab90220a5ff1a0966771d4ebf8d4f8c1440df6995accf0c628f59b3a0e41ce09414e4aa5349a944c918983e57943c0fc882b119838d03865fc94627a3d102675a0d6730cdf90af2eb93c1d9447c7df59b26f5b08a9bc255883065b6246fe3ef3474adf67ee8e6ccb9167855e26b8ffaeec4bc334d6645dbe4de9dbab726051280b480bfd4f9ba53fb15783d30c2ab83cc1d4ef9fc9a67c2d2ef06863660e0d9f5669014fe5100a0278c66d4af73a9af4f2e53f838c7f02bf99e45f1701611e3e82a31526d55d00b323e1b48b9f8e63656740f8c391b1ecf372ece47c9892087428ab6a47e4ed0cce0f8ebbff39cd2fc6f95d4d70240aafe6b0e871789dfe9f473e8f231ff3bd7fbe51f0980f976cce665efdf6fafbb1b07860942fd943578ecc6ec3c9e66866f898cc700dd8659b80f1f4dba697f86c0bcf9ac0c207577c51a52d8cb106dfa42df88a31f8aed8846f5222c3a60cbc8b269b7dd97c66600d38c7167014036ed62670d30170db41a4ebe13d2e30aefc2679f6a0acd882b2148372ce2694bf0550eae4be2d2c64257ab24769d39fc139ff6903b81003f8679b004fa54ef2f637bbc0a81878bfd8046f22b1c0443b626bb09db3059b43a726f3f618a45fe3aeafa6a44fd5636509d54c57eb94f97c8013f7782221aa8efaba3ca3f4d9e566ea0e0db79fcc96999fdbce532ce71ff06f7364fe1d45be6eb2f44b72f7890cafb87c8073aaede7e533763a58766664675783e7b5701f5bfe8efc07a8236d9c4f0add5c85fc220000 serializedProgramBytesString: - serializedSignature: d4cd4c9e3d11771c9440cbbba4dc0e73cfbd683b0842f88bce630ee84e3e9840b607fcc12362eae1cfc5d849bf88f12c7ae76cc3b64c4f866918b2396a7a950f + serializedSignature: c887321de44df866e3eca84bc50f144e55dd760d0ad9f02c28dcb16a57b42e1bd1ec1cbf3be0834ece50accbafba02b1fe9b74d6b43be43c40b2f038f9659f09 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset b/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset index df29bc2..020a1bc 100644 --- a/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset +++ b/Assets/SerializedUdonPrograms/e5bfc452c834dd24ba5c3f13dba714f6.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9df77f1c4715c0e7649d4e7293edc8967b2f675bd69d2cb91759922559b664d96a495c225f546c0515c73e1b9b9a406821f4167ae81d02249040e801023810e0f3e1c31fc0eff0437e8779b3b3d2bbd999bddd5b3d69d744fae846b7e5cd7bdff7a6cfed15a518ff8955f1973ed6c59a5835eb65836c828df3ff9a783ac67fad77f6f133ec1a4f2ff3d70c3f57c5d6e7b9137eb6c596f3d736feee3acbf23b6fb0019e8e88f3dd6c88ffdfc6ef1de2efe0e830ff1be257c58af94dbdec38eb64a759656c691e117de2a6ebf2580cec8a95f2d746769b9f1d124a41262971aa92bf74f333d7c5b931aeb47ddd7976519835c6cf0df07baeb1512ef34121b1345bc6c43fcc4a16cab49cffc5192b7942be8fcb14f096889ca6de73ab628b94ebecf7bbe5f53de83da465f20fdfb358a6b5ca3db5329dabb967894ceb947bea643a4f73cf3d32dda3dcb347a6f3d13dc5324d2b76a7a5dd8fc9f71532add1dcbb149d2b1111907b7e993cde27df174919a5f27fec17fb9ebd8a3e7ba53eaf5876c6fee522ab52a60b90aea532dda7c8dd67c92d7a4ec97fb94c0f280c0fc874bf3c7eaf22ffa03c7e1fbace3e0ee92179fe7ef41ee75faac83f27dfafb0ec8e9f90ef576a6c74e33a47a68715fb0f5bf9cf6957aeb3d32348fe2a1f7e5c20e53ee172adcdfaa8a2d351eb5cf17ee5bad532ad577c522fd36348d763326d90d79e5764ad51ceab31bbd6bfadc5b73cd8daa8d8da28ef55fd6fb82e5ea55cd7c472e3cd3e7e9c39cbe93ae51ed5e6f53e6cb6ef6956f46cb6ce955c95ef4b64daa25cd722ed795abe4fb85f37294f8d855625165a657a02d95f828ec1ff170cb2da14596d323d89649d94e929961b5709e5b89d871b43db57ed8acdedd2e6179828f309fbba0d32dd22d34d48afad32dd2c8ff1fb4a9f91c736a2fc54261d4ade1d56de89fd326f9bfb3699ee90e9f6a97c12afca634924dbcec7e6725ac9e7b4cce72929e39ff2f84e995679c827c1bcd57dbb902c483ba52e17d17b48cf283a9eb1742c3d2e798ecae3d5480fb7fc3bd17520f701976bbde8bf49a66715fdcfcab44bd1bfcbd2bfacd8d2bfcc666aebbf318ffeb6dccde87a90dfefd58e784cf4084ff03e5a865d6529711178c16bd7d5be337fa7154497c00bfc6c13d96679f7f02a17a0e939f68a7e6996f7bc766b7b8e2b62f391de4de235c3af1811422f39b378de91052837ca7f8750b7f73a3fde2a7acdd0f11de167aa79611f11775de2dda7f3fc37574a1fcf7694779d8778a574836705f22e71b59d57e63309bac8ea3d5d5ca6d5831fe3476ca057f9fb51a161b778bd29341d12dab7f16359319e18e7238a469ede12b9396dbfc6ffd7e5d92391e975d477e44dc7ade182eda6e3dc1ad03e25fa2eaf7964363c02e84b2ec962589c122dece30e4fbcc6d0aa6460c0d62665d40864b19c63bb594a8ce9ba1c04fddbe8b4501fdf16efbd7c80e9668b9e0cb87b95b060cac34f3ebba8f21fff4e9e8be79a56cb52a20bb23a8f696e60415e32b6cc21c1dd8478bc380d8aaaf8633afca2fbd23d83f8adeb46c475fe1d50225aa65c0788e6af87ff738bff8d8afa6d828b84d34d42214bb1512eae5b6432c61cbe4a83e084c0ed6c4cf3a96c025ea4035e3ad3c0f3d7306ec04b27ed9a020e3f7a82650682f97430119ca323287a741748093abb62f67f8dfcde2b9cc44dd1bedee0f7ebba6eee4c611a6c97c254cf739ee0b95edba1f4a7918970b186701a08cfd72959a62809fa1904c74d821704145ca28b09401a7b8834267af931ab7bdc2cce8e883e15f4ae32427a278fe38764df0b3c60bade8e820e31f97b4368e21e2f0b3dc74bb9881718fe506a6b8aa584cee5e099455e5c5e6e7679a9cee51022b1ccacb81caab36ad9980c0a796e08e16a77072ff6ece025c2c15b5c1cec5f37933bcb74d4a15a880dcd0a756b783391c722ffc50b5613e628f453504b8991fcf46bc3abf347ead1cbcb77daebe37a77570877d3a86172fb5c5d2906b72fd5704a0327689fead1cbcb77ee1c8d3bca7785b97ccf3365b9cc2dcb49903ccbdadada7a5f59ce37655969cc727878b8dece571aed2bcb05baf224a6c07a48cb93baa638214206a614c60be810c2bad14eb543a88fde15227a973b8ccbaf82293617eabc06adc34ae6eca6fe97ff38fc5366f64fb949f82a8d70b0ca8ff0453ae1d060c2f8d031a28102312e788c4d8e63ac52eec83361ce73b129cf35ba3c213c07c5cc50867b00bc335860be4b4cf9ae35d99a91335637d9508179de63ca739d2ecf8522cfacb8d22a6650700acbb94257ac452c3d4a5aacbd4e31eb7a7c76be13a27d008dec39c62e9e0e0b2de03868917f6adabdc2583fc90735afa2383433ef13e5f456c0e2d35c31eed0d7661b456d162e9d4df5e4525369d8a42b0d5076faf96f9aff0d283326701c9606acbd357ecac532930e9b753a2c453af40b1697e52c351051e771fce851a9d3032a802d9a962ce690bcc22c79b9c9c2ad3a0ba17301b5b96d539fb0e58688103ff6ac303553db34cdd44b45fe9aa9952658490d2ca7641758ab4cb0b6eb6025443874894af0b6280e7e10ad36e5b54397d75cc5311dfc70d6a753d69872dca9cb71110a76c83523ee29bca8ad35e55ea5cb7d494e51b376aa7504b47f9d49835df9ecbf3979b870fbd79b72afd6e55e91c7fe420be60653c14c690ae6ab25fe0ae6468df094e8e08db0d91a8ce7b663d33b2887ed79dea644605d29198338a3d3d5d4ce6e3205de6e9dfa3e6269b3cedda25f7d96d4ddfe17fdf4eeabf5ecbe3ae1bea50eab5cd7c50cd4b698dcb147570f40ad99dbb16810ba677881c57540ab380bcbb8a99c79353ffedcaad30cfc09db3ecb14cde0b843789d59f83653c5b34f53f15c48f8ab78923ae1d064eef712e22e93badb4dce3a10b0ecec30093ea88b82aa02a2c06e211b459a1577a7786e56e7d93e3be84beb9d26271ed238f1459f4eac322139ac43b26bda9114daa4eed2e90d31758439079569e856c0d6da2251b1d4e76d177a445703f6c80ccbb916ffed82c39a8d666baa7595ba98b898c9f56075e5c75fc57ecc73c5dec0f46bc1f9f23755ee295d2cc0d004760e071a9aa44d929b824aaed149865edb712f755c8d59f06e9d6008a5662f821bcc826b4d825b020aae33096e0d28788f49f0898082f79ac2a22d6858ec33493e1954f27e5d155331d3554cb7dc2c335a50df117698af532130d32243bba19ac9a783a99a39600aa78e80e1745027185c73da64af2abcdd2cfc9029a23a8346d46193e43341251fd149864ecc592fa45d76881c35a9dc1554e57a537074070c8e6326957b82aadc6092dc1b5472a349725f50c94da6a272ef341495e33ae1104df779f1e112b3e066138ffb83f26831493e175472ab29a0cf070ce81326952f0455b9cda4f2c5802a9f34a9fc4050954f9924f70795dc6e927c29a8e40e93e44c50c9a74d921f0c2ab953233925d6c266679234f800d3bda734e025e2ebcdbcce983c3118d413677592c113430155ee32a93c1c54e56e9d64989bb8cc3473240799bd0edccd5b94533c20600161883b372b426844a456e0c032431bffcfba1da60fad85872997e231b17a2e77b78c9fd9931e93455774169d9bb4c85e6bc62bcdd6fe6d2812c362b70658d6367965b3d8b9015774092b86e45e8e6bd27af8045256794e439f58ea1999dc6da2da8d77ddbbf1f243a4d744644447648890487760225ee307e6de467c4e46f699383da4e3d44bcc695cec44ba212c02b953f7f889994238dc6be2f03a1d873aa591b1e6502d6bb2d29e1e7e0c0f4dfdd404f83e3f56dc67b26254678579c614360be30510cba2cb2292d585dce9d0fb7e93de633abd5b14fa38574bd309debcf78b781c620ff39b32b29ebeedaab1db99e9aaa9cf992c1dd7597ac0a787aefbf2d074949bf3267b2674f61c553c97cb11fb0eac863af236ef44c20ea10cb3f7eeb9fb62fa3c75c164d9559d65878d9ed2ed0dc32d4303da11e9cfb642fc75d164d5c33aabea8d56393bbc964d2de2bcb3dfa3d6d75ea5fab1ed01936dd7fc79ccb98b20b7febbacf1a8d9269dfffd58d56fb2eabaceaa66df56593d36e759d583f632bdd952a70cbd9d09fe1b13bb819be5cae36dde3f9a1052b23cbf94d850989eec6be4df7f097a8e71be50567a267b55f977556699f9510bc34c1d4816faa9fb7c56e8fa4dd5a8e784adf3be47d7f9848184b4c896c5498b2d93779ba537c0ab71e9d5a294d8bcb9b3c068caafc54dc86d8e3e86fc7fc2d812705ad61972c36e2f973628f70ee20576dc01c89b73bed5d85d42805dcaa7e1b923106e0d5cbb413183719dffb6c36372e24569f0c8eb29b12d16d87ac488cbeaeb606cf60e862820bb34670ad92dfa486be068064581ef100d7146347ad77222300ad89e8c4d61bb4d89cd7a8890b5b517c67e5180033f369c3750c271eeed8e029eff14019e445c11ae8e3aa7eb293c5e1f93e16ccfcb450fea96e8715d13f206d5f65d7c84206c9abf11b7cf4947114afaa88b929a184b7aacfe933e5ad7a92eabbeab99862eeb9bfecf7b9369287f6f0608dd76e74bd4316fa1ac6396336b8fbf357818e717b90fa161e393a2439007f794e5d4472bbc1858489d741255d96fa5c4b92c0fcedcf9a3341dca762a940711ca47661365eef40121ca062a94bb11ca476702e580ac25b3aeb34b84281354281721946fa344697d38d16a01710bd9c90590612ba7c25682b0bd9d12db0223b661fe1b3d700904eeb170b5cf7b23d83e77209cefa0c45929715e3602c5eaf7b33a3a98655430772298ef0c13cc9a08c25c8160be2b4c30095b693298e508e6bbc30493704c4306731b82f99e30c1dc1d41981b10ccc76702a6a92baeb6e784c59cac35af4430df1b2698840d1019cc9508e6139430616433c0ec073b591beee0eb9c001f19b67954d8e208dbfb28b1f91b5bef89e0d87a1942f9fed92cceb9286b283be764307720981f0813cc2846661582f9c130c124ec0291c15c8f607e284c30093be76430b720981f0e13cc284eeeae45303f12269884fd493298eb10cc8f52c22c67534f0fb3a5e63eb98c0c5e1d15bccd08dec728e12d90f020e36131deb665c3923a19b838153886c07d9c129cbf55c37d115c356c43283f411d83e6e71c9381aba0023717817b722662d0d48c447f22772142f9494a946b35c5d9ebee7952b43554686b10da4f51a2f5bfb218c5e9b31684f3d3e16978080788640d4f1d42f999d9ac3f73bbe1511c6b2f41283f1bae427e208285bc0be1fc5cb87012ce5192e13c85707e9e12e71acfadbbfa795dd2b67d0915d8e308ec539460612d2763d8ff1dbdb59c6284ed0b94d85631fcc0733bb53f93abeb615a2374c7e75622d0cfdc88a07e71365bf3e8efe3ad4628bf4489b2220f4adb52528c64936b5b11c62fcf44447adba44f38ea21dba4df84507e653651e6166e42946485bb16a1fc2a254a7baa63945f644df87a7fcc0329da7a2ab46711daafcd6613943ba0249c14261b50ae4228bf4e89d2ff08881027d908e834c2f90d4a9cf622598d5c18cbb22b33b54846168b9b10bc6f52c2dba08945ab3b0e5fee3dce4e8a4fa25ebdeb66df8b10e06f85a7de8ce276aca508e5b72951ae666e434bdd438e66607049f6f1a824c2fa9d9988506ffd4fc20825eb7f1e4028bf4bddb2c3c5f833fc4d0c7fb98df5bc5f97679944a0655f80707e2f3c7527e1ac3b59ddb906a17c9a3a32fdf53909d784c822f304c2f97d4a9c769fd3b9b7685c5e12bd588c21783f084f8343b87595acc1d98350fe9012a5bdfa03631ed865e467ba83b0db4e36ddb10b817d263c4d4f1437b12e46289f0d57d343f8390ab2a6a71de1fc11254e5822ccb0a907f646793be13c04edc733d15ea7efa239a2ed08de7394f0ac2f62c98adb2d02f663f7a31a77f311bae729d1055b9088620bdd89d0fe243c2d34e1135dc80af87284f2a79428ed3d1b7694de44d31777dbb3d7f623a82fcc447c7a1be510c627d928a715a1fc19254aa8ae714cba3c743a023bd84a11b69f53629b27b059a026d8197e51868b8be6feb53908da2f28a1f91fad44f1f122cd08e72f297156fac4b93f82301b10cc5f85096614f7a1372298bf0e13cc2816f31482f99b30c18ce2c7a0d208e68b618219c5959abd08e66fc304338a8fe6de8760fe2e4c30a3f8c99d4308e6efc304338ab3e28711cc97c204338a4ff83d8a60fe214c30a3b83df51882f9474a9830241e9753baf01d79519e372f43d0fe4409cddfe41961cd483679568f50dea144a97bfc43ee1728db6923bffc0abfeda658e181fdbfa4a31eb2b9a22308edcb3311a5de9620a2f80cb67b10ca3f53a2746e64b9bb63b40281fd4b78629470fa8d2c46572394af50a2f43f351cc5d9cc33ecaef9eeb93440fa2b8444890c89a4cba24832e6f6917febec00d33fdcd93a6bfa529b649eef6e49baae70595ffcb658f287af97eb60f091868cdc429e61535f029782475dc76072c5cf37cdbacb04faeed2fe068863fa52373a6d71331ddf3aa7b334bf7de6189cefe295142cabdfd5f6ff1dfc2edd2ec2b452142ffce9864e7eb115c6f013ff1fbf1794d571c70000 serializedProgramBytesString: - serializedSignature: b7979a5b770d1177c7e1b1190687bc90bdc31e761bcfbaa87702af13e5844f2e505b1c4859dafe3b362921d51ec437becb5030298996ae09180b530ab3e83504 + serializedSignature: c0e00753119373788b495032a85181bd450db27008c602d94e547ff9dcc524ad17e0d05c986296283903f55ea16f2b750455bc3cd15679bdf8e172155f8c130c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset b/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset index b007e15..714c9f7 100644 --- a/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset +++ b/Assets/SerializedUdonPrograms/e9b544610899b644c8396e19baa7ba11.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aec9d057c14c7fbf0f72eb8bb4bf0a00910aca58540b0a22581b69416020941120849b02a6da953777777f796bab7d4ddddddeddd999dc93d3799e76ef7264f98fdbdfff6d36e766ff799e7f9ce336ed14cc7fd2732c8fddf7c67ae33d119e2cc730a9d35ce6af7af89eeb5d4fdd7bb93cfe738e5eeb5d8fd7f81fbdb20273dc997ec9f7e910eeeffa7b977154ea5fbe53a67a97b5dc17fcf738adcbfa7b9df16b977ece932f7bf22f7ad481df7a3794eae33db99e5b48fb44d22623effa8423c8b30bb220ddcff4f7036b9bf1671a5582099fca7f6eefff2dc5f2af86fa5aed2f2bdbd9d7db859a5ee6f4bdd6fca9d1257e6122eb1c1cffb39fc0fc7bb8c12d734ef1a39d6bdd6736f73c13db362b4fb5f5df7bf85e2fdd1e2bd49e23eeafed790c9177f039955b2b78a77d8b331e2fbc9e2be9f78e73825fce344f89fc7bfe7ec2cae3b89f7a728bf8f55e4efe2e95fb8a7b8af2be41f2fde9b0aeeddf022dfc7bfe7ec2a7e3f55bc3f0ddcb3dffb03dbe437e3c43ba729df9c267e1fa0f966bc78e774e59bd3c5ef0335dfe48877ce50be3943fc3e087cd306e8cbdedd4ddc4ff0e4357c5ddcf711d789e2bde9e2be2ff2bc8e08f30485e709de6fd17bc57b325e4f043ad5898f53fe1b8c53f9fb24254ea55f9da4847992f74d03c1d2117222678230a56f4afb272b61cadfa7836f75bfcf10d7a9c8ef33c5751af2fb2cc5a63922bcb312e83a3b89ae6725d175f724bacef5a96bbe08efec04bae625d1f5ec24bace4ba2eb7c9fba8a741f392781ae7b24d1f59c24baee9544d7053e7515796ce4dc04baee9d44d77393e8ba4f125df7f5a9eb6211de7909745d9444d7f392e89a2c6d15f8d4b599b8aa799f7c7f89d007c9e323e7c76ce47fb3ebc94e7cdec3ee61dea3ca46ca82c80580df52f1ec4210de050a5325bfaafa7d3af856f7bb645a88fc2e991621bfab4c33127368981bff9e5b3572e2f2d319e09e5d2f02365f24ae172bb22f56644bc6c529c4df05d5c3739683df2003f9fb0a85c14af1fb29e2f94c70cf7e1f229ecf12f7ab1c5ed6ee9d2dee4bc4b5545cf3c475b5f86eb6b85fe37d3741d6c174752e599f6b2cae039c785f6f823c6f8a3c6f863c6f8e3c6f813c6f893c6f25585de2c4d7fb2ef1e2b8d1ebf1ef61df3b65e2b9283f9db6c8fbed90e7ed91e78918cb3acfa54ebc7f5eeafdd6b8c48bafc69b13c85a2baed94e2cfd7713722e53e45ee6c96d921f1fbe5bbff77ebfc289f7fb2bc4f572f17c7745fe95e2f95cf09e7cceae5789dff3c03d0cbf9b225f3eaff0ec5ed405c48d6a6322ae958e7f3f5f17e0ddf5debb433af8787783f76ef6013ededde8bd3ba2ccc7bbb2ce7ab512b7577b6c9b5ee8c96a7a6b025959e23a0cf0ac27ae4385dc79e27e93b8ee27aefb3bf179cb7c1f3a0bd9916be26547ae15f77b28efc9e7b2ad354c3cbf2ea62fffdbb5b7d985f136f1e7ecdbbd94f71e49a0a7ccff0f50f454eb03073af1f97619085b723c28803fa9eddbeb819c8395b0e4bb9bc5bb373af169f54671bd0130bac1b3bdf9ad9e4ecdff16320e11d72ddef37d0689fbc3c5f550a0c711e27a9878e6bedfff6bffb6456e72e2fdf4264fa716533d592d127192fe70b3e237378beb2de2f90270cfaeb78ae77b837b264fb08cdc267e5f08ee5d9d5a8e56c2bd3d3edcaae777003e325e8e54be517de728253efdb0bb536177a7d053c45bcb3313c8527debae00be758fe25bf788ebddc0b7eef67469351609ef5e10ded1203c57ef565bc4f363c4f5d85af0c3fb1496f709fdb70b9d3e0ec0f2fe002cb7292cb789eb0380e5039e2ead8f42c27b1084b7359e65ebede2f971e27a7c2db07c4861f990a77f9b2e9eac36590964a9b63d0cf4927d3f41d2c8238a2e8f085dae14badceb439713c5b78f2a71f5a8b83e06e2ea7127aecce2bfc9e7ecfa84f87d1f70efead336d7871ed2a62703f8d7d38ace4f8beb5340e7a73c1dda652832a4ddcf28329e11d7679deaf9dc01e0b76465a4cbbf9d2c234f12d7936bc13f9f537ce23961ffbd42a7ed0964493b44db2bf2bcc2e67971dd0ef8bea0f8c476f09c5d5f547ce2454f9ff67bfad043daf452009f7845d1f915717d19e8fcb2a7430735ff9676bfaac878555c5f4be013aff9f3890e32ff977ddfa7d5824fbcaef8c4ebc27e91ff770892ffbf11202ede5238be25ae6f82b878d3d3a52396ffbf0dc23bdd8963d951fab2ecab3fb31658bea3b07cc7d3bf93c8ff3b05c9ffdf0dc0f27d85e5fbe2fa1e60f99ed045e4ff9d651bf72c713d9b804f16b882b687738e13b82d10f94061fb81674f67d146ecbc3500db0f03b0fd58612bd243e423c0f6234f972e5948789f80f0ce75e2fcb4cb46f1fc3c713d9f201e244bd9273202c8bac0fb7ec0a93ebe2fd37c7fa1f77dd7363ebe1f21787c0ad87deab1eb3a5ec8917d1d2313bcbb31415892fd45e29bcf95f813e39d912f9cb8be1b7ecfae9f89e7fb827b16e6fb9e7edd4623e17ca984f3a5b87ea584f395f8ee6225bc45f1e1754b9436d4b0bf51c2fe465cbf8d0fdbe92e9e7fe7c4f74f7d0b9eb3ebd7e2f7c54a789728bfabe599ecaf0b504f752e13327f506cf8415c7f14cf0bc03dbbfe249e2f01f74c9eec53fb59fcbe14dcb3ebf7e27921b867d75f1479bf0879b2eef2ab13df36fed58ba774998f5e0ee4c9b471457c18ce954e557aed21bf4bc4e8aa78d981bfbf5a5caf49f1fb6bc5f5ba14bf97f9df6f4e7cdefd9bc7ae47b6903535812c352ffdddf19f77ffa9f8d49fe2fa474c06ff9be9b2cdd3a5a7ec5bbd5e5c6f706a3e3f96fdc07f39713e57a5ff8dcaef6a3a937d477ed259b6675fcf6b13bc2bfbdbff56e2e96fefb75e7bc6bfe7c87ea67f14beff88ebbf80efbfe2fa9f135f0790b26e517e57e726c83eab00b6f64ad4ff23e4b25b682bbf67dfca71916e89dfeb3d43792fe2c4e5a955cfa50ed0a6db946f549b655f59807c345a47d153da9916cf9ddf33fd998fb97edaa74dbc1c39d617ad1b1fb7513127265a2f664f54f4fb45eb2b61d74f1c761f5986eaec126df16803456603efdbbecb95f71a8af78ac03dbb3652fc2d4379be4c79de385e8e1cb78a3605f636163a38e29d81e27913a72addf785f380e06f52967cc6c29263617788eb9de27a97b8aae3943a5e897c43191b8e3617f266807b766d067414e392d1160aff16c2f6dfe3df73ee4ec1575b29b2c55863b4a5e22f2dbd30fb2df4d8f6db86f86a6bc5575b8b6b1b60978897685b25ecb649c2f6d3fe957ab453f41063a2d1f6400f391e2afb92272bcf45bf5cb4a322aba3b87688c9f2c5bab3626f6771eda4d8dbc9b337e3098f75ff418edec62e8a5ea2bc8c7605367615d76e4ad8dd1287dd5f8e31fb61dd5dd143d46da3e9408f74f18dece39eac3cbf5fdcf75464f514d71e3e591f2aae83c1fb0f88abf4d9c39cf8342dc7071f74fcb7851fd284f37080ef254331e617edadd8dd5b5c7b89e782b56cb745fb29f1d6cf8bb7017f7b3a0cec02be67dfeda17cb71cdcb36b5f10577d3d5903c5f8d740694f16f22ebbf601cffa88ef8f12dfbfacd82cfaaca3198acd32ffef0f64f50732a1bd328cdf7df8e945e29b814a78b2cc18e4c4b5cda222bd45078be72bc03dbbcab92e2bc13d0be731712fe757ac42f4c852f4905c87c6eb21db88d1614e5c7d86bf279fb3eb7027ae8dc8efd9355bd15fccc5898e50f41fa1e89fa9e8ff3878ceee9f14f723c57b25e05edacfaea394dfa5ef3fe15495d10b643d4ba6a1b54e7c9da091b89629cf9f12573196e088f1804063fe6a1a94f3b5a7817b7695f3c08bc13d4c53727ef67270efda3544f8ff90739df8f4b313f06ff9ee361f7e2cd3cdce8a9e624e71742c903bd6939b2de7428df0ee3345ff67761d45f6b3e2bb5d14d9bb88ebae8a6fcaef9e13bf8f53be13f3c2a3e3e3bf8bee0a9eb36b8ef8bd14dc33b9620c233a41fcbe1adcbbba67bd2fde937dcb2ff8f02dd587a46fa93ea7da3651b16da2b8e6224c24cb49ca77621d4174b2c224173c67d729e2f735425ebaf23c1f89c38b82e95b15ee34273e9f90dfede6c4e713b28e2cf389a98e3e9f93dcfcda2fed9ea1e821ebc633153d662a7a4c57f478113c87f9959cd75902eea51dec3a5bf95dd6f56b22bf92fdbd23c1b76abccd5178cd51e27d7770cfbe13fd965139d75df45b56951b79b1b0f83baeeec3b3946fe7c66c1bfebaa2978cc77c452fd12f1c9de7e8fd5fda335ff94ee4c9d13de2bf8bce03cfd975cf78ff8fee097465cfcb807df0b9ecaf967de392354b2b8bc5b397c455d64952c92fd4e77eca1831be1995f3e3a7817b76dd1bc4959813149573ed17807b264ba6e785e277e95b623d4b745f206ba117ef2364fb538c9146f789d93d62ac22771ff0fdbee0190b4ba6293f36cb76cf62c034493f617489c247f4c7450b804e05e2bac8a99e965e13bf152972649fc4322047b6c5e53cf1bdc0bdcb6ca4a8ff8e5c08c293bf37047fb3eb528d2ed2fee5e03739c6abdaff867877a5a2b7ccf35689e7e5e09e5d57005d64be590c9ec976c39be2be44c8a900f7aeada32e15efc939cc325f9ba33cefefc4f797c8fe8252f13c17dc33b9e7c6bf173787d9653bfa6b45cfb7147915f1f246cff0a9e74044cfd58a9eab85dcdc807abeadc8ab50e47dade8a3cedd96fa942bfa942bdf4b7d543be573d54eb56d2ec39d06eed9752df011917f44d780676b14fda6c6eb37e6d6f8f79c77c47d85129ee452e9c4d7a12bc57793957016c6879323ebafb26f6823d0518c2745d78367ebbdef765aa8e8f7ae13dfef209fbf27eef753f4167389a39b80ec4d4878ecba0e3c5b2774785f09eb7d44870fc4fd018a0e62ce4a747f207b7f3cbc9d252bd966dee054e5f13ba78bdf0628bf49a6f219f425d96776a086f9c1e0d9c122fced01991fa2d87b88b86e06b23723e1b1eb41e0d9419e0e63f395b03e4474f848dc1fa6e820fa86a2604c297a6882f0362bccb7c4988f95e3f80394df2453f90c32977ddd4728cc59585f2b611d1e0b8b35d3e2c23a1c7c7f047806c2f21d4f72bdf43470cfaec78030c43cd9e8d1e0d9d19edebbb650e47e8c84f789b83f4e094fcc1b8dca79a505e09e5de5fae625e01ee62d478bdf2bc13dbb1e05743d4ae8ba55d149e66b27283a9d20ae721d6f31b88761cb39d50bc13dbb1e09c23ed20b7bfcd74ad89f8afb9394b0c53cc5e8c94086588b364e4d837dc5fd29b17793f257d6ef45c5fabda85c735600eed955cef75a02ee993c593f976bb645dee17c069eb3ab5c27b70ee80a9f4ff77c7cfcc7886d701d7132dbe4fad669e09e5de51add0270cfae728ed012700f6d93eb3a972ae149bf395f094facc98bca7577b23ef13990277f67d70bc57bb29c394b792ed8e4c8b68b6012b7769dfd2ed7dfd5d49a315d38c07e5e26c17a8328a372e4d87746e2f7268c57de5b2fde53c704617d4094fd13e4b89fecdf05e5e004d90e52cb48294b3e83b6fa19dbb9c889afc75de4e932313ffebdaaf72f063efb45bccf56bd2be62d45e55c9e69e09e5d2f01ba8bf940d1cb143dc47aba896d3cfb27cafab39cfb24e627395fc7182d903eaedacdbe9773fbc43c25e7bb00dfeb385c0138246b1b5ea570b84a5caf8cc9888af91cd1cb815cb56d78ad2247f86414acdd8a8a793651b9ce6a2f70eff2cc2df46ccddd08c293bf37047fb3ebd51a5d649ff30d8a2e3788ebf54e7cb922e60f456f04f26f14bac8355359f83b93e41a03b9a6556d37341057a53fabca2eb98e49f641d4539e6f10cfe5fcaa1f12f885983726fb1baaf5c1b8d7c9329dca71f19b814d621de12469b74ccb37c5e44c866b74e16f52967c06eb43729e91ec8792b66d04f76eb893e19a3a0d1bf9de549956ea296c252bc95ced4f12eb9aa3607d92b479b2e42b6dbe2766f31459060c507e93b2e43318ef2d803c5d3b52cce58bcab93fd3c03dbbde06c2106bd4a6c8393fb23d027dcdd573eac2f8dfa30f2976b22b58bfc6ff663cd5fe6e391e72bba2dbed0964c8fe4fc9efe118bfa9b20f6080f29bd4513e839cba03bdd973b916f56727b60ed7bde6ff0ce29a5de1bc5d6c1d7bd07e482c0d4bbf967516b9b67023b877d94ccf8dd747e77fd3a4fe1aff9bb6a506fd0f5bc39f25f4f8d80b73baecbb947344d5f2e53ec051ce1b55cb97df9cc43e7e27b0e34edcb776bb54912be7e704f0cfdde478d61fe2f92331bebbc9f92f7f2abfc9bfb1fc16cb7ffe7292e6c3d26fab7c6836d017fa90d07f7759bf900cfef6cf56eb77623de9f4cf71bf9b2ecb815af0bb1962fed3ee32ad24f2b764f53acc2fc0dacda89c17f3287826f23de79f78f955cfc53ccfe85d8a7c31972d2ad70716837b767d0c84f19890f59fb89773cb36827b97c7ececf8b0d9273a9d221171ff80a293989b137d0284fd84b83ea9e8f9a4d049cadee6c4b7ebb7099d1ce57d399ef294787f3f700fde8f44e3bf8bca758baccfad81b867efc9f9cfb23c52d39c7b9d2de69044c45ccd483d1fef8ab99a91063ede15ac228d7cbc2bd255a4499277ddeb1cd93f21e23f22e749caf5971bc17d1df0be8ce76648fccb7adc834afc3f28ae723d6431b86757b0be332ac6d523b23fe97945a7e7854e62ee5444f4bd47645fb9c6ee399b15d972bee27645f676215bbc1f116dcc48db24b201d3aa79f3b25f154b0b600dbb4c6773e4da08d1ee8d7440c28d803abb4c1f6a9d5d3e17e54044cc670c540ec83ab25cffbf11dcb372608bf7ddee972adf4d4efc5db570e4fb48fe3357ae5790f512b85f0856afc2f6efd1e5fdae0d793fc7cbd3d58be6ca38d6944f73cf0572e16f52967c5693f5f26d208c6d9e8e79b2ee8bd4cbabec4c542f076bb665fe9977aea25bb27ab94ec6130a3f502fcf7b5be1e7a75e2ecaebfc268aff064c1bfc7d2647d818e924de4fd0be8d8879bd7ed253a48bf2ae4e9e98c31be9e6e8d7bfe8e630a87d1e3eda6f727facaaf6c11c4496dffa2c4ce7927333e53916065677d1e48df3f315fd61fa14f1375fedf703e973be6c430c527e4b943e4dea7d58beafa9f745bac7cbaa7a9e2eee1f54643d08fc5849ff7b6d53f4b94cfcfe822243cca58bca3d010ac03dfb4ef68dc9fad401e0de0d670fd9fe97e5700f27ae2f7aaf3b1579b29fec19459ea863ecf1b922af671279328d3fafc813f583bdc47a9bbdc4daae6a650d52f6ef59a6e8d14bd1e3ca78be11f15ef42585af9883147d59e12be72449beaf28fabf22f4f85dd1a38f5e8f2a7992efab8abc57058fa98abcbe49e449beaf29f25e13f22e14df5de88317bb6e06f1e85ef74c17f7afc77faf8e3544fa79eff9da934c9613afc7d28533183c63d73784fcb5e0deb567815ce7d4037c07ec58b059f9fd89783d7de9f5a6462f3967e72d45afb73cbd58b386bf2fe7f82b633e7b77507effdabf5ed1b7c5bb629cda190eaeecf941f1cfa372bf0531365f9596c0de09fc6ff92ebbbe27bed90cee5dbbf669a1c896dfbd2fde3f04dcb3ab1ce39f0aeed9f50327be5ff6034ffe42e15f0be728723e12ef1f0aee13c9592ee47caec891639087817bf6fe95f1ef39729efd2ce5fb4fc4f32de0be4ef570d43d3725a7aa7e3e39aebf54f883aca3fa99bb27c73b3f75e2f3ae4fc5f53310af723cf773f16e2eb867f129d7d0ca3218cc4dd0ea22d75388f50651599e1e0eee99dccf3dbbf66d10ff7ed53c46e4bb7de57eacfd95f0e4fc8875b86e91017a1dabbe5d9fc0ae04dc23a2fd2df74b8d0cf6ee17271a4b93df662adf66f9ffb66a0daedc33612ab8777f5b2cfbb944bd37fa95f2de57de7b8b64df6fe7c4ef55c993f554391623f3a669e09e5dbf01bed2093c63ef2e43647dabc8126395d1ef80cf8a71cba8dc83602f45ffef953012f11f1acf3b32ccf1bf0e4ce6d1eafcc08ec873357d2a7b354445bb24fa23b0558cb745e53e0d53c1bdcbae40f84bc176250c716597aa3810faa64562cf22b24c50eabb11d937f89ba2a3ec6fff252683cb93cfa0bd1a7651b99fc411e01e7e3b15dcbbf62d69e1d9b7a4372eb31a574ce75f01d75f859d724dde1fca37b20f1fec93c0ff663addaae8febb135f66c8f7649fbff413380fd4b5a970aca28b5c83f597a28be8eb8ffe0974f9d30b63e9784517b957c316e5bdb280bac8ba84b2374154ec4d10fd1be822f637286ca3c8906baf262bcfe5daacff14d9b2bf1aec7b10fd374178b2edd7516353b2b42bd34734deeff83d932dd67f15893664642771156baad2e45acc23c13dbbca759147817bf69d5cdfe5cadc28da00919d812e0d15bdd214bdc49affa26be3df8b88355969b27e3e0ddcb36bef98ec345997cf1157b9ee6b8af2fb04711d8ffc2eebaa931546b9e2f924a163fd24b67ced7dbf4cca15df45c47b91293166eb44bd323219c896ccc47ae8b43a4a3875bc7096893557cb2e1432a629e14c8fc98ac8bdd167c4c266dd49fcd96e203ca55c4babab845d57842df67f2b16f59c88a8ef4566fbb0b1130847946d69f59470ea79e1148bf36f8a453a8f883410d9dd47389d4138a29f344dd98b82dfb3702e14e188323e22f73e92fb054196f2fc8d442c1b83b045df655a0325ec065ed8cbc5fac7e5a24d1791fbf5ce4f316cb0a784ec7f4a6ba884dd50842df6bd5b2ef2f488dccf68cf14c306fb61c87eb5b4464ad88dbcb05788f95f2b160b1972efe90529860df6a9907374d21a2b618b3d3a569c28c216fdb811b9e7f1c214c36e0ec2167e98d64409bb8917f64ad1ffbb523296fb5bee9b62d82d40d8627c29ada912765311b6c8ff578a7e9388dc576c718a61b704618b31adb4664ad8cdbcb057897ee655320d1788eb921a085b8c41a53557c26e2ec2de2cc2967bb48ab9b191c214c3067b76c8b39dd2943d51d2c49e28abc4fe0725325f2e12d76529860df62d917367d35a2a618bfd494ac4fe8725622e46449ed5b13cc5b0db82b0c598619ab25f0bbf67618bf946a5e3858c15e2ba32c5b0db81b0659dbfb512766b2fecd23211b62cc3c5dab448498a61c37d5544bd2cad8d12761b11b628ff578b35f911b18e3cb23ac5b03b82b0659d47d9a786dfbb61af16fd3fab2f1432c4dce7882c3f1395970d4138620e595a3b259c76221c51feaf11634591b54a3841eb1edd41d862fe405a7b25ecf65ed86b6688b0455b2022cfe1a8f0616323104eba90db4109a7830847ecff5f2675ad54c2096a633a085bd49bd23a2a6177f4c22e13eddf32994e45ff4f64bd0f1b1b8070ea09b99d9470c49e3a65a2fc2f93e5ff06251c68e3461f36d603618b7d72d2943d86f8bd1bf65a51feaf5d2c6488798a91fd3461efef23ec9e20ec1e22ac2e4ad85d44d8a2fc5f2bcb7fb917f3812986dd03842ddb285d95b0bb7a61978bf2bf5c96ffa2df3a72708a61f702618b36479ab2b712bf67618bf2bf5c96ff9bc5f59014c306ed30b9d63badbb1276772fec0a51fe57c8f25ff469470e4b31ec3e20ecbe22ac7425ec7411f66611b62cff65de71788a61f775aaa7b19e4ad8d2ff7b3871fd79fcded5a952ee9b68d0e6ad923d5591fd3322bb8f225bc619b0274db044dbd3f277d99e3e02f91db6a7992e7efa2dfa2bf6f4f7ec59b705b16780628fe80b4f03e775a60d4c2c7bfd7844f62045b6188b4f03fb6b45e4f925d27639feb10ebc9b88a5fc7d82f2bdfabbc252f6d754852bc76d8e06f7ec2af7759a0aee99cd22ff5b2ff71414637ebc0c917ead892f2997bfc7e41e93206efdc4f75045bfa19e7e1b2ae3dfab8a13b9efd43470cfaec3417c0f4f2c7be3684476b6225bf415a78179f111d1ff1591e3bd62dc264dee3bb51e7c9328dee5ef1394efd5dfb17817e1a7c9fdac8e06f7ec2afb28a7827b66bbc8ff37dea8c4fb6e49e25d8e2bcc00ef33f9c7068bff88ecdb146d9f34b94fd55670cfae63007369dbce208e455f6bda58473bc69bb60b787717f02ebbca7da336837b97cd7e772ab2e57732ee8e03f74c2fe1fb69e315bf191fcf362d47fc7e3cb867e1e5c6bf9f26f7953a01dc4bbba19c13153927c6eb953611d82ec61d23809d367e85ad729c364deeb925c66937c9b59a0ff99317ffac6e84cf4b9eea1439056e753a93bfc4725fbf4787cb2f931f1acefbbdd9ffd83ffd78b095ce26f7d322ddc9ddf3f8b9e095ce706798f6e4ee8e7c7eb20c7d22ff7f81fbc60a2ef4a4b46a41dc552d08a65c89fb6f113876bcc27d3e859f5ace0e1e5fe1fe32c499e15ed9578b9da1cedeeebff152e6bbc19638ebdcbb7cf7ff655cde6257edea6f2633891d51ae7e33d795e99da05eea3e9140cbdcfb12ae611effff7aae6911d77e9afbac929fe7beda297626b8d78d3cb4eab697bb7febc2cc17c8f43aea0f52c79e7bc7b5cb68ca75ad61da67f2fcfdff626447c4081f1a3929cd4b867532f968f831d562e2ff187a990c1b549926640ce5c82271cf863999ec960f4a98da58dd42bd7f7bbc473ad9096dd19361d1dd995b108be1b74f6cfd40d93bbfbf5637deb4e14e266f3e7549625a22b04c5e065fc110c484ba75eb64314555fc111d7e3ee497578bf8bdf756f0f78247403d5ef8c547005f1e92effeb1d1fdafc47d798efbff02f773a6e244ae92a75a892bb05a2c653191f539e8eac568326531d4511dea06b58d3a79de920875832abb62a8d93f7a820d1182c974c008a6e908f27ad9425282d52b61f2af09eeb7cb5d12eb79c9bacefd5e57694bcc9475d20e5698ea7936e63cd3b555c9601a6184eb68086731c24d744a36549464fa2182eb62829b1a0aaea7f309dea7bea2567c22cfad814d77558c495bc3eb552c9c0a5eeab3f7e671df665e5fe6ea50e936dc56f07ca910c48e9494d85b9af9f696e6dc5b06036fa9795d313faaaf8b153e2b612569accc739f79cd9549fcd715dc3e56db2de0d267bbb9cb4a511766d660ef4bda33dd6ba1ab5f09af01258a9716bee3a5258f17d6f545a92d16330d740991c54c2b3f09b1259e101b62825b1b0a6e84096e6328b8b1ce49f9f495c53bc44959b1c8ea71a5ae35c5a2f697e8ddc40ed9d6b743b6e30ed93b814306d50c73be26baa8640fdbfb89ca76785436c504773014dc0c13dcd15070734c702743c12d30c19d0d05b7c404773114dc0a13dcd550706b4c703743c16d30c1dd0d05b7c504a71b0a6e8709ee6128b83d26b8a7a1e00e98e05e86823b62827b1b0aeea413cc0a993e7e042728a83a6382fb1a0aee8209ee6728b82b2638c35070378de04c9efb17383baecccee30dd7422ecfacd4eeafe3a32db5d9d86f065f795a73ba61e576775d7432ea03fd44e7003c3ad331c1830c05f7d0f9092fcc17ed403ff13aa41257e693fbc860df3e3284fb48afa43ee2572fcc3f7aeaa291d1cef4138d43f068ec8509ce3214dc1b133cd450701f4cf03043c17d31c1c30d05f7d30966adb96c3f821374cd646085c008c342a0bf2e71f30a75d10e49dcde18db9a24196cf03e05364d224de194c9ebf7fd1324e9d4b57173e3cde3c0ff9e7d66c6b8bafa9c6514cf5968d4c07299013a7f62d13e5ac3298b7162c5cb38f0bf679f7966d7bad53c6d14ee6903b120c7240ab20aa41be4f0e1c3c7050a721016e44e6890cb962d1b27c31546070a72b02e48d685b7b39f845a1f173c0413cc26a7541bb261ca07919e8949dfa526a467e93219de06ce27cd64e225b3dfd6702905eebbc1076cd86c9f810a0aa4b2308e27e90ed58c4bae02966087ea10f2d6fe025284f1fddd135cbd2bb84cd8bfadf665cbb712e31caf4b105a9a399c663747ed7d0fa60d467698cef599734ed0c6b7eaf6e370b71fae8b33de91b26407c6191cbdcde121ec2de229781c4eacb21094aabc47a76fd2d80aa6075f4acbd65cb17f86d4c23ff591d27a1277c69a360f73ce6ccc39279b3ae7084cf21453c92331c9534d258fd2496ec06fab8fa5ffe7fe534d78435cf868ac08dc4d5704b2b7594af3ba03d6b8cdbe3d9d196ebd22d1dc887d78e4cb2fd2f9bc25f96e3a4f4fcbf8df6c147129af4396f29964156286449022770c66cd749d35ac25b18857272bf8387791334d54328384b9932ebfe3ddb087d44a7e976c32a86e2cb0fae8ad9c0d38b75a7c249f449a38b79ca1cb2d796ff224909dec782bd892b446bc31aacf0267f12cd02e9db10c74672c1dccd6a583d63c1d2c722bac8b78ad0ca65ef69c4de22de7b604491763311de6e87468017458c4d34165f559560142df05cb3477d7649a6c278e2099e6ae986973b16c66354f0ca5fc61ac5d1bc4a071589879ba30590f6821cf460b5ce763994b618ae18ec7c2cdc76c2d101385d7f3aa522a61e66061ced385d98c8759c9dff43257e636a9853c01739bf91ab7e9100de6361331b3f6d099e5e89c3281eab93ae9ac1cda53930167b10c78af588ea786330b0f671266c5029d156de3d235cbe38a9d15a294d0cca30c60ef648d1e997c30b1f6e7fda63617926da2d15ead193a58eb7aa19368da6ed0999053306fd907f3967d53f296a998b72cd2794b4bfe43acb6c862a1807f37cf8dad42f177102f99a6f3123e323caf16bd04cef8950da260beb258132d997c20ba63353bfc84c6063beb39e21facd5b784bb5c6a01608eb71be6104b93651f45bc446111c45c9e39c84683eac9744c8f429d1ead801ecb793756a1708ad43598816950a4d3a08d96c42c51c54c5d8b999816cb745a34075ab0d08a8daa88b3b0b08b7561374d5894040977b62e5c56742cd7e4c86cce7835e10b71e173b09c750596b3ae4c2967dd1d83b74a07af8592b3ce70ff5beabe9a6abe3a57173acb574b7456b22ca454c971d4c096e081e561f1b55a135f9180f1958fc5d71a2cbeca528aaf79587cadc5933bec6929e715eb5522db4d35dee663f1568ec55b45eaf1b607166f959a788b068cb73d75c259bcadc3e26d7d4af1b617166f1b74f1e61514b3dd388ac51d2bae96b9d754e36c0116671bb138db947a9ced8dc5d97e9a38ab1330ce166271b63f166707a41467fbe8c261840ff493d6646f6689285e528db77db1783b088bb783538fb74558bc6dd6c45bdd80f1b6188bb743b0783b34a5782bc0881d8611db923ab12598931cae731256fb6019b057f5af509aae41dc622906f3080ce69129c12cc4ec3b4a675f7391080ac46c3fcfdd7380c5416c2cc222f2682c228f493d22976902cbe47369591da9b6da787ed632ebdb766c5390860a131edbda4619dbfa2383378cfc878f35c68a3117394ee722ac6b6b1d9799e7782b039706cc119763e11daf0b0ff64b97297972ea8d8e15980e27e87488efbf92e34393b94794562b2982e8b112cb064ec4b281935836d0326836b04a170eebd23cb9eae558385b1a06ebd22cc18c380533e2d494f2b2522cd24ed3455a071e69de804a394fc6cb9591e958ae364d0c790489bad5ba0c87cfb15f4d9ae1241b78624399eb78e2677fcb3e827c1e766cb9b9c960dee9ae7d5d15dcf21f7d767506cfae8639c987cd6a427b2ca35ba3f31f9608ced424827b032682329d70964ecf720c87fed76292cfd6488e04915cae93cc5cfe1c5d82628b5b4af9a40dafb3653eaff4ace32e1d24e15460d170ae261a0a9b048b864a4cf8791ae1970614be0e137ebe46f8f680c2d763c22fd008ff3ba0f00d98f00b35c2339a0613be11137e9146787e40e19b74c259e172b183142e9738a9142efb6169e1525d5af05a8b534127b0bade3dd72912854d90b4b1bf468b4cbebeaa763752f1b2da92946ab297b99a76af5e3c8cd3170d973bd8fe288975c032f903b078bc42178fcd9c58cdceabd5a65ea73c100bf9ca64212f72d979030ac5559e1424e4837421b30478952601a6370f96000fc6ccba5a6796d7829cc88dc977ffbfca293268256fc6c2be461776070529ae03fb9db96ab0cafa2118e66b75397440cc8762a6b253244d66cf1fa613ccb294ebf5e9b4baf0cb71e15b30243768903c1310c9e118921b0d911c8121b9498b64fcf820488ec4b4be39513630bc0632a0a3b0906fd1850cc71217c5756feece5fe0b5af1432a3a3312d6ed569d1846b91cf47928b79f657ce8ba935ae3e41423d0673c4db348eb8a55530473c16137ebb46787e40e15b315e77e87835d5f09ae3febcce9b4b1d80d8719851776a8cdade3a9851c763c2efd208bf30a0f013306277eb8879f34ce6f22ad0263ea93208a513b1b0eed185c5369959cad3b13781b33285f4731286ee5e0dbab276c1d09d8c09bf4f237c7c40e1a760aceec7e2a544342783533a1533e4015d7aef10cc90d330e1db74e93da0f0d3314a0ffacd1fe5b07d105e6760263da44bed1d8399742626fc615d6a0f28fc2c4cf8231ae1df770a26fc6c4cf8a31ae1db020a3f0713fe9846f8a0cec1849f8bb9d1e33a376aa571239625b2b10256e87b0b67831520e761e63da1316f639760e69d8f097f52237c6a40e11760c29fd208bf33a0f00b31e14f6b84ff1e50f84558ac3fa38b755659a8ac9a3392cb0ba602474e8e0e12d717ebc26535e6671df346c4259851cfe98c82b3cf64e747ea75e64bb1b09fc79351fc02857c3107cefbdbd327880697611a6cd769c06aed70f1141c849bcdfbcbcb79220f9a982fd76891c9f7dfa9fd89d46c1d5df06ea7175c3d5b57f3447da7d38b4ea269d458f85897d315588a7f4993e233d283a5f82b75c259c4bcacb75715fd222efa2a4cef57347a2f0fa8f7d598f05735c2af0c28fc1a0cca6b1a28914050aec5f47e5da3f7e701f5be0ed3fb0d8dded1407a5f8fe9fda646ef063d83e97d0326fc2d8df0d77b04137e239601beadcb0061f65f2a6a2da967ff376161bfa30b5b97fdc30c38955ad4cd9806efea34600d4c380637938f35040bf1162cc4f77421c235792c54af8b2875e2b762a1bfef97f84c43fb6fc334f82099fdebab1ea76effed58e81fea426f93c4fe54c760efd069c146d53eaafa411955fbd8496554ed4eccda4f74d6b6e3d6e6b969c9eba62fa936b766625ce74a108befd269c2869d3e75aa4f8d64c92cc8d4c8bb31333fd399d9b69a99f9ee35deb4d854ef2046de83e9f1b94e8f865c0f9669b17ae32cc7dbbd2d4878f762e17d913c31abe1a63626731fa6c197c92d9ec3c35b1f28bcfbb1f0bef26fb10c37358b1fc092eed758d2fd26a5a4bb0db3f45b3ca39ae8781bfc94572dda63fdd226ed9207755ab09ac7774ef59ac7e801c16a1e0f698467f2bd416b73b45ddd9f3d58b3e77bc7ef5e423f38fa91f664e163cd9e87b1a8f95113351b0346cd2398f7fda4f33ee6dcf1ad62595109e26b8f6261feac0b938ddcb1319722378f96ebeb539d12fb1816f22fba9059e9b4dcfd77a1b393c3e6bcb16bd0b9d98f6391f7ab26f22e1d1c2cf29ec0ccf94de7ac01b47e1213fcbb8e135bb497ee64baff0509e3292c7ffd03cb5fff4c297f7d1ab3e52f9d2ded79fe0a4769d5c560b9fcbe58ec8a186ccb9c6774bab0eebdbf9deadd7bcf3ef3cc2e41baf79ec50cfd074bcab13e4bd8b916c4a0e7b030ffd58519df4f3ac74dc4157c8677f07ed2e73190ff6940b2ed1d8380dc8ea559b6dc514db36ce7c12069f6058c582482b48af2c470ea7251caad70f613ae3784ff1b84db8b9869518d69f9c38299f612263c4d233c2b3b98f097316e7574dc9a706e95bce4662dc75479bd82855a57172a537fadd1a48e57b1f0eae9c263b58ddddd5026f1ff720385f41a16527d2ca412311cca2c0b12d2eb58480d7421b1e2decb8716198f9cbd8185dc5017b297f57b8d88441aa4d69c7853a34b26dfa9bd36d74d4d70efd8dfc1ebbf8d5c642dd5bc0f39f82ca25f34952870acf2fb962e0a19b6261a7daa4fca67aa2092dfc62437d5488e0691fc0ee676cd746ec76a99b1427122afd906ed7479170bb1b92ec4d62089a91d3f6c5d486c17ab203abc87e9d042a743174d624bac4b6ac9ee7d4cab9658b12167b49af4d77c8085da4a176afcb2377de8a959ff21a6476bbfd6a7d277f311166a9ba0d69bf5e07c8ce9d116ab6a494f8cef238ced801324f44fb0d0dbe942efa8490f9816a9d1f814d3a73d4603e64aac002ce05580e2948ae2cfb0d03b607962be5b0ce6b8214f775bdde9cefe2e99030385f839166247cc5e5d885ebb767fbeec2048e85f60a1774ae67bb1ad1166f2b45020a6110509fd4b2cf4ce7e7d0fd32235dffb4aa70f6b1974d1b40c464f0cd632f81a33b66bc4ac17e41b4c70371dc54efcbdd562f08ad14be75534fd56bc159ce1ba80b3afbfc53876d770dc1890e37798b9e93a737b053257dde9345500df63007a68009c382918801f30003d7500d898c3246e946722dc76799e9b93cc48a1b9f923665e2f8d79b70634ef27ccbcde588b8f8dbc7a13de8355057fc6cce8a33163cbd46066fc8209efabeb9d991e4cf8af18a37ec9daaa53b96717023708d651fc1b167286dfb6aa4e83d4b2ebdf315dfaeb74f176f68ea57dd6662e70ff0eb622f30f2ccc01ba30d96d6ae1fc89853310ab88b069e0057c83dfd4fa90fec21c7690c661c70674d8bf31730663357ccf1dca5d6c6ce3ac49bc861974e7de7fb050876039a574d2196252452cdc898eb73a215872f917d32053a741674d7249a4496ac9e63f9d4e2ca56645cc77ce631f680d1eaa33b86942e4418c8a60e10ed385dbce17e8d4f046359a64a633e6b5b9bbec3c27b607706abbcb0eafb223062eb307b3a3fae6af7e42cb76e53560e21834b6dde695b31ce765f7bf03dcffe6cc72b03df64744f41bcefa0913ebae4bd3790bcbeb466af2baca59c1f2ba3a982b8ed2b9623a2f22bc31bc74ae76291f6c62951966d206f737769fee789b0ba48b5c319db7750a78761fc43deb62a68fd6987e6140d3eb61a68fc1325cfc1490a294f281fa98793b69cc7b26a0790d30f376d699d7d5a9def4f06adce9dc2cd6b888cd0f60cf96b9ff9638de2976418c6e88193d5663f4ef018d6e8419bd8bcee8de4a9c2e891b8f19c4e335d65d9a2ef2bf725e7ff79c5e420a56d036c610ecaa41d07b7630044d3004e37408d8dca7c93c659608832a398a125141830dd0202636d569c1caedf19a723be8cea9cd301373927504552f37bd13808298d61c0b7d82df8e204c8bd4caf01618ea893550456a89b96aaec655bbcc09e6aaad3092937424d9519b39ee83399c59ba93c119cad1e8feee1376484925cfaa581f4819272bd329cba8d2f9dc8852671dcfbb2b03e7d7ad31d29335a49d80a4db60a4a7e8faa102926e8b919e8a0d66b1e34a5771a21b38b95809c7c87bfeda3f10bd76980ed3b07e0018bf93f94f257ce7ffa0538bdb636877d3a0fd3e20da0e9859d3b1ec60ae235b8b5ef3379d6707e971e6c697b7418ced88193b43636ceeeec18ced84099fa9115e961f4c78674cf82c8df053030aef82099fad11be2da0f0ae98f0391ae13f0714de0d13bebb46f8eb018577c7bc772e565b88758d31af9dc93353d6282ce33508b9896bb00a513aa6451e5657adde5197589bd48ad61e985ef95807da7cf7cd5cb7609f1d289c9e5838f3b06ee43c3eb236c92d1067060aa91716d27c5d484c428e5b14e407b4a73716ca1e580f1ab62e3848a87db050f7c4ba21a56de929c65b5f2cc4bdb04edd5888a9c6603f2c3b58a0c90e3edf2b5876908119b4b7ce20d6c1a29e80951ed786626d2aaff91fdbb0561db90a627c7f4cbf855846914c3fafb903d725a632303e00d36b1f9d5e038df48a75ae787533f95bd0e1f4811a9d337bbab791c58e4de71ca776c6f1be11bf6b4b1645589f9dd71750339a613d7983b0a4bb5893746fdd3758d21d8c092fd0087f24a0f0213ae1cc5796e830ab821961447026a6f5525dd53ca0d65998f0428d70b7821048f8504c7891ae2abc3898f06198f0651ae19b030a1f8e6556c5bacc8a85ca368eaf709dbed0290ddc879b8d85b65c179a77805e6cbb7a186a6a75b81158f82b74e1b36e5eafa1c93257d623ea2d1c5f2d762991196e100d46621aacc46a09310de082e920618ec2c25c8535b66361eee12c17bdfaa91c0b301a0bb9048f6f6f5730f6b07ad841274a8cc1c22fd585df29cedf92e9919a07ee8425e6d59ac4fc7661b0c4bcb34e387b7f8d9f9cb9312e78acae7ac0662845d8011474d58379e2888a4d7c2650b1186188c98c1d3ccd8adf446fb398f2e655aee37a24ae3094f9ae30ace51586c18e43a82b5685d84517dd6cba6f79d50fca0abf0af78728d7bb32a9dedeba3c96e72d73bcf39e83eb1d641de1ae585a5d8795446c2462897b5bccd36ab09582e3b0d0d6637922acf2991cf53b1e0b79832ee4a1eeed4c9eeb5454f510cafd3fe3871d19fdea47ae2f13eb1dbc26028b2bef9a2eb6fd08be01450ea6ff46ac97081ec71e9f1252df7e6402a6c526ac248f6db6e3353dbd19b7a96b3011d3603fac872156b6ece1948b12254888b95888fbeb421c6fe83905dcb3d788263a4bd1cc87e4b0ca322e33b157f50864dd24ac643c405332b65816ac649cac13ce0abc03fd948c2d71c153b03839c88fe00438a662820fd645761f1ed9dea48a393cdb6695954cbed0baccf176c964d5b94c07eeb4338567606c7c2cd32d084bc4e06eb0cae5342cda366ba26d6bc068db4d279cd53b0ef143772dded49c8ed13dd430da66e804b38ae5617e046fc505cfc4046f89543f706d80a3e19c40f82c2c120fd744e2cf01237136c6fa089d270f37f664b997d6047eade41953a6238fc692bf066b48ccc1001da901b4b03818a0dd314047e9006513034a752baeb918a2a335885e0f88280f43748c990fc557e4e2f3436ff37e3da454b6f6cfc752f0b19a14dc2e600a9e87d1dfaaa19fbf3c18fdf918fde374f447d400fdd851007afea91d15b00706e9780da4ed0121ed89413a4107692c026906470321c58e62f226bb143be5a2069b19d723247753d70393bf06cdf8f6c2909da84136634530640b306427e990ed5acbc8585337d53d19f6c6b09dacc1f644406c0b316ca704292f8261938b3470ef2a0888681f0cd1a91a44b92b8321da1743749a59912af78a8179153c92438f27d5433b1661884ed720da1610d1620cd1193a44237d238208544c72ab0f1c937c2308a6020cd3991a4c635705c3b404c374960ed3985ac6343bf094eba518acb335b0ee0c08ab1083758e0ed64ec6b0d41d2db0ca42ea071b1761b8ced5e0ca2e09866b1986eb3c1dae61c6b85806cf3a04f598e4af41f0146378ced7e0b931209ee5189e0ba82afd7237103da054762a598101ba500368506930402b3140175101921b8660092df86626ab3040176b005d1910500906e8121da0d1355253c2cee6865d10a98de39662a82ed5a0eabd3a18aad518aacb74a876ae255466c3cf6b306097ebfa2603022bc3805da103965923c0d4bd3253edb45d8b81b95203a6c19a6060ca31e15769849705145e8151bf5a477d608d509795fe5469576240aed100f93a20907598f06b751d3f65c184afc7685f47473bf6db645752111f770a427b0306e47a5d274f40201bb13ebc1b347d78ec888f207d789b30cd6fd4f5b5ac0da6f97e5854de14a41d631e952c13f3aa515e31b80a3c0912cdfb633171b3262686048c8903b098b845d77d1330260ec462e256ca2c2cb68d7d2ab40fc280dca6ebac290f06e4600cc8edf8b8766db9a65745611593e58eb7fd4bd0dc7f3386ee0e5d274e40748760e8eea4f425b393820ec580dca5ebaea90806e4300cc8dd7440e039d3a924ae2d18907b745d3201811c8e01b9570764708d00513b5c52817204a6f77d3abda73b8ed8da357e9a8aa7134bb86cbbcbd836062baab44fd74c4bda89bfc1d6616c12be2ee7f6a78bd9fd6c3546fcd41aef776f47ea189b71816c3e12b3f97e9dcd9d9cea137cd8de22e96e8b9d4d6662f6c233315259cb7214a6d1033a8dbaa01a559f0429b5d92985d52a47ebb462b7db226c0b46a5f972dad9bbbfda3cb7bc5a0075f1008ec1cc7e5067b67796f922318faac461e7797a6b0d5704acbb1eab0b97cd3e7a28c236d08a0fb7bae471b8e4ad3ac92cdb7838623635f8384ce5474c553e1e93fca8a9e41330c98f994a3e5127994d587adc0fe60413964ec2547ec254e59331c94f9a4a3e4527992d147aca0f8c040b854ed50966e71d3ded47f00fb8c6a761829f31147c3a26f85943c16760829f33147c26e6c9cf1b7af25998e0ed8682cfc604bf6028f81c4cf08b8682cfc504bf6428f83c4cf0cb8682cfc78a91570c8b910b30c1af1a0abe1043f19a218a8b308d5f37d4f8622c437ec33443be0493fca6a9e44b31c96f994abe0c93fcb6a9e4cb75925915f69d88f959f05760f9f2bb86f9f29598d6efd580d65761b0df37857d3526f90353c9d7e824b3051f1ffa219d830bbe1613fc91a1e0eb30161f9bb2b81ecb933e31cc936ec054fed454e51bb184f2996142b90953f97353956fc61ce30b43c7b8056b767ee947708276e5ad3ac16cb3b2af22e69b95dd8681feda14f4ed18e86f0c41dfa113cc96687deb4770735cf09d188bef4c59dc8525edef0d93f6dd98ca3f98aa7c0f96b47f344cdaf7622c7e3264711fc6e2675316f7632aff62a8f20398cabf9aaabc0d8bbedf0ca3ef418cc5ef862c1ec258fc61cae2614ce53f0d557e0453f92f53951fc5a2ef6fc3e87b0ccb95ff31cc951fc704ff6b28f8090cf27fa6909fc4fc82ed636be2174f612a47a2862a3f8df945d48fca09fce2194c709aa1e06731bfa8e3477002bf780e835cd714f2f3188b7a862cb6632cea1bb2780113dcc050f08b18e486a6905fc2125f23c3c4f732a6726353955fc1fca289a15fbc8a096e6a28f835cc2f9a19fac5eb18e4e6a690dfc0fca285a15fbc89a9dcd254e5b7b0e86b65187d6f632c5a1bb2780763d1c694c5bb98ca6d0d557e0f53b99da9caef63d1d7de30fa3ec054ee60aaf28718e58e86943fc254ee64aaf2c718e5ce86943fc158743164f129c6a2ab298bcf30c9dd4c257f8e51ee6e48f90bace73a3d6ade73fd25a6750f43adbfc2b4ee59035a7f8d09ef5503c2bfc190f43644f22da6759f1ad0fa3b4c78df1a10febd4e38db19b85f949dd9ac0aaf26fa455cf40f18ed0c43da3f623af737d6f927ac5b7840d4bc5bf8674cf8c01a10fe0b267c500d08ff15cb5b079be6adbf619287984afe1d2bc2320d8bb03f3095b34c55fe134b31430d53cc5f98730cab01e7f81be331dc94c73f188f6c431eff622a8f3055f93f4cf24853c9acff4c2b7994a9e4884e322b6046d7400113d50967f343c7f889c301b8e0348cc74ea63cea60927736955c57279939f4584387aea713cc32bb5d0c33bbfa188b5d4d5934c0248f3395dc10933cde5472234c728ea9e4c698e409a6929be824b301db89ee0f698ae42c761c5cba53fd7fd537ae1d8507d95417243bc724d78f37b6c30537c3dc7c92a19b37d7096673e226fb119c604e5c0b2c5ea798c66b4b4cf25453c9ad30c9d34c25b7c6f2bfdd0cf3bf3698634c37748cb6188b19a62cda612c661ab2688fb19865c8a203c662b6298b8e188b39862c3a612aef6eaa72674cf25c53c95d3018798630ba628e916fe818dd3016f34c5974c758cc3764918eb1d8c390450f8cc59ea62c7a622cf63264d14b2798b50e17d440ebb037a6f5de865af7c1402f3405dd1793bc8fa9e47e98e47d4d25676098171962ee8fa9bcd854e5013ac96cca66811f95131ddd85b15862c86210d6505e5a030de5c11ae199bddddb489e4379a248bce45cbebcd73bd29bed795feafec69603b345bc2bdce7894f0929746de8a1e1c059441416fcd48da2283b75a37d350b93e9819d00324447b10fa338af1629e60b99797cf7ffd529905ca6699c65f6657674ac66879fd0ba5445833e1e8a793ca4261b8b8b4c2c812f374ce05958025f6198c08762097c650d24f06198f05535207c3826bca4068467eb84b3aca934517a570360491d0960842e00966a57ebfa28583200feac86538c873312f3c835861e390a135c6628783456375b5b0375b331583a2a374c473b6195860ad34ac3ce98ca95862a8fc5545e67aaf22e98caeb0d55de154bf31b6a20cd8fc3b4de68a8f5784ceb4d35a0750e267cbf1a103e017391fd4d5d642206fb0043d8b9188f036b80c7244ceb830cb59e8c697d700d683d0513beb906844fc5ca81430ccb816958117c680d15c1bb6145f061355b044fc7086d312434032374780d119a89113aa26609cdc2081d6948683626f82843c173b08ce068c38c60772cc73dc634c79d8be502c7d6402e90a713cec6bcb7fae19160cc3b1f037d9c21e879188ee36b00c77c4ceb130cb5de03d3fac41ad07a4f4cf84935207c2f2c299e6c98141760ac4f3164bdb74e305bf570aa1fc109563d2cc4d2f869a6697c1f0cf2e98690f7d5096627a29ee147f0105cf0228cc599a62c16eb24b3f18eb3fca89c60bca30053f96c53959760ae7c8ea12b2fc5543ed754e5424cf279a6928b3018e71bc25886a97c81a9cac53ac9dddddb0bdd1f5a2695dc189f54b11c73e68b0c9d7905a6f2c5a62aafc4e2ef12c3f85b85a97ca9a9ca2598675c66ea19a598e4cb4d25afc6245f612a790de673571afa5c19e61957197ac65a4ce3ab0d352ec7205f630ab9026371ad218b4aac1bf5ba1ae8465d87f1b8de94c77a4cf20da69237e824b3598137ea1ab335322b70a32e48362bf0263f919b6056e0268cd2cda694f6c3fcf116437fdc1f53f95653950fc054becd50e503b1e8bbdd30fa0ec258dc61cae2604cf29da692376392ef32957c08167f771bc6dfa198caf798aa7c18a6f2bd862a6fc132a9fbc832a9c3b120ef270bf2082c613d6098b08ec4627c9b698c1f85497ed054f2d198e4874c251f83497ed854f2b198ff3f62e8ff5b7582d942c747a3a60b1d8fc3747ecc50e7e3b19ad6e33550d33a01d3fa0943ad4fc4b47eb206b43e09d3fa2943ad4fc65cfa6953973e05ebe17ac6b087eb54cca59f3576e9d330cccf19623e1d738ee76bc039cec0846faf01e167623da02f18f6809e85f9c78b86fe7136e61f2f19fbc739987fbc6ce81fe76251f84a0d44e17998f0576b40f8f91892d70c915c8069fd7a0d687d21e6d56f187af545587efaa6697e7a31d617f396615fcc2598e0b70d055f8ab9c63b86ae711906f95d53c8976392df33957c0546f97d43ca57622a7f60aaf25558fc7d68187f57632a7f64aaf23598e48f4d255f8bc1f8c410c67598ca9f9aaa7c3d96837e560339e80d188fcf0d79dc88f1f8c294c74d58c3fc4bb286f9cd58c3fc2bc386f92d18a5af4d29dd8a45ec3786117b1ba6f2b7a62adf8ea9fc9da1ca77602a7f6faaf29d98e41f4c25df85c1f8d110c6dd98ca3f99aa7c0f96307f264b98f76209f317c384791f56ceff6a58cedf8f09fecd50f00398c3fc6ee830db3087f9c3d4611ec454fed350e58730b7f8cbd02d1ec65cfc6f32177f046be3fc63d8c67914f3c47f0d3df131acc2f25f0d54581ec7843b69e6c29fd008cfece7de465638946b06bd035287880354870369b143419984f9fcd4cc22f729fc7b922bb59cafc2636bf23c595252e2b585119759570d33ce2da270e3ab03a3696c75e060fe0595ced82ac227b1a84fab81a87f0acbe5eaa4996e2aaf93cc8e30ae9b265f4ea27682238c9fc1d4ae67aaf6b318edfa3540fb394c78831a10fe3cc6a4a12993ed98e446a6925fc08ac2c6696645e18b58376a9334d36ed497309d9b1aeafc32a67333639d5fc162b0b9690cbe8a496e612af9354c724b53c9af63758b567e623041dde20d4ce5d6a62abf89a9dcc650e5b73095db9aaafc3696d9b5ab81ccee1d4c78fb1a10fe2e26bc430d087f0f03ded114f8fb3ac93ddddb4e7e7c24c1e1ca1f602a773655f9434c721753c91f6192bb9a4afe1893dccd54f22798e4eea6923fc5caac74c332eb33ac35d5c38fe004ada9cf31163d4d597c8149ee652af94b4c726f53c95f6192fb984afe1af38cbe869ef10da6723f5395bfc554ce3054f93b4ce5fea62a7f8f491e602af9070cc64043183f62297b9061cafe096331d894c5cf580138c4b000fc055339d354e55f31ca5986947fc3fc62a8a15ffc8eb11866cae20f4ce5e1862aff89a99c6daaf25f98ca230c55fe1b5379a4a9caff602a8f3254f95f4ce5d1a62aff87a93cc65065d679aa4d7d3b19a6be884e30eb89dfd98fe0043df1519d600679ac29e4344cf22ea692eb60927735955c17933cce54723d4cf27853c9f531c939a6921b609227984a6e88499e682ab9112639d75472634cf22453c94d30c9934d2537c5244f3195dc0c933cd55472734cf23453c92d30c9bb994a6e89499e6e2ab915267986a9e4d698e499a692db609267994a6e8b499e6d2ab91d26798ea9e4f698e4dd4d2577c024cf3595dc11939c672ab9132639df5472674cf23c53c95d30c9f34d2577c524ef612ab91b26794f53c9dd31c97b994a4ec7242f3095dc0393bcb7a9e49e98e485a6927be924b346ca3e868d94de5823655fc3464a1f4ce345861af7c5345e6ca8713f8de0cc0c877ca2ca3cf7d90af7d74dce24feeb0a3ed5836d0e5deeb04da12b9c657c5247299fd681bd2da79fcc74af85ae764c8fc413550afcf0aac4fbad327411c1782d3114dc1f4b464b4d93d100cc290b0d9d7220e69445864e3908d37899a1c683318d8b0d351ea213ccf725f72338c1607226e66f2b0cfd2d0bf3b795a6fe361493bcca54f230cc2f4a0cfd6238e617a5867e918d69bcda50e31198c66b0c351e89797299a1278fc23c79ada1278fc6fcaddcd4dfc6e80ac7feac705cb5430ac7eaf322f716855dcd159015bad8d0cee0ac4c63333833ddbf68f5c56671eea48b77163beb7c39541a1aed3beb04b3dbf5ee0f9d558712ff540ba02eee57637501b0d9301bd2cc67c3ec8209df5803c277c5d2da26d3b4360ecbd0f633ccd0c66359f0fe8659700ec6e20053161330073cb0861c70a22e805eeeed417e9824389b32172b3d0e767fe8a7088ee4a079c76c6789b3d2bd2e757f19e22c72ff5de3e6238b5ca92c3f29e1b928fb8afd925c027b0be6762cb75dc3f316d6d40852884dc2ecdbacb36f046a5faefbdf12f7a56261dd0c579f6230975dd5389135f3dd2fd86cf820764cc6ec384467c73c7ecb66d6cf73c361b9b997b397f2bfa7f19c9d956ecbdc4fbcd26d5ad59b93dc32cfcbfbe772fd8b5c5dd7f3b787084bd8af85aec475dc222637f68d6aab5766aee0246b82c3148cc3a13a0e45c41c2a9d393cfe8b7923b89407cdac2d10a75625a641e92f53314e87e938ed54c5c95b8931c1fda9c2fd611eaf1f95f0f4b042d48216f1545d213e677a05f1fdd453f234cca22d3a8b1610c6fc14e398c7790521b21b46e4701d915dd1bc6d9efbfd146e4799b39ce7d49e9d15dcce45fc9caf92aa5c4e2f6362dc3ba6de3b1db3ec089d6523135a96ef5e3756954ad2a64af1943abf9a815972a4ce92c9a82553b897e9ca59cf1babd7dc55edf3ddbfcb8467e271182f2388a533314b8fd2593a0bc97166716b36704f5a25e201da39dbfd6d354f8bb81d3a56ec6d5d78deb339ae5a05ae14263787b70183583e0bb3fc68cc5b8368e2595f2cfcb6d07d52c16b54ecad59c2d2445e1cc492d99825c7e82cd9bac36a19ac362639153a93451ecc42f05fe27afa0d772d5c94c00ae657eb1c76da612c74ef3cc49acb23e660d48fd551df39616ec7eadb05dc5be2f33ba6b92c9baa97d8f1a5724dd8b43b66d3569d4dd94e7cefcc44cedef30799cfe5bbcff204755d099ba8d601bf0b62c55ccc8ae374560c4e183379a2b614f37199a6d75789a829bdf330bd8fc74a1d2cd4f8b61cb365adfb5181a8136e4aa871a25f6aaa56988f597a82ced2310163a822500cd544ba9987d973a2ce9eb14a59325cbb125be66eecac56168765eec7956eaeb982e7a28571e5abf756e2d2d27b278855f331ab4ed25975bc25e54a1e97b086bf1fa46489f7891d5bb6ec81913f59477e48c2ba8917eff179d724ee6d3227a8499fd913d3fc149de6536b3025e4054c0935114f7b61d69e8ab5e5f0fc13e6d9f378b95fceeb8a456eac1538ac25bf4653ca27ae03a49e432fc02c3b4d67596fdf1e38457860cdd47cf7c6b43c5da765df6a25662cd4f8f43183fb5eb1fbf7f26abac66aa041345d88697a864ed35c45d35898d04ba678532d44be9aefeaaaf3015863c69ed794d7ec835979a61f2bb1dee849496a2ff17548fa3ead7d312bcfc25a8e89eb69d37859b8da2d195754d57282d45852b7641166c9d93a4ba6fbac71cee0a57b459547ce76bd3316873bbaeeb918b3f91c9dcdd37cda3c938fa2b25c5a8e9be079766a16a7daaa28c0ec3d5767ef309f6d3a2ff718ea8c0cd4a28b7d15c482259805e7e92c181ac8025dfe87db965adebf14d3ff7c9dfee37ce5fd396e4da550f4f0eb7c2c78ae9f9a6d85986d1798c74de218a819df2ac2f4bf30d84823ded32beb1405fc99d7ae6175d51237bfafb95c6d1966c745580b34a81d5efd3a075841df1f558c5975b179dea5f3a1e47957d0f4b11cb3e0129d05137da57d3f3d3ab559eb5b81d978a949af61aefbdf3a745c0e2f27e17741ac588959711936f61a3f4ee3cd48cb736328d69a9bcc471b4b93f44924b254951bc4a25598459763795b728bbcfe5c7cb4cdef6f41ec28c1ecb8c24f1aaadecaf3578226ea29aa791b4b311baf34e9fbcde37e55c9475a965a521f5d8d597a95ced2293e2df5d716aeedb6c61accd6abfd79aeded65c5efeb211451be2b30cb3f19a60a3fe3379ec2d776b459ead13799f2eeb0bcc622dd55ab0642d66c9b5fed2a03e9ff137fe924a5e93ba5f9663965ea7b334cb67893dc17da752131f897b61bc6f82685f81697fbdbf5e572fc4203d4c31cbf44f6b2a5e2a31cb6ef0d31f13a49730719f4c6dd61ed76136dfe82736aba7bac98eb7a0ad40e36d783a4b3c0e9d5a99be1eb3ec267fbd6b149651dbbc01b3f966cce69a1aff91a3be9eb717bad6ad767fd5a5e59a6ea56ec46cbe059b8d9d3cd526cb916a33856ec2ecbb5567df24b484f746eb8bb80ecce7e4cc96f8f85be1c891e282b8b7e8e3713fcccedbb0b1cbe4f118ac2fbc3663757fccdadbfdf4adcc033ae5f0f9f46cfc3dd1181f6e039415c48203300beef09fee587f61f074e7f54cfaeb334e3d860ec4ecbb13eb57093e4351ce8a8efd3a91f746e8e6a2a6164b076156dca5b3629f1ab2c2eb65092229e6c5a97f1984cbc11897bb755cfa28deaba639ba91ebcd989ef7a45ebaa9b9e28ecc070fc1ecbb176bf5a5e61bfef346aa19cf876296dea7b33433a59498788d49eab17418a6fbfdd86cdbd4676bb39e15162315bcf6b19acf478b9fc15e33366dc16c7aa0e6f27768d34cfe45650d5b713866c5363f733eb05e9364e5706df7981c8159f920d64a0db64e22967fafe173074ae2629432573812b3ec219d65a3d0da7df52d65e22d63a308e54e6c958b5f29416c390ab3e5616c0cc7ef9a9a785b2aab694965d1d198458f60730782c5ce64fe7bf59c5a4d4514b61d83d9f668b031eb64b155ac19d3c66dd28d8007b1ea58ccaac782b59631ab6c5939b615b3f371aca7a766ecac3e7e9a8aa5a9d5d98fc36c7ec24f9b197a94699b3955ef3c1eb3e0493f631cf87e01c9c7386a7b96e60998a54f99cf1d19e96427b14f178fecab20169c8859f0b4ff96170b3378ff86671ff63c780cd577ff8d44d8ee2193b81c36b37d0eefa1f35274e600f7273ece244f29942b2fe4ee36a5e24e3e671a94bac459c8f9557d84b1b3093109cfb8e8ea451def9f7e1186bd52641f91650ac121627db4ecaff4465bd96afa293c1729e225245b773d83d7af2b1df57c48cc0add6a18f654675d729be44e436c4dca525e0eb3d85de2fa4e7d619194e5921ec848ffaf59fa2c8bd5412256a399ecafc8c014bd29b916cfa579c735ea7ca87d35b2b026a5d3dd1320d70447d85efb8b9ca93c3115f20899e3febd8e57f7938605f3205d5883b900595e2615073b6675e23a7207f326d2f04daddc7fcf6ce538f5eb46b3581c3c4f09aa350735cf9556284637e7f3f85be778b39662ab02c380ada4570cdb764a6ccd3936e6c6b0d9b89bc88cd902ba30e03a77df18ae172871b5e3b8f2dc57ca450e29b195889c90ad492caf6ad98601de017d63f05ea484d786c38b1d229c2f06f564d7074cbc6100f7719318b89728c1b550c079ab83d6840e588ba631602f53026b5cad3090c8c280a9323b86e9154a4c5d34950bb91f92a70a2c37278ad199e2d0140b4dbac640be4a09b2250799cfd179130d61e563269fa0128e24bab9670cd96b94c83a24f5bd094e91e8b1c9e505457128006eed1203f83a25c0a6da9a1b1b4a5d16928ac7eba0d6f6067d71007dcd1b5759150a4c677688617a93be0995e3e65685bcc93f9303f336222a0f5d6523bb710cdb5bb5dbf254db0461aa7c2c1f11c3f6766d566a65920c9b9fdd095a01efd0fb597c8919ef676c3c79634832ff26fd62d8dea5c4568f63f3266f9487040efb47c2798fbe12017d6a2e576193c3e6b98401d5c7ad63a8deafdde497e7ace19d3d4bf9df958e37d5bc3414d80e488f61fb80125ba36aa5630eef370b03a4fc0931481fd2f7c226cadac3806b71ef18ae8f6a3fd72a73bc754d614035be730cd5c7b5d9e7aafa55d86a5b634117e227f4e0a08fa92b8e263adece3ee1684566378f81fbb4761bdb4c009b6e10064c335ac6307d4689a9ad0fff8af5b786015d8b1631749fd30fc2613531ef10a3a29025cf0edd63f0bea084d70aad6a846fe4b2ac4d0cda973ba67e36434ca20f03ae2ded62b8bea22f3b273ade2cb072fe39ab62b0692bb3c52cba7251250903b8190362e0bea61f146195d96522f0e5ca74fea5ce52a1d434c7db42280c004f5d1c03f84ded160deaa8d224fe4b9846949e01234adfeed82a6f6c6bed3080ebd22c06eebbda2d1e547061c0b51c34adbeafdd2a08acbfc5daaa6180766f7a0cda0ff4530c627064995a14ba26fc563060f2237db28478d4196761c0d562480cd74ff465e72227cb89edef19f69adbc7fd63f07edeb1837373b852eb43816d63460cdb2ff44934b6425c8e10c4aab961c0b5e7e218ae5f2971b54f9aa3c98a6d718872b8ada079f55bedcf032a08c96cc68f3bc630fd4e5fd560b37f563970ab8399429182d07449f6de2786ec0f7a6458953687b701c251a11d9bce90d5afab0857977ea6be442c18677c311b2b3a26391b9d32fe94c92be4b2c1e23676969b759aff0917a765549b9e9211601a5e86cf564186afc956198116685497a95b95505d66a201c80c1f2de98c40dd147ede8e0d1464041c95c94830d8951149b4742f23c9cc9b0cdffdf43a666ae7b44e4fe901d86fac54c4b49423ed1929cde2ce08dc4b9761b45241175ee201a30c9ff97946804941ba18d5777b64f85c4e2043f7b3e6319197c894981178759bce7e6c4ea29f7765132923705b3423d09843460a15e90c1fdd091909161ee9620b9b279c81ce9acaf05939cbf0b1b03323c912820c1fadb38c94862c62ebff61811d5bb79fc5d6fffff5fff9d2fc2cb662fd6f062157d45abd7aec3f94f5d86e22dd793b31b01d73fdefa1b2c819a9ead3a59a3e73c56692de6112b226abd3ac615c5d776dc487b1a9d477cf8bc49a08ffd28fedc5a38502d50d6c47bb6690e11ce7c7c054701e1d8de1fccf269c634289f33680d3a96311cea1a1c4790348ec119b700e0b25cea700cea84d38878712e7a700679a4d38b34389b30ec83bebd88473442871760038ebda84736428718e0538ebd9847354287196039cf52971b296b917a8d753874cc3ab3964eda890b1fe5b89ac0125b22e1a0fc48f0499e6948a4e8c45949e4886f508e0890d6b236117a3491baacf5a4084edf38654380f0095a24636e11c1d4a9c2b00cec636e11c114a9ced01ce2636e1cc0e25ce9f4191d4d4269ca34289731ef0ce6636e11c194a9c990067739b700e0d25cee341626f6113cee1a1c4f920c0d9d2269cc34289f33c80b31525cef64ee2f679fc46f2c3dca2880ce60f5430bb8036516b9b60127a2619cc8e00661b9b608e0821cc7600665b9b60668710666b00b39d4d3009fb91c860d60530dbdb0473580861fe03aaee1d6c8239348430ff04303bda04332b84307f00303bd904734c0861f6047966679b608e0e21ccee0066174a98ed92c08cefea20ac652ea442f92440d99512255b7350e6a8b38ac33a42c9a4486cdd28b1b5151ee881aa70d423e93cd5bde3ce080b99ba54208f06854c774a909d3449193fa9d65b5b433a6f38870ae90b00697a6d74b761be09c5b1fc319bb287a83e15ce2500670f9b708e0825cefd00ce9e36e124edbf24c3390ae0ec6513cee1a1c43915e0ec6d13ceac50e26c0e70f6b109e7d050e2ec0d70f6dd91ed1e1567f8508e04ed9e7e9428db24f1cc09eedfec2f528c8d234418df72621833762446692929c6ad54de381324ecfeb5d13be42f9f249daa4596b46f023e39c02698612c726e063007da04937014920ce66500e6209b6012f65c92c1bc11c01c6c134cc251483298970098436c8249383e4e06f3520033d32698841dc46430cf0530b36c8219c656cf4500e6509b60128e4292c1bc05c01c66134cc2f1713298b70298c3776cd786278a2d3b251d52bb9c0ae595a03199bd2351c64f3508e314985301ca119428d9e8f83a8ed0dbfb8eed8215ded1f16620318fa4c426d7efe213fea1c01c876db4c6262090f6122da1c23a17601d458995c55f9983ef6248866e0015baee00dd684a74e9c2234bdc974a7899cdf62e98c81372a5e36d5e98789703c27c926c8f8345a0377d4c6d1439feaa42616cef8c069eba1325ca8e494aefeafb6a91d62cc97cb3635a0ce8ceb601256cf7d06db703808eb50d2861b94e06b42500ba8b6d40c3581cb5004077b50d6818f7306a0d808eb30d28617f3b19d05600e878db80128e0691016d0b80e6d8069470ac920c681b0074826d400947d2c980b6074027da0694709e0719d07600682e2550ff5b8f7bdbeeb386e9322eae94b6115a4935adab1f403b89badfb3549c1a014f95984dd9efd992ca23d91a13896df28eed0609fb20c6fe00e5941d398891ebb093509608948495f7a22811ca19a0736e6a6df67db223182a782ee99d7ae189fb5f9b493c1de09d4689b7299a572e73ff0d5f6ed91924f1dd28c1053fdf228cd5a18b801f4eb70927e9eeae6438ef063867d88493744b3d329c778291f49936e124dd698b0ce7cb00e72c9b7092ee504886f3378073b64d38c3d9326f08f2ce3936e124ddca990c67378073779b70926e964b867321c039d7269ca45b3993e1dc0470e651e24cfdb006c20e10b239744d01d67c4aacc1368c225d384d368ff37350becfb30966187779fd18c09c6f13cc30eef2fa3e80b9874d30c3b8cbeb5b00e69e36c10ce32eafaf02987bd904338cbbbcbe02602eb009661877797d1ec0dcdb2698615ce2f20c80b9d0269861dce5f51b00731f9b60867197d72f01cc7d7724ccf8d174d2644e369ebe2b684e2eb2092661014406733c80b9d826988455233298390066814d30092bed64307301cc2536c1246c4e92c19c0c602eb5092661470719cc290066a14d3009bbe0c860ce05308b6c8249d8394c06731e80b9cc269884957632987b0098c536c1246c4e92c1dc13c05c4e0933d8391784b54cb2732e2e00285750a26ce4deb05d3c0adcc07378fb7b85b3defd217c03bb594e0cd9ca1de97d50dca250ee6ef43af0be55942859d0ebf88ff9eeed46f763325843a860f5047e5742094bcecf90f3d54bdd570b7971513def63f544d289042f52e1fc1e74a395d6064e2c19e70b26796e7872b22019ce62aad5143341525e4d8933f9de46507db8b711a1978e8810618d022f5d4389952d67a87005ac765f827b1a4d74e0163d6400c956533402b966192540b91ab2d259eeb063bc16551d9954c811caeb04f7e5e5ee47eb1db6fa87154ac475c7c654681f0068d7eed88a106cd384b179380ce49ee5b5d13cf47b143c61ad92ec20f88dc02f2b6c8249e89964303700989536c124ecec2583590960aeb30926e1300419cc0a0073bd4d30093b7bc960ae073037d804937018820ce63a0073a34d3009271590c19c00606eb209266173920ce62e00e67e36c124ecf22083b906c0dcdf2698848d493298ab00cc036a03e652073b782efcfb0e97019807da04338cdb90ae05300fa284e9ff4844cade22aa9eccb701c68377244669292946b22311f34187f0e61d99b4d5d1c7301e89f837f0c9436c8219c62311ff01300fb50966188f44fc03c03ccc2698613c12f14f00738b4d30c37824e26f00e6e136c10ce39188bf039847d804338c4784fc04601e6913cc306edff82b8079944d30c37824e2bf00e6d136c10ce3a44107b4808ea184d9dda93eedc0ff9c8e619470c9e674dc0f26221c6b335cc26c800cee7d00ee569be11216586470d301dce36c864b58b52283db15c03dde66b8848d0032b8cb01dc136c861bc6498a8b01dc136d864bd8b14206f76200f7249be112760192c15d0be09e6c335cc2ce6a32b85700b8a7d80c977058850cee2500eea994701bb8376c6353b6a02bbcc782b77562b84ea3c4a53bb0c9bf2f8631993f08fa0a4ea7449bfa89eb84099cecc4f522e0b167502770b9fc30df09ebcacdde00d79994b8d8b161ece712feca1c872dda5ae6bec826e0842ff1d605d8cea2c4d649932fea77d09e58059734e18ea242fa302899cfa6441aec40fa300e2a8f03de790e25caa61c6599fb232b30d89acc092e0b76b615fb9b0cdc242a70c301b8736bbbba8327eb52a78cfb6a117f9b7446f25aaa39766783eace799468e59a76ffcb08c338c17b1dc079be4d38478712e75280f3029b708e0825cec600e78536e1cc0e25ce6f41b174914d38478512e72ce09d17db8473642871f603382fb10927e97eb064388f0189fd529b700e0f25ce6b01cecb6cc2493a204c86f32c80f3727b5b48845370c85a48cd4107c815b5d1219c1cad7a2a1b616708d910c6bd00eb95b5dd55e70d61e439b9ce746782fb22eb9f96c31ae5fc0dc2f94c3954486f0725fe559448db3a89bbea3cd5bd8dfe0841926df4770dc84dafb6056418774cbc1c80bcc61690847392c8405e07405e5b1bd5257fbdf00c681857241d0e72caeb6cc2991d4a9c7b029cd7db847344287196009c37d88493743e2719ce0100e78d36e11c1e4a9ce301ce9b6cc299154a9cf500ce9b6dc249bac32c19ceee00e72d9438836db51fc6ad2ece042df45b6bc3333194d5b73b276c0b916d773e04e0bccda6849e1dca359dcb4042bfdd269c234289f36080f30e9b70922e8a25c33906e0bcd3269cc34389737780f32e9b70668512675b80f36e9b70921e2e4686b32fc0790f25cee6ee8d37ab73a9c3565bb099c5de991bf94e5867baf77262f0eea58427472ee519456b5d1245fcbfc2aa511fdc37c3b8bbcd5ea0c6791f25da74056d994b628513ec381332bc648b0d9a01bcf753e20db6450be939ac74253cc8061eb0096618f7559c07606eb3096618f7559c09603e6813cc302e819905603e6413cc30f6754e07301fb6096618f7559c01603e6213cc30d63ca702988fda04338cfb2aee06603e6613cc30eeabb81780f9b84d30c3d8f1b10f80f90475c7c722de0a5f542575116f681638e5fc25327864dbf2cf00bd464f52c20b761626617b87ec2ccca1a025fe546d7474f89b4b3cc7892dc0ce71355841db8fb4886a06fc29c0539fa6c4cbf6ee602f2f735f09efe63c6d40aef80c25aea6c21b59c0cbb82f4ad9ec2866327075a9c03900dcb33b32479ced7eb2d2fd6b292fb50973c41fa8506e0349f6394a94669b9591567bc83a7edb83e2e6799be18671c7e33600ee769be18671c8e20d902dbc6033dc30ee78fc1280fba2cd70c3b8e3f1bb00ee4b36c30de38ec76f03b82fdb0c378c3b1e7f02e0be6233dc30ee78fc2180fbaacd70c3b8156a3d50157bcd66b861dcf1f877e0b9afd706dcd8e49c58af141355c005eb96cb921f0dbd900aeef5c073dfb0192e6123820cee6800f74d9be1123622c8e0f60270dfa2846bb6b377186bb917801cf76dea7ed942f7870af7c1123eac5208b6012603378a0adc002706ee1d7b7d328c5d894f029f7c97126d6a1b5613b6b7c8bcf51e9083be571ba308d808ffbcda2a8cc876151b0512fefbb59df0fdef2a4688966c57b11341c2ff80126db2c5b513dc4fd7f042ca5b5a3b9ab24e3a8eca530f0589fe439b70921ee54b86f34680f3239b70920ebb90e1bc1a24f68f6dc2497a6e2719ce4700ce4f6cc2393c94383f00383fb509677628713a20effccc269c234289b315c0f9b94d38478612677f80f30b9b708e0a25ce5280f34b4a9cad1c3803dab39f757c543ab5340f9a6cf2ee614e0ce157b5e191fe4fa0211c11256bb36f00a5f9d736e11c1d4a9c4500e73736e11c114a9c2d01ce6f6dc2991d4a9cdf83bcf33b9b708e0a25ce39c03bbfb709e7c850e21c0470fe60134ed2b94e64388f0589fd479b700e0f25ceeb01ce9f6cc2392c9438cf06387fa6c42917d6fa5bbc931dcae53b65a059f98b4d300967da91c15c0960fe6a134cc2d17532984500e66f36c124cc33c9602e01307fb70926e10a1132980b00cc3f6c824938578e0ce67c00f34f9b6012761293c1cc0730ffb20926e1c41932987300ccbf6d824938fd900ce67e00e63f36c1245cb94c06b302c0fc971266b2ed0be2bb3a08db3f64b3e09f0328ffa34499dae1908475cd1c2aa4cf82ce38b68587357b7e938ea3936d7d7518c019b109276915890ce77c80336a134ed24933643857029c6936e1249d704886b33fc059c7269ca4130ec9708e0338ebda84332b9438eb009cf56cc219ceed563b009cf52971063b412e8c7b2acf02d5f8069428e1fea010682dcc8b235b1ab833f0c38694f064dbdc5fb21e19cae3255e7062301bd904338cc74bbc0c6036b60966188f977816c06c6213cc301e2ff11c80d9d42698613c5ee24900b3994d30c358157a1ac06c6e13cc301e2ff12880d9c22698616cef3c0660b6b40966188f977805c06c6513cc301e2ff12a80d97ac7b6c43d51de0909846539d922abaf4063b2cd8e44193fd01bc6a931a703946da93b35d6f11f9992657cb1df449edc9918b676920c5e4b2a780d40926e4709af8b936cd2351498e3fe55cef79623ed685b42857501c0da9e126b5b879d40ccbcafb82af03cfeaa770e71d8fdb32100d9c19e7c328c738b9e06f964474a9466bbc685711bfff301da4e94685976cd3e5ee3ca0bef813c8d41a2ee5c1b89da5fa53c8c7d423b03945d2851764c923f56df186a18652e49b68144ddb418d0aeb601256c819301ad038076b30d6818b738f9050ce276b70d2861ef2519d09f00d074db8012b67ec880fe0980f6b00d2861294f06f47700b4a76d4009c725c980fe0b80f6b20d28e1a83919d0bf01d0deb601259cd34106340d549bfad8069470c61119d02800da977e24689d2bad909f88e17d382741275df8608e746230fbedd8167cd847822e06283376640f672eef825b225012b68cd896052428b34121d49f12656a873710b68d46517967138074406dcc65f75b0c8d0e65efd23500e7409b708e0925ce6700ce4136e1243d479b0ce703601863b04d38c3d995fc0ec039c4269cc34389f35f8033d3269ca45b4d90e16c01f2ce2c9b708e0825cebe00e7509b70924e3524c3b90ce01c6613ce51a1c47930c039bc36a679c92342bdf9727ef6f0206c1de55061bd061449d9b53da5c6ff796c843df464e7b19d0bd08eb0290320dd369f2c0338066400236dc2497aa80319ce3b00ce5136e124dd499b0ce74d20b18fb609673807e39e0338c7d88493746372329c9f019c3bd9849374935d329cf541deb9b34d38494f7021c3d909e01c6b134ed2e5ff643827009cbbd88493f40417329ceb00ce5da967c6b381b60237f0f0ce8c674bcc24ae7194b8ba6abc4fdfa06466c0c90aa443c303a8c0e6013f1c6f2b58c22e1032b0510036a7367a96fc819de67e54e03e219e154296111c08b04ea88d75ebfed6bd0da79c4b47b6f26d1c8039d12698613cbd65170033d72698613cbd65670073924d30c3787acb180073b24d30c3787a4b168039c5269861dca262208039d52698613cbd2503c09c6613cc309eded21bc0dccd269861dc6161128039dd2698613cbd652280398312662f0d4cbf63eb709f1ac2e45f9946047927b028662625e4de4efcbc9052deabe9b5d0cb9d20fb83106226db1fe451e0cbb376e41a8f98eac443c56427113d0e50cea644d9c4bd2970ad2fe4be3733ce5fc3e7814ca4c43687125b6707eefc2eaf93b98042edeca4455cc9ca10ce51da0d0c0cef6e4fb226ac3a9125eb7741b29ebb231714c6579dc258a57f0824f5bcda5e05977c9e27610732d93ccfd74042cfa7449aae54930ac4f57fbb7af42b48fcf36c3a30279c27181c09bc75be4d3849e72b91e15c0870ee61134ed2f94a6438cb00ce3d6dc2493ad7930c6736c0b9974d3849c790c8704e003817d884332b94381b019c7bdb8493b4f3830c670f8073a13d47e185f1c8925b00ca7d2851f671e2abf465eeff598731ecf7d4b597e680f772dcaf56d0cebc5b44d549f233a8dcef1b16d0841e4d06fa7d007a1125e83649328709eedfec2fdabdbca930ae02181753626ce4787b79b33dc2d6b97fe5bb0f373a84fda043c88a252786aca0363c0f2be5639e47d90d42e5796f028c4b7624c6aaac8a12e3562a6f5c06302eb5e79422c2bc906c6fba2f4025a9d09ed337c2386be93480b2c8ce837608133bd9413bd340625f561b3b30c8da65253a4b249f035dcd732226ae94d6632ba98aa351606e483125daa6ee0d0b94496395a1d91c63781771b5023eb99c1a9c6ce5b01798a039dcf78a9c301ef69401c0adb0e75c98301e099e0350aeb46bfbe870eeefd51fe486ab6c031ac673617a02a025b6010de3b9309d01d052db8086f15c984e00e86adb8086f15c98ae00e81adb8086f15c982e0068996d40c3782e4c770074ad6d40c3b8ff473700b4dc36a0613c17a607005a611bd0309e0b930e8056da73944918bb8b8f706228d7d973940961c94e7694c934300ab99e1265338172a8b388bf5accefcadc9fcbf92be1ebfa780278e186da987384f7b443f5d956a78489ba2115ce723070b1d1269ca343897311c0b9c9269ca49d1e6438eb039cfbd984333b94385f0279e7fe36e11c154a9c9380771e6013ce91a1c4d915e03cd0269c434389f31090d80fb20927e9be346438af02380fb60927e931f76438cf003837d7460b28eb7fa60574284077884d7b188f0e6597db65a02d7ea84d38c78412e73680f3309b700e0d25cebb41a5688b4d38c379eefaeb00e7e136e124dd7a970ce71f00e71136e1cc0e25ce4620ef3cd2269c211d4c03388fb209e7c850e22c00388fb609e7a850e2dc1fe03c8612677327360654c6a7602f0f7d1b683a28788edd91c3baf1fd4484f3e0c8f6e66a0d506eb5f38807c2e44db64c2002261e1c4789b59fc643e337949ae8b06df94af9df0cf33a2e7292b3def136e9cbe7d4e47c78421f3e830af66a2706fb787bb6ea23ec9823cb0ece03c5d209b6a024ede32443b90bc8024edc117b23c85543ffeb3bccad013e7b526d74260ffb9fe94cfe1ae49c27dbb3e70ce1921732948f002f3c6547b68ff205933cee99ab69e7c81553cd91db0de03cb536d6feb27611cb2f83e496a4653c597e790748f4a7d5c64906f8a45898e8494fcc224bf6270098a7db04338c0b5b4f0430cfb0096618f7933b1ac03cd32698846b87c8606e0530cfb2092661d94eb787318079b64d3009d75d92c13c0ac03cc7269861dc38f26000f35c9b6012d633c9606e0630cfb30966189b97a70098e7db049370bf0f3298a7039817d8b38b1c214ab26581c3413bfd427bfc7274281b935f02bfbcc82698616c4c7e03605e6c13cc3036263f07302fb10966181b935f009897da04338c8dc94f01cccb6c8219c6c6e46700e6e536c10c6363f26300f30a9b6086b131f9098079a54d30c3d898fc0ec0bcca2698616c4cfe00605e4d09b3bb831dc9e867ac92b4db836cac72049844738dcd70c33810fc2368bb5f6b33dc30ce4afa0cc0bdce66b884f55432b8bd41b670bdcd70095b5464701d00f7069be112b6fdc9e00e04706fb4192e612f1519dcbe00ee4d36c325ec4f25833b1cc0bdd966b8843dff64700703b8b750c26dab810b057aaab3b3b1492783d7a502390180bc95fa9c2de683f084c1dddc27de1aa6c2b8e76418c9ce1b1c089685dd4689b1b3c61ff16561f98e778c1ea96f921da5b72f6812dc6e2354c2462c19d45300d43b6c844ad80420837a16807a676dccbe4fadac0f631df52e90b3de65e7597184ed2ab2b3e20a9c18d6bb29b1f6d0782c53a292fbe46ab70ec016d89629a8e3376d232cbcc8b66c8b02c0f750026ee1de14b8d617f2843eccc9756d5be37eeacd929aed2c73ff25c34776fc595780ef5e7b8e3f0be35c945d01cafba88fe05b2120b295744bb9ff6de0653c61a59e0c5c2600773f25b8060e3bbb9005bb3ec4473db603b81eb069cfcf3194e3a46405c8a1a0e2b3cd269ca4c3ce6438d7009c0fda8493f40848329c9d01ce876cc2991d4a9c6900e7c336e11c154a9c7b039c8fd884736428710e03381fb509e7d050e23c1554941eb30927e9ea24329cdb01cec76dc2392c94382f04389fa0c4d9c4a97e62bbec060e5f17705f80ed49ea5d95d456f64cf72f4f6018dbd94300baa7ec397590b0af876c79e1f300e5d3b53d10a11fdd99e8b0fd14cb38726f0745d2319eb55443bc67814ad0333615336328719215339500e7b336e1245dd64586b300e07cce269ca4878993e16c08703e6f13ceec50e2fc0a144bdb6dc2392a9438a701ef7cc1269c234389b31bc0f9a24d38878612e71690d85fb20927e9f202329c57039c2fdb84735828719e0970be521b6b393198b3dd4f56ba7f2de52d22d2434e7ea082f90098f7f6aa4d3009e7b493c1bc0bc07ccd269884f3dbc860de0e60be6e134cc25e253298b702986fd80493702d2619cc1b00cc376d8249589a93c1bc16c07ccb2698844b03c8605e0560be6d134cc2f9bf64302f0530dfb10926e1982419cc1700cc776d8249b8470819cc0701ccf776e46e9ee19fe4ff3440f93ef5d46a2669359fe6cf3eca73592c714af9801b19b81c2a70439d18b80fec3c468fb0a24e3605fb66e08f1fd606d62cfe7f799dcc05143a53c46bf1b9a55cf74386956c31ca64d041fc1125d6be4efcd1644b9cea8bf8feb70f271b07d6a37f4c89ba932663f0d0e639b9ce7417289b52535485bb9cbf41d84622cb6b1f03defb496d7420fb5b4a3594b6fd4e365be90880f3539b70668712e70280f3339b708e0825ced500e7e736e11c164a9cc301ce2f6cc219cec3777200ce2f6dc299154a9c0d00ceaf6cc239349438d301ceafed39dd358c5bf6ef031aa2df50a24c77d4c39cd7b9affdafb7922e029efaad3d07f28471c6fc7700e57794289b0b944315a0b5701e36d99cf8b100def73bd20fe37b9ac238c67e0540f9436de698853c1f2ce02c581ee9894b542085f1708901a040fa71c76f18c93a3f484bf617a940be0c40fe640b48c2044f06f24500f2675b40124e5b2003b91580fcc5169084792419c81f4111f4ab2d20091b926420cf061ef99b2d2009872ec8409e0a40fe4eddc1c15e9eefbe52c27724f416aeaee662d833d6c229778d2873d52be0c190e11c478533db89e1fcc3de6d4ac378c2c6f520effc93126dc724497e82fbe91aeead6c7300af6f9370ca1799af7e0892fe5fb601259cf64506f40300f46fdb8012d63bc9806e0740ffb10d2861fd930ce8f300e8bfb601252c94c880be0a80fe671b50c2fa2819d0570050a79e6540097b93c880be0180466c034ad8ab4406f43500346a1b50c225ae6440df0340d36c034ab8cc950ce85b00681d4aa0ba199ef81655255c106937c9282aa45b00d2ba9448836d961fc6d38927393194f528517675e287e19802653c71573a33ddcf0a9da26a19c026fe17ed9405aaa1e262e0a3f529c19aed4c475844918dc25f08fa9e1a50a2edeea8936d6267b64de4dd77abab6509317348fd76215586f036f0db869470e51c3bbfe53fe93e7564a5ff510067239b7092eea24886f31680b3b14d3849b7ae22c3791dc8499bd8849374af25329c4f009c4d6dc249ba131819ce8f00ce6636e124dd94920c671ac83b9bdb849374cb54329c6d01ce1636e124ddd9860ce74e00674b9b70926e994a867335c0d98a126723f766ad6b7d11ffafd0b52cac271af47162c85ad78607fadff09cb0954eb657c841a0f46e6313ced1a1c4b90ae06c6b13ce11a1c4d911e06c6713ceec50e2fc05e49ded6dc2392a9438f700ded9c1269ca4dbf692e1cc02383bda84736828719e04127b279b700e0f25ce8701cece36e11c164a9ce7039c5d287106db3b91b49a44b64af334d08cec6a13cc306e787e1280d9cd269861dcf0fc0400b3bb4d30c3b818fb380033dd269861dcf0fc5800b3874d30c3b8e1f96100664f9b608671c3f34300cc5e36c10ce386e7070098bd6d8219c60dcfcf0730fbd804338c1b9e9f0360f6ad8de9b118ccf8ae0ec22a3bd96cb86701ca7e9428e56e492ce0651ca494bd5abc42068f6c6e71c489c1cbb027518f0e657b271b6c14dddf2698616cef0c033007d804338ced9d4100e6409b6086b1bd3300c01c6413cc30b677fa0098836d8219c6f64e2f0073486daf634b7e520161999e4385743b1897ccac8d911ff68abf930a082beb64f5cd6300ce2c9b70668712e7628073a84d3849477fc870ae073887d984735828718e043887db8473782871e6029cd936e1245df44f86b319c039c2269ca4dd7064387b019c232971f676f42b7ed9cb4c680eafc2af70d63bd557abc72f1b08e386544782dece519498fdede3293b8ec3d76dfc13f0d7d1b6800ce36af45b01c831b68024eca42303f90b00b9932d20093be8c840fe0c40ee6c0b48c2ce0f329095a0b0196b0b48c2c10c32907f018fdcc5169084935dc9409e083c72575b408671d4fc7800729c2d2009a7c590813c03801c6f0b48c2293164204f07207376e49498f8f638610588ac2d3e0aa09c4089b2b57bb3de899d4f90c75f63fbc4952b67159041243b619d3d911027d6c6c8a4bffea170f6acdf0760e6da0493b0124406f37e0073924d3009abe66430ef013027db04338c67acde0b604eb10966184bf13b01cca936c10ce341ca770398d36c8219c6932b6f033077b30926e1400419ccdb01cce936c1246c4492c1dc0660ceb0096618371e7f04c09cb9635be49e28ef486fc2e287ec48ef6f4107f02c4a94addc1be691739cd83ed8331cb660a532ee1919c2451122844300c2d9b531b9358bff7fa6fb7895fb78b6b3c159cdd1cd140a15b8e28a1cb92288703b3db2047e3848e0737664028f9f7c1dc615166700efdcbd360e69a874963b6cc20b769240be53cea7b954b8499f092ba59d5e504995ec770160e752826deade6ce0509900399b689a28e1c9c0b5a3f2c88e2071e75182ebe224dbb3080acc71ff2ae7c51069dffa122aacf301d6fcdac02ae7b955ba3f94f322877965ae76f467a4934d9bcceb5261dd192c5d994789355dc1ba94e792f18315c9ce1108dfb4c1cbc188d07c7b8e630a637b7d0cc800f6b0ebf4b5e1a13c56b93948fa7bda06348cc72a370340f7b20d681873cffa00e802db808671167b3d00746fdb8086f158e58600e842db8086f170860600e83eb6010de3b1ca8d01d07d6d031ac663951b01a08b6c031ac663959b02a08b6d031ac663959b00a005769cafaaeb1525ac9192f58a6600b44b766c7b3eec4373cf3831944b77e42048aec38eab5d22501256eb8ba2442807835ea6c2daec1b65738ee7bb3f96f013ae128d2d85715b9ff120b117d9773c3d61fe398a0ae906e0a9cb76e4b6536a7f6818272a8e04fe596c13cc30cead7b1378e6729b6086b1af7e08f0cc15b539aa54e6be5ac1f3cd15bce2e4894b04388cbe9a097c75656d96f7ebf88b7ef69c23f4da1c2aac3783290fabec6837b1f2be947b35bb5bcdab52849d266ba9da4de700b425361d614bbae331590bff64900194da84734c2871de0970aeb609e7d050e2bc0d24f63536e11c164a9c2f029c6536e10ce780c8af00e7daffd7dd9d40c755957100bf432da424695a5ad616286069e89634cd5a6ba5a4b47a0e9c44138e7a2acb9049433569c24c1252965a1414a505a9a22828c85a1004dc1059d42214eb5e54162d050ac8525617c482f5de3b3379ff496632c991ffcbf7414f4bf2b699f77bf7ddf7de7df7fbae24ce4a959c055077c62571522339699c5380332189b35a25e78781b35b12678d4ace5ee0ec617216da5fa226482819b47bea6bf39c6502b4de309ed6f33f56baddf8905d291d4a437c5aa7f5b3ef83b278869ca19c3466407c0028fbc218caa9dc37d5458d0ba63939f573dc2fa4af316e19dc4fae66e215b84ad7cf745fb2cbfe4c8c7d2b6171ed09b5e199724e5b8d99bbb6c1697b96bc614788a4b426e0e5407a36fb2d90dbd22afbe1c995969ab86fec3dcefe1bb5531bfc8d4fdc6fd465f6d277b75801a7fa399232bd539f6568179a0be042b3461227b5e182c67912707e5a12a7ce145409e05c2b8993dae84be3ac02ce732571521b7d699cf5c0f919499ce52a398b80f3b39238a92fcc689c8703e77961743c089258a46fd9631e38fdff63ecc2a7d9957a8deb46e31e3ac94d1b852cda2d26a03d9f493bd9e46b005eed7fa2f6382a64f5df5809cf459f0bab85a8c32e1633ad61b5106d6595c18d50063f1f4619cc555ba6f7941a30b08ec5d807b5e4054cc6bded2fee65438b4f4015539c8ba6184ade179864e38df1cdb96ef5a48003d3fcd66636d07d31ecce80c3bf2a13e3d368d7e47be144be300cda2095cfbb3d6b571974bc5e2727df8cc6d4f9474305b05e56586ab5ca6c1ef3a06c5e240d5463368f7200bd581aa8c66c1e8b00f44bd2403566f3a805d04ba4816a4c3eb118403730418b8ccb67dcd57f2b9f308d9ece65e8d477c73903aee55f0ea3bd32774ece13323a1ed4312f3ce3589ca7c30dfc572471d6aae43c11382f95c4491d2583c6391638bf2a89b35225e756a83bbf2689b34625e702289d9749e2a43e03d138a702e7d7257152b320d038d7c0c9fe0d499cd47c9b34ce1b80f372499c152a392f05ce2be406e8139341d302f4ebe1c1f29b328354888dc8b417709be0bdf9b798acb3b2b06217edf9594a6a22a3c3761054b0d46ec53de7c7b82f4168210677c03dc19572420c8894b410832ba0fc5e2585927af1a2512e841af6dbf2a23588a48b59a437c3897e3593748ac97c918c63af0f959793884acbcb793da05ec34f8416f36fdedb5257fd36d3685c184c5bffd7c1a1edf5b5d7579900f35a26a6bbe7767de47afca9adb7c75211805d37ba635f6207068dc3d55f05d7eeeb4733f74173caa4c99750f2504e6dac24bb55c07983a43eef952a470c8ec16566a3244e9d03309f039c374ae2ac50c9590b9c3749e2a48e8c45e36c00ceef48e22c57c9b90f70de2c89939a4781c6391d386f0937fc2a7bcbe7b2d40aa1a5d09fc8a2fda40968bf2b37b28d1992c5a25d0db4b78691b07c78954085cacede71c0bc4d12a6c607cf3301f3764998c41e9f34cc9580f93d49981a03ad3b00f3fb9230350e3fd206983f9084490c3da0619e06983f9484a9717c8c5301f3479230358ee51203cc3b24616a7cd43c1b307f2c0993d86789d7e609987732318f3099af7f5df799a8498e1858ef81dde63a07bdf8181875a431c8b0055e7bfc4403b2c6d0d89b00f9aed17deb89dd17884ff2b4ee0bb381f2ee30420e47d2215c63a7dbf3a075f41e76ea1fd78121e69be62acc12bb6f9dbe67882b8d0d86d89d81d6fe39152e51f78ee6899dd9944c3cb169a3b1de05e5f0a74cca99592887d39536d94ba9137e3ad6c4fd252bcebdf6ef318644fe20d4a53f939b0387d812456bbdbf1b4af3cfc3e86f9ffb32851b5cec4b6cd4cea58e33782a8bf524a86f37b1738475f88eb46e0371c53dee0e00b2fbd82905b0e36c283d3b67b2d80e01b65fc8ad1b898d24b4baf13ea81bef9737ee3ab15eac6191de0e57f207d88900ddca2e19a0eb8b1cda2806b456a63970a26f668f79d5db7fefd8681772d7616aed483b85c700da8392025feb983522ed197c2dd488bf94c459ab92b30338b748e2a4f63da6711e049cbf92c449ed194fe3dc0575e7af2571d6a8e4fc3894cedf48e2ac56c9390f387f2b8993daf798c6b9014ef6df49e2a4061ad0383703e7ef257152bb2bd038af04ce3fc84db8427ce54b4bb87219d4a35b258d4c4dcda1487b83be161a381e92c449cdf049e3bc0538ff2889931aab41e3bc114ef63f49e2a4f6efa4716e02ce3f4be2a466a9a3716e07ce8725715213a6d2387703e7239238a9e97c699c13e152f4a8244e9d8346cc00cec7247152d3f9d238db81f32f921e38eb98dd62680f9caba1eefcab24ce5a959c6dc0b94d1227758c6b1ae764e07c5c12277504761ae7eb26e0dc2e89b34625e747a0743e2189b35a25e71ce07c521227758c6b1ae77a38d99f92c4491dd09ec6792b70ee90c4494d0c40e3bc1c389f0e232e331766669c460d33ff072d5263173c133d23095363d8cb9b80f9ac244ce2694ec37c0330ff260993d8a79886f91a603e27099398ff8386f932603e2f099398998686b913305f908449eca840c37c16305f9484496c2ea6613e04983b256112f37fd0307703e64b9230895dbd68986f03e6cb4ccc7dcdd09969325f62d02069e3bc4c8076a357a440124b240db218205f950249bc82d3201b4c00f99a14488d43382d05c8d7a540129f7668901f05c8bf4b81243ee9d0209b00f21f5220892d4334c89301f29f522089ad4234c8e500f92f2990c456741ae46e807c430a24b1059d06792740fe5bdec08bc4ebf76216e966b8357f93495a6e329342f6e44c75927b348d7a33306208b31c11ef43bb5979b9ea6028d1ff8c66c3c7e0d8217d3d38af85b2bc4b1226b1f18386791d60be25095363dfe20b01f36d49981a53ecae07ccff4ac2243e76d2302f02ccdd923089375334cc8b01d3a5b11283497cfca4615e0298114998c446111ae606c0dc431226f13194867935608e9184496c1ca1615e0398ef6162ba0c79abfc6c97edb51d1241d2d06a58684799006d2c136da4c386522329698921cf8532b8a7244e6ad8348db30938f792c4490d9be60d28069c059238750e29560a9ce3247152534ed0381701e7de9238a963b4d03823c0592889939aae87c6b91f70163139f30fc7849c1a87af6d806e85c54ccac9794a667a4fa98ceb588c6741891c1fc6c3e3f04e706a4815ad4c3e6102cc1249981a07fb7e12302748c2d4585b3e0e981325616a1cec7b3b60ee230953e360df8f02e62449981a07fbde06989325616abc597f1830f79584a971b0ef4700733f49981a07fb7e0a30f79784a971b0ef1d8079c0e83e932737951c22997863441b223902cfe4078e266566dca4c68412b7c173f9414cca6926b3236ccc777a8d7a0b77d227373774639cbe93fe835052a73079dd709eee43ddd61caadee13c27423d3955cec9ad3124fa7e38b90f6652fe7f437c126fda69e303ae03da43c228a5c3bb35d2f830b9104ef843999407a728bb6d095c6912232aa3c43b4e5a196d07d8695261358eefdb02b087498525560534d846803d5c2a2cb1f59306bb0c608f900a4bbcc1a7c12e01d8f74a85d57883b50060a74b8525beefa4c19e02b0474a8525be95a7c17e026067488525b651d1603f06b0a55261896feb69b0cd007b1413f64033d2f8cc792aa3875f85e6be99d24035c6b6bf02a0b3a4816a8c227e1a40674b03d518e3be0340e74803d5184dfc1c80ce9506aa31d6fd19002d9306aa31aaf805002d9706aa31e6fd79009d270d546374f14b005a210d5463ecfb8b003a9f1dae9db00f973d6685fde3e0f4bec99f6402b44a26daa126b36f49b79d11b7abb6da9f9a531e43f58122de77d2fa40ed8417d0554cdc6c490173e7a94ba616a0be7da2a517381f4ef26a39eff435f61cad8753bf268c78cee15e806a5536836c8492592b89b34e25e716e0ac93c4a9b391ee1eb8142d90c459a192f331e07c9f24cef92a39df02ce8592382b55721642ddf97e499c552a39a703e722499cd52a3963c0f901499cd400301ae71ae03c9a1dbe90b01b5865176af28bc4ec64628eba992cb269c691ed3576c0c6970eda78f269d9959016930e8249d8e9cb4cab7f9a767a2df6f7e3cc4abfd629f6ee70b9fd3332e713ed9f6cd3239112fb8d8e357da6cb4f75db8bf96d77d8b9ee9b254cf91cb777eeb01f993aeca5be7daa3775783a4da35dce65a177dfb6345264e7457d867bb737c7fb921ff5cd30e9b92dfd2d048df66fa75961977402a591023bb7c77f3b47de657feeb65327f94f73ebf4f8e38b45a3de8b75fbedb4db654bb26c61e0326ea4882eff5b5bff011b6a9b137314cb81cb15f8e5baed6f5dfded75a59171fed39c881b342198ee0abb5368319ff2eac19c22bf0fab72cc2d48ad17cd989a8efc497fcfc173ba4c664c5069a478c09c065fe282f9b95b2193dfc295b715f6f7cca96e1b7d199f5390f26eb54731732fbb5225a73d55ba33bfb54b55992ce3f101dffa0cdf35c7cd19bc66915fb3c7cf6df6c738d9c0d7d0bf76f6b96e1f93e52728bd156649966d4cc8b34c724b454394dad2c8f83c65b0346765989ed3ed8f992b55cd29f1525f11254b7f30ada4dfb9c5b80e4bee1b25b7142c53e0553afdf460aafb9cd3edf65afddf18ccc976ec32e7ba7320a8cf1a7d2dd0eacf92e22ceb06f35da519f1675c536adf8f37ad7e5f637e7fa3f673a2b66e72d26573ed62916afb4fb283d6dcfeae597353a36574a47e4b4fcfbf4d574b0ebdb5635c5518c97e056c7fc7eaf77c7b94bc24b9f557a48e6cc24fcdb7a7f9f72ff7b5a26888a35256e68ec5bb79ffebdd714f1d765f4cf7f715e409f6c82737ee4efd78ead472ff8dfd1f7d2889eafabe0600 serializedProgramBytesString: - serializedSignature: dc4a3c73b3f06483c7da7d0bfa65224ae97efa3c0271fb9eeb4155409ccc72c6e16bc738d94e92205574aebf27004429d36fe7513e71b5698167d532306b9d09 + serializedSignature: 42b240541363939a98a57d47f89238a6594ed3b1ebb040fe92f17b3bce054339af98ba55c6a704ebe4abc91b4aa81d18d9006b9c57c4d2610113b3da1061a408 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset b/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset index be6ce42..053a533 100644 --- a/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset +++ b/Assets/SerializedUdonPrograms/f105e1f1c6b2fe14786ff87c06b7adf4.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5c59531b47109e05842410374288cb029bd8f1810438ce6d9bc3871cc00e201ee2a430068189b9228ed8a954e53d4fa9ca6b7e445efd43fc1ff22f92eede5934da9dd9033442104bc5ceee1c3ddd5f1f73ec889a34838f71132e4b6c9e4db11196636b6c97edc0dd14a4dbf0359facfc67ac00e9065c57a0ec264b79b4c4cf55a31bae5978da6707d0f290ad42ba49e50b2c0ff759689b8727cc5d87bf3cd432eaa0518e4db3a76c8e258cb80789256ab4cff30c94cb88c07592bd85d23c31859da4a92801970528d9a7b26d60daaaf79cfd40626d43d92ab429b02da0f9922846fea86174c3cc24c4d35a9ed6f334c6ef7b846794e63e6ff3c6d6ae89d7ef159e310ddbe8f5d9e8fdc59f812b1645fef8bdd8b6999789fdb5d8fa6b16f2316de5e5fdc233f457f3ab8d8ed5ae9dd71f109e31ed10fab6b0e914f23a843c4cdb78bd4bc233f46bfca3e8376eeb37ced3084fbb78794a78c634c1f307856711338b8fa1523e6a16157c74dbf8e8e6691d4f9382cc56da20d4c1b6976d341b85672cbfc24cdbf95ba6f39041def218ec7785edb13419c1c7ccbf5b5b2dbd1d1a49d7e3053f57a9db03709d3d2020f1aa1cf9ec011b676352af4a1a3181ef29baae408d4d223aecece29da30b646e0bbe792124ec43fe238a28181436a16484cd408aad5eb05170f2e7362a4bd0ed1684953c5b84eb1ed17b016c3b6b7a8984e1c3de661e689ad16d1b722c40f7e0798b385ca0eb11719a27eeb3907740b17607a2ed24a46fa837a7ec05b897f5b9c82193f3280f72aa7c33945a6a9a066990fb34f9c1078d9c854610fafa61ee8675698a34bf3b34f1014333c860e0cc721aa30499519237c6d23496cf3b100c2ea35342b97d9b78df61b75d65912383eaee25098a1a3e6c4f657f8bbf7f172a156d9ca569e8edf310cd0d58a477cde8725070172114aacb20a376f80d19fc34f42e54107eb3de26d50bae807a1a994a1560e074660e2a3c83bf4d627b1f6225b2f59acd42b51df8db20861d3acad4f3e9c735c920eac5aa0ae81a19d0914a03ed1d59dc808e1ccb55041a3f7204a30a04bd785021582b43906670afb52298833c730af4804a3769dc2cd2dca567eccd5aaeb8b5401c6769f97348bcb823de702c7311f13465e26a512f678d7cb24b9f7048aee41829593f332aa3a8931845067d17976db76cc885a23611b0a28270484638c2d7007627f8173e0ee25135f17a992937563a183c0567fb914f0c8307831619c0521b69550402affe553a0fcbd08b9dcd94e1648114d7b009df81b4dd75c40f1a46232a8fe9900da3a8e5557858e108aec1808a4f6f0937dc2a0ae2545199e66883e517ad9af35a799b4822bd755af19af4e618ee65fd4c98be861875c4e3d722d429d0e4e1c0c71adddd1270b7a55f62096a6b889335dc65defb093aa552595783cababa64d685aa9f00fa6b80ce21f4bd413c5acbd42096d528eb17634242e26ab45d6827deae261e93992ded0d2d5630e060d92e51c1d96bf0a0831b6137eca626b7b124d958b743386f165476d1a4d24f8f2a1406d04fb38a786f1988b7a888f7958178ab8c388ad32f55969d72524db94d4579e0b494db65de40287d5fe1206edd4d42db5720cc11058e43682f0b60eede81dbdcfea63329728e94340007e348e52c1d3284c954d6b522ac9a90db276ae55bdf0cfa467d8850bfced40b8dd370a9d244a7cc8b501397658cdb9d6848ed4471196174a22b7e08a7d484bb648471741cf643b8554d38a18a831f95210e76abe0b87a4a389232c2b4b7e387b0cb84a3474518dff438263ad336bf156d75842dc377177c76192cf52768b04283295a2e96a8dab9959496950edb41a4ec5549795d26e5b04dca09f0b3022d164c19cdc9e5329ba129e706dcbf72f05a5cd404e1b34fc5e70d199f13363e8b7d06d145b1953abf5c7ae857c977f3e4f2cdd078b00f13ff57c4cf59ca37a092ef964cbe31176fb2dbdc236e737e6510690591e0924a8211990439e538a68a0c592a755aa437157f75caa5c9940a87b40c87ef98358bb2e644e22253b680cd1ed72c2e5de7498a3cc87544b545cd979e9159a245ee265c5f927476b9c5ddfd7259c6a00a918c1fdb9e22594db92c8b58843c7f165c9ee83aa492605426c194afe8a3b2e7b38a409755328ec964fc53a3dd2e50e91a503c24b990ae6ad306eb07e3c3cff68f9b4ff8b5b4257aef166c7bf08a4a07e3321ddcf36567e6f612da97b9a9747a1bf3f2a1307c0d03a7dc0fa86601da8a6f21d3b434cf30d9fa517e20087bdf06acd1b2178f6397f726dd6da63e1ee45c499ef4a4c8c9b621b352e9fc6fa73a4fc584b944162d409ab62a2e9aa49fa056f9c1475693a6cd821b27b4266f2eee606fb5721b0afe76dc24304763311040fda07b6584b027db09f6ecd7eb55d22d22601dab28c34939343633b414f8341a3fe8fa36e20fcb667d273b32e1f493168a4c6fe8956c81e8add9fd86b63daa8df34f45bbbfe6db768ae1581e4633188e3ffb9f47ca0ca2f93982d06305960c06962f747a7f17d7a03930ee4025b7e945c6deff690e51454be241ab1fe14e1213ba282698507e59092857b92dbacfe1344219d605654480f22b9d50f64aacd2cf027a541fa843ba40ed1440fdba1a41d568a9da40ed1040bdab13d47189d3eb580c6a54425c9712a28212eee9544213570276bc4e766dd1c6d5af36e042ba80630270f7750237200909a5d6ab7e99ba0c02698336a50bda6e01da89b39c0de44a763734ba775417942101cac9eab5528d73026d561a17a09d3a4b2b3dffd3ff7a01cae94a40a95a499dffe97f5280f2814e28072550166822842ebdc39ef0dfdb5db4885a2300fc5027c0710ef0169d2b46a0d51bef1a816cd70564b300e4239d40b630d5cc738757397f6e6e08e03dae8415aa22a668851a47716d56d8220099ad1620cfa33b3709403ea9162035ae7eb401991080fc462790c1f642353ab7b628d9204039a3134a347efca1baf57b9f05a88c4ce409586dc0c57401572b00375b0967c69753fb92975258b6479b6cd8e0fc59609d00e45c25805439f3791fa71b05209f560b90e7719c0e0b403ed30964c2639c2e3d82a615cca42e30630298df5613981a5d5c1b98ad0298f3d504a6c659a43630db043017748279ba8d5f8d4e9fd2056d3bbb300798329d0458c97921f7b9ac794aa88dcbba0365b30c37fd5680f60aa5c5134369faf1161e8c0b72e4ce9da6f7719e9c288e4d475b65d351398e28c9243dcd71a5988b56d2f47bb78b2cff122bf9372ce150820eb3e540f326713c3351606bc4147e42ff015f7df5224a540000 serializedProgramBytesString: - serializedSignature: 187fa9139f4151e175a5f274c35bb6368c8cd0bf0dcf3a3409b4942b0fbbfbcc200a8f3ce35fdd10de3729e93c02acdd8f847f92dbc6a9c77a028e8594ea3d07 + serializedSignature: 72478d728c1b07f74aca0a51e40d725df162b3cc5398c117f9193500e822f80ab577d9b102048e3b14622e778bb80100feeb34375038e468dee4c6feb7e0ea00 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset b/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset index 5a5861d..23cfba4 100644 --- a/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset +++ b/Assets/SerializedUdonPrograms/f7a1ccc48a868c847b387484c6bec599.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9ce9521b4710806705ba2c40200e81c1c4ce6539b691001f712edb086ce3f80ad78f38298c41c44a84204876d97984bc51aaf218798c3c40fe25ddbdb3d0da9dd99590062462a9d895e6e8e9fe7aa667767645282be0655d81c39a581279312556c596d81565f89487f30ebced6f4efa33b10fe79fe0b8017957c4f9809af8ba688dc27111be5544156abe169b702e52feb228c0e745a85b806f98ba0d7f0528657543a555312f9e8a27226d0d078858a34a159966a15d560c8e73e21de41648296c244b5969382c434e85f2764069a7dc73f12399b503799b50675f9440e64b92189b0f09fa20ec53549e23f2dc057f71f9392ccfbd2c2d26cf7d2cad97a5e1b947ca1b63df91c49fac0d3c271572fb595a92a5f9c825d770b94efd0159fe2cfb8ee794c2c6942c3b2ebf87649998fccc5975cbf39042ff619636c4d2f03ce8d27f50eaff974bff1185dc344b1b61693e72433997dc5126c3b1e10c2b8332265cf909997e4ec5256c510f7f007d6e43ec892c81ba24ea1f8a4ecde04188a22378c0d7456ab60add7d0f042846c22a8db3aa981533ca913066f530bdf374dc801245123ae96de20f4f13a85c09de05368c2b907e9fa2000ee422e44c894770c65a2fc4340ccce72e296bd06c09424141acc0718fe4bd00b5bd25834cc221efaeb30432ed88b403290ed03df85e220d97e9f886342d90f68b9056a5f85886083907e7b7d49ad7f67df8ac6a73452253eba80e4cba743bfc396e9a076b50fb2cf5e7f71e39098f50989894c3b03b4b51e2778f27de33b4830c4e2e8b52c63421b36ad2664496e69f250fc1c66df45aa8eedf36ef1be29aaf2d6a32e8ee71b2e0d0c3b713ff94defd1dd90fd79a362bb2b4a4980830cd0f2ccacb58231e09fe2684c3dd3954d48ddf52e1a7297df918f1dbe58a54ae7107446866aa75002d7f9e408167f05724b52be23bcaaa1cc44127e639a67bbc958bc8054e46319d0629ad431e52218f1d37f2e018e3873c7660d721727ca909c635048374d011ec5211a435dc0f46097a1763cea739a8fb0a48bca19ef51aeaab166ffe4c71d179d5c554cd33413ccf2b97948d69a423dcad209c43c23d2a25e32e25513f8de0b0ca75b4dcde32eaba15f1585ee2e2b455809c2aa460ad57327d159644d82111d32a48b057bdbad2feaeecaddb957de4ca0c1c5bada1ceb5119d6b934dba36aa128c81a25f112cfe859747785c2f3ca6ea3789e30e9a4f2128fd2c97d28d07cd81ba7b454a133083dad7f93cae720dfa6b50357562effdd53555ae506f2ba9ba4454efb533ba768754eda232ebf0cec19fbb7d4cc7ab517b7baa111d123a1d86553aa4990e790aa0d8270a9ea5c333ca2940b54674e951f5624a5c39c65e8c79bb24056d68bc1fe3daf3b27bf25777e43475e4518f71c12ae8ba72af0a21256e1b457818701728b748eef70e495d3907de63daae7c4d1af8631ead3b5c8c11e5cf8430a2a5ce137daa81859e385bcf4432a61f25499de0f12605f7eb044f34297840251803cfb97a04a7f48253bae035598f609f4834a8128c91e803e5e0764b4eeb250fe9209f6f12f2b04ef08526058fe8047fd8a4e0b44ef0474d0a1e5509c649fee37a04fbace1c674fded13a1982c57b51187c79b299a507721eeaed3f55e8126f70d8af3580f7383a5d45766bd2696d6ce328d0c8fb33a0e9faa387c2f9c2b31e7ba8a6fd2dbd7b838d36cd3763ace348b07251760feb1ef902d911505b0eb0d95b6b9e13e6dd575776e8d16424538be24ebdc76f39d09771ee7d50891711d918b2a22b704bfa0f1bf9cb1edac909deb24fbadc2977e36add11ecf5643f64ce8ecc9a8ec2918f4f072d31ed6f9b7159ccee9385dd24504939cca50360f4da14528f7b04eebfa4b14de968541728124ef434dbe8b98a5854f4ea8765fd437f4b0ed1df00bc6a295039f06dfdec3159deef69e77b57bd43b3d4156a8bc36c5fcc6ad0bb6497f572b2a2d726401695a099e364b2f73af86b2b428bd7cc4de14ac053e0312e952f7a1c6f7b46d014f284681001c09ced5f2a29c9e8b726aff0d0a04b617b4a171950438b7435a70871b3bd95d00b54597391578e32b1a0ee5d00f574dc2c285df538a82b6803c15db14bfc0b7ad8e4075c54254d1b04bf8bd960dd0a3dd15f286922405efb7a01ea65609b02bb4d0255bbb693ec543432670786502fad4e14ca69e8172d840f67f3ec9e4b0b3e06c1e19736232c5826993b160447ad65e5394a190df2a2ee76ebf99fbc7f19a3891aac7b8a3c48a011656678e03e5a6ec8b55df85a04194515328e30ce5ac4994b85d6f63b477414b729fd418b2842964dd0cd93593c870cbcc7daf621e32abf0d779d8ba18b6eb26b18d2be25f3dfb3b37cd411d330535cda0de6847a8373a10ea08837ab31da15eef40a8c30ceae7ed08f55a07421d62506fb523d4d90e84dacfa07ed18e50673a106a9241fdb21da14e7720d43e06f5ab76846af08ac818d45e06f56b93507b25546c789b903ab28bde3dbbd6810b9b022718b86f4c820bba2ae7ca1bed83715328a30ce5ed934459bbc16170e231b6c1916028ef981ecece0d66e761b05d8a89a8b231707da6c08519b8bb27d9073b7fbf32c650ce1d074addd66fe7ef57a618cabc4994f53f30dc795b71110671de24c40b8afe884a54e9472365f150fec0f4b4cddf210678c124e0a4d0ad21cbb248e70d718bc1bb7792134f6db4347881680ce51986f2be4994ce4f1b74134fedd392460775da14cc1e06f3413bc134d8338dc11c6430174dc29c54c0ac7d8a50ffab46a3fdd4d8ec3e2a4ecd933439bcd3ff90778f8cef5dd18cf6367326e0facc7e9c6540322a838cc7b44ed9009d6cd9878fb664e9971378bbad91c7eafc65063f77f22d62b0d4a3a4d432dfb6e2591a95a5cd3c57d3e3e3952cfdd8e434dbff48d8ff0f885ed84dd3f4d4d52a78de168e9baefbf46faaf6a94cf83f71c4e403a24b0000 serializedProgramBytesString: - serializedSignature: fd2e2f5b7fcdba7a8d1c62378d47f169817f69511b393a0e79f807b6b25314bd9016188048d9adbd3df2fe70aa2d3b7f5807bb594c78f37a6518a470b328810c + serializedSignature: ceec90241cb7371cd3d75358064f3341361029de1588c3d4c015e6486c7027895df99cf9efa7094a78c94313b0f3e35a91e387362e8ab51a52e137a28d14370c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset b/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset index 5d2dad4..70468da 100644 --- a/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset +++ b/Assets/SerializedUdonPrograms/f9280f40c34dba44d856803aa60215d7.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5ae9521b47109e153a4120b00cc23121388e6339065680e3dc4901263629dbb800f1c749610cc22816829204b1f30879863c44fee63df2007980fccccf5425ddbdb3d2eceeccae5630c2104ba53de6e8e9fefa9a431193c1c79884cb065b658b6c9a15d90e3b6055785a84fb3e7cad37bbfc09abc1fd055cb7a06e924d04f4c4cf4d6314aecbf056670de879c4b6e15ea6fa355682e765e85b82372cdd855f095a1951e85464f7d80a7bcc72c67000890dea54e76506ca6524e1bac05e436d8998c2414caacac1650d6aea54b70f4cdbed9eb21f48ac7da8db863e3556019acf8962f237b81a2413dde2fc9ee0f734fc52fcb987dffb79bb21a18d5d8ef7015e7f497847c9ffe4ef497ecf4868dbb406398dacf06e08ed33bcfeb2ab5faff08ef588710c7e633e72454f2697f1ab8b8eddcfe6312bbce3bd8f978fb4c9fbdfbc3cc27946fc223183ace901e8778b1d32132b8d5b21ccdeee196cf0483a1eb16c042c1f876d80691d020189d515c9a61b6c8ecd4aadee8a9116f85ea4eb16b42813d19c7788df3d43207315f8960497a943f97df238749a32d44cb38770c75ecfd80c38c15317950d18b6026e5762eb703d247acf806d6fcb2091d0bddc7d5681a6e5fdfb5062037a08ef15e2708daec7c46989b85f86b206c5a22a44a305b8bfa2d1bcb2d7e05936e63a874ccea33c08a8caad5063abe91e4883dc9be4a76f3572161a41e8e339ee865193a2cd2f1e4dbcc5d00a32183897398d1982cc7094cd32135f8d550f82e165f44a28b76f0befbbec8eaf2c726450dd57498296867f4aff33b0f7c7cf7fc59ca2cd3193d2f85880687ec022bdbc31e2a1e02f422c162d20a36ef80d19fc948ad7ba08bfd5ae4cedc22b204e99c9a9000353f9439aac3538730da8ac421af5e8a410e7d38fbc246906b1a60236220336d96d608323891fb0c9a65c2d60f1234730a54030880715823d32046966f8522b824528b3a63c4b545ba63cd9a27940ef389a3d7df7eb81383ea2e5c011f1e28f786f53e616e22615e2ea492f67f6e4973e89985cc96952b27e66544611951845018da25f825ca197b5d606b658299758289162b0986ab08c6ab0c1ce078bcb06430f1c9278e1bff0f1104fa9892764bed4773659b6b358844bbb5cdbb128eb9b24c346a2a40cbd74b763f90a70f823b3e6f1e1f1c3e5f8940b3f3976c38a381e34be0abd94ccb0d1204764791bb1de83870a84025c82d63063bb2d3da1b6f45ed96868e9398901e1ecc7433cab26dea7126554260a5ac82a2919a721e264a41e4aa4b44aa42b2a9f082152bf8af83ba7407c40e63834e27a171d07eb0e880a4e00c3bbce55e0f5b61b09b9ef8c91ef8c7a840b6641e53d19198484ebf75a21f46e3cd94f0bd0770fe438a6dd8423e82fdba8f287f4ddb6a3d138213ac164db67e13852213c28f30044f83d19936eeb1f575bff902a5a4cc8a2c50d973ae7410cdcf87e0d226cc2f705c58f4d8a23a8ae06888ce5629f567a0b135f2ea9f8bc26e373dec5676b4c8bcf0330388bcb3a7cd74931551f4ed5e5ce1aa70b85912fab92ef7d997cb32ef9c4b4e7d6c97dae93766510698591e0b24a82eb32094a4d67b14d5fdc33b6b8c340b04bbbbba8a7e566cb2570226bd6be4a7c96c0a58ea9f534970625761ecc6c509a2ec3f539e9c72db5b88456e3e1eeb50123944326ff61154e1fc870faa62d4b9e071e7668dd626d9e9edc923bf3d211956c3764b21535db4095a667472413d26df5f1d77e181d27e06bd046ce1251ae41cf27d403dfeacca4dc5890a606f9c90a8ebd0f36877164bd69afc1e72c1f32f539cbae270d77bae51e24854c6bd382de44e98265521f2f24b844362d409a72e44593f4266a959fb0b28849e9fa7687d614cc451e47eb91db50f86d478bc0638abf4000573dada586bd6eaa078f13b4a89b2202f67ef4291c31a2715921b5c6a708f841577711fff6d4acadb3bd66af5f642812bda2bdad1ad1db71fb094da5de34ce6f89769e57da4a2bdccac36401e5ffe87f1e090b18093148c487ecc051c0a7499dde8d1b0015e63ecbd8662fbd1e7e9293a594c3d7d3ed08d289bf47c9df2dd8a674c28633269c716c73bb6bf8ce4c0afaa04ce88232254039ad13ca7e0e250ebc0b4d369bb471faa60db8982ee098009c7996365874ac1334da604a17947101ca824e28c73994d6f4bf4a56e85ce2a8f7833621b16883765c17b48302b4336769a5ce75ba462b1dd60565528072562794d724565aa3dc8d765865dff1ff6b5db4301011009ed309f03007b8028d2a04b47adf452390595d40a60520efe80432a3cce955dee4fc4d880c01bc8fbb6185a29b5f242bec1780bc7b96a9c73949d798c5b5d9649f00e5273aa1c481c465a2721be81c2c126302689fea04cdbdb6163798cf1f6c3d026c9f7523fea9dc568c7f1a9d565bfceb1580fcfc4d01f23c26928400e4173a81cc056464e7f9b15630c77481392080f9a54e304fb6d6d608adb6b576865d985388029e427c259a47de37cd796bc50de6bccfbcc23a3218e21855a1c7236ab705b55b746f1d1f98f4370c9c4b86395ff3a719bcb7ff3513ce3e5cbaad9c9a6e4fe3bc4226e949ce2ed23e5a31e90f2517597efc6f87f047ec442c47665c04cd5bc44b6c858c1899c24fec3fe86a614fa03c0000 serializedProgramBytesString: - serializedSignature: b18ad1e8346f312dccd4f934fc1bd2acec92297c0c66c08a713a465dab75035339faefabbc0195f2f5b12bc106053fad387c29947a9fe409164e97023d1f510e + serializedSignature: c62245b4c761550227bac75e7f0ccafdb30a30b15e7d5d94d65a6178449faebb73cabb13b1db0d61e83b62646a43e18610bf7e6a305f71c1872fff81722fc201 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset b/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset index c3f81dd..77d9f71 100644 --- a/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset +++ b/Assets/SerializedUdonPrograms/f98b98e1a8b77a647991c7d172a7025d.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5add76db44109e752ccb0e29495a92505a20e5a7750fa5525b4eafb8a109a529d0f8c4716e0a277513a5c760bbc6369cf00abc0f171c1e861bde03be1949b62cad24dbb512126a1feb677f6667be6f767667939c45f8a85bb8ecd10e6dd06daad121bda4369e36706fe1ebbef9e515eae2fe02d73aea6ed17a4a4ffedc506fe3ba85b71ef5d1f3673ac0bd21f55572f0bc85be0edeb8f4083f07ad541e9d6ab449dbf484d6d44a8a883de9d4f3ca14dba58ab83ea05f51eb88523c8825556bb85451d393ba1694f6db3da5efc5ac16ea0ed0a74b4dc87c2e128b57b9afd824b79277cf79cf3c5ece50a2f923c8aa53872cae54372780d8ef990e2e8b2ee45c7d80320fdb87191d08d0585813fcfa748fee6a2dbcac16027a6fc8b58e160d113a1f1de28fc810ac5c135f27404f0fe55f09bb4c500335b7e91bdcb9d733ba03c09f86a4ec61d82628766817d78ec87b06b5a32dd34c622ac37d7620d3f5b4164a7c403b786f8a8655b9fe229a3aa2fd16cafae2f76d78fe03dc8f65b4a8ed5d3cebc6dcf520d3eba877b8b872d7ad7d9a36610d6b6fcdb19bbd66e4341861e80bf3de34cc5b3c47d46f11265e63e806194302b92be38e1b4a47caee92c5af6a2782e0e436462dd4fbb78bf77dfa2cd1163d324cf715b160c8f0ef7f7ffee8afce9f1563d4b47b6415d8b4ab29a62501cbf2ca6a352221d904c3c8dbac68187ea583dfe4c2ea09c2efb66b48bbc90928c8ca344a80ba88d75d3c1ce3d744e30aae75746f7a716e136f7dfc220cd92cce1490a34b689aa27130e77430174f1ae6f4b89204737160d71066fee8112cc52098a6431c82731a046da6695ec7bee8550ae9c5ad63a4e775fc944e270a4dc7ce1bd0736d6c76161283c8a4dc1871dc5c980537051d37ccbafa2e536efcad7715b1e26bd4d5d1de91759ccb6b828a9f2cb865a32d93f97a7360d5101a8b4954eb815461dab1177947e26d48c834f44eb0244e308be1e21cc3d4390653b7acb1de66eb2f86140ffbc952bc9f14757ec28eae6aa7b494c5a592c99e7149e7193c93d4e5c4f5286eb4b7c6f18515f185e9068863bfa4639f595ad5ac24ffe013619b251826be4ab1737c299c75a16005c337e4ad47964c259bc64fb0d9c41614e7cc68171a3c17d6d3d36d5ecde2d2eda30874d3665e6956b8319afb1f497aeeefe675d6a5db149f659a9e45be2c20cd61e5dc59ca675305ef508772164718f5c994de94ae054fb1c29cde8726df6fba029ec8591c04f04cde97ee7534e9a7cbdf868c1f3cde74f23f15017e3a3283132676aa2f00cca184ba1ebe6e54328d90f08733f3b2e9528de87c589408740cf55e0ab80e8c08cd0f59d6fe6b9abf13f4ef72c44786e1551f166d0eaf57fee791cf66f2396b1f1cf3e46c0e14ef66399b2f0853fb32538ed0647f20bb018342a3bdca91426964961be39832fd4c77817b2f4be0563de00e3ccfebe3392830a8fc3ed9d94159ca0aca5200caf7b38492f7cf9dd0d1895f99196c6656b0cd05605bcf12b6a206b6cce05aca0aae4200ae6b59c275cd9bb0ee96be2db18e95e803912ede1f7b7fe4386fd3381700f8832c019e17695d59357f1c14f7b2836c252bc88a01c83ecc12b2c5d8d5b77d66e39f0a80f75196e0f1d6e527c9eb5944f8ecfdec45423300dcc75902b73c02dc43391e69a2993b716312b1d901b8901580f90080d74f0ec00d3cf19d77fd156f2a3790c39dbda96bd0b949936de6e8063b817f2c594edc6796c79c15e17671e497b5dbb3724ad02ac72ea26e06bdec31d146edb7b277a9c372f78f8cc36cdae2036e759f263b5e4a96999eea9629700410f2a0e6cc3c6816e9bbced25749e5171258b1e4a4fd3cdbcfff751638fa378d3539e8a9817957b843db687c284af1c7f817dcc3895e12280000 serializedProgramBytesString: - serializedSignature: 49b2d864b443260035e674615d91d4abac9bd83586dc924a77a9718f179c8810606b566a12984535bd1ac33eac077f7809705aa07c539c05aafebaa821c23608 + serializedSignature: 0b78acd128d8a5fd2128221d69b1575981755bb4a2c3f6e642aca6c8e450c11d2188c221e15a31c29079ce8d57db7efffa8f9178b18376bbe3ee92fce14f0f0c programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset b/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset index dc4b479..d0981b4 100644 --- a/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset +++ b/Assets/SerializedUdonPrograms/f9c42919de20f12409bca49705e9f328.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: f9c42919de20f12409bca49705e9f328 m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15477ac0e7812a0844130203a6d860d914354cb14d152004a24ac2d88041a820610909159a6ddc0dee0dd773efbda75c729738bd39c925712eed92d8c9a55f924b72499c7a37dfec0cefdb79f3bdf7f6edce635736faa1d1ceee7cf37dffe96567879533fe2f368fffdac1b6b31ab68035b156d6c30ef1bf6ab8dbcd7f9c2be5bf95f571f700ffddccefcd63335284847f17c526f1df75fcaa9f0df09083ac85bb9de27e036be37fd7f1b06dfc0a7cdbf9ff36fe542c87076a626bd816b69995c64a5288d82102f54bbf18d8152be0bf57b3e3fc6e9b500a222917b74af9af067ea75fdcebe64aabe776b13dc2ac6e7eaf8587e9635d5ce67e21b1e0531e2e266c124ea1744748f752fe3f8fff7f1c5d83154bf8ff5cfebf5efa0f93610be4df31f937b88ba48c27e4f548e40fee281996cb2bf996f42b92ee62a4d362e98e96ee1229f74974cd751bbe5e5e0f97ee65f2b9afa16b708ba57bb9bcff14ba0677b9f47f5a5ee748f70a4dde159abc659abc65d25da1c9cb95ee2a4dde2a4dde6a4dde6ae9ae94fecf68f6d668f294ff72edfeb39a5d6bb470ca7f85765f8553faafd5c229ff95da7d154ee9b34e0bb71cf9e37cf39ca64fad166e05f207778c164ee9b35e0bb712f9833b56de7f5ed307f42dd4e2ca417e2b513cca2f8ff9cb7b4b993baf28797adecb43cfe3fbcf6af79769e196227f13eba528bcb2699c6363a9caefe3e5fd17185d07e8f5491d73d727750ecb9cd38eec9ca792c852b66cd46cd9a831ad97f75f44d7e06ed0988e91ee26a4a7f2db6c48cb2d5abc9b913fb85be5fd97d035b72daf5e93a3c26d937e2fcbeb09d2ddcedcf5e536e40f6e83bcff0aba86782e24e269d4e2d980ecc6f79fd3fc8bd135cea39bb5fb9bd17d9e86b913b478701e2a61ee3c349179cf434dcc9d879aa4fd9f38b2f33e4b224ba5ef0e2457d547576ae9bb03f983bb534bdf9d4ebcf9dfd1e4a8705769dcaf926ea974af66eef6eb6a29ef23e6aeef94bc49289d7251bcea7e31ba46e991f703e93f59637f9e07f68adb2e03b7dd1ab75dc81fdc3d1ab73d8e6d853334392adc351ab76ba43b55ba7b356e7b1d79055f68dc94bc299a3c939dead962748d1816ccd3384c411c4cf2d2c9c7fb983b1fef935cce387116be964496d2a3d9901efbb5f46846fee0b668e9d1e2c43be2bb9a1c15ae55e3d72add69d26dd3d2a34dcafb86961e4a5ebb26af5dbae74bf70073d7377a7875ff3987d359bdd5fd62748dd2b050e9339db9cbc10c967e3950756ba7c6b853ba1dd2ff552d9d0e1a645cabc93888fcc1edd2d2a9cb6151344f93a3c2756b5cbba57b48faabfcd4a18553f75fd7fc8bd135e238b255933393f92f0b3dcc5d167aa4ad328d8b3e4a22eb02e9aaf6efb094f506bae6b246e568cfcf4ef23cb8bd48cf5e2963bd26632cba8f65a8e7bb92e83d47bab3a49b6c1cd48774e963eebcd52fe37e135df3b847ab7638570b770173f7732f62eef250c6bcb70b0306bf4183df4996580e8e3277393889fcc1bd81b9cbc10d8e7dc5aafdbb4493a7c2dfc4dce5e126e9ce8b731ea76c9e2bdd1b917e373277beba59ca7b0b5d831eaa3c0c3077b91960ae7253fc912657e5bf5b34b9b748b9eaf9414dee2073d78f27b5fb27ddf18e567990e2ad381f93fe6fa36b70e74bf788bcff8e66ef092ddc09f43cb8c7e5fd77357baed7c25daf85bb4e0b771ca57f21fa9bb31af3290a433c3356a5bfca8b0b983b9fbc87aef1732add9f44d7206f2b73e78f8bd9d97c3556e589d9da3d537982e755dfe5b894fd31213b55f8eb64f82f3cc48febb154cf25ab0bca59bc7ca5aacf6e45e16ed578dfc6dcf5d96d8e4de33e61eefa4c859b2b9f7fdfb937ee33cda6b93e6c523add6ef03b8dfc944e773277d93a8dfcc1bd8bb9ebb2bb1cdb264cd2e4a8707723dbd435b895d2bd87b9eb8e7b1c79e3bf8ff4c675c3edcc5d779cd6ee9f66aeba63fc124dce1dcc3c863e65974fc93dc1f22951e5f39474ef45badeab3139a5311baee9701f73b733776872d4fde7d2633e61a726a782f9cfbff7233fa5ff035a5adc8ffcc17d504b8b071d76133fd1e4a8700f691c1e62f17a00dc8799bb1e7d58ca7b49935394c25ef55c31ba46fc4ad47860749af292f1ab62eebe51b267f3a57b06f9554bf711e47706f981fba8d4ff0374cdb9947eacc955ee6348d64219f643937eb931b1e2b09e8fc89a798fb45c280c357cba4b232a64ea4511109d07bfe0df4522da01de98f5720186958926b1ee31c0e95419572626c78a90de35e277337fa25308fd28318aaf274401ca75f19f36b4acd2cffd6bc5aa0c2cac74f23b0b583d7721d43e5e65ece23f6e293b78b45dbcc3d2c61af9ef5e216f1f573bf1c95426c1128c1e663b97e9ac1075731f05b4975f77090d1bc4ef2342d336a17d1df71b10eb5587f8307835778f89d8126defe37f9be26c94c8cc3a9a178a287f67394a25d31a6e0d685f2eea85af52e45ca408a0cffb4816c39c7231e2bd2b2125be62e85432d099a893322a05b298cbaf8a958bfec6f60482de6d4cb4d09cbf1dde8b78c59ecc16331948ee29c282780a7ffeed11dfbcafeef34f73dda655b372311c9c9ac2b46460415e596c628284e426e4e6e65480a23afe9809bf68f21ab288df79ae533ce73d01f244cbe44e8018747fb6f28b661e04d4dac4ff3ac4ff1f105709e95291279bfa3243c3994a3d0aee3013dc826cc34d5d9b24835b70d6ae385cf867265848104ca5034570b889a0e8853566bd7600dda94d1dc9198e386b459c61b9f09c4414e364718d941d4d51f1e49ad3a148a44326d2a994c831a44405a4c42883711560dc68b79e859a9ea0221157ae29d5c5fe95a67354296596eec5a6741773319393d631546c6a8b85f8974f24fd5891f4994540257e1e95f8e3a8c41f9f71e2e79b125f64b2dd56133f71a4a5fe5acdc37670f38e88eef3200f6f1a9925cf0ab02a305f03654ebf12917e339869bce84d232a350b4c84c5b07d5f560837f041cb467eaf993fdf263ac6e08f1beb552286b84dee10c9494f4c9b74a9207d2122ed57338a78a1a9fc40324c32b4ae3fe4ff120a4c215d6046989253543d3767b9c098a7336ac50ecf36b68557300799330e55f1f688312868a4c6b3dbb9db2eb400ff16d9094e1e57f20c31d9540b8b19bab5c64276aeac808d21c344c69c2232262c9434717f67fa65ad48814e11d302a3361003f5bc62b1496c5e1d14a99d4b34205345ece1624315ac9154c19a66285862b79b878255642a58627923fb43d3cc3aefb0b7a334edcefb74966c64e9b5eb3eca9434406f06a5949e34d3e9a4194d099f69106eac5093082fa684cf32088f79d47c0c25fc8200b08c3509870e153472094364683806c5a0b85fec773f208a6a6b628cf9748ce34c3142019c6d2880f372bc15c0f126e1903a730c557a0590854d1523c46ec78478a6d2f14c30c503590cf66424f42574c1a5b4e0128acec5063abd79dee84ca4e85c42d1999b119d522ac7ce0b20c74ea284cf0f40f8649370c0bfc080ff7bf9def09f47e12fa7f05764847f0a45a83200425329e15501089f4609af0e40f8f994f08501089f4e659c4b0d19e70723bc659c1954c65944659cc519659c998678ca457d0d5b52c333cc539311de877ab04d22bda11ebc5851169bc3bc0ff5926947757d665179f3b200f2e60526e1d0425f6ea2e1a129bf90120cabf0099d079899edf3dc5d984dc5b1cc140748d89f8125734cb140f15d6e28be0f8cf2567c2fa284af3008cf19ed4d78195537aca4ea865519d50d1753e9b0da6726ba84a25363a0f385473a7329add7f8d47a1e5560d7065060e79bea61d1b5cdee129b33f50b72bc0f24d7714da727725869ae6d6b19b58e965c07aa3e5d4025cf7a43f20cf3983ce526e105e23231c7ee1be72dc7569884c3f31bd2c9b14966c92ba9a2b0d16751a8a270d41b70cc28f586a3da54142664bb28e89366de8ac22613606331d84c148354f153c5602195e6f02a6442e309589b38af56ee054faf12db801a644c6d3c9e1e7ea78fdfeff794412e35a5a118e866734916eef50829b0acef3d156117f95cbd423327e336665e4b4dad0295908b4c0909f5d9f6009a9bc594f08600842f310987c46f34f2d4256fa3252fa56aca269f35e565148f1d01f0b89c127e6500c2afa084ef0c40f8324af85501085f4e25e6d53e1373052578974fc12b4d82617561773a82c7d28257519cf704c0793525fc9a0084d750c2f706207c0d257c5f00c2d752c29b0310be8e12be3f00e1b594f0960084afa784b70620bcce241c5a0610e5ab65d84095f9769f657e23c5e340003cea29e11d0108df4409ef0c40f8664af8c100846fa1845f1b80f0ad541eecf29b07b7516a7707a0f6764af8a1008437504c7afc3269a4d4ee0d40ed264aedc37ed5de41a9dd1780da5752c2fb0310be936232e097c95594da8301a87d35a5f611bf6aefa2d43e1a80dabb29e1c70210be876272dc2f936b28b54f04a0f65e4aedebfcaabd8f927cbd5fc9cd14901b0200b29f127e3200e12d14931bfd3269a5d4be2900b5db28b56ff6ab763ba5f62d01a87d80127e6b00c23b4cc2612df63696461f76292db893d2faf600b43e4809bf2300e1d752c24f0520bc8bca83a7fde6c16e4aed3b0350fb9049386c44ba2b9d6c926423520fc5e36ebf3c7a29c9f7f8957c98927caf5fc97d541ade17401af6536adfef57ed014aed0702507b9012fe6000c28f9884c312281c566058574c145e4b0b3f4a69fe70009a1fa3343f1380e6c7a9acf288dfac728252fbd100d4be8e52fb31bf6a5f4fa9fd78006adf40a9fd845fb54f5239f0c90072e08d26e1b03e070788f859e9bd89d2faa900b4be9982fdb45fd8b750929ff12bf9560ac8b30100b98d52fb39bf6adf4ea9fd7c006adf61120e93af2fa493fb924cbe9ea2b47e3100ad4f53c25f0a40f89d94f09703107e17954d5ef19b4deea6ea91577dd623f7502abfe657e57b29d2af0740fa3e4af81b0108bf9f12fe6600c21fa084bf1580f007a9d47cdb6f6a3e44a9fd4e006a3f4ca9fdae5fb5cf1824978b772f603ac2de7e17ea553e3faffc25df13f39ea922306e898173dfca62b0d7d38696d4b699474c690c29f1413a35d8fb74123f4a659e0ffd669ec74c92e1cdb88fd251b98416fcb8493054d23fc60c7bc1d630b5f1ddbd817d33832f9e1c156970addc9cb980ede53f75fcfe167ec739220a7ccc29687af5139ec639ccbd51ca4bd3f20465e58f9bacac22aca4b6f63b961e100cf68a0399d47df88c8c6e45fc2d482f163c4959f013260b5669354a3c4e47d71eaee55eceff307fbc596c3283f4a035a5fd834aa1af51f6fda4c9bed99a7dab38eb3e41dd9d16f5ac4de4b101d611503a3c45e9f975939e2bd24a87553c97b48a34708e55f39f0e99d9f63465db4f996c5b44daa6a70694e51e59fabdea1f97e5c59267284b7eda64c912cd127cc2897f5bccd2bc58f32c65cd374cd6d4a4281b3522d72596f6f873e9f9d316efe031747a7ca1e739cac66f9a6cbc3cedbcd7206b02bf252a139b9ea76cfa19934dcb3ce4426f56614941d8f50265d7cf9aecaa3fdb9aaa2319f0810c8eced056b6b366d99bad3bfbe45adec7750e7dd82efa046d5cd723e2698703f81e16d1803d4eafb853b66827583359a36662f58b94d51f9bac5e9d56cddfc01fde2f52a7191dab79aeeaff97280b7f2ef33e46bd489b7ed628ce190ac2b6ccfb182f53f6fdbcc9be8ab4eb98da94a53188d47985d2fe17d26905cca95327fadee1e905be4ad9f88bc96b96f4fae999b5e599c5e0c5ead728ab7fc964f5468f56e33c8aefc2f725938f4fbc5aefc5e6d7299b7fd964f3369f299dbabdf4223d88d6e40dcafe5f31d9bf2e49dfc06b7976f706d2ed27645ea6dfa42cfd552a77a7aeb76ac55c4fb3ec39a8b6650bff3b3ea63d97f5d85b94cdbf66b2794d9aa99b6abc9eed947d9bb2f2d74d56566b56d688be8ed39b1b907636723ffc72af9751563c94171bdea16cf88d745a551c2b4ea935a29fdac9fa891e9ddb46fa4e3036be4bd9f8497ab9d16c63aa9e5d6636669e1bdfa3acfc4d93953033639e89dc2e626e15631435ca6816f793e7479b7dbff729db7ecb645b5592fac46fdf15cbf262c1079405bf6db2a0894c1d3c3f9c4ecb975a4a7acf04954b3fa4387c8be2606becdc20eeb6728983c22e901b0f93bc6df1d2ffc9e73fb118bc02b95648eee321b78a1070d5cfcac5b96015672d4d7d4c24c4dd2dde3befe2b54fb338da259dc31f7f87d15f39495c83cbf48317a9ac30a5da02946ed8baf48f2c4dfcb847beb448c9e2a4c5216943cdd2df85541d29537558b938ab6d6e86b929b516bf07b10d37e721ef07fe3b0236cbb5af181cd0b3574483071d1b646181339252c698ea4c88f94280fa2e44009ffa816ce62c60f4c90e01fccbcf1d560129f1a94d5cb0a1cf69bf709bbd43cc003a7542a3a8a1bb2381ad6c741cdbefdbc436f62c36a8fafb589facf2719eeb8f04b24923e3c8be6d13d92863c1841e703b171405545b73e2a8fec026aa22816a2fab606a61337e544c1440ed2e8c83fac36c81728a63b4408d298883faa36c816a8820a8337971507f6c13d4c8841c15a5f66fe1b838a63fc916a686c861ea288a63fa8e4d4ce3c8dcb44908dc1fa18e42c1f838b43fb50f0d3a0a6b44d4d4827424a09502b4fc5c4db8be1611d4a7215391a647ba306c5acb8e898f44f40979adfac8571cb21d36cdff8ca1916b591aa3bfb2141dd1b2a46d6559d22e4759d29e5b599aa386b224b56b9987015b5992c6ac2cedaaa92cedf2189fa4324f2e554091fa73f6e59e3faa80f9a3cf00c2e3128253a37e6eb3469d24d3da992e3c2416f6e8a9d8bd0c0e07d574f0f395cc42573dbb2d1d0333a96be13d73d540fd459870564512e73d08e75fdac43905d544e9d448f04c9fb86f0d6a912da81508ea776d429d98228fe2d5293847d61acae9b6506e4328ff2a2c28ab2389f22184f2afc382b22a92280f20947f63136531aa3507643d09d7bd0c0e92368cc48383976f0bde0508dedfda84371ec133bd6b940588d672602982f877e7b230bbb7a854d843596b0be53184f2ef6da284fe06ce87f14163c2dc50043a393908db3fd8c4364be6c02efe10e43e18121e75c14bfd4a94d59c690df10a84f87bd928e42d72ec3d90744f8b4594d61a9db108e53f9e5b9451af2fe72394ff6413a5f7098d45111c811f4638ff394c38ab2289f35184f3fb3671ced49aa516814d4d42af66cec6c4e4882d167f6b80af4380ffc526e0120df0c124c3488b20ad75e1372190ff1a1690951104790a81fcb76cb4ede94db7554510e54684f2076141591d4994f72294ff1e1694559144b91fa1fc0f9b28276b35658758006d1f725df82308e87fda043a8799c6eeee75f13af141bca13a865f8a507f611375a9447d80ac089a5c55c1527b300b6dc1ac4230ff2b4c30974410663982f9df6182697145c81acc3908e6ff8409e6c208c29c8e60fe6f98602e8e20cc4b10ccff0b134c8bb34bd6605e8460fe7f98605a1cb75b83390ec1fc6198605aec675a833912c164b110c1b4b82bce1accc908662c4c302d8edeadc12c413087d984a98fde21602bbf716c88cd77f621a0c3c306348a33f18b11d09cb0018de284ddad0868ae4da06a5731ae3dd339a4c462b17fdf16d44710d4bc3042b558f4ad413d83a0e6db84aa36235eca86de66c4510862814d8873b5fa13838429e4cc4e3eb49a7397da82de81a017da843ec3501d783b04d222de525b780f21bc236ce21d25f142c4ed02ae92dd99788c4d70e0726d816308dc489be052edb48bfe98be10a12cb289d2fb4e3b8b1d286b3b975a10ce5161c25915499cb7219ca3b351d0d3db7663718ede5a07aa11a12c0e0bcaaa48a2bc16a11c732e51ba7789581cc55bdb25723d4239d6264ad89caf1e6863f0123d8c855ad926513f368b0365fbec012cb105301f011c772ebb42589cd5bc68edfd8dd908e5f86c4ed1c1a30e8ba135e7793b023a214c9da14a9b3b93ac75866e46384bc285d3e20e106b387b10ce8961c25915499c0f229ca561e95f5acd99d6eacd2d08e5a4b0a0ac8e24ca0710cac9614169b5805b43d98e509e171694565b726b28af4228a78405655524511e4528a79ecbf14fd6d62937db42598d504e3bb7d31a513f0ae06e84f2fc6c2cf9560dc125df6908e2f4f04cb3599c47b736cd7602a19c6113e554a61f069aea70d12c1cc267ad985f8cb0cecc4631af1c82c57c2a82382b4ce370abeb3cd6c6e1fd08e70561e95b5a5dccb59633d7239417860565752451de8950ce0e0b4aab6be2d6505e8350cec9c6a62cf3e933f01dbbd614356814cf9e398ef05e64132fbc4d83db72d521b27850df585bd07211b4b26c2e9d0d9ced450ead01e48d08e8c536814ee017c9be7280fda3b7c3b20061bcc426c6998666c719d5c03114506b0ef2077b87dcf6c16108f05c9b80cf63fac032d9972fb230a8b4b6e97a26423acf2652fdccaecea41df8e87594762090f3c302328afb383623900bc202d2e23bbfd640362390e5610119c597ff76219015610119c5af0c9c44202bc302328aabe30711c8aab0808ce2e6eafb11c8eab080b4788e8c3590a711c8853641c2e0425f9488e2d70686236097667362ad5b88897f95ca9c0ba37e4ae11d08efa270adf358ec02599ba76c4338178709a7d5f35fade1bc0be15c1296050aab5f1bb0d6f06c4728978605a5d52f0d5843d989505e6613a5fa0858e21be287e423d19b438f217897db8437865fb490b39151ed0ee5217c5764a3239e5e8d18bd427c3902b92c2c20a3380f791902b93c2c20a3380fb90c815c111690519c87bc02815c191690519c875c8d40ae0a0bc828ce43ae42205787056414e721d7209035610119c5314c0d02b9262c20a3f8aad33a04726d58405afc2a8535906b11c8753641c2e9e3fae6aa7a0623ec81886fac9a8010d666638ea785a573ec88c5e1a1b5698a0b11caf5619ac8adb4d993b43691db8b70d68509675524713e8c706ec8c60c6425c3bb7ab3f26a93b5a25d89e06d0ccb4c786524a72cea11cafab0a0ac8e24cafb10ca4d614159154994ad08e5e6b0a0ac8c64a7fc4a84724b5850564512653742b9d526ca603fbd69b1f36e6d916c0342bdcd266af506f84236f4de009f87206eb709719a965fe12482417ea3860dcd03180711d8069b6027b0f8db3910a845a8d02dab80a8e7cff311c6c66c344df12da9fa1bb651cf918b10ca269b28a71b9ba6a1fd1de8e508ee8eb074a12a23994f6b11ca2bc382b23a92286f422877860565552451ee4628afca466fb37a08f63667218857db8478be8438c03af86d6876cc5f38ab9501b27682e0145b684720b4bb6ca29d656cdd1b993a41835e23ca521b6feda48d9508f1ee302d6f586de7ad2d6fec4338f78409a7d506ca1ace5b10ce6bb2b145815a168efa9ee16204726f584046b1cb341a81dc171690515cea5880403687056414f70c8f4120f7db0459eab1c9b1b8d461adc1d98360b6840966143f30b317c16c0d13cc2876852e4530dbc204338adf815c8260b6870966145f75ae43300f8409a6c56e9135985b11cc8e30c18ce237a41a10ccce30c18ce2cecd2604f36098605a7c89c51acc9d08e6b5618219c523eaaf4630bb6cc21cc3e2db12d4836d915fc09884f075dbc43705e1739fbdea3edf003eefd1c68eb12c9cba6a0d6a11827ac82654f58514b574010ab40ed91d4803086b4fb67620b9f3aa5a158af28766e6228cbdd9987c4bc4d8e0aa3fa35acca7209087b3b1f88bdbf11d9c470d57bb55cc6c2a77357fbc83073bc29fed115b67ad16756b5f227f0ca1edcbc63e0f6a82188bb33aa8b456dc172294fd3651aa0db1f12d0ae9e7518b60ade5d11908ec4058c15a9c53b206f63c047630ac602dce7c5a033b11813d1256b0516caec623b047c30ad6e2249e35b06508ecb1306da9b1fa5e9cb5c9921b04cefc5c4df8ba04e135c25830b745e8ef748e1688ee3bec8f03b22dfcba5ee4c201b68f03d9c57fbca5c11efe63f28f8917b8d7b2635c3df00579ad42369c6c0c9af5b30a68258ee32c51461c1e5d96d6998a6531d866179fd88178605aa7956d1249decc6d80a7015f4c3c0bfac0db299bc4f0a5993fd92cdc46a63e4b5a0e238418bca6e094d20567cba743b89bff3857ca3fb54ce0955cda098012339793aec0523a95454ee684f0ed5cf7169101c13795a5a9eda3734d5192542987e239a4edbf0ed23d47a6fbb072682a629501e4bdd41a5d0f310fb35433a775227cf8d2752b7fa24728d727d4f493af612bb45b5ea788b7fcfc70e6e9e06cbf01d765c3caa7679aa7bd6b74d2669e76a4395d384d766d1ad699d341b739fe54afc80fcd67f38253c23bf8dfad6990982626496869abf8d501616ba790dacdd43f682ba1f70655d18d3679166975447c7ef1ab9a42c45b0135c54daec2540185e9e6af7279a0b9fc169b3cd3fec8eb97388fdf9a98c76ffb2a8f079ac76fb7c93383e3efbfc4b9fd8ec4dc7eeaabdc1e506e879f5251e936f1b0ce68085eacec133b14fac493b93f020d539a4cd8680100 + serializedProgramCompressedBytes: 1f8b080000000000000aed9d077c15379ec7f5c036180c0602981a3a7142712324a4514c0d1ddba40001631b6c82b1b14d49421248258d90845448421a90de482f249b5e7637d9cd66afecdd65eff6fadedddeddde5daeeee9af9178ffd1d3ffbd37ef8d9e67bce00f96a7fdf4d7577f69248d46d3a988f17f91f1fcd772b68c95b389ac8ad5b226b689ff55cec346fee36ca9fd4b580b0fd7f3dfd5fcd878363cc195f0ef94c800fe7b1edf6a656dfcca2dac86870de27805abe37fcfe3d7d6f12dd8bb8effafe36745b2f845556c265bcc16b18248bf0412cbc545ad725f04d215e9ca7fcf6097f1a375c22888a4481c2ae0bf2af8915671ac911badce5bc156896435f26335fc9a16b6916bae158a5d7f3584893f9813e4cab09b0ccfe4ff73f8ffd7d076960cb3f9ff05727f27796d57f97744fe0de114a9f1badcee8ef643d8435ecbf5067d27f7e5c9f02c64d35932ec29c3b3a5ee1b689bdbd679aedcee2cc373e5796fa26d08f365789e3cfe16da8670badcffb6dcce92e1544d6faaa6374dd39b26c3199a5eb60c676a7a3335bd599ade2c1996cbfdef68e99dade9a9fdd3b5e3ef6ae99aa35da7f6cfd08eabeb94fd73b5ebd4fe72edb8ba4ed9334fbb6e3ada8ffde69866cff9da7533d07e087b69d7297be66bd795a3fd10f696c7dfd3ec017b73b5b8b2d0be72148fda97c3d2f3bd7398db57949eee7b39e87c7cfc5dedf834edba73d07e13eb73d0f52a4d7d9c340e5165fe2479fc7d46d7017a7db280b9eb93050ecbacdd8e76d681385a2a2d8bb4b42cd2982e96c77f80b6215ca831ed25c325c84eb56fa9212f9769f12e45fb21ac90c73f40db3c6d390b341d755da5dcf7a1dcee2bc32ae6ae2f2bd17e0897cbe31fa16d88673411cf055a3c0b51baf1f163dafe7cb48d7d74a9767c293acef330bbaf160ff6a17ecced43fd99771fba90b97de84299fe2f1ded9cefe268a9fcbd08e9aafae8622d7f2f42fb215ca1e5ef0a27de2ebfd074d4752b35ee2b655820c355cc7dff5a25f58e32777da7f406a07cca46f1aae3f9681be547ce6fe5fe811afb411ed82b6e9718b8add6b85d82f643b846e3b6c6495bee704d475d57ad71ab96e11019aed5b8ad75f4ba7eaf71537a83353d533ad5b9f9681b31ec3a5ee330187130e925e3c735ccedc73592cb3e27cedc2371b4941db586fca8d3f2a316ed87709d961feb9c78bbfd4ad351d7add7f8ad97e15019d66bf9512ff5f47693d26bd0f41a6478b20c3730777da35faf8ecb7270dc6e753c1f6da33ccc55f60c63ee72309c255f0e54ddba5163bc518697cafd1f6bf9d468d0d8a46934a2fd103669f9d4e4b0c81bafe9a8eb9a35aecd32dc2cf77f826cc4d7a9e39f6afbf3d136e2d8bd56d319c1d22f0b2dcc5d165a645a0f3a71e61d8da3354a86eafed726b53e43db5cab479676fe9838e743d88aec6c951a73358ddee838d650e72bbf30d93d5686236518af1fb405d9b285b97d6bab8cfb73b4cde3eea9eec3d9da75a398bb9d7b0a73978742e6fdbeb0cdb06fbb61df2e165b0e2e67ee72b00bed8770277397839d4efaf2d5fdef344d4f5d7f2d7397876b65383ecab940a5799c0caf41f65dc3dc7e759dd4fb026d831daa3c6c63ee72b38db9ca4dfe514d57f9dff59aeef552579dbf5dd3ddcedcf5e32eedf82e77bc3d950f52bc15e72be4fe2fd13684136478993cfe432dbd576ad75d89ce8770873cfe232d3d576bd75dad5d779576dd0e94ffb9e86fceaad737e81ae29cde3b99db172732b79ffc186de3f354bebf81b6414fb593957f9cca8efb556fe51363b463a6f204e7abb6cb0ea9fd1ea19de8faabe4f5df7b881fd76389ce4ba62ebf81b9ebf21b1c9bfa6c746cedb3338e96f2d1ddcceda3bb65781373fbcc4dcceda33732b78fde28c35be4feafd03684b7cafd5fa36d086f96fb7fa2d9b547b36b0f3a1fc2db98bbefa97ce876165b17ee65b175e19d9afe9d32bc8399c703eed2cecf41e7e3e36a3ca0483b5ecc8efb6cbfef34fbf621fbd4f9776bf1ed43fb21bc87b9ebea7b9cbcefa7ea60e567f722eddb3586f7691af7391a7d957da3e368e4a36d5407f653636a7b513e4178bf16d7fdd25e75fe18435c7bb5b8f6a2b860bb4463a6183dc0dcf7a30764381269df2bc351d17cc96bd674f2d1364a63df012c71192d96e1012d1f0f68dafb99db8ff733b76f3c288fff146d736e05c5daf94aef618d512fb41fc28798bb0ed6750e6aec8ad175103e421cdfaf1d3f465c7f503baedb8f7970d6fd93615d2a43d55e8fd7be7b145df7a8c6e831e66edf3d2659abf64fb676dd3879fe37ceb182df3077d91bc752afe3954d8f1bf61d46fb944d4798dbcf0ea3fd103ec9dce5ef49276d030b351d75dd53286d6a1bc249327c9ab9db524f4b3d86ecc6f9fa3873fbe561edf861e62a6303e66a3a4f30f398e221bb7c061d60bef219a4fa3c8764f80cb2f5198dc9218d5967cd866799bb2c3ea1e9a8e3c7b4eb08e603eb359d3296beff3e87f629fb9fd7f2e239b41fc217b4bc78c16137581fff53d7bda871789145eb01085f62ee76e54b52efa8a6939720bdeabc7cb48df80d52e37f3d93d48bc7ef74e6ee2bc63bb78b0c5f46fb26cbf028daf732da07e12bd2fe9fa16dce65c8579aae0a5f455a67c86bbf35d9971d114f60e7b23a56cd9a599130185abcc93e2a5657267e480cd239f00bfe9d22a26de31d9b662e6078525b259e03b771cf2e353ea91d18c94376978bdfd5fc8c0621faf3d828de8889028cdbc87fead063e656be7f8e784a0d0f9a1bf891896c010fe1aa35bc19b382ffb85596f36837b22d7cab92ff6e167a6bb8d9b167264a123c92d6af59c6359d27e68d7c8f02daccb7370a0b2bc4efadc2d23a61fd3cbeaf4d3cbfdfc4d6b3193cdc2e628b4d7b0bffdb1467a54466b6d1fce09cdaef3c9e57d93493a706ac2f12f5c2891c698f1c01f4393f97c530ab488c00de1c931327183a950c3426e6498d12812ce2da57ca8a447b63590c41ef698c4da1d9bf1dde937903265e5acc6420bb078b144473f897df767b67cfbc5f7e93ed4e5a192b125de7210992160f2ce81546fac728c44f427676563118aae38f98f08b5b5e4506f13be73588f3bc67408eb833b9332002cd9f257ca39a5f02662de47f6de2ffd78bad987c29ce91b7fa42c38d33917914dc4e26b85d330d37716d120f6ed7e3e98ac2857f6682b904c1443650043b9b088a565865c66b07b09d9ae4169f61b7e3a988322c123b0710c5385e5cdd654353543cd9e67cc813f9908a3a951359869c28869ce861485c3124aea7dbce5ccd4e3091882bdb94eb623e5f553b554aa9e57bbe29dfc558ccc0b8750c159b9a7226fe7521b2beb7c8fad422a0323f87cafc3e54e69f9472e6773165be70b29556333fb6a7a5fe9ac1afade7c9db2a9acf5bf8f5a69e597c5780a7a4133450e6fceb27f26f3833f517bd5944e566571361d16d5f9311c215bcd3329f1fabe6e7d7898631ecc737ebe92286689adc57c427dd3f69d20582f468443a5dcb28e2b9a6f203d930c07077fd1dff17536072e902d3cd949da2ead995e102631ece982366bcd7b1c5bc82d9c09c7ea88ab749f441c122d59f5dc6c375c20ad85f231bc1f1e38aef10034db5b018a19b652c64ed950a9828d74938e660e198f0e0b88aef77865f66891c6810314d345a033150e72b160bc564fe2d22b7b3891bc810117bb0d85005ab3b55b0861a0a9698fdeba160e5990a9678bc91f9ae696a8d7798eb569074e37d188bd7b3f4da74ef61ca1aa0379c324acf9a6174d6f4a4c44718c48d156a1cf17c4a7ca4413ce2d1f25e94f8281fb0f4368943830a6e72315d64b8716c119de256f1fecf7a51546b6363ec42c7d8c7142314c0318602383ecb5b013cc9240eb933d650a51703599864d64dccfe8e8967081d4f5f533ce062f07c30a62da10b17d0c2fd283aa71ae834e778a3d39fa2731a45675c4a740a288f1def83c70ea0c427f8203ed0240ef8271af0ffba8b37fc8328fc4514fee294f00fa60895f8406808255eea83f8504abccc07f19329f1493e880fa31ce77483e3fcb69b37c7194e39ce64ca71ce48c9714618e22912f535bcca109c6e9e1a8cf0ded583d74393ebeac18b678591b1cc7b572f9e7554d36724e59b67f9e09ba34ce270873edb44c3c3ad7c34250c6fe9c5341e6064b6c57373610c15c7b9a63840616d0a29196b8a058aef7986e2bbb787b7e27b0a253ed5209ed5d39b782155374ca3ea86e929d50da752f930234d273a8da2536ea0f3bd473ae328ab67a669f578aac0cef2a1c04e30d5c3a2699bd9476cced02fe878ef48cee6960e8be530cd5cdbce61d473b4f83650f5e9442a7be61ab2a793c7ec29328977159b86f2dcd79bc7169bc4e1fcf393f1d838a3e42594d5f30d561fe8e7cdea524a7c8141bcb9c09b78198564619a482651b5c3a2346b87d3291c8b0d388a8778c331d9205ed437d3b5833e8ee8ad765862026cac1996123543a2f8a99ae10c2acf61842ea63d0158ab38af5abe0bce9e2e664655c898ea783c4dfc480b3fdeeac941ce34e5a1e8fb67f229351c6b122a30d3c17b2e82bf8dd3eb7873365632f3e3e5c42650193985aae2ab0c553cf358c59f45892ff741fc6c933864fe05469eba7225ad7c0e55535e98664d792ec5e3221f789c47895fec83f8544a7c850fe2d328f1953e884fa73273559a99398312be244de17293303c70599d8c706f5a7826c5798d0f9c6751e2d53e88cfa6c4d7fa203e8712aff1417c2e255eeb83f83c4abcce07f1f329f1753e88cfa7c4d7fb20bec0240e770678d524ad3bc342aacc37a459e617513c36f8c06331257ea90fe24b28f18d3e882fa5c41b7d105f46896ff241bc82f2c1a6747db09232bbd907b3ab28f1cd3e882fa798b4a4cbe402caec561fccbe9032bb2d5db32fa2ccdee283d91753e25b7d105f4131d9962e939594d9db7d307b1565f665e99a7d0965f6e53e98bd9a12bfc207f13514931de932a9a6ccbed207b3d752665f95aed93594f2d5e92ad7524076fa00a48e12dfe583f83a8ac935e932594f997dad0f66d753665f97aed90d94d9d7fb60f6064afc061fc42f3589c3e369584c25611b760a2dbc91b27ab70f563752e237f920be8912bfd907f126ca076f49d7079b29b36ff5c1eccd2671989b755b326e12676e560bc5634fba3c5a29e5dbd3556ea394f7a6abbc85cac33b7cc8c3ad94d977a66bf636caecbb7c307b3b25becf07f1cb4ce2f05418d638323c6a8d159f438b5f4e597e8f0f965f41597eaf0f96efa05ce5be745de54acaecfb7d30fb2acaec07d235fb6acaecfd3e98bd9332fb40ba66efa23cf0411f3cf01a93383c9f837596d279d27b2d65f5c33e587d1d05fb60bab0afa7941f4957f9064af9d174956fa4fcfa311ffc7a37958f8ffb908f3751963fe183e53753961ff2c1f25b0ce245621a7926e71acc14af2cae4d7126122cdb34c2c041b0303eac8645ae4c730e12d9413daabed5944540f1c978a6e9d97484cea6db281f78ca071fd843893fed83f8ed94f8333e88efa5c49ff541fc0e93383c518165aed279a2722765f5f33e587d1725fe820fe2fb28f1177d10bf9b127fc907f17b4ce270d78235c0d2ba6bdd6b528606c5d164dc244ecbe33ecae457d235f97e4af9d574951fa0f2f0351ff2703f25feba0fe20728f1377c107f9002fe66bac01fa2cc7ecb07b31fa6c4dff641fc2025fe8e0fe28f50e2effa20fe28257ecc07f1c72857792f5d57799c32fb7d1fcc7ec2240e374b58b7369d9be521caea0f7cb0fa3025fea10fe24728f18f7c107f9272938fd37593a74cca709bfa24999c8c733f7b9a32f9d3744d7e8622fd990fa49fa5c43ff741fc394afc0b1fc49fa7c4bff441fc052a377f986e6ebe4899fd231fcc7e8932fbc7e99afdb241b948bc280d4f28edf5a4a9f53dd25907247e7ffb2b534560ec67c3c70d0a23f002980d2ba9def851531e434efc24991aec6b3a8b5fa19ce7a7e93acfab2665582ee39b644cee470bbf6612864a1ad6388e791b62a6d88c7dab751183cfc26e137970a97c636b225bcd7fe6f1e38bf91167dd58d863ce41d37a307036f630f7ab025e6e2daf53a9fcd694ca522295d4fbbe4e4ad70b06abc52aadea387c6b574f457469142f2978834ac1cf4d2998aed528d1381d5b9bb895ab39ffcdfcf46a317605f9415b4aeff72b87dea4d2f707a6f48dd1d2379db36e11d4dd79b180d5091f6b63f53ee5c35b949d7f68b2736a52f9309d7b49adc80367ade5f4f321b5b4bd4da5ed8f4c699b4ca64dcf0d28cb4db2f47bb53faae52525ef5029f963534aced45282973d4c3f2d66352fa979974acd2f4ca9294f5036ca85d7c596f6e879c9eda753bc9cc7d0e0f12dff63541affc494c6b393f6bd0a5913a45ba25249d37b549afed494a6733d78a1b75461253fd2f53e95ae3f33a56bc1f1bba95aa70dafd2e6d80cf7ca75ac5ab666e71d3f73166fe33a2bc12d136d823a6eeb5671b6c301f66e16d1407a9c567183bca35dceaac91a359554ff804af577a654cf48aae6af104f93da44ded690d666aafeff804ae12f536f632c1079d3cadbb6f5a24dd09e6d8c0fa9f4fdb9297dc549d731731296463f72e723cafabf48e62e60ce9d79a2ed1d9c56e0c7541a7f15bf6649ae9d9edabd3cb518bca4fa132ad57f694af57c8fa9c63e8a8fcee061fcfe89d7d47b49f3a7549affca94e6a569e674e2fba517753fee269f51e9ff6b53fa67c7691b782dcfeed640b2ed84d4cbf4e7544aff86f2eec4f5d61c31d6532d5b0eeadeb298ff1dedd3b6673df60595e6bf35a5796692b99ba8bf9ee99cfd924ae5df995259a6a5b25cb4759cd65c9b4c6725df8757fcf1d2cb8a5ee5250d3fa4d2f0f7c9dc5571ac38a7668a766a835822d5d4a273a7913ee24f1a7f44a5f1d7c979a3398d895a76a9a531756ffc3195ca7f30a5124666cc2391cb44ccb5a28fa27a19d5e2787c7fb4d9f6fb8a4adb3f9ad23629c9928667b3c5cf3df7317c9d97547c4da5e29f4ca928d152b150d4f7f5c7ed6f11cf486ae45d209e8d7ed9ff13cafedf98ec2f4d3217685f899786d4fce8a7540afe39999ac0cbbdb83defbedf50a9fc9764f229deb88bd79e1ed6f292829f5129f857530aaac8ba0c3f4d49a69d985825b973fccac96f290ebfa538d81a69aa10476bb9e216912ed08d5e13bf25e6a5b7d085ff4422b064ce2ca1dcc2af5c22ae80ad56562456bf2e3e9ed2c45f5a80b81bc53a651b79e9ac46b397e32bfc1ba33f141afbc43ad56f46264a8529d726a27cc3a94bfeab1fb1dfc7ec2253a4b43869b11478474be9bf43aee6c95ced542456241f97a23725b6e23f20b6ce661ff2fecd3c4760917c521c81356e578b687017fd7c59586099e18431265a43708210509f56f4e16bb9e066cee3be16d97c867f5db23b15434e7c6f1317bc6ee2dcbf700b77b9182f77ea844a51433786025b61cf28b6ffb489adf7716c50f5b7b01659e5639f6b0d05b201dda3c8fecb26b21ec68209fdc5755c280ca896644551fdb74d547902d56a56ccd43480e8d2a26100b532370aea7f3205ca298ee102d5ab6b14d4ff660a54450841edcb8982fa3f9ba04000df09e189b15adf17d75beaae188e4a7e529f28bedfd9c4d73da64086a9f930b3208a09bec795114c15a1c3549f17c514b189a90fe94d0b85e0da30b5b30644a175b20f0dda593345d4d4ec9750401b02d0ba646be2fa83cfd4bbdfde48d30305d0eb9cc5b68bcf54b608bd5a7de0407c7e2b6896778ea08e7f61129de7c204edf8c2b84d8dc2b82db6c2b80ddfc2243b5d85716ad7420ffdddc214da0285716e8085495767854997e1e8b8a0793caf18c605b322bfdf4376c53064970d105e93109c5a38c7662d3c40e6b53342bb49cc3ca047bf5733f89c8966c390181bdc2f00a99ad7644daeab6eae4c2681a9d4cfb0149cbaa9750912ced250e2bc0fe1ec6a13e7605413255323c1392de2b835a879b6a09621a8b936a1f64fe0a3f881207c0bc81aca61b650562294dd8282b22c9428ef4628bb0705656928516e4028f36ca2cc47b5669bac2761bb99c1b79e0cbd77ffe075b1056f1482d7c326bc93103cd3cb90198068cd030b10c49e3621f64210ab59f40dac8ce0b376872e46f8f2dbb32e744f6f2bb687728e2d94572094bd6ca20467c0c538da4f8f198e0b810766216cbd6d621b293d70233f09bc0f7ad4db5cf012bff26ad533ad219e8110f7c94421af9143176d716761594469ed9edd1ba13ca97d5186bdbe9c8050f6b589729856f09d2f9e4f17463470096774956e9a5b846bad59743b82db2f48a343f0b1dcf08d0eb5219cfd8384b33494381f43380b6ce21ca115fd1a814d3d5499c19c79caf1115b2cfed6005f85000fb009b89f06784307ab47972090038302b22484200f2190838232e856c27f870fe5228472705050968512e51e8472485050968612651d4239342828278512e5b308e5c936510ed46e3af5629ec3ba0ed7d5bc0c011d1634a016efe6d680de88800eb709742c330ddab9e720c1638c8e3b78770e423dc226ea02897a3d59b356b9ead629f660e6da825982608e0c12cc334308b308c11c152498169fa45b833916c11c1d249893420873188239264830cf0821ccd310ccb141826971e4d31acc5310cc538204d3622bd41acc3e08666190605a6c675a83d91dc13c3548302dce26b606732082795a90605a1c0eb106b31f82392e93bd77b8b0961fd8dec1c6e2b720a0e38306348c4f89ce424027040d681847401f454027da04aadec6c0b56732eb69592cf65fdb827a14412d0a22548b45df1ad49711d4629b50d524eed359c79bc4dd03412cb109719c567f629030849cda92d6563d778a2de89722e8a536a10f375407de56f7b688b7c016decd086f994dbc3d245e88789d80abb46151436be0b26d816308dca44c3c48a6a6d886bf4f9f8b509e1ea4698b25361b50d666d5ad433827070967692871de80709e11249c65a1c4f90ac279665026e094d87ce461ad3d7a014239252828cb4289f2004279565050968612e52684f2ecf644e99ebf64717cc9dafca5ab11ca736ca284f7c5d409750c96c5815e7aadf876c226fe7fbde8e75803d8cf16c02e08e0b9edd948c772567dd1da2b856310caf33239780ca73a2c3ad668fce308e8d4f6ac27dd9f0bb1d8a63c620be5ad08e5b42035d14b6c4e3fb4d644bf0ee19c1e249ca5a1c4f902c2392348384b6cce9ab386b305e12c0f12ced250e2bc1fe19c6913e710edbeeebcdf5ec1ff6e62f0859a8e7577bf19619d15940ea5d5026f0de5328472765050968512e55d08e59ca0a0b45a6f5a43d98050ce0d0aca49a144f92242392f2828ad36ddada15c89509e1f149465a144f90842393f2828adf680aca1bc1ca15cd09ec370199bc8b5d416cac908e5c2f61d5d0ffb22694f21948b323127aeb403ce891b8a202e0eced39e30bead7e2542b924133df1e89aee89be749181d5ddad15f35311d6a536b18e66ee018e5656cf59ac13b3dd60a8a3632f007007c2bc2c13b5694907ac4d872088159918db4cfebdcb30be79793ac25919a4a162abf38dac0d156f4538ab8284d3ea44196b389f44389707a58369b5a05bab37e72394170405a5d5f999d650ee46282f0c0a4aab3387ada1ac46282f0a0aca49a144f90c4279b14d94c399bb110ffd20587cb763afc3bd17e15d9149bcee958e9719d07684758e7720bc2b6de285d531709f48f5df2d7e71a3b72d68d908daaa4c4e386c636ad0a3638d775e83805e1234a0166f4ad680de8b80aeb609b42fdf88f7c95dbcdf1a466bafa0764518d7d8c43882c536939c514d58a7136e435bf889cd710742c2f87e652704b8da26e0414c1f588ef719e60c0c2a5b7b2b7d0442bad626527dc1fd86382dcf303e1a7e0e81ac090a488bcb9c5a03791881ac0d0ac83076352f4220eb8202328c9dcaa508e4baa080b4b84c9f3590b508e4faa0800ce37a5d972090f5410119c60f2aef42201b8202328c535f1b11c80d410119c6b7cef72390970605a4c5a59fad81dc87406eb40912babbfafc8d307e19b83302d698c9b1f34621b396a9de74c79c57f404c2bb2948930eac7e95cddaa3887a84b3294838ad7e4ecc1ace7b10cee6a03ce2b5faf15a6b379e2a8472735050968512e50308654b50505afd06b035941b11ca569b28f319b53ee626794af81e904510bc369bf07af18d1af25143585b963908df964cf46992bbb984af109f87406e0d0ac8300ee99e8b406e0b0ac8300ee94e4320b7070564188774a72290970505641887746721909707056418877467229057040564188774e720903b8202328c7d98d908e495410119c6c92af310c8ab8202328c9355e6229057676214124f458d9de217f666f9418473677b8ef7b85fc2b7d830b7f612fe4d08e52e9b28e1aba0fa9cde050cc67eda423e9fb72f42784d26bcb18625b3e8721867988f4628af6dcf82ed5e23d8621d696d8de05b10caeb82f4e0abc46677d1da83af5684f3fa20e12c0d25ce0711ce1b32f198a184e1f77232b26a86b55a7212827763501e779584725c723142b93b2828cb4289f24e84f2a6a0a02c0d25caf508e5cd4141392994289f47286f090aca92500e625c8c50de1a149465a144f93042795b5050968612653342b9c726cab1cc3db406af226fd35ef84c7ec93b8bbd736bf3331622d4b7db44ad96bc9bc43ade9277e311c4bd36210ed5fc55adec52ce3ae6f7a5b623b077d804db9745dffa868b6a84098db20a08bb7f9e8c30de99895b53f4c5928eb6cad01484f22e9b2887196f4d1d7bfdd5e908eebe4c0cc825bf746818d7cc284538efcea4afb6a0a598e789bfea7855deb12a828710dc7b82d2dcb7eaa7d6509e8f50de1b149465a144792d42795f5050968612e56a84f2fea0a09c144a944710ca0732d1c92ceb809dcc9108e27e9b104f9610db583d3f0c05a18a5fda20629825441a446b748ebc20631fa4196c0b6d3784f6804db42399a9515fc9d40a97f4dc8f0c35edadad84598e103f18a467ed569b4cd69eb5d7209c0f0509a7d57bbd359cd7239c0f0709a7d556a8359c2f219c076de254738ca9d973eebe51f8eef9f908e423410119c616684f04f2d1a0800ce3b3f78908e463410119c697fe7a21908fdb0459e0f19663f181b1b51bce1a04f38920c1b4f8869035986b11cc43418219c6a6d09908e6e120c1b4d81cb206f36c04f34890608671d9a70508e693418269b159640d660582f95490605a7cfbdc1acce508e6d3418219c6b7322e44309f09124c8b6fa15b83b902c17c364830c3f8edc85508e6733661f662d1c95deac4bad03f0f1a80f03ddf1e930e2b78d8c4a5e8f948e11c2bba0d817dc126d8c1c82fdd9f9c71affc169d4063fd6333d6a0e621a82fda84aa3e0c1f9d8b045f97eaa81364b721ac2fd9c48a27c8ba7d553dbdcc80775a7bfb721cc2f872264635633156b86e4c612de68311c8a39998a4801b48cb398f726e76ad183256e10c7e7a3dbf6c2b3fb749bcd961b5a8f7b385f65584f6954ccc47a246deb19cd5debab5e27e0642f96a269a4ed1a934c9fba845b0d67c743802fb5a50c15a1cacb306761002fb7a50c15a1c52b606b63f02fb4650c186f176751202fb6650c15a1c1db506b610817d2b487395acbe016f6d146a27c2f97690705a7d75db1acea705ce2ed99af8ec18f1729158486e8db0df696b4e14bd2198160b646bf8f60251a8dbd81aee5f2bf88fb73c58c57f4cfb236211a1596c3b370ff6825eadd086af118165adac183a33ef609728243ef85498d4e2fd8511985d1b1d80847860f8b1962d14595ecdd3006703be883817ec8177511732e80d56f333ab4558c9ff3beb9815814b4426f35f4ea537f17875e7106ee43fce96da9f581378c5577b17a044cce564a36f399d28458e73c2f5ebb8ed35c201616fa294264e1fed35797172a508ee441d3afdc720dfb364be772a823e78a4c407df4b6cd17b1073274b3573525f710b5ebe2ee1673409e35a8499e9f835bc01e1d66b10f1160d0ba64ffb97f6f7715dd6a96878aa3eeddda21fd8f46947cd69116bda7392489d391ff43447cf6a16fe507ddc179c125ecfffae4d82c45031e644ab4de75beb455a1b846a2353ffe05e09ad37a88a3eb0c9334fab23a2c3b5276a0a116f31d4141fba0a533114a68f4e78b9af5efeb14d9edd352f57cf764ef878d4c73f89f5f14f4ff8b8af3efe994d9e297c67edf7d8db3f8ff5f62f4e78bb4fde0e3f05a2d2ade2d73abd21789fba454cf868116766ff3fc5bfc01c3da70100 serializedProgramBytesString: - serializedSignature: 1b77f38baf8e119b57aa2b8441d559f2d126b75d48dcec736e79f54ddc6946796d2b1964a1a6a09fc5e7303b0f2db7840514e587daedf41221b22c78facfde0f + serializedSignature: 16338ebf32d63471c7a6b51a54f53f11bc1713ecd83452780159ab218d59c024e15140a93e42008b4d44f649407c65c6b5fff27e2e32c88c1293809ffa09960a programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset index ee2faee..0466b30 100644 --- a/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset +++ b/Assets/SerializedUdonPrograms/fa52d8b703fd906459112715b1ef1f3a.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed5a6b5b1347149e0db9ca1d0482a0606b6b2c4a02586b6f6a00b178414b807ef0e98311824d9f707948b4dacffdd47fd47fd07fd48fed396767c9ecec4c964d76a2a1264f76b36767ce9ef73d67cedc369265f0b1aec3618badb32536cb36d92e3b6407f06f09cefbf0b5af1cf933760ce757702cc2bdeb6cdaa7267eae5a6938aec25595d5a0e66bb603e732dd2fb012fc5f85ba25b842e91efc4a50ca8a42a54db6cc9eb23536668df8a8d8a24a552eb310979584e3227b07774b64143e244bb7c6e050803b55bab70f463be59eb39f09d63edcdb813ac7ac023a5f92c6e41f70b408139dfaf9b98f9f07e01787dfb0708d286ec32f06a223a97c172f7f5e9247b97c4492c7b87c5492c7f96f8c5f27f87990cbd35279473e2ec9935c7e4192a7b87c42929fe3f24949decde51725790f975fe2d7bdfc3ca4b1d3914ff1eb08b705ed8cc42c8a901fc0674576c4b278d3ba1620949d9afe418caae311dbef10cdf8d81a84cb11285044d226c5698d2db07965248d5b3d82dd4b742c428932299df63ee22fcf23d0b80a7c4b4233a882fc01b5226c0865b833cb1ec3196bbd607310d8cf252d5bf0d80a34a512db80e311e97b01667b4bfa41c22623d759079d768bde078943e8115c57c8c2021ddf90a525b27e156435ca2f07906116e1fc969ee6c57e0cff55cfdce094a96d54376c9ddc4e1f8e9b96010d5a9fc536fbd123efc523942ea779338c66b18d587f7a3cf191433bc96067b1ca75ccd95d964b36cfb27869ad7b180c8ed18b501ddf36dfb7d8cd8658d4cca0bb270841ddc35d77fe99b91c7dbc1873435b6059ec36ac491f688d88457d196bd4a3a13184582c9a434365fa2d15fdd44d17da48bf5dae4ce5823b204e3d93db01168e209d4eb3c07e811bc760ea2cbb0f4614c9ec0a3772932055a89b2b73d94ffce1bb2c0fea76296fdac3b91a37b3ca3cbecdc5f91027a3e87cfd20ea1c14513928d96e07f967a4460e4a9ee0aa3b083f6a06531a06fd6cd031d8a56230d5fe10b77d5ff1c9976a0671403be561f028af66b05b1b838d6dd031185530984bf171b3d7acbff3b19464165aa4511ed329ef552a073d0194c775cafb42509e5005167acada686360e1bd43d25284b2c1430be78a333213eab81aa0b84a7bc0f99ba08baca4ce3f834aff4c078aac944ef9905af96210e5e774ca874350dead537e3e04e53d2ae50867441909b2e601bde65e9de6d15635f7a99a1ab1f4c2685373a6df0598673d827b45285fa2b13cca9f81c6223c1bf5e5e909f529bbbb46e3268899fa86448fba05a6a9055e612c34cb742db35fe54beac899b733ff173e1e77a6f4ee1cd005ca8556036550a779a255cd433acd93ad6a1e5669c6ce0597a93c03db8513e7bb1da973fc2cdb86ef2b1abc6ed324ff3184dd0e29c43b6248ba13b90743428fe1bc0ec3251586bb4d6170d6530f79d37d00a5704023a3108739f23dbbf66e206c233a6c532a6c2ba1605be6cb31e807bc5ea1098c69a4a33aa4d32aa40f8c205da3e8338f754c87f5b20aeba350b06e51eb7a4d1d538d2fbdad434d9c60be067da631a775983f5161be2375adeeec60233c04b4db30353b209fbd23efbd82ffce5263e30c135efe19d721fb54856c29146f621efd8dd6c8ab0adf3546da8cf72ee8305e5161bcdf02c63c0c8f8ad4268f85059076e5db091dcecf54381f868ed3ceb5ed6c97933ac49f879d8bd4889d9cdb4ecc177598afaa30ff183ae6f79d8b2fe9f06754f8d70c44394e3e308f15288761c6f61f1386817c4a87fc9a0af993d0912f917f6b342dc4ff3819f4fab415dc09f85a16ce4fefd354147bc6675403afaa2c4b73f01cab4fe3fcf684f1d9fbec2559b40116bd3c59c46bace10ba6df21de63616d16faa1b0176eb1fe1eed283b1b502a74fe98f41ba3098ec8d1054cd39ac459433a835ee5ef7bb048965647669a8c267f2bf0359c78973a86826f74d80ad668130614e03ac336b3dfe0a937e587bcb194c020df273e05adbf724faa9e788314387b6a21bc2681619607cb7669f506077ff8c1462f295f092dee9adb2ff3b6907eca496fc13c94d68860a9c5d0cacf8766f90d31e233a7889a7a0a56a7ce1ca6e0d9ff7976cc6176c49dd2f8b0934c72984c72265b3c2ea415858ef9091cdf2aa619d2735bd9334fb93240f769403593059294056c0ae74c5288de7a23ada03881ed9e951a2371c014890981c47993248e4b71280f8877f880b8cc7e1716343a8fd01e81d0059384f65252dea607efd14cc2d15df676e3e1111733451c1388bb6992b8514edc0eef526ad26443347e1b92b3312a53a6a8ec17a8fcd2249529576674d6353aaf2b890984dd3249d8888b30bf4591ce23322e10f995e93ed93bac51adac751e89e704126f9b2411b7111b8dea45b9311ad3a668ec1368fcda248d97798762af371d505f7c4c4d1a57bb0e8052fba5f1b3d6cd440482bf314970d29535573ab493890a747d6b92ae7ea61b191ef022c6c84b9822cf12c8fbce247969a963714ff7d48bd99d374be915e8fcde249dee1162e72e36740984dd3149987abdc6bb49da7914a6040aef9aa4704cd11f37da6b32d8f71a6bc0030299f73e2432e73a90cc4181ccfc8744e67c0792392490b968924c7945d1ce94676f4eddcdcecc6e570e8be0eb60f16e1e1419cd0821a31cf4cba59df97e26e0c24a26c09a7ee6d45b28ba92dece3b1360fd22d364a07beb9d6ec93dd3d410d8de001ce43189ef963e21bbd01e5b4f7d33304b2fa4e33a5b901df4c63afd77ea9699b0a729b5a54a686d298cdd4715d25676227b1a78254baff09f65fcf866669cbb9dc2748cf6a937c1f3b6f2127b0a8577c928fcc4fe035c3a8e7110450000 serializedProgramBytesString: - serializedSignature: 59b979ca1a402a6b8b7bb42f0306e15eb9a6019301fe908e13761a8755c0fa6fe4cecc3ac2c41e20831d07564a5a0a58069c687fa700ad13ac59cc959053340a + serializedSignature: ed77a46d7652de4394bd38636391ee7e8ed13f01a9fb7a2bb65684a8422eb15cb90a5cdc062a0517597a881d9a49c070e29eb530c5d008f87cf693c16644270d programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset b/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset index 43bf0e2..c55334d 100644 --- a/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset +++ b/Assets/SerializedUdonPrograms/fc93db3e8a03c024882acbb00d43faab.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed9d677c14d991c0df082421e2020b6241806009c3021a2132cb0242124224b14abb2cec82904642ac24b0021bce77debd60fb6c9f2f3a5d0ebeeccbc9beb897f7822f075ff6e560df9d3ff893bfdcbdaa7eada9ee79d5d3dd332575b3967e9a56a77aaffe55af5eec9eaa9cd23f997dfa6340f5a836d5a4fad5b0baa726f57f6d7a3ba17f9d3df7f85535a5b7a3fa73509fdba71a4bdc093fbb331bf46797de9b5633face5935a4b76378be57e5f5ff5dfadebcde83a323fa2fafafca2cd637f5ab76d5adaea8faccba122206f0a669732c037a6596e8cfb3ea157d368f9982447278aa5e7ff4ea33d3786e4267dabdeeba7a1ed59ad0e786f43d536a5ccbbc8d1297dcd01233a8136e969bed0ab33daaff6af4dfd3641fb438a6ffaaf5df2573bc4affd5813cf37fc6ecc3b56f9afd95e4789df97f9591df63f61f31dbd566bbc69cef35fb6b7de71f25e7757e167dcc1c5f67496bbd2fad7a9fac0dbeb46a7ddbe344d663e6da3edf351bcdf64973be9fecc3f6049171c26c8f9163c7cc7693d93e65e40c907dcd34f37147dfcce77cf79d32d73f43f661dbe093f72cd987ed499287934e1a550d4e1a55e3be34369bed6923eb1ad987ed1973fc39b2efca85e3d77de97cd4ec6ff1d9632b63db1adff62cc97ba3cf2eee35dbccb6dd679776b36d2332daccb6951c6b35db65165bb93c3a7c3c3acc76a9397ec3ec6ff7e9f9b8f2fadd0eb3dd69b6bbcc76b7b9ee79c59739b7fc9ab2b7e8d386dde703ee71cbfa39e52debe71c198b773832161f0b90e172ee247c5c1f3e4f8e759263b0ed32f7be40f6759ad51ff6c9bd64febf49f6617bc197e70b26cf9f72f25cbdc11cef36d7ddf2c9bdea93dbed3b3e486c08dbcb449765667b851c73e5667db6bfed3bbf87c8b09d7f4279fdd84d6baf4fef21afded56e3cd8a7bc3eb65f79ca52cd1d9fdc26b3bde8937bd1915be3da2be793dbccc83de0bb8ec6e952bebbc86c5b542196c3bdc3667fb1d9cfc790b5d2276b89d91f8921bbda6c0f9a7b4623dc7328c63d8763dc7324c23d2e8b385ceb7c5c3df75667b0e5735e4b1e54f7550e85410908db4473ef2cdd3803d135f0013fbb31d919dd0cbaaf05585a48fdd8fe9ad1166cb1b6901ecb2c27f96ec3cf417dc5180abd539cc4278a9280cc8debdf3c69de4debe39dd83a8406de983ed3a403da18de754b179debfad72b6540273bae9b88791d1066755220ef96ce76f195a55482a6a0ff9e1e2dd369a94ee8232ed0fb7a7f1c73d88b9f0f30a779cc7d973e3683ede649ed5a67f5f6654cad58f729fdbf2dcd3e83cc9e477b83953bee348b5d33b56b6d20f739f4d12f5a64212c02e8b12e809fc539282399f71459e28b0c9d2003c1bacbc83880c8329e632d2a87f1bca78860741d8b35b4fbb7c3fb88aea88274b19301736f420d0a166ef9c2a9d35f78ef073e59ed55eda0ca6193a7a1846a4160415e36b3be4842b00ad5d58b9b21a37efc191b7eecdef5ce237ee7ba31bc2eba016ab066f21a20034db13e8c9113ba190bd5d81d4c20af85bc84551a1c29b24f3308ab45c4c51568a96c7290ab6c9097cc37e4d2512508f29239bd0a90e1c74eb08e21582a0f1cc1453682d80b991025d8af8f39cd9f0e3ceb785093ee204fa2fc417d0e720fba84b9d6a97f2fe350d62ce627983a74a8f6fba8db892f43e2104fe5f3cc5969b1cd4ad8971c5f202bcdea3c43fe7bf5dfacbe7bc804d5d27784b7d1f2d0365a81366a0eb4516572cc59a8da6621ec15e717c442d0ea1cd571782650479774789bac0c6d935568933d0136899f47ce0a35362b605ff386a8158a3b93ee7f67f5bd7734a907e849b3263af8af0f66fe4868e6ab9179a3b54b1c2d471ce15a0be16620bcc696c93a5f26217f8ce02536c110e2d68611bc82175c67f3091cabec9bc736029cbb875206f5b5d15b0930f0b5d7df4ab03bc13a74820d45ca95ce0267f4a536842b17a62b11af9105adfafad08dacfac09e40d426d6329b674339da10c6b36b79cf5e6e138ccd494b93f2fff44f91f03a5ef80a9bcd21a6675e9fe7506a1fcbebc40e485e756bf277953308e3a67b0fab0ec8913b98d3a3b723980b38ee56fdc169057bd4c6393e05c6399c76ecb086df85d202664faad0ab1bd0ab9b022a645b6ea257cdf632b519534f161baec4aeb4152c28105bac51d85faad6f1a56a954d321cdc6a71a7667027a8cc9762bd5994ce663e9d47b874b671e96c8f95ce6a5b94c083af2e6894702235c81bc1210a47de1505eb215e42af7d51fbf203e3437dfa9a299d46def87b3971016661375b6a1abeb6d98125e354889221a9155716d670b5174c2b170d0e4163ad5b4d7a8682dab1843a83e40fb0e39bd7398852d1ade5bc7917e7cdbb6379f3a39cae599bae2bd0c3816ea123f30c0e86cd44acc8d771f1668f25de64a2c49bf51cb92738727b6391abe7d2d9c7a5b33f563a1b380b35d92cb4dae28dad6579e2635cfa395bfaa067277ac8557d6850c70b672596b35a6b0c575d45497d23977ab32d75c8eb4dfddbacff4ae502ae9bc26ba2e467932dfa63c098cfe1577f6b255acf0006f6c275ae5b947de8b554fa5c646db059139a1eb010c0df59c1c978bf69ea79d36ce6841fb2085711856fe14afb61aeb41f8955dab7dad2017f3c6af3f79596787c4defc324ed3d1d01a278762397f2315bca6be7ca790ff6ad87d1b707742e06b5fdc1bfdd09932879d8c6e5e1b82d0f0d45a5bd545ee295f9ed9ced4f70b67f3296ed1fe7b43f69d31e6a6e37bab9faf927a7ee61048a16ef7770da3ec5697b2a96b63b396d4fdbb4850abf55479969f4f3c9398d5b513fa70c38cb13200a45d17797251fb9b5f31dd17bcd5420c8891ed1cfe89c6ef5211b19d975c61ed55b99a85e2a0f5c54df6d23880dcb495182a5fa0ed0739f452d9a3c7d0448bb30f15a4ecf07d6cf46ebf9b421fb1655bae75389dc7316cb7265af9d8bf510390feabffba43d050bf56fe231e875458df57bb83c74d8f2b08ac4fa1912cde3a5fd0497f6395bdacb48da4ea48953b7ede5d2ecb4a50993d4e061d162f73e5b1a80ee3c17bbbb62c5eefd9c2e17387efe564a4f64dd9ab8342fdad20409b7630c30e738829738829763116ce6b4b962d366b985e0d918da1de0b4ebe6b4bb1a4bbb164ebba76ddac1f83d2c182cf453a36975d0925a0e0718f26a2126a20bed90ca4e44c3ccd3221fbc1c0e77044d39c7cf4da352af9dd61fce88acb3cb0c7543532978e63b7e36b84aec90cdc9c0ec7d164ecdeb891a6a4e3550c8ef69bdbca71de692ec0f48d2241433c9235c9203c1497ef6332f9e6e7cfdb5d74e464ff2a82d49189b8347a3ca9a0b38662ba93890765bb4a4baada45eddc0b9a8cf0deaeb41a6739c8e11b5620aee737fce79ef5dc165149e0e0b37b6720d8bcc2ea52a9a3baeb01cb7d914aa95e76c198eb088e1844d3098f47a18c1d778c14fda04c348db8d30825b78c12739f77ebe5cf77e8a93fc42b9924fd924c3e80f3c7d55eed8d6695ba9c461e75b892a95f14ae4add02572104be48e1825326a693cc339caed721da5d52619da4e43614a4d4023eb2c174086cb0c206d5c8ef365e6b89d0b20236506900e9b60282fa361040ff282cf716e71a75cb7e8b415719cd919112de25c3baf9ce516c1c57d2c7471bf8bc51d86022472c915fdf3361b83255e0ce33c7779137771ce335eaef35ce0244f942bf9222779b25cc9972c927338997877411cbe12eb8c821dff5e18ff69e0895db6d9029a18f755f94d8c2b5c907f5b9941bedb261862f15499b1f8aa4d3038d074999c9fe650cc28cbd848bb52d6968577058c331edc84a3945dfa7cb73ee33c900947ec3e66f3c89b38c259f02eeffad92876e9e1b49cb56979694e4b771c9b8e62dbd60075cd5d59181bef412df2660469caf080a36fc364402ba72c8f61d263ea55557828c5affb803e3a16718cb297d3fa814deb770a6add8b6787b5c459d408e472aba6e0fa68f908b3feca4b933eee5609d27d1ce9976ca4fbe799b497ad24877e8ec3cb360ecf097270d7dbd057420da03f14e6e1a3d0a071290a91018ec82b5c7ce55275f4baa72bc09b5a7b88214ed480481a94dba033958aafcf705abe6ad372a74fcb564d7d0afbb08e8e6e89bd84161ed5ffdf29ca6be1498028f97c96cbe797d8f2d9e6cb67214d6a8b2eacbf82ed51b8933f5e295b5ce3747cbb4dc7734c8dce8d2df86dd5696c15a45714f951347d8ed3f44b6d9a9e6034edc73ad7b1dc98725ad46ecb65c0d874b84409ab94edae731a7d994da3533efff4a64b7d14da5c10fb5ec1ba7234a09de1955139cd6e709abdc3a6594b44aff4c60ddbaa80f263c7f39c06afd93478ff82d5f1b0dadbd5df598b34845287f5b5c1359ef74c61f54d507bacb02ec4be2aa412ad8a1738f2af73ad2b7b1f83ab4db9085e5a4ab86b2a55866e721cbedcc6e124cba1f8191e6ff91965fa62e17b6e51b4bac569f5155ccc8bd6032db426eee9bc81201a3f24eba7414eb3afb469762db266ce1a0c6fef3a8a2ee5f4c5e394e3db1c8fafb2f1c80b47d0f27a0761db0271380d719cde69e3e4ef33d07c46e93304d5057cbf287e341be6b47c974dcb0e369af95ffe412dece62ebcaec1ed9f38d6cc737abedba627bf68c5fe020d475bb76c5722bf235c7ebfba72f9ed455bddaf487e47b9fcbec796df136c7e0b6bd99c3c4e9b7a63686ea9105f07b679ae09af51adfecde08ac40e8c56d042bf8a77c0deb4cae1033ecd7391b0f433bb90f6848e47909fbeb958567a6dee7b15ffbec5e249b9b8afde8bf77c659755bbf0aba58b5f33586b34726569d2f830d0c3a6e9fbc0aa4b8d55ab72f84cd2de98de543a175f03a92db2fb50f4578e3902ae98b64806de9470d3148c3c56d9609092a9947a366c3f0a70df4a5781178d826bb56a3cc3380d368d13344ad556573503fdf74b220af7b4651a90bdbda680ec6b259145796c290de03e5f5b00f77592e0c23f679e066c6f127ffb7a496c414be7d300ea59e25fdf2009aad4b3a46980f50681f58d92b0f8475ad2806907c1f44d9298d66013025a2aed983437f79e06688d4b0ad03e20092ddaa3ae6940f7c6a202ba0f4aa20b7e3f491a50bd0f8b666db54ff8b922e171bb49f15e965cdca183a7c63ad4cb38a83d651a1ebe0e1ebe33216939ff90221db42cd3c9c9462c84d9903d816c84565c36a092c906366bb225ca41b6645d9f8dd44ccf868ef385d117fba849338cbec017d8bc9507469a6160e42300e16903c1899cdf2c1939d72be71967a7244ce2082e3f7e7bc09f7e392fa1aff344d5da30cac589acb004d5ad84be45122514cd094f51291432316caba4b055136cdfba901ee89df3699643d92285f24982f2dbe603e5908986c18b3105518a15e63504e5b72f2c4aba6a431065ab14ca5d04e57748a2ac2f81d23f112808739d14cc9504e6772609a6608d2d06731d81f95d9230a1f13eed69b8db2652c500ae9002b89800fceee45438875358e16c2528bf4712e52655dc0c0ab3e44db080df95827a9e40fd6812a10a564162503b09d4ef95847ad052e8251e231234c20e2923ac2646f8be856c07f8fbed4752187b9b09ccef4f12cca32984d94260fe4092601e4a21ccfd04e60f2609661a9b584d04e60f2509664b0a613e4160fe7092601e4c21ccbd04e6c79204338d43775902f3479204338d931a7b08cc1f9584d9a88a7b50d19e7c11f4d54129bca709de1f93c4bbc2e085844710ae2b7bac784d51e5c0554b815304dc8f4b822b35f244332fea837552289713943f2189720b5bc4ddfe3cff7d9aa2e34faba5d09e25687f7221bdd45b15a5b1bdb981a0fc2949941b2d284b3f222458f07ba5901e24487f5ada3b67946d8dcfc33211b284a0fc1949945b2d3134ca23bf8251b4410aee5502f767930c57300888c1bd44e0fe9c245cdb4bf8d337655c47707d7c216bf4f4af56da44507e623e50865b7a98c6218f3682f2e71712e5bc5536625ed94e50fec2421670af57a67126681b41f98b92280f1894e3fa22f048fab628ff7772c67b339a6858b826658063c400bf246980dd165f2ee7055382b0dba460ef26b07f5912f64e4b0c7e2b79f50902fa5724416fb38076bedc133aaa93ea027af1fd876e40b08a007e233955601ae7ef371294bf2a8912d6057b57987a5fa124866e9914ba4504ddaf49a28b37e02738862a36e0779820fdf5e414ece3292cd83b09cadf9044e97e2f69f1c4dda4b9247df03204de6f4ac25b67a9c1a9405a530b7656eba5405e26207f2b2920059b3c62204f1190bf9d9cc898c615238f12946f26afde16442a566f1f22487f471229cc8fd1c193cbf870d720ae94176c438acdbfd71070bf2b096eade266381ddf1b37e34f6984584b20fe5e7262631a1f346824287f5f12a5bbd46606fd70fa2d308fb982a0fde4fca28db2864910ad58003840d0fe8124da4655ee1a50c1da5d6c0d6807c1fb8792785761edee7cd184731345d825b90e54ace1be94c0fb2349786e0f88ab9cd2de95dc4c40fe715240a6b12bd94040fe892448f7f103ae4ffe30bceee22881f9a7498299c6d75d9c2430ff2c493005c7d2c5603e4560fe7992600a3eff2606f30c81f91749822938e72806f31c81f997498229f8ccb018cc2e02f35349822938fc2106f30281f957498229b8ba4e0ce64502f3af2561365a6046eb950bd6ef62bdf26e82f76f24f196f7545c1ac7938e13b47f2b8936da80721a5f1cf01841f977922837abf8a39e82eb3bc47c3447c0fe7d52c11e4b21d87d04ec3f2415ac60281003bb9e80fd7452c10ab604c4c0ae2560ff31a960d3f874fc2304ec3f25156c1a1b58ab08d87f4e2a58c13e9718d81d04ecbf2415ace0c88018d8ed04ecbf2615ace0f89518d82d04ecbf2515ace028ab18d87a02f6df25c1c20316de59fb3ee52c344b5f77751981f61f92d0e2ad0d156cf68bad0d3d4290fea724d2688329825d5331ef7c9ca0fc2f4994db95f779e541fc56ae311c3975bea7ca2de20fdb8b0a5ad543f3ed73cd50b57e06dca4c6b889f3b567414fe165437e1384f3f56bdc773c654bacd3ce46588e9c8dfc7226e72bd6561b8b4dea6397153c133ba8af1dc46de1ebd672f0469d0c84a8285f4f1e2c13ec152cedb360948cbdec8e57ccd32af1fd6e364d4bebc77bedf200abe41ac1160fb3feff4ded5e95db06fa1ea880ef95ced1ff28fe1b05e7e3c549c9b3ea557dc53dccdc1466b31caf86359e5e7963986e6e7b323dba72baffafd7a31f8febd1d173f439498f76a439fd449fecce10dad9ede0d7b970d57df487c297843ae5fb8efe7f380489cd5843f2d25af5de28ea3a86522794fb0335a5f35b8fbdb87e7daf1353e0818b295303c34ff5ff035476cb631ce10000 serializedProgramBytesString: - serializedSignature: 2c59690218badd54ba4745343f6e0787878c568b93c48f471852d16ae549a7ea1aab0a9785eff6e3dc8747bcaa681efd879a5788cace203dcddd0dcbaf88d902 + serializedSignature: 56a3a9e5a4f7f51d66caf4c02e558deae5d5722dbf9026046878ea3d59d44c015b3dc70f8e370c2f425f75fbf70a60da66d93cb6d93d33214e330e5764db370e programUnityEngineObjects: [] networkCallingEntrypointMetadata: - _maxEventsPerSecond: 5 diff --git a/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset b/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset index 6252d94..a67fdf3 100644 --- a/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset +++ b/Assets/SerializedUdonPrograms/fe8a97c49553eed45bae16a0c8aa1585.asset @@ -14,7 +14,7 @@ MonoBehaviour: m_EditorClassIdentifier: serializedProgramCompressedBytes: 1f8b080000000000000aed595b73d346143eeb58765c02014a2edc66e0a930802502c33b8416d2690293d879a18c31890c666c37631b08fd099dfe217e078ffd277d69bf737695c8d24ac289c525208f76577b397bce772e3a2b175cc2a5aea3d8a4755aa62ad5699bfea01e5acba8bbf8e9a7a0ff31f551bf40d9c4d875ba94b192af9fd422ca153c0d688895af690b755bc637c8477b056b7d3c716f0bb78f59aa884575ba4f8f688d16d45c06894d5934307d8ae552d328efd13b8cfac2146fe2cad0028a0d8c0c64ac0ba683794fe8a988d5c5d816d6f4a9039acf85e2f46d5e2b3249e5987acad4cc71c9dcfc5cc05de175dc769448f4107b3469875c1e5457c7803e58990d3a932e15349f409fb71d42bc1d10b0485e175c87748b96ac929f553321be97a56c62465b8896e35bbc8f6dc1cc75f0f3436a1ba0ff81689d15d7c648957e43cdab9ed14d28e24984ca26b6ed40f53ed550ee08bd67603b3e334b24567174cd3a686a0beca227007407cf1de17043ca37c2a92fdcafa06f28fed08347dc43bd2bbbc565efa36ddbb36620b3f36837c4a47e6dee819aee431ae6de15dbfcae91cfa11186be54366e5874d947d45f314d7cc75007194702bca6715387d891be257225deaec7101c5fc6b88476fbd678dfa1dba9b2d89161759f1709f6357cedc33ffffebdf8fbb2332ada2d72e595712143b4346099de15351fa3902e82e3143d66340abfb2c1cfa6ac363e21fc7a5e5be68daf8092bc9946152000ad61c263dc6d617b407725f6bd153619ae16c66a86fd98a63c265b16b0e3afd22c8693e02ed8e09efed47067c79734b8a7f7e4da879b2f3b82950404b378484270ca86206fa29ee68a608d564d4e5c35ed066a1f3386c27f1d6b74a254ddeb5f15aa2fcdba74547f00f73722a8da113d26885e4679789e92502e5a50f6d819666c6c56226cf2c404c28e8d305bd4718b55fd872b46bc924cbc94c4f5095b84581a41308a5f15ed0690e2234743a8ed4aab31a2bf701c888e6d4ae4d94e80a78c9f52accb9fc546fb58198e552e1b84f2c63836f0de5d780ee77b3588f95cac3cfb10319b7288684d2c9fcc924247035edf92434790a3d8a4cb962939772e1b89025a409a9570e4243dc95a3547582ab8ecb7eada01ad299b8b53bcdbd4c71e44b3de9e9ac09a7c790001f65e762e0ff78a09696df1e336fd890999fb3d02cd57468fb6fd6e088120e99ac0399a8dec2e80da96d03ec08f2f76f908f15f266675074ba8e2fe312b116917ec712fd3db8efa0b87ea2f8ef3d3617bbf926933fbe1d71e363d0ebf3f7ee391d1637cce3008a52090781c48e6f2f6f6a63551d7afe0c87e87394a5546fcfed8c7087310df9f12dfd7d0cde709dd5cc8e86d10f2187fd2d3df747303d2f2a57032401643402ee409e47103246fdcc294c61e6d4ee87203cec90b380a01b7982770f306b82d13fd86919c38cc3cdb696e5056f282d2094179364f282f1b28f581a02756d897e3c86bd43dfad57cf83d6a001742009fcb13e0d94427ef99295f5f84547464d24c8f83f0798a657569b981ceea4e19697bd873553ca609ea4da9f7333c9789a93b34de91289d6676fa75212c50444b9d8969691229a54dd2c3a49733295a71d91c8eb4fc1749ff5b6c5ec56567410e1f75685e13f7714aedcb1fd77d99e3fc0faf558946b41f0000 serializedProgramBytesString: - serializedSignature: ebec854f6e0c12c84fd59970f27138528030cbf22ae645c6effe45630e65af72fb9e076f7b30b61a55c1497f47cba59e488fa99708bc0bdfa9840a75288e3205 + serializedSignature: 7f9d34298229f57f9db1cedb595a99df8fa188e438d3dc95de73bab881869b50fdaae245695860511e3782a87b1c2a0fdae4e65340b3af24958f490855a37b0e programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Assets/SerializedUdonPrograms/fec48ef3ff984c2479126c773047b8eb.asset b/Assets/SerializedUdonPrograms/fec48ef3ff984c2479126c773047b8eb.asset index 3fab80f..b8cc27e 100644 --- a/Assets/SerializedUdonPrograms/fec48ef3ff984c2479126c773047b8eb.asset +++ b/Assets/SerializedUdonPrograms/fec48ef3ff984c2479126c773047b8eb.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf61d954ecb803046953c666facfb904, type: 3} m_Name: fec48ef3ff984c2479126c773047b8eb m_EditorClassIdentifier: - serializedProgramCompressedBytes: 1f8b080000000000000aed9df75f1cc715c0e7908e2261f5823a9290746adc0112ea8526842a42806d154b2090840d48a628b6536c274e737ae2244e9c66c7e93d71123bb19dde9b934f7ecde7931ff30fe4e764deec2cf76ef7cdde2e7befb83d1b3edcb0b3bb6fdefb4e7b5376af2429e44f6c87fce8155da245d48a1e31206e8951f95f8b0c47e4af7564c7778a3119de909f7df2dc0e519de54ef8d912ab929f1df2685c4cc83b27c535190ea9f3e7c5a0fcbf43de3b288f20f6bafc1b9457c566cb9b7a44ab382bce88e5b1a55944f4aa9bc6755c0cec8a95cbcf66f1b03c3ba894824492ead472f9715e9e1957e746a4d2f67517c56565d6883c774dde332686a5cc7e25b1fc092931a66c52c15c1d56ea70abfcabd0ffcfd2e136f9572affbad035763c84dbf5f9f3e8585a5eb2c021c7be6f87bebe5b1fdfa5c3d93aacd5e77bf4715c87f3916eb53a5ca0e3e435f1091d374f873bd1f50b511c8429471a291d2e4ecb2badd6718b749844f2923aac43714b74588fe2ea501c840d3add5e742ced8efdc72177a983d5dd8ef3cb74fc3d8ef82a1d2e77dc67b35f818ee1fcbd9aef6a1d5fa2752fd7ffe33252aac35d84cdbb51dc2e140761a3c3e646cbe692d7f4f14a1daed2618bbefe023a86b015a5518ae2e0ff8bfab84c877b081df7a2b83d280ec27d0e1df7593aceb2cb94ada3cdc98f8e6582d6b15c87fb091d0fa0b8fd280ec2830e1d0f5a3aceb6f3dcd6714d001dcb05ada37dfe10a1e361c7793b0ec2230e1d8f681d5f76e8b836808e1582d6718e0e8f123a36a1b8a3280ec266878ecd968ef1ab0e1dd705d0718ea075a4ea53b548b767106e10536d4eb95dbed6ebb00da5d1a6c36322b3ed3a26d26d21841bf5f94b8efbe62159945e54dc621dd6e8f0b8967d191d43d88e646fd261078a6bd7e10991d997d8fdce4974ed49742d84a74466ff72cacaafb27f3b64dbf79d1699fdcb691d6ed6e119477e9e119965e7ac3e7f1f3a86f4861dd777eaebaea063db6e2ce7aa43ce8b0ebdce21dbcfe9705196bcb26d5d818e517b5efa94c3a66cf2a8b80d225d1641765fc0fbedb4b798d28ec79487745cfa2c7de2b648aa1ba167f2ebcad9776677e24074297cc0cf1695ec8474976e4b018427d5a3fcb409d93bd7939ed48a5825d2bb457df6c92b8694d07e77122fb99200e586e5ef207203c7657cbbf222c1111c92676a65611f52775d95aec445f99b29a557263b2c5dc94159d827655220efaa54db7d653693c06574ded325655a1eed888cb181de96c7c34ac3f3eaf38ed2745069df21e326947f3d2a3dec66193ea45273db3e26ffa7d2ecd6c8681d69c7d6146fb9cf7636b54a6b40fba4f247dfc89199c811405fdaafabe1eca4f2f89f74e5c41b0cad4626ae3a134b469d4216cb88ab17493536ea72110c6ea3db42ba7c5bbc1ba593ef650b4d06b27b95b2209dc30f265e79e4b967fff54c3cd3b40691542efeea2ca67981057989d83297046f13e2f1d92950d4893f46e1572efef93ce2b7ae1b52d705cf8052d533656680eaca7ae4252d2a794b8d61ada82b575220a24c8175779bd99433a12da1d096e71b6df6b6c40b6df9945d69b4f04313ac3010cca68389e02c8aa0f2b91e6025d823e32ca7a74d9d1d523d655ae62d750ca9d993525e7700c7d36a926b52e9e24d7cce94cd69e249159954259a53b3b9da25563f65713a932b5526f32b632a14b3a942a12673ee9f9142d1ae265c07e538a85fdcafddacdc16099849dce9281274decc537953eb9137b9d0d69433712267529033f329032a1c0680ee06c1a55496ab31f6006b96774bb3ad7975f07506e59909190377ddd4f13d1228b46e99084d577b67f302dfd9bc50657342889c6b68cada322a6b210716f9c9da85e6ac2d37095e1c52708549f0929082e798042f0d29782e2518f82c233ae1ffc91f97f00ab3f04aaa0aa9258afcbbd9d37345c0ad58eedb15a9125e5e725047e42e53d6ac20b2e69fa05480ac99676a3657866c36e79b04af0a297801559894194333d20577ab554f98d7b8ae327324c71df06adf2df31a55ec767a74c0e1753515d285a642ba9628a435b16085741195e5aa805d62cd72f7fca7fd5fb3bcf7a6b4e78e9ad49a94f753f3a5de19bbce77c656ab8cad16d42c6e308d4cd9b79822bc60e62a95db8bcf6da55aef9bfd86ac952abcaea65c5942e58aaa69f91cc43bbdf5603de746dfa46b043d80cf96be89de52aa49025f1216d35c53365003aec8df94fc7b50458d0b7bca1ae26135c2dadee26ab9cacc2dd732930e9b291de6211d3a74f91952a787c4235437e991f272aaeca886f4f13cb799f43a13351674d7247ba1a14b86d79516100f5a645f9ff22e975b0431d5a19ac136b29d9d292b60a035079a7ec38cc856556b0a4b67538dac32d5866d546d80b1ce356a0235402d5841a5080e356ca8723af4301ded125e6516be92120e6ec90e3f2e6eb559f02a13a79d1427185d8dc843e861ce395aae20ac569b52ada552856ea85fa53129d373a60bad17b89841d25f634a3f696a2bcde9d7054a79ad29e554f094eb03a5bcce94725df0941b02a55c4da50c0e7bbd703bec4fc78339eceb29e130f86bf053333c067f1b4c82778514bc91ea2e95ffd5cdda5d3ab79bde520ddda01aa50577b6607be076e73405dd6f34aa7ea3ca655c76154cad7b0d85503961e7f288d0cfb2300d4fed6f74c0538d34c96fafe2b7d46599e7eaa981dc26aa54c3216c9974aeee76bff0d8a1ff3edffaaaab74c7cda57bb3a999d94f3533d03f821b3aa6bafe61f99fbde9664876f7411a992d54ba505d0f84acae0993e08321056fa5040310d89549ce00067018b699841fce81f0ed947068c18e908d825372a359f20e4a32f83947fdc0ae360bde69cac5a690b9584b0986eb9bfd085e63169c34a16809892265d2b835a4c67584e0a41a965e77b55df998d9e15ba96ca348916d37ecee4dc4a0367268696ae5eba92c869c68f793c5c7cc59dc60aaf9c7c3d6fc5d26953b42aabcdb24f84448c18d261627c3b2d86352f9544895f79a049f0e29789f89c599b02cf69b543e1b52e50326c19d21051f34b1381796c52193ca5d21553e6c127c3ea4e0232616dd61591c35a9dc1352e52693e0de90829b4d2cee0ecba285920cb326f7f851b9c62cb895120c4ef8bd7e047b78eb6d946070c72ef811ece18e1da304c3f517fd08f6706eda29c1302f71c98fe04ab3e0e326c197430aeea004c3213c19e31cead93f41867a27a804ac115df831c64993f0ab39107eca5415fbc256c5d39464f0dafbfde466b559f019531dbf16b28e9f35b11808cba2d3540007735400cf5109c052f2753f4c369805775182a139bb2188498c4d227374d324fd7458bf83ed6730b97143c0f3e15764a91b541efd84b8a9e2f13de9fd3a419ad1f3263d6f527a3639f44ca769e9794b8ebf2c2dc7e56fb75ae31ff5d0d41c9f7926739e2f887ddd26fb8628fbea1df6e19195334fda759ef8b501cb0a62418fc982fb290bc027a5c77fd44a5a66e99a706db881b3b434f7e69c2036f59a6c7a80b2a9c76893db16ab0476a8b3b0326ead47c37d665bb0147fd7e4aa74de6de2304c711814f6baa9bd9289d731ad9207731ed7d5b38850073ba6ae6c137784b556daa5ac80e9d13beaea5a6d0f9481cc5763f4aa5d04b0a6dfafac73da8d1ff7309775e75dbd3285a053b3f798388d98ca0b27a751796d8b5ad59a5072d3f778130acfe15e1387518ac3115fad7593d46140efdeb0f78f846bada7d7135d30d9768bb2ed02631eb787ae0bb969f92f9a88dca688c0044a7a937bb7f0dae26ed9393ed5ee5bd77297de4b267b1ea4ece934b6faeebe27b30debd3fb3f2602f55f5e6d7a2eacbf6cb27e8cb2fea4d17af7ee175c6add67c75ddadbab7e663a6e2969ef2788cdf7996c1ea76c3ee6e17df9e9ddcd3d90dfbe69fa3df91593a5137efc4cebd14bab0db26ded9671e92755bdeda3da5fb82b8805574d164c5216d023014813e7545b965cc2f699e27395437d26fbee50f69d98ea5fec3776f5e9d5a63e75b765257dce5caf281f3cd8d5b4c565f2371683d9af36bd03ed61d90ede5272a00548aa0d96a9299bb2efbb03e6236affceb02c8976af977d37dd9b84f93d1bee35bce9be72219b1554ff5f8b3c006c9dffbd99eed74b94698b6c5992b4da36586c963e8473b524a9362a6e9f6669caaec5c390da2cba0c057fe8dc127046d72525c0deb6dca227286000ecdca0d6a9ce0c4a215935c8b6e77ba71260f7ba3978f90c143bcb6d1f13d6544b4d093c865c92829c7984139ff5be23abcd83be2a0a70e0075a488770a7bb91ab37c0f87d4583bb3999af1af08794e335a6e40d389b17b58db7d0347f336e1e12ae32929846a54bf768744f9402916f799d773629e86cde0a10baecb659b5006fe36c0196eabcbca6013afd6becbba59ca987799d4b45464b11f763da745a8b4d22dd943eca09728706392c2f1a562e73baa5a486a7fe07b28cd8d770613f86b03fc6897dbec6dea83e2d0f79545e9a7e668a0dde3c2e781b10bcc7f3016f6f11c14b20786fe784b74cc34b63f31ad33356e21a2e942d08e53bf281d2d409654e5d32a22ce342b914a17c8213e55aa254167757538bd0be93132de461f6c7ceeca97a36900bb940962190efe204698f1f6e18db4eacfe157898830b660517cc8508e6bb0b092663156783791782f99e4282591f4198d508e67bf301d3d4ab3b17e5184b662317cc8d08e6939c3057fbeed733fdce3aced6f31817d62684f57d9c5883799ebb23e879ae4128dfcf8912761e3bdf5e624fbe456f18391b61fb0027367b0cde90ff31783517bc4508de0739e1ad9a66abb82f826de26104f5438508756f04a11e42503f5c8850f74410ea0104f5238508b5318250f723a81f2d44a88cce111bd4bd08eac70a11eaae0842dd83a03e5588501b2208753782faf14284ca3815c206751782fa8942841ac5b17b3d82fac94284ca38cfc406b50e417d9a13ea2691b98d61588fe0ed2daa571ccf6998df01cc0aba9a0b741281fe142768ef375d456fa38d40e03ecd092edb945df4973be62294cf70a2f4bf58ec7e848415ed062eb4e710dacf70a2b5a7f55245b4b5661e82f7d97cc0db5344f0b620789f9bc9f631734983d16d675bd2a842283fcf89726388f631fd881d6b4b59c905f93882fc85992cafd1df47b704a17c361f284d9b1732ab7e14f7d1b52294cf71a25c92a554da96b262dccb85b10661fc227789342d0adb43ca4e3d06ea9bba3d4afd7a1ca17cbe70fa75c67523b6cabd0ea1fc12274adbbfdc957fff926d64b318c1fb32273cffdf5613bdd99f9508e2573821da8f5d997a6a4bf5e83e76d589407e9513e47a02242831a1e62047c5091982635e6c73442508f0d70aa7db615caf64eb765623945fcf47a5b7e7d687c84acf5e26abb8406e4520bfc10972b30364bf702f3e14f732c56984fa9b9ca86d57a9ae88a6e2e62378dfe28497725578ea053303be5e5948bf6c86b1ecb2e16f43f8bfcd891fb6a17a7d5b56b788eaa35a1508e177f251fdddab94a3fa92e8f5f73104efbbf9e8efbd9d7cf667dcd8fafb1308e4f70a0564141da76d08e4f70b0524e3ca101bc89308e40f38413ab7c9b827428adbffdc8140bfc0097ab503b4f51622eb1dd71da2b5c8a64d3a10d61f72620d36aa67ec9cd87af96508e58f3851867be302235ab6372ea410da1fe7b3f2c3ceb8f45b3d8b6d99f80cc2fa222756dba9df5d4463faf508de4bf92893c1b7724771dff15184f52785d321313ec0c5d621ad45287fca8912bef0c6f4a5ecd19df22845f85ee6c4e73d6bd41061847310c257660e615d8411962384afe6a38faecf7f1fcde6372e40f07ec6090fa6479d23f2f108eec19c8580fd9c1398bfb7c04677a6720502f98b420119c599ca4a04f2979c209d4b6793c609b4f1d7d1a6ec7684ff579cf8ed777799268a9defee627cf707dbbbbbce2298bf2e2498517c11da7604f337850493b1bb6283d98060feb6906032ae09b1c16c44307f574830195f43c106731f82f9fb4282c9b8f1900de64104f30f850493f1553e6c308f20987f2c24988c73956c309b11cc3f15124cc6c75ad8609e4230ffcc0933d81c3a63f7c33687be0aa1fc0b27ca351a257c35fb901a6216f77e8ee508ec5f0ba78c320e2bd9cae86684f26f9c28b70aef57f558eb8fc5bf9f78a7289a2f844bc10368af41a129d785266198cc4ec4bcdeb79c08fce06dc2d7b26122e09760247c2f0565bbb2def795e9153aeb5be716ea72302a73e3b4807d637d927b9f0ad3df409784ae25063e40906fc1f49609a5c05bdadf21ab6374fb309cb3f29b8bafbca32ccd6e9fb92e547ae44a121a9da2b6ff1f90ef3adb55315daebe1cb147e6fc807e2ae4acbc784029053ff1ff03cb131c1f1ac50000 + serializedProgramCompressedBytes: 1f8b080000000000000aed9df75f1cc715c0e7906812562fa8a38e1a778024542c4b0810421521c0b68a251048c606240ba4d84eb3d3e338dda94eb3e3f49e38899dc44eef3df10ff921f91ff24b7e4ee6cdce72ef76dfdbdb65ef1d7738f0e1869ddd7df3de77da9bb27b2549a57f12dbf547afea522daa4ef5a801755d8deaff5a7438a27f9d2337be53ddd4e135fdd9a7cf6d573559ee849fcd896afdd9a18fc6d4b8bef396baa2c32173feac1ad4ff77e87b07f511c45ed57f83faaac44c7d538f6a55a7d529b534b1388b885e73d3988d4b805d890afd79583da2cf0e1aa52091a439b5547f9cd567c6ccb911adb47bdd7975d19835a2cf5dd1f7dc54c35a66bf9158f19c969830369960b60dab6cb855ff55daff67d8709bfe2b33a9a5af71e321dc6ecf77a3636d7949ca23c7bd6f87bdbec71edf61c399364cdaf3bdf6b8d48673916e491bceb371fa9ad2a76cdc1c1bd6a1ebe7a33808eb3d69d4db70615a5ed9211bb7c0862924cfb5ad01c52db261238a6b407110eeb4e9de8d8e81558547ee620fab7b3ce79720a6d4f9a536fe5e4ffc321b567bee73f366b947ee39cb7fa58d2fb1b655d8ff71192ab3e12e82c96e14b70bc541d8e461d26499fcdb1eafb0a1ab43abbdfe3c3a86b00da55186e2e0ff0bf6b8dc867b081df7a2b83d280ec27d1e1df7393ace70cb9cabe3aa083a962b5a47b72cec2774bc13c5ed4771101ef0e878c0d171a66b8babe3ea083a56285a47f7fc5d848e073de7dd38080f79743c6475fca747c7351174ac54b48eb36cd84ce87818c535a338085b3c3ab6383a963ee6d1b126828eb314ad23559fd6aa747b07e17a35d12655b879bdce8647501a476cd8ae32dbb676956e2b21dc60cf5ff4dc3707c9a2f4a2e216da70a30d3bacecfbd031844791ec4d363c86e28edaf0b8caec6bdc7ee904baf604ba16c2932ab3ff39e9e417a89921dbbdef94caec7f4ed970b30d4f7bf2f3b4ca2c3b9df6fc2574acd32b7fd273fd197bdd6574ecda8de5f479e4fcc3a35717b2bdcb860bb2e4956beb72748cdaf3b2e73d36659347c5ad57e9b208b2fb23deefa65dcba55d9a301ed451edd3f4a91b2a696edca2c2bb7aee9dd99d3c105d061ff0b3d9243baedda91b5a00e169f5183f6e5cf7ea0da4a7b52c5185f46e319f7dfa8a2123f48a3f89177d498072c3fa7710b989633abedd7899e0280ee933753a6387cc5d97b50b735eff664ae9d5c90e6b577350578e5b3a29907759abedbf329b49e0527aefe9d2321d8f7744c7b8406fe8e361a3e159f379db683a68b4efd071e3c6ff1ed51ef8611d3e6c52f3db7e53ff4fa5d96d91d13ad28e2f17efb8d76e36b56a6b40fba4f157ff9f2353912380beec8aad8633936644f0842f27fecfd06964c031efb032ea0db244465c834a9ab153978f60741bfd16d2e5dbe1bd5b0f6c826ca1c94076af3016a473f8a1da971e7df6997f3d5d9a695aa34a1a177f6516d382c082bcdac4129f8460134a4b67a640512ffe0485dfb8f867f388dfb96ec85c173d03ca4ccf949901a62bebd197b498e41d3586ada2be5c4981887203d6df6d66538e435b42a1adc837daec6d4910da8a09bbd268e1872658c910cca60347700645d0f85c0f8a12ecd1718ed3d366ce0e999e322df3ba3986d4dc49aba03b80e349330976cbe8124c7cd684cd69e249139934255a52b3d9d625363fe5a5742657994c9657862b1433a9426126731e989242d16e266407f5f8a95f3d60ddacdc16099869dce1291274decc317953179037b9d096cb995222675290337329032a3d0680ee8ce0322acbcd187b4034cbbbb5d9cebc3bf83a83faccb88e81bbeeb7f13d1a28b46e9908b9ab83b3795ee86c9e6fb21906a0b9d690cbda722a6b21071684c9daf97cd656708217c6145cc9095e1453f02c4ef0e2988267538281cf12a213feaffef109afe485575155c82c61e4dfcd9e9c2b026ec5d2d0ae48b50af292a33a22777059b38cc89a5740a9085933876b3697c76c36e7728257c4143c8f2a4cc68ca129e982bbcdaa28cc6b5c35993992e30e7865e896799529763b023ae0f8ba7285743e57485713857443225a215d4065b929601744b3dc3fffe9fe7758df7bbfb6e7b699d4baa5efa7e64b8333764de88cad31195ba3a859dc681a71d9b790223c6fea2a95df8bcf6da55a1b9afdbaac952abeae5cae2ca272c5d4b47c0ee2bdde7ab49e737d68d21b143d80cf963e476f31d524812f090b6fbe291ba80197f46f4aff3d64a2c6943b650df1b01ae16c7ff1b55ce57ccbb584d36113a5c33ca403949701e3264f3ef5a55cea9ba9d4e7a0d43b6ce91d32a787d4a354271d90723555724d33fe789e5b6c7a958b1a89faebb1bbccd1a5c3ab460b88072db2af8e05d78a5a454cb49846b88d6ce5a7ca0a58399c051d0f331fb3d5d4d9c2d2996b0f9671b5611b551b60a475859abe8d500b965329823b0fdbbdbcc309980cf709afe685afa0849bc90eaac5f50aaee105afe438d5519c606c37a20fa1bd3ae36937a3b05ac5a59aa452854eb0dfa4714ba7e74d175a2f7070a3a4bf9a4b3fc5b5957cfaf591525ec3a55c1f3de5864829d7702937444fb93152ca6ba99461b8d0a8fcc385174aa30d17d651c261e8b9334ccd08187aaee704ef8a297803d55d1aefaf5bb4bbf46e86bd6e1aba4133468ceeeac1e6c46dde4912badf6832fd46b5cfb8ec2a70adfb460aa17101cfe411619845691a9ed95de981671a6992df5ec36fb1cfb2c0b55b86dc26aa54c3216cd8f4ae2d773fffd881ff3cd7fab2af7497f2a57b33d7cceca79a19e81fc10dbd69bafe61fd9fbbe5674877f7511a995a2a5da8ae77c6acae5b38c107620ade4a090620b027949c7f8ce0306ce3841fcc81f0ed947068c10e918d825772132f79072519fc9ce630b06b78c1755c2e1e8e998b494a305cdf1246f02a5e708a43d11a13453da7715b4c8d1b08c1493328beea6bbbf231af24b74e7a842245b6ddb0b7b83601555d424bae956fa4b21872e268982c6ee7b3782757f33be2d6fc5d9ccac762aabc9b137c3ca6e0268ec589b82cf6702a9f8ca9f25e4ef0a99882f7712c4ec765b19f53b933a6ca777282cfc4147c8063d11597c55d9cca6763aa7c9013dc1d53f0218e454f5c16cd9ccabd31553ecc09be3ba6e0168ec53d7159b4529261d6e4de302a6fe005b75182c1093f17467080b77e84120ceed8f9308203dcb1764a305c7f218ce000e7e6282518e6252e86115cc50beee004df1753f0314a301cc27339dea19efb1365a8779c4a00c6189755fc31c6094e785f0e849fe4aa627fdcaa788a920c5efb9530b959c30b3ecdd5f1819875bc9363311897c519ae005ecd5101eca2128075b56b6198ace3059fa504437376bf22263136aaccd14db3f6d361fd0e36bfc1e4c635054faf5fd2457ad078f4e35a0cc4e37bd2bb85a234a3dd9c9e43949ecd1e3dd3693a7a5ed7e32f47cb31fddb6d76188c0668cac7679ec99ce78b625f0f67df03947d0d1efbf0c8ca9b27ed364fc2da806545b1a097b3e041ca027076e9f11fb5929659bac67ddb7de02c2dcdbf35288a4d7773360d5336f5b036f96d714a6087390bebf2ce7a34dcc7db82a584bb2657a5f31e8ec308c56150b9eba6ee4a265ec7744a1ecc795c354f42421dec98b8b24ddd56ce5a6997b102a6476f9babebac3d5006325fdcd16b7611c09a7ebfb1ce6b377ed8842febdebb7a750a51a766efe5388d72e5459213ecb46831ab5ae3466efa9e6042f1399ce3385ca7381c0cd55a376b1d06ecee0d77f74abcd67a723dd179ceb61b946de704f3b83d765dc84dcb7f8123f21045046666d25becbb55d0067bc7ceb18976dfb956baf45ee4ecb949d9d3c9b6fafebe27b30debb3fb3fc623f55f416d7a2eacbf8fb37e8cb2fe386bbd7ff70b2eb5feb3633eeddd553f9e8e5f4adafb8962f325cee671cae62301de5798de9def81c2f64d93efc92f7396de0ae3673a0f7e3a6d906b6bb78e4b3f271b6c1fd5fec25d512ce8e32cb84d59408f04204d9c536d597209dbc7c5e72a87fa39fb5e43d9776ca27f71df27d667579bfaccdd8e95f439be5e513e78b4ab698bcbf56f2201b35f6d7607da23ba1dbc6ee4400b90345b3b53133665df7707cc47ccfe9d615d12dd5e2ffb6eba8715ff960fff1ade645ff890cd0aaaffaf431e00b62efcde4cffcb2dcaad45ae2c4dda6c659d6e963e8273b52469b6466e9b6469caaec5a390da0cba0c457fe4dd1170cad62523c0ddb6dc6227286000ecdda0d669ce0c6a215935c8b6e37c8711e0f6ba3978f50d143bc76dbfa99ca996d6127808ba240539f35a497cce5b999c360ffaaa6280033fd0427a847bdd8d5cbd7f26ec0b22fccdc95cd3803f6c1caf9b46de80b779317b840b4df3d7e1e6a1d657466a2751e9d23d1add13a540e4eb5fe59d4d0a3a9b370084b36edb6c5a80374ab6008b6d5e5eb100bdfe35f6dd52ded4e3bc4ca632a3a5280d63da645a8b4d2add943e260972bb0539ac2f1a362e73baa5a486a7e107b282d85749616f47d81f97c43ed762df6d3e1d0f79545f9a7e664a0cde1c2978eb11bc37e503de9e69046f0b82f76649784b2cbc34b6a031bd6025de2085b215a17c4b3e50729d50e6d4a520ca7229948b11cab74aa25c4d94cae9ddd52411dab749a2853cccfed8993b552f0672be14c87204f2ed9220ddf1c335b6edc4ea5f828748a460564ac19c8f60bea390600a56713198772098ef2c24980d4508732d82f9443e6072bdba77514eb0643649c1dc8060be4b12e6cad0fd7aa6df592fd97ab64b613d8cb03e2989359ae7b9ab083dcf5508e5bb2551c2ce63efbb53dcc9b7e21b46ce44d8de2389cd1d8337e67f0c5e23056f0182f75e49782b26d92aee2dc236f12082fabe4284baa708a1de85a0bebf10a1361521d43b11d40f1422d4dd4508753f82fac142842ae81c8941dd8ba03e558850771621d43d08ea870a116a631142dd8da07eb810a10a4e858841dd85a07ea410a116e3d8bd1141fd682142159c671283da80a07e4c12ea4695b98d61d88ee0dd2daa973ccf69f06f2016055d23053a85407f5c1274f09bae8a6fa38d42e09e9604976dcaaef8973b6623949f9044197eb1d8ff088928da755268bb10da4f4aa275a7f552d3686bcd1c04ef53f980d7348de0d522789f9ecaf631734943d06d175bd2588a507e4612e5fa18ed63fa113bd196b24a0a720782fccc5496d7e2df47b708a17c361f28b9cd0b9955bf18f7d1b521949f9544b9284ba9742d15c5b8570ae34684f139e912c92d0abb43ca4e3b06ea9bb8bd98faf55284f27385d3af0bae1b8955ee3508e5e72551bafee5cefcfb9762239b8508de1724e185ffae9ce29bfd5981207e5112a2fbd815d7533baa17ef63576710c82f49825c4b800425c6cd1ce4a83aa64370cca7db1c510902fce5c2e97604d72bc5ba9d9508e557f251e9ddb9f521b2d28b97c96a29905b11c8af4a82dce401d9affc8b0fd37b99e21442fd3549d4aeab543f8da6e2e622785f978497f25578ea053303a15e5948bf6c46b0ec8ae13f82f07f43123f6c430dfab6ac6e55ac8f6a552284df2c9cde5f705bad58efbf19a1fc563e5a52ff82efa8bda4f8e02510bc6f4bc20b375e127f5c50cc753a8e407ea7504016a30fba0d817cbe50400a2eb289813c81407e5712a477c7917f4e697abbf23b10e8ef49825ee901edbcd0c9795d78876a9d663350c710d6ef4b628de62209764e62bdfc1284f2054994f15e5e218856ece515f508ed8bf9acfcb0c930fd82d4e9b6e27e1a61fd812456d7a9df358da647d621783fcc47998cbe2bbe18b7703723ac3f2a9c0e49f05938b10e693542f992244af8ee20eefbed8b77f6a80ce17b59125ff0045c6311239c8510fe78ea10d61731c20a84f027f9e8a31bf2df478bf98df310bc9f4ac2839966ef887c4c0e98d876d61908d8cf2481857ba16ef1ce542e47207f5e28208b71a6b20a81fc852448ef2ae42d76026dec55b4bffd28c2ff4b49fcee6bd0b88962ef6bd0045fa322f61ab44e04f3578504b318df29b71dc1fc7521c114ecaec460ee44307f53483005d784c460362198bf2d2498826ff41083b90fc1fc5d21c114dcc32906f30082f9fb428229f8562431988710cc3f14124cc1b94a31982d08e61f0b09a6e0134262304f22987f9284196d0e5db0fb119b435f8650fe5912e52a8b12bee57ec80c31a7f77e8e6a04f62f8553460587956265b406a1fcab24ca2d2af8ad47cefae3f4df9a5da7a6cd77eba560a2f26f50682a6ca1a96526b36b1341afaeae8dfc0c736da865c3da88df27521b7a2928db950da1af4cafd0395fe037df9683519d1b2715ec1bebd3dcfb4c98fe32bf243c459980171646f942d16099500a82a5fd1db23a41b70fc3392bbfb9f8f640cad2ecf6f175a12a205792d0e84c6bfb5f817cb7d96e8ae952f33d933d3ae707ec0336a7f5c5034629f829fd1f2558934203c70000 serializedProgramBytesString: - serializedSignature: 54e7319a32b97e680a6e771f944b995734c97ca24d33842c76220a18045c111a3101f0c1c4d3bd359d0a7e617b3a81e3385935f7a183346a625f9cfadd543001 + serializedSignature: 3b882f87ab32ab82dce9aebccbb6a9effca4e2d42c1252e0d9ba03c3876bf8095a072b6e264d037b42452ecce8a619dcf8b3aec26fc0858ae0ff6e5789e30202 programUnityEngineObjects: [] networkCallingEntrypointMetadata: [] serializationDataFormat: 0 diff --git a/Thry/presets_known_materials.txt b/Thry/presets_known_materials.txt index 8f9e60f..2ab572b 100644 --- a/Thry/presets_known_materials.txt +++ b/Thry/presets_known_materials.txt @@ -336,6 +336,7 @@ d7c5d3c6793ffa143905aca94a9661c0 a0b09dec009b0984da77051738ef69e9 2458ae1ee426e7e468f747ab9acfb8ca ad4af114db07ed14da631b2b98be01e1 +f9048d49b12588b489343e8c4461d43f 670c93b6400cecc4d9427ca653ff6a79 b9257d637744d15458654516d0135220 85980b42c2579134d951ee2c7bf3c7f6 @@ -394,8 +395,11 @@ dd0230fc1fb9dc141a4bf63f069a8c5d 41c915fe141e9bb46a82cc8f3146d7d7 910fa54bcbdeb6e4fbbda994a76372c4 a5b644ad52ca8024aad424f62b5682ed +6de578af1c253b9429e499e26a698144 1e21ef144704e1140a5ef07064b27209 38b0ea3521603844580cb9fffc997106 +487478f4e1c54324b8c767e8b689f6d4 +840bcb10a024ade40964d286b99b9498 f1545e25aa69a6345a6d3f60f9447381 f869b641fc19d3c4792b8323406d90cd 0559fb43973f08141ba9df521c0e1cc7 @@ -450,6 +454,10 @@ cb7fb80e6c856fc478acc8b306610246 1611d9bc5e3b2d348887fbca07869875 5c40cf8d61da6e44eb6de89d5dca8708 bb19e43323bd364469274a424008ae68 +cc37737c3ff5d7e42b4865d89ac84218 +0664dd90b57b6444abebc51ece6d0c5d +b7dc74f4403e254448549cb30b4423b1 +83b0c504531cce747a03372c31c6c9b6 60e29f412de0e3440b13dfa29cb52ffb 2c3faa757fbff294ea7ff2a2bea8ce81 8d933e10488cb884cba7c4b078d7981a @@ -610,4 +618,3 @@ a55ec86caa49e2842bd0b3ba16a29726 e354306e1de62794cb849e432c5dab00 9e508165d967ae94b933a68320f57282 8a8010d8337860148b8d861ce6784e46 -f9048d49b12588b489343e8c4461d43f