diff --git a/WebContent/META-INF/MANIFEST.MF b/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..254272e
--- /dev/null
+++ b/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/src/main/java/gtpa/brs/openapi/dao/MemberCiReqVO.java b/src/main/java/gtpa/brs/openapi/dao/MemberCiReqVO.java
new file mode 100644
index 0000000..ac2f8e7
--- /dev/null
+++ b/src/main/java/gtpa/brs/openapi/dao/MemberCiReqVO.java
@@ -0,0 +1,85 @@
+/**
+ * Class Name : MemberCiReqVO.java
+ * Description : 사전등록결제 회원 전화번호 요청 객체
+ * Version : 1.0
+ * Since : 2025. 04.07
+ * Author : 서울시 녹색교통 사전등록결제 개발팀
+ *
+
+ 수정일 수정자 수정내용
+
+ */
+package gtpa.brs.openapi.dao;
+
+/**
+ * Class Name : MemberCiReqVO Class
+ * Description : 사전등록결제 회원 전화번호 요청 객체
+ * Version : 1.0
+ * Since : 2025. 04.07
+ * Author : 서울시 녹색교통 사전등록결제 개발팀
+ *
+
+ 수정일 수정자 수정내용
+
+ */
+public class MemberCiReqVO {
+
+ private String insttNo; //기관 번호
+ private String insttCntcJobSe; //기관 업무 구분
+ private String mberCi; //회원CI
+ private String vhcleNo; //차량번호
+
+ public MemberCiReqVO() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ public MemberCiReqVO(String insttNo, String insttCntcJobSe, String mberCi, String vhcleNo) {
+ super();
+ this.insttNo = insttNo;
+ this.insttCntcJobSe = insttCntcJobSe;
+ this.mberCi = mberCi;
+ this.vhcleNo = vhcleNo;
+ }
+
+ public String getInsttNo() {
+ return insttNo;
+ }
+
+ public void setInsttNo(String insttNo) {
+ this.insttNo = insttNo;
+ }
+
+ public String getInsttCntcJobSe() {
+ return insttCntcJobSe;
+ }
+
+ public void setInsttCntcJobSe(String insttCntcJobSe) {
+ this.insttCntcJobSe = insttCntcJobSe;
+ }
+
+ public String getMberCi() {
+ return mberCi;
+ }
+
+ public void setMberCi(String mberCi) {
+ this.mberCi = mberCi;
+ }
+
+ public String getVhcleNo() {
+ return vhcleNo;
+ }
+
+ public void setVhcleNo(String vhcleNo) {
+ this.vhcleNo = vhcleNo;
+ }
+
+ @Override
+ public String toString() {
+ return "{\"insttNo\":\"" + insttNo +
+ "\", \"insttCntcJobSe\":\"" + insttCntcJobSe +
+ "\", \"vhcleNo\":\"" + vhcleNo +
+ "\", \"mberCi\":\"" + mberCi + "\"}";
+ }
+
+}
diff --git a/src/main/java/gtpa/brs/openapi/dao/MemberCiResVO.java b/src/main/java/gtpa/brs/openapi/dao/MemberCiResVO.java
new file mode 100644
index 0000000..dd43a8a
--- /dev/null
+++ b/src/main/java/gtpa/brs/openapi/dao/MemberCiResVO.java
@@ -0,0 +1,52 @@
+/**
+ * Class Name : MemberCiResVO.java
+ * Description : 사전등록결제 회원 전화번호 응답 객체
+ * Version : 1.0
+ * Since : 2025. 04.07
+ * Author : 서울시 녹색교통 사전등록결제 개발팀
+ *
+
+ 수정일 수정자 수정내용
+
+ */
+package gtpa.brs.openapi.dao;
+
+/**
+ * Class Name : MemberCiResVO Class
+ * Description : 사전등록결제 회원 전화번호 응답 객체
+ * Version : 1.0
+ * Since : 2025. 04.07
+ * Author : 서울시 녹색교통 사전등록결제 개발팀
+ *
+
+ 수정일 수정자 수정내용
+
+ */
+public class MemberCiResVO {
+ private String mobileNo; //회원_전화번호
+
+ public MemberCiResVO() {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ public MemberCiResVO(String mobileNo) {
+ super();
+ this.mobileNo = mobileNo;
+
+ }
+
+ public String getMobileNo() {
+ return mobileNo;
+ }
+
+ public void setMobileNo(String mobileNo) {
+ this.mobileNo = mobileNo;
+ }
+
+ @Override
+ public String toString() {
+ return "{\"mobileNo\":\"" + mobileNo+ "\"}";
+ }
+
+}
diff --git a/src/main/java/gtpa/brs/openapi/service/GtpaBrsOpenapiService.java b/src/main/java/gtpa/brs/openapi/service/GtpaBrsOpenapiService.java
index 61e9322..1cff53a 100644
--- a/src/main/java/gtpa/brs/openapi/service/GtpaBrsOpenapiService.java
+++ b/src/main/java/gtpa/brs/openapi/service/GtpaBrsOpenapiService.java
@@ -473,5 +473,13 @@ public interface GtpaBrsOpenapiService {
* @throws UnsupportedEncodingException
*/
String instVhcleSttusHist(Map phm) throws SQLException, Exception;
+
+ /**
+ * 회원 휴대전화번호 조회
+ * @param param
+ * @return
+ * @throws UnsupportedEncodingException
+ */
+ Map selectMemberMobileInfo(Map param) throws SQLException, Exception;
}
diff --git a/src/main/java/gtpa/brs/openapi/service/impl/GtpaBrsOpenapiServiceImpl.java b/src/main/java/gtpa/brs/openapi/service/impl/GtpaBrsOpenapiServiceImpl.java
index a93483e..0cb2580 100644
--- a/src/main/java/gtpa/brs/openapi/service/impl/GtpaBrsOpenapiServiceImpl.java
+++ b/src/main/java/gtpa/brs/openapi/service/impl/GtpaBrsOpenapiServiceImpl.java
@@ -1,4 +1,4 @@
-/**
+ /**
* Class Name : GtpaBrsOpenapiServiceImpl.java
* Description : 사전등록결제 데이터리소스 서비스(Mybatis)
* Version : 1.0
@@ -1121,4 +1121,16 @@ public class GtpaBrsOpenapiServiceImpl extends EgovAbstractServiceImpl implement
// 1 is Success, 0 is fail
return res;
}
+
+ /**
+ * 회원 휴대전화번호 조회
+ * @param param
+ * @return
+ * @throws UnsupportedEncodingException
+ */
+ @Override
+ public Map selectMemberMobileInfo(Map param) throws SQLException, Exception {
+ LOGGER.debug(param.toString());
+ return openapiDAO.selectMemberMobileInfo(param);
+ }
}
diff --git a/src/main/java/gtpa/brs/openapi/service/impl/OpenapiMapper.java b/src/main/java/gtpa/brs/openapi/service/impl/OpenapiMapper.java
index d9ccb5e..8cda19b 100644
--- a/src/main/java/gtpa/brs/openapi/service/impl/OpenapiMapper.java
+++ b/src/main/java/gtpa/brs/openapi/service/impl/OpenapiMapper.java
@@ -287,4 +287,7 @@ public interface OpenapiMapper {
// 회원 번호 조회
HashMap selectTbBrsMberConfirm(HashMap param) throws SQLException, Exception;
+
+ //회원 휴대전화번호 조회
+ Map selectMemberMobileInfo(Map param) throws SQLException, Exception;
}
diff --git a/src/main/java/gtpa/brs/openapi/web/BrsMemberCiMobileController.java b/src/main/java/gtpa/brs/openapi/web/BrsMemberCiMobileController.java
new file mode 100644
index 0000000..6fc3f6c
--- /dev/null
+++ b/src/main/java/gtpa/brs/openapi/web/BrsMemberCiMobileController.java
@@ -0,0 +1,268 @@
+/**
+ * Class Name : BrsMemberCiMobileController.java
+ * Description : 사전등록 회원 휴대전화번호 요청 수신
+ * Version : 1.0
+ * Since : 2025. 04.03
+ * Author : 서울시 녹색교통 사전등록결제 개발팀
+ *
+
+ 수정일 수정자 수정내용
+
+ */
+package gtpa.brs.openapi.web;
+
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ArrayList;
+
+import egovframework.rte.fdl.property.EgovPropertyService;
+//import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
+
+import gtpa.brs.openapi.service.GtpaBrsOpenapiService;
+import gtpa.brs.openapi.common.BrsCommonMessage;
+import gtpa.brs.openapi.dao.MemberCiReqVO;
+import gtpa.brs.openapi.dao.MemberCiResVO;
+import gtpa.brs.openapi.dao.MemberOneResVO;
+import gtpa.brs.openapi.dao.ResponseJsonArrayVO;
+import gtpa.brs.openapi.dao.ResponseJsonVO;
+
+import javax.annotation.Resource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springmodules.validation.commons.DefaultBeanValidator;
+
+/**
+ * Class Name : BrsMemberCiMobileController Class
+ * Description : 사전등록 회원 휴대전화번호 요청 수신
+ * Version : 1.0
+ * Since : 2019. 04.16
+ * Author : 서울시 녹색교통 사전등록결제 개발팀
+ *
+
+ 수정일 수정자 수정내용
+
+ */
+@RestController
+public class BrsMemberCiMobileController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(BrsMemberCiMobileController.class);
+
+ /** GtpaBrsOpenapiService */
+ @Resource(name = "openapiService")
+ private GtpaBrsOpenapiService openapiService;
+
+ /** EgovPropertyService */
+ @Resource(name = "propertiesService")
+ protected EgovPropertyService propertiesService;
+
+ /** Validator */
+ @Resource(name = "beanValidator")
+ protected DefaultBeanValidator beanValidator;
+
+ private final static int SEQ_START = 0;
+ private final static int SEQ_END = 99999999;
+ protected static int iSequence = 0;
+ protected static Object objSequence = new Object();
+
+ /**
+ * ITF_BRS_I 사전등록 회원 휴대전화번호 요청 수신
+ */
+ //ITF_BRS_I 사전등록 회원 휴대전화번호 요청 수신
+ @PostMapping("/member/ciMobile")
+ public ResponseJsonVO jsonMemberManychild(@ModelAttribute MemberCiReqVO param) { //클라이언트에서 JSON반식으로 데이터 요청
+
+ //SimpleDateFormat debugFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS ");
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+ //String appr_dtm = debugFormat.format(new Date());
+
+ BrsCommonMessage cmmMsg = new BrsCommonMessage();
+ MemberCiResVO resData = new MemberCiResVO();
+ ResponseJsonVO resJson = new ResponseJsonVO();
+
+ final String sIFNo = "026"; //인터페이스 번호 eq.연계구분
+ LOGGER.info("[IF_BRS_"+sIFNo+"] /member/ciMobile > Param "+param.toString());
+
+ //TODO 변수 선언
+ final String sInsttNo = param.getInsttNo(); //기관 번호
+ final String sInsttCntcJobSe = param.getInsttCntcJobSe(); //기관 업무 구분
+ String sLogMno = sIFNo+"_"+dateFormat.format(new Date()).substring(0, 8); //세션 로그 관리번호
+ iSequence = 0; //초기값
+
+ //String resInsert = "";
+ String resUpdate = "";
+ String sqlException = "";
+
+ try
+ {
+ //TODO 로그 기록 IN
+ sLogMno = sLogMno+String.format("%08d", Integer.parseInt(openapiService.seqBrsBrsLog())); //세션 로그 관리번호
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"RequestJson : /member/ciMobile?"+param.toString());
+
+ //TODO 기본 파라미터 검증
+ if(param.getInsttNo() == null || "".equals(param.getInsttNo()) || "null".equals(param.getInsttNo()) || param.getInsttNo().length() > 12 ||
+ param.getInsttCntcJobSe() == null || "".equals(param.getInsttCntcJobSe()) || "null".equals(param.getInsttCntcJobSe()) || param.getInsttCntcJobSe().length() > 3 ||
+ param.getMberCi() == null || "".equals(param.getMberCi()) || "null".equals(param.getMberCi()) || param.getMberCi().length() > 90 ||
+ param.getVhcleNo() == null || "".equals(param.getVhcleNo()) || "null".equals(param.getVhcleNo()) || param.getVhcleNo().length() > 9 ){
+
+ //응답 오류메세지 전달
+ resJson.setResult("FAIL");
+ resJson.setResultCode("EC0001");
+ resJson.setResultMessage(cmmMsg.resultMessage(resJson.getResultCode()));
+ resJson.setData(null);
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"ResponseJson:"+resJson.toErrString());
+ LOGGER.info("[IF_BRS_"+sIFNo+"] "+resJson.getResult()+" > "+resJson.getResultCode()+"/"+resJson.getResultMessage());
+ return resJson;
+ }
+
+ //TODO 등록요청에 필요한 DB Select
+ //TODO DB Select 기관검증
+ HashMap mInsttInfo = new HashMap();
+ mInsttInfo.put("instt_no",sInsttNo); //기관번호
+ mInsttInfo = openapiService.selectTbBrsInsttInfo(mInsttInfo);
+ if(mInsttInfo == null || mInsttInfo.get("INSTT_NO").equals(sInsttNo) != true)
+ {
+ ///응답 오류메세지 전달
+ resJson.setResult("FAIL");
+ resJson.setResultCode("ES0001");
+ resJson.setResultMessage(cmmMsg.resultMessage(resJson.getResultCode()));
+ resJson.setData(null);
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"ResponseJson:"+resJson.toErrString());
+ LOGGER.info("[IF_BRS_"+sIFNo+"] "+resJson.getResult()+" > "+resJson.getResultCode()+"/"+resJson.getResultMessage());
+ return resJson;
+ }
+ LOGGER.debug("[IF_BRS_"+sIFNo+"] openapiService.selectTbBrsInsttInfo : "+mInsttInfo.get("INSTT_NO")+"/"+
+ mInsttInfo.get("INSTT_NM")+"/"+
+ mInsttInfo.get("INSTT_CHRGE_SE")+"/"+
+ mInsttInfo.get("INSTT_CHRGE_DETAIL")+"/"+
+ mInsttInfo.get("HMPG")+"/"+
+ mInsttInfo.get("MNGR_NM")+"/"+
+ mInsttInfo.get("MNGR_CTTPC")+"/"+
+ mInsttInfo.get("REGIST_DT")+"/"+
+ mInsttInfo.get("REGISTER_ID")+"/"+
+ mInsttInfo.get("UPDT_DT")+"/"+
+ mInsttInfo.get("UPDUSR_ID") );
+
+ //TODO DB Select 기관운영검증
+ HashMap mInsttOper = new HashMap();
+ mInsttOper.put("instt_no",sInsttNo); //기관번호
+ mInsttOper.put("instt_cntc_job_se",sInsttCntcJobSe); //기관 연계 업무구분
+ mInsttOper.put("use_at","Y");
+ mInsttOper = openapiService.selectTbBrsInsttOperInfo(mInsttOper);
+ if(mInsttOper == null || sIFNo.equals(sInsttCntcJobSe) != true)
+ {
+ ///응답 오류메세지 전달
+ resJson.setResult("FAIL");
+ resJson.setResultCode("ES0002");
+ resJson.setResultMessage(cmmMsg.resultMessage(resJson.getResultCode()));
+ resJson.setData(null);
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"ResponseJson:"+resJson.toErrString());
+ LOGGER.info("[IF_BRS_"+sIFNo+"] "+resJson.getResult()+" > "+resJson.getResultCode()+"/"+resJson.getResultMessage());
+ return resJson;
+ }
+ LOGGER.debug("[IF_BRS_"+sIFNo+"] openapiService.selectTbBrsInsttOperInfo : "+mInsttOper.get("INSTT_NO")+"/"+
+ mInsttOper.get("INSTT_CNTC_JOB_SE")+"/"+
+ mInsttOper.get("USE_AT")+"/"+
+ mInsttOper.get("REQUST_URL")+"/"+
+ mInsttOper.get("RSPNS_URL") );
+
+ //TODO 회원 전화번호 가져오기
+ HashMap mMberCi = new HashMap();
+ mMberCi.put("mber_ci",param.getMberCi()); //회원 필터 조건
+ mMberCi.put("vhcle_no",param.getVhcleNo()); //회원 필터 조건
+
+ Map mMberMobileInfo = openapiService.selectMemberMobileInfo(mMberCi);
+ if(mMberMobileInfo == null)
+ {
+ ///응답 오류메세지 전달
+ resJson.setResult("FAIL");
+ resJson.setResultCode("ES9999");
+ resJson.setResultMessage("휴대전화번호가 없는 회원입니다.");
+ resJson.setData(null);
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"ResponseJson:"+resJson.toErrString());
+ LOGGER.info("[IF_BRS_"+sIFNo+"] "+resJson.getResult()+" > "+resJson.getResultCode()+"/"+resJson.getResultMessage());
+ return resJson;
+ }
+
+ resData.setMobileNo((String) mMberMobileInfo.get("MOBILE_NO"));
+
+ resJson.setResult("SUCCESS");
+ resJson.setResultCode("E0000");
+ resJson.setResultMessage("정상");
+ resJson.setData((Object)resData);
+
+ //TODO 로그 기록 OUT
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"ResponseJson:"+resJson.toString());
+
+ } catch(RuntimeException e) {
+ resJson.setResult("EXCEPTION");
+ resJson.setResultCode("EE9000");
+ resJson.setResultMessage(cmmMsg.resultMessage(resJson.getResultCode()));
+ resJson.setData(null);
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"RuntimeException:"+resJson.getResultCode()+"/"+resJson.getResultMessage()+"/"+e.getClass().getName());
+
+ LOGGER.error("[IF_BRS_"+sIFNo+"] "+resJson.getResult()+" > "+resJson.getResultCode()+"/"+resJson.getResultMessage()+"/"+e.getClass().getName());
+ LOGGER.error("[IF_BRS_"+sIFNo+"] /member/ciMobile RuntimeException : " + e);
+ return resJson;
+
+ } catch(Exception e) {
+ resJson.setResult("EXCEPTION");
+ resJson.setResultCode("EE9000");
+ resJson.setResultMessage(cmmMsg.resultMessage(resJson.getResultCode()));
+ resJson.setData(null);
+ serviceBrsLogInsert(sLogMno,sInsttCntcJobSe,sInsttNo,"Exception:"+resJson.getResultCode()+"/"+resJson.getResultMessage()+"/"+e.getClass().getName());
+
+ LOGGER.error("[IF_BRS_"+sIFNo+"] "+resJson.getResult()+" > "+resJson.getResultCode()+"/"+resJson.getResultMessage()+"/"+e.getClass().getName());
+ LOGGER.error("[IF_BRS_"+sIFNo+"] /member/ciMobile Exception : " + e);
+ return resJson;
+ }
+
+ LOGGER.info("[IF_BRS_"+sIFNo+"] /member/ciMobile > Response "+resJson);
+ return resJson;
+ }
+
+ /**
+ * 로그정보를 저장한다.
+ */
+ public String serviceBrsLogInsert(String sLogMno, String sInsttCntcJobSe, String sInsttNo, String requstMsssage)
+ {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+ HashMap mLog = new HashMap(); //리턴 응답값
+ mLog.put("brs_log_mno", sLogMno); //발행번호 채번
+ mLog.put("seq_no",getSeqNumber());
+ mLog.put("instt_cntc_job_se", sInsttCntcJobSe);
+ mLog.put("instt_no", sInsttNo);
+ mLog.put("request_dt", dateFormat.format(new Date()));
+ mLog.put("requst_msssage",requstMsssage);
+ //DB insert
+ String res = openapiService.insertTbBrsLog(mLog);
+ mLog.clear();
+ if("1".equals(res) != true)
+ {
+ LOGGER.debug("[IF_BRS_"+sInsttCntcJobSe+"] openapiService.insertTbBrsLog("+res+") >"+sLogMno+"/"+sInsttNo+"/"+sInsttCntcJobSe+"/"+requstMsssage);
+ }
+ return res;
+ }
+
+ /**
+ * 로그 시퀀스번호를 생성한다. (로그번호+1)
+ */
+ public static String getSeqNumber() {
+
+ synchronized (objSequence) {
+ if (iSequence == SEQ_END)
+ iSequence = SEQ_START;
+
+ iSequence++;
+ return Integer.toString(iSequence);
+ }
+ }
+
+}
diff --git a/src/main/resources/egovframework/sqlmap/gtpabrs/mappers/Gtpa_Brs_Openapi_SQL.xml b/src/main/resources/egovframework/sqlmap/gtpabrs/mappers/Gtpa_Brs_Openapi_SQL.xml
index f4f5750..86de0e8 100644
--- a/src/main/resources/egovframework/sqlmap/gtpabrs/mappers/Gtpa_Brs_Openapi_SQL.xml
+++ b/src/main/resources/egovframework/sqlmap/gtpabrs/mappers/Gtpa_Brs_Openapi_SQL.xml
@@ -1603,8 +1603,8 @@
, TRIM(DGUARD.DECRYPT('ENC','COL',B.MBER_MOBLPHON_NO)) AS MBER_MOBLPHON_NO
, TRIM(NVL(C.SU_PBLMNG_PRKPLCE,'Y')) AS SU_PBLMNG_PRKPLCE
- , TRIM(NVL(C.NAMSAN_PASMNY,'Y')) AS NAMSAN_PASMNY
- , TRIM(NVL(C.NAMSAN_FFNLG,'Y')) AS NAMSAN_FFNLG
+ , TRIM(NVL(C.NAMSAN_PASMNY,'N')) AS NAMSAN_PASMNY
+ , TRIM(NVL(C.NAMSAN_FFNLG,'N')) AS NAMSAN_FFNLG
, TRIM(NVL(C.GREEN_TRNSPORT_FFNLG,'Y')) AS GREEN_TRNSPORT_FFNLG
, TRIM(NVL(C.JMP_SETLE_AGRE_TY,'N')) AS JMP_SETLE_AGRE_TY
@@ -2423,4 +2423,15 @@
AND VHCLE_OWNER_CI = TRIM(#{vhcle_owner_ci})
AND VHCLE_STTUS_TY = '02'
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index ef17c29..491a7f5 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,7 +1,12 @@
-
-
+
gtpa.brs.openapi
+
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
diff --git a/target/.gitignore b/target/.gitignore
new file mode 100644
index 0000000..840e7d3
--- /dev/null
+++ b/target/.gitignore
@@ -0,0 +1 @@
+/classes/
diff --git a/target/m2e-wtp/web-resources/.gitignore b/target/m2e-wtp/web-resources/.gitignore
new file mode 100644
index 0000000..3385916
--- /dev/null
+++ b/target/m2e-wtp/web-resources/.gitignore
@@ -0,0 +1 @@
+/META-INF/