목차


데이터마이닝의 개요

  • 인공지능, 머신러닝, 딥러닝, 데이터마이닝의 정의, 차이점
  • 데이터마이닝

인공지능이란?

사람의 지능을 필요로 하는 작업을 수행할 수 있는 컴퓨터 시스템을 지칭하는 말이다. 4차 산업의 핵심 기술로 대두되며, 사물인터넷이나, 센서 및 네트워크에서 제공되는 빅데이터를 효율적으로 관리 분석하는 소프트웨어와 비슷한 개념.

의사결정을 자동화 하는데 중점을 두는 면에서 머신러닝과 공통점을 가지나, 머신러닝은 인간의 행동과 관련이 없을 수 있다는 점에서 차이가 있다.

머신러닝(기계학습)이란?

인공지능을 구현하는 구체적인 방식으로 규칙 기반 프로그램의 구현하는 데 너무 큰 노력이 들고, 새로운 변화에 적응하기도 어려우며, 미묘한 차이를 규칙을 만드는 것에 대한 한계점 들로 인하여 개선책으로 나온 방법이다. 최근에는 주로 분류나 예측을 주요 목적으로 사용하고 있는 추세이다.

ex) 추천시스템 알고리즘, 이메일의 스팸여부 판별

딥러닝(심화학습)이란?

기존 머신러닝 알고리즘은 특징들을 매핑시켜 분류, 예측을 하는 반면, 딥러닝의 경우 추상적인 자료에서 특징을 추출하여 분류 및 예측을 한다. 모델의 성능은 좋으나 어떤 이유로 그렇게 분류 예측 모형인지 설명할 수 없는 블랙박스모형이라는 단점과 학습을 위해 많은 자료를 요구한다는 단점 등이 있다.

ex) 사진을 통한 분류, 사진을 생성, 음성인식 등의 방법

데이터마이닝이란?

Mining은 채굴, 채광하다라는 뜻으로 즉, 데이터마이닝은 거대한 양의 데이터 속에 쉽게 드러나지 않는 통계적 규칙이나 패턴과 같은 유용한 정보를 찾아내는 과정이라 말할 수 있다. 데이터 내에 정보를 찾는 것이 주 목적이라 할 수 있으며, 데이터에 기반 하여 지식 패턴을 추출하기 때문에 전문가가 간과해 버릴 수도 있는 지식 패턴들까지 찾아 낼 수 있는 기술이라 할 수 있다.


데이터마이닝의 종류

  • 분류 : 새롭게 나타나는 현상을 기존 정의된 집합에 배정하는 것을 의미
  • 추정 : 수입, 수준, 신용잔고처럼 연속된 변수의 값을 추정하는 것을 의미
  • 예측 : 미래의 값을 추정하거나 분류하는 것을 의미
  • 군집 : 이질적인 모집단을 동질성을 지닌 그룹별로 세분화 하는 것을 의미
  • 연관 : 같이 팔리는 물건들 사이의 연관성을 파악하는 분석

머신러닝의 종류

  • 지도학습 : 독립변수와 종속변수의 쌍으로 된 자료가 주어질 때 새로운 자료에 대하여 문제를 풀 수 있는 함수를 찾는 학습방법
  • 비지도학습 : 종속변수가 없이 자료들로부터 패턴을 추출하는 학습방법(데이터 마이닝의 군집의 개념)
  • 강화학습 : 문제에 대한 직접적인 해답을 주지 않고 경험을 통해 기대값이 최대가 되는 것을 찾는 학습방법

마리오 딥러닝, 최근의 알파고

  • 반지도학습 : 지도학습과 비지도학습을 같이 사용하는 방법
  • 전이학습 : 딥러닝으로 추출된 변수로 다른 모델을 학습하는 방법

학습인란? 데이터를 잘 반영하는 모형을 찾는 것으로 이상적인 모수를 찾는 것을 의미

R의 자료구조

R은 기본적으로 vector, matrix, data.frame, list의 객체구조를 가질 수 있으며, 자료의 유형은 numeric, character, Factor, Logical로 구분됩니다.


객체별 특징

  • vector : 하나 혹은 여러개의 값을 가질 수 있으며, 하나의 자료형태로 구성
  • matrix : 같은 길이의 여러개의 벡터의 결합으로 이루어진 객체로, 하나의 자료형태로 구성
  • data.frame : 같은 길이의 여러 개의 벡터의 결합으로 이루어진 객체이며, 여러개의 자료형태를 가질 수 있다.
  • list : 다른 길이의 여러 개의 벡터의 결합으로 이루어진 객체이며, 여러개의 자료형태를 가질 수 있다.

객체 생성

c() : 연결하다는 뜻의 concatenate의 줄임말로 벡터를 생성할 때 사용 된다. <- : c()와 같은 기능을 한다. <<- : 할당되는 객체가 전역변수가 될 수 있게 한다. data.frame() : 데이터 프레임의 객체구조를 생성 할 수 있다. list() : list의 객체구조를 생성할 수 있다.

자동 객체 변환

아래와 같이 자료의형태가 서로 다를 경우 자동변환을 해준다. 자동변환의 우선순위는 문자, 숫자, 논리 순으로 진행된다.


# 1, 2, 5를 a에 할당
a<-c(1,2,5)
a
[1] 1 2 5
# 1부터 5까지 1의 간격으로 a에 할당
a<-1:5
a
[1] 1 2 3 4 5
# 'a','b','c'를 b에 할당
b<-c('a','b','c')
b
[1] "a" "b" "c"
# TRUE,FALSE를 c에 할당
c=c(TRUE,FALSE)
c
[1]  TRUE FALSE
# 'a','TRUE','1'로 자동 객체변환
d=c('a',T,1)
d
[1] "a"    "TRUE" "1"   
# TRUE가 1로 자동 객체변환
e=c(T,2)
e
[1] 1 2
# b, d 벡터를 데이터프레임으로 생성
data.frame(b,d)
ABCDEFGHIJ0123456789
b
<fctr>
d
<fctr>
aa
bTRUE
c1
# a,b,c,d,e 객체를 리스트로 생성
list(a,b,c,d,e)
[[1]]
[1] 1 2 3 4 5

[[2]]
[1] "a" "b" "c"

[[3]]
[1]  TRUE FALSE

[[4]]
[1] "a"    "TRUE" "1"   

[[5]]
[1] 1 2

데이터 핸들링에 유용한 함수

seq(from=,to=,by=) : by의 간격으로 from부터 to 까지의 수열을 생성

seq(from=,to=,length.out=) : length.out의 갯수에 맞게 from 부터 to 까지 수열을 생성

rep(x=,times=) : x를 times만큼 반복

rep(x=,each=) : x에 대해 각각 each만큼 반복


#1,10까지 2의 간격으로 정수 생성
seq(1,10,by=2)
[1] 1 3 5 7 9
#1,10까지 5개 실수 생성(1)
seq(1,10,length.out = 5)
[1]  1.00  3.25  5.50  7.75 10.00
#1,10까지 5개 실수 생성(2)
seq(1,10,len = 5)
[1]  1.00  3.25  5.50  7.75 10.00
#1,2,3을 2번 반복
rep(1:3,times=2)
[1] 1 2 3 1 2 3
#1,2,3을 각각 2번씩 반복
rep(1:3,each=2)
[1] 1 1 2 2 3 3
#1을1번 2를2번 3을 3번 반복
rep(1:3,times=1:3)
[1] 1 2 2 3 3 3

R의 도움말

help(찾으려는함수) 나 ?찾으려는함수를 통해 help를 볼 수 있다.

찾으려는 함수의 이름을 모르는 경우 help.search를 사용하면 좀더 편리하다.

help(seq)
?help
?`<`
help.search("multivariate normal")

연산

산술연산자 : +(덧셈),-(뺄셈), *(곱셈),/(나눗셈),^(거듭제곱),sqrt(제곱근)

%/% : 몫

%% : 나머지

?Syntax : 연산자의 우선순위를 확인가능

#산술연산
1+2
[1] 3
#2의 제곱근
sqrt(2)
[1] 1.414214
#2의 거듭제곱
2^2
[1] 4
#4/3의 실수값
4/3
[1] 1.333333
#3으로 4를 나누었을 때 몫
7%/%3
[1] 2
#3으로 4를 나누었을 때 나머지 
7%%3
[1] 1

subset, which

subset() : 해당 조건을 만족하는 원소만을 출력. 결측값은 무시

which() : 해당 조건을 만족하는 원소들의 위치를 출력. 결측값은 무시

# x 생성
x<-c(6, 1:3, NA, 12)
x
[1]  6  1  2  3 NA 12
#5보다 큰 x 추출(인덱싱이라 표현)
x[x>5]
[1]  6 NA 12
#5보다 큰 x 추출
subset(x,x>5)
[1]  6 12
#5보다 큰 x의 위치 반환
which(x>5)
[1] 1 6

패키지의 설치와 불러오기

install.packages(‘패키지명’) : 로컬 컴퓨터에 패키지를 설치하는 함수.

.libPaths() : 패키지가 저장되는 경로를 설정 및 확인하는 함수.

library(‘패키지명’) : 패키지를 불러오는 함수. 패키지가 로컬컴퓨터에 설치되어 있지 않으면 Error를 반환

require(‘패키지명’) : 패키지를 불러오는 함수. 패키지가 로컬컴퓨터에 설치되어 있지 않으면 warning을 반환


[plyr]http://rpubs.com/qkdrk777777/459300

[reshape]http://rpubs.com/qkdrk777777/459495

LS0tCnRpdGxlOiAiQUkg7JmAIE1hY2hpbmUgTGVhcm5pbmfsnYQg7JyE7ZWcIOu5heuNsOydtO2EsCDsi6TsirUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICB0aGVtZTogc3BhY2VsYWIKLS0tCgoqKioqCgojIOuqqeywqAoKKyAqKlsyMDE5LTA3LTE3ICjsmKTsoIQpIDog642w7J207YSw66eI7J2064udIOqwnOyalOyZgCBSIOq4sOy0iCDsgqzsmqnrspVdKGh0dHA6Ly9ycHVicy5jb20vcWtkcms3Nzc3NzcvNTExOTQyKSoqCisgWzIwMTktMDctMTcgKOyYpO2bhCkgOiDquLDstIgg7Ya16rOE67aE7ISdXShodHRwOi8vcnB1YnMuY29tL3FrZHJrNzc3Nzc3LzUxMTk0MSkKKyBbMjAxOS0wNy0xOCAo7Jik7KCEKSA6IOygle2YleuNsOydtO2EsOuniOydtOuLnSAtIOyngOuPhO2VmeyKtV0oaHR0cDovL3JwdWJzLmNvbS9xa2Ryazc3Nzc3Ny81MTE5NDApCisgWzIwMTktMDctMTggKOyYpO2bhCkgOiDsoJXtmJXrjbDsnbTthLDrp4jsnbTri50gLSDruYTsp4Drj4TtlZnsirVdKGh0dHA6Ly9ycHVicy5jb20vcWtkcms3Nzc3NzcvNTExOTM4KQorIFsyMDE5LTA3LTE5ICjsmKTsoIQpIDog67mE7KCV7ZiV642w7J207YSw66eI7J2064udLeyekOujjCDri6Tro6jquLBdKGh0dHA6Ly9ycHVicy5jb20vcWtkcms3Nzc3NzcvNTExOTM3KQorIFsyMDE5LTA3LTE5ICjsmKTtm4QpIDog67mE7KCV7ZiV642w7J207YSw66eI7J2064udLe2FjeyKpO2KuOuniOydtOuLnV0oaHR0cDovL3JwdWJzLmNvbS9xa2Ryazc3Nzc3Ny81MTExOTgpCgoKKioqCgo8IS0tICMg642w7J207YSwIOuniOydtOuLnSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30gLS0+CgoKIyMg642w7J207YSw66eI7J2064ud7J2YIOqwnOyalCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCisg7J246rO17KeA64qlLCDrqLjsi6Drn6zri50sIOuUpeufrOuLnSwg642w7J207YSw66eI7J2064ud7J2YIOygleydmCwg7LCo7J207KCQCisg642w7J207YSw66eI7J2064udCgohW10oL2Nsb3VkL3Byb2plY3Qv7Lqh7LKYMTIuUE5HKQoKIyMjIOyduOqzteyngOuKpSwg66i47Iug65+s64udLCDrlKXrn6zri53qs7wg642w7J207YSw66eI7J2064ud7J2YIOqwhOuLqO2VnCDqsJzrhZAKCgoKIyMjIyAqKuyduOqzteyngOuKpeydtOuegD8qKgoKKirsgqzrnozsnZgg7KeA64ql7J2EIO2VhOyalOuhnCDtlZjripQg7J6R7JeF7J2EIOyImO2Wie2VoCDsiJgg7J6I64qUIOy7tO2TqO2EsCoqIOyLnOyKpO2FnOydhCDsp4Dsua3tlZjripQg66eQ7J2064ukLiA07LCoIOyCsOyXheydmCDtlbXsi6wg6riw7Iig66GcIOuMgOuRkOuQmOupsCwg7IKs66y87J247YSw64S37J2064KYLCDshLzshJwg67CPIOuEpO2KuOybjO2BrOyXkOyEnCDsoJzqs7XrkJjripQg67mF642w7J207YSw66W8IO2aqOycqOyggeycvOuhnCDqtIDrpqwg67aE7ISd7ZWY64qUIOyGjO2UhO2KuOybqOyWtOyZgCDruYTsirftlZwg6rCc64WQLgoK7J2Y7IKs6rKw7KCV7J2EIOyekOuPme2ZlCDtlZjripTrjbAg7KSR7KCQ7J2EIOuRkOuKlCDrqbTsl5DshJwg66i47Iug65+s64ud6rO8IOqzte2GteygkOydhCDqsIDsp4DrgpgsIOuouOyLoOufrOuLneydgCDsnbjqsITsnZgg7ZaJ64+Z6rO8IOq0gOugqOydtCDsl4bsnYQg7IiYIOyeiOuLpOuKlCDsoJDsl5DshJwg7LCo7J206rCAIOyeiOuLpC4KCiMjIyMgKirrqLjsi6Drn6zri50o6riw6rOE7ZWZ7Iq1KeydtOuegD8qKgoK7J246rO17KeA64ql7J2EIOq1rO2YhO2VmOuKlCDqtazssrTsoIHsnbgg67Cp7Iud7Jy866GcIOq3nOy5mSDquLDrsJgg7ZSE66Gc6re4656o7J2YIOq1rO2YhO2VmOuKlCDrjbAg64SI66y0IO2BsCDrhbjroKXsnbQg65Ok6rOgLCDsg4jroZzsmrQg67OA7ZmU7JeQIOyggeydke2VmOq4sOuPhCDslrTroKTsmrDrqbAsIOuvuOusmO2VnCDssKjsnbTrpbwg6rec7LmZ7J2EIOunjOuTnOuKlCDqsoPsl5Ag64yA7ZWcIO2VnOqzhOygkCDrk6TroZwg7J247ZWY7JesIOqwnOyEoOyxheycvOuhnCDrgpjsmKgg67Cp67KV7J2064ukLiDstZzqt7zsl5DripQg7KO866GcIOu2hOulmOuCmCDsmIjsuKHsnYQg7KO87JqUIOuqqeyggeycvOuhnCDsgqzsmqntlZjqs6Ag7J6I64qUIOy2lOyEuOydtOuLpC4KCipleCkg7LaU7LKc7Iuc7Iqk7YWcIOyVjOqzoOumrOymmCwg7J2066mU7J287J2YIOyKpO2MuOyXrOu2gCDtjJDrs4QqCgojIyMjICoq65Sl65+s64udKOyLrO2ZlO2VmeyKtSnsnbTrnoA/KioKCuq4sOyhtCDrqLjsi6Drn6zri50g7JWM6rOg66as7KaY7J2AIO2KueynleuTpOydhCDrp6TtlZHsi5zsvJwg67aE66WYLCDsmIjsuKHsnYQg7ZWY64qUIOuwmOuptCwg65Sl65+s64ud7J2YIOqyveyasCDstpTsg4HsoIHsnbgg7J6Q66OM7JeQ7IScIO2KueynleydhCDstpTstpztlZjsl6wg67aE66WYIOuwjyDsmIjsuKHsnYQg7ZWc64ukLiDrqqjrjbjsnZgg7ISx64ql7J2AIOyii+ycvOuCmCDslrTrlqQg7J207Jyg66GcIOq3uOugh+qyjCDrtoTrpZgg7JiI7LihIOuqqO2YleyduOyngCDshKTrqoXtlaAg7IiYIOyXhuuKlCDruJTrnpnrsJXsiqTrqqjtmJXsnbTrnbzripQg64uo7KCQ6rO8IO2VmeyKteydhCDsnITtlbQg66eO7J2AIOyekOujjOulvCDsmpTqtaztlZzri6TripQg64uo7KCQIOuTseydtCDsnojri6QuCgoqZXgpIOyCrOynhOydhCDthrXtlZwg67aE66WYLCDsgqzsp4TsnYQg7IOd7ISxLCDsnYzshLHsnbjsi50g65Ox7J2YIOuwqeuylSoKCiMjIyMgKirrjbDsnbTthLDrp4jsnbTri53snbTrnoA/KioKCgogTWluaW5n7J2AIOyxhOq1tCwg7LGE6rSR7ZWY64uk652864qUIOucu+ycvOuhnCDspoksIOuNsOydtO2EsOuniOydtOuLneydgCDqsbDrjIDtlZwg7JaR7J2YIOuNsOydtO2EsCDsho3sl5Ag7Im96rKMIOuTnOufrOuCmOyngCDslYrripQgKirthrXqs4TsoIEg6rec7LmZKirsnbTrgpggKirtjKjthLQqKuqzvCDqsJnsnYAgKirsnKDsmqntlZwg7KCV67O066W8IOywvuyVhOuCtOuKlCDqs7zsoJUqKuydtOudvCDrp5DtlaAg7IiYIOyeiOuLpC4g642w7J207YSwIOuCtOyXkCDsoJXrs7Trpbwg7LC+64qUIOqyg+ydtCDso7wg66qp7KCB7J206528IO2VoCDsiJgg7J6I7Jy866mwLCDrjbDsnbTthLDsl5Ag6riw67CYIO2VmOyXrCDsp4Dsi50g7Yyo7YS07J2EIOy2lOy2nO2VmOq4sCDrlYzrrLjsl5Ag7KCE66y46rCA6rCAIOqwhOqzvO2VtCDrsoTrprQg7IiY64+EIOyeiOuKlCDsp4Dsi50g7Yyo7YS065Ok6rmM7KeAIOywvuyVhCDrgrwg7IiYIOyeiOuKlCDquLDsiKDsnbTrnbwg7ZWgIOyImCDsnojri6QuCgoqKioqCgojIyMg642w7J207YSw66eI7J2064ud6rO8IOuouOyLoOufrOuLneydmCDrtoTrpZgKCiMjIyMgKirrjbDsnbTthLDrp4jsnbTri53snZgg7KKF66WYKioKCisg67aE66WYIDog7IOI66Gt6rKMIOuCmO2DgOuCmOuKlCDtmITsg4HsnYQg6riw7KG0IOygleydmOuQnCDsp5Htlansl5Ag67Cw7KCV7ZWY64qUIOqyg+ydhCDsnZjrr7gKKyDstpTsoJUgOiDsiJjsnoUsIOyImOykgCwg7Iug7Jqp7J6U6rOg7LKY65+8IOyXsOyGjeuQnCDrs4DsiJjsnZgg6rCS7J2EIOy2lOygle2VmOuKlCDqsoPsnYQg7J2Y66+4Cisg7JiI7LihIDog66+4656Y7J2YIOqwkuydhCDstpTsoJXtlZjqsbDrgpgg67aE66WY7ZWY64qUIOqyg+ydhCDsnZjrr7gKKyDqtbDsp5EgOiDsnbTsp4jsoIHsnbgg66qo7KeR64uo7J2EIOuPmeyniOyEseydhCDsp4Dri4wg6re466O567OE66GcIOyEuOu2hO2ZlCDtlZjripQg6rKD7J2EIOydmOuvuAorIOyXsOq0gCA6IOqwmeydtCDtjJTrpqzripQg66y86rG065OkIOyCrOydtOydmCDsl7DqtIDshLHsnYQg7YyM7JWF7ZWY64qUIOu2hOyEnQoKIyMjIyDrqLjsi6Drn6zri53snZgg7KKF66WYCgorIOyngOuPhO2VmeyKtSA6IOuPheumveuzgOyImOyZgCDsooXsho3rs4DsiJjsnZgg7IyN7Jy866GcIOuQnCDsnpDro4zqsIAg7KO87Ja07KeIIOuVjCDsg4jroZzsmrQg7J6Q66OM7JeQIOuMgO2VmOyXrCDrrLjsoJzrpbwg7ZKAIOyImCDsnojripQg7ZWo7IiY66W8IOywvuuKlCDtlZnsirXrsKnrspUKKyDruYTsp4Drj4TtlZnsirUgOiDsooXsho3rs4DsiJjqsIAg7JeG7J20IOyekOujjOuTpOuhnOu2gO2EsCDtjKjthLTsnYQg7LaU7Lac7ZWY64qUIO2VmeyKteuwqeuylSjrjbDsnbTthLAg66eI7J2064ud7J2YIOq1sOynkeydmCDqsJzrhZApCisg6rCV7ZmU7ZWZ7Iq1IDogIOusuOygnOyXkCDrjIDtlZwg7KeB7KCR7KCB7J24IO2VtOuLteydhCDso7zsp4Ag7JWK6rOgIOqyve2XmOydhCDthrXtlbQg6riw64yA6rCS7J20IOy1nOuMgOqwgCDrkJjripQg6rKD7J2EIOywvuuKlCDtlZnsirXrsKnrspUKClvrp4jrpqzsmKQg65Sl65+s64udXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXF2NlVWT1EwRjQ0KSwgW+y1nOq3vOydmCDslYztjIzqs6BdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9aW0ycG02OTBWVzApCgorIOuwmOyngOuPhO2VmeyKtSA6IOyngOuPhO2VmeyKteqzvCDruYTsp4Drj4TtlZnsirXsnYQg6rCZ7J20IOyCrOyaqe2VmOuKlCDrsKnrspUKKyDsoITsnbTtlZnsirUgOiDrlKXrn6zri53snLzroZwg7LaU7Lac65CcIOuzgOyImOuhnCDri6Trpbgg66qo64247J2EIO2VmeyKte2VmOuKlCDrsKnrspUKCioq7ZWZ7Iq17J24656APyDrjbDsnbTthLDrpbwg7J6YIOuwmOyYge2VmOuKlCDrqqjtmJXsnYQg7LC+64qUIOqyg+ycvOuhnCDsnbTsg4HsoIHsnbgg66qo7IiY66W8IOywvuuKlCDqsoPsnYQg7J2Y66+4KioKCgoKCiMjIyBS7J2YIOyekOujjOq1rOyhsAoKIyMjIyBS7J2YIOyekOujjOq1rOyhsCAKCiFbXSgvY2xvdWQvcHJvamVjdC/suqHsspgxNi5QTkcpCgpS7J2AIOq4sOuzuOyggeycvOuhnCB2ZWN0b3IsIG1hdHJpeCwgZGF0YS5mcmFtZSwgbGlzdOydmCDqsJ3ssrTqtazsobDrpbwg6rCA7KeIIOyImCDsnojsnLzrqbAsIOyekOujjOydmCDsnKDtmJXsnYAgbnVtZXJpYywgY2hhcmFjdGVyLCBGYWN0b3IsIExvZ2ljYWzroZwg6rWs67aE65Cp64uI64ukLgoKKioqCgojIyMjIOqwneyytOuzhCDtirnsp5UKCisgKip2ZWN0b3IqKiA6IO2VmOuCmCDtmLnsnYAg7Jes65+s6rCc7J2YIOqwkuydhCDqsIDsp4gg7IiYIOyeiOycvOupsCwg7ZWY64KY7J2YIOyekOujjO2Yle2DnOuhnCDqtazshLEKKyAqKm1hdHJpeCoqIDog6rCZ7J2AIOq4uOydtOydmCDsl6zrn6zqsJzsnZgg67Kh7YSw7J2YIOqysO2VqeycvOuhnCDsnbTro6jslrTsp4Qg6rCd7LK066GcLCDtlZjrgpjsnZgg7J6Q66OM7ZiV7YOc66GcIOq1rOyEsQorICoqZGF0YS5mcmFtZSoqIDog6rCZ7J2AIOq4uOydtOydmCDsl6zrn6wg6rCc7J2YIOuyoe2EsOydmCDqsrDtlansnLzroZwg7J2066Oo7Ja07KeEIOqwneyytOydtOupsCwg7Jes65+s6rCc7J2YIOyekOujjO2Yle2DnOulvCDqsIDsp4gg7IiYIOyeiOuLpC4KKyAqKmxpc3QqKiA6IOuLpOuluCDquLjsnbTsnZgg7Jes65+sIOqwnOydmCDrsqHthLDsnZgg6rKw7ZWp7Jy866GcIOydtOujqOyWtOynhCDqsJ3ssrTsnbTrqbAsIOyXrOufrOqwnOydmCDsnpDro4ztmJXtg5zrpbwg6rCA7KeIIOyImCDsnojri6QuCgoqKioKCiMjIyMg6rCd7LK0IOyDneyEsQoKYygpIDog7Jew6rKw7ZWY64uk64qUIOucu+ydmCBjb25jYXRlbmF0ZeydmCDspITsnoTrp5DroZwg67Kh7YSw66W8IOyDneyEse2VoCDrlYwg7IKs7JqpIOuQnOuLpC4KPC0gOiBjKCnsmYAg6rCZ7J2AIOq4sOuKpeydhCDtlZzri6QuCjw8LSA6IO2VoOuLueuQmOuKlCDqsJ3ssrTqsIAg7KCE7Jet67OA7IiY6rCAIOuQoCDsiJgg7J6I6rKMIO2VnOuLpC4KZGF0YS5mcmFtZSgpIDog642w7J207YSwIO2UhOugiOyehOydmCDqsJ3ssrTqtazsobDrpbwg7IOd7ISxIO2VoCDsiJgg7J6I64ukLgpsaXN0KCkgOiBsaXN07J2YIOqwneyytOq1rOyhsOulvCDsg53shLHtlaAg7IiYIOyeiOuLpC4KCioq7J6Q64+ZIOqwneyytCDrs4DtmZgqKgoK7JWE656Y7JmAIOqwmeydtCDsnpDro4zsnZjtmJXtg5zqsIAg7ISc66GcIOuLpOulvCDqsr3smrAg7J6Q64+Z67OA7ZmY7J2EIO2VtOykgOuLpC4g7J6Q64+Z67OA7ZmY7J2YIOyasOyEoOyInOychOuKlCDrrLjsnpAsIOyIq+yekCwg64W866asIOyInOycvOuhnCDsp4TtlonrkJzri6QuCgpgYGB7ciBlY2hvPVRSVUV9CgojIDEsIDIsIDXrpbwgYeyXkCDtlaDri7kKYTwtYygxLDIsNSkKYQojIDHrtoDthLAgNeq5jOyngCAx7J2YIOqwhOqyqeycvOuhnCBh7JeQIO2VoOuLuQphPC0xOjUKYQojICdhJywnYicsJ2Mn66W8IGLsl5Ag7ZWg64u5CmI8LWMoJ2EnLCdiJywnYycpCmIKIyBUUlVFLEZBTFNF66W8IGPsl5Ag7ZWg64u5CmM9YyhUUlVFLEZBTFNFKQpjCgojICdhJywnVFJVRScsJzEn66GcIOyekOuPmSDqsJ3ssrTrs4DtmZgKZD1jKCdhJyxULDEpCmQKIyBUUlVF6rCAIDHroZwg7J6Q64+ZIOqwneyytOuzgO2ZmAplPWMoVCwyKQplCgojIGIsIGQg67Kh7YSw66W8IOuNsOydtO2EsO2UhOugiOyehOycvOuhnCDsg53shLEKZGF0YS5mcmFtZShiLGQpCiMgYSxiLGMsZCxlIOqwneyytOulvCDrpqzsiqTtirjroZwg7IOd7ISxCmxpc3QoYSxiLGMsZCxlKQoKYGBgCgoKIyMjIyDrjbDsnbTthLAg7ZW465Ok66eB7JeQIOycoOyaqe2VnCDtlajsiJgKCnNlcShmcm9tPSx0bz0sYnk9KSA6IGJ57J2YIOqwhOqyqeycvOuhnCBmcm9t67aA7YSwIHRvIOq5jOyngOydmCDsiJjsl7TsnYQg7IOd7ISxCgpzZXEoZnJvbT0sdG89LGxlbmd0aC5vdXQ9KSA6IGxlbmd0aC5vdXTsnZgg6rCv7IiY7JeQIOunnuqyjCBmcm9tIOu2gO2EsCB0byDquYzsp4Ag7IiY7Je07J2EIOyDneyEsQoKcmVwKHg9LHRpbWVzPSkgOiB466W8IHRpbWVz66eM7YG8IOuwmOuztQoKcmVwKHg9LGVhY2g9KSA6IHjsl5Ag64yA7ZW0IOqwgeqwgSBlYWNo66eM7YG8IOuwmOuztQoKCmBgYHtyLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KCiMxLDEw6rmM7KeAIDLsnZgg6rCE6rKp7Jy866GcIOygleyImCDsg53shLEKc2VxKDEsMTAsYnk9MikKCiMxLDEw6rmM7KeAIDXqsJwg7Iuk7IiYIOyDneyEsSgxKQpzZXEoMSwxMCxsZW5ndGgub3V0ID0gNSkKIzEsMTDquYzsp4AgNeqwnCDsi6TsiJgg7IOd7ISxKDIpCnNlcSgxLDEwLGxlbiA9IDUpCgojMSwyLDPsnYQgMuuyiCDrsJjrs7UKcmVwKDE6Myx0aW1lcz0yKQojMSwyLDPsnYQg6rCB6rCBIDLrsojslKkg67CY67O1CnJlcCgxOjMsZWFjaD0yKQojMeydhDHrsoggMuulvDLrsoggM+ydhCAz67KIIOuwmOuztQpyZXAoMTozLHRpbWVzPTE6MykKCmBgYAoKIyMjIyBS7J2YIOuPhOybgOunkAoKaGVscCjssL7snLzroKTripTtlajsiJgpIOuCmCA/7LC+7Jy866Ck64qU7ZWo7IiY66W8IO2Gte2VtCBoZWxw66W8IOuzvCDsiJgg7J6I64ukLgoK7LC+7Jy866Ck64qUIO2VqOyImOydmCDsnbTrpoTsnYQg66qo66W064qUIOqyveyasCBoZWxwLnNlYXJjaOulvCDsgqzsmqntlZjrqbQg7KKA642UIO2OuOumrO2VmOuLpC4KCmBgYHtyfQpoZWxwKHNlcSkKP2hlbHAKP2A8YApoZWxwLnNlYXJjaCgibXVsdGl2YXJpYXRlIG5vcm1hbCIpCmBgYAoKIyMjIyDsl7DsgrAKCuyCsOyIoOyXsOyCsOyekCA6ICso642n7IWIKSwtKOu6hOyFiCksICoo6rOx7IWIKSwvKOuCmOuIl+yFiCksXijqsbDrk63soJzqs7EpLHNxcnQo7KCc6rOx6re8KQoKJS8lIDog66qrCgolJSA6IOuCmOuouOyngAoKP1N5bnRheCA6IOyXsOyCsOyekOydmCDsmrDshKDsiJzsnITrpbwg7ZmV7J246rCA64qlCgpgYGB7cn0KI+yCsOyIoOyXsOyCsAoxKzIKIzLsnZgg7KCc6rOx6re8CnNxcnQoMikKIzLsnZgg6rGw65Ot7KCc6rOxCjJeMgojNC8z7J2YIOyLpOyImOqwkgo0LzMKIzPsnLzroZwgNOulvCDrgpjriITsl4jsnYQg65WMIOuqqwo3JS8lMwojM+ycvOuhnCA066W8IOuCmOuIhOyXiOydhCDrlYwg64KY66i47KeAIAo3JSUzCmBgYAoKIyMjIyBzdWJzZXQsIHdoaWNoCgpzdWJzZXQoKSA6IO2VtOuLuSDsobDqsbTsnYQg66eM7KGx7ZWY64qUIOybkOyGjOunjOydhCDstpzroKUuIOqysOy4oeqwkuydgCDrrLTsi5wKCndoaWNoKCkgOiDtlbTri7kg7KGw6rG07J2EIOunjOyhse2VmOuKlCDsm5Dshozrk6TsnZgg7JyE7LmY66W8IOy2nOugpS4g6rKw7Lih6rCS7J2AIOustOyLnAoKYGBge3J9CiMgeCDsg53shLEKeDwtYyg2LCAxOjMsIE5BLCAxMikKeAojNeuztOuLpCDtgbAgeCDstpTstpwo7J24642x7Iux7J206528IO2RnO2YhCkKeFt4PjVdCiM167O064ukIO2BsCB4IOy2lOy2nApzdWJzZXQoeCx4PjUpCiM167O064ukIO2BsCB47J2YIOychOy5mCDrsJjtmZgKd2hpY2goeD41KQpgYGAKCiMjIyMg7Yyo7YKk7KeA7J2YIOyEpOy5mOyZgCDrtojrn6zsmKTquLAKCmluc3RhbGwucGFja2FnZXMoJ+2MqO2CpOyngOuqhScpIDog66Gc7LusIOy7tO2TqO2EsOyXkCDtjKjtgqTsp4Drpbwg7ISk7LmY7ZWY64qUIO2VqOyImC4KCi5saWJQYXRocygpIDog7Yyo7YKk7KeA6rCAIOyggOyepeuQmOuKlCDqsr3roZzrpbwg7ISk7KCVIOuwjyDtmZXsnbjtlZjripQg7ZWo7IiYLgoKbGlicmFyeSgn7Yyo7YKk7KeA66qFJykgOiDtjKjtgqTsp4Drpbwg67aI65+s7Jik64qUIO2VqOyImC4g7Yyo7YKk7KeA6rCAIOuhnOy7rOy7tO2TqO2EsOyXkCDshKTsuZjrkJjslrQg7J6I7KeAIOyViuycvOuptCBFcnJvcuulvCDrsJjtmZgKCnJlcXVpcmUoJ+2MqO2CpOyngOuqhScpIDog7Yyo7YKk7KeA66W8IOu2iOufrOyYpOuKlCDtlajsiJguIO2MqO2CpOyngOqwgCDroZzsu6zsu7Ttk6jthLDsl5Ag7ISk7LmY65CY7Ja0IOyeiOyngCDslYrsnLzrqbQgd2FybmluZ+ydhCDrsJjtmZgKCioqKgoKCltwbHlyXTxodHRwOi8vcnB1YnMuY29tL3FrZHJrNzc3Nzc3LzQ1OTMwMD4KCltyZXNoYXBlXTxodHRwOi8vcnB1YnMuY29tL3FrZHJrNzc3Nzc3LzQ1OTQ5NT4KCg==