299 lines
12 KiB
C#
299 lines
12 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.Data;
|
|||
|
using System.Drawing;
|
|||
|
using System.Text;
|
|||
|
using System.Windows.Forms;
|
|||
|
using Microsoft.VisualBasic;
|
|||
|
using DBFactory;
|
|||
|
|
|||
|
namespace SystemConfig
|
|||
|
{
|
|||
|
public partial class FrmAGVGateEdit : Form
|
|||
|
{
|
|||
|
bool IfUpdate = false;
|
|||
|
DBOperator dbo =CStaticClass.dbo;
|
|||
|
private static FrmAGVGateEdit _formInstance;
|
|||
|
|
|||
|
public static FrmAGVGateEdit FormInstance
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_formInstance == null)
|
|||
|
{
|
|||
|
_formInstance = new FrmAGVGateEdit();
|
|||
|
|
|||
|
}
|
|||
|
return _formInstance;
|
|||
|
}
|
|||
|
set { _formInstance = value; }
|
|||
|
}
|
|||
|
public FrmAGVGateEdit()
|
|||
|
{
|
|||
|
InitializeComponent();
|
|||
|
_formInstance = this;
|
|||
|
}
|
|||
|
|
|||
|
private void btLaneGateDeviceIndex_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
FrmDeviceEdit.FormInstance.LaneGateDeviceIndex = true;
|
|||
|
FrmDeviceEdit.FormInstance.LaneIndex = false;
|
|||
|
FrmDeviceEdit.FormInstance.IsSelected = true;
|
|||
|
FrmDeviceEdit.FormInstance.ShowDialog();
|
|||
|
}
|
|||
|
|
|||
|
private void btLaneIndex_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
FrmDeviceEdit.FormInstance.LaneIndex = true;
|
|||
|
FrmDeviceEdit.FormInstance.LaneGateDeviceIndex = false;
|
|||
|
FrmDeviceEdit.FormInstance.IsSelected = true;
|
|||
|
FrmDeviceEdit.FormInstance.ShowDialog();
|
|||
|
}
|
|||
|
|
|||
|
private void btNull_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
this.tbAGVGateDeviceIndex.Text = "";
|
|||
|
this.tbChannelsIndex.Text = "";
|
|||
|
this.tbTop.Text = "";
|
|||
|
this.tbLeft.Text = "";
|
|||
|
this.tbAddress.Text = "";
|
|||
|
this.chbInput.Checked = false;
|
|||
|
this.chbOutput.Checked = false;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private void btBack_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
this.Close();
|
|||
|
}
|
|||
|
|
|||
|
private void btSave_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (MessageBox.Show("<22><>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (Information.IsNumeric(this.tbAGVGateDeviceIndex.Text) == false)
|
|||
|
{
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>վ<EFBFBD>㴦<EFBFBD><E3B4A6>Ӧ<EFBFBD><D3A6><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
tbAGVGateDeviceIndex.Focus();
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Information.IsNumeric(this.tbPCS.Text) == false)
|
|||
|
{
|
|||
|
MessageBox.Show("PCSվ<53><D5BE>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
tbPCS.Focus();
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Information.IsNumeric(this.tbChannelsIndex.Text) == false)
|
|||
|
{
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>ͨ<EFBFBD><CDA8>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
this.tbChannelsIndex.Focus();
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Information.IsNumeric(this.tbTop.Text) == false)
|
|||
|
{
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>վ<EFBFBD><D5BE>Y<EFBFBD><59><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
this.tbTop.Focus();
|
|||
|
return;
|
|||
|
}
|
|||
|
if (Information.IsNumeric(this.tbLeft.Text) == false)
|
|||
|
{
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>վ<EFBFBD><D5BE>X<EFBFBD><58><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
this.tbLeft.Focus();
|
|||
|
return;
|
|||
|
}
|
|||
|
//if (Information.IsNumeric(this.tbChanel.Text) == false)
|
|||
|
//{
|
|||
|
// MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
// this.tbChanel.Focus();
|
|||
|
// return;
|
|||
|
//}
|
|||
|
//if (Information.IsNumeric(this.tblayer.Text) == false)
|
|||
|
//{
|
|||
|
// MessageBox.Show("<22><><EFBFBD>ǣֲ<C7A3><D6B2><EFBFBD>ַֻ<D6B7><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
// this.tblayer.Focus();
|
|||
|
// return;
|
|||
|
//}
|
|||
|
if ((this.chbInput.Checked == false) && (this.chbOutput.Checked == false))
|
|||
|
{
|
|||
|
MessageBox.Show("<22><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD>ڡ<EFBFBD><DAA1>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD><DAA1><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
return;
|
|||
|
}
|
|||
|
try
|
|||
|
{//tbChanel.Text.Trim()+";"+tbAddress.Text.Trim()+";"+tblayer.Text.Trim()
|
|||
|
string addr = tbAddress.Text.Trim();
|
|||
|
char inp, outp;
|
|||
|
if (this.chbInput.Checked == true)
|
|||
|
{
|
|||
|
inp = '1';
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
inp = '0';
|
|||
|
}
|
|||
|
if (this.chbOutput.Checked == true)
|
|||
|
{
|
|||
|
outp = '1';
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
outp = '0';
|
|||
|
}
|
|||
|
string sql = "SELECT F_AGVGateDeviceIndex FROM T_Base_Agv_Gate where F_AGVGateDeviceIndex=" + Convert.ToInt32(this.tbAGVGateDeviceIndex.Text);
|
|||
|
DataSet ds = dbo.ExceSQL(sql);
|
|||
|
if ((ds.Tables[0].DefaultView.Count > 0))
|
|||
|
{
|
|||
|
if (IfUpdate == false)
|
|||
|
{
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>վ<EFBFBD>㴦<EFBFBD><E3B4A6>Ӧ<EFBFBD><D3A6><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>벻Ҫ<EBB2BB>ظ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|||
|
this.tbAGVGateDeviceIndex.Focus();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
IfUpdate = false;
|
|||
|
}
|
|||
|
ds.Clear();
|
|||
|
if (IfUpdate == true)
|
|||
|
{
|
|||
|
sql = "UPDATE T_Base_AGV_Gate SET F_ChannelsIndex =" + Convert.ToInt32(this.tbChannelsIndex.Text)
|
|||
|
+ ", F_Address ='" + addr + "',F_Top=" + tbTop.Text + ",F_Left=" + tbLeft.Text + ", F_Input =" + inp +
|
|||
|
", F_Output =" + outp + ",f_pcssite ="+ tbPCS.Text +" where F_AGVGateDeviceIndex=" + Convert.ToInt32(this.tbAGVGateDeviceIndex.Text);
|
|||
|
dbo.ExceSQL(sql);
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>Ϣ<EFBFBD>ijɹ<C4B3><C9B9><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
IfUpdate = false;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
sql = "INSERT INTO T_Base_AGV_Gate(F_AGVGateDeviceIndex, F_ChannelsIndex, F_Address, F_Input, F_Output,F_Top,F_Left,F_PCSSite)VALUES" +
|
|||
|
" (" + Convert.ToInt32(this.tbAGVGateDeviceIndex.Text) + "," + Convert.ToInt32(this.tbChannelsIndex.Text)
|
|||
|
+ ",'" + addr + "'," + inp + "," + outp + "," + tbTop.Text + "," + tbLeft.Text + "," + tbPCS.Text + ")";
|
|||
|
dbo.ExceSQL(sql);
|
|||
|
MessageBox.Show("<22><><EFBFBD>ǣ<EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>Ϣ¼<CFA2><C2BC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|||
|
}
|
|||
|
sql = "SELECT F_AGVGateDeviceIndex AS AGVվ<56>㴦<EFBFBD><E3B4A6>Ӧ<EFBFBD><D3A6><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>,f_devicename as <20>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>,F_ChannelsIndex AS AGVͨ<56><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,F_Address AS " +
|
|||
|
" AGVվ<56><D5BE><EFBFBD><EFBFBD>ַ,F_Input AS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,F_Output AS <20>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>,F_Top as վ<><D5BE>Y<EFBFBD><59><EFBFBD><EFBFBD>,F_Left as վ<><D5BE>X<EFBFBD><58><EFBFBD><EFBFBD>,f_pcssite as PCSվ<53><D5BE>λ<EFBFBD><CEBB> FROM T_Base_AGV_Gate,t_base_device " +
|
|||
|
" where f_deviceindex = f_agvgatedeviceindex and " +
|
|||
|
" F_AGVGateDeviceIndex=" + Convert.ToInt32(this.tbAGVGateDeviceIndex.Text);
|
|||
|
ds = dbo.ExceSQL(sql);
|
|||
|
this.dataGridView1.DataSource = ds.Tables[0].DefaultView ;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw ex;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void btNullQuery_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
this.tbContent.Text = "";
|
|||
|
this.cbField.Text = "";
|
|||
|
}
|
|||
|
|
|||
|
private void btQuery_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
string df, sql;
|
|||
|
if (this.tbContent.Text.Trim() == "") return;
|
|||
|
if (this.cbField.Text == "AGVͨ<56><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
|||
|
{
|
|||
|
df = "F_ChannelsIndex";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
df = "F_AGVGateDeviceIndex";
|
|||
|
}
|
|||
|
sql = "SELECT F_AGVGateDeviceIndex AS AGVվ<56>㴦<EFBFBD><E3B4A6>Ӧ<EFBFBD><D3A6><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>,f_devicename as <20>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>,F_ChannelsIndex AS AGVͨ<56><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,F_Address AS " +
|
|||
|
" AGVվ<56><D5BE><EFBFBD><EFBFBD>ַ,F_Input AS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,F_Output AS <20>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>,F_Top as վ<><D5BE>Y<EFBFBD><59><EFBFBD><EFBFBD>,F_Left as վ<><D5BE>X<EFBFBD><58><EFBFBD><EFBFBD>,f_pcssite as PCSվ<53><D5BE>λ<EFBFBD><CEBB> FROM T_Base_AGV_Gate,t_base_device " +
|
|||
|
" where f_deviceindex = f_agvgatedeviceindex and " +
|
|||
|
df + "= " + Convert.ToInt32(this.tbContent.Text);
|
|||
|
DataSet ds = dbo.ExceSQL(sql);
|
|||
|
this.dataGridView1.DataSource = ds.Tables[0].DefaultView;
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
throw ex;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void tsmEdit_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (dataGridView1.RowCount <= 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
char[] cc = new char[1] { ';' };
|
|||
|
string[] spl;
|
|||
|
spl = this.dataGridView1.CurrentRow.Cells[0].Value.ToString().Split(cc);
|
|||
|
this.tabControl1.SelectTab("tabPage1");
|
|||
|
|
|||
|
this.tbAGVGateDeviceIndex.Text = this.dataGridView1.CurrentRow.Cells[0].Value.ToString() + "";
|
|||
|
this.tbChannelsIndex.Text = this.dataGridView1.CurrentRow.Cells[2].Value.ToString() + "";
|
|||
|
this.tbAddress.Text = this.dataGridView1.CurrentRow.Cells[3].Value.ToString();
|
|||
|
//this.tbChanel.Text = addr[0];
|
|||
|
//this.tbAddress.Text = addr[1];
|
|||
|
//this.tblayer.Text = addr[2];
|
|||
|
if (this.dataGridView1.CurrentRow.Cells[4].Value.ToString() == "1")
|
|||
|
{
|
|||
|
this.chbInput.Checked = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
this.chbInput.Checked = false;
|
|||
|
}
|
|||
|
if (this.dataGridView1.CurrentRow.Cells[5].Value.ToString() == "1")
|
|||
|
{
|
|||
|
this.chbOutput.Checked = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
this.chbOutput.Checked = false;
|
|||
|
}
|
|||
|
this.tbTop.Text = this.dataGridView1.CurrentRow.Cells[6].Value.ToString() + "";
|
|||
|
this.tbLeft.Text = this.dataGridView1.CurrentRow.Cells[7].Value.ToString() + "";
|
|||
|
this .tbPCS.Text = this.dataGridView1.CurrentRow.Cells[8].Value.ToString() + "";
|
|||
|
IfUpdate = true;
|
|||
|
}
|
|||
|
|
|||
|
private void tsmDel_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
if (dataGridView1.RowCount <= 0)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
if (MessageBox.Show("<22><>ȷ<EFBFBD><C8B7>Ҫɾ<D2AA><C9BE>ѡ<EFBFBD><D1A1><EFBFBD>еġ<D0B5><C4A1><EFBFBD><EFBFBD>ǣ<EFBFBD>վ<EFBFBD>㣺" + this.dataGridView1.CurrentRow.Cells[0].Value.ToString() + "<22><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
dbo.ExceSQL("delete from T_Base_Agv_Gate where F_AGVGateDeviceIndex =" + Convert.ToInt32(this.dataGridView1.CurrentRow.Cells[0].Value));
|
|||
|
button2_Click(sender, e);
|
|||
|
}
|
|||
|
|
|||
|
private void button1_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
IfUpdate = false;
|
|||
|
}
|
|||
|
|
|||
|
private void button2_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
string sql = "SELECT F_AGVGateDeviceIndex AS AGVվ<56>㴦<EFBFBD><E3B4A6>Ӧ<EFBFBD><D3A6><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>,f_devicename as <20>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>,F_ChannelsIndex AS AGVͨ<56><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,F_Address AS " +
|
|||
|
" AGVվ<56><D5BE><EFBFBD><EFBFBD>ַ,F_Input AS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,F_Output AS <20>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>,F_Top as վ<><D5BE>Y<EFBFBD><59><EFBFBD><EFBFBD>,F_Left as վ<><D5BE>X<EFBFBD><58><EFBFBD><EFBFBD>,f_pcssite as PCSվ<53><D5BE>λ<EFBFBD><CEBB> FROM T_Base_AGV_Gate,t_base_device where f_deviceindex = f_agvgatedeviceindex";
|
|||
|
DataSet ds = dbo.ExceSQL(sql);
|
|||
|
this.dataGridView1.DataSource = ds.Tables[0].DefaultView;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|