* Extended Script API with GetRandomAvatar

* The script will now get a IScriptEntity to it's host object with get/sets
* The script gets a IScriptReadnlyEntity interface to entities other than the host object.
* the test script now follows a random avatar.
0.1-prestable
lbsa71 2007-04-03 19:12:07 +00:00
parent 6d8dcd1d1d
commit 7169acc47e
12 changed files with 276 additions and 155 deletions

View File

@ -9,6 +9,7 @@ using OpenSim.Assets;
using OpenSim.Framework.Inventory; using OpenSim.Framework.Inventory;
using libsecondlife; using libsecondlife;
using OpenSim.RegionServer.world.scripting; using OpenSim.RegionServer.world.scripting;
using Avatar=libsecondlife.Avatar;
namespace OpenSim.CAPS namespace OpenSim.CAPS
{ {
@ -141,8 +142,6 @@ namespace OpenSim.CAPS
private class TestScript : Script private class TestScript : Script
{ {
int toggle = 0;
public TestScript() public TestScript()
: base(LLUUID.Random()) : base(LLUUID.Random())
{ {
@ -151,13 +150,21 @@ namespace OpenSim.CAPS
private void MyOnFrame(IScriptContext context) private void MyOnFrame(IScriptContext context)
{ {
toggle = 2 - toggle; LLVector3 pos = context.Entity.Pos;
LLVector3 pos = context.GetPos(); IScriptReadonlyEntity avatar;
if( context.TryGetRandomAvatar( out avatar ) )
{
LLVector3 avatarPos = avatar.Pos;
pos.X += (toggle - 1); float x = pos.X + ((float)avatarPos.X.CompareTo(pos.X))/2;
float y = pos.Y + ((float)avatarPos.Y.CompareTo(pos.Y))/2;
context.MoveTo(pos); LLVector3 newPos = new LLVector3( x, y, pos.Z );
context.Entity.Pos = newPos;
}
} }
} }
@ -194,7 +201,7 @@ namespace OpenSim.CAPS
foreach (Entity entity in m_world.Entities.Values) foreach (Entity entity in m_world.Entities.Values)
{ {
string testScriptLink = "javascript:loadXMLDoc('Admin/AddTestScript/" + entity.uuid.ToString() + "');"; string testScriptLink = "javascript:loadXMLDoc('Admin/AddTestScript/" + entity.uuid.ToString() + "');";
responseString += String.Format( "<li>[{0}] \"{1}\" @ {2} <a href=\"{3}\">add test script</a></li>", entity.uuid, entity.getName(), entity.position, testScriptLink ); responseString += String.Format( "<li>[{0}] \"{1}\" @ {2} <a href=\"{3}\">add test script</a></li>", entity.uuid, entity.Name, entity.Pos, testScriptLink );
} }
responseString += "</ul>"; responseString += "</ul>";
return responseString; return responseString;

View File

@ -187,6 +187,9 @@
<Compile Include="world\scripting\IScriptContext.cs"> <Compile Include="world\scripting\IScriptContext.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="world\scripting\IScriptEntity.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="world\scripting\IScriptHandler.cs"> <Compile Include="world\scripting\IScriptHandler.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>

View File

@ -36,6 +36,7 @@
<include name="world/World.cs" /> <include name="world/World.cs" />
<include name="world/scripting/IScript.cs" /> <include name="world/scripting/IScript.cs" />
<include name="world/scripting/IScriptContext.cs" /> <include name="world/scripting/IScriptContext.cs" />
<include name="world/scripting/IScriptEntity.cs" />
<include name="world/scripting/IScriptHandler.cs" /> <include name="world/scripting/IScriptHandler.cs" />
<include name="world/scripting/Script.cs" /> <include name="world/scripting/Script.cs" />
</sources> </sources>

View File

@ -19,7 +19,6 @@ namespace OpenSim.world
public SimClient ControllingClient; public SimClient ControllingClient;
public LLUUID current_anim; public LLUUID current_anim;
public int anim_seq; public int anim_seq;
private PhysicsActor _physActor;
private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate;
private bool updateflag = false; private bool updateflag = false;
private byte movementflag = 0; private byte movementflag = 0;
@ -30,7 +29,6 @@ namespace OpenSim.world
private byte[] visualParams; private byte[] visualParams;
private AvatarWearable[] Wearables; private AvatarWearable[] Wearables;
private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
private World m_world;
private ulong m_regionHandle; private ulong m_regionHandle;
private Dictionary<uint, SimClient> m_clientThreads; private Dictionary<uint, SimClient> m_clientThreads;
private string m_regionName; private string m_regionName;
@ -45,8 +43,7 @@ namespace OpenSim.world
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)");
ControllingClient = TheClient; ControllingClient = TheClient;
localid = 8880000 + (this.m_world._localNumber++); localid = 8880000 + (this.m_world._localNumber++);
position = new LLVector3(100.0f, 100.0f, 30.0f); Pos = new LLVector3(100.0f, 100.0f, m_world.LandMap[(int)Pos.Y * 256 + (int)Pos.X] + 1);
position.Z = m_world.LandMap[(int)position.Y * 256 + (int)position.X] + 1;
visualParams = new byte[218]; visualParams = new byte[218];
for (int i = 0; i < 218; i++) for (int i = 0; i < 218; i++)
{ {
@ -209,7 +206,7 @@ namespace OpenSim.world
this.uuid = objupdate.ObjectData[0].FullID = ControllingClient.AgentID; this.uuid = objupdate.ObjectData[0].FullID = ControllingClient.AgentID;
objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0"); objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0");
libsecondlife.LLVector3 pos2 = new LLVector3((float)this.position.X, (float)this.position.Y, (float)this.position.Z); libsecondlife.LLVector3 pos2 = new LLVector3((float)this.Pos.X, (float)this.Pos.Y, (float)this.Pos.Z);
byte[] pb = pos2.GetBytes(); byte[] pb = pos2.GetBytes();
@ -614,23 +611,7 @@ namespace OpenSim.world
public override void LandRenegerated() public override void LandRenegerated()
{ {
position = new LLVector3(100.0f, 100.0f, 30.0f); Pos = new LLVector3(100.0f, 100.0f, this.m_world.LandMap[(int)Pos.Y * 256 + (int)Pos.X] + 50);
position.Z = this.m_world.LandMap[(int)position.Y * 256 + (int)position.X] + 50;
if (this._physActor != null)
{
try
{
lock (this.m_world.LockPhysicsEngine)
{
this._physActor.Position = new PhysicsVector(position.X, position.Y, position.Z);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
} }
} }

View File

@ -2,31 +2,78 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Axiom.MathLib; using Axiom.MathLib;
using OpenSim.Physics.Manager;
using OpenSim.types; using OpenSim.types;
using libsecondlife; using libsecondlife;
using OpenSim.RegionServer.world.scripting;
namespace OpenSim.world namespace OpenSim.world
{ {
public class Entity public abstract class Entity : IScriptReadonlyEntity
{ {
public libsecondlife.LLUUID uuid; public libsecondlife.LLUUID uuid;
public uint localid; public uint localid;
public LLVector3 position;
public LLVector3 velocity; public LLVector3 velocity;
public Quaternion rotation; public Quaternion rotation;
protected string name;
protected List<Entity> children; protected List<Entity> children;
protected string m_name;
public virtual string Name
{
get { return m_name; }
}
private LLVector3 m_pos;
protected PhysicsActor _physActor;
protected World m_world;
public LLVector3 Pos
{
get
{
if (this._physActor != null)
{
m_pos.X = _physActor.Position.X;
m_pos.Y = _physActor.Position.Y;
m_pos.Z = _physActor.Position.Z;
}
return m_pos;
}
set
{
if (this._physActor != null)
{
try
{
lock (this.m_world.LockPhysicsEngine)
{
this._physActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
m_pos = value;
}
}
public Entity() public Entity()
{ {
uuid = new libsecondlife.LLUUID(); uuid = new libsecondlife.LLUUID();
localid = 0; localid = 0;
position = new LLVector3(); m_pos = new LLVector3();
velocity = new LLVector3(); velocity = new LLVector3();
rotation = new Quaternion(); rotation = new Quaternion();
name = "(basic entity)"; m_name = "(basic entity)";
children = new List<Entity>(); children = new List<Entity>();
} }
public virtual void addForces() public virtual void addForces()
{ {
foreach (Entity child in children) foreach (Entity child in children)
@ -42,11 +89,6 @@ namespace OpenSim.world
} }
} }
public virtual string getName()
{
return name;
}
public virtual Mesh getMesh() public virtual Mesh getMesh()
{ {
Mesh mesh = new Mesh(); Mesh mesh = new Mesh();

View File

@ -19,13 +19,11 @@ namespace OpenSim.world
protected bool updateFlag = false; protected bool updateFlag = false;
protected bool dirtyFlag = false; protected bool dirtyFlag = false;
private ObjectUpdatePacket OurPacket; private ObjectUpdatePacket OurPacket;
private PhysicsActor _physActor;
private bool physicsEnabled = false; private bool physicsEnabled = false;
private bool physicstest = false; private bool physicstest = false;
private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
private Dictionary<uint, SimClient> m_clientThreads; private Dictionary<uint, SimClient> m_clientThreads;
private ulong m_regionHandle; private ulong m_regionHandle;
private World m_world;
private const uint FULL_MASK_PERMISSIONS = 2147483647; private const uint FULL_MASK_PERMISSIONS = 2147483647;
public bool PhysicsEnabled public bool PhysicsEnabled
@ -130,7 +128,7 @@ namespace OpenSim.world
public void UpdatePosition(LLVector3 pos) public void UpdatePosition(LLVector3 pos)
{ {
this.position = pos; this.Pos = pos;
if (this._physActor != null) // && this.physicsEnabled) if (this._physActor != null) // && this.physicsEnabled)
{ {
try try
@ -208,7 +206,7 @@ namespace OpenSim.world
if (this.physicstest) if (this.physicstest)
{ {
LLVector3 pos = this.position; LLVector3 pos = this.Pos;
pos.Z += 0.0001f; pos.Z += 0.0001f;
this.UpdatePosition(pos); this.UpdatePosition(pos);
this.physicstest = false; this.physicstest = false;
@ -226,7 +224,7 @@ namespace OpenSim.world
} }
else else
{ {
lPos = this.position; lPos = this.Pos;
} }
byte[] pb = lPos.GetBytes(); byte[] pb = lPos.GetBytes();
Array.Copy(pb, 0, OurPacket.ObjectData[0].ObjectData, 0, pb.Length); Array.Copy(pb, 0, OurPacket.ObjectData[0].ObjectData, 0, pb.Length);
@ -300,7 +298,7 @@ namespace OpenSim.world
this.physicsEnabled = pack.AgentData.UsePhysics; this.physicsEnabled = pack.AgentData.UsePhysics;
if (this._physActor.Kinematic == false) if (this._physActor.Kinematic == false)
{ {
LLVector3 pos = this.position; LLVector3 pos = this.Pos;
this.UpdatePosition(pos); this.UpdatePosition(pos);
pos.Z += 0.000001f; pos.Z += 0.000001f;
this.UpdatePosition(pos); this.UpdatePosition(pos);
@ -310,7 +308,7 @@ namespace OpenSim.world
{ {
PhysicsVector vec = this._physActor.Position; PhysicsVector vec = this._physActor.Position;
LLVector3 pos = new LLVector3(vec.X, vec.Y, vec.Z); LLVector3 pos = new LLVector3(vec.X, vec.Y, vec.Z);
this.position = pos; this.Pos = pos;
this.updateFlag = true; this.updateFlag = true;
} }
} }
@ -319,7 +317,7 @@ namespace OpenSim.world
public void MakeParent(Primitive prim) public void MakeParent(Primitive prim)
{ {
this.primData.ParentID = prim.localid; this.primData.ParentID = prim.localid;
this.position -= prim.position; this.Pos -= prim.Pos;
this.dirtyFlag = true; this.dirtyFlag = true;
} }
@ -385,7 +383,7 @@ namespace OpenSim.world
this.newPrimFlag = true; this.newPrimFlag = true;
this.primData.FullID = this.uuid = objupdate.ObjectData[0].FullID; this.primData.FullID = this.uuid = objupdate.ObjectData[0].FullID;
this.localid = objupdate.ObjectData[0].ID; this.localid = objupdate.ObjectData[0].ID;
this.primData.Position = this.position = pos1; this.primData.Position = this.Pos = pos1;
this.OurPacket = objupdate; this.OurPacket = objupdate;
} }
@ -466,7 +464,7 @@ namespace OpenSim.world
this.uuid = objupdate.ObjectData[0].FullID; this.uuid = objupdate.ObjectData[0].FullID;
this.localid = objupdate.ObjectData[0].ID; this.localid = objupdate.ObjectData[0].ID;
this.position = pos1; this.Pos = pos1;
this.OurPacket = objupdate; this.OurPacket = objupdate;
if (newprim) if (newprim)
{ {
@ -501,7 +499,7 @@ namespace OpenSim.world
} }
else else
{ {
lPos = this.position; lPos = this.Pos;
lRot = this.rotation; lRot = this.rotation;
} }
byte[] pb = lPos.GetBytes(); byte[] pb = lPos.GetBytes();
@ -557,10 +555,9 @@ namespace OpenSim.world
{ {
this.primData.FullID = this.uuid; this.primData.FullID = this.uuid;
this.primData.LocalID = this.localid; this.primData.LocalID = this.localid;
this.primData.Position = this.position; this.primData.Position = this.Pos;
this.primData.Rotation = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w); this.primData.Rotation = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w);
this.m_world.localStorage.StorePrim(this.primData); this.m_world.localStorage.StorePrim(this.primData);
} }
} }
} }

View File

@ -335,7 +335,7 @@ namespace OpenSim.world
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world"); OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world");
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake "); OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake ");
NewAvatar.SendRegionHandshake(this); NewAvatar.SendRegionHandshake(this);
PhysicsVector pVec = new PhysicsVector(NewAvatar.position.X, NewAvatar.position.Y, NewAvatar.position.Z); PhysicsVector pVec = new PhysicsVector(NewAvatar.Pos.X, NewAvatar.Pos.Y, NewAvatar.Pos.Z);
lock (this.LockPhysicsEngine) lock (this.LockPhysicsEngine)
{ {
NewAvatar.PhysActor = this.phyScene.AddAvatar(pVec); NewAvatar.PhysActor = this.phyScene.AddAvatar(pVec);
@ -348,7 +348,7 @@ namespace OpenSim.world
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: AddNewPrim() - Creating new prim"); OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: AddNewPrim() - Creating new prim");
Primitive prim = new Primitive(m_clientThreads, m_regionHandle, this); Primitive prim = new Primitive(m_clientThreads, m_regionHandle, this);
prim.CreateFromPacket(addPacket, AgentClient.AgentID, this._primCount); prim.CreateFromPacket(addPacket, AgentClient.AgentID, this._primCount);
PhysicsVector pVec = new PhysicsVector(prim.position.X, prim.position.Y, prim.position.Z); PhysicsVector pVec = new PhysicsVector(prim.Pos.X, prim.Pos.Y, prim.Pos.Z);
PhysicsVector pSize = new PhysicsVector(0.255f, 0.255f, 0.255f); PhysicsVector pSize = new PhysicsVector(0.255f, 0.255f, 0.255f);
if (OpenSim.world.Avatar.PhysicsEngineFlying) if (OpenSim.world.Avatar.PhysicsEngineFlying)
{ {
@ -521,7 +521,7 @@ namespace OpenSim.world
reply.ChatData.Message = inchatpack.ChatData.Message; reply.ChatData.Message = inchatpack.ChatData.Message;
reply.ChatData.ChatType = 1; reply.ChatData.ChatType = 1;
reply.ChatData.SourceType = 1; reply.ChatData.SourceType = 1;
reply.ChatData.Position = simClient.ClientAvatar.position; reply.ChatData.Position = simClient.ClientAvatar.Pos;
reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0"); reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0");
reply.ChatData.OwnerID = simClient.AgentID; reply.ChatData.OwnerID = simClient.AgentID;
reply.ChatData.SourceID = simClient.AgentID; reply.ChatData.SourceID = simClient.AgentID;

View File

@ -7,7 +7,7 @@ namespace OpenSim.RegionServer.world.scripting
{ {
public interface IScriptContext public interface IScriptContext
{ {
bool MoveTo(LLVector3 newPos); IScriptEntity Entity { get; }
LLVector3 GetPos(); bool TryGetRandomAvatar(out IScriptReadonlyEntity avatar);
} }
} }

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;
using libsecondlife;
namespace OpenSim.RegionServer.world.scripting
{
public interface IScriptReadonlyEntity
{
LLVector3 Pos { get; }
string Name { get; }
}
public interface IScriptEntity
{
LLVector3 Pos { get; set; }
string Name { get; }
}
}

View File

@ -4,18 +4,19 @@ using System.Text;
using libsecondlife; using libsecondlife;
using OpenSim.Physics.Manager; using OpenSim.Physics.Manager;
using OpenSim.world; using OpenSim.world;
using Primitive=OpenSim.world.Primitive; using Avatar=OpenSim.world.Avatar;
using Primitive = OpenSim.world.Primitive;
namespace OpenSim.RegionServer.world.scripting namespace OpenSim.RegionServer.world.scripting
{ {
public delegate void ScriptEventHandler( IScriptContext context ); public delegate void ScriptEventHandler(IScriptContext context);
public class ScriptHandler : IScriptContext public class ScriptHandler : IScriptContext, IScriptEntity, IScriptReadonlyEntity
{ {
private World m_world; private World m_world;
private Script m_script; private Script m_script;
private Entity m_entity; private Entity m_entity;
public LLUUID ScriptId public LLUUID ScriptId
{ {
get get
@ -23,13 +24,13 @@ namespace OpenSim.RegionServer.world.scripting
return m_script.ScriptId; return m_script.ScriptId;
} }
} }
public void OnFrame() public void OnFrame()
{ {
m_script.OnFrame(this); m_script.OnFrame(this);
} }
public ScriptHandler( Script script, Entity entity, World world ) public ScriptHandler(Script script, Entity entity, World world)
{ {
m_script = script; m_script = script;
m_entity = entity; m_entity = entity;
@ -38,22 +39,57 @@ namespace OpenSim.RegionServer.world.scripting
#region IScriptContext Members #region IScriptContext Members
bool IScriptContext.MoveTo(LLVector3 newPos) IScriptEntity IScriptContext.Entity
{ {
if (m_entity is Primitive) get
{ {
Primitive prim = m_entity as Primitive; return this;
// Of course, we really should have asked the physEngine if this is possible, and if not, returned false. }
prim.UpdatePosition( newPos ); }
return true;
bool IScriptContext.TryGetRandomAvatar(out IScriptReadonlyEntity avatar)
{
foreach (Entity entity in m_world.Entities.Values )
{
if( entity is Avatar )
{
avatar = entity;
return true;
}
} }
avatar = null;
return false; return false;
} }
LLVector3 IScriptContext.GetPos() #endregion
#region IScriptEntity and IScriptReadonlyEntity Members
public string Name
{ {
return m_entity.position; get
{
return m_entity.Name;
}
}
public LLVector3 Pos
{
get
{
return m_entity.Pos;
}
set
{
if (m_entity is Primitive)
{
Primitive prim = m_entity as Primitive;
// Of course, we really should have asked the physEngine if this is possible, and if not, returned false.
prim.UpdatePosition( value );
}
}
} }
#endregion #endregion

View File

@ -7,8 +7,7 @@ namespace OpenSim.RegionServer.world.scripting
{ {
public class Script public class Script
{ {
private LLUUID m_scriptId; private LLUUID m_scriptId;
public virtual LLUUID ScriptId public virtual LLUUID ScriptId
{ {
get get

View File

@ -37,85 +37,121 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.GridServer", "OpenGridServices.GridServer\OpenGridServices.GridServer.csproj", "{21BFC8E2-0000-0000-0000-000000000000}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.GridServer", "OpenGridServices.GridServer\OpenGridServices.GridServer.csproj", "{21BFC8E2-0000-0000-0000-000000000000}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectDependencies) = postSolution
{438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({438A9556-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
{438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({438A9556-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
{438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({438A9556-0000-0000-0000-000000000000}).7 = ({8BE16150-0000-0000-0000-000000000000})
{438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({438A9556-0000-0000-0000-000000000000}).8 = ({8BB20F0A-0000-0000-0000-000000000000})
{63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({438A9556-0000-0000-0000-000000000000}).9 = ({632E1BFD-0000-0000-0000-000000000000})
{63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({63A05FE9-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000})
{63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({E88EF749-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
{63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({8BE16150-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
{A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({8BE16150-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
{A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({66591469-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
{A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({66591469-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
{A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({83C87BE6-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
{E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({83C87BE6-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
{E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({4F874463-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000})
{E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({B0027747-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
{E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({B0027747-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
{8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({8BB20F0A-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
{8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({8BB20F0A-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000})
{8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({988F0AC4-0000-0000-0000-000000000000}).3 = ({8BE16150-0000-0000-0000-000000000000})
{8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({B55C0B5D-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
{66591469-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({B55C0B5D-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
{66591469-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({632E1BFD-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
{66591469-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({632E1BFD-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
{66591469-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({632E1BFD-0000-0000-0000-000000000000}).7 = ({E88EF749-0000-0000-0000-000000000000})
{83C87BE6-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({632E1BFD-0000-0000-0000-000000000000}).8 = ({8BE16150-0000-0000-0000-000000000000})
{83C87BE6-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({632E1BFD-0000-0000-0000-000000000000}).9 = ({8BB20F0A-0000-0000-0000-000000000000})
{83C87BE6-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({E1B79ECF-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000})
{83C87BE6-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({E1B79ECF-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000})
{4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({7E494328-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
{4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({7E494328-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
{4F874463-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU ({546099CD-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000})
{4F874463-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU ({546099CD-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000})
{B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU ({21BFC8E2-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
{B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU ({21BFC8E2-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
{B0027747-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection
{B0027747-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {66591469-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {66591469-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {83C87BE6-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {83C87BE6-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E494328-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {83C87BE6-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E494328-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {83C87BE6-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{546099CD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{546099CD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
GlobalSection(SolutionProperties) = preSolution {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
HideSolutionNode = FALSE {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7E494328-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E494328-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{546099CD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{546099CD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal EndGlobal