From dbebbf9cc75c8f6585185f5fe71183af8e7a9bea Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 May 2023 12:55:45 +0200 Subject: [PATCH 01/15] Fix IIS deploy --- .../Properties/PublishProfiles/IIS01.pubxml | 27 +++++++++++++++++++ .../Properties/PublishProfiles/IIS02.pubxml | 27 +++++++++++++++++++ .../Properties/PublishProfiles/IIS03.pubxml | 27 +++++++++++++++++++ .../PublishProfiles/IISProfile.pubxml | 19 +++++++++++++ MapoDataFiller.sln | 25 +++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 ConfMan.IOB.UI/Properties/PublishProfiles/IIS01.pubxml create mode 100644 ConfMan.IOB.UI/Properties/PublishProfiles/IIS02.pubxml create mode 100644 ConfMan.IOB.UI/Properties/PublishProfiles/IIS03.pubxml create mode 100644 ConfMan.IOB.UI/Properties/PublishProfiles/IISProfile.pubxml create mode 100644 MapoDataFiller.sln diff --git a/ConfMan.IOB.UI/Properties/PublishProfiles/IIS01.pubxml b/ConfMan.IOB.UI/Properties/PublishProfiles/IIS01.pubxml new file mode 100644 index 0000000..c036a25 --- /dev/null +++ b/ConfMan.IOB.UI/Properties/PublishProfiles/IIS01.pubxml @@ -0,0 +1,27 @@ + + + + + MSDeploy + true + Release + Any CPU + https://iis01.egalware.com/MP/CONF + false + c2109e71-4eae-4167-9052-175123ccc2bc + false + https://iis01.egalware.com:8172/MsDeploy.axd + Default Web Site/MP/CONF + + false + WMSVC + true + true + jenkins + <_SavePWD>true + <_TargetId>IISWebDeploy + net6.0 + + \ No newline at end of file diff --git a/ConfMan.IOB.UI/Properties/PublishProfiles/IIS02.pubxml b/ConfMan.IOB.UI/Properties/PublishProfiles/IIS02.pubxml new file mode 100644 index 0000000..5639ba6 --- /dev/null +++ b/ConfMan.IOB.UI/Properties/PublishProfiles/IIS02.pubxml @@ -0,0 +1,27 @@ + + + + + MSDeploy + true + Release + Any CPU + https://iis02.egalware.com/MP/CONF + false + c2109e71-4eae-4167-9052-175123ccc2bc + false + https://iis02.egalware.com:8172/MsDeploy.axd + Default Web Site/MP/CONF + + false + WMSVC + true + true + jenkins + <_SavePWD>true + <_TargetId>IISWebDeploy + net6.0 + + \ No newline at end of file diff --git a/ConfMan.IOB.UI/Properties/PublishProfiles/IIS03.pubxml b/ConfMan.IOB.UI/Properties/PublishProfiles/IIS03.pubxml new file mode 100644 index 0000000..4b0aa4d --- /dev/null +++ b/ConfMan.IOB.UI/Properties/PublishProfiles/IIS03.pubxml @@ -0,0 +1,27 @@ + + + + + MSDeploy + true + Release + Any CPU + https://iis03.egalware.com/MP/CONF + false + c2109e71-4eae-4167-9052-175123ccc2bc + false + https://iis03.egalware.com:8172/MsDeploy.axd + Default Web Site/MP/CONF + + false + WMSVC + true + true + jenkins + <_SavePWD>true + <_TargetId>IISWebDeploy + net6.0 + + \ No newline at end of file diff --git a/ConfMan.IOB.UI/Properties/PublishProfiles/IISProfile.pubxml b/ConfMan.IOB.UI/Properties/PublishProfiles/IISProfile.pubxml new file mode 100644 index 0000000..9d7fb2c --- /dev/null +++ b/ConfMan.IOB.UI/Properties/PublishProfiles/IISProfile.pubxml @@ -0,0 +1,19 @@ + + + + + Package + Release + Any CPU + + true + false + c2109e71-4eae-4167-9052-175123ccc2bc + bin\publish\MP.CONF.zip + true + Default Web Site/MP/CONF + <_TargetId>IISWebDeployPackage + + \ No newline at end of file diff --git a/MapoDataFiller.sln b/MapoDataFiller.sln new file mode 100644 index 0000000..b31717e --- /dev/null +++ b/MapoDataFiller.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33530.505 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MapoDataFiller", "MapoDataFiller\MapoDataFiller.csproj", "{28FCC5FB-4A82-4251-A547-C233BAF1FB5A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {28FCC5FB-4A82-4251-A547-C233BAF1FB5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28FCC5FB-4A82-4251-A547-C233BAF1FB5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28FCC5FB-4A82-4251-A547-C233BAF1FB5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28FCC5FB-4A82-4251-A547-C233BAF1FB5A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A1A70B19-B422-435B-9391-86897FA78BC8} + EndGlobalSection +EndGlobal From 8643e573690a410ad1cb603bf2d21f9af9e268b8 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 May 2023 12:55:47 +0200 Subject: [PATCH 02/15] Bozza progetto dataFiller x interclays --- MapoDataFiller/MConf.cs | 48 ++++++++++++++++++++++++++++ MapoDataFiller/MapoDataFiller.csproj | 15 +++++++++ MapoDataFiller/Program.cs | 28 ++++++++++++++++ MapoDataFiller/conf.yaml | 3 ++ 4 files changed, 94 insertions(+) create mode 100644 MapoDataFiller/MConf.cs create mode 100644 MapoDataFiller/MapoDataFiller.csproj create mode 100644 MapoDataFiller/Program.cs create mode 100644 MapoDataFiller/conf.yaml diff --git a/MapoDataFiller/MConf.cs b/MapoDataFiller/MConf.cs new file mode 100644 index 0000000..428c5c4 --- /dev/null +++ b/MapoDataFiller/MConf.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using YamlDotNet.Serialization.NamingConventions; +using YamlDotNet.Serialization; +using System.Reflection.Metadata; + +namespace MapoDataFiller +{ + public class MConf + { + public string DaySetupFile { get; set; } = ""; + public string FillMode { get; set; } = ""; + public bool HasHeader { get; set; } = false; + + public MConf() + { + this.DaySetupFile = @"C:\temp\Interclays\Interclays02.csv"; + this.FillMode = "NONE"; + this.HasHeader = false; + } + } + public class CMan + { + /// + /// Deserializza dato filePath + /// + /// + public static MConf readConf(string filePath) + { + MConf retObj = new MConf(); + if (File.Exists(filePath)) + { + var deserializer = new DeserializerBuilder() + .WithNamingConvention(new PascalCaseNamingConvention()) + .Build(); + string rawData = File.ReadAllText(filePath); + + var input = new StringReader(rawData); + retObj = deserializer.Deserialize(input); + } + return retObj; + } + } +} diff --git a/MapoDataFiller/MapoDataFiller.csproj b/MapoDataFiller/MapoDataFiller.csproj new file mode 100644 index 0000000..2f008bb --- /dev/null +++ b/MapoDataFiller/MapoDataFiller.csproj @@ -0,0 +1,15 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + diff --git a/MapoDataFiller/Program.cs b/MapoDataFiller/Program.cs new file mode 100644 index 0000000..51d5a0b --- /dev/null +++ b/MapoDataFiller/Program.cs @@ -0,0 +1,28 @@ +// See https://aka.ms/new-console-template for more information +using MapoDataFiller; +using Spectre.Console; + + +AnsiConsole.Write( + new FigletText("MapoDataFiller") + .LeftAligned() + .Color(Color.Blue1)); +var rule = new Rule("[green]Setup data[/]"); +rule.Alignment = Justify.Left; +AnsiConsole.Write(rule); + +// recupero configurazione... +MConf currConf = new MConf(); +if (File.Exists("conf.yaml")) +{ + currConf = CMan.readConf("conf.yaml"); +} +AnsiConsole.WriteLine(); +AnsiConsole.MarkupLineInterpolated($"Conf FillMode: [yellow]{currConf.FillMode}[/]"); +var typeOk = AnsiConsole.Confirm("Confermi FillMode?"); +while (!typeOk) +{ + currConf.FillMode = AnsiConsole.Ask("Inserisci il modo desiderato:"); + AnsiConsole.WriteLine(currConf.FillMode); + typeOk = AnsiConsole.Confirm("Confermi FillMode?"); +} \ No newline at end of file diff --git a/MapoDataFiller/conf.yaml b/MapoDataFiller/conf.yaml new file mode 100644 index 0000000..d2f1011 --- /dev/null +++ b/MapoDataFiller/conf.yaml @@ -0,0 +1,3 @@ +DaySetupFile: C:\temp\Interclays +FillMode: Interclays-02 +HasHeader: true \ No newline at end of file From 21af7a1423a7047f788778b455eb9a547001149d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 May 2023 17:07:16 +0200 Subject: [PATCH 03/15] update obj sim x interclays --- MapoDataFiller/DayConf.cs | 43 +++++++++++++++++ MapoDataFiller/Filler/InterClays.cs | 26 ++++++++++ MapoDataFiller/MConf.cs | 14 ++++-- MapoDataFiller/MapoDataFiller.csproj | 6 +++ MapoDataFiller/Program.cs | 72 ++++++++++++++++++++++++++-- MapoDataFiller/conf.yaml | 10 ++-- 6 files changed, 161 insertions(+), 10 deletions(-) create mode 100644 MapoDataFiller/DayConf.cs create mode 100644 MapoDataFiller/Filler/InterClays.cs diff --git a/MapoDataFiller/DayConf.cs b/MapoDataFiller/DayConf.cs new file mode 100644 index 0000000..668d438 --- /dev/null +++ b/MapoDataFiller/DayConf.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MapoDataFiller +{ + public class DayConf + { + public DateTime dtStart { get; set; } = DateTime.Today; + public DateTime dtEnd { get; set; } = DateTime.Today.AddDays(1); + + /// + /// Init di default + /// + public DayConf() + { } + + /// + /// restituisce un oggetto DayConf data stringa raw + cod formato + /// + /// Formato della stringa dati... es CsvDateDur --> data;ora;durata + /// + public DayConf(string formato, string rawData) + { + string pattern = "dd/MM/YYYY"; + var cultInfo = new CultureInfo("it-IT"); + double numOre = 0; + if (formato == "CsvDateDur") + { + var dBlock = rawData.Split(";"); + var datePart = dBlock[0].Split(' '); + string dateForm = $"{datePart[1]} {dBlock[1].Replace(".", ":")}"; + dtStart = DateTime.Parse(dateForm, cultInfo); + // ora fine... + double.TryParse(dBlock[2], out numOre); + dtEnd = dtStart.AddHours(numOre); + } + } + } +} diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs new file mode 100644 index 0000000..d5f5b8f --- /dev/null +++ b/MapoDataFiller/Filler/InterClays.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MapoDataFiller.Filler +{ + public class InterClays + { + + /// + /// Restituisce elenco righe da caricare sul DB dato periodo indicato + /// + /// + /// + /// + /// + public List GetDataRows(string fillMode, string fileOutReq, DayConf currDay) + { + List rows = new List(); + + return rows; + } + } +} diff --git a/MapoDataFiller/MConf.cs b/MapoDataFiller/MConf.cs index 428c5c4..4144717 100644 --- a/MapoDataFiller/MConf.cs +++ b/MapoDataFiller/MConf.cs @@ -12,15 +12,21 @@ namespace MapoDataFiller { public class MConf { - public string DaySetupFile { get; set; } = ""; + public string ConfDir { get; set; } = ""; public string FillMode { get; set; } = ""; public bool HasHeader { get; set; } = false; + public string FileOutReq { get; set; } = ""; + public string TimeTable { get; set; } = ""; + public string OutFolder { get; set; } = ""; public MConf() { - this.DaySetupFile = @"C:\temp\Interclays\Interclays02.csv"; - this.FillMode = "NONE"; - this.HasHeader = false; + ConfDir = @"C:\temp\Interclays\"; + FillMode = "NONE"; + HasHeader = false; + FileOutReq = "FL"; + TimeTable = "Demo.csv"; + OutFolder = @"C:\temp\Interclays\Out"; } } public class CMan diff --git a/MapoDataFiller/MapoDataFiller.csproj b/MapoDataFiller/MapoDataFiller.csproj index 2f008bb..23e2786 100644 --- a/MapoDataFiller/MapoDataFiller.csproj +++ b/MapoDataFiller/MapoDataFiller.csproj @@ -12,4 +12,10 @@ + + + Always + + + diff --git a/MapoDataFiller/Program.cs b/MapoDataFiller/Program.cs index 51d5a0b..c804a96 100644 --- a/MapoDataFiller/Program.cs +++ b/MapoDataFiller/Program.cs @@ -1,5 +1,6 @@ // See https://aka.ms/new-console-template for more information using MapoDataFiller; +using MapoDataFiller.Filler; using Spectre.Console; @@ -18,11 +19,76 @@ if (File.Exists("conf.yaml")) currConf = CMan.readConf("conf.yaml"); } AnsiConsole.WriteLine(); + +AnsiConsole.MarkupLineInterpolated($"Conf ConfDir: [yellow]{currConf.ConfDir}[/]"); +var pathOk = AnsiConsole.Confirm("Confermi ConfDir?"); +while (!pathOk) +{ + currConf.ConfDir = AnsiConsole.Ask("Inserisci ConfDir desiderato:"); + AnsiConsole.WriteLine(currConf.ConfDir); + pathOk = AnsiConsole.Confirm("Confermi ConfDir?"); +} + AnsiConsole.MarkupLineInterpolated($"Conf FillMode: [yellow]{currConf.FillMode}[/]"); -var typeOk = AnsiConsole.Confirm("Confermi FillMode?"); -while (!typeOk) +var fillOK = AnsiConsole.Confirm("Confermi FillMode?"); +while (!fillOK) { currConf.FillMode = AnsiConsole.Ask("Inserisci il modo desiderato:"); AnsiConsole.WriteLine(currConf.FillMode); - typeOk = AnsiConsole.Confirm("Confermi FillMode?"); + fillOK = AnsiConsole.Confirm("Confermi FillMode?"); +} + +AnsiConsole.MarkupLineInterpolated($"Conf HasHeader: [yellow]{currConf.HasHeader}[/]"); +var headOK = AnsiConsole.Confirm("Confermi HasHeader?"); +while (!headOK) +{ + currConf.HasHeader = AnsiConsole.Ask("HasHeader (true/false)?"); + AnsiConsole.WriteLine(currConf.HasHeader); + headOK = AnsiConsole.Confirm("Confermi HasHeader?"); +} + +// verifico se devo generare i file... +if (currConf.FileOutReq == "FL") +{ + // leggo timetable + string filePath = Path.Combine(currConf.ConfDir, currConf.TimeTable); + if (File.Exists(filePath)) + { + var righe = File.ReadAllLines(filePath).ToList(); + // se devo saltare + if (currConf.HasHeader) + { + righe = righe.Skip(1).ToList(); + } + // svuoto cartella output + if(!Directory.Exists(currConf.OutFolder)) + { + Directory.CreateDirectory(currConf.OutFolder); + } + var fileList = Directory.GetFiles(currConf.OutFolder); + foreach ( var file in fileList ) + { + File.Delete(file); + } + + // verifico quale oggetto sim avviare... x ora SOLO interclays + InterClays currSim = new InterClays(); + // ciclo su ogni record + foreach (var riga in righe) + { + // recupero dati del giorno corrente + var giornata = new DayConf("CsvDateDur", riga); + + var elencoRighe = currSim.GetDataRows(currConf.FillMode, currConf.FileOutReq, giornata); + // scrivo sul file mensile i dati del singolo giorno... + string monthFile = Path.Combine("", $"{currConf.FillMode}_{currConf.FileOutReq}_{giornata.dtStart:yyyy-MM}.csv"); + string fileOutPath=Path.Combine(currConf.OutFolder, monthFile); + if(!File.Exists(fileOutPath)) + { + File.Create(fileOutPath); + } + // vado in append... + File.AppendAllLines(fileOutPath, elencoRighe); + } + } } \ No newline at end of file diff --git a/MapoDataFiller/conf.yaml b/MapoDataFiller/conf.yaml index d2f1011..a185368 100644 --- a/MapoDataFiller/conf.yaml +++ b/MapoDataFiller/conf.yaml @@ -1,3 +1,7 @@ -DaySetupFile: C:\temp\Interclays -FillMode: Interclays-02 -HasHeader: true \ No newline at end of file +--- +ConfDir: C:\temp\Interclays +FillMode: Interclays02 +HasHeader: true +FileOutReq: FL +TimeTable: Interclays02.csv +OutFolder: C:\temp\Interclays\Out From b11f14b235b57aa9a7bf7e4b4f07fdf96eae2b00 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 May 2023 18:48:29 +0200 Subject: [PATCH 04/15] Bozza generazione dati FL da testare... --- MapoDataFiller/Filler/InterClays.cs | 86 ++++++++++++++++++++++++++++- MapoDataFiller/SimBlock.cs | 12 ++++ 2 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 MapoDataFiller/SimBlock.cs diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index d5f5b8f..1b529d1 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -8,6 +8,19 @@ namespace MapoDataFiller.Filler { public class InterClays { + protected int valStep = 10; + protected int valMin = 500; + protected int valMax = 15000; + protected int numSec = 30; + protected int stepMin = 50; + protected int stepMax = 150; + + protected int waitMin = 10; + protected int waitMax = 240; + + protected int numPerMax = 50; + + protected Random rnd = new Random(); /// /// Restituisce elenco righe da caricare sul DB dato periodo indicato @@ -16,11 +29,80 @@ namespace MapoDataFiller.Filler /// /// /// - public List GetDataRows(string fillMode, string fileOutReq, DayConf currDay) + public SimBlock GetDataRows(string fillMode, string fileOutReq, DayConf currDay) + { + SimBlock answ = new SimBlock(); + List flRows = new List(); + List evRows = new List(); + int idxEv = 0; + int idxFl = 0; + bool doProd = false; + int valReq = 0; + int valAct = 0; + // simulo periodi + int numPer = rnd.Next(10, numPerMax); + // calcolo durata media periodi in minuti + double avgDurPer = (currDay.dtEnd.Subtract(currDay.dtStart).TotalMinutes) / numPer; + double preDelay = avgDurPer / 2; + // imposto cursore + DateTime dtStart = currDay.dtStart.AddMinutes(preDelay); + DateTime dtEnd = currDay.dtEnd; + // per prima cosa aggiungo start dopo un delay di max 1/2 periodo... + flRows.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl}"); + evRows.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;-;1;{idxEv}"); + // calcolo durata successivi + while (dtEnd < currDay.dtEnd) + { + dtStart = dtStart.AddSeconds(30); + dtEnd = dtStart.AddMinutes(avgDurPer * rnd.Next(600, 1400) / 1000); + // tiro a dadi x decidere SE ho pesate nel periodo... 5% dei casi + doProd = (rnd.Next(0, 100) <= 5); + + /*---------------------------------------- + // Gestione FluxLOG + ----------------------------------------*/ + // SE ho pesate --> genero target + valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; + valAct = valReq + rnd.Next(0, valStep) * valStep; + // genero righe x periodo e sommo + var nextRows = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, valAct, ref idxFl); + // sommo righe + answ.FlList.AddRange(nextRows); + + /*---------------------------------------- + // Gestione EventList + ----------------------------------------*/ + } + // ritorno + answ.EvList = evRows; + answ.FlList = flRows; + return answ; + } + + protected List IC_OX_getFlRows(DateTime dtStart, DateTime dtEnd, bool doProd, int valReq, int valTo, ref int idxCount) { List rows = new List(); - + DateTime dtCurs = dtStart; + string currRow = ""; + int valCurr = 0; + // genera i dati secondo lo schema configurato... + while (dtCurs < dtEnd) + { + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgImp;{valReq};{idxCount++}"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 300)); + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valReq};{idxCount++}"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(27000, 33000)); + // incremento peso... SE <= max... + if (valCurr < valTo) + { + valCurr += rnd.Next(stepMin, stepMax); + } + } return rows; } + + } } diff --git a/MapoDataFiller/SimBlock.cs b/MapoDataFiller/SimBlock.cs new file mode 100644 index 0000000..80e5262 --- /dev/null +++ b/MapoDataFiller/SimBlock.cs @@ -0,0 +1,12 @@ +namespace MapoDataFiller +{ + public class SimBlock + { + #region Public Properties + + public List EvList { get; set; } = new List(); + public List FlList { get; set; } = new List(); + + #endregion Public Properties + } +} \ No newline at end of file From f54381038531dddcb4a4d87de54c71439deacb39 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 May 2023 19:28:01 +0200 Subject: [PATCH 05/15] OK x sim file fluxlog --- MapoDataFiller/Filler/InterClays.cs | 73 ++++++++++++++++--------- MapoDataFiller/MConf.cs | 2 - MapoDataFiller/Program.cs | 85 +++++++++++++++-------------- MapoDataFiller/conf.yaml | 1 - 4 files changed, 91 insertions(+), 70 deletions(-) diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index 1b529d1..dea50f4 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -26,19 +26,16 @@ namespace MapoDataFiller.Filler /// Restituisce elenco righe da caricare sul DB dato periodo indicato /// /// - /// /// /// - public SimBlock GetDataRows(string fillMode, string fileOutReq, DayConf currDay) + public SimBlock GetDataRows(string fillMode, DayConf currDay) { SimBlock answ = new SimBlock(); - List flRows = new List(); - List evRows = new List(); int idxEv = 0; int idxFl = 0; bool doProd = false; int valReq = 0; - int valAct = 0; + int valCurr = 0; // simulo periodi int numPer = rnd.Next(10, numPerMax); // calcolo durata media periodi in minuti @@ -46,59 +43,85 @@ namespace MapoDataFiller.Filler double preDelay = avgDurPer / 2; // imposto cursore DateTime dtStart = currDay.dtStart.AddMinutes(preDelay); - DateTime dtEnd = currDay.dtEnd; + DateTime dtEnd = dtStart; // per prima cosa aggiungo start dopo un delay di max 1/2 periodo... - flRows.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl}"); - evRows.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;-;1;{idxEv}"); + answ.FlList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl}"); + answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv}] 00;0;-"); // calcolo durata successivi while (dtEnd < currDay.dtEnd) { - dtStart = dtStart.AddSeconds(30); + dtStart = dtEnd.AddSeconds(rnd.Next(25,35)); dtEnd = dtStart.AddMinutes(avgDurPer * rnd.Next(600, 1400) / 1000); - // tiro a dadi x decidere SE ho pesate nel periodo... 5% dei casi - doProd = (rnd.Next(0, 100) <= 5); + // verifico se DEVO finire caricamento... + if (valCurr < valReq) + { + doProd = true; + } + else + { - /*---------------------------------------- - // Gestione FluxLOG - ----------------------------------------*/ - // SE ho pesate --> genero target - valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; - valAct = valReq + rnd.Next(0, valStep) * valStep; + // tiro a dadi x decidere SE ho pesate nel periodo... 5% dei casi + doProd = (rnd.Next(0, 100) <= 5); + + // FluxLOG: SE ho pesate --> genero target + valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; + } // genero righe x periodo e sommo - var nextRows = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, valAct, ref idxFl); + var nextRows = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); // sommo righe answ.FlList.AddRange(nextRows); + + + /*---------------------------------------- // Gestione EventList ----------------------------------------*/ + } + + // aggiungo chiusura eventi... + dtStart = dtEnd.AddSeconds(rnd.Next(25, 35)); + answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxEv}++] 01;0;-"); + dtStart = dtEnd.AddSeconds(rnd.Next(80, 180)); + answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv}++] 00;0;-"); + // ritorno - answ.EvList = evRows; - answ.FlList = flRows; return answ; } - - protected List IC_OX_getFlRows(DateTime dtStart, DateTime dtEnd, bool doProd, int valReq, int valTo, ref int idxCount) + /// + /// Simulo un blocco dati FL + /// + /// + /// + /// + /// + /// + /// + /// + protected List IC_OX_getFlRows(DateTime dtStart, DateTime dtEnd, bool doProd, int valReq, ref int idxCount, ref int valCurr) { List rows = new List(); DateTime dtCurs = dtStart; + int valTo = doProd ? valReq + rnd.Next(0, valStep) * valStep : 0; + valCurr = valReq > 0 ? valCurr : 0; string currRow = ""; - int valCurr = 0; // genera i dati secondo lo schema configurato... while (dtCurs < dtEnd) { currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgImp;{valReq};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 300)); - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valReq};{idxCount++}"; + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valCurr};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(27000, 33000)); // incremento peso... SE <= max... if (valCurr < valTo) { - valCurr += rnd.Next(stepMin, stepMax); + valCurr += rnd.Next(stepMin / valStep, stepMax / valStep) * valStep; } + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; } return rows; } diff --git a/MapoDataFiller/MConf.cs b/MapoDataFiller/MConf.cs index 4144717..22c5366 100644 --- a/MapoDataFiller/MConf.cs +++ b/MapoDataFiller/MConf.cs @@ -15,7 +15,6 @@ namespace MapoDataFiller public string ConfDir { get; set; } = ""; public string FillMode { get; set; } = ""; public bool HasHeader { get; set; } = false; - public string FileOutReq { get; set; } = ""; public string TimeTable { get; set; } = ""; public string OutFolder { get; set; } = ""; @@ -24,7 +23,6 @@ namespace MapoDataFiller ConfDir = @"C:\temp\Interclays\"; FillMode = "NONE"; HasHeader = false; - FileOutReq = "FL"; TimeTable = "Demo.csv"; OutFolder = @"C:\temp\Interclays\Out"; } diff --git a/MapoDataFiller/Program.cs b/MapoDataFiller/Program.cs index c804a96..f209a4e 100644 --- a/MapoDataFiller/Program.cs +++ b/MapoDataFiller/Program.cs @@ -47,48 +47,49 @@ while (!headOK) headOK = AnsiConsole.Confirm("Confermi HasHeader?"); } -// verifico se devo generare i file... -if (currConf.FileOutReq == "FL") +// leggo timetable +string filePath = Path.Combine(currConf.ConfDir, currConf.TimeTable); +if (File.Exists(filePath)) { - // leggo timetable - string filePath = Path.Combine(currConf.ConfDir, currConf.TimeTable); - if (File.Exists(filePath)) + var righe = File.ReadAllLines(filePath).ToList(); + // se devo saltare + if (currConf.HasHeader) { - var righe = File.ReadAllLines(filePath).ToList(); - // se devo saltare - if (currConf.HasHeader) - { - righe = righe.Skip(1).ToList(); - } - // svuoto cartella output - if(!Directory.Exists(currConf.OutFolder)) - { - Directory.CreateDirectory(currConf.OutFolder); - } - var fileList = Directory.GetFiles(currConf.OutFolder); - foreach ( var file in fileList ) - { - File.Delete(file); - } - - // verifico quale oggetto sim avviare... x ora SOLO interclays - InterClays currSim = new InterClays(); - // ciclo su ogni record - foreach (var riga in righe) - { - // recupero dati del giorno corrente - var giornata = new DayConf("CsvDateDur", riga); - - var elencoRighe = currSim.GetDataRows(currConf.FillMode, currConf.FileOutReq, giornata); - // scrivo sul file mensile i dati del singolo giorno... - string monthFile = Path.Combine("", $"{currConf.FillMode}_{currConf.FileOutReq}_{giornata.dtStart:yyyy-MM}.csv"); - string fileOutPath=Path.Combine(currConf.OutFolder, monthFile); - if(!File.Exists(fileOutPath)) - { - File.Create(fileOutPath); - } - // vado in append... - File.AppendAllLines(fileOutPath, elencoRighe); - } + righe = righe.Skip(1).ToList(); } -} \ No newline at end of file + // svuoto cartella output + if (!Directory.Exists(currConf.OutFolder)) + { + Directory.CreateDirectory(currConf.OutFolder); + } + var fileList = Directory.GetFiles(currConf.OutFolder); + foreach (var file in fileList) + { + File.Delete(file); + } + + // verifico quale oggetto sim avviare... x ora SOLO interclays + InterClays currSim = new InterClays(); + // ciclo su ogni record + foreach (var riga in righe) + { + // recupero dati del giorno corrente + var giornata = new DayConf("CsvDateDur", riga); + + var simDataBlock = currSim.GetDataRows(currConf.FillMode, giornata); + // scrivo sul file mensile i dati del singolo giorno... + string pathFileFL = Path.Combine(currConf.OutFolder, $"{currConf.FillMode}_FL_{giornata.dtStart:yyyy-MM}.csv"); + if (!File.Exists(pathFileFL)) + { + File.WriteAllText(pathFileFL,""); + } + string pathFileEL = Path.Combine(currConf.OutFolder, $"{currConf.FillMode}_EL_{giornata.dtStart:yyyy-MM}.csv"); + if (!File.Exists(pathFileEL)) + { + File.WriteAllText(pathFileEL, ""); + } + // vado in append... + File.AppendAllLines(pathFileFL, simDataBlock.FlList); + File.AppendAllLines(pathFileEL, simDataBlock.EvList); + } +} diff --git a/MapoDataFiller/conf.yaml b/MapoDataFiller/conf.yaml index a185368..34ae8e5 100644 --- a/MapoDataFiller/conf.yaml +++ b/MapoDataFiller/conf.yaml @@ -2,6 +2,5 @@ ConfDir: C:\temp\Interclays FillMode: Interclays02 HasHeader: true -FileOutReq: FL TimeTable: Interclays02.csv OutFolder: C:\temp\Interclays\Out From 742bd6637f794896b9c6873c0fbf020c1b34b01f Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 May 2023 19:52:49 +0200 Subject: [PATCH 06/15] Update con generazione dati x EvList! --- MapoDataFiller/Filler/InterClays.cs | 73 +++- MapoDataFiller_DemoData/Interclays02.csv | 514 +++++++++++++++++++++++ 2 files changed, 570 insertions(+), 17 deletions(-) create mode 100644 MapoDataFiller_DemoData/Interclays02.csv diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index dea50f4..b38ff5a 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -34,6 +34,8 @@ namespace MapoDataFiller.Filler int idxEv = 0; int idxFl = 0; bool doProd = false; + List nextRowsFL = new List(); + List nextRowsEV = new List(); int valReq = 0; int valCurr = 0; // simulo periodi @@ -45,8 +47,8 @@ namespace MapoDataFiller.Filler DateTime dtStart = currDay.dtStart.AddMinutes(preDelay); DateTime dtEnd = dtStart; // per prima cosa aggiungo start dopo un delay di max 1/2 periodo... - answ.FlList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl}"); - answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv}] 00;0;-"); + answ.FlList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl++}"); + answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv++}] 00;0;-"); // calcolo durata successivi while (dtEnd < currDay.dtEnd) { @@ -59,32 +61,28 @@ namespace MapoDataFiller.Filler } else { - // tiro a dadi x decidere SE ho pesate nel periodo... 5% dei casi doProd = (rnd.Next(0, 100) <= 5); // FluxLOG: SE ho pesate --> genero target valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; } - // genero righe x periodo e sommo - var nextRows = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); - // sommo righe - answ.FlList.AddRange(nextRows); - - - - - /*---------------------------------------- - // Gestione EventList - ----------------------------------------*/ + // FluxLOG: genero righe FL x periodo e sommo + nextRowsFL = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); + // accodo + answ.FlList.AddRange(nextRowsFL); + // EvList: genero righe FL x periodo e sommo + nextRowsEV = IC_OX_getEvRows(dtStart, dtEnd, doProd, ref idxEv); + // accodo + answ.EvList.AddRange(nextRowsEV); } // aggiungo chiusura eventi... dtStart = dtEnd.AddSeconds(rnd.Next(25, 35)); - answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxEv}++] 01;0;-"); + answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxEv++}] 01;0;-"); dtStart = dtEnd.AddSeconds(rnd.Next(80, 180)); - answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv}++] 00;0;-"); + answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv++}] 00;0;-"); // ritorno return answ; @@ -96,8 +94,8 @@ namespace MapoDataFiller.Filler /// /// /// - /// /// + /// /// protected List IC_OX_getFlRows(DateTime dtStart, DateTime dtEnd, bool doProd, int valReq, ref int idxCount, ref int valCurr) { @@ -106,6 +104,8 @@ namespace MapoDataFiller.Filler int valTo = doProd ? valReq + rnd.Next(0, valStep) * valStep : 0; valCurr = valReq > 0 ? valCurr : 0; string currRow = ""; + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; // genera i dati secondo lo schema configurato... while (dtCurs < dtEnd) { @@ -126,6 +126,45 @@ namespace MapoDataFiller.Filler return rows; } + /// + /// Simulo un blocco dati FL + /// + /// + /// + /// + /// + /// + protected List IC_OX_getEvRows(DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) + { + List rows = new List(); + DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(1000, 60000)); + string currRow = ""; + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + // se produce registro poweron... + if (doProd) + { + currRow = $"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; + currRow = $"INTERCL_02;{dtEnd:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + } + // se NON produce alterno valori spenta/accesa + else + { + // genera i dati secondo lo schema configurato... con periodo da 15" a 15 min di pausa + while (dtCurs < dtEnd) + { + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + rows.Add(currRow); + dtCurs = dtCurs.AddSeconds(rnd.Next(60*5, 60*15)); + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(500, 5000)); + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + } + } + return rows; + } } } diff --git a/MapoDataFiller_DemoData/Interclays02.csv b/MapoDataFiller_DemoData/Interclays02.csv new file mode 100644 index 0000000..b394e44 --- /dev/null +++ b/MapoDataFiller_DemoData/Interclays02.csv @@ -0,0 +1,514 @@ +Data;Ora Inizio ;Ore Lavorate +lun 02/12/2019;05.18;7,41 +mar 03/12/2019;05.22;7,22 +mer 04/12/2019;05.16;7,35 +lun 09/12/2019;14.12;5,43 +mar 10/12/2019;13.10;6,55 +mer 11/12/2019;13.15;7,19 +gio 12/12/2019;13.30;6,18 +ven 13/12/2019;13.10;7,24 +lun 16/12/2019;05.12;7,33 +mar 17/12/2019;05.22;7,27 +mer 18/12/2019;05.08;7,18 +gio 19/12/2019;05.17;6,57 +ven 20/12/2019;05.25;7,05 +lun 23/12/2019;13.18;7,32 +mar 24/12/2019;13.02;7,33 +mer 25/12/2019;13.11;7,28 +gio 26/12/2019;15.01;5,16 +ven 27/12/2019;13.25;7,12 +lun 30/12/2019;05.17;15,33 +mar 31/12/2019;05.03;15,28 +mer 01/01/2020;05.09;15,45 +gio 02/01/2020;05.08;15,37 +ven 03/01/2020;05.17;15,03 +lun 06/01/2020;13.14;7,43 +mar 07/01/2020;13.25;6,55 +mer 08/01/2020;15.05;5,18 +lun 20/01/2020;13.07;7,44 +mar 21/01/2020;13.14;6,51 +mer 22/01/2020;13.22;4,48 +gio 23/01/2020;13.19;7,27 +ven 24/01/2020;13.10;7,36 +mer 29/01/2020;07.19;3,19 +ven 31/01/2020;13.58;1,59 +lun 03/02/2020;13.10;7,25 +mar 04/02/2020;13.16;6,54 +mer 05/02/2020;13.09;7,06 +gio 06/02/2020;13.18;5,59 +ven 07/02/2020;13.26;4,29 +gio 13/02/2020;08.33;6,55 +ven 14/02/2020;08.19;7,02 +lun 17/02/2020;13.11;7,45 +mar 18/02/2020;13.06;7,48 +mer 19/02/2020;13.18;7,36 +gio 20/02/2020;14.36;6,15 +ven 21/02/2020;13.16;7,29 +lun 24/02/2020;05.06;7,45 +mar 25/02/2020;05.14;7,43 +mer 26/02/2020;05.11;7,44 +gio 27/02/2020;05.21;7,39 +ven 28/02/2020;05.19;7,28 +lun 02/03/2020;13.05;7,47 +mar 03/03/2020;13.08;5,55 +mer 04/03/2020;13.09;7,46 +gio 05/03/2020;13.17;7,01 +ven 06/03/2020;13.11;4,59 +lun 09/03/2020;05.15;7,44 +mar 10/03/2020;05.13;7,39 +mer 11/03/2020;05.09;7,51 +gio 12/03/2020;05.17;7,31 +ven 13/03/2020;05.33;7,26 +lun 16/03/2020;13.12;7,45 +mar 17/03/2020;13.19;7,33 +mer 18/03/2020;13.08;7,51 +gio 19/03/2020;13.23;7,29 +ven 20/03/2020;13.17;7,37 +mer 25/03/2020;17.29;0,33 +gio 26/03/2020;13.18;1,57 +lun 30/03/2020;13.17;7,22 +mar 31/03/2020;13.45;7,13 +mer 01/04/2020;14.01;5,54 +gio 02/04/2020;13.48;6,02 +ven 03/04/2020;13.09;7,48 +lun 06/04/2020;05.09;7,48 +mar 07/04/2020;05.15;15,26 +mer 08/04/2020;05.36;15,09 +gio 09/04/2020;05.06;15,12 +ven 10/04/2020;05.25;7,05 +mer 15/04/2020;14.54;1,25 +gio 16/04/2020;15.44;1,09 +ven 17/04/2020;17.46;1,38 +mar 21/04/2020;05.09;7,15 +ven 24/04/2020;05.01;6,31 +lun 27/04/2020;13.45;5,37 +mar 28/04/2020;15.23;4,29 +mer 29/04/2020;17.03;2,36 +lun 04/05/2020;08.06;7,39 +mar 05/05/2020;08.12;7,33 +mer 06/05/2020;08.11;7,21 +gio 07/05/2020;08.14;7,26 +ven 08/05/2020;08.19;7,33 +lun 11/05/2020;08.14;7,03 +mar 12/05/2020;08.16;7,15 +mer 13/05/2020;08.17;7,24 +gio 14/05/2020;08.11;7,18 +ven 15/05/2020;08.14;7,33 +lun 18/05/2020;09.22;1,59 +mar 19/05/2020;15.01;1,48 +lun 25/05/2020;10.55;2,03 +gio 28/05/2020;18.06;0,59 +ven 29/05/2020;09.28;3,45 +lun 01/06/2020;16.13;1,55 +mer 03/06/2020;05.33;14,42 +gio 04/06/2020;05.14;15,03 +ven 05/06/2020;05.33;15,16 +lun 08/06/2020;05.08;15,01 +mar 09/06/2020;05.11;15,12 +mer 10/06/2020;05.09;14,53 +gio 11/06/2020;05.04;15,33 +ven 12/06/2020;05.15;15,27 +lun 15/06/2020;05.06;15,18 +mar 16/06/2020;05.22;14,45 +mer 17/06/2020;05.18;15,22 +gio 18/06/2020;05.19;15,31 +ven 19/06/2020;05.07;15,09 +mar 23/06/2020;09.27;1,59 +gio 25/06/2020;14.56;2,04 +ven 26/06/2020;10.23;2,54 +lun 29/06/2020;08.23;1,49 +mar 30/06/2020;11.01;1,05 +ven 03/07/2020;18.47;0,45 +lun 06/07/2020;13.15;7,35 +mar 07/07/2020;13.10;7,45 +mer 08/07/2020;13.08;7,48 +gio 09/07/2020;13.11;7,25 +ven 10/07/2020;13.04;7,39 +lun 13/07/2020;05.09;7,46 +mar 14/07/2020;05.12;7,39 +mer 15/07/2020;05.04;7,42 +gio 16/07/2020;05.11;7,38 +ven 17/07/2020;05.39;6,41 +lun 20/07/2020;13.18;7,05 +mar 21/07/2020;13.09;7,19 +mer 22/07/2020;13.33;5,44 +gio 23/07/2020;13.03;6,44 +ven 24/07/2020;13.12;7,45 +lun 27/07/2020;08.06;7,51 +mar 28/07/2020;08.14;7,39 +mer 29/07/2020;08.03;7,55 +gio 30/07/2020;08.08;7,51 +ven 31/07/2020;08.09;7,49 +lun 03/08/2020;08.58;0,45 +mar 04/08/2020;16.55;1,33 +mar 18/08/2020;11.11;2,33 +mer 19/08/2020;09.28;1,58 +ven 21/08/2020;14.29;1,47 +mer 26/08/2020;07.19;3,19 +ven 28/08/2020;13.58;1,59 +lun 31/08/2020;13.10;7,25 +mar 01/09/2020;13.16;6,54 +mer 02/09/2020;13.09;7,06 +gio 03/09/2020;13.18;5,59 +ven 04/09/2020;13.26;4,29 +gio 10/09/2020;08.33;6,55 +ven 11/09/2020;08.19;7,02 +lun 14/09/2020;13.11;7,45 +mar 15/09/2020;13.06;7,48 +mer 16/09/2020;13.18;7,36 +gio 17/09/2020;14.36;6,15 +ven 18/09/2020;13.16;7,29 +lun 21/09/2020;05.06;7,45 +mar 22/09/2020;05.14;7,43 +mer 23/09/2020;05.11;7,44 +gio 24/09/2020;05.21;7,39 +ven 25/09/2020;05.19;7,28 +lun 28/09/2020;08.02;7,55 +mar 29/09/2020;08.12;7,42 +mer 30/09/2020;08.17;7,39 +gio 01/10/2020;08.09;7,41 +ven 02/10/2020;08.05;7,43 +lun 05/10/2020;08.33;7,18 +mar 06/10/2020;08.17;7,39 +mer 07/10/2020;08.09;7,44 +gio 08/10/2020;08.11;7,43 +ven 09/10/2020;08.12;7,38 +lun 12/10/2020;05.01;15,09 +mar 13/10/2020;05.13;14,58 +mer 14/10/2020;05.07;15,04 +gio 15/10/2020;05.03;15,11 +ven 16/10/2020;05.15;15,03 +lun 19/10/2020;05.11;15,13 +mar 20/10/2020;05.17;14,45 +mer 21/10/2020;05.08;14,29 +gio 22/10/2020;05.21;13,47 +ven 23/10/2020;05.55;14,17 +lun 26/10/2020;13.08;7,45 +mar 27/10/2020;13.07;7,48 +mer 28/10/2020;13.17;7,29 +gio 29/10/2020;13.11;7,17 +ven 30/10/2020;13.09;4,22 +lun 02/11/2020;12.01;2,02 +mer 04/11/2020;08.56;2,18 +ven 06/11/2020;14.33;2,17 +mar 10/11/2020;18.47;0,49 +mer 11/11/2020;13.57;1,56 +lun 16/11/2020;15.37;1,59 +ven 20/11/2020;16.55;0,47 +lun 23/11/2020;05.09;14,55 +mar 24/11/2020;05.04;15,09 +mer 25/11/2020;05.11;15,12 +gio 26/11/2020;05.03;15,01 +ven 27/11/2020;05.08;15,06 +lun 30/11/2020;05.18;15,09 +mar 01/12/2020;05.01;14,31 +mer 02/12/2020;05.09;14,55 +gio 03/12/2020;05.07;15,02 +ven 04/12/2020;05.14;14,37 +gio 10/12/2020;10.29;2,23 +ven 11/12/2020;16.41;2,57 +mar 15/12/2020;7.44;1,56 +mer 16/12/2020;09.03;2,38 +dom 20/12/2020;11.37;3,01 +lun 21/12/2020;17.01;2,44 +mar 22/12/2020;07.59;4,39 +lun 04/01/2021;15.27;1,59 +mar 05/01/2021;13.48;1,55 +gio 07/01/2021;09.24;1,56 +lun 11/01/2021;13.05;7,47 +mar 12/01/2021;13.08;5,55 +mer 13/01/2021;13.09;7,46 +gio 14/01/2021;13.17;7,01 +ven 15/01/2021;13.11;4,59 +lun 18/01/2021;05.15;7,44 +mar 19/01/2021;05.13;7,39 +mer 20/01/2021;05.09;7,51 +gio 21/01/2021;05.17;7,31 +ven 22/01/2021;05.33;7,26 +lun 25/01/2021;13.12;7,45 +mar 26/01/2021;13.19;7,33 +mer 27/01/2021;13.08;7,51 +gio 28/01/2021;13.23;7,29 +ven 29/01/2021;13.17;7,37 +lun 01/02/2021;08.06;7,39 +mar 02/02/2021;08.12;7,33 +mer 03/02/2021;08.11;7,21 +gio 04/02/2021;08.14;7,26 +ven 05/02/2021;08.19;7,33 +lun 08/02/2021;08.14;7,03 +mar 09/02/2021;08.16;7,15 +mer 10/02/2021;08.17;7,24 +gio 11/02/2021;08.11;7,18 +ven 12/02/2021;08.14;7,33 +lun 15/02/2021;08.33;7,18 +mar 16/02/2021;08.17;7,39 +mer 17/02/2021;08.09;7,44 +gio 18/02/2021;08.11;7,43 +ven 19/02/2021;08.12;7,38 +lun 22/02/2021;05.01;15,09 +mar 23/02/2021;05.13;14,58 +mer 24/02/2021;05.07;15,04 +gio 25/02/2021;05.03;15,11 +ven 26/02/2021;05.15;15,03 +lun 01/03/2021;05.11;15,13 +mar 02/03/2021;05.17;14,45 +mer 03/03/2021;05.08;14,29 +gio 04/03/2021;05.21;13,47 +ven 05/03/2021;05.55;14,17 +lun 08/03/2021;08.09;7,41 +mar 09/03/2021;08.13;7,35 +mer 10/03/2021;08.04;7,38 +gio 11/03/2021;08.22;7,17 +ven 12/03/2021;08.08;7,07 +lun 15/03/2021;14.12;5,43 +mar 16/03/2021;13.10;6,55 +mer 17/03/2021;13.15;7,19 +gio 18/03/2021;13.30;6,18 +ven 19/03/2021;13.10;7,24 +lun 22/03/2021;05.12;7,33 +mar 23/03/2021;05.22;7,27 +mer 24/03/2021;05.08;7,18 +gio 25/03/2021;05.17;6,57 +ven 26/03/2021;05.25;7,05 +lun 29/03/2021;13.18;7,32 +mar 30/03/2021;13.02;7,33 +mer 31/03/2021;13.11;7,28 +gio 01/04/2021;15.01;5,16 +ven 02/04/2021;13.25;7,12 +mar 06/04/2021;05.11;7,44 +mer 07/04/2021;05.03;7,51 +gio 08/04/2021;05.19;7,26 +ven 09/04/2021;05.07;7,39 +lun 12/04/2021;14.12;5,43 +mar 13/04/2021;13.10;6,55 +mer 14/04/2021;13.15;7,19 +gio 15/04/2021;13.30;6,18 +ven 16/04/2021;13.10;7,24 +lun 19/04/2021;05.12;7,33 +mar 20/04/2021;05.22;7,27 +mer 21/04/2021;05.08;7,18 +gio 22/04/2021;05.17;6,57 +ven 23/04/2021;05.25;7,05 +lun 26/04/2021;13.18;7,32 +mar 27/04/2021;13.02;7,33 +mer 28/04/2021;13.11;7,28 +gio 29/04/2021;15.01;5,16 +ven 30/04/2021;13.25;7,12 +mar 04/05/2021;16.37;1,59 +gio 06/05/2021;15.22;2,09 +ven 07/05/2021;18.39;2,14 +lun 10/05/2021;13.08;7,45 +mar 11/05/2021;13.07;7,48 +mer 12/05/2021;13.17;7,29 +gio 13/05/2021;13.11;7,17 +ven 14/05/2021;13.09;4,22 +lun 17/05/2021;05.09;7,46 +mar 18/05/2021;05.12;7,39 +mer 19/05/2021;05.04;7,42 +gio 20/05/2021;05.11;7,38 +ven 21/05/2021;05.39;6,41 +lun 24/05/2021;13.01;7,49 +mar 25/05/2021;13.09;2,57 +mer 26/05/2021;13.22;3,29 +gio 27/05/2021;13.19;4,25 +ven 28/05/2021;13.08;7,43 +lun 31/05/2021;12.59;2,11 +mar 01/06/2021;16.34;2,18 +gio 03/06/2021;13.48;2,17 +ven 04/06/2021;17.01;2,29 +lun 07/06/2021;13.18;7,32 +mar 08/06/2021;13.02;7,33 +mer 09/06/2021;13.11;7,28 +gio 10/06/2021;15.01;5,16 +ven 11/06/2021;13.25;7,12 +lun 14/06/2021;13.05;7,47 +mar 15/06/2021;13.08;5,55 +mer 16/06/2021;13.09;7,46 +gio 17/06/2021;13.17;7,01 +ven 18/06/2021;13.11;4,59 +lun 21/06/2021;05.15;7,44 +mar 22/06/2021;05.13;7,39 +mer 23/06/2021;05.09;7,51 +gio 24/06/2021;05.17;7,31 +ven 25/06/2021;05.33;7,26 +lun 28/06/2021;13.12;7,45 +mar 29/06/2021;13.19;7,33 +mer 30/06/2021;13.08;7,51 +gio 01/07/2021;13.23;7,29 +ven 02/07/2021;13.17;7,37 +lun 05/07/2021;05.12;7,33 +mar 06/07/2021;05.22;7,27 +mer 07/07/2021;05.08;7,18 +gio 08/07/2021;05.17;6,57 +ven 09/07/2021;05.25;7,05 +lun 12/07/2021;13.18;7,32 +mar 13/07/2021;13.02;7,33 +mer 14/07/2021;13.11;7,28 +gio 15/07/2021;15.01;5,16 +ven 16/07/2021;13.25;7,12 +lun 19/07/2021;05.17;15,33 +mar 20/07/2021;05.03;15,28 +mer 21/07/2021;05.09;15,45 +gio 22/07/2021;05.08;15,37 +ven 23/07/2021;05.17;15,03 +lun 26/07/2021;13.14;7,43 +mar 27/07/2021;13.25;6,55 +mer 28/07/2021;15.05;5,18 +lun 02/08/2021;17.14;2,48 +mar 03/08/2021;09.33;1,36 +mer 04/08/2021;10.51;1,55 +gio 05/08/2021;08.36;2,21 +ven 06/08/2021;13.09;3,35 +lun 16/08/2021;14.37;2,45 +lun 23/08/2021;05.09;14,55 +mar 24/08/2021;05.04;15,09 +mer 25/08/2021;05.11;15,12 +gio 26/08/2021;05.03;15,01 +ven 27/08/2021;05.08;15,06 +lun 30/08/2021;05.18;15,09 +mar 31/08/2021;05.01;14,31 +mer 01/09/2021;05.09;14,55 +gio 02/09/2021;05.07;15,02 +ven 03/09/2021;05.14;14,37 +lun 06/09/2021;05.08;15,01 +mar 07/09/2021;05.11;15,12 +mer 08/09/2021;05.09;14,53 +gio 09/09/2021;05.04;15,33 +ven 10/09/2021;05.15;15,27 +lun 13/09/2021;05.06;15,18 +mar 14/09/2021;05.22;14,45 +mer 15/09/2021;05.18;15,22 +gio 16/09/2021;05.19;15,31 +ven 17/09/2021;05.07;15,09 +lun 20/09/2021;09.11;2,12 +mar 21/09/2021;11.11;3,15 +mer 22/09/2021;12.59;2,27 +gio 23/09/2021;07.45;4,39 +ven 24/09/2021;17.37;5,21 +lun 27/09/2021;05.06;7,45 +mar 28/09/2021;05.14;7,43 +mer 29/09/2021;05.11;7,44 +gio 30/09/2021;05.21;7,39 +ven 01/10/2021;05.19;7,28 +lun 04/10/2021;08.02;7,55 +mar 05/10/2021;08.12;7,42 +mer 06/10/2021;08.17;7,39 +gio 07/10/2021;08.09;7,41 +ven 08/10/2021;08.05;7,43 +lun 11/10/2021;08.33;7,18 +mar 12/10/2021;08.17;7,39 +mer 13/10/2021;08.09;7,44 +gio 14/10/2021;08.11;7,43 +ven 15/10/2021;08.12;7,38 +lun 18/10/2021;05.01;15,09 +mar 19/10/2021;05.13;14,58 +mer 20/10/2021;05.07;15,04 +gio 21/10/2021;05.03;15,11 +ven 22/10/2021;05.15;15,03 +lun 25/10/2021;05.11;15,13 +mar 26/10/2021;05.17;14,45 +mer 27/10/2021;05.08;14,29 +gio 28/10/2021;05.21;13,47 +ven 29/10/2021;05.55;14,17 +lun 01/11/2021;09.35;5,27 +mer 03/11/2021;12.48;4,56 +gio 04/11/2021;16.39;3,33 +ven 05/11/2021;07.33;9,24 +lun 08/11/2021;14.12;5,43 +mar 09/11/2021;13.10;6,55 +mer 10/11/2021;13.15;7,19 +gio 11/11/2021;13.30;6,18 +ven 12/11/2021;13.10;7,24 +lun 15/11/2021;05.12;7,33 +mar 16/11/2021;05.22;7,27 +mer 17/11/2021;05.08;7,18 +gio 18/11/2021;05.17;6,57 +ven 19/11/2021;05.25;7,05 +lun 22/11/2021;13.18;7,32 +mar 23/11/2021;13.02;7,33 +mer 24/11/2021;13.11;7,28 +gio 25/11/2021;15.01;5,16 +ven 26/11/2021;13.25;7,12 +lun 29/11/2021;05.17;15,33 +mar 30/11/2021;05.03;15,28 +mer 01/12/2021;05.09;15,45 +gio 02/12/2021;05.08;15,37 +ven 03/12/2021;05.17;15,03 +lun 06/12/2021;13.11;7,44 +mar 07/12/2021;13.02;7,51 +gio 09/12/2021;13.08;7,52 +ven 10/12/2021;13.17;7,43 +lun 13/12/2021;08.06;7,39 +mar 14/12/2021;08.12;7,33 +mer 15/12/2021;08.11;7,21 +gio 16/12/2021;08.14;7,26 +ven 17/12/2021;08.19;7,33 +lun 20/12/2021;08.14;7,03 +mar 21/12/2021;08.16;7,15 +mer 22/12/2021;08.17;7,24 +gio 23/12/2021;08.11;7,18 +ven 24/12/2021;08.14;7,33 +lun 27/12/2021;10.09;1,36 +mar 28/12/2021;14.37;1,59 +mer 29/12/2021;14.19;2,07 +gio 30/12/2021;08.08;2,38 +mar 04/01/2022;13.27;2,06 +lun 10/01/2022;13.05;7,47 +mar 11/01/2022;13.08;5,55 +mer 12/01/2022;13.09;7,46 +gio 13/01/2022;13.17;7,01 +ven 14/01/2022;13.11;4,59 +lun 17/01/2022;05.15;7,44 +mar 18/01/2022;05.13;7,39 +mer 19/01/2022;05.09;7,51 +gio 20/01/2022;05.17;7,31 +ven 21/01/2022;05.33;7,26 +lun 24/01/2022;13.12;7,45 +mar 25/01/2022;13.19;7,33 +mer 26/01/2022;13.08;7,51 +gio 27/01/2022;13.23;7,29 +ven 28/01/2022;13.17;7,37 +lun 31/01/2022;08.06;7,39 +mar 01/02/2022;08.12;7,33 +mer 02/02/2022;08.11;7,21 +gio 03/02/2022;08.14;7,26 +ven 04/02/2022;08.19;7,33 +lun 07/02/2022;08.14;7,03 +mar 08/02/2022;08.16;7,15 +mer 09/02/2022;08.17;7,24 +gio 10/02/2022;08.11;7,18 +ven 11/02/2022;08.14;7,33 +lun 14/02/2022;05.06;7,42 +mar 15/02/2022;05.21;7,02 +mer 16/02/2022;05.46;5,33 +gio 17/02/2022;05.37;6,27 +ven 18/02/2022;05.22;7,09 +lun 21/02/2022;13.01;7,55 +mar 22/02/2022;13.06;7,42 +mer 23/02/2022;13.08;7,51 +gio 24/02/2022;13.11;7,36 +ven 25/02/2022;13.03;7,49 +lun 28/02/2022;05.12;7,33 +mar 01/03/2022;05.22;7,27 +mer 02/03/2022;05.08;7,18 +gio 03/03/2022;05.17;6,57 +ven 04/03/2022;05.25;7,05 +lun 07/03/2022;13.18;7,32 +mar 08/03/2022;13.02;7,33 +mer 09/03/2022;13.11;7,28 +gio 10/03/2022;15.01;5,16 +ven 11/03/2022;13.25;7,12 +lun 14/03/2022;05.17;15,33 +mar 15/03/2022;05.03;15,28 +mer 16/03/2022;05.09;15,45 +gio 17/03/2022;05.08;15,37 +ven 18/03/2022;05.17;15,03 +lun 21/03/2022;13.01;7,49 +mar 22/03/2022;13.09;2,57 +mer 23/03/2022;13.22;3,29 +gio 24/03/2022;13.19;4,25 +ven 25/03/2022;13.08;7,43 +lun 28/03/2022;08.06;7,01 +mar 29/03/2022;08.07;7,23 +mer 30/03/2022;08.11;6,27 +gio 31/03/2022;08.17;3,45 \ No newline at end of file From 81e45e9b8c6fa15c3a59408902361a4326f7d6d9 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 5 May 2023 19:15:48 +0200 Subject: [PATCH 07/15] update x conf simulatore avanzato x interclays01 --- MapoDataFiller/Conf/INTERCL_01.yaml | 113 +++++++++++++++ MapoDataFiller/Conf/INTERCL_02.yaml | 88 ++++++++++++ MapoDataFiller/Filler/InterClays.cs | 208 ++++++++++++++++----------- MapoDataFiller/FluxStats.cs | 33 +++++ MapoDataFiller/MConf.cs | 4 +- MapoDataFiller/MapoDataFiller.csproj | 6 + MapoDataFiller/Program.cs | 144 ++++++++++++------- MapoDataFiller/conf.yaml | 2 +- 8 files changed, 458 insertions(+), 140 deletions(-) create mode 100644 MapoDataFiller/Conf/INTERCL_01.yaml create mode 100644 MapoDataFiller/Conf/INTERCL_02.yaml create mode 100644 MapoDataFiller/FluxStats.cs diff --git a/MapoDataFiller/Conf/INTERCL_01.yaml b/MapoDataFiller/Conf/INTERCL_01.yaml new file mode 100644 index 0000000..1f0024d --- /dev/null +++ b/MapoDataFiller/Conf/INTERCL_01.yaml @@ -0,0 +1,113 @@ +--- +SetupSimInt: { + Temp_Filtro: + { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + T_Attuale_Cil: + { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + Flowrate: + { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + Ampere_Cil: + { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15.0, + 99: 16.4, + 100: 79.1 + }, + Ampere_Asp: + { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + Ampere_Dosat: + { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } +} +SetupSimFloat: { + Dep_Cil_mmH2O: + { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 + }, + Bruc_0_100: + { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 + }, + Asp_0_100: + { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 + } +} +SetupDtData: { + Tot_Parz_Dosatore: + { + 2020-06-30 19:56:21: 1225.481, + 2020-11-16 13:01:33: 5419.626, + 2022-03-14 11:33:21: 20782.475, + 2022-11-21 08:48:21: 27770.447, + 2023-03-07 15:40:44: 30951.118 + }, + Tot_Dosatore: + { + 2020-06-30 19:56:21: 9053.072, + 2020-11-16 13:01:33: 13247.217, + 2022-03-14 11:33:21: 28610.066, + 2022-11-21 08:48:21: 35598.038, + 2023-03-07 15:40:44: 38778.709 + } +} \ No newline at end of file diff --git a/MapoDataFiller/Conf/INTERCL_02.yaml b/MapoDataFiller/Conf/INTERCL_02.yaml new file mode 100644 index 0000000..eecf920 --- /dev/null +++ b/MapoDataFiller/Conf/INTERCL_02.yaml @@ -0,0 +1,88 @@ +--- +SetupSimInt: + Temp_Filtro: + "0": 0.1 + "1": 5.6 + "25": 89.1 + "50": 103.7 + "75": 108.3 + "99": 118.1 + "100": 135.6 + T_Attuale_Cil: + "0": 0.01 + "1": 0.65 + "25": 10.36 + "50": 11.46 + "75": 11.98 + "99": 13.99 + "100": 327.67 + Flowrate: + "0": 0.01 + "1": 0.06 + "25": 5.34 + "50": 8.22 + "75": 9.48 + "99": 12.86 + "100": 262.8 + Ampere_Cil: + "0": 10.6 + "1": 14.1 + "25": 14.4 + "50": 14.6 + "75": 15 + "99": 16.4 + "100": 79.1 + Ampere_Asp: + "0": 12.1 + "1": 14.8 + "25": 15.9 + "50": 17.2 + "75": 22.1 + "99": 32.4 + "100": 87.3 + Ampere_Dosat: + "0": 0.1 + "1": 1.8 + "25": 2 + "50": 2 + "75": 2.1 + "99": 2.4 + "100": 3.3 +SetupSimFloat: + Dep_Cil_mmH2O: + "0": 1 + "1": 1 + "25": 5 + "50": 10 + "75": 15 + "99": 26 + "100": 52 + Bruc_0_100: + "0": 1 + "1": 17 + "25": 24 + "50": 33 + "75": 47 + "99": 71 + "100": 100 + Asp_0_100: + "0": 3 + "1": 36 + "25": 52 + "50": 59 + "75": 77 + "99": 100 + "100": 100 +SetupDtData: + Tot_Parz_Dosatore: + 2020-06-30 19:56:21: 1225.481 + 2020-11-16 13:01:33: 5419.626 + 2022-03-14 11:33:21: 20782.475 + 2022-11-21 08:48:21: 27770.447 + 2023-03-07 15:40:44: 30951.118 + Tot_Dosatore: + 2020-06-30 19:56:21: 9053.072 + 2020-11-16 13:01:33: 13247.217 + 2022-03-14 11:33:21: 28610.066 + 2022-11-21 08:48:21: 35598.038 + 2023-03-07 15:40:44: 38778.709 diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index b38ff5a..e5048a8 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -1,35 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MapoDataFiller.Filler +namespace MapoDataFiller.Filler { public class InterClays { - protected int valStep = 10; - protected int valMin = 500; - protected int valMax = 15000; - protected int numSec = 30; - protected int stepMin = 50; - protected int stepMax = 150; + #region Public Properties - protected int waitMin = 10; - protected int waitMax = 240; + public SimSetup currSetup { get; set; } = new SimSetup(); - protected int numPerMax = 50; + #endregion Public Properties - protected Random rnd = new Random(); + #region Public Methods /// /// Restituisce elenco righe da caricare sul DB dato periodo indicato /// - /// + /// /// /// - public SimBlock GetDataRows(string fillMode, DayConf currDay) + public SimBlock GetDataRows(string CodIOB, DayConf currDay) { + string fileConf = Path.Combine("Conf", $"{CodIOB}.yaml"); + if (File.Exists(fileConf)) + { + currSetup = SimSetup.readConf(fileConf); + } + SimBlock answ = new SimBlock(); int idxEv = 0; int idxFl = 0; @@ -38,7 +32,7 @@ namespace MapoDataFiller.Filler List nextRowsEV = new List(); int valReq = 0; int valCurr = 0; - // simulo periodi + // simulo periodi int numPer = rnd.Next(10, numPerMax); // calcolo durata media periodi in minuti double avgDurPer = (currDay.dtEnd.Subtract(currDay.dtStart).TotalMinutes) / numPer; @@ -47,46 +41,133 @@ namespace MapoDataFiller.Filler DateTime dtStart = currDay.dtStart.AddMinutes(preDelay); DateTime dtEnd = dtStart; // per prima cosa aggiungo start dopo un delay di max 1/2 periodo... - answ.FlList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl++}"); - answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv++}] 00;0;-"); + answ.FlList.Add($"{CodIOB};{dtStart:yyyy-MM-dd HH:mm:ss.fff};IOB-STATUS;IOB Started;{idxFl++}"); + answ.EvList.Add($"{CodIOB};{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv++}] 00;0;-"); // calcolo durata successivi while (dtEnd < currDay.dtEnd) { - dtStart = dtEnd.AddSeconds(rnd.Next(25,35)); + dtStart = dtEnd.AddSeconds(rnd.Next(25, 35)); dtEnd = dtStart.AddMinutes(avgDurPer * rnd.Next(600, 1400) / 1000); - // verifico se DEVO finire caricamento... - if (valCurr < valReq) + // verifico il tipo di CodIOB + if (CodIOB == "INTERCL_01") { - doProd = true; - } - else - { - // tiro a dadi x decidere SE ho pesate nel periodo... 5% dei casi - doProd = (rnd.Next(0, 100) <= 5); + // verifico se DEVO finire caricamento... + if (valCurr < valReq) + { + doProd = true; + } + else + { + // tiro a dadi x decidere SE ho pesate nel periodo... 30% dei casi + doProd = (rnd.Next(0, 100) <= 30); - // FluxLOG: SE ho pesate --> genero target - valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; + // FluxLOG: SE ho pesate --> genero target + valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; + } + // FluxLOG: genero righe FL x periodo e sommo + nextRowsFL = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); + + // EvList: genero righe FL x periodo e sommo + nextRowsEV = IC_OX_getEvRows(dtStart, dtEnd, doProd, ref idxEv); } - // FluxLOG: genero righe FL x periodo e sommo - nextRowsFL = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); - // accodo + else if (CodIOB == "INTERCL_02") + { + // verifico se DEVO finire caricamento... + if (valCurr < valReq) + { + doProd = true; + } + else + { + // tiro a dadi x decidere SE ho pesate nel periodo... 30% dei casi + doProd = (rnd.Next(0, 100) <= 30); + + // FluxLOG: SE ho pesate --> genero target + valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; + } + // FluxLOG: genero righe FL x periodo e sommo + nextRowsFL = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); + + // EvList: genero righe FL x periodo e sommo + nextRowsEV = IC_OX_getEvRows(dtStart, dtEnd, doProd, ref idxEv); + } + // accodo FL answ.FlList.AddRange(nextRowsFL); - - // EvList: genero righe FL x periodo e sommo - nextRowsEV = IC_OX_getEvRows(dtStart, dtEnd, doProd, ref idxEv); - // accodo + // accodo EV answ.EvList.AddRange(nextRowsEV); } // aggiungo chiusura eventi... dtStart = dtEnd.AddSeconds(rnd.Next(25, 35)); - answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxEv++}] 01;0;-"); + answ.EvList.Add($"{CodIOB};{dtStart:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxEv++}] 01;0;-"); dtStart = dtEnd.AddSeconds(rnd.Next(80, 180)); - answ.EvList.Add($"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv++}] 00;0;-"); + answ.EvList.Add($"{CodIOB};{dtStart:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxEv++}] 00;0;-"); // ritorno return answ; } + + #endregion Public Methods + + #region Protected Fields + + protected int numPerMax = 50; + protected int numSec = 30; + protected Random rnd = new Random(); + protected int stepMax = 150; + protected int stepMin = 50; + protected int valMax = 15000; + protected int valMin = 500; + protected int valStep = 10; + protected int waitMax = 240; + protected int waitMin = 10; + + #endregion Protected Fields + + #region Protected Methods + + /// + /// Simulo un blocco dati FL + /// + /// + /// + /// + /// + /// + protected List IC_OX_getEvRows(DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) + { + List rows = new List(); + DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(1000, 60000)); + string currRow = ""; + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + // se produce registro poweron... + if (doProd) + { + currRow = $"INTERCL_02;{dtStart.AddSeconds(5):yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; + rows.Add(currRow); + currRow = $"INTERCL_02;{dtEnd.AddSeconds(-5):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + rows.Add(currRow); + } + // se NON produce alterno valori spenta/accesa + else + { + // genera i dati secondo lo schema configurato... con periodo da 15" a 15 min di pausa + while (dtCurs < dtEnd) + { + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + rows.Add(currRow); + dtCurs = dtCurs.AddSeconds(rnd.Next(60 * 5, 60 * 15)); + currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(500, 5000)); + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + } + } + return rows; + } + /// /// Simulo un blocco dati FL /// @@ -126,45 +207,6 @@ namespace MapoDataFiller.Filler return rows; } - /// - /// Simulo un blocco dati FL - /// - /// - /// - /// - /// - /// - protected List IC_OX_getEvRows(DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) - { - List rows = new List(); - DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(1000, 60000)); - string currRow = ""; - // reset counter - idxCount = idxCount <= 9999 ? idxCount : 0; - // se produce registro poweron... - if (doProd) - { - currRow = $"INTERCL_02;{dtStart:yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; - currRow = $"INTERCL_02;{dtEnd:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; - } - // se NON produce alterno valori spenta/accesa - else - { - // genera i dati secondo lo schema configurato... con periodo da 15" a 15 min di pausa - while (dtCurs < dtEnd) - { - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; - rows.Add(currRow); - dtCurs = dtCurs.AddSeconds(rnd.Next(60*5, 60*15)); - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; - rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(500, 5000)); - // reset counter - idxCount = idxCount <= 9999 ? idxCount : 0; - } - } - return rows; - } - + #endregion Protected Methods } -} +} \ No newline at end of file diff --git a/MapoDataFiller/FluxStats.cs b/MapoDataFiller/FluxStats.cs new file mode 100644 index 0000000..866c18e --- /dev/null +++ b/MapoDataFiller/FluxStats.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using YamlDotNet.Serialization.NamingConventions; +using YamlDotNet.Serialization; + +namespace MapoDataFiller +{ + public class SimSetup + { + public Dictionary> SetupSimInt { get; set; } = new Dictionary>(); + public Dictionary> SetupSimFloat { get; set; } = new Dictionary>(); + public Dictionary> SetupDtData { get; set; } = new Dictionary>(); + + public static SimSetup readConf(string filePath) + { + SimSetup retObj = new SimSetup(); + if (File.Exists(filePath)) + { + var deserializer = new DeserializerBuilder() + .WithNamingConvention(new PascalCaseNamingConvention()) + .Build(); + string rawData = File.ReadAllText(filePath); + + var input = new StringReader(rawData); + retObj = deserializer.Deserialize(input); + } + return retObj; + } + } +} diff --git a/MapoDataFiller/MConf.cs b/MapoDataFiller/MConf.cs index 22c5366..981413d 100644 --- a/MapoDataFiller/MConf.cs +++ b/MapoDataFiller/MConf.cs @@ -13,7 +13,7 @@ namespace MapoDataFiller public class MConf { public string ConfDir { get; set; } = ""; - public string FillMode { get; set; } = ""; + public string CodIOB { get; set; } = ""; public bool HasHeader { get; set; } = false; public string TimeTable { get; set; } = ""; public string OutFolder { get; set; } = ""; @@ -21,7 +21,7 @@ namespace MapoDataFiller public MConf() { ConfDir = @"C:\temp\Interclays\"; - FillMode = "NONE"; + CodIOB = "NONE"; HasHeader = false; TimeTable = "Demo.csv"; OutFolder = @"C:\temp\Interclays\Out"; diff --git a/MapoDataFiller/MapoDataFiller.csproj b/MapoDataFiller/MapoDataFiller.csproj index 23e2786..ad1f3dd 100644 --- a/MapoDataFiller/MapoDataFiller.csproj +++ b/MapoDataFiller/MapoDataFiller.csproj @@ -16,6 +16,12 @@ Always + + Always + + + Always + diff --git a/MapoDataFiller/Program.cs b/MapoDataFiller/Program.cs index f209a4e..3c47632 100644 --- a/MapoDataFiller/Program.cs +++ b/MapoDataFiller/Program.cs @@ -29,67 +29,103 @@ while (!pathOk) pathOk = AnsiConsole.Confirm("Confermi ConfDir?"); } -AnsiConsole.MarkupLineInterpolated($"Conf FillMode: [yellow]{currConf.FillMode}[/]"); -var fillOK = AnsiConsole.Confirm("Confermi FillMode?"); -while (!fillOK) +// ora leggo i file di conf yaml e presento opzione... +if (!Directory.Exists(currConf.ConfDir)) { - currConf.FillMode = AnsiConsole.Ask("Inserisci il modo desiderato:"); - AnsiConsole.WriteLine(currConf.FillMode); - fillOK = AnsiConsole.Confirm("Confermi FillMode?"); + // segnalo errore, credo directory + AnsiConsole.WriteLine("Conf directory not found! exiting..."); + Directory.CreateDirectory(currConf.ConfDir); } - -AnsiConsole.MarkupLineInterpolated($"Conf HasHeader: [yellow]{currConf.HasHeader}[/]"); -var headOK = AnsiConsole.Confirm("Confermi HasHeader?"); -while (!headOK) +else { - currConf.HasHeader = AnsiConsole.Ask("HasHeader (true/false)?"); - AnsiConsole.WriteLine(currConf.HasHeader); - headOK = AnsiConsole.Confirm("Confermi HasHeader?"); -} - -// leggo timetable -string filePath = Path.Combine(currConf.ConfDir, currConf.TimeTable); -if (File.Exists(filePath)) -{ - var righe = File.ReadAllLines(filePath).ToList(); - // se devo saltare - if (currConf.HasHeader) + // leggo elenco file yaml e presento alternativa + var fileOpt = Directory.GetFiles(currConf.ConfDir, "*.yaml"); + if (fileOpt.Length == 0) { - righe = righe.Skip(1).ToList(); + AnsiConsole.WriteLine("Sim Conf file not found, exiting!"); } - // svuoto cartella output - if (!Directory.Exists(currConf.OutFolder)) + else { - Directory.CreateDirectory(currConf.OutFolder); - } - var fileList = Directory.GetFiles(currConf.OutFolder); - foreach (var file in fileList) - { - File.Delete(file); - } + var fileSel = AnsiConsole.Prompt( + new SelectionPrompt() + .Title("Quale file vuoi [green]processare[/]?") + .PageSize(10) + .MoreChoicesText("[grey](Usare up/down per scorrere)[/]") + .AddChoices(fileOpt)); - // verifico quale oggetto sim avviare... x ora SOLO interclays - InterClays currSim = new InterClays(); - // ciclo su ogni record - foreach (var riga in righe) - { - // recupero dati del giorno corrente - var giornata = new DayConf("CsvDateDur", riga); - - var simDataBlock = currSim.GetDataRows(currConf.FillMode, giornata); - // scrivo sul file mensile i dati del singolo giorno... - string pathFileFL = Path.Combine(currConf.OutFolder, $"{currConf.FillMode}_FL_{giornata.dtStart:yyyy-MM}.csv"); - if (!File.Exists(pathFileFL)) + // leggo la conf del file selezionato... + if (!string.IsNullOrEmpty(fileSel)) { - File.WriteAllText(pathFileFL,""); + currConf = CMan.readConf(fileSel); + +#if false + // procedo come prima + AnsiConsole.MarkupLineInterpolated($"Conf FillMode: [yellow]{currConf.FillMode}[/]"); + var fillOK = AnsiConsole.Confirm("Confermi FillMode?"); + while (!fillOK) + { + currConf.FillMode = AnsiConsole.Ask("Inserisci il modo desiderato:"); + AnsiConsole.WriteLine(currConf.FillMode); + fillOK = AnsiConsole.Confirm("Confermi FillMode?"); + } + + AnsiConsole.MarkupLineInterpolated($"Conf HasHeader: [yellow]{currConf.HasHeader}[/]"); + var headOK = AnsiConsole.Confirm("Confermi HasHeader?"); + while (!headOK) + { + currConf.HasHeader = AnsiConsole.Ask("HasHeader (true/false)?"); + AnsiConsole.WriteLine(currConf.HasHeader); + headOK = AnsiConsole.Confirm("Confermi HasHeader?"); + } +#endif + + // leggo timetable + string filePath = Path.Combine(currConf.ConfDir, currConf.TimeTable); + if (File.Exists(filePath)) + { + var righe = File.ReadAllLines(filePath).ToList(); + // se devo saltare + if (currConf.HasHeader) + { + righe = righe.Skip(1).ToList(); + } + // svuoto cartella output + if (!Directory.Exists(currConf.OutFolder)) + { + Directory.CreateDirectory(currConf.OutFolder); + } + var fileList = Directory.GetFiles(currConf.OutFolder); + foreach (var file in fileList) + { + File.Delete(file); + } + + // verifico quale oggetto sim avviare... x ora SOLO interclays + InterClays currSim = new InterClays(); + // ciclo su ogni record + foreach (var riga in righe) + { + // recupero dati del giorno corrente + var giornata = new DayConf("CsvDateDur", riga); + + var simDataBlock = currSim.GetDataRows(currConf.CodIOB, giornata); + // scrivo sul file annuale i dati del singolo giorno... + string pathFileFL = Path.Combine(currConf.OutFolder, $"{currConf.CodIOB}_FL_{giornata.dtStart:yyyy}.csv"); + if (!File.Exists(pathFileFL)) + { + File.WriteAllText(pathFileFL, ""); + } + string pathFileEL = Path.Combine(currConf.OutFolder, $"{currConf.CodIOB}_EL_{giornata.dtStart:yyyy}.csv"); + if (!File.Exists(pathFileEL)) + { + File.WriteAllText(pathFileEL, ""); + } + // vado in append... + File.AppendAllLines(pathFileFL, simDataBlock.FlList); + File.AppendAllLines(pathFileEL, simDataBlock.EvList); + } + } } - string pathFileEL = Path.Combine(currConf.OutFolder, $"{currConf.FillMode}_EL_{giornata.dtStart:yyyy-MM}.csv"); - if (!File.Exists(pathFileEL)) - { - File.WriteAllText(pathFileEL, ""); - } - // vado in append... - File.AppendAllLines(pathFileFL, simDataBlock.FlList); - File.AppendAllLines(pathFileEL, simDataBlock.EvList); } -} + +} \ No newline at end of file diff --git a/MapoDataFiller/conf.yaml b/MapoDataFiller/conf.yaml index 34ae8e5..ed6c122 100644 --- a/MapoDataFiller/conf.yaml +++ b/MapoDataFiller/conf.yaml @@ -1,6 +1,6 @@ --- ConfDir: C:\temp\Interclays -FillMode: Interclays02 +CodIOB: INTERCL_02 HasHeader: true TimeTable: Interclays02.csv OutFolder: C:\temp\Interclays\Out From c77e776ca794e9d971c71d7884a09e915de8f448 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 5 May 2023 19:44:47 +0200 Subject: [PATCH 08/15] OK x obj decodifica --- MapoDataFiller/Conf/INTERCL_01.json | 103 ++++++++++++++++++++++++ MapoDataFiller/Conf/INTERCL_01.yaml | 113 --------------------------- MapoDataFiller/Conf/INTERCL_02.json | 103 ++++++++++++++++++++++++ MapoDataFiller/Conf/INTERCL_02.yaml | 88 --------------------- MapoDataFiller/Filler/InterClays.cs | 2 +- MapoDataFiller/FluxStats.cs | 9 +-- MapoDataFiller/MapoDataFiller.csproj | 5 +- 7 files changed, 213 insertions(+), 210 deletions(-) create mode 100644 MapoDataFiller/Conf/INTERCL_01.json delete mode 100644 MapoDataFiller/Conf/INTERCL_01.yaml create mode 100644 MapoDataFiller/Conf/INTERCL_02.json delete mode 100644 MapoDataFiller/Conf/INTERCL_02.yaml diff --git a/MapoDataFiller/Conf/INTERCL_01.json b/MapoDataFiller/Conf/INTERCL_01.json new file mode 100644 index 0000000..c143703 --- /dev/null +++ b/MapoDataFiller/Conf/INTERCL_01.json @@ -0,0 +1,103 @@ +{ + "SetupSimFloat": { + "Temp_Filtro": { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + "T_Attuale_Cil": { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + "Flowrate": { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + "Ampere_Cil": { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15, + 99: 16.4, + 100: 79.1 + }, + "Ampere_Asp": { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + "Ampere_Dosat": { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } + }, + "SetupSimInt": { + "Dep_Cil_mmH2O": { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 + }, + "Bruc_0_100": { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 + }, + "Asp_0_100": { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 + } + }, + "SetupDtData": { + "Tot_Parz_Dosatore": { + "2020-06-30 19:56:21": 1225.481, + "2020-11-16 13:01:33": 5419.626, + "2022-03-14 11:33:21": 20782.475, + "2022-11-21 08:48:21": 27770.447, + "2023-03-07 15:40:44": 30951.118 + }, + "Tot_Dosatore": { + "2020-06-30 19:56:21": 9053.072, + "2020-11-16 13:01:33": 13247.217, + "2022-03-14 11:33:21": 28610.066, + "2022-11-21 08:48:21": 35598.038, + "2023-03-07 15:40:44": 38778.709 + } + } +} \ No newline at end of file diff --git a/MapoDataFiller/Conf/INTERCL_01.yaml b/MapoDataFiller/Conf/INTERCL_01.yaml deleted file mode 100644 index 1f0024d..0000000 --- a/MapoDataFiller/Conf/INTERCL_01.yaml +++ /dev/null @@ -1,113 +0,0 @@ ---- -SetupSimInt: { - Temp_Filtro: - { - 0: 0.1, - 1: 5.6, - 25: 89.1, - 50: 103.7, - 75: 108.3, - 99: 118.1, - 100: 135.6 - }, - T_Attuale_Cil: - { - 0: 0.01, - 1: 0.65, - 25: 10.36, - 50: 11.46, - 75: 11.98, - 99: 13.99, - 100: 327.67 - }, - Flowrate: - { - 0: 0.01, - 1: 0.06, - 25: 5.34, - 50: 8.22, - 75: 9.48, - 99: 12.86, - 100: 262.8 - }, - Ampere_Cil: - { - 0: 10.6, - 1: 14.1, - 25: 14.4, - 50: 14.6, - 75: 15.0, - 99: 16.4, - 100: 79.1 - }, - Ampere_Asp: - { - 0: 12.1, - 1: 14.8, - 25: 15.9, - 50: 17.2, - 75: 22.1, - 99: 32.4, - 100: 87.3 - }, - Ampere_Dosat: - { - 0: 0.1, - 1: 1.8, - 25: 2, - 50: 2, - 75: 2.1, - 99: 2.4, - 100: 3.3 - } -} -SetupSimFloat: { - Dep_Cil_mmH2O: - { - 0: 1, - 1: 1, - 25: 5, - 50: 10, - 75: 15, - 99: 26, - 100: 52 - }, - Bruc_0_100: - { - 0: 1, - 1: 17, - 25: 24, - 50: 33, - 75: 47, - 99: 71, - 100: 100 - }, - Asp_0_100: - { - 0: 3, - 1: 36, - 25: 52, - 50: 59, - 75: 77, - 99: 100, - 100: 100 - } -} -SetupDtData: { - Tot_Parz_Dosatore: - { - 2020-06-30 19:56:21: 1225.481, - 2020-11-16 13:01:33: 5419.626, - 2022-03-14 11:33:21: 20782.475, - 2022-11-21 08:48:21: 27770.447, - 2023-03-07 15:40:44: 30951.118 - }, - Tot_Dosatore: - { - 2020-06-30 19:56:21: 9053.072, - 2020-11-16 13:01:33: 13247.217, - 2022-03-14 11:33:21: 28610.066, - 2022-11-21 08:48:21: 35598.038, - 2023-03-07 15:40:44: 38778.709 - } -} \ No newline at end of file diff --git a/MapoDataFiller/Conf/INTERCL_02.json b/MapoDataFiller/Conf/INTERCL_02.json new file mode 100644 index 0000000..c143703 --- /dev/null +++ b/MapoDataFiller/Conf/INTERCL_02.json @@ -0,0 +1,103 @@ +{ + "SetupSimFloat": { + "Temp_Filtro": { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + "T_Attuale_Cil": { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + "Flowrate": { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + "Ampere_Cil": { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15, + 99: 16.4, + 100: 79.1 + }, + "Ampere_Asp": { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + "Ampere_Dosat": { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } + }, + "SetupSimInt": { + "Dep_Cil_mmH2O": { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 + }, + "Bruc_0_100": { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 + }, + "Asp_0_100": { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 + } + }, + "SetupDtData": { + "Tot_Parz_Dosatore": { + "2020-06-30 19:56:21": 1225.481, + "2020-11-16 13:01:33": 5419.626, + "2022-03-14 11:33:21": 20782.475, + "2022-11-21 08:48:21": 27770.447, + "2023-03-07 15:40:44": 30951.118 + }, + "Tot_Dosatore": { + "2020-06-30 19:56:21": 9053.072, + "2020-11-16 13:01:33": 13247.217, + "2022-03-14 11:33:21": 28610.066, + "2022-11-21 08:48:21": 35598.038, + "2023-03-07 15:40:44": 38778.709 + } + } +} \ No newline at end of file diff --git a/MapoDataFiller/Conf/INTERCL_02.yaml b/MapoDataFiller/Conf/INTERCL_02.yaml deleted file mode 100644 index eecf920..0000000 --- a/MapoDataFiller/Conf/INTERCL_02.yaml +++ /dev/null @@ -1,88 +0,0 @@ ---- -SetupSimInt: - Temp_Filtro: - "0": 0.1 - "1": 5.6 - "25": 89.1 - "50": 103.7 - "75": 108.3 - "99": 118.1 - "100": 135.6 - T_Attuale_Cil: - "0": 0.01 - "1": 0.65 - "25": 10.36 - "50": 11.46 - "75": 11.98 - "99": 13.99 - "100": 327.67 - Flowrate: - "0": 0.01 - "1": 0.06 - "25": 5.34 - "50": 8.22 - "75": 9.48 - "99": 12.86 - "100": 262.8 - Ampere_Cil: - "0": 10.6 - "1": 14.1 - "25": 14.4 - "50": 14.6 - "75": 15 - "99": 16.4 - "100": 79.1 - Ampere_Asp: - "0": 12.1 - "1": 14.8 - "25": 15.9 - "50": 17.2 - "75": 22.1 - "99": 32.4 - "100": 87.3 - Ampere_Dosat: - "0": 0.1 - "1": 1.8 - "25": 2 - "50": 2 - "75": 2.1 - "99": 2.4 - "100": 3.3 -SetupSimFloat: - Dep_Cil_mmH2O: - "0": 1 - "1": 1 - "25": 5 - "50": 10 - "75": 15 - "99": 26 - "100": 52 - Bruc_0_100: - "0": 1 - "1": 17 - "25": 24 - "50": 33 - "75": 47 - "99": 71 - "100": 100 - Asp_0_100: - "0": 3 - "1": 36 - "25": 52 - "50": 59 - "75": 77 - "99": 100 - "100": 100 -SetupDtData: - Tot_Parz_Dosatore: - 2020-06-30 19:56:21: 1225.481 - 2020-11-16 13:01:33: 5419.626 - 2022-03-14 11:33:21: 20782.475 - 2022-11-21 08:48:21: 27770.447 - 2023-03-07 15:40:44: 30951.118 - Tot_Dosatore: - 2020-06-30 19:56:21: 9053.072 - 2020-11-16 13:01:33: 13247.217 - 2022-03-14 11:33:21: 28610.066 - 2022-11-21 08:48:21: 35598.038 - 2023-03-07 15:40:44: 38778.709 diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index e5048a8..e432578 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -18,7 +18,7 @@ /// public SimBlock GetDataRows(string CodIOB, DayConf currDay) { - string fileConf = Path.Combine("Conf", $"{CodIOB}.yaml"); + string fileConf = Path.Combine("Conf", $"{CodIOB}.json"); if (File.Exists(fileConf)) { currSetup = SimSetup.readConf(fileConf); diff --git a/MapoDataFiller/FluxStats.cs b/MapoDataFiller/FluxStats.cs index 866c18e..c90a84f 100644 --- a/MapoDataFiller/FluxStats.cs +++ b/MapoDataFiller/FluxStats.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization; +using Newtonsoft.Json; namespace MapoDataFiller { @@ -19,13 +20,9 @@ namespace MapoDataFiller SimSetup retObj = new SimSetup(); if (File.Exists(filePath)) { - var deserializer = new DeserializerBuilder() - .WithNamingConvention(new PascalCaseNamingConvention()) - .Build(); string rawData = File.ReadAllText(filePath); - - var input = new StringReader(rawData); - retObj = deserializer.Deserialize(input); + var rawDecode = JsonConvert.DeserializeObject(rawData); + retObj = rawDecode != null ? rawDecode : new SimSetup(); } return retObj; } diff --git a/MapoDataFiller/MapoDataFiller.csproj b/MapoDataFiller/MapoDataFiller.csproj index ad1f3dd..5e57c73 100644 --- a/MapoDataFiller/MapoDataFiller.csproj +++ b/MapoDataFiller/MapoDataFiller.csproj @@ -8,6 +8,7 @@ + @@ -16,10 +17,10 @@ Always - + Always - + Always From 42cd703d0d7bad8014e79992a798120d2fbcf496 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 8 May 2023 17:45:46 +0200 Subject: [PATCH 09/15] update x simulazione FL interclays01 --- MapoDataFiller/Filler/InterClays.cs | 216 ++++++++++++++++++++++++---- MapoDataFiller/FluxStats.cs | 4 +- 2 files changed, 192 insertions(+), 28 deletions(-) diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index e432578..0ec463a 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -51,24 +51,14 @@ // verifico il tipo di CodIOB if (CodIOB == "INTERCL_01") { - // verifico se DEVO finire caricamento... - if (valCurr < valReq) - { - doProd = true; - } - else - { - // tiro a dadi x decidere SE ho pesate nel periodo... 30% dei casi - doProd = (rnd.Next(0, 100) <= 30); + // tiro a dadi x decidere SE LAVORA periodo... 60% dei casi + doProd = (rnd.Next(0, 100) <= 60); - // FluxLOG: SE ho pesate --> genero target - valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; - } // FluxLOG: genero righe FL x periodo e sommo - nextRowsFL = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); + nextRowsFL = IC_ESS_getFlRows(CodIOB, dtStart, dtEnd, doProd, ref idxFl); - // EvList: genero righe FL x periodo e sommo - nextRowsEV = IC_OX_getEvRows(dtStart, dtEnd, doProd, ref idxEv); + // EvList: genero righe EV x periodo e sommo + nextRowsEV = IC_ESS_getEvRows(CodIOB, dtStart, dtEnd, doProd, ref idxEv); } else if (CodIOB == "INTERCL_02") { @@ -86,10 +76,10 @@ valReq = doProd ? rnd.Next(valMin / valStep, valMax / valStep) * valStep : 0; } // FluxLOG: genero righe FL x periodo e sommo - nextRowsFL = IC_OX_getFlRows(dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); + nextRowsFL = IC_OX_getFlRows(CodIOB, dtStart, dtEnd, doProd, valReq, ref idxFl, ref valCurr); - // EvList: genero righe FL x periodo e sommo - nextRowsEV = IC_OX_getEvRows(dtStart, dtEnd, doProd, ref idxEv); + // EvList: genero righe EV x periodo e sommo + nextRowsEV = IC_OX_getEvRows(CodIOB, dtStart, dtEnd, doProd, ref idxEv); } // accodo FL answ.FlList.AddRange(nextRowsFL); @@ -129,12 +119,13 @@ /// /// Simulo un blocco dati FL /// + /// /// /// /// /// /// - protected List IC_OX_getEvRows(DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) + protected List IC_OX_getEvRows(string CodIOB, DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) { List rows = new List(); DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(1000, 60000)); @@ -144,9 +135,9 @@ // se produce registro poweron... if (doProd) { - currRow = $"INTERCL_02;{dtStart.AddSeconds(5):yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; + currRow = $"{CodIOB};{dtStart.AddSeconds(5):yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; rows.Add(currRow); - currRow = $"INTERCL_02;{dtEnd.AddSeconds(-5):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + currRow = $"{CodIOB};{dtEnd.AddSeconds(-5):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; rows.Add(currRow); } // se NON produce alterno valori spenta/accesa @@ -155,10 +146,10 @@ // genera i dati secondo lo schema configurato... con periodo da 15" a 15 min di pausa while (dtCurs < dtEnd) { - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; rows.Add(currRow); dtCurs = dtCurs.AddSeconds(rnd.Next(60 * 5, 60 * 15)); - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(500, 5000)); // reset counter @@ -171,6 +162,7 @@ /// /// Simulo un blocco dati FL /// + /// /// /// /// @@ -178,7 +170,7 @@ /// /// /// - protected List IC_OX_getFlRows(DateTime dtStart, DateTime dtEnd, bool doProd, int valReq, ref int idxCount, ref int valCurr) + protected List IC_OX_getFlRows(string CodIOB, DateTime dtStart, DateTime dtEnd, bool doProd, int valReq, ref int idxCount, ref int valCurr) { List rows = new List(); DateTime dtCurs = dtStart; @@ -190,10 +182,10 @@ // genera i dati secondo lo schema configurato... while (dtCurs < dtEnd) { - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgImp;{valReq};{idxCount++}"; + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgImp;{valReq};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 300)); - currRow = $"INTERCL_02;{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valCurr};{idxCount++}"; + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valCurr};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(27000, 33000)); // incremento peso... SE <= max... @@ -207,6 +199,178 @@ return rows; } + + /// + /// Simulo un blocco dati FL + /// + /// + /// + /// + /// + /// + /// + protected List IC_ESS_getEvRows(string CodIOB, DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) + { + List rows = new List(); + DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(1000, 60000)); + string currRow = ""; + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + // se produce registro poweron... + if (doProd) + { + currRow = $"{CodIOB};{dtStart.AddSeconds(5):yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; + rows.Add(currRow); + currRow = $"{CodIOB};{dtEnd.AddSeconds(-5):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + rows.Add(currRow); + } + // se NON produce alterno valori spenta/accesa + else + { + // genera i dati secondo lo schema configurato... con periodo da 15" a 15 min di pausa + while (dtCurs < dtEnd) + { + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + rows.Add(currRow); + dtCurs = dtCurs.AddSeconds(rnd.Next(60 * 5, 60 * 15)); + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(500, 5000)); + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + } + } + return rows; + } + + /// + /// Simulo un blocco dati FL + /// + /// + /// + /// + /// + /// + /// + /// + /// + protected List IC_ESS_getFlRows(string CodIOB, DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) + { + List rows = new List(); + DateTime dtCurs = dtStart; + int simInt = 0; + double simReal = 0; + double simDTime = 0; + // se è do prod --> simulo 50° percentile in su, altrimenti primi 50 percentili... + string currRow = ""; + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + // genera i dati secondo lo schema configurato... + while (dtCurs < dtEnd) + { + // in primis genero gli items INT + if (currSetup.SetupSimInt.Count > 0) + { + foreach (var item in currSetup.SetupSimInt) + { + simInt = simValInt(doProd, item.Key, item.Value); + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simInt};{idxCount++}"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + } + } + + // poi gli item FLOAT + if (currSetup.SetupSimReal.Count > 0) + { + foreach (var item in currSetup.SetupSimReal) + { + simReal = simValReal(doProd, item.Key, item.Value); + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simInt};{idxCount++}"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + } + } + + // infine certo gli items basati su datetime + + + +#if false + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgImp;{valReq};{idxCount++}"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 300)); + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valCurr};{idxCount++}"; + rows.Add(currRow); + // incremento peso... SE <= max... + if (valCurr < valTo) + { + valCurr += rnd.Next(stepMin / valStep, stepMax / valStep) * valStep; + } +#endif + dtCurs = dtCurs.AddMilliseconds(rnd.Next(27000, 33000)); + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; + } + return rows; + } + /// + /// Simulazione valore int secondo tab transcodifica: + /// doProd=true --> simulo 50° percentile in su, altrimenti primi 50 percentili... + /// + /// + /// + /// + /// + protected int simValInt(bool doProd, string codFlux, Dictionary transcMap) + { + int result = 0; + // se è in prod --> 50° perc in su... + int rawSim = rnd.Next(0, 50) + (doProd ? 50 : 0); + if (currSetup.SetupSimInt.ContainsKey(codFlux)) + { + // transcodifico + var val0 = transcMap + .Where(x => x.Key <= rawSim) + .OrderByDescending(x => x.Value) + .FirstOrDefault(); + var val1 = transcMap + .Where(x => x.Key >= rawSim) + .OrderBy(x => x.Value) + .FirstOrDefault(); + result = val0.Value + (int)Math.Round((double)(val1.Value - val0.Value) * (rawSim - val0.Key) / (val1.Key - val0.Key), 0); + } + return result; + } + /// + /// Simulazione valore int secondo tab transcodifica: + /// doProd=true --> simulo 50° percentile in su, altrimenti primi 50 percentili... + /// + /// + /// + /// + /// + protected double simValReal(bool doProd, string codFlux, Dictionary transcMap) + { + double result = 0; + // se è in prod --> 50° perc in su... + int rawSim = rnd.Next(0, 50) + (doProd ? 50 : 0); + if (currSetup.SetupSimInt.ContainsKey(codFlux)) + { + // transcodifico + var val0 = transcMap + .Where(x => x.Key <= rawSim) + .OrderByDescending(x => x.Value) + .FirstOrDefault(); + var val1 = transcMap + .Where(x => x.Key >= rawSim) + .OrderBy(x => x.Value) + .FirstOrDefault(); + result = val0.Value + Math.Round((val1.Value - val0.Value) * (rawSim - val0.Key) / (val1.Key - val0.Key), 0); + } + return result; + } + #endregion Protected Methods } } \ No newline at end of file diff --git a/MapoDataFiller/FluxStats.cs b/MapoDataFiller/FluxStats.cs index c90a84f..202bdd5 100644 --- a/MapoDataFiller/FluxStats.cs +++ b/MapoDataFiller/FluxStats.cs @@ -12,8 +12,8 @@ namespace MapoDataFiller public class SimSetup { public Dictionary> SetupSimInt { get; set; } = new Dictionary>(); - public Dictionary> SetupSimFloat { get; set; } = new Dictionary>(); - public Dictionary> SetupDtData { get; set; } = new Dictionary>(); + public Dictionary> SetupSimReal { get; set; } = new Dictionary>(); + public Dictionary> SetupDtData { get; set; } = new Dictionary>(); public static SimSetup readConf(string filePath) { From 5452069e788a4619e75b77690abf228ad8104f26 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 8 May 2023 19:39:05 +0200 Subject: [PATCH 10/15] Completato setup + sim x FL di interclays01 --- MapoDataFiller/Conf/INTERCL_01.json | 229 ++++++++++++++++------------ MapoDataFiller/Conf/INTERCL_02.json | 196 ++++++++++++------------ MapoDataFiller/Filler/InterClays.cs | 110 +++++++------ 3 files changed, 293 insertions(+), 242 deletions(-) diff --git a/MapoDataFiller/Conf/INTERCL_01.json b/MapoDataFiller/Conf/INTERCL_01.json index c143703..5e4fc3d 100644 --- a/MapoDataFiller/Conf/INTERCL_01.json +++ b/MapoDataFiller/Conf/INTERCL_01.json @@ -1,103 +1,136 @@ { - "SetupSimFloat": { - "Temp_Filtro": { - 0: 0.1, - 1: 5.6, - 25: 89.1, - 50: 103.7, - 75: 108.3, - 99: 118.1, - 100: 135.6 - }, - "T_Attuale_Cil": { - 0: 0.01, - 1: 0.65, - 25: 10.36, - 50: 11.46, - 75: 11.98, - 99: 13.99, - 100: 327.67 - }, - "Flowrate": { - 0: 0.01, - 1: 0.06, - 25: 5.34, - 50: 8.22, - 75: 9.48, - 99: 12.86, - 100: 262.8 - }, - "Ampere_Cil": { - 0: 10.6, - 1: 14.1, - 25: 14.4, - 50: 14.6, - 75: 15, - 99: 16.4, - 100: 79.1 - }, - "Ampere_Asp": { - 0: 12.1, - 1: 14.8, - 25: 15.9, - 50: 17.2, - 75: 22.1, - 99: 32.4, - 100: 87.3 - }, - "Ampere_Dosat": { - 0: 0.1, - 1: 1.8, - 25: 2, - 50: 2, - 75: 2.1, - 99: 2.4, - 100: 3.3 - } + "SetupSimInt": { + "Dep_Cil_mmH2O": { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 }, - "SetupSimInt": { - "Dep_Cil_mmH2O": { - 0: 1, - 1: 1, - 25: 5, - 50: 10, - 75: 15, - 99: 26, - 100: 52 - }, - "Bruc_0_100": { - 0: 1, - 1: 17, - 25: 24, - 50: 33, - 75: 47, - 99: 71, - 100: 100 - }, - "Asp_0_100": { - 0: 3, - 1: 36, - 25: 52, - 50: 59, - 75: 77, - 99: 100, - 100: 100 - } + "Bruc_0_100": { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 }, - "SetupDtData": { - "Tot_Parz_Dosatore": { - "2020-06-30 19:56:21": 1225.481, - "2020-11-16 13:01:33": 5419.626, - "2022-03-14 11:33:21": 20782.475, - "2022-11-21 08:48:21": 27770.447, - "2023-03-07 15:40:44": 30951.118 - }, - "Tot_Dosatore": { - "2020-06-30 19:56:21": 9053.072, - "2020-11-16 13:01:33": 13247.217, - "2022-03-14 11:33:21": 28610.066, - "2022-11-21 08:48:21": 35598.038, - "2023-03-07 15:40:44": 38778.709 - } + "Asp_0_100": { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 } + }, + "SetupSimReal": { + "Temp_Filtro": { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + "T_Attuale_Cil": { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + "Flowrate": { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + "Ampere_Cil": { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15, + 99: 16.4, + 100: 79.1 + }, + "Ampere_Asp": { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + "Ampere_Dosat": { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } + }, + "SetupDtData": { + "Tot_Parz_Dosatore": { + "2019-11-29 02:24:13": 3619.129, + "2020-01-08 13:56:24": 4101.16, + "2020-01-12 17:34:34": 4201.494, + "2020-01-12 17:34:35": 0, + "2020-01-17 17:34:35": 119.352, + "2020-01-31 11:39:32": 471.494, + "2020-02-07 19:38:58": 606.883, + "2020-03-19 23:59:53": 2112.625, + "2020-04-23 20:38:32": 2929.045, + "2020-05-15 17:30:57": 3500.943, + "2020-05-15 17:30:58": 447.943, + "2020-05-15 20:04:57": 457.217, + "2020-05-15 20:04:58": 0, + "2020-06-12 19:19:36": 736.229, + "2020-06-30 19:56:21": 1225.481, + "2020-07-14 20:05:37": 1828.772, + "2020-07-28 20:15:55": 2358.175, + "2020-09-30 11:29:26": 4081.050, + "2020-11-16 13:01:33": 5419.626, + "2021-11-24 12:50:37": 16632.060, + "2022-01-14 20:07:39": 18187.904, + "2022-03-14 11:33:21": 20782.475, + "2022-11-21 08:48:21": 27770.447, + "2023-03-07 15:40:44": 30951.118 + }, + "Tot_Dosatore": { + "2019-11-29 02:24:14": 3770.426, + "2020-01-08 13:56:24": 4252.457, + "2020-01-17 17:34:35": 4465.844, + "2020-01-31 11:39:32": 4817.986, + "2020-02-07 19:38:58": 4953.375, + "2020-03-19 23:59:53": 6459.117, + "2020-04-23 20:38:32": 7275.537, + "2020-05-15 17:30:58": 7818.401, + "2020-06-12 19:19:36": 8563.820, + "2020-06-30 19:56:21": 9053.072, + "2020-07-14 20:05:37": 9656.363, + "2020-07-28 20:15:55": 10185.766, + "2020-09-30 11:29:26": 11908.641, + "2020-11-16 13:01:33": 13247.217, + "2021-11-24 12:50:37": 24459.651, + "2022-01-14 20:07:39": 26015.495, + "2022-03-14 11:33:21": 28610.066, + "2022-11-21 08:48:21": 35598.038, + "2023-03-07 15:40:44": 38778.709 + } + } } \ No newline at end of file diff --git a/MapoDataFiller/Conf/INTERCL_02.json b/MapoDataFiller/Conf/INTERCL_02.json index c143703..1a37234 100644 --- a/MapoDataFiller/Conf/INTERCL_02.json +++ b/MapoDataFiller/Conf/INTERCL_02.json @@ -1,103 +1,103 @@ { - "SetupSimFloat": { - "Temp_Filtro": { - 0: 0.1, - 1: 5.6, - 25: 89.1, - 50: 103.7, - 75: 108.3, - 99: 118.1, - 100: 135.6 - }, - "T_Attuale_Cil": { - 0: 0.01, - 1: 0.65, - 25: 10.36, - 50: 11.46, - 75: 11.98, - 99: 13.99, - 100: 327.67 - }, - "Flowrate": { - 0: 0.01, - 1: 0.06, - 25: 5.34, - 50: 8.22, - 75: 9.48, - 99: 12.86, - 100: 262.8 - }, - "Ampere_Cil": { - 0: 10.6, - 1: 14.1, - 25: 14.4, - 50: 14.6, - 75: 15, - 99: 16.4, - 100: 79.1 - }, - "Ampere_Asp": { - 0: 12.1, - 1: 14.8, - 25: 15.9, - 50: 17.2, - 75: 22.1, - 99: 32.4, - 100: 87.3 - }, - "Ampere_Dosat": { - 0: 0.1, - 1: 1.8, - 25: 2, - 50: 2, - 75: 2.1, - 99: 2.4, - 100: 3.3 - } + "SetupSimInt": { + "Dep_Cil_mmH2O": { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 }, - "SetupSimInt": { - "Dep_Cil_mmH2O": { - 0: 1, - 1: 1, - 25: 5, - 50: 10, - 75: 15, - 99: 26, - 100: 52 - }, - "Bruc_0_100": { - 0: 1, - 1: 17, - 25: 24, - 50: 33, - 75: 47, - 99: 71, - 100: 100 - }, - "Asp_0_100": { - 0: 3, - 1: 36, - 25: 52, - 50: 59, - 75: 77, - 99: 100, - 100: 100 - } + "Bruc_0_100": { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 }, - "SetupDtData": { - "Tot_Parz_Dosatore": { - "2020-06-30 19:56:21": 1225.481, - "2020-11-16 13:01:33": 5419.626, - "2022-03-14 11:33:21": 20782.475, - "2022-11-21 08:48:21": 27770.447, - "2023-03-07 15:40:44": 30951.118 - }, - "Tot_Dosatore": { - "2020-06-30 19:56:21": 9053.072, - "2020-11-16 13:01:33": 13247.217, - "2022-03-14 11:33:21": 28610.066, - "2022-11-21 08:48:21": 35598.038, - "2023-03-07 15:40:44": 38778.709 - } + "Asp_0_100": { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 } + }, + "SetupSimReal": { + "Temp_Filtro": { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + "T_Attuale_Cil": { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + "Flowrate": { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + "Ampere_Cil": { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15, + 99: 16.4, + 100: 79.1 + }, + "Ampere_Asp": { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + "Ampere_Dosat": { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } + }, + "SetupDtData": { + "Tot_Parz_Dosatore": { + "2020-06-30 19:56:21": 1225.481, + "2020-11-16 13:01:33": 5419.626, + "2022-03-14 11:33:21": 20782.475, + "2022-11-21 08:48:21": 27770.447, + "2023-03-07 15:40:44": 30951.118 + }, + "Tot_Dosatore": { + "2020-06-30 19:56:21": 9053.072, + "2020-11-16 13:01:33": 13247.217, + "2022-03-14 11:33:21": 28610.066, + "2022-11-21 08:48:21": 35598.038, + "2023-03-07 15:40:44": 38778.709 + } + } } \ No newline at end of file diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index 0ec463a..ad2df43 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -277,38 +277,36 @@ currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simInt};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + idxCount = idxCount <= 9999 ? idxCount : 0; } } - - // poi gli item FLOAT + // poi gli item REAL if (currSetup.SetupSimReal.Count > 0) { foreach (var item in currSetup.SetupSimReal) { simReal = simValReal(doProd, item.Key, item.Value); - currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simInt};{idxCount++}"; + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simReal};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + idxCount = idxCount <= 9999 ? idxCount : 0; + } + } + // infine certo gli items basati su datetime + if (currSetup.SetupDtData.Count > 0 && doProd) + { + foreach (var item in currSetup.SetupDtData) + { + simReal = simValData(dtCurs, item.Key, item.Value); + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simReal};{idxCount++}"; + rows.Add(currRow); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + idxCount = idxCount <= 9999 ? idxCount : 0; } } - // infine certo gli items basati su datetime - - -#if false - currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgImp;{valReq};{idxCount++}"; - rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 300)); - currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};kgAct;{valCurr};{idxCount++}"; - rows.Add(currRow); - // incremento peso... SE <= max... - if (valCurr < valTo) - { - valCurr += rnd.Next(stepMin / valStep, stepMax / valStep) * valStep; - } -#endif - dtCurs = dtCurs.AddMilliseconds(rnd.Next(27000, 33000)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(87000, 93000)); // reset counter idxCount = idxCount <= 9999 ? idxCount : 0; } @@ -327,23 +325,20 @@ int result = 0; // se è in prod --> 50° perc in su... int rawSim = rnd.Next(0, 50) + (doProd ? 50 : 0); - if (currSetup.SetupSimInt.ContainsKey(codFlux)) - { - // transcodifico - var val0 = transcMap - .Where(x => x.Key <= rawSim) - .OrderByDescending(x => x.Value) - .FirstOrDefault(); - var val1 = transcMap - .Where(x => x.Key >= rawSim) - .OrderBy(x => x.Value) - .FirstOrDefault(); - result = val0.Value + (int)Math.Round((double)(val1.Value - val0.Value) * (rawSim - val0.Key) / (val1.Key - val0.Key), 0); - } + // transcodifico + var val0 = transcMap + .Where(x => x.Key <= rawSim) + .OrderByDescending(x => x.Value) + .FirstOrDefault(); + var val1 = transcMap + .Where(x => x.Key >= rawSim) + .OrderBy(x => x.Value) + .FirstOrDefault(); + result = val0.Value + (int)Math.Round((double)(val1.Value - val0.Value) * (rawSim - val0.Key) / (val1.Key - val0.Key), 0); return result; } /// - /// Simulazione valore int secondo tab transcodifica: + /// Simulazione valore REAL secondo tab transcodifica: /// doProd=true --> simulo 50° percentile in su, altrimenti primi 50 percentili... /// /// @@ -355,19 +350,42 @@ double result = 0; // se è in prod --> 50° perc in su... int rawSim = rnd.Next(0, 50) + (doProd ? 50 : 0); - if (currSetup.SetupSimInt.ContainsKey(codFlux)) - { - // transcodifico - var val0 = transcMap - .Where(x => x.Key <= rawSim) - .OrderByDescending(x => x.Value) - .FirstOrDefault(); - var val1 = transcMap - .Where(x => x.Key >= rawSim) - .OrderBy(x => x.Value) - .FirstOrDefault(); - result = val0.Value + Math.Round((val1.Value - val0.Value) * (rawSim - val0.Key) / (val1.Key - val0.Key), 0); - } + // transcodifico + var val0 = transcMap + .Where(x => x.Key <= rawSim) + .OrderByDescending(x => x.Value) + .FirstOrDefault(); + var val1 = transcMap + .Where(x => x.Key >= rawSim) + .OrderBy(x => x.Value) + .FirstOrDefault(); + result = Math.Round(val0.Value + (val1.Value - val0.Value) * (rawSim - val0.Key) / (val1.Key - val0.Key), 2); + return result; + } + /// + /// Simulazione valore Real dt-based secondo tab transcodifica + /// + /// + /// + /// + /// + protected double simValData(DateTime dtCurs, string codFlux, Dictionary transcMap) + { + double result = 0; + int rawSim = rnd.Next(-5000, 5000); + // perturbo la data in ms per +/-5 sec + dtCurs = dtCurs.AddMilliseconds(rawSim); + // transcodifico + var val0 = transcMap + .Where(x => x.Key <= dtCurs) + .OrderByDescending(x => x.Value) + .FirstOrDefault(); + var val1 = transcMap + .Where(x => x.Key >= dtCurs) + .OrderBy(x => x.Value) + .FirstOrDefault(); + // prendo valore intervallo calcolato... + result = Math.Round(val0.Value + (val1.Value - val0.Value) * (dtCurs - val0.Key) / (val1.Key - val0.Key), 2); return result; } From e2867b0cad237888be7c3567d43deee496ab8e2c Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 8 May 2023 20:04:35 +0200 Subject: [PATCH 11/15] Completato SIM Eventi x 01 --- MapoDataFiller/Filler/InterClays.cs | 48 +++++++++++++++++------------ 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index ad2df43..514323a 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -51,8 +51,8 @@ // verifico il tipo di CodIOB if (CodIOB == "INTERCL_01") { - // tiro a dadi x decidere SE LAVORA periodo... 60% dei casi - doProd = (rnd.Next(0, 100) <= 60); + // tiro a dadi x decidere SE LAVORA periodo... 50% dei casi nel periodo TRACCIATO + doProd = (rnd.Next(0, 100) <= 40); // FluxLOG: genero righe FL x periodo e sommo nextRowsFL = IC_ESS_getFlRows(CodIOB, dtStart, dtEnd, doProd, ref idxFl); @@ -216,29 +216,39 @@ string currRow = ""; // reset counter idxCount = idxCount <= 9999 ? idxCount : 0; - // se produce registro poweron... + var fullDuration = dtEnd.Subtract(dtStart).TotalMinutes; + // se produce registro riscaldamento + poweron... if (doProd) { - currRow = $"{CodIOB};{dtStart.AddSeconds(5):yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 23;0;-"; + // calcolo 1/8 = 12.5% riscaldamento... + currRow = $"{CodIOB};{dtStart.AddSeconds(1):yyyy-MM-dd HH:mm:ss.fff};40;ND;[{idxCount++}] 34;0;-"; rows.Add(currRow); - currRow = $"{CodIOB};{dtEnd.AddSeconds(-5):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; + // ...il resto lavoro... partendo a 1/8 + currRow = $"{CodIOB};{dtStart.AddMinutes(fullDuration / 8):yyyy-MM-dd HH:mm:ss.fff};16;ND;[{idxCount++}] 13;0;-"; + rows.Add(currRow); + currRow = $"{CodIOB};{dtEnd.AddSeconds(-1):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 12;0;-"; rows.Add(currRow); } // se NON produce alterno valori spenta/accesa else { - // genera i dati secondo lo schema configurato... con periodo da 15" a 15 min di pausa - while (dtCurs < dtEnd) - { - currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 01;0;-"; - rows.Add(currRow); - dtCurs = dtCurs.AddSeconds(rnd.Next(60 * 5, 60 * 15)); - currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};14;ND;[{idxCount++}] 00;0;-"; - rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(500, 5000)); - // reset counter - idxCount = idxCount <= 9999 ? idxCount : 0; - } + /* + * genera i dati con durata secondo pareto standard... + * - 10% --> 24: manuale + * - 30% --> 15: fermo generico + * - 60% --> 14: spenta + */ + // manuale + currRow = $"{CodIOB};{dtStart.AddSeconds(1):yyyy-MM-dd HH:mm:ss.fff};24;ND;[{idxCount++}] 24;0;-"; + rows.Add(currRow); + // fermo generico dopo 10% + currRow = $"{CodIOB};{dtStart.AddMinutes(fullDuration / 10):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 12;0;-"; + rows.Add(currRow); + // spenta dopo 40% + currRow = $"{CodIOB};{dtStart.AddMinutes(fullDuration * 4 / 10):yyyy-MM-dd HH:mm:ss.fff};15;ND;[{idxCount++}] 12;0;-"; + rows.Add(currRow); + // reset counter + idxCount = idxCount <= 9999 ? idxCount : 0; } return rows; } @@ -297,8 +307,8 @@ { foreach (var item in currSetup.SetupDtData) { - simReal = simValData(dtCurs, item.Key, item.Value); - currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simReal};{idxCount++}"; + simDTime = simValData(dtCurs, item.Key, item.Value); + currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simDTime};{idxCount++}"; rows.Add(currRow); dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); idxCount = idxCount <= 9999 ? idxCount : 0; From 42acab1a647733d862f82faaab84949413c6fb2e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 15 May 2023 10:20:48 +0200 Subject: [PATCH 12/15] Aggiunta ms x evitare doppioni FL --- MapoDataFiller/Filler/InterClays.cs | 8 ++++---- MapoDataFiller/MConf.cs | 4 ++-- MapoDataFiller/conf.yaml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index 514323a..2ab81bf 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -267,7 +267,7 @@ protected List IC_ESS_getFlRows(string CodIOB, DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) { List rows = new List(); - DateTime dtCurs = dtStart; + DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(50, 100)); int simInt = 0; double simReal = 0; double simDTime = 0; @@ -286,7 +286,7 @@ simInt = simValInt(doProd, item.Key, item.Value); currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simInt};{idxCount++}"; rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 150)); idxCount = idxCount <= 9999 ? idxCount : 0; } } @@ -298,7 +298,7 @@ simReal = simValReal(doProd, item.Key, item.Value); currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simReal};{idxCount++}"; rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 150)); idxCount = idxCount <= 9999 ? idxCount : 0; } } @@ -310,7 +310,7 @@ simDTime = simValData(dtCurs, item.Key, item.Value); currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simDTime};{idxCount++}"; rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(5, 50)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 150)); idxCount = idxCount <= 9999 ? idxCount : 0; } } diff --git a/MapoDataFiller/MConf.cs b/MapoDataFiller/MConf.cs index 981413d..8bc824b 100644 --- a/MapoDataFiller/MConf.cs +++ b/MapoDataFiller/MConf.cs @@ -20,11 +20,11 @@ namespace MapoDataFiller public MConf() { - ConfDir = @"C:\temp\Interclays\"; + ConfDir = @"C:\Temp\Interclays\"; CodIOB = "NONE"; HasHeader = false; TimeTable = "Demo.csv"; - OutFolder = @"C:\temp\Interclays\Out"; + OutFolder = @"C:\Temp\Interclays\Out"; } } public class CMan diff --git a/MapoDataFiller/conf.yaml b/MapoDataFiller/conf.yaml index ed6c122..55d6e2f 100644 --- a/MapoDataFiller/conf.yaml +++ b/MapoDataFiller/conf.yaml @@ -1,6 +1,6 @@ --- -ConfDir: C:\temp\Interclays +ConfDir: C:\Temp\Interclays CodIOB: INTERCL_02 HasHeader: true TimeTable: Interclays02.csv -OutFolder: C:\temp\Interclays\Out +OutFolder: C:\Temp\Interclays\Out From ae0b5e61db73b2e97994aaad378a99ad35670267 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 15 May 2023 10:20:58 +0200 Subject: [PATCH 13/15] update con dati esempio IClays --- DemoData/INTERCL_01.json | 136 +++++++ DemoData/INTERCL_01.yaml | 6 + DemoData/INTERCL_02.json | 103 +++++ DemoData/INTERCL_02.yaml | 6 + DemoData/Interclays01.csv | 419 +++++++++++++++++++ DemoData/Interclays02.csv | 508 ++++++++++++++++++++++++ DemoData/InterclaysDatiProd_Puliti.xlsx | Bin 0 -> 31329 bytes 7 files changed, 1178 insertions(+) create mode 100644 DemoData/INTERCL_01.json create mode 100644 DemoData/INTERCL_01.yaml create mode 100644 DemoData/INTERCL_02.json create mode 100644 DemoData/INTERCL_02.yaml create mode 100644 DemoData/Interclays01.csv create mode 100644 DemoData/Interclays02.csv create mode 100644 DemoData/InterclaysDatiProd_Puliti.xlsx diff --git a/DemoData/INTERCL_01.json b/DemoData/INTERCL_01.json new file mode 100644 index 0000000..5e4fc3d --- /dev/null +++ b/DemoData/INTERCL_01.json @@ -0,0 +1,136 @@ +{ + "SetupSimInt": { + "Dep_Cil_mmH2O": { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 + }, + "Bruc_0_100": { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 + }, + "Asp_0_100": { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 + } + }, + "SetupSimReal": { + "Temp_Filtro": { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + "T_Attuale_Cil": { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + "Flowrate": { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + "Ampere_Cil": { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15, + 99: 16.4, + 100: 79.1 + }, + "Ampere_Asp": { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + "Ampere_Dosat": { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } + }, + "SetupDtData": { + "Tot_Parz_Dosatore": { + "2019-11-29 02:24:13": 3619.129, + "2020-01-08 13:56:24": 4101.16, + "2020-01-12 17:34:34": 4201.494, + "2020-01-12 17:34:35": 0, + "2020-01-17 17:34:35": 119.352, + "2020-01-31 11:39:32": 471.494, + "2020-02-07 19:38:58": 606.883, + "2020-03-19 23:59:53": 2112.625, + "2020-04-23 20:38:32": 2929.045, + "2020-05-15 17:30:57": 3500.943, + "2020-05-15 17:30:58": 447.943, + "2020-05-15 20:04:57": 457.217, + "2020-05-15 20:04:58": 0, + "2020-06-12 19:19:36": 736.229, + "2020-06-30 19:56:21": 1225.481, + "2020-07-14 20:05:37": 1828.772, + "2020-07-28 20:15:55": 2358.175, + "2020-09-30 11:29:26": 4081.050, + "2020-11-16 13:01:33": 5419.626, + "2021-11-24 12:50:37": 16632.060, + "2022-01-14 20:07:39": 18187.904, + "2022-03-14 11:33:21": 20782.475, + "2022-11-21 08:48:21": 27770.447, + "2023-03-07 15:40:44": 30951.118 + }, + "Tot_Dosatore": { + "2019-11-29 02:24:14": 3770.426, + "2020-01-08 13:56:24": 4252.457, + "2020-01-17 17:34:35": 4465.844, + "2020-01-31 11:39:32": 4817.986, + "2020-02-07 19:38:58": 4953.375, + "2020-03-19 23:59:53": 6459.117, + "2020-04-23 20:38:32": 7275.537, + "2020-05-15 17:30:58": 7818.401, + "2020-06-12 19:19:36": 8563.820, + "2020-06-30 19:56:21": 9053.072, + "2020-07-14 20:05:37": 9656.363, + "2020-07-28 20:15:55": 10185.766, + "2020-09-30 11:29:26": 11908.641, + "2020-11-16 13:01:33": 13247.217, + "2021-11-24 12:50:37": 24459.651, + "2022-01-14 20:07:39": 26015.495, + "2022-03-14 11:33:21": 28610.066, + "2022-11-21 08:48:21": 35598.038, + "2023-03-07 15:40:44": 38778.709 + } + } +} \ No newline at end of file diff --git a/DemoData/INTERCL_01.yaml b/DemoData/INTERCL_01.yaml new file mode 100644 index 0000000..981b19f --- /dev/null +++ b/DemoData/INTERCL_01.yaml @@ -0,0 +1,6 @@ +--- +ConfDir: C:\Temp\Interclays +CodIOB: INTERCL_01 +HasHeader: true +TimeTable: Interclays01.csv +OutFolder: C:\Temp\Interclays\SIM_01 diff --git a/DemoData/INTERCL_02.json b/DemoData/INTERCL_02.json new file mode 100644 index 0000000..1a37234 --- /dev/null +++ b/DemoData/INTERCL_02.json @@ -0,0 +1,103 @@ +{ + "SetupSimInt": { + "Dep_Cil_mmH2O": { + 0: 1, + 1: 1, + 25: 5, + 50: 10, + 75: 15, + 99: 26, + 100: 52 + }, + "Bruc_0_100": { + 0: 1, + 1: 17, + 25: 24, + 50: 33, + 75: 47, + 99: 71, + 100: 100 + }, + "Asp_0_100": { + 0: 3, + 1: 36, + 25: 52, + 50: 59, + 75: 77, + 99: 100, + 100: 100 + } + }, + "SetupSimReal": { + "Temp_Filtro": { + 0: 0.1, + 1: 5.6, + 25: 89.1, + 50: 103.7, + 75: 108.3, + 99: 118.1, + 100: 135.6 + }, + "T_Attuale_Cil": { + 0: 0.01, + 1: 0.65, + 25: 10.36, + 50: 11.46, + 75: 11.98, + 99: 13.99, + 100: 327.67 + }, + "Flowrate": { + 0: 0.01, + 1: 0.06, + 25: 5.34, + 50: 8.22, + 75: 9.48, + 99: 12.86, + 100: 262.8 + }, + "Ampere_Cil": { + 0: 10.6, + 1: 14.1, + 25: 14.4, + 50: 14.6, + 75: 15, + 99: 16.4, + 100: 79.1 + }, + "Ampere_Asp": { + 0: 12.1, + 1: 14.8, + 25: 15.9, + 50: 17.2, + 75: 22.1, + 99: 32.4, + 100: 87.3 + }, + "Ampere_Dosat": { + 0: 0.1, + 1: 1.8, + 25: 2, + 50: 2, + 75: 2.1, + 99: 2.4, + 100: 3.3 + } + }, + "SetupDtData": { + "Tot_Parz_Dosatore": { + "2020-06-30 19:56:21": 1225.481, + "2020-11-16 13:01:33": 5419.626, + "2022-03-14 11:33:21": 20782.475, + "2022-11-21 08:48:21": 27770.447, + "2023-03-07 15:40:44": 30951.118 + }, + "Tot_Dosatore": { + "2020-06-30 19:56:21": 9053.072, + "2020-11-16 13:01:33": 13247.217, + "2022-03-14 11:33:21": 28610.066, + "2022-11-21 08:48:21": 35598.038, + "2023-03-07 15:40:44": 38778.709 + } + } +} \ No newline at end of file diff --git a/DemoData/INTERCL_02.yaml b/DemoData/INTERCL_02.yaml new file mode 100644 index 0000000..15f38f2 --- /dev/null +++ b/DemoData/INTERCL_02.yaml @@ -0,0 +1,6 @@ +--- +ConfDir: C:\Temp\Interclays +CodIOB: INTERCL_02 +HasHeader: true +TimeTable: Interclays02.csv +OutFolder: C:\Temp\Interclays\SIM_02 diff --git a/DemoData/Interclays01.csv b/DemoData/Interclays01.csv new file mode 100644 index 0000000..21db6c6 --- /dev/null +++ b/DemoData/Interclays01.csv @@ -0,0 +1,419 @@ +Data;Ora Inizio ;Ore Lavorate +mer 04/12/2019;05.30;10,25 +gio 05/12/2019;13.30;6,41 +ven 06/12/2019;06.34;12,35 +lun 09/12/2019;06.20;12,25 +mar 10/12/2019;05.40;13,35 +lun 16/12/2019;05.30;13,30 +mar 17/12/2019;05.30;13,40 +mer 18/12/2019;05.30;13,20 +ven 20/12/2019;05.30;13,10 +ven 27/12/2019;07.00;9,30 +lun 30/12/2019;07.00;10,20 +gio 09/01/2020;05.00;12,40 +ven 10/01/2020;05.00;13,50 +lun 13/01/2020;06.10;10,25 +mar 14/01/2020;05.40;13,10 +mer 15/01/2020;05.00;14,20 +gio 16/01/2020;07.30;10,15 +ven 17/01/2020;07.30;11,30 +ven 24/01/2020;05.35;12,45 +lun 27/01/2020;06.25;12,25 +mer 29/01/2020;05.40;13,16 +mer 05/02/2020;05.25;13,28 +gio 06/02/2020;05.20;13,05 +lun 10/02/2020;05.20;13,40 +mer 12/02/2020;05.35;13,15 +gio 13/02/2020;05.25;12,30 +ven 14/02/2020;05.50;8,15 +lun 17/02/2020;05.24;10,15 +mar 18/02/2020;05.30;9,45 +mer 19/02/2020;05.40;7,40 +gio 20/02/2020;05.36;11,22 +ven 21/02/2020;05.28;9,15 +lun 24/02/2020;05.20;10,33 +mar 25/02/2020;05.26;11,25 +mer 26/02/2020;05.35;11,40 +gio 27/02/2020;05.50;12,40 +ven 28/02/2020;05.27;13,05 +lun 02/03/2020;07.25;8,15 +mar 03/03/2020;07.15;10,45 +mer 04/03/2020;05.32;13,34 +gio 05/03/2020;06.44;11,50 +ven 06/03/2020;07.40;9,40 +lun 09/03/2020;05.15;14,10 +mar 10/03/2020;05.18;13,45 +mer 11/03/2020;05.25;11,50 +gio 12/03/2020;05.31;13,28 +ven 13/03/2020;05.45;8,55 +lun 23/03/2020;05.30;14,05 +mar 24/03/2020;05.22;13,50 +mer 25/03/2020;05.45;13,06 +gio 26/03/2020;08.45;9,42 +ven 27/03/2020;06.50;11,35 +lun 30/03/2020;05.42;13,50 +mar 31/03/2020;05.38;11,14 +mer 01/04/2020;05.55;11,25 +gio 02/04/2020;05.33;13,49 +ven 03/04/2020;06.11;9,55 +lun 06/04/2020;07.19;7,48 +mar 07/04/2020;06.28;9,55 +mer 08/04/2020;06.34;10,24 +gio 09/04/2020;05.53;12,40 +ven 10/04/2020;05.55;7,29 +mar 14/04/2020;13.15;6,45 +mer 15/04/2020;05.34;11,05 +gio 16/04/2020;05.41;12,36 +ven 17/04/2020;05.50;10,50 +gio 23/04/2020;05.53;9,45 +ven 24/04/2020;07.35;8,55 +lun 27/04/2020;08.10;9,26 +mar 28/04/2020;05.50;10,58 +mer 29/04/2020;05.38;11,35 +gio 30/04/2020;07.30;9,27 +lun 04/05/2020;06.50;12,10 +mar 05/05/2020;07.10;10,19 +mer 06/05/2020;07.13;11,40 +gio 07/05/2020;07.25;8,35 +ven 08/05/2020;07.05;9,55 +lun 11/05/2020;06.40;11,40 +mar 12/05/2020;07.15;7,50 +mer 13/05/2020;06.25;9,48 +gio 14/05/2020;05.50;13,45 +ven 15/05/2020;07.40;11,23 +lun 08/06/2020;06.42;11,50 +mer 17/06/2020;07.09;13,05 +lun 27/07/2020;06.59;11,53 +mer 29/07/2020;06.50;12,09 +gio 30/07/2020;07.01;10,58 +ven 31/07/2020;07.10;9,51 +lun 03/08/2020;05.31;13,50 +mar 04/08/2020;05.25;12,49 +mer 05/08/2020;05.42;11,55 +gio 06/08/2020;05.33;10,56 +ven 07/08/2020;07.15;7,38 +lun 17/08/2020;05.25;13,21 +mar 18/08/2020;05.29;13,05 +mer 19/08/2020;05.36;13,39 +gio 20/08/2020;05.28;13,42 +ven 21/08/2020;05.34;13,04 +lun 24/08/2020;05.28;13,21 +mar 25/08/2020;05.19;13,45 +mer 26/08/2020;05.34;13,29 +gio 27/08/2020;05.26;13,40 +ven 28/08/2020;05.32;12,50 +lun 31/08/2020;07.05;12,55 +mar 01/09/2020;07.09;9,25 +mer 02/09/2020;07.15;10,33 +gio 03/09/2020;06.58;11,04 +ven 04/09/2020;07.11;10,50 +lun 07/09/2020;06.53;12,52 +mar 08/09/2020;06.50;11,32 +mer 09/09/2020;06.57;11,28 +gio 10/09/2020;07.03;8,39 +ven 11/09/2020;07.15;9,44 +lun 14/09/2020;05.17;14,05 +mar 15/09/2020;05.21;13,49 +mer 16/09/2020;05.28;13,56 +gio 17/09/2020;05.23;12.59 +ven 18/09/2020;05.19;13,36 +lun 21/09/2020;10.44;6,28 +mar 22/09/2020;05.22;13,39 +mer 23/09/2020;05.19;12,51 +lun 28/09/2020;07.03;12,09 +gio 01/10/2020;06.55;12,19 +mer 07/10/2020;05.19;14,25 +gio 08/10/2020;11.04;5,40 +ven 09/10/2020;07.38;8,27 +lun 12/10/2020;06.15;11,46 +mar 13/10/2020;05.39;12,50 +mer 14/10/2020;05.24;12,05 +gio 15/10/2020;05.49;10,19 +ven 16/10/2020;09.25;6,48 +mar 20/10/2020;05.26;12,47 +mer 21/10/2020;05.19;13,04 +lun 26/10/2020;05.22;12,49 +mar 27/10/2020;05.17;13,25 +mar 10/11/2020;07.15;13,05 +mer 11/11/2020;07.19;8,48 +lun 16/11/2020;05.25;14,15 +mar 17/11/2020;07.01;10,29 +mer 18/11/2020;07.26;10,08 +gio 19/11/2020;07.32;7,55 +ven 20/11/2020;06.58;13,15 +lun 23/11/2020;05.18;14,17 +mar 24/11/2020;05.29;12,53 +mer 25/11/2020;09.44;8,43 +gio 26/11/2020;05.28;13,24 +ven 27/11/2020;05.23;12,49 +lun 30/11/2020;05.21;13,33 +mar 01/12/2020;05.26;13,08 +mer 02/12/2020;06.44;10,29 +gio 03/12/2020;07.25;10,37 +ven 04/12/2020;07.30;6,49 +lun 07/12/2020;08.29;7,56 +mer 09/12/2020;05.24;12,03 +gio 10/12/2020;05.19;13,25 +ven 11/12/2020;05.39;10,27 +lun 14/12/2020;05.28;12,59 +mar 15/12/2020;05.24;12,05 +mer 16/12/2020;05.20;11,44 +gio 17/12/2020;05.26;11,59 +ven 18/12/2020;06.20;9,44 +lun 21/12/2020;07.03;8,55 +mar 22/12/2020;07.10;10,21 +mer 23/12/2020;07.09;9,58 +gio 24/12/2020;07.15;4,50 +lun 28/12/2020;08.10;8,43 +mar 29/12/2020;07.44;10,04 +mer 30/12/2020;07.25;10,47 +gio 31/12/2020;07.18;6,53 +gio 07/01/2021;06.24;9,05 +ven 08/01/2021;06.17;7,46 +lun 11/01/2021;05.26;13,10 +mar 12/01/2021;05.28;12,42 +mer 13/01/2021;05.21;13,05 +gio 14/01/2021;05.19;11,29 +ven 15/01/2021;05.27;10,59 +lun 18/01/2021;07.15;9,55 +mar 19/01/2021;06.44;11,06 +mer 20/01/2021;06.50;10,59 +gio 21/01/2021;07.03;9,58 +ven 22/01/2021;07.12;9,15 +lun 25/01/2021;07.15;10,29 +mar 26/01/2021;07.11;9,42 +mer 27/01/2021;07.19;11,04 +gio 28/01/2021;07.26;12,25 +ven 29/01/2021;06.41;8,19 +lun 01/02/2021;05.17;13,21 +mar 02/02/2021;07.22;10,56 +mer 03/02/2021;07.17;9,23 +gio 04/02/2021;06.44;10,39 +ven 05/02/2021;10.15;8,05 +lun 08/02/2021;06.50;11,05 +mar 09/02/2021;05.33;12,37 +mer 10/02/2021;05.29;13,05 +gio 11/02/2021;07.13;10,13 +ven 12/02/2021;06.58;10,38 +lun 15/02/2021;07.15;11,05 +mar 16/02/2021;07.22;11,25 +mer 17/02/2021;07.29;10,48 +gio 18/02/2021;07.18;10,25 +ven 19/02/2021;07.28;9,59 +lun 22/02/2021;05.20;13,25 +mar 23/02/2021;05.27;13,05 +mer 24/02/2021;05.18;13,17 +gio 25/02/2021;05.22;13,10 +ven 26/02/2021;05.24;12,39 +lun 01/03/2021;07.20;11,35 +mar 02/03/2021;07.16;10,44 +mer 03/03/2021;07.18;10,59 +gio 04/03/2021;07.22;10,35 +ven 05/03/2021;07.19;9,57 +lun 08/03/2021;06.55;12,48 +mar 09/03/2021;06.59;12,05 +mer 10/03/2021;07.05;10,38 +gio 11/03/2021;07.20;9,46 +ven 12/03/2021;07.15;10,09 +lun 15/03/2021;07.19;10,15 +mar 16/03/2021;07.25;9,43 +mer 17/03/2021;07.28;10,05 +gio 18/03/2021;07.44;8,59 +ven 19/03/2021;07.33;8,34 +lun 22/03/2021;05.25;13,15 +mar 23/03/2021;05.18;13,04 +mer 24/03/2021;05.26;13,27 +gio 25/03/2021;05.19;12,49 +ven 26/03/2021;05.20;10,34 +lun 29/03/2021;06.13;13,55 +mar 30/03/2021;06.25;13,01 +mer 31/03/2021;06.49;11,44 +gio 01/04/2021;07.15;10,35 +ven 02/04/2021;07.22;9,54 +mar 06/04/2021;06.57;12,05 +mer 07/04/2021;07.02;11,38 +gio 08/04/2021;07.05;10,58 +ven 09/04/2021;06.55;11,22 +lun 12/04/2021;05.20;14,16 +mar 13/04/2021;05.27;13,54 +mer 14/04/2021;05.31;13,49 +gio 15/04/2021;05.19;12,51 +ven 16/04/2021;05.22;12,43 +lun 19/04/2021;07.02;11,48 +mar 20/04/2021;07.10;11,25 +mer 21/04/2021;07.04;11,53 +gio 22/04/2021;07.15;10,35 +ven 23/04/2021;07.19;10,07, +lun 26/04/2021;06.52;12,05 +mar 27/04/2021;06.57;11,51 +mer 28/04/2021;07.02;12,24 +gio 29/04/2021;07.15;12,35 +ven 30/04/2021;06.59;10,52 +lun 03/05/2021;05.19;13,51 +mar 04/05/2021;05.24;13,07 +mer 05/05/2021;05.33;14,05 +gio 06/05/2021;05.26;13,29 +ven 07/05/2021;05.21;10,35 +lun 10/05/2021;05.17;14,25 +mar 11/05/2021;05.21;13,42 +mer 12/05/2021;05.28;14,09 +gio 13/05/2021;05.19;13,38 +ven 14/05/2021;05.31;11,07 +lun 17/05/2021;07.15;9,55 +mar 18/05/2021;06.38;11,36 +mer 19/05/2021;06.18;12,42 +gio 20/05/2021;07.39;6,58 +ven 21/05/2021;09.34;8,43 +lun 24/05/2021;11.10;7,06 +mar 25/05/2021;05.52;12,47 +mer 26/05/2021;06.03;12,29 +gio 27/05/2021;06.10;13,02 +ven 28/05/2021;06.17;12,44 +lun 31/05/2021;05.29;13,36 +mar 01/06/2021;05.17;13,07 +gio 03/06/2021;08.54;7,42 +ven 04/06/2021;08.25;9,21 +lun 07/06/2021;07.22;11,08 +mar 08/06/2021;07.10;12,25 +mer 09/06/2021;07.35;12,57 +gio 10/06/2021;06.51;13,09 +ven 11/06/2021;06.48;9,54 +lun 14/06/2021;05.27;13,26 +mar 15/06/2021;05.31;11,54 +mer 16/06/2021;05.19;12,06 +gio 17/06/2021;05.22;13,38 +ven 18/06/2021;05.24;12,43 +lun 21/06/2021;09.15;8,53 +mar 22/06/2021;05.23;14,06 +mer 23/06/2021;07.38;11,28 +gio 24/06/2021;06.25;12,04 +ven 25/06/2021;13.35;5,59 +lun 28/06/2021;05.21;13,39 +mar 29/06/2021;05.19;13,04 +mer 30/06/2021;05.23;12,37 +gio 01/07/2021;05.26;13,28 +ven 02/07/2021;05.48;10,09 +lun 05/07/2021;05.17;13,25 +mar 06/07/2021;05.32;13,33 +mer 07/07/2021;05.24;12,57 +gio 08/07/2021;05.48;12,35 +ven 09/07/2021;05.37;10,41 +lun 12/07/2021;07.25;10,54 +mar 13/07/2021;06.34;10,37 +mer 14/07/2021;07.10;9,59 +gio 15/07/2021;07.05;10,48 +ven 16/07/2021;07.43;8,29 +lun 19/07/2021;06.55;12,06 +mar 20/07/2021;07.03;11,53 +mer 21/07/2021;07.11;10,18 +gio 22/07/2021;07.22;9,06 +ven 23/07/2021;07.49;8,59 +lun 26/07/2021;10.19;7,38 +mar 27/07/2021;05.26;13,45 +mer 28/07/2021;05.35;13,19 +gio 29/07/2021;05.23;12,47 +ven 30/07/2021;07.37;9,16 +lun 02/08/2021;05.18;14,06 +mar 03/08/2021;05.23;13,48 +mer 04/08/2021;05.21;11,29 +gio 05/08/2021;05.32;10,36 +ven 06/08/2021;05.19;11,24 +lun 16/08/2021;08.31;9,44 +mar 17/08/2021;07.06;11,06 +mer 18/08/2021;07.19;10,35 +gio 19/08/2021;07.36;8,54 +ven 20/08/2021;07.03;12,07 +lun 23/08/2021;10.07;8,53 +mar 24/08/2021;07.10;11,28 +mer 25/08/2021;07.15;12,09 +gio 26/08/2021;07.01;13,04 +ven 27/08/2021;09.24;7,59 +lun 30/08/2021;07.25;13,02 +mar 31/08/2021;05.03;14,23 +mer 01/09/2021;05.33;14,55 +gio 02/09/2021;13.24;7,29 +ven 03/09/2021;05.55;14,08 +gio 09/09/2021;05.45;14,33 +ven 10/09/2021;05.08;15,01 +lun 13/09/2021;13.08;7,50 +mar 14/09/2021;05.23;14,56 +mer 15/09/2021;05.06;14,39 +gio 16/09/2021;06.27;12,41 +ven 17/09/2021;05.18;14,28 +lun 20/09/2021;05.11;14.48 +mar 21/09/2021;07.05;12.55 +mer 22/09/2021;07.11;12.59 +lun 27/09/2021;07.01;12,38 +mar 28/09/2021;07.15;12,47 +mer 29/09/2021;07.33;12,53 +gio 30/09/2021;07.29;12,21 +ven 01/10/2021;07.24;12,34 +lun 04/10/2021;07.17;13,39 +mar 05/10/2021;07.18;13,38 +mer 06/10/2021;07.11;13,03 +gio 07/10/2021;07.12;13,01 +ven 08/10/2021;07.07;12,31 +lun 11/10/2021;07.17;13,05 +mar 12/10/2021;07.22;13,38 +mer 13/10/2021;07.37;12,54 +gio 14/10/2021;08.43;10,08 +ven 15/10/2021;07.02;12,30 +lun 18/10/2021;07.27;13,01 +mar 19/10/2021;07.39;12,29 +mer 20/10/2021;07.19;13,22 +gio 21/10/2021;07.17;11,31 +ven 22/10/2021;11.10;7,00 +lun 25/10/2021;07.17;13,31 +mar 26/10/2021;07.27;11,58 +gio 28/10/2021;07.40;10,06 +ven 29/10/2021;07.03;9,27 +mer 03/11/2021;07.17;13,17 +gio 04/11/2021;07.05;10,30 +ven 05/11/2021;07.24;9,23 +lun 08/11/2021;07.20;13,30 +mar 09/11/2021;07.37;13,09 +mer 10/11/2021;07.17;12.48 +gio 11/11/2021;07.03;8,09 +ven 12/11/2021;07.10;9,08 +lun 15/11/2021;07.17;13,20 +mar 16/11/2021;07.18;11,43 +mer 17/11/2021;09.27;9,30 +gio 18/11/2021;07.03;10,12 +ven 19/11/2021;07.17;8,08 +lun 22/11/2021;08.40;12,10 +mar 23/11/2021;07.18;13,27 +mar 14/12/2021;07.47;13,10 +mer 15/12/2021;07.15;13.30 +gio 16/12/2021;07.03;13,08 +ven 17/12/2021;07.17;13.32 +mer 29/12/2021;09.10;9,19 +gio 30/12/2021;13.38;6,30 +lun 03/01/2022;07.07;13,20 +mar 04/01/2022;11.10;9,01 +mer 05/01/2022;07.27;7,30 +lun 10/01/2022;07.17;13,32 +gio 20/01/2022;07.27;13,08 +ven 21/01/2022;07.17;13,01 +lun 28/02/2022;07.13;13,10 +mar 01/03/2022;07.07;13,03 +mer 02/03/2022;07.49;13,09 +gio 03/03/2022;07.04;9,00 +ven 04/03/2022;07.27;10,33 +lun 07/03/2022;07.17;13,20 +mar 08/03/2022;07.23;13.33 +mer 09/03/2022;07.38;13.00 +gio 10/03/2022;08.07;11,00 +ven 11/03/2022;12.10;7,38 +mar 15/03/2022;07.23;13,29 +mer 16/03/2022;07.30;13,02 +gio 17/03/2022;07.27;13,01 +ven 18/03/2022;09.14;10,27 +lun 21/03/2022;13.10;7,18 +mar 22/03/2022;07.19;13,32 +mer 23/03/2022;07.23;13,06 +gio 24/03/2022;08.11;10,13 +ven 25/03/2022;07.17;8,00 +lun 28/03/2022;07.02;13,30 +mar 29/03/2022;07.29;13,09 +mer 30/03/2022;07.41;13.07 +gio 31/03/2022;07.14;13,20 \ No newline at end of file diff --git a/DemoData/Interclays02.csv b/DemoData/Interclays02.csv new file mode 100644 index 0000000..27234c1 --- /dev/null +++ b/DemoData/Interclays02.csv @@ -0,0 +1,508 @@ +Data;Ora Inizio ;Ore Lavorate +lun 02/12/2019;05.18;7,41 +mar 03/12/2019;05.22;7,22 +mer 04/12/2019;05.16;7,35 +lun 09/12/2019;14.12;5,43 +mar 10/12/2019;13.10;6,55 +mer 11/12/2019;13.15;7,19 +gio 12/12/2019;13.30;6,18 +ven 13/12/2019;13.10;7,24 +lun 16/12/2019;05.12;7,33 +mar 17/12/2019;05.22;7,27 +mer 18/12/2019;05.08;7,18 +gio 19/12/2019;05.17;6,57 +ven 20/12/2019;05.25;7,05 +lun 23/12/2019;13.18;7,32 +mar 24/12/2019;13.02;7,33 +mer 25/12/2019;13.11;7,28 +gio 26/12/2019;15.01;5,16 +ven 27/12/2019;13.25;7,12 +lun 30/12/2019;05.17;15,33 +mar 31/12/2019;05.03;15,28 +mer 01/01/2020;05.09;15,45 +gio 02/01/2020;05.08;15,37 +ven 03/01/2020;05.17;15,03 +lun 06/01/2020;13.14;7,43 +mar 07/01/2020;13.25;6,55 +mer 08/01/2020;15.05;5,18 +lun 20/01/2020;13.07;7,44 +mar 21/01/2020;13.14;6,51 +mer 22/01/2020;13.22;4,48 +gio 23/01/2020;13.19;7,27 +ven 24/01/2020;13.10;7,36 +mer 29/01/2020;07.19;3,19 +ven 31/01/2020;13.58;1,59 +lun 03/02/2020;13.10;7,25 +mar 04/02/2020;13.16;6,54 +mer 05/02/2020;13.09;7,06 +gio 06/02/2020;13.18;5,59 +ven 07/02/2020;13.26;4,29 +gio 13/02/2020;08.33;6,55 +ven 14/02/2020;08.19;7,02 +lun 17/02/2020;13.11;7,45 +mar 18/02/2020;13.06;7,48 +mer 19/02/2020;13.18;7,36 +gio 20/02/2020;14.36;6,15 +ven 21/02/2020;13.16;7,29 +lun 24/02/2020;05.06;7,45 +mar 25/02/2020;05.14;7,43 +mer 26/02/2020;05.11;7,44 +gio 27/02/2020;05.21;7,39 +ven 28/02/2020;05.19;7,28 +lun 02/03/2020;13.05;7,47 +mar 03/03/2020;13.08;5,55 +mer 04/03/2020;13.09;7,46 +gio 05/03/2020;13.17;7,01 +ven 06/03/2020;13.11;4,59 +lun 09/03/2020;05.15;7,44 +mar 10/03/2020;05.13;7,39 +mer 11/03/2020;05.09;7,51 +gio 12/03/2020;05.17;7,31 +ven 13/03/2020;05.33;7,26 +lun 16/03/2020;13.12;7,45 +mar 17/03/2020;13.19;7,33 +mer 18/03/2020;13.08;7,51 +gio 19/03/2020;13.23;7,29 +ven 20/03/2020;13.17;7,37 +mer 25/03/2020;17.29;0,33 +gio 26/03/2020;13.18;1,57 +lun 30/03/2020;13.17;7,22 +mar 31/03/2020;13.45;7,13 +mer 01/04/2020;14.01;5,54 +gio 02/04/2020;13.48;6,02 +ven 03/04/2020;13.09;7,48 +lun 06/04/2020;05.09;7,48 +mar 07/04/2020;05.15;15,26 +mer 08/04/2020;05.36;15,09 +gio 09/04/2020;05.06;15,12 +ven 10/04/2020;05.25;7,05 +mer 15/04/2020;14.54;1,25 +gio 16/04/2020;15.44;1,09 +ven 17/04/2020;17.46;1,38 +mar 21/04/2020;05.09;7,15 +ven 24/04/2020;05.01;6,31 +lun 27/04/2020;13.45;5,37 +mar 28/04/2020;15.23;4,29 +mer 29/04/2020;17.03;2,36 +lun 04/05/2020;08.06;7,39 +mar 05/05/2020;08.12;7,33 +mer 06/05/2020;08.11;7,21 +gio 07/05/2020;08.14;7,26 +ven 08/05/2020;08.19;7,33 +lun 11/05/2020;08.14;7,03 +mar 12/05/2020;08.16;7,15 +mer 13/05/2020;08.17;7,24 +gio 14/05/2020;08.11;7,18 +ven 15/05/2020;08.14;7,33 +lun 18/05/2020;09.22;1,59 +mar 19/05/2020;15.01;1,48 +lun 25/05/2020;10.55;2,03 +gio 28/05/2020;18.06;0,59 +ven 29/05/2020;09.28;3,45 +lun 01/06/2020;16.13;1,55 +mer 03/06/2020;05.33;14,42 +gio 04/06/2020;05.14;15,03 +ven 05/06/2020;05.33;15,16 +lun 08/06/2020;05.08;15,01 +mar 09/06/2020;05.11;15,12 +mer 10/06/2020;05.09;14,53 +gio 11/06/2020;05.04;15,33 +ven 12/06/2020;05.15;15,27 +lun 15/06/2020;05.06;15,18 +mar 16/06/2020;05.22;14,45 +mer 17/06/2020;05.18;15,22 +gio 18/06/2020;05.19;15,31 +ven 19/06/2020;05.07;15,09 +mar 23/06/2020;09.27;1,59 +gio 25/06/2020;14.56;2,04 +ven 26/06/2020;10.23;2,54 +lun 29/06/2020;08.23;1,49 +mar 30/06/2020;11.01;1,05 +ven 03/07/2020;18.47;0,45 +lun 06/07/2020;13.15;7,35 +mar 07/07/2020;13.10;7,45 +mer 08/07/2020;13.08;7,48 +gio 09/07/2020;13.11;7,25 +ven 10/07/2020;13.04;7,39 +lun 13/07/2020;05.09;7,46 +mar 14/07/2020;05.12;7,39 +mer 15/07/2020;05.04;7,42 +gio 16/07/2020;05.11;7,38 +ven 17/07/2020;05.39;6,41 +lun 20/07/2020;13.18;7,05 +mar 21/07/2020;13.09;7,19 +mer 22/07/2020;13.33;5,44 +gio 23/07/2020;13.03;6,44 +ven 24/07/2020;13.12;7,45 +lun 27/07/2020;08.06;7,51 +mar 28/07/2020;08.14;7,39 +mer 29/07/2020;08.03;7,55 +gio 30/07/2020;08.08;7,51 +ven 31/07/2020;08.09;7,49 +lun 03/08/2020;08.58;0,45 +mar 04/08/2020;16.55;1,33 +mar 18/08/2020;11.11;2,33 +mer 19/08/2020;09.28;1,58 +ven 21/08/2020;14.29;1,47 +mer 26/08/2020;07.19;3,19 +ven 28/08/2020;13.58;1,59 +lun 31/08/2020;13.10;7,25 +mar 01/09/2020;13.16;6,54 +mer 02/09/2020;13.09;7,06 +gio 03/09/2020;13.18;5,59 +ven 04/09/2020;13.26;4,29 +gio 10/09/2020;08.33;6,55 +ven 11/09/2020;08.19;7,02 +lun 14/09/2020;13.11;7,45 +mar 15/09/2020;13.06;7,48 +mer 16/09/2020;13.18;7,36 +gio 17/09/2020;14.36;6,15 +ven 18/09/2020;13.16;7,29 +lun 21/09/2020;05.06;7,45 +mar 22/09/2020;05.14;7,43 +mer 23/09/2020;05.11;7,44 +gio 24/09/2020;05.21;7,39 +ven 25/09/2020;05.19;7,28 +lun 28/09/2020;08.02;7,55 +mar 29/09/2020;08.12;7,42 +mer 30/09/2020;08.17;7,39 +gio 01/10/2020;08.09;7,41 +ven 02/10/2020;08.05;7,43 +lun 05/10/2020;08.33;7,18 +mar 06/10/2020;08.17;7,39 +mer 07/10/2020;08.09;7,44 +gio 08/10/2020;08.11;7,43 +ven 09/10/2020;08.12;7,38 +lun 12/10/2020;05.01;15,09 +mar 13/10/2020;05.13;14,58 +mer 14/10/2020;05.07;15,04 +gio 15/10/2020;05.03;15,11 +ven 16/10/2020;05.15;15,03 +lun 19/10/2020;05.11;15,13 +mar 20/10/2020;05.17;14,45 +mer 21/10/2020;05.08;14,29 +gio 22/10/2020;05.21;13,47 +ven 23/10/2020;05.55;14,17 +lun 26/10/2020;13.08;7,45 +mar 27/10/2020;13.07;7,48 +mer 28/10/2020;13.17;7,29 +gio 29/10/2020;13.11;7,17 +ven 30/10/2020;13.09;4,22 +lun 02/11/2020;12.01;2,02 +mer 04/11/2020;08.56;2,18 +ven 06/11/2020;14.33;2,17 +mar 10/11/2020;18.47;0,49 +mer 11/11/2020;13.57;1,56 +lun 16/11/2020;15.37;1,59 +ven 20/11/2020;16.55;0,47 +lun 23/11/2020;05.09;14,55 +mar 24/11/2020;05.04;15,09 +mer 25/11/2020;05.11;15,12 +gio 26/11/2020;05.03;15,01 +ven 27/11/2020;05.08;15,06 +lun 30/11/2020;05.18;15,09 +mar 01/12/2020;05.01;14,31 +mer 02/12/2020;05.09;14,55 +gio 03/12/2020;05.07;15,02 +ven 04/12/2020;05.14;14,37 +gio 10/12/2020;10.29;2,23 +ven 11/12/2020;16.41;2,57 +mar 15/12/2020;7.44;1,56 +mer 16/12/2020;09.03;2,38 +dom 20/12/2020;11.37;3,01 +lun 21/12/2020;17.01;2,44 +mar 22/12/2020;07.59;4,39 +lun 04/01/2021;15.27;1,59 +mar 05/01/2021;13.48;1,55 +gio 07/01/2021;09.24;1,56 +lun 11/01/2021;13.05;7,47 +mar 12/01/2021;13.08;5,55 +mer 13/01/2021;13.09;7,46 +gio 14/01/2021;13.17;7,01 +ven 15/01/2021;13.11;4,59 +lun 18/01/2021;05.15;7,44 +mar 19/01/2021;05.13;7,39 +mer 20/01/2021;05.09;7,51 +gio 21/01/2021;05.17;7,31 +ven 22/01/2021;05.33;7,26 +lun 25/01/2021;13.12;7,45 +mar 26/01/2021;13.19;7,33 +mer 27/01/2021;13.08;7,51 +gio 28/01/2021;13.23;7,29 +ven 29/01/2021;13.17;7,37 +lun 01/02/2021;08.06;7,39 +mar 02/02/2021;08.12;7,33 +mer 03/02/2021;08.11;7,21 +gio 04/02/2021;08.14;7,26 +ven 05/02/2021;08.19;7,33 +lun 08/02/2021;08.14;7,03 +mar 09/02/2021;08.16;7,15 +mer 10/02/2021;08.17;7,24 +gio 11/02/2021;08.11;7,18 +ven 12/02/2021;08.14;7,33 +lun 15/02/2021;08.33;7,18 +mar 16/02/2021;08.17;7,39 +mer 17/02/2021;08.09;7,44 +gio 18/02/2021;08.11;7,43 +ven 19/02/2021;08.12;7,38 +lun 22/02/2021;05.01;15,09 +mar 23/02/2021;05.13;14,58 +mer 24/02/2021;05.07;15,04 +gio 25/02/2021;05.03;15,11 +ven 26/02/2021;05.15;15,03 +lun 01/03/2021;05.11;15,13 +mar 02/03/2021;05.17;14,45 +mer 03/03/2021;05.08;14,29 +gio 04/03/2021;05.21;13,47 +ven 05/03/2021;05.55;14,17 +lun 08/03/2021;08.09;7,41 +mar 09/03/2021;08.13;7,35 +mer 10/03/2021;08.04;7,38 +gio 11/03/2021;08.22;7,17 +ven 12/03/2021;08.08;7,07 +lun 15/03/2021;14.12;5,43 +mar 16/03/2021;13.10;6,55 +mer 17/03/2021;13.15;7,19 +gio 18/03/2021;13.30;6,18 +ven 19/03/2021;13.10;7,24 +lun 22/03/2021;05.12;7,33 +mar 23/03/2021;05.22;7,27 +mer 24/03/2021;05.08;7,18 +gio 25/03/2021;05.17;6,57 +ven 26/03/2021;05.25;7,05 +lun 29/03/2021;13.18;7,32 +mar 30/03/2021;13.02;7,33 +mer 31/03/2021;13.11;7,28 +gio 01/04/2021;15.01;5,16 +ven 02/04/2021;13.25;7,12 +mar 06/04/2021;05.11;7,44 +mer 07/04/2021;05.03;7,51 +gio 08/04/2021;05.19;7,26 +ven 09/04/2021;05.07;7,39 +lun 12/04/2021;14.12;5,43 +mar 13/04/2021;13.10;6,55 +mer 14/04/2021;13.15;7,19 +gio 15/04/2021;13.30;6,18 +ven 16/04/2021;13.10;7,24 +lun 19/04/2021;05.12;7,33 +mar 20/04/2021;05.22;7,27 +mer 21/04/2021;05.08;7,18 +gio 22/04/2021;05.17;6,57 +ven 23/04/2021;05.25;7,05 +lun 26/04/2021;13.18;7,32 +mar 27/04/2021;13.02;7,33 +mer 28/04/2021;13.11;7,28 +gio 29/04/2021;15.01;5,16 +ven 30/04/2021;13.25;7,12 +mar 04/05/2021;16.37;1,59 +gio 06/05/2021;15.22;2,09 +ven 07/05/2021;18.39;2,14 +lun 10/05/2021;13.08;7,45 +mar 11/05/2021;13.07;7,48 +mer 12/05/2021;13.17;7,29 +gio 13/05/2021;13.11;7,17 +ven 14/05/2021;13.09;4,22 +lun 17/05/2021;05.09;7,46 +mar 18/05/2021;05.12;7,39 +mer 19/05/2021;05.04;7,42 +gio 20/05/2021;05.11;7,38 +ven 21/05/2021;05.39;6,41 +lun 24/05/2021;13.01;7,49 +mar 25/05/2021;13.09;2,57 +mer 26/05/2021;13.22;3,29 +gio 27/05/2021;13.19;4,25 +ven 28/05/2021;13.08;7,43 +lun 31/05/2021;12.59;2,11 +mar 01/06/2021;16.34;2,18 +gio 03/06/2021;13.48;2,17 +ven 04/06/2021;17.01;2,29 +lun 07/06/2021;13.18;7,32 +mar 08/06/2021;13.02;7,33 +mer 09/06/2021;13.11;7,28 +gio 10/06/2021;15.01;5,16 +ven 11/06/2021;13.25;7,12 +lun 14/06/2021;13.05;7,47 +mar 15/06/2021;13.08;5,55 +mer 16/06/2021;13.09;7,46 +gio 17/06/2021;13.17;7,01 +ven 18/06/2021;13.11;4,59 +lun 21/06/2021;05.15;7,44 +mar 22/06/2021;05.13;7,39 +mer 23/06/2021;05.09;7,51 +gio 24/06/2021;05.17;7,31 +ven 25/06/2021;05.33;7,26 +lun 28/06/2021;13.12;7,45 +mar 29/06/2021;13.19;7,33 +mer 30/06/2021;13.08;7,51 +gio 01/07/2021;13.23;7,29 +ven 02/07/2021;13.17;7,37 +lun 05/07/2021;05.12;7,33 +mar 06/07/2021;05.22;7,27 +mer 07/07/2021;05.08;7,18 +gio 08/07/2021;05.17;6,57 +ven 09/07/2021;05.25;7,05 +lun 12/07/2021;13.18;7,32 +mar 13/07/2021;13.02;7,33 +mer 14/07/2021;13.11;7,28 +gio 15/07/2021;15.01;5,16 +ven 16/07/2021;13.25;7,12 +lun 19/07/2021;05.17;15,33 +mar 20/07/2021;05.03;15,28 +mer 21/07/2021;05.09;15,45 +gio 22/07/2021;05.08;15,37 +ven 23/07/2021;05.17;15,03 +lun 26/07/2021;13.14;7,43 +mar 27/07/2021;13.25;6,55 +mer 28/07/2021;15.05;5,18 +lun 02/08/2021;17.14;2,48 +mar 03/08/2021;09.33;1,36 +mer 04/08/2021;10.51;1,55 +gio 05/08/2021;08.36;2,21 +ven 06/08/2021;13.09;3,35 +lun 16/08/2021;14.37;2,45 +lun 23/08/2021;05.09;14,55 +mar 24/08/2021;05.04;15,09 +mer 25/08/2021;05.11;15,12 +gio 26/08/2021;05.03;15,01 +ven 27/08/2021;05.08;15,06 +lun 30/08/2021;05.18;15,09 +mar 31/08/2021;05.01;14,31 +mer 01/09/2021;05.09;14,55 +gio 02/09/2021;05.07;15,02 +ven 03/09/2021;05.14;14,37 +lun 06/09/2021;05.08;15,01 +mar 07/09/2021;05.11;15,12 +mer 08/09/2021;05.09;14,53 +gio 09/09/2021;05.04;15,33 +ven 10/09/2021;05.15;15,27 +lun 13/09/2021;05.06;15,18 +mar 14/09/2021;05.22;14,45 +mer 15/09/2021;05.18;15,22 +gio 16/09/2021;05.19;15,31 +ven 17/09/2021;05.07;15,09 +lun 20/09/2021;09.11;2,12 +mar 21/09/2021;11.11;3,15 +mer 22/09/2021;12.59;2,27 +gio 23/09/2021;07.45;4,39 +ven 24/09/2021;17.37;5,21 +lun 27/09/2021;05.06;7,45 +mar 28/09/2021;05.14;7,43 +mer 29/09/2021;05.11;7,44 +gio 30/09/2021;05.21;7,39 +ven 01/10/2021;05.19;7,28 +lun 04/10/2021;08.02;7,55 +mar 05/10/2021;08.12;7,42 +mer 06/10/2021;08.17;7,39 +gio 07/10/2021;08.09;7,41 +ven 08/10/2021;08.05;7,43 +lun 11/10/2021;08.33;7,18 +mar 12/10/2021;08.17;7,39 +mer 13/10/2021;08.09;7,44 +gio 14/10/2021;08.11;7,43 +ven 15/10/2021;08.12;7,38 +lun 18/10/2021;05.01;15,09 +mar 19/10/2021;05.13;14,58 +mer 20/10/2021;05.07;15,04 +gio 21/10/2021;05.03;15,11 +ven 22/10/2021;05.15;15,03 +lun 25/10/2021;05.11;15,13 +mar 26/10/2021;05.17;14,45 +mer 27/10/2021;05.08;14,29 +gio 28/10/2021;05.21;13,47 +ven 29/10/2021;05.55;14,17 +lun 01/11/2021;09.35;5,27 +mer 03/11/2021;12.48;4,56 +gio 04/11/2021;16.39;3,33 +ven 05/11/2021;07.33;9,24 +lun 08/11/2021;14.12;5,43 +mar 09/11/2021;13.10;6,55 +mer 10/11/2021;13.15;7,19 +gio 11/11/2021;13.30;6,18 +ven 12/11/2021;13.10;7,24 +lun 15/11/2021;05.12;7,33 +mar 16/11/2021;05.22;7,27 +mer 17/11/2021;05.08;7,18 +gio 18/11/2021;05.17;6,57 +ven 19/11/2021;05.25;7,05 +lun 22/11/2021;13.18;7,32 +mer 24/11/2021;13.11;7,28 +gio 25/11/2021;15.01;5,16 +ven 26/11/2021;13.25;7,12 +lun 29/11/2021;05.17;15,33 +gio 02/12/2021;05.08;15,37 +ven 03/12/2021;05.17;15,03 +lun 06/12/2021;13.11;7,44 +mar 07/12/2021;13.02;7,51 +mar 14/12/2021;08.12;7,33 +mer 15/12/2021;08.11;7,21 +gio 16/12/2021;08.14;7,26 +ven 17/12/2021;08.19;7,33 +lun 20/12/2021;08.14;7,03 +mar 21/12/2021;08.16;7,15 +mer 22/12/2021;08.17;7,24 +gio 23/12/2021;08.11;7,18 +ven 24/12/2021;08.14;7,33 +lun 27/12/2021;10.09;1,36 +mar 28/12/2021;14.37;1,59 +mer 29/12/2021;14.19;2,07 +gio 30/12/2021;08.08;2,38 +mar 04/01/2022;13.27;2,06 +lun 10/01/2022;13.05;7,47 +mar 11/01/2022;13.08;5,55 +mer 12/01/2022;13.09;7,46 +gio 13/01/2022;13.17;7,01 +ven 14/01/2022;13.11;4,59 +lun 17/01/2022;05.15;7,44 +mar 18/01/2022;05.13;7,39 +mer 19/01/2022;05.09;7,51 +gio 20/01/2022;05.17;7,31 +ven 21/01/2022;05.33;7,26 +lun 24/01/2022;13.12;7,45 +mar 25/01/2022;13.19;7,33 +mer 26/01/2022;13.08;7,51 +gio 27/01/2022;13.23;7,29 +ven 28/01/2022;13.17;7,37 +lun 31/01/2022;08.06;7,39 +mar 01/02/2022;08.12;7,33 +mer 02/02/2022;08.11;7,21 +gio 03/02/2022;08.14;7,26 +ven 04/02/2022;08.19;7,33 +lun 07/02/2022;08.14;7,03 +mar 08/02/2022;08.16;7,15 +mer 09/02/2022;08.17;7,24 +gio 10/02/2022;08.11;7,18 +ven 11/02/2022;08.14;7,33 +lun 14/02/2022;05.06;7,42 +mar 15/02/2022;05.21;7,02 +mer 16/02/2022;05.46;5,33 +gio 17/02/2022;05.37;6,27 +ven 18/02/2022;05.22;7,09 +lun 21/02/2022;13.01;7,55 +mar 22/02/2022;13.06;7,42 +mer 23/02/2022;13.08;7,51 +gio 24/02/2022;13.11;7,36 +ven 25/02/2022;13.03;7,49 +lun 28/02/2022;05.12;7,33 +mar 01/03/2022;05.22;7,27 +mer 02/03/2022;05.08;7,18 +gio 03/03/2022;05.17;6,57 +ven 04/03/2022;05.25;7,05 +lun 07/03/2022;13.18;7,32 +mar 08/03/2022;13.02;7,33 +mer 09/03/2022;13.11;7,28 +gio 10/03/2022;15.01;5,16 +ven 11/03/2022;13.25;7,12 +lun 14/03/2022;05.17;15,33 +mar 15/03/2022;05.03;15,28 +mer 16/03/2022;05.09;15,45 +gio 17/03/2022;05.08;15,37 +ven 18/03/2022;05.17;15,03 +lun 21/03/2022;13.01;7,49 +mar 22/03/2022;13.09;2,57 +mer 23/03/2022;13.22;3,29 +gio 24/03/2022;13.19;4,25 +ven 25/03/2022;13.08;7,43 +lun 28/03/2022;08.06;7,01 +mar 29/03/2022;08.07;7,23 +mer 30/03/2022;08.11;6,27 +gio 31/03/2022;08.17;3,45 \ No newline at end of file diff --git a/DemoData/InterclaysDatiProd_Puliti.xlsx b/DemoData/InterclaysDatiProd_Puliti.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f1e6f0404ae65d7349ea1511255f4acffd8f4c5c GIT binary patch literal 31329 zcmeFYWmnw6*CmQO1ec%z8f~25uAy;vf(8xl5Zob+ySoMt?(P-{?(Xh3o&WR9U31sm z`w3?HMYDQyepTn3+WVArwUR6>94-_B6cQ8^)F&ux!nIXXXecN`cqk|wC?ptNaXVXQ zGh64cY997xPWsI5-)$)J;9%%-pkN^O|M&HOa0dDkCT)9I(FV@r?=aLWRf#uP<#B?0 z-$=L%Y7mD$ic`%{N1z8bW)mBx6=4L4EEOsfKR^38n0y#K9{9!>X3@qd*?AC-rnmds z;aa6lG5eZ7_7i<^;w=WK1{!yJ`gYE~1=)|toF6DDk9$_wR~8~=v8g` zEUJ$B8Ikwk*4Av7)IUE%2c7MsP>&oFlbNFRTN@zUP}%gua@XH-Tn0F621z*vO@(*I zVK)qT^CH3u`7YuC%-TP>tB=cu$@e3L;ZovU%CQD&y@Zb6cZ;JVKb#Zv8^vOPgws<| z>Z_8_HFLT!MJ+3!OKK!_BBh8L_k}jH1C)yjeT`!7yk#CFz}>|)mf=-AdHiPXb%-4&aaMUHcl+e|K9(v zDE|*u;{OtQMV!21FDqKe`Inc_q5HYj7)&u)H_{+UlryxK`if~oc~ z5LVi^-REUwc~#)&(a@*6EzXKaY+Qb-2De`!$xjY0hzvB2Nm33Kn|)ZWbGLJMsnQ@1 zI@k7ShVrJ8T-o7uDycu05;d5U%$gsOaSBO7@C8%-bq3_M*Nh)3q36U@Pk)6}H*)73 z#ZRXD&L%d%AL%l;te?&n=e*+57~UWef+4dYQbw+ZJg!EN9pm^)TZlNBE1vm z)tgBnV@QRP6Z?UEQhE@ObL*>9&v`kT>CwlH+*>|$F&q#{Ua|(6r~Y@5Tp!BI-9rR& zjsOMq0g@Sa8x}V^M{8p{JL`Y5SB1L1-4ZMAkL>z)%tyhW*T_HpBC4z`PDA+qcBqv_ znS@DVn>ReF%)NIUi{vCESL(yLo*a{8JDrFBX<6Dy{cWt`pj;p8r&9r08(ANXwC-z&p%!P;_oJT(z-hv5Wq+rKkr~Me> zcvhmq9#@jUmT3+Sb=cVnBCrU>9KAOTTZ~fW!gNlp6FV279t}fyV%RM#n|6F6Yswhv zudOc~lJ!fuiaP!dA5oDpkniz{I`tcc*LKKXsUDVq&dA)$qf83t2K9+jT+rAJya+%4 zjQNxPNz<7O3fDfbJGsinmxisP5JV03CyMd|KRnWIy%$SPf(msHK*-JyOeO*QYo+4P z+eEGF+VhlVkAXWyDnzyHc{i+^X@Kvuez{t8+i)duqqU7YL=x>o_aBE2NlpZkSpAmV zIL1vyIgca70_W~#g{{j`TC-7DYg`83fX${CXMVvV81+E|rey;X#eY@4eV>gcrviD^P1N%c80VY*`3QFzlVMiQ7 z%TE}(W$l9`o1?JEZGa+}GwbrLR{p)H)PzN|xGN@T8q ztknmX(pq1V+&xcKD*zTv*41g9FuPb}@jDzekXr2;FFl5Sj1WER(~=Y|93p?fy!~Pk z@27({V=dC8uKJ^2dF&6rV}h%Fd_tWTNeXF>tA9m}Gdm_UN$nipHhMd?d{pt$I#nkt zY0Rb0H?d5uWcYRvY#Tht^(1wufa=LggUD;^*NW~N?eSbMkG&%T<`ry|a%eKtmRL5T*T}{c4LFx9Vd>3px+(2%K(r zheOE}}IE=Zorr{=t78~gUmd$UDK<+4UkS4#rd zvXnmY8^z#WQS+W6>^DctJqBLXm+D{4EL@Wd)(VQIts<1AJSv8%y@3g8x+I)tLOHU@ z1B0SYA59noD?hYIYVSQ}MsToz} zd=8kYHo)@50ACvh-XkklFMhLk5LR14$bm$Yx>&XuPW6Rj%$U8=x+i81YaDe@O^C0M zLze~MRL6i8{p0AVhLLkz_|8$|{Rs8{i#b``zgtk~prEwgA$tS}CH}j*I$4;RIXkiZ z=MUSzGMf><3SMHx3_fSPB?YeI(E2NdA(b~Qt7{%fs^9J}@!%L64VHe#SDJG>U%(U* zE1QxEACwtbzg!rM3~krgfv<=!Dz``~ND!fwV`_Dg^!4`rI8Nt~<@Q;#C@_MoYdUmy znL9GGhIk&vJs@a8z5cd?g~%xneq7(!^WZ|!q+*Zk>uFl^8cfwT#V@U_BGsbilY>~L zB`?Av%K|@Xs)mnzzCl__E88#nj9%PR^-YMy&8s%gv8*l9eISOz4_KgZ{N3voj-)Ew zzwMJWdNJ+&{DbBKLw)DmARQFz3`_3-Q`d~^?~hJg=6V@2jkoK;!!%<(k!Zy3qPtb; zDjFHukMLYR02|Mc;N99?jlX!W@mZBv13=EhLZY|V!cj>khfs0#J~7qld+kTdxZ(sR zf@x79TetQ`%WkuokeH zdSk_lFMmYwYd_1y1YON$2)`qkhcu|(@K)&pFa}2KG+w_mYsEwE+9C1-H9UL zz&kL`S4?ryI;-=2Nnuc}zG z8x(yX--J6~uUlWLI{!jG+&8@6J%4?F%l_K=9aqT)T<*kD&io0{`gffG2psmH>Rcc1g8SS#{60xya|nqUA|#lxl8~6EUZ6pVD#R#@5Kr)}tF=lEmy2xgvFBL?bte zQ+Xq|bUje-UXubG61n(JO?{YR>J%_Wj&=QZbWujsmyUvp8j;5`8*(p6v)^Z*Z0Q9w zEz5D2)@d*)pB|oyY1!cqi4C8?DQj?l1*Ux*t2;U+yApeD(fxkVCR7h~eAScW!do z!KfCC;q2zLbtIboY*V2JvTVe!TigPZ2$od*c9WsT0G_fByA0p&9!Y)f@{uc2DGM{~ z45;!oRkSK+G-xAEfk}1+I1l?+UlMWC%Ino5pt|#T?dU`Iu+`u{*`ti3<~))z$>C^4 zhT?zoUc20QWy&bVO(B4~=9lu6H$0TcZHB#;Em4!tZ3Zp(i$__(m2xV;laH}-0 zj{6*Z!tfo}TUxjZIf#O<;|ygjUtCMI8qzZrTnJ6|Uo0o2?Q0|JhDPirme0wi(0ab1 zOs~@+x*#J;QC}NL-szAkdM!;$er0#0bdji>?dwC8ISb)J!*;QbT~c&I94(Mhh>3TH z2FplHp?$m9%zwbJA7z)1Y79u#Rw#efmnzA6)N#T-IeT}!v{A&T1l*!jzbRPk8j_0d zUOu9Iqm<4qvez#hmk>NS;MGG+%-+7vUQ82&KW6yuA|{=S4Ahe5w(}N>HrOdRr>FbJ z1U?jbL;B#g(FgBJ1N4T+EHS6V29UDQ!tUs_Dq;3yK0#M^77PUA`y}<*|FiM|ebi*J z`rGC3vXi!x{WQ7z)snp|AWGtP@EdDgr)2mGZo)a)2swc>dRo^^c--SbuC#S>z}2ew z<95KBD2`UO4DDp|fo?+blB!bWjJ2>JbC{C6p*$`h;`X)2MP81bqERzQw-6~$kAW2Z z^5MmA{P;Gp?Ia7vHIeJ1anD&ka!|+RgXh@N8$MCGHOj(2f)g&m6)B|P{s2$zt4P6D z;8uS9akVQ7NTaFVL)LWk?x=8#IcWNqmQ#sOAzY9kENlk$al~P1U(g44Uw=s3BzuS?a`D%y*3^b3Efgyli9D+zB}5_2|M@tg`0eV%JQ zj25FX%O#Cpf=I&Q&LHs48f8g+Nr5=CFYCKQeCTE$VZkx|a4-ddrz~_ENOzp|#0th* zlr4=gdw=gNDZneS;iF2ZU$B<|!uGKPT0uYc#g-j?y{2Wps-$K$@|bpO-u!1Fa!@ed zh%U6(N%f}U^&li^eWr}OmYYF=Hk4*KR^c9`ZfAiVi zEMRD9t9*rCE0WoV8gc)Y*Qb6iZ=U$P22UV{5el84GA zB)m6u)5ufMRICK)N+Ik@-Y^p+0JVMndmd)nU9r0jL|lkDB%Ib2pcWKy`4|*2t;_;*=fPx>whfIu!C_ZU=zx|z$>smqtEyk)0Q`m);^|SI>dct z-Hoy}Ri3ID4f?)EnrblFDczTOxQQ`A_1IlnIrQ9rLF9>0irlB+;Vty*3Q+BLPH(Dd$)U=> z^$kaBRNBvw)IB#!k4oZ;|6}WMVr(kqhO-cVTG!Nq34R5 zrv|BS(?_?H#rGcQFi+Ab6Odfu_H)Qn+

5A{_F%)kHA-3%hmw6!o!>tY|MFU%>k zQn}CCjSILAEiXGuCLYj&47kgng|qjYD)IF{`{5C3qAxb&)|r{4WCx1HP!b95U>ijW{Ys+0xIA5*j46}4?!bNh)@ow5C56a@Ci#< z6#{PlAZUzW3*+S`6WlZLJ9N<(bCx%HbA?vSYFSe^_9v_|B{%di=#G`UQWI2m>1_KG z>nx|<+i@sRH14E6y8JmW*KDz@GF=K+yvo?gTODmasM<=EGrhV)tlzQZ+_Ef>@CjEp zUW-x2kPRV47kEUq9CxCosEF5()SuP|gL>oobWZw88OQdsLOCw?h`ub3py+o4jROq6 zi63mAoaML^N<2_qQ5CO!sLEboj(;-w`f~ek1JkhDt(v-W)C`YNmSAKyv)y*zhU zRfMBsw;%33M?Sgr=@{-?lwjzhuUNs+=~rKHBK))84RPzLJ7aq}Jj(Yr5b#Rm7fX;= zp&mh#6o z=zIQOf#mYZus)6hB>n1b5>D&TdS-Fg_kyG9G*LA@-#n%?wjS%D;X~y5E|yBu)^ghj$s*bPX?`W#}^Sr@G<~3TC)bBa18RLPMD-aPPbeK zhU)B{wa|Da*^>90+w=pj)|06ETph{@3ssl=oaothaQlI0>xCv<)f>DjCwtm8wQ+D& zV0^E9+~V#224WWo-4|a)Z3TPs$LmE%bjNl*h6t!!ZA@blE}!_?JOe7m2%GW2pJdHc z{RL$Uu)hK=0F%H%i7+sYCQ-$=!%q11 zp_;r#w}C{nAu^pqX8b1u8*S9J0GN5%J8LLlpRP82e`qA?GPnLrsQ5%cUgHeyXA=8h z{HlPm1}>HOVM;9xGjRxZY3-*r2H)FT@x#U1JVN*{S?9_Ji@@>(JQ4`N3`mUKKtYSl^>G@c>V6j*<4p)EHL;2E6>fG(X>-%#QLLv ziICI!9DzKl$*e+E#~W=2fIx(U{ydh&A$zxppLQWyxh?PCiU;f*LI6*CpUhGZhk2m~ zKO{64*XtE+Z4inCiAR#Ly>!-(w*KqH}ZRN;`g6+w?AHKF=k!J=6yU|O_)+UFs zgFWU%t~=C$WicLArNTq}v)`iInW|8XIoKy2L{&2?qgPz1w{@5pMKG zo{tl3-?V61*BDvLQ(`~Hir!JOG>W#IlDPgYL|08D9 zO+VPND)6fDEqaT7uya>r63bp!hwh8!E@4x8@kWF}P%}7iv>A?iQ%ZheOR898{@PxW z4MtzOZ#QO@!=X?PYj@gFP4BYh6=S(%V`r#|ge(eLBT#$i)9yo4I_=I`aO9r6akK4g zGADwTU{tPg^F>#kqa+(U5;$q}?)trdG?9+FakEX7&RIAGqsg0k#GQis9vgmy*R>Lk zsd{sWg2#usQHL+Uma0?oIBomDHmiW~7?iT7)pGI-h6Yb`hb1)by0_?id$a~e9)L?D zr;n})H>McJx){CgTn2}nT<*p0gJqPQmMjk!TWEQIljyr$d+RGl1qewm^vnH}OOeNt zvB$f;+M{bt-#>{k*xBTpVNS*pw04V>o#S1ql<;`_;^?rB<<`uwm)Z)bL}E=`c3Mh$Kd%~~9a;GCqZ7KjF=g}z1`}y-a$6Kz*A1C?BiG<% zBHgNZS~Kd2(wP2$I5L;?b)uT(&$vjg+T&MON0h6xVpXR`1e3%A1w!S@a zHa9O=_`a-jMmw`6^W{7!mch4Gzc<|n^?I5bD6ooe))V9YXR8e*F1s!2hqWm&Zay3E z>!@!Q4QAWVy{2iPiWSVi+F)o6Glq;>T;d8kvjv8bns`tOeJ>fq zmwoyhWF2DUDGt!6p73lgC)=XTH|=ta@F&d~C3EiLiJbDCoZ|0st8@fz+2E{YM!5gGUF~h8Ua1SS(BdHD+~u zp=Xi`npRh^&b@ONj{7Zeg9nzHw>QJMLr3r7RAdllpn=h28nZ>bw@^*vY;;2MpBH}x z6Sd5-1N}|>ke~fIbRDT7$qbQr$FgqSuf1-7ra%(E@Uu+05PcbDx;L%vMBAMFVmWo790EV|(E&&G9zQ&;tP zfdNY-04!eaSs+3u0XDKo6bTNZCnYop=eSkmmh?H!#QdkK z57Ie~I0Q!eo@(G@qxLd5Y}tC*+RNd@lepLdx+#?Eaxt2|p|Ri`beh8?gq`TbRjt8r zH~oWo@bY`?-`h*IR$dL_Sk__q|ARJti^{+l#7H7>YkPE(>gx1uC1}BxJc1k8l=6Kk z^)*mDn2qUEO{jcsc}BX~5Od2r@I$Z>{G^2I6zga6hGgJ$z5&AP>V^MJTo$B^R+l@7 z#Nm!&l0YKb^gv*5#)LdXBAOzIevf3kY>E}Li`1in=toaQ;RI&{RwfbEYC-wIt^)`pOtyLvT=|Lq%u??}#`h?DUO6m$9Ux6`wl#2`!z`Yt^~U|!oW%?z5R}A{1v3K^ zaXKq!zm;Iq`ui874!Xf4ljt`^E)(UOmUz(;Eb7)K+<}prZzw#yv_YTfN0FU30|3<@ zNH6*@+*_)vzXs|QCx|&lh_Z@IxS!iX^(B-hVFboAJ>1qWY2R!UHK zm*OkxR^>eZ6T>~gRvrBa zx_RFPbt;5$RlfimmBamS4jHC~t7HA<*80LKF3I_ zKB8|;tRhQod4*&Dh255w_0`JOCuDH}3p0lnC;ki7e<;AV9yoxa_|DT(rB-G`|A4q; z|M}05efOTc)%Z_1YpZwnXPBYlskCr}=v@eA9@^=&}TDY@2Si05sB z8q9uDcj@{)=srMlHM$plrv>H#2Fsl@sdScsGB#4YJT>isXoF6Dn=pNwpw}{n8aeE7 zLhMj+l2NQsRLs!w<`xr*PAUv1W0aKMD#2gcj#U?~4zN}<{hk(<&tivV6Z>pEM-gEG z*CcLD4}HlTyUKk7EQ*{(mE4gh< z*g_LP8s`kMs~s`tNvmFIj4p(l#7QEgsDrr95ABgF$h!r3=40AJps45KQohB zczjpC@CoDM;E>+#K@a>vPokG3sea0{jDWrts7F~MCLdKc9RUcqdQ>-_Ae?t6(SHCU zj9&&9%ERJPX*qctwWypC8hVf^cT)}$Fn1ADI$P#~fM0(yBML|zqz!*o?$-~;Icw7M zCp38b>UCzbRY+X^sJ*uhyk6{(;pE~N=M^bYw&%$2$r0oc3^QM_PkA7h+xn@ppDjw%H zC(cb6&P~ufq@SyR66pj3B(R)0me5iJ$Jd0ht$Fnyh=OH@T0gSxFe z@*Cyv9p!pDCpuvLZJJCNm-Q>d*bt$_O&w8>V?erF2f7)b11Z(&pM2-BR!d#f0b?>0 zj2mBiu^purVz<%eMIQzER^3{p)c{e(a8_VW?+=U%GaE@dG8<^;&MqYwO%*tzp}xFL z9jW^%FZiReA%)}<9v}ICSC$2(veAi>!UDlsO$qcf)i=HV#tSWFkh-45R)L1tk;>V$ zn>3T|pQ)qi0`Z+oU-0<@nf)aa|7u}3Q*lZsk3!Z;P{@_gMzZ2v9&|-hq-&)z-9+8& zzuA&_Du+=*eal8vUta_)Vmj~Syvaufm6apfUd~X1Yr^W}0xbg-EKPycnz zdrI~hmh(nHWSO3Qrl1BXgO0~wti6Qb1_5d8Bq_1Zq}k45Y*mgH#A`ysep=C1yYbi{ zNa0|oel6`wV`tw5Qv-ztWDASaOwimM$^m<&YFmA!bL$*^D_OtMQxm^7c0M>IMe$~YD3 z)*`12C^B|F9f0g09P(|8((*sJIkXN!^$Mx=j1j`SgN55(m%+kZX&JA|hvc zlo*WkM||pMw$VzykqcDMNAD?x#mL5!`ReyWtcXWhoWKQg z=nyLO&KyDsIOof(de~(Jbmv9W5%7qgQJPd$n#LfBk0}2T>h!4>-^Pkn(^}q&|GP%> z5WM3gUX}v{XlOx1-DN*opL{QeCjB1Lv&IZk zsIv=&`ym;Q+r>Y4Pv&l7`EuFY7@e#p5Y^U!(n^0CpPRy83~z?z8<4s^!1s4yD6u4B zG;Jg?Tb~JAd(gk>IQW%zMN&Y328FRDIB_V$>8epR(I4fz86 z`ncoV*-MZ7a8n3^;y+xgnM}I3d zw$zT4^94KT`8%|!!X|-$=3tB>bCO6!Y&ad>9tZfIO9g_7(jeaCogt5bOJw66!a+R3 zL4H0`at0$g;a`RMB$31fG$M{blUz*qm|Xn zj~0JjSP9rTCYi~{3wD49U%usF0PkroL%81rqOn@KquSO;x|?9S-HTh#)wXO}pdPmm zM?OK6)kf8<+R*V6X9t0vGYM=6OkS7Fu-Q~9u)%HvwK=*VD6cBc;bbU(=#(4al^Yo7hNJjaB5SKG#hqvFmla?n8YSS0m_f7r;B+K6xO`=~R}6%XH;RYiXW(6UJX7Z7m4e1o z8!7(VaaCM|xnsu6axOk{k?7j)LnL%Gb{wy(LvUkg)k@*^LO+SGf@_V3E%#W`-j{y7 zFAxW&9nL>+81Sgnv^fzd=wLi;K5jBL9%ML01kdN~?|0Qq`Hm|`Fe*h!0stlBhX2E-jeFu&9J}FFLrS$<$so`8Xmt2`Q)gRU&1WS zjPDaYAIYq&ii~5YvW2_YAKRNrMW9JR@bwV;bD|cG)F8}of39%Ce`7j0iL942yb^Dp zx1R7Pw3yN1cD5L4a)ipfqEeWfW`wOP9kk2o%45C2O)$9+EvkXlRJe7&94E0F`K@|R zvm+7wl)MYe4a*>CaCVTf$!7j&rZre?r5_#2$zd`+qIq+qCZf=bm;I7g#Q|RBGV$0m zOHFR<-6Y7C$ToLBa~pSF6j^AAw(`b35tLDA5vxYB_&`$J1XKI~iq0)QDIp*f@ma0h2*?OPXsDqi+I(B@r3=k z1+_2$0-n8++`;BQND(Y+Ow#QIfQxY>)luAhnW>>bmp?Pvb8zET_p-^rRK~f1W(~ds zUuh1d3{pXa6yl91ghqXE!cvifgS3zx0ApL26hHw4HHcKsCZshiC`|_eIc%ad!wCn$ z&@?)5tTZRhD}0`f?^5?mkOKymiVp(M=f7t<569SK3^XTk5%d*!zru7(uQu>)sDSSY z8_|a)52g)diJ(5MHv1h)-7l8~Em~J(azH_+oPyAOh+bQp7A+(`DTTYR*6gZl%qGDY za~0YjI7S}Iz;YjP&O=YSew_8o|G1E4g6-zOZ$cPPg8lQ|iUtD(FLYLsc;cQUw<%Kh zm5|TIAWZP5Nl>A7{k&s>@h8R}ED^GwkRz*nD!+3~>6*u^ZCp184)a-uO32pf<}(;e zD)EfTIP{!X!2z!M{oZnen(n))J(L=FS$2WtxJGwa%N>pbd!7Zr5c3xtWIo$+ zJ$vxe>HX;epUMYBMQq@ZW?b9E+aj((QtNS#9t!1?(u%=1<-8-Q`p>!))mFVn%jKpi z8Y@E_cdp`oMYm6X#VT|hk-@0Gm*k$UM{#wCq}iQ(XX{GFleTsAe)Qhg`}uCLs`K@7 zc^>jJga3J#tCs$YoZ_uK5HvZ)s4*lX&sd|*KEBbHe)L(WluAm%=6CE=Lk;Fw#wX}3&8&ipZ8yyC&H0cxr!By@O5j~K!F z11f3&i&>9vM923hKE=AV(8mdfppp0l?1O?*wMO7!RkmUvGGHRI68qO-PJx&GjnCU< zuZ{J|$Y-c5id-ka_qKD?feafF)Z`R0K5tdx^58+;R@2Hxin5df-K4_96w6#bPYT>S z{E$*>z~=PO?~n;{3VfZ-8lU-+wM+}0wSYf8m49DFKCVIpqqBPtxj&fHe_hL=0n|D1 z8k81`%k1aqwRVpSpR7u#kNeA``V2RGqIB)@tjc93mL)U)x*oJi_01^12caXc_CB%i znuF0R7=0a?INNB`Y0>ysS=^g^^dOWuS%`DY6{{Y}`+>Ix{mSMPUX4=n4Gs(0l{0A3 z8=v$>xBIVtML0nu`BcD-A43MV-BXp)Gor?ba{XF-$ z-CSZz9f^%E^(dVbe2OPqZR&}3_Mc^HWhSoK2DUq!KDhSLHM_1IB%6%IIvZ}RNg_

XJ2)`{q16Cpxz3+V8e}8?A7WRGL&h~wMI=yRHgWN0Jb?bi% z4e))XVYPfveOveS?R>qu?(BTOx<1Fb91i2nH@lghRJwobQv+yng!;3_B87Ny(Xz{k4^Zmwb zV99TZwUE2Opw(n2A{t;~xq8~;rM7XIFo4dhrI zN+pBR+Td}!%6F>w6jQJcZ$dwnMs4>;Zdy=)`z>$Wvtb?Hjea^V7MJE{i2t1tCQV}% zJ5&U01kc?+wZ`yrfx96jumJZJa_du*!l_{%JDzwcJ+RUbM!{Vq&Bfg@)Qd^E2@>Z4 zEL~SBEazq1o&)Z%Ufl1#RftO~;fOv%tDNS6t!5M0if&8}jk)dW60otY!x`PH?B!KF_>Q`&UlQx+ z0vCw3wkY;{Q>Nc5@0oO`08h4ssBf4=Af-QLJ7Y7}HMU{--Z`jdt43Ot+uU>| z*S{*0Emo#%D}?NwQlTCYVyoajYdptQd$80rLy~+TL%$I;Ug%-VOaw?+XoF4nof;%q zSh<`E`!KTpwc;E*-Ocd&!-^j6#smUkO!A(kf@91v;3Ic^Ht-)<>0ohcgOzZiWY2O5 z88cqzc$_wS(=U(Lk3Rsi`vzOz#l5U!B602eoDRe+-5PN)T9O}@rY6#8eKb*cijMqg zaV@hLX_4htWF@{^*kNSJ;M%8b8%uAu#_b(OQ&%{#u>D6H*Nhu|mhpSMeBpmwt5&}R zguY7rojzMJ-85$&cdAlUXuQX!C0>fgs0G8U92lZ0rOjnzWeJ}F6u9cSLxq5o!|2>@ zkJr4K;hnxL%C)&4th2aRR`53VP!#!rBY!Bn4O45_cgoE zvP&3848>ou*SE%#ilyzF0+t{1C5A&>tp_vV2UaU!T%9!BJ_$59S!y`h9YGRz;>WixCb*(H0y-5Behj@_$qP1+In zWr?l*S9c^KdJN=G;#AaRU7TE(t@vkoh6SPX2E7<0kAu4S<`Ay@Gd)OE@Y|cp;3)}6 z^OAH-b7zUIgD|K`lWwDLG-eOg3AFQqu@f~ItO$Ry7b8vg%j)NvGA;45S9k`blpx-t zz?0a7oz>PWIIYm&a6CY)$xH|pTZT3LmSr4FAk>gIHu+SgL&6iX&vgHs;C(QoheRPQY)Q7avO~S~Ci}7< zjjc|+L>wxV3X|b*Py@PVtposXl=G~_`JMRANKkl;K3QfFYje2(%HG1h(oqOA{|C;>YE|Wbh7&%~b5| zxCxR2z+Cklp)((GH)9|=55Q)?uY{X^3Slq2gOoc;zOWdCcH8_`k;`uU)ZN>cW? zp5~G(3!w6kg2F)fre?8F^|Z$D^PA616jc9^BX% zUy)6lYz+GkHvSK@t&D*y^kB~1skjC@{2N$8a}7TZ#7;)bto-Xe4`H!8aV!w{PJq=TAL7V9v+8&I_5FRQwNh#7nlGX?`)kITk1 zA1Ihsgm3zQy7~>0wEgctp5Ehv>sLT%f*U^d_E%_|C*qpw%X3}2o|ZK$Rt$uJ{PA?C zU3|_oMo7xba|L%v09jxow)%%A?r=`DrCbi=Rg6<3=BvJ716x1`nY|shO57*ccsd!e z^l{4JLOF%<(O-RwuxIjOI_!OHAcaz1NwKTIZ+~8ymgkam!i6}Ik3-WsrSP6QQ)qN5rBOsU?$v|p!ka9Qh<1;FpG&1Sm8a=wF1ZO_ z?FH7ERmYk-R^!C~sHkyB@#d%WW$Rt^3ttcx3-h$Cds(Uc?8;B7S;se!i|tB9Xy9?3 zq^YDa*UQUNmdpFWjPx;?c0i^+bW^VgW-G10Av{frEj+1_61@9U#*y-#jQN3Se!hY&4faD3y zk0}ay=xwSWAj?vELc|p&fPkRS#~wBSQ=xu)%9;J=$1P(BIZ1Z{{2WAck7T_Fuajg5 zlhZ;Ry4q!&!GADTkBTV%%(9GZgHjt!IX!J+`>!WNlTLJh9cI zAU>!hun8RmvAaakwpPmEpyuPAQTJ27ZA`EL2p+p@l4?!2`e#Gos-`TkIWwD+)kA2EXN2PmJx#J_6I##OY-~#!S58lsx6dZc@W|vIZ-kj za8IqPkDhtV*3#JN<#i|n^RNF%=(XABkd~TxEG?_3@?kXTYP&1MC4R<6WHI1XO3_IY z_Nt$ih=x65$~W|P3FGtdJQU$iI|lNj&)-B}VQ2bk)~ySTU zSbgee&wC7Sa=(NaCz*K}%i}jo=$j@xo3=TmhK<@exh>Wq#aNPcc3??{7idW_KTFsU zgsswgOf=2T$_TC1ntw=2Q*!KDJ)-q*_%uQ2OCbBLDi`?q_l}=e{6Qd^=WuWpf8ncf z`#g2L?5y0#$}|nGWPC=XLkSIsZ#_-AUY@OrT%J4~3N7!Tp{7DnHyn<*&yQf~(}ENU zZ@m6^XQ-9_cx}E*W6z-gNlb@LMx#^vudCkg4C8-#M;=OPa`e!AfVRV?Vm>I?BX}&2 z21~vD-R(4adU+AGvJ5z>xUkI53u%0yaA-6Bukv4-B>;sf65afgBo#Lbh;EjhVNJ7r z39@Rc5i(;SwyhqT)9I@dhEAFiy}UdXIZ6$bIFMYpk0oL}Er&{(B||b@8E)hd3sTt# zUUFJWy|P=Z0 z{Z&}vTg)G99lLAXGF)Znp!|)#SHeeRR{PBl{##|PKtdc?m1&+8#MDpY2p90zvHQNj z^z*o3WI<&SW1H(T5qz>Sj;iX0T^k2}`kkKmefNNcw!Cw*#GG037>=HzsOxZZNczbY zb#EihZ@s*~knyNuj$m5+wKAI&XPv?(DsR^;(OtM8u_mIV$Bre}zpGuDTT0jYHYYg^ zN#>e}n!e-T%LM%h`NQVnf&}>VfGZUnO4o=PS;x-e8^>6=cL}fN*}i1hvo?JNHl!=r zgvyS3Sk#s~?m_E|@i|+8e3&{GYFPrVt8|uj=%Q1CV%d0gd>Uqialo#h1w~Q$#h8AG zvX$5vfPu{{VTe3TMXoI;Hg%cg!rNmWNuZ3apZZ&o$VSFf{W060-)cCf%*wI!G+1o# zGJ7A4|EMO=Q^#axSe41im`5>3s47n~PUej2O^YXAVfVr&x6REK=rjp{ILs0(_R*Kd z@cu`8UlkTtleLQz2rdDF1oz`Yn~RNE%b}4RW0qpNV~eI z7Y(Q1kRZ#p7-Ee@)H8lDEHKqjEcgjW;DTUR8{lq+fN;=_qfB)1^Bi{u$yU0ppvzJNj!TtP;{bJ;YwJ| zB9O|w37p(E3!rc4h+YN@AU6 z5&K48&kBje?(W>%w0W^@-80V7Um4Y79ApvDRQB~T3N>0iGz`CN+>jhL@)&0feQ=Um zheI6TruWRvcu5EbJ&$HRi%8H6gEE%lTgp?QQ|qWwmse93=ze^DC+A&SJSVmj7GcJZ znVZ8O7F#d8W~zaT+*BO-Z=RRL_e(`i-v`f@L}M;w1h{nn6rd3$+ahJcd}j5~lr=M1 zog~qju{OILa&7)3H6xHk4c0ksv_&9i)dlq6P5|exU>%(g-SkMrSC%S0ZsUCGMqx-b z%o-d*Ny;>VTXibK2BUCmrCbprhmU+9wa%phlYU~Vnj&tj>zNk~=?Wc07x1hyV)*R) z+l5VTkmj`N@*p!faICRpjl!|H^U%*rS^#S0r*dcEqu`O8;q4OhRViJdU^H*dP|bpt zuvu`^x~ddjjQVZwQqr#c2|p-}qDu6je^}{J*3+K0FeD?z1@$Ep!+W@IC5sS@go%;( zID>R;)h7_ewV&NJo2p|a5He7xPxLPuDrMe*-?+ftE2#ii$d!&~(ha{Bk4G`%uA$@z zOB-sfX3Kh!$3^jIIM8i06`{Y6$w2ZC*POq}9Wd*Y< zEQO*ud7-~#TD3hm8~0MM_g^rT1jRdJo+Z4x(329FZNEkjmtT5$u3z~YLtT0E70+QW z$$D{C`ULo;c2P6~3wSLeB`68X=1v8gpdT=K`K%a)p>&E0TYZRWaE|C_2RCGiyv??j z1I(_twClt4p4JVj@$sqP?DLNU1xeI9^ow$&)UQ8t=SnQ^Zz)$FFJ#2Kbg$+pEJlPm z`f!{uw#D-rtpI5DF{PC6@|?DU;$0*G0}4KAwk$3wHlPW>v%;iCnaZLkB(!;}J7v=8 zt%v}IeN2$@osd>Mun&$9$0C(^|Nyl56G1?4y0UCT)vYe6YuJ^xW!!i44gWk zSm^o~vgxf^IF?qY9qWwBP|B{&b9hZAeX`yxB1fECaNcNColG9L#yD&(vU+O?mU0526yRfEWPP6H2X$F=_#ev7=k)@&Leyqx6eYdiZB*%IG%YZ4Ymfw zYP<_zj}lV8RJ=h-x}%;q-Kg)~i4Jn*PEZu`_i`7lP_gi_hgbZ34>cudMT`5Y{V7(A;LJS(WX%X-%$I;Oe)F+2GBl6wy?~V>`)JAI(+2vc7m_U_8&czHlEcJ2djsn>OOov3HPX}c65ocA0gype#{56W#WigiDcu|^mi?dkpZzOgnbngSr ztZOJ~ESaEidl_+W!A$rU7;GN=xN-6rBj2yFwkloGn z4}4Ab+cghU?Nm24Y)OknN?F=7m^H7i4T1ZxM~NwO^)DO6qGM*DXXRzqJUUb6)mfu> zfb_E0M9`Z8+;aIwb|QG$weF)3KJ^zySzi$E?qPZKfbGl}aZx&3N03RxcAs>OF4_^u zgLAZ@X~c|UB#NP0tg3I7-rGhhb3bY%77YL?VgD+J%8X9@{#{;k>2fd26j6-({l$C) z1xf~+DEzFGb#`d1K5znEnl)o|al22Ah zyHQbk%Dy^Fkgy>$OQ2qXzdjsiF~b$Ev#!8W5o^;ksXf%_(_z-_LHAryW-l5Sgh({) z$rslMN_SMt=M4Pvdy9me5eb-@howNo$R9TB{!ZA!i2Y93%Go7qVZwT_MqXA{M*dktX91>M5Ztu3^xJohk7 zCz3H`Nw?T@xCXNB41#TyM&V11?4$NTDLlMBD93YjR`(|0mSJIHT2N-O ztoD6l3z|T@4VL-fVcsp{=H{skBTfrb?;CoYxlhVwBCuX98{SLRl?fe{yiU zg0PXZ#EO;8jPjChH_s!Q|IVlSV0KEQm1pxrIc&@#&PZqP|0-yy&frw}z6ZOJxY*G&oUA4ki_%Dik{zFc;KD%fef2EGLwjk3YhIao}X3 zp+=spEsB0r72HVDtue_QQ8cOai38*;J zR#WU0N?3lHv+W_n^8rqzW<{`}d)bKnzQmpj>bT{0!?0?#2369)iKUGg*g%m)_oWze z#^mcs&&nuA8uO8^Hg;I+0$(ojsk;s9h)F~rJ;gw36B};?mdN|+dHUQfwSmca4J7Fk z<&km%D6lsELAm#ookN`gMR4O?5?2M}iAQud`zuIpD}ww)+jlttv|x7aU;ysexiHQ; zjbUO+pcaXh!VGzd!z2PLN-D-_13Z{m9B^3Q2GF`6@DM5OunLdA&c*bWCu`{Rs|@!8 z;5itEDR}%g#jq=&|WDA=n1cJRV zG0IKXm&soYevA$&BoSJ{JHjeee&Ujpi2X`r0LDBJp-@;PaWoY}P*W_LlanYRPeq@@ z5KT~mNNUO-IkI6@kE3pkR$9(>@l7fl`BWR8(BSH?9WaqPR#@I|2P>49T-%}DGMeC2 z(@Y4w)$z8Vxz^V3#%bZlfFfaUD)!O^H61ZGUT0VQqcqZrg<13v@+7_Gr`x67Vik+% zz(wqb%tRz?r@beN#ib&F87p6+o*EgfU3fRBY2h3>@<&pc&+Tn?gE2I=gcjM6PCsv9 z=Pu+wY(ylNG+cc+``(Z-1z)Va1$H9R0_cjNEkJLtL~0wzy`` z>pdDWSopgrCgABJ0>4Ei`*Fh}H0vDp>@|W%*%P93E`Tkh@gw$e-ca;F@jKJq_1}`or&4Bydl6 z7<#<`kJP;KOMWG7JD8)5Oz?(e3TO^lKX9@5loiaQXpqw(JQ2|9SQgKXp0e)H{|FkUJ5s_~3 zqSJ?c%T1?moWF+8?$?oZmsn2UJw5aD#$DnQi@yKWqUH!)7NSe@^|w0y7T!nN8t_Io zM~F3-Jr-dm!}<(YmaOx&2kQgx>!<5w!yMT#wmV?&HcRK`atUZ6MC2nq!vuu8k1r>E zoffxPsejoe1uho+_}xD-zmjMsTQ?E%A#rk65^-#&rc8=Z5nlehl3#XtzwBQ8=!qFp zaNQQ*Xd0EMA1&902I90loQn;SrxA-!az-@f3cg>8pYPAZ?$3*HK8KG2YHe>ASg*kT zgS8aA%VbVkb0Gw|DoR%GBv))QrVwwRO=F|a-Gq$toV@*{Lguvq@&U$&jP&WoTbV`F zZ|~D!jK}5z)u1VURKn_EA%|6q_J$#PMw&h-SP zASMw>He45gJ2}Z2YD6J!D>QB4*u2BSKZR#GI9X0O&KY5##3;0}M*oP};jf%N4-3Re z9J-%L*3yUsszw4?Uo_DK$Q*LHM7)|U)*^fl#Cs29rE8*jI}Po6XZ5;1)m>kSS7_rM zZDjj9-8*RFZDS!ss@|x!gc6cRd6M+9g{HUcLS2}sD7~U_9^{Yno!d%%nvzVMS+01B z!(K{5%A3HjhDC0<@}RXtff`UVTy*{ffg!;PS18bnOdW$bcs&(Sd%0S%H~DlFU5jG>-F;X)+= znl{OnIxqmDH8NuPoDmIFq;)ovmj?u0oed{6P?8YZIDKC@qZj7L57>!NMm)UV%i(`d zs6!YJ#ES>rAy5?S&Oy!IYe>M>c+w#sFyzozVhBW^Sis|qh8{)4a`v+aov-Q*`jL}} z9%wUArS!paU5Hu^JY`ZE)e9QhMW#PI}~u{z`R8^%>rmdKRW`-&v5TBz|kzu(aYhkGxoB3fg{CTD3=l8I-Ftl)FI=hUaQ236q;mKb z`Oqt2%l7`DTyfoPS*NJu$1d#)4XKBO9D)5;_?FA7Y8SkspBCv0u;~l3sd{<(CDWO& z=l2BNPTxN7Xv>h%G<|SNJMd$YZedUkPc7WA^!6^dmSJeY1t#d^MXWL=KH8!K6^&Nf zvX!>E=J^V+zxv$>3-;8mF+td6J0>fQ4L?N6pszsOv%Cpq3g`{yahl{_e^vq{lo!RhN}GRg-dV1qeI{ zc%Y$6nZd~p9K$d`5EZRhOv=Yj%FkZ&=IJL(Kg)nW^|D>s&%-#mUVs|X-9bo=)bx&g z!W8z%=KAxTPwM# z2`ZaD(TGjR^Gn_i3)*YkcsbXoLH$Ow^vn^wdx!Dt-L^+vU}9)2Zhf|OlW295$_@f# zTdpi8hkNqR<5%3Y_8{G>>IGTk(k;@I)%K8F1(y6%W2oP6=evp^-J;g}J+?^&nuuM! zXb!jZO1*tiG|E=;%lqz$hH}GNZy{R+iCwexO22_Z^4#3bduZSa>Vh2-{}1G!2uD*( zAr+*M-2Jg*469bG$|a&k>1=1a--(l`G5E|@KE&i)b#Nz)`m`$}4}?!`2BA-|&R1E9 zPz(N-`>DlT$fuCrWf|#X;54`Z=+Kw+&W+*FlE1i&KeFqSs&T{$=){D)WUeIfc2)9W z>5zs+`nXT#F%tMjMt#S=wV@aLG#tYWWg*`{sXtZYhu0-agCWPF9nx*4x=p3@?Yv}! zaV8|~k|}T3xz&OoM4dVLv(SoC0aIS1*Mwn7#L;iB{DRk`l)nhesfF2-=6c4x@h}Gs zW5>A_2ukQZOUg5)6oL-D_;TdCc9uV3=`7FqZNe7qwOE(Nrzkg1Qn^}1$Ram%^eURr z##FWZBc;f=aPbE?B*O4`l|In3H`#n#US<5-FTT-jz&8j_N{Hb2=+3vG!?>Hg)zEnO z-uN!t*t!k}*EFwrx4}qhq&~)52}Nkb{v&haAYPmN_4hg;?mCB$LG>aZ+_Aqb=LCWW`n8967o!3(!0=F+E5Oi2>A0l zngU)}K8cbteJX;#KZAH;NtzNGT+F2e;R!q}@7_JYV}f4t69ZHI-5bh>C5x-ku*hn4 z;)Cnr0P}gRt`bxyH8I3oBHEx|4LEU1=nVBRk|_(BTvY-nxgIOP3sKQ zH`tgk_%~Wv`KHHtO)L3EI730yNEJ{@$(Qd@@p6f2OX@}S$687Y6^hZ(qT*1nqqs#s zjv6^=xcNT#>S(m27XEfk9(IRDq`Y)imSYLuHNE5;o?V+llw;*c_rgBgij3!KfS0YB zM}UNbfHsW&_Vr0@ryQGVW?{n})FgUHHPEX2?AmeWAl_FZ3P6!DZC77y{hDEs<5HMd zYXy(wIbCQ>W9}iJkCG7lP6H25$fYSNM+_!8D3x$Y8b|UeiwZqP(s zd{N==GEf>%e-B=oPRTfQqh8uXNf0I}=w0f{BHbd{o5>F8I)AW9R2v3Gzt5uD;O-x$ zKGC06^r4jxV~|3qI>?UN)C=celr|otAy7&Tpdb8bL4YT`3(^a>Ut@-S)WK1Tn*bzR zg^%Rl3a^TxBp*mclEeB!#SNj6?(vapELtOYmI~HaQyS_OimP3&acNSJk-^7j3n6m+x6h=<44>=`fdndaHJkgM72%+a~< z5wnh^J#}b!R1O1&yLWm&-XQZPb7zAeSI~0m7W2G$KBYN)gh?#m_S>6FetA%yadhPX zAb1cUycn4%kL8pmQ@{wxElg52Jc%MQ&+`B=9@d61i!OXPx%!gRstov9YTnwb->ZX< zwfQ=-{i6KW*bBw4fSGFQ)yR<=5EzAyU3EVi+EiMcVk~i>(uH%q-e#LRhd+l%lUq1h)upd9E{9BUR zi2Yj|brt#e*wM_21hU>30;lF{u0{1dw7H}l%A_2R30nAL=hgNk4mxH)z9oOl8xT=M ztdxpxk7CLU7^S%6Dhb6pjo%qLXo7I{GS!`{quGvOUNeVMGY8jO2R?uxDNad6SnkqD z6EtI}K6vP=hlM_${UB(vJyPCBGK#(3VAd1#+$*gaU5lExf9bYq5p|rvfq}DqCq1D5 zsz>i-l)&8@$59|i-*dcxRMJaznEU9Ql)gPQ!E5LFG(lt!}xqUC%$B7D_c;H|VOxPh)BCg9INgfOsZ35GRYCtp)_ zm7E;so%lN5kF+*v2&eI--ys03Ezzy_gL4eI`^6w^T7^?LChE_#%jAU_X2qNdL|aYa zb8w8+$NE9!iFvMp5^PBlcDIp~%zR>A;{y^_iA@54Ez!aI!CxcEdb5?7g}9Tmx7xwn zSs8Wp!FBL{u|^3fde3ls)ciPX*i1;a8JVzmltqN^mykBxeXbO`A6aUk;pwjGDVBwK zd7JzA?Wh@UgA#0AlOD%#SOMVD2*R!X!6jBgM9$*`rq0wyMbY4l?)u>FE6L<9SWcd3 z?d>+x)AZZZ z;_+7cCb+T2g9)|?w-3bUJg%5Leuao{lk~$y)lckTob~8Dgrwx)iv4Lt$^EhF$(5vv zHslGl8my@FyN2RuQh!IuBZZ@QAUvDpCTU`QA#zGvpvbXq%L9*^N~X2G5k(n8L^ZIz zQ-rml!S3_UmBWY}hWaMYi*MLZ9SE{XXL+8(#8!8ARB238GvqgV zW^J_>@~@OG)a8~3joh?VPK`A}e?R3{B<2p`#b~yH=s+*MoeR3kV+i_oO zz9ES@bR3>EF<$F4BGEJX)UI&)=}DU1%c}KvkB_4Q+K)f>#UHlj;CD=-Ai`PcuyPOv@JGkQ>}Gc>9}0cWDEy4tUHMH9BIsFmotDdu%LF3&>BLGd8ctRya6n4v#Ylr@ zW1fnziJ+p1;*;C;wuojKIohCZG392*WsJ}?Nb>06lME;Cz)3l*E+tO_6T~-AYp<*g zvvcxV=PLD!QT&qHU{i{~WtuN}+^-fH3594UZf5*)C12Faf%_sD9%clGA$-T*KeFN< z(qiid#d6sSPtB&iz#TT)qz=f)<2N-8uCm})^=~z@=Mt+d7lR)5 zRA?-IGwiCrtU*w$+`f60kupiSQK^j6#A!Tbj_{d-+eYB^j#q6^ zD5W70r{|dzczfw=ZxSQU{HqlpA2y~#>kd52(p-|FT?BQ{@ zp6Ot>evk<_Cr9M_;m&3s6kXh+6RVGsLdC6*Wc}UE{^E;5@f_c)t!WZ>-->PjpPSG( z?;clhLVBL5c|PuLujh!pdz>%r^1mHII-~zC5sqsuqwbnaQAjQlR9nuRHa0AIImsSI zQxb-X)6+cQ_9g`F{3{YKd9}jW#wtkStzGx%l`z`kPpYZE~ z{^wCo4o7nr!G8Q%B+n?(v%O9-cJ~!rrkK~&PDAzX)c9#5C_R;{oWJMty(_q zQJT`qR#&6GO!YDy-UauL-#Ya$rZFcYF7eNa6kMdwyaUa3cogJ}gGyg@Kvj=EG`fIB z_%|Pek=FXIz6%9n-IjRV{m^Q|vza5W>^M`7HXl z#O7O0?=>HlL?KMOtYg=PjsNK;_c}9ai*-;kHmK!$M3kd=Kdt!5oO%J|_D#)?`<#UM2=K z{A8kUm{25edm8z<4!`c)gMMykBJ|a0Zvo3Hr$*!07AuhiB$-%OoJQBJk#cfe8R@M? zC>hzP2sj*R^mt?^%eI6c6?#aF@IDfZN|bIdUrip)B%7KHV>5?Q=O<^%OR@Fg#mO6I z-%k&F?S0ZJn#*I7uJt9yd>*rxIn+p$paJVPHDb|?j$Mv@bGzYd7h(yqL=yJ*jJ8k} zE;qb21%@IwB*@i~Jh~-;Q;G`0XStrX5M(Q2)3VA1k;cGcDIP1H>sIo~IDJ@qYBI3#yqy{K$S6s5IxDy>Oo`T2)!E2HG+-X_a8!+=Gh3ymrI=%F^* z3=?T?Z%m}7%80Yc=IFQG$Wk)0n=|GnoFwyJ^{(SJ&r_Jh^dC+9cz)_3j_)}1F z$s%W~TeG^2ceZ!=w%0eC^$*(Kt1!PbT^UlXj^iyb!oHea!kezLn?|-YE3X}Qlm0>; z9UV6CD?_6mP211JitgD#VV7Y8l0-85Id90}bO6?i&4_R&?i2I~N1?ZL z*{&Tq4F=`7e%z7B3wLzRS&){BUp|BG0o}a`y>43Z-RYhd@2)n}FRuN@%dUdJ@+fhu z8$BMBV;Twgow2LyIncEsH&Cc&SlNbvdvlBH`sBMuYyFCs11jXv$;h;xWNqZdQIY$} zhiJT-Vi8C#p3tYm@jh@fmC(vhk1UFFF9&Y3kaf-w>Qd6ZYu`YBpm#YQtxO z>EnGfi>NPuz+dRlUt_l3kpCg&`h8_7Nr&B}!c|?(33YP?O7XB~hStB??PjO>j22lO ztalR*1yh-=Jrk?u&-9MTTjC@6LCuLW+o-|xru93N={{Mjz+=2*mwz8sEe}QiHEUUX zY>+tuWmqqMpZg$^T3w=y!zezTtL<<;W7-ev8*Zd&zJN-!hqjrviG#!=tz$;{bzi{Z zPfSrW@jUvZ(^VmaW}99+OtP|%I~XDY0(UIbrj@MopaHXH71@&t%sArp(2+A*}fyoP2&v~slBO#5@B5Qg(7>5?W(3}#O} zUs?l;1$4SOhP?}aB{MhRy%Z?W?};rO$3VrfQ8})_o{Kdq=)mkOP3994 zawZi)Q3*{x=~y;iCiCAP1)E9HM(LjrGH8cXYf{zKD7cAajG+CvCc{=HhDsREM%n6 zNTNtS+@=V)y_+u@efP!1VCW^AYeI;#d5kkqD$!v>%V<#jBf;{e#y(R#vW85J*Dsl) zT3L^Go#YB^_??6rN1ZQ98m#Gl;o?d>p2kX9;;y{F66I$}G*(D{)-rK-XR&c_6g8C0 zCsxJnVE3{5%6?E6TBE(8le- zcgcaWZ>z47 zwiiLf#96t1K33cz7IxyUE&ΠgS8<-o=~-7TQb5!RO`zvcy`G52>|2y1#;W)wvyg z>yMs#;g3W_toGeQsc?exsd$~L#FDv2d%85_3EKQcC)Q(9iQ` zSba?6OdbA$`*UEuifx^eM9f7x^z;Q5BSWZdzFjn=Tb$CWcG>&m`FK3m$K@}Bn^V8= zP~UMLK1e!n$rP?xeTnmyCkh$eeEUesp!U?qb$ejyHmKW}8}Qw#;7MQ7xlyG%zKsTr z-1&D(x^^S__P%faH@^vU{^zDm$+!=i`|w?&VZ;asME^7}RwmA1a}8H#YkSMT?2K#L zxc!_2UdWkTd+@Fcsn3tD>C-&~DJiKDRH|-Rnt5?0r5zJePEMV(WO>~7&4l8jtB%gC zr~lQ_Wm-Gdm2=K#>F3fpjD4ONrxV*hX?{MQT!nKer8K@cyC1Zsz&SiKk#~qaTR%w! zD>Zl+;vDvU5;L+~a`qK7 zq&$1oLN#MVJiFs1^2?V>tW!VglVaS%uJ20Cpvq6!S^c+`$)@$1re!a=&Ku6zm72cH zUqIc(Q4N0r!#ks}JFr|_vrDco*`)u3#^p_AI}Z49fmDHOPl=grc`c;3>1b>u1~N4K zWZBI^NnrSiC6FeOuB*hJ=;s*Y9D^t46e$EuJ`&bM=!s>dbipoi38HvD?IRoS2!6^R zpjG{mJDjV9xQilxjhw+KUciOF^~5k z2z-8Z>PDZHLq`_rmH=vV%wi=&!fi;P3okmch<5Oa;4{{ELLG8fI(ws zm5u+j%)`|@i3blVxxcL1qG=<{fa6SGUeq33^g$>BsG2D>OPH!*ZOafSn}xa=Lj3`c z-HE$vWSI?*QLgm#Fo#GLRLU=Sfwt3@zjZ97M5mxct1ehXiQ<|WBiCutmO;TihFtNr zmxm)8+bCe7)K@pw&Ej-fi>ipd+V&G;O#`zvSh-`6#(Is_v7K6u!=x6IYDcMxnNq?# zk`m}SneeHT-!lOb9sH?nwAm5K+O32nQHW2_`EJcyu()rq5mGE%kuPiS)yxc8&VD=6 zMqKHS>3ZPBK|n#qjTe!*7I zM6uWC2VJFgX`P-C!;NepD#rWI$deYY1ir=7g>776eKo3&DNUow`U-QrMa!{dHFd}o zmTUXW;26tUp2FzgQ=~?SffOeU?sKXT5P5aqxf9#}T+?+Q$uB2yu1CQ}mMo<@KHzSU z!kX2&r&Q{jFR5+_)E-4ro3oe|rAmEZ>TM_+4fPfQ$DF(_E{#-C7qOQ{z9q$*E_>7$kL>KakQa5?bY)D`)&)5kz2mdx1_ z8R7j53Nr-{>d2UOX)mY382SnE@n`%Y?-E~b@Wqzu2GKjf+gennn#E_vjd+p zKn)9tp4rlgfZ_Y#QMcT~zEo*+R$`mRws7`#>{9g2)`pnA7%6VJwCm6(QZfIab)8W+ z9l%aS2QjK9arE9Cf)h-0a%D0C|5JCNwU4A^rNNz^7f`{ANHu#NzQHmvg(e9mbc^ zND95E-mxqU;&p}Te69jLHna=>9Mz+BB-TCqxMQIB1C;$E;pzbSHBXvulVkagZ2=cP z?I8dd|60#ouiVcr!1=jO?_%S$=k_;);Mo2aW)4*QCq|+3)&iuLYfdvW4oYk_!kyRc zD`8lbJ8n-Ftnz-Oe(gCpfYwB=+VknNgcXdrKAm%zp3){($I@t>dh3)CqlFF3C(1 zoONoBdp843>^SB;7vqDsKTqV94)=2J&%_U0>rT?lsC*F)qw>amo^2WTD=Y+k0lof? zmeR!c?tG3PaYcK4?|AJnf#@OVhr^1kH>QF=a>zsL3zA(^Z2S+tTH!u|L_6$pBCrYb zPiW1(HtSbL2TePz{+M5noi(#ayb#dH9+h5wUR?r%{9gguPEg#RBb zbARgjlV$90P1IQbw-Nt?bL>wof1Wk+x0bhj|5eLhCy)H8<F(OTpj4`k$hI0`I>?iS7R(`X>zkQ^S9H=)dI=5ICF>5dMe1{!{!vt?Ivv fx4QnD_&;r|ssbu}j{N4PeTwiI4hcd%e*gME(+w Date: Mon, 15 May 2023 11:14:09 +0200 Subject: [PATCH 14/15] modifica sim interclays01 xsovrapposizioni --- MapoDataFiller/Filler/InterClays.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/MapoDataFiller/Filler/InterClays.cs b/MapoDataFiller/Filler/InterClays.cs index 2ab81bf..99fbe9a 100644 --- a/MapoDataFiller/Filler/InterClays.cs +++ b/MapoDataFiller/Filler/InterClays.cs @@ -267,7 +267,8 @@ protected List IC_ESS_getFlRows(string CodIOB, DateTime dtStart, DateTime dtEnd, bool doProd, ref int idxCount) { List rows = new List(); - DateTime dtCurs = dtStart.AddMilliseconds(rnd.Next(50, 100)); + // inizio spostando di 5-10 sec avanti inizio + DateTime dtCurs = dtStart.AddSeconds(rnd.Next(5, 10)); int simInt = 0; double simReal = 0; double simDTime = 0; @@ -286,7 +287,7 @@ simInt = simValInt(doProd, item.Key, item.Value); currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simInt};{idxCount++}"; rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 150)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(10, 100)); idxCount = idxCount <= 9999 ? idxCount : 0; } } @@ -298,7 +299,7 @@ simReal = simValReal(doProd, item.Key, item.Value); currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simReal};{idxCount++}"; rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 150)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(10, 100)); idxCount = idxCount <= 9999 ? idxCount : 0; } } @@ -310,7 +311,7 @@ simDTime = simValData(dtCurs, item.Key, item.Value); currRow = $"{CodIOB};{dtCurs:yyyy-MM-dd HH:mm:ss.fff};{item.Key};{simDTime};{idxCount++}"; rows.Add(currRow); - dtCurs = dtCurs.AddMilliseconds(rnd.Next(50, 150)); + dtCurs = dtCurs.AddMilliseconds(rnd.Next(10, 100)); idxCount = idxCount <= 9999 ? idxCount : 0; } } From 257cda69a5d11c2d1e641975b4a3e21070c7af26 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 29 Jun 2023 10:51:45 +0200 Subject: [PATCH 15/15] MapoDataFiller: - Fix x controllo dati CSV consistenti (NON vuori) --- MapoDataFiller/DayConf.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/MapoDataFiller/DayConf.cs b/MapoDataFiller/DayConf.cs index 668d438..2ecdc7d 100644 --- a/MapoDataFiller/DayConf.cs +++ b/MapoDataFiller/DayConf.cs @@ -32,11 +32,14 @@ namespace MapoDataFiller { var dBlock = rawData.Split(";"); var datePart = dBlock[0].Split(' '); - string dateForm = $"{datePart[1]} {dBlock[1].Replace(".", ":")}"; - dtStart = DateTime.Parse(dateForm, cultInfo); - // ora fine... - double.TryParse(dBlock[2], out numOre); - dtEnd = dtStart.AddHours(numOre); + if (datePart.Length > 1) + { + string dateForm = $"{datePart[1]} {dBlock[1].Replace(".", ":")}"; + dtStart = DateTime.Parse(dateForm, cultInfo); + // ora fine... + double.TryParse(dBlock[2], out numOre); + dtEnd = dtStart.AddHours(numOre); + } } } }