public WF_DETAIL GetWfAppLastDetailByWfaID(string wfaID) { WF_DETAIL detail = null; StringBuilder stb = new StringBuilder(); stb.Append(" WHERE 1=1 AND WFA_ID='" + wfaID + "'"); stb.Append(" AND RECIVEDATE IN (SELECT MAX(RECIVEDATE) FROM WF_DETAIL WHERE WFA_ID='" + wfaID + "') "); DataTable dt = CommonFuns.getDataTableBySql("*", stb.ToString(), "WF_DETAIL"); if (dt == null || dt.Rows.Count == 0) { return(null); } else { detail = new WF_DETAIL(); DataRow dr = dt.Rows[0]; detail.WFA_ID = dt.Rows[0]["WFA_ID"].ToString(); detail.WFD_ID = dt.Rows[0]["WFD_ID"].ToString(); detail.WFT_STEP_ID = dt.Rows[0]["WFT_STEP_ID"].ToString(); detail.RECIVEDATE = dt.Rows[0]["RECIVEDATE"].ToString(); detail.MSG = dt.Rows[0]["MSG"].ToString(); detail.IS_Through = dt.Rows[0]["IS_Through"].ToString(); detail.Current_STEP_ID = dt.Rows[0]["Current_STEP_ID"].ToString(); return(detail); } }
/// <summary> /// 获取工作流实例的的当前处理节点 /// </summary> /// <param name="wfaID"></param> /// <returns></returns> public WF_DETAIL GetWfAppWipDetailByWfaID(string wfaID) { WF_DETAIL detail = null; StringBuilder stb = new StringBuilder(); stb.Append(" WHERE WFA_ID='" + wfaID + "'"); stb.Append("AND (COMPLEMENTDATE='' or COMPLEMENTDATE is null)"); stb.Append("AND IS_Through<>'Y'"); DataTable dt = CommonFuns.getDataTableBySql("*", stb.ToString(), "WF_DETAIL"); if (dt == null || dt.Rows.Count == 0) { return(null); } else { detail = new WF_DETAIL(); DataRow dr = dt.Rows[0]; detail.WFA_ID = dt.Rows[0]["WFA_ID"].ToString(); detail.WFD_ID = dt.Rows[0]["WFD_ID"].ToString(); detail.WFT_STEP_ID = dt.Rows[0]["WFT_STEP_ID"].ToString(); detail.RECIVEDATE = dt.Rows[0]["RECIVEDATE"].ToString(); detail.MSG = dt.Rows[0]["MSG"].ToString(); detail.IS_Through = dt.Rows[0]["IS_Through"].ToString(); detail.Current_STEP_ID = dt.Rows[0]["Current_STEP_ID"].ToString(); return(detail); } }
private void RefreshNextStepNode() { this.combThroughNext.DataSource = CommonFuns.getDataTableBySql("COMBTEXT,COMBVALUE", "WHERE COMBTYPE ='WorkFlowStep' AND COMBID NOT IN (SELECT WFT_CURRENT_STEP_ID FROM WF_TEMPLATES_STEP WHERE DEL_FLAG='N' AND WFT_ID IN (SELECT WFT_ID FROM WF_TEMPLATES WHERE WFT_NAME='" + this.txtWFName.Text.ToString() + "' AND DEL_FLAG='N'))", "ComboBoxValue"); combThroughNext.DisplayMember = "COMBTEXT"; combThroughNext.ValueMember = "COMBVALUE"; combThroughNext.SelectedIndex = -1; this.combCurrentStep.DataSource = CommonFuns.getDataTableBySql("COMBTEXT,COMBVALUE", "WHERE COMBTYPE ='WorkFlowStep' AND COMBID NOT IN (SELECT WFT_CURRENT_STEP_ID FROM WF_TEMPLATES_STEP WHERE DEL_FLAG='N' AND WFT_ID IN (SELECT WFT_ID FROM WF_TEMPLATES WHERE WFT_NAME='" + this.txtWFName.Text.ToString() + "' AND DEL_FLAG='N'))", "ComboBoxValue"); combCurrentStep.DisplayMember = "COMBTEXT"; combCurrentStep.ValueMember = "COMBVALUE"; combCurrentStep.SelectedValue = currentWFStep; }
/// <summary> /// 获取对象的工作流实例 /// </summary> /// <param name="p_ObjectId">对象主键</param> /// <param name="p_ObjectType">对象类型</param> /// <returns></returns> public DataTable GetObjectWFList(string p_ObjectId, string p_ObjectType) { StringBuilder selectWhere = new StringBuilder(); String selectColunm = " A.WFA_ID,A.OBJECTKEY,B.WFT_NAME,A.SUBJECT,A.STATUS, A.CREATEUSER ,A.WFT_ID"; String selectTable = "WF_APP A,WF_TEMPLATES B "; selectWhere.Append("WHERE A.WFT_ID= B.WFT_ID AND OBJECTKEY='").Append(p_ObjectId) .Append("' AND RELATIONOBJECTTYPE ='").Append(p_ObjectType) .Append("'"); DataTable dt = CommonFuns.getDataTableBySql(selectColunm, selectWhere.ToString(), selectTable); return(dt); }
/// <summary> /// 获取设定流程对象的title名称 /// </summary> /// <param name="relationObjectType">RelationObjectType</param> /// <returns></returns> public static string GetObjectTitle(DataType.RelationObjectType relationObjectType, string objectKey) { string tableName = DataType.GetTableName(relationObjectType); string objectTitle = ""; switch (relationObjectType) { case DataType.RelationObjectType.Document: { objectTitle = "【文档编号:" + CommonFuns.getDataTableBySql("DOCNO", "WHERE DOCID='" + objectKey + "'", tableName).Rows[0][0].ToString() + "】"; break; } case DataType.RelationObjectType.File: { objectTitle = "【文件名称:" + CommonFuns.getDataTableBySql("DFL_FILE_NAME", " WHERE DFL_ID='" + objectKey + "'", tableName).Rows[0][0].ToString() + "】"; break; } case DataType.RelationObjectType.Material: { objectTitle = "【物料NO:" + CommonFuns.getDataTableBySql("MATERIALNO", " WHERE MATERIALID='" + objectKey + "'", tableName).Rows[0][0].ToString() + "】"; break; } case DataType.RelationObjectType.Product: { objectTitle = "【产品NO:" + CommonFuns.getDataTableBySql("PRODUCTNO", "WHERE PRODUCTLEVEL=1 AND PRODUCTID='" + objectKey + "'", tableName).Rows[0][0].ToString() + "】"; //PRODUCTLEVEL为1的时候表示是产品 break; } case DataType.RelationObjectType.SemiProduct: { objectTitle = "【半成品NO:" + CommonFuns.getDataTableBySql("PRODUCTNO", "WHERE PRODUCTLEVEL=2 AND PRODUCTID='" + objectKey + "'", tableName).Rows[0][0].ToString() + "】"; //PRODUCTLEVEL为2的时候表示是半产品 break; } case DataType.RelationObjectType.Drawing: { objectTitle = "【图纸NO:" + CommonFuns.getDataTableBySql("DOCNO", "WHERE DOCID='" + objectKey + "'", tableName).Rows[0][0].ToString() + "】"; break; } default: { tableName = ""; break; } } return(objectTitle); }
/// <summary> /// 创建流程实例视图 /// </summary> protected void CreateFlowGraphicByWFTID(string flowName, string wftid, Control ctl, string wfappid) { DataTable dtTemp = CommonFuns.getDataTableBySql("1", "WHERE DEL_FLAG='N' AND STATUS='Complete' AND WFT_ID='" + wftid + "'", "WF_TEMPLATES"); if (dtTemp == null || dtTemp.Rows.Count == 0) { MessageBox.Show("该工作流【" + flowName + "】不存在或者被删除(或者未提交使用)", "工作流实例建立向导提示您:", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); // this.Close(); return; } else { IList <HYPDM.Entities.WF_TEMPLATES_STEP> list = WorkFlow.NewInstance.GetWFStepListByWFID(wftid); CreateWF(list, ctl, flowName, wftid, wfappid); // CreateButtonClickEvent(this.gpFlowDetail); } }
/// <summary> /// 根据工作流实例主键与节点(工作流节点)获取WF_TEMPLATES_STEP中的主键 /// </summary> /// <param name="wfappID"></param> /// <param name="stepID"></param> /// <returns></returns> public string GetWftStepIDByStepIDAndAppID(string wfappID, string stepID) { StringBuilder stb = new StringBuilder(); stb.Append(" WHERE WFT_ID="); stb.Append(" (SELECT WFT_ID"); stb.Append(" FROM WF_APP"); stb.Append(" WHERE WFA_ID='" + wfappID + "'"); stb.Append(" AND DEL_FLAG='N')"); stb.Append(" AND WFT_CURRENT_STEP_ID='" + stepID + "'"); DataTable dt = CommonFuns.getDataTableBySql("WFT_STEP_ID", stb.ToString(), "WF_TEMPLATES_STEP"); if (dt == null && dt.Rows.Count == 0) { return(""); } else { return(dt.Rows[0]["WFT_STEP_ID"].ToString()); } }
/// <summary> /// 获取当前处理人集合 /// </summary> /// <param name="wfaID">WF_APP表主键,工作流实例的主键</param> /// <returns></returns> public IList <EAS_ACCOUNTS> GETCurrentStepHandleUser(string wfaID) { IList <EAS_ACCOUNTS> list = null; EAS_ACCOUNTS acc = null; StringBuilder stb = new StringBuilder(); stb.Append("WHERE LOGINID IN ("); stb.Append(" SELECT OBJECTVALUE"); stb.Append(" FROM WF_APP_HANDLE"); stb.Append(" WHERE WFA_ID='" + wfaID + "'"); stb.Append(" AND OBJECTTYPE='SingleUser'"); stb.Append(" AND Current_STEP_ID="); stb.Append(" ("); stb.Append(" SELECT Current_STEP_ID"); stb.Append(" FROM WF_DETAIL"); stb.Append(" WHERE WFA_ID='" + wfaID + "'"); stb.Append(" AND (COMPLEMENTDATE='' or COMPLEMENTDATE is null)"); stb.Append(" AND IS_Through<>'Y'"); stb.Append(" )"); stb.Append(" )"); DataTable dt = CommonFuns.getDataTableBySql("LOGINID,NAME", stb.ToString(), "EAS_ACCOUNTS"); if (dt == null && dt.Rows.Count == 0) { return(null); } else { list = new List <EAS_ACCOUNTS>(); foreach (DataRow dr in dt.Rows) { acc = new EAS_ACCOUNTS(); acc.LOGINID = dr["LOGINID"].ToString(); acc.NAME = dr["NAME"].ToString(); list.Add(acc); } return(list); } }
private void SetFlowList(TreeView tv, TreeNode node) { DataTable dtTemp = CommonFuns.getDataTableBySql("WFT_ID,WFT_NAME,CREATEDATE,CREATEUSER ,LASTUPDATEUSER ,LASTUPDATEDATE,DEL_FLAG,STATUS", "WHERE DEL_FLAG='N' AND STATUS='Complete'", "WF_TEMPLATES"); foreach (DataRow dr in dtTemp.Rows) { TreeNode n = new TreeNode(dr["WFT_NAME"].ToString(), 0, 1); n.Tag = dr["WFT_ID"].ToString(); DataTable dt = CommonFuns.getDataTableBySql("WFA_ID,WFT_ID,SUBJECT", " WHERE STATUS<>'UNActivated' AND WFT_ID='" + dr["WFT_ID"].ToString() + "'", "WF_APP"); foreach (DataRow d in dt.Rows) { TreeNode m = new TreeNode(d["SUBJECT"].ToString(), 0, 1); m.Tag = d["WFA_ID"].ToString(); n.Nodes.Add(m); } node.Nodes.Add(n); } tv.Nodes.Add(node); tv.ExpandAll(); }
private void RelationObject_Load(object sender, EventArgs e) { DataTable dtTemp = CommonFuns.getDataTableBySql("WFT_ID,WFT_NAME", "WHERE DEL_FLAG='N' AND STATUS='Complete'", "WF_TEMPLATES"); this.dgvExtTemplates.DataSource = dtTemp; }
private void SetRealtionObject() { DataTable dtTemp = CommonFuns.getDataTableBySql(" A.OBJECTVALUE,A.WFT_ID,B.WFT_NAME,A.OBJECTDESC,A.LASTUPDATEUSER,A.LASTUPDATEDATE", "", " WF_TEMPLATES_OBJECT A LEFT JOIN WF_TEMPLATES B ON A.WFT_ID=B.WFT_ID "); this.dgvExtTemplates.DataSource = dtTemp; }
/// <summary> /// /// </summary> /// <param name="loginD">登录账号</param> /// <param name="detailType">1. 本人待办工作流 2. 发出的工作:本人拟制的工作流 3. 完成的工作:本人发起的、不是本人发起的,但是与本人有关的工作流且自己已经完成签批,但是整个工作流不一定完成签批</param> /// <returns></returns> public static DataTable GetWorkDetail(string loginD, int detailType) { ///1. 我参与的所有工作流 ,未完成但是已经激活状态的 ///SELECT * FROM WF_APP WHERE WFA_ID IN ///( SELECT DISTINCT WFA_ID FROM WF_APP_HANDLE WHERE OBJECTVALUE='PDM') ///AND WF_APP.STATUS NOT IN ('UNActivated','Complete') AND DEL_FLAG='N' ///2.所有未完成的工作流 ///SELECT * FROM WF_DETAIL WHERE IS_Through NOT IN ('Y','N') AND ///( COMPLEMENTDATE ='' OR COMPLEMENTDATE IS NULL) DataTable dtTemp = null; //1. 本人待办工作流 //2. 发出的工作:本人拟制的工作流 //3. 完成的工作:本人发起的、不是本人发起的,但是与本人有关的工作流且自己已经完成签批,但是整个工作流不一定完成签批 StringBuilder stbTableNameSQl; StringBuilder stbWhereSQl; StringBuilder stbFieldsSQl; switch (detailType) { case 1: { stbTableNameSQl = new StringBuilder(); stbWhereSQl = new StringBuilder(); stbFieldsSQl = new StringBuilder(); stbFieldsSQl.Append(" DISTINCT A.WFA_ID,A.WFT_ID,A.CREATEDATE,A.CREATEUSER,A.DEL_FLAG,A.OBJECTKEY,"); stbFieldsSQl.Append(" A.RELATIONOBJECTTYPE,A.START_DATE,A.STATUS,A.SUBJECT"); stbFieldsSQl.Append(" ,B.Current_STEP_ID,B.COMPLEMENTDATE,B.IS_Through STEP_THROUGH,B.MSG,"); stbFieldsSQl.Append(" B.RECIVEDATE,B.WFT_STEP_ID,'' USER_THROUGH,"); stbFieldsSQl.Append(" C.WFT_NAME "); stbTableNameSQl.Append(" WF_APP A,"); stbTableNameSQl.Append("( SELECT * FROM WF_DETAIL WHERE IS_Through NOT IN ('Y','N') AND"); stbTableNameSQl.AppendFormat(" (COMPLEMENTDATE ='' OR COMPLEMENTDATE IS NULL)) B ,WF_TEMPLATES C,( SELECT* FROM WF_APP_HANDLE WHERE OBJECTVALUE='{0}' AND IS_THROUGH NOT IN ('Y','N') ) D", loginD); stbTableNameSQl.Append(" WHERE A.WFA_ID IN "); stbTableNameSQl.AppendFormat("( SELECT DISTINCT WFA_ID FROM WF_APP_HANDLE WHERE OBJECTVALUE='{0}' AND IS_THROUGH NOT IN ('Y','N'))", loginD); stbTableNameSQl.Append(" AND A.STATUS NOT IN ('UNActivate','Complete') AND A.DEL_FLAG='N'"); stbTableNameSQl.Append(" AND A.WFA_ID=B.WFA_ID"); stbTableNameSQl.Append(" AND A.WFT_ID=C.WFT_ID AND B.Current_STEP_ID=D.Current_STEP_ID"); dtTemp = CommonFuns.getDataTableBySql(stbFieldsSQl.ToString(), stbWhereSQl.ToString(), stbTableNameSQl.ToString()); break; } case 2: { stbTableNameSQl = new StringBuilder(); stbWhereSQl = new StringBuilder(); stbFieldsSQl = new StringBuilder(); stbFieldsSQl.Append(" DISTINCT A.WFA_ID,A.WFT_ID,A.CREATEDATE,A.CREATEUSER,A.DEL_FLAG,A.OBJECTKEY,"); stbFieldsSQl.Append(" A.RELATIONOBJECTTYPE,A.START_DATE,A.STATUS,A.SUBJECT"); stbFieldsSQl.Append(" ,B.Current_STEP_ID,B.COMPLEMENTDATE,B.IS_Through STEP_THROUGH,B.MSG,"); stbFieldsSQl.Append(" B.RECIVEDATE,B.WFT_STEP_ID,A.LASTUPDATEDATE,'' USER_THROUGH"); stbFieldsSQl.Append(" ,C.WFT_NAME "); stbTableNameSQl.AppendFormat(" (SELECT * FROM WF_APP WHERE CREATEUSER='******' AND DEL_FLAG='N') A ", loginD); stbTableNameSQl.Append(" LEFT JOIN "); stbTableNameSQl.Append(" WF_TEMPLATES C ON A.WFT_ID=C.WFT_ID "); stbTableNameSQl.Append(" LEFT JOIN "); stbTableNameSQl.Append("(SELECT * FROM WF_DETAIL WHERE IS_Through NOT IN ('Y','N') AND "); stbTableNameSQl.Append("( COMPLEMENTDATE ='' OR COMPLEMENTDATE IS NULL)) B "); stbTableNameSQl.Append(" ON A.WFA_ID=B.WFA_ID "); dtTemp = CommonFuns.getDataTableBySql(stbFieldsSQl.ToString(), stbWhereSQl.ToString(), stbTableNameSQl.ToString()); break; } case 3: { stbTableNameSQl = new StringBuilder(); stbWhereSQl = new StringBuilder(); stbFieldsSQl = new StringBuilder(); stbFieldsSQl.Append(" DISTINCT A.WFA_ID,A.WFT_ID,A.CREATEDATE,A.CREATEUSER,A.DEL_FLAG,A.OBJECTKEY,"); stbFieldsSQl.Append(" A.LASTUPDATEDATE,A.RELATIONOBJECTTYPE,A.START_DATE,A.STATUS,A.SUBJECT"); stbFieldsSQl.Append(" ,B.Current_STEP_ID,B.COMPLEMENTDATE,B.IS_Through STEP_THROUGH,B.MSG,"); stbFieldsSQl.Append(" B.RECIVEDATE,B.WFT_STEP_ID,D.IS_THROUGH USER_THROUGH ,C.WFT_NAME "); stbTableNameSQl.Append(" WF_DETAIL B ,"); stbTableNameSQl.AppendFormat("( SELECT * FROM WF_APP_HANDLE WHERE OBJECTVALUE='{0}' AND IS_THROUGH IN ('Y','N')) D,", loginD); stbTableNameSQl.Append(" WF_APP A ,WF_TEMPLATES C"); stbTableNameSQl.Append(" WHERE B.WFA_ID=D.WFA_ID AND B.Current_STEP_ID=D.Current_STEP_ID"); stbTableNameSQl.Append(" AND A.WFT_ID=C.WFT_ID AND A.WFA_ID=B.WFA_ID AND A.WFA_ID=D.WFA_ID "); dtTemp = CommonFuns.getDataTableBySql(stbFieldsSQl.ToString(), stbWhereSQl.ToString(), stbTableNameSQl.ToString()); break; } default: { break; } } //CommonFuns.getDataTableBySql(); return(dtTemp); }
private void InitAccountsList() { this.accountsUnSelectedList.Clear(); this.accountsOldSelectedList.Clear(); // this.accountsList = _accountsService.GetAllAccountsList(); // DataTable dtUserRole= CommonFuns.getDataTableBySql("NAME,DESCRIPTION", " WHERE NAME NOT IN ('Administrators','Guests','平台演示')", "EAS_ROLES"); if (this.OldSelectedUserList == null || this.OldSelectedUserList.Count == 0) { } else { stbOldSelected = new StringBuilder("("); foreach (DataType.UserOrGroupSelected it in this.OldSelectedUserList) { stbOldSelected.Append("'" + it.Value + "'").Append(","); } stbOldSelected.Remove(stbOldSelected.Length - 1, 1).Append(")"); } DataTable dtUnSelectedUsers; DataTable dtOldSelectedUsers; if (stbOldSelected == null || stbOldSelected.ToString() == "") { dtUnSelectedUsers = CommonFuns.getDataTableBySql("A.LOGINID,A.ROLENAME,B.Name,B.DESCRIPTION,B.ORGANNAME", "WHERE B.ORGANID NOT IN ('7ECC3D03-B80E-4EBC-9DEC-CAE93143321F','7987FC8D-BF40-4A3D-B7CD-588CD6CDD175') ", "EAS_ACCOUNTGROUPING A LEFT JOIN EAS_ACCOUNTS B ON A.LOGINID=B.LOGINID"); //未选择的用户 foreach (DataRow dr in dtUnSelectedUsers.Rows) { EasAccountEntity userAndRole = new EasAccountEntity(); userAndRole.LoginID = dr["LOGINID"].ToString(); userAndRole.RoleName = dr["ROLENAME"].ToString(); userAndRole.Name = dr["Name"].ToString(); userAndRole.ObjectType = DataType.AuthObjectType.SingleUser; //单用户 accountsUnSelectedList.Add(userAndRole); } reloadAccountList(this.accountsUnSelectedList, lvNotSelect); // dtOldSelectedUsers = new DataTable(); } else { dtUnSelectedUsers = CommonFuns.getDataTableBySql("A.LOGINID,A.ROLENAME,B.Name,B.DESCRIPTION,B.ORGANNAME", "WHERE B.ORGANID NOT IN ('7ECC3D03-B80E-4EBC-9DEC-CAE93143321F','7987FC8D-BF40-4A3D-B7CD-588CD6CDD175') AND A.LOGINID NOT IN " + stbOldSelected.ToString(), "EAS_ACCOUNTGROUPING A LEFT JOIN EAS_ACCOUNTS B ON A.LOGINID=B.LOGINID"); dtOldSelectedUsers = CommonFuns.getDataTableBySql("A.LOGINID,A.ROLENAME,B.Name,B.DESCRIPTION,B.ORGANNAME", "WHERE B.ORGANID NOT IN ('7ECC3D03-B80E-4EBC-9DEC-CAE93143321F','7987FC8D-BF40-4A3D-B7CD-588CD6CDD175') AND A.LOGINID IN " + stbOldSelected.ToString(), "EAS_ACCOUNTGROUPING A LEFT JOIN EAS_ACCOUNTS B ON A.LOGINID=B.LOGINID"); //未选择的用户 foreach (DataRow dr in dtUnSelectedUsers.Rows) { EasAccountEntity userAndRole = new EasAccountEntity(); userAndRole.LoginID = dr["LOGINID"].ToString(); userAndRole.RoleName = dr["ROLENAME"].ToString(); userAndRole.Name = dr["Name"].ToString(); userAndRole.ObjectType = DataType.AuthObjectType.SingleUser; //单用户 accountsUnSelectedList.Add(userAndRole); } ///已经选择了的用户 foreach (DataRow dr in dtOldSelectedUsers.Rows) { EasAccountEntity userAndRole = new EasAccountEntity(); userAndRole.LoginID = dr["LOGINID"].ToString(); userAndRole.RoleName = dr["ROLENAME"].ToString(); userAndRole.Name = dr["Name"].ToString(); userAndRole.ObjectType = DataType.AuthObjectType.SingleUser; //单用户 accountsOldSelectedList.Add(userAndRole); } reloadAccountList(this.accountsUnSelectedList, lvNotSelect); reloadAccountList(this.accountsOldSelectedList, lvSelected); } newSelectItemList(); ///用户群组信息,暂时去掉 // DataTable dtUserGroup = CommonFuns.getDataTableBySql("NAME,DESCRIPTION", " WHERE NAME NOT IN ('Administrators','Guests','平台演示')", "EAS_ROLES"); ///用户群组信息,暂时去掉 //foreach (DataRow dr in dtUserGroup.Rows) //{ // EasAccountEntity userAndRole = new EasAccountEntity(); // userAndRole.LoginID = dr["NAME"].ToString(); // userAndRole.RoleName = dr["NAME"].ToString(); // userAndRole.Name = dr["NAME"].ToString(); // userAndRole.ObjectType = DataType.AuthObjectType.UserRole; //用户群组 // accountsList.Add(userAndRole); //} }
private void setComboxValue() { CommonFuns.SetComboBoxValue(this.combCurrentStep, "WorkFlowStep", -1); CommonFuns.SetComboBoxValue(this.combThroughNext, "WorkFlowStep", -1); }