/// <param name="xslTemplateFileNames">The XSL templates.</param>
		/// <param name="srcFolder">The SRC folder.</param>
		/// <param name="cryptoProcessor">The crypto processor.</param>
		private void ProcessXslTemplateFiles(IEnumerable<string> xslTemplateFileNames, string srcFolder, CryptoProcessor cryptoProcessor)
		{
			var languageFolders = GetReportLanguages().ToArray();
			var systemSettings = SystemSettingsInfo.LoadFrom(Settings.SystemSettingsFile);

			this._logger.WriteToLog(
				"start modules processing...."
			);

			foreach (var fileName in xslTemplateFileNames)
			{
				try
				{
					this._logger.WriteToLog(
						"Start module file name processing. File:'{0}'",
						fileName
					);

					foreach (var localeFolder in languageFolders)
					{
						var srcFileName = Path.Combine(
							srcFolder,
							"Templates",
							localeFolder,
							fileName
						);

						if (!File.Exists(srcFileName))
						{
							this._logger.WriteToLog(
								"ERROR: Module not found. File name: '{0}'",
								srcFileName
							);

							continue;
						}

						string dstFileName = Path.Combine(
							this._settings.DstFolderFull
							+ @"\"
							+ systemSettings.TemplateDirectory
							+ @"\",
							"Templates",
							localeFolder,
							fileName
						);

						this.SureCopy(srcFileName, dstFileName);

						new XSLPreparator(new KeyValuePair<string, string>(dstFileName, localeFolder), this._logger)
							.Prepare(this._settings.AdditionalTemplates);

						if (AppVersionHelper.IsNotDebug())
						{
							var doc = new XmlDocument();

							doc.Load(dstFileName);

							this._logger.WriteToLog(
								"EncryptXmlDocument: file name: '{0}'",
								dstFileName
							);

							cryptoProcessor.EncryptXmlDocument(doc);

							doc.Save(dstFileName);
						}
					}
				}
				catch (Exception e)
				{
					this._logger.WriteToLog(
						"ERROR: Module has not been processed. File:'{0}';Error:'{1}'",
						fileName,
						e.Message
					);
				}
			}

			this._logger.WriteToLog(
				"Modules processing is completed."
			);
		}
		/// <summary>
		/// Save queries to encoded file
		/// </summary>
		/// <param name="fileName">Xml-file name</param>
		/// <param name="queries">Collection of queries</param>
		/// <param name="cryptoProcessor">Encoder</param>
		public static void SaveToXml(string fileName, List<QueryInfo> queries, CryptoProcessor cryptoProcessor)
		{
			XmlDocument doc = new XmlDocument();

			SaveToXml(fileName, queries);

			doc.PreserveWhitespace = true;

			doc.Load(fileName);

			cryptoProcessor.EncryptXmlDocument(doc);

			doc.Save(fileName);
		}
		private void ProcessTreeNodeTemplateFiles(
			IEnumerable<string>                  treeNodeTemplateFileNames,
			out List<string>                     xslTemplateFiles,
			out Dictionary<string, List<string>> queriesInQueryFiles,
			CryptoProcessor                      cryptoProcessor
		)
		{
			xslTemplateFiles = new List<string>();
			queriesInQueryFiles = new Dictionary<string, List<string>>();
			var systemSettings = SystemSettingsInfo.LoadFrom(Settings.SystemSettingsFile);

			foreach (string templateFileName in treeNodeTemplateFileNames)
			{
				string fullTemplateFileName = Path.GetFullPath(templateFileName);

				if (File.Exists(fullTemplateFileName))
				{
					string dstTemplateFileName = Path.Combine(
						this._settings.DstFolderFull
						+ @"\"
						+ systemSettings.TemplateDirectory
						+ @"\",
						Path.GetFileName(templateFileName)
					);

					this.SureCopy(fullTemplateFileName, dstTemplateFileName);

					XmlDocument doc = new XmlDocument();

					doc.Load(dstTemplateFileName);

					string        startupTemplateId          = null;
					Stack<string> startupTemplateInfoIdStack = null;
					var           rootNode                   = TemplateNodesLoader.LoadFromXml(null, doc, out startupTemplateId, out startupTemplateInfoIdStack);
					var           allNodesInTemplate         = ToPlainList(rootNode);

					foreach (TemplateNodeInfo node in allNodesInTemplate)
					{
						//foreach (TemplateNodeLocaleInfo locale in
						//        node.Locales.Where(l => !string.IsNullOrEmpty(l.TemplateFile)))
						//{
						//    if (!xslTemplates.ContainsKey(locale.TemplateFile))
						//    {
						//        xslTemplates.Add(locale.TemplateFile, locale.Language);
						//    }
						//}

						if (!string.IsNullOrWhiteSpace(node.XslTemplateFileName) && !xslTemplateFiles.Contains(node.XslTemplateFileName))
						{
							xslTemplateFiles.Add(node.XslTemplateFileName);
						}

						var allQueries = node.Queries.Union(node.GroupQueries);

						foreach (TemplateNodeQueryInfo query in allQueries)
						{
							if (!queriesInQueryFiles.ContainsKey(query.QueryFileName))
							{
								queriesInQueryFiles.Add(query.QueryFileName, new List<string>());
							}

							if (!queriesInQueryFiles[query.QueryFileName].Contains(query.QueryName))
							{
								queriesInQueryFiles[query.QueryFileName].Add(query.QueryName);
							}
						}

						foreach (TemplateNodeQueryInfo query in node.ConnectionQueries)
						{
							if (!queriesInQueryFiles.ContainsKey(query.QueryFileName))
							{
								queriesInQueryFiles.Add(query.QueryFileName, new List<string>());
							}

							if (!queriesInQueryFiles[query.QueryFileName].Contains(query.QueryName))
							{
								queriesInQueryFiles[query.QueryFileName].Add(query.QueryName);
							}
						}
					}

					if (AppVersionHelper.IsNotDebug())
					{
						cryptoProcessor.EncryptXmlDocument(doc);

						doc.Save(dstTemplateFileName);
					}
				}
				else
				{
					this._logger.WriteToLog(this.GetText("TemplateTreeFileNotFound") + templateFileName);
				}
			}
		}