616 lines
25 KiB
C#
616 lines
25 KiB
C#
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Xylem.Common.CommonCore.Configuration;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
|
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
|
|
|
|
namespace Xylem.Common.Ui.GenesisToolBox
|
|
{
|
|
/// <summary>
|
|
/// Password access and write to meter
|
|
/// </summary>
|
|
public partial class FrmPassword : Form
|
|
{
|
|
private GenesisMeter _currentGenesis;
|
|
private readonly MeterBatch _meterBatch = new MeterBatch();
|
|
private const String StrConnecting = "Connecting";
|
|
private const String StrNotConnected = "NOT CONNECTED";
|
|
private const String StrPartPcbConnected = "Connected to PCBID:";
|
|
|
|
/// <summary>
|
|
/// Password handling form
|
|
/// </summary>
|
|
public FrmPassword()
|
|
{
|
|
InitializeComponent();
|
|
|
|
tmrProgressPcb.Tick += TmrProgressPcb_Tick;
|
|
tmrProgressDb.Tick += TmrProgressDb_Tick;
|
|
|
|
Init();
|
|
}
|
|
|
|
private void btnGet_Click(Object sender, EventArgs e)
|
|
{
|
|
txtPcbID.BackColor = Color.White;
|
|
lblConnectDb.Text = StrNotConnected;
|
|
lblConnectDb.ForeColor = Color.Red;
|
|
if (txtPcbID.Text.Length > 7)
|
|
{
|
|
Int32 pcbid;
|
|
if (int.TryParse(txtPcbID.Text, out pcbid))
|
|
{
|
|
try
|
|
{
|
|
Task.Factory.StartNew((Action)(() =>
|
|
{
|
|
ViewProgressDb(true);
|
|
#pragma warning disable CS0618 // Type or member is obsolete
|
|
var passwordServiceUrl = ServiceUrls.GenesisGetPasswordServiceUrl();
|
|
#pragma warning restore CS0618 // Type or member is obsolete
|
|
var http = (HttpWebRequest)WebRequest.Create(passwordServiceUrl + txtPcbID.Text);
|
|
var response = (HttpWebResponse)http.GetResponse();
|
|
var responseStream = response.GetResponseStream();
|
|
if (responseStream == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var sr = new StreamReader(responseStream);
|
|
|
|
var autoPassword = "";
|
|
|
|
var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl();
|
|
//var http = (HttpWebRequest)WebRequest.Create($"{url}{_currentGenesis.PcbId}");
|
|
|
|
var http2 = (HttpWebRequest)WebRequest.Create($"{url}{pcbid}");
|
|
http2.Headers.Add("Cache-Control", "no-cache");
|
|
var a = new MeterPwdDb();
|
|
|
|
|
|
var response2 = (HttpWebResponse)http2.GetResponse();
|
|
var responseStream2 = response2.GetResponseStream();
|
|
if (responseStream == null)
|
|
{
|
|
throw new InvalidOperationException();
|
|
}
|
|
|
|
if (response.StatusCode != HttpStatusCode.OK)
|
|
{
|
|
|
|
}
|
|
|
|
Invoke(new Action(() =>
|
|
{
|
|
|
|
|
|
using (var sr2 = new StreamReader(responseStream2))
|
|
{
|
|
var responseJson2 = sr2.ReadToEnd();
|
|
|
|
a = JsonConvert.DeserializeObject<MeterPwdDb>(responseJson2);
|
|
autoPassword = Encoding.UTF8.GetString(a.ListOfPasswords[7]);
|
|
}
|
|
var responseJson = sr.ReadToEnd();
|
|
//TODO THW hide skeleton key if read from DB
|
|
//txtSkeletonKey.Text = responseJson.Trim('"');
|
|
txtSkeletonKey.Text = a.Skeleton;
|
|
txtLvl8.Text = autoPassword;
|
|
lblConnectDb.Text = @"Connected to PWD DB";
|
|
lblConnectDb.ForeColor = Color.Green;
|
|
|
|
////TODO TEST ONLY remove here _isReadyPasswordFile
|
|
_isReadyPasswordFile = true;
|
|
//btnWritePwdFile.Enabled = true;
|
|
////TODO remove until here
|
|
|
|
}));
|
|
})).ContinueWith(delegate { ViewProgressDb(false); });
|
|
}
|
|
catch (Exception)
|
|
{
|
|
txtPcbID.BackColor = Color.Red;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
txtPcbID.BackColor = Color.Red;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnSet_Click(Object sender, EventArgs e)
|
|
{
|
|
if (txtPcbID.Text.Length > 7)
|
|
{
|
|
Int32 pcbid;
|
|
if (int.TryParse(txtPcbID.Text, out pcbid))
|
|
{
|
|
#pragma warning disable CS0618 // Type or member is obsolete
|
|
var passwordSetServiceUrl = ServiceUrls.GenesisSetPasswordServiceUrl();
|
|
#pragma warning restore CS0618 // Type or member is obsolete
|
|
var http = (HttpWebRequest)WebRequest.Create(passwordSetServiceUrl + txtPcbID.Text
|
|
+ "&Password=" + txtSkeletonKey.Text);
|
|
var response = (HttpWebResponse)http.GetResponse();
|
|
var responseStream = response.GetResponseStream();
|
|
if (responseStream == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var sr = new StreamReader(responseStream);
|
|
|
|
var responseJson = sr.ReadToEnd();
|
|
if (responseJson.ToLower().Contains("store"))
|
|
{
|
|
MessageBox.Show(@"Skeleton Key stored to data base");
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(@"Not stored");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void WriteValue<T>(String reg, T value)
|
|
{
|
|
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_currentGenesis.WriteRegister(reg, value, checkRegister: true);
|
|
return;
|
|
}
|
|
|
|
private void ViewProgressPcb(Boolean isActive)
|
|
{
|
|
if (isActive)
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
lblProgressPcb.Text = StrConnecting;
|
|
barProgressPcb.Value = 0;
|
|
lblProgressPcb.Visible = true;
|
|
barProgressPcb.Visible = true;
|
|
tmrProgressPcb.Enabled = true;
|
|
lblConnectPcb.Visible = false;
|
|
}));
|
|
}
|
|
else
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
tmrProgressPcb.Enabled = false;
|
|
lblProgressPcb.Visible = false;
|
|
barProgressPcb.Visible = false;
|
|
lblConnectPcb.Visible = true;
|
|
}));
|
|
}
|
|
}
|
|
|
|
private void ViewProgressDb(Boolean isActive)
|
|
{
|
|
if (isActive)
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
lblProgressDb.Text = StrConnecting;
|
|
barProgressDb.Value = 0;
|
|
lblProgressDb.Visible = true;
|
|
barProgressDb.Visible = true;
|
|
tmrProgressDb.Enabled = true;
|
|
lblConnectDb.Visible = false;
|
|
}));
|
|
}
|
|
else
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
tmrProgressDb.Enabled = false;
|
|
lblProgressDb.Visible = false;
|
|
barProgressDb.Visible = false;
|
|
lblConnectDb.Visible = true;
|
|
}));
|
|
}
|
|
}
|
|
|
|
|
|
private void cbComSlot_SelectedIndexChanged_1(Object sender, EventArgs e)
|
|
{
|
|
Init();
|
|
}
|
|
|
|
private void FrmPassword_FormClosing(Object sender, FormClosingEventArgs e)
|
|
{
|
|
Dispose();
|
|
}
|
|
|
|
private new void Dispose()
|
|
{
|
|
_meterBatch?.RemoveAllMeters();
|
|
_meterBatch?.Dispose();
|
|
base.Dispose();
|
|
}
|
|
|
|
/// <remarks date="2025-Oct-02" author="Thomas Wiedebusch">
|
|
/// - Catch error message on unknown data type and kill meter.
|
|
/// </remarks>
|
|
private void Connect()
|
|
{
|
|
Int32 slotNr;
|
|
lblConnectPcb.Text = StrNotConnected;
|
|
lblConnectPcb.ForeColor = Color.Red;
|
|
txtPcbID.Text = "";
|
|
txtSkeletonKey.Text = "";
|
|
btnGet.Enabled = false;
|
|
//btnSet.Enabled = false;
|
|
if (!string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) &&
|
|
int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNr))
|
|
{
|
|
try
|
|
{
|
|
_meterBatch.RemoveAllMeters();
|
|
_currentGenesis = null;
|
|
|
|
ViewProgressPcb(true);
|
|
_currentGenesis = new GenesisMeter();
|
|
_currentGenesis.SetupFromConfigFile(slotNr);
|
|
_meterBatch.AddMeter(_currentGenesis);
|
|
|
|
Task.Factory.StartNew(() =>
|
|
{
|
|
_meterBatch.MetersLogin();
|
|
|
|
if (_currentGenesis.IsLoggedOn)
|
|
{
|
|
_currentGenesis.EnableAutoLogon();
|
|
//switch LED off
|
|
WriteValue(Register.Genesisflow.LedMode, (Byte)LedMode.Off);
|
|
Invoke(new Action(() =>
|
|
{
|
|
lblConnectPcb.Text = StrPartPcbConnected + $@" {_currentGenesis.PcbId}";
|
|
txtPcbID.Text = _currentGenesis.PcbId;
|
|
lblConnectPcb.ForeColor = Color.Green;
|
|
//btnConnect.Enabled = false;
|
|
btnGet_Click(this, null);
|
|
}));
|
|
}
|
|
}).ContinueWith(delegate { ViewProgressPcb(false); });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ViewProgressPcb(false);
|
|
MessageBox.Show(ex.Message, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
// Dispose meter
|
|
_meterBatch.RemoveAllMeters();
|
|
// If meter is not already assigned to batch as the config reader may fail
|
|
_currentGenesis?.DisposeMeter();
|
|
}
|
|
}
|
|
}
|
|
private void TmrProgressPcb_Tick(Object sender, EventArgs e)
|
|
{
|
|
if (barProgressPcb.Value == 100)
|
|
{
|
|
barProgressPcb.Value = 0;
|
|
}
|
|
barProgressPcb.Value += 1;
|
|
}
|
|
|
|
private void TmrProgressDb_Tick(Object sender, EventArgs e)
|
|
{
|
|
if (barProgressDb.Value == 100)
|
|
{
|
|
barProgressDb.Value = 0;
|
|
}
|
|
barProgressDb.Value += 1;
|
|
}
|
|
|
|
private void btnConnect_Click(Object sender, EventArgs e)
|
|
{
|
|
Connect();
|
|
}
|
|
|
|
private void Init()
|
|
{
|
|
lblConnectPcb.Text = StrNotConnected;
|
|
lblConnectPcb.ForeColor = Color.Red;
|
|
lblConnectDb.Text = StrNotConnected;
|
|
lblConnectDb.ForeColor = Color.Red;
|
|
btnConnect.Enabled = true;
|
|
txtPcbID.Text = "";
|
|
txtSkeletonKey.Text = "";
|
|
btnGet.Enabled = false;
|
|
|
|
btnWritePwdFile.Enabled = false;
|
|
}
|
|
|
|
private void txtPcbID_TextChanged(Object sender, EventArgs e)
|
|
{
|
|
//setting is only allowed if genesis is not connected
|
|
if (txtPcbID.Text.Length > 7 && lblConnectPcb.Text == StrNotConnected)
|
|
{
|
|
btnGet.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
btnGet.Enabled = false;
|
|
}
|
|
lblConnectDb.Text = StrNotConnected;
|
|
lblConnectDb.ForeColor = Color.Red;
|
|
txtSkeletonKey.Text = "";
|
|
}
|
|
|
|
private void txtPassword_TextChanged(Object sender, EventArgs e)
|
|
{
|
|
//setting is only allowed if genesis is not connected
|
|
if (txtPcbID.Text.Length > 7 && txtSkeletonKey.Text.Length == 12
|
|
&& lblConnectPcb.Text == StrNotConnected)
|
|
{
|
|
//btnSet.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
//btnSet.Enabled = false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Marker for readiness of password file
|
|
/// </summary>
|
|
private Boolean _isReadyPasswordFile;
|
|
|
|
private Byte[] _passwordFile =
|
|
{
|
|
//Level 1 BSI first 12 signs - SHA1
|
|
0x3E, 0x20, 0x5F, 0x63, 0xA9, 0x1C, 0x47, 0xAE, 0x87, 0xDB,
|
|
0x70, 0x15, 0x18, 0xD5, 0xF2, 0xE5, 0xF6, 0x12, 0x0C, 0xEC,
|
|
|
|
//Level 2 BSI first 12 signs - SHA1
|
|
0xFF, 0x40, 0xDF, 0x97, 0xF9, 0x68, 0x11, 0xCC, 0x1C, 0x8A,
|
|
0xA4, 0xF0, 0x6C, 0x7C, 0xDF, 0xD6, 0xC5, 0x67, 0x1A, 0x89,
|
|
|
|
//Level 3 Skeleton 10C66CCBDD24 for PCBID182100041 UID - SHA1
|
|
0x7B, 0x6C, 0xF3, 0x8F, 0x88, 0x60, 0x0A, 0x33, 0x2D, 0xA1,
|
|
0xAF, 0x29, 0x13, 0x35, 0x7C, 0x76, 0x9A, 0xF9, 0x76, 0x7A,
|
|
|
|
//Level 4 BSI first 12 signs - SHA1
|
|
0xE8, 0xF7, 0xCA, 0x99, 0x8B, 0x31, 0xD8, 0xB8, 0xA4, 0xE3,
|
|
0xBD, 0x32, 0x3C, 0xA4, 0x97, 0x85, 0xF7, 0xAE, 0x5A, 0xA7,
|
|
|
|
//Level 5 BSI first 12 signs - SHA1
|
|
0xFE, 0xA8, 0xE7, 0xC7, 0x07, 0x6B, 0x16, 0xE9, 0x0E, 0x9A,
|
|
0x4B, 0xC4, 0x31, 0x39, 0x1C, 0xE0, 0xEF, 0xA9, 0xF2, 0x29,
|
|
|
|
//Level 6 BSI first 12 signs - SHA1
|
|
0xF7, 0x03, 0x24, 0x84, 0xB6, 0x4C, 0x13, 0xDE, 0x7C, 0xDC,
|
|
0x84, 0x0F, 0x63, 0x25, 0x57, 0xE0, 0x8F, 0x7B, 0x07, 0xE7,
|
|
|
|
//Level 7 BSI first 12 signs - SHA1
|
|
0x0E, 0x08, 0x66, 0x7F, 0xE2, 0xF1, 0x1E, 0x42, 0x24, 0x62,
|
|
0x9E, 0xCB, 0xCA, 0xA3, 0xE6, 0x24, 0xC9, 0x6F, 0x34, 0xB8,
|
|
|
|
//Level 8 BSI first 12 signs - SHA1
|
|
0x2E, 0x90, 0xCD, 0x0C, 0x6C, 0x4E, 0x83, 0xAA, 0x1B, 0x5B,
|
|
0x95, 0xA4, 0xC0, 0xF2, 0x8E, 0x1A, 0xF7, 0x6B, 0x06, 0x03
|
|
};
|
|
|
|
|
|
private void btnWritePwdFile_Click(Object sender, EventArgs e)
|
|
{
|
|
|
|
|
|
//DataBase content: FE081F0 FE 82 C8 58 05 C3 E4 24 00 04 80 00 70 03 48 99
|
|
//FE081F0 22 12 F0 59 04 34 C5 24 00 04 80 00 70 03 48 9A
|
|
|
|
//var meterPwdFile = new MeterPwdFile(_currentGenesis);
|
|
//Byte[] processorUid = { 0x2D, 0x83, 0xC8, 0x58, 0x01, 0x9B, 0xEB, 0x24 };
|
|
//Byte[] processorUid = { 0x22, 0x12, 0xF0, 0x59, 0x04, 0x34, 0xC5, 0x24 };
|
|
|
|
//var skeletonKey = meterPwdFile.BuildSkeletonKey(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
|
|
|
|
//var level3Pwd = meterPwdFile.BuildLevel3Pwd(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
|
|
|
|
/// todo implement passwordcontroller call
|
|
|
|
var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl();
|
|
var http = (HttpWebRequest)WebRequest.Create($"{url}{_currentGenesis.PcbId}");
|
|
|
|
//var http = (HttpWebRequest)WebRequest.Create($"{url}19080010");
|
|
http.Headers.Add("Cache-Control", "no-cache");
|
|
var a = new MeterPwdDb();
|
|
|
|
try
|
|
{
|
|
var response = (HttpWebResponse)http.GetResponse();
|
|
var responseStream = response.GetResponseStream();
|
|
if (responseStream == null)
|
|
{
|
|
throw new InvalidOperationException();
|
|
}
|
|
|
|
if (response.StatusCode != HttpStatusCode.OK)
|
|
{
|
|
|
|
}
|
|
|
|
using (var sr = new StreamReader(responseStream))
|
|
{
|
|
var responseJson = sr.ReadToEnd();
|
|
responseJson = responseJson.Trim('"');
|
|
a = JsonConvert.DeserializeObject<MeterPwdDb>(responseJson);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
|
|
var listOfRawPasswords = new List<Byte[]>();
|
|
var dbSekeletonKey = "";
|
|
UInt64 processorUid = 1;
|
|
|
|
if (!_isReadyPasswordFile)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var meterPwdFile = new MeterPwdFile(_currentGenesis);
|
|
if (meterPwdFile.BuildPwdFile(a.ListOfPasswords, processorUid, a.Skeleton))
|
|
{
|
|
if (meterPwdFile.UnlockEraseWriteMeterPwdFile())
|
|
{
|
|
meterPwdFile.WriteMeterPwdFile();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//todo error msg
|
|
}
|
|
|
|
|
|
//TEST build level3 password out of UID (Unique Processor ID)
|
|
//DataBase content: FE081F0 93 82 C8 58 08 E5 11 24 00 04 80 00 70 03 48 99
|
|
//Byte[] processorUid = { 0x93, 0x82, 0xC8, 0x58, 0x08, 0xE5, 0x11, 0x24 };
|
|
//DataBase content: FE081F0 FE 82 C8 58 05 C3 E4 24 00 04 80 00 70 03 48 99
|
|
|
|
|
|
////Byte[] processorUid = { 0xFE, 0x82, 0xC8, 0x58, 0x05, 0xC3, 0xE4, 0x24 };
|
|
|
|
////var skeletonKey = meterPwdFile.BuildSkeletonKey(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
|
|
////var level3Pwd = meterPwdFile.BuildLevel3Pwd(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
private void btnErasePwdFile_Click(Object sender, EventArgs e)
|
|
{
|
|
var meterPwdFile = new MeterPwdFile(_currentGenesis);
|
|
if (meterPwdFile.UnlockEraseWriteMeterPwdFile())
|
|
{
|
|
meterPwdFile.EraseMeterPwdFile();
|
|
}
|
|
}
|
|
|
|
private void FrmPassword_Load(Object sender, EventArgs e)
|
|
{
|
|
|
|
|
|
}
|
|
private String GenSkeletnkey(UInt64 v)
|
|
{
|
|
var s = MeterPwdFile.BuildSkeletonKey(v);
|
|
var r = "";
|
|
|
|
r += s[10];
|
|
r += s[11];
|
|
r += s[8];
|
|
r += s[9];
|
|
r += s[6];
|
|
r += s[7];
|
|
r += s[4];
|
|
r += s[5];
|
|
r += s[2];
|
|
r += s[3];
|
|
r += s[0];
|
|
r += s[1];
|
|
|
|
|
|
return r;
|
|
|
|
}
|
|
private void txtLvl8_DoubleClick(Object sender, EventArgs e)
|
|
{
|
|
var sb = new StringBuilder();
|
|
|
|
sb.Append(GenSkeletnkey((UInt64)0x0413F059069BEB24)).Append("192000001").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1013F0590434C524)).Append("192000004").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1013F05903661024)).Append("192000006").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1B13F0590434C524)).Append("192000007").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x8613F05903661024)).Append("192000009").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x0413F0590434C524)).Append("192000010").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x0413F0590434C524)).Append("192000010").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x7A13F0590434C524)).Append("192000012").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xF812F0590434C524)).Append("192000014").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xF812F05903661024)).Append("192000015").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xF812F059069BEB24)).Append("192000016").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x0413F05903661024)).Append("192000017").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xEC12F05903661024)).Append("192000018").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xC812F0590434C524)).Append("192000019").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xE012F059069BEB24)).Append("192000021").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xD412F0590434C524)).Append("192000022").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xD412F05903661024)).Append("192000024").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xC812F059069BEB24)).Append("192000027").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xD412F059069BEB24)).Append("192000029").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xB112F059069BEB24)).Append("192000033").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x7512F059069BEB24)).Append("192000040").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x7512F05903661024)).Append("192000042").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x8D12F05903661024)).Append("192000043").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x9812F059069BEB24)).Append("192000045").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x7512F0590434C524)).Append("192000046").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x7512F0590434C524)).Append("192000046").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x8112F0590434C524)).Append("192000048").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x9213F05903661024)).Append("192000049").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x9E13F05903661024)).Append("192000051").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x9E13F05903661024)).Append("192000051").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xD913F059069BEB24)).Append("192200002").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xE513F059069BEB24)).Append("192200003").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xD913F05903661024)).Append("192200005").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xC213F05903661024)).Append("192200006").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xE513F0590434C524)).Append("192200007").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xFD13F059069BEB24)).Append("192200008").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xF113F0590434C524)).Append("192200009").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xF113F05903661024)).Append("192200010").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xF113F059069BEB24)).Append("192200011").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xE513F05903661024)).Append("192200013").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1414F05903661024)).Append("192200014").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1414F059069BEB24)).Append("192200015").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x0814F05903661024)).Append("192200016").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x0814F059069BEB24)).Append("192200017").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0xFD13F0590434C524)).Append("192200018").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1414F0590434C524)).Append("192200019").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x3714F05903661024)).Append("192200020").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x2B14F0590434C524)).Append("192200021").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x2014F0590434C524)).Append("192200022").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x2014F05903661024)).Append("192200023").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x2014F059069BEB24)).Append("192200024").Append(",").AppendLine();
|
|
|
|
sb.Clear();
|
|
sb.Append(GenSkeletnkey((UInt64)0x1011F0590434C524)).Append("19080029").Append(",").AppendLine();
|
|
sb.Append(GenSkeletnkey((UInt64)0x5D12F05903661024)).Append("19080002").Append(",").AppendLine();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MessageBox.Show(sb.ToString());
|
|
|
|
}
|
|
|
|
private void txtLvl8_TextChanged(Object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|