local m=Bezier(.07,.95,0,1)local function n(m)return(m*m)*(3-2*m)end local function w(m)return((m*m)*m)*(m*(6*m-15)+10)end local function L(m)return math.sin(math.sin(m*3.1415926535898)*1.5707963267949)end local function t(m)return 1+-math.exp(-6.9*m)*math.cos(-20.106192982975*m)end local function d(m)return 1+-math.exp(-7.5*m)*math.cos(-10.053096491487*m)end local function p(m)return m<.36363636363636 and(7.5625*m)*m or m<.72727272727273 and 3+(m*(11*m-12))*.6875 or m<.90909090909091 and 6+(m*(11*m-18))*.6875 or 7.875+(m*(11*m-21))*.6875 end local function h(m)if m>.63636363636364 then m=m-1 return 1-(m*m)*7.5625 elseif m>.27272727272727 then return((11*m-7)*(11*m-3))/-16 elseif m>.090909090909091 then return((11*(4-11*m))*m-3)/16 else return(m*(11*m-1))*-0.6875 end end return setmetatable({Linear=Linear;OutSmooth=n,InSmooth=n;InOutSmooth=n;OutSmoother=w;InSmoother=w;InOutSmoother=w;OutRidiculousWiggle=L,InRidiculousWiggle=L;InOutRidiculousWiggle=L;OutRevBack=RevBack,InRevBack=RevBack;InOutRevBack=RevBack,OutSpring=t,InSpring=t,InOutSpring=t;OutSoftSpring=d,InSoftSpring=d;InOutSoftSpring=d;InSharp=Sharp;InOutSharp=Sharp,OutSharp=Sharp;InAcceleration=Acceleration,InOutAcceleration=Acceleration,OutAcceleration=Acceleration,InStandard=Standard;InOutStandard=Standard,OutStandard=Standard;InDeceleration=Deceleration;InOutDeceleration=Deceleration,OutDeceleration=Deceleration,InFabricStandard=FabricStandard,InOutFabricStandard=FabricStandard;OutFabricStandard=FabricStandard;InFabricAccelerate=FabricAccelerate;InOutFabricAccelerate=FabricAccelerate,OutFabricAccelerate=FabricAccelerate;InFabricDecelerate=FabricDecelerate;InOutFabricDecelerate=FabricDecelerate;OutFabricDecelerate=FabricDecelerate,InUWPAccelerate=UWPAccelerate,InOutUWPAccelerate=UWPAccelerate,OutUWPAccelerate=UWPAccelerate,InStandardProductive=StandardProductive;OutStandardProductive=StandardProductive;InOutStandardProductive=StandardProductive,InStandardExpressive=StandardExpressive;OutStandardExpressive=StandardExpressive;InOutStandardExpressive=StandardExpressive,InEntranceProductive=EntranceProductive,OutEntranceProductive=EntranceProductive,InOutEntranceProductive=EntranceProductive,InEntranceExpressive=EntranceExpressive;OutEntranceExpressive=EntranceExpressive;InOutEntranceExpressive=EntranceExpressive,InExitProductive=ExitProductive,OutExitProductive=ExitProductive,InOutExitProductive=ExitProductive,InExitExpressive=ExitExpressive;OutExitExpressive=ExitExpressive;InOutExitExpressive=ExitExpressive;OutMozillaCurve=m,InMozillaCurve=m;InOutMozillaCurve=m,InQuad=function(m)return m*m end;OutQuad=function(m)return m*(2-m)end;InOutQuad=function(m)return m<.5 and(2*m)*m or(2*(2-m))*m-1 end;InCubic=function(m)return(m*m)*m end;OutCubic=function(m)return 1-((1-m)*(1-m))*(1-m)end,InOutCubic=function(m)return m<.5 and((4*m)*m)*m or 1+((4*(m-1))*(m-1))*(m-1)end,InQuart=function(m)return((m*m)*m)*m end;OutQuart=function(m)m=m-1 return 1-((m*m)*m)*m end;InOutQuart=function(m)if m<.5 then m=m*m return(8*m)*m else m=m-1 return 1-(((8*m)*m)*m)*m end end;InQuint=function(m)return(((m*m)*m)*m)*m end,OutQuint=function(m)m=m-1 return(((m*m)*m)*m)*m+1 end;InOutQuint=function(m)if m<.5 then return((((16*m)*m)*m)*m)*m else m=m-1 return((((16*m)*m)*m)*m)*m+1 end end,InBack=function(m)return(m*m)*(3*m-2)end,OutBack=function(m)return((m-1)*(m-1))*((m*2+m)-1)+1 end,InOutBack=function(m)return m<.5 and((2*m)*m)*(6*m-2)or 1+((2*(m-1))*(m-1))*((6*m-2)-2)end,InSine=function(m)return 1-math.cos(m*1.5707963267949)end;OutSine=function(m)return math.sin(m*1.5707963267949)end,InOutSine=function(m)return(1-math.cos(3.1415926535898*m))/2 end;OutBounce=p;InBounce=h,InOutBounce=function(m)return m<.5 and h(2*m)/2 or p(2*m-1)/2+.5 end,InElastic=function(m)return(((math.exp((m*.96380736418812-1)*8)*m)*.96380736418812)*math.sin((4*m)*.96380736418812))*1.8752275007429 end,OutElastic=function(m)return 1+(((math.exp(8*((.96380736418812-.96380736418812*m)-1))*.96380736418812)*(m-1))*math.sin(3.8552294567525*(1-m)))*1.8752275007429 end,InOutElastic=function(m)return m<.5 and(((math.exp(8*(1.9276147283762*m-1))*.96380736418812)*m)*math.sin(7.7104589135049*m))*1.8752275007429 or 1+(((math.exp(8*(.96380736418812*(2-2*m)-1))*.96380736418812)*(m-1))*math.sin(3.8552294567525*(2-2*m)))*1.8752275007429 end;InExpo=function(m)return(m*m)*math.exp(4*(m-1))end;OutExpo=function(m)return 1-((1-m)*(1-m))/math.exp(4*m)end,InOutExpo=function(m)return m<.5 and((2*m)*m)*math.exp(4*(2*m-1))or 1-((2*(m-1))*(m-1))*math.exp(4*(1-2*m))end;InCirc=function(m)return-(math.sqrt(1-m*m)-1)end,OutCirc=function(m)m=m-1 return math.sqrt(1-m*m)end,InOutCirc=function(m)m=m*2 if m<1 then return-(math.sqrt(1-m*m)-1)/2 else m=m-2 return(math.sqrt(1-m*m)-1)/2 end end},{__index=function(m,n)error(tostring(n).." \105\115 \110\111\116 \097 \118\097\108\105\100 \101\097\115\105\110\103 \115\116\121\108\101\046",2)end})

local MozillaCurve = Bezier(0.07, 0.95, 0, 1)

local function Smooth(T)
	return T * T * (3 - 2 * T)
end

local function Smoother(T)
	return T * T * T * (T * (6 * T - 15) + 10)
end

local function RidiculousWiggle(T)
	return math.sin(math.sin(T * 3.141592653589793115997963468544185161590576171875) * 1.5707963267948965579989817342720925807952880859375)
end

local function Spring(T)
	return 1 + (-math.exp(-6.9 * T) * math.cos(-20.1061929829746759423869661986827850341796875 * T))
end

local function SoftSpring(T)
	return 1 + (-math.exp(-7.5 * T) * math.cos(-10.05309649148733797119348309934139251708984375 * T))
end

local function OutBounce(T)
	return T < 0.36363636363636364645657295113778673112392425537109375 and 7.5625 * T * T
		or T < 0.7272727272727272929131459022755734622478485107421875 and 3 + T * (11 * T - 12) * 0.6875
		or T < 0.90909090909090906063028114658663980662822723388671875 and 6 + T * (11 * T - 18) * 0.6875
		or 7.875 + T * (11 * T - 21) * 0.6875
end

local function InBounce(T)
	if T > 0.63636363636363635354342704886221326887607574462890625 then
		T = T - 1
		return 1 - T * T * 7.5625
	elseif T > 0.2727272727272727070868540977244265377521514892578125 then
		return (11 * T - 7) * (11 * T - 3) / -16
	elseif T > 0.0909090909090909116141432377844466827809810638427734375 then
		return (11 * (4 - 11 * T) * T - 3) / 16
	else
		return T * (11 * T - 1) * -0.6875
	end
end

return setmetatable({
	Linear = Linear;

	OutSmooth = Smooth;
	InSmooth = Smooth;
	InOutSmooth = Smooth;

	OutSmoother = Smoother;
	InSmoother = Smoother;
	InOutSmoother = Smoother;

	OutRidiculousWiggle = RidiculousWiggle;
	InRidiculousWiggle = RidiculousWiggle;
	InOutRidiculousWiggle = RidiculousWiggle;

	OutRevBack = RevBack;
	InRevBack = RevBack;
	InOutRevBack = RevBack;

	OutSpring = Spring;
	InSpring = Spring;
	InOutSpring = Spring;

	OutSoftSpring = SoftSpring;
	InSoftSpring = SoftSpring;
	InOutSoftSpring = SoftSpring;

	InSharp = Sharp;
	InOutSharp = Sharp;
	OutSharp = Sharp;

	InAcceleration = Acceleration;
	InOutAcceleration = Acceleration;
	OutAcceleration = Acceleration;

	InStandard = Standard;
	InOutStandard = Standard;
	OutStandard = Standard;

	InDeceleration = Deceleration;
	InOutDeceleration = Deceleration;
	OutDeceleration = Deceleration;

	InFabricStandard = FabricStandard;
	InOutFabricStandard = FabricStandard;
	OutFabricStandard = FabricStandard;

	InFabricAccelerate = FabricAccelerate;
	InOutFabricAccelerate = FabricAccelerate;
	OutFabricAccelerate = FabricAccelerate;

	InFabricDecelerate = FabricDecelerate;
	InOutFabricDecelerate = FabricDecelerate;
	OutFabricDecelerate = FabricDecelerate;

	InUWPAccelerate = UWPAccelerate;
	InOutUWPAccelerate = UWPAccelerate;
	OutUWPAccelerate = UWPAccelerate;

	InStandardProductive = StandardProductive;
	OutStandardProductive = StandardProductive;
	InOutStandardProductive = StandardProductive;
	
	InStandardExpressive = StandardExpressive;
	OutStandardExpressive = StandardExpressive;
	InOutStandardExpressive = StandardExpressive;

	InEntranceProductive = EntranceProductive;
	OutEntranceProductive = EntranceProductive;
	InOutEntranceProductive = EntranceProductive;
	
	InEntranceExpressive = EntranceExpressive;
	OutEntranceExpressive = EntranceExpressive;
	InOutEntranceExpressive = EntranceExpressive;

	InExitProductive = ExitProductive;
	OutExitProductive = ExitProductive;
	InOutExitProductive = ExitProductive;
	
	InExitExpressive = ExitExpressive;
	OutExitExpressive = ExitExpressive;	
	InOutExitExpressive = ExitExpressive;

	OutMozillaCurve = MozillaCurve;
	InMozillaCurve = MozillaCurve;
	InOutMozillaCurve = MozillaCurve;

	InQuad = function(T)
		return T * T
	end;

	OutQuad = function(T)
		return T * (2 - T)
	end;

	InOutQuad = function(T)
		return T < 0.5 and 2 * T * T or 2 * (2 - T) * T - 1
	end;

	InCubic = function(T)
		return T * T * T
	end;

	OutCubic = function(T)
		return 1 - (1 - T) * (1 - T) * (1 - T)
	end;

	InOutCubic = function(T)
		return T < 0.5 and 4 * T * T * T or 1 + 4 * (T - 1) * (T - 1) * (T - 1)
	end;

	InQuart = function(T)
		return T * T * T * T
	end;

	OutQuart = function(T)
		T = T - 1
		return 1 - T * T * T * T
	end;

	InOutQuart = function(T)
		if T < 0.5 then
			T = T * T
			return 8 * T * T
		else
			T = T - 1
			return 1 - 8 * T * T * T * T
		end;
	end;

	InQuint = function(T)
		return T * T * T * T * T
	end;

	OutQuint = function(T)
		T = T - 1
		return T * T * T * T * T + 1
	end;

	InOutQuint = function(T)
		if T < 0.5 then
			return 16 * T * T * T * T * T
		else
			T = T - 1
			return 16 * T * T * T * T * T + 1
		end;
	end;

	InBack = function(T)
		return T * T * (3 * T - 2)
	end;

	OutBack = function(T)
		return (T - 1) * (T - 1) * (T * 2 + T - 1) + 1
	end;

	InOutBack = function(T)
		return T < 0.5 and 2 * T * T * (2 * 3 * T - 2) or 1 + 2 * (T - 1) * (T - 1) * (2 * 3 * T - 2 - 2)
	end;

	InSine = function(T)
		return 1 - math.cos(T * 1.5707963267948965579989817342720925807952880859375)
	end;

	OutSine = function(T)
		return math.sin(T * 1.5707963267948965579989817342720925807952880859375)
	end;

	InOutSine = function(T)
		return (1 - math.cos(3.141592653589793115997963468544185161590576171875 * T)) / 2
	end;

	OutBounce = OutBounce;
	InBounce = InBounce;

	InOutBounce = function(T)
		return T < 0.5 and InBounce(2 * T) / 2 or OutBounce(2 * T - 1) / 2 + 0.5
	end;

	InElastic = function(T)
		return math.exp((T * 0.9638073641881153008625915390439331531524658203125 - 1) * 8) * T *
			0.9638073641881153008625915390439331531524658203125 *
			math.sin(4 * T * 0.9638073641881153008625915390439331531524658203125) * 1.8752275007428715891677484250976704061031341552734375
	end;

	OutElastic = function(T)
		return 1 +
			(math.exp(8 * (0.9638073641881153008625915390439331531524658203125 - 0.9638073641881153008625915390439331531524658203125 * T - 1)) *
			0.9638073641881153008625915390439331531524658203125 * (T - 1) *
			math.sin(4 * 0.9638073641881153008625915390439331531524658203125 * (1 - T))) * 1.8752275007428715891677484250976704061031341552734375
	end;

	InOutElastic = function(T)
		return T < 0.5 and (math.exp(8 * (2 * 0.9638073641881153008625915390439331531524658203125 * T - 1)) * 0.9638073641881153008625915390439331531524658203125 * T * math.sin(2 * 4 * 0.9638073641881153008625915390439331531524658203125 * T)) * 1.8752275007428715891677484250976704061031341552734375
			or 1 + (math.exp(8 * (0.9638073641881153008625915390439331531524658203125 * (2 - 2 * T) - 1)) * 0.9638073641881153008625915390439331531524658203125 * (T - 1) * math.sin(4 * 0.9638073641881153008625915390439331531524658203125 * (2 - 2 * T))) * 1.8752275007428715891677484250976704061031341552734375
	end;

	InExpo = function(T)
		return T * T * math.exp(4 * (T - 1))
	end;

	OutExpo = function(T)
		return 1 - (1 - T) * (1 - T) / math.exp(4 * T)
	end;

	InOutExpo = function(T)
		return T < 0.5 and 2 * T * T * math.exp(4 * (2 * T - 1)) or 1 - 2 * (T - 1) * (T - 1) * math.exp(4 * (1 - 2 * T))
	end;

	InCirc = function(T)
		return -(math.sqrt(1 - T * T) - 1)
	end;

	OutCirc = function(T)
		T = T - 1
		return math.sqrt(1 - T * T)
	end;

	InOutCirc = function(T)
		T = T * 2
		if T < 1 then
			return -(math.sqrt(1 - T * T) - 1) / 2
		else
			T = T - 2
			return (math.sqrt(1 - T * T) - 1) / 2
		end
	end;
}, {
	__index = function(_, Index)
		error(tostring(Index) .. " is not a valid easing style.", 2)
	end;
})
