diff --git a/Makefile.Debug b/Makefile.Debug
index e567520071..5f76b9b83b 100644
--- a/Makefile.Debug
+++ b/Makefile.Debug
@@ -1,6 +1,6 @@
#############################################################################
# Makefile for building: gridcoinresearch
-# Generated by qmake (2.01a) (Qt 4.8.4) on: Sun Jun 5 17:50:12 2016
+# Generated by qmake (2.01a) (Qt 4.8.4) on: Mon Jun 13 20:01:48 2016
# Project: gridcoinresearch.pro
# Template: app
#############################################################################
diff --git a/Makefile.Release b/Makefile.Release
index e6deac6998..ceed85b87f 100644
--- a/Makefile.Release
+++ b/Makefile.Release
@@ -1,6 +1,6 @@
#############################################################################
# Makefile for building: gridcoinresearch
-# Generated by qmake (2.01a) (Qt 4.8.4) on: Sun Jun 5 17:50:15 2016
+# Generated by qmake (2.01a) (Qt 4.8.4) on: Mon Jun 13 20:01:49 2016
# Project: gridcoinresearch.pro
# Template: app
#############################################################################
diff --git a/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj b/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj
index 4f412dac53..4a9ff72a4e 100644
--- a/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj
+++ b/contrib/Installer/GridcoinInstaller/GridcoinResearch.vdproj
@@ -1120,19 +1120,19 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:Gridcoin Research"
- "ProductCode" = "8:{11449F35-92F0-4A25-912E-910A9C8915C8}"
- "PackageCode" = "8:{BB38A7E0-B695-4C35-BC49-6500233289A6}"
+ "ProductCode" = "8:{4C308408-9E66-4902-B378-759171FC8276}"
+ "PackageCode" = "8:{3CAB67D7-6E42-4453-975C-8762730EA179}"
"UpgradeCode" = "8:{9617E9EA-252F-43CE-B53E-B48C85F71192}"
"AspNetVersion" = "8:4.0.30319.0"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:FALSE"
"InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:40.2"
+ "ProductVersion" = "8:40.3"
"Manufacturer" = "8:GridcoinResearch"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
- "Title" = "8:Gridcoin Research 40.2"
+ "Title" = "8:Gridcoin Research 40.3"
"Subject" = "8:"
"ARPCONTACT" = "8:The Gridcoin Developers"
"Keywords" = "8:Gridcoin Research"
diff --git a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb b/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb
index 15cbeb798d..f3c2020b18 100644
--- a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb
+++ b/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/Form1.vb
@@ -133,7 +133,8 @@ Public Class Form1
'mU.UpdateMagnitudesOnly()
'mU.ShowConfig()
- mU.ShowFoundation()
+ 'mU.ShowFoundation()
+ mU.ShowDiagnostics()
Exit Sub
diff --git a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/bin/Debug/GridcoinRDTestHarness.vshost.exe.manifest b/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/bin/Debug/GridcoinRDTestHarness.vshost.exe.manifest
deleted file mode 100644
index 061c9ca950..0000000000
--- a/contrib/Installer/GridcoinRDTestHarness/GridcoinRDTestHarness/bin/Debug/GridcoinRDTestHarness.vshost.exe.manifest
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/Installer/boinc/boinc/GRCDiagnostics.vb b/contrib/Installer/boinc/boinc/GRCDiagnostics.vb
new file mode 100644
index 0000000000..48d6120c47
--- /dev/null
+++ b/contrib/Installer/boinc/boinc/GRCDiagnostics.vb
@@ -0,0 +1,50 @@
+Imports System.IO
+Imports System.Net.Sockets
+Imports System.Globalization
+
+Public Class GRCDiagnostics
+
+ Public Function GetNISTDateTime() As DateTime
+ Try
+
+ Dim sNISTHOST As String = "time-nw.nist.gov" 'Atomic Clock Time Server in UTC
+ Dim client = New TcpClient(sNISTHOST, 13)
+ Dim localDateTime As DateTime
+
+ Using streamReader = New StreamReader(client.GetStream())
+ Dim response = streamReader.ReadToEnd()
+ Dim utcDateTimeString = response.Substring(7, 17)
+ '57551 16-06-12 16:57:53 50 0 0 353.8 UTC(NIST)
+ Dim sChopped As String = Mid(response, 7, 100)
+ sChopped = Replace(sChopped, "(NIST) *", "")
+ sChopped = Trim(Left(sChopped, 18))
+ sChopped += " UTC"
+ Dim sYear As String = "20" + Mid(sChopped, 1, 2)
+ Dim sMonth As String = Mid(sChopped, 4, 2)
+ Dim sDay As String = Mid(sChopped, 7, 2)
+ Dim sHour As String = Mid(sChopped, 10, 2)
+ Dim sMinute As String = Mid(sChopped, 13, 2)
+ Dim sSecond As String = Mid(sChopped, 16, 2)
+ localDateTime = New Date(Val(sYear), Val(sMonth), Val(sDay), Val(sHour), Val(sMinute), Val(sSecond))
+ End Using
+ Return localDateTime
+ Catch ex As Exception
+ Return CDate("1-1-1970")
+ End Try
+ End Function
+ Public Function VerifyPort(lPortNumber As Long, sHost As String) As Boolean
+
+ Try
+ Dim client = New TcpClient(sHost, lPortNumber)
+ Using streamReader = New StreamReader(client.GetStream())
+ Dim response = streamReader.ReadToEnd()
+ 'Note if we made it this far without an error, the result is positive
+ Return True
+ End Using
+ Return True
+ Catch ex As Exception
+ Return False
+ End Try
+ End Function
+
+End Class
diff --git a/contrib/Installer/boinc/boinc/Utilization.vb b/contrib/Installer/boinc/boinc/Utilization.vb
index 3fb47f5321..a60305bc49 100644
--- a/contrib/Installer/boinc/boinc/Utilization.vb
+++ b/contrib/Installer/boinc/boinc/Utilization.vb
@@ -12,8 +12,6 @@ Public Class Utilization
Public _boincmagnitude As Double
Private msSentence As String = ""
Private mlSpeakMagnitude As Double
-
-
Public ReadOnly Property Version As Double
Get
Return 409
@@ -21,37 +19,26 @@ Public Class Utilization
End Property
Private lfrmMiningCounter As Long = 0
- Public ReadOnly Property BoincUtilization As Double
- Get
- 'Return Val(clsGVM.BoincUtilization)
- End Get
- End Property
-
Public Function cGetCryptoPrice(sSymbol As String) As Double
Return GetCryptoPrice(sSymbol).Price
End Function
Public Function cqGetCryptoPrice(sSymbol As String) As Quote
Return GetCryptoPrice(sSymbol)
End Function
-
-
Public Function SetQuorumData(sData As String) As String
-
Dim sQuorumData As String = ExtractXML(sData, "")
Dim sAge As String = ExtractXML(sQuorumData, "")
Dim sQuorumHash As String = ExtractXML(sQuorumData, "")
Dim TS As String = ExtractXML(sQuorumData, "")
Dim sBlock As String = ExtractXML(sQuorumData, "")
Dim sPrimaryCPID As String = ExtractXML(sQuorumData, "")
-
Log(sData)
Call UpdateSuperblockAgeAndQuorumHash(sAge, sQuorumHash, TS, sBlock, sPrimaryCPID)
-
+ Return ""
End Function
Public Sub TestGZIPBoincDownload()
Dim c As New clsBoincProjectDownload
c.DownloadGZipFiles()
-
End Sub
Public Function WriteKey(sData As String) As String
Try
@@ -82,14 +69,12 @@ Public Class Utilization
sReq = System.Text.Encoding.UTF8.GetString(b)
Return sReq
End Function
-
Public Function StringToByteArray(sData As String) As Byte()
-
Return modGRC.StringToByte(sData)
-
End Function
Public Function BoincMagnitude(value As String) As String
_boincmagnitude = Val(value)
+ Return ""
End Function
Public Function cAES512Encrypt(sData As String) As String
Return AES512EncryptData(sData)
@@ -109,14 +94,13 @@ Public Class Utilization
Public Sub StopWireFrameRenderer()
If Not mfrmWireFrame Is Nothing Then
mfrmWireFrame.EndWireFrame()
-
End If
End Sub
Public Sub TestnetSetGenericRPCValue(sData As String)
SetRPCReply(sData)
End Sub
Public Function TestnetGetGenericRPCValue() As String
-
+ Return ""
End Function
Public ReadOnly Property ClientNeedsUpgrade As Double
Get
@@ -135,7 +119,6 @@ Public Class Utilization
End If
End If
Log("Ready for upgrade")
-
If KeyValue("suppressupgrade") = "true" Then
Log("Client needs upgraded; Not upgrading due to key.")
Return 0
@@ -145,7 +128,6 @@ Public Class Utilization
Return 1
End If
Log("Client up to date")
-
Return 0
End Get
End Property
@@ -154,41 +136,25 @@ Public Class Utilization
End Function
Sub New()
-
mclsUtilization = Me
-
-
- Log("L1")
-
Try
-
-
Try
UpdateKey("UpdatingLeaderboard", "false")
-
Catch ex As Exception
Log(ex.Message)
-
End Try
-
Try
PurgeLog()
-
Catch ex As Exception
-
End Try
Log("Loading...")
-
Try
- ' If Not DatabaseExists("gridcoin_leaderboard") Then ReplicateDatabase("gridcoin_leaderboard")
Catch ex As Exception
Log("New:" + ex.Message)
End Try
-
Try
Dim sContract As String = GetMagnitudeContract()
If Len(sContract) = 0 Then bMagsDoneLoading = False
-
Catch ex As Exception
Log("contract err " + ex.Message)
End Try
@@ -196,7 +162,6 @@ Public Class Utilization
Log("While loading clsUtilization : " + ex.Message)
End Try
Log("Loaded")
-
End Sub
Sub New(bLoadMiningConsole As Boolean)
If bLoadMiningConsole Then ShowMiningConsole()
@@ -256,12 +221,11 @@ Public Class Utilization
Dim sContract As String = GetMagnitudeContract()
Return sContract
End Function
-
- Public Function ShowVotingConsole()
+ Public Function ShowVotingConsole() As Double
Dim fmVoting As New frmVoting
fmVoting.Show()
+ Return 1
End Function
-
Public Function ShowForm(sFormName As String) As String
Try
Dim vFormName() As String
@@ -287,49 +251,61 @@ Public Class Utilization
End Try
End Function
-
- Public Function ShowNewUserWizard()
+ Public Function ShowNewUserWizard() As Double
Dim fNUW As New frmNewUserWizard
fNUW.Show()
+ Return 1
End Function
- Public Function ShowConfig()
+ Public Function ShowConfig() As Double
Try
mfrmConfig = New frmConfiguration
mfrmConfig.Show()
Catch ex As Exception
Log("Error while transitioning to frmConfig" + ex.Message)
End Try
+ Return 1
End Function
- Public Function ShowFAQ()
+ Public Function ShowFAQ() As Double
Try
- mfrmFaq = New frmFAQ
- mfrmFaq.show()
+ mfrmFAQ = New frmFAQ
+ mfrmFAQ.Show()
Catch ex As Exception
Log("Error:FAQ")
End Try
+ Return 1
End Function
- Public Function ShowTicketAdd()
+ Public Function ShowTicketAdd() As Double
Try
mfrmTicketAdd = New frmTicketAdd
mfrmTicketAdd.Show()
Catch ex As Exception
Log("Error while transitioning to frmTicketAdd" + ex.Message)
End Try
+ Return 1
+ End Function
+ Public Function ShowDiagnostics() As Double
+ Try
+ mFrmDiagnostics = New frmDiagnostics
+ mFrmDiagnostics.Show()
+ Catch ex As Exception
+ Log("Error while showing Diagnostics" + ex.Message)
+ End Try
+ Return 1
End Function
Public Function muFileToBytes(SourceFile As String) As Byte()
Return FileToBytes(SourceFile)
End Function
- Public Function ShowFoundation()
+ Public Function ShowFoundation() As Double
Try
mfrmFoundation = New frmFoundation
mfrmFoundation.Show()
Catch ex As Exception
Log("Error while showing frmFoundation " + ex.Message)
End Try
+ Return 1
End Function
-
- Public Function ShowTicketList()
+ Public Function ShowTicketList() As Double
Try
mGRCData = New GRCSec.GridcoinData
mfrmLogin = New frmLogin
@@ -338,61 +314,52 @@ Public Class Utilization
Catch ex As Exception
Log("Error while transitioning to frmTicketList" + ex.Message)
End Try
+ Return 1
End Function
- Public Function ShowTicker()
+ Public Function ShowTicker() As Double
Try
mfrmTicker = New frmLiveTicker
mfrmTicker.Show()
Catch ex As Exception
Log("Error while booting ticker " + ex.Message)
End Try
+ Return 1
End Function
-
- Public Function ShowLeaderboard()
+ Public Function ShowLeaderboard() As Double
mfrmLeaderboard = New frmLeaderboard
mfrmLeaderboard.Show()
+ Return 1
End Function
-
- Public Function ShowMiningConsole()
+ Public Function ShowMiningConsole() As Double
Try
lfrmMiningCounter = lfrmMiningCounter + 1
-
If mfrmMining Is Nothing Then
mfrmMining = New frmMining
End If
-
mfrmMining.Show()
-
Catch ex As Exception
End Try
+ Return 1
End Function
-
- Public ReadOnly Property SourceBlock As String
- Get
-
- End Get
- End Property
-
Public Function TestOutdated(ByVal sdata As String, ByVal mins As Long) As Boolean
Return Outdated(sdata, mins)
End Function
Public Function TestKeyValue(ByVal sKey As String) As String
Return KeyValue(sKey)
End Function
- Public Function TestUpdateKey(ByVal sKey As String, ByVal sValue As String)
+ Public Function TestUpdateKey(ByVal sKey As String, ByVal sValue As String) As Double
Call UpdateKey(sKey, sValue)
+ Return 1
End Function
Public Sub ExecuteCode(ByVal sCode As String)
Log("Executing smart contract " + sCode)
Dim classSmartContract As New GridcoinSmartContract
classSmartContract.ExecuteContract(sCode)
-
End Sub
Public Sub SpeakSentence(sSentence As String)
msSentence = sSentence
Dim t As New Threading.Thread(AddressOf SpeakOnBackgroundThread)
t.Start()
-
End Sub
Public Sub SpeakOnBackgroundThread()
Dim S As New SpeechSynthesis
@@ -421,17 +388,16 @@ Public Class Utilization
End Function
Public Function TrackConfirm(sTXID As String) As String
-
Log("Tracking " + Trim(sTXID))
Try
Dim lOut As Double = mTrackConfirm(sTXID)
Log("Returning " + Trim(lOut))
Return Trim(lOut)
Catch ex As Exception
- Log("HEINOUS ERROR" + ex.Message)
+ Log("ERROR" + ex.Message)
Return "0"
End Try
- 'return a 0 or 1
+ 'Return a 0 or 1
End Function
Public Function InsertConfirm(sConfirm As String) As Double
Log(sConfirm)
@@ -457,11 +423,10 @@ Public Class Utilization
mlMagnitude = Val(vSession(2))
Catch ex As Exception
Log("SetSessionInfo " + ex.Message)
-
End Try
+ Return 1
End Function
Public Function ExplainMag(sCPID As String) As String
- ' Log("Neural request for " + sCPID)
If bMagsDoneLoading = False Then
Log("This node is still syncing.")
Return ""
@@ -488,7 +453,6 @@ Public Class Utilization
End Try
Return "SUCCESS"
End Function
-
Public Function SetGenericVotingData(sValue As String) As Double
Return SetGenericData("POLLS", sValue)
End Function
@@ -503,7 +467,6 @@ Public Class Utilization
Catch ex As Exception
Return 0
End Try
-
End Function
Public Function SetTestNetFlag(sData As String) As Double
Try
@@ -519,28 +482,26 @@ Public Class Utilization
End Try
Return 1
End Function
- Public Function TestMag2015()
- StoreTestMagnitude()
-
- End Function
- Public Function TestPDS()
- TestPDS1()
-
- End Function
Public Function SyncCPIDsWithDPORNodes(sData As String) As Double
'Write the Gridcoin CPIDs to the Persisted Data System
Try
msSyncData = sData
-
Call SyncDPOR2()
Catch ex As Exception
Log("Exception during SyncDpor2 : " + ex.Message)
Return -2
End Try
Log("Finished syncing DPOR cpids.")
-
Return 0
-
+ End Function
+ Public Function PushGridcoinDiagnosticData(sData As String) As Double
+ Try
+ msSyncData = sData
+ Catch ex As Exception
+ Log("Exception during PushGridcoinDiagnosticData : " + ex.Message)
+ Return -2
+ End Try
+ Return 1
End Function
Public Sub UpdateMagnitudesOnly()
EnsureNNDirExists()
@@ -549,7 +510,6 @@ Public Class Utilization
Call UpdateMagnitudes()
End Sub
Public Sub AddressUserThread()
-
Try
Log("Speaking " + Trim(mlSpeakMagnitude))
Dim s As New SpeechSynthesis
@@ -557,13 +517,11 @@ Public Class Utilization
Catch ex As Exception
Log("Unable to initialize speech")
End Try
-
End Sub
Public Function AddressUser(sMagnitude As String) As Double
Dim t As New Threading.Thread(AddressOf AddressUserThread)
mlSpeakMagnitude = Val("0" + Trim(sMagnitude))
t.Start()
-
Return 1
End Function
Public Sub SetSqlBlock(ByVal data As String)
@@ -582,34 +540,20 @@ Public Class Utilization
Public Function GetLanIP() As String
Return GetLocalLanIP1()
End Function
- Public ReadOnly Property BoincProjectCount As Double
- Get
- End Get
- End Property
Public Sub clsLogOff()
If mGRCData Is Nothing Then mGRCData = New GRCSec.GridcoinData
-
mGRCData.LogOff(GetSessionGuid)
End Sub
- Public ReadOnly Property BoincTotalHostAverageCredits As Double
- Get
- End Get
- End Property
-
Public Sub ShowEmailModule()
Dim e As New frmMail
e.Show()
e.RetrievePop3Emails()
End Sub
-
Protected Overrides Sub Finalize()
Try
-
MyBase.Finalize()
Catch ex As Exception
-
End Try
-
End Sub
End Class
diff --git a/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb b/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb
index e50fb8f878..50c7099d8f 100644
Binary files a/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb and b/contrib/Installer/boinc/boinc/bin/Debug/BoincStake.tlb differ
diff --git a/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml b/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml
index 2baee27df7..08cc22e273 100644
Binary files a/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml and b/contrib/Installer/boinc/boinc/bin/Debug/GRCSec.xml differ
diff --git a/contrib/Installer/boinc/boinc/boincstake.vbproj b/contrib/Installer/boinc/boinc/boincstake.vbproj
index 2451c66ebf..cc8a99f317 100644
--- a/contrib/Installer/boinc/boinc/boincstake.vbproj
+++ b/contrib/Installer/boinc/boinc/boincstake.vbproj
@@ -96,6 +96,12 @@
+
+ frmDiagnostics.vb
+
+
+ Form
+
frmRain.vb
@@ -246,6 +252,7 @@
Form
+
@@ -286,6 +293,9 @@
+
+ frmDiagnostics.vb
+
frmRain.vb
diff --git a/contrib/Installer/boinc/boinc/frmDiagnostics.Designer.vb b/contrib/Installer/boinc/boinc/frmDiagnostics.Designer.vb
new file mode 100644
index 0000000000..9fc99d6a86
--- /dev/null
+++ b/contrib/Installer/boinc/boinc/frmDiagnostics.Designer.vb
@@ -0,0 +1,122 @@
+ _
+Partial Class frmDiagnostics
+ Inherits System.Windows.Forms.Form
+
+ 'Form overrides dispose to clean up the component list.
+ _
+ Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+ Try
+ If disposing AndAlso components IsNot Nothing Then
+ components.Dispose()
+ End If
+ Finally
+ MyBase.Dispose(disposing)
+ End Try
+ End Sub
+
+ 'Required by the Windows Form Designer
+ Private components As System.ComponentModel.IContainer
+
+ 'NOTE: The following procedure is required by the Windows Form Designer
+ 'It can be modified using the Windows Form Designer.
+ 'Do not modify it using the code editor.
+ _
+ Private Sub InitializeComponent()
+ Dim DataGridViewCellStyle1 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
+ Dim DataGridViewCellStyle2 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
+ Dim DataGridViewCellStyle3 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
+ Dim DataGridViewCellStyle4 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
+ Dim DataGridViewCellStyle5 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
+ Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmDiagnostics))
+ Me.btnRunDiagnostics = New System.Windows.Forms.Button()
+ Me.Label3 = New System.Windows.Forms.Label()
+ Me.dvDiag = New System.Windows.Forms.DataGridView()
+ CType(Me.dvDiag, System.ComponentModel.ISupportInitialize).BeginInit()
+ Me.SuspendLayout()
+ '
+ 'btnRunDiagnostics
+ '
+ Me.btnRunDiagnostics.BackColor = System.Drawing.Color.Black
+ Me.btnRunDiagnostics.ForeColor = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer))
+ Me.btnRunDiagnostics.Location = New System.Drawing.Point(25, 417)
+ Me.btnRunDiagnostics.Name = "btnRunDiagnostics"
+ Me.btnRunDiagnostics.Size = New System.Drawing.Size(177, 29)
+ Me.btnRunDiagnostics.TabIndex = 8
+ Me.btnRunDiagnostics.Text = "Run Diagnostics"
+ Me.btnRunDiagnostics.UseVisualStyleBackColor = False
+ '
+ 'Label3
+ '
+ Me.Label3.AutoSize = True
+ Me.Label3.ForeColor = System.Drawing.Color.Lime
+ Me.Label3.Location = New System.Drawing.Point(23, 30)
+ Me.Label3.Name = "Label3"
+ Me.Label3.Size = New System.Drawing.Size(139, 13)
+ Me.Label3.TabIndex = 5
+ Me.Label3.Text = "Gridcoin Diagnostic System:"
+ '
+ 'dvDiag
+ '
+ DataGridViewCellStyle1.BackColor = System.Drawing.Color.Black
+ DataGridViewCellStyle1.ForeColor = System.Drawing.Color.Lime
+ DataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.Gray
+ DataGridViewCellStyle1.SelectionForeColor = System.Drawing.Color.FromArgb(CType(CType(128, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(128, Byte), Integer))
+ Me.dvDiag.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle1
+ Me.dvDiag.BackgroundColor = System.Drawing.Color.Black
+ DataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
+ DataGridViewCellStyle2.BackColor = System.Drawing.Color.Black
+ DataGridViewCellStyle2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+ DataGridViewCellStyle2.ForeColor = System.Drawing.Color.Lime
+ DataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight
+ DataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText
+ DataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.[True]
+ Me.dvDiag.ColumnHeadersDefaultCellStyle = DataGridViewCellStyle2
+ Me.dvDiag.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
+ DataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
+ DataGridViewCellStyle3.BackColor = System.Drawing.Color.Black
+ DataGridViewCellStyle3.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+ DataGridViewCellStyle3.ForeColor = System.Drawing.Color.Lime
+ DataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight
+ DataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText
+ DataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.[False]
+ Me.dvDiag.DefaultCellStyle = DataGridViewCellStyle3
+ Me.dvDiag.EnableHeadersVisualStyles = False
+ Me.dvDiag.GridColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(64, Byte), Integer))
+ Me.dvDiag.Location = New System.Drawing.Point(25, 46)
+ Me.dvDiag.Name = "dvDiag"
+ DataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
+ DataGridViewCellStyle4.BackColor = System.Drawing.Color.Black
+ DataGridViewCellStyle4.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
+ DataGridViewCellStyle4.ForeColor = System.Drawing.Color.Lime
+ DataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight
+ DataGridViewCellStyle4.SelectionForeColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(64, Byte), Integer), CType(CType(0, Byte), Integer))
+ DataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.[True]
+ Me.dvDiag.RowHeadersDefaultCellStyle = DataGridViewCellStyle4
+ DataGridViewCellStyle5.BackColor = System.Drawing.Color.Black
+ DataGridViewCellStyle5.ForeColor = System.Drawing.Color.Lime
+ Me.dvDiag.RowsDefaultCellStyle = DataGridViewCellStyle5
+ Me.dvDiag.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect
+ Me.dvDiag.Size = New System.Drawing.Size(882, 346)
+ Me.dvDiag.TabIndex = 65
+ '
+ 'frmDiagnostics
+ '
+ Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
+ Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+ Me.BackColor = System.Drawing.Color.Black
+ Me.ClientSize = New System.Drawing.Size(937, 666)
+ Me.Controls.Add(Me.dvDiag)
+ Me.Controls.Add(Me.btnRunDiagnostics)
+ Me.Controls.Add(Me.Label3)
+ Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
+ Me.Name = "frmDiagnostics"
+ Me.Text = "Gridcoin Diagnostic System"
+ CType(Me.dvDiag, System.ComponentModel.ISupportInitialize).EndInit()
+ Me.ResumeLayout(False)
+ Me.PerformLayout()
+
+ End Sub
+ Friend WithEvents btnRunDiagnostics As System.Windows.Forms.Button
+ Friend WithEvents Label3 As System.Windows.Forms.Label
+ Friend WithEvents dvDiag As System.Windows.Forms.DataGridView
+End Class
diff --git a/contrib/Installer/boinc/boinc/frmDiagnostics.resx b/contrib/Installer/boinc/boinc/frmDiagnostics.resx
new file mode 100644
index 0000000000..57f5335e7e
--- /dev/null
+++ b/contrib/Installer/boinc/boinc/frmDiagnostics.resx
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAIAICAAAAAAIACoEAAAJgAAAEBAAAAAABgAKDIAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAIAQ
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6vCV5ebs/+Dg5//l5Ov/5eXo/+Tk5v/i4+X/5Obq/+zv
+ 8//l6u7/3uXq/93k6v/e5uv/4eju/+Ho7//c5On/2uHm/93i5f/f4+X/5Obn/+bm5v/m5+X/6+ro/+ro
+ 5f/j4+D/4eDf/97g3v/g4uOVAAAAAAAAAAAAAAAAAAAAAOnr8JXm5+7/6+vy/+bl7P/i4uX/3t7h/+Lk
+ 5//q7PD/7O/z/+Xp7v/k6u//4ujv/9zi6P/i6e//3+Xs/9vh5//g5er/5Ojs/+fq7P/n6uv/6evr/+nq
+ 6f/m5uT/5eXi/+Li4P/h4uL/4uPj/+Xn6JUAAAAAAAAAAAAAAAAAAAAA6+7zlenr8f/r6/L/4+Tq/97d
+ 4f/f4OP/5ujr/+3v8v/U2Nv/5erv/+ft8f/n7PL/w8jM/87T2P/e5Or/4efs/+Tq7//n6+//6e3v/+rt
+ 7f/r7u7/6uzs/+fo6P/l5ub/5ebm/+bo6P/l6On/6OrtlQAAAAAAAAAAAAAAAAAAAADn7PCV5eju/+Dh
+ 6P/g4Of/4eLl/+jq7f/v8fT/8fP2/7O3uv/O09f/7/T4/+zw9v/P09n/qq6x/+Dm6f/n7PD/6e7y/+vw
+ 8//q7vD/7O/w/+rt7v/p6+v/6evr/+Xn6P/o6+z/7fDx/+3w8v/s8PKVAAAAAAAAAAAAAAAAAAAAAOPo
+ 7ZXi5uz/4OLp/+Dh5//l5+r/6u3v/+/y9f/r7vD/x8vO/7m9wf/t8PX/5efu/9zf5v+eoqX/3uLk/+ru
+ 8f/u8fX/7fL0/+3w8//t8fP/7e/y/+zv8P/s7/D/7PDy/+zw8v/r7vH/6+/x/+fs7pUAAAAAAAAAAAAA
+ AAAAAAAA4efsleDk6v/f4uj/4+br/+rt8P/r7/H/6u3w/+Dj5//Y297/rK+z/+Ll6//h4un/4+Tr/62w
+ s//U19n/8PP2//Dz9f/t8fP/7O/x/+3x8//u8vT/7vHz/+vv8f/t8fX/6/Dz/+js7//o7PD/5+vulQAA
+ AAAAAAAAAAAAAAAAAADg5eqV4OXq/+Xo7v/s7vT/6/Dy/+fs7v/i5+n/4eXo/+Tn7P+kp6r/0NPY/9LT
+ 2f/Jyc//q62w/6+ytP/Y293/4uXo/+zv8f/u8/X/7fL1/+7y9f/s8PT/6Ozw/+fs8f/r8fb/6e7z/+fs
+ 8f/k6e6VAAAAAAAAAAAAAAAAAAAAAN7l6pXl6u//6+70/+vt8//n7O//5Onr/+Dl5//j5+r/1tnd/5ib
+ nv+foaX/o6Sq/5+fpf+XmJv/hYiJ/5mbnf+anZ7/ra+w/8vP0P/f5Of/6u7y/+3x9f/q7vL/5uzx/+3z
+ +f/q8fb/6e7z/+fs8ZUAAAAAAAAAAAAAAAAAAAAA4efslenv9P/o7PL/4+js/+Hq7P/h6ez/4efr/87R
+ 1v+ur7X/o6Wr/6CiqP/X2+X/5On0/+br8f+ipqj/2Nzg/8XJzP+ipKf/gIKE/5aYmv/Hysz/6ezv/+ns
+ 8P/p7vL/7vP3/+7z9//u8/f/7vP3lQAAAAAAAAAAAAAAAAAAAADq7/OV5uvw/+Hm6//f5er/2+Xo/+Ts
+ 7//P1dn/vsHH/87Q2f/U1d//mp6i/9jd5f/f5u//5Onv/7W5vP/Lz9P/5+vw/+To7f/U19z/o6ao/4OF
+ h/+srrH/297i/+ru8v/v9Pf/8PX4/+/z9v/v8/aVAAAAAAAAAAAAAAAAAAAAAO/z9pXk6e3/4ufr/+Hn
+ 7P/i6u3/2N/i/8PIzf/O0tn/yszU/87P1v+nqq7/0dXb/+Xr8v/s8PX/19rd/7O2uf/n6u7/4eXq/93i
+ 5//k6O3/zdHV/6msr//X297/6e7x//D0+P/x9vn/8PT3//D095UAAAAAAAAAAAAAAAAAAAAA6+7xlefr
+ 7v/n6+//5Oru/+Pp7P/N09b/09ne/8DEyf/Dxcr/5ebt/77Bxv/Hy9H/7PH4/+7y+P/n6u7/q6+x/+zw
+ 9P/u8vX/5+zv/+bs8f+3vMD/u77A/+jt8P/v8/b/8vb5//D0+P/u8vX/7fL1lQAAAAAAAAAAAAAAAAAA
+ AADo6uyV6e3w/+bq7v/p7fD/3eDj/9LW2v/N0NX/rbCz/97h5f/u8Pb/0tbb/7a6v//u8/n/6e3x/8zO
+ 0v+WmZv/wsbJ/8fLzv/KztH/4Obr/6issP+7vsH/7fL1/+/z9v/w9Pf/7/T3//D09//x9fmVAAAAAAAA
+ AAAAAAAAAAAAAObp7JXo6+3/6Ovt/+zu8f/d3eD/2Njd/7S2uf+5u73/6Ovv/+7z9v/o7PH/pquu/+7z
+ +P/o7vL/vsTH/4eLjf+MkZP/l52f/6uxtP/l7fH/qrCz/7S5u//q8PP/7fL1//D1+P/v9Pf/7/P2/+7y
+ 9pUAAAAAAAAAAAAAAAAAAAAA5Ofnlert7v/s7/L/6Ort/9/d3//a2Nv/mZma/8rNz//s8fT/7fP2//D1
+ +f+xtbj/3+Po/+Tq7v/l7vL/0drd/620tv/l7vP/5e7y/+fw9P+3vsH/qq+x/9/k6P/t8fX/8fX4//D0
+ 9//v8/b/7/T3lQAAAAAAAAAAAAAAAAAAAADq7O2V6+7v/+jr7P/l5uj/3trb/9jT1v+NjI3/x8vM/+zx
+ 9P/t8/b/7vX3/83R1P++wcX/5evv/+Hp7f/k7O//oaep/9/n6v/k7PD/5e3x/+Hp7f/g5+r/6e/x//D0
+ +P/y9vr/8fb5//H1+f/y9vmVAAAAAAAAAAAAAAAAAAAAAO7x8ZXr7u7/5Obn/+Xl5v/g2dv/2tTW/5OS
+ kv+2ubv/6e/x/+zz9v/s8/X/3+Pm/6yvsv/p7/L/6fDz/+ry9f+zubv/0dja/+ry9P/s8/b/6/L1/+72
+ +f/w+Pr/8/f6//P3+//x9fn/8PX4//L2+ZUAAAAAAAAAAAAAAAAAAAAA7vHwlent7P/j5uf/5ubn/+Dc
+ 3f/a1tj/r66w/5GSk//d4eP/5+7w/+Pr7f/k6uz/qK2v/+Pp6//q8PP/6vDz/8nO0P/Axcf/6/Hz/+Xq
+ 7f/p7/L/7vX4//L3+//z9/r/8vf5//D0+P/u8vb/7fL1lQAAAAAAAAAAAAAAAAAAAADv8/GV5+rp/9/j
+ 4f/i5OP/4+Pk/97e4v/S1Nj/gYOE/66ys//b4+T/3+nq/+Pt7/+ss7T/1tvd/+vt8f/v8fX/3d/i/6+z
+ tf/a3eL/tbi8/9LW2v/t8fj/8fX6//P2+f/z9/r/8fX4/+vw8//n7fCVAAAAAAAAAAAAAAAAAAAAAOnr
+ 65Xk5+b/4OPh/+Hi4v/k5ej/5ebq/+fq7v+3u73/fYCC/6etrv/P2Nn/2uTm/77HyP+9wsT/8PP2/+zv
+ 8//i5ej/mZ2f/8nN0v+cn6P/o6eq/+fr8f/t8fX/8fT4//L1+P/t8fT/6O3w/+nt8JUAAAAAAAAAAAAA
+ AAAAAAAA5OTkleTk5P/k5eT/5eXl/+nq6//r7O//5+ns/+bt7//Dycv/g4mK/4eMjf+gpqj/s7q7/5KX
+ mf/Cxsj/s7e5/7G1uP+fpKf/x8/T/8nR1f+UmZr/193f/+zx9f/v8vX/7vH0/+/y9v/q7fH/4ubplQAA
+ AAAAAAAAAAAAAAAAAADi4uKV5uXm/+bm5v/p6er/6+3v/+3w8v/s7/L/5uvt/+Xs7//c5ej/vcbI/6ew
+ sf+dpab/iI2P/6Oqrf+5wsT/1d7h/83W2v+psLL/1d3f/8nP0f/b4eP/6u/x/+zu8v/q7PD/6+7y/+fq
+ 7v/e4eaVAAAAAAAAAAAAAAAAAAAAAOLh4pXo5+n/6err/+3u8P/s7vH/8PP2/+/y9f/s8PL/5+3v/+Hp
+ 6//g6u3/4Ovt/9zo6v+xur3/usTI/9rl6f/b5en/0dnc/5+lpv/c4uT/4ujp/93j4//i5+j/6Ort/+Xn
+ 6//k5ur/4ePo/+Dj5pUAAAAAAAAAAAAAAAAAAAAA5OPllerr7v/s7vH/7e/y/+7y8//u8vT/7PHz/+3x
+ 9P/t8vX/6vHz/+rx8//r8fP/5+/x/8rR0/+xt7v/3uXp/+Lp7P/k6uv/q6+x/9re3//i5+b/297e/97g
+ 4P/g4eT/3d7i/9/h5f/f4eX/4ePnlQAAAAAAAAAAAAAAAAAAAADm6OuV7fDz/+/y9v/t8fT/7PHz/+zx
+ 8//t8vT/7vP1/+3z9f/s8fT/7/X4//D3+f/r8fP/4Obq/6Wqrf/i6e3/6e7x/+zx8v+8v8D/w8bG/9/g
+ 4P/d3tz/4ODf/+Dh5P/e3uP/4OLm/9/h5f/h4+aVAAAAAAAAAAAAAAAAAAAAAOnu8JXr8PP/7vP3/+zy
+ 9f/n7e//7vT2/+/2+P/u9ff/8fb4/+/09v/v9Pb/7/X3/+7z9f/r7/T/pqqt/9zg5P/v8vX/7/Hz/9XW
+ 2P+sra3/397c/9/d2v/i4N//4eHk/+Dg5f/j5Oj/4uPn/+Pl6JUAAAAAAAAAAAAAAAAAAAAA7fL0lenx
+ 8//q8/f/6PH0/+vy9f/w9vj/8ff5//D2+P/x9/n/8PX3/+7z9f/u8/X/7vP1/+vv8//Cxsr/wcTH//Hz
+ 9v/t7vD/5eXl/9DOzf/h3dr/3trW/+Pg3f/i4eP/4eHl/+Tl6f/i5Of/4uXnlQAAAAAAAAAAAAAAAAAA
+ AADp7vCV6O7x/+jw8//r8vX/8PX4//D2+P/x9vj/7/X4/+709//r8PX/6vD1/+rw9P/n7fH/6e7z/+Hj
+ 6f/P0tX/7e/z/+fp6//i4eL/4+Hf/+Pf3P/i3tr/5ePg/+Pl5v/j5un/5Ojq/+Xo6v/d4uSVAAAAAAAA
+ AAAAAAAAAAAAAOPo6ZXo7vD/5+3x/+/1+P/w9Pf/8vb3//H1+P/s8fb/6u/0/+ju8//m7fP/5Orw/+Tq
+ 8P/p7/X/6+70/+nr7//p7O//5ujp/+Hh4f/i4N//5OHf/+jk4P/o5uT/5Ofo/+Lo6v/k6ev/5urs/+Xq
+ 7JUAAAAAAAAAAAAAAAAAAAAA3eLklezx8//k6u7/6vD0//D09v/w9Pb/7vL1/+ru8v/n7PD/5uzw/+bs
+ 8f/i6e7/5evx/+ft8//n7PL/5Onu/+Xp7f/j5un/3+Hh/+Lj4v/n5+b/6unm/+bl4//m6er/5ers/+br
+ 7f/i5+n/6/DylQAAAAAAAAAAAAAAAAAAAADi5+mV6u/y/+Dn6v/o7vH/8vb4/+/z9f/t8fP/7PDy/+vw
+ 8//q8fT/5+zx/+Lp7v/j6e//5Orw/+fu8//k6u//4efq/93i5P/g5OX/5+rq/+ns6//m5+b/4uTj/+To
+ 6f/k6ev/5Onr/+Hm6P/p7vCVAAAAAAAAAAAAAAAAAAAAAOnu8JXr8PP/5Ovt/+rw8v/y9Pb/8vX1//D0
+ 9f/v8vT/7/P1/+3x9P/h5ur/4ufs/+Xr8P/k6/D/5e7y/+Hp7f/h6Ov/4ujq/+Xq7P/p7+//5erp/+Dk
+ 4//k6ej/4+jp/+Hm6P/h5uj/5Onr/+vw8pUAAAAAAAAAAMAAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
+ AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
+ AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADKAAAAEAAAACAAAAAAQAYAAAA
+ AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMrJ
+ y8nIysnIysbIycPFxsDCw7W2t7W2t6epqqepqp2cnp2cnpeYmZeYmZeTlZeTlZKTlJCUk5CSko+Sk4+S
+ k5OSlJKRkpGSk4+RkpCPkYyLjIeKi4KDhIKDhH9/gH9/gHV1eXV1eXV1eXd3eHd3eHh5enx8fX5/gH+C
+ goeFhoeHioqKjYiJjIeIi4eIi4aHh4KDg35+gH5+gH1/gH1/gHt8fXt8fX17fX17fXt7fX16fX16fX98
+ f3x8gH9+goKBhMrJy8nIysjHycbFx8PCxL2/wK+xsq+xsp+hop+hopqZmpqZmpaTlZaTlZOTlJOTlJGQ
+ kY+RkYyNjYqLjIqLjIyLjYuKi4mLi4iKioiHiYOEhX6BgXh3eHh3eG9wcG9wcGhoamhoamhoamhoaWho
+ aWxtbW9wcXJzdHd2eHx+foCDgoSGhYSFhYaFiIaFiIKBgn19fnh3eXh3eXZ2enZ2enZ3dXZ3dXV3d3V3
+ d3l3eHh4enh4end4e3Z4ent7fX9+f8rJy8nIysjHycTGx77Awbi3uZKZoJKZoK3D2K3D2Ieqzoeqzoyw
+ 1Iyw1HGVuXGVuXCVum2RuYKmzmqPuWqPuZC134+03n6izGmPuWuQvT1kkBI5ZXOaxnOaxkpxnUpxnTpi
+ jjpijjpijhI6ZxI6ZzZeizxjkRc4aS9Of2+Pv2uMuXGTwHqdx57C6p7C6oWpz3OYvZK13ZK13X6gyn6g
+ ynmYwnmYwoSgyYSgyXSSt3WStHWStHKJonKAjnx9goJ/gcrJy8nIysXHyMHDxLu9vrKzt0tig0tig5q3
+ 3Jq33I6ow46ow5SsxJSsxIymvoymvmuBmnWLpXmPqV50jl50jnWMp3mQqnaLpXOJol51jzVNZjNKY2uC
+ m2uCm09ngU9ngVlyjVlyjVlyjURceURceUtlg0pkgzRKbSE2V1VsjlxzlG6HpnSOrYWhvoWhvoSgvXOP
+ rJCszJCszHiUt3iUt3uWunuWuoefw4efw4Ccv4amyoamynOUtGOBoICFjISFhsvKzMnIysXExsC/wq+5
+ x5y74nCCmnCCmpaVlpaVlpaUlZaUlZKUlJKUlI+RlI+RlIKFh3p7fXV0dV1dX11dX1ZVVk5PU0lOVEZM
+ VE1UXU5aZU9db1dpf1dpfzpMYTpMYUJQYkJQYkJQYjpBSjpBSjo+QzY2OTg4ODs7O0A/P0dGSFNbZVxl
+ b11lbV1lbWFocWlzfHqDjnqDjnR8iHR8iHmEjXmEjXt+gXt+gX9/f4Slx4Slx5W64IGQo4OEh4iKisvK
+ zMnIysXExsC/wq+5x5y74nCCmnCCmpaVlpaVlpaUlZaUlZKUlJKUlI+RlI+RlIKFh3p7fXV0dV1dX11d
+ X1ZVVk5PU0lOVEZMVE1UXU5aZU9db1dpf1dpfzpMYTpMYUJQYkJQYkJQYjpBSjpBSjo+QzY2OTg4ODs7
+ O0A/P0dGSFNbZVxlb11lbV1lbWFocWlzfHqDjnqDjnR8iHR8iHmEjXmEjXt+gXt+gX9/f4Slx4Slx5W6
+ 4IGQo4OEh4iKisrJy8nIysbFx7u8wpm015++5JucnpucnpSWlpSWlpSRk5SRk4yWnoyWnoiZq4iZq15v
+ gGVwfWt0fFtgZVtgZVBXYEFPXTlOZDdRa1Zwi0piekBWbD1PYj1PYjJBUjJBUi49TS49TS49TUBUa0BU
+ a0NTZTtETzc8Qjc3OTg4OUZLUmyNtnebxWJ/nmJ/nlp2l3KVu6LE7aLE7Xmbw3mbw4OkzIOkzHyJlnyJ
+ loOIjVt/pFt/pIyjuoSEhoWGiYqLjMrJy8nIysXExqa0xI6w1p20z5qbnJqbnJKTk5KTk36HlH6HlISm
+ y4Smy22XxG2XxCBJckpwll9+nF1ugF1ugEtngjdTbipCWSA1SSk6TCs7TDFBUj9UaD9UaEFXbEFXbCEu
+ OyEuOyEuOxwmMRwmMSw6STpQZzhKYDxFUDw/Q01aaHygyX6m04er1Yer1Vt6nGyEn4efu4efu2uDm2uD
+ m4ar1Iar1IyftIyftIGYsHuQp3uQp4eIi4SGi4uJi4+OkMrJy8nIysPDx4OlyZCszq+usJqZmpqZmnGK
+ pHGKpDtehjtehmp7i2p7i4iKj4iKj4KWqI+55HOYukFVZ0FVZ09nfVx7lmOColl9oFB4oVV/qVJ8pmeR
+ vGeRvIKs14Ks132m0X2m0X2m0WqOtGqOtC9HXx4sOhgfKBUdJj5QZVJhc0NGS0BBQVhmdlhmdnWbxV5z
+ i1FSUlFSUniLn3iLn4umw4umw5GYoZGYoYyju46Umo6Umn+gwHSInY6Oj5KRk8nIysjHybfAy4Wo0KGx
+ w7KwsJOapJOapHWUt3WUt4KBgoKBgoODg4ODg3yFkHyFkHKTtmqLrG2RtI+23I+23JG43Y+224yz2IKp
+ 0HefyXiizXehzG6Yw26Yw3CaxXCaxW+ax2+ax2+ax2uWwmuWwkl0oEt1oG6QuEZbchkgKREXHTRFWVJi
+ dEVGR0VGR4Sp03mWtn6Xs36Xs2l7kGl7kH+Ag3+Ag5OfrpOfrp2gnm6Rs26Rs1Fxk4GNmY2PjpGTlMnI
+ ysjHybW/y32hyaOwwLOysoeasIeasH2QpX2QpXx9fXx9fX18fn18foKev4Kev26LrHeXuYCkyYqv1Yqv
+ 1Ymv0o+12Iux1HifxW+XwW6Yw3ehzYSw24Sw23GcyXGcyYS05YS05YS05W6f0G6f0EJyo0FxoliDtm+U
+ wFFogyErNxMaIjxNYUtSWktSWnufxnKQs42qzo2qzllaXFlaXHp7e3p7e42esI2esJ+dnlyBqFyBqH+D
+ jY2Mj46Oj5STlszJy8jHycLFzIux26e4z7a2tn2fyH2fyIWFh4WFh3Z0dXZ0dXeLpXeLpYqozIqozH2f
+ x4Sn0JG13YSpz4Spz42y2I+02oaq0H2jymqTvnCcyoaz4ajc/6jc/32s3H2s3HOgz3Ogz3Ogz2eWxmeW
+ xnen2GaZzEN0rDttplWIw7Lm/3yiyTxOZCs3RCs3RE1kfWeBnj48PT48PUpLS0pLS2pra2pra4aZr4aZ
+ r5aUlEJplUJplYqLjomGioyLjpCRlMrJy8fGyMbFyIir0Zq01Li4uYCizYCizYeGh4eGh3FwcXFwcXSV
+ v3SVv4amzIamzGSIsHueyoGlzn+kyn+kyoar0YGly3qew3+lzHafyXKfzI245ZbB4pbB4pC97JC97Flt
+ hFlthFlthHaNpnaNpnGNrGiMrU9znkRrmkx4roe57aze/3ugyCYwPCYwPDdHWkxYZDo6Ojo6OkNDREND
+ RF5eX15eX4+jvY+jvYyOjjJZhjJZho2KjYqIiYmLi5CQlMnIysnIysfGyKWxwG2Ru4+kvG+OtG+OtIyL
+ jIyLjGd8kmd8kqfN9KfN9H2k0X2k0XSbyHidy4Kp1nOZwHOZwGOEp2iKr2uOtXWXu36Zsm95gnN1d3WH
+ mnWHmmOQvWOQvXOJn3OJn3OJn3GDk3GDk2ZmZ2VlZmVobGVueF96m0Z2r9z7+7rv/zhJXThJXQ8UGh0n
+ MUVOVkVOVjc3Nzc3N0tKSktKSmuFomuFooF9f0VsmUVsmYWEh4WChYqHio6NjMnIysnIysfGyKWxwG2R
+ u4+kvG+OtG+OtIyLjIyLjGd8kmd8kqfN9KfN9H2k0X2k0XSbyHidy4Kp1nOZwHOZwGOEp2iKr2uOtXWX
+ u36Zsm95gnN1d3WHmnWHmmOQvWOQvXOJn3OJn3OJn3GDk3GDk2ZmZ2VlZmVobGVueF96m0Z2r9z7+7rv
+ /zhJXThJXQ8UGh0nMUVOVkVOVjc3Nzc3N0tKSktKSmuFomuFooF9f0VsmUVsmYWEh4WChYqHio6NjMnI
+ ysnIysfGyKWxwG2Ru4+kvG+OtG+OtIyLjIyLjGd8kmd8kqfN9KfN9H2k0X2k0XSbyHidy4Kp1nOZwHOZ
+ wGOEp2iKr2uOtXWXu36Zsm95gnN1d3WHmnWHmmOQvWOQvXOJn3OJn3OJn3GDk3GDk2ZmZ2VlZmVobGVu
+ eF96m0Z2r9z7+7rv/zhJXThJXQ8UGh0nMUVOVkVOVjc3Nzc3N0tKSktKSmuFomuFooF9f0VsmUVsmYWE
+ h4WChYqHio6NjMnIysfGyMPCxL++wLi3uaOxwIat2oat2nyCinyCimONwmONwk96sU96sUhxpEhxpD1m
+ l053plN1mkxpi0xpi0RihU1QV1dXWWVkZm5xdWSFpzRbg2lpbGlpbHiMn3iMn2x8jWx8jWx8jYapy4ap
+ y3il01FylUFZdml4iW9xcm5ubXOXv7Pi/4Gq2YGq2WyRulVwjRIYHxIYH0NNWkNNWjo4Ojo4Ol17nl17
+ nmxubnWcyXWcyYB8f39/goKFhomKjcfHx8XFxcHBwbu7u7Ozs6mmqIWr2IWr2GyUwGyUwHyexnyexl6F
+ sl6FsnafzHafzGeRvmODpik6S1BmfFBmfEVFRVRTVGRjZnR7hXeav2uMr3J4gV1jbF1jbKvT+avT+XWZ
+ v3WZv3WZv36MmX6MmY+87XOaxktjgGFugnh4eXV1dVd7pVqJwH6p2n6p2nGax3mjziMxPyMxPzZOZTZO
+ ZTIyMjIyMmF/qGF/qGJjZJzC7JzC7Hl3d3p9fIOChIqHi8nHx8XFxb/Awri4ua+vr6Wjo4Kn04Kn05O/
+ 8ZO/8ZvD75vD72+WwG+WwIOt2IOt2HKbx01riS8/UFVmdlVmdlZdZF1ka2t2f4Kiv3WavmB5lF1yiTtZ
+ dztZd5e53Ze53YWmyoWmyoWmyn9+gH9+gJbC8Yat2F53lldvkHx+f3l6elR4oU9+tYKu3oKu3nehzneh
+ zjdPZzdPZys6Sys6SzIyMjIyMlV0nlV0nl9fYIWs04Ws03h1d3p7fH+AgIuHiMnHx8bExKuzv6Wps66t
+ raCgoIKkzIKkzJnG+ZnG+avW/6vW/2+XwW+XwXehzHehzGeOt0FdeENZb32ixX2ixYCct3WQqXiZuJC9
+ 44mz3nWVuF97mV18nV18nXWElXWElYGSpIGSpIGSpISCg4SCg5fE9Zi633CEnlt5oH1/hn18fGqNtliH
+ vnOfz3Ofz3KcyXOdykBef0Befx0oMx0oMzExMjExMmWErmWErl1eXH+mzn+mznZ1dnx8fYCAgIqGh8nH
+ x8bExIOYtV95m6yrq56enouqz4uqz5XD9pXD9qrV/6rV/2SMtmSMtmWPumWPull7oC1CVjdNY2mAlmmA
+ lnKHnHaLn3SKno+74ZXE84ehvIGUqXygxnygxnNzdXNzdXt+gXt+gXt+gYWEhYWEhZG97JmyzIWRo2aH
+ sXuElH98fWaIslKBuFuHt1uHt2OMuXKcyUJmjEJmjBEaIxEaIzEzNzEzN3CQunCQulxdXIGn0YGn0XR1
+ dXx6fIJ/gIuHiMjGxsXDw36TrSxOe5eco5ucn4upzIupzJ7M/p7M/qHM/KHM/GmRu2mRu2WPumWPuld2
+ lx8tPCM4TDw8PDw8PEdHSFZWV2dnZ3yZspbD74KQn4CUqHaWtnaWtnZ2d3Z2d3p7e3p7e3p7e4KDhYKD
+ hYy245GeromRnmCGsXqKnYCAgFyBqVGBtz9qmz9qm094pW6XxFN7pVN7pQ8XIA8XIDU9RTU9RWaHsmaH
+ sltbXHacxnacxnF0dH56fYOAgYWFhsfHx8TExHeLpzJXh22NsoCfxYSkyYSkyYCt4ICt4I+66o+66nSc
+ xnScxmGLtmGLtklkgR4pNj9YcTc3Nzc3N0BAQExLTFhZWneLnY255oes1n6dwHx5enx5enaNqnaNqnl5
+ fHl5fHl5fIKOoIKOoH6VrIiHh4qXpWiSv3eEl4GDg2eLtYW27X+r23+r20BplmiRvnuk0Xuk0R4oNR4o
+ NUFQX0FQX3ebxXebxVlZW091oE91oHR0dHl5eYGAgIaGhsjGxsXDw3+TrHSYxqGqtaWjo3ugzHugzJbD
+ 9ZbD9bLd/7Ld/3mhy3mhy3iizXiizTtTbBchKjtTazEzNDEzNEZQWXSSrpG11Yiju11kal5eXmpscHqd
+ w3qdw3mMo3mMo4CMmYCMmYCMmYekxYekxYWEh4OFjVV8plh8oIiIiYiHiYGmz3Kk2mGMvWGMvTlij0hx
+ noOr2IOr2DFAUDFAUEtZbEtZbHyhyXyhyVxdXktwnEtwnHd3d318fIGAgIuKisjGxsbExJ2wyGSItpae
+ qqWjo4mu2omu2nyp23yp26jT/6jT/3qizHqizHqkz3qkzzxUbRohKjpOY0BLV0BLV3OVtX2hwnSMok9S
+ VVBPUF5gZnGDmnCPtXCPtXZ2d3Z2d4ekyoekyoekyoKLloKLloKCgnGCmUFrmG2FnIeHiImKi32jzXap
+ 31R/sFR/sFR9qkdwnXGYxXGYxTZDUzZDU0lXaUlXaYSr0YSr0V5fX2SJtWSJtXl4eIF9fYKAgoqJi8jG
+ xsbExJ2wyGSItpaeqqWjo4mu2omu2nyp23yp26jT/6jT/3qizHqizHqkz3qkzzxUbRohKjpOY0BLV0BL
+ V3OVtX2hwnSMok9SVVBPUF5gZnGDmnCPtXCPtXZ2d3Z2d4ekyoekyoekyoKLloKLloKCgnGCmUFrmG2F
+ nIeHiImKi32jzXap31R/sFR/sFR9qkdwnXGYxXGYxTZDUzZDU0lXaUlXaYSr0YSr0V5fX2SJtWSJtXl4
+ eIF9fYKAgoqJi8jGxsbExLHD2H+j0Z2msaSiokZsmUZsmYy67Yy67Z7J957J93aeyHaeyHCaxXCaxWKC
+ pSs6SBwoND9Waz9Wa19yhTo5Oj09PU9UW3OLpoKl0Iqq0n6Xtn6XtoWcuoWcun6Pp36Pp36Pp4KBgYKB
+ gW6Dnktxmll2lH9/gIGCg4uJinSaw2KVy1+MvF+MvHuk0XGaxzdeizdeiyw4SCw4SEdTYkdTYoCmzICm
+ zGRhYnGVw3GVw3p7fH5/gISCg4yIi8jGxsbExLHD2H+j0Z2msaSiokZsmUZsmYy67Yy67Z7J957J93ae
+ yHaeyHCaxXCaxWKCpSs6SBwoND9Waz9Wa19yhTo5Oj09PU9UW3OLpoKl0Iqq0n6Xtn6XtoWcuoWcun6P
+ p36Pp36Pp4KBgYKBgW6Dnktxmll2lH9/gIGCg4uJinSaw2KVy1+MvF+MvHuk0XGaxzdeizdeiyw4SCw4
+ SEdTYkdTYoCmzICmzGRhYnGVw3GVw3p7fH5/gISCg4yIi8fFxcbExKq6zn+j0ZihraSiooit2oit2pjH
+ 9ZjH9Xml1Xml1U51n051n095pE95pGSOuV+Dp0tukT5ZcD5ZcFh0jU5calxxhHqbuniUtlxodFRTU1pZ
+ WlpZWoyv2oyv2nd0dXd0dXd0dXN4hHN4hFt9pk9kfG1pbHFscnZ0dnp6e57F3qXb/3Kfz3Kfz3aey2mS
+ vkdum0dumxgiLxgiL0lSXUlSXXufxHufxGVjZmOHtWOHtXx7fYF/gISCg4uLi8jGxsXDw6y6zYis2Jyl
+ sKOiooWp0YWp0afV+KfV+JK97pK97m2SvG2SvHafynafynSawDtXdDpeg2CHrWCHrVBxkEBWbEJWaGaB
+ nWhye1ZWVlVVVV5jbF5jbIKlzoKlzm1sbG1sbG1sbGqEpGqEpE5qi1teYmBfYGRjZWloaW5ub4et06jb
+ /4i14Yi14Yat2HadyF6Cr16CrxAZJRAZJUVLVEVLVHqexHqexGZlZmiNumiNun97f4OAhYWEhY2Mj8jG
+ xsXDw6+7zHeaxJ2msaWjo4qkw4qkw4u35ou35pO98JO98G2Qu22Qu32izH2izGSBoDdIWTdWdYy67Iy6
+ 7FqItT9efkBUaEtgdV1gY11cXFtaW2eIqWeIqWiAmmiAmmNmamNmamNmal+Fr1+Fr1FZYlRUVFZVVVhX
+ WFtaW19eX5Cy06rZ/5bA6JbA6IKpz46023OWwXOWwRMbJxMbJz9ESj9ESnmdxnmdxmtoaHadynadyn5+
+ gIKBgoWEhYyJjsjGxsbExK+8ym+Sup6nsZqjrpCXoZCXoaTQ/KTQ/I+47I+47GqNuGqNuHueyXueyVtz
+ jiIrNTJBUnOgz3Ogz5fB23ur3XGdy2mJqlhzjl9qd1d1kk9ogU9ogVJRU1JRU3CaxXCaxXCaxVR5o1R5
+ oz9BRT8+Pz8+Pj8+Pz8/P0dGSaHF46TQ+53F6p3F6pK33Zi9432fyn2fyh4lMB4lMDQ1NjQ1Noms1Yms
+ 1WxsbIqx3oqx3oOBgoiFh4uHiJGNjsjGxsjGxrK9ynKXwJWktoOfvZiWl5iWl6zY/6zY/6fQ/6fQ/36h
+ zH6hzG2Qu22Qu156mS07STxNYFVwjFVwjFJcZXOUtn2u4H6p1F15lkJYcDxVbGdqbWdqbVVVV1VVV2uM
+ tGuMtGuMtEdokEdokEFNX0JGTTg5PDU1Njo8Pk9ca5K645e/6Je94Ze94ZC125e84nyeyXyeyRUdKBUd
+ KDc3ODc3OGWIsGWIsG5ubYeu24eu24aFhYiGiIuIio+NjsnHx8jGxrW+ynyjzYCfwqCtvJuZmZuZmaTP
+ +6TP+6XN/aXN/Yqt2Iqt2ICjzoCjzk5ngiYxPjxSazk4ODk4OEVERFZZXoOfvrHk/6HS/KDP/2+TvDpO
+ ZDpOZD9QZD9QZDE9TDE9TDE9TEhVa0hVaztKXjM+Tj5OYT1OYzdKXkRac2WBn3ucv5a835a834qv1Z3C
+ 6Iiq1Iiq1B0lLx0lLz8/Pz8/P1d5n1d5n3d3eGSLuGSLuIuHiI6Ki4uLi5CQkMnHx8jGxrW+ynyjzYCf
+ wqCtvJuZmZuZmaTP+6TP+6XN/aXN/Yqt2Iqt2ICjzoCjzk5ngiYxPjxSazk4ODk4OEVERFZZXoOfvrHk
+ /6HS/KDP/2+TvDpOZDpOZD9QZD9QZDE9TDE9TDE9TEhVa0hVaztKXjM+Tj5OYT1OYzdKXkRac2WBn3uc
+ v5a835a834qv1Z3C6Iiq1Iiq1B0lLx0lLz8/Pz8/P1d5n1d5n3d3eGSLuGSLuIuHiI6Ki4uLi5CQkMrI
+ yMnHx7i9xoyqzK6zvK2rq4OZsIOZsK3a/q3a/r/q/7/q/42w242w236hzH6hzE9lfRoiK0hfd0RJUERJ
+ UGR8lXaex2yOs2R1hnyAg4ypypvJ+Y+134+131BnhVBnhSc1Sic1Sic1SllqhFlqhHaOskxigkNad0Ja
+ d0xlgmF/onCUuXOXvXOZvHOZvHugxoSpz5a34Ja34Co1RCo1REtMTEtMTGWEqGWEqIWChTtijztij4uK
+ jYyMjI+LjZOOk8rIyMnHx7i9xoyqzK6zvK2rq4OZsIOZsK3a/q3a/r/q/7/q/42w242w236hzH6hzE9l
+ fRoiK0hfd0RJUERJUGR8lXaex2yOs2R1hnyAg4ypypvJ+Y+134+131BnhVBnhSc1Sic1Sic1SllqhFlq
+ hHaOskxigkNad0Jad0xlgmF/onCUuXOXvXOZvHOZvHugxoSpz5a34Ja34Co1RCo1REtMTEtMTGWEqGWE
+ qIWChTtijztij4uKjYyMjI+LjZOOk8jGxsjGxsDAwbG3wLa0tKWprnSXvHSXvKrV7KrV7MDt/8Dt/4yv
+ 2oyv2oir1oir1lBnfxsiKjpNYmN8l2N8l36kzXeXt2Zxfnh4eIODg4aIjI+w27Pg/7Pg/4+46I+46FRt
+ klRtklRtkoScwYScwaG96Xybx2iKtFZ5o2eLs4Cjy3qfxXWawHqgw3qgw3ugxoqv1XSTunSTukNTaENT
+ aFVUVVVUVWyLrmyLroiIhyJJdiJJdpCOj5GOkJGPkZOTk8jGxsbExMG/v6q1woao0IWiwYuJiYuJiX2U
+ rn2UrpK77ZK77X2gy32gy4Om0YOm0W2KqUhccmB7l0FBQ0FBQ0lJSVlYWGZmZnV5f36Ur3Waxn6fxYOE
+ iYOEiYy69Iy69K/Q+K/Q+K/Q+H2cyX2cyU9vnZy964er1nueyoes1JG234Sq0YOp0ICozICozHyhyX6i
+ xldujFdujHWJo3WJo2dlZmdlZneSs3eSs46Ki0RrmERrmJKQkJKPk5OSlJiZl8jGxsbExLG8yIap0Iql
+ waSiooiMlIiMlJC755C756HP/6HP/5vB7JvB7JK14JK14DZGVzRCUk9hdzw8Ozw8O0VFRVZdZWuHpX6j
+ y3WSsnyDjoF+f3aGmnaGmnuRq3uRq9X3/9X3/9X3/7HT+7HT+3+j0pS78XSe0n6o3J7J+KnV+JnG85/M
+ +ajW/KjW/LXi/5G54ldth1dth3FwcHFwcG9ub29ub22HpW2HpYmFh0RrmERrmJGPj5STlJaVl5mZmcjG
+ xsfFxau/14ir1Jmnt6Sjo4CcuYCcuZOy0ZOy0aLR/6LR/7Ha/7Ha/57B7J7B7DFATzA+TVBhcTw8PTw8
+ PUxTXWJ/nm2RtnCIoXd3fHt4eH59gWuQumuQum18jm18jvD8//D8//D8/6bM96bM936hy4205omv4X6l
+ 1YSr14Oq1X2kzZO64qnP6qnP6rLX7KDL92R3jmR3jnZzdHZzdHNwb3Nwb36Ws36Ws4aFh0hvnEhvnI+M
+ kJCQkJaSk5yZncjGxsjGxrXL55a65Kuwt5+jqnSVuXSVuXl6fHl6fJrH+prH+rji/7ji/6PH7qPH7jJB
+ TygzP1VpfElQWklQWmWEomGComl5i2hnaHFwcHZ4fXCDm05znk5znnN6gXN6gbDg97Dg97Dg97DZ/7DZ
+ /2iAoH6Xt3uTsW+EoGyBmWt+lW5+kXqKnH6MnH6MnImWpJS02GqGp2qGp3R3fXR3fXV0dHV0dIScuISc
+ uIeChENqlkNqlpKNkZSQkpeVl56am8nHx8jGxrHD253A7LG2vH+WsoOVqoOVqnx7e3x7e5XB8JXB8Lfh
+ /bfh/ZzA5pzA5jVCURwkK0dabmuJqGuJqG2MqVplcFpaW2ZjZHByemR5llZ/slBvlVBvlX+Ej3+Ej3ed
+ zHedzHedzJ7K/p7K/lVmfWRqcmJhY15cXVpaW1taWl1cXGJhYW1sbm1sbnZzd3eKooupzYupzXKGoXKG
+ oXh2dnh2doWZs4WZs4iDhUBnk0Bnk5KOj5WRkpqXl5yamsnHx8jGxqy4yKTI8q28zm+OsJSVmJSVmH9+
+ fn9+fqbR/6bR/5zI+JzI+Ja74pa74kJVaBYdIiczPnGQr3GQr1RcZVBOT1lZWWZqcWuDokZuoUtunm57
+ i257i4OZuIOZuHWAj3WAj3WAj5K/9pK/9kxmhV1zjGVpcWJhYV5fYFxcXFtbW1xbXGJhYmJhYmpoaXWD
+ mIGcu4Gcu32hy32hy3x6fXx6fXqPpnqPpouIiFuCrluCrpOPkZWRk5qWl56cnMnHx8jGxsbExZez16rT
+ 9anM7p6dnZ6dnXaLpHaLpJXE8pXE8qDW/6DW/5nL/JnL/HOUtj5OYTlLXk1LTU1LTU5NTVheZ2iDo2SI
+ sUlojltmdHNycn57fH57fIKgx4Kgx3p8gHp8gHp8gHeGlneGlnKXxlNpgjE+TlhpfGdqcWRjZF1bXFdU
+ VVFRUlFRUl5mbnKQtGZpbmZpbnuJmHuJmHeMpneMpoSXrISXrJeTlGiPu2iPu5WTlJaUlpaXmp2coMnH
+ x8jGxsfFxcTCwq2utHiVuW+PtW+PtY6Xo46Xo4iHh4iHh3uEkHuEkJbO/pbO/oKw4S5BWC4+UGRvfmRv
+ fmyVxXul1GqOuVd5nytMc22Ms5e123uXvXuXvXSSuXSSuWqGrGqGrGqGrHOOtXOOtYus3aDC5oOl0ZG3
+ 23OTtEhddzREVlJogXmXuHmXuIKiyGyKsIemzYemzWF9nmF9noqKjIqKjJCgsZCgsaOeoGuQt2uQt5qW
+ lpqWmJ2anKKen8nHx8jGxsfFxcTCwq2utHiVuW+PtW+PtY6Xo46Xo4iHh4iHh3uEkHuEkJbO/pbO/oKw
+ 4S5BWC4+UGRvfmRvfmyVxXul1GqOuVd5nytMc22Ms5e123uXvXuXvXSSuXSSuWqGrGqGrGqGrHOOtXOO
+ tYus3aDC5oOl0ZG323OTtEhddzREVlJogXmXuHmXuIKiyGyKsIemzYemzWF9nmF9noqKjIqKjJCgsZCg
+ saOeoGuQt2uQt5qWlpqWmJ2anKKen8nHx8jGxsfFxcTCwq2utHiVuW+PtW+PtY6Xo46Xo4iHh4iHh3uE
+ kHuEkJbO/pbO/oKw4S5BWC4+UGRvfmRvfmyVxXul1GqOuVd5nytMc22Ms5e123uXvXuXvXSSuXSSuWqG
+ rGqGrGqGrHOOtXOOtYus3aDC5oOl0ZG323OTtEhddzREVlJogXmXuHmXuIKiyGyKsIemzYemzWF9nmF9
+ noqKjIqKjJCgsZCgsaOeoGuQt2uQt5qWlpqWmJ2anKKen8nHx8jGxsbExMG/v7Kzt1Nxlpejspejso+N
+ jY+NjYmNkomNknegynegylVzk1Vzk1OKyzFjnx06XVtjcVtjcWlpbWhnZ2NiYl5dXVlYWFZTVFNRUUxM
+ TExMTEtKSktKSklHSElHSElHSElIR0lIR0hHSEhIR0lKSm9/lLDa/ZS97UVcdS46SDk8QTk8QTIxMTMz
+ M0JBQUJBQVtaWVtaWXZ3dnZ3doeSoIeSoJyamniXuHiXuJSTlZeSlpWTlJmXmcnHx8jGxsXDw8C+vpGf
+ si1QfJiXl5iXl4uJiYuJiYifuIifuG+Nq2+Nq3h4eXh4eWGOxHWp5lV/szlQbzlQb1VgcWFnbWVobV5h
+ ZFdZWlhXWVVVWEtOUUtOUUJFSkJFSkA/QkA/QkA/Qj4+QD4+QD4/QEBBQ0FER0ZKUJ3C74ar1kJZcxMY
+ HkdXaUdXaTY6QDAvLzk5OTk5OUxNTExNTGhoaGhoaIKQnIKQnJOTk4GduoGdupKQkZSRkpeTlJSUlMrI
+ yMjGxsTDw6qzwHiax4CNoJORkZORkaa80aa80ZrC6ZrC6VZ6n1Z6n3F9inF9inV1dXyHlY2z43mi1nmi
+ 1lVwmzJGZCEvRRMhNhUkN0xbbU9ecT5LXj5LXi04SS04SS45TS45TS45TTdCWDdCWEFMYUFNYUNRZT9P
+ YVtyjHeVuGOEqDpPZg8UGQ8UGS06SE1gdjEyMzEyMz08PD08PFFRU1FRU3J7hHJ7hISCgnmPpnmPpoqI
+ iYiIiIuIiIyMjMnHx8fFxcTDw5KoxIakzqanqoWIjYWIjZGz35Gz34iXpoiXpnWdxXWdxWeIq2eIq3l6
+ gXd0dXmBjKDM/KDM/KHL/3OXxj9WexgnPhQgLjQ/TD5JWDpHWDpHWDQ/UTQ/USQsPCQsPCQsPCozQioz
+ QjE4SDE6SjhEVDxMX111kX2bv3aZwGKBpR4mMR4mMQ8TGSs1QjxFTTxFTTo6Ojo6OktKSktKSmVudWVu
+ dXt9f3iKnXiKnYWFiIWFhYWFhYWHiMnHx8fFxcHBw3CRvpWita2rq1d5qVd5qXd/ind/ioB+foB+fpGw
+ z5Gwz4CGjoCGjoWkzISbvn+Fj3x/hHx/hJev0qLK94y4/12KzT1nnXqfyanJ74WjyoWjyo2q042q04CY
+ xoCYxoCYxniPvXiPvYGXx4egzYKgyXqbwoKjyous04KkzH2fyHaWvHaWvFpxjys2RB8oNB8oNE5TW05T
+ W09MTk9MTmFmbGFmbHJ+iXN/j3N/j1yAo4CEioGBgYSAg8nHx8fFxcDAxGSFtn6TsouTn4+mwY+mwYqI
+ iIqIiIOEhoOEhn6bwn6bwoGEi4GEi359foKPo3iTuH6Ln36Ln3+DiICAgYebt2eMwkhytF6Mzbbf/5S0
+ 35S035e25Je25ICgy4Cgy4Cgy3eYw3eYw4OjzoSkzXmZwnmZwnmXwIGgyZGv2JCu15az3Jaz3JOx2oyp
+ 0Ss2Qys2Qyw5Riw5Rl9hZF9hZGtucmtucnyQpoGHjoGHjmGJsVuEq3+FjoSCg8nHx8fFxcbFxmSEtE1r
+ lFdofaWrsqWrspCPj5CPj4mVpImVpHCMsnCMsoWFhoWFhoOAgYOAgoGLm3ybw3ybw4OVr3+Fj3+Ahm+D
+ nV2CukRvtYu39sTp/8Tp/46w4I6w4Iuv24uv24uv23ecyXecyXqeyYGm0YWo03+izHqaxYOkz5275qG/
+ 56C+6aC+6Zm345/A6WWBoGWBoCEqNSEqNV1tfF1tfHVxc3Vxc4irzoKDgoKDgnaSrHGYvYGKmIWChMrI
+ yMjGxsfFxXeQuUhxpixHaK2rrK2rrJSYn5SYn4yt14yt122Kr22Kr4eOmYeOmYmOmoKJlIGJlH+gyX+g
+ yXmVum6JqnWGn3aAjG99kklspmGP08Dl9cDl9afP/6fP/6fQ/qfQ/qfQ/ou26Yu26Yaw5Y+57ZrE9ZG7
+ 64Ws3Y+156/T/7fb/67Q/q7Q/qnM/bjd/5S865S861JqhFJqhFd0kFd0kHt6ent6eo+x1YKJjoKJjoOI
+ kHqRqoSDioiEhcrIyMjGxsfFxXeQuUhxpixHaK2rrK2rrJSYn5SYn4yt14yt122Kr22Kr4eOmYeOmYmO
+ moKJlIGJlH+gyX+gyXmVum6JqnWGn3aAjG99kklspmGP08Dl9cDl9afP/6fP/6fQ/qfQ/qfQ/ou26Yu2
+ 6Yaw5Y+57ZrE9ZG764Ws3Y+156/T/7fb/67Q/q7Q/qnM/bjd/5S865S861JqhFJqhFd0kFd0kHt6ent6
+ eo+x1YKJjoKJjoOIkHqRqoSDioiEhcnHx8nHx8jGxsPCxWSBqnyi0ZqrwJqrwKmts6mts6SxwqSxwpGl
+ upGluoebs4ebs5Clvn6QqnySqYygvIygvIudtn6QpoWRpIeQnpqXl5uXmIqPnVFwo1Fwo2WEsmWEsqLC
+ 5qLC5qLC5py75Jy75I6s14GgyIyq0ZCs0o2q0JOt1KW84Ka/35+22p+22puw1qi+3Jaw0Zaw0aG+1qG+
+ 1o+kvo+kvpKNj5KNj5GPkICkzYCkzYukvY6Ok5GNjpSQksrIyMnHx8rIyMnHx7q+xrfU8GyNtmyNtqmr
+ s6mrs62tr62tr6mpqampqaelpaelpaalpaakpKaipKikpqikpqGjpKGio6WjpKSjo6Wjo6elpKWmpJ+e
+ pJ+epJeanpeanpuen5uen5uen5ycoJycoJ+eoJ+cnp+bnZycnJybnqGcnp+bnp2bnJuXmZuXmZyYnJuX
+ nJ2bnJ2bnJeYmZeYmZqXmZqXmZeanJeanJucnX6fw36fw3acxIuYqZuYnJuZm8nHx8rIyMrIyMrIyMjG
+ xsjGxqixwaixwaLA5aLA5V2Bp12Bp22Rt22Rt22SuG2SuG6RuW2SuHOXvn2iyH2iyHqfxnCVvHyhx3yf
+ yIGizoGhz4Cg0G6PvW6PvXiZyHiZyEFikUFikUFikUdmlUdmlWOFspKz34yt1pCy2Yqp0YKiyoWkzIKi
+ yneWv3eWv36cxoGhyneawXeawXKZwHKZwIWs04Ws04amzoamzoCjypi955i953yhx4qlwrGrra+trcnH
+ x8nHx8nHx8rIyMnHx8rIyMjDxMjDxLvCzbvCzZ6yx56yx5SovZSovYCVrICVrIuftHyOpZGjuZSmvJSm
+ vJeqwZuuxZmtw5uuxZ+xyaK0zaGyy5OlvpOlvpanwJanwISXr4SXr4SXr3qJpXqJpXWFoIiZsqW4z6i7
+ 0qm60qq706S1zKCwyaCvyqCvyp6vyJSnvpOmvpOmvpOpwZOpwZ6zyZ6zyaa30Ka30KW1zZ+yy5+yy56w
+ xbCvtbeys7eytP///////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
+
+
\ No newline at end of file
diff --git a/contrib/Installer/boinc/boinc/frmDiagnostics.vb b/contrib/Installer/boinc/boinc/frmDiagnostics.vb
new file mode 100644
index 0000000000..eb27180491
--- /dev/null
+++ b/contrib/Installer/boinc/boinc/frmDiagnostics.vb
@@ -0,0 +1,149 @@
+Imports System.Windows.Forms
+Imports System.Data.SqlClient
+
+Public Class frmDiagnostics
+ Private msDiagnosticCPID As String = ""
+ Private Sub frmDiagnostics_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
+ 'Prepopulate the Diagnostic Test Name
+ Dim sDiagName As String = "Verify Boinc Path,Find CPID,Verify CPID Is Valid,Verify CPID has RAC,Verify CPID is in Neural Network,Verify Wallet Is Synced,Verify Clock,Verify Addnode,Verify TCP 32749"
+ Dim vDiagName As String() = Split(sDiagName, ",")
+ dvDiag.Rows.Clear()
+ dvDiag.Columns.Clear()
+ dvDiag.Columns.Add("Diagnostic Name", "Diagnostic Name")
+ dvDiag.Columns.Add("Diagnostic Result", "Diagnostic Result")
+ dvDiag.Columns(0).Width = 175
+ dvDiag.Columns(1).Width = 500
+ For x As Integer = 0 To UBound(vDiagName)
+ dvDiag.Rows.Add()
+ dvDiag.Rows(x).Cells(0).Value = vDiagName(x)
+ Next
+ End Sub
+ Private Sub btnRunDiagnostics_Click(sender As System.Object, e As System.EventArgs) Handles btnRunDiagnostics.Click
+ Cursor.Current = Cursors.WaitCursor
+ For x As Integer = 0 To dvDiag.Rows.Count - 1
+ Dim sDiagnosticName As String = dvDiag.Rows(x).Cells(0).Value
+ GuiDoEvents()
+ System.Threading.Thread.Sleep(1000)
+ dvDiag.Refresh()
+ Select Case sDiagnosticName
+ Case "Verify Boinc Path"
+ VerifyBoincPath(x)
+ Case "Find CPID"
+ FindCPID(x)
+ Case "Verify CPID Is Valid"
+ VerifyCPIDIsValid(x)
+ Case "Verify CPID has RAC"
+ VerifyCPIDHasRac(x)
+ Case "Verify CPID is in Neural Network"
+ VerifyCPIDIsInNeuralNetwork(x)
+ Case "Verify Wallet Is Synced"
+ VerifyWalletIsSynced(x)
+ Case "Verify Clock"
+ VerifyClock(x)
+ Case "Verify Addnode"
+ VerifyAddNode(x)
+ Case "Verify TCP 32749"
+ VerifyTCP32749(x)
+ End Select
+ Next
+ Dim lErrorCount As Long = 0
+ For x = 0 To dvDiag.Rows.Count - 2
+ If Not dvDiag.Rows(x).Cells(1).Value Like "*PASSED*" And x <> 1 Then
+ dvDiag.Rows(x).Cells(1).Style.BackColor = Drawing.Color.Red
+ lErrorCount += 1
+ End If
+ Next
+ dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(0).Value = "Result"
+ dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(1).Value = IIf(lErrorCount = 0, "PASSED", "FAILED")
+ If dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(1).Value = "FAILED" Then dvDiag.Rows(dvDiag.Rows.Count - 1).Cells(1).Style.BackColor = Drawing.Color.Red
+
+ Cursor.Current = Cursors.Default
+
+ End Sub
+ Private Sub VerifyCPIDIsInNeuralNetwork(iRow As Integer)
+ 'Check the wallet to see if they ever sent the beacon
+ Dim sBeacons As String = ExtractXML(msSyncData, "")
+ If sBeacons.ToLower().Contains(LCase(msDiagnosticCPID)) Then
+ dvDiag.Rows(iRow).Cells(1).Value = "PASSED"
+ Else
+ dvDiag.Rows(iRow).Cells(1).Value = "FAILED (execute advertisebeacon force)"
+ End If
+ If Len(sBeacons) < 100 Then
+ dvDiag.Rows(iRow).Cells(1).Value = "BEACON DATA EMPTY, SYNC WALLET"
+ End If
+ End Sub
+ Private Sub VerifyWalletIsSynced(iRow As Integer)
+ Dim sWalletAge As String = ExtractXML(msSyncData, "")
+ Dim lWalletAge As Long = Val("0" + sWalletAge)
+ If lWalletAge > (60 * 60) Then
+ dvDiag.Rows(iRow).Cells(1).Value = "FAILED"
+ Else
+ dvDiag.Rows(iRow).Cells(1).Value = "PASSED"
+ End If
+ If Len(sWalletAge) = 0 Then
+ dvDiag.Rows(iRow).Cells(1).Value = "SYNC DATA EMPTY"
+ End If
+ End Sub
+ Private Sub VerifyCPIDHasRac(iRow As Integer)
+ Dim sCPID As String = dvDiag.Rows(iRow - 2).Cells(1).Value
+ Dim sError As String = ""
+ Dim dTotalRac As Double = GetTotalCPIDRAC(sCPID, sError)
+ If dTotalRac > 1 Then sError = "PASSED (" + Trim(dTotalRac) + ")" Else sError = "FAILED"
+ dvDiag.Rows(iRow).Cells(1).Value = sError
+ End Sub
+ Private Sub VerifyAddNode(iRow As Integer)
+ Dim sNarr As String = GetAddNodeNarrative(iRow)
+ dvDiag.Rows(iRow).Cells(1).Value = sNarr
+ End Sub
+ Private Function GetAddNodeNarrative(iRow As Integer) As String
+ Dim lPeerSize As Long = GetPeersSize()
+ Dim sAddNode As String = KeyValue("addnode")
+ If Len(sAddNode) = 0 And lPeerSize > 100 Then Return "PASSED (ADDNODE DOES NOT EXIST BUT PEERS ARE SYNCED)"
+ If Len(sAddNode) > 4 And lPeerSize = 0 Then Return "PASSED (ADDNODE EXISTS BUT PEERS NOT SYNCED)"
+ If lPeerSize > 100 Then Return "PASSED"
+ If lPeerSize = 0 And sAddNode = "" Then Return "FAILED (Please addnode=node.gridcoin.us in config file)"
+ Return "FAILED"
+ End Function
+ Private Sub VerifyCPIDIsValid(iRow As Integer)
+ Dim sCPID As String = dvDiag.Rows(iRow - 1).Cells(1).Value
+ Dim sError As String = ""
+ Dim dTotalRac As Double = GetTotalCPIDRAC(sCPID, sError)
+ If sError = "" Then sError = "PASSED"
+ dvDiag.Rows(iRow).Cells(1).Value = sError
+ End Sub
+ Private Sub VerifyBoincPath(iRow As Integer)
+ Dim dSz As Double = GetClientStateSize()
+ If dSz > 1000 Then
+ dvDiag.Rows(iRow).Cells(1).Value = "PASSED"
+ Else
+ dvDiag.Rows(iRow).Cells(1).Value = "Boinc Data dir not found. Please set the 'datadir=' key to the boinc data path."
+ End If
+ End Sub
+ Private Sub FindCPID(iRow As Integer)
+ 'First calculate the CPID
+ Dim sCPID = ComputeLocalCPID()
+ dvDiag.Rows(iRow).Cells(1).Value = sCPID
+ msDiagnosticCPID = sCPID
+ End Sub
+ Private Sub VerifyClock(iRow As Integer)
+ Dim d As New GRCDiagnostics
+ Dim dtNIST As DateTime = d.GetNISTDateTime()
+ Dim dtNowUTC As DateTime = DateTime.UtcNow
+ Dim minDiff As Integer = DateDiff(DateInterval.Minute, dtNIST, dtNowUTC)
+ Dim sResult As String
+ If minDiff < 3 Then
+ sResult = "PASSED"
+ Else
+ sResult = "Clock Off By " + Trim(minDiff) + " Minute(s). Please update your system time."
+ End If
+ dvDiag.Rows(iRow).Cells(1).Value = sResult
+
+ End Sub
+ Private Sub VerifyTCP32749(iRow As Integer)
+ Dim d As New GRCDiagnostics
+ Dim bResult As Boolean = d.VerifyPort(32749, "node.gridcoin.us")
+ Dim sResult As String = IIf(bResult = True, "PASSED", "FAILED")
+ If sResult = "FAILED" Then sResult = "Outbound connection to 32749 failed. Please try unblocking outbound traffic to 32749."
+ dvDiag.Rows(iRow).Cells(1).Value = sResult
+ End Sub
+End Class
diff --git a/contrib/Installer/boinc/boinc/frmMining.Designer.vb b/contrib/Installer/boinc/boinc/frmMining.Designer.vb
index 40d53c46ed..64cc6c7423 100644
--- a/contrib/Installer/boinc/boinc/frmMining.Designer.vb
+++ b/contrib/Installer/boinc/boinc/frmMining.Designer.vb
@@ -87,7 +87,6 @@ Partial Class frmMining
Me.btnSync = New System.Windows.Forms.Button()
Me.lblQueue = New System.Windows.Forms.Label()
Me.lblNeuralDetail = New System.Windows.Forms.Label()
- Me.Button1 = New System.Windows.Forms.Button()
CType(Me.Chart1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.chtCurCont, System.ComponentModel.ISupportInitialize).BeginInit()
Me.MenuStrip1.SuspendLayout()
@@ -695,15 +694,6 @@ Partial Class frmMining
Me.lblNeuralDetail.TabIndex = 76
Me.lblNeuralDetail.Text = " "
'
- 'Button1
- '
- Me.Button1.Location = New System.Drawing.Point(1023, 7)
- Me.Button1.Name = "Button1"
- Me.Button1.Size = New System.Drawing.Size(12, 13)
- Me.Button1.TabIndex = 77
- Me.Button1.Text = "Button1"
- Me.Button1.UseVisualStyleBackColor = True
- '
'frmMining
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
@@ -712,7 +702,6 @@ Partial Class frmMining
Me.BackgroundImage = Global.BoincStake.My.Resources.Resources.GradientU
Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch
Me.ClientSize = New System.Drawing.Size(1071, 793)
- Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.lblNeuralDetail)
Me.Controls.Add(Me.lblQueue)
Me.Controls.Add(Me.btnSync)
@@ -809,5 +798,4 @@ Partial Class frmMining
Friend WithEvents lblQueue As System.Windows.Forms.Label
Friend WithEvents lblNeuralDetail As System.Windows.Forms.Label
Friend WithEvents WebBrowserBoinc As System.Windows.Forms.WebBrowser
- Friend WithEvents Button1 As System.Windows.Forms.Button
End Class
diff --git a/contrib/Installer/boinc/boinc/frmMining.vb b/contrib/Installer/boinc/boinc/frmMining.vb
index fa45e5a87b..c58a82b557 100644
--- a/contrib/Installer/boinc/boinc/frmMining.vb
+++ b/contrib/Installer/boinc/boinc/frmMining.vb
@@ -811,7 +811,7 @@ Refresh:
Return GetWindowsFileAge(GetGridFolder() + "NeuralNetwork\contract.dat")
End Function
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
+ Private Sub Button1_Click(sender As System.Object, e As System.EventArgs)
'Export Contract
Dim sFullPath As String = GetGridFolder() + "NeuralNetwork\contract.dat"
Dim swContract As New StreamWriter(sFullPath)
diff --git a/contrib/Installer/boinc/boinc/modGRC.vb b/contrib/Installer/boinc/boinc/modGRC.vb
index 44030abdd3..44becd4d75 100644
--- a/contrib/Installer/boinc/boinc/modGRC.vb
+++ b/contrib/Installer/boinc/boinc/modGRC.vb
@@ -33,6 +33,7 @@ Module modGRC
Public mfrmTicketAdd As frmTicketAdd
Public mfrmFoundation As frmFoundation
+ Public mFrmDiagnostics As frmDiagnostics
Public mfrmTicketList As frmTicketList
Public mfrmLogin As frmLogin
@@ -344,7 +345,6 @@ Module modGRC
End Try
End Function
-
Public Function AttachProject(sURL As String, sEmail As String, sPass As String, sUserName As String) As String
Dim sResult As String = ""
Dim BJ As New BatchJob
@@ -364,9 +364,7 @@ Module modGRC
sKey = BJ.Value
End If
End If
-
'Attach project to boinc
-
BJ = BoincAttachProject(sURL, sKey)
If BJ.Status = True Then
sResult += "Attached project " + sURL + " to boinc successfully." + vbCrLf
@@ -374,7 +372,6 @@ Module modGRC
sResult += "Failed to attach project : " + BJ.OutputError + vbCrLf
'Dont fail here; maybe already attached
End If
-
'Get the Gridcoin team ID
Dim sTeam As String
sTeam = BoincRetrieveTeamID(sURL)
@@ -387,11 +384,111 @@ Module modGRC
Else
sResult += "Failed to add user to Team Gridcoin." + vbCrLf
End If
-
Return sResult
+ End Function
+ Public Function GetClientStateSize() As Double
+ Dim sPath As String = ""
+ Try
+ sPath = GetBoincClientStatePath()
+ Dim fiBoinc As New FileInfo(sPath)
+ Return fiBoinc.Length
+ Catch ex As Exception
+ Log("Path " + sPath + " does not exist.")
+ Return 0
+ End Try
+ End Function
+ Public Function GetBoincClientStatePath()
+ Dim sDataDir As String = GetBoincDataDir() + "client_state.xml"
+ Return sDataDir
+ End Function
+ Public Function GetPeersSize() As Double
+ Dim sPath As String = GetGridPath("") + "peers.dat"
+ If Not File.Exists(sPath) Then Return 0
+ Dim fiSz As New FileInfo(sPath)
+ Return fiSz.Length
+ End Function
+ Public Function GetBoincDataDir() As String
+ Dim sDir1 As String = "c:\programdata\BOINC\"
+ If System.IO.Directory.Exists(sDir1) Then Return sDir1
+ sDir1 = KeyValue("boincdatadir")
+ If System.IO.Directory.Exists(sDir1) Then Return sDir1
+ Return ""
+ End Function
+ Public Function ComputeLocalCPID() As String
+ Dim sBPK As String = GetBoincPublicKey()
+ Dim sCPID As String = ""
+ Dim sLocalEmail As String = KeyValue("email")
+ If sLocalEmail = "" Then Return "EMAIL_EMPTY"
+ If sBPK = "" Then Return "PUB_KEY_EMPTY"
+ sCPID = GetMd5String(LCase(sBPK) + LCase(sLocalEmail))
+ Return sCPID
+ End Function
+ Public Function GetTotalCPIDRAC(sCPID As String, ByRef sError As String) As Double
+ Dim sTable As String = ""
+ Dim sLocalError As String = ""
+ Dim dProjByteLen As Double = 0
+ Dim dTotalRac As Double = GetUserRac(sCPID, sLocalError, sTable, dProjByteLen)
+ sError += sLocalError
+ If dTotalRac = 0 And dProjByteLen > 200 Then
+ sError += "No projects on team Gridcoin."
+ End If
+ If dTotalRac = 0 And sLocalError = "" And dProjByteLen < 250 Then
+ sError += "Invalid CPID"
+ End If
+ Return dTotalRac
+ End Function
+
+ Public Function GetUserRac(sCPID As String, ByRef errors As String, ByRef sTable As String, ByRef dProjectByteLength As Double) As Double
+ Dim RACURL As String = "http://cpid.gridcoin.us:5000/"
+ Dim sURL As String = RACURL + "get_user.php?cpid=" + sCPID
+ Dim w As New MyWebClient
+ Dim sRAC As String
+ sRAC = w.DownloadString(sURL)
+ Dim vRAC() As String
+ vRAC = Split(sRAC, "")
+ dProjectByteLength = Len(sRAC)
+ Dim x As Integer = 0
+ Dim rac As Double
+ errors = ""
+ Dim totalrac As Double
+ Dim team As String
+ Dim team_out As String = ""
+ Dim projname As String = ""
+ sTable = "Project | RAC | TEAM |
"
+ For x = 0 To UBound(vRAC)
+ rac = ExtractXML(vRAC(x), "", "")
+ team = ExtractXML(vRAC(x), "", "")
+ projname = ExtractXML(vRAC(x), "", "")
+ If Trim(LCase(team)) = "gridcoin" Then
+ totalrac = totalrac + rac
+ team_out = "gridcoin"
+ sTable += "" + projname + " | " + Trim(rac) + " | " + Trim(team_out) + " |
"
+ End If
+ Next
+ sTable += "
"
+ If team_out <> "gridcoin" Then
+ errors = errors + "CPID not part of team gridcoin. "
+ End If
+ If totalrac < 100 Then
+ errors = errors + "Total RAC for Team Gridcoin below 100."
+ End If
+ Return totalrac
End Function
+ Public Function GetBoincPublicKey() As String
+ Dim sStatePath As String = GetBoincClientStatePath()
+ Dim fiIn As New StreamReader(sStatePath)
+ While fiIn.EndOfStream = False
+ Dim sTemp As String = fiIn.ReadLine
+ Dim sPK As String = ExtractXML(sTemp, "")
+ If Len(sPK) > 0 Then
+ fiIn.Close()
+ Return sPK
+ End If
+ End While
+ Return ""
+ End Function
Public Function GetBoincAppDir() As String
Dim sDir1 As String = "c:\program files\BOINC\"
If System.IO.Directory.Exists(sDir1) Then Return sDir1
diff --git a/src/clientversion.h b/src/clientversion.h
index 7aafd9c14a..789542408b 100644
--- a/src/clientversion.h
+++ b/src/clientversion.h
@@ -9,7 +9,7 @@
#define CLIENT_VERSION_MAJOR 3
#define CLIENT_VERSION_MINOR 5
#define CLIENT_VERSION_REVISION 6
-#define CLIENT_VERSION_BUILD 5
+#define CLIENT_VERSION_BUILD 7
// Converts the parameter X to a string after macro replacement on X has been performed.
// Don't merge these into one macro!
diff --git a/src/main.cpp b/src/main.cpp
index dc86ca1add..22705c22e1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -33,15 +33,16 @@ extern std::string NodeAddress(CNode* pfrom);
extern std::string ConvertBinToHex(std::string a);
extern std::string ConvertHexToBin(std::string a);
extern void RecoverNode();
-
-
+extern bool PushGridcoinDiagnostics();
+double qtPushGridcoinDiagnosticData(std::string data);
bool RequestSupermajorityNeuralData();
-
extern std::string UnpackBinarySuperblock(std::string sBlock);
extern std::string PackBinarySuperblock(std::string sBlock);
extern std::vector StringToVector(std::string sData);
+extern bool TallyResearchAverages(bool Forcefully);
+extern void SyncChain();
extern double GetStandardDeviation(std::string sPriceHistory);
extern double GetVolatility(std::string sPriceHistory);
bool GetExpiredOption(std::string& rsRecipient, double& rdSinglePrice, double& rdAmountOwed, std::string& rsOpra);
@@ -83,7 +84,7 @@ json_spirit::Array MagnitudeReport(std::string cpid);
extern void AddCPIDBlockHash(std::string cpid, std::string blockhash);
extern void ZeroOutResearcherTotals(std::string cpid);
-extern bool ShaveChain(CTxDB& txdb);
+extern bool ShaveChain(CTxDB& txdb,int iHaircut);
extern StructCPID GetLifetimeCPID(std::string cpid,std::string sFrom);
@@ -685,6 +686,34 @@ bool UpdateNeuralNetworkQuorumData()
return false;
}
+bool PushGridcoinDiagnostics()
+{
+ #if defined(WIN32) && defined(QT_GUI)
+ if (!bGlobalcomInitialized) return false;
+ std::string errors1 = "";
+ LoadAdminMessages(false,errors1);
+ std::string cpiddata = GetListOf("beacon");
+ std::string sWhitelist = GetListOf("project");
+ int64_t superblock_age = GetAdjustedTime() - mvApplicationCacheTimestamp["superblock;magnitudes"];
+ double popularity = 0;
+ std::string consensus_hash = GetNeuralNetworkSupermajorityHash(popularity);
+ std::string sAge = RoundToString((double)superblock_age,0);
+ std::string sBlock = mvApplicationCache["superblock;block_number"];
+ std::string sTimestamp = TimestampToHRDate(mvApplicationCacheTimestamp["superblock;magnitudes"]);
+ printf("Pushing diagnostic data...");
+ double lastblockage = PreviousBlockAge();
+ double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true));
+ std::string data = "" + sWhitelist + ""
+ + cpiddata + "" + sAge + "" + consensus_hash + "" + sBlock + ""
+ + sTimestamp + "" + msPrimaryCPID + "" + RoundToString(lastblockage,0) + "" + RoundToString(PORDiff,2) + "";
+ std::string testnet_flag = fTestNet ? "TESTNET" : "MAINNET";
+ qtExecuteGenericFunction("SetTestNetFlag",testnet_flag);
+ double dResponse = qtPushGridcoinDiagnosticData(data);
+ return true;
+ #endif
+ return false;
+}
+
bool FullSyncWithDPORNodes()
{
#if defined(WIN32) && defined(QT_GUI)
@@ -715,15 +744,12 @@ bool FullSyncWithDPORNodes()
std::string sAge = RoundToString((double)superblock_age,0);
std::string sBlock = mvApplicationCache["superblock;block_number"];
std::string sTimestamp = TimestampToHRDate(mvApplicationCacheTimestamp["superblock;magnitudes"]);
-
std::string data = "" + sWhitelist + ""
+ cpiddata + "" + sAge + "" + consensus_hash + "" + sBlock + ""
+ sTimestamp + "" + msPrimaryCPID + "";
-
//if (fDebug3) printf("Syncing neural network %s \r\n",data.c_str());
std::string testnet_flag = fTestNet ? "TESTNET" : "MAINNET";
qtExecuteGenericFunction("SetTestNetFlag",testnet_flag);
-
qtSyncWithDPORNodes(data);
#endif
return true;
@@ -3683,6 +3709,10 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo
*/
bDoTally = true;
}
+ else
+ {
+ if (fDebug3) printf("ConnectBlock(): Superblock Not Loaded %f\r\n",(double)pindex->nHeight);
+ }
}
}
@@ -3775,9 +3805,8 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck, boo
-bool ShaveChain(CTxDB& txdb)
+bool ShaveChain(CTxDB& txdb, int iHaircut)
{
- int iHaircut = 100;
int iTarget = 0;
int iStart = 0;
printf("Shaving %f blocks off of main chain\n",(double)iHaircut);
@@ -3846,32 +3875,24 @@ bool ShaveChain(CTxDB& txdb)
return error("ShaveChain() : WriteHashBestChain failed");
// Make sure it's successfully written to disk before changing memory structure
- //if (!txdb.TxnCommit()) return error("ShaveChain() : TxnCommit failed");
-
- // Buzz each block pointer
BOOST_FOREACH(CBlockIndex* pindex, vDisconnect)
if (pindex->pprev)
pindex->pprev->pnext = NULL;
-
// Resurrect memory transactions that were in the disconnected branch
BOOST_FOREACH(CTransaction& tx, vResurrect)
AcceptToMemoryPool(mempool, tx, NULL);
-
CBlock block;
if (!block.ReadFromDisk(pHaircut))
{
printf("ShaveChain(): Fatal Error while reading new best block.\r\n");
return false;
}
-
if (!block.SetBestChain(txdb, pHaircut))
{
printf("ShaveChain(): Fatal Error while setting best chain inner.\r\n");
return false;
}
-
if (bHaircutFailed) return false;
-
printf("ShaveChain: done\n");
return true;
}
@@ -4727,12 +4748,13 @@ bool ServicesIncludesNN(CNode* pNode)
bool VerifySuperblock(std::string superblock, int nHeight)
{
bool bPassed = false;
+ double out_avg = 0;
+ double out_beacon_count=0;
+ double out_participant_count=0;
+ double avg_mag = 0;
if (superblock.length() > 20)
{
- double out_avg = 0;
- double out_beacon_count=0;
- double out_participant_count=0;
- double avg_mag = GetSuperblockAvgMag(superblock,out_beacon_count,out_participant_count,out_avg,false);
+ avg_mag = GetSuperblockAvgMag(superblock,out_beacon_count,out_participant_count,out_avg,false);
bPassed=true;
if (!IsResearchAgeEnabled(nHeight))
{
@@ -4743,6 +4765,11 @@ bool VerifySuperblock(std::string superblock, int nHeight)
if (out_avg < 70 && !fTestNet) bPassed = false;
if (avg_mag < 10) bPassed = false;
}
+ if (fDebug3 && !bPassed)
+ {
+ if (fDebug) printf(" Verification of Superblock Failed ");
+ // printf("\r\n Verification of Superblock Failed outavg: %f, avg_mag %f, Height %f, Out_Beacon_count %f, Out_participant_count %f, block %s", (double)out_avg,(double)avg_mag,(double)nHeight,(double)out_beacon_count,(double)out_participant_count,superblock.c_str());
+ }
return bPassed;
}
@@ -4817,11 +4844,12 @@ void GridcoinServices()
if (TimerMain("OutOfSync",120))
{
- if (OutOfSyncByMoreThan(30))
+ double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true));
+ bool fGhostChain = (!fTestNet && PORDiff < .75);
+ if (OutOfSyncByMoreThan(30) || fGhostChain)
{
RecoverNode();
}
-
}
if (false && TimerMain("FixSpentCoins",60))
@@ -4998,20 +5026,74 @@ void GridcoinServices()
}
+
+
+void AskForOutstandingBlocks()
+{
+ LOCK(cs_vNodes);
+ BOOST_FOREACH(CNode* pNode, vNodes)
+ {
+ pNode->ClearBanned();
+ // Ask for outstanding blocks
+ if (true)
+ {
+ if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) )
+ {
+ pNode->PushGetBlocks(pindexBest, uint256(0));
+ printf(".");
+ }
+ }
+ }
+}
+void SyncChain()
+{
+ printf("\r\n * Sync Chain * \r\n");
+ //6-11-2016
+ CTxDB txdb;
+ LOCK(cs_main);
+ ShaveChain(txdb,200);
+ AskForOutstandingBlocks();
+ std::string sOut = "";
+ LoadAdminMessages(true,sOut);
+ InitializeBoincProjects();
+ TallyResearchAverages(true);
+ ComputeNeuralNetworkSupermajorityHashes();
+ LoadCPIDsInBackground();
+ printf("\r\n * Finished * \r\n");
+}
+
+
void RecoverNode()
+{
+
+ SyncChain();
+}
+
+void ReloadBlockIndexHot()
{
printf("\r\n * Recovering Node * \r\n");
+ // clear vectors, clear orphans, clear mapindex
+ mapOrphanBlocks.clear();
+ mapBlockIndex.clear();
+ setStakeSeen.clear();
setStakeSeenOrphan.clear();
+ mvResearchAge.clear();
mapOrphanBlocks.clear();
- // Load block index
- CTxDB txdb("r");
- txdb.LoadBlockIndex();
+ mapOrphanBlocksByPrev.clear();
+ mvApplicationCache.clear();
+ mvApplicationCacheTimestamp.clear();
+ mvNeuralVersion.clear();
+ mvDPOR.clear();
+ mvDPORCopy.clear();
+ mvBlockIndex.clear();
+ mvCPIDBlockHashes.clear();
+ LoadBlockIndex(true);
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pNode, vNodes)
{
pNode->ClearBanned();
// Ask for some more blocks
- if (LessVerbose(100))
+ if (true)
{
if (!pNode->fClient && !pNode->fOneShot && (pNode->nStartingHeight > (nBestHeight - 144)) && (pNode->nVersion < NOBLKS_VERSION_START || pNode->nVersion >= NOBLKS_VERSION_END) )
{
@@ -5076,7 +5158,9 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock, bool generated_by_me)
if (TimerMain("OrphanBarrage", 25))
{
bool fOut = OutOfSyncByMoreThan(30);
- if (fOut)
+ double PORDiff = GetDifficulty(GetLastBlockIndex(pindexBest, true));
+ bool fGhostChain = (!fTestNet && PORDiff < .75);
+ if (fOut || fGhostChain)
{
RecoverNode();
}
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 0ae94b8070..82e4d5d65d 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -100,6 +100,9 @@ extern void qtSyncWithDPORNodes(std::string data);
extern double qtExecuteGenericFunction(std::string function,std::string data);
std::string GetArgument(std::string arg, std::string defaultvalue);
extern std::string getMacAddress();
+extern double qtPushGridcoinDiagnosticData(std::string data);
+
+bool PushGridcoinDiagnostics();
extern std::string FromQString(QString qs);
extern std::string qtExecuteDotNetStringFunction(std::string function, std::string data);
@@ -508,6 +511,17 @@ void qtInsertConfirm(double dAmt, std::string sFrom, std::string sTo, std::strin
#endif
}
+double qtPushGridcoinDiagnosticData(std::string data)
+{
+ if (!bGlobalcomInitialized) return 0;
+ int result = 0;
+ #if defined(WIN32) && defined(QT_GUI)
+ QString qsData = ToQstring(data);
+ result = globalcom->dynamicCall("PushGridcoinDiagnosticData(Qstring)",qsData).toInt();
+ #endif
+ return (double)result;
+}
+
//R Halford - 6/19/2015 - Let's clean up the windows side by removing all these functions and making a generic interface for comm between Windows and Linux; Start with one new generic function here:
double qtExecuteGenericFunction(std::string function, std::string data)
@@ -978,6 +992,11 @@ void BitcoinGUI::createActions()
foundationAction->setStatusTip(tr("Foundation"));
foundationAction->setMenuRole(QAction::TextHeuristicRole);
+ diagnosticsAction = new QAction(QIcon(":/icons/bitcoin"), tr("&Diagnostics"), this);
+ diagnosticsAction->setStatusTip(tr("Diagnostics"));
+ diagnosticsAction->setMenuRole(QAction::TextHeuristicRole);
+
+
faqAction = new QAction(QIcon(":/icons/bitcoin"), tr("FA&Q"), this);
faqAction->setStatusTip(tr("Interactive FAQ"));
faqAction->setMenuRole(QAction::TextHeuristicRole);
@@ -1027,10 +1046,11 @@ void BitcoinGUI::createActions()
connect(tickerAction, SIGNAL(triggered()), this, SLOT(tickerClicked()));
connect(ticketListAction, SIGNAL(triggered()), this, SLOT(ticketListClicked()));
+ connect(diagnosticsAction, SIGNAL(triggered()), this, SLOT(diagnosticsClicked()));
connect(foundationAction, SIGNAL(triggered()), this, SLOT(foundationClicked()));
connect(faqAction, SIGNAL(triggered()), this, SLOT(faqClicked()));
-
+
connect(galazaAction, SIGNAL(triggered()), this, SLOT(galazaClicked()));
connect(newUserWizardAction, SIGNAL(triggered()), this, SLOT(newUserWizardClicked()));
@@ -1114,6 +1134,8 @@ void BitcoinGUI::createMenuBar()
qmAdvanced->addSeparator();
qmAdvanced->addAction(faqAction);
qmAdvanced->addAction(foundationAction);
+ qmAdvanced->addAction(diagnosticsAction);
+
#endif /* defined(WIN32) */
}
@@ -1770,6 +1792,18 @@ void BitcoinGUI::ticketListClicked()
#endif
}
+void BitcoinGUI::diagnosticsClicked()
+{
+#ifdef WIN32
+ if (!bGlobalcomInitialized) return;
+ qtSetSessionInfo(DefaultWalletAddress(), GlobalCPUMiningCPID.cpid, GlobalCPUMiningCPID.Magnitude);
+ bool result = PushGridcoinDiagnostics();
+ globalcom->dynamicCall("ShowDiagnostics()");
+#endif
+}
+
+
+
/*
void BitcoinGUI::browserClicked()
{
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index 0a229cb44d..105bda1b1f 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -120,6 +120,7 @@ class BitcoinGUI : public QMainWindow
QAction *newUserWizardAction;
QAction *foundationAction;
QAction *faqAction;
+ QAction *diagnosticsAction;
QAction *verifyMessageAction;
QAction *aboutAction;
@@ -220,6 +221,7 @@ private slots:
void miningClicked();
void votingClicked();
void faqClicked();
+ void diagnosticsClicked();
void tickerClicked();
diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp
index fbf02f0535..012cd54d48 100644
--- a/src/rpcblockchain.cpp
+++ b/src/rpcblockchain.cpp
@@ -29,6 +29,9 @@ extern bool UserAcknowledgedHoldHarmlessClause(std::string sAddress);
std::string ConvertBinToHex(std::string a);
std::string ConvertHexToBin(std::string a);
void RecoverNode();
+bool TallyResearchAverages(bool Forcefully);
+
+void SyncChain();
extern bool GetExpiredOption(std::string& rsRecipient, double& rdSinglePrice, double& rdAmountOwed, std::string& rsOpra);
@@ -74,7 +77,7 @@ double GetNetworkPaymentsTotal();
double GetOutstandingAmountOwed(StructCPID &mag, std::string cpid, int64_t locktime, double& total_owed, double block_magnitude);
bool ComputeNeuralNetworkSupermajorityHashes();
bool UpdateNeuralNetworkQuorumData();
-bool ShaveChain(CTxDB& txdb);
+bool ShaveChain(CTxDB& txdb,int iHowMuch);
extern Array LifetimeReport(std::string cpid);
Array StakingReport();
extern std::string AddContract(std::string sType, std::string sName, std::string sContract);
@@ -2100,9 +2103,14 @@ Value execute(const Array& params, bool fHelp)
results.push_back(entry);
}
+ else if (sItem == "syncchain")
+ {
+ SyncChain();
+ entry.push_back(Pair("SyncChain",1));
+ results.push_back(entry);
+ }
else if (sItem == "recover")
{
-
//5-13-2016
RecoverNode();
entry.push_back(Pair("Recover",1));
@@ -2429,7 +2437,7 @@ Value execute(const Array& params, bool fHelp)
else if (sItem == "shavechain")
{
CTxDB txdb;
- if (ShaveChain(txdb))
+ if (ShaveChain(txdb,100))
{
entry.push_back(Pair("Warning!","This command is deprecated and can cause temporary instability. It is not recommended any longer. You may have to reboot the wallet to recover. "));
entry.push_back(Pair("Shave Succeeded.",(double)pindexBest->nHeight));
@@ -3141,7 +3149,8 @@ Value execute(const Array& params, bool fHelp)
{
bNetAveragesLoaded = false;
nLastTallied = 0;
- BusyWaitForTally();
+ // BusyWaitForTally();
+ bool bTallied = TallyResearchAverages(true);
entry.push_back(Pair("Tally Network Averages",1));
results.push_back(entry);
}
@@ -3408,7 +3417,6 @@ Value execute(const Array& params, bool fHelp)
}
else if (sItem == "currentcontractaverage")
{
- //7-18-2015
std::string contract = "";
#if defined(WIN32) && defined(QT_GUI)
contract = qtGetNeuralContract("");
@@ -3424,6 +3432,18 @@ Value execute(const Array& params, bool fHelp)
entry.push_back(Pair("avg_mag",out_avg));
entry.push_back(Pair("beacon_participant_count",out_participant_count));
entry.push_back(Pair("superblock_valid",bValid));
+ //Show current contract neural hash
+ std::string sNeuralHash = "";
+
+ #if defined(WIN32) && defined(QT_GUI)
+ sNeuralHash = qtGetNeuralHash("");
+ entry.push_back(Pair(".NET Neural Hash",sNeuralHash.c_str()));
+ #endif
+
+ entry.push_back(Pair("Length",(double)contract.length()));
+ std::string neural_hash = GetQuorumHash(contract);
+ entry.push_back(Pair("Wallet Neural Hash",neural_hash));
+
results.push_back(entry);
}
diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp
index c65b414679..17ac587c11 100644
--- a/src/rpcnet.cpp
+++ b/src/rpcnet.cpp
@@ -341,16 +341,11 @@ Value getpeerinfo(const Array& params, bool fHelp)
obj.push_back(Pair("startingheight", stats.nStartingHeight));
obj.push_back(Pair("sNeuralNetworkVersion",stats.sNeuralNetwork));
obj.push_back(Pair("nTrust",stats.nTrust));
- obj.push_back(Pair("GRCAddress",stats.sGRCAddress));
-
- obj.push_back(Pair("banscore", stats.nMisbehavior));
-
+ obj.push_back(Pair("banscore", stats.nMisbehavior));
bool bNeural = false;
bNeural = Contains(stats.strSubVer,"1999");
-
obj.push_back(Pair("Neural Network", bNeural));
obj.push_back(Pair("Neural Hash",stats.NeuralHash));
-
ret.push_back(obj);
}