diff --git a/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs new file mode 100644 index 00000000..31bd8aa7 --- /dev/null +++ b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.Designer.cs @@ -0,0 +1,529 @@ +namespace UniversalEditor.Editors.UnrealEngine +{ + partial class UnrealPackageEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tv = new System.Windows.Forms.TreeView(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.pnlExportTable = new System.Windows.Forms.Panel(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.lvExportTable = new System.Windows.Forms.ListView(); + this.chExportObjectName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectParent = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectClass = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectFlags = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectOffset = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chExportObjectSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlHeritageTable = new System.Windows.Forms.Panel(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.lvHeritageTable = new System.Windows.Forms.ListView(); + this.chHeritageGUID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlImportTable = new System.Windows.Forms.Panel(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.lvImportTable = new System.Windows.Forms.ListView(); + this.chImportPackageName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chImportObjectName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chImportClassName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.pnlNameTable = new System.Windows.Forms.Panel(); + this.cmdNameClear = new System.Windows.Forms.Button(); + this.cmdNameRemove = new System.Windows.Forms.Button(); + this.cmdNameModify = new System.Windows.Forms.Button(); + this.cmdNameAdd = new System.Windows.Forms.Button(); + this.lvNameTable = new System.Windows.Forms.ListView(); + this.chName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chFlags = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlExportTable.SuspendLayout(); + this.pnlHeritageTable.SuspendLayout(); + this.pnlImportTable.SuspendLayout(); + this.pnlNameTable.SuspendLayout(); + this.SuspendLayout(); + // + // tv + // + this.tv.Dock = System.Windows.Forms.DockStyle.Fill; + this.tv.HideSelection = false; + this.tv.Location = new System.Drawing.Point(0, 0); + this.tv.Name = "tv"; + this.tv.Size = new System.Drawing.Size(170, 267); + this.tv.TabIndex = 0; + this.tv.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tv_AfterSelect); + this.tv.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tv_MouseDown); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.tv); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.pnlExportTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlHeritageTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlImportTable); + this.splitContainer1.Panel2.Controls.Add(this.pnlNameTable); + this.splitContainer1.Size = new System.Drawing.Size(558, 267); + this.splitContainer1.SplitterDistance = 170; + this.splitContainer1.TabIndex = 1; + // + // pnlExportTable + // + this.pnlExportTable.Controls.Add(this.button5); + this.pnlExportTable.Controls.Add(this.button6); + this.pnlExportTable.Controls.Add(this.button7); + this.pnlExportTable.Controls.Add(this.button8); + this.pnlExportTable.Controls.Add(this.lvExportTable); + this.pnlExportTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlExportTable.Enabled = false; + this.pnlExportTable.Location = new System.Drawing.Point(0, 0); + this.pnlExportTable.Name = "pnlExportTable"; + this.pnlExportTable.Size = new System.Drawing.Size(384, 267); + this.pnlExportTable.TabIndex = 2; + this.pnlExportTable.Visible = false; + // + // button5 + // + this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button5.Location = new System.Drawing.Point(306, 3); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(75, 23); + this.button5.TabIndex = 1; + this.button5.Text = "&Clear"; + this.button5.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button6.Location = new System.Drawing.Point(165, 3); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(75, 23); + this.button6.TabIndex = 1; + this.button6.Text = "&Remove..."; + this.button6.UseVisualStyleBackColor = true; + // + // button7 + // + this.button7.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button7.Location = new System.Drawing.Point(84, 3); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(75, 23); + this.button7.TabIndex = 1; + this.button7.Text = "&Modify..."; + this.button7.UseVisualStyleBackColor = true; + // + // button8 + // + this.button8.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button8.Location = new System.Drawing.Point(3, 3); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(75, 23); + this.button8.TabIndex = 1; + this.button8.Text = "&Add..."; + this.button8.UseVisualStyleBackColor = true; + // + // lvExportTable + // + this.lvExportTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvExportTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chExportObjectName, + this.chExportObjectParent, + this.chExportObjectClass, + this.chExportObjectFlags, + this.chExportObjectOffset, + this.chExportObjectSize}); + this.lvExportTable.FullRowSelect = true; + this.lvExportTable.GridLines = true; + this.lvExportTable.HideSelection = false; + this.lvExportTable.Location = new System.Drawing.Point(3, 32); + this.lvExportTable.Name = "lvExportTable"; + this.lvExportTable.Size = new System.Drawing.Size(378, 232); + this.lvExportTable.TabIndex = 0; + this.lvExportTable.UseCompatibleStateImageBehavior = false; + this.lvExportTable.View = System.Windows.Forms.View.Details; + this.lvExportTable.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.lvExportTable_ItemDrag); + // + // chExportObjectName + // + this.chExportObjectName.Text = "Object"; + this.chExportObjectName.Width = 84; + // + // chExportObjectParent + // + this.chExportObjectParent.Text = "Parent"; + this.chExportObjectParent.Width = 53; + // + // chExportObjectClass + // + this.chExportObjectClass.Text = "Class"; + this.chExportObjectClass.Width = 81; + // + // chExportObjectFlags + // + this.chExportObjectFlags.Text = "Flags"; + this.chExportObjectFlags.Width = 49; + // + // chExportObjectOffset + // + this.chExportObjectOffset.Text = "Offset"; + this.chExportObjectOffset.Width = 45; + // + // chExportObjectSize + // + this.chExportObjectSize.Text = "Size"; + // + // pnlHeritageTable + // + this.pnlHeritageTable.Controls.Add(this.button9); + this.pnlHeritageTable.Controls.Add(this.button10); + this.pnlHeritageTable.Controls.Add(this.button11); + this.pnlHeritageTable.Controls.Add(this.button12); + this.pnlHeritageTable.Controls.Add(this.lvHeritageTable); + this.pnlHeritageTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlHeritageTable.Enabled = false; + this.pnlHeritageTable.Location = new System.Drawing.Point(0, 0); + this.pnlHeritageTable.Name = "pnlHeritageTable"; + this.pnlHeritageTable.Size = new System.Drawing.Size(384, 267); + this.pnlHeritageTable.TabIndex = 3; + this.pnlHeritageTable.Visible = false; + // + // button9 + // + this.button9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button9.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button9.Location = new System.Drawing.Point(306, 3); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(75, 23); + this.button9.TabIndex = 1; + this.button9.Text = "&Clear"; + this.button9.UseVisualStyleBackColor = true; + // + // button10 + // + this.button10.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button10.Location = new System.Drawing.Point(165, 3); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(75, 23); + this.button10.TabIndex = 1; + this.button10.Text = "&Remove..."; + this.button10.UseVisualStyleBackColor = true; + // + // button11 + // + this.button11.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button11.Location = new System.Drawing.Point(84, 3); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(75, 23); + this.button11.TabIndex = 1; + this.button11.Text = "&Modify..."; + this.button11.UseVisualStyleBackColor = true; + // + // button12 + // + this.button12.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button12.Location = new System.Drawing.Point(3, 3); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(75, 23); + this.button12.TabIndex = 1; + this.button12.Text = "&Add..."; + this.button12.UseVisualStyleBackColor = true; + // + // lvHeritageTable + // + this.lvHeritageTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvHeritageTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chHeritageGUID}); + this.lvHeritageTable.FullRowSelect = true; + this.lvHeritageTable.GridLines = true; + this.lvHeritageTable.HideSelection = false; + this.lvHeritageTable.Location = new System.Drawing.Point(3, 32); + this.lvHeritageTable.Name = "lvHeritageTable"; + this.lvHeritageTable.Size = new System.Drawing.Size(378, 232); + this.lvHeritageTable.TabIndex = 0; + this.lvHeritageTable.UseCompatibleStateImageBehavior = false; + this.lvHeritageTable.View = System.Windows.Forms.View.Details; + // + // chHeritageGUID + // + this.chHeritageGUID.Text = "GUID"; + this.chHeritageGUID.Width = 354; + // + // pnlImportTable + // + this.pnlImportTable.Controls.Add(this.button1); + this.pnlImportTable.Controls.Add(this.button2); + this.pnlImportTable.Controls.Add(this.button3); + this.pnlImportTable.Controls.Add(this.button4); + this.pnlImportTable.Controls.Add(this.lvImportTable); + this.pnlImportTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlImportTable.Enabled = false; + this.pnlImportTable.Location = new System.Drawing.Point(0, 0); + this.pnlImportTable.Name = "pnlImportTable"; + this.pnlImportTable.Size = new System.Drawing.Size(384, 267); + this.pnlImportTable.TabIndex = 1; + this.pnlImportTable.Visible = false; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(306, 3); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "&Clear"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button2.Location = new System.Drawing.Point(165, 3); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 1; + this.button2.Text = "&Remove..."; + this.button2.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button3.Location = new System.Drawing.Point(84, 3); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 1; + this.button3.Text = "&Modify..."; + this.button3.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button4.Location = new System.Drawing.Point(3, 3); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 23); + this.button4.TabIndex = 1; + this.button4.Text = "&Add..."; + this.button4.UseVisualStyleBackColor = true; + // + // lvImportTable + // + this.lvImportTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvImportTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chImportPackageName, + this.chImportObjectName, + this.chImportClassName}); + this.lvImportTable.FullRowSelect = true; + this.lvImportTable.GridLines = true; + this.lvImportTable.HideSelection = false; + this.lvImportTable.Location = new System.Drawing.Point(3, 32); + this.lvImportTable.Name = "lvImportTable"; + this.lvImportTable.Size = new System.Drawing.Size(378, 232); + this.lvImportTable.TabIndex = 0; + this.lvImportTable.UseCompatibleStateImageBehavior = false; + this.lvImportTable.View = System.Windows.Forms.View.Details; + // + // chImportPackageName + // + this.chImportPackageName.Text = "Package"; + this.chImportPackageName.Width = 97; + // + // chImportObjectName + // + this.chImportObjectName.Text = "Object"; + this.chImportObjectName.Width = 134; + // + // chImportClassName + // + this.chImportClassName.Text = "Class"; + this.chImportClassName.Width = 140; + // + // pnlNameTable + // + this.pnlNameTable.Controls.Add(this.cmdNameClear); + this.pnlNameTable.Controls.Add(this.cmdNameRemove); + this.pnlNameTable.Controls.Add(this.cmdNameModify); + this.pnlNameTable.Controls.Add(this.cmdNameAdd); + this.pnlNameTable.Controls.Add(this.lvNameTable); + this.pnlNameTable.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlNameTable.Enabled = false; + this.pnlNameTable.Location = new System.Drawing.Point(0, 0); + this.pnlNameTable.Name = "pnlNameTable"; + this.pnlNameTable.Size = new System.Drawing.Size(384, 267); + this.pnlNameTable.TabIndex = 0; + this.pnlNameTable.Visible = false; + // + // cmdNameClear + // + this.cmdNameClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdNameClear.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameClear.Location = new System.Drawing.Point(306, 3); + this.cmdNameClear.Name = "cmdNameClear"; + this.cmdNameClear.Size = new System.Drawing.Size(75, 23); + this.cmdNameClear.TabIndex = 1; + this.cmdNameClear.Text = "&Clear"; + this.cmdNameClear.UseVisualStyleBackColor = true; + // + // cmdNameRemove + // + this.cmdNameRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameRemove.Location = new System.Drawing.Point(165, 3); + this.cmdNameRemove.Name = "cmdNameRemove"; + this.cmdNameRemove.Size = new System.Drawing.Size(75, 23); + this.cmdNameRemove.TabIndex = 1; + this.cmdNameRemove.Text = "&Remove..."; + this.cmdNameRemove.UseVisualStyleBackColor = true; + // + // cmdNameModify + // + this.cmdNameModify.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameModify.Location = new System.Drawing.Point(84, 3); + this.cmdNameModify.Name = "cmdNameModify"; + this.cmdNameModify.Size = new System.Drawing.Size(75, 23); + this.cmdNameModify.TabIndex = 1; + this.cmdNameModify.Text = "&Modify..."; + this.cmdNameModify.UseVisualStyleBackColor = true; + // + // cmdNameAdd + // + this.cmdNameAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNameAdd.Location = new System.Drawing.Point(3, 3); + this.cmdNameAdd.Name = "cmdNameAdd"; + this.cmdNameAdd.Size = new System.Drawing.Size(75, 23); + this.cmdNameAdd.TabIndex = 1; + this.cmdNameAdd.Text = "&Add..."; + this.cmdNameAdd.UseVisualStyleBackColor = true; + // + // lvNameTable + // + this.lvNameTable.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvNameTable.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.chName, + this.chFlags}); + this.lvNameTable.FullRowSelect = true; + this.lvNameTable.GridLines = true; + this.lvNameTable.HideSelection = false; + this.lvNameTable.Location = new System.Drawing.Point(3, 32); + this.lvNameTable.Name = "lvNameTable"; + this.lvNameTable.Size = new System.Drawing.Size(378, 232); + this.lvNameTable.TabIndex = 0; + this.lvNameTable.UseCompatibleStateImageBehavior = false; + this.lvNameTable.View = System.Windows.Forms.View.Details; + // + // chName + // + this.chName.Text = "Name"; + this.chName.Width = 231; + // + // chFlags + // + this.chFlags.Text = "Flags"; + this.chFlags.Width = 134; + // + // UnrealPackageEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.splitContainer1); + this.Name = "UnrealPackageEditor"; + this.Size = new System.Drawing.Size(558, 267); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlExportTable.ResumeLayout(false); + this.pnlHeritageTable.ResumeLayout(false); + this.pnlImportTable.ResumeLayout(false); + this.pnlNameTable.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView tv; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Panel pnlNameTable; + private System.Windows.Forms.ListView lvNameTable; + private System.Windows.Forms.ColumnHeader chName; + private System.Windows.Forms.ColumnHeader chFlags; + private System.Windows.Forms.Button cmdNameClear; + private System.Windows.Forms.Button cmdNameRemove; + private System.Windows.Forms.Button cmdNameModify; + private System.Windows.Forms.Button cmdNameAdd; + private System.Windows.Forms.Panel pnlImportTable; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.ListView lvImportTable; + private System.Windows.Forms.ColumnHeader chImportPackageName; + private System.Windows.Forms.ColumnHeader chImportObjectName; + private System.Windows.Forms.ColumnHeader chImportClassName; + private System.Windows.Forms.Panel pnlExportTable; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.ListView lvExportTable; + private System.Windows.Forms.ColumnHeader chExportObjectParent; + private System.Windows.Forms.ColumnHeader chExportObjectClass; + private System.Windows.Forms.ColumnHeader chExportObjectName; + private System.Windows.Forms.ColumnHeader chExportObjectFlags; + private System.Windows.Forms.ColumnHeader chExportObjectOffset; + private System.Windows.Forms.ColumnHeader chExportObjectSize; + private System.Windows.Forms.Panel pnlHeritageTable; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button12; + private System.Windows.Forms.ListView lvHeritageTable; + private System.Windows.Forms.ColumnHeader chHeritageGUID; + } +} diff --git a/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs new file mode 100644 index 00000000..aa38ef37 --- /dev/null +++ b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.UnrealEngine; +using UniversalEditor.UserInterface.WindowsForms; + +namespace UniversalEditor.Editors.UnrealEngine +{ + public partial class UnrealPackageEditor : Editor + { + public UnrealPackageEditor() + { + InitializeComponent(); + Font = SystemFonts.MenuFont; + + base.SupportedObjectModels.Add(typeof(UnrealPackageObjectModel)); + } + + protected override void OnObjectModelChanged(EventArgs e) + { + base.OnObjectModelChanged(e); + + tv.Nodes.Clear(); + + UnrealPackageObjectModel upk = (ObjectModel as UnrealPackageObjectModel); + if (upk == null) return; + + TreeNode tnToplevel = new TreeNode(); + + if (upk.Accessor is FileAccessor) tnToplevel.Text = System.IO.Path.GetFileName((upk.Accessor as FileAccessor).FileName); + if (String.IsNullOrEmpty(tnToplevel.Text)) tnToplevel.Text = ""; + + #region Name Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeNameTable"; + tn.Text = "Name Table"; + tnToplevel.Nodes.Add(tn); + + foreach (NameTableEntry entry in upk.NameTableEntries) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entry; + lvi.Text = entry.Name; + lvi.SubItems.Add(entry.Flags.ToString()); + lvNameTable.Items.Add(lvi); + } + lvNameTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + #region Export Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeExportTable"; + tn.Text = "Export Table"; + tnToplevel.Nodes.Add(tn); + + foreach (ExportTableEntry entry in upk.ExportTableEntries) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entry; + if (entry.Name == null) + { + lvi.Text = String.Empty; + } + else + { + lvi.Text = entry.Name.ToString(false); + } + if (entry.ObjectParent == null) + { + lvi.SubItems.Add(String.Empty); + } + else + { + lvi.SubItems.Add(entry.ObjectParent.ToString()); + } + if (entry.ObjectClass == null) + { + lvi.SubItems.Add(String.Empty); + } + else + { + lvi.SubItems.Add(entry.ObjectClass.ToString()); + } + lvi.SubItems.Add(entry.Flags.ToString()); + lvi.SubItems.Add(entry.Offset.ToString()); + lvi.SubItems.Add(entry.Size.ToString()); + lvExportTable.Items.Add(lvi); + } + lvExportTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + #region Import Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeImportTable"; + tn.Text = "Import Table"; + tnToplevel.Nodes.Add(tn); + + foreach (ImportTableEntry entry in upk.ImportTableEntries) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entry; + if (entry.PackageName != null) + { + lvi.Text = entry.PackageName.ToString(false); + } + else + { + lvi.Text = "(invalid)"; + } + if (entry.ObjectName != null) + { + lvi.SubItems.Add(entry.ObjectName.ToString(false)); + } + else + { + lvi.SubItems.Add("(invalid)"); + } + if (entry.ClassName != null) + { + lvi.SubItems.Add(entry.ClassName.ToString(false)); + } + else + { + lvi.SubItems.Add("(invalid)"); + } + lvImportTable.Items.Add(lvi); + } + lvImportTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + #region Heritage Table + { + TreeNode tn = new TreeNode(); + tn.Name = "nodeHeritageTable"; + tn.Text = "Heritage Table"; + tnToplevel.Nodes.Add(tn); + + foreach (Guid guid in upk.PackageGUIDs) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = guid; + lvi.Text = guid.ToString("B"); + lvHeritageTable.Items.Add(lvi); + } + lvHeritageTable.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); + } + #endregion + + tv.Nodes.Add(tnToplevel); + } + + private void tv_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node == null) return; + + if (e.Node.Name.StartsWith("node")) + { + string name = e.Node.Name.Substring(4); + SwitchPanel("pnl" + name); + } + } + + private void SwitchPanel(Panel panel) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (ctl == panel) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + private void SwitchPanel(string panelName) + { + foreach (Control ctl in splitContainer1.Panel2.Controls) + { + if (ctl is Panel && ctl.Name == panelName) + { + ctl.Enabled = true; + ctl.Visible = true; + } + else + { + ctl.Visible = false; + ctl.Enabled = false; + } + } + } + + private void tv_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Right) tv.SelectedNode = tv.HitTest(e.Location).Node; + } + + private void lvExportTable_ItemDrag(object sender, ItemDragEventArgs e) + { + ListViewItem lvi = (e.Item as ListViewItem); + if (lvi == null) return; + + ExportTableEntry ete = (lvi.Tag as ExportTableEntry); + if (ete == null) return; + + string FileName = TemporaryFileManager.CreateTemporaryFile(ete.Name.Name, ete.GetData()); + + DataObject dobj = new DataObject("FileDrop", new string[] { FileName }); + lvExportTable.DoDragDrop(dobj, DragDropEffects.Copy); + } + } +} diff --git a/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx new file mode 100644 index 00000000..7080a7d1 --- /dev/null +++ b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Editors/UnrealEngine/UnrealPackageEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0847cdbc --- /dev/null +++ b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("City of Orlando")] +[assembly: AssemblyProduct("UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms")] +[assembly: AssemblyCopyright("Copyright © City of Orlando 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("66c42923-4b27-4f1e-a5d0-82426f58071c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs new file mode 100644 index 00000000..4687f1e5 --- /dev/null +++ b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/TemporaryFileManager.cs @@ -0,0 +1,63 @@ +using System; + +internal static class TemporaryFileManager +{ + private static Random rand = new Random(); + + private static System.Collections.Specialized.StringCollection mvarTemporaryFileNames = new System.Collections.Specialized.StringCollection(); + private static string mvarTemporaryFilePath = null; + + public static string CreateTemporaryFile(string FileName, byte[] FileData) + { + if (mvarTemporaryFilePath == null) throw new InvalidOperationException(); + if (!System.IO.Directory.Exists(mvarTemporaryFilePath)) + { + System.IO.Directory.CreateDirectory(mvarTemporaryFilePath); + } + + FileName = System.IO.Path.GetFileName(FileName); + if (FileData == null) FileData = new byte[0]; + + string filePath = mvarTemporaryFilePath + System.IO.Path.DirectorySeparatorChar.ToString() + FileName; + System.IO.File.WriteAllBytes(filePath, FileData); + mvarTemporaryFileNames.Add(filePath); + return filePath; + } + + public static bool RegisterTemporaryDirectory(string prefix, int maxNameLength) + { + if (mvarTemporaryFilePath != null) + { + return false; + } + string name = String.Empty; + do + { + name = prefix + rand.Next(0, (maxNameLength * 10) - 1).ToString().PadLeft(maxNameLength - prefix.Length, '0'); + } + while (System.IO.Directory.Exists(name)); + + string pathName = System.IO.Path.GetTempPath() + System.IO.Path.DirectorySeparatorChar.ToString() + name; + System.IO.Directory.CreateDirectory(pathName); + + mvarTemporaryFilePath = pathName; + return true; + } + public static bool UnregisterTemporaryDirectory() + { + if (mvarTemporaryFilePath == null) return false; + + foreach (string fileName in mvarTemporaryFileNames) + { + if (System.IO.File.Exists(fileName)) + { + System.IO.File.Delete(fileName); + } + } + if (System.IO.Directory.Exists(mvarTemporaryFilePath)) + { + System.IO.Directory.Delete(mvarTemporaryFilePath, true); + } + return true; + } +} \ No newline at end of file diff --git a/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj new file mode 100644 index 00000000..7a8636cc --- /dev/null +++ b/CSharp/Environments/WindowsForms/Plugins/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms/UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj @@ -0,0 +1,83 @@ + + + + + Debug + AnyCPU + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms + v3.5 + 512 + + + true + full + false + ..\..\..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + UserControl + + + UnrealPackageEditor.cs + + + + + + + {2d4737e6-6d95-408a-90db-8dff38147e85} + UniversalEditor.Core + + + {bcbb72bd-0ecb-4ff2-8d91-e466361fb6f9} + UniversalEditor.UserInterface.WindowsForms + + + {8622ebc4-8e20-476e-b284-33d472081f5c} + UniversalEditor.UserInterface + + + {30467e5c-05bc-4856-aadc-13906ef4cadd} + UniversalEditor.Essential + + + {df96f24e-fed9-4bac-8389-63590125dc61} + UniversalEditor.Plugins.UnrealEngine + + + + + UnrealPackageEditor.cs + + + + + \ No newline at end of file diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Installer/UMODDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Installer/UMODDataFormat.cs new file mode 100644 index 00000000..63b4924f --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Installer/UMODDataFormat.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.Accessors; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.FileSystem; +using UniversalEditor.Plugins.UnrealEngine; + +namespace UniversalEditor.DataFormats.UnrealEngine.Installer +{ + public class UMODDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Unreal Tournament UMOD installer", new byte?[][] { new byte?[] { 0xA3, 0xC5, 0xE3, 0x9F } }, new string[] { "*.umod" }); + _dfr.Filters[0].MagicByteOffsets = new int[] { -20 }; + _dfr.Sources.Add("http://wiki.beyondunreal.com/Legacy:UMOD/File_Format"); + } + return _dfr; + } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + + // The UMOD file "header" is 20 bytes long. The header is stored in the last 20 bytes of + // the file (hence the quotes around the term "header"). + br.Accessor.Seek(-20, SeekOrigin.End); + + // Magic number. Used to verify this file as a UMOD installer. Always 0x9FE3C5A3. + uint magic = br.ReadUInt32(); + if (magic != 0x9FE3C5A3) throw new InvalidDataFormatException("Footer does not begin with 0x9FE3C5A3"); + + // Byte offset of file directory in the UMOD file. (See below.) + uint fileDirectoryOffset = br.ReadUInt32(); + + // Total byte size of the UMOD file. + uint fileSize = br.ReadUInt32(); + + // UMOD file version. + uint formatVersion = br.ReadUInt32(); + + // CRC32 checksum over the file content. + uint checksum = br.ReadUInt32(); + + // The file directory describes the files stored in the first part of the UMOD file. Its + // byte offset in the UMOD file is given in the file "header" (see above). + br.Accessor.Seek(fileDirectoryOffset, SeekOrigin.Begin); + + // The directory consists of an index-type file count (the index data type is described + // below), followed by variable-size records, each describing one file in the UMOD + // installer. + int fileCount = br.ReadINDEX(); + + for (int i = 0; i < fileCount; i++) + { + // Length of file name (including trailing null byte). + int fileNameLength = br.ReadINDEX(); + + // File name, with trailing null byte. + string fileName = br.ReadNullTerminatedString(); + + // Byte offset of file in UMOD file. + uint offset = br.ReadUInt32(); + // Byte length of file. + uint length = br.ReadUInt32(); + + + // Bit field describing file flags. + + // Mychaeel: Feel free to investigate and contribute information about the file flags. + // (I know that they have to be set to 0x03 for Manifest.ini and Manifest.int to + // prevent those files from being copied to the user's System directory, and set to + // 0x00 for all other files.) + UMODFileFlags flags = (UMODFileFlags)br.ReadUInt32(); + + File file = new File(); + file.Name = fileName; + file.Size = length; + file.Properties.Add("offset", offset); + file.Properties.Add("length", length); + fsom.Files.Add(file); + } + } + + protected override void SaveInternal(ObjectModel objectModel) + { + FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel); + Writer bw = null; + + #region File data + MemoryAccessor msData = new MemoryAccessor(); + bw = new Writer(msData); + foreach (File file in fsom.Files) + { + bw.WriteBytes(file.GetDataAsByteArray()); + } + bw.Close(); + + byte[] data = msData.ToArray(); + #endregion + #region File records + uint fileOffset = 0; + + MemoryAccessor msDirectory = new MemoryAccessor(); + bw = new Writer(msDirectory); + // The directory consists of an index-type file count (the index data type is described + // below), followed by variable-size records, each describing one file in the UMOD + // installer. + bw.WriteINDEX(fsom.Files.Count); + foreach (File file in fsom.Files) + { + // Length of file name (including trailing null byte). + bw.WriteINDEX(file.Name.Length); + + // File name, with trailing null byte. + bw.WriteNullTerminatedString(file.Name); + + // Byte offset of file in UMOD file. + bw.WriteUInt32(fileOffset); + // Byte length of file. + bw.WriteUInt32((uint)file.Size); + + + // Bit field describing file flags. + + // Mychaeel: Feel free to investigate and contribute information about the file flags. + // (I know that they have to be set to 0x03 for Manifest.ini and Manifest.int to + // prevent those files from being copied to the user's System directory, and set to + // 0x00 for all other files.) + UMODFileFlags flags = UMODFileFlags.None; + bw.WriteUInt32((uint)flags); + fileOffset += (uint)file.Size; + } + bw.Close(); + + byte[] directoryData = msDirectory.ToArray(); + #endregion + #region Header data + // The UMOD file "header" is 20 bytes long. The header is stored in the last 20 bytes of + // the file (hence the quotes around the term "header"). + MemoryAccessor msHeader = new MemoryAccessor(); + bw = new Writer(msHeader); + + // Magic number. Used to verify this file as a UMOD installer. Always 0x9FE3C5A3. + bw.WriteUInt32((uint)0x9FE3C5A3); + + // Byte offset of file directory in the UMOD file. (See below.) + uint fileDirectoryOffset = (uint)data.Length; + bw.WriteUInt32(fileDirectoryOffset); + + // Total byte size of the UMOD file. + uint fileSize = 20; + bw.WriteUInt32(fileSize); + + // UMOD file version. + uint formatVersion = 0; + bw.WriteUInt32(formatVersion); + + // CRC32 checksum over the file content. + uint checksum = 0; + bw.WriteUInt32(checksum); + + bw.Flush(); + bw.Close(); + + byte[] headerData = msHeader.ToArray(); + #endregion + + bw = base.Accessor.Writer; + + bw.WriteBytes(data); + bw.WriteBytes(directoryData); + bw.WriteBytes(headerData); + bw.Flush(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Installer/UMODFileFlags.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Installer/UMODFileFlags.cs new file mode 100644 index 00000000..66a9345f --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Installer/UMODFileFlags.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.DataFormats.UnrealEngine.Installer +{ + public enum UMODFileFlags + { + None = 0x00, + PreventCopyToSystem = 0x03 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Package/UnrealPackageDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Package/UnrealPackageDataFormat.cs new file mode 100644 index 00000000..db72cea6 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/DataFormats/UnrealEngine/Package/UnrealPackageDataFormat.cs @@ -0,0 +1,427 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; +using UniversalEditor.ObjectModels.UnrealEngine; +using UniversalEditor.Plugins.UnrealEngine; + +namespace UniversalEditor.DataFormats.UnrealEngine.Package +{ + public class UnrealPackageDataFormat : DataFormat + { + private static DataFormatReference _dfr = null; + public override DataFormatReference MakeReference() + { + if (_dfr == null) + { + _dfr = base.MakeReference(); + _dfr.Capabilities.Add(typeof(UnrealPackageObjectModel), DataFormatCapabilities.All); + _dfr.Filters.Add("Unreal Engine package", new byte?[][] { new byte?[] { 0xC1, 0x83, 0x2A, 0x9E } }, new string[] { "*.u", "*.utx", "*.upk" }); + _dfr.ExportOptions.Add(new CustomOptionText("PackageName", "Package &name:")); + _dfr.ExportOptions.Add(new CustomOptionNumber("PackageVersion", "Package &version:", 0, UInt16.MinValue, UInt16.MaxValue)); + _dfr.Sources.Add("http://wiki.beyondunreal.com/Legacy:Package_File_Format"); + } + return _dfr; + } + + private ushort mvarPackageVersion = 0; + /// + /// Version of the file-format; Unreal1 uses mostly 61-63, UT 67-69; However, note that + /// quite a few packages are in use with UT that have Unreal1 versions. + /// + public ushort PackageVersion { get { return mvarPackageVersion; } set { mvarPackageVersion = value; } } + + private string mvarPackageName = String.Empty; + public string PackageName { get { return mvarPackageName; } set { mvarPackageName = value; } } + + protected override void LoadInternal(ref ObjectModel objectModel) + { + Reader br = base.Accessor.Reader; + + UnrealPackageObjectModel upk = (objectModel as UnrealPackageObjectModel); + #region Header + + // Always "0x9E2A83C1"; use this to verify that you indeed try to read an Unreal-Package + uint signature = br.ReadUInt32(); + if (signature != 0x9E2A83C1) throw new InvalidDataFormatException("File does not begin with 0x9E2A83C1"); + + mvarPackageVersion = br.ReadUInt16(); + upk.LicenseeNumber = br.ReadUInt16(); + upk.PackageFlags = (PackageFlags)br.ReadUInt32(); // 1949392 + + if (mvarPackageVersion >= 512) + { + uint valueLength = br.ReadUInt32(); + mvarPackageName = br.ReadFixedLengthString(valueLength); + mvarPackageName = mvarPackageName.TrimNull(); + + uint unknown1 = br.ReadUInt32(); + uint unknown2 = br.ReadUInt32(); + } + + // Number of entries in name-table + uint nameTableEntryCount = br.ReadUInt32(); + // Offset of name-table within the file + uint nameTableOffset = br.ReadUInt32(); + + // Number of entries in export-table + uint exportTableEntryCount = br.ReadUInt32(); + // Offset of export-table within the file + uint exportTableOffset = br.ReadUInt32(); + + // Number of entries in import-table + uint importTableEntryCount = br.ReadUInt32(); + // Offset of import-table within the file + uint importTableOffset = br.ReadUInt32(); + + // After the ImportOffset, the header differs between the versions. The only interesting + // fact, though, is that for fileformat versions => 68, a GUID has been introduced. It can + // be found right after the ImportOffset: + if (mvarPackageVersion < 68) + { + // number of values in the Heritage Table + uint heritageTableEntryCount = br.ReadUInt32(); + // offset of the Heritage Table from the beginning of the file + uint heritageTableOffset = br.ReadUInt32(); + + long pos = br.Accessor.Position; + br.Accessor.Position = heritageTableOffset; + + for (uint i = 0; i < heritageTableEntryCount; i++) + { + upk.PackageGUIDs.Add(br.ReadGuid()); + } + + br.Accessor.Position = pos; + } + else if (mvarPackageVersion >= 68) + { + upk.PackageGUIDs.Add(br.ReadGuid()); + + if (mvarPackageVersion < 512) + { + uint generationCount = br.ReadUInt32(); + for (uint i = 0; i < generationCount; i++) + { + Generation generation = new Generation(); + generation.ExportCount = br.ReadUInt32(); + generation.NameCount = br.ReadUInt32(); + upk.Generations.Add(generation); + } + } + } + + #endregion + + #region Name table + { + // The Unreal-Engine introduces two new variable-types. The first one is a rather simple + // string type, called NAME from now on. The second one is a bit more tricky, these + // CompactIndices, or INDEX later on, compresses ordinary DWORDs downto one to five BYTEs. + + // The first and most simple one of the three tables is the name-table. The name-table can + // be considered an index of all unique names used for objects and references within the + // file. Later on, you'll often find indexes into this table instead of a string + // containing the object-name. + br.Accessor.Position = nameTableOffset; + for (uint i = 0; i < nameTableEntryCount; i++) + { + string name = br.ReadNAME(mvarPackageVersion); + if (mvarPackageVersion >= 512) + { + uint unknown = br.ReadUInt32(); + } + NameTableEntryFlags flags = (NameTableEntryFlags)br.ReadInt32(); + upk.NameTableEntries.Add(name, flags); + } + } + #endregion + + #region Export table + { + // The export-table is an index for all objects within the package. Every object in + // the body of the file has a corresponding entry in this table, with information like + // offset within the file etc. + br.Accessor.Position = exportTableOffset; + for (uint i = 0; i < exportTableEntryCount; i++) + { + ExportTableEntry entry = new ExportTableEntry(); + + // Class of the object, i.e. "Texture" or "Palette" etc; stored as a + // ObjectReference + int classIndex = br.ReadINDEX(); + if (classIndex != 0) entry.ObjectClass = new ObjectReference(classIndex, upk); + + // Object Parent; again a ObjectReference + int objectParentIndex = br.ReadINDEX(); + if (objectParentIndex != 0) entry.ObjectParent = new ObjectReference(objectParentIndex, upk); + + // Internal package/group of the object, i.e. ‘Floor’ for floor-textures; + // ObjectReference + int groupIndex = br.ReadInt32(); + if (groupIndex != 0) entry.Group = new ObjectReference(groupIndex, upk); + + // The name of the object; an index into the name-table + int objectNameIndex = br.ReadINDEX(); + if (objectNameIndex >= 0 && objectNameIndex < upk.NameTableEntries.Count) + { + entry.Name = upk.NameTableEntries[objectNameIndex]; + } + + // Flags for the object; described in the appendix + entry.Flags = (ObjectFlags)br.ReadInt32(); + + // Total size of the object + entry.Size = br.ReadINDEX(); + + if (entry.Size != 0) + { + // Offset of the object; this field only exists if the SerialSize is larger 0 + entry.Offset = br.ReadINDEX(); + } + upk.ExportTableEntries.Add(entry); + } + } + #endregion + + #region Import table + { + br.Accessor.Position = importTableOffset; + for (uint i = 0; i < importTableEntryCount; i++) + { + // The third table holds references to objects in external packages. For example, a + // texture might have a DetailTexture (which makes for the nice structure if have a + // very close look at a texture). Now, these DetailTextures are all stored in a + // single package (as they are used by many different textures in different package + // files). The property of the texture object only needs to store an index into the + // import-table then as the entry in the import-table already points to the + // DetailTexture in the other package. + ImportTableEntry entry = new ImportTableEntry(); + + int classPackageIndex = br.ReadINDEX(); + if (classPackageIndex >= 0 && classPackageIndex < upk.NameTableEntries.Count) + { + entry.PackageName = upk.NameTableEntries[classPackageIndex]; + } + + int classNameIndex = br.ReadINDEX(); + if (classNameIndex >= 0 && classNameIndex < upk.NameTableEntries.Count) + { + entry.ClassName = upk.NameTableEntries[classNameIndex]; + } + + int packageReference = br.ReadInt32(); + entry.Package = new ObjectReference(packageReference, upk); + + int objectNameIndex = br.ReadINDEX(); + if (objectNameIndex >= 0 && objectNameIndex < upk.NameTableEntries.Count) + { + entry.ObjectName = upk.NameTableEntries[objectNameIndex]; + } + upk.ImportTableEntries.Add(entry); + } + } + #endregion + } + + protected override void SaveInternal(ObjectModel objectModel) + { + Writer bw = base.Accessor.Writer; + + UnrealPackageObjectModel upk = (objectModel as UnrealPackageObjectModel); + #region Header + + // Always "0x9E2A83C1"; use this to verify that you indeed try to read an Unreal-Package + bw.WriteUInt32((uint)0x9E2A83C1); + + bw.WriteUInt16(mvarPackageVersion); + bw.WriteUInt16(upk.LicenseeNumber); + bw.WriteUInt32((uint)upk.PackageFlags); // 1949392 + + if (mvarPackageVersion >= 512) + { + bw.WriteUInt32((uint)mvarPackageName.Length); + bw.WriteFixedLengthString(mvarPackageName); + + uint unknown1 = 0; + bw.WriteUInt32(unknown1); + + uint unknown2 = 0; + bw.WriteUInt32(unknown2); + } + + // Number of entries in name-table + bw.WriteUInt32((uint)upk.NameTableEntries.Count); + // Offset of name-table within the file + uint nameTableOffset = 0; + bw.WriteUInt32(nameTableOffset); + + // Number of entries in export-table + bw.WriteUInt32((uint)upk.ExportTableEntries.Count); + // Offset of export-table within the file + uint exportTableOffset = 0; + bw.WriteUInt32(exportTableOffset); + + // Number of entries in import-table + bw.WriteUInt32((uint)upk.ImportTableEntries.Count); + // Offset of import-table within the file + uint importTableOffset = 0; + bw.WriteUInt32(importTableOffset); + + // After the ImportOffset, the header differs between the versions. The only interesting + // fact, though, is that for fileformat versions => 68, a GUID has been introduced. It can + // be found right after the ImportOffset: + if (mvarPackageVersion < 68) + { + // number of values in the Heritage Table + bw.WriteUInt32((uint)upk.PackageGUIDs.Count); + // offset of the Heritage Table from the beginning of the file + uint heritageTableOffset = 0; + bw.WriteUInt32(heritageTableOffset); + + // TODO: navigate to the heritageTableOffset to write the data + for (uint i = 0; i < (uint)upk.PackageGUIDs.Count; i++) + { + bw.WriteGuid(upk.PackageGUIDs[(int)i]); + } + } + else if (mvarPackageVersion >= 68) + { + if (upk.PackageGUIDs.Count > 0) + { + bw.WriteGuid(upk.PackageGUIDs[0]); + } + else + { + Guid guid = Guid.NewGuid(); + upk.PackageGUIDs.Add(guid); + bw.WriteGuid(guid); + } + + if (mvarPackageVersion < 512) + { + bw.WriteUInt32((uint)upk.Generations.Count); + for (uint i = 0; i < upk.Generations.Count; i++) + { + Generation generation = upk.Generations[(int)i]; + bw.WriteUInt32(generation.ExportCount); + bw.WriteUInt32(generation.NameCount); + } + } + } + + #endregion + + #region Name table + { + // The Unreal-Engine introduces two new variable-types. The first one is a rather simple + // string type, called NAME from now on. The second one is a bit more tricky, these + // CompactIndices, or INDEX later on, compresses ordinary DWORDs downto one to five BYTEs. + + // The first and most simple one of the three tables is the name-table. The name-table can + // be considered an index of all unique names used for objects and references within the + // file. Later on, you'll often find indexes into this table instead of a string + // containing the object-name. + + // TODO: navigate to the name table offset + // br.BaseStream.Position = nameTableOffset; + for (uint i = 0; i < upk.NameTableEntries.Count; i++) + { + bw.WriteNAME(upk.NameTableEntries[(int)i].Name, mvarPackageVersion); + if (mvarPackageVersion >= 512) + { + uint unknown = 0; + bw.WriteUInt32(unknown); + } + bw.WriteInt32((int)upk.NameTableEntries[(int)i].Flags); + } + } + #endregion + + #region Export table + { + // The export-table is an index for all objects within the package. Every object in + // the body of the file has a corresponding entry in this table, with information like + // offset within the file etc. + // br.BaseStream.Position = exportTableOffset; + // TODO: navigate to export table offset + + for (uint i = 0; i < upk.ExportTableEntries.Count; i++) + { + ExportTableEntry entry = upk.ExportTableEntries[(int)i]; + + // Class of the object, i.e. "Texture" or "Palette" etc; stored as a + // ObjectReference + if (entry.ObjectClass != null) + { + bw.WriteINDEX(entry.ObjectClass.IndexValue); + } + else + { + bw.WriteINDEX(0); + } + + // Object Parent; again a ObjectReference + if (entry.ObjectParent != null) + { + bw.WriteINDEX(entry.ObjectParent.IndexValue); + } + else + { + bw.WriteINDEX(0); + } + + // Internal package/group of the object, i.e. ‘Floor’ for floor-textures; + // ObjectReference + if (entry.Group != null) + { + bw.WriteInt32(entry.Group.IndexValue); + } + else + { + bw.WriteInt32((int)0); + } + + // The name of the object; an index into the name-table + bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.Name)); + + // Flags for the object; described in the appendix + bw.WriteInt32((int)entry.Flags); + + // Total size of the object + bw.WriteINDEX(entry.Size); + + if (entry.Size != 0) + { + // Offset of the object; this field only exists if the SerialSize is larger 0 + bw.WriteINDEX(entry.Offset); + } + } + } + #endregion + + #region Import table + { + for (uint i = 0; i < upk.ImportTableEntries.Count; i++) + { + // The third table holds references to objects in external packages. For example, a + // texture might have a DetailTexture (which makes for the nice structure if have a + // very close look at a texture). Now, these DetailTextures are all stored in a + // single package (as they are used by many different textures in different package + // files). The property of the texture object only needs to store an index into the + // import-table then as the entry in the import-table already points to the + // DetailTexture in the other package. + ImportTableEntry entry = upk.ImportTableEntries[(int)i]; + + bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.PackageName)); + bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.ClassName)); + bw.WriteInt32(entry.Package.IndexValue); + bw.WriteINDEX(upk.NameTableEntries.IndexOf(entry.ObjectName)); + } + } + #endregion + bw.Flush(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ExtensionMethods.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ExtensionMethods.cs new file mode 100644 index 00000000..4f363a90 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ExtensionMethods.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UniversalEditor.IO; + +namespace UniversalEditor.Plugins.UnrealEngine +{ + public static class ExtensionMethods + { + /// + /// The Name type is a simple string type. The format does, although, differ between the + /// package versions. + /// + /// + /// + public static string ReadNAME(this Reader br, int packageVersion) + { + string value = String.Empty; + + // Older package versions (<64, original Unreal engine) store the Name type as a + // zero-terminated ASCII string; "UT2k3", for example would be stored as: + // "U" "T" "2" "k" "3" 0x00 + if (packageVersion < 64) + { + value = br.ReadNullTerminatedString(); + } + else if (packageVersion >= 512) + { + uint length = br.ReadUInt32(); + value = br.ReadNullTerminatedString(); + } + else + { + // Newer packages (>=64, UT engine) prepend the length of the string plus the trailing + // zero. Again, "UT2k3" would be now stored as: 0x06 "U" "T" "2" "k" "3" 0x00 + value = br.ReadLengthPrefixedString(); + if (value.EndsWith("\0")) + { + value = value.TrimNull(); + } + else + { + // do we need this sanity check? + throw new InvalidOperationException(); + } + } + return value; + } + public static void WriteNAME(this Writer bw, string value, int packageVersion) + { + // Older package versions (<64, original Unreal engine) store the Name type as a + // zero-terminated ASCII string; "UT2k3", for example would be stored as: + // "U" "T" "2" "k" "3" 0x00 + if (packageVersion < 64) + { + bw.WriteNullTerminatedString(value); + } + else + { + // Newer packages (>=64, UT engine) prepend the length of the string plus the trailing + // zero. Again, "UT2k3" would be now stored as: 0x06 "U" "T" "2" "k" "3" 0x00 + bw.WriteLengthPrefixedString(value); + bw.WriteInt32((byte)0); + } + } + + /// + /// Reads a compact integer from the FileReader. Bytes read differs, so do not make + /// assumptions about physical data being read from the stream. (If you have to, get the + /// difference of FileReader.BaseStream.Position before and after this is executed.) + /// + /// An "uncompacted" signed integer. + /// There may be better ways to implement this, but this is fast, and it works. + public static int ReadINDEX(this Reader br) + { + int output = 0; + bool signed = false; + for (int i = 0; i < 5; i++) + { + byte x = br.ReadByte(); + // First byte + if (i == 0) + { + // Bit: X0000000 + if ((x & 0x80) > 0) + { + signed = true; + } + // Bits: 00XXXXXX + output |= (x & 0x3F); + // Bit: 0X000000 + if ((x & 0x40) == 0) + { + break; + } + } + // Last byte + else if (i == 4) + { + // Bits: 000XXXXX -- the 0 bits are ignored + // (hits the 32 bit boundary) + output |= (x & 0x1F) << (6 + (3 * 7)); + } + // Middle bytes + else + { + // Bits: 0XXXXXXX + output |= (x & 0x7F) << (6 + ((i - 1) * 7)); + // Bit: X0000000 + if ((x & 0x80) == 0) + { + break; + } + } + } + // multiply by negative one here, since the first 6+ bits could be 0 + if (signed) + { + output *= -1; + } + return (output); + } + public static void WriteINDEX(this Writer bw, int value) + { + throw new NotImplementedException(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs new file mode 100644 index 00000000..3ea54dee --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public class ExportTableEntry : ICloneable + { + public class ExportTableEntryCollection + : System.Collections.ObjectModel.Collection + { + } + + public event UniversalEditor.ObjectModels.FileSystem.DataRequestEventHandler DataRequest; + protected virtual void OnDataRequest(UniversalEditor.ObjectModels.FileSystem.DataRequestEventArgs e) + { + if (DataRequest != null) + { + DataRequest(this, e); + } + } + + public byte[] GetData() + { + UniversalEditor.ObjectModels.FileSystem.DataRequestEventArgs e = new FileSystem.DataRequestEventArgs(); + OnDataRequest(e); + return e.Data; + } + + private NameTableEntry mvarName = null; + public NameTableEntry Name { get { return mvarName; } set { mvarName = value; } } + private ObjectReference mvarObjectClass = null; + public ObjectReference ObjectClass { get { return mvarObjectClass; } set { mvarObjectClass = value; } } + private ObjectReference mvarObjectParent = null; + public ObjectReference ObjectParent { get { return mvarObjectParent; } set { mvarObjectParent = value; } } + private ObjectReference mvarGroup = null; + public ObjectReference Group { get { return mvarGroup; } set { mvarGroup = value; } } + private ObjectFlags mvarFlags = ObjectFlags.None; + public ObjectFlags Flags { get { return mvarFlags; } set { mvarFlags = value; } } + + private int mvarSize = 0; + public int Size { get { return mvarSize; } set { mvarSize = value; } } + + private int mvarOffset = 0; + public int Offset { get { return mvarOffset; } set { mvarOffset = value; } } + + public object Clone() + { + ExportTableEntry clone = new ExportTableEntry(); + return clone; + } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + if (mvarGroup != null) + { + sb.Append(mvarGroup.ToString()); + sb.Append('.'); + } + if (mvarName == null) + { + sb.Append("(invalid name)"); + } + else + { + sb.Append(mvarName.ToString(false)); + } + if (mvarObjectClass != null) + { + sb.Append(" ("); + sb.Append(mvarObjectClass.ToString()); + sb.Append(")"); + } + if (mvarObjectParent != null) + { + sb.Append(" extends "); + sb.Append(mvarObjectParent.ToString()); + } + sb.Append(" : "); + sb.Append(mvarFlags.ToString()); + return sb.ToString(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/FunctionFlags.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/FunctionFlags.cs new file mode 100644 index 00000000..7faadba9 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/FunctionFlags.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public enum FunctionFlags + { + None = 0x00000000, + /// + /// Function is final (prebindable, non-overridable function). + /// + Final = 0x00000001, + /// + /// Function has been defined (not just declared). Not used in source code. + /// + Defined = 0x00000002, + /// + /// Function is an iterator. + /// + Iterator = 0x00000004, + /// + /// Function is a latent state function. + /// + Latent = 0x00000008, + /// + /// Unary operator is a prefix operator. + /// + PrefixOperator = 0x00000010, + /// + /// Function cannot be reentered. + /// + Singular = 0x00000020, + /// + /// Function is network-replicated. Not used in source code. + /// + NetworkReplicated = 0x00000040, + /// + /// Function should be sent reliably on the network. Not used in source code. + /// + NetworkReliable = 0x00000080, + /// + /// Function executed on the client side. + /// + Simulated = 0x00000100, + /// + /// Executable from command line. + /// + CommandLine = 0x00000200, + /// + /// Native function. + /// + Native = 0x00000400, + /// + /// Event function. + /// + Event = 0x00000800, + /// + /// Operator function. + /// + Operator = 0x00001000, + /// + /// Static function. + /// + Static = 0x00002000, + /// + /// Don't export intrinsic function to C++. + /// + DoNotExport = 0x00004000, + /// + /// Function doesn't modify this object. + /// + Constant = 0x00008000, + /// + /// Return value is purely dependent on parameters; no state dependencies or internal state changes. + /// + Invariant = 0x00010000 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/Generation.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/Generation.cs new file mode 100644 index 00000000..31591884 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/Generation.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public class Generation + { + public class GenerationCollection + : System.Collections.ObjectModel.Collection + { + } + + private uint mvarExportCount = 0; + public uint ExportCount { get { return mvarExportCount; } set { mvarExportCount = value; } } + + private uint mvarNameCount = 0; + public uint NameCount { get { return mvarNameCount; } set { mvarNameCount = value; } } + + public override string ToString() + { + return mvarExportCount.ToString() + " exports, " + mvarNameCount.ToString() + " names"; + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ImportTableEntry.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ImportTableEntry.cs new file mode 100644 index 00000000..464a81f4 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ImportTableEntry.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public class ImportTableEntry : ICloneable + { + public class ImportTableEntryCollection + : System.Collections.ObjectModel.Collection + { + } + + public object Clone() + { + ImportTableEntry clone = new ImportTableEntry(); + return clone; + } + + private NameTableEntry mvarPackageName = null; + /// + /// Package file in which the class of the object is defined + /// + public NameTableEntry PackageName { get { return mvarPackageName; } set { mvarPackageName = value; } } + + private NameTableEntry mvarClassName = null; + /// + /// Class of the object, i.e. "Texture", "Palette", "Package", etc. + /// + public NameTableEntry ClassName { get { return mvarClassName; } set { mvarClassName = value; } } + + private ObjectReference mvarPackage = null; + /// + /// Reference where the object resides + /// + public ObjectReference Package { get { return mvarPackage; } set { mvarPackage = value; } } + + private NameTableEntry mvarObjectName = null; + /// + /// The name of the object + /// + public NameTableEntry ObjectName { get { return mvarObjectName; } set { mvarObjectName = value; } } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + if (mvarPackageName != null) + { + sb.Append(mvarPackageName.ToString(false)); + sb.Append("."); + } + if (mvarObjectName == null) + { + sb.Append("(invalid name)"); + } + else + { + sb.Append(mvarObjectName.ToString(false)); + } + if (mvarClassName != null) + { + sb.Append(" ("); + sb.Append(mvarClassName.ToString(false)); + sb.Append(")"); + } + return sb.ToString(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/NameTableEntry.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/NameTableEntry.cs new file mode 100644 index 00000000..0a29feb6 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/NameTableEntry.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + [Flags()] + public enum NameTableEntryFlags + { + None = 0 + } + public class NameTableEntry : ICloneable + { + public class NameTableEntryCollection + : System.Collections.ObjectModel.Collection + { + public NameTableEntry Add(string name, NameTableEntryFlags flags = NameTableEntryFlags.None) + { + NameTableEntry entry = new NameTableEntry(); + entry.Name = name; + entry.Flags = flags; + Add(entry); + return entry; + } + } + + private string mvarName = String.Empty; + public string Name { get { return mvarName; } set { mvarName = value; } } + + private NameTableEntryFlags mvarFlags = NameTableEntryFlags.None; + public NameTableEntryFlags Flags { get { return mvarFlags; } set { mvarFlags = value; } } + + public object Clone() + { + NameTableEntry entry = new NameTableEntry(); + entry.Name = (mvarName.Clone() as string); + entry.Flags = mvarFlags; + return entry; + } + + public override string ToString() + { + return ToString(true); + } + public string ToString(bool includeFlags) + { + StringBuilder sb = new StringBuilder(); + sb.Append(mvarName); + if (includeFlags) + { + sb.Append(" : "); + sb.Append(mvarFlags.ToString()); + } + return sb.ToString(); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ObjectFlags.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ObjectFlags.cs new file mode 100644 index 00000000..edfdcc60 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ObjectFlags.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + [Flags()] + public enum ObjectFlags : uint + { + None = 0, + /// + /// Object must be tracked in the editor by the Undo/Redo tracking system. + /// + Transactional = 0x00000001, + /// + /// Object is not reachable on the object graph. + /// + Unreachable = 0x00000002, + /// + /// Object may be imported by other package files. + /// + Public = 0x00000004, + /// + /// Temporary import tag in load/save. + /// + Importing = 0x00000008, + /// + /// Temporary export tag in load/save. + /// + Exporting = 0x00000010, + /// + /// The external data source corresponding to this object has been modified. + /// + SourceModified = 0x00000020, + /// + /// Check during garbage collection. + /// + GarbageCollect = 0x00000040, + /// + /// During load, indicates object needs loading. + /// + RequireLoad = 0x00000200, + /// + /// A hardcoded name which should be syntax-highlighted. + /// + HighlightedName = 0x00000400, + EliminateObject = 0x00000400, + RemappedName = 0x00000800, + /// + /// In a singular function. + /// + SingularFunction = 0x00000800, + /// + /// Suppressed log name. + /// + Suppressed = 0x00001000, + StateChanged = 0x00001000, + /// + /// Within an EndState call. + /// + EndState = 0x00002000, + /// + /// Do not save the object. + /// + Transient = 0x00004000, + /// + /// Data is being preloaded from the file. + /// + Preloading = 0x00008000, + /// + /// Must be loaded for game client. + /// + LoadForClient = 0x00010000, + /// + /// Must be loaded for game server. + /// + LoadForServer = 0x00020000, + /// + /// Must be loaded for editor. + /// + LoadForEditor = 0x00040000, + /// + /// Keep object around (don't garbage collect) for editor even if unreferenced. + /// + Standalone = 0x00080000, + /// + /// Don't load this object for the game client. + /// + NotForClient = 0x00100000, + /// + /// Don't load this object for the game server. + /// + NotForServer = 0x00200000, + /// + /// Don't load this object for the editor. + /// + NotForEdit = 0x00400000, + /// + /// Object Destroy has already been called + /// + Destroyed = 0x00800000, + /// + /// Object needs to be postloaded. + /// + RequirePostLoad = 0x01000000, + /// + /// This object has an execution stack allocated and is ready to execute UnrealScript code. + /// + HasStack = 0x02000000, + /// + /// Class or name is defined in C++ code and must be bound at load-time. (UClass only) + /// + Intrinsic = 0x04000000, + /// + /// Class or name is defined in C++ code and must be bound at load-time. (UClass only) + /// + Native = 0x04000000, + /// + /// Marked (for debugging) + /// + Marked = 0x08000000, + /// + /// ShutdownAfterError called. + /// + ErrorShutdown = 0x10000000, + /// + /// For debugging Serialize calls + /// + DebugPostLoad = 0x20000000, + /// + /// For debugging Serialize calls + /// + DebugSerialize = 0x40000000, + /// + /// For debugging Destroy calls + /// + DebugDestroy = 0x80000000 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ObjectReference.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ObjectReference.cs new file mode 100644 index 00000000..65f6f9ed --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ObjectReference.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public class ObjectReference + { + private UnrealPackageObjectModel mvarParent = null; + public UnrealPackageObjectModel Parent { get { return mvarParent; } } + + private int mvarIndexValue = 0; + public int IndexValue { get { return mvarIndexValue; } set { mvarIndexValue = value; } } + + public static readonly ObjectReference Empty = new ObjectReference(0, null); + + public ObjectReference(int indexValue = 0, UnrealPackageObjectModel parent = null) + { + mvarParent = parent; + mvarIndexValue = indexValue; + } + + public object Value + { + get + { + if (mvarParent != null) + { + if (mvarIndexValue < 0) + { + // pointer to an entry of the ImportTable + int index = -mvarIndexValue - 1; + if (index >= 0 && index < mvarParent.ImportTableEntries.Count) + { + return mvarParent.ImportTableEntries[index].ToString(); + } + } + else if (mvarIndexValue > 0) + { + // pointer to an entry in the ExportTable + int index = mvarIndexValue - 1; + if (index >= 0 && index < mvarParent.ExportTableEntries.Count) + { + return mvarParent.ExportTableEntries[index].ToString(); + } + } + } + return null; + } + } + + public override string ToString() + { + if (mvarIndexValue == 0) return "(null)"; + if (mvarParent != null) + { + if (mvarIndexValue < 0) + { + // pointer to an entry of the ImportTable + int index = -mvarIndexValue - 1; + if (index >= 0 && index < mvarParent.ImportTableEntries.Count) + { + return mvarParent.ImportTableEntries[index].ToString(); + } + return "(unknown: " + mvarIndexValue.ToString() + ")"; + } + else if (mvarIndexValue > 0) + { + // pointer to an entry in the ExportTable + int index = mvarIndexValue - 1; + if (index >= 0 && index < mvarParent.ExportTableEntries.Count) + { + return mvarParent.ExportTableEntries[index].ToString(); + } + return "(unknown: " + mvarIndexValue.ToString() + ")"; + } + } + return "(unknown: " + mvarIndexValue.ToString() + ")"; + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PackageFlags.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PackageFlags.cs new file mode 100644 index 00000000..f57d5427 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PackageFlags.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + [Flags()] + public enum PackageFlags + { + None = 0, + /// + /// The package is allowed to be downloaded to clients freely. + /// + AllowDownload = 0x0001, + /// + /// All objects in the package are optional (i.e. skins, textures) and it's up to the client whether he wants + /// to download them or not. Not yet implemented; currently ignored. + /// + ClientOptional = 0x0002, + /// + /// This package is only needed on the server side, and the client shouldn't be informed of its presence. This + /// is used with packages like IpDrv so that it can be updated frequently on the server side without requiring + /// downloading stuff to the client. + /// + ServerSideOnly = 0x0004, + /// + /// Loaded from linker with broken import links + /// + BrokenLinks = 0x0008, + /// + /// Not trusted + /// + Untrusted = 0x0010, + /// + /// Client needs to download this package + /// + Required = 0x8000 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PropertyFlags.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PropertyFlags.cs new file mode 100644 index 00000000..eb939459 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PropertyFlags.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + [Flags()] + public enum PropertyFlags + { + None = 0x00000000, + /// + /// Property is user-settable in the editor. + /// + Editable = 0x00000001, + /// + /// Actor's property always matches class's default actor property. + /// + Constant = 0x00000002, + /// + /// Variable is writable by the input system. + /// + InputWritable = 0x00000004, + /// + /// Object can be exported with actor. + /// + Exportable = 0x00000008, + /// + /// Optional parameter (if CPF_Param is set). + /// + OptionalParameter = 0x00000010, + /// + /// Property is relevant to network replication (not specified in source code) + /// + NetworkReplication = 0x00000020, + /// + /// Reference to a constant object. + /// + ConstantReference = 0x00000040, + /// + /// Function/When call parameter + /// + Parameter = 0x00000080, + /// + /// Value is copied out after function call. + /// + OutParameter = 0x00000100, + /// + /// Property is a short-circuitable evaluation function parm. + /// + SkipParameter = 0x00000200, + /// + /// Return value. + /// + ReturnParameter = 0x00000400, + /// + /// Coerce args into this function parameter + /// + CoerceParameter = 0x00000800, + /// + /// Property is native: C++ code is responsible for serializing it. + /// + Native = 0x00001000, + /// + /// Property is transient: shouldn't be saved, zero-filled at load time. + /// + Transient = 0x00002000, + /// + /// Property should be loaded/saved as permanent profile. + /// + Configuration = 0x00004000, + /// + /// Property should be loaded as localizable text + /// + Localized = 0x00008000, + /// + /// Property travels across levels/servers. + /// + Travel = 0x00010000, + /// + /// Property is uneditable in the editor + /// + PreventEdit = 0x00020000, + /// + /// Load config from base class, not subclass. + /// + GlobalConfiguration = 0x00040000, + /// + /// Object or dynamic array loaded on demand only. + /// + Demand = 0x00100000, + /// + /// Automatically create inner object + /// + AutoCreate = 0x00200000, + /// + /// Fields need construction/destruction (not specified in source code) + /// + ConstructionRequired = 0x00400000 + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PropertyType.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PropertyType.cs new file mode 100644 index 00000000..cf32fdeb --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/PropertyType.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public enum PropertyType + { + Byte = 1, + Integer = 2, + Boolean = 3, + Float = 4, + Object = 5, + Name = 6, + String = 7, + Class = 8, + Array = 9, + Struct = 10, + Vector = 11, + Rotator = 12, + Str = 13, + Map = 14, + FixedArray = 15 + } + + /* + * Property size values: +0 = 1 byte +1 = 2 bytes +2 = 4 bytes +3 = 12 bytes +4 = 16 bytes +5 = a byte follows with real size +6 = a word follows with real size +7 = an integer follows with real size + * + * + * Property value layout: + * 0x01 (ByteProperty) Value Format +0x02 (IntegerProperty) BYTE +0x03 (BooleanProperty) DWORD +0x04 (FloatProperty) DWORD +0x05 (ObjectProperty) INDEX +0x06 (NameProperty) INDEX +0x07 (StringProperty) Unknown +0x08 (ClassProperty) +0x09 (ArrayProperty) Unknown +0x0A (StructProperty) +0x0B (VectorProperty) Unknown +0x0C (RotatorProperty) Unknown +0x0D (StrProperty) INDEX length + ASCIIZ text + Unknown + Unknown +0x0E (MapProperty) +0x0F (FixedArrayProperty) +Comments +The real value is in bit 7 of +the info byte. +A 4-byte float. +Object Reference value. +See “Object References”. +Name Reference value. +Index in to the Name +Table. +See below for some known +classes. +See below for some known +structs. +Length field includes null +terminator. + + */ +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/UnrealPackageObjectModel.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/UnrealPackageObjectModel.cs new file mode 100644 index 00000000..759eaac0 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/UnrealPackageObjectModel.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace UniversalEditor.ObjectModels.UnrealEngine +{ + public class UnrealPackageObjectModel : ObjectModel + { + private static ObjectModelReference _omr = null; + public override ObjectModelReference MakeReference() + { + if (_omr == null) + { + _omr = base.MakeReference(); + _omr.Title = "Unreal Engine package"; + _omr.Path = new string[] { "Game development", "Unreal Engine", "Package" }; + } + return _omr; + } + + private List mvarPackageGUIDs = new List(); + /// + /// Unique identifiers used for package downloading from servers. + /// + public List PackageGUIDs { get { return mvarPackageGUIDs; } set { mvarPackageGUIDs = value; } } + + private ushort mvarLicenseeNumber = 0; + /// + /// This is the licensee number, different for each game. + /// + public ushort LicenseeNumber { get { return mvarLicenseeNumber; } set { mvarLicenseeNumber = value; } } + + private PackageFlags mvarPackageFlags = PackageFlags.None; + /// + /// Global package flags; i.e., if a package may be downloaded from a game server, etc. + /// + public PackageFlags PackageFlags { get { return mvarPackageFlags; } set { mvarPackageFlags = value; } } + + private NameTableEntry.NameTableEntryCollection mvarNameTableEntries = new NameTableEntry.NameTableEntryCollection(); + /// + /// The name-table can be considered an index of all unique names used for objects and + /// references within the file. Later on, you'll often find indexes into this table instead of + /// a string containing the object-name. + /// + public NameTableEntry.NameTableEntryCollection NameTableEntries { get { return mvarNameTableEntries; } } + + private ExportTableEntry.ExportTableEntryCollection mvarExportTableEntries = new ExportTableEntry.ExportTableEntryCollection(); + /// + /// The export-table is an index for all objects within the package. Every object in the body + /// of the file has a corresponding entry in this table, with information like offset within + /// the file etc. + /// + public ExportTableEntry.ExportTableEntryCollection ExportTableEntries { get { return mvarExportTableEntries; } } + + private ImportTableEntry.ImportTableEntryCollection mvarImportTableEntries = new ImportTableEntry.ImportTableEntryCollection(); + public ImportTableEntry.ImportTableEntryCollection ImportTableEntries { get { return mvarImportTableEntries; } } + + private Generation.GenerationCollection mvarGenerations = new Generation.GenerationCollection(); + public Generation.GenerationCollection Generations { get { return mvarGenerations; } } + + public override void Clear() + { + mvarLicenseeNumber = 0; + mvarPackageFlags = UnrealEngine.PackageFlags.None; + mvarPackageGUIDs.Clear(); + mvarNameTableEntries.Clear(); + mvarExportTableEntries.Clear(); + mvarImportTableEntries.Clear(); + } + + public override void CopyTo(ObjectModel where) + { + UnrealPackageObjectModel clone = (where as UnrealPackageObjectModel); + clone.LicenseeNumber = mvarLicenseeNumber; + clone.PackageFlags = mvarPackageFlags; + foreach (Guid guid in mvarPackageGUIDs) + { + clone.PackageGUIDs.Add(guid); + } + foreach (NameTableEntry entry in mvarNameTableEntries) + { + clone.NameTableEntries.Add(entry.Clone() as NameTableEntry); + } + foreach (ExportTableEntry entry in mvarExportTableEntries) + { + clone.ExportTableEntries.Add(entry.Clone() as ExportTableEntry); + } + foreach (ImportTableEntry entry in mvarImportTableEntries) + { + clone.ImportTableEntries.Add(entry.Clone() as ImportTableEntry); + } + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/Properties/AssemblyInfo.cs b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..39fc52f8 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Unreal Engine plugin for Universal Editor")] +[assembly: AssemblyDescription("Provides data formats to interact with Epic Games' Unreal game engine assets.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("Universal Editor Plugin Pack")] +[assembly: AssemblyCopyright("Copyright ©2013 Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d54c55f4-4359-4af2-8f27-7908c7002f35")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/UniversalEditor.Plugins.UnrealEngine.csproj b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/UniversalEditor.Plugins.UnrealEngine.csproj new file mode 100644 index 00000000..8ab1fc3a --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.UnrealEngine/UniversalEditor.Plugins.UnrealEngine.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {DF96F24E-FED9-4BAC-8389-63590125DC61} + Library + Properties + UniversalEditor + UniversalEditor.Plugins.UnrealEngine + v3.5 + 512 + + + true + full + false + ..\..\Output\Debug\Plugins\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Output\Release\Plugins\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + {2d4737e6-6d95-408a-90db-8dff38147e85} + UniversalEditor.Core + + + {30467e5c-05bc-4856-aadc-13906ef4cadd} + UniversalEditor.Essential + + + + + \ No newline at end of file diff --git a/CSharp/UniversalEditor.WindowsForms.sln b/CSharp/UniversalEditor.WindowsForms.sln index 565e1eba..cc3ee220 100644 --- a/CSharp/UniversalEditor.WindowsForms.sln +++ b/CSharp/UniversalEditor.WindowsForms.sln @@ -97,398 +97,176 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Mul EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanjigen", "..\..\Sanjigen\Sanjigen\Sanjigen.csproj", "{ED627DF7-3E78-4428-AB31-810BA1586E62}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.UnrealEngine", "Plugins\UniversalEditor.Plugins.UnrealEngine\UniversalEditor.Plugins.UnrealEngine.csproj", "{DF96F24E-FED9-4BAC-8389-63590125DC61}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms", "Environments\WindowsForms\Plugins\UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms\UniversalEditor.Plugins.UnrealEngine.UserInterface.WindowsForms.csproj", "{049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Debug|x86.ActiveCfg = Debug|Any CPU {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Any CPU.Build.0 = Release|Any CPU - {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2D4737E6-6D95-408A-90DB-8DFF38147E85}.Release|x86.ActiveCfg = Release|Any CPU {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Debug|x86.ActiveCfg = Debug|Any CPU {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Any CPU.ActiveCfg = Release|Any CPU {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Any CPU.Build.0 = Release|Any CPU - {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BAC9FDFD-C39E-4A90-B9F8-CF75B551BE10}.Release|x86.ActiveCfg = Release|Any CPU {30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {30467E5C-05BC-4856-AADC-13906EF4CADD}.Debug|x86.ActiveCfg = Debug|Any CPU {30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Any CPU.ActiveCfg = Release|Any CPU {30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Any CPU.Build.0 = Release|Any CPU - {30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {30467E5C-05BC-4856-AADC-13906EF4CADD}.Release|x86.ActiveCfg = Release|Any CPU {3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3F664673-7E22-4486-9AD0-FC81861D0B78}.Debug|x86.ActiveCfg = Debug|Any CPU {3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Any CPU.ActiveCfg = Release|Any CPU {3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Any CPU.Build.0 = Release|Any CPU - {3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3F664673-7E22-4486-9AD0-FC81861D0B78}.Release|x86.ActiveCfg = Release|Any CPU {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Debug|x86.ActiveCfg = Debug|Any CPU {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Any CPU.ActiveCfg = Release|Any CPU {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Any CPU.Build.0 = Release|Any CPU - {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {7CA0A889-C1A1-4CEB-AA54-43A640B41C6C}.Release|x86.ActiveCfg = Release|Any CPU {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Debug|x86.ActiveCfg = Debug|Any CPU {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Any CPU.Build.0 = Release|Any CPU - {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BE4D0BA3-0888-42A5-9C09-FC308A4509D2}.Release|x86.ActiveCfg = Release|Any CPU {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|x86.ActiveCfg = Debug|x86 - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Debug|x86.Build.0 = Debug|x86 {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Any CPU.ActiveCfg = Release|Any CPU {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Any CPU.Build.0 = Release|Any CPU - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|Mixed Platforms.Build.0 = Release|x86 - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|x86.ActiveCfg = Release|x86 - {617D9EB5-CA93-45D6-AA6B-5A012B7698AC}.Release|x86.Build.0 = Release|x86 {8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {8622EBC4-8E20-476E-B284-33D472081F5C}.Debug|x86.ActiveCfg = Debug|Any CPU {8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Any CPU.ActiveCfg = Release|Any CPU {8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Any CPU.Build.0 = Release|Any CPU - {8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8622EBC4-8E20-476E-B284-33D472081F5C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8622EBC4-8E20-476E-B284-33D472081F5C}.Release|x86.ActiveCfg = Release|Any CPU {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Debug|x86.ActiveCfg = Debug|Any CPU {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Any CPU.ActiveCfg = Release|Any CPU {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Any CPU.Build.0 = Release|Any CPU - {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BCBB72BD-0ECB-4FF2-8D91-E466361FB6F9}.Release|x86.ActiveCfg = Release|Any CPU {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Debug|x86.ActiveCfg = Debug|Any CPU {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Any CPU.Build.0 = Release|Any CPU - {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FE016EA3-DC31-4A92-8B0A-8C746EC117E1}.Release|x86.ActiveCfg = Release|Any CPU {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Debug|x86.ActiveCfg = Debug|Any CPU {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Any CPU.ActiveCfg = Release|Any CPU {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Any CPU.Build.0 = Release|Any CPU - {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {369CFD53-3E65-4A9E-8BDD-4CCD78BF3E33}.Release|x86.ActiveCfg = Release|Any CPU {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Debug|x86.ActiveCfg = Debug|Any CPU {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Any CPU.ActiveCfg = Release|Any CPU {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Any CPU.Build.0 = Release|Any CPU - {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {30A2F772-8EC1-425A-8D5D-36A0BE4D6B66}.Release|x86.ActiveCfg = Release|Any CPU {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Debug|x86.ActiveCfg = Debug|Any CPU {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Any CPU.Build.0 = Release|Any CPU - {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3DC2C1F6-F332-4E55-BF6A-AED78A7C3FD2}.Release|x86.ActiveCfg = Release|Any CPU {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Debug|x86.ActiveCfg = Debug|Any CPU {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Any CPU.Build.0 = Release|Any CPU - {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {899E3DD6-EA65-4168-AAE3-867A4F9650A6}.Release|x86.ActiveCfg = Release|Any CPU {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Debug|x86.ActiveCfg = Debug|Any CPU {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Any CPU.Build.0 = Release|Any CPU - {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2}.Release|x86.ActiveCfg = Release|Any CPU {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Debug|x86.ActiveCfg = Debug|Any CPU {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Any CPU.ActiveCfg = Release|Any CPU {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Any CPU.Build.0 = Release|Any CPU - {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {19AEFD28-37E8-4FFD-B879-FEE57824689D}.Release|x86.ActiveCfg = Release|Any CPU {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Debug|x86.ActiveCfg = Debug|Any CPU {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Any CPU.ActiveCfg = Release|Any CPU {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Any CPU.Build.0 = Release|Any CPU - {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {76FD1306-9CA4-428F-993B-B7E4EEEACBF3}.Release|x86.ActiveCfg = Release|Any CPU {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Debug|x86.ActiveCfg = Debug|Any CPU {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Any CPU.ActiveCfg = Release|Any CPU {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Any CPU.Build.0 = Release|Any CPU - {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {26095090-3F7D-4DB5-A9BF-4C687230FC0F}.Release|x86.ActiveCfg = Release|Any CPU {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Any CPU.Build.0 = Debug|Any CPU - {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Debug|x86.ActiveCfg = Debug|Any CPU {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Any CPU.ActiveCfg = Release|Any CPU {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Any CPU.Build.0 = Release|Any CPU - {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {118E40C4-323E-4B4B-8EF4-38EED6CC5E83}.Release|x86.ActiveCfg = Release|Any CPU {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Debug|x86.ActiveCfg = Debug|Any CPU {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Any CPU.ActiveCfg = Release|Any CPU {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Any CPU.Build.0 = Release|Any CPU - {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {4250B20B-2DC9-432F-B0C2-BD20B80B4970}.Release|x86.ActiveCfg = Release|Any CPU {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Debug|x86.ActiveCfg = Debug|Any CPU {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Any CPU.ActiveCfg = Release|Any CPU {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Any CPU.Build.0 = Release|Any CPU - {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D4D9C9A6-04A4-46AD-8238-2493A455723F}.Release|x86.ActiveCfg = Release|Any CPU {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Debug|x86.ActiveCfg = Debug|Any CPU {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Any CPU.ActiveCfg = Release|Any CPU {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Any CPU.Build.0 = Release|Any CPU - {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {62CFC025-B8CF-42AA-880A-92F27377FCAF}.Release|x86.ActiveCfg = Release|Any CPU {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Debug|x86.ActiveCfg = Debug|Any CPU {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Any CPU.Build.0 = Release|Any CPU - {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}.Release|x86.ActiveCfg = Release|Any CPU {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {10B9B771-9939-4D0B-8D47-501B6F60209F}.Debug|x86.ActiveCfg = Debug|Any CPU {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Any CPU.ActiveCfg = Release|Any CPU {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Any CPU.Build.0 = Release|Any CPU - {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {10B9B771-9939-4D0B-8D47-501B6F60209F}.Release|x86.ActiveCfg = Release|Any CPU {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Debug|x86.ActiveCfg = Debug|Any CPU {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Any CPU.ActiveCfg = Release|Any CPU {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Any CPU.Build.0 = Release|Any CPU - {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FEC4EAD0-8A6E-4029-A537-EBD9F420B227}.Release|x86.ActiveCfg = Release|Any CPU {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Any CPU.Build.0 = Debug|Any CPU - {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Debug|x86.ActiveCfg = Debug|Any CPU {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Any CPU.ActiveCfg = Release|Any CPU {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Any CPU.Build.0 = Release|Any CPU - {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {828C6BB6-3543-4EAF-B0F9-F11410AE8836}.Release|x86.ActiveCfg = Release|Any CPU {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Debug|x86.ActiveCfg = Debug|Any CPU {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Any CPU.ActiveCfg = Release|Any CPU {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Any CPU.Build.0 = Release|Any CPU - {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1C24F4F8-9D94-4783-B5C0-11564D70B76A}.Release|x86.ActiveCfg = Release|Any CPU {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Debug|x86.ActiveCfg = Debug|Any CPU {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Any CPU.Build.0 = Release|Any CPU - {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D3BBDA07-5088-454E-A16D-DA24D8D88037}.Release|x86.ActiveCfg = Release|Any CPU {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Debug|x86.ActiveCfg = Debug|Any CPU {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Any CPU.Build.0 = Release|Any CPU - {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FFC91B24-39AF-49AC-9A3A-900FBE1012ED}.Release|x86.ActiveCfg = Release|Any CPU {FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FD6B879E-46B0-47BE-860E-BF0C11135590}.Debug|x86.ActiveCfg = Debug|Any CPU {FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Any CPU.Build.0 = Release|Any CPU - {FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FD6B879E-46B0-47BE-860E-BF0C11135590}.Release|x86.ActiveCfg = Release|Any CPU {41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {41DBA506-177E-4B2D-8E6D-738E371326A1}.Debug|x86.ActiveCfg = Debug|Any CPU {41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Any CPU.Build.0 = Release|Any CPU - {41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {41DBA506-177E-4B2D-8E6D-738E371326A1}.Release|x86.ActiveCfg = Release|Any CPU {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Debug|x86.ActiveCfg = Debug|Any CPU {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Any CPU.ActiveCfg = Release|Any CPU {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Any CPU.Build.0 = Release|Any CPU - {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BED1EEAF-9ADD-46F6-92D0-53957858E25B}.Release|x86.ActiveCfg = Release|Any CPU {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Debug|x86.ActiveCfg = Debug|Any CPU {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Any CPU.ActiveCfg = Release|Any CPU {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Any CPU.Build.0 = Release|Any CPU - {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D8E59ADD-B591-49AF-B18E-6E0D4581700C}.Release|x86.ActiveCfg = Release|Any CPU {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|x86.ActiveCfg = Debug|Any CPU {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Any CPU.Build.0 = Release|Any CPU - {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Release|x86.ActiveCfg = Release|Any CPU {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Debug|x86.ActiveCfg = Debug|Any CPU {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Any CPU.Build.0 = Release|Any CPU - {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D}.Release|x86.ActiveCfg = Release|Any CPU {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Debug|x86.ActiveCfg = Debug|Any CPU {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Any CPU.Build.0 = Release|Any CPU - {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E6C9A73D-4556-4220-9BC7-302A7EE64C1A}.Release|x86.ActiveCfg = Release|Any CPU {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Debug|x86.ActiveCfg = Debug|Any CPU {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Any CPU.ActiveCfg = Release|Any CPU {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Any CPU.Build.0 = Release|Any CPU - {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492}.Release|x86.ActiveCfg = Release|Any CPU {ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {ED627DF7-3E78-4428-AB31-810BA1586E62}.Debug|x86.ActiveCfg = Debug|Any CPU {ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Any CPU.ActiveCfg = Release|Any CPU {ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Any CPU.Build.0 = Release|Any CPU - {ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {ED627DF7-3E78-4428-AB31-810BA1586E62}.Release|x86.ActiveCfg = Release|Any CPU + {DF96F24E-FED9-4BAC-8389-63590125DC61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF96F24E-FED9-4BAC-8389-63590125DC61}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF96F24E-FED9-4BAC-8389-63590125DC61}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF96F24E-FED9-4BAC-8389-63590125DC61}.Release|Any CPU.Build.0 = Release|Any CPU + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -523,6 +301,7 @@ Global {BED1EEAF-9ADD-46F6-92D0-53957858E25B} = {71CFF024-26F7-4626-A526-B435FDF8D64E} {9F1FDC26-5F1C-4C2A-BBBF-3A597A72802D} = {71CFF024-26F7-4626-A526-B435FDF8D64E} {E6C9A73D-4556-4220-9BC7-302A7EE64C1A} = {71CFF024-26F7-4626-A526-B435FDF8D64E} + {DF96F24E-FED9-4BAC-8389-63590125DC61} = {71CFF024-26F7-4626-A526-B435FDF8D64E} {FE016EA3-DC31-4A92-8B0A-8C746EC117E1} = {46041F27-7C1C-4209-B72B-251EDB5D4C61} {ED627DF7-3E78-4428-AB31-810BA1586E62} = {46041F27-7C1C-4209-B72B-251EDB5D4C61} {C1F34183-7A2F-41A6-9958-F6F329099654} = {A846CA33-9CAA-4237-B14F-8721DBA89442} @@ -536,6 +315,7 @@ Global {4250B20B-2DC9-432F-B0C2-BD20B80B4970} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1} {D8E59ADD-B591-49AF-B18E-6E0D4581700C} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1} {9B5ABDC3-ADF7-42B7-ADE9-8DC715310492} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1} + {049A3447-14AF-4CAE-BE0E-1C42DD1AB1CB} = {D3CE7A47-3989-4B6D-9867-0EA3C8DD7AB1} {118E40C4-323E-4B4B-8EF4-38EED6CC5E83} = {54990D5E-CE09-459F-916E-AF13101765B4} EndGlobalSection EndGlobal