diff --git a/src/main/java/kcc/ve/oprtn/cmdTrgt/web/CmdPrcsInfoMngController.java b/src/main/java/kcc/ve/oprtn/cmdTrgt/web/CmdPrcsInfoMngController.java index a2ff8be2..82f8d707 100644 --- a/src/main/java/kcc/ve/oprtn/cmdTrgt/web/CmdPrcsInfoMngController.java +++ b/src/main/java/kcc/ve/oprtn/cmdTrgt/web/CmdPrcsInfoMngController.java @@ -38,8 +38,11 @@ import kcc.com.cmm.spring.data.util.ExcelUtil; import kcc.com.cmm.util.StringUtil; import kcc.com.utl.user.service.CheckFileUtil; import kcc.com.utl.user.service.CheckLoginUtil; +import kcc.com.utl.user.service.QustnrCommonUtil; import kcc.let.uat.uia.service.SsoLoginVO; import kcc.let.uss.notify.service.NotifyManageService; +import kcc.let.uss.olp.qri.service.EgovQustnrRespondInfoService; +import kcc.let.uss.olp.qri.service.QustnrRespondInfoVO; import kcc.let.utl.fcc.service.EgovCryptoUtil; import kcc.let.utl.fcc.service.ITNotiUtil; import kcc.ve.aplct.sspnIdtmt.service.SspnIdtmtService; @@ -57,6 +60,7 @@ import kcc.ve.instr.tngrVisitEdu.prcsInfo.service.VEPrcsService; import kcc.ve.oprtn.cmdTrgt.trgtMng.service.CmdTrgtMngService; import kcc.ve.oprtn.cmdTrgt.trgtMng.service.CmdTrgtMngVO; import kcc.ve.oprtn.fndtnEnhanceTrn.prcsAplctPrdMng.service.ExcelVO; +import kcc.ve.oprtn.qestnr.service.VEALettnQestnrMIXService; /** * 기반강화연수(관리자) @@ -174,6 +178,17 @@ public class CmdPrcsInfoMngController { @Resource(name="eduAplctGnrService") private EgovIdGnrService eduAplctGnrService; + // 설문 util + @Resource(name = "qustnrCommonUtil") + private QustnrCommonUtil qustnrCommonUtil; + + // 설문 복합 VEA_ + @Resource(name = "vEALettnQestnrMIXService") + private VEALettnQestnrMIXService vEALettnQestnrMIXService; + + @Resource(name = "egovQustnrRespondInfoService") + private EgovQustnrRespondInfoService egovQustnrRespondInfoService; + /** * 기반강화연수 과정 관리 목록 화면 */ @@ -1328,6 +1343,92 @@ public class CmdPrcsInfoMngController { model.addAttribute("instrAsgnmList", instrAsgnmList); } + + //설문 문항 정보 + try { + model = qustnrCommonUtil._qustnrQesItm( + model + , LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012 + , "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012 + , "QTMPLA_0000000000001" + , vEALettnQestnrMIXService + , egovQustnrRespondInfoService + , vEPrcsDetailVO.getPrcsAplctPrdOrd() + , "" + //, vEEduAplctVO.getEduAplctOrd() + //, vEEduAplctVO.getEduChasiOrd() + ); + + }catch(Exception ex) { + ex.printStackTrace(); + } + /* + // 설문조사 정보 + QustnrRespondInfoVO qustnrRespondInfoVO = new QustnrRespondInfoVO(); + qustnrRespondInfoVO.setSiteId(VeConstants.LCTR_DIV_CD_20); + QustnrRespondInfoVO info = egovQustnrRespondInfoService.selectSiteIdQustnrTmplat(qustnrRespondInfoVO); + + // 설문조사 문항리스트 조회 + Map commandMap =new HashMap(); + commandMap.put("qestnrTmplatId", "QTMPLA_0000000000001"); + commandMap.put("qestnrId",info.getQestnrId()); //문제 ID + model.addAttribute("Comtnqustnrqesitm", egovQustnrRespondInfoService.selectQustnrRespondInfoManageComtnqustnrqesitm(commandMap)); + */ + + try{ + model = qustnrCommonUtil._chasiSrvyList( + model + , LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012 + , "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012 + , vEPrcsDetailVO.getPrcsAplctPrdOrd() + , "" + //, vEEduAplctVO.getEduAplctOrd() + //, vEEduAplctVO.getEduChasiOrd() + , vEALettnQestnrMIXService + ); + + }catch(Exception ex) { + ex.printStackTrace(); + } + + + //개인별 만족도 관리 - chasiSrvyEAList + try{ + model = qustnrCommonUtil._chasiSrvyEAList( + model + , LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012 + , "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012 + , vEPrcsDetailVO.getPrcsAplctPrdOrd() + , "" + //, vEEduAplctVO.getEduAplctOrd() + //, vEEduAplctVO.getEduChasiOrd() + , vEALettnQestnrMIXService + ); + + }catch(Exception ex) { + ex.printStackTrace(); + } + + + //주관식 답변 정보 + try { + QustnrRespondInfoVO qustnrRespondInfoVO = new QustnrRespondInfoVO(); + //qustnrRespondInfoVO.setEduChasiOrd(vEEduAplctVO.getEduChasiOrd()); + qustnrRespondInfoVO.setEduChasiOrd(""); + + List subjList = egovQustnrRespondInfoService.selectSubjList(qustnrRespondInfoVO); + if (subjList.size()>=0) { + model.addAttribute("subjInfo", subjList.get(0)); + } + + + }catch(Exception ex) { + System.out.println("Exception vEEduAplctOnlnService.updateBulk"); + } + + System.out.println("=============================================chasiSrvyEAList============================================="); + + return "/oprtn/cmdTrgt/cndtnEduPrcsAplctCfnMngDetail"; } diff --git a/src/main/java/kcc/ve/oprtn/prevent/web/PreventMngController.java b/src/main/java/kcc/ve/oprtn/prevent/web/PreventMngController.java index d0f6357c..f0242e1c 100644 --- a/src/main/java/kcc/ve/oprtn/prevent/web/PreventMngController.java +++ b/src/main/java/kcc/ve/oprtn/prevent/web/PreventMngController.java @@ -38,8 +38,11 @@ import kcc.com.cmm.spring.data.util.ExcelUtil; import kcc.com.cmm.util.StringUtil; import kcc.com.utl.user.service.CheckFileUtil; import kcc.com.utl.user.service.CheckLoginUtil; +import kcc.com.utl.user.service.QustnrCommonUtil; import kcc.let.uat.uia.service.SsoLoginVO; import kcc.let.uss.notify.service.NotifyManageService; +import kcc.let.uss.olp.qri.service.EgovQustnrRespondInfoService; +import kcc.let.uss.olp.qri.service.QustnrRespondInfoVO; import kcc.let.utl.fcc.service.EgovCryptoUtil; import kcc.let.utl.fcc.service.ITNotiUtil; import kcc.ve.aplct.sspnIdtmt.service.SspnIdtmtService; @@ -57,6 +60,7 @@ import kcc.ve.instr.tngrVisitEdu.prcsInfo.service.VEPrcsService; import kcc.ve.oprtn.cndtnSspnIdtmt.trgtMng.service.CndtnTrgtMngService; import kcc.ve.oprtn.cndtnSspnIdtmt.trgtMng.service.CndtnTrgtMngVO; import kcc.ve.oprtn.fndtnEnhanceTrn.prcsAplctPrdMng.service.ExcelVO; +import kcc.ve.oprtn.qestnr.service.VEALettnQestnrMIXService; /** * 기반강화연수(관리자) @@ -166,7 +170,16 @@ public class PreventMngController { @Resource(name = "checkFileUtil") private CheckFileUtil checkFileUtil; - + // 설문 util + @Resource(name = "qustnrCommonUtil") + private QustnrCommonUtil qustnrCommonUtil; + + // 설문 복합 VEA_ + @Resource(name = "vEALettnQestnrMIXService") + private VEALettnQestnrMIXService vEALettnQestnrMIXService; + + @Resource(name = "egovQustnrRespondInfoService") + private EgovQustnrRespondInfoService egovQustnrRespondInfoService; /** * 기반강화연수 과정 관리 목록 화면 @@ -1322,6 +1335,93 @@ public class PreventMngController { model.addAttribute("instrAsgnmList", instrAsgnmList); } + + //설문 문항 정보 + try { + model = qustnrCommonUtil._qustnrQesItm( + model + , LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012 + , "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012 + , "QTMPLA_0000000000001" + , vEALettnQestnrMIXService + , egovQustnrRespondInfoService + , vEPrcsDetailVO.getPrcsAplctPrdOrd() + , "" + //, vEEduAplctVO.getEduAplctOrd() + //, vEEduAplctVO.getEduChasiOrd() + ); + + }catch(Exception ex) { + ex.printStackTrace(); + } + /* + // 설문조사 정보 + QustnrRespondInfoVO qustnrRespondInfoVO = new QustnrRespondInfoVO(); + qustnrRespondInfoVO.setSiteId(VeConstants.LCTR_DIV_CD_20); + QustnrRespondInfoVO info = egovQustnrRespondInfoService.selectSiteIdQustnrTmplat(qustnrRespondInfoVO); + + // 설문조사 문항리스트 조회 + Map commandMap =new HashMap(); + commandMap.put("qestnrTmplatId", "QTMPLA_0000000000001"); + commandMap.put("qestnrId",info.getQestnrId()); //문제 ID + model.addAttribute("Comtnqustnrqesitm", egovQustnrRespondInfoService.selectQustnrRespondInfoManageComtnqustnrqesitm(commandMap)); + */ + + try{ + model = qustnrCommonUtil._chasiSrvyList( + model + , LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012 + , "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012 + , vEPrcsDetailVO.getPrcsAplctPrdOrd() + , "" + //, vEEduAplctVO.getEduAplctOrd() + //, vEEduAplctVO.getEduChasiOrd() + , vEALettnQestnrMIXService + ); + + }catch(Exception ex) { + ex.printStackTrace(); + } + + + //개인별 만족도 관리 - chasiSrvyEAList + try{ + model = qustnrCommonUtil._chasiSrvyEAList( + model + , LCTR_DIV_CD //청소년 -10, 성인-20, ...VE0012 + , "10" //10-기본설문, 20-신청자설문, 30-강사설문 VEA012 + , vEPrcsDetailVO.getPrcsAplctPrdOrd() + , "" + //, vEEduAplctVO.getEduAplctOrd() + //, vEEduAplctVO.getEduChasiOrd() + , vEALettnQestnrMIXService + ); + + }catch(Exception ex) { + ex.printStackTrace(); + } + + + //주관식 답변 정보 + try { + QustnrRespondInfoVO qustnrRespondInfoVO = new QustnrRespondInfoVO(); + //qustnrRespondInfoVO.setEduChasiOrd(vEEduAplctVO.getEduChasiOrd()); + qustnrRespondInfoVO.setEduChasiOrd(""); + + List subjList = egovQustnrRespondInfoService.selectSubjList(qustnrRespondInfoVO); + if (subjList.size()>=0) { + model.addAttribute("subjInfo", subjList.get(0)); + } + + + }catch(Exception ex) { + System.out.println("Exception vEEduAplctOnlnService.updateBulk"); + } + + System.out.println("=============================================chasiSrvyEAList============================================="); + + + return "/oprtn/prevent/cndtnEduPrcsAplctCfnMngDetail"; } diff --git a/src/main/resources/egovframework/sqlmap/let/uss/olp/qri/EgovQustnrRespondInfo_SQL_Postgresql.xml b/src/main/resources/egovframework/sqlmap/let/uss/olp/qri/EgovQustnrRespondInfo_SQL_Postgresql.xml index b20d6a91..ba275dc7 100644 --- a/src/main/resources/egovframework/sqlmap/let/uss/olp/qri/EgovQustnrRespondInfo_SQL_Postgresql.xml +++ b/src/main/resources/egovframework/sqlmap/let/uss/olp/qri/EgovQustnrRespondInfo_SQL_Postgresql.xml @@ -134,7 +134,9 @@ FROM LETTNQUSTNRQESITM A WHERE 1=1 AND A.QESTNR_ID = #qestnrId# - AND A.QUSTNR_TMPLAT_ID = #qestnrTmplatId# + /* + AND A.QUSTNR_TMPLAT_ID = qestnrTmplatId + */ ORDER BY A.QESTN_SN diff --git a/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Postgresql.xml b/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Postgresql.xml index 206c7e9c..7b34ecf3 100644 --- a/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Postgresql.xml +++ b/src/main/resources/egovframework/sqlmap/ve/edu/VEEdu_MIX_SQL_Postgresql.xml @@ -917,24 +917,35 @@ a.QUSTNR_TMPLAT_ID , a.SITE_ID , + a.QESTNR_ID as QESTNR_ID_10 , + null as QESTNR_ID_20 , + null as QESTNR_ID_30 , + a.qustnr_bgnde , + a.qustnr_endde + + /* MAX(CASE WHEN a.site_id_cd = '10' THEN a.QESTNR_ID ELSE NULL END) AS QESTNR_ID_10, MAX(CASE WHEN a.site_id_cd = '20' THEN a.QESTNR_ID ELSE NULL END) AS QESTNR_ID_20, - MAX(CASE WHEN a.site_id_cd = '30' THEN a.QESTNR_ID ELSE NULL END) AS QESTNR_ID_30 + MAX(CASE WHEN a.site_id_cd = '30' THEN a.QESTNR_ID ELSE NULL END) AS QESTNR_ID_30 + */ FROM LETTNQESTNRINFO a WHERE a.SITE_ID = #siteId# AND a.SITE_ID_CD IN ('10', '20', '30') - AND TO_CHAR(NOW(), - 'YYYY.MM.DD') BETWEEN COALESCE(a.qustnr_bgnde, - '2000.01.01') - AND COALESCE(a.qustnr_endde, - '9999.12.31') + + /* + + AND TO_CHAR(NOW(), 'YYYY.MM.DD') BETWEEN COALESCE(a.qustnr_bgnde, '2000.01.01') AND COALESCE(a.qustnr_endde, '9999.12.31') + GROUP BY a.QUSTNR_TMPLAT_ID , - a.SITE_ID ) I ON - (1 = 1) + a.SITE_ID + */ + + ) I ON + (vpap.edu_strt_pnttm between coalesce(I.qustnr_bgnde, '20000101') and coalesce(I.qustnr_endde,'99991231')) diff --git a/src/main/resources/egovframework/sqlmap/ve/qustnr/VEALettnQestnrMIX_SQL_Postgresql.xml b/src/main/resources/egovframework/sqlmap/ve/qustnr/VEALettnQestnrMIX_SQL_Postgresql.xml index 03381c6c..116dd1a1 100644 --- a/src/main/resources/egovframework/sqlmap/ve/qustnr/VEALettnQestnrMIX_SQL_Postgresql.xml +++ b/src/main/resources/egovframework/sqlmap/ve/qustnr/VEALettnQestnrMIX_SQL_Postgresql.xml @@ -147,7 +147,9 @@ lettnqustnrrespondinfo b WHERE b.edu_aplct_ord=#eduAplctOrd# - AND b.edu_chasi_ord=#eduChasiOrd# + /* + AND b.edu_chasi_ord=eduChasiOrd + */ GROUP BY b.QUSTNR_TMPLAT_ID , b.QESTNR_ID @@ -160,14 +162,22 @@ AND a.site_id_cd = #siteIdCd# )b - on(1=1) + on(1=1) + , ve_prcs_aplct_prd c WHERE 1 =1 + AND A.SITE_ID = #siteId# + AND COALESCE(A.site_id_cd, '10')=#siteIdCd# + + AND c.prcs_aplct_prd_ord=#eduAplctOrd# + AND c.edu_strt_pnttm between coalesce(a.qustnr_bgnde, '20000101') and coalesce(a.qustnr_endde, '99991231') + + /* AND to_char(NOW(), 'YYYY.MM.DD') BETWEEN COALESCE(a.qustnr_bgnde,'2000.01.01') AND COALESCE(a.qustnr_endde,'9999.12.31') + */ - AND A.SITE_ID = #siteId# - AND COALESCE(A.site_id_cd, '10')=#siteIdCd# + ORDER BY A.QESTNR_ID DESC LIMIT 1 @@ -230,30 +240,42 @@ SELECT c02.* FROM ( + SELECT - c00.qustnr_tmplat_id - , c00.qestnr_id - , c00.qustnr_qesitm_id - , max(c00.qustnr_rslt_id) AS qustnr_rslt_id + + c00.qestnr_id , + c00.qustnr_qesitm_id , + max(c00.qustnr_rslt_id) as qustnr_rslt_id FROM LETTNQESTNRRSLTDetail c00 + , ve_edu_aplct d00 WHERE - c00.EDU_APLCT_ORD = #eduAplctOrd# - AND c00.EDU_CHASI_ORD = #eduChasiOrd# + d00.prcs_ord = #eduAplctOrd# + and d00.EDU_APLCT_ORD=c00.edu_aplct_ord + /* + and c00.EDU_CHASI_ORD = '' + */ GROUP BY - c00.qustnr_tmplat_id - , c00.qestnr_id - , c00.qustnr_qesitm_id + + c00.qestnr_id , + c00.qustnr_qesitm_id + )c01 , LETTNQESTNRRSLTDetail c02 - WHERE c01.qustnr_tmplat_id=c02.qustnr_tmplat_id + WHERE 1=1 + /* + c01.qustnr_tmplat_id=c02.qustnr_tmplat_id + */ AND c01.qestnr_id=c02.qestnr_id AND c01.qustnr_qesitm_id=c02.qustnr_qesitm_id AND c01.qustnr_rslt_id=c02.qustnr_rslt_id ) c on( + 1=1 + /* b.QUSTNR_TMPLAT_ID =c.QUSTNR_TMPLAT_ID + */ AND b.QESTNR_ID =c.QESTNR_ID AND b.QUSTNR_QESITM_ID =c.QUSTNR_QESITM_ID @@ -287,7 +309,10 @@ LEFT OUTER JOIN LETTNQUSTNRRESPONDINFO e on ( - d.QUSTNR_TMPLAT_ID =e.QUSTNR_TMPLAT_ID + 1=1 + /* + d.QUSTNR_TMPLAT_ID =e.QUSTNR_TMPLAT_ID + */ AND d.QESTNR_ID =e.QESTNR_ID AND d.QUSTNR_RESPOND_ID =e.QUSTNR_RESPOND_ID AND d.EDU_APLCT_ORD = e.EDU_APLCT_ORD @@ -321,7 +346,10 @@ )F on( + 1=1 + /* b.QUSTNR_TMPLAT_ID =f.QUSTNR_TMPLAT_ID + */ AND b.QESTNR_ID =f.QESTNR_ID AND b.QUSTNR_QESITM_ID =f.QUSTNR_QESITM_ID @@ -331,7 +359,9 @@ WHERE a.site_id=#siteId# AND COALESCE(a.SITE_ID_CD,'10') =#siteIdCd# - AND b.QUSTNR_TMPLAT_ID =a.QUSTNR_TMPLAT_ID + /* + AND b.QUSTNR_TMPLAT_ID =a.QUSTNR_TMPLAT_ID + */ AND b.QESTNR_ID =a.QESTNR_ID diff --git a/src/main/webapp/WEB-INF/jsp/oprtn/cmdTrgt/cndtnEduPrcsAplctCfnMngDetail.jsp b/src/main/webapp/WEB-INF/jsp/oprtn/cmdTrgt/cndtnEduPrcsAplctCfnMngDetail.jsp index 8d3ad4bf..264bbb51 100644 --- a/src/main/webapp/WEB-INF/jsp/oprtn/cmdTrgt/cndtnEduPrcsAplctCfnMngDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/oprtn/cmdTrgt/cndtnEduPrcsAplctCfnMngDetail.jsp @@ -961,7 +961,8 @@ - + +
@@ -1015,6 +1016,227 @@
+ + + +
+

교육 내용에 대한 전반적 만족도 평가

+
+ + +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> + + + + + + +<%-- "> --%> +<%-- --%> + + + + + + + + + + + +<%-- "> --%> +<%-- --%> + + + + + + + +<%-- --%> +<%-- --%> + + + +<%-- --%> + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
평가문항매우만족만족보통불만족매우불만족
+ ${status1.count}) + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + +
기타의견
기타의견
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + + + + + +<%-- --%> + + +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + +
+
+
+
+ diff --git a/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp b/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp index 2ea0c479..6a8d7319 100644 --- a/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/oprtn/cndtnSspnIdtmt/cndtnEduPrcsAplctCfnMngDetail.jsp @@ -1108,51 +1108,51 @@

교육 내용에 대한 전반적 만족도 평가

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

참석자

-
- "> - - -

응답율

-
-
-

응답자

-
- "> - - -

무응답

-
-
등록된 평가문항이 없습니다.
-
+ + +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> + + + + + + +<%-- "> --%> +<%-- --%> + + + + + + + + + + + +<%-- "> --%> +<%-- --%> + + + + + + + +<%-- --%> +<%-- --%> + + + +<%-- --%> + +
@@ -1317,7 +1317,7 @@ - + diff --git a/src/main/webapp/WEB-INF/jsp/oprtn/prevent/cndtnEduPrcsAplctCfnMngDetail.jsp b/src/main/webapp/WEB-INF/jsp/oprtn/prevent/cndtnEduPrcsAplctCfnMngDetail.jsp index e10e3810..b122351f 100644 --- a/src/main/webapp/WEB-INF/jsp/oprtn/prevent/cndtnEduPrcsAplctCfnMngDetail.jsp +++ b/src/main/webapp/WEB-INF/jsp/oprtn/prevent/cndtnEduPrcsAplctCfnMngDetail.jsp @@ -962,7 +962,8 @@ - + +
@@ -1016,7 +1017,229 @@ <%-- --%>
- + + + + +
+

교육 내용에 대한 전반적 만족도 평가

+
+ + +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> +<%-- --%> + + + + + + +<%-- "> --%> +<%-- --%> + + + + + + + + + + + +<%-- "> --%> +<%-- --%> + + + + + + + +<%-- --%> +<%-- --%> + + + +<%-- --%> + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
평가문항매우만족만족보통불만족매우불만족
+ ${status1.count}) + + + + + + + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + +
기타의견
기타의견
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + + + + + +<%-- --%> + + +
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + +
+
+
+
+ +