514 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			514 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections.Generic; | |||
|  | using System.ComponentModel; | |||
|  | using System.Data; | |||
|  | using System.Drawing; | |||
|  | using System.Text; | |||
|  | using System.Linq; | |||
|  | using System.Windows.Forms; | |||
|  | using DevExpress.XtraBars; | |||
|  | using DevExpress.XtraBars.Ribbon; | |||
|  | //using DeiNiu.wms.win.utils; | |||
|  | using DevExpress.XtraEditors; | |||
|  | using DevExpress.XtraEditors.Controls;  | |||
|  | using DevExpress.XtraGrid.Views.Grid; | |||
|  | using DeiNiu.Utils; | |||
|  | using System.Data.OleDb; | |||
|  | using DeiNiu.wms.win.utils; | |||
|  | using System.Configuration; | |||
|  | using System.Security.Cryptography; | |||
|  |   | |||
|  |   | |||
|  | 
 | |||
|  | namespace DeiNiu.wms.win | |||
|  | { | |||
|  |     public partial class BasicRibbonForm : DevExpress.XtraBars.Ribbon.RibbonForm | |||
|  |     { | |||
|  |             public BasicRibbonForm() | |||
|  |             { | |||
|  |                 InitializeComponent(); | |||
|  |            | |||
|  |             } | |||
|  |           | |||
|  | 
 | |||
|  |             protected void showWaitForm(string desc=null) | |||
|  |         {  | |||
|  |             if (this.splashScreenManager1.IsSplashFormVisible) | |||
|  |             { | |||
|  |                 return; | |||
|  |             } | |||
|  |             closeWaitForm(); | |||
|  |             try | |||
|  |             { | |||
|  |                 this.splashScreenManager1.ShowWaitForm(); | |||
|  |             } | |||
|  |             catch { } | |||
|  | 
 | |||
|  |             | |||
|  |            if (!string.IsNullOrEmpty(desc)) | |||
|  |            { | |||
|  |                splashScreenManager1.SetWaitFormDescription(desc); | |||
|  |            } | |||
|  |           //  WaitFormService.Show(this); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected void closeWaitForm() | |||
|  |         {  | |||
|  |             if (!this.splashScreenManager1.IsSplashFormVisible) | |||
|  |             { | |||
|  |                 return; | |||
|  |             } | |||
|  |             try | |||
|  |             { | |||
|  |                 this.splashScreenManager1.CloseWaitForm(); | |||
|  |             } | |||
|  |             catch { } | |||
|  |            // WaitFormService.Close(); | |||
|  |         } | |||
|  |       protected  struct Colitem | |||
|  |         { | |||
|  |           public  int key ; | |||
|  |           public string value  ; | |||
|  | 
 | |||
|  |           public override string ToString() | |||
|  |           { | |||
|  |               return value; | |||
|  |           } | |||
|  |         } | |||
|  | 
 | |||
|  |       protected void initialComboBoxe(ComboBoxEdit combo, Dictionary<int, string> dic, bool isForQuery = true) | |||
|  |       { | |||
|  |           combo.Properties.TextEditStyle = TextEditStyles.DisableTextEditor; | |||
|  |           combo.Properties.Items.Clear(); | |||
|  |           ComboBoxItemCollection col = combo.Properties.Items;  | |||
|  |           col.BeginUpdate(); | |||
|  |           if (isForQuery) | |||
|  |           { | |||
|  |               col.Add("全部"); | |||
|  |           } | |||
|  |           try | |||
|  |           { | |||
|  |               foreach (int key in dic.Keys) | |||
|  |               { | |||
|  | 
 | |||
|  |                   Colitem c = new Colitem(); | |||
|  |                   c.key = key; | |||
|  |                   c.value = dic[key]; | |||
|  |                   col.Add(c);  | |||
|  | 
 | |||
|  |               } | |||
|  |           } | |||
|  |           finally | |||
|  |           { | |||
|  |               col.EndUpdate(); | |||
|  |           } | |||
|  | 
 | |||
|  |           combo.SelectedIndex = 0; | |||
|  |       } | |||
|  | 
 | |||
|  | 
 | |||
|  |         protected void initialComboBoxe(ComboBoxEdit combo, DataRow[] drss,bool isForQuery =true) | |||
|  |         { | |||
|  |               | |||
|  |         } | |||
|  | 
 | |||
|  |         protected void showErrorMsg(string message) | |||
|  |         { | |||
|  |             closeWaitForm(); | |||
|  |            /* if ( message.Equals(WmsConstants.WCF_UN_AUTH_MESSAGE)) | |||
|  |             { | |||
|  |                if (this.ParentForm != null){ | |||
|  |                   ((main)this.ParentForm).showLogin(); | |||
|  |                } | |||
|  |                else if (this is main) | |||
|  |                { | |||
|  |                    ((main)this).showLogin(); | |||
|  |                } | |||
|  |                 return; | |||
|  |             }*/ | |||
|  | 
 | |||
|  |             MessageBox.Show(message, "出错了", MessageBoxButtons.OK, MessageBoxIcon.Error); | |||
|  |         } | |||
|  | 
 | |||
|  |         protected void setupGridView(GridView gridview, bool canMultiSelect,bool showGroupPannel = true,bool canFocus = true) | |||
|  |         { | |||
|  |             gridview.OptionsView.EnableAppearanceEvenRow = true;  //偶数行颜色变化 | |||
|  |             gridview.OptionsView.EnableAppearanceOddRow = false;  //奇数行颜色变化 | |||
|  |             gridview.OptionsSelection.MultiSelect = canMultiSelect;// true;// canMultiSelect; //多选模式下,可以高亮选中cell | |||
|  |             gridview.OptionsView.ShowGroupPanel =   showGroupPannel; | |||
|  |             gridview.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.False; | |||
|  |             gridview.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CellSelect; | |||
|  |             gridview.OptionsBehavior.Editable = false; | |||
|  |             gridview.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.CellFocus;  | |||
|  |             gridview.OptionsSelection.EnableAppearanceHideSelection = false; | |||
|  |          //   gridview.OptionsSelection.EnableAppearanceFocusedCell = canFocus; | |||
|  |          //   gridview.OptionsSelection.EnableAppearanceFocusedRow = canFocus; | |||
|  |           //  gridview.OptionsSelection.EnableAppearanceHideSelection = true; | |||
|  |         } | |||
|  |         //private void GridView_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) | |||
|  |         //{ | |||
|  |         //    if (e.Control & e.KeyCode == Keys.C) | |||
|  |         //    { | |||
|  |         //        Clipboard.SetDataObject(AdvBandedGridView1.GetFocusedRowCellValue(AdvBandedGridView1.FocusedColumn)); | |||
|  |         //        e.Handled = true; | |||
|  |         //    } | |||
|  |         //} | |||
|  |         //显示行的序号     | |||
|  |         protected void gridView_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e) | |||
|  |         { | |||
|  |             if (e.Info.IsRowIndicator && e.RowHandle >= 0) | |||
|  |             { | |||
|  |                 e.Info.DisplayText = (e.RowHandle + 1).ToString(); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         protected void debug(string msg) | |||
|  |         { | |||
|  | 
 | |||
|  |             DeiNiu.Utils.LogHelper.debug(this.GetType(), msg); | |||
|  |         } | |||
|  |      | |||
|  |         /// <summary> | |||
|  |         /// 获取GridView过滤或排序后的数据集   | |||
|  |         /// </summary> | |||
|  |         /// <param name="view"></param> | |||
|  |         /// <returns></returns> | |||
|  |         public System.Collections.IList GetGridViewFilteredAndSortedData(DevExpress.XtraGrid.Views.Grid.GridView view)   | |||
|  |          {   | |||
|  |              return view.DataController.GetAllFilteredAndSortedRows();              | |||
|  |          } | |||
|  | 
 | |||
|  | 
 | |||
|  |         protected void gridview_LostFocus(object sender, EventArgs e) | |||
|  |         { | |||
|  | 
 | |||
|  |             switchGridViewRowSelection((GridView)sender, false); | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         protected void switchGridViewRowSelection(GridView gridView, bool isOn) | |||
|  |         { | |||
|  |             // gridView.OptionsSelection.EnableAppearanceFocusedCell = isOn; | |||
|  |             gridView.OptionsSelection.EnableAppearanceFocusedRow = isOn; | |||
|  |             gridView.OptionsSelection.EnableAppearanceHideSelection = !isOn; | |||
|  | 
 | |||
|  |         } | |||
|  |         protected void gridview_GotFocus(object sender, EventArgs e) | |||
|  |         { | |||
|  |             switchGridViewRowSelection((GridView)sender, true); | |||
|  |         } | |||
|  |           | |||
|  | 
 | |||
|  |         protected void showLogin() | |||
|  |         { | |||
|  |             | |||
|  |            // createMenus(); | |||
|  |         } | |||
|  |         protected bool checkPermission(string permision) | |||
|  |         { | |||
|  |           | |||
|  |             return false; | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         protected string filtRiskChar(string str) //过滤非法字符 | |||
|  |         { | |||
|  |             string s = ""; | |||
|  | 
 | |||
|  |             s = str.Replace("'", " "); | |||
|  |             s = s.Replace(";", " "); | |||
|  |             s = s.Replace("1=1", " "); | |||
|  |             s = s.Replace("|", " "); | |||
|  |             s = s.Replace("<", " "); | |||
|  |             s = s.Replace(">", " "); | |||
|  |             s = s.Replace("#", " "); | |||
|  |             s = s.Replace("insert", " "); | |||
|  |             s = s.Replace("update", " "); | |||
|  |             s = s.Replace("delete", " "); | |||
|  |             s = s.Replace("drop", " "); | |||
|  |             s = s.Replace("truncate", " "); | |||
|  |             s = s.Replace("alter", " "); | |||
|  |             s = s.Replace("create", " ");  | |||
|  |             return s; | |||
|  | 
 | |||
|  |         } | |||
|  |         protected void showInfoMsg(string message) | |||
|  |         { | |||
|  |             closeWaitForm(); | |||
|  | 
 | |||
|  |             MessageBox.Show(message, "通知", MessageBoxButtons.OK, MessageBoxIcon.Information); | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         string strTitle = "报表"; | |||
|  |         DataSet ExcelDS = new DataSet(); | |||
|  |         DataSet lblSelectDs = new DataSet(); | |||
|  | 
 | |||
|  |         // <summary> | |||
|  |         /// 导出按钮 | |||
|  |         /// </summary> | |||
|  |         /// <param name="sender"></param> | |||
|  |         /// <param name="e"></param> | |||
|  |         protected void exportExcel(string title ,GridView gvSelectedItems) | |||
|  |         { | |||
|  |             string strName = ""; | |||
|  |             try | |||
|  |             { | |||
|  |                 if (gvSelectedItems.RowCount == 0) | |||
|  |                 { | |||
|  |                     showErrorMsg("Grid表格中没有数据,不能导出为Excel"); | |||
|  |                     return; | |||
|  |                 } | |||
|  |                 DateTime MMSDate = DateTime.Now; | |||
|  |                 using (SaveFileDialog saveFileDialog = new SaveFileDialog()) | |||
|  |                 { | |||
|  |                     saveFileDialog.Filter = "导出Excel(*.xls)|*.xls"; | |||
|  |                     saveFileDialog.FilterIndex = 0; | |||
|  |                     saveFileDialog.RestoreDirectory = true; | |||
|  |                     saveFileDialog.CreatePrompt = true; | |||
|  |                     saveFileDialog.Title = "导出文件保存路径"; | |||
|  |                     //默认的文件名 | |||
|  |                     saveFileDialog.FileName = title + " - " + MMSDate.ToString("yyyyMMdd"); | |||
|  |                     //saveFileDialog.ShowDialog(); | |||
|  |                     if (saveFileDialog.ShowDialog() == DialogResult.OK) | |||
|  |                     { | |||
|  |                         strName = saveFileDialog.FileName; | |||
|  |                         if (strName.Length != 0) | |||
|  |                         { | |||
|  |                             // gridColumn2.Visible = false; | |||
|  |                             //  gridItemID2.Visible = true; | |||
|  |                             //  gridItemID2.VisibleIndex = 0; | |||
|  |                             gvSelectedItems.ExportToXls(strName); | |||
|  |                             // gridColumn2.Visible = true; | |||
|  |                             //  gridItemID2.Visible = false; | |||
|  |                             showInfoMsg("导出Excel成功"); | |||
|  |                             //关闭操作 | |||
|  |                             System.Reflection.Missing miss = System.Reflection.Missing.Value; | |||
|  |                             Microsoft.Office.Interop.Excel.Application objExcel = new Microsoft.Office.Interop.Excel.Application(); | |||
|  |                             Microsoft.Office.Interop.Excel.Workbook objWorkBook = objExcel.Workbooks.Add(miss); | |||
|  |                             Microsoft.Office.Interop.Excel.Worksheet objSheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkBook.ActiveSheet; | |||
|  |                             objWorkBook.Close(null, null, null); | |||
|  |                             objExcel.Workbooks.Close(); | |||
|  |                             objExcel.Quit(); | |||
|  |                             System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel); | |||
|  |                             System.Runtime.InteropServices.Marshal.ReleaseComObject(objWorkBook); | |||
|  |                             System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet); | |||
|  |                             objSheet = null; | |||
|  |                             objWorkBook = null; | |||
|  |                             objExcel = null; | |||
|  |                         } | |||
|  |                         else | |||
|  |                         { | |||
|  |                             showErrorMsg("保存的Excel名称不能为空"); | |||
|  |                         } | |||
|  | 
 | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             catch (System.Exception msg) | |||
|  |             { | |||
|  |                 showErrorMsg(msg.ToString()); | |||
|  |             } | |||
|  |             finally | |||
|  |             { | |||
|  |                 GC.Collect(); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |         //导入Excel | |||
|  |         /// <summary> | |||
|  |         /// 导入按钮 | |||
|  |         /// </summary> | |||
|  |         /// <param name="sender"></param> | |||
|  |         /// <param name="e"></param> | |||
|  |         protected void importExcel( ) | |||
|  |         { | |||
|  |             try | |||
|  |             { | |||
|  |                 showWaitForm(); | |||
|  |                 OpenFileDialog ofd = new OpenFileDialog(); | |||
|  |                 ofd.Title = "Excel文件"; | |||
|  |                 ofd.FileName = ""; | |||
|  |                 ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); | |||
|  |                 ofd.Filter = "Excel文件(*.xls)|*.xls"; | |||
|  |                 ofd.ValidateNames = true; //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名 | |||
|  |                 ofd.CheckFileExists = true; //验证路径有效性 | |||
|  |                 ofd.CheckPathExists = true; //验证文件有效性 | |||
|  |                 string strName = string.Empty; | |||
|  |                 if (ofd.ShowDialog() == DialogResult.OK) | |||
|  |                 { | |||
|  |                     strName = ofd.FileName; | |||
|  |                 } | |||
|  |                 if (strName == "") | |||
|  |                 { | |||
|  |                     return; | |||
|  |                 } | |||
|  |                 if (ReadExcel(strName )) | |||
|  |                 { | |||
|  |                     showInfoMsg("数据导入结束"); | |||
|  |                     //isChanged = true; | |||
|  |                 } | |||
|  |                 else | |||
|  |                     showErrorMsg("数据导入失败,请检查导入的Excel格式与数据是否正确"); | |||
|  |                 this.Cursor = Cursors.Default; | |||
|  | 
 | |||
|  | 
 | |||
|  |             } | |||
|  |             catch (System.Exception Msg) | |||
|  |             { | |||
|  |                 showErrorMsg("数据导入失败,请检查导入的Excel格式与数据是否正确"); | |||
|  |                 //MessageBoxShow.ShowErrMessage(Msg.ToString()+"数据导入失败,请检查导入的Excel格式与数据是否正确"); | |||
|  |             } | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// Excel数据导入方法 | |||
|  |         /// </summary> | |||
|  |         /// <param name="filePath"></param> | |||
|  |         /// <param name="dgv"></param> | |||
|  |         /// <returns></returns> | |||
|  |         public bool ReadExcel(string filePath ) | |||
|  |         { | |||
|  |             bool isVailed = false; | |||
|  |             | |||
|  |             //根据路径打开一个Excel文件并将数据填充到ds中 | |||
|  |             try | |||
|  |             { | |||
|  |                 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + filePath + ";Extended Properties ='Excel 8.0;HDR=YES;IMEX=1'"; | |||
|  |                 OleDbConnection conn = new OleDbConnection(strConn); | |||
|  |                 conn.Open(); | |||
|  |                 string strExcel = ""; | |||
|  |                 OleDbDataAdapter myCommand = null; | |||
|  |                 //获取Excel中的sheet的名称 | |||
|  |                 string SheetName = GetExcelSheetNames(filePath)[0]; | |||
|  |                 //strExcel = "select * from [sheet1$]"; | |||
|  |                 strExcel = "select * from [" + SheetName + "$]"; | |||
|  |                 myCommand = new OleDbDataAdapter(strExcel, strConn); | |||
|  |                 // RealSailing.DataSet.SlipInfo.SLPD010_SLIPSUMHDS ds = new RealSailing.DataSet.SlipInfo.SLPD010_SLIPSUMHDS(); | |||
|  |                 System.Data.DataSet ds = new System.Data.DataSet(); | |||
|  |                 myCommand.Fill(ds, "table1"); | |||
|  |                 conn.Close(); | |||
|  |                 if (ds.Tables["table1"].Rows.Count == 0) | |||
|  |                 { | |||
|  |                     showErrorMsg("要导入的Excel没有数据"); | |||
|  |                 } | |||
|  |                 ExcelDS.Clear(); | |||
|  |                 showWaitForm(); | |||
|  |                 clearOldData(); | |||
|  |                 int testK = 0; | |||
|  |                 for (int j = 0; j < ds.Tables["table1"].Rows.Count; j++) | |||
|  |                 { | |||
|  |                     testK++; | |||
|  |                     //把数据填充到ds中 | |||
|  |                     try | |||
|  |                     { | |||
|  |                         FillDataToDs(ds.Tables["table1"].Rows[j]); | |||
|  |                         isVailed = true; | |||
|  |                     } | |||
|  |                     catch (Exception e) | |||
|  |                     { | |||
|  |                         showErrorMsg(e.Message); | |||
|  |                         MessageBoxButtons messButton = MessageBoxButtons.OKCancel; | |||
|  |                         DialogResult dr = | |||
|  |                             MessageBox.Show("导入数据发生错误,是否继续?", "发生错误", messButton); | |||
|  |                         if (dr == DialogResult.OK) | |||
|  |                         { | |||
|  |                           continue; | |||
|  |                         } | |||
|  |                         else | |||
|  |                         { | |||
|  |                              break;  | |||
|  |                         } | |||
|  |                        | |||
|  |                     } | |||
|  |                 } | |||
|  |                 closeWaitForm(); | |||
|  | 
 | |||
|  |             } | |||
|  |             catch (System.Data.OleDb.OleDbException ex) | |||
|  |             { | |||
|  |                 showErrorMsg(ex.Message); | |||
|  |                 if (ex.Message.IndexOf("不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长") != -1) | |||
|  |                 { | |||
|  |                     return false; | |||
|  |                 } | |||
|  |                 return false; | |||
|  |             } | |||
|  |             return true; | |||
|  |         } | |||
|  | 
 | |||
|  |         protected virtual void clearOldData() | |||
|  |         { | |||
|  |              | |||
|  |         } | |||
|  |         /// <summary> | |||
|  |         /// 获取获得当前你选择的Excel Sheet的所有名字 | |||
|  |         /// </summary> | |||
|  |         /// <param name="filePath"></param> | |||
|  |         /// <returns></returns> | |||
|  |         public static string[] GetExcelSheetNames(string filePath) | |||
|  |         { | |||
|  |             Microsoft.Office.Interop.Excel.ApplicationClass excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); | |||
|  |             Microsoft.Office.Interop.Excel.Workbooks wbs = excelApp.Workbooks; | |||
|  |             Microsoft.Office.Interop.Excel.Workbook wb = wbs.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, | |||
|  |             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, | |||
|  |             Type.Missing, Type.Missing, Type.Missing, Type.Missing); | |||
|  |             int count = wb.Worksheets.Count; | |||
|  |             string[] names = new string[count]; | |||
|  |             for (int i = 1; i <= count; i++) | |||
|  |             { | |||
|  |                 names[i - 1] = ((Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[i]).Name; | |||
|  |             } | |||
|  |             wb.Close(null, null, null); | |||
|  |             excelApp.Quit(); | |||
|  |             wbs.Close(); | |||
|  |             System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); | |||
|  |             System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); | |||
|  |             System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs); | |||
|  |             excelApp = null; | |||
|  |             wbs = null; | |||
|  |             wb = null; | |||
|  |             return names; | |||
|  |         } | |||
|  | 
 | |||
|  |       /// <summary> | |||
|  |       /// 处理具体数据 | |||
|  |       /// 将在各子form重写逻辑 | |||
|  |       /// </summary> | |||
|  |       /// <param name="dr"></param> | |||
|  |         protected virtual void FillDataToDs(DataRow dr) //string itemid, string itemplu, string itemName) | |||
|  |         { | |||
|  |              | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         //导入导出Excel 注意的是及时的关闭Excel,不然占用进程很麻烦,我调试了大半天太弄好的 | |||
|  | 
 | |||
|  |         /// <summary>   | |||
|  |         /// 写入配置信息   | |||
|  |         /// </summary>   | |||
|  |         protected void WriteConfig(string key, string value) | |||
|  |         { | |||
|  |             //ShowText("正在写入配置文件!请稍等...."); | |||
|  | 
 | |||
|  |             string appConfigPath = Application.StartupPath + "\\" + Application.ProductName + ".exe"; | |||
|  | 
 | |||
|  | 
 | |||
|  |             ConfigurationOperator co = new ConfigurationOperator(appConfigPath, ConfigType.ExeConfig); | |||
|  | 
 | |||
|  |             co.AddAppSetting(key, value); | |||
|  |   | |||
|  | 
 | |||
|  |             co.Save(); | |||
|  |         } | |||
|  | 
 | |||
|  |        protected string Encrypt(string password) | |||
|  |         { | |||
|  |             Byte[] clearBytes = new UnicodeEncoding().GetBytes(password); | |||
|  |             Byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes); | |||
|  |             return BitConverter.ToString(hashedBytes); | |||
|  |         } | |||
|  |     } | |||
|  | } |