diff --git a/Server/ServerApp/DataDownload/DataDownloader.cs b/Server/ServerApp/DataDownload/DataDownloader.cs
index ded22bcf27a712e29e9de9fe25840fad8f8a8b73..7c033d5ad73ed91d0b1a1bb0f902d1f98bb59f94 100644
--- a/Server/ServerApp/DataDownload/DataDownloader.cs
+++ b/Server/ServerApp/DataDownload/DataDownloader.cs
@@ -84,6 +84,22 @@ namespace ServerApp.DataDownload
 			webClient = new WebClient();
 		}
 
+		/// <summary>
+		/// Downloads json file
+		/// </summary>
+		/// <returns> Path to file </returns>
+		public string DownloadWeatherPrediction()
+		{
+			// TODO either set this path as attribute or if parameter JsonParser needs an attribute that would be set through constructor
+			string predictionSite = "http://wttr.in/Plzen,czechia?format=j1";
+
+			DateTime now = DateTime.Now;
+			WebClient webClient = new WebClient();
+			webClient.DownloadFile(predictionSite, $"data/{now.Year}{now.Month}{now.Day}.json");
+
+			return $"data/{now.Year}{now.Month}{now.Day}.json";
+		}
+
 		/// <summary>
 		/// Creates subdirectories for all data types
 		/// TBD if we want to do it this way
@@ -388,7 +404,6 @@ namespace ServerApp.DataDownload
 			if (startDate == null || endDate == null)
 				return GetData(subDirectory);
 
-
 			string[] files = Directory.GetFiles(subDirectory);
 			List<string> found00Files = new List<string>();
 			List<string> relevantFiles = new List<string>();
diff --git a/Server/ServerApp/Parser/InputData/CsvDataLoader.cs b/Server/ServerApp/Parser/InputData/CsvDataLoader.cs
index b19678461a308998ea42f8e06dd86fe7698bb781..1d3690847423d7939f970271191b30902dbdc1aa 100644
--- a/Server/ServerApp/Parser/InputData/CsvDataLoader.cs
+++ b/Server/ServerApp/Parser/InputData/CsvDataLoader.cs
@@ -40,6 +40,9 @@ namespace ServerApp.Parser.InputData
         public List<JisInstance> LoadJisFile(string pathToFile)
         {
             var lines = LoadCsv(pathToFile);
+            if (lines == null)
+                return null;
+
             List<JisInstance> list = new List<JisInstance>();
 
             if (lines == null)
@@ -75,6 +78,9 @@ namespace ServerApp.Parser.InputData
         public List<LogInInstance> LoadLoginFile(string pathToFile)
         {
             var lines = LoadCsv(pathToFile);
+            if (lines == null)
+                return null;
+
             List<LogInInstance> list = new List<LogInInstance>();
 
             if (lines == null)
@@ -120,6 +126,9 @@ namespace ServerApp.Parser.InputData
         public List<WeatherInstance> LoadWeatherFile(string pathToFile)
         {
             var lines = LoadCsv(pathToFile);
+            if (lines == null)
+                return null;
+
             List<WeatherInstance> list = new List<WeatherInstance>();
 
             if (lines == null)
diff --git a/Server/ServerApp/Parser/InputData/IDataLoader.cs b/Server/ServerApp/Parser/InputData/IDataLoader.cs
index f0772dd939f380623c9f3a0506d28570e2addf75..cabdcd7ebf7524c0612a5a82a9fe4fca20b1449a 100644
--- a/Server/ServerApp/Parser/InputData/IDataLoader.cs
+++ b/Server/ServerApp/Parser/InputData/IDataLoader.cs
@@ -10,7 +10,7 @@ namespace ServerApp.Parser.InputData
     /// Interface that every DataLoader should implement
     /// </summary>
     /// <author>A. Konig</author>
-    interface IDataLoader
+    public interface IDataLoader
     {
         /// <summary>
         /// Load jis data from file
diff --git a/Server/ServerApp/Parser/InputData/JisInstance.cs b/Server/ServerApp/Parser/InputData/JisInstance.cs
index 82af5e9caf5a099b09ddede946f44bdd8c94824e..d9b3927e1896afe004bf2b05e8bc21e3e9922674 100644
--- a/Server/ServerApp/Parser/InputData/JisInstance.cs
+++ b/Server/ServerApp/Parser/InputData/JisInstance.cs
@@ -18,7 +18,7 @@ namespace ServerApp.Parser.InputData
     ///     [place tag];[date time];[amount]
     /// </summary>
     /// <author>A. Konig</author>
-    class JisInstance
+    public class JisInstance
     {
         /// <summary> Place tag  </summary>
         // index 0
diff --git a/Server/ServerApp/Parser/InputData/LogInInstance.cs b/Server/ServerApp/Parser/InputData/LogInInstance.cs
index 7fba2c2bd92f4bfffc8cc595fd588bd21e731160..14f7423898a479caed2afbab58a5ca69d4bb6bd8 100644
--- a/Server/ServerApp/Parser/InputData/LogInInstance.cs
+++ b/Server/ServerApp/Parser/InputData/LogInInstance.cs
@@ -25,7 +25,7 @@ namespace ServerApp.Parser.InputData
     ///     [datum];[amount];[lesson];[lesson start];[lesson end];[building];[room type];[room];[hostname]
     /// </summary>
     /// <author>A. Konig</author>
-    class LogInInstance
+    public class LogInInstance
     {
         /// <summary> Date time </summary>
         // index 0
diff --git a/Server/ServerApp/Parser/InputData/WeatherInstance.cs b/Server/ServerApp/Parser/InputData/WeatherInstance.cs
index 7ee6ef6807a61386d3cd1514aef140084494dfbb..b95ab47a60540617e0bcc19727fcdb15da2420c4 100644
--- a/Server/ServerApp/Parser/InputData/WeatherInstance.cs
+++ b/Server/ServerApp/Parser/InputData/WeatherInstance.cs
@@ -14,7 +14,7 @@ namespace ServerApp.Parser.InputData
     ///     [date time];[temperature];[wind];[rain];[luminance]
     /// </summary>
     /// <author>A. Konig</author>
-    class WeatherInstance
+    public class WeatherInstance
     {
         /// <summary> Date and time </summary>
         // index 0
@@ -48,5 +48,20 @@ namespace ServerApp.Parser.InputData
             this.rain = rain;
             this.lum = lum;
         }
+
+        /// <summary>
+        /// Eqquals
+        /// </summary>
+        /// <param name="obj"> Other object </param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            WeatherInstance other = (WeatherInstance) obj;
+
+            if (dateTime == other.dateTime && temp == other.temp && wind == other.wind && rain == other.rain && lum == other.lum)
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs b/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs
index d3321a9a1f46e5dd98abdb163320e5d39d0aa4db..986b2f3a345eb085efa992afec86b8180693a290 100644
--- a/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs
+++ b/Server/ServerApp/Parser/OutputInfo/ActivityInfo.cs
@@ -45,5 +45,21 @@ namespace ServerApp.Parser.OutputInfo
         {
             return $"{startTime} \t {building} \t {amount}";
         }
+
+
+        /// <summary>
+        /// Compares object to other instance
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            ActivityInfo other = (ActivityInfo)obj;
+
+            if (building == other.building && amount == other.amount && startTime == other.startTime && intervalLength == other.intervalLength)
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs b/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs
index 09c08130c961ddf249846d4d766e62c28a48882b..7e1f3e52e577d4490b094c819eded037833b54a2 100644
--- a/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs
+++ b/Server/ServerApp/Parser/OutputInfo/ValueToConditions.cs
@@ -35,7 +35,7 @@ namespace ServerApp.Parser.OutputInfo
         /// </summary>
         /// <param name="condition">Weather conditions</param>
         /// <returns>Lux value</returns>
-        internal static double TransferConditionsToLux(WeatherConditions condition)
+        public static double TransferConditionsToLux(WeatherConditions condition)
         {
             if (condition == WeatherConditions.Sunny)
                 return 60_000;
diff --git a/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs b/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs
index 8ba044b816c865ff8e77b7272bcaf5206d986971..e032a7f9d636da7b883897e3f8cbf79af49c7c15 100644
--- a/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs
+++ b/Server/ServerApp/Parser/OutputInfo/WeatherInfo.cs
@@ -85,5 +85,19 @@ namespace ServerApp.Parser.OutputInfo
             return $"{startTime} \t {temp}°C \t {rain}% \t {wind}m/s \t {condition.ToString()} \t {lum}";
         }
 
+        /// <summary>
+        /// Eqquals
+        /// </summary>
+        /// <param name="obj"> Other object </param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            WeatherInfo other = (WeatherInfo) obj;
+
+            if (startTime == other.startTime && temp == other.temp && wind == other.wind && rain == other.rain && condition == other.condition)
+                return true;
+
+            return false;
+        }
     }
 }
diff --git a/Server/ServerApp/Parser/Parsers/DataParser.cs b/Server/ServerApp/Parser/Parsers/DataParser.cs
index 8e98de1646641bf9900d4d4ee1bbe880d12abc35..28af53e30bc90fe0a144bd6c9be15a8b8bdf58d5 100644
--- a/Server/ServerApp/Parser/Parsers/DataParser.cs
+++ b/Server/ServerApp/Parser/Parsers/DataParser.cs
@@ -34,7 +34,6 @@ namespace ServerApp.Parser.Parsers
         /// <summary> ActivityInfo representing login activity</summary>
         List<ActivityInfo> loginList;
 
-
         /// <summary>
         /// Constructor
         /// </summary>
@@ -70,12 +69,12 @@ namespace ServerApp.Parser.Parsers
             string pathLogIn = downloader.DataSubDirectories[DataType.STROJE];
 
             // get all files that should be parsed
-            Date start = null;
-            Date end = null;
-            if (startTime != null || endTime != null)
+            Date start = new Date((uint)startTime.Month, (uint)startTime.Year);
+            Date end = new Date((uint)endTime.Month, (uint)endTime.Year);
+            if (startTime == DateTime.MinValue || endTime == DateTime.MaxValue)
             {
-                start = new Date((uint)startTime.Month, (uint)startTime.Year);
-                end = new Date((uint)endTime.Month, (uint)endTime.Year);
+                start = null;
+                end = null;
             }
 
             var weatherFiles = downloader.GetData(pathWeather, start, end);
@@ -190,7 +189,7 @@ namespace ServerApp.Parser.Parsers
                     
                     
             if (indexLogin < loginList.Count)
-                res.AddRange(jisList.GetRange(indexLogin, loginList.Count - indexLogin));
+                res.AddRange(loginList.GetRange(indexLogin, loginList.Count - indexLogin));
 
             return res;
         }
diff --git a/Server/ServerApp/Parser/Parsers/JisParser.cs b/Server/ServerApp/Parser/Parsers/JisParser.cs
index 1a2914d5ef05b9711ea7880af52b7595fa9b6651..0d1d3d0619f64542759a9adfd69462e5744d1da8 100644
--- a/Server/ServerApp/Parser/Parsers/JisParser.cs
+++ b/Server/ServerApp/Parser/Parsers/JisParser.cs
@@ -15,7 +15,7 @@ namespace ServerApp.Parser.Parsers
     /// Data parsed from 7am (included) to 18pm (included)
     /// </summary>
     /// <author>A. Konig</author>
-    class JisParser
+    public class JisParser
     {
 
         /// <summary> Datafile loader  </summary>
@@ -78,10 +78,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<ActivityInfo> jisInfo = new List<ActivityInfo>();
             
-            if (!File.Exists(path))
-                return jisInfo;
-
             List<JisInstance> list =  loader.LoadJisFile(path);
+            if (list == null)
+                return jisInfo;
 
             // data for each faculty
             int[] recordedAmount = new int[TagInfo.buildings.Length];
@@ -107,7 +106,8 @@ namespace ServerApp.Parser.Parsers
                     for (int k = 0; k < TagInfo.buildings.Length; k++)
                     {
                         ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartTime, range);
-                        jisInfo.Add(dayInfo);
+                        if (recordedAmount[k] != 0)
+                            jisInfo.Add(dayInfo);
                     }
 
                     recordedAmount = new int[TagInfo.buildings.Length];
@@ -141,7 +141,8 @@ namespace ServerApp.Parser.Parsers
             for (int k = 0; k < TagInfo.buildings.Length; k++)
             {
                 ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartTime, range);
-                jisInfo.Add(dayInfo);
+                if (recordedAmount[k] != 0)
+                    jisInfo.Add(dayInfo);
             }
 
             return jisInfo;
@@ -158,11 +159,10 @@ namespace ServerApp.Parser.Parsers
         private List<ActivityInfo> ProcessOneJisFileAsIntervals(string path, int interval, DateTime startTime, DateTime endTime)
         {
             List<ActivityInfo> jisInfo = new List<ActivityInfo>();
-            
-            if (!File.Exists(path))
-                return jisInfo;
 
             List<JisInstance> list = loader.LoadJisFile(path);
+            if (list == null)
+                return jisInfo;
 
             // data for each faculty
             int[] recordedAmount = new int[TagInfo.buildings.Length];
@@ -207,6 +207,8 @@ namespace ServerApp.Parser.Parsers
                     // start time of last interval
                     DateTime stTime = new DateTime(lastStartTime.Year, lastStartTime.Month, lastStartTime.Day, startingTime, 0, 0);
 
+                    // TODO zjistit kolik se vynechalo a přidat tolik nul?
+
                     // find end and start time
                     if (!trigger)
                         index++;
@@ -223,7 +225,8 @@ namespace ServerApp.Parser.Parsers
                     for (int k = 0; k < TagInfo.buildings.Length; k++)
                     {
                         ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], stTime, interval);
-                        jisInfo.Add(dayInfo);
+                        if (recordedAmount[k] != 0)
+                            jisInfo.Add(dayInfo);
                     }
 
                     recordedAmount = new int[TagInfo.buildings.Length];
@@ -254,10 +257,12 @@ namespace ServerApp.Parser.Parsers
             }
 
             // last day
+            DateTime startT = new DateTime(lastStartTime.Year, lastStartTime.Month, lastStartTime.Day, startingTime, 0, 0);
             for (int k = 0; k < TagInfo.buildings.Length; k++)
             {
-                ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartTime, interval);
-                jisInfo.Add(dayInfo);
+                ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], startT, interval);
+                if (recordedAmount[k] != 0)
+                    jisInfo.Add(dayInfo);
             }
 
             return jisInfo;
diff --git a/Server/ServerApp/Parser/Parsers/LogInParser.cs b/Server/ServerApp/Parser/Parsers/LogInParser.cs
index 32e53a2a4d11788e29b8759e6bd15eb3ef532e8c..a36f198cbf7d30c59f8ae00ccff306c20096d26e 100644
--- a/Server/ServerApp/Parser/Parsers/LogInParser.cs
+++ b/Server/ServerApp/Parser/Parsers/LogInParser.cs
@@ -15,7 +15,7 @@ namespace ServerApp.Parser.Parsers
     /// Data parsed from 7am (included) to 18pm (included)
     /// </summary>
     /// <author>A. Konig</author>
-    class LogInParser
+    public class LogInParser
     {
         /// <summary> Datafile loader  </summary>
         IDataLoader loader;
@@ -77,10 +77,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<ActivityInfo> loginInfo = new List<ActivityInfo>();
 
-            if (!File.Exists(path))
-                return loginInfo;
-
             List<LogInInstance> list = loader.LoadLoginFile(path);
+            if (list == null)
+                return loginInfo;
 
             // data for each faculty
             int[] recordedAmount = new int[TagInfo.buildings.Length];
@@ -100,13 +99,15 @@ namespace ServerApp.Parser.Parsers
                 // start of the day -> make an instance
                 string place = list[i].building;
                 DateTime date = new DateTime(list[i].date.Year, list[i].date.Month, list[i].date.Day, minmaxHour[0], 0, 0);
+                DateTime dateOfLessonStart = new DateTime(list[i].date.Year, list[i].date.Month, list[i].date.Day, list[i].lessonStart.Hour, list[i].lessonStart.Minute, list[i].lessonStart.Second);
                 if (!date.Equals(lastStartDay))
                 {
                     // data for each faculty separate
                     for (int k = 0; k < TagInfo.buildings.Length; k++)
                     {
                         ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartDay, range); 
-                        loginInfo.Add(dayInfo);
+                        if (recordedAmount[k] != 0)
+                            loginInfo.Add(dayInfo);
                     }
 
                     recordedAmount = new int[TagInfo.buildings.Length];
@@ -114,7 +115,7 @@ namespace ServerApp.Parser.Parsers
                 }
 
                 // if not in allowed time window -> discard
-                if (list[i].date < startTime || list[i].date > endTime)
+                if (dateOfLessonStart < startTime || dateOfLessonStart > endTime)
                     continue;
 
                 // aggregate data
@@ -143,7 +144,8 @@ namespace ServerApp.Parser.Parsers
             for (int k = 0; k < TagInfo.buildings.Length; k++)
             {
                 ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[k], recordedAmount[k], lastStartDay, range);
-                loginInfo.Add(dayInfo);
+                if (recordedAmount[k] != 0)
+                    loginInfo.Add(dayInfo);
             }
 
             return loginInfo;
@@ -161,10 +163,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<ActivityInfo> loginInfo = new List<ActivityInfo>();
             
-            if (!File.Exists(path))
-                return loginInfo;
-
             List<LogInInstance> list = loader.LoadLoginFile(path);
+            if (list == null)
+                return loginInfo;
 
             // min/max hour taken into account
             int[] minmaxHour = new int[] { 7, 18 };
@@ -194,6 +195,7 @@ namespace ServerApp.Parser.Parsers
                 // start of the day -> make an instance
                 string place = list[i].building;
                 DateTime date = new DateTime(list[i].date.Year, list[i].date.Month, list[i].date.Day, list[i].lessonStart.Hour, 0, 0);
+                DateTime dateOfLessonStart = new DateTime(list[i].date.Year, list[i].date.Month, list[i].date.Day, list[i].lessonStart.Hour, list[i].lessonStart.Minute, list[i].lessonStart.Second);
 
                 // end of the day
                 if (!(date.Year == lastStartTime.Year && date.Month == lastStartTime.Month && date.Day == lastStartTime.Day))
@@ -207,7 +209,8 @@ namespace ServerApp.Parser.Parsers
                         for (int l = 0; l < TagInfo.buildings.Length; l++)
                         {
                             ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[l], data[k][l], stTime, interval);
-                            loginInfo.Add(dayInfo);
+                            if (data[k][l] != 0)
+                                loginInfo.Add(dayInfo);
                         }
 
                         data[k] = new int[TagInfo.buildings.Length];
@@ -216,7 +219,7 @@ namespace ServerApp.Parser.Parsers
                 }
 
                 // if not in allowed time window -> discard
-                if (list[i].date < startTime || list[i].date > endTime)
+                if (dateOfLessonStart < startTime || dateOfLessonStart > endTime)
                     continue;
 
                 // find index for current instance
@@ -264,7 +267,8 @@ namespace ServerApp.Parser.Parsers
                 for (int l = 0; l < TagInfo.buildings.Length; l++)
                 {
                     ActivityInfo dayInfo = new ActivityInfo(TagInfo.buildings[l], data[k][l], stTime, interval);
-                    loginInfo.Add(dayInfo);
+                    if (data[k][l] != 0)
+                        loginInfo.Add(dayInfo);
                 }
             }
 
diff --git a/Server/ServerApp/Parser/Parsers/TagInfo.cs b/Server/ServerApp/Parser/Parsers/TagInfo.cs
index da5006bfc8e74abd5f21f16c732ddbcffb7634e7..3a74b491decd6cb3f9a1068cc8e8ab9b64be5934 100644
--- a/Server/ServerApp/Parser/Parsers/TagInfo.cs
+++ b/Server/ServerApp/Parser/Parsers/TagInfo.cs
@@ -10,7 +10,7 @@ namespace ServerApp.Parser.Parsers
     /// Class with Tags used in application
     /// </summary>
     /// <author>Alex Konig</author>
-    class TagInfo
+    public class TagInfo
     {
         public static string[] buildings;
 
diff --git a/Server/ServerApp/Parser/Parsers/WeatherParser.cs b/Server/ServerApp/Parser/Parsers/WeatherParser.cs
index f8754a16d8b4b3d8ffc462c94081fe7dfab33dad..e81418617eec7be7e5e9c77d55fab66a433906f8 100644
--- a/Server/ServerApp/Parser/Parsers/WeatherParser.cs
+++ b/Server/ServerApp/Parser/Parsers/WeatherParser.cs
@@ -15,7 +15,7 @@ namespace ServerApp.Parser.Parsers
     /// Data parsed from 7am (included) to 18pm (included)
     /// </summary>
     /// <author>A. Konig</author>
-    class WeatherParser
+    public class WeatherParser
     {
 
         /// <summary> Datafile loader  </summary>
@@ -44,7 +44,7 @@ namespace ServerApp.Parser.Parsers
         {
             List<WeatherInfo> list = new List<WeatherInfo>();
 
-            if (weatherFiles == null || startTime == null || endTime == null || interval <= 0)
+            if (weatherFiles == null || interval <= 0)
                 return list;
 
             // get all files in folder
@@ -80,10 +80,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<WeatherInfo> weatherInfo = new List<WeatherInfo>();
 
-            if (!File.Exists(path))
-                return weatherInfo;
-
             List<WeatherInstance> list = loader.LoadWeatherFile(path);
+            if (list == null)
+                return weatherInfo;
 
             // array with data [temp, rain, wind, lum]
             double[] recordedAmount = new double[4];
@@ -116,8 +115,10 @@ namespace ServerApp.Parser.Parsers
                 }
 
                 // if not in allowed time window -> discard
-                if (list[i].dateTime < startTime|| list[i].dateTime > endTime)
+                if (list[i].dateTime < startTime || list[i].dateTime > endTime)
+                {
                     continue;
+                }
 
                 // aggregate data
                 recordedAmount[0] += list[i].temp;
@@ -125,14 +126,19 @@ namespace ServerApp.Parser.Parsers
                 recordedAmount[2] += list[i].wind;
 
                 if (ValueToConditions.TransferLuxToConditions(list[i].lum * 1000) != WeatherConditions.Dark)
+                {
                     recordedAmount[3] += list[i].lum * 1000; weatherValues++;
+                }
 
                 values++;
             }
 
             // data from last day
-            WeatherInfo dayInfo2 = new WeatherInfo(lastStartDay, recordedAmount[0] / values, (int)(recordedAmount[1] / values * 100), recordedAmount[2] / values, recordedAmount[3] / values, range); 
-            weatherInfo.Add(dayInfo2);
+            if (values != 0)
+            {
+                WeatherInfo dayInfo2 = new WeatherInfo(lastStartDay, recordedAmount[0] / values, (int)(recordedAmount[1] / values * 100), recordedAmount[2] / values, recordedAmount[3] / weatherValues, range);
+                weatherInfo.Add(dayInfo2);
+            }
 
             return weatherInfo;
         }
@@ -149,10 +155,9 @@ namespace ServerApp.Parser.Parsers
         {
             List<WeatherInfo> weatherInfo = new List<WeatherInfo>();
 
-            if (!File.Exists(path))
-                return weatherInfo;
-
             List<WeatherInstance> list = loader.LoadWeatherFile(path);
+            if (list == null)
+                return weatherInfo;
 
             // min/max hour taken into account
             int[] minmaxHour = new int[] { 7, 18 };
@@ -169,6 +174,7 @@ namespace ServerApp.Parser.Parsers
             {
                 to[i] = minmaxHour[0] + interval * (i + 1);
                 data[i] = new double[4];
+                count[i] = 0;
             }
 
             // first day
@@ -208,7 +214,10 @@ namespace ServerApp.Parser.Parsers
                     lastStartTime = date;
                     count = new int[indices];
                     for (int l = 0; l < data.Length; l++)
+                    {
                         data[l] = new double[4];
+                        count[l] = 0;
+                    }
                 }
 
                 // if not in allowed time window -> discard
diff --git a/Server/ServerApp/Program.cs b/Server/ServerApp/Program.cs
index b9358583b253ddb238e74a8af20d008d13a81ee3..3a4cb4fd2b6d85fa18361ba83cae5a7c77485895 100644
--- a/Server/ServerApp/Program.cs
+++ b/Server/ServerApp/Program.cs
@@ -34,7 +34,6 @@ namespace ServerApp
         {
 
 			// SETUP FOLDERS
-
 			Config config = FillConfigInfo(args);
 			if (config == null)
 			{
diff --git a/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs b/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs
index 3f34437fbb12e865de2c9c580decf3cb7065195d..9659bb6d6ff9d544d9de27c21e0988c7e44f5329 100644
--- a/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs
+++ b/Server/ServerApp/WeatherPredictionParser/IJsonParser.cs
@@ -11,7 +11,7 @@ namespace ServerApp.WeatherPredictionParser
     /// <summary>
     /// Abstract class that every Json parser should inherit from
     /// </summary>
-    abstract class IJsonParser
+    public abstract class IJsonParser
     {
 
         /// <summary> Current weather </summary>
diff --git a/Server/ServerApp/WeatherPredictionParser/JsonParser.cs b/Server/ServerApp/WeatherPredictionParser/JsonParser.cs
index a20349b6ef9a1e5a48d0a7dc9f7c892bf48645da..8cc3978c09d7473e74c415745d065d15ae91390d 100644
--- a/Server/ServerApp/WeatherPredictionParser/JsonParser.cs
+++ b/Server/ServerApp/WeatherPredictionParser/JsonParser.cs
@@ -18,7 +18,7 @@ namespace ServerApp.WeatherPredictionParser
     /// Class representing a parser for json prediction data
     /// </summary>
     /// <author>A. Konig</author>
-    class JsonParser : IJsonParser
+    public class JsonParser : IJsonParser
     {
         /// <summary> Data loader </summary>
         DataDownloader loader;
@@ -29,7 +29,6 @@ namespace ServerApp.WeatherPredictionParser
         /// <summary> Sunset time of currently parsed day </summary>
         DateTime sunsetTime;
 
-
         /// <summary>
         /// Constructor
         /// </summary>
@@ -42,8 +41,8 @@ namespace ServerApp.WeatherPredictionParser
         /// <summary>
         /// Get predictions from Predictions that are within specified time span
         /// From-to including
-        /// If from == null then all until to
-        /// If to  == null then all starting from from
+        /// If from == DateTime.Min then all until to
+        /// If to  == DateTime.Max then all starting from from
         /// </summary>
         /// <param name="from">DateTime from</param>
         /// <param name="to">DateTime to</param>
@@ -55,19 +54,30 @@ namespace ServerApp.WeatherPredictionParser
 
             List<WeatherInfo> res = new List<WeatherInfo>();
 
-            if (from == null)
+            if (from == DateTime.MinValue)
                 from = Predictions[0].startTime;
 
-            if (to == null)
-                from = Predictions[Predictions.Count].startTime;
+            if (to == DateTime.MaxValue) {
+                DateTime dt = Predictions[Predictions.Count - 1].startTime;
+                int hour = dt.Hour + Predictions[Predictions.Count - 1].intervalLength;
+                bool addDay = false;
+                if (hour >= 24)
+                {
+                    hour -= 24;
+                    addDay = true;
+                }
+                to = new DateTime(dt.Year, dt.Month, dt.Day, hour, dt.Minute, dt.Second);
+                if (addDay)
+                    to = to.AddDays(1);
+            }
 
             if (from > to)
                 return null;
 
+            // for all parsed weather info
             foreach (WeatherInfo pred in Predictions)
             {
                 int hour = pred.startTime.Hour + pred.intervalLength;
-                Console.WriteLine(pred.intervalLength);
                 bool addDay = false;
                 if (hour >= 24)
                 {
@@ -79,13 +89,14 @@ namespace ServerApp.WeatherPredictionParser
                     endTime = endTime.AddDays(1);
 
                 // if both end and start not outside of interval
-                if (!((pred.startTime < from && endTime <= from) || (pred.startTime > to && endTime >= to)))
+                if (!((pred.startTime < from && endTime <= from) || (pred.startTime > to && endTime > to)))
                     res.Add(pred);
             }
 
             return res;
         }
 
+
         /// <summary>
         /// Parse weather prediction
         /// Results is in attributes current for current weather and pred for weather prediction for today, tommorrow and day after tommorrow
@@ -95,7 +106,7 @@ namespace ServerApp.WeatherPredictionParser
             // TODO ask DataDownloader for download said file and return path to it
             
             // get file
-            string file = DownloadWeatherPrediction();
+            string file = loader.DownloadWeatherPrediction();
             DateTime now = DateTime.Now;
             Console.WriteLine(File.Exists(file));
 
@@ -155,20 +166,6 @@ namespace ServerApp.WeatherPredictionParser
                 Console.WriteLine(w);
         }
 
-        // TODO move to data loader
-        /// <summary>
-        /// Downloads json file
-        /// </summary>
-        /// <returns> Path to file </returns>
-        private string DownloadWeatherPrediction()
-        {
-            DateTime now = DateTime.Now;
-            WebClient webClient = new WebClient();
-            webClient.DownloadFile("http://wttr.in/Plzen,czechia?format=j1", $"data/{now.Year}{now.Month}{now.Day}.json");
-
-            return $"data/{now.Year}{now.Month}{now.Day}.json";
-        }
-
         /// <summary>
         /// Change data in a way that they now reflect sunrise and sunset times
         /// If current time under sunrise or over sunset -> WeatherConditions is Dark
@@ -379,7 +376,6 @@ namespace ServerApp.WeatherPredictionParser
 
                 // Console.WriteLine(weather.ToString());
                 Predictions.Add(weather);
-
             }
 
         }
diff --git a/Server/TestProject/ParserTests/TestingParser.cs b/Server/TestProject/ParserTests/TestingParser.cs
new file mode 100644
index 0000000000000000000000000000000000000000..01e10621968c2b5ea37eb5ad99622b4c58bb0fa5
--- /dev/null
+++ b/Server/TestProject/ParserTests/TestingParser.cs
@@ -0,0 +1,1197 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using ServerApp.Parser.Parsers;
+using System.Collections.Generic;
+using ServerApp.Parser.OutputInfo;
+using Moq;
+using ServerApp.Parser.InputData;
+using ServerApp.WeatherPredictionParser;
+using ServerApp.DataDownload;
+
+// 1h
+// 0.5h to edit parsers 
+
+namespace TestProject
+{
+
+    [TestClass]
+    public class TestingParser
+    {
+        [TestMethod]
+        public void AbstactClassTest()
+        {
+            IDataParser p = new DataParser(null);
+            List<ActivityInfo> aa = p.AttendanceList;
+            List<WeatherInfo> wa = p.WeatherList;
+
+            DataParser pp = (DataParser)p;
+            List<ActivityInfo> ap = pp.AttendanceList;
+            List<WeatherInfo> wp = pp.WeatherList;
+
+            Assert.AreEqual(aa, ap);
+            Assert.AreEqual(wa, wp);
+        }
+
+        // ------------------------------------ MERGE LISTS -------------------------------------
+
+        #region Merge lists
+        [TestMethod]
+        public void MergeListsNull()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = null;
+            List<ActivityInfo> pc = null;
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+            Assert.AreEqual(0, retVal.Count);
+        }
+
+        [TestMethod]
+        public void MergeListsJisNull()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = null;
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+            Assert.AreEqual(pc, retVal);
+        }
+
+        [TestMethod]
+        public void MergeListsPcNull()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = null;
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+            Assert.AreEqual(jis, retVal);
+        }
+
+        [TestMethod]
+        public void MergeListsOneNoOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 18, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 18, 0, 0), 3), retVal[1]);
+        }
+
+        [TestMethod]
+        public void MergeListsOneOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 8, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[0]);
+        }
+
+        [TestMethod]
+        public void MergeListsTwoNoOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3));
+            jis.Add(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 18, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 18, 0, 0), 3), retVal[3]);
+        }
+
+        [TestMethod]
+        public void MergeListsTwoOverlap()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3));
+            jis.Add(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 1, 1, 9, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[2]);
+        }
+
+        [TestMethod]
+        public void MergeListsMultiple()
+        {
+            DataParser target = new DataParser(null);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            jis.Add(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 10, 9, 0, 0), 3));
+            jis.Add(new ActivityInfo("FAV", 1, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            jis.Add(new ActivityInfo("FDU", 3, new DateTime(2001, 4, 1, 15, 0, 0), 3));
+
+            pc.Add(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 2, new DateTime(2001, 1, 1, 15, 0, 0), 3));
+            pc.Add(new ActivityInfo("FAV", 5, new DateTime(2001, 4, 1, 15, 0, 0), 3));
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 10, 9, 0, 0), 3), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 12, 0, 0), 3), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FAV", 3, new DateTime(2001, 1, 1, 15, 0, 0), 3), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FDU", 3, new DateTime(2001, 4, 1, 15, 0, 0), 3), retVal[3]);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2001, 4, 1, 15, 0, 0), 3), retVal[4]);
+        }
+        #endregion
+
+        // ------------------------------ WEATHER PARSER ----------------------------------------
+
+        #region Weather parser
+
+        #region Parse days
+        [TestMethod]
+        public void ParseWeatherDayOne()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 7, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 10, 3, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 12, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast)/1000));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 8, 50, 1.25, 10_000, 18-7), retVal[0]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherDayOneFiltering()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 7, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 10, 3, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 12, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 13, 0, 0), 12, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1, 9, 0, 0), new DateTime(2000, 1, 1, 15, 0, 0));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 9.75, 25, 1.75, 10_000, 18 - 7), retVal[0]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherDayTwo()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 6, 100, 1, 10_000, 18-7), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 7, 0, 0), 10, 25, 2, 10_000, 18-7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherDayTwoFiltering()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsDays", path, new DateTime(2000, 1, 1, 8, 0, 0), new DateTime(2000, 1, 1, 11, 0, 0));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 6, 100, 1, 10_000, 18 - 7), retVal[0]);
+            //Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 7, 0, 0), 10, 25, 2, 10_000, 18 - 7), retVal[1]);
+        }
+        #endregion
+
+        #region Parse hours
+        [TestMethod]
+        public void ParseWeatherHourOne()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 8, 0, 0), new DateTime(2001, 1, 1, 11, 0, 0));
+
+            Assert.AreEqual(1, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0),  5, 100, 0, (double)0, 2), retVal[0]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherHourMultiple()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            // day 2
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Sunny) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 15, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 8, 0, 0), new DateTime(2001, 1, 1, 11, 0, 0));
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 7, 0, 0), 5, 100, 0, (double)0, 2), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 9, 0, 0), 6.5, 100, 1.5, 10_000, 2), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 11, 0, 0), 5, 0, 2, 60_000, 2), retVal[2]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 13, 0, 0), 10, 25, 2, 10_000, 2), retVal[3]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 15, 0, 0), 15, 40, 2, 10_000, 2), retVal[4]);
+        }
+
+
+        [TestMethod]
+        public void ParseWeatherHourFiltering()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 10, 0, 0), 3, 3, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            // day 2
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 12, 0, 0), 5, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Sunny) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 13, 15, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 9, 0, 0), new DateTime(2000, 2, 1, 13, 0, 0));
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 9, 0, 0), 6.5, 100, 1.5, 10_000, 2), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 11, 0, 0), 5, 0, 2, 60_000, 2), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 2, 1, 13, 0, 0), 10, 33, 2, 10_000, 2), retVal[2]);
+        }
+
+        [TestMethod]
+        public void ParseWeatherHourNone()
+        {
+            string path = "";
+            List<WeatherInstance> data = new List<WeatherInstance>();
+            
+            // day 1
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 8, 0, 0), 5, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 1, 1, 9, 0, 0), 10, 0, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Dark) / 1000));
+
+            // day 2
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 16, 0, 0), 10, 2, 0, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+            data.Add(new WeatherInstance(new DateTime(2000, 2, 1, 17, 0, 0), 15, 2, 1, ValueToConditions.TransferConditionsToLux(WeatherConditions.Overcast) / 1000));
+
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadWeatherFile(path)).Returns(data);
+
+            WeatherParser target = new WeatherParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> jis = new List<ActivityInfo>();
+            List<ActivityInfo> pc = new List<ActivityInfo>();
+
+            List<WeatherInfo> retVal = (List<WeatherInfo>)obj.Invoke("ProcessOneWeatherFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 10, 0, 0), new DateTime(2000, 2, 1, 15, 0, 0));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+        #endregion
+
+        #endregion
+
+        // -------------------------------- JIS PARSER -----------------------------------------
+
+        #region Jis parser
+
+        #region Parse days
+        [TestMethod]
+        public void ParseJisDayOne()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayOneFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 6, 0, 0), 2));
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 17, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 1, 1, 16, 0, 0));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayTwo()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+            
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 2, 1, 8, 0, 0), 8));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 2, 1, 12, 0, 0), 2));
+            data.Add(new JisInstance("A2", new DateTime(2000, 2, 1, 16, 0, 0), 1));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 2, 1, 16, 0, 0));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+
+            Assert.AreEqual(new ActivityInfo("MENZA", 10, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 1, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[3]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayTwoFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 6, 0, 0), 2));
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 2, 1, 8, 0, 0), 8));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 2, 1, 12, 0, 0), 2));
+            data.Add(new JisInstance("A2", new DateTime(2000, 2, 1, 16, 0, 0), 1));
+            data.Add(new JisInstance("A2", new DateTime(2000, 2, 1, 17, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 2, 1, 16, 0, 0));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 3, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 5, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+
+            Assert.AreEqual(new ActivityInfo("MENZA", 10, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 1, new DateTime(2000, 2, 1, 7, 0, 0), 18 - 7), retVal[3]);
+        }
+
+
+        [TestMethod]
+        public void ParseJisDayNone()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 10, 0, 0), 3));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 2, 15, 0, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsDays", path, new DateTime(2000, 1, 3), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+        #endregion
+
+        #region Parse hours
+        [TestMethod]
+        public void ParseJisHourlyOne()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 15, 0), 3));
+
+            /*
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 12, 0, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 15, 0, 0), 2));
+            */
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 2, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 6, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseJisDayHourlyMultiple()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 7, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 15, 0), 3));
+
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 11, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 11, 10, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 11, 20, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("MENZA", 2, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 6, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("MENZA", 6, new DateTime(2000, 1, 1, 11, 0, 0), 2), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("KARMA", 2, new DateTime(2000, 1, 1, 11, 0, 0), 2), retVal[3]);
+        }
+
+        [TestMethod]
+        public void ParseJisHourlyNone()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 3, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 4, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 5, 15, 0), 3));
+
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 19, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 19, 10, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 19, 20, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+
+        [TestMethod]
+        public void ParseJisHourlyFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<JisInstance> data = new List<JisInstance>();
+            data.Add(new JisInstance("MenzaKL-vydej", new DateTime(2000, 1, 1, 6, 0, 0), 2));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 0, 0), 3));
+            data.Add(new JisInstance("A2-Hlavni vchod", new DateTime(2000, 1, 1, 8, 15, 0), 3));
+
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 11, 0, 0), 5));
+            data.Add(new JisInstance("Menza4-kasa5", new DateTime(2000, 1, 1, 18, 10, 0), 1));
+            data.Add(new JisInstance("A1", new DateTime(2000, 1, 1, 19, 20, 0), 2));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadJisFile(path)).Returns(data);
+
+            JisParser target = new JisParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneJisFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("KARMA", 6, new DateTime(2000, 1, 1, 7, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("MENZA", 5, new DateTime(2000, 1, 1, 11, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("MENZA", 1, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[2]);
+        }
+        #endregion
+
+        #endregion
+
+        // -------------------------------- LOGIN PARSER ----------------------------------------
+
+        #region Login parser
+
+        #region Parse days
+        [TestMethod]
+        public void ParseLoginDayOne()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "UC", "UÄŤebna", "UC-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 16, 00, 0), new DateTime(2000, 1, 1, 10, 5, 0), "UC", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLogInFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 4, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 6, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseLoginDayOneFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 6, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "UC", "UÄŤebna", "UC-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 16, 00, 0), new DateTime(2000, 1, 1, 16, 5, 0), "UC", "UÄŤebna", "UC-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 17, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "UC", "UÄŤebna", "UC-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLogInFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 1, 1, 16, 0, 0));
+
+            Assert.AreEqual(2, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 4, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 6, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+        }
+
+        [TestMethod]
+        public void ParseLoginDayTwo()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "UC", "UÄŤebna", "UC-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 16, 00, 0), new DateTime(2000, 1, 1, 16, 5, 0), "UC", "UÄŤebna", "UC-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 3, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EU", "UÄŤebna", "EU-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 17, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLogInFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 1, 3, 0, 0, 0));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 4, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 6, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 2, 7, 0, 0), 18 - 7), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FEL", 5, new DateTime(2000, 1, 2, 7, 0, 0), 18 - 7), retVal[3]);
+        }
+
+        [TestMethod]
+        public void ParseLoginDayTwoFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 5, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "UC", "UÄŤebna", "UC-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 16, 00, 0), new DateTime(2000, 1, 1, 16, 5, 0), "UC", "UÄŤebna", "UC-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 6, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 3, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EU", "UÄŤebna", "EU-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 17, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 19, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 3, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 17, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 3, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 17, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLogInFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 1, 3, 0, 0, 0));
+
+            Assert.AreEqual(4, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 4, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FAV", 6, new DateTime(2000, 1, 1, 7, 0, 0), 18 - 7), retVal[1]);
+
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 2, 7, 0, 0), 18 - 7), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FEL", 5, new DateTime(2000, 1, 2, 7, 0, 0), 18 - 7), retVal[3]);
+        }
+
+
+        [TestMethod]
+        public void ParseLoginDayNone()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 5, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "UC", "UÄŤebna", "UC-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 16, 00, 0), new DateTime(2000, 1, 1, 16, 5, 0), "UC", "UÄŤebna", "UC-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 3, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EU", "UÄŤebna", "EU-108", "uc233p02-fav"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 6, new DateTime(2000, 1, 1, 12, 20, 0), new DateTime(2000, 1, 1, 12, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 7, new DateTime(2000, 1, 1, 17, 00, 0), new DateTime(2000, 1, 1, 17, 5, 0), "EU", "UÄŤebna", "EU-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLogInFileAsDays", path, new DateTime(2000, 1, 1), new DateTime(2000, 1, 1, 9, 0, 0));
+            
+            Assert.AreEqual(0, retVal.Count);
+        }
+        #endregion
+
+        #region Parse hours
+        [TestMethod]
+        public void ParseLoginHourlyOne()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EL", "UÄŤebna", "UC-108", "uc233p02-fav"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 13, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 14, 00, 0), new DateTime(2000, 1, 1, 10, 5, 0), "UC", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 18, 0, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 18, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLoginFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FEL", 1, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[3]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[4]);
+        }
+
+        [TestMethod]
+        public void ParseLoginDayHourlyMultiple()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EL", "UÄŤebna", "UC-108", "uc233p02-fav"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 13, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 14, 00, 0), new DateTime(2000, 1, 1, 10, 5, 0), "UC", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 18, 0, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 18, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLoginFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FEL", 1, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[3]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 2, 17, 0, 0), 2), retVal[4]);
+        }
+
+        [TestMethod]
+        public void ParseLoginHourlyFiltering()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 5, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 9, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 10, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EL", "UÄŤebna", "UC-108", "uc233p02-fav"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 13, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 14, 00, 0), new DateTime(2000, 1, 1, 10, 5, 0), "UC", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 18, 0, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 18, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 19, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLoginFileAsIntervals", path, 2, new DateTime(2000, 1, 1), new DateTime(2001, 1, 1));
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FEL", 1, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[3]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 2, 17, 0, 0), 2), retVal[4]);
+        }
+
+        [TestMethod]
+        public void ParseLoginHourlyNone()
+        {
+            TagInfo.CreateDictionaries();
+
+            string path = "";
+            List<LogInInstance> data = new List<LogInInstance>();
+            // "01.06.2019 00:00:00"; 2; 4; "10:15"; "11:00"; "LS"; "UÄŤebna"; "LS-234"; "ls233p02-fdu"
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 3, new DateTime(2000, 1, 1, 5, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 1, 4, new DateTime(2000, 1, 1, 9, 15, 0), new DateTime(2000, 1, 1, 11, 0, 0), "EL", "UÄŤebna", "UC-108", "uc233p02-fav"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 19, 0, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 1, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 19, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "UC", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 2, 6, new DateTime(2000, 1, 1, 18, 0, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+            data.Add(new LogInInstance(new DateTime(2000, 1, 2, 0, 0, 0), 5, 7, new DateTime(2000, 1, 1, 18, 20, 0), new DateTime(2000, 1, 1, 10, 5, 0), "LS", "UÄŤebna", "LS-108", "ls233p02-fdu"));
+
+            Mock<IDataLoader> dl = new Mock<IDataLoader>();
+            dl.Setup(m => m.LoadLoginFile(path)).Returns(data);
+
+            LogInParser target = new LogInParser(dl.Object);
+            PrivateObject obj = new PrivateObject(target);
+
+            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("ProcessOneLoginFileAsIntervals", path, 2, new DateTime(2000, 1, 1, 10, 0, 0), new DateTime(2000, 1, 2, 10, 0, 0));
+
+            Assert.AreEqual(0, retVal.Count);
+        }
+        #endregion
+
+        #endregion
+
+        // -------------------------------- JSON PARSER -----------------------------------------
+
+        #region Json parser
+
+        [TestMethod]
+        public void JsonParser()
+        {
+            /*
+            TagInfo.CreateDictionaries();
+
+            // TODO make an input file
+            string data = "";
+
+            Mock<DataDownloader> dl = new Mock<DataDownloader>();
+            dl.Setup(m => m.DownloadWeatherPrediction()).Returns(data);
+
+            JsonParser target = new JsonParser(dl.Object);
+
+            target.ParsePrediction();
+            WeatherInfo current = target.Current;
+            List<WeatherInfo> retVal = target.Predictions;
+
+            Assert.AreEqual(8, retVal.Count);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[0]);
+            Assert.AreEqual(new ActivityInfo("FEL", 1, new DateTime(2000, 1, 1, 9, 0, 0), 2), retVal[1]);
+            Assert.AreEqual(new ActivityInfo("FDU", 2, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[2]);
+            Assert.AreEqual(new ActivityInfo("FAV", 5, new DateTime(2000, 1, 1, 13, 0, 0), 2), retVal[3]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[4]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[5]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[6]);
+            Assert.AreEqual(new ActivityInfo("FDU", 7, new DateTime(2000, 1, 1, 17, 0, 0), 2), retVal[7]);
+            */
+        }
+
+
+        [TestMethod]
+        public void GetPredictionForTimeFilter()
+        {
+            string data = "";
+            Mock<DataDownloader> dl = new Mock<DataDownloader>("", "", "");
+            dl.Setup(m => m.DownloadWeatherPrediction()).Returns(data);
+
+            JsonParser target = new JsonParser(dl.Object);
+
+            List<WeatherInfo> pred = new List<WeatherInfo>();
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3));
+
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 9, 0, 0), 8, 1, 2, 60_000, 15));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 3, 0, 0, 0), 8, 1, 2, 60_000, 3));
+
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 3, 3, 0, 0), 8, 1, 2, 60_000, 3));
+
+            target.Predictions = pred;
+
+            List<WeatherInfo> retVal = target.GetPredictionForTime(new DateTime(2000, 1, 1, 6, 0, 0), new DateTime(2000, 1, 3, 0, 0, 0));
+
+            Assert.AreEqual(6, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12), retVal[2]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3), retVal[3]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 2, 9, 0, 0), 8, 1, 2, 60_000, 15), retVal[4]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 3, 0, 0, 0), 8, 1, 2, 60_000, 3), retVal[5]);
+        }
+
+        [TestMethod]
+        public void GetPredictionForTimeInvalidInput()
+        {
+            string data = "";
+            Mock<DataDownloader> dl = new Mock<DataDownloader>("", "", "");
+            dl.Setup(m => m.DownloadWeatherPrediction()).Returns(data);
+
+            JsonParser target = new JsonParser(dl.Object);
+
+            List<WeatherInfo> pred = new List<WeatherInfo>();
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3));
+
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 9, 0, 0), 8, 1, 2, 60_000, 15));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 3, 0, 0, 0), 8, 1, 2, 60_000, 3));
+
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 3, 3, 0, 0), 8, 1, 2, 60_000, 3));
+
+            target.Predictions = pred;
+
+            List<WeatherInfo> retVal = target.GetPredictionForTime(new DateTime(2000, 1, 3, 0, 0, 0), new DateTime(2000, 1, 1, 6, 0, 0));
+            Assert.AreEqual(null, retVal);
+        }
+
+        [TestMethod]
+        public void GetPredictionForTimeAllTo()
+        {
+            string data = "";
+            Mock<DataDownloader> dl = new Mock<DataDownloader>("", "", "");
+            dl.Setup(m => m.DownloadWeatherPrediction()).Returns(data);
+
+            JsonParser target = new JsonParser(dl.Object);
+
+            List<WeatherInfo> pred = new List<WeatherInfo>();
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3));
+            
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 9, 0, 0), 8, 1, 2, 60_000, 15));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 3, 0, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 3, 3, 0, 0), 8, 1, 2, 60_000, 3));
+
+            target.Predictions = pred;
+
+            List<WeatherInfo> retVal = target.GetPredictionForTime(DateTime.MinValue, new DateTime(2000, 1, 2, 6, 0, 0));
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6), retVal[2]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12), retVal[3]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3), retVal[4]);
+        }
+
+        [TestMethod]
+        public void GetPredictionForTimeAllFrom()
+        {
+            string data = "";
+            Mock<DataDownloader> dl = new Mock<DataDownloader>("", "", "");
+            dl.Setup(m => m.DownloadWeatherPrediction()).Returns(data);
+
+            JsonParser target = new JsonParser(dl.Object);
+
+            List<WeatherInfo> pred = new List<WeatherInfo>();
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 6, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 9, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3));
+
+            target.Predictions = pred;
+
+            List<WeatherInfo> retVal = target.GetPredictionForTime(new DateTime(2000, 1, 1, 12, 0, 0), DateTime.MaxValue);
+
+            Assert.AreEqual(3, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3), retVal[2]);
+        }
+
+        public void GetPredictionForTimeAll()
+        {
+
+            // TODO make an input file
+            string data = "";
+            Mock<DataDownloader> dl = new Mock<DataDownloader>("", "", "");
+            dl.Setup(m => m.DownloadWeatherPrediction()).Returns(data);
+
+            JsonParser target = new JsonParser(dl.Object);
+
+            List<WeatherInfo> pred = new List<WeatherInfo>();
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12));
+            pred.Add(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3));
+
+            target.Predictions = pred;
+
+            List<WeatherInfo> retVal = target.GetPredictionForTime(DateTime.MinValue, DateTime.MaxValue);
+
+            Assert.AreEqual(5, retVal.Count);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 0, 0, 0), 8, 1, 2, 60_000, 3), retVal[0]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 3, 0, 0), 8, 1, 2, 60_000, 6), retVal[1]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 12, 0, 0), 8, 1, 2, 60_000, 6), retVal[2]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 1, 18, 0, 0), 8, 1, 2, 60_000, 12), retVal[3]);
+            Assert.AreEqual(new WeatherInfo(new DateTime(2000, 1, 2, 6, 0, 0), 8, 1, 2, 60_000, 3), retVal[4]);
+        }
+        #endregion
+    }
+}
diff --git a/Server/TestProject/TestProject.csproj b/Server/TestProject/TestProject.csproj
index f3a73e8c4f3eef0def0e507a109e6e8d101d7e43..c7574f6ff2bbaebdd58701dc98c89314d54ac3ce 100644
--- a/Server/TestProject/TestProject.csproj
+++ b/Server/TestProject/TestProject.csproj
@@ -63,7 +63,7 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="TestingParser.cs" />
+    <Compile Include="ParserTests\TestingParser.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
diff --git a/Server/TestProject/TestingParser.cs b/Server/TestProject/TestingParser.cs
deleted file mode 100644
index bf0cb90b6775d4cb19074c7fb221d215fe4b3855..0000000000000000000000000000000000000000
--- a/Server/TestProject/TestingParser.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using System;
-using ServerApp.Parser.Parsers;
-using System.Collections.Generic;
-using ServerApp.Parser.OutputInfo;
-
-namespace TestProject
-{
-    [TestClass]
-    public class TestingParser
-    {
-        [TestMethod]
-        public void AbstactClassTest()
-        {
-            IDataParser p = new DataParser(null);
-            List<ActivityInfo> aa = p.AttendanceList;
-            List<WeatherInfo> wa = p.WeatherList;
-
-            DataParser pp = (DataParser)p;
-            List<ActivityInfo> ap = pp.AttendanceList;
-            List<WeatherInfo> wp = pp.WeatherList;
-
-            Assert.AreEqual(aa, ap);
-            Assert.AreEqual(wa, wp);
-        }
-
-        [TestMethod]
-        public void MergeListsNull()
-        {
-            DataParser target = new DataParser(null);
-            PrivateObject obj = new PrivateObject(target);
-
-            List<ActivityInfo> jis = null;
-            List<ActivityInfo> pc = null;
-
-            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
-            Assert.AreEqual(0, retVal.Count);
-        }
-
-        [TestMethod]
-        public void MergeListsJisNull()
-        {
-            DataParser target = new DataParser(null);
-            PrivateObject obj = new PrivateObject(target);
-
-            List<ActivityInfo> jis = null;
-            List<ActivityInfo> pc = new List<ActivityInfo>();
-
-            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
-            Assert.AreEqual(pc, retVal);
-        }
-
-        [TestMethod]
-        public void MergeListsPcNull()
-        {
-            DataParser target = new DataParser(null);
-            PrivateObject obj = new PrivateObject(target);
-
-            List<ActivityInfo> jis = new List<ActivityInfo>();
-            List<ActivityInfo> pc = null;
-
-            List<ActivityInfo> retVal = (List<ActivityInfo>)obj.Invoke("MergeAttendance", jis, pc);
-            Assert.AreEqual(jis, retVal);
-        }
-    }
-}
diff --git a/TextureEditing/.vs/TextureEditing/DesignTimeBuild/.dtbcache.v2 b/TextureEditing/.vs/TextureEditing/DesignTimeBuild/.dtbcache.v2
new file mode 100644
index 0000000000000000000000000000000000000000..04ceab7c20fda8acf71f42abba6a8cf21f4ce4e5
Binary files /dev/null and b/TextureEditing/.vs/TextureEditing/DesignTimeBuild/.dtbcache.v2 differ
diff --git a/TextureEditing/.vs/TextureEditing/v16/.suo b/TextureEditing/.vs/TextureEditing/v16/.suo
new file mode 100644
index 0000000000000000000000000000000000000000..519a72794193ed24a16d3ad57f30f640c40e815a
Binary files /dev/null and b/TextureEditing/.vs/TextureEditing/v16/.suo differ
diff --git a/TextureEditing/bin/Debug/net5.0/Microsoft.Win32.SystemEvents.dll b/TextureEditing/bin/Debug/net5.0/Microsoft.Win32.SystemEvents.dll
new file mode 100644
index 0000000000000000000000000000000000000000..d62f3335bb75e1ac752e8705089fdd11a7d74a07
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/Microsoft.Win32.SystemEvents.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/System.Drawing.Common.dll b/TextureEditing/bin/Debug/net5.0/System.Drawing.Common.dll
new file mode 100644
index 0000000000000000000000000000000000000000..6ab3e30f67b4bba3a8d7c406dc087a29a2462d81
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/System.Drawing.Common.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.deps.json b/TextureEditing/bin/Debug/net5.0/TextureEditing.deps.json
new file mode 100644
index 0000000000000000000000000000000000000000..af1786f34806945a0f0475befd17a79b9955fad2
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/TextureEditing.deps.json
@@ -0,0 +1,92 @@
+{
+  "runtimeTarget": {
+    "name": ".NETCoreApp,Version=v5.0",
+    "signature": ""
+  },
+  "compilationOptions": {},
+  "targets": {
+    ".NETCoreApp,Version=v5.0": {
+      "TextureEditing/1.0.0": {
+        "dependencies": {
+          "System.Drawing.Common": "5.0.2"
+        },
+        "runtime": {
+          "TextureEditing.dll": {}
+        }
+      },
+      "Microsoft.NETCore.Platforms/5.0.0": {},
+      "Microsoft.Win32.SystemEvents/5.0.0": {
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "5.0.0"
+        },
+        "runtime": {
+          "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll": {
+            "assemblyVersion": "5.0.0.0",
+            "fileVersion": "5.0.20.51904"
+          }
+        },
+        "runtimeTargets": {
+          "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll": {
+            "rid": "win",
+            "assetType": "runtime",
+            "assemblyVersion": "5.0.0.0",
+            "fileVersion": "5.0.20.51904"
+          }
+        }
+      },
+      "System.Drawing.Common/5.0.2": {
+        "dependencies": {
+          "Microsoft.Win32.SystemEvents": "5.0.0"
+        },
+        "runtime": {
+          "lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "assemblyVersion": "5.0.0.2",
+            "fileVersion": "5.0.421.11614"
+          }
+        },
+        "runtimeTargets": {
+          "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "rid": "unix",
+            "assetType": "runtime",
+            "assemblyVersion": "5.0.0.2",
+            "fileVersion": "5.0.421.11614"
+          },
+          "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "rid": "win",
+            "assetType": "runtime",
+            "assemblyVersion": "5.0.0.2",
+            "fileVersion": "5.0.421.11614"
+          }
+        }
+      }
+    }
+  },
+  "libraries": {
+    "TextureEditing/1.0.0": {
+      "type": "project",
+      "serviceable": false,
+      "sha512": ""
+    },
+    "Microsoft.NETCore.Platforms/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
+      "path": "microsoft.netcore.platforms/5.0.0",
+      "hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
+    },
+    "Microsoft.Win32.SystemEvents/5.0.0": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
+      "path": "microsoft.win32.systemevents/5.0.0",
+      "hashPath": "microsoft.win32.systemevents.5.0.0.nupkg.sha512"
+    },
+    "System.Drawing.Common/5.0.2": {
+      "type": "package",
+      "serviceable": true,
+      "sha512": "sha512-rvr/M1WPf24ljpvvrVd74+NdjRUJu1bBkspkZcnzSZnmAUQWSvanlQ0k/hVHk+cHufZbZfu7vOh/vYc0q5Uu/A==",
+      "path": "system.drawing.common/5.0.2",
+      "hashPath": "system.drawing.common.5.0.2.nupkg.sha512"
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.dll b/TextureEditing/bin/Debug/net5.0/TextureEditing.dll
new file mode 100644
index 0000000000000000000000000000000000000000..4246ccdcd185679b36b1223e8aa833be5f691a9d
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.exe b/TextureEditing/bin/Debug/net5.0/TextureEditing.exe
new file mode 100644
index 0000000000000000000000000000000000000000..f74f3d9aea248c55ce4cd271e1a0151f6488a746
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.exe differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.pdb b/TextureEditing/bin/Debug/net5.0/TextureEditing.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..b0270eb1519659dbcd68e0befadf0f6e9236b491
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.pdb differ
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.dev.json b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.dev.json
new file mode 100644
index 0000000000000000000000000000000000000000..d80adcabed99a5ffc5a5c4e90c0050255bef6518
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.dev.json
@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "additionalProbingPaths": [
+      "C:\\Users\\Daemon\\.dotnet\\store\\|arch|\\|tfm|",
+      "C:\\Users\\Daemon\\.nuget\\packages",
+      "D:\\Instalace\\VS\\Shared\\NuGetPackages"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.json b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..a8e7e82874bf4919e97618aed2ac5a89a5c0faa6
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/TextureEditing.runtimeconfig.json
@@ -0,0 +1,9 @@
+{
+  "runtimeOptions": {
+    "tfm": "net5.0",
+    "framework": {
+      "name": "Microsoft.NETCore.App",
+      "version": "5.0.0"
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/bin/Debug/net5.0/TextureEditing.zip b/TextureEditing/bin/Debug/net5.0/TextureEditing.zip
new file mode 100644
index 0000000000000000000000000000000000000000..082307ffac9f37b49836ba52fe8e2a3afbb76777
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/TextureEditing.zip differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/CIV.png b/TextureEditing/bin/Debug/net5.0/data/CIV.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d27eaf014ee6d25cbeac139be4b9df12d91c87f
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/CIV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FAV.png b/TextureEditing/bin/Debug/net5.0/data/FAV.png
new file mode 100644
index 0000000000000000000000000000000000000000..58222bd021ade8f519692ed228496768031bdfe3
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FAV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FDU.png b/TextureEditing/bin/Debug/net5.0/data/FDU.png
new file mode 100644
index 0000000000000000000000000000000000000000..74e685df89104c0ba8a9b28e21eb115805753699
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FDU.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FEL.png b/TextureEditing/bin/Debug/net5.0/data/FEL.png
new file mode 100644
index 0000000000000000000000000000000000000000..0140f02298dbf1dd38b683b3b72e99ec7d0b95f0
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FEL.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/FST+FEK.png b/TextureEditing/bin/Debug/net5.0/data/FST+FEK.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b5ad46f681fd74ce8d501a13e3e2cadfd90fd75
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/FST+FEK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/LIB.png b/TextureEditing/bin/Debug/net5.0/data/LIB.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7c350644e860c48b399934192e461c17cfb063d
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/LIB.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/MENZA.png b/TextureEditing/bin/Debug/net5.0/data/MENZA.png
new file mode 100644
index 0000000000000000000000000000000000000000..49b69fe37d8ff71129de7aeafb4f9dbce100a193
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/MENZA.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/data/REK.png b/TextureEditing/bin/Debug/net5.0/data/REK.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0aa400064bc91fa7d222d912a5dec41f04f4c32
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/data/REK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/CIV.png b/TextureEditing/bin/Debug/net5.0/output/CIV.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca90239aea7e4377a9f2d9e4c488c03a27865964
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/CIV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FAV.png b/TextureEditing/bin/Debug/net5.0/output/FAV.png
new file mode 100644
index 0000000000000000000000000000000000000000..adf071f24e49c48ea1710c4779c63ea24bc5ef98
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FAV.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FDU.png b/TextureEditing/bin/Debug/net5.0/output/FDU.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4632a0d8e1a6a6b1d027e1a526e8849c6116491
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FDU.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FEL.png b/TextureEditing/bin/Debug/net5.0/output/FEL.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9444015216a9cfa60f897f8a55edcec5f3a84e7
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FEL.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/FST+FEK.png b/TextureEditing/bin/Debug/net5.0/output/FST+FEK.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4831bab919490a9436d6818086dc7cc83657d80
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/FST+FEK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/LIB.png b/TextureEditing/bin/Debug/net5.0/output/LIB.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e404be19f88cb7e3641fd119255f4823f52f8a6
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/LIB.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/MENZA.png b/TextureEditing/bin/Debug/net5.0/output/MENZA.png
new file mode 100644
index 0000000000000000000000000000000000000000..388b9ce602be482777cf0360309b65818bc0054c
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/MENZA.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/REK.png b/TextureEditing/bin/Debug/net5.0/output/REK.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a773a2acb01ad366b0224a0f2bbe4ee1172df14
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/output/REK.png differ
diff --git a/TextureEditing/bin/Debug/net5.0/output/output.csv b/TextureEditing/bin/Debug/net5.0/output/output.csv
new file mode 100644
index 0000000000000000000000000000000000000000..3881a6d388b37b93e6fd1c2260421656f45b5c14
--- /dev/null
+++ b/TextureEditing/bin/Debug/net5.0/output/output.csv
@@ -0,0 +1,8 @@
+CIV.png;57.287598;57.359966;49.24623;51.86722
+FAV.png;49.70703;78.37603;55.79119;50.74627
+FDU.png;31.066895;54.99349;44.702843;50.73314
+FEL.png;34.375;38.276165;52.941177;49.06015
+FST+FEK.png;36.8042;51.693443;47.44898;46.205357
+LIB.png;56.82373;60.92054;47.22222;59.360733
+MENZA.png;54.284668;37.342598;46.785713;47.482014
+REK.png;50.12207;36.60443;49.450546;50.549454
diff --git a/TextureEditing/bin/Debug/net5.0/ref/TextureEditing.dll b/TextureEditing/bin/Debug/net5.0/ref/TextureEditing.dll
new file mode 100644
index 0000000000000000000000000000000000000000..1df0c244cef950e79af917708c807d489745f455
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/ref/TextureEditing.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll b/TextureEditing/bin/Debug/net5.0/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll
new file mode 100644
index 0000000000000000000000000000000000000000..8b95164b1f805db8bcaccffabe48a5adc13db0d7
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b5aa0c4cd3e2d8c425138dde02b8f77434979697
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll differ
diff --git a/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b80b430426d1b49bb4d79b271fd640c29aad271d
Binary files /dev/null and b/TextureEditing/bin/Debug/net5.0/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll differ
diff --git a/TextureEditing/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs b/TextureEditing/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2f7e5ec5afa156f8313c6a17e8a80a25246858f5
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+// <autogenerated />
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v5.0", FrameworkDisplayName = "")]
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfo.cs b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..bd2ef732753ea5558f3f417f005b891375287079
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfo.cs
@@ -0,0 +1,23 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+using System;
+using System.Reflection;
+
+[assembly: System.Reflection.AssemblyCompanyAttribute("TextureEditing")]
+[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
+[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
+[assembly: System.Reflection.AssemblyProductAttribute("TextureEditing")]
+[assembly: System.Reflection.AssemblyTitleAttribute("TextureEditing")]
+[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
+
+// Generated by the MSBuild WriteCodeFragment class.
+
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfoInputs.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfoInputs.cache
new file mode 100644
index 0000000000000000000000000000000000000000..b441f6fb24448bbc285f34be204061844af8e219
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+a034e858309ca5736878c994bb335596cdb135cd
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.GeneratedMSBuildEditorConfig.editorconfig b/TextureEditing/obj/Debug/net5.0/TextureEditing.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..d7e29835d585d70c36f9ec99b31f5a63a0912174
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,8 @@
+is_global = true
+build_property.TargetFramework = net5.0
+build_property.TargetPlatformMinVersion = 
+build_property.UsingMicrosoftNETSdkWeb = 
+build_property.ProjectTypeGuids = 
+build_property.PublishSingleFile = 
+build_property.IncludeAllContentForSelfExtract = 
+build_property._SupportedPlatformList = Android,iOS,Linux,macOS,Windows
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.assets.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.assets.cache
new file mode 100644
index 0000000000000000000000000000000000000000..e3a919825474c06603b073f5dca783439eedbf94
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.assets.cache differ
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CopyComplete b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CopyComplete
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CoreCompileInputs.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000000000000000000000000000000000000..be2a405e34e1fc01fc746638e0f5e5fb5e95a7d6
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+a810736e97c3df7a632e96bee5699fa73ad790a8
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.FileListAbsolute.txt b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ebe06b21331577493038997176f78c9444e1bad7
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.csproj.FileListAbsolute.txt
@@ -0,0 +1,30 @@
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.exe
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.deps.json
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.runtimeconfig.json
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.runtimeconfig.dev.json
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\ref\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\TextureEditing.pdb
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.csprojAssemblyReference.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.GeneratedMSBuildEditorConfig.editorconfig
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.AssemblyInfoInputs.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.AssemblyInfo.cs
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.csproj.CoreCompileInputs.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\ref\TextureEditing.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.pdb
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.genruntimeconfig.cache
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\Microsoft.Win32.SystemEvents.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\System.Drawing.Common.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\runtimes\win\lib\netcoreapp3.0\Microsoft.Win32.SystemEvents.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\runtimes\unix\lib\netcoreapp3.0\System.Drawing.Common.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\runtimes\win\lib\netcoreapp3.0\System.Drawing.Common.dll
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\obj\Debug\net5.0\TextureEditing.csproj.CopyComplete
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\CIV.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FAV.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FDU.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FEL.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\FST+FEK.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\LIB.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\MENZA.png
+D:\moje\school\04\aswi\sem\open data\Develop\aswi2021tri-musketyri\aswi2021tri-musketyri\TextureEditing\bin\Debug\net5.0\data\REK.png
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.csprojAssemblyReference.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.csprojAssemblyReference.cache
new file mode 100644
index 0000000000000000000000000000000000000000..d1c0ec53f86bb9e3e030093bebeb426e2b47de3e
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.csprojAssemblyReference.cache differ
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.dll b/TextureEditing/obj/Debug/net5.0/TextureEditing.dll
new file mode 100644
index 0000000000000000000000000000000000000000..4246ccdcd185679b36b1223e8aa833be5f691a9d
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.dll differ
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.genruntimeconfig.cache b/TextureEditing/obj/Debug/net5.0/TextureEditing.genruntimeconfig.cache
new file mode 100644
index 0000000000000000000000000000000000000000..2daf8a687506ecbf78d927ee58a9db7199d721f0
--- /dev/null
+++ b/TextureEditing/obj/Debug/net5.0/TextureEditing.genruntimeconfig.cache
@@ -0,0 +1 @@
+f7f8983b33080f7ed179e61676b834a08b448cf3
diff --git a/TextureEditing/obj/Debug/net5.0/TextureEditing.pdb b/TextureEditing/obj/Debug/net5.0/TextureEditing.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..b0270eb1519659dbcd68e0befadf0f6e9236b491
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/TextureEditing.pdb differ
diff --git a/TextureEditing/obj/Debug/net5.0/apphost.exe b/TextureEditing/obj/Debug/net5.0/apphost.exe
new file mode 100644
index 0000000000000000000000000000000000000000..f74f3d9aea248c55ce4cd271e1a0151f6488a746
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/apphost.exe differ
diff --git a/TextureEditing/obj/Debug/net5.0/ref/TextureEditing.dll b/TextureEditing/obj/Debug/net5.0/ref/TextureEditing.dll
new file mode 100644
index 0000000000000000000000000000000000000000..1df0c244cef950e79af917708c807d489745f455
Binary files /dev/null and b/TextureEditing/obj/Debug/net5.0/ref/TextureEditing.dll differ
diff --git a/TextureEditing/obj/TextureEditing.csproj.nuget.dgspec.json b/TextureEditing/obj/TextureEditing.csproj.nuget.dgspec.json
new file mode 100644
index 0000000000000000000000000000000000000000..c93e968804199fe4f6d1e45478f10c5b3d222d7f
--- /dev/null
+++ b/TextureEditing/obj/TextureEditing.csproj.nuget.dgspec.json
@@ -0,0 +1,72 @@
+{
+  "format": 1,
+  "restore": {
+    "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj": {}
+  },
+  "projects": {
+    "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj": {
+      "version": "1.0.0",
+      "restore": {
+        "projectUniqueName": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+        "projectName": "TextureEditing",
+        "projectPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+        "packagesPath": "C:\\Users\\Daemon\\.nuget\\packages\\",
+        "outputPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\obj\\",
+        "projectStyle": "PackageReference",
+        "fallbackFolders": [
+          "D:\\Instalace\\VS\\Shared\\NuGetPackages"
+        ],
+        "configFilePaths": [
+          "C:\\Users\\Daemon\\AppData\\Roaming\\NuGet\\NuGet.Config",
+          "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+          "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+        ],
+        "originalTargetFrameworks": [
+          "net5.0"
+        ],
+        "sources": {
+          "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+          "https://api.nuget.org/v3/index.json": {}
+        },
+        "frameworks": {
+          "net5.0": {
+            "targetAlias": "net5.0",
+            "projectReferences": {}
+          }
+        },
+        "warningProperties": {
+          "warnAsError": [
+            "NU1605"
+          ]
+        }
+      },
+      "frameworks": {
+        "net5.0": {
+          "targetAlias": "net5.0",
+          "dependencies": {
+            "System.Drawing.Common": {
+              "target": "Package",
+              "version": "[5.0.2, )"
+            }
+          },
+          "imports": [
+            "net461",
+            "net462",
+            "net47",
+            "net471",
+            "net472",
+            "net48"
+          ],
+          "assetTargetFallback": true,
+          "warn": true,
+          "frameworkReferences": {
+            "Microsoft.NETCore.App": {
+              "privateAssets": "all"
+            }
+          },
+          "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.201\\RuntimeIdentifierGraph.json"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/obj/TextureEditing.csproj.nuget.g.props b/TextureEditing/obj/TextureEditing.csproj.nuget.g.props
new file mode 100644
index 0000000000000000000000000000000000000000..4721039fe7c616886aa54ba4d6dbbc3afd091838
--- /dev/null
+++ b/TextureEditing/obj/TextureEditing.csproj.nuget.g.props
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+    <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
+    <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
+    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
+    <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
+    <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Daemon\.nuget\packages\;D:\Instalace\VS\Shared\NuGetPackages</NuGetPackageFolders>
+    <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
+    <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">5.9.0</NuGetToolVersion>
+  </PropertyGroup>
+  <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+    <SourceRoot Include="C:\Users\Daemon\.nuget\packages\" />
+    <SourceRoot Include="D:\Instalace\VS\Shared\NuGetPackages\" />
+  </ItemGroup>
+  <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/TextureEditing/obj/TextureEditing.csproj.nuget.g.targets b/TextureEditing/obj/TextureEditing.csproj.nuget.g.targets
new file mode 100644
index 0000000000000000000000000000000000000000..53cfaa19b16f3769b2bfc33db3b5c0053c16fdba
--- /dev/null
+++ b/TextureEditing/obj/TextureEditing.csproj.nuget.g.targets
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/TextureEditing/obj/project.assets.json b/TextureEditing/obj/project.assets.json
new file mode 100644
index 0000000000000000000000000000000000000000..c4a5c27e4b8fedb3078cebe3433c71cb6d8c198a
--- /dev/null
+++ b/TextureEditing/obj/project.assets.json
@@ -0,0 +1,219 @@
+{
+  "version": 3,
+  "targets": {
+    "net5.0": {
+      "Microsoft.NETCore.Platforms/5.0.0": {
+        "type": "package",
+        "compile": {
+          "lib/netstandard1.0/_._": {}
+        },
+        "runtime": {
+          "lib/netstandard1.0/_._": {}
+        }
+      },
+      "Microsoft.Win32.SystemEvents/5.0.0": {
+        "type": "package",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "5.0.0"
+        },
+        "compile": {
+          "ref/netstandard2.0/_._": {}
+        },
+        "runtime": {
+          "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll": {}
+        },
+        "runtimeTargets": {
+          "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll": {
+            "assetType": "runtime",
+            "rid": "win"
+          }
+        }
+      },
+      "System.Drawing.Common/5.0.2": {
+        "type": "package",
+        "dependencies": {
+          "Microsoft.Win32.SystemEvents": "5.0.0"
+        },
+        "compile": {
+          "ref/netcoreapp3.0/System.Drawing.Common.dll": {}
+        },
+        "runtime": {
+          "lib/netcoreapp3.0/System.Drawing.Common.dll": {}
+        },
+        "runtimeTargets": {
+          "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "assetType": "runtime",
+            "rid": "unix"
+          },
+          "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll": {
+            "assetType": "runtime",
+            "rid": "win"
+          }
+        }
+      }
+    }
+  },
+  "libraries": {
+    "Microsoft.NETCore.Platforms/5.0.0": {
+      "sha512": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
+      "type": "package",
+      "path": "microsoft.netcore.platforms/5.0.0",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "THIRD-PARTY-NOTICES.TXT",
+        "lib/netstandard1.0/_._",
+        "microsoft.netcore.platforms.5.0.0.nupkg.sha512",
+        "microsoft.netcore.platforms.nuspec",
+        "runtime.json",
+        "useSharedDesignerContext.txt",
+        "version.txt"
+      ]
+    },
+    "Microsoft.Win32.SystemEvents/5.0.0": {
+      "sha512": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==",
+      "type": "package",
+      "path": "microsoft.win32.systemevents/5.0.0",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "THIRD-PARTY-NOTICES.TXT",
+        "lib/net461/Microsoft.Win32.SystemEvents.dll",
+        "lib/net461/Microsoft.Win32.SystemEvents.xml",
+        "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll",
+        "lib/netstandard2.0/Microsoft.Win32.SystemEvents.xml",
+        "microsoft.win32.systemevents.5.0.0.nupkg.sha512",
+        "microsoft.win32.systemevents.nuspec",
+        "ref/net461/Microsoft.Win32.SystemEvents.dll",
+        "ref/net461/Microsoft.Win32.SystemEvents.xml",
+        "ref/netstandard2.0/Microsoft.Win32.SystemEvents.dll",
+        "ref/netstandard2.0/Microsoft.Win32.SystemEvents.xml",
+        "runtimes/win/lib/netcoreapp2.0/Microsoft.Win32.SystemEvents.dll",
+        "runtimes/win/lib/netcoreapp2.0/Microsoft.Win32.SystemEvents.xml",
+        "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll",
+        "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.xml",
+        "useSharedDesignerContext.txt",
+        "version.txt"
+      ]
+    },
+    "System.Drawing.Common/5.0.2": {
+      "sha512": "rvr/M1WPf24ljpvvrVd74+NdjRUJu1bBkspkZcnzSZnmAUQWSvanlQ0k/hVHk+cHufZbZfu7vOh/vYc0q5Uu/A==",
+      "type": "package",
+      "path": "system.drawing.common/5.0.2",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "THIRD-PARTY-NOTICES.TXT",
+        "lib/MonoAndroid10/_._",
+        "lib/MonoTouch10/_._",
+        "lib/net461/System.Drawing.Common.dll",
+        "lib/netcoreapp3.0/System.Drawing.Common.dll",
+        "lib/netcoreapp3.0/System.Drawing.Common.xml",
+        "lib/netstandard2.0/System.Drawing.Common.dll",
+        "lib/xamarinios10/_._",
+        "lib/xamarinmac20/_._",
+        "lib/xamarintvos10/_._",
+        "lib/xamarinwatchos10/_._",
+        "ref/MonoAndroid10/_._",
+        "ref/MonoTouch10/_._",
+        "ref/net461/System.Drawing.Common.dll",
+        "ref/netcoreapp3.0/System.Drawing.Common.dll",
+        "ref/netcoreapp3.0/System.Drawing.Common.xml",
+        "ref/netstandard2.0/System.Drawing.Common.dll",
+        "ref/xamarinios10/_._",
+        "ref/xamarinmac20/_._",
+        "ref/xamarintvos10/_._",
+        "ref/xamarinwatchos10/_._",
+        "runtimes/unix/lib/netcoreapp2.0/System.Drawing.Common.dll",
+        "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll",
+        "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.xml",
+        "runtimes/win/lib/netcoreapp2.0/System.Drawing.Common.dll",
+        "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll",
+        "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.xml",
+        "system.drawing.common.5.0.2.nupkg.sha512",
+        "system.drawing.common.nuspec",
+        "useSharedDesignerContext.txt",
+        "version.txt"
+      ]
+    }
+  },
+  "projectFileDependencyGroups": {
+    "net5.0": [
+      "System.Drawing.Common >= 5.0.2"
+    ]
+  },
+  "packageFolders": {
+    "C:\\Users\\Daemon\\.nuget\\packages\\": {},
+    "D:\\Instalace\\VS\\Shared\\NuGetPackages": {}
+  },
+  "project": {
+    "version": "1.0.0",
+    "restore": {
+      "projectUniqueName": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+      "projectName": "TextureEditing",
+      "projectPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+      "packagesPath": "C:\\Users\\Daemon\\.nuget\\packages\\",
+      "outputPath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\obj\\",
+      "projectStyle": "PackageReference",
+      "fallbackFolders": [
+        "D:\\Instalace\\VS\\Shared\\NuGetPackages"
+      ],
+      "configFilePaths": [
+        "C:\\Users\\Daemon\\AppData\\Roaming\\NuGet\\NuGet.Config",
+        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+      ],
+      "originalTargetFrameworks": [
+        "net5.0"
+      ],
+      "sources": {
+        "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+        "https://api.nuget.org/v3/index.json": {}
+      },
+      "frameworks": {
+        "net5.0": {
+          "targetAlias": "net5.0",
+          "projectReferences": {}
+        }
+      },
+      "warningProperties": {
+        "warnAsError": [
+          "NU1605"
+        ]
+      }
+    },
+    "frameworks": {
+      "net5.0": {
+        "targetAlias": "net5.0",
+        "dependencies": {
+          "System.Drawing.Common": {
+            "target": "Package",
+            "version": "[5.0.2, )"
+          }
+        },
+        "imports": [
+          "net461",
+          "net462",
+          "net47",
+          "net471",
+          "net472",
+          "net48"
+        ],
+        "assetTargetFallback": true,
+        "warn": true,
+        "frameworkReferences": {
+          "Microsoft.NETCore.App": {
+            "privateAssets": "all"
+          }
+        },
+        "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\5.0.201\\RuntimeIdentifierGraph.json"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/TextureEditing/obj/project.nuget.cache b/TextureEditing/obj/project.nuget.cache
new file mode 100644
index 0000000000000000000000000000000000000000..4d4aecee8d26b42a8e6c0f09679e523f41936607
--- /dev/null
+++ b/TextureEditing/obj/project.nuget.cache
@@ -0,0 +1,12 @@
+{
+  "version": 2,
+  "dgSpecHash": "PbHx0EN0q80PFjgXOEN544QPt8IiL8YyGrk5uz82rCO8saJ6wJprm+/TdpnxpbYhQxQqVduh+VA4aD37VGgsBQ==",
+  "success": true,
+  "projectFilePath": "D:\\moje\\school\\04\\aswi\\sem\\open data\\Develop\\aswi2021tri-musketyri\\aswi2021tri-musketyri\\TextureEditing\\TextureEditing.csproj",
+  "expectedPackageFiles": [
+    "C:\\Users\\Daemon\\.nuget\\packages\\microsoft.netcore.platforms\\5.0.0\\microsoft.netcore.platforms.5.0.0.nupkg.sha512",
+    "C:\\Users\\Daemon\\.nuget\\packages\\microsoft.win32.systemevents\\5.0.0\\microsoft.win32.systemevents.5.0.0.nupkg.sha512",
+    "C:\\Users\\Daemon\\.nuget\\packages\\system.drawing.common\\5.0.2\\system.drawing.common.5.0.2.nupkg.sha512"
+  ],
+  "logs": []
+}
\ No newline at end of file