Вроде всё готово и работает.
This commit is contained in:
parent
a8f37756f5
commit
a10ef889f9
135
TransportCompany/TransportCompany/FormCheckTimeJoin.Designer.cs
generated
Normal file
135
TransportCompany/TransportCompany/FormCheckTimeJoin.Designer.cs
generated
Normal file
@ -0,0 +1,135 @@
|
||||
namespace TransportCompany
|
||||
{
|
||||
partial class FormCheckTimeJoin
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
textBoxFirstCheck = new TextBox();
|
||||
groupBoxFirst = new GroupBox();
|
||||
buttonCheckFirstJoin = new Button();
|
||||
groupBoxSecond = new GroupBox();
|
||||
textBoxSecondCheck = new TextBox();
|
||||
buttonCheckSecondJoin = new Button();
|
||||
buttonCancel = new Button();
|
||||
groupBoxFirst.SuspendLayout();
|
||||
groupBoxSecond.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// textBoxFirstCheck
|
||||
//
|
||||
textBoxFirstCheck.Location = new Point(312, 42);
|
||||
textBoxFirstCheck.Name = "textBoxFirstCheck";
|
||||
textBoxFirstCheck.Size = new Size(228, 27);
|
||||
textBoxFirstCheck.TabIndex = 0;
|
||||
//
|
||||
// groupBoxFirst
|
||||
//
|
||||
groupBoxFirst.Controls.Add(buttonCheckFirstJoin);
|
||||
groupBoxFirst.Controls.Add(textBoxFirstCheck);
|
||||
groupBoxFirst.Location = new Point(12, 12);
|
||||
groupBoxFirst.Name = "groupBoxFirst";
|
||||
groupBoxFirst.Size = new Size(580, 91);
|
||||
groupBoxFirst.TabIndex = 1;
|
||||
groupBoxFirst.TabStop = false;
|
||||
groupBoxFirst.Text = "Для первого запроса";
|
||||
//
|
||||
// buttonCheckFirstJoin
|
||||
//
|
||||
buttonCheckFirstJoin.Location = new Point(65, 42);
|
||||
buttonCheckFirstJoin.Name = "buttonCheckFirstJoin";
|
||||
buttonCheckFirstJoin.Size = new Size(195, 29);
|
||||
buttonCheckFirstJoin.TabIndex = 1;
|
||||
buttonCheckFirstJoin.Text = "Произвести замер";
|
||||
buttonCheckFirstJoin.UseVisualStyleBackColor = true;
|
||||
buttonCheckFirstJoin.Click += ButtonCheckFirstJoin_Click;
|
||||
//
|
||||
// groupBoxSecond
|
||||
//
|
||||
groupBoxSecond.Controls.Add(textBoxSecondCheck);
|
||||
groupBoxSecond.Controls.Add(buttonCheckSecondJoin);
|
||||
groupBoxSecond.Location = new Point(12, 109);
|
||||
groupBoxSecond.Name = "groupBoxSecond";
|
||||
groupBoxSecond.Size = new Size(580, 95);
|
||||
groupBoxSecond.TabIndex = 2;
|
||||
groupBoxSecond.TabStop = false;
|
||||
groupBoxSecond.Text = "Для второго запроса";
|
||||
//
|
||||
// textBoxSecondCheck
|
||||
//
|
||||
textBoxSecondCheck.Location = new Point(312, 41);
|
||||
textBoxSecondCheck.Name = "textBoxSecondCheck";
|
||||
textBoxSecondCheck.Size = new Size(228, 27);
|
||||
textBoxSecondCheck.TabIndex = 1;
|
||||
//
|
||||
// buttonCheckSecondJoin
|
||||
//
|
||||
buttonCheckSecondJoin.Location = new Point(65, 41);
|
||||
buttonCheckSecondJoin.Name = "buttonCheckSecondJoin";
|
||||
buttonCheckSecondJoin.Size = new Size(195, 29);
|
||||
buttonCheckSecondJoin.TabIndex = 0;
|
||||
buttonCheckSecondJoin.Text = "Произвести замер";
|
||||
buttonCheckSecondJoin.UseVisualStyleBackColor = true;
|
||||
buttonCheckSecondJoin.Click += ButtonCheckSecondJoin_Click;
|
||||
//
|
||||
// buttonCancel
|
||||
//
|
||||
buttonCancel.Location = new Point(452, 220);
|
||||
buttonCancel.Name = "buttonCancel";
|
||||
buttonCancel.Size = new Size(140, 29);
|
||||
buttonCancel.TabIndex = 3;
|
||||
buttonCancel.Text = "Закрыть";
|
||||
buttonCancel.UseVisualStyleBackColor = true;
|
||||
buttonCancel.Click += ButtonCancel_Click;
|
||||
//
|
||||
// FormCheckTimeJoin
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(8F, 20F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(604, 259);
|
||||
Controls.Add(buttonCancel);
|
||||
Controls.Add(groupBoxSecond);
|
||||
Controls.Add(groupBoxFirst);
|
||||
Name = "FormCheckTimeJoin";
|
||||
Text = "Замер времени сложных запросов";
|
||||
groupBoxFirst.ResumeLayout(false);
|
||||
groupBoxFirst.PerformLayout();
|
||||
groupBoxSecond.ResumeLayout(false);
|
||||
groupBoxSecond.PerformLayout();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private TextBox textBoxFirstCheck;
|
||||
private GroupBox groupBoxFirst;
|
||||
private Button buttonCheckFirstJoin;
|
||||
private GroupBox groupBoxSecond;
|
||||
private TextBox textBoxSecondCheck;
|
||||
private Button buttonCheckSecondJoin;
|
||||
private Button buttonCancel;
|
||||
}
|
||||
}
|
58
TransportCompany/TransportCompany/FormCheckTimeJoin.cs
Normal file
58
TransportCompany/TransportCompany/FormCheckTimeJoin.cs
Normal file
@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using TransportCompanyContracts.BusinessLogicsContracts;
|
||||
|
||||
namespace TransportCompany
|
||||
{
|
||||
public partial class FormCheckTimeJoin : Form
|
||||
{
|
||||
private readonly ITruckingLogic _truckingLogic;
|
||||
|
||||
private readonly IClientLogic _clientLogic;
|
||||
|
||||
public FormCheckTimeJoin(ITruckingLogic truckingLogic, IClientLogic clientLogic)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
_truckingLogic = truckingLogic;
|
||||
_clientLogic = clientLogic;
|
||||
}
|
||||
|
||||
private void ButtonCheckFirstJoin_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
textBoxFirstCheck.Text = _truckingLogic.TestFirstJoin();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void ButtonCheckSecondJoin_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
textBoxSecondCheck.Text = _clientLogic.TestSecondJoin();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void ButtonCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
DialogResult = DialogResult.Cancel;
|
||||
Close();
|
||||
}
|
||||
}
|
||||
}
|
60
TransportCompany/TransportCompany/FormCheckTimeJoin.resx
Normal file
60
TransportCompany/TransportCompany/FormCheckTimeJoin.resx
Normal file
@ -0,0 +1,60 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
@ -39,12 +39,13 @@
|
||||
rndGenerationToolStripMenuItem = new ToolStripMenuItem();
|
||||
generationClientsToolStripMenuItem = new ToolStripMenuItem();
|
||||
generationTruckingsToolStripMenuItem = new ToolStripMenuItem();
|
||||
testTimeGetDataToolStripMenuItem = new ToolStripMenuItem();
|
||||
buttonUpdate = new Button();
|
||||
comboBoxEmails = new ComboBox();
|
||||
label1 = new Label();
|
||||
checkBoxSorted = new CheckBox();
|
||||
checkBoxForFilterMode = new CheckBox();
|
||||
testTimeGetDataToolStripMenuItem = new ToolStripMenuItem();
|
||||
testComplexQueriesToolStripMenuItem = new ToolStripMenuItem();
|
||||
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
|
||||
menuStrip.SuspendLayout();
|
||||
SuspendLayout();
|
||||
@ -72,7 +73,7 @@
|
||||
// menuStrip
|
||||
//
|
||||
menuStrip.ImageScalingSize = new Size(20, 20);
|
||||
menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem, rndGenerationToolStripMenuItem, testTimeGetDataToolStripMenuItem });
|
||||
menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem, rndGenerationToolStripMenuItem, testTimeGetDataToolStripMenuItem, testComplexQueriesToolStripMenuItem });
|
||||
menuStrip.Location = new Point(0, 0);
|
||||
menuStrip.Name = "menuStrip";
|
||||
menuStrip.Padding = new Padding(6, 3, 0, 3);
|
||||
@ -136,6 +137,13 @@
|
||||
generationTruckingsToolStripMenuItem.Text = "Генерация перевозок";
|
||||
generationTruckingsToolStripMenuItem.Click += GenerationTruckingsToolStripMenuItem_Click;
|
||||
//
|
||||
// testTimeGetDataToolStripMenuItem
|
||||
//
|
||||
testTimeGetDataToolStripMenuItem.Name = "testTimeGetDataToolStripMenuItem";
|
||||
testTimeGetDataToolStripMenuItem.Size = new Size(227, 24);
|
||||
testTimeGetDataToolStripMenuItem.Text = "Тест скорости чтения данных";
|
||||
testTimeGetDataToolStripMenuItem.Click += TestTimeGetDataToolStripMenuItem_Click;
|
||||
//
|
||||
// buttonUpdate
|
||||
//
|
||||
buttonUpdate.Location = new Point(1014, 138);
|
||||
@ -185,12 +193,12 @@
|
||||
checkBoxForFilterMode.Text = "Включить режим фильтра";
|
||||
checkBoxForFilterMode.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// testTimeGetDataToolStripMenuItem
|
||||
// testComplexQueriesToolStripMenuItem
|
||||
//
|
||||
testTimeGetDataToolStripMenuItem.Name = "testTimeGetDataToolStripMenuItem";
|
||||
testTimeGetDataToolStripMenuItem.Size = new Size(227, 24);
|
||||
testTimeGetDataToolStripMenuItem.Text = "Тест скорости чтения данных";
|
||||
testTimeGetDataToolStripMenuItem.Click += TestTimeGetDataToolStripMenuItem_Click;
|
||||
testComplexQueriesToolStripMenuItem.Name = "testComplexQueriesToolStripMenuItem";
|
||||
testComplexQueriesToolStripMenuItem.Size = new Size(188, 24);
|
||||
testComplexQueriesToolStripMenuItem.Text = "Тест сложных запросов";
|
||||
testComplexQueriesToolStripMenuItem.Click += TestComplexQueriesToolStripMenuItem_Click;
|
||||
//
|
||||
// FormTrucking
|
||||
//
|
||||
@ -248,5 +256,6 @@
|
||||
private CheckBox checkBoxSorted;
|
||||
private CheckBox checkBoxForFilterMode;
|
||||
private ToolStripMenuItem testTimeGetDataToolStripMenuItem;
|
||||
private ToolStripMenuItem testComplexQueriesToolStripMenuItem;
|
||||
}
|
||||
}
|
@ -176,5 +176,16 @@ namespace TransportCompany
|
||||
LoadData();
|
||||
}
|
||||
}
|
||||
|
||||
private void TestComplexQueriesToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var service = Program.ServiceProvider?.GetService(typeof(FormCheckTimeJoin));
|
||||
|
||||
if (service is FormCheckTimeJoin form)
|
||||
{
|
||||
form.ShowDialog();
|
||||
LoadData();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -62,6 +62,7 @@ namespace TransportCompany
|
||||
services.AddTransient<FormRandomCreateClient>();
|
||||
services.AddTransient<FormRandomCreateTrucking>();
|
||||
services.AddTransient<FormTimeCheck>();
|
||||
services.AddTransient<FormCheckTimeJoin>();
|
||||
}
|
||||
}
|
||||
}
|
@ -80,12 +80,18 @@ namespace TransportCompanyBusinessLogic.BusinessLogic
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//для замера времени рандомного добавления
|
||||
public string TestRandomCreate(int count, string[] _name, string[] _surname, string[] _patronymic, string[] _telephone, string[] _email)
|
||||
{
|
||||
return _clientStorage.TestRandomInsert(count, _name, _surname, _patronymic, _telephone, _email);
|
||||
}
|
||||
|
||||
//для проверки времени выполнения сложного запроса
|
||||
public string TestSecondJoin()
|
||||
{
|
||||
return _clientStorage.SecondJoin();
|
||||
}
|
||||
|
||||
public bool Update(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
@ -99,7 +105,7 @@ namespace TransportCompanyBusinessLogic.BusinessLogic
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Delete(ClientBindingModel model)
|
||||
public bool Delete(ClientBindingModel model)
|
||||
{
|
||||
CheckModel(model, false);
|
||||
|
||||
|
@ -92,6 +92,12 @@ namespace TransportCompanyBusinessLogic.BusinessLogic
|
||||
return _truckingStorage.TestRandomInsert(count, clients, cargos, transports, transportations);
|
||||
}
|
||||
|
||||
//первый сложный запрос
|
||||
public string? TestFirstJoin()
|
||||
{
|
||||
return _truckingStorage.FirstJoin();
|
||||
}
|
||||
|
||||
public bool Update(TruckingBindingModel model)
|
||||
{
|
||||
CheckModel(model);
|
||||
|
@ -19,6 +19,8 @@ namespace TransportCompanyContracts.BusinessLogicsContracts
|
||||
|
||||
string TestRandomCreate(int count, string[] _name, string[] _surname, string[] _patronymic, string[] _telephone, string[] _email);
|
||||
|
||||
string TestSecondJoin();
|
||||
|
||||
bool Update(ClientBindingModel model);
|
||||
|
||||
bool Delete(ClientBindingModel model);
|
||||
|
@ -15,6 +15,8 @@ namespace TransportCompanyContracts.BusinessLogicsContracts
|
||||
|
||||
string? TestReadList();
|
||||
|
||||
string? TestFirstJoin();
|
||||
|
||||
TruckingViewModel? ReadElement(TruckingSearchModel model);
|
||||
|
||||
bool Create(TruckingBindingModel model);
|
||||
|
@ -21,6 +21,8 @@ namespace TransportCompanyContracts.StoragesContracts
|
||||
|
||||
string TestRandomInsert(int count, string[] _name, string[] _surname, string[] _patronymic, string[] _telephone, string[] _email);
|
||||
|
||||
string SecondJoin();
|
||||
|
||||
ClientViewModel? Update(ClientBindingModel model);
|
||||
|
||||
ClientViewModel? Delete(ClientBindingModel model);
|
||||
|
@ -15,6 +15,8 @@ namespace TransportCompanyContracts.StoragesContracts
|
||||
|
||||
string TestGetFullList();
|
||||
|
||||
string FirstJoin();
|
||||
|
||||
List<TruckingViewModel> GetFilteredList(TruckingSearchModel model);
|
||||
|
||||
TruckingViewModel? GetElement(TruckingSearchModel model);
|
||||
|
@ -111,6 +111,46 @@ namespace TransportCompanyDatabaseImplements.Implements
|
||||
return stopwatch.ElapsedMilliseconds.ToString();
|
||||
}
|
||||
|
||||
|
||||
public string SecondJoin()
|
||||
{
|
||||
using var context = new ElegevContext();
|
||||
|
||||
Random rnd = new Random(DateTime.Now.ToString().GetHashCode());
|
||||
|
||||
//старт замера времени добавления в бд
|
||||
Stopwatch stopwatch = new();
|
||||
|
||||
stopwatch.Start();
|
||||
|
||||
var secondJoin = from t in context.Set<Trucking>()
|
||||
from c in context.Set<Client>().Where(c => c.Id == t.ClientId)
|
||||
select new { c, t };
|
||||
|
||||
//ВСЁ ГОТОВО ДЛЯ СЛЕДУЮЩЕГО ЗАМЕРА
|
||||
|
||||
foreach (var element in secondJoin)
|
||||
{
|
||||
element.t.Update(new TruckingBindingModel
|
||||
{
|
||||
Id = element.t.Id,
|
||||
ClientId = element.t.ClientId,
|
||||
CargoId = element.t.CargoId,
|
||||
Price = element.t.Price,
|
||||
DateStart = element.t.DateStart.AddDays(-10),
|
||||
DateEnd = element.t.DateEnd.AddDays(-10),
|
||||
TransportationId = element.t.TransportationId,
|
||||
TransportId = element.t.TransportId,
|
||||
});
|
||||
}
|
||||
|
||||
context.SaveChanges();
|
||||
|
||||
stopwatch.Stop();
|
||||
|
||||
return stopwatch.ElapsedMilliseconds.ToString();
|
||||
}
|
||||
|
||||
public ClientViewModel? Update(ClientBindingModel model)
|
||||
{
|
||||
using var context = new ElegevContext();
|
||||
|
@ -198,5 +198,46 @@ namespace TransportCompanyDatabaseImplements.Implements
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
//первый сложный запрос
|
||||
public string FirstJoin()
|
||||
{
|
||||
using var context = new ElegevContext();
|
||||
|
||||
Random rnd = new Random(DateTime.Now.ToString().GetHashCode());
|
||||
|
||||
//старт замера времени добавления в бд
|
||||
Stopwatch stopwatch = new();
|
||||
|
||||
stopwatch.Start();
|
||||
|
||||
var firstJoin = from t in context.Set<Trucking>().Where(t => t.Price == 1200000.0)
|
||||
from c in context.Set<Client>().Where(c => c.Id == t.ClientId)
|
||||
select new { t, c };
|
||||
|
||||
//ВСЁ ГОТОВО ДЛЯ СЛЕДУЮЩЕГО ЗАМЕРА
|
||||
// 999999.0
|
||||
|
||||
foreach (var element in firstJoin)
|
||||
{
|
||||
element.t.Update(new TruckingBindingModel
|
||||
{
|
||||
Id = element.t.Id,
|
||||
ClientId = element.t.ClientId,
|
||||
CargoId = element.t.CargoId,
|
||||
Price = 999999.0,
|
||||
DateStart = element.t.DateStart,
|
||||
DateEnd = element.t.DateEnd,
|
||||
TransportationId = element.t.TransportationId,
|
||||
TransportId = element.t.TransportId,
|
||||
});
|
||||
}
|
||||
|
||||
context.SaveChanges();
|
||||
|
||||
stopwatch.Stop();
|
||||
|
||||
return stopwatch.ElapsedMilliseconds.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user