JKPN(JoonKyu's Packet Notation) - C++ Library for Tree Structure Information Processing
=======================================================================================


Copyright 2016 ~ Joongyu Choi(J.Choi)
gocjg@chol.com


1. 소개
-------
JKPN은 전문(Communication Packet Data)의 각 항목(Field)들에 대한 구조 및 정보들을 Script문장으로 간단하게
표기하고, 이를 C++ 통신 프로그램에서 전문의 제작(송신) 및 분석(수신)을 위해, 쉽고 빠르게 Coding할 수 있도록
지원하기 위한 라이브러리입니다.

기존의 JSON(JavaScript Object Notation)처럼 트리구조정보를 수용하면서, 윈도우시스템의 INI파일같은 간단한
설정 정보용으로 활용할 수도 있습니다.

전문 내의 각 항목들을 객체로 구조화하여 Script문장으로 표현하고, 이를 직렬화된 코드열로 제작하여 송신전문에
활용하거나, 수신전문을 자동 분해/할당처리할 수 있습니다.
또한, 보안이 필요한 정보들을 위하여 작성한 Script형 JKPN문장을 암호화된 코드열로 저장시켜 보안을 강화할 수
있습니다.

자세한 사용법은 예제소스와 사용자설명서(User Manual)를 참조하십시요.


2. 이용약관
-----------
본 프로그램은 저작권법에 의해 보호를 받습니다.
하지만, [Lite] 에디션은 좀 더 자유로운 소프트웨어 라이센스를 적용합니다.

만약, 사용자 분들이 라이센스 동의에 관하여 어떠한 질문이 있다면 gocjg@chol.com으로 메일을 보내주십시요.
보다 상세한 라이센스 내용은 본 제품에 포함되어진 License_language.txt 화일을 참조하여 주십시요.


3. 테스트 실행
--------------
콘솔 창에서 JKPN테스트 프로그램을 실행시키는 방법을 나타내었다.
  1) 콘솔창(cmd.exe)을 열고, jkpn.exe가 존재하는 폴더로 이동한다.
  2) jkpn “jkpn파일경로”
실제로 실행시켜보기 위해 bin_dev폴더로 이동하여, 아래와 같이 입력한다.
  jkpn ../src/jkpn-1.5.0/build/vs2008/tests/sample/sample.jkpn

4. 변경기록
-----------------------------------------------------------------------------------------------
  버전    |  날자
-----------------------------------------------------------------------------------------------
+ 1.5.1.0 | 2018년 03월 06일
 * rvalue-references 기능 적용
	1. 적용 범위
		1) 필드명칭 할당
		2) 배열요소 추가/할당
	2. 효과
		복사하지 않고, 정보를 이동시켜 처리성능 향상 효과 기대
	3. 결과(변경/추가 파일)
		1) jkpn모듈 소스
			> include/jkpn-1.5.0/jkpn_config.h											JKPN_USE_RVR 선행정의 추가
			> include/jkpn-1.5.0/jkpn_field.h												이동생성자/배열요소 추가
			> src/jkpn-1.5.0/src/jkpn_field.cpp													"
			> include/jkpn-1.5.0/type_AllotString.h									이동생성자/대입연산자 추가
			> src/jkpn-1.5.0/src/type_AllotString.cpp										"
-----------------------------------------------------------------------------------------------
+ 1.5.1.0 | 2018년 03월 06일
 * vs2017:release 모드에서 Heap익셉션(Critical error detected C0000374) 발생
	1. 현상
		디버그 모드에서는 정상적으로 동작되나, 릴리즈 모드에서만 이상 현상이 발생하여 프로그램이 종료된다.
	2. 원인
		필드명칭에 사용되는 CAllotString 클래스의 대입연산자에 인자 타입을 잘 못 정의하여 발생된다.
	3. 해결 방법
		아래 처럼 변경하였다.
			CAllotString& CAllotString::operator=(CAllotString a_roOther)  ->  CAllotString& CAllotString::operator=(const CAllotString& a_croOther)
	4. 결과(변경/추가 파일)
		1) jkpn모듈 소스
			> include/jkpn-1.5.0/type_AllotString.h									변경
			> src/jkpn-1.5.0/src/type_AllotString.cpp								변경
-----------------------------------------------------------------------------------------------
+ 1.5.1.0 | 2018년 03월 05일
 * 32/64비트 OS환경적응 및 라이브러리/어플간 매칭을 위한 packing처리
	1. 현상
		유니코드를 콘솔화면에 출력 시, 불안전하여 다음 필드(항목)로에 진행이 안된다.
	2. 원인
		windows-10 콘솔창이 이진코드에 대한 대응이 불안전하다.
	3. 해결 방법
		[2. 해당 루트필드 내의 모든 필드들을 자동출력] 테스트 항목 부분에서 일시적으로 변경 후, 다음 테스트 진행시킴
	4. 결과(변경/추가 파일)
		1) jkpn예제 소스
			> include/jkpn-1.5.0/type_AllotString.h										추가
			> include/jkpn-1.5.0/type_HeapString.h										추가
			> include/jkpn-1.5.0/type_StaticString.h									추가
			> include/jkpn-1.5.0/jkpn_field.h													추가
			> include/jkpn-1.5.0/loader_IBase.h												추가
			> include/jkpn-1.5.0/loader_ICommon.h											추가
			> include/jkpn-1.5.0/loader_SER.h													추가
			> include/jkpn-1.5.0/jkpn_loader.h												추가
			> include/jkpn-1.5.0/loader_config.h											추가
			> include/jkpn-1.5.0/loader_define.h											추가
			> include/jkpn-1.5.0/jkpn_common_class.h									추가
			> include/jkpn-1.5.0/error_base.h													추가
			> include/jkpn-1.5.0/jkpn_config.h												추가
		2) 상세
			위 파일들의 "구조체 packing", "구조체 unpacking" 참조
-----------------------------------------------------------------------------------------------
+ 1.5.1.0 | 2018년 03월 05일
 * windows-10 콘솔창의 특성으로 인한 테스트 출력 오류 문제
	1. 현상
		유니코드를 콘솔화면에 출력 시, 불안전하여 다음 필드(항목)로에 진행이 안된다.
	2. 원인
		windows-10 콘솔창이 이진코드에 대한 대응이 불안전하다.
	3. 해결 방법
		[2. 해당 루트필드 내의 모든 필드들을 자동출력] 테스트 항목 부분에서 일시적으로 변경 후, 다음 테스트 진행시킴
	4. 결과(변경/추가 파일)
		1) jkpn예제 소스
			> ./build/vs2008/tests/sample/main.cpp									변경/추가
		2) 상세
				// [JKC:20180305-1203] 윈도우 버전마다 콘솔창의 차이로 인하여, "unicode-test"항목을 직접출력 못하여, 일시적으로 변경한다.
			>	l_oRoot["unicode-test"].setValue("_unicode_");
				test_auto_display(l_oRoot);
				// [JKC:20180305-1203] 윈도우 버전마다 콘솔창의 차이로 인하여, "unicode-test"항목을 복원/설정한다.
			>	l_oRoot["unicode-test"] = jkpn::ToUnescapeString("\\uD55C\\uAE00");
-----------------------------------------------------------------------------------------------
+ 1.5.0.0 | 2018년 01월 24일
 * 버전업
	1. 상세 정보
		1) 버전 1.5.0로 변경
		2) [비인접필드간 연동처리] 내장키워드/외부제공키워드 추가
			> 내장키워드 한 쌍(include/jkpn-1.5.0/field_define.h파일 참조)
				- sizedef_n / sizeset_n
			> 외부제공키워드 두 쌍(include/jkpn-1.5.0/addin/jkpn_esk_additional.cpp파일 참조)
				- chksumbegin / chksumset
				- sizedef4mul / sizeset4mul
		3) [비인접필드간 연동처리]가 필요한 외부제공키워드 추가/구현 방법(include/jkpn-1.5.0/addin/jkpn_esk_additional.cpp파일 참조)
			3-1) 연동처리를 위한 한 쌍의 외부제공키워드를 정의한다.
				- eESKI_Additional 나열상수에 인덱스 추가
				- s_arrESKI_ADD  키워드명칭에 문자열 추가
			3-2) 아래의 [키워드 인덱스/옵션값]관련 함수들은 대부분 공통적인 구현으로 특별히 변경하지 않지만, 옵션값 키워드의 범위를 제한 한다면 작업이 필요할 것이다.
				- esk_additional_check_idx()
				- esk_additional_get_idx()
				- esk_additional_get_txt()
			3-3) 아래의 전문처리 관련 함수들은 전문데이터의 제작/분해/체크에 직접적인 영향을 끼치므로, 기존 소스를 상세하게 분석하여 추가시킬 키워드를 구현해야만 한다.
				아래의 각 함수들은 해당 필드의 참조자 인자로 하여금, 그 필드의 내부제공인수(T_ISA4ESK)를 활용하여 비인접필드의 정보들을 연동할 수 있다.
				그 내부제공인수는 전문데이터(m_uPacket)와 기억필드벡터(m_pvecMFI)로 이루어져 있다.
				전문데이터/기억필드벡터를 어떻게 활용하여, 비인접필드간에 연동처리를 구현하는지는 3-3-n)항목에서 자세하게 설명한다.
					- esk_additional_allot_pkt() : 전문데이터 제작에 사용될 필드값을 사전에 키워드에 따라서 제작/할당이 필요할 경우
					- esk_additional_parse_pkt() : 전문데이터 분해/할당  전의 사전작업이 필요할 경우
					- esk_additional_check_pkt() : 전문데이터 유효성체크 전의 사전작업이 필요할 경우
				--------------------------------
				3-3-1) esk_additional_allot_pkt()함수에 대하여...
					> 본 함수의 필드참조 인자(a_roAllotField)에서 내부제공인수를 얻어낸다.
						const T_ISA4ESK&		l_crtCPIA4ESK = a_roAllotField.pkt_GetISA4ESK();
					> 내부제공인수의 정보는 아래와 같다.
						- m_uPacket = 본 필드 이전까지 제작된 전문데이터
													반드시, 본 함수는 [m_tOrgPkt변수가 아닌 m_poMadePkt을 사용]해야만 한다.
						- m_pvecMFI = 비인접필드와 연동처리가 필요한 이전 (외부제공키워드)필드들의 정보를 저장시킨 벡터 리스트
													또는, 이후의 필드들에 자신의 필드정보를 제공해야할 정보를 추가
					> 내부제공인수의 활용법은 ESKI_ADD_chksumbegin/ESKI_ADD_chksumset 부분을 참조하라.
						어떻게 2byte 체크섬 코드를 제작/할당하는지를 알 수 있다.
				--------------------------------		
				3-3-2) esk_additional_parse_pkt()함수에 대하여...
					> 본 함수의 필드참조 인자(a_roParseField)에서 내부제공인수를 얻어낸다.
						const T_ISA4ESK&		l_crtCPIA4ESK = a_roParseField.pkt_GetISA4ESK();
					> 내부제공인수의 정보는 아래와 같다.
						- m_uPacket = 분해/할당을 원하는 원시전문데이터
													반드시, 본 함수는 [m_poMadePkt변수가 아닌 m_tOrgPkt을 사용]해야만 한다.
						- m_pvecMFI = 비인접필드와 연동처리가 필요한 이전 (외부제공키워드)필드들의 정보를 저장시킨 벡터 리스트
													또는, 이후의 필드들에 자신의 필드정보를 제공해야할 정보를 추가
					> 내부제공인수의 활용법은 ESKI_ADD_sizedef4mul/ESKI_ADD_sizeset4mul 부분을 참조하라.
						어떻게 [sizedef4mul필드값]을 4의 배수로 변환하여, [sizeset4mul필드:전문표현:길이]에 설정하는지를 알 수 있다.
				--------------------------------
				3-3-3) esk_additional_check_pkt()함수에 대하여...
					> 본 함수의 필드참조 인자(a_roCheckField)에서 내부제공인수를 얻어낸다.
						const T_ISA4ESK&		l_crtCPIA4ESK = a_roCheckField.pkt_GetISA4ESK();
					> 내부제공인수의 정보는 아래와 같다.
						- m_uPacket = 유효성검사를 원하는 원시전문데이터
													반드시, 본 함수는 [m_poMadePkt변수가 아닌 m_tOrgPkt을 사용]해야만 한다.
						- m_pvecMFI = 비인접필드와 연동처리가 필요한 이전 (외부제공키워드)필드들의 정보를 저장시킨 벡터 리스트
													또는, 이후의 필드들에 자신의 필드정보를 제공해야할 정보를 추가
					> 내부제공인수의 활용법은 ESKI_ADD_chksumbegin/ESKI_ADD_chksumset 부분을 참조하라.
						어떻게 2byte 체크섬 코드를 검사하는지를 알 수 있다.
				--------------------------------
	2. 결과(변경/추가 파일)
		1) jkpn모듈 소스
			> ./include/jkpn-1.5.0/jkpn_config.h										버전 1.5.0으로 변경
			> ./include/jkpn-1.5.0/jkpn_field.h											1) [비인접필드간 연동처리]에 필요한 함수/변수 변경 및 추가
																																1-1) 기존 [전문데이터 할당함수]타입/명칭 변경
																																	- CFields::FP_ESK_ALLOT     -> CFields::FP_ESK_ALLOT_PKT 변경
																																	- CFields::setKwFunc4Allot  -> CFields::setAllotPktFP4ESK 변경
																																	- CFields::getKwFunc4Allot  -> CFields::getAllotPktFP4ESK 변경
																																1-2) [전문데이터 분해/할당 전의 사전작업]타입/함수/변수 추가
																																	- CFields::FP_ESK_PARSE_PKT 타입
																																	- CFields::setParsePktFP4ESK() 설정함수
																																	- CFields::getParsePktFP4ESK() 얻기함수
																																	- CFields::s_fpParsePkts4ESK[...] 변수
																																1-3) [전문데이터 체크]타입/함수/변수 추가
																																	- CFields::FP_ESK_CHECK_PKT 타입
																																	- CFields::setCheckPktFP4ESK() 설정함수
																																	- CFields::getCheckPktFP4ESK() 얻기함수
																																	- CFields::s_fpCheckPkts4ESK[...] 변수
																																1-4) 전문길이 얻기 함수들에 [D속성필드:전문표현:길이]를 0으로 인식할 것인지 여부 인자(a_bZero4D) 추가
																																	- CFields::pkt_Len4OneSelf()
																																	- CFields::pkt_Len4Children()
																																1-5) 필드값을 전문표현정보에 따라 변환 시의 길이를 리턴하는 함수 추가([전문표현:길이]정보에 제한 받지 않음)
																																	- CFields::pkt_Len4PEI()
																																1-6) 키워드들에 대한 상세한 체크함수 추가
																																	- CFields::pkt_DetailCheck4OneSelf()
																																	- CFields::pkt_DetailCheck4Children()
																															2) [비인접필드간 연동처리]지원 함수들 추가
																																2-1) CFields::getVK()           : 필드의 값종류 얻기
																																2-2) CFields::resizeCodes()     : 필드가 코드열타입일 때, 코드열사이즈 재조절
																																2-3) CFields::toSint64()        : 필드값을 Sint64/Uint64 형태로 얻기
																																2-4) CFields::pkt_GetExp()      : 필드의 전문표현정보 얻기 함수의 리턴값 변수형 변경
																																2-5) CFields::pkt_GetISA4ESK()  : 필드의 [내부제공인수]정보 구조체 얻기
			> ./include/jkpn-1.5.0/field_define.h										1) [전문표현:길이:동적할당]속성(LEN_EC_DRT) 추가
																															2) [비인접필드간 연동처리] 내장키워드 한 쌍(sizedef_n/sizeset_n) 추가
																															3) sf_isValidISKI()함수 빠른처리를 위해 수정
																															4) [전문표현:필드길이표현] 1bit -> 2bit로 변경
																															5) [비인접필드간 연동처리]에 필요한 구조체/공용체 정의
																																- [기억필드      ]정보 구조체(T_MEMOFIELDINFO) 정의 추가
																																- [원시전문데이터]정보 구조체(T_ORGPKTINFO)    정의 추가
																																- [전문데이터    ]정보 공용체(U_ORGPKTINFO)    정의 추가
																																- [내부제공인수  ]정보 구조체(T_ISA4ESK)       정의 추가
			> ./include/jkpn-1.5.0/jkpn_utilities.h									aton64() : 아스키스트림을 Sint64/Uint64 형으로 변환하는 함수 구현부 추가
			> ./src/jkpn_field.cpp																	1) 외부제공키워드 설정/얻기 함수 구현
																																- CFields::setParsePktFP4ESK()
																																- CFields::getParsePktFP4ESK()
																																- CFields::setCheckPktFP4ESK()
																																- CFields::getCheckPktFP4ESK()
																															2) CFields::removeAll()함수 수정
			> ./src/jkpn_field_as.cpp																필드값을 Sint64/Uint64 형태로 얻기 함수 구현
																																- CFields::toSint64()
																																- CFields::toUint64()
			> ./src/jkpn_field_packet.cpp														1) [비인접필드간 연동처리]구현을 위한 기존 함수들 수정
																																- CFields::pkt_Len4OneSelf()
																																- CFields::pkt_Len4Children()
																																- CFields::pkt_Make4OneSelf()
																																- CFields::pkt_Make4Children()
																																- CFields::pkt_Parse4OneSelf()
																																- CFields::pkt_Parse4Children()
																															2) [비인접필드간 연동처리]구현을 위해 신규함수 추가
																																- CFields::pkt_Len4PEI()
																																- CFields::pkt_DetailCheck4OneSelf()
																																- CFields::pkt_DetailCheck4Children()
			> ./src/jkpn_field_value.cpp														CFields::clearValue()함수에서 참조값(VK_fix/VK_valid)이 보존 가능하도록 수정
			> ./src/loader_SER.cpp																	[전문표현:길이:동적할당]속성(LEN_EC_DRT)에 따른 구현부 추가
			> ./src/internal_util.cpp																서두처리코드열의 사이즈를 재조절하는 함수(resizePrefixedString()) 구현부 추가
			> ./src/internal_util.h																	서두처리코드열의 사이즈를 재조절하는 함수(resizePrefixedString()) 정의부 추가
			> ./src/jkpn_utilities.cpp															aton64() : 아스키스트림을 Sint64/Uint64 형으로 변환하는 함수 정의부 추가
			> ./src/saver_ISaver.cpp																[전문표현:길이:동적할당]속성(LEN_EC_DRT)에 따른 구현부 추가
		2) jkpn_esk모듈 소스
			> ./include/jkpn-1.5.0/addin/jkpn_esk_linker.h					외부제공키워드에 대한 [인덱스/전문]처리 함수들을 CFields::정적변수들에 연결시키는 esk_link()함수 정의
			> ./include/jkpn-1.5.0/addin/jkpn_esk_linker.cpp				외부제공키워드에 대한 [인덱스/전문]처리 함수들을 CFields::정적변수들에 연결시키는 esk_link()함수 구현
			> ./include/jkpn-1.5.0/addin/jkpn_esk_additional.h			원시전문데이터 분해/체크함수 정의부 추가
																																- esk_additional_parse_pkt()
																																- esk_additional_check_pkt()
			> ./include/jkpn-1.5.0/addin/jkpn_esk_additional.cpp		1) 비인접필드간 연동하여 필드값을 할당하도록 처리
																																- esk_additional_allot_pkt()
																															2) 원시전문데이터 분해/체크함수 구현부 추가
																																- esk_additional_parse_pkt()
																																- esk_additional_check_pkt()
																															3) [비인접필드간 연동처리] 외부제공키워드 두 쌍 추가
																																- chksumbegin / chksumset
																																- sizedef4mul / sizeset4mul
		3) jkpn예제 소스
			> ./build/vs2008/tests/sample/test_packet_display.cpp		[비인접필드간 연동처리] 내/외부제공키워드 테스트 추가
			> ./build/vs2008/tests/sample/sample.jkpn								[비인접필드간 연동처리] 내/외부제공키워드(sizedef_n/sizeset_n/chksumbegin/chksumset/sizedef4mul/sizeset4mul) 추가
-----------------------------------------------------------------------------------------------
+ 1.0.5.0 | 2017년 07월 26일
 * 버전업
	1. 상세 정보
		1) 버전 1.0.5로 변경
		2) [_cls -> _o] 클래스변수명의 서두문자열 변경(대부분의 소스파일에 영향을 미침)
		3) 대입연산자에서 빠른처리를 위해, 여러가지 데이터타입별로 처리하도록 추가
			> CFields& operator=(bool		a_bValue);									// 운영값(VK_act)에 해당 boolean값을 설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(Sint32	a_siValue32);								// 운영값(VK_act)에 해당  Sint32값을 설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(Uint32	a_uiValue32);								// 운영값(VK_act)에 해당  Uint32값을 설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(Sint64	a_siValue64);								// 운영값(VK_act)에 해당  Sint64값을 설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(Uint64	a_uiValue64);								// 운영값(VK_act)에 해당  Uint64값을 설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(double	a_dbValue);									// 운영값(VK_act)에 해당  double값을 설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(const char* a_cpszValue);					// 운영값(VK_act)에 해당     NULL종료문자열을 복사/설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(const JKPN_STRING& a_cstrValue);		// 운영값(VK_act)에 해당             코드열을 복사/설정하고, 본 필드의 참조자를 리턴한다.
			>	CFields& operator=(const CStaticString& a_csstrValue);// 운영값(VK_act)에 해당 정적NULL종료문자열을 복사/설정하고, 본 필드의 참조자를 리턴한다.
	2. 결과(변경/추가 파일)
		1) jkpn모듈 소스
			> ./include/jkpn-1.0.5/jkpn_config.h										변경
			> ./include/jkpn-1.0.5/jkpn_field.h											추가
			> ./src/jkpn_field_operator.cpp													추가
		2) jkpn예제 소스
			> ./build/vs2008/tests/sample/test_manual_access.cpp		변경
-----------------------------------------------------------------------------------------------
+ 1.0.1.0 | 2017년 03월 12일
 * 1차자식들 중에서, ID로  필드명 얻기/설정 함수(CFields::getChildName4ID/CFields::setChildName4ID) 추가
 * 1차자식들 중에서, 필드명으로 ID얻기 함수(CFields::getChildID4Name) 추가
-----------------------------------------------------------------------------------------------
+ 1.0.1.0 | 2017년 03월 06일
 * CFields::removeChildAt()함수 오류 발견
	1. 현상
		호출 후, 해당 자식요소의 [값/주석]만 제거되고, [ID/필드명/전문표현정보/ESK인수포인터/오프셋]들은 유지되고 있다.
	2. 원인
		vector의 변수타입이 구조체/클래스의 경우, erase()함수 호출 시, 메모리만 해제하지 않고, 지워야할 객체의 이후에 존재하는 객체들을 할당연산자(=)로 줄줄이 복사한다.
		이로 인하여, 현재 할당연산자가 값정보(데이터타입/값/서두처리여부)만을 복사/할당 처리하여 발생되는 문제이다.
	3. 해결 방법
		할당연산자에서 값정보(값/주석)만 복사(setValue)하지 않고, [ID/필드명/전문표현정보/ESK인수포인터/오프셋]중에 하나라도 존재하면 필드복사(setField)를 하도록 처리한다.
	4. 결과(변경/추가 파일)
		1) jkpn모듈 소스
			> ./src/jkpn_field_operator.cpp													변경
		2) jkpn예제 소스
			> ./build/vs2008/tests/sample/main.cpp									변경
			> ./build/vs2008/tests/sample/test_remove_elements.cpp	파일추가
			> ./build/vs2008/tests/sample/test_remove_elements.h		파일추가
			> ./build/vs2008/tests/sample/test_config.h							변경
			> ./build/vs2008/tests/sample/sample.jkpn								변경
	5. 향후 개선사항
		vector에 구조체/클래스를 사용할 경우, erase()함수로 삭제 시, 복사로 인한 비효율이 발생하므로 향 후에 포인터로 변경하여, 성능을 향상시킬 필요가 있다.
		> typedef std::vector<CFields>	FieldVector_t;			->	typedef std::vector<CFields*>	FieldVector_t;
-----------------------------------------------------------------------------------------------
+ 1.0.1.0 | 2017년 02월 28일
 * 여러형태의 1차자식 인덱스 얻기 함수(CFields::getChildIdx4~~~) 추가
-----------------------------------------------------------------------------------------------
+ 1.0.0.0 - 2016년 10월 03일
 * [Lite] 에디션 1.0.0 출시.
-----------------------------------------------------------------------------------------------