From 3de4cb2d8d2f3787f6b82a4a0f7694f1737f14ab Mon Sep 17 00:00:00 2001 From: JunhoYeo <32605822+JunhoYeo@users.noreply.github.com> Date: Fri, 19 Oct 2018 03:16:43 +0900 Subject: [PATCH] Update README.md --- README.md | 254 +---------------------------------------------- images/pic_1.png | Bin 11924 -> 0 bytes images/pic_2.png | Bin 12467 -> 0 bytes 3 files changed, 3 insertions(+), 251 deletions(-) delete mode 100644 images/pic_1.png delete mode 100644 images/pic_2.png diff --git a/README.md b/README.md index 099faa7..e5d42c5 100644 --- a/README.md +++ b/README.md @@ -1,259 +1,11 @@ # Monorial -Monorial(모노리얼) is an AI for the [Coda](https://en.wikipedia.org/wiki/Coda_(board_game)) game. +Monorial(모노리얼) is an game for the [Coda](https://en.wikipedia.org/wiki/Coda_(board_game)) game. Coda is usually known as Da Vinci Code(다빈치 코드). +~~AI 만들려고 만든 repo인데 걍 게임이나 만들려고~~ + ## Gameplay of Coda - https://en.wikipedia.org/wiki/Coda_(board_game) - https://namu.wiki/w/%EB%8B%A4%EB%B9%88%EC%B9%98%20%EC%BD%94%EB%93%9C(%EB%B3%B4%EB%93%9C%20%EA%B2%8C%EC%9E%84) - -## Implementation - -### Basic concept of idea -Machine Learning needs... - -- data -- output -- target function -- algorithm to minimize loss - -On our application... - -- data : AI가 알고 있는, 현재 게임판의 타일 상태 -- output : 상대의 타일 하나를 reasoning한 결과 -- target function : 현제 게임판의 타일 상태를 입력으로 하고, 상대의 타일 하나를 예측해서 가져온다. -- algorithm to minimize loss : 상대의 타일 하나를 맞추는 데 성공했는가? - -장기적으로 게임을 바라보고 bluffing 등의 전략을 하는 경우도 있지만 이는 생각하지 않는다. - -### Things to consider - -- 조커가 들어온 경우 이를 어디에 place할지도 AI가 직접 정해야 함 -- 어떤 타일을 reasoning하는 것이 가장 유리할지 선택해야 함 - -### End-to-end machine learning -조커 place 문제만 나중에 살펴보고, 일단 기본적으로 end-to-end machine learning(사람의 개입 없이 출력을 얻음)으로 하고 프로그램 두 대를 서로 dual시키며 플레이하는 방식으로 이들을 학습시킬 데이터를 얻기로 함 - -따라서 개발 순서는... - -1. neural network (초기 가중치는 랜덤으로 적절히 조절) -2. input data, get output -3. output과 answer(상대의 타일)를 비교, get loss -4. 기울기 구해 갱신 -5. 1~4를 자동화시켜서 서로 플레이하며 배우는 방식으로 자동화 -6. profit!!! (과연 여기까지 올 수 있을까) -7. 만약 되면 GUI(웹서버 열던가) - -몰라... 일단 다 야매로 시작하는 거야! - -# 인공신경망 만들기 - -## 딥러닝 특) -무식한 본인 기준이다. - -1. 개요 부분만 보면 뭔 내용일지 알 것 같은데 정작 몇 페이지 더 가면 생전 듣도 보다 못한 수식이며 기호가 등장 -2. 이렇게 활용해야 할지 감이 안 잡힘 - -## 야매로 AI 코딩하기 -```Python -#!/usr/bin/env python -# -*- coding: utf-8 -*- -``` -일단 무작정 `app.py` 파일을 만들었다. -```Python -# 1. neural network (초기 가중치는 랜덤으로 적절히 조절) -# 2. input data, get output -# 3. output과 answer(상대의 타일)를 비교, get loss -# 4. 기울기 구해 갱신 -# 5. 1~4를 자동화시켜서 서로 플레이하며 배우는 방식으로 자동화 -# 6. profit!!! (과연 여기까지 올 수 있을까) -# 7. 만약 되면 GUI(웹서버 열던가) -``` -위에서 생각했던 개발 순서를 주석으로 달아두었다. - -가만히 생각해보니 1번 단계부터 구현하기 매우 어렵네... - -<밑바닥부터 시작하는 딥러닝>의 예제 코드를 이용하려 했건만 그것도 쉽지 않다. - -그냥 꼼수부릴 생각은 버리고 처음부터 읽으면서 직접 짜야겠다. - -## 신경망 각 층의 배열 형상 - -### 1차 구상 - -![picture 1](images/pic_1.png) - -입력은 모든 타일 `(0~11 + 조커)*(흑&백)=13*2=26`, 26개 원소로 구성된 현재 타일 상태이고, - -출력 역시 원소 26개로 구성된 1차원 배열이다. - -일단은 위 그림과 같이 3층으로 구성된 신경망부터 만들어보자. - -입력과 출력의 각 원소는 상태에 따라 아래 세 값 중 하나를 가진다. - -- `0(상태를 알 수 없음)` -- `1(AI가 가진 타일)` -- `2(상대방이 가진 타일)` - -#### 구현 - -```Python ->>> net = Network(26, [50, 100], 26) ->>> net.params['w1'].shape -(26, 50) ->>> net.params['w2'].shape -(50, 100) ->>> net.params['w3'].shape -(100, 26) -``` -형상 구현 성공! 이렇게 하면 대충 될 것 가따. - -``` -w1 shape : (26, 50) -L b1 shape : (50,) -w2 shape : (50, 100) -L b2 shape : (100,) -w3 shape : (100, 26) -L b3 shape : (26,) -``` -편향까지 보면 요렇게 나온다. - -#### 헉 - -```Python ->>> from app import * ->>> x = np.random.rand(1, 26) ->>> t = np.random.rand(1, 26) ->>> net = Network(26, [50, 100], 26) ->>> grads = net.numerical_gradient(x, t) -(에러 발생) -PS C:\Users\JunhoYeo\Documents\GitHub\monorial> -``` - -헉!! 기울기 산출에 책에 나온 수치 미분 함수를 썼더니 `Python의 작동이 중지되었습니다`라면서 terminated되었다ㅠㅠ - -결국 오차역전파법을 써야 하나 보다... - -https://stackoverflow.com/questions/36061994/sklearn-cross-validation-raises-indexerror-arrays-used-as-indices-must-be-of-in - -구현 중에 `-np.sum(np.log(y[np.arange(batch_size), t])) / batch_size`에서 `IndexError: arrays used as indices must be of integer (or boolean) type`라며 에러가 나길래 위 글 참고, - -`.astype('int64')`를 붙여서 `-np.sum(np.log(y[np.arange(batch_size), t.astype('int64')])) / batch_size` 이렇게 수정했더니 정상적으로 작동했다. - -책 예제코드 써서 일단 3층짜리 신경망에 적용해뒀다. - -일단 커밋하고 나머지는 학교 컴실에서 해야지 - -## 응 아니였다(2차 구상) -그런데 조금만 생각해 보니까 위와 같이 형상을 두면 안 된다는 것이 나왔다. - -먼저 입력을 생각해보자. - -입력에 전혀 '상대방 타일을 배치한 순서'라는 변수가 들어 있지 않다. - -상대방의 타일이 `0 1 ? 11`일 때랑 `0 1 11 ?`일 때의 결과는 차원이 다르다. - -그런데 플레이어의 타일 수 자체가 유동적이니까 형상 생각하기가 어렵다. - -즉, 형상은 그대로 두고 배열을 이루는 원소의 값을 바꾸는 수밖에 없다. - -- `0(상태를 알 수 없음)` -- `1(AI가 가진 타일)` -- `2 이상(상대방이 가진 타일)` - -즉 위와 같이 상대방이 가진 타일의 경우 2 '이상'으로 두는 것으로 하고 - -해당 원소의 값을 2 + (패 인덱스)로 두는 방법이 가장 나은 것 같다. - -과연 이걸로 될지 의심스럽지만 뭐 애초에 재미로 하는 거니까... - -예를 들어서 상대방이 다음과 같이 0, 1, 2, 3 타일을 가지고 있다고 하면 - -``` - ___ ___ ___ ___ -| 0 | | 1 | | 2 | | 3 | -|___| |___| |___| |___| -``` - -`[0] = 2 + 0 = 2` - -`[1] = 2 + 1 = 3` - -`[2] = 2 + 2 = 4` - -`[3] = 2 + 3 = 5` - -`상대방의 타일 = 번호 + 상대 패 인덱스`라는 식이므로 위와 같이 된다. - -또 앞서 출력 역시 현재 게임판 상태로 뒀는데, 이렇게 하면 그걸로 뭘 알아낼 수가 없다. - -어떤 처리를 하는 것(상대방의 어떤 타일을 어떤 값으로 찍는 것)이 좋을지의 확률을 알아내는 거니까... - -즉 상대방 패 수를 N이라고 하면 상대방의 패 1~N에 대해 0~25번 타일일 각각의 확률을 구해야 한다. - -근데 아까도 언급했듯이 사용자의 패 수 자체가 유동적인 개념이다. - -어? 어쩌지? 하면서 막 생각했는데 그냥 26으로 두는 게 가장 나을 것 같다. - -MAX 26의 각각의 타일 자리마다 들어갈 수 있는 26개의 타일에 대한 각각의 확률을 구해야 하므로 - -`26*26=676`, 세상에... 출력은 사이즈 676짜리 1차원 배열이 되어야 한다. - -일단 그렇게 해 두고, 가장 확률이 높은 타일 자리/타일이 unavailable하다면 내림차순으로 하나씩 탐색하면서 결과가 존재하는(적어도 '찍을 수'는 있는) 값을 선택하면 되는 것이다. - -그런데 그렇게 하면 은닉층의 뉴런 수가 좀 안 맞는 것 같아서 걍 4층짜리 신경망을 들고 왔다. ^^7 - -### 아마 결론 - -![](images/pic_2.png) - -즉 이렇게 형상을 설계하는 것이 가능할 것이다. - -~~그럼 구현하러 가 볼까?~~ - -```Python -PS C:\Users\JunhoYeo\Documents\GitHub\monorial> python .\net.py -w1 shape : (26, 50) -L b1 shape : (50,) -w2 shape : (50, 200) -L b2 shape : (200,) -w3 shape : (200, 800) -L b3 shape : (800,) -w4 shape : (800, 676) -L b4 shape : (676,) -``` - -학습 및 추론 테스트는 나중에 하고 다음 부분부터 진행해 보자. - -## 신경망의 각 층 -```Python -self.layers['Affine1'] = Affine(self.params['w1'], self.params['b1']) -self.layers['Relu1'] = Relu() -``` -0층과 1층 사이의 가중치, 활성화 함수로 Relu() 사용 -```Python -self.layers['Affine2'] = Affine(self.params['w2'], self.params['b2']) -self.layers['Relu2'] = Relu() -``` -1층과 2층 사이의 가중치, 활성화 함수로 Relu() 사용 -```Python -self.layers['Affine3'] = Affine(self.params['w3'], self.params['b3']) -self.layers['Relu3'] = Relu() -``` -3층과 4층 사이의 가중치, 활성화 함수로 Relu() 사용 -```Python -self.layers['Affine4'] = Affine(self.params['w4'], self.params['b4']) -self.lastLayer = SoftmaxWithLoss() -``` -4층과 출력층 사이의 가중치, 활성화 함수로 소프트맥스 함수 사용 - -# 모노리얼 vs 모노리얼 -다빈치코드 플레이 데이터가 없으니까 모노리얼 vs 모노리얼 대전을 통해 데이터를 얻으며 학습해야 함 - -기획 및 메모는 Trello를 사용해서 해버림... 추후 문서화 예정 - -## Reference -- https://namu.wiki/w/%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5 -- http://sanghyukchun.github.io/76 -- https://github.com/WegraLee/deep-learning-from-scratch diff --git a/images/pic_1.png b/images/pic_1.png deleted file mode 100644 index 17316a33aa7d6dc054a3eb73e95b0953e1c3dae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11924 zcmd^lc{tSX_xC7LBv~Ta$}U?eWGsX1LLp?&zRt*+Fba`<8M}t;YlLhgBxK*0!C=Zd zW6e5-nej}Y@Avn8e%Et7*YE%5dj6REeZAlJeV=n)=bU>v=Sq#^MyA6 zaIN$2kD>=sY7YR23u~z=8@;yLUQj6I)R_DADw0X>UPn0e!Fw8N>KK8W8TK8&?KgWL zz3{C4<^Dqpo{8&@xeylDaXU;otivX(BkYC5r7*T?sfJkjT8B+-leY1x#+BfmvUSB0 zy(5z&B({9xJVCt_q?db&sd|Gz=%byWWLY$?j9nqOwEyq7Z^sG5-H?#uS*P59H8wo1 z9%(gE^y(Tt{rM@f9g$$tw|}rcvRSOeDN7iJ%OP>!AHT&=4tNUQqa*gexXGa3aE?Ng zigO`<&d}#pjf;s1-w68yAks-e6<7d^--d)#aJ&75wtommkw@<^ZfjAOj9kf{^2~@gr>4Gno#xv_qT8Q$~sYc{v0)IelJteh( zqA2Yx)-lrTFvNQ5tzrFP;X?YfwTaBAu6{xlEvq<&P)4DgQ?w!xf{ziuaO(-zzt4KOJ`A7u+@e{7anfr&9M?fq>8&@) z1b^#QX4NGMM_mOzX38@U)G(=MIlUBcTH}-xrKMzOX>Ue*^S1Ln&^f`|l0oBE-v;l~ z`#o0oKj?W)jnj8;qLc=jpUD~ReDz1H^>BwAw$NB+h5Z5w)Hd&d`0J&AX+c|D(=X|; zPGRNwPL2I(ww_{rkFbh7K5gP_n{t%-+%a;t<{LacX5a6P+w?ocR`}!f2fb&Dfvz`a zzq5p4_)I#%Gt`7m%QuS1!v6OA>Hc7PmG#YDXgO%`%IRy%tSiDr51fXZQZ(XgwP{xy zWP&3Dj_fQQZg^|Pexqs&A&oKSz9uRabrE3^NbR2MI8KKHag<;dT^w0)v8c5Jz}$y9yF=z zEx4aOB>|gb{6+Z$DL>0a+XZ^5|e~gK~1a+>Cx$7R=5i#nvTZnibum^#3 zAEqO)Yf*Yc>s%pa(7pUh0>j!CS0(%PPo|~BMufEu;?o|B>)UYV#5}UMR;)gaW@R;AW&?j?#pSBn{XL7{-g+f%+D1NF=x*TS) zL0INKA5B=r67UD&5?+t$=h0UpYE}~`Zfrg{3)uI!x`IeN=?DtB-K7$p);6&#VZQXH zUGC~k)Loy=c}k+gwiIG4PCD}_rif@5?;B@VHOJY=op?5e&Hb+jxeZ#VtkXfo7u@&cC;Nwvhw z{;10`ZZZ+J!?cY>H)o}27M?XY?65XDCp7yOAO=t01v9WYz&=WUL;0Mh;aGu+Q58Y0xr%nBWa?d=*1u=5A~Qe| zf}7&MM`f(ayU@|7)_4r6`LCvfXMhbrl)ugDohkna(?8Ws$!%f zre_qvUFjv%(^|M~w3QS{p~dbbhx}5yr#=fVXPb>Au$B@s&bfM9evqgo!*Ea-|6iQc zQyRuNb!#ddw4SxZ9^O58TeWkSZo%0(4-N`ZY%J_AnyBMBMb_a+)Z^iwwkSQWmpJ^@zd@xA1&VuDQdT#wUR z07uu3bFNx%K{Jt;=2>}2Mxph5V#rxieWLirIDY1%`=@My$NhC!hDm$8N%NFBXxpD? zaC@kh^Bu*hl+&@F_CR3trM*9YMym`>&O)`kA^u5e>cn7$A3f3-+O$CcP zEkjZsa*BPpvpUaw*^wcO@*(!>$JdUK5?k@7z&@8Pza`CzLXlAoL%|Ie8aUb_*i6*a z1HIstcR<9h$6y5BqdBM5e^DdAk`U5CZpcX|_g6|0$!*SuM@1jAVHvHWWZrZ5yeP^6 zI1W2j*ua!}$&z*3I5DNp+>}n_-@J8XZxF$?(lmdOLrkya%K7WDPQ5~1hVM#T-qAUg zRU&VPgl&xakWb5+nD0>`wd?xWg%ae%J;soMcde5N`5L$Wyq>tVRUrCxl9$w`l#2e+ zFDxe5P^AHZd)75=L$XN3&ji04pR#O`zHhkly!L$PraOJ3hf zsN)#-pLE9QI6Z9iLUBMcQo2duGF&2*bKPsGBu1~9>_GZj^yMPbtu99tDM>@q+QYZc zOIh}at)MKSsS+K1Enf_R?V6FCSvk7JahuG@9fowDF?^k0fBck znl2}^vzb<7D11UdlPK#QYjg&35gdb%8@^+An>F6MYG~KCy_kq`e7&HdGL;j}>-=8s zB6EmR_Ncv?@)rySVL1)dnW&Btc$1Wc3LC}qoU}*pFUKCYJn(WywRDGDPpYIJi!l z^E*8qpkI^2`Nb3{+u`x1D6G71NWfc(XMqt3;&OypMP@slY^_)ua3(%lJ?*NQ|Qx% zFHPQ8&)c%a&6q$uDK>9b6E3+aSMF;%*X%A~u0ADXm}OnHjMi#iI>JWNv=5}P*bm+) z*Y|%mJ!=~LX`~(K&i3dPq4oyY-rOmlw!b}Q()I_%TZj5@($F9-x7~Nq>3Sh_ll$9y zK>Ao7xU9GO0qEJ+bSbgR`7ldbW(}RUjNdA((rsO#)mY3w^z~6{@Y4Ic1 ziz&1%yNfoz>=irIUIyMa-IgqR!4_a=>TfhUJ2U?52$;M&SsLf%!}P{gC%CR4{!H=;Hp;@Y)KQ1zpZp%Bt*p(B>L-vOHUZL6lVPLp3IsT0Z`=~fZK<7b&Gqvu^^tt5G!H~fO?o^7m-<%ILd}`hB zONlwVAks4EtCzG@z-nrSIMbQEz6h-)bKY)TK-9a^H-L)#A?~rhs@0gz^M!U<@3p}U zlO$U&LtEEln4+EewEbhsJ*IVX~fP0T&Aktn!hb33}UE!UM5&VS@zp6h1 zzTcV&3uY|F@QAX*PayHhOyi-lBGu{qZ+rQY{ zr!NZtICvA`qXD8f;FP=JpA|2&eVamsb*YPES4L5JezI}&7>Bj0KEV0B=0W)K%S&9gwcGg zWADIwNN+)s-Ir|;`%cAaqPumN9WMazh1y$9@YZGdgTW__&q5>ZIWMUJ077KhqJ~Eb zZWa8ovjYIUWK0hKWKYPTv4p|bsdNB9cZSFtPx`){?JM+F4i^DR_m3Yo)Np_6zXW)D zf%yg;Kz>~R+kX9@+Uu*oNCo=Pwu7}s8PdTyQGT26jBrwdGD+axkonB@H{|wMqtz~- zU`KOYFTR}51ORLV2fX$NDQgYzT{*$bjr|Vm$tw1}4Ws~k`sqaNAFA}S?Oj~P?@U}< z`%!g4J>ib*-${P*ulJ2?sc31B0~(7SJV|<@VOyn|lR<)gi6hXK2FlPm{*vz~1E!ScxwEMq4ocXMM{mVLTE; z33zM0tqhZClhwQ@euZN`8|F)L0m|C8(=YLk*cmDl3a5?)Tvdl@wb4kSI`g=0{FRo-wB6bKv5C|sU z{WpZw)0)$-YJT*9j&ObFb+>PP=~ zaH}@rv*FZX=kf@IW0R$fhpg;MlYmCwEXu|}MLA7i`(K%k?(R3}!Im}j7tf%9ErP3n zfA||Xpr^}@POygO0V(zunaS$=uKjtvAzmWpU;XOTIPO{0CeqWqCms6sAIO~895jBX zcrzQ_>Q$eIixvK;y4nfHHC0x~@o9?}h~JoQm1%E%iASUOth2D}K@@z*J3PcVcgpg`08zVIP`}i!q4aEwIzt}BEVGQ)4>d-(6PXa<}b)1+Ds8( zO?0}}kNcKcm#%1p{?c+JyN>ir8bD=u{W&lpF6=CUQ8*J@0PCbqAVbIOAD<$TzAm<* z?NT;1_$ zosAL_)9iXI@RMDs09^mecnKvr=wTOh;ea${ZEtJ>0QB2(rVV#`Z|^*Aq1zv;=e0yw zPpAr#0(HenXVWgFzS!|@6YHS8=JlLF$8^zvy{VXVaS!Qe|Jp`RCxpm??bmAXf_HPG zaP@C)fReo1hA&r3TT_6$WuEw4wM#xsA37ZfJhp=AFlssj#+I5{c`wEcFR1O7!4|x{ z4S66#7XeRtZw0_Lx@*-QD*G(aQ+O=8d10qMeDCu4c_UrCtu)*3_0Ck(1?Il@#BJ?N zmJne&fQ{Mok4^czX=3>`V^QZPv4@yizF7WwU5*%bY5%|?(;8`O78Wj3yyoYOzKGM<%BO>5ipBT6Stg?63NPsUYIHL ztFUn{;vdBd!_&tBfMT_S#Xc+d_FlK|>S}@{{SPwL9<$9Q6SDC&OvaOHH(K)a4t8uC zH-~sMaug}vCY!Do9h82_jrxWoUXTdl=7OK(MUj@A1s_G->~co8^(>yMsqJmKSZ7{- zN}Kqsg|HwOy8G&F2lZ#f4A4f zt!)i#)@V4xx`f!bx|Mt~mq%J$5${GU{QP)@MYgzk5qpKj-z!e@0e(RrS_j0%*wM8N z>sN=LTK-uZ{*LJ)Md#rBU~mkd7ob2kXRjsY!_TtywLJnrEnm|Tm;@`(XR@p=>SW&L z&fRB8-xI0SHT;1xkk<)Si+8DVpbo$>C<+X%_`9_c*8F!^d+IkNv4q0tGBg!r=W3K* z6&J{-k8bf~N8@r*H}a;@VS+T@=zK=o9AARB{M%YX3qgiGmwuT$bye5tW~+nd#ac09 zIlpf&9v@yj-j2L7;u7s2;(x3XMw+LCTW^K&p6e%t{yRT&{B}A)dD}~=pCj@fC zPj2p5cbbc_?Rz~4_E;y=ud#kahJqZ-u!bPn;Ag8f0+#C~1{TD*g)oJ7`Bs0QCD7Ht z?VXwSRg}?m8QczrM$dA+8^WVlR93GqR+XQ>MxN%GB~Nz9t!^mJ)x3%2nBcfv)il=z zev;L<8{fR&vH&q&hXz#gPT-?bOxpdt*B3-05zZ2)YJ$g0!I_1P(?y*gv~L;| z2MR8K?kI5EuW3~f;G>9MwPdAZ^#;gr|6s@k%bsd{(D8%s=nun|TTFEdY~RcLYe+Dl-xuveryY zkoxfH7SVU4b%rf7quFi1!CC;$T}2wLEL{*?1H?Bjn5&-29cC{p-V89q!L+l^QoO@< zEMv6}y6|u%WBj(>mN3czg_Cw?Nq6qbtWvCA8L#2poE#lDv} z30@#JXw9tdEMcb8#kUpBb_eGi5sZmi>ydH_G^mj0#(|XjL4cmda$>_m&F9eu`e85E z;^egs?99eucg8~rQw_S>eu%%VJ{;UkXm0oWH>mTxD)B69BOfmUCTd}V?QC*~AC&Lh z#9im{s6j7e+ob06vyzHeH#<__l2zF_cj@a+Dc4K$pam+K!wNfn#2g_$O0<_ZoaK+<)DchV-Rc3uh3E=|RtqGhpd z)<+r*KfJ0b<9s*T{LVU#%jc(;?4LK8W@)5&!#?em--4}CZI)_{Ik zsWCGU6t+-ca!uC~dUp%F8QqgGE-uE<#5Pclvf6!&V!&W(P%Sps*u;QcD__;_}5WD=O;^`m{;?D-SoFp?(jK?QkJK@ju= zV1)QGbkT6|$3MB|8G=f}<NI|cFOw{0Wvdlc73FLQ4 zm#^lguUr}~dJi&KnCmFaO-cKr+5M$G45dt{q%%c^CejZ4AiBb2KR?_MA`-yJH-S+V z=!JxzH;T5KE4G&RBiJscjBg;Jh%@XF+iob;MgdbGW+jaKwABbL_dp{xyD_&a%Zm{9 zvf-|`0}pICVVS>KBXrwvOv7^_qQPrD+Z@E`X6}m$hSbe9tRwVydfZ(arVLXKq}6m+ z9|#O#r=DHH*H6j0dAKa+G+Hl~aBLfT2rG`k0U5WIlE5b?V@#GZMgd1|cRK1@=zYfs zWC1G5q4b?^d?g!Z8a}HS5l^#mvRtP%wqyAF4GvRvrJ@zvvs?2a#LoPwQ(E zgAx(JHxLp(-xec7GXBh&!ZK${=zzle)w6LB}KnXKJ9(%X@4^oaa3N$t5s z%4*mo1*vL`8pgYT>vZ)G8soGc;OT~7)+o0Lq;#}!Qbtgo%7qkiSY<2r?Mawj%KnCb z5(;Sh17mOQ3`@ysY+=$3p}IHYKJLi(u+(%TR;~?!8jPw~>N?gz9nXAAO)o?k`B!oY z^gL{wfm#nB|I%N$uMceu9GT{S|0(WYMzK9&*HL`Bma*EXpWMC$UQxQ3?ym zq91>{*b<`prGt>vcf~}2e5ZSQF}i$Cb%&$kxrYQl2N-v?Y+|p~BR3ZtK5&1iK0nay z{y*2ieZpGcPPL(wx=StzcaCpA-teKG?b6lhd#Q%!qP5;F8dwd3? zdg1DVVVq8OyB3%6tT&_C@!4bZKq4>`Pgt4`k!F36j@(R^nezor|>6RHfMs2p!S+wLA{UUL*N^(HR4_7wI{mW+>e@r z&f3JO0G}Q~oxS$ZjXv1LdNsi`)hn0CnPdD#LBwUi+a=1pzEB*^Ts~7^OWP9&G;o=` zOCfA^uYHS5V|zsL))(Qmt~|k8Q~M1q;$WDn=gdPMs+H+G2u?2CMEE8$njYsl0F-Ee zA)k2{9H#GU8{|bf$LNLUTF8hUy&dFX32|lvBwoOtRdTy$7S_GqJu@Ho?>#2x7aYf4 zk<%-aTsDcq??+XAR0ZStjFR2da#awx?+Js(H((S1pjL_ag6euk^b?46+ZdjOP!#05 zxro<6W%EUa3-H_pG9+8zF3hIN-(in^g*5AgMkErC2n0V_^5Y3MCNPqMhiKW0f3P#(Jron1L@}i6t6jK_siF%T2 z)y^yS6P3;`10~1uwL|qS16NBmA*7wu$2w0!oiy4p_H>tZpE_uCZw9m-zv3sr8vXK5 z@6C`iOHltE0c08SXIE|4&f3>@s&hioCOMp*bIRaBACV&tTskyCz3x9nS5&E@RJW&1Sj=@~-_n;5>Qr3zr&gFX`pUu)q@V|`IJ zz2H4|AXMirOnfNvXlEbdX9pU0{o2Ti;ACVnf@S+G?9kIY05wVa)dO0Gi@3&V{Ix;m zlk^YLS~7RwY93E*TO-6=+OwCr-;s@e$?id52A@O}NK@O#Yd-}RVk*j>)ubU2)@g)X z?c819mq0wE9_RN_j2ubz56x0X`W{7mM0$D6-o;8A?3{fzSytXsppDQgqJrruyLQk$ zIC;D!9sH*=>F8F&=uk9SnJ9AwkK|uU*FfhULSB}9I%YZfoFJ+It@-i-m`$&$E4U*< z>DrJ@ZxoPG`zm+J#8h{$G3ja9>0Uv*{6AG;U;3}w``hJsEc#c*cc#Hn}1BE zH8x)@wm*Zq(d|d?(q6v`pX0uF<&;(i|0>F^!Ut+{blJynsb-%iLPKzRMGLn~{kAzV zZEiPuJ`rApl9LtB7N1?kAmjF5Mj`P}Ceiabi*;dAw9gyjhD|h;+)gALyot&y$BlGPiM z)(UmKm6C>q?}FD13KezQhu1&({aR_=ZS;8hMZ4G{i&4i@ec80t^pbjfMaZ*x8ZJ_$lsvFZdR4L+?a^~CW{q1x=I9W} zxk!T{@eVIhak)Pej9I-YSZlS0!_A;;(G9J3vYa)0boK6dM1e$WMG-wdL3aUvKOIVAI1fa)%E7BI=kA9c`c)YG%;Wbh0H zuk&_*0gfa5;tUl!g+aTud0N{-wgZ+27AqOh5YeaCVqLr3-NK6bh=A_o@`LW0tNmr1 zqOa=eE2qZshg~Zd%GiwE#>+MJU2{FMv^mLOh74DdSHXs&{pG$5#soPs5ezMg$n zJ7-;mKxIl-WUmRd98&X|*59xAoO-@~p;IN&`Xcc-MBhB&`e2EgQqh-e|J>2r;TUJ(nyB z<}iA3>Z|B6#UN@~BVx)%~*CowU^8ChP=xlzNUz#C&kp~O&3eP^09Rd z`Rzeo;Sf#FU+3C}An7vdA&KQcTz_87#kBDpzL0=;ifDeT^$Fw8w3am$23OwC|WY z+Y51CR=3BWbsZKlT}e<}Kb$(3bDn$*7ZiVbxua!PqhF1debcn^;7jovkvk_*W?!ar zjt1TrS*$bpkz?H=t(ifN6z`;yO?#;vNWw92Of0Z4q zD)@XnCFs?`Oi0Dy6WAeJE+MEVCsjw)Q>3HaT0E3AuB&{K{79!^Sa6V>_8cKj)(-hV zk?(LcnwBZC_Ds^raE%T&zW!b>wq{dySC6{`s)CM&F(4umDQL%TT*h01Y;O}sR+E#Z zy7q;9xAP1VZO)<1Uq}XX7H4sp_O7$k4sTw$q-m`)t>HYk`R6msMx;T6ms|Fbt$>+d zR~a4boBu5;b3V-Xx&8IXz9U4{BL{ZPY!TurHRvOy&;aR2sYE(7(?{{8n1aRaf+tk_ zx&d-H+)TMsq7d(Z!-}m(X+60Ju$Ar5jIHl#csC5$Il`PvJ{wZ0HG9*fq@GE$lD*&Y zzcHu^o;kh%BNA-bF+mYDy(-V!GW%s#!%~x0|84OPddEXxeoT-Wg@b_-OZongQJXM# zW$Zs5R>Pt=;qOu$hOtM_p>wy-XG~cgO5chat!9@687i9o%dpGmR}%paSMy>^DSh}PO+65W08A0ADkbY{Be_UpjT#Lx#iXK8@cVo7hp{;efR{4+@-%fW0LQq|8+6cLr<`ESE};W0V{ z)Xv4?3lW_-2p$s-k`@zH6>&TqanKNek65?K-rc8OtZzg3N;Dy+ZUo%rWff)*%3fQ} z1#gPq%U&&D`hC83*D-ln3voa$2OS>Z>mv1{*@$)h<9Nbqc0nlmt`VI^s8-{EAw~1e zkjH#*Ew5)kJ#ZF$4Dib>-v*qM!;Z*T*Q|F8e9*?=jeJ5sSs*@`E> zF?$mwS=)mzipk6N?``ayI96Z45vkRr3oACthgpfE+s=pmWx{wx;aXKUALhN<3gd_K zkvfOp>t=OUGFx!6o(ETCc=FiIaBjvTYRO*CT&L~Z|x;3X`6v$ zSF0C-OUtN#-T`KgXHeYO3BGW-@ZOS|MZDVoR6PBkORN8%_NEX{H_xeqb_{%OYvOdt Q|0D-!sp+X!sn~@6FFDTCE&u=k diff --git a/images/pic_2.png b/images/pic_2.png deleted file mode 100644 index 139ee88a49861d437019441a16ed1334ad5daf84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12467 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 e(vK z59phlYF1jcW#_^=ewa|uOz!{X9fcQ(Q~MmM?ehR@%XWGWic^y81< z++WF_T-T~Q9ao;qUCL^nc+dBVHWiT8ueO>!qXkW%mX(>SxlL2{0%abEFsv8ab4*3(+#iG%GJ# zK*bKduov$%k4@b;|6paa?e884`-?F2i+th8EagL9#zSCS+1Ul)AxIz#%nO&9iqw=W z>qFw0GmQE(k$Z;1Q}nms+`sB*ZGpsGwe4CMHlkPMooAKB4wkh5d)+_uz+nAUtQJXY zw3yn{F~%G5Z*<}D^j`97>)Hb5dv+~d3jMl_sdDv0iG5q6e?8tU1-QF?$G!w{!YF#5 zAw^c!Di!EP%R%-69$Ax>+~lUIk&CsiU+Z$yj9mR4M!AWrJDB5|Nof*bgk6~#fVm98 zLN@-5EbCwMaRV>aS+ZtqnCL?{2qW?snW{bz9*7gyG$${E&Z#k)$sxU+7zR6^U}A#G zvO8)qHZ#W1=^v~b!U&I08e6l_mI={*hC}TYm-|Q|R&S3~e(JUbsn+RBm-L03LAt*B zgdt?LCN!bj$JQ0MmmlxwX!`P9s?W?$wD70`Htn3^-QA<`LTih9Zw@YfaZF>v1!9M> z7R5zh9kg%0w#|i8d?-F1e!s5%U~n7r@Vbu;9sl9-jzaLO8te66Mk@Vp*YLP`Fii*Y zF{k4~7ZtRpANq+)(V^3!qaWJ3pkE!hw6G$f-D-{PJOf6T&LxmG%bHUh$Xu+N+N$)) zTEc#Ka93a6)9RP<&ra!K$= z^vvo@95lCqM_d0anezXX)tt2~!6kpC%_`>#ixRjJ$v-yl&tMaaP}@ll1d;LPt04MU zg2o!NRgR_Ql%s1v3$HE@59L6i@f~eeW9bdHrC)~lGwrpy90Z&X+xlleiaUTIEa%OF zMkhgU;42n!sKCd#GVwTqt*^y7LpZdyglFz;TK{v4nQYDgqlSH(au}JuS>NbjX`8Ui zwh^qyO$SSKPeQ}wGgq6W=P*`2*o1xcSiO_J??=wA)toZ|J(e9{^q(p;`z-Lz5jyHk zG_9=huKIItvY|!pN9cy})tlm}e`RX6QDER%_&pbzsiTLUPjG)Uz|&CCRjzw#9r^zN D-wmx6