diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Controls/ItemListBox.glade b/Content/UniversalEditor.Content.PlatformIndependent/Controls/ItemListBox.glade
new file mode 100644
index 00000000..4327a355
--- /dev/null
+++ b/Content/UniversalEditor.Content.PlatformIndependent/Controls/ItemListBox.glade
@@ -0,0 +1,148 @@
+
+
+
+
+
+
diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Blockchain/BlockchainEditor.glade b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Blockchain/BlockchainEditor.glade
new file mode 100644
index 00000000..7461d537
--- /dev/null
+++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Blockchain/BlockchainEditor.glade
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ True
+ in
+
+
+ True
+ True
+ tm
+
+
+
+
+
+ True
+ Version
+ True
+ True
+
+
+
+ 0
+
+
+
+
+
+
+ True
+ Previous Block Hash
+ True
+ True
+
+
+
+ 1
+
+
+
+
+
+
+ True
+ Merkel Root
+ True
+ True
+
+
+
+ 2
+
+
+
+
+
+
+ True
+ Timestamp
+ True
+ True
+
+
+
+ 3
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+
+
diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor_WithToolbarLikeWinZip.glade b/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor_WithToolbarLikeWinZip.glade
new file mode 100644
index 00000000..e8a1e57e
--- /dev/null
+++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor_WithToolbarLikeWinZip.glade
@@ -0,0 +1,354 @@
+
+
+
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-add
+ 6
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-dialog-authentication
+ 6
+
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-directory
+ 6
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-execute
+ 6
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-new
+ 6
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-open
+ 6
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-find
+ 6
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ gtk-preferences
+ 6
+
+
+ False
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+
+
+ New
+ True
+ True
+ True
+ icoNew
+ none
+ top
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ Open
+ True
+ True
+ True
+ icoOpen
+ none
+ top
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+ Favorites
+ True
+ True
+ True
+ icoFavorites
+ none
+ top
+ True
+
+
+ False
+ True
+ 2
+
+
+
+
+ Add
+ True
+ True
+ True
+ icoAdd
+ none
+ top
+ True
+
+
+ False
+ True
+ 3
+
+
+
+
+ Extract
+ True
+ True
+ True
+ icoExtract
+ none
+ top
+ True
+
+
+ False
+ True
+ 4
+
+
+
+
+ Encrypt
+ True
+ True
+ True
+ icoEncrypt
+ none
+ top
+ True
+
+
+ False
+ True
+ 5
+
+
+
+
+ View
+ True
+ True
+ True
+ icoView
+ none
+ top
+ True
+
+
+ False
+ True
+ 6
+
+
+
+
+ Install
+ True
+ True
+ True
+ icoInstall
+ none
+ top
+ True
+
+
+ False
+ True
+ 7
+
+
+
+
+ Wizard
+ True
+ True
+ True
+ icoWizard
+ none
+ top
+ True
+
+
+ False
+ True
+ 8
+
+
+
+
+ False
+ True
+ 16
+ 0
+
+
+
+
+ True
+ True
+ tm
+ 0
+
+
+
+
+
+ True
+ Name
+ True
+ True
+
+
+
+ 0
+
+
+
+
+
+
+ True
+ Size
+ True
+ True
+
+
+
+ 1
+
+
+
+
+
+
+ True
+ Type
+ True
+ True
+
+
+
+ 2
+
+
+
+
+
+
+ True
+ Date modified
+ True
+ True
+
+
+
+ 3
+
+
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Multimedia/Audio/Waveform/Commands.uexml b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Multimedia/Audio/Waveform/Commands.uexml
new file mode 100644
index 00000000..a16070ca
--- /dev/null
+++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Multimedia/Audio/Waveform/Commands.uexml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Shortcut/ShortcutEditor.glade b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Shortcut/ShortcutEditor.glade
new file mode 100644
index 00000000..ac756962
--- /dev/null
+++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Shortcut/ShortcutEditor.glade
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+ Local file/directory
+
+
+ Shell namespace extension
+
+
+
+
+ False
+
+
+
+
+
+ True
+ False
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+
+
+ 100
+ 80
+ True
+ True
+
+
+ True
+ False
+
+
+ True
+ False
+ 8
+ 8
+ 8
+ 8
+ Target _type
+ True
+ 1
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ lsShortcutTargetType
+
+
+
+ 0
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+
+
+
+
+ 100
+ 80
+ True
+ True
+
+
+ True
+ False
+
+
+ True
+ False
+ Target
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ True
+
+
+ True
+ True
+ 1
+
+
+
+
+ _Browse...
+ True
+ True
+ True
+ True
+
+
+ False
+ True
+ 2
+
+
+
+
+
+
+
+
+ 100
+ 80
+ True
+ True
+
+
+
+
+
+
+
+ 100
+ 80
+ True
+ True
+
+
+
+
+
+
+
+ page0
+ General
+ document-properties
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+
+
diff --git a/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj b/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj
index aad50283..4cd9ccba 100644
--- a/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj
+++ b/Content/UniversalEditor.Content.PlatformIndependent/UniversalEditor.Content.PlatformIndependent.csproj
@@ -315,6 +315,7 @@
+
diff --git a/Extensions/UniversalEditor.Extensions.Sony/Templates/Project/SCE.PSM.BasicProject.uetx b/Extensions/UniversalEditor.Extensions.Sony/Templates/Project/SCE.PSM.BasicProject.uetx
new file mode 100644
index 00000000..d96c71b3
Binary files /dev/null and b/Extensions/UniversalEditor.Extensions.Sony/Templates/Project/SCE.PSM.BasicProject.uetx differ
diff --git a/Extensions/UniversalEditor.Extensions.Sony/UniversalEditor.Extensions.Sony.csproj b/Extensions/UniversalEditor.Extensions.Sony/UniversalEditor.Extensions.Sony.csproj
new file mode 100644
index 00000000..9dc32e9f
--- /dev/null
+++ b/Extensions/UniversalEditor.Extensions.Sony/UniversalEditor.Extensions.Sony.csproj
@@ -0,0 +1,52 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {D28CBD31-EE2D-47DE-9305-3FD5AFB43FB2}
+ Library
+ Properties
+ UniversalEditor.Extensions.Sony
+ UniversalEditor.Extensions.Sony
+ v4.0
+ 512
+
+ true
+ ..\..\..\..\Production.snk
+ 4.0.2019.12
+
+
+ true
+ full
+ false
+ ..\..\Output\Debug\Extensions
+ DEBUG;TRACE
+ prompt
+ 4
+ false
+
+
+ pdbonly
+ true
+ ..\..\Output\Release\Extensions
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
diff --git a/NTFSAlternativeStreamReader.cs b/NTFSAlternativeStreamReader.cs
new file mode 100755
index 00000000..2fa7c28e
--- /dev/null
+++ b/NTFSAlternativeStreamReader.cs
@@ -0,0 +1,74 @@
+// one line to give the program's name and an idea of what it does.
+// Copyright (C) yyyy name of author
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace ExtensibleDataStorage
+{
+ ///
+ /// Description of NTFSAlternativeStreamReader.
+ ///
+ public class NTFSAlternativeStreamReader
+ {
+ /*
+ [DllImport("ntoskrnl.exe")]
+ private static extern int NtQueryInformationFile(IntPtr handle, ref IO_STATUS_BLOCK IoStatusBlock, ref FILE_STREAM_INFORMATION[] FileInformation, ulong length, FILE_INFORMATION_CLASS FileInformationClass);
+ [DllImport("kernel32.dll")]
+ private static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
+ */
+
+ public static string[] EnumerateStreamNames(string path)
+ {
+ string[] val = new string[] { };
+ if (System.Environment.OSVersion.Platform == PlatformID.MacOSX)
+ {
+
+ }
+ else if (System.Environment.OSVersion.Platform == PlatformID.Unix)
+ {
+
+ }
+ else if (System.Environment.OSVersion.Platform == PlatformID.Xbox)
+ {
+
+ }
+ else
+ {
+ /*
+ // Open a file and obtain stream information
+ PFILE_STREAM_INFORMATION[] pStreamInfo = new FILE_STREAM_INFORMATION[] { };
+ IO_STATUS_BLOCK ioStatus;
+
+ HANDLE hFile = CreateFile(szPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, NULL);
+ NtQueryInformationFile(hFile, ref ioStatus, ref pStreamInfo, sizeof(FILE_STREAM_INFORMATION), FILE_INFORMATION_CLASS.FileStreamInformation);
+ CloseHandle(hFile);
+
+ while(true)
+ {
+ // Get null-terminated stream name
+ string szStreamName = pStreamInfo.StreamName;
+
+ if (pStreamInfo.NextEntryOffset == 0) break; // No more stream records
+ }
+ */
+ }
+ return val;
+ }
+ }
+}
diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/BlockchainEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/BlockchainEditor.cs
new file mode 100644
index 00000000..13fa0b73
--- /dev/null
+++ b/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/BlockchainEditor.cs
@@ -0,0 +1,81 @@
+//
+// MyClass.cs
+//
+// Author:
+// Michael Becker
+//
+// Copyright (c) 2020 Mike Becker's Software
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+using System;
+using MBS.Framework.UserInterface;
+using MBS.Framework.UserInterface.Controls.ListView;
+using UniversalEditor.Plugins.Blockchain.Bitcoin.ObjectModels;
+using UniversalEditor.UserInterface;
+
+namespace UniversalEditor.Plugins.Blockchain.UserInterface
+{
+ [ContainerLayout("~/Editors/Blockchain/BlockchainEditor.glade")]
+ public class BlockchainEditor : Editor
+ {
+ private ListViewControl tv;
+
+ private static EditorReference _er = null;
+ public override EditorReference MakeReference()
+ {
+ if (_er == null)
+ {
+ _er = base.MakeReference();
+ _er.SupportedObjectModels.Add(typeof(BitcoinBlockchainObjectModel));
+ }
+ return _er;
+ }
+
+ protected override void OnCreated(EventArgs e)
+ {
+ base.OnCreated(e);
+ OnObjectModelChanged(e);
+ }
+
+ protected override void OnObjectModelChanged(EventArgs e)
+ {
+ base.OnObjectModelChanged(e);
+
+ BitcoinBlockchainObjectModel bc = (ObjectModel as BitcoinBlockchainObjectModel);
+ if (bc == null) return;
+
+ if (!IsCreated) return;
+
+ for (int i = 0; i < Math.Min(6500, bc.Blocks.Count); i++)
+ {
+ tv.Model.Rows.Add(new TreeModelRow(new TreeModelRowColumn[]
+ {
+ new TreeModelRowColumn(tv.Model.Columns[0], bc.Blocks[i].Version.ToString()),
+ new TreeModelRowColumn(tv.Model.Columns[1], bc.Blocks[i].PreviousBlockHash.ToString()),
+ new TreeModelRowColumn(tv.Model.Columns[2], bc.Blocks[i].MerkelRoot.ToString()),
+ new TreeModelRowColumn(tv.Model.Columns[3], bc.Blocks[i].Timestamp.ToString())
+ }));
+ }
+ }
+
+ public override void UpdateSelections()
+ {
+ }
+
+ protected override Selection CreateSelectionInternal(object content)
+ {
+ return null;
+ }
+ }
+}
diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/Properties/AssemblyInfo.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..3eedb02b
--- /dev/null
+++ b/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/Properties/AssemblyInfo.cs
@@ -0,0 +1,46 @@
+//
+// AssemblyInfo.cs
+//
+// Author:
+// Michael Becker
+//
+// Copyright (c) 2020 Mike Becker's Software
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("UniversalEditor.Plugins.Blockchain.UserInterface")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Mike Becker's Software")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Mike Becker's Software")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface.csproj b/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface.csproj
new file mode 100644
index 00000000..9f67233d
--- /dev/null
+++ b/Plugins.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface/UniversalEditor.Plugins.Blockchain.UserInterface.csproj
@@ -0,0 +1,60 @@
+
+
+
+ Debug
+ AnyCPU
+ {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3}
+ Library
+ UniversalEditor.Plugins.Blockchain.UserInterface
+ UniversalEditor.Plugins.Blockchain.UserInterface
+ v4.7
+ 4.0.2019.12
+
+
+ true
+ full
+ false
+ ..\..\Output\Debug\Plugins
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ true
+ ..\..\Output\Release\Plugins
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+ {2D4737E6-6D95-408A-90DB-8DFF38147E85}
+ UniversalEditor.Core
+
+
+ {30467E5C-05BC-4856-AADC-13906EF4CADD}
+ UniversalEditor.Essential
+
+
+ {8622EBC4-8E20-476E-B284-33D472081F5C}
+ UniversalEditor.UserInterface
+
+
+ {00266B21-35C9-4A7F-A6BA-D54D7FDCC25C}
+ MBS.Framework
+
+
+ {29E1C1BB-3EA5-4062-B62F-85EEC703FE07}
+ MBS.Framework.UserInterface
+
+
+
+
\ No newline at end of file
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Associations/BitcoinBlockchain.uexml b/Plugins/UniversalEditor.Plugins.Blockchain/Associations/BitcoinBlockchain.uexml
new file mode 100644
index 00000000..a66ed7bc
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Associations/BitcoinBlockchain.uexml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+ F9BEB4D9
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/DataFormats/BitcoinBlockchainDataFormat.cs b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/DataFormats/BitcoinBlockchainDataFormat.cs
new file mode 100644
index 00000000..bcab7c9b
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/DataFormats/BitcoinBlockchainDataFormat.cs
@@ -0,0 +1,98 @@
+using System;
+using UniversalEditor.IO;
+using UniversalEditor.Plugins.Blockchain.Bitcoin.ObjectModels;
+
+namespace UniversalEditor.Plugins.Blockchain.Bitcoin.DataFormats
+{
+ public class BitcoinBlockchainDataFormat : DataFormat
+ {
+ private static DataFormatReference _dfr = null;
+ protected override DataFormatReference MakeReferenceInternal()
+ {
+ if (_dfr == null)
+ {
+ _dfr = base.MakeReferenceInternal();
+ _dfr.Capabilities.Add(typeof(BitcoinBlockchainObjectModel), DataFormatCapabilities.All);
+ }
+ return _dfr;
+ }
+
+ public int HashLength { get; set; } = 32;
+
+ private readonly DateTime UNIX_EPOCH = new DateTime(1970, 01, 01, 00, 00, 00);
+
+ protected override void LoadInternal(ref ObjectModel objectModel)
+ {
+ BitcoinBlockchainObjectModel blockchain = (objectModel as BitcoinBlockchainObjectModel);
+ if (blockchain == null)
+ throw new ObjectModelNotSupportedException();
+
+ Reader reader = Accessor.Reader;
+
+ while (!reader.EndOfStream)
+ {
+ uint signature = reader.ReadUInt32();
+ if (signature != 0xD9B4BEF9)
+ throw new InvalidDataFormatException("file does not begin with 0xD9B4BEF9");
+
+ BitcoinBlock block = new BitcoinBlock();
+ uint datasize = reader.ReadUInt32();
+ block.Version = reader.ReadUInt32();
+ block.PreviousBlockHash = reader.ReadBytes(HashLength);
+ block.MerkelRoot = reader.ReadBytes(HashLength);
+ uint timestamp = reader.ReadUInt32();
+ block.Timestamp = UNIX_EPOCH.AddSeconds(timestamp);
+ block.Bits = reader.ReadUInt32();
+ block.Nonce = reader.ReadUInt32();
+ ulong transactionCount = ReadCompactNumber(reader);
+ for (ulong i = 0; i < transactionCount; i++)
+ {
+ BitcoinBlockTransaction transaction = new BitcoinBlockTransaction();
+ uint transactionVersion = reader.ReadUInt32();
+ ulong inputs = ReadCompactNumber(reader);
+ for (ulong j = 0; j < inputs; j++)
+ {
+ byte[] previousOutput = reader.ReadBytes(HashLength);
+ uint previousOutput2 = reader.ReadUInt32();
+ ulong scriptLength = ReadCompactNumber(reader);
+ byte[] scriptData = reader.ReadBytes(scriptLength);
+ uint sequence = reader.ReadUInt32();
+ }
+ byte outputs = reader.ReadByte();
+ for (int j = 0; j < outputs; j++)
+ {
+ ulong output_c = reader.ReadUInt64();
+ ulong publicKeyScriptLength = ReadCompactNumber(reader);
+ transaction.PublicKeyScript = reader.ReadBytes(publicKeyScriptLength);
+ }
+ uint locktime = reader.ReadUInt32();
+ block.Transactions.Add(transaction);
+ }
+ blockchain.Blocks.Add(block);
+ }
+ }
+
+ private ulong ReadCompactNumber(Reader reader)
+ {
+ byte num = reader.ReadByte();
+ if (num == 0xFD)
+ {
+ return reader.ReadUInt16();
+ }
+ else if (num == 0xFE)
+ {
+ return reader.ReadUInt32();
+ }
+ else if (num == 0xFF)
+ {
+ return reader.ReadUInt64();
+ }
+ return num;
+ }
+
+ protected override void SaveInternal(ObjectModel objectModel)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlock.cs b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlock.cs
new file mode 100644
index 00000000..9f84b555
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlock.cs
@@ -0,0 +1,27 @@
+using System;
+namespace UniversalEditor.Plugins.Blockchain.Bitcoin.ObjectModels
+{
+ public class BitcoinBlock : Block
+ {
+ public class BitcoinBlockCollection
+ : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ public uint Version { get; internal set; }
+ public byte[] PreviousBlockHash { get; set; }
+ public byte[] MerkelRoot { get; set; }
+ public DateTime Timestamp { get; set; }
+ public uint Bits { get; set; }
+ public uint Nonce { get; set; }
+ public BitcoinBlockTransaction.BitcoinBlockTransactionCollection Transactions { get; } = new BitcoinBlockTransaction.BitcoinBlockTransactionCollection();
+
+ public override object Clone()
+ {
+ BitcoinBlock clone = new BitcoinBlock();
+ clone.Version = Version;
+ return clone;
+ }
+ }
+}
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlockTransaction.cs b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlockTransaction.cs
new file mode 100644
index 00000000..d38b1022
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlockTransaction.cs
@@ -0,0 +1,20 @@
+using System;
+namespace UniversalEditor.Plugins.Blockchain.Bitcoin.ObjectModels
+{
+ public class BitcoinBlockTransaction : BlockTransaction
+ {
+ public byte[] PublicKeyScript { get; set; }
+
+ public class BitcoinBlockTransactionCollection
+ : System.Collections.ObjectModel.Collection
+ {
+
+ }
+
+ public override object Clone()
+ {
+ BitcoinBlockTransaction clone = new BitcoinBlockTransaction();
+ return clone;
+ }
+ }
+}
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlockchainObjectModel.cs b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlockchainObjectModel.cs
new file mode 100644
index 00000000..56557640
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Bitcoin/ObjectModels/BitcoinBlockchainObjectModel.cs
@@ -0,0 +1,36 @@
+using System;
+namespace UniversalEditor.Plugins.Blockchain.Bitcoin.ObjectModels
+{
+ public class BitcoinBlockchainObjectModel : ObjectModel
+ {
+ private static ObjectModelReference _omr = null;
+ protected override ObjectModelReference MakeReferenceInternal()
+ {
+ if (_omr == null)
+ {
+ _omr = base.MakeReferenceInternal();
+ _omr.Path = new string[] { "Blockchain", "Bitcoin" };
+ }
+ return _omr;
+ }
+
+ public BitcoinBlock.BitcoinBlockCollection Blocks { get; } = new BitcoinBlock.BitcoinBlockCollection();
+
+ public override void Clear()
+ {
+ Blocks.Clear();
+ }
+
+ public override void CopyTo(ObjectModel where)
+ {
+ BitcoinBlockchainObjectModel clone = (where as BitcoinBlockchainObjectModel);
+ if (clone == null)
+ throw new ObjectModelNotSupportedException();
+
+ for (int i = 0; i < Blocks.Count;i++)
+ {
+ clone.Blocks.Add(Blocks[i].Clone() as BitcoinBlock);
+ }
+ }
+ }
+}
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Block.cs b/Plugins/UniversalEditor.Plugins.Blockchain/Block.cs
new file mode 100644
index 00000000..52b5d1a6
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Block.cs
@@ -0,0 +1,8 @@
+using System;
+namespace UniversalEditor.Plugins.Blockchain
+{
+ public abstract class Block : ICloneable
+ {
+ public abstract object Clone();
+ }
+}
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/BlockTransaction.cs b/Plugins/UniversalEditor.Plugins.Blockchain/BlockTransaction.cs
new file mode 100644
index 00000000..aa6f8f38
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/BlockTransaction.cs
@@ -0,0 +1,8 @@
+using System;
+namespace UniversalEditor.Plugins.Blockchain
+{
+ public abstract class BlockTransaction : ICloneable
+ {
+ public abstract object Clone();
+ }
+}
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/Properties/AssemblyInfo.cs b/Plugins/UniversalEditor.Plugins.Blockchain/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..197fe9ee
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/Properties/AssemblyInfo.cs
@@ -0,0 +1,26 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("UniversalEditor.Plugins.Blockchain")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Mike Becker's Software")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Mike Becker's Software")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
diff --git a/Plugins/UniversalEditor.Plugins.Blockchain/UniversalEditor.Plugins.Blockchain.csproj b/Plugins/UniversalEditor.Plugins.Blockchain/UniversalEditor.Plugins.Blockchain.csproj
new file mode 100644
index 00000000..cfb14715
--- /dev/null
+++ b/Plugins/UniversalEditor.Plugins.Blockchain/UniversalEditor.Plugins.Blockchain.csproj
@@ -0,0 +1,58 @@
+
+
+
+ Debug
+ AnyCPU
+ {C54F6BCD-60CD-4603-B0C9-CD0864455CB1}
+ Library
+ UniversalEditor.Plugins.Blockchain
+ UniversalEditor.Plugins.Blockchain
+ v4.7
+ 4.0.2019.12
+
+
+ true
+ full
+ false
+ ..\..\Output\Debug\Plugins
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ true
+ ..\..\Output\Release\Plugins
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {2D4737E6-6D95-408A-90DB-8DFF38147E85}
+ UniversalEditor.Core
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UniversalEditor.sln b/UniversalEditor.sln
index 38ca4933..ab8d8488 100644
--- a/UniversalEditor.sln
+++ b/UniversalEditor.sln
@@ -211,6 +211,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Mul
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MBS.Audio", "..\MBS.Audio\MBS.Audio\MBS.Audio.csproj", "{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Blockchain", "Plugins\UniversalEditor.Plugins.Blockchain\UniversalEditor.Plugins.Blockchain.csproj", "{C54F6BCD-60CD-4603-B0C9-CD0864455CB1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Blockchain.UserInterface", "Plugins.UserInterface\UniversalEditor.Plugins.Blockchain.UserInterface\UniversalEditor.Plugins.Blockchain.UserInterface.csproj", "{B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -607,6 +611,14 @@ Global
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A}.Debug|Any CPU.Build.0 = 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
+ {C54F6BCD-60CD-4603-B0C9-CD0864455CB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C54F6BCD-60CD-4603-B0C9-CD0864455CB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C54F6BCD-60CD-4603-B0C9-CD0864455CB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C54F6BCD-60CD-4603-B0C9-CD0864455CB1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2} = {05D15661-E684-4EC9-8FBD-C014BA433CC5}
@@ -706,6 +718,8 @@ Global
{37504ECC-D87F-4E93-8E08-89C03BAAA6D9} = {2ED32D16-6C06-4450-909A-40D32DA67FB4}
{75C99631-122C-4880-806E-646FCB021730} = {7B535D74-5496-4802-B809-89ED88274A91}
{E0897B7B-617A-4709-A4C6-FC0F6B441B2A} = {20F315E0-52AE-479F-AF43-3402482C1FC8}
+ {C54F6BCD-60CD-4603-B0C9-CD0864455CB1} = {2ED32D16-6C06-4450-909A-40D32DA67FB4}
+ {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3} = {7B535D74-5496-4802-B809-89ED88274A91}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
diff --git a/after.UniversalEditor.sln.targets b/after.UniversalEditor.sln.targets
new file mode 100644
index 00000000..2f5974ad
--- /dev/null
+++ b/after.UniversalEditor.sln.targets
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/universal-editor.svg b/universal-editor.svg
new file mode 100644
index 00000000..84dc0696
--- /dev/null
+++ b/universal-editor.svg
@@ -0,0 +1,97 @@
+
+
+
+