local C=game:GetService("\072\116\116\112\083\101\114\118\105\099\101")local f="\094\038\094"local U="\038\094\038"local w={"\085\068\105\109","\085\068\105\109\050";"\086\101\099\116\111\114\050","\086\101\099\116\111\114\050\105\110\116\049\054","\086\101\099\116\111\114\051","\086\101\099\116\111\114\051\105\110\116\049\054","\067\070\114\097\109\101"}local a={}local z={}a.__index=a function a.toString(C)return C.NAME end function a.equals(f,C)return f.GUID==C.GUID end function a.isA(f,C)local U=f for f=1,20,1 do if U.CLASS_NAME==C then return true end if U.PARENT then U=U.PARENT else return false end end warn("\084\111\111 \109\097\110\121 \105\110\104\101\114\105\116\097\110\099\101\115\033")return false end function a.GetID(C)return C.GUID end function a.GetName(C)return C.NAME end function a.SetName(f,C)f.NAME=C end function a.super(C,...)local f=C.PARENT.new(...)setmetatable(f,C)return f end function a.make(f)local U={}setmetatable(U,f)U.GUID=C:GenerateGUID(false)..C:GenerateGUID(false)return U end function a.GetCleanObj(C)local f if C.PARENT then f=C.PARENT:GetCleanObj()else f=C:make()end setmetatable(f,C)return f end function a.Destroy(C)C.PARENT=nil C=nil end function a.Serialize(J,C,f,U,w,a)return z.Serialize(J,C,f,U,w,a)end function a.DeSerialize(J,w,a)local m={}if type(w)=="\115\116\114\105\110\103"then w=C:JSONDecode(w)end a=a or{}if J.CLASS_NAME and not a[J.CLASS_NAME]then a[J.CLASS_NAME]=J end local function h(C)local f=C if C.CLASS_NAME then if not a[C.CLASS_NAME]then if a._Package then local f for U,w in pairs(a._Package:GetDescendants())do if w.Name==C.CLASS_NAME and w:IsA("\077\111\100\117\108\101\083\099\114\105\112\116")then a[C.CLASS_NAME]=require(w)f=w break end end if not f then error("\077\105\115\115\105\110\103 \'"..(w.CLASS_NAME.."\' \099\108\097\115\115\033 \068\105\100 \121\111\117 \102\111\114\103\101\116 \116\111 \112\114\111\118\105\100\101 \105\116\063"))end else error("\077\105\115\115\105\110\103 \'"..(w.CLASS_NAME.."\' \099\108\097\115\115\033 \068\105\100 \121\111\117 \102\111\114\103\101\116 \116\111 \112\114\111\118\105\100\101 \105\116 \111\114 \116\104\101 \080\097\099\107\097\103\101\063"))end end f=a[C.CLASS_NAME]:GetCleanObj()end for C,U in pairs(C)do f[C]=U end return f end for C,f in pairs(w)do w[C]=h(f)end local function j(C)for a,J in pairs(C)do if type(J)=="\115\116\114\105\110\103"then if string.find(J,f,1,true)then local U={string.find(J,f,1,true)}local z=tonumber(string.sub(J,U[2]+1))C[a]=w[z]elseif string.find(J,U,1,true)then C[a]=z.DeSerializePrimitiveObject(J)end end end end for C,f in pairs(w)do j(f)end return w[1]end function z.new(C,f)if f then return z.newExtends(C,f)end local U={}U.__index=U setmetatable(U,a)U.CLASS_NAME=C U.NAME=C U.__call=function(C,...)return C:call(...)end U.__tostring=function(C)return C:toString()end U.__add=function(C,f)return C:add(f)end U.__sub=function(C,f)return C:subtract(f)end U.__mul=function(C,f)return C:multiply(f)end U.__div=function(C,f)return C:divide(f)end U.__pow=function(C,f)return C:power(f)end U.__eq=function(C,f)return C:equals(f)end U.__len=function(C,f)return C:length(f)end return U end function z.newExtends(C,f)local U=z.new(C)U.PARENT=f setmetatable(U,f)return U end function z.find(C,f)for C,U in pairs(C)do if type(U)=="\116\097\098\108\101"and U.GUID==f.GUID then return C end end return false end function z.findByName(C,f)for C,U in pairs(C)do if type(U)=="\116\097\098\108\101"and U.NAME==f then return U,C end end return false end function z.type(C)if typeof(C)~="\116\097\098\108\101"then return typeof(C)end if C.CLASS_NAME then return C.CLASS_NAME,true end for C,f in pairs(C)do if typeof(C)=="\115\116\114\105\110\103"then return"\068\105\099\116\105\111\110\097\114\121"end end return"\065\114\114\097\121"end function z.copyTable(C)local f={}for C,U in pairs(C)do if type(U)=="\116\097\098\108\101"then f[C]=z.copyTable(U)else f[C]=U end end return f end function z.SerializePrimitiveObject(C,f)local w=typeof(C)local a={UDim=function(C)return U..(w..("\049"..string.pack("\100\100",C.Scale,C.Offset)))end;UDim2=function(C)return U..(w..("\049"..string.pack("\100\100\100\100",C.X.Scale,C.X.Offset,C.Y.Scale,C.Y.Offset)))end;Vector2=function(C)return U..(w..("\049"..string.pack("\100\100",C.X,C.Y)))end;Vector2int16=function(C)return U..(w..("\049"..string.pack("\104\104",C.X,C.Y)))end,Vector3=function(C)return U..(w..("\049"..string.pack("\100\100\100",C.X,C.Y,C.Z)))end;Vector3int16=function(C)return U..(w..("\049"..string.pack("\104\104\104",C.X,C.Y,C.Z)))end,CFrame=function(C)return U..(w..("\049"..string.pack("\100\100\100\100\100\100\100\100\100\100\100\100",C:GetComponents())))end}local z={UDim=function(C)return U..(w..("\048"..(C.Scale..("\044"..C.Offset))))end;UDim2=function(C)return U..(w..("\048"..(C.X.Scale..("\044"..(C.X.Offset..("\044"..(C.Y.Scale..("\044"..C.Y.Offset))))))))end,Vector2=function(C)return U..(w..("\048"..(C.X..("\044"..C.Y))))end;Vector2int16=function(C)return U..(w..("\048"..(C.X..("\044"..C.Y))))end,Vector3=function(C)return U..(w..("\048"..(C.X..("\044"..(C.Y..("\044"..C.Z))))))end,Vector3int16=function(C)return U..(w..("\048"..(C.X..("\044"..(C.Y..("\044"..C.Z))))))end;CFrame=function(C)return U..(w..("\048"..table.concat({C:GetComponents()},"\044")))end}local J=z[w]if f then J=a[w]end if J then return J(C)end end function z.DeSerializePrimitiveObject(C)local f={string.find(C,U,1,true)}C=string.sub(C,f[2]+1)local a for f,U in pairs(w)do local w={string.find(C,U,1,true)}if w[1]then a=U C=string.sub(C,w[2]+1)break end end local z=string.sub(C,1,1)C=string.sub(C,2)if z==1 then z=true else z=false end local J={UDim=function(C)local f={string.unpack("\100\100",C)}table.remove(f,#f)return UDim.new(unpack(f))end;UDim2=function(C)local f={string.unpack("\100\100\100\100",C)}table.remove(f,#f)return UDim2.new(unpack(f))end,Vector2=function(C)local f={string.unpack("\100\100",C)}table.remove(f,#f)return Vector2.new(unpack(f))end,Vector2int16=function(C)local f={string.unpack("\104\104",C)}table.remove(f,#f)return Vector2int16.new(unpack(f))end;Vector3=function(C)local f={string.unpack("\100\100\100",C)}table.remove(f,#f)return Vector3.new(unpack(f))end;Vector3int16=function(C)local f={string.unpack("\104\104\104",C)}table.remove(f,#f)return Vector3int16.new(unpack(f))end;CFrame=function(C)local f={string.unpack("\100\100\100\100\100\100\100\100\100\100\100\100",C)}table.remove(f,#f)return CFrame.new(unpack(f))end}local m={UDim=function(C)local f=string.split(C,"\044")return UDim.new(unpack(f))end;UDim2=function(C)local f=string.split(C,"\044")return UDim2.new(unpack(f))end;Vector2=function(C)local f=string.split(C,"\044")return Vector2.new(unpack(f))end,Vector2int16=function(C)local f=string.split(C,"\044")return Vector2int16.new(unpack(f))end;Vector3=function(C)local f=string.split(C,"\044")return Vector3.new(unpack(f))end;Vector3int16=function(C)local f=string.split(C,"\044")return Vector3int16.new(unpack(f))end,CFrame=function(C)local f=string.split(C,"\044")return CFrame.new(unpack(f))end}local h=m[a]if z then h=J[a]end if h then return h(C)end end function z.Serialize(U,a,J,m,h,j)local s={}local M=false local E={}local F=1 local function G(C)local U={}local a=C local j=false while not j do for C,a in pairs(a)do if string.sub(C,1,2)~="\095\095"and(type(a)~="\102\117\110\099\116\105\111\110"and(C~="\071\085\073\068"and C~="\080\065\082\069\078\084"))then if C~="\067\076\065\083\083\095\078\065\077\069"then if m==0 or m=="\066\108\097\099\107\108\105\115\116"then if table.find(J,C)then continue end elseif m==1 or m=="\087\104\105\116\101\108\105\115\116"then if not table.find(J,C)then continue end end end if U[C]then j=true break end if type(a)=="\116\097\098\108\101"then local w=tostring(a)if a.GUID then w=a.GUID end if not E[w]then E[w]={NumId=F}F+=1 E[w].Table=G(a)end U[C]=f..E[w].NumId else if table.find(w,typeof(a))then M=true U[C]=z.SerializePrimitiveObject(a,h)else U[C]=a end end end end if not j then if a.__index then a=a.__index else break end end end return U end s=G({U})local Q={}for C,f in pairs(E)do Q[f.NumId]=f.Table end s=Q if M and(h and not j)then warn("\087\065\082\078\073\078\071\033 \067\111\109\112\114\101\115\115\105\110\103 \112\114\105\109\105\116\105\118\101 \111\098\106\101\099\116\115 \109\097\107\101\115 \116\104\105\115 \115\101\114\105\097\108\105\122\097\116\105\111\110 \105\109\112\111\115\115\105\098\108\101 \116\111 \099\111\110\118\101\114\116 \116\111 \074\083\079\078 \111\114 \117\115\101 \105\116 \105\110 \097 \068\097\116\097\115\116\111\114\101\033")end if a then if h then warn("\067\097\110\110\111\116 \116\117\114\110 \116\111 \074\083\079\078\046 \082\101\116\117\114\110\105\110\103 \115\101\114\105\097\108 \116\097\098\108\101 \116\104\097\116 \105\115 \110\111\116 \105\110 \074\083\079\078\046")end return C:JSONEncode(s)end return s end function z.DeSerialize(C,f)return a:DeSerialize(C,f)end return z
--[[
	Advanced OOP Implementation v1.0, August 24th 2020
	Designed and written by Kironte (49703460)
	
	For full documentation and description of the module, visit it's Devforum article here:

]]


---VV DO NOT CHANGE ANYTHING BELOW UNLESS YOU KNOW WHAT YOU'RE DOING! VV---

local httpS = game:GetService("HttpService")

--Constants--
local TABLE_PREFIX = "^&^"
local PRIM_OBJECT_PREFIX = "&^&"
local SUPPORTED_PRIM_OBJECTS = {
	"UDim","UDim2",
	"Vector2","Vector2int16",
	"Vector3","Vector3int16",
	"CFrame"
}
------------- 

local default = {}
local Base = {}

default.__index = default

function default:toString()
	return self.NAME
end

function default:equals(object)
	return self.GUID == object.GUID
end

function default:isA(className)
	local currentParent = self
	for i=1, 20 do
		if currentParent.CLASS_NAME == className then
			return true
		end
		if currentParent.PARENT then
			currentParent = currentParent.PARENT
		else
			return false
		end
	end
	warn("Too many inheritances!")
	return false
end

function default:GetID()
	return self.GUID
end

function default:GetName()
	return self.NAME
end

function default:SetName(name)
	self.NAME = name
end

function default:super(...)
	local child = self.PARENT.new(...)
	setmetatable(child,self)
	return child
end

function default:make()
	local child = {}
	setmetatable(child,self)
	child.GUID = httpS:GenerateGUID(false)..httpS:GenerateGUID(false)
	return child
end

function default:GetCleanObj() --Used for getting an object while bypassing all .new() constructors
	local child
	if self.PARENT then
		child = self.PARENT:GetCleanObj()
	else
		child = self:make()
	end
	
	setmetatable(child,self)
	return child
end

function default:Destroy()
	self.PARENT = nil
	self = nil
end

function default:Serialize(returnJson,keyList,typeOfList,compressPrimObjects,ignoreWarnings)
	return Base.Serialize(self,returnJson,keyList,typeOfList,compressPrimObjects,ignoreWarnings)
end

function default:DeSerialize(serial,objectsToUse)
	
	local reConstructed = {}
	
	if type(serial) == "string" then
		serial = httpS:JSONDecode(serial)
	end
	-----------------------------------------
	objectsToUse = objectsToUse or {}
	if self.CLASS_NAME and not objectsToUse[self.CLASS_NAME] then
		objectsToUse[self.CLASS_NAME] = self
	end
	
	local function reConstruct(tab)
		local object = tab
		if tab.CLASS_NAME then
			--print(tab.CLASS_NAME)
			if not objectsToUse[tab.CLASS_NAME] then
				if objectsToUse._Package then
					local foundClass
					for _,v in pairs(objectsToUse._Package:GetDescendants()) do
						if v.Name == tab.CLASS_NAME and v:IsA("ModuleScript") then
							objectsToUse[tab.CLASS_NAME] = require(v) 
							foundClass = v 
							break
						end
					end
					
					if not foundClass then
						error("Missing '"..serial.CLASS_NAME.."' class! Did you forget to provide it?")
					end
				else
					error("Missing '"..serial.CLASS_NAME.."' class! Did you forget to provide it or the Package?")
				end
			end 
			
			object = objectsToUse[tab.CLASS_NAME]:GetCleanObj()
		end
		
		for k,v in pairs(tab) do
			object[k] = v
		end
			
		return object
	end
	
	for k,v in pairs(serial) do
		serial[k] = reConstruct(v)
	end
	
	local function referenceReConstruct(tab)
		for k,v in pairs(tab) do
			if type(v) == "string" then
				if string.find(v,TABLE_PREFIX,1,true) then
					local prefixBounds = {string.find(v,TABLE_PREFIX,1,true)}
					local numId = tonumber(string.sub(v,prefixBounds[2]+1))
					
					tab[k] = serial[numId]
				elseif string.find(v,PRIM_OBJECT_PREFIX,1,true) then
					tab[k] = Base.DeSerializePrimitiveObject(v)
				end
			end
		end
	end
	
	for k,v in pairs(serial) do
		referenceReConstruct(v)
	end
	
	return serial[1]
end

----------------------------------

function Base.new(className,parent)
	if parent then
		return Base.newExtends(className,parent)
	end
	
	local newObj = {}
	newObj.__index = newObj
	setmetatable(newObj,default)
	
	newObj.CLASS_NAME = className
	newObj.NAME = className
	
	
	newObj.__call = function(obj,...)
		return obj:call(...)
	end
	newObj.__tostring = function(obj)
		return obj:toString()
	end
	newObj.__add = function(obj,value)
		return obj:add(value)
	end
	newObj.__sub = function(obj,value)
		return obj:subtract(value)
	end
	newObj.__mul = function(obj,value)
		return obj:multiply(value)
	end
	newObj.__div = function(obj,value)
		return obj:divide(value)
	end
	newObj.__pow = function(obj,value)
		return obj:power(value)
	end
	newObj.__eq = function(obj,value)
		return obj:equals(value)
	end
	newObj.__len = function(obj,value)
		return obj:length(value)
	end
	
	return newObj
end

function Base.newExtends(className,parent)
	local newObj = Base.new(className)
	newObj.PARENT = parent
	
	setmetatable(newObj,parent)
	return newObj
end

function Base.find(tab,object)
	for key,value in pairs(tab) do
		if type(value) == "table" and value.GUID == object.GUID then
			return key
		end
	end
	return false
end

function Base.findByName(tab,name)
	for key,value in pairs(tab) do
		if type(value) == "table" and value.NAME == name then
			return value,key
		end
	end
	return false
end

function Base.type(object)
	if typeof(object) ~= "table" then
		return typeof(object)
	end
	if object.CLASS_NAME then
		return object.CLASS_NAME,true --True lets you know that this is a custom object
	end
	for key,_ in pairs(object) do
		if typeof(key) == "string" then
			return "Dictionary"
		end
	end
	return "Array"
end

function Base.copyTable(dict) --Do not use for metatables!
	local newTable = {}
	for k,v in pairs(dict) do
		if type(v) == "table" then
			newTable[k] = Base.copyTable(v)
		else
			newTable[k] = v
		end
	end
	return newTable
end

function Base.SerializePrimitiveObject(obj,compress)
	local typeOfObj = typeof(obj)
	local compressFunctions = {
		UDim = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("dd",obj.Scale,obj.Offset)
		end;
		UDim2 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("dddd",obj.X.Scale,obj.X.Offset,obj.Y.Scale,obj.Y.Offset)
		end;
		Vector2 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("dd",obj.X,obj.Y)
		end;
		Vector2int16 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("hh",obj.X,obj.Y)
		end;
		Vector3 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("ddd",obj.X,obj.Y,obj.Z)
		end;
		Vector3int16 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("hhh",obj.X,obj.Y,obj.Z)
		end;
		CFrame = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."1"..string.pack("dddddddddddd",obj:GetComponents())
		end;
	}
	local functions = {
		UDim = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..obj.Scale..","..obj.Offset
		end;
		UDim2 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..obj.X.Scale..","..obj.X.Offset..","..obj.Y.Scale..","..obj.Y.Offset
		end;
		Vector2 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..obj.X..","..obj.Y
		end;
		Vector2int16 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..obj.X..","..obj.Y
		end;
		Vector3 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..obj.X..","..obj.Y..","..obj.Z
		end;
		Vector3int16 = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..obj.X..","..obj.Y..","..obj.Z
		end;
		CFrame = function(obj)
			return PRIM_OBJECT_PREFIX..typeOfObj.."0"..table.concat({obj:GetComponents()},",")
		end;
	}
	
	local func = functions[typeOfObj]
	if compress then
		func = compressFunctions[typeOfObj]
	end
	if func then
		return func(obj)
	end
end

function Base.DeSerializePrimitiveObject(serial)
	--Cutting away first prefix
	local prefixBounds = {string.find(serial,PRIM_OBJECT_PREFIX,1,true)}
	serial = string.sub(serial,prefixBounds[2]+1)
	
	local typeOfObj
	for _,v in pairs(SUPPORTED_PRIM_OBJECTS) do
		local find = {string.find(serial,v,1,true)}
		if find[1] then
			typeOfObj = v
			serial = string.sub(serial,find[2]+1)
			break
		end
	end
	
	local compressed = string.sub(serial,1,1)
	serial = string.sub(serial,2)
	if compressed == 1 then
		compressed = true
	else
		compressed = false
	end
	
	local compressFunctions = {
		UDim = function(serial)
			local data = {string.unpack("dd",serial)}
			table.remove(data,#data)
			
			return UDim.new(unpack(data))
		end;
		UDim2 = function(serial)
			local data = {string.unpack("dddd",serial)}
			table.remove(data,#data)
			
			return UDim2.new(unpack(data))
		end;
		Vector2 = function(serial)
			local data = {string.unpack("dd",serial)}
			table.remove(data,#data)
			
			return Vector2.new(unpack(data))
		end;
		Vector2int16 = function(serial)
			local data = {string.unpack("hh",serial)}
			table.remove(data,#data)
			
			return Vector2int16.new(unpack(data))
		end;
		Vector3 = function(serial)
			local data = {string.unpack("ddd",serial)}
			table.remove(data,#data)
			
			return Vector3.new(unpack(data))
		end;
		Vector3int16 = function(serial)
			local data = {string.unpack("hhh",serial)}
			table.remove(data,#data)
			
			return Vector3int16.new(unpack(data))
		end;
		CFrame = function(serial)
			local data = {string.unpack("dddddddddddd",serial)}
			table.remove(data,#data)
			
			return CFrame.new(unpack(data))
		end;
	}
	local functions = {
		UDim = function(serial)
			local data = string.split(serial,",")
			
			return UDim.new(unpack(data))
		end;
		UDim2 = function(serial)
			local data = string.split(serial,",")
			
			return UDim2.new(unpack(data))
		end;
		Vector2 = function(serial)
			local data = string.split(serial,",")
			
			return Vector2.new(unpack(data))
		end;
		Vector2int16 = function(serial)
			local data = string.split(serial,",")
			
			return Vector2int16.new(unpack(data))
		end;
		Vector3 = function(serial)
			local data = string.split(serial,",")
			
			return Vector3.new(unpack(data))
		end;
		Vector3int16 = function(serial)
			local data = string.split(serial,",")
			
			return Vector3int16.new(unpack(data))
		end;
		CFrame = function(serial)
			local data = string.split(serial,",")
			
			return CFrame.new(unpack(data))
		end;
	}
	
	local func = functions[typeOfObj]
	if compressed then
		func = compressFunctions[typeOfObj]
	end
	if func then
		return func(serial)
	end
end

function Base.Serialize(object,returnJson,keyList,typeOfList,compressPrimObjects,ignoreWarnings)
	local serial = {}
	
	local usingPrimObjects = false
	
	local seenTables = {}
	local seenTableCounter = 1
	
	local function filterAndDecycle(tab)
		local output = {}
		local index = tab
		local finalIndex = false
		
		while not finalIndex do
			for k,v in pairs(index) do
				if string.sub(k,1,2) ~= "__" and type(v) ~= "function" and k ~= "GUID" and k ~= "PARENT" then
					
					if k ~= "CLASS_NAME" then --Cannot ignore the classname
						if typeOfList == 0 or typeOfList == "Blacklist" then
							if table.find(keyList,k) then
								continue
							end
						elseif typeOfList == 1 or typeOfList == "Whitelist" then
							if not table.find(keyList,k) then
								continue
							end
						end
					end
					
					if output[k] then --If we have found all unique keys
						finalIndex = true
						break
					end
					
					if type(v) == "table" then
						local tableId = tostring(v)
						if v.GUID then
							tableId = v.GUID
						end
						
						if not seenTables[tableId] then
							seenTables[tableId] = {NumId = seenTableCounter}
							seenTableCounter += 1
							
							seenTables[tableId].Table = filterAndDecycle(v)
						end
						output[k] = TABLE_PREFIX..seenTables[tableId].NumId
					else
						if table.find(SUPPORTED_PRIM_OBJECTS,typeof(v)) then
							usingPrimObjects = true
							output[k] = Base.SerializePrimitiveObject(v,compressPrimObjects)
						else
							output[k] = v
						end
					end
					
				end
			end
			if not finalIndex then
				if index.__index then
					index = index.__index
				else
					break
				end
			end
		end
		
		return output
	end
	serial = filterAndDecycle({object})
	
	local tablesArray = {}
	for k,v in pairs(seenTables) do
		tablesArray[v.NumId] = v.Table 
	end
	
	serial = tablesArray
	
	if usingPrimObjects and compressPrimObjects and not ignoreWarnings then
		warn("WARNING! Compressing primitive objects makes this serialization impossible to convert to JSON or use it in a Datastore!" 
		)
	end
	
	if returnJson then
		if compressPrimObjects then
			warn("Cannot turn to JSON. Returning serial table that is not in JSON.")
		end
		return httpS:JSONEncode(serial)
	end
	return serial
end

function Base.DeSerialize(serial,objectsToUse)
	return default:DeSerialize(serial,objectsToUse)
end

return Base