From ab3c64ff03a873e503f603d99de71d9b5a692ecb Mon Sep 17 00:00:00 2001 From: ennucore Date: Mon, 18 Jul 2022 11:26:08 +0300 Subject: [PATCH] Clean up the repo --- AnalyzeExp.ipynb | 78 +++ Decoded_Orientation.pdf | Bin 211695 -> 0 bytes NoisyCircle.ipynb | 358 ------------ TestInteractivity.ipynb | 311 ---------- TuningCurvesFull.ipynb | 560 ------------------- plotting_utils.py => model/plotting_utils.py | 0 sym_model.py => model/sym_model.py | 0 utils.py => model/utils.py | 0 {model => numerical}/__init__.py | 0 numerical/decoding.py | 189 +++++++ {model => numerical}/decorators.py | 0 {model => numerical}/dimension.py | 0 {model => numerical}/example.py | 0 {model => numerical}/gratings.py | 0 {model => numerical}/load.py | 0 {model => numerical}/noisereduction.py | 0 numerical/persistence.py | 169 ++++++ {model => numerical}/plotting.py | 0 18 files changed, 436 insertions(+), 1229 deletions(-) create mode 100644 AnalyzeExp.ipynb delete mode 100644 Decoded_Orientation.pdf delete mode 100644 NoisyCircle.ipynb delete mode 100644 TestInteractivity.ipynb delete mode 100644 TuningCurvesFull.ipynb rename plotting_utils.py => model/plotting_utils.py (100%) rename sym_model.py => model/sym_model.py (100%) rename utils.py => model/utils.py (100%) rename {model => numerical}/__init__.py (100%) create mode 100644 numerical/decoding.py rename {model => numerical}/decorators.py (100%) rename {model => numerical}/dimension.py (100%) rename {model => numerical}/example.py (100%) rename {model => numerical}/gratings.py (100%) rename {model => numerical}/load.py (100%) rename {model => numerical}/noisereduction.py (100%) create mode 100644 numerical/persistence.py rename {model => numerical}/plotting.py (100%) diff --git a/AnalyzeExp.ipynb b/AnalyzeExp.ipynb new file mode 100644 index 0000000..bb61db8 --- /dev/null +++ b/AnalyzeExp.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "outputs": [], + "source": [ + "from load import pkl_load" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "Can't get attribute 'simple_cell_model' on ", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mAttributeError\u001B[0m Traceback (most recent call last)", + "Input \u001B[0;32mIn [2]\u001B[0m, in \u001B[0;36m\u001B[0;34m()\u001B[0m\n\u001B[0;32m----> 1\u001B[0m model_center_fp \u001B[38;5;241m=\u001B[39m \u001B[43mpkl_load\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43msimple_cell_center_fp\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/dev/amgen/load.py:6\u001B[0m, in \u001B[0;36mpkl_load\u001B[0;34m(filename)\u001B[0m\n\u001B[1;32m 4\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mpkl_load\u001B[39m(filename):\n\u001B[1;32m 5\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[38;5;28mopen\u001B[39m(filename, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mrb\u001B[39m\u001B[38;5;124m'\u001B[39m) \u001B[38;5;28;01mas\u001B[39;00m f:\n\u001B[0;32m----> 6\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mpickle\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mload\u001B[49m\u001B[43m(\u001B[49m\u001B[43mf\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[0;31mAttributeError\u001B[0m: Can't get attribute 'simple_cell_model' on " + ] + } + ], + "source": [ + "model_center_fp = pkl_load('simple_cell_center_fp')" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/Decoded_Orientation.pdf b/Decoded_Orientation.pdf deleted file mode 100644 index 838097bbe3c7e2cb6a26753720e5f4aaab121394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211695 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

k%kYl*kJ(qqL^ z7^VSRnEEsC`@0zth$3<7P-7mbtcC)}jO-m=iWl6f_yBINDP@~!AC}V+mfoyI#;nOzg8@$K2HhX@t}%W_*3l zPZf>XtF73jBFzh?%o7T?mvb#@J1k1C;s4^7nej`8+k78ATMtx^gJ-FOs!_&P=8x7* zpd20L=&4}*t8$Z)#Ufw$Luv4kGK&jca?a;gt+Z;RBEirNL!48Y=S}5jImE$h=3&%Z zuqO*^+j4_`nLx6yDY_YivInZ?TN+;sf5w!(hA>6GjJGpm zwK6DN@${l-r6`x#?iZLkqa3?%l%0AiFAqq>Jnv$0yyx?Ji1-bG)zow3kj;Y%-4x?c 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 z z8UOyBAn3E}uUsg~Wa zksQN!t1Aschef7LwxX`w7#>lRST$cmj}$xjsM%ZHHAKfjUhCbq~nvX>#xaV&j?}lcraPX=97N}n#t7Di$j-%V= zXdia42%(^r(6L?u;>u zG`X5y?mZaqN~Rz(0Z&SDk>X177wQMUmf!2nZI8EY3G|mmsuqH+UHoAt$G_)${({A{ z>U8;aSN3^ir~})-Q_^4h{(B?+_*ut5#>>pU`hZN79@Fatb=PkPTC16ryh%CX<)o18`xwyMG0Zeqo%chBTT=@HhM@t*rScc$Z#o z02dRBZ2wLJRqGo@hnss+!wOFV_i}KIU2B4kY*LNBI`&F1EzD%{u*sAPh%X>pFNi-N z5$9gaouDfZXgX$uh-4Pb6zMiDo=F&fZ--su=Wvn`C7*lX)^|&B0>iOLMf0#3an3oz z+pCJgabc|%aZW5dbr_G+m5(n+Py_4_qDnHj67mu7ZWsRPBl^1VE~A491Havc=GIB+ z(%@<5%~j6VWD?}-B@Rr}QN6)RuU~BUmoN{Oj;45!uIa@mY!BrPNSm#{i-(ojJ2;l@ z44;oNkH zA116rij+0H-`v~l`J4Em>}>^D^9~UA$mvKrS;3z$=Ce5$w-njI_=%(1ja+$z&+KwP`$dRRfjP!)>GK^hT5}uCv2y-=hTkM^-HWAuB8PuFRG|OVu=+<&tDdL0F7x!JRB#AeW_Ru3&c1Q_a zJ?sUXadFFktv04E)Q6f_=oOQ7p>PcH`^x5-gP!|YcClG&6v6X=*3rlGZe)DF4LHU| z@IEaYUUR4J)5sceSV<1mqBWT92)YDyxmm|m%mtSFZmCm5XSP6eQ))LwdPGy7F;S{% zz>2TcPrFFe+xI2P#S75;87K3%93=wtxPH@CV>p3J&teSgeZhC(uWD+;6Xdx4-n_P& zv&Vj_8%P0TY`E7u=Z@MR7>uc;T8R`La~Kc`pC%GE8HUVy!*U{*lDT4Vn#lbUNuhu< z*NZGLJ-XMbYR(YlP0C~eJDm@ij!hS9q4@~2kO7+v@32;On-3f&H*qmR#hkc^eS$av zzoA1t79Rwpzu!H~c+3;h$t03K;Dm3F(Hx5?FcVlMf1vg{QWqi9Tt=ia9}8pNr3633J6RlyEv$Xu{lGdZ zM8KHKErRITL%r&D2mE|=it!w-+ID|Un1F~*SPZ4b+E|%-gH*`pw}Ug09_9mJ^ohXH zw3}nnjTp;8b{~mrxZxgP?ZBp-AezAq=s=(@2Q!qf02TtM+X&MRsUh%+mjd0^7>Sy(U!69PTod(xDm;`J2y|jxcSd{ncGw=D^IZWW(B$U*UeGK*cMPmg& zh^+7d)VhjoNyr8@W!);h_fSzTJTGH!uUdS5Gmja`+mV8=&`>c*O+szELHv_REnEsE zno>k_I1^q}H{)eUAbHFGqHPsy!vS{4e$42X3EmATRVujY6MW?UF7lsjVS!}5_XAh< zFnjStbP`7hkfb`lGG%~$1YLKKgmfTJIYQE3sZt;i*PUi~er(QY9gB9gC$Qy!q1WLX zh4`)x@Y+@7tMX~jGlnA!$k$y@fmys#O$FSFJf4&^vzwIIe#}PV;VJnn$E>QZ3I0`=7GFuyEGL?n8It*a_jnuMhFuPbWGVX z6i@Rqz)PuV3+8-lL8X4q7KBMPL$zVwOwK*WY~Qjnt)!*hb%3TRVYNV!&BrUnzs#J8 z)IF|$zznagW4ci)rYy9s@b=u=7QBr;+5eFmdvs6*+|)AB#!76$q#Z)Poiq%Au%y zJ4dI~!1CvOV>X>sd<9rz`{36ol%})M?D5J!rzlM;z%$Hhhp71C%ZVD?^MgPi02k=5 z_uOwgKK>)|w&UY%4~Q@B`74c~;lY2i8Ry?aEi*9v%U_oy$dl{wV0X#I#d; zo{l)&?A!{b<{H@#>{52&qlCC>=2OU}I+-%=&5H?Mf)&K+}}^BS=+UvZj2o&spr<&WW%JRGS^_uV^gq zG^fLUA@AirAhI6E8GI(o{>T-6m`j|M38$_19JmB5y?=xf$#jB_oWmBXMs1=JUCH@8 z`;23pRsXDJU4&5it0GQj8C*~q6h^-{?ba3M6U2}F?npDQ-A>Px@HuTsAf6FBatXR^ zOui3#Yj?n}K*vluNTPb?o3;#Hrsz#rq15(yySkAnEFQJdCt}bh6!&Fi>mRaWn+#+20 z!&zzA3`w0pjnKxb;eDQ5GG?89N?`R582rs`f@$bm!*H|YIIC?zk|pzcWSD&P5}3fL z_7I;&J?O>$J23er@5~YZ?i;zSgA`Uu6*a#%$NTy{&!ju6kdsTqIChw*PCX>8`uQYt zm5!rJu^f7TpNb^y?=hhoa50!TrMA3K(MCZsrRP5?a(QPa>g&KChpA|wF_KhDqq!tw z;K*5fp%W|i>jw}Pr{W7EFDRWIOEC{2(fSxO6ES!;B-FYUZYa&wy7lVo{H-+9x>edM z4xYIj)l@RKCyRloLwbH>_&9s*S39HXS>NV96yba`{FMj@Svu~xkOv?+MR62Y|3kMruW)gcXc?z3b=|?aXZ!2aa>fzCVXPg-ys_D;4nNYJc+f1`z-)>^ULDrMcC-t}6bM~1{whMo!o3VDajmSUy zB`=dn$EsU?`naE>YS>f}SzSi$B7Fr!Qcnt(ZIa#rE7}-eI^7*J48*Fl=y7Z5>YK|w zXJ{NPuT~`VNNrf8o@X)LO4zS4hBbwb<_dqcKyYzQx@8gtV)S41O-5 z;%hbB%gA^dq3I-eK6L5MoOileB%SBqb;&X;`Q&rRNHKM&-KP@&$x{1M&a-2}(!`*jF zjvM=~`*kJLIxL1z!6jYrg43$?DE+xkx&&oHno>d5 z!^LAVeXbd!wfKb!Wo_~aby2B>_oEUINl9Ls2EnUw!Y5IB*&SIXjRo*5y%cZ!%&k~* z2^6jEX0Gu@8SBOz2(qZo#^xo%U4I81{zLnk6;PQ(&YwRQQhOHzv+J)OA{Czme@xuH za0xpk?~XBNL{#D*Xc1h^R(3#Pj?>pvZ#^O)v=qvW#L{Ki_7Rr$*3Z9Qa-6m`j`F7c zIHIRq>K-xUuIFAlme=;ZTqxn_%0}g3W3?224K}h?@p@ep3eu`Rla_F{4?48na*2yi zEVeIzd43garbeTGFo_klGobG8FTsr@T^p%dFwc~$5&i1WUbcR}!>!hnUa||_$%9~I z6+wW#)-fC<7f-No@+wM(VipxtGH1pRSKnJt$c>Uex27{Z(`z~*Mt9iW&s)fDVcng* zb#8K)ywcQtLMsyN?TDRCZ>t@FVu81xt7`enFb)6~$;euH({W~Z zY5;3&KPKC5+_OusH$)4;Y-}V9D>4MHl-Z^*qt;a)_Av zm1b#sb1YFjCejlwbOzGaIoryVXIDx1Z1L2NPrh9BWH>1T=5Nx?7*ue<*olq5f9cO@jgCGEGd{ zW~XeEGPsn+G4r6k80oNksf`L!%JIgLTY0}7%&{MFnvVd?mBq$!DjWX_b< zH3CVn$p^A-O;`t~Gquif9pw`~H!nd*&4tjUV4?fmVDw9{(w>E3vhoDPtmFx!uM{QMinM2o} z7JpaQq^>lgaSQC9=0iie@5w`dlg#V}*k~cxZ4d`Gx7@Xjhy5$n4&SpMBx zbNL*oEa6kduKG9MzO}Bzrds0rMBxM8g%+STPm9;5$yOODss_kr z^m@HXd*2`ZQJHKMl{8r^ARW#Oh`=8yKgl?=(73ka92}Z>47F5EwM~h_aa)Ksm!f+S zc`>6JoN_A2e(^9CU5S87JQ@7ba9j2#acv<@n#$cSxsv~|+K@wEFU}aYIRtkvqBDvv5dOX>@LGgM>5Bh-A|271gL= z@3Z_w-Hq7QB$)lK?OYc-g9%@N+7Oom3O**2{76B?7S|V240`r2?!_;8(gTq>BT)q( z^3t1y8f{)jMp}u-84Fn6U7fR6j!`a{ZMQqF)oQfKarQr zu2DG7-80!XJ$~x)C$W$;8`TaYr3B|`+R%jWi$4|~aT?#6!ypwf0+DpLpwb#^k z(Zs|S1%vl?qUxLx8|zH&rwrOg8;&+BiH%W+M zjvZ78y6X}))1DWfs%m8%3D_hMoam5Htnr7`Tx|}KwT&=T+ho=19#6fKKjQ7)pg1iZ zxW){%Nn2+u6+{+Pn7eBm4I9;xVa*hT$#PQG@jcK7kg z*n-Qf9zDled906UJ;o1P%8C{FGF+tn6O0m97z-znsnKCusC<`5ta(IIdG?ADr4tU?u8u({G&0@%tJMvRXbdNjVy)$?h~LQC7h8_@>FaddzApS(D)-u*r4>3vNxiF* zc`!!)Da>x*Gr02_$XEKZV7&ZV{S0-YRqK`q8@H$;eW3GACwllwx#DTDbxgJH0YmiF zDi|hz*B`tCMdoF7$7S`Kc}M1RjNe_ZSqAxXeYm$gv*-C-IWgs$w2FO$lMqCBvJ@jX z4Ps}Cz7Oqnn4;$yWruh`Cz|KR{_0xnYk=P6F2M>e!&4uXiu!Vk`wcc((Ea=;&Dbq3 z%*VK?Tlq4x--|T^W38EZ-`9%FW|>#QN6uA)H5!(9NqUNg+8LIUWnUW2W~QW1kXnR3 zSI>AimUyjZQjd5du<>!gVzu7(7``lDZ_G-ZsU~cMd0|iUD;!r%#J=Cl`C0!QWI4&) zn=n?BLAC;KiSK-%K1V73qhJtcUv@c+L5E)c@e+yuC)Dl47=ijDccoR&lq-b5C=_TD z9Oxe3Ez)RAQatK32OnV~8{hG*}bB;+Yts>qGlkBHC}I=MeS(1PnKjRr9XgAaY6t0iA1mIUn} zVV%G=?M*E2Zd#mqU+?ajF3fC=kf7jhbdK%8R2*TB8`NdGdl;}}4_(?id>XA2=m71S zjUsEAeRmz+iZl9Fa}U--O8*uobA zP>OPKAN(C%5wMS0peb={HL1ED12}4~S{?HPNFacE`jMp~5dO}}Ja|j%*f@blG^(g~ z1p!>P!qf(wr9>0BlHz5M0N4R0*nbRPAfc-g@i~Iyksl~Ho@O#zD`)lTqJ^S&JdVcY z?Pw!K=j@r~f2nn~1v}Z>h5l*ne@!Sh_IkMd{lBQl;lme)(MSc2qa=#4HV)Y}Oqiau zSX=Tsri|m`T=Tz94rMe^j9Pl+W+zKg2nw+Wq@lKt3R$Ftl&r6Ru#R5+-6yJ+44*+z zTB)%kn^qXJtL<@DFzsr=6!%x5bF;Ke=#m8djt^cDE%-AyGb*4(47zx-ZqJJpm;gWC zY6qZCY}sTAd-h<=k1&mn7}ZR7<6tnc++Sq=DR(!2y_QL=RjX->SXZh^y!;aj`pH@( zGU~Y0V-PhRctgFW(6`Nv%!2iIzAX%mumZcZDYw7MNI;v4l64iCS_B&{hePnHctDF{ zY>g4{1Lzv^N-_ZGOca7>vH;Y*-vnZu-$(sxpMNQW=yGzeTrfxc;! z?(nr%zyV|?rqp}c9Z59d@B&TsLiH$#`z)+gf>4B->UviXUo`+*Rfx%(R;8mBz4~J; z%>}HdKX&W7CDRRSC~}(k=Wizj{;Sg~3mhBmKl)oOyn}9AU8gD0{6h~gn=|L05|UAi zt*1}JJwKP8nG_i%lG$Hg=xx+4`!&dP1R7yAwEz6<2wIJ0mYqm|6|4LGDAV6o6+>91V`n!4a&wE13dT-e)o zJzOk1Z69EdAb}F3F@X_(akaZo|Fqk=A=kFcZGEKWcA+r;0T$~69GO%p>fgV(G@5kS z_xHKHFBf|@>emV{)i1;il!|~%ApHv0AEJ68Bx09BT!v1vyQGL1C^ZNt9d2h*-H_LW zVD@}^p~J)K5d`}774=J2AhW1=lc7{CGFG`|RFy}s3#8Qo=3sb?4xI=TJWXxn6sie^Q;U9EFaghUDDx52ryJGD+u zuiL}v$87F>==k058d(v+yV35Nh$rwVy6KQt{W|!7QQ8o?B>i%l$+3uXLK-H^T~iZQ z_yOyPLGx#Wt-^Jxyum5O#C`4%o+#SyE7h0*f6L|>~}rPQ3E zJA6EAe%`jJ3ZhCQAT_(Q4d%JD#=k$=cq$>6JAPtDxyYt0+C>G14IZ@s)umnK9Yn>4 zDtJCdpl675%mE{2IFXXdoLxa+OVEXkiRtm+yt+$QYa8lF4=hK;%2aI;&gZCO8EZe zzDJ%#K71on3kBc)SeCk86SQ;FE2FAl){7{iPAA|jvGA%Akwqji3e|;qLunsRVJyz} zO;orE283 ziPnE_H!QC(!D7IWnD-&9%QTi zgOA3v+WF>HV6i}9`}5y1g{QkbBeEMt;?dOJ({*`j@VZf?lHHCW=4wE)5a|F5h$%u3 zlxguwgVPU;9w-6xjaOSG4I)j@6tGl=6!k+{1=)hdE~gnh*8g=H>-D~}L6PdG9bNQy zr+Bypr-aj}b*NnD^0=d~)hZr%N5Jd>)~K2&3;A!~0b^gA1wvn4RvpT?6rX8Rv#r15q^6K|U zoidQst^GY`yLG)#6Q~CLFaJdzaxfS8CVrBQxAJ%M>iD<_YYfLI(ScGgo|XqPusTwk ztS9ZVIcm7C)Lh}PK+MBiC{j`#uA@trLDuhmX=jY5-}>?by+AZ!NbQbXZL(Lc2~>Gy zxHA*sP3nG=JGOwPpMx;Pwa%Bg*xoR0EV+jO`<_lf>Z<5Cf^nXJ4luB1F|`}529H6r zVvFYj5OcV6-G;xVV|L=gbLd5*8X-)znkb^tX>8l@1a6M;Xw{=Kb@hJ)D#?OOjYmbh zzo<|(eIWHUZqP(;i%>vj7dx$tP>>9=g4=N+wuhCjXS$=s3R;X%c!`7_3Q@Ce6eQ)x&b3r=E zpU4*R_dvG6%5}eSiHM)sIbYA}E+=rsIPpoC4{rd^-Ltg=XHH)2f`l+}CQHb0JN26Z zX1`p=OGgfUJdNV?OVTx}Z~})%bgwZq4Sb5c|IoO6=#Wgw&Sa%TdLTN79ggrTr>oQRMmf()t zc6lzbKOIrc(@BPBj`uw@!VSMoC`zV_-{MgR{5N42QEJekO>-Zc+@VaeY#z*e@KP>K zp#Z^`@q<)H+V=^L?>1+)diG3l%WBfVTGi>MYxmu8XvijTR~qe|y*w@UriB*bfa;WL z&rZAmAp|eCJ6BKeILP^p(!xXmSH<_oXfMAewmZzku$tMLrv_wKGmB-XXCGUKmP!aetpA1|l^k~(_ohaQFc+J40`P*fg#!t~VPf=^OGjf7n8NS>*bivMdF!bi5P zb01LAFJO1Z+ilI;O~!vFpdJar?gr@ok1s0O|E+MJ9Goow@)SWu#s-JzUHhHt7y$!V zupDK0S((+`s^UH7uKbFfyX|rd@Aa7rH0Jk;g^PJvYlSvFw^2kJdA(5l2j4oLnX=7X|})*g$a9GlTEz z*PoQBjz!(Pmx`9n8Q`NTtK)JfDS3uBc)CdSY-&Fb{CnG-m4AK+^DegxR(EnqRV`(S zV*gBnkZ-Bn0I%t*^2^_v$sEsJNdZ%2MEt1ZYD0k64`CTrvst*Lomh-n)(t zWT?BN4_YNGh@(0QMxVxwk;=mgRy6#?Wn6^C34iKf82n*-OS%{==+?tRzZbHB2zfl* zyV&3`B3tab!Pyh3a#+DZ2Szsfsj0521qW?X3C!&b$0Hp6;3m~~jLv9PSerbW?VFHg z`{;WO^PBL54NYgeiphxHuQG6k(Svb~JZ|Ik{b`rFP+4KoSx|Y1C5-nXMs?J$R*a6U zLBE+L3&CT{5jvanF@fsc}>)i7CrB4Q9llB(a=bJ{5pb$#^o8el%g1Lq3DgM3gJ-%vu(LA z++Nj`<5~SDTr$z5n@M=Yq>zf_Hu+)o5kE@6#9qt7DZ2cuw<8A#hylskX{f%|>e}3{?shkh{L@`7^ zS{d(!`6t}wYl6BnTqmU@KLTMci$4e)meBX#{pcd}`{58*v_z8LmB@fiu;`)qN1z5u zvQ-2vHJ}_tS?)OWnausus5!TRGSc$kiyaep}HecRZ+UA8Bs z2idyjQe5rklduDRZ)u#ObW@ciJ@w-ya&~4rR{DHkXcoihxmuho)Z-RzwsxS#5Zp*L z#b#Xz)^AwJnki`g8;10`P{(7w`px<@`z~tc5)TU_=5m%j+yhfSJ24y?KWFAz=qK1H z8Ey2+i+r2#*AM?wk528#ck2e*`VW52C`2o*XM;6{-Qjze`5hPri4QF7_woA>k|brq z|5Gvl+K<<84ae;4r)V;|9X0n0v)qrQXqK+Da_tqK@o)_`Zn7BF^s4@yVI3s&La}Py z0`GX=(O|J5WqKcaOtbetHI9X}C4N>8`Ij->J#K$bZpH0p%GbHy@ca30;@hoH#KMVs zZ2P{8DJ6*ibcc>qkvDfZ1ad3AakQs_;t0tC4}N|1YP(a}gxf%d)Fwl%>ugE(A6frViaI*c2wau<67 zp=qITO}|k6^9AyVgKMcrYbKs1jn0{9h#_23xtS;LdSNCsgEuFd_qq3eCg9V* z4u6(6F}^bbfEd5__xFGOij9l&D)>9QE2I4*lCHebi8hoG_f7a z;XZ!+XfP0&M*!eCcv)EL>*{7UHgs;y0QNxyjl)>mt4sIvc{P|m`-dBrdD2lVdToFL z_VlYe0AR9=^7-_KWBB>`?et^Os()(r1ehWKb^#zRjV9A3Xmxl$KWz4f=rq}G0u09# ztq!Ln6*;*{008HCIZR$RNw355A|dEJ+R$kS2XKJ| z1qJIyKdv_I(8i_@1ED?G*?j=w$I3>NB>^5r;+NUobS_5k9wNNJCc#Y4%N@9s(cKGI z`)Ascl`6HX%ge)GOPCoxqff+i5$KVQKVs-Uo-WRQXk?tZuzW{AU}In~t6i{fo9MQ# zFsR12zEqGRVJ)$1nv#8+9NZN3zM0tm5xZ1TpX^VQ+V;FC7p#QWxZb ztSz(2>6aWB8i9kN$3q+v99-8AX{JGbkvpF47mcK?t=;te&Y1N;Qba{rHkY+44mDq% zii!$ouYn5av1_>N623LgU-LrfA$fUvhK7XzCnf+JbjmHH912kS&N?2W(LYDy4p%@U zk{cf*y$dq`b#z3H4sSA^UQ}K_`sc_X$G0>R`V&rHe?O%V1Phn~DN<_GkSTb+zGjD~ z+B7z3!pg5E?eNf?2@?Rzh>DAc=H=;6N)GUW>7C`4+H7TrKn-G&CQ(i!{5baWKO)1rUI>Jx>nZQ z>a>>j!dgbR2_N!)Cs|NZ^nSN>a?+~NeWPx)DnYR1aWgP8XB<;3xpx>J?P6crs>Q;n z`Tv|rmr9|F3$-*d`T@X*PG8Sb(a@1YdY7JBaGq_i!k1iItSwMcQ9V69Q(G26GP)$F zVTSiN>({-zFxH!J>Xodq+BWC?SUS0I=28Ht$Z@qFC??FpV(9JwjnNQJMalxHg%kK6 z4y?sFI_!7hhoR>ffO%R|!w@;jqFoT3!0gID=H$Tb|+t@3PmMhl6o^YM&@0?g72fF-|Z5{ zi9g&NVd3G8Qz6yJ3ADtB#o))C6?~48l$ABkfHno6@d_X&CojqIet=u#V#iJQbyQ*l zj2d7ADzqd3Gc*+%Nk+IPrmdab*~$ON3R-muq(Gl}=zO{y4MQWZ(|qgUU%BE^QWk&C zH{WP0VHg8IRZA^vESH!tT2LWm1km&S1PD2tk5l2bvO>rR;in1t__CjuK){*))3w$w z3J}s`um<8b^^E|FYGy_ez)2-(_#C6Xb8GT>@BNC)q_2Sz9*m6la4=1RA5#*Jt()UJ zBs_0Z6q}X|i!6M7u z)E6+>_@C)QwmJzPU25z?!Zr>4+S{K4;m|r>9xT2r_Fiv zYHmqa*U%6X75z4tVPNSvxAn3UiY;8%U8C2#4sc(b+?AFQxqMASp=XYelIeA#$?Dk! z%!#0%sq^GR$HlE!bYE|vM;HZ{ABv)~JyVkW=m6}ko|K|lSy`EXK)_E$2wi7-D&&MY z9A4gbfSyxU1U;78Wd{0Q=Z+Fy=)(4a$uLyiyvs00z`~a|K;1Y1kJ~v^gqYPkqv;Ix zx2eed!h#suyPN!cSlM=%qPx6TWmlp?6715WTv(YY%jjT%d9$+fUrg6EP>sV@eAK+W zS`_F2VDno$w5fmbB}JuLa}r!qQW7*YbOa`CIzTZ5xIJXbaM=-Maf>nT>RZ0gL-PT| z0GFq*@RRAHLmAN*e=q;fsDGeRxdn#3Y%_=rM88`K7*3T^38Jx}X5&Y?$@P*j0VB^< zg>U}r+mK7QwX<{E&vHqo(<<|O>pFSOHrESaQBhY{KU%0>kVXPlV1RA|utPgtFZ7YB zVORubS)zZp}ib7KPum{N+gc!a|!wyib7yuMf zdO9}1=9vRMLjD-A;N!W+VUm!wEhb~Is`9%&S2Hs+0}#NqWmAwpf_we!2;_At-60+* zn9PAege00UN!h~(W+tSgv$3|uOGO3G+QlbWNjVfaCmicja$^IKpYrrNz9C@IM4xG<(@e;TvS%uzsCYp@!KxE>@U~!SH&myi&%9} zWHBlp{3d6S;dpOOB`_%8(ls(- z4p>{j8VDgNFG6DBY(LeRn=Snu_`t3xW;W%E7+zLh?&awT4AfdlWe>-C(naR3fHO0b z7H36%R18}ZCtNeOuK)$?E6u>NZk?R`2=5$Clw)T)BW$D0J`3RzAsJclXn(u^*bQ9M zqZ$TlS7=3PrmvD-IV3=)5<;4zWhAi|1Tf)?5O4a`zBQxQ3=yU2^!_@38s$<#MVD3Icu(v`oLB`J#BsZYtnZKerIeW(_G0EqZ%<3;1hO zHT&pCk+fdmUbm3JkkAYbX05AKH~=0`&#JaR5VM!)+7C?IJtusKGbMLH_xv7~r0$T^ z7;$_o*9O`lx@TGJe5+G;5`FQ4n77@-*qF?`%N%Wow=S3`=hBmd1?Ht$!V51QX?L#q zYjkup07eu-`f4r|F(1Rk(3=nXtcW8Yz){a zexz|+od8~>L1hg)qXCsXIv4c$9;NttQmp%=&9*l;_a+MelkblnZL~x_Om|H+4P^yd z7WS!m#a8XnQWJ2S#EoU!d@y4Oj03bp@u#e(DX#_5A2;~m30^ixtn*6cW|c!FV`2ne zfga&gf%{h%VUGD=l!beIe6g9|ZIyML%IuhqBO@cx!$jEF*cM+H7#qc8v}Uy!%#VJW zKUc))KpV5)7SUM&V`#C91%~UThaJX76t9??F~5gMn*=9$5VmG7k38lwI=?Q zNL#VQ8berESXern3Wc1%OPw*2<5v1oz17zz!jlG$=3uhO;?)(bZe3=6)R;Z&d3PT5-Q`8$vJ4l=uX8Jx0|%A8Hwt3X=Ve^{592%JPC<0y z0Ad%HyGo5laQvD#k zClCl4EQHWF1h?Q4f(CbY2<{HSodkkIaCdi?;KAM9f(LgC@D+K_d-mS<+2`EzJ))=GaJWnD|ec_9!&1~qqzT5ono_KbpdRnVP=!-i)x#&%$j2f!= z%1>>HKcpdX1x$<#eM9 z$TLdUUTG%xp%gZariW8RQ!g_6XzI(r;icZve5|0($dB~tU%jc4ytm%-tct0LPHptw zuaUP@!B#nxTj)q_Q>~Ue2EdM3dpUdBzED@%J>*%LX0cus&nq;!6aPhV(r48%q%_rZ z_SDqN9qP2q;8O42VrGBZX_Zu#*w|4V84^mI%IP4cu8yOQc>zE0cC`3-02j}qq@}`^ zUlL~F3foeM&mC_P{x{~b{hf`Fc_QTFhc0e!9jUBMmYOb38ws_gpA4akO|aF9M@>BI z*)j(2<@2auFdB1~)tDQ#h{?!cK@+^>mlYi6{k_>iE~etUKpg@>4S@CQMoBaBM4gr! zpT2fOLMiojUgk_e!$$n<@81H_=H}$&%*2g6`?6|cQ<$n%MDliAxgGL4uC{z+1ZorC z|2xjacg>7QKex6bE=7D`QXhyE)sOz)jF$f`CO_`4BO#Q zARkO$yWg_a7CbvV_9ml1rHv=c8&n*FyzqRkUy6g*guaj?1M|Xv?4x#eGW_M9@Y6Wp z8^ADjj@Oh6jQo^3kr`_yp|yA$S-)lcJdiWo3cI+oHD^N$xtl*5fBDO-JHz0fBAp@EH#lY+BLo#0RPU`(CA*k=wZ>yen)TG+N@lTm;GNP}+VFs~IS_te=-fQLO zDXCqc#=SiXoHRIE)4#gqJVIKTBxv(^Q~j{jX7Ec$+5=}rOKzO$kX)85pc9pYpdj(n zidZGzQETDyXWhiMq!G@8KPkvTxA*rp)jRq9%4tR$f69bbiLlj;jmcG> zh@DDy343N#wUT;23c^2gnOr^c_GzdNKE(=o-_0)>uH&c3! zw)xTz>8)UERy5v2of#QU5rF4dT3RY9V!A4cf{eC=s7Fp*lT3Uuk%16ctxk{=M_Qnd zdxY(Cy7ZwANs0e_H%`A|7||^*QVL>sYmrUZI?`2t|YcpGArs1FMO}5)83GaH%Kb-P9j-xE)&Zkl5)^{nrJPH znHbTzU4X!QiN+6427%RPj=FbPuluYwMJ3mm_=P@=2zZA)L|3S+o6f_p<>8g2-tMI$-UKz9)$I^a3K1K7zbCTng(B#Syh4PDjVV=NANqk*iebq zgLB#{IggUK#h^2_5|QO&ID=kS4>t(J?P6?fY+#Vx($cbb;*9+A6^Qx@Gm1Ez{LY_@ zS^8{2YCnK5KaH5c{CRtkh$+Hu16A3vG5dMLtYyg_x=kkRuGS_!Cz1vot9CRYE9*t& zFgFf^?vI&ry+=TWp8hdOb$&Yh4OeJhO?mIoYvQQeL(!lx)u-qTEI6Hs5n8%JNMAUko!R8CY|=&ky{w^Ix4?2)R_8u0A4z~yEkP$Wg)LdRF=1h)#Oy46YH|%yGeaWcHv0QpO1y*P zx+*T!S1z#~Af1C0Z!6L_IW~4k1DftG2r>+FuJoxqHQ-n&KNv{l#hP6y+m_~QocoOt z-m&94XWEELUT-}o#@T!uvW19eJx@}g@8ibNV}alx+FV7SPB&2MKl3nx9n`Uk8<(SP zxn>#yA*3?$aYNGlkZhJ5i{P&1r{$}2D?`!$&Cu6jt1wK0Z9Bc6VSWCmlJLahGm~20 zW)Z8hN$8aIKB4tKHBl5qoVXKAOW-Fq0?}*VfHM^?$ilbJANDXKIe7c7_3g-CZ~DI8XqdYgrmfDz z67zzRH$iz=`T6-Ee{xhzVL^edt!+|L67!N@gQ-*G^Go!6`uKp~o4i_;^UsLQb%6<| zez7>?SpQAlJtsRG8NwVu_wL<0Gq7^~B<183(r~c1Q_U{v8n}7B(()Erh_0Kpo4;AI z=l;!?hM2b}E|!wXS0PyY8}6UgYr%U?MNShz&~g18TJpHH00==~AVMTA$RZ3uVFwlVT92Av!H?D3ecuGFG$cjWY<^P0bF`&IVLgvwA$7l-m>VChyA(yIhoJZi@= z(l*|U6J|!alcS?LmvgFPZ>~N2k1~>=AB)ThnXNR|R)kTq^++aOo_rdaYRl=ewXdqz zd79iZ78%F;+!tgV{`x`J!h#kR4lLW>zklDUTTT{lO&yrfew+{chWLSX-fMb1e|FIZ zmBj$0aJHXaSm5GGZ8$`NA9?c@V4}}pVNE09qdO}gNy&PxwT!;uZ_G&{LFwtMAd~uX zv@)p44GjO!&8x;s3S=eZEtHeb=|mxpg1o4M4Cz9{{6?eK)q0-lT@0)jNx|x9JDdfz zSS)}q=>u~r8u{Gosr+7rO6rjQD0rcSJblUA1Nh0Ka4No4mUGuUu4$`Yj_If!;FfC z24H(+m*9~W&j*0gD=RCLUc%EJob*meiWK56XnZ2XirJzPr zuZmRoCm0D6LbPeD)TK6-8lUN@)7arIi&CYDz`S}a+ftv_#Dq@O`*HoTv9Tq$Q^|%R zh_cm~CERD*1w8+b$zRxKPmPbiT<(U@3NHpcyev6PN4VZevqD(oiMfPPIQb>X$@-XR zdi@$?QO8LAL8f-27^f2UiSgFv-rAhwmk^(!eEnPTr54N6UxRyld(wcbI9}@p>CR=< zq&}i%c&DZ=UtiVv8FU=nS)rSzrLapIQ@sm0{2*fNeohv#+IZNkCzv{N?ngMu>+%wG z0bHEmxu18hSVVOWFw1Zd4)~Jc;EPL__HM)&M#!sXEavK)@+u%Jvij%UdYo6DOYq2Q zalG11y)j86=X!9&5k0-VJL|pQ@}7=yTWB?@f*ja}g9$wMS0r3qZs)%y#hB8m!8`^) zGO4(?ZQb4eL2QCToPe+B1o^Ww*GFZsDxdapg8a`pO5n*yJy))Wgqx3mtmtSYLMt)6 z%oERod*Bjy@o@Q&Coo~9+xCXeWuuHR+ZHxj84wc{gMwPg8 z864C}Z{*ZA8tgh>2P0^Ws&`63U;xs^R}?PfFX7Y`K$mZz!&H_F=ww zZR~Rs96HA_eyU1vUDRL>F!9$?h~U2U-r%l()D?QJ@ABnS6tDX05@(RP{F$)u-&g(D zDy%*{UAf*F`!~X%|7k3ve@WN%FR_d~c(Mxk;qtaiC>jfb$V~c(VW1E_QnABQ>)Ap? zf)a4Lw_LiqyDtW!_T%-T?%$juaQhUeraK}J%X^dzTV6`cwq~A&ZpujMN@J6KUR83b z=|LTGIo{x?2;-UAm-Qrw+52htOb=f$%Df)NK0SMF%%o;vK@%Yz|MLjKTr{c@e}3js5OCM z4Hru;ab^TBBc+31&&XV3g`Zt#?iro}`!9jlx=+&BTToVjj&PX2z-H+W8(u>Wwc+U00An_P+~L!MoRn%*+mMI=waN^K zl>|BJzKeRr>(4}5w++Q8+u3JaS2k4nb0I>9c~L_q&`r6jl|E6-ONJqR1>+}!@y-X) zsc{YZ4SA*6o3DtwJUQd98&Yi;pNq$iJB-%tlckI-EY~DUt>II8lfatb(a~usyJ$EP zTMzC~feploJJ|eImWt=QQzJf8$0963&GWzgQxAhZa0_#V2-@rlrC;HouBsvI^&?;q zwZ~RKU5cn__9JWylccr#=E2SJrodZUW`s?aL2>M=eic*{w2K^@>l_&=QKP^>LbYM1 zpf+yyt?*H)rW8}VUgtEny`EL2je^1$Y#rQSSaVh~|6jZ5e24&*SxyI~X}qa-b> zYKnS>D<*2(dnxs0=rs|wwLrx!{HIhI5*UAq-d5056kTI_Gosmgy-{{K>y|GNDD?pFV`{QvG&|E2u@8%_EDp4Fcw{x7>F6aL5CQtf}^4E)a` z8?gNkBOCl*|W1>lV(fbozHitr#*f?{5~Dt z=#NDKbj|(kVeOiQ=fj=j!i7J92fM?ssGuNmz|)gSr~JNJ3!8WA$jZvv-rgn=4qe~e zY`)%1tYZy<9)EZE{S;_WR^|~A5uu@>UC*`|OvbWUE#}zm8DO42cif#q-l4xOz5v<_ zi+R>{tzxxm1&=pGM60dd(4b}w0;0qU5L=ugt)>R&(@j7S&sUpG1L29|!GiPI_NeJ( zfr++>;c!aGmyTvJ-_5;5t7dEl-4C}H`{H6^tdy+fsX5& zGJlSE2`pxF z8%i<|{UM-#vJy90ay@)cl3lJB30ijnR!2t%2-P|SFAo+SI2RY{?H=_go_D+2wGJ3n zUO?j%dfpLX2tZyVBO`+qaPjNC%Hck5AU_)%7;xLKp1wbPxF7E5==fp118he*dt33%{ymJEdRpZNrxFEvgUMAz-jaM@LJWZ>So=t)V>b z&Xv!8;;>mF4SzgY@3pm?Emmh^&Zkx?ieoeolarGJGB~55r0WTJ={A3->y6msd@{)d z8nvoC=~Ql8m!tiFO1#;0R5!iOm-^aqtb#+dCPv}r3e>LHA+8cwUsvz2S z@9?nIXojG<`Cd4YKvtt@hs?73B_3BWt$Gb1L*xvFUF-1hFoiUy{kGRjLnEW-u&`=l zk=RUzt&^>bE1y=#1;~?LW@;V7TI)2h&`v;=z`MOvHPom1`c0OBl9Gg3Pc8Tk9iCF08Tdn3X69R~4LYeGT-!m9a9*=ihv9>Baj3-fVcU|{mldm4Z$Vj^GO z=xC+wbZa>FJyPX)n{gf$8ylA3>Gf8sxT9BPz`Gtx?1EPam)_6uc@d7s6Id+}b~{jb zkTAqvX@>-bhoe%SJkqxBGAoKT>d~whhz(luN2FjF{`zt@-KQRIGtuUVZ zR%*4UJE^Q5znz$c>Xrc1VK@BVAC{jZASx~{fOR7~R;!&r?#2}`ccwFCI!?O>2luDL zJek>E9zcX5b}s@pJ42T9<#Sn$N1i-rF-vR>CEtQBcw}{XaUsOycd-l7O@URuz&dzI zC36xz4Z@;-0SD*B&jk!X`11gQmqj6)%n}Y!?2#Z^ob{Yc_V5~5BIlqLG!Dnql@sS$S1rzvO2&Nz1eX$HqM(s+nFvUP(ar9Uxu1K z1?Fej^WnWjIBpbu!7Dk6#f7TOC&#?A02t)MOXt-Fx=cj+?_Qj^SXkuUd{P;gW%fIA zJ1JM36fs;`qIt|8XgQN#Xdyx}fjo35k*!oH1Okv$dq%F;;lybq!Ip$`3AIZuh@PzV znms)|Uay(WrX-p%T?S8tNAS}(1ficN=V><9yiAFXhG{dNuc0jgcF!Lc@?N_tF|umq z9GGL_RIGw8wG0dlB1qpc@<;b33zcSd*Nj5=}9HAmjlV4vDv~x$+XV+x~!;vGj>i zyGF|kIw7emW_)Hv8WQoHfLZkL^;@yG3ok2q)_-;eIk~rat&qgv*S_|q`<)ra9XNFR z1sNyU5SfCHGsKbtp1gh1EoeefT2$0z>3cnLr~WIrClz=ZL9YC^TwGlD*TbG-IWsde zU{WvEZoz-=$eaek{5XRd@(sBFlE;f?H4ZI*E_gUNnR^MF0vXP2gt!;VR6(#(Wn+F( z)YM^U$|V|n?gA{n{?B!I!`8t}Ou^VDEa4e7YR)@eAx|a>Ay@G91g%iZduuQ^^{5&* zemQ~?O%Nww68!UZbxVLXFoS?!V==tl# zc6PBpUpSzm9}pWGdy<}9F=75B<#`2!4lPg=LH2r}SIa;+k2$L-ZIZX}O&CrZL2lBJ z{tk(4i?r$26_nYeCspo?jgHb{Vhun^F<5h+gD24=I-Voxd4IhH21V3Ht<`)Da`CAz z3OC%-GS13+Ao2nu7)Fi483}dhIeMw>mod;e)v8UatykND_cvpFgFW%W{Zk?2qf%Cc z#~T0>SmS#?i)UE0l=*KL0CAI!%oPhmF_+sWLW1+O7HzfE>1M^(Vhmigi-Oz zn*xjZz!YCBpVBh(1~wSKrI(0}t5mZZEYf^m~EK zHN|-|zNn~(ZON&_G;zLAnO+2na{?rArlp_=2n%ZgHduA+XiD8Gy{4T(cu3o2GxNJl#1L1Xe3Ye*3Ln``qL`Q7l6!rDr zC_LrCxXf27o&)G==ClG8W^Jm2`jn$d2bouL+C$z0G{AR6!go zT$vswiFb|%ANp?tpH_Yj(zt7RxNTWjSQtuvCvG>aR%?lzD{l}^Ts};1kAd zwS+6#D^A~Zww)Q4v5OEL`1LCq4MI5r#4+Fp7-BZV!NExO9iwCyyVKI2T*BMIjc3Nw z(b2_Bji+UEgIy+olN~Kdj~8OJ#&CWg0s$_rx7OQ+>z=0ubyZ#+%-jjzn_MsXW3tHQ z!kfTDp-xRwhl%`}O1Uot?HuzdlP?Hqu+o{8c7l|GVjEnL$#5W?e31hizdkegarT1y zQdKwzgljbK-+7}HjPDRWiNRHJa_Z6f&8c6Sno7V7%N=+#StK(8#z4!>ufqOVdSHO~ z=+kvNzKG<`x?@Q2ZFYBcd0egfTSrBR^7^$c=YE;x`5U9<1aTB z`CwhBV45x4(d>RpOhU3z3mRIh-qygzrhIf$2EXFO(C`&g?fls_N({DSHP7nCA+tR@*<1afpB=Ce>@;Mt&QLZIBmRJG<1p z&VotL84@!$FZyoH1~mMSjf;%}P40*4PsYZ^MnNIMP4!cXQj(YV$pYlsLP+RKVq)Ux z(5lpz}RRjP9fm`7PP ze%eoni|gSc^+V0@yG=p+mqqlS2fg8oQ_0J(T)-0^nH-_KqTNv`5D->~SgT9ohe{Q4 zH{(KMaS^j#l?1h8kyg7k@HE}M9V(v54^{3HyUQm{L$V_2C5YOzywvIl8k2$k1RejjMDYBR#64F<|igk#(08YUW5Ml6P50kFS&zC zf4beSJ=`(;*#&d*=$?6;H!O7___B;ipI>3nDY$rK6@>vTVN#*#V-b4KZ~S1oP^{Lp z*QP|%9L!t@{dP_MoM4NTqrY>=mhni8P!2#fL?rT?fjK~1sd`J~JX`Y8KqP-j6yfVW zR^M+>xf^DKjJz!S&V!egWPTleRFAbtU@W&>#umSQLWrxR^rz9HzE;j&v#P^CR;FmY zC%545>ITE1)KnS5u9j6icEac!iMq!6;2<~#Gk*4>B4W@^LhSw5T?(6+jq>aHPmc@< znUa1=JPtC~z`>}V&E1P+j>P2Up4?vnM;~24yYgq3Glj=6poPSv_@U}L&e(x&2&VnN z5C4Ej{=EAqh~y7g@=p-SKZfz2cVIGlY#MOL(ry1X0{%c{P)`zw^bYkxW5Q6(2^rYu@s?SLDp37B4F9pk)qrNb6 z!qC2XM0<=ngDZ*qgPrtgNJ@FFJ}8o@2~7VQ5Z>V5nm`@_S<<+lR#KbHM-4aSN)HDd{yTa=P2>x)15`_WKCV!;V?l8FOI&G!O>~2Q|hN zIp=Z`9HF&R6)U6A1eFR<`q8zTgh>VNnf>)AdnKpG zyAOW{H=GN8VQXX{WVSV)cW(0Y=g(KPYEdyUQxyjN+2XN6A3nr&0Z*V~x3t9rfF)K| zhurQr-;cX+z&e%20c^}Q%bWcypUFMg6@rtQnQ1f-2gv4UAv^Q6R;H!}vPthpGX=9%EA-*tJnI9dACa9IZ0-XpCn1}Q!({@n z=Mk83e?LDUg!Tnf0FV7Ps(3Og{{h(?S87+o*h@@IJZ?93Mn<_8ZRbECAClqlYhnk? zq`+XgG~EMVJJtO{73g;)50z9@;tIVceNg%L0$7K0%kPuOn3&{q$0v)`m0z?uxVSXr zj{)dIXL}?aU>>BTq+lKD2KK;69M%AD4p_}fR?vu)2B`@}9#~Qql!GA(oXa?%==8l(^53k? z^b#AtoR2c`@bCaVMmEN`h=_E18-1f}FyEoZxgIuQ>0)4E)tXLHiG<2Bqo9N(ApG^? z68Ud@2*C5XO(-w|;LtLYQfMeSK|dS$hC$6ZxG$iI5)-&8|`YTk(qu z6AL{Y#Y`ix3?>l@HU^%!lhYMI?&Rg=Gcz)hkOXwF=rkU8Oq2kZ>#gNN-PM(o$r%kN zX9L*!37maBJYZfJlyb?aYx86|dUEnL*%c`V!E{ksQL#A?4-F5Gh$t>1Vmy(D)_$y{ zrNZQLwhbIgFgH5_;X<|Pl84-}8SG*_ zJz=^NV25 zy3p)L(}x)>;D%h59&j63$L$aYeunSucg*gQ*V%Hn`x#G1RDQ=_{d=6ptA%1XKC`ikIJ zH6#S!C=nav?y|xn2NFC{;r;V@l_ zO`7deN$`QaXzbkIRsQVNK`EOG%kAlPl8{B1-o-1Xp?s!GI6^-ay@fg7`EOQvod@5f zb}w=-5YDw3Dw=S0jzgDW2>h#EjWx+T&~5pcRk|Ha_*1*QZ5A>Q;E3iTu(ACJH9Qg> z1nmRjL3F^MNR(*mJLBw6LR}~Dh}J`iQ)1nUMU1GJDrQ=LZ5#ydCYh1?l!g}%xik?b z%!p;%Ji)!pd&l3CthZZU72CpfKON1#W0Cv|-|l&>!jO2%!=O!Dw@&h9Pm|QNuf0E?I4c`dl#M3;uHPVQCFnP^qeFg=+T zI*r5_)O$0<^P_zQFX zqHDdK;>9j;MuHGw${7}wgf1l6^I1Qib;;(f>JqHExDxgvOfYwFv~$i0a^~Qxi@D5N zwM&@C!0~_gD-_jM9n_z$vWydbRh~Fe9Qh_F^^T?vz9_89!g_I%SEFBT%}pMXr71$U zg_YRFF!%YxoP$t3PDmx6A#*bha`fhfb=~7rAxrttyB;E%A6vpww12)iGBx@BVG5~a z=GuRyvW$Da5}QuU@ASLA83{q@c>Js3QXfT26)pFw=-E~FaZM3IDpan6GEq1ph`~x@ zqbElywdO-i3Kr{bqbttD0v9EJXxT6FQ88B)(rnpYBUzN1_*%`6(WPJxZRYttSTxu@ zZf7OI0GGGJVD?eGa_#hw?}A4$pU(_BCr=*MU} zw}Qs${Db@0`VMro7ln*jP+`M%LaqDh)RTwrqR%HI5S=EYf5n4&5kVP2Ou|6uRU$PT z=?5-!Qgv!Bl*wmHf+T zO>z|q5P0jX7dg|QJ8>S;lW?VYw=ql|lhH<{=~Ukc`afIaJ;CZ&pJ(=rzBZ+c?e$Xd zcj5=gK`PgHZ}$gRDprMr`S3@_Ct3^X&2yrpZHWMZaF?9~NMT}OVP2<#igK{IRYPw4 z=u|voc#H+ZB9+CayomzQ{)RcHO3s$nkRLl7Up1Gf_%Mb_HX;_*=yrSrW`=FCNG&1J zwSDoZ2s(eWSaerJ$pNPBPn;X4{J!SgihV1p72F%$&n5IG*(38{bjB# z=py|KZN+g-x{oGohhzHDldfvr_)W|*mCG4)VUMPM2zkNA@|8P;s-pDOtU0NlvGe1PCT8dJyT$Laboof(64Aw_cw$DMlj+96Jd9MJ|lYh{qn#@5|fh1~;YpG?t(hZQ26t4Dw#UZ(>lK29#7 zH!jkOWpu`OrT`81GR~PQgvzObi6}wv`+{Ujg5sjU#KPBNNSpMP$c%IcN^m}Nf$@A^ zP4=-g@Y-pJv%Z%#EJ!xo@0D%uF_tS*v+up-1_R!ISgV5B2yfN@v+!pO{sRh6tv+SF zCb>L}4;bn!K5H-5z(ZQC>&Wy|a0*RoDe9U#+AP;IMEm<3mD5uUxz*8KMb%~8IW<&C z^GP^7emAJ5_ma;~l9BE9KW2}yvxcg-`YE_&qj9H&7f-%lJg|@%H^=qENj@%;)X+>a zdI1-$hHpUq47Fs#-6NkF^Sc*({?WvdwYT7|cva{e??h_jTs6GT~x_&ExT=MF*C2YmITS7~m-4=BGhQgh{5UocXq7rS|X$; z(N^2e3~{CZjV~QHtKV2wW(}x5K=A;o(`qEG4M?w3JZ?-38Hj$+eA(&m-Kl3|6E5B1 zFk4w>73Lx1lE9cMc>s~-dDXf;FdKGp7K{NsC<7-aM0dR2ZVM0>=lk<)931rkN)Q_T zf`n~*{Ie6R>z4rg1@oPu*K zh;RZ(!~w8y%xw-P0&3=wqbgOe zEddxQaIcfV-u2kn<6hK9h-G0x!@r+im`C6%Ds9IfE)^R=*&B&XlzyUj~j0x`EMSlmeayDEGv9^rP?pudwibrhjNm&d!{<& zE7bbCWiODmmoFN#jms+7`(}tn!pG_w8*44*KLJ`ljO!%erOz&(FD$m;?n3=3h!)`j zFd+cntnDARJRJP|`G{2q${K!SBl}t$>OsRnw8DQ;-E4LET`jM0bM?V6dYIGY$E~}Zg+Hr=Wre+(Zq1C#-P&*DWQHxg&de?lTT}nkqzInkCi7n3qO$7Jg?!mLO zpR)WwMZ>_eh`3tz$-=`OZ{tDA2p*k8HOM}jKXo%EdVXMm?k94Y>u1=g{?@%<(eNMX_=UqybKKl`&-c@*8&~ZHch9u;&lwT$}1(d)`Nu!=|(a6-eX%w2Rj=& zN|sYBfCdc^+g_^1g@4y|4Ah|BB2RjabzD2-akBv>A0N>PJLRR8Qg?8BA=OsfdedLT zUB~Wr9|*ih#Y#%UAeSX9TSgjAo%8P@{Ge%FiY&b}>BKrpys2Jf=_f{G%jm|fw9ybd zY8%Gvi^)!jX^=cywH5J9_v@L`=s);8R)CcwTr*WnnV>h3A>zni~{psV2?-*@p{s^J@i-l936o4GI) zc#tt(>3%+}8VFlxKRQxckQnrBcGd{aU$G%3hm4+S%NAQw@=KmIN!vR&}capj8M9)_H!e>0vb9O&= zB_<{ynW!=p+&PYF9*M=5BLc(<#%{Q8H=Qv^3G<$X>rYuH2;vhe(nec|8Etdp)~g!_ zbJP=_t`+gUAK};%)Zk@B2L}#Mr-sZrv$Yg8YVI2g_Xb~oMb0IQMVxcXlgO48^hZtQ zwHgLMQ)Ziu5qa*D!(CSdhM=CsEQQiOmxD+Vlc*_7lKC)o*AWqOLMAx2JHjl|>qA7I z!S?*#y;t%kmMF?tTk+8R`(}26LmCU;_+%uTjN`uX~}?Ay(gK-N%9tSpV`v;+sf0 zXty@Yx0X`E<82qJLKPH>4hY6Gv_jTQUeyZwC^o!C!{_2z^;3Ng*F>Tc0!2g%R&cua zmFg1Nlt$${n2@yOkh-rqWep6$$c!XDqrYzx6w96YV^BMSW>o zqQ2zH0dA?WMMg_Jm5M8YQ>r6ik6KWgZW(~L>)IW6-;6k~6&%?DKRW2W#yyToVr*J5@jOLtR{w&ufncgmopaL7r5$HtcP_PXldVOS~raU@)K6WM^oI0i_@A1 zhYg{2I&Er8CM(zEUkA^%e`QBuleF;7y%w_EHYmbJwRCuh>nJ_z5W0hSdi5HQw=7!Xk`U1d>ry~RT-=sQW_H{MD$IpdWr53O76Y5Ii7 z@gR(0hvZZ^f%tc=v*)c|9&VN##^3}RpFN52n_IDn{DB@_=t5}+$L;uRj&9KFO@Aul zqaM&K^vDebNL^kj+Br6vS|SxE_)`}ZDM!cL<LtnrHoo;=B6!5=zyC(6R!OX$$wr2d z(L42#VAS^cEW)`a*E)Bl%_|-o0`dX{!;9p;idld|IAWenk;MLXdf2mY8mt+~R~GH5 zvcgwukay_`QPvF*ejhAZ_>4s6|@Fnj1Mv^zF!|qp$ zi`lTG4=!>a@;)Pvh2?A_1|JTNPM`n3DgTb zLN!bBxebH~5z*rZUny5Z?w0OWqgutX^9i3(-|QKW-!?Vg-ca-v-ocEHu)YYG*JDw` zKFrxvQX=pweCXmCD~0=1Zinwbgfi)l4gKn>=cK#^I$2|LMgYKloV0V&ulrY-d0*hwuPPAr8y(NY)LEmDzM;%qT z26pn51z%2;nEC-V&NGd~McY)=)5SWR;UmlBk$~M3_bV+Wjp`u|X*y}W=oOQp zj`GfhQRbteKOe8An1X*<`rHR*RDZWOnEJ5>8!8&#I9Z;J>YLrJ%n@TUsJt%-cq3Eu z$%4#f!b<;h-fzy@!~Q$2Vhiu97u%>7_7bjo3p4H16DT^6Xzl zRJmVfjxDndL}~~>>+bpmgtH@#x4tQ~j{p;UU7~rD9HFg}zFB}(b?SZDRUWL;PDcDu zTci1+$IlExNYSGDM6tR&Grek!5c9dGXKd$!7Z}-Qw4&If6HHt;%#QSIni37CKZly} z4s%YFs^1Hu85H)N313>$0U(JUVJoF~ij!pl+?v_2;XSxD2hTv`pI+wgUHI6gjLTRr zFuul^N2iP@gvf^uo4}`!vEyq~vzDQ&ut~egpi0)v9a~aaom<#Df(KE+csJ&JVz@>z z{B7C&guZQ2->m;8qnoJWyj6AdCClth|L1;ih3cGKa0PulG<@?NqC(r6IM&p0bpC7` zE}CL{h6*(`Ha-16Pn#+&CRZ8rR1s?RL`Q>a{Lub%wPrN5LI|Z+k&gNJ82y^L;(R-m zpME{(Ji(e?fA%KW`nOm`K`L!d+g26e$8gcdqv;Gg4n3HoYdINeOY>)5<8@@;TSm_O zW<8whu+YGHztCLjEmEs*W}9GrvmjY$gtC-wokptN%5Mf8~CFV%)m z*nEjOy640eUF%bY>%uXnwS%?x*W}(<|6UU;T@AE51Qe7FcI(YYb)qWHy}O#mby99tOZ6_+Oew#qf#M{(oqZ55Y%3zMa=LTqSCd5m}5K5oCL}O{3qJA zBly?L3c^+8%JJ%CWF-T*S}YPk&QS%-Xi$&QiimK3ize7pcW`NunN5svDzNKmxALq$ zvr)+ox`j+|y0rZS7-Yr6F281odY@axF^JqB|wG8)cdNdR*2c<44V4d4xI(x zr|&)(*`yk(Y?$rXG@T4c8u<=bvv31cT+UfG6PYUYriV@8`gQ6f%@{3WUS#THPVS5(7MOrssZQV;ND{UPmW$-@ZH+h8YMZmgA23XHLryiVhb3J{va3fvXTW zA!E+$AVc$5HWgt4&_ZS!fh+!lZ~d>S)<2}{KglLO+%+44cuqiIE(XH+fxrY~+2SC; zCr#&Xu()dYv=4dp>eG4;+9o|9`4s;Pj&3%NgM$O;(f4L6$?alL`FkuV1|vzuANPa< z5eitLwx+`)AOwbmvEkVLzB=ysf{ciQVl)KkblE~?LBU74Mrd$wlz?@Ulp;AKV^4NgJhCbOGrre3 z|Bwc>s)b5ugA5qz7G94-Pi|*>k+Ic~`mezbW#&Bl*I<|R2H5hSJ1Ep&$DH}w0&GST z|7|(y-HLk*3z6B6XpA)T?|H>ozjHl6QUGqNLA&1y9>eh3hY0&Vow&&9Y@6slWa}>waD@h`6f@lo-qkG^-JcqBTvROkL&xjQ{_!_m*K* zcI~<_poAg<3MwsvbVwr|3W9VaDcz-{bST~3NSCyvARtJ0rwE9YAl-b|^m*R(zN_}J zzWrzaS;wKbQAY z40hv+U5IZ*Fj&56qM1LGORR6GjDbNw+T5sY`BCM1HUTc_hK0J{OG8BAxezNqdvgod z>hSHz@96f?w#nX6*PG8qlEDr-}+O5`qk+ygALCPP5jqYVWLvxq38h!mxrKwss zqHK#(y7fBe&jmXk=W)Z-@wed*39pz`{d4ii3(~HCuJ)L|8c|&E#Th6oEBQ8pggC?q zek!J}85EWdQ@T#pI#3(zE~P~)aHQ_0DxZ@y|g`>L1-3Fh6~GV%5@!JP7*h%u8F z91jLC{Aj_FhSL|vJGNBS(tOv9zy0@*j(<7T5t>hnRiS>J_}oBO~)z z>WFA*5&4q9VXgxFm8~a%M5oH9t6>aY%5_JYPOeBrxV>woM^Id+|8K0Ee6m)(13($* zfi$(f&~TZ+0oLN`7^BX}hoH_)!0TWEmh~H`i=j5V zu>|^T13Tm+$Q_#w=V0Dp_`Dv=sPXGb;HMd_H-0BjRv=bc+E5G6p8!PL&UClx(-#jAlcJ1bEN$4p z$Y||#U7h`U7kQ10>|JRj4Uk|3+~>O+1bSvKK-?S5b$6@<5QuC%S)=#xVAIzuD=PzQHpJnYn4W$= zDe9(a0&h*s!@|NslL~^rZ-MaN!&9OWQWOB?0qNmYQEYw#PVaYK_1mr9t_`e=*b&W$ z7aU&i1C}1dVL%^rw$ZJg*n1twG70-eVqv7`gW_cSTk}mb9`R1qM!%K;oJOcXh;#e) zZZkR=kZ{(3bp<#>8ENT|z(70J8-5|gj}>AGG?}#eGXTDb@m0h5WiMcu02Z3cao;bPki)Dukz;wk6|rDA zUQ_=_-!|fFb8Lf501G!0@enN5N`ygD?7Db)c#-g=7aq`c4LKk8`#wMcL%Rb<8ecymXjyyMnWz!$Y79r$bC(4wDR5O^NUJC zHK9ZSXcQr@<|Gz6nokR_jeQTVV}V>6`4jV$MfId8z$&~By<+ClN0_(I65sV}8175O zg-xjG>|^0T%=TiUWkBX;Nq+N1GK-!Sc&WFl&FM zgJGF8fcMpX+-4*lw-W@hhe4rT+T!5S-ifskAi?tKss(oQ3495r@6 z^jy~d(tu0+g)4+H$V!rQq+;*b%RH2jSWsKvvX(U(L!^{QbpNmw3xP^bY@6+ED;iR= zt!EK3gcN8k`|Ce|%&$m1FHL_Dv}EslOlj5%|AkNt34~NW&KFz_M6jhWDPMIVdxn>j zOe*v@l&j)`c~>&y+fBVcP8l8V(1{>L{}+?TttJ}8`L6OV;8pv^R(9s2Q_`oRjOH47U zgdOS9j27ENfJh3p)n}5D-tBu(tL5MrrTH7JuKP53bvPGTF}r{td~A*e;9<;|eqHvO zKfC^$6=L|XFyIO;5C9hmlo6$N=gad$XjOqh{{gDCwh&qX(POdfE2;i6#KiUK7X-m$ z2f5WB{tnJkfmK6%i-4dO!m~^hs11tNoP7kGBE9Md24I9LWCyao$Ut7@;o^!@eupEX z^nl+-qM!DWi_)US_KV=uW)m|HmvzaggoOOz)wQu=`gh-W`1xmP2t|UwM@L70tMKyj z*d70Ntv8iFi30)MyZe=<xh`3F5aV;gWIs`4@rucn@#^gns)r#VG>cS;P+*@ms3| z!FK%8Le6P37G(dvLVCE|UV?@3C~)z|k00yi8}-ijbnU^rN@{Cg=)?FZaM&|D`w7eo zKuqIAZD#WosWVL$78bg=r$1UkaW7?16kag7p|}eg+s})Wp-Q7oYPC^@6<`ry3moZ= z7ARB8B*#PK3Ha1X6{zJxgdCwj>Ly;3e2CI?(FPrcS&fN zXr=E2zX#FQ#u0BEV(rHV*f#c?W5qy0Ao4&N?th?ra(ufo!QJ?I)DSGfIQ0l92EuIq zWAo1dHS59m9|QSeK|wG;Mw%{Ka>UFrT~ZOmcj)v%rm$v z)vq=;H$$CY`K?qkH}17DyNj)9W7csVD(w3c`e6iB7_sFfmq9=q zPuBur{uEZjE+AtEQ;9J#hn)GIot=RQ9uOG`sQe!e@d5h?(c%RcAlzKWeZ;GTDQsAG zywaz*pWq^4gt?w?R?mkLu!#{ghd%xGIn($kiChPG+0*|5*M1?hJyxtScuhn<rbK?gUbvgKf3jKr$*bAsIcIEEvZ(l8d zmjTJ$G6E%#O_4QA=Rg|gW4_dq7QFy!D8 z4+Q1CE1g_i<}x1GjI6MO=sHZ8E-MjWOO*%Zs;9pBRok1yb-CS&9sA=wC_TRKO67A_ z=x%xs*Dydtc}t75HfWOu)vNImE(8Yhdd)F&heLc|U?A`YmvA1UBoMF~V7Q{}#W9kE zdXE)L#?TQm;~G}k7Ck_MROJOs2ZnQs4TY}AwWF#+-hLQRR$kpe-M}&y45aOR_pX9Brt%0`&mLKS~>))E)|1%)%LtM6WiG+stfhy&?U?mDbMF=h}gD&|NDPlv?Qa5$x5^Y4X^ zxr>0h2!j6#?-eHfi`-#}OAO!4+s?r5gY|N6eHVh2=6}JxOR~Xm+oJ#yf)A6Znwpx32ug!0Behzh?<`Q$3|AoII|!o# zTIj&KvI#0J^5*agp^cRoR$nF1xX%PHkNbOidJwZ^W5O1wA_{M1Q$RPj${b!+bS#e5 z^hfEWVPDDtH?iC$ICZQjd+H^k6-MOJ9KJSr6xb(RgHzB`xklnwf1i=)$&#IB=gU>< z^aRj{Vfz3HWcSBE5W*LN7+-!gU7l}gSby?6V4}|$eaj^aIzZXZqE)qmC&;{G2s z5q`|g@vmLqs#Ll|^*L~6ckwU0YP6UH9|E1zgr#0=GQ@~Q;#tMBD_Ed3NH@Lwb<^O* z-i@wLzxT@uH3b~_M=DSZf1=a9a0%uSkl#w3`+6|fRO_Y^FHdc($7FurGqm|?;UlxC zkq;;hOSAp5x+B;gdGGp7Za>G8$Vvay&u~)IWs{H_+@9QUB95;{?Rih9(qr&Ty&zft zJc*zeRauiW9qrg-jjd6|%?BnJoKNjd-3l#*_KK)9ZsWg4+ahsjzDXQoM{aWE=Z+9_ zuo#x7^DPH*Q+;n+eXnb`hyulg4L^0?2vpX;#_1B@%s=#?e1?&zP+_Kc>u0x8P6^-)>g{HS?=*^ggGBY(f+zOk2eY2(X-gfuOC|1msOr=Lu(y0rx8 z4MyJVFHmq$N7m;a{tgrv+0c8v<%)I3GW2aUgY`t6nw4DXPZFIV4bi5V!mY!#U%5q| z4%V!B=jxjlW3=Rx#1SUSr^D~8L&{cX`!xD>66O}`!%h#^zPjn0XOmV8eoJ9tiYQrP zDojbZ2+Y8=8x^>JDCtnh_sJ@}>Z}&`MkSH4#`7_9w>N?e!LBUn=lGa+mkRs@%!sP5 zo(zw*RMTQJ<7KkgEZtMmaLlX!MiMjD(dp;o>YQFSA-i|mJVKk2zxj@&A!iD4>NH(! zm3vCD8c&z!g7W(hBoEDQSkV&%E`10?F_V>F@Tl|X&7QYGzAIrgLP}WgEWp(m;B#*G z+#|bog(npKK=PpNkG)LyW*d| zyP}7x!$?Wv60*k`cY{fBFE-MvAC2!I((5FlfUFxgtR{mv@^!jFWW6r>3$b0KrI#d@ z*DzR?*az}&g`?idn<}LxSaV5=%y_{O8y=aFIQaZ6-8B5=kbFBBm(TqCt@&AP^58sU4WCyqsocS?PnxaAxEk@ zWHzO9t0~uL>PJ2i4j4<$r{sEdwX&n^qnH#ay;Jveu!I1!K6R&oVr&mbVr=qZL4!r1 zDKmCdSsVjE>e>DUVVuAmr9Qf}w`2Ks1!vEC}{PWoU zPjZa^t0DM*ryC5Tf#V_N?dm(j|VbBGZej~)z#J$t39O{Jh z!C#1-YDoe`f;&=(b$-2)UHVW;*8WgQ*0KNcaC=*-jyEQ8t$OXU(OOm2uXfhzE)o*b z=MWoqWcZf`gh~I}AY~)||IbZ2JN);b8zE2sC%2LGK*a_$=9{)3gH#1AZ9b$4m>af5 zK*X;|=NPoK+BR*w`RIv#B4(?{KkybIM5*k95O74Q&i_rZ5>TnH268*`K zDV$1VgOhsxh0>`Nu9ny?FK{)Wgu|K|Ja53YzX3X&?;vKs`rWLT}_*2$e+x) z9nOM3PsZ!O0PK>n>T5!#NJl<5Nq8{aO&|a_H#38lrUxL~u?sQWpb|!iC-6L~#_#6x zeEssp*UwJ^d(M7b3!LdvCq!Fb=qU<$Rj0N5-1nK8_GdAWI(iA=hEnKw#mKkn89U7L zfX(UZ;Sijg2WzA25G|cTECeye?TP8DaQj!&K4{esT_W_@FFTw1Iy)z!!(8nFJiMIW zaWk)MF{loc+XZ+;MCU+cgGwrX8)UiMF3yhet|F8im)a1SB|HMYg9-ibHqOw0b~yY5 z=q(_OV+$`PARwS0^19H0SC-`qAV{7!LEf1q*^A%M0s;y>SKy(n`D@H~}bD(}Vbfcd-%~b@q9i7Zo zCkTziuAr;nYXh63hw zX&NzHL$NP$+?`fY(Zjj2ToA=T2#V0ta|%bHC^!anMF^=BH8c<^EJKqG4ScuyfWniT zn|rxm;$c{ZRkuHK1QGu+DBe8rNVK}s=1kc$WDZSfe`154+?zdV3FejFq;a6NEZ`Be z1Dxn*w}M-T6SM@Ch!4=SFTm$+$h$hBSML29uJtf?&ZaQb= z;84EDdXt#@k?WDo2@4(F8mOJ62)OaAeg$|`n+`1lLss))Cv{rG&-XzH)t_4hAR=WC ztqbZF3AzHA9;6Wp@FVvz<9;w z>HKA0*Ap2!7#JBIYlDnZgRl3{Q*!#3@F%W9(3>xGZi?b%UlrKWTG^~ zCYev=Rxm6K!z+-089!@LdI+A8b$)OKb<x=e+f}aKOf4WyDsTIc%LNbY5nvtPtq#Y4=p2wu`VEM zrik;%sOKI_WF}g!ny&z2rQH+8xbQs~G@u)ahXobOjbtHdh%r4}zJQ%_H>;+_I1oj` zsTPRdW4yJ@Gy<2(qBHN)on$7w5li-a(Nlb;Lk$Z{f-Lpe$zCikBmHKRNQ?UEYy^x3q^m5-m8(M*d#pB-i$22UivoXABju2 z&}wJlUP58yHj1POox1^P%Pd~>TM^}3L}pB^Hg7l zSnR9iPS+J|KA~Qj_s zypWT-&%blJ)l}cm%djm8*)ZrlFC~2lqielJTAN&}v!g?;(e*Lb7?=twH(ZuC5+X4R z3t*@~XJwMDpHCE)%Cxucv5`y){O?goAl-U)<<~p{7c=$YjE|XjA%@)>WU#jx9@kRpiU6M`1tM|1}F1VOCYs z)^EH_dyO^7&aU%eoGUm&hyqN+)&=+|LqA<-?Z+dKj#4IFTd}x`zzcdS&w~D}8C`j9 z+=qYw496$PmxE>rLP}Vc^E`MY^gEImR(JsWXj(x;Y^<1`5P9fMA{rLqjQi;(XsLjE z#SM}(i^KMTd^8<6w@f%VH~`;j1s16&KL02fRN(rZA4ui+Bx;czJm_D=+UUz)i*0w!7#{ z25e+AH({Q>0MATb{x>AwJ+_x&5bCBPDfBIb9_kP%~Q*d^ur4#o+r4CeRJg<}I zpMpb`kAlb_3;GQqy%D|A1qK`>hJ^KRV@(1=3v8(bDED-gRGJRI)s(k;X8mb@460aB zl7>xq&RlLrMB>{FD8ok; z%Cxd8`&`GJ&waT7&RHgRz>KRI^6GDpy3_(8+pcxm@TrfMM4ge_PXZ0BC(8|oBu3rI zJF`k?i^N2C7>dM(D~x4__{3@zMAkrrZU-cjhVC)CWeIPJ9{vRRQyOOGyDC-WlQ=mp ziZ>)*N?KYLOO}bgylNmfI=76hD?I?X)Uhp#Y z?~>AmWChVl4fcap_}S2N=75SvtZZznRFTua!5>gu9B5P3apMTM!;_DtK+(n3frKQ) ze?`oU$9j&B9aZ=0Fed~g;BzA(P4L_lJGcQKRO5}VLPI-47(!5xV4$G^#m$tG>;$Me zCPze+foXuJCvdzJ<)nZPF;81OKd}}0ka%D$`blPXiIe+6EhpLYiNbdxDW5{ z-EI}6p02JI%uh&2-<~1lx=Vs?q1uHYnVLM1GF3#Q2k1F)uUl4N!hs*F*jxEQ?Izrh zLUdeQZdTSviO&4`q$jPkfzM`MwDtBYDpL-lw6|wYGw` zZQ!uUpZx~y%gv!|%bkE!cNLF{vsD{+2r))+2S^2*sOX|v3wqkGH2KOXhpVCM;< zLV;oFN&cXv6;7XWpHU%!{3rKZ0W$oQ;fZwdn^UjI{o3QbrcXH*SUF2`hfv@!|}7B$gzUo1N0yi7fx`G z8t&PA`Qi2t3Qt=Ur0fNZIoGR?WZ+s|o0Gy2yG6fccG|`L%#G|hw2f*lfbwUL#&5mi zNQ+mIBwI-ujxltTk$$3CTbcdr|F>^Gg-@GE@Cy@^Nj7-ua)kfb!0p1ve{TLvzkhE2 zN9lv)YYrlqreLOge=&@ktV9ES;4QY0K3cw<`shc|Y5 z=F<}PI=SzCfDlrM<=;S9__<#ZL_(V6KJuxB>izK(gw3sk6Mo37+*ucc=iasH? z90Q)R(wYD!Qhm>TQB2}{!=JtMvi^FZx_ieBMkcL%1XGQhk&gy(S+Iy{-oXo|hTc3w@OQ+P_lRTmM zgbN7?r!?NE*&7wIH*_>KCLqQJ%B#@4A)~UHCM#AT<~#k7WDVfi&2Mj8 z|D5t!Hnd;3DS<&N4y9+>bO{NG&c41_tz8Hu0XU5SRDkI1r(bpJq^{e|fG6RuStz}L zB-K?Z(}Kc6h_EM1bOe86xXpdEOxh?1HVy(<0u&&t>eG%03djV2SaWH4WdSs^ymny8 zUE~1+IQYmzMp08!Q&BN0KAwg&qaV83NoK2qvK!bdI(mA@39%V;ghTu*t^PtqWh|Oj zk$AvHO$f&XrD6d&x?S+)%M~89r;I~nsL;a#k%tjDoOuO;#mqD`P7sSi6~5k}^VX!{ z-|Mt-peb}!u$Zz@yF@GXncTkr<#!rCs5$ui`-h{k0O@E5NBo9Lo#U1a%Bwbf)$j=h z0A&DVobqvbHzb1=DJSYSOFi%FMicbBMfW#7!@hGP_f+ru?BTIkd6Q)h9cAo`YUSq6lj+xYq_1Wpe_XY8BEwL-UDSx2 zjoi0tt(K3fcKgY+9O1X*3#tzz?m(H?hs! zrwQ@n!*pL>Cz5I#wTjL~8JeG%&mC0th}|LCl?js$8TRiP-jbOs%`I(^JYu0`a@h$# z5GL@h6`O9Dz5fa&M^1^*-3XVVpGodYUGqk)%01Xy3-+#R9M!7-KHuzJau1Z;J0VnP@1Us=ZRf)XH8kzSF$3fx?ka)MK?;YTr(PUbo(_(3qo+ zP4)UY$)cZIh~i;Nwu+0(=ApLipzWgMXKfbu!H;8RYBqm%H@kyILgRjocvi84U0Lc~ zFK|lV4&+z+|iFsm)yZklLlbyD_h`EK>40s~Em66V}O7`|vUUUt}$UL!6$^PTvaRTEFKET!0Cuw1yk+~4+I zw^VQ3o-MfKy6xvuI0-@wtay784C6R6Z|?!;H02+fyQ&d@QbCjL|VAEe+Cwm}G=)W3>FXQzgZ3 ziupQwbX;<*jy?+2HQns&uf$HcDuH(;rai1gm70oGgcz?Owxr0%B6{hZTio&I=SXsP zy@c1V)Pvc+#nLtm(PN;U$7E6$bQ0-S_Eb0aC0({5OZ()PUuYY?4Nc+Edet9!S%uy|Ik#yLk$vHu91 zv|RQ~!n>>GEY{!sTiZ~~Xr0c71nYNF+RsnB+k+MQlB2EGn?|^lt0bxf`K$CLl3RGB zq&eCbXA7zv!666BHQVmVnWhc8{W#a>s&Tvb>|bRsqtCFSCe&KBuMFMnuu2e@O*N{O zBIG%`b;a~+u0u{_cK^E(B60p7+kTbk_1Q^hmn(wr zZh*Glq2&xKQM*`7YTlT9BUSfEgw-um%KVI+0bza`>V%9yOF_B!-vcFx#1k0hUS4bq zW?I^{H5}lT#Fn(O5~S5rF1Qi85m>4#B)#_kp1K=}9T=;;YW?1a;>ir2WvO_k-Yu!w zuLSe;qYnf2IbxWfqn7ezj}Q*Najg_=Ji4I3-{mCHy<`+qRr=~{Bu(&au!61Jh=w3Q zXK_$VpxdcAo?Pj$(O!d!KuEz=OM3b8v4RdxuR^1autIf@AVbr}i2jy)_xE#?!0@Y! zN=+4di%z|F^4Q(SRYLrdo~NirEt`;xjrbUqVU>w_KG!imIN>&4S9DX#xs?~k%+1Zz zUm8{bg-ZoEOb5yY)Zny9f?jB(&%17_jBidu_Xp;mdO~?<8meWaQefF++xRXW7_NPs+S7O?}7LJI%ds|o6 zJ8%6-lVA9YUWr&_OMCZSw(z=BqVbEKHHvPuvedxUr4>$3HB$fWUM-TbhDYs;M{WX539W;Ljfut>6GX{#KF z_POTHrwW_1N}G4i8?S$>cKvWZ`D}q9)*7{Y&perKnay1~rbcc#099YkD$&qvQ@y>q zIUD6leNS*y%-iMIUH29vRI;!Arwg_$$hJ1G`93^K#Z%eBZs=Z_N((s>V(^K0+F(tw ze99ryWSi04m874*;}Yvuo$~Rw8T(pw^5JdH=T7r$>JHU|oa{r~4N)zcfA%~TT7x~m zi!2g-EV!3zDnUt7sKfSxYHPedgZ;-U&K9+W@L^++Y@Rf!vS7D&bNfOH-VarQ@e7Mk zY`ndi@O1;~SCP-^swsBN6B^P+3FIYZeCv~gzG=#B;fDnh#$UsgX-&r!Po zOYl~rk=iYXVyxO#{zvu!a|a&@;<3BjIn~N6(B@j)t=G9+E7@8ay4*`B+wnI=**YL} z4E6r$wtF+X*OYkpAg)Trq0d)cOgIcvYmU>Rc>mMO!fb~5@}%44^Bio4!@fgD*ij)3 zBgLIlPEyC;&N*XEQz^DC(zn`KLR&_S&E{v^f7+~e-U(R?d1g+4Pe2;p(i`D?x4QEg z-8%O@vLa^<0qX>=xr&jk#LiPw5mS^^V!!ltOUHis2HPmE4gNzWGtHhQa<2rFCkD$K zZs&sNZAxQ%$!_{CSw=U_jLWeNgq^U*G#S&XdocOC%}*)O-y0{~#u0@(Ay#L^? zgJVH1NA*`EDS2lG1?Cmo#b-u$EFb^m5#*&Leu;;*xux4ip&yC72X$tDk}f#)_sRV;?;KkPX}*Ga#_dSt+(5i)AF-T+Sh4$1j=-X z+Sy+S8KgRX?tQZ;T&Ui7ZSd@^^(VpP+(p@&CgwKJ{;hZOoonyq`^DFspT4&J=-}J(1cVTEksUTn-0wU41coSRJ1vlm4CWt+=O zRyszZyG35=uL|U7=Q(7qE#;}A4gE>3#OiOaZ_!9^YgrHH==x2~)K&)FRywfEtPs0S z7BOb$(kD=IjlE9m^;k06(k98S`)+I3E6WX{UX4fgtL)he3mRnJF0@#gpc1=VA}q`V1o{FOd}97#mA7*B>?!_<5T8Skv^VcGDrv8$a>Y zO5Q}%yi2V`Yy}bt*F~{ke$UXMY2GuPtzjEUt*I&AkKfG6`uu-rHP0RPbV{~PTUJ{S zaYnE74QgpPS?6{V9r$ZZQnx*oB^?rwI}dqcsMo~lK92Ei<;vs~FXv`em|W6me!lA~ z!ms3#`k~WS!&#R8{V9vHX%a6+sM(XgU6~x=jD$LL!#V4kmRxAh;I;JNX2$57>G ze=;BME7$u;Rs*^%KITChMmGAaY($9TG>_gbT8!n<|3y6hC@sy{I1wA~_11*9K`tm3|rX)Gq`A;nHpl8X8nvrLFLt z#}&!NoF06yPuRAaqs={rmnK&`qCTVB*%bIVqDV&BzL-I`8%auPF#hJ5ej`V-)zzV2 z#xeD(01m_O)y2vhY`j&zX}j$=Z5ae|c38Uv{JcKSw~mBLrQF+1G08CKEl>*4qZ3

+f^=v!kLpiCXY5lYkrzT?j{94n~A$q@u@gim2}1hKTEIG>(M5jh&(V@3fDc!k9T{y=7U2*NLURzpdtYko5G$_+?JJ{9XqyO zo*JT1xBcf5PHOQHU%azp8%tk!u&q?xD{;PMs`%P!P)_GKaf-Thu%VS9syeBqllAej zke(tQ1Xzwb_?MFZG5b>9O_MlTXKxOjvH&IjQZ=9+nmMSQfLe>L~lJhmAiP6)YL5P zv)HaoxzvaD&QaE?o92?;N+&|)Io}couSp$jgymf0J>;LYs@@a#nwomSQv*yJXcj=e zfWRd6rwQuZ83X3Jk%56fi?pO&|CH@0fs z^=1#^c%nu|xgR)R%r*q=_&oJv%V`_BZs?P~eK_4mk?0s~Xl6!M9Ma#(x{qbfkQr4@ zTVwPZC7m4*FQ5-FbU!CA?-}9uvt!Gss3Z<^s*W3jA1yU*Wz9nYFY-B4g!Y|Ha{rs5 z^BN!O1y6T^8(v_uTx`x(88a)(vznd}ZC{OM*v@g(`!fTTbvsTtEsDl!=gW_F<76u6`qk^$(WUsRLbo1p8+H>cp z+|zxd4A=T-j!04_LWV0j+Ro{vm6ViV&~RDJICV2tV~GFUh0Y0vaX>~ohx8t=``Hod zT}>fDL=7KkjCZwO%YQbv7-;@&-<@q#%o;xy_CeA0eb+j(i~Y26o_#%Dqe1T5GI_d8 z%Jb$I)s7mt(LzUUA#X50O}#I2t&ySmTZ#0X;ftum6H8)>Rttn6b! zsGIgFiH9MIj_S>g`)s86-IUm3_ln%qQG=H0*O_N@*KGBQ&1S7)4%9D}n<2c?UYGlp z`FoWY9Gh3M^-`M*uHrF+qDBcPBZ>0T1R=vc9Bm2Z#!!s`JlRheuu$az=F{%Z4kQ8T zvs!j`cU7U*p9Vz}0n4dMC`Nn0U{aCTJo9nMI`}Vi%?6W4Xc{DCDwNGi^B=&N@?y#L;d&jHF6JSTPBXW zlIYLwF_(!sbY}$`emHmEdCTv&tlZdjXqIqw(gtGKEbpZ;!(&5{^M@W>ov$V2sS(em?5DBbp%1`t@h_zUDO18EPv4dmT8tLb-8KK-C+H(_a0wBub7OXfRDKG+Q=lGU`wWw5_1$+@_IF~w zlLymo{W@Z#dmy#U+8*ptJl*u-4gOP|`AD(qfUO?|uDpgnTYpY=?ob-wuL-=9Yjm-g zrQs~tds0=xBJZf#F>%!R>qWv6Av~1p#QQlK?pEsY>u*0wpVdhQ$8N>`4Efx-##Y{~ z=Bt=}bI-Bf$c^gyTUFs5zq%fO*W*`Z?7ET1YK=y9_S@_!$y?L(ig@W?dD5}2emP#Du*kK~IDW1kxYdW9z#w9X&kDj?5E2Yio zgr(pI7rdLF>Ya#Ov(5N@YMyAQ&}}iJvGiTV!;~2lPoY`&w`U8xL%4I2`@y=tLdyS?4`YDOTYl;!n z%s1ahGnsan}B!83`US{o?y3p!a*0e z`m^CL$m{HlpRgh~aieX!85nr?C+g?X8eHjIf5!A`qLH$f-^=YRMB_GKG+t*2CAl7s zOx6B0SI6;piMZ@X6Q!-8FDDeS?j#dC64%7+W$`WC+^huj*%!OR6mf6ZKQwW=SiCb? zsT#|NM%_(3Smmsyb}y{m5vgR>ZB$mA4qV~a^|RLQF?VgcEu!#LUB8Fb&r^nWo724i z{nLFQ-bT1`en(mjeaK5vza>drn0Rb;lL(E)n#tk^vp!xA2}hUsVMH3t2QI3@bAds}oX{6QsG*N6zeua5=<1mmR5(HooP zI}(xa$%nl$@FthW%%ev>kL@CIri=3XBG{~#@Pf@(A(*`}0$Iz5FBtiuYWE?}t1sVt z+(=@XM?C(Dt!wxK+{Ciw3B&4a3;0Zw^5fMSA19qY7B;;%9))B5SnINV%!grXyCQsP z(=G8WsfN;+@R;R9H}&{wC$eQ*32l#_9qn9E^ntV3mRfL)VM&3rWvjE}<#F9Zzq_~R zdzIf#OE&9nz3^z-w=?C4W~&NzB+Azo0#4(Bs51S0LkG**ysw zqKrQ&C!vE@s4Br<3y>X@2}y#S^Y)zk*8`g>dPJkdidydFUi_*opT?jn)FgcJV<~XC z`%Yi?P3+w|qxM>^Y~@e-lS(c;4;W{*b{0p_8$L!(?}oM&?8z)Fylg4*uoa>1j(?!i zx-P{?I!h(@{8b%ZlwUNx_`vM%`n-D8MT5IUri($N;h`f8vH7HX{bWqcI!1ijjKdFN zOB%$>+cPLsIjl`)c4CApx=JZ_%c3P7>2y2P+#_Wt%)b|=eB}WoA~%AZpLxg|QW|bp z>wTg7^s>BpYJF#RsJkO!e|_nsMfF&3p|L@KQs1F?xx&CYNLK0EDv! znfe@j`^-!-cNA=WMi_?+ZOtTO14BxtS=~_2y_a8Gj;f_C#~U555hzXaD|~Pz#_2v( zeub~vy5()U)}CLb_rfiGK$);9YIo$WJJ-a#nz!UW$*R^12kX~mjMz-4>l^wX#>ag^ ztY3T}eVLa>(sWVuE9XcHY0!7sca^y-STTW>HC_!nefejpRB>!c)kXW^5sTIFi+3ck zFGCEBc5i=jBo!!F6sG9j$#Hi}$5Br7WGLyaYASQZjGZOYNsTEx0IRJMGcUrDIDnFEkI22BT9)SvK;p&A->jqBT{G zIy!#D^U~7hRXY!PxVKP;UDnt#YB*uhd~9=XuLge9E-Z+C8S7`NCE%bfcSmMctS-PO=Ym1QL;E0z zFLG)~fNa~b!k%)>(lViCM7w0)@wmQL;Qi-(s9oP~gXu z&n-L790r;3Ce!!3IW(`Wu~mssJDyJLb}j4QWp3{r*r@M3UfW$`PPo2YvGvGO9CD&Y zol~Xq79={DW3<*E>I@Zp1b6$%Cd}Vgx=!-pPD=ge`bdiR-nl(Bd#G>2*;IN`usvn$ z%W^*pg(t0;(L9HcW27_$w@L!_jtqU|G6x4JIpd6&`^BwCxy;9Xk4tP^`WlI*IFHGj zk_}C^HELMR7xsIl*Pd~GG~d~Bdzu*gZ2Lvyc(w6`nqk(-3>`(lerBQB-Uijm`a{K7 zx97zc39Jd@DJw6XwL46nYcsx*3R9XiXQ`97dcA4CD@3B9acpKxICe3_w!eQ#j7P-H z(DQWOU*PrS=?cT7pt?h-VJ^q`ad(>jI8vNTa8IMTXU`kud0dr;`01(daNVvR?C_tu zr|t&dS{E-XGJZHwXCY6J{S(cmR%f}9;>6&`Sy5Y4n|-INWp|!+#cji5?SrTIDg+Tl z7jLp!2CVGL`<895>^mdz5LsPt(QB99ts=UrkSe-${%5DI?O@Wc5_>hoWClMTE! zv8$6ro4QC}37V>>)0aK$)1SCL4R&Q%Zny2S{t_Q&G+7q+5DRBba&f52+;ga239hn@ ze=p`;#4$$jvf{hw$Kv921zOj)CgN5eZeA%$vVRev&`Cwc$7vW5TQYN(qx6k;r#9<; zU0{G}_ecujioAP{s%V-eSHoobkL3wZ-9J`$6tCU$frp6q&tm^C5k*)HfF{~|AG@BQj44;I3RVRz$|D)`z1G4JYHcyubNGjbR-Q6iA zT>{cwN_R`Aba!`4w{&+Sjg)lbEZ=ix=A3WdZ|2M&BJ5{BJJ#BJ#l5cUcef{?a*v}L zPz&bkuigpFZIt3*y~4o=IbMP)g<%lj<;cjCDCKjj`7pprgb%EvNZ=Iqrj-W4H+Z1!sG1$5f+r>=0``Sk=M1!8$-l0qbc4 z;|8Y*&9Uz`myWix9L=zAM7^5KUWzE)es_`!x6(g!z6g(>lkhh0Jb#hiP9l}F!u{Je7~L3YKR?2h%?P+)y}r)k4u}h+NJITb_G{I4r-rOS zMhP;Oj7n}FudHo}gn*5d6#~X%-sjUYyYN-=Qs3)MpzOj^FJMD(%)jez@V9vlv`U}0 z%6}80fDOA7iVHxm^lJ-*P8HNs7K#x5`ZHHN*Dbq(tW;yxd$Xs2We*;o-LLwqvH8pG;oWd(-{?Y&`?1ZSWVm{?9=XfTH2!q@_nRu9a zGBWoRPj|`B5q$dG`iTbC>N^YsA90xD%FTq{hn@rZ^?+S+&8P3WMvq~Tbh;)q-BVga z_3QZ^8i!8n7lGrmOqm2L9NAuV^PYpqxIR{0Y=oLI_J`tg<+<&$KH;jll`m0WU|<_5 zyQV8!;bZX{Rm+m?8j%f~n&X?_Ay!XftUp}8Yr5$h=$jN>^)Y^)D|OaYRXMTeKN5=A z10#*ZM%6Rpts0~)_r_-OYJn#M{l((`wWox2XDfU>)$S~#ZhCbFD^nwR`Hf)}jfU(N zuu9p^ffH>5Ro*Jxox{S=_hBqN%(Gm&LrsIp`gcsItH2yJi(e5;eZ5UWeSZ9UO50}$ z)PUK_c$6ZC%U_OBMr#s!{TNqgDOi3%z#`Z4AmjeH^2 zT2x*wl3aKR#{tIktTs;vS8#*a74kgZkXuiZkzuI<)Fhb>U?2`NY^0LH6csKm8CXkK zCBZ@#C+{Cq`GqT9Ao^0PmJ?+Ia(FJ2=EiJob?^9_;nGv6!va57BXN^O(%TdL!kS;@ zH65cZ586x8`~q0O{>i+QFOlBDx4@7gUE7j%Jii{y#^Kc6t~TeRTiW{E*6+sL+H*+nn$JP#Z}d`k6?V zAmQz!c+CjtD8NcJ-8$}M!&Q%i%xdmC(?+XK_hy`G)@HHqW zd9c6N z$1X@R0ULm5DT&Q|3WQ&!4B=4llM)m6u7-d}7AVlxKJ~mb(*%3s#+iVORR;$Lz(53W z81%4gz&5kExcIRW2+ZI?oF*e7Aus_*LsuMW)8foX8~IM z0@-9gC!js1j!3JjvTu3WylQh01tT>H=uT213~iT6S9U-H&C0?OFpfD5++-VsKw4Ww zD<>i%A|@8V77Uz6Ujw!iFZE9#S3XliWy7&Z!{g(+)du1&E-ru>(tDW7W{wUBLHwYbfsoGq zBliA>CJY!agzjTvW2XUAiRZoGy<7Dk74JkATkk)mUME+ZgM<^`z(#G2n?J(s|047K ze>^Uo41Zp`xtZn;0gVqTii>$(BkaWyKyUkL9+D0Nf?BTgZzQGAJmg#7p*1KW3SONY zjqw2?S~V-i7vp$`fXIJrSHR5$@8h7UL#DUFZA|2}=88MSFi^=F23MjcNP9|{Cl+iu zVBZjSvOqGy_X`xhEh(Du#MbCK+qRN4E$o)AZo$sn-d-1R9Wqa9pNL~!IH!3SV zHaWn6wOJR-u9{z7A8cX@&#Gj_mgnlgF83{LP0%hFsgl3Ca#dXg=^MwuxhZq3Ek97k zNqEjgr{9HJ)V2k6st;R!<UKZ^3 z;y=={?$;KP9a}1CIIMcey4!$-UGDjF{j@GS{w9=yU9p}ty6FI`0O)wiZ~A)Fh9W4C zHtbbLdKT+V2f~@+)*Vfz1@z5?Wm33m5(6Z`uF&tfVfLD4ec9h@n4rNclkC2BGiJSC zmw+R>)SS5vGao^Oj)6e5`EwMyX(#`;HLoI-a54CB$c55UM5|gpce9l9C4CUYd)0gQ zbUmDLcCB4Sk>hWV(7^FtH{l@ASQ<_lN2#S`F<7s>!L%bOuyGIlQVJKsrk--xp^Igl zNH%7vUXP<2$U1nDdlP~?Q@(3zd<4xnoHFsKMAC2P9%~EP$8I4$b(lG}v8gT9=JCJ{ zz0jG8{NOrU@7?Vt1w|0a<_3|ab4-H9N&7x9Z?d%!boh2@6ee*ckyjrc+G|mA%`qlX zt=K%?%>p#59Qs)it+{1sZGUuzx6v+Omcz`i#0p>U-?u!^6}x!|^w7gFU9f8b_;%uL zaBRIGl5AalN8q?Cu7x7KM>=WBBhvrb`#6kgwe#?8i>)OKPU7*1=p7HCp7SousXP)h1|*St)-7X>%wkO}L=tXN^M50*7G za8RTTYw=;{IU|Y%W&dawAIF`Ezi#GGp_&s#pG)S|r)AWRTc-F)AoGMhyzpaDO4a-8 zOaAzMu21?$LpoDrUROisQZ{!n zHRRr*E?SbWd|Cr5^MujQ#I5PXo|e9$$VXZ)-hJUktt6{IJVMHtYm_b1K*+CF4j)gg zM2Wj~(+&Ek{_r>Lj3d>xWzT_}RbDqi2sf?EdF@~O{vh01rp9Y|N;J5tg;c~P(TrK! zGGJ>bgSH{WOh}*doI^?o!FmCvl`&3MZ&OVTdyvz_x5zej#ScO(R!z$xoJ4ACjF(RD zs@AQ_`VK2I{Hk1N7EeHcrIX&8f@C*$3%k-a_eG9lW^J4eG|Uj*Jv z=@y7FyE*RD;jYgWBR<$Hq+sIYK9q?goHTr`lEpeoTzR6_%7qBc zir$FnPLk??fNQyTjc1KKIB-gWc}J4OKI+H$H+3@JSz}eve3joW)G9xi!H*9^Mnoma z_ras9{faZrEUWdSYFb-HjVl`;E&Q#z^64nRM0mLOWb9X~NX6N!i{d1T(^+N*!x&d= z4$oM+{RH!2%`vqT)D#J8-gfET@b7!L7mIH9vFx72VI$>@r>RE5jj~54$Yl$+t^AVj zcX-KmYg15-Vw$dYi_(?pFU^v|-qp`Zx{%{e4?ch=s1V@GmAkZ>n~kgR)3IVl|6Y-Fji z#n&P|O%rOGmvbZyRu8Yw@HOx85+3TwcKJrtaG=Tl9OJk~NM+zH*a5}np=dbCW;~|4 z_b_%Bd$HG;T;kGIsnJGe)NKaJ`Ueuv@wQu_5X{Yv`EZLxsozVLlH12Q~m300t*uiPCl(1CodcZlwx#}?O z4eZ>d70p9RD2d$q1#+hQ=Qc#xZ>EpAS*|(BTwi0XU{?6EpLQSfj{7MhUl#wlf#Kn9 zS!v)9NV~keoXnM+HbpW6HY*GyT`>5{o1gf6#(FRcEO~;r8_+UuBfwETP514ri6s7c z)YYBTje<`EWlh*NH?G)6`o1XjTh_@=u9^$Kn@#_ZLD-JEg{37e4Gk{)`8h>tNy!jJ z(w(Xt0;_A~@Myh9#c@yjs!#il%OZ}^w7S6QG5R-#`eAnh-Ih~|?6-6i%|*C>F8Cwj zvti2S=4MJtN^h?iFc2`%(W%_UCw_E00PF|nHP^y(OmPul)~jyk*PN)`(h-=yo+LNq z;gghO$c{XBZF#E=Exk6`x_a|<0~h;OgKVPQM{JYyS7_KyCofw5jOtj{z^W}s9$Bf| z(GEzEL$&|r21wJFr@S;>+p)JMDrYGmlg}ycFb9gG)NaSB-EtU|g#rJ=6^@DobFrMV z{Qt5%{7$pY&C$*69)Mb%w<0(}itr_Wvf~hE@7+Ha$xM|xQrU4`k#ZtFT|`M`-;a-ygEqOLIWcN{2vifQK$s&o2!|}gxCw72T~PR zdpsJcSuhI&&@e*gfiLmYl$2ONk`*w@2lR~X?d>|VNx#VHs63u-cCb>&0}^2N5C)L_ z0fL_I42$+>xZIew1i>;qF!B%9|G7GhxXvL?99rH5QS;y+z5x{JFWX^^?Lw9*(Z}^I zduGm!F_urRw3=oDG@Vc?PD;3XG0)*x2k9^8yLez~MKyeor2V_P&9`9fFgq>a%)=Zb zv)LesB_WTHI6|sWewaa_p(X!lMvmIgu@O|L5#Y>x=4=l{`o!m?+uA9W5S8@(!?jWW zQS4Qt27GqNDh}hPuREgVdh#3tib=n;aZr=fg1{*H7b{`^h?&onhPcU*rF^SB=5E- z_IQZdo3JIZ&O=KZhD@x1Prq?7LX93YRX|gAlWsUwMVWPn!`bh;37MCnqjBlEqw;>2 zb;?8t^I1L5&{J-B2pF>|IvqAWq^EZbjf`W2FSu{^ANl4zSxZy+o;i#R!daR24=%OHb*2*6*+ z{9i7_za}dGdwTN!n$rF?oBc(JE(c6f4D9tbbX{QH4*~Jf<5AStL95uvigrgVnjgCJ z=kxPF6`0=lM|}V8dHZ$+X8Y&R5YJu^Jg}a;$u7i+gz@IiD2Y5VNuuMJci735( z9hsiCRHm;{?>DS@uG=Vei;}bdj-GkAf z(fHI_B8)SV^p;BU56-MZLPjP?w%+RY4x%D9h%1&F(^hDR{Ld_{@D8h6u#`Sfv=0xy za?lErKK!EQY2k>_&FyDU7(%|rPoCS3kZ}@tyU6=I-(Sc=z|LLX#LUAg;EpD7WLXk0 zifsEb3E>KfPyPA@C%uJ6$D3scMUAk-2C;j?8?NAOul#zVPk2QMy7`w+5R5#ZNM;NY ze55?I9wb#S8%pmGs|OP#X21trh;iR6w)fb0!zlYn5J=y0u0A82wleJAfQvzfb3pUk zcgOE$f9Z4g1cDeoxkeHrx$qmRtAdoTFTN5S9)Uh7JG-?ODuvY=VQzw^F=YC@|l?1H#yE{9B72Kei2EOlo zI-QFVU{k)|&jnacfh8OWOM{($lB9K_9Oh9#;+>kF2Eh`!%(q#VE z?2sVvC$%zgJ_8ef`*FkaL@$H}T9_b8*W+`va>~!2Kht@g1)eUaH)DXI8E{kNoEAX@ z=HT0{A&6-J)2|&cbpg1;JI2y;Vh;vJ#{QQO#MBzUKO+?Q2PRAb3-kQU3^^rbsN}xA zzJB%*3lC`v(6F&ywhRvL!M0)|$|bYF9-|0N^nd0SoahgOJ;5-aMfu zLkcV7l9G{u9(7Hl+2Id>fYAM@8W`Ds=p=)y0Wl<``H7gGAk^u2hnG4{MuT4g5&-}B z1qf^%aF70L@B@fk{>>2wVk_~Hu_&XNf*pVW3@|@51zaE^_^Emv!DYbzXan?W`GSDz z1jc$gX38KOqSQSJ1OEHpw5@*$ko?sGO}t~eS;3r>=m`ZLYCY$G812`y<@s#Dc6TX= zy$HT*DwONy;n7+jR{+ik;N+H1_g8Hd$fHF$r{sEgExJc*Ngpbv)Jb5SkvdfP3{ zF)+3!WHx|dm;T4t`tm!T?a^vWBR~Wsr~=mcoX7Q|X?GNm_ThYVA@R(5&jolA0NbnU zc90J^X;2YSf5=II{$l%u#~Wb80fNdHAmnXYjyVqW%9Zv2-P;ocB^^q@F96^R9^d@x zjP^1|8u_PVASMMIdJM1d&`^t+qL^QcJnj*P^%4Om#DQ@sPVlLT--1Uybh??gqx`puOG z9(#M`{c_HeZSz3^fN1Ib^v&Dxd%-}wzRo~@TKX((>)Jvi=jh13XamShy=0fJ;2PB` zE}owr0QC(F66?pO#06_BAGEu2r?!?*1m z-=`IP`P(F%$qyl$Ulz$Lep;)y0gvt;y?M{Ggc73!+rlN68k3uA1wUeM;%$lAP z-3k=7YVB_^4_7|-6VQLC%c|Z2DC^_tLewiZT&^-rSG#-=@U3V$;raOp&ae4&JoUUi zGrg~^sVN271@y20-%J(W>SXR}{N%rOex31(cy%Gr>cfoy=PvT6?jS%INejy0tA( zPAP#~fY1kG*zM;-wAU8@xHGT_W-;`SaP>c%Y?H7dbyZcsy^FGOvaq08H96Coc%nS* z*<2UNA9Iid?>1Qm@T!BGBPx4z1kvX|u#DzcYNdSK@t7~mbXu+fD5emuQD^I+q(f&( z_gbf@XKDWE%b(h`ZnYHB)?NW@6abm81R>^m7Sum@ zlXb5OUsHg#=~M?Atepr&ydzx!oe^N$H39euXjMV;@Q02FCcXf1Rt4HUKzhRuWiiNF4 zyP7!BEAF zH}eoAj?C7+*Ve4clP;_@Y@bliZ++#avFE9LzvE+l z_lz0_@5aZ1^ncz8GwZ)FjQ{(4Vd3WZ*L%^4S+($I!t^=y47Fcm4*lMc;D?Y}zM;`r z-+&rTDM>X$F4nfcJih&o(TUji^znCqYZId?uh6YwebFbMX4NT!N=aHYn}s?WJ>~&5 zWY#-fhZPuoukGD1XM`U=9B9s?=Et`*owciv&%;Mu_MBYXFzFye*j;rA;Yc!?R@9@s zIxAG_1KD0ebiXY-hJWzsOP%5L_}pwuJK0d;+s9tnT7VnTWEf=OLp{Kf8L8+lB6IW- z$E?YM>0PcA%eyeC8i@Eu(@cpA{l*WEc84pP0!@;N-7J!4ypy5(8|H14Gy@WKp&=X@ zbF9a~*JAMUslhdvV&PU|h>H!(laawRLg=o3;(*}=Sk3*|YAHIyI z;#zCRd3!rK#Yp^JY5xmn_Wx4aTwMQN+UvG{OlbY@!RV*$}zNpBX@!uE+2 zmi^gd8s7fe@D^NR6D_?A9%HjeurTLJVsoq?i1rN2`j~M@&w1 zvaJgu0Rep($wYG`0lGmyZ|~0T+XR0`7E@;sRTET>jExuS#QAjw&J?B!2cK%kUzHP8 zm8#^D3`6;RLW+ITvt?RF^6bJf<<;<2E5SC|%ehW)1I}rJ5=d;}j0cBT@%{CkYfO;| z#n}E<%<1?ws}AQ7@h<1K)IX4xVm0M%k1E%k*U9qHH;Qe`NHv8@y>XRZ z4>2GeYAT>Rj58ChBiZRzcdqQ2J%D>mVk9b0Z@$v{W$!>Q^Ce3B4JhS~-yJ2vlYdvr z|Iz!&%K2~ar_Pj|rN0mw+(t`>LDXA{+hlggSLhLJ(RCD*m~N~*1tQwUhA4M8vz|eO zG}L@2M9Et-Gox#wwvk>vP z2zjfRlIMsAzGJ0C!7mxztD~<^xP0;OC?wF&=U!ish)K_38$!nEBcJn|LDENf%pq;Q zt3VUc_U+?Nlz`mR7KW?~R1l^_+mj_38d>St^XzDJH{oXWYPzxD zu0X&X^Qqox{c4)-;u)&)RnNxX)g8xw(zdd){`(s;rD*BTga)zU>@7~nE1{^2r-hb1 zJ7{#sVetTMW#=R!CsK#{bi>*-5rl}OYv;^7_(fc2t|s%{ts$nZ9;puF7hlEIm+*GJ zmW=*M=#v+N!=85&KZ)s3%AYOZiGLKkF`^JvW(MWret07}+}0ejbEnc5jYClsU8(J}&4TkF@pCbN}y_Vf2}&;uc2!Wk`g z%+Gl0P!g+lOy#X2(c%}ev1KWld=PJ+N0md(6C-~&d=KpJ!zUD{8!O)@tQYyQVi8pG ziQ)4H#Tne43#GWI6)uWuml84k^KfE)wx`4*>c{fsk+bfXcAK%EKRi8yMW}LSi&;i58K86D$e7TU{OsVI84qqoA`S*&Aeavu5!Qd$KnMSpWKDj z8*_p|VV;OQ^=Om4KxDEn8KjG*W+>KKSQp4*{8VE6WLO+CTB3|2!`bu~#QtHmXbiiE zLnI}5{WK`&BN*LF12h_V#l#teU$vDGraw=dHC{4?$ zdWXEv)edcRd?;hStRRL zfwu}?lI&!W?`}6?q+7tH6pGiaPQkJ!V%h6-IL^wuYBY0TGiK}hU1pJ z)-Eeo5U<|ARhaMj_VmMg5g9krxD=;H18v;{o*?oAKA5Yd`vQ&gw` z9o#dmM?F_u)dO-{{96kUs|dy} zm|xcKusj_!kte3qFhn<1@CVa|SG*t+O39MHsCfKZM|Hy`lJFZ;w;kucnfhL8r?XUG zdKP3k>g(oYVRgK}w3bHVlxJ_48&})R>`DCFl0g-xuT*EYO&!PJbM>n2x^CvWQ_Ea~ zISc*6&qn6y(@Ij+vH}c?juQfA!f)C{C-WH$`TX@()xodB1mO=XPfx6B%9hFaBP`w3 zV=a%8<=WNZJM6wWt}^NjT+@Y|uMFoSm@cJM=ok;EUdv9BzR5_V5B)JnR&&+yo7LC4 zKlZM8MI)mfc}MDNep6vQ73?NduQ03pIV>A|xv+vF6bx21OgaC{unZ&>lMEPmDYVC4 zWyMi9)caM`VOs)6=wpLxW3GD4{xQ3qn?qpap_P$ST zp*UG{o}8Z&xv6gN|4p^C{YNQ~SlRw9-GI*5)lkqOe*qH&Z70pp@9WrNX7zqDEm|d> zK5UT{3WmXMla0EuF(0jjeheo|y*K&(KCBFFRqUt~*98&7oJW!Nb&%#~VpKC;eZ|BX zf=o3Q?=@EQ#e*+{wsX+cr59JXj<jM z2#m`wW^m~J*d*6q=OSX=Vn(wG34dkZc&WTB!JuDUnVvd|tBsT27nbd<{@RN#IY~%l z@tR^QE6J=YG~Jkjd@M0ugZQU+^P#~~?vD=HgHI_8KO!-v#A4mW&XHXilzg_|oIAba z%~M?_y9<0oyNG-jLn0{t!FC{;B@bf?QGO8*iQ0l2-R*3`bOSFGUzEh+RWpj>1!*3{ zTQQN$SNF)MMdhyhR<3mgW}Y!kzPtD06{0rrvCLO%$o%;hpSkHd6kw=JYqePaKiq5 z8qNZlS>SS+aaWqiDZ2C2?)R2=ViomG{#Wd7Th>rqdIzO?xWdmIP}yA{OMLn!r1ej? zZJ9q21c>)tQ4yha|9o^8z#J!9kyeeM$5s98uK8O}P`61lGZMbRADedy-ximo-M*>P zHnuNYWfj337b4(2C6%R3)zETvS0TlXv9@}#n?`!*lIc&)Lt2y~Ix*pdJEw42Bvbt< z?W`Xq{lpR4M$v@YMvx`f>+T{Y1sFIs9*&zOxzt|6d^=)@lNm+7dXoy}#Og>wLmI>w z#dve*UtO)-W>ns_s@_5i6S| zL8@SpBQZTtP`#&-JZHqZ=zK6E>ul*ZGQ-Wf4t(}ENxx6il2QBfl#u&B8-Mg7Q7><# z8+!NFh&J7%jec_!+XSiBg_}YlNoWfSgJL8B!9K4@mBCep;fej#)p%OM-SAAE=IcPt z6};-z8(%R2$=1QSK@74;|MMmd2h2djY7P7ZpV99294 zSIEg|rS)m9awz9dcI6f3^QYlgN3qb>jnH_yVyRnJvM{@a`D*4HpV!Mms?)m3$)cO; z4{7ACX?K0X3Xjwo=Q=JM9aCB2Dx7T>8r~15^<>(Oub<>>&8l1k-Q)x8CH0!9B?U`@;+Nr-}n zDElr0IZ|1Mwece!G$uLv=^544)67}uRHAH3|BDNInn>4W9+XCBqR+>RQwtjx$2sfV zmnQppyN_m4a5^GoX97RomPC%RHgi_}%-7|Xln8QXbWoyrJ~@XR&5lVFEKodmo!xvy zUxn*A$TlP(!+9v0kBV%#yvxPv7R^9&_?V3RHcGw|THT)NwshM@AFj9PgU9IAmB4y~ z1Wj#0Rf9@wiv#{wvnhnZ*xaor9G&L(Lw#owCsl?1ln>DSqg0h;9`*-E;x8tUFFPB} z1x2(O(cI1YW_Senu<*W<=!+=GOBa0I2t=AAMW0fH`%*D8z;OB_GvAwEl&{5qyue}u z2~tJ~R;nuSBVm+DB35%*+~P-#v@&5O&8EgH82U7-_qSTQ*+MiAm`WKEl4f5fP7vL? zALM(=i9h{FnSRCIrT-P{=uF>WG|akkx|UYL^aaWeRJqKtXr zqA7fL5qBCH-WqQ3?0Z|u0qvoILAc$fbE#X*<9Bpta&-O>d(4gZcKfbFp)XF~((Gq7 znt+4cMuk*CLZ=+o{-no5j%*z!MGl*apR^vKv~R!O8$JZ{s*n$J*&@8JLUMZPML!e! z^DIEJb~M@Jpnsiwk&}Tg|4swHw-5dxIT}H;N)wi~PLLS?$I{*Ajmnxf0@ntot^d~{ zYxOs+rR8|Vrr(rsN*7huR!_66{ae1n%~am6BcLkvqh8;4)xQUMgN@NiL=oNS*A%hgjkv}^2XMC z@a8UY-#o8NQK2E%DG;EP3F zdP_t)cD^Bs8@co%;@Lx=qA*`n27B&uoZ(=HI8?e!8o&sb+qyj^H)e_9ABBj)Zsvc? zl4?ah!yu+c_Zg8~6UHWEj1g4SRe4+&T~;cThNB_n z^BAS6Tz_{Qtz12HX~iL*nJ)hJ4Hgz{A^NroY3iPEZ4nloC_y%BdYCkhO->o~yHBr$Ckt~vpdx6!TlmJFW-^Z;3*O>zC$q(p%aNRBD|1%Y}>peZc!w0 zL$DU^z#&J33pnc@zwIEmf88+(bJHQFZ`6WDScGuj%~oVEB4KTlTHSbO)Rr4rR9p=W zaRjTTndT(Fq@R;hGo(gR%TpG)bs~vIMowvZa)CFVokQ?d**&9nY^k+#J*|W1w+pEb z(^y|mk1&(og=`h6T)zckQl!)#32fp+$@@)(%PR-v@=?Y2(y$0c5ENJe0tbMI%Wx%Z zfKtzyBz4dpS(73SVU(Zs_gzo^27PZ;?|`w+LUzeV{RZvb1>5s5z6*H4Zj zkASE+f<_0I5X1c{`%4}7&k}qWAbag2yf9A}*UI_eEeL~@ZMI8AO+mp2D=Y7{horNA z_2zbsQ{<%6>QnTK+5=KZeVPRnkd*LhzZV;j>I@xLMm_>cj+Q`~qN^zR2zKMK_PZMW4fX<*p zXI^*;tiiOafR>?$s)q4jbe9lfT;oNu;?INm_KjqIl@GH9H6YC+TgJb<*y@O?X<37+ zXpGG6ipYqr?@gIKrh~WiSiQl|p>Fnoz_WT@UB4H%Uow4158j?*d0at-YWtEg63YAI z986EKjPo_Xyz!*Hkckb8x{Hr{D}*veb<4wRyMBCf9^39$O6+KFB>`9ctG|`#6sOH# zwTm{ZAh+etBdRHazS_4$dedt;LZ0&M^m|VCT%nbEZ;S_xE&2gBW^5TX;r3&oLa=Q2 zr4-5h&jX(3Ipg22F5bQ%u^!{ZV!g}{KTGW)b8eRUmhP_WFz#C3{4x<@`Y4jm zVc{j-iU`9S0pyeh0mYV(1F{%XrC*+kBZ0_YBN*RrywZI46!}bTaJT{e^!nM#!Kz#Q zT7JXHU)ZXC%)}iZ>^ygi3Met4dhK?jcr%%bSB2lhl_9kQI9NEi zSCsG&uO6XZ{LP`+|7B+R|J!GPkO1eu&Uhl!5j8MPQz{A$7IOw$&8gQ{YDosJa+oMlqiW7Jm?IO0(O)Y-pQ&8#v;{g>obJbu7(@h%s3fEhn$K;fZM7Z?fiX z_vAuLjd{ZhPZmzUIx?{UXy!l#H0e!21hiMSeq{*LK^Ajg%pDMy0%q<`GBRGYU41Tw zvlcV*vuH2e^W$!4OSH&uv1oI1t`k^%U9MW}s9$n*LZjmkkB=Hf-6+~16f$F4R zqzPypRBI$^=%vB+y>153KV)t(QbQm}qZi%>pno6@4W={*)*y|1hyKC`DK%7KF{_?x zDws(8AV<}aX4>^9?x?Ez9MVnz{{?n&cbH?Oa&=SOhQg(9n@aYT1y-PYY?%_Nmk zc$xOKUHI=L-kx_}7@s!=&v;|SMNQM2xXCMCf0c>cPC|KY?*EpNJ*aQ@hdQ_UKpta~ zhTec=h=WD&jNK90j0oqtXn{lm83uci(l~ZJSy;XcM4C?4M>i~Y>0P9)C3r=g)n|1h zo}o>==)z9-d?q9}3cIvq%LvO|Dy{SnLde;~Iq%PPUWVRV)g>;PNw7yq2a{x$wfgBm zR~fF6I=WlfTgrH+oGL>MXJ zr8g#hIII92*4Rbew<2CVc^dRV-V<7Ec^W#rmEGTe--wA)n1!kts-m??o-YpeZD>!^ z?qwNWoaVp=_o7C%HDQ}qS4=6Sm67@-tX`aa>1lfVz)HupXWyH9fpEnw)pDzbe0^A4zCKj-|(qa=wnII|SK6312i^LX3(^D@b+9;IpUgMXa z^0?fSP|7suWzH@@#=1;76aL~Dv4jp%l6Z#r{76jYXD)OWtM}EV2>w|IQpyD-yw7W- zN_}AXhwwbwnhcUJ6ZCfx%rL5CEEkpgh5-WEPuojHu51~7sNHl2Tf9rwR0|0cOE=Xb zZ~HI4tbA_G#cKFOVw!Gct3XQriT`&ztK|J|mQBK*RA>+FwT#FBZ9a8)AMfB&uMWKc zTLz0Kq}q?-aW8lb#%sViZM}>sDt5c@OPUpLb^sjTI24u z3=w&jQtSn9*_I1Yxc21@$Jd+msmk0=5Nq|X2NQ!dQIm=~7nNixn_AkZv)is+pd~wK z`fF}R%J_2k7+UMA;S;XKG`%4PF%QFxsEFVD5^7Ty%C13mAw@HKg;SlPED;fOcglXP zp}KZv%e6>B$B;`@IF)NCzg`)X*nw1u@5+LTi|<$9gq!kPA4ksOgjXe8>-u1aLBRzTJg2HLf@M6CT{8B}ctB-#Lex5`!pGsUl`ZojLFpAVygROjh0lJtElN~` z^lJ65F4EVd3MD%m0=MkphC6;~`DAttAtm@?2JMT=Hd-mzz2BEzAg zbkHLDVrYblljP;^y!n~On?a(?O8dz%2#V}2@i*F--^A1u!CUEERKk>>kYOa66&@$( z7jie=#VUTuF+VbWWn$+@78~u==)0JRADdsmInL!Up7@g2{PDHX&|c7K8vd=^A_Dh) zVSxRG@RblF-sejXfDoo@~sURgFGgHwT*Bhl1XFAs$P%!Qlad?<{>+o=9xQ#L5_w-9c+$c}b zNxw)nd4XcnV7|VzCDPZFIp+yxQTTsx9;wFIiNDiv7PHFHT2`n z_E@-as?s%hiAF2i_Fdv6AZ~Nlj=Cb1RYRA`WBzd6 z3M*4S;;ruti$L_m3;H z7%xL)yyg7n$?rN&J9dpO#^+4QjP4i_4vz7fw1>mXc9*?dQ`~E{ z>JzGjSlW7%5rjjZ7Mgw*KxMB_Nayy5oc5ZoRDn)H1Xe}Q6egDt2{x}G_Q0IWH6WMK z@%sU4t>Y^*t!SlBlI_7Qlu273ql52^Oi|=_1*x=T0ok+)D(uS%B}JZ^n@85R9xCsO z&mtOn!w2&7w(c->=dR8}1Ej((Rld6TaU}@mJ(;6EHLHQb-xIwc9879Z%=nVLIva+2RZSU3AD0v{+w{>%Rw5uMPR8#yf9ZroU%|c_$+z5wX<)kqh^i}&UeQR-mn0-F3k_dWQxu<> zzDJ&Mn4V{R&`*5T)x$PPmP8pCCy&{tXsxfW$ef)$mvmxdsl`avFK<_#W%XsSd|pdj zr;+$LAt@8FY*V(C{SEvZ0cQ=#19H`1omZW=&t8{JR-V2jU{?HKI_W96y)%bgYUgzW13OF zUn=^yl7%ZH7d6Hl8aOha=A=d-J9M(4$ooUEYjTm9eGi8UqW1O3+~O!c>GFs8w&nzdz#+|wxq}(Pb=y}TSS#VzJs4-4 zJ_T4ZozYP>BVcr)eh>RXN&X=_0h@g1Hs6$c`$#u*%KV4~OM~YF)Fz`%`coJ>zN&Ne zi-eISCR5tPwS_rN?-IrWfr2FNSylyYdBFqSlQxG^XETH_!_PJ3w0Ox%@$R>Md5`*V z{TF26&OZv%&{0?MQ}k%>5M^RA<`~5jU^wz(tQxZXC>to&wUdhQy~28x3m*(6kJ3?x z1eqT<6T4l~k;Ern(HKou`$_M{EbQb%m@(Z7pnuS(3M7)}NE+=AeKQ=xbMfk4&YoK- z%!?&iD0Q&aoc>s9DAd!dCgFISmzR@XC&T*^O0=m{_g%@(o^$O$qwUX+?4F?ld#^9h z-~JEE-YH14Xxr9JRNA&(Y1_8`v~AnAZQHi(%u3s4rHxzXZS525+=%@)pT>-sF(2CK z?dz?zXvcn8CBAB8hxZM1t?y6_1`D10A#q_gb`a4+5Gm`TM~Ux4SO06?0+X|pQja+> z&*5(zZX!~XRA;>+m85DrVqIW0N$qq*@807lTP_(fQ41OQ*tFbnkz3NY>fZVF=j4YM zh%4xs3I^H{1_qO85SRyFQ=Axc6*B(fQ;b-fWWa5Wmfon2j^5~Cw%9yx+1VHT_k=O+ z$x0<%$+9{Dj*-m5&6%3t8Rb^FqB2(;hfaf|TDb5UMpt-YjLPzQ36kd!)PyUVU;Jy2fObiP3A^ zC;}_hH;ztutiyl11^$Qc_5VXH{tx5--%v7MpF#DtyrHB}u%HwQ2!Hk0+wu6B7ZFk?!bNPbC$?anusD4S5yY6@NeP?wGSaG;ouFH?M0MjHBhSu-!AMCg z;5f>@v(OQdWWe0-3wgII2-lj+9-d$^wTsly5%GpF7u)Y|K+m<&S?#;MCz6A6X840{r1hf^Sjix9`GNf{$^DkbpU zWeQH)Bc6+>NBBv5lg*%P6$i7(c}lz^P^2sxPza`y9v%zc8yQo2=-ovY0`6vp&Cl%7 z`DiY7CWkf-_qMMcQOSjv#w*PCos%jZFg8YlH5Fxxupf`ERs2RD*!54_Fh*RC@ocQx z5OC+JnvxmO#x`mo&gZ(2QyVOfe#6vmMe!~H20+qN{m!X-{qh3}Qp<|c^U{;=P_NoBgUojfLa)k+q?Lk%4az>Pfl=j~?r5&Fu352@>(9kZiCSyU>^pUA=r@M6b zKwmRZO5e9O$NXAvkNR05lE zRvzY0aU~4$Bvj*XdvN4KyF)xR_RSKphrdG_%^lm3$(r1m*Sk!dMzUCPxxJ8F$L4%4 z!5;WH*O#_N#S)hs<2e+?AKb`7>5Cee1F6#F3!7+rt^}z4@?-dR%jV4Wb3#fB`5sV+EK(`FEex1_;d_hMmkLuW_k5{yE{G%$*a9FE_cZo8(b*_ zb5@0IL~n9P0pkr@hL}W9xiX_PDYZD0kz|H*n)UI>V0XQ8599rg?Wx|Vq@+j>5bsnif4fh(I|zsL?Wap@C^^psHLtidloBCJ76r^NzH{ zN~g2~#ey~v6`Zeg4AkyE6y>dhUW-BS4?3E|@#4i0sa`c@F0mJv+y05EH!1@yl(cUM zh!Q1lT}~wIaJX2M^O|J>XXmR<afQ-;<1p-jx#(yQ7zlw#QxAx;_^yu(|DtJ-=e0wBFQ8kV31nvw`ZksCEXYnJK9*OXjqSjD z`oMz&i~=}J&tH2D9M)X`B&Y|W;&WFw9kKs)$%MPRnX-FL*zDAOYdtTvUaHu-EoD04L8)jz@PHFe&)Mot=!w+ zpXVo(GA8v_EtZUfze*WG{M$W1aw;y3cm5IZd4&+*t(Vy9Uf9raN>N99vOMi>LvX$j zb$^}Sz>Xlb8)Qf=f43_^3$-JVqfIYujX0&+NzJh{mq}Dcx)Zmj;x+M!0w^Wl(9Xbj zHy7oHqJG}N)zP~;4cvZa1i6dm*VRk&!8I)0zIo*T2s&edi50s^u8KUx+1+q zM~@kPf&2nFz21|VK@kF@ScbsSV*jA9fnsAOB&n!!KWA2&@Dz(L$vVaulKR)C!12?c z-))0+G5ox>vf}EMXS7SZN93zO2th{jvcKR{VGniyAk^{HQJ&L}W7AMlQ9q@)7%&>* z_h!uuHDhHebp#leW&PCxygHZv1eP_+Kzec9W2WfThj=O*T|e)QX*GM;7Nd2u-OkWppB%Ho-Y19C9GaM z6-O9%Vt_2ajiIfdc@cC5$)sS%R4q;t1KT{PjXxJsZ{E1X?6|`dMXUn2w(AEjXmr^FnG${yX#2dP2DSkkVb9}une5#tvvNz`cs}!M@d@j} zGu9={4$8Z5213wVAk9jISQ(n`PaqqKRV1ve4bwf;ir+bf6e9LMPe2DXG z)X?qF;-g84p2qx~dS9n^aY~`5)F5b!{-tTyfL^b>AKjpH39F!*iBCww9iY%{f1ba6 zD}p@>!PKxRnL%1{5XvS0Gud&#nC8Cja0KT-RgS)*B3S(;(2|{TglelGCo(zlNg6MI zQ@>ul(&%VqVsZ*rl30gXUQyn9O;2CdN>%oWARft%@ZSXBf7sIh3vs!p9}hs3Np}p~ z50FLy!sPzN`rpp}4`<|mD=yg>82`u4Q;Y_bHp*&e9#BR;F|-jXiWm8^suo7GZ3`W3 zzEVM;s^TSh;FT8PFXYsE@L%Kt>c)B|dPj!al?SS*K^ttEEiEx(lA)YVseipMfBcB^tE(vk1oYeHhlKH|{A}j~X@LbB_Isg~55axGe}0(- zxr^LY`=@E#%4^;;*Eq9*bWe^hm>aP+gW~w5{FI{b2`YkIliu4f&cyxM=aJRWQUI~!VU5TXo5}Ajsqa@}xVe*>{dVjFV*l}%FbQY!Z8$6xm0q1JIzS^5 z9FST+5RFQmX7}kMbaF`U__#qxsxllDGVV?IW^xnH2rHUat|hJ^YBW1aVCwVN-@O&c z;88e1yUnCwBNsp-fl(SaDl*J8y*KZil#?vqXF*&_c8*1H?B$i0ENh4;Szdz zY^u^{RPiWLZDKa^6EcwtwCV@QprarX!l?c(Ql--_kA`zhrVd00Pvm2S84BYbp<#*9 z+UuNHv>Fg=Yq{iYt91iZrZft42%Qk*Kf*!9Ief}5^L4%?Qxkg+QQapZw~Uu(EYVzG zU1(U+vBqV})8^w=ge)0aLbW7o%JItAF|#%xGlmvmS7B-0;@zbOL)2+?Fh6bb;CXo8|jiU5|9 z{A2)bN$CMt^a!1_A;rC8iMA|yQz3H250X7Pag;(7dej^ZFYP7GZc}5+ecQWwyOg`k zD-5219$F1@i)NZuA8#yH8gs4H*4$xRv|V<+d!XYWRn}R=BDrHLdaLCochYbY2!&4O z=fctB#FuNYYlW-Y6~#Kgo!(rvNv)hg89=V%x35$-)3Rx$>qTFgY+mXW!)}3JXPXG& zU5c}WKqqFl4d+lF>}S$%K^W_IbT*CqjO&B@>L4o5*)X zbDCTZ0R0kWN45+bD>E~#2J-y0N>ScfrdVx{@CaB#*f&}5@neC;AR!tC{`~lIJ^%dj zj5c@FYQL4?l|Ubu9gGb#oGy5~MLoY&un0-fNfp=dH8kA>yKG)w0HLPY!X97t=hKV1s3H6M+|1!Z76ex zcySG!HiX7qo*@~=DM4KNeK4UNo$$rJ+w0TLoaf#-$O`(wZsXC5KzTb?38{D(>N35X zs2b4nUxj}v96(LAxA9EE<59ywMK*6<2tCTn!;_Bj{LuS)qcg#W}ETO**r*}D= z%2TVZsivzufy^wB4cra)tcOiB(Y`s}Juo)#yTRe*DW&C1b7a`GagD-s$z)JwF_tPycph4?kp;i^V-7_}`s z6QiaD=PcDmUnMbUKfq1~oAQ2`+>d8^sHxY2Kf8xrE!frc#z3em4>F1WK{L%7l&3&x zN!9hXaNAlhnW#|>XsP;cpV0BtGGLc;;C&2LcRoRTsYr(4v~L24;aVge)5FcUDd=Qo zl`kC9X>~n!#~G@K0nOhobUAP<%a+(BF;B}jZKe)8YZfTE4Zk+MzgX5lyUldKB$UM=2ESDOESY1NV=`=@5VD5Be^z~-sYwPw zHc)j!L_52QlaCrG7?1s3G+n(@r4j)d3fpgsqVRsgfts62sz7*he!M3x4C(73bG~R2LY$m^XjefWsdo=6+y}ck-I1pr^*0I3f-rIA{N{sK24om(OYBr0 z`#gj_eFg3S5fe>>b3k5j&lEAbVjLp9>2KZ0+QV*JA32xvVYGISx`|s_z8LcTY;$$G z9mh+v2!%*ai&Qr$GjfR?2&ssR8-6Z7+|3}dk!|j;?S!RMBZo1)4?bpm?Oqly@U4Nv zl~tQ7XyNOPgEe#J?cPsQb#yk5q#9OZF<$Jyyg}^fZ{SHUh7c@d2{CZDMp7DXadcKj zT$fr;{y&WbFpz#nKJDhd7Rv`7-8Ecd_BCh`JOn zUEwT*#@03*SXA8vD5vwk+C>t9u`TC86=_!yk*CStiFkr|CU@nkI@X3t8JIfIU@`k+ zMQ+6o-SV{VZ9hftQdG1LDluN@L^n^vr(swUzl|+2qaGQd>R6#UeB~l>8sF=ptrZyi^&(hL*G zZ&pTLHX&r~0!m52XxGLj_7}%W7}K}EpR!dcr`_P#N#6Z#b>F$&Zir~DH>Nxc{^!y(I=A_uw$;v@C{@MlSMJ75Rjy*low~nF2gqnuyG94EUcET_&u?j z0w8RM_y{2jIUZ?2PSV-+0KoKwlcY39aib1b^Tmt&ylzA+<8%uzS^moPQ$%LvGqSux z?i@VoF{Zo(y*wwdCE#=`5bA|8NcpKBYfJZ}Wq2VL+?Ej9AoX>tr?R$Npc){x?vf?) zNus;Nhu2be1!qmLfJul51_LJQ1}~py7!V%~Mqn)-SW5pOIq|)+=h*okz!&nhXJi8R zeHk}q-rupu9%UYjMm_-Magc%MVCI2of}A_T8Lnx7bM&yT*4{zf+}QY|A1lnaN!ZQ_ zSt}w3=C_)BkTl)$KA-#&ihF)cZ(PCb>NJy3E})lRm&j6ii8{GfTpwe1{bq1m6s1S( zYtc2Hy(Qi__N(zBrQXYGS9Oio1iX$Qfirt_ZqPOT7qP($CM!p*m>NP%+TokftH+w| zO%Y~+n?#cptRZI7maC75pF0luUdRyS3U2Wsfz{szw7?B<`{^ZduxQj8MTm5%M|ylG zKf7Nuw*z{SR!LFH5lQ%D%Q@b`C8Ff3+{JX#GIO)C6jWdMJM=PhESyy5?g~+R%(#Ry zb>nli398GfcuZEuV4wi3EBdGF%a3{l(|8!CaC$=G5eI|t)o`xMi05<@a+#Rc1z!l3 z`SUCAs~qHH{0uBk-ZVMxo?nxW&^0)VsM%tj%hgb+7BF?ET=Vf_sOV!MP0>5e9xTM1 z56`z-^IVGOJ63B|gdOS{`1z}vW~l!{OpA}vM$ksAefP^0)LjQO*->S)P8h7>B)ytF znpk^apE2I`1JD0`uEnXetP*&kc(Teve_h=Dv@3e?u%si_f`xiWS!>uS@1@+LgM$)- zAzQ%QSI`J(VSal8Lnptr7ZU^weN_6+fKgc-UZsS+xH^dve`E`{-`OL(4nEeKAi;3L zaP9FfLF+?Ok?t}J>0HU37@yW!N@6krnUBX(LS`sSa-Toby2G2 z$i#z|D+x*m0)g}Jt_7@rqk39xG#VT~Hrx37)?aQSR7)zM8CPXQCUxN-aN3A zfo^e^lqvXmh_CaW=iE5gNwr!doE}kO4eX~y|1pkKLP=|I@|HmCN;za+gJ<5IhJdMm zJ<+NcuN5^EN1!k>i{nP z*-faNZIGLenM#mGWz|S&8H0|?77?b#h!BJE8Yo}1V-aZWC_aj(O6g8|4S2v%53YA) zp>IX7ARZ;vyff#E@{b7~3V5oa$45-=@yWa7c_cOd5%TjIbm6v&LIYPf|E+0y%4zW{ zBf;TS9(s(&da45Q)u_YrtIqdO{KrjdY%MO4%bvW;VUxUe34J&XY4_EbUIv1C0zup# zY$C0^vbj88NhwvH$;TgI96$T1n5YTtxYpvhzjSg@fSB;0yWyTIk+FwEie$-V`l`6w#OGDAE&kxW2 zfaYwP8WEio^-XnvvZjCj@oHKK7{tS)XySu#U$`B_^WQD3_Vx7+vxoI2-mf+!{G+H5 zK1&a&$j+yuhRo;t`%Fj>hOSVV8pYz4ERvlZ<(EG69ND`&0FwT zi68lN;Z*yLzS7UcHVuz53pAMNfrc|Q#+K}@09K#|gE9*&+#U%B?ViSW=Bu->ghL|$ zFXJL+SMpbWuz{26#2YKJZE{vJMPSo=V(TyeM*I zsk++XmKNrWkCt=Q>x4YIP8(4--0(q~`BF^1J1Aph%$Q8XIN!F<#$-py`n=imEmYZ- zV62`n5}7HbCWD|VRq9^`LbqmbRlW)Ty$z>5PuplG7keAI4EFR$h58kt)Dh}6TnJhY z8RbDa(Oo8L^==RUYxrZIl|Ob6*0(kRg&hnkHFlFhx-^Vb5Fn)5cQbW(C-s#;s$e5U&=5s3xUC@9emwXma z_1F$mMyX0?UK7gl7a_SSRCG6A@6Z-r%rQMSNI7i!jE5P?q2*m8RZ8 z13A^r$o$OFS$8AI*g9u#< zfO6apz>_#-0>W(!^V47rqwu(qKf955H13{yJ{E>lDl|OVsHv%$b&-{eENv^RZ2!V_ za$rc0?}}W-EcQS?SI{)lH3~7_n_Pe4>#QHZTE7qI zn`IQYtY)L)Ou9O9Q!8L&Oq+@yRwG|xMO8_~Abx#SQ!`LZiKR}BPQGf3(M#x~qJFJr z3|5s2Gc^uwq$?ategu&rShzxrc`tmxG?gZ78B%}Gw3w^`NvfhJ@7xA|KEST!<6vQ@ z1NJzwl~k6}JDO#0h=->hMVv-^IWrK$Efb=r!7FKhabV;9o0G5A#?QrQPF~}&s-HIS zeY96Pa4(2yw`FHcJW~eA{_@z>Qq=3$tlLT1aedE*ZjklVr6Zih;_?($sYT6%V0u~< z8=Iva@tD&jxPv4)px9uo-b_qEIp#SPKuV`%xPi$f$_zn}yLnrAx)Kxh+^6ozmC3MC zIM_Mn?sex@m*~lRy;z5zKBdbR(ITjTNfIN&M&K*6#UpgN>=?XgVe0tPVfQzi!*YhF zeZ%cyBMiAd!v|vX;I2wf9e*uT(+0Vkri!NrGN+Pf`>ynH=ff+ldiSX^3nQwip^Sl- zgjt$|5l@R)3_))``so%a=gr$(|7!maEV;#_{TUMV8|V>KLB`IhYH4uINhcQ)?mIKa z5ZNP-(R7W`7<}t9p{aa&ZEjUUY&ORFfeLwJ2;O(7waVDtAzYx?ng@cb=KcDoG6^uN zElWVlg1Y}-ec&ym)>zI=O!i3RO$)?*h{55R4a5a=Gztf@-^?$zn1W?QKD}zB6J{ z4BVELd9WP}hibp~x@b*FjgZDaO# zkWpu^n1zYL+O(U}e}_+lJ01g0j+Cj!s_RD0(!iw`B`8afv0jXv1w@UvfKP*ahWgMc zIaxoiX-5w#T(=(s0tt5Ow?IY>euz> z*Y|ugiZJX;I)JJ*bt;WU=f3f6(O! zz-fm?&}QU`#O)mwu|$u}?M=96*z?b@@Y;qs485~96wm1|5ayC5kMRxq98Omu@+;%; z4D5s{SO@tqUk&5j1W;cYlm5))tsKN3^-sIoa5Oln+IaS~t{^qT%lchwkA0kUc9!% z@H3hlzt1#=J37ovzx8haT8lk*#3?iYfU=gu+E*qru+`_UTkiYYQ%3>K{N>A?k+w1I8(3JLQo3u@ z*CtPUyqY?gxe%y?9n*H7xEXzDO^!K=LxEfIdnrTry)#e}Xiac+jXI10^y`B{!Ur6Pso8Q>3J=C>9|?&@C5*2%68CZ3LvP+<@cC zrw;Y2LS0$}-FQ0-mDbUI9Q+4gW zVkuAz^V-stOROXZX$)Gm;C}f-H4Etr1&1XIiBQ(5=8IY$hjTs7QlAy=TK`xm&5SaP z^ja)*m~mwn`l^4jy+J$`Er8X%Ge$!WpsHiCp=AXquEAZghuqs{npC8seq{o9FBv$s z9}bX_(P`S$b=Z;y&h$^nNT=fxW+SE_9HupE=!O!F<`@_?*-|uc#;n7Q*fbr7tH@1b zLrjz&#cDWX8j2Yw-fd)3b?lm$!L!JwEaPI05@X1@lZ+Zn7!Jy0?N+R=-vQ)Nvdf#8 zVTyCrJB^$f8YTvK)1FCka~n@G)-*$FPoAS^_Uag8W896f4(M4#e6o)XV_9R_S9c3P zhH5?ajGV4tna9-Zwz^oS_FU;KQ8ALs+|A@oyf+B-JIsuC=^?yPE-z>DcP3tAPY) z?&O7|8*UT0=VaktK?A&&DH};~THDzFbP}`9p>!3Tuk%JiA zf@RQj!>YmMLq(eRf8&^R*oj5}C_aZU?-+#DUa?fBuwqpriOVjrBv z>iYVn2ja8%`ysg;Mn7F}R%;pj)*(V89!|k``aEr)kQrPYfLbN&z_w7LU!^2=YtCnB zW+2YKnPx9zf}unnvc7X{`d76V=TV{bh-dHFAGphhD5y6*X}q7IMQ(ED=5aMEnY#4m zra?VQ@wC}g>dP1w_h>n#*d2;SO6p{V%$ zqvC$kb23Bmi8ecYX>ANl;9X9|0Akln#EcTcLifqMO-)Iq2$kY8eBkRza=dCdkZDP( zaij1lft7Ap=-obX${+O#JlX-vH+(Cqpq8EQZ{QvFSo=-^w*`dRIMeN--!$ojwdYLt zA+uj(&!GB#im|SEPcjR~mu7N1p^Fxd3wfL=v3BD&1)5nG+!ptzRtPEAB2#RI>kof? z*zrS1y^AmP@EJza`7E64>CVvgkd!A@Lo5@xGCp3Ye? z0XmEQ`c2w{C}#0T@YC>m{ku=$>$C|Su&BHZe1@=ve%fRyLRF2iv#hNNxRCNT9ZS-G zNeWJ)WyI{(#`~hZr`W5NnT=l|*ZdQ-+H%*ME3+d?A;1qi!mB&qd@qL`@_c|Xr|K@K z`^G2@vAm|V%9(rUQw|+Qg{X%}%8%^&WM1qSr0#A4OZRK|mQ0NEllDlQ$Za2`DJQXM z-WUW#D5Z3JB|E{ODT6uF1`ls$22Y>n(_Fy83(_+*S?Ji^nmQIpCa|DQ<=PQQ&$J>+ zOny(U3bS1W_G&;hzO-WRbRn}O(4{>J4afTU;#}FSxzh{X8>BAjy(#?by!L=VuQLQ+ zA)~_wVkQBZ0|?m&EHVUAGvi!}NQXw~5yE^@M<~DDE81WA#(e$=>eB z9}gQZHeD1R`iVDF&MX92fWo2hSLlewBVz43vSA zVVC-FZOcPTi+dx2dmK?MTixc};5&}>g9OZxNJJb1;_vI_o9_V2O;vxHj9}QLC8+38 ztK-LeOX^t&gN$D-#hJ#_vc*D`>73yrNc^)QQstj_;u3*n)T}UinjM}`(!zRr{~~0k z)cD*DkkTWkfhEB9usVVg)Wl^-7(9c$^#i|4kJcA}-^@we@;3;VXD3^{%p14e!kFbS zwRvt5Iy?k_>s6+qZ()hBT$zzN^ffKdKh3STdb+t>3h1 zb#@xdrGY;x1=!0W(!EMn)5$|FvRwVm>oZcmnW7KE4m38_W#o9vj-q8;C{{D1#uWQT zLuuFYuu~xj~TR498Z6??B#m-LaWVyxN|5M;bHcd^9~ z{YImm(KHYLB0K%y>8xX@_fspLFqhrxsj*xG#)e17V^yZg-j*9fmdkxo@z}~4^Y_rN zFAfQW;r`~Mlz)wGmx_ZRqPL0~;xwN)4E}??J#M<^7E~ zqCYt8V@@FlPp6wYS9_wV1zg?ZrS_dO&j$#e!`gAGDSMF+#vpXtppJ8TO3a^X6JYu2 z6dD&W$Xw*&L&%SE&yAIqg}$)s*zZ@nBg19%vryp z+r4Qj3c4M*a0Ds}aj7hISWX~t0+Yfc<4ZM+DiL4$2|ZPVkyjfktD35EVBlm~FNAlh zD*HtaQ3lJB`mms=sOKwDga7;ZO=_OYH<-V$SKd7QRpo(yLk@xIze%_MK#Tw10+H$e z#+LUG(E-K^nFsUr{V`BLsB@q!|LyGmpjQ63vXF)Sf9AW^s9UI`s&&?aSBZ!spF7(s zp~<&cWmBG&A7a}f$6#(j<%=PK{aP<>cnQ^2_YAry#W2q-2{5%1Kv&e3*eXP}VJ$Le zkt5F-KHI8Ja$w4EpTs@sXv1c4d?0;UrFF-CU*at5eaL<3-u*yBz+nbIymObY+pQN& zCVBtr4mY<@aut)xw_*MO;m&{pqv==A9D@#8qZ+tcVoX)QfAzMpzxN9RFE}n32r4iN zbvD1<598OkoxmKW_V|7KwoHnN&Xw}2R%-U?R<$H>m)g(PN0Xxg={v_QR)OemQSN=%Lz&)fOK+Xn3rOy zB&J5Pgg&6xyVV%tyWV2!=q}1DFl%f!m=8QQoU9;GeW!-EH4tl}R!FUA+L2VFI(_N} z$}2c)+E(~Yf16=81ID#1bsF@r5hJbonl(0S_S9$-eGPTCR)nd6;dESOFsE>*Ra|R1 zpby4$Sg(HR1DAVW$PMfx_)es3 zM&-K;zI4VmM%MLkwf<@7y2nJpMT#`L!_hqHXFs#qp)I12`TCgS``_6vV zjcg*O%V#vu5=p$OeAE)zSV!s?;XZ^a2Q4@wS`wW5s(aMVPhw_{^b`waCCIEmU7^RT zMMgD<9ljICc`h&IdyNagVnU^3XK&TJHfKa?e+3AODh#(EnD@1R+moYRf3v5Yp4(PN)^seQ7!cCEAbP?nYT=FC>7c^c08o|8% z5shde>Dk+{Eq@}!Q&rI*$|@kF2StS?wkNMJ!f!Q>llT3Vr5Qr&h@X9y8&0n^*#YZk zt-yV#c~}rS4-U96nD9zhc#+x|vH4(`siQNC$M-&?J0+ut0Ysoq=>D^PxyPam?=6wr zS9D5<$nq<&L<*;6L^l)!+cP#CD6Rb{t`3v}pgzw^QZy0EKJGm_np88g}is0rk%+IsvnG02C zb!)G0sCAHZAjM|v;IhA^vu`qG-K+fHO`)+u(7>PUKBj}^U?Wg={vIEK+c9rn z`zbjtSlgcOw99V0^=|#=IqUX(ikyApBfbJzlZC~u3@L1QBo&Bsd@i^dq(@^0Fd#Uj z4eJ|I1ZC-=50Pb}8}c$~2Iku-uM_x>copdGynXbnWec43ssj7K#VnbGxXo%+kPtYF z+hj%OIB&;hS0pn7a(Jpj5j();1c;Zec-HcrEgGd0r)G66qE<`Mx}2wTN@Mmv9G}ad z@?g6kh}s|-jXX>?2a_=x;~84Z-thbSp+1C-o`Iarg*odhuR`$HB1yrE=Na$36!+R5Jt z6leV7mw*OqGDdrB0Qn<5ngwPJ0h{ zW*dMPn(~@7I~F(01zd&sjT1SmvLQKIi)LI|XX6C$`<_tu(mrKPf%Y!v`x#KUeFuT= zLzo_pG5Fh${!hISP|*6CqEelb6@dItTFO0LMvexpJY!qVbrHlqW z34V%Rzxso@bVf;aHqIL1Y|3Qg>b6PjPzFXXw=&q)EyX}GKcP3;-rNS+Uw$}`yrF!Y zGD{=nv%C;u+#MVmyrWIOl}PO*Rf}I*OC1_aQff-NDiiA4cq~6vk*RL^dpsV@1!ltD zjp|8b#}R3M!o2TLsC>hFYX3NAN;-Ned@6&bpLi4H|8)oSrtv1NT9 zUqHCKP_KhJS0I8_jbf?PDAFm*jcj#wwIqlTTGIm$`+J=ONxQc_ML-MX(E>I~wQ@y~ z#%%Ce{2o^&eD{;Btu@R2*PV{brrchwGZziPM=7b9GXh$Ga>azi_s>z~Rv6l^`2K>MBR}Sj5VIVRsH76E7z?(qu=W%2*VAm!bV%l&1Jw z|4Pn}6x$7pzPJa@6k3+0yGE6P+9PLgIR-bh zW_#}l<=+Xfw_mK9K^d{S^D3e+Xd8rbp+7vVy$0L^&l5y4#5yhSZJsk35xM0*_r8d^58wByoe zjWFQBe*(2PS?_z8CiPw0E4BH|Ky`MUaYOs0btSJi+o?rUQo&=Z7Jrig-hDkvBWLGU zhS3v%XWP;`Hna0ft5^OOY^8P^>Qqz|r|ZUWi4%x=ZA-G3_icZAoF2yy?c^?&m4mw} zni?Ww*U1&a{Vvj!BX>4_^kZ#2*T&ZIgnD+&&g6yc;*h@M>rw@x=zE`?I@5UM!45im z-NCY7*b^}Gp%yqyES>R;SddKrO?K@J;K&*mlhv_p6>2mif;GhM?YQiF!++(@2Ed=< z60fd-!RUE-Txfq$Ebs32eJs~hmR}Q2Q-?*>4P~tE6NCMQw?Z&Q7`zUEtps%#=Hx)( zmu~k;$FD8$M@I_#3E{THj0&n&_CiJODIEW`BQ$qN|Gg435=>{rG1GbeAcC72F^1In zxF0IjnM0XaDtaN2A+EK0RqeFdZ}H0G`=h4CPqwwK9VuqOpoy4%GP3^%UrYL%ki}j= zqd@-F=&`@b90WVAl#t6&|H+IYUQdDprFtKh*$yB3VUq1Ug4upLE&gS{|0bL94@(G>zLt8j@09CoZ;fW{XA%C(>m^f98rKshm_qL#cWpkxTqv6_SL;92JAl z*~{w{1;nq7Q2Fut4E4WZrm@yf1izZ}>emCOB-@a{FV);%8=0sF@KZXoz@0lYdfNR>~9%h{)X6>$E~xeSF@+z z|5`RRWa)U1c_R+q}dO{NrYnWeu$*( zT~Q2>B2(Vx+33+eW?(|#j?FS7!69nT ze=~XqvlqejV+>P5wPexkst}Xj4Zow+k}0H;{v(DO73kktKAtXbsr|22=+*`kV$Pm* zo{ZxOnME&fkuGEi4U`>%X?B-ujv$c6OV3_&E3Mh|@-bz?#V)7Q`+GAEn1+}B*8Ji~ z%11B&A9m!+i?(((18$_ak*%+H=iHSO80Wm>586P<^fPQfe*+(z;d*Fo z_RZ93-*>QBMYU`_r$v^O+J#g0CHEz(1O9eP!Dk_o=&cQA-*oLP;b(PPpbS{vN7ewfVYrAK z8Oms?o$|S8&>wX1eGTPLR~f(x^kTk5o)oO6o>`Yu<=E`v$!|SGJS?o_#&RL4S|8FP0! zZ)~j8M9`?R+9{Kx-{8XORoGZ|omg;z$9-t&bBcx?cAPn$g-L9$;o5t-SYEEg^|4iik`SifFKYY|AI2%i z*>yEuMVoCJsArRls%un*ccK>Wx3Z7OC#usfp*cdusZO<%-w-q@?aE>DRB4(`RD7Q8 zA4x58A+rCJd?oOeNchqA1O+R2b4sw!D%D=p)R=P50gB~)oEzo4xDc4Ee4|c8bWe&! zqL5;@gWSK81n_B?E8~?{8+0G%H#J675^rvp{#6aGLL<{v;GeNhQ9=L1X zs(q;*W5zvYlJeQbIr#-I=+InlW~yr3$-;&zVM2ls;kI=~RmBPvgLlS8chZ9S%(+xZ z7(a)LjNg}{<7j#(;O3?>7F0lSotRhTspVC((!#FpBRdFIc&hGUjs1@ki6o5AEyqy1 z#p{6m&A&BzIJICu?ta+*%QTLl&3gfbWuHJTB#o);^&+KX>POX}=LjuqT$^~ho%c4QnjT9|Pn=phqHb6kHC3}|*vGgrJ3F0+?O>Y>m?b{>%)T+9w0(kPaa#_46GD-2pGP%uM?K?+TH^o%ep`oE? zMnVj^u0>~JMI3LAs{;;oVpMV574cgrBPUlmEn%D6LM==sdiz3}u0$nIVi?C>w1W?C z1ipJl{S6GJI6V;w`lYpzd&lXJ`y&|h=tP?S@Q@03mF1>C;bntk4EiwORWm~U@kR|y zEVCK!d4tjh9UCa`L%@yBKo|_&rD+13O;2Ek(!zAZp@(4r8s}Zx2X#z|`d=9x3ja9B zoc;QF9f0~`P3<>n0;FyV3(sj;yHdZjOdmLe${FM2c@Vx5IM+64{;l{|wvy zM~dkGabpqNt?$O)|6%q1Z>MccoQ(fh3>^#rWfeUKXhK9( zWE7Co;AYrTqvv~}+{_1t))1&V@cZ}AFA&mS_l$wWg1!OLgYt-AL>*Bn8nE=fNKRmbF2pj7bv(s?2OSc{It9H2`|MnsM(mSS(zaJ^DT$(w;j!o z4(#D^Z2cUC7}K9O-kTYZrU#L({Ova%nKS>pdV_RoHgGQtujsERiapMsj)Xc9ELt7% z1agZ5){32fNp#E@R7uJzcMeQ3YnzKsqbwg+B+pJ5ez<5!8p%AW)zN5S5~~p{mK9R8vC32}6BiRV2Z$Qon$^mc$Rk_IWGT`` zOG**yS)>V-!`K;sZf9Bh@HM@R;{UI*vkIyM$ksIu!F7}18r(g&ySoMVjk`Mp5AN=; zaZ7NQ02_C=5ZJg&fXg}e;m*{|om1znAG-Rft5*MO{r!Jfh{Gc?$@6NLH%F!odh~eX zoLT!nNk|Cnb2`-U4zb3MDg^g?7%Bx%-W2bReo~nGY&S~EYr(NNF98?7nWfS1Ums+em%CCnyE!Bxb68)Zb zMpdXuNK5(_H;&t4bBpF{3-SET9f>!~^xRILRZ+`~zEqY6oAvndO+*qPre~n3e0PCV{J@k4xGu)L#1Rb_jJv2hBV|`DD!>1`-I4v;Sk(n1$PdyhK? zM)w+KUWZaDi8E!5WgoPuCz10c;sdcRurEo`{~`m5@rxFc&=@R&+`Gmw*77|IvO1l9 zULUu}+u=iB7s%{)IMqynB=a$H?AzTSydsppuL-$HwLxTC8Noz(3dACX08Ss{F&vA5 z&oQ!xi!W|-8$E)OMID2*+Lma@IE5xcQ#wHLeSj{Jh@G>THMr6q>`*lQt?o=a?PGM4 zjVTfW8tW2ND`XJ@L)#A>^MQfOv7|}C8#8IJPd1a)4rS6~r;^o9yK+WD4X%oQ)hDn( zNq0bP{7;omF;z-RU+OU}nd(Scm})?^FSvAOuswW>t z#ZemIss|G6^EctxTbtp z^jj=gg%y5o0WB2Y5>EMo(!Vff4pC8z?LOU|s0IQnHk|m#_CLsN2sPB4MTh&{^x~Ir zQy^`L?KiO?U~jyY;X^C}joxyUPdCw96{D}9piW#Q#02X5-Zv{TbcAj+jOl^mo2iG= zxxbJ-{!sO?NgMC%(=9ffo`wdpo$jMkYjA^9;yE<2WmMONvQpy^r`=WeVxf2vP*cb6a}g%1 zJ0ydzf!7Efo4XN2wPckqBwX=-d^W}ljjBVQQLJ%ew<5T`87h>ND-7Q&st%oE@p;L! zR+xGKA!TUFjeO2SF!39J$}RvU$x%$nQM5=T=g-r@u~j;=7DyLu`KD+7Y3qwYhR^Gq zMp2^869dDRp2xvkGw71V^Wewa)AmRge$55+RU=7ryZa``mU!*`H!DG++-J$r{#_%V zNRTpG0^H0_Rz)}!{}pL+;#_z2D*-CF8cPYZotG1|PuYSJhpbAWfyOG)w zqu37_E|gf^3$|AJoAN2>W6c&e0?V(XdG6&6$-Dl&-`vw(=f)N&?jSy)&aBU2%izJH zURM6{Tdm=1#oJY3<8rYOq`0RGJpLSFzVHKQUGgUjdV-J$;lO@2E2T_Y^x7GzASZhX zHCnt+CPHZn)$zS3HT&et`krt^Yo6=tO2mAiI8Zr+a)+MoF#@QNeTqHOvhPTgxpKaY z?aU%BNjRA^1SwF3O+%avib^4>6GVh4&xCed@`^{`%j|z#azSiWKlLmq3}*-yJSpeq zoa~QnDb?TjYAC7+8^+LtI41cm<0{2HixjVLAy_EK>o31*ZQ5^%>CnbDHYaxS*ZjmM zq^)2_x-)}o;_!%7v>j~+%m;GTG8%_2yo+7DbLMr>T=@Xr6aN3Eb6+z zaSE4QM$6Ze9~^Dmp>pD)s-IiXEX!w4J_?{&YUAPq7U!Xgu?X(xk&5Gqm{`@3gztuy z?jls{qkj5#MY%qi*6x&clTeyo!-3=jEEGve&jY}yQwZ-A-!RO#Y^@M?J-%&!vsWVOD zP*LuB8bGc7)CyY~r0?2|c02;c-J!=oRTs;KIzYVbd-b1KdboQ{88g`J7uz79bx2&U z@!^p|YC*3wd0r09{BGDOV2##T`ftjNPs`3R^##JRX6=abdQ61S+xjo@GYm4%xPCq- z6p5E$p3fPgZ{1Bs{>pb#55QwY6fI_%dZ0t|f*wH!Pk&9p_@efToO{lqkHvnSTvP!b z;VxPgjEQL47vbz*^rOt9RJWz|1VmUjZA`fn@z=`H-wbs8m89DCR~Zq<7WY@F+)aJL z4wc6-F@CQ1yzMHEw7))lxe9z-|GoHfH74(s{}2ah4lpu1x_jj$irDvph5OJLJ!|(uH zY`A4i?%=wm0Y9#>ZJ7S4Go*0{8(^~#T4VVAMdhaG#&KVELU=(tQBEJNca*+MqDb>} z2+o&gX1qGqf%;9-T?Q%g>ERF-5aThV>%J7^vnsbHH>ff~FS9qSK`N)p*C8#PeY(Er z*}FnUtA6x|Otn3e&(#o5M;w3;EFn9ncUWeL*OK^&kMi5tq0tPRlt4B2qnzQ4jn0g}ce)2g|Jf9S2WCXUv?jWH!(u8JZU6%#WJS&=}k z7!qL{Gr11>*vwA*ZIuGgRs}>^oT+u%Y+#smut$9=Huy%y@YFB=r!`I<@ zzH$Bx=5swqMrz2wM1m`JY2gm_j*^ttpOkOr_ID97wB@m>nQ0+njv|C*hc74NEe$FT zTOX%zNXgJ1moUkEIDe51Z7jjUNQ&5s|0IqX@`^R%6bhbT0wi%zj1uB4pOOV=M%O|aL-GnRU*nU3N zX3mO=W-mi3RR=Wx-Q_sbjXqlPpt7-&0+CBNTo1&=tw;Z{*o3}?F`T|$m%&EexpY9r zX0rXy1bgVBK(mtKpnzoaS3CMbM(UL4fb>R=j6C`ly_1895?r}b9#)O;A={FRIk{|W zCUFRD$EP_pZb3yRMn)CY6+lzmFD~3U%ZRe1WV(nlx~@qrAsVg)OBTfj9eH*63&7`v z8z4q9!3!fFzhfmm9}kUP-)smxU29xxVW(TOq8%$6-P>H|TZ!T}mi!>rfO9y`2fo@X z>myMtW?m9!34`VvQ!&LG%$y*sbu7ydh>~P^{YKvoZ|^B7+~Pcc^+E31SDe$E5(!iY zyfvfu_(}r2GA(pjy!wm|>tK0)2s&V}2e;#uFu1&cETnt6~yFH?0YS0W1 zdry`t5S_vXsPx_m>L4MU7bW&^YG7V`aoYSztG0@%rpH}J!ZUU1(a{T^0mfjgzXb|n zqrZoJTNtm$T*w5u=t){Dc6Dy~=xA%1w4|JW-Kw+>A?`jEWf@^FFi(vVXT53!zNi`_ez(I5l%02l+Y(9nB+>?eeotn9_RLD5>w$#i{ccZls0 za6>~s8P7rVZg<=?g563+iN3Fs*xD@;D)&ig@RMqL=bolRsv8en6|R!O zan`-e>q$NWYat-0IYZ6Uz05RJc6LwjgLHjv2nqg5gJ{+fx;tH9V)qL9p<$4L0T7k> z0Gg^Z#zlW72KIx0Pu;NyVW6U4tn2LPO#O|oK%ox2UA5dTm5+4$^9y)2RHO)NYjYjT z>Cr9~^R%(L|7W8q7H(*nXjl1g2ikr7Ix?50+-ul8G#5V}TCb0P@O16jsIn9GDpy>* zAvFkHD~ROkBU3ShZXL9X(0+cEz}~HwAUPRMz6W>P`G)?=*H&Gl>P&YBc5DW$#}VR` zidf{ccK4Pz!mT`~{o!4G8BfYfy7ykdxGDq7i)DluJOiGkKm2Eh$;_O> zeyX@}c2E4Iqb?4!pyko(G(_MGeUTFwZtL{L`C_|ipS+F5QGcb!iw5>%K4Q7fcY zaWhy#RFbVZ--4KvFN=h)okLSke=*7SihDv1f25n^T-Ym_OF7=fhS4xhxq2SlX)#xS z$|QFa>BnD?$8$DKl?1Gj#lWuAI~mwbpI>u5!m{gn>G0Oi9b!EA1&f3#a}$|gzCqoQ zt&IM=^7IdOuK#~|`sY9(JDCsa#vg4&pr91Uq3!MTv}! zjs2Yz=i=%{#>dI_ADD3*?Ejo^IizprN-%=`l4r!WMd5(Vc0R(Cek_+}F`j5DowT=( zDP*iOR)Se!d|>zX?CWD`g1 z1t2ZXK*{+u9+Ea;N_Fq0_qk+#qOcZZg6=**e9f7BHBo#JOpH8!M#1Mym6etjyNy;yaa$!wN+eCx z1we+=Y{n{sfQVF|=sFZKfaBrolLgfm1al*%^?_U`NEnXsgEc-D$72-Zb_g9EH8L_h ztbjrBc2Fdt*Y`PNm(p2AV^Cv~_e2?tsB|a*jySr7d%`T>)R?%J9+q0nR1cO1=>fmH z6s9cBQci&|MZAw~QkK%mI;s~bs={Vaeh1nfb7r^~aHH>1k4oF?{e2PLha5Jr80$^o zNSnywhF}uad$eG*#!SQ!jt!2qmmSq!Dg+6gxIUk69&ZAQDYlGPw45zOB}6EK0{W@< z{(HjC-1K%7xkR0@30aU{ZG~~6GIkVi6LJ<@h;6O{TuYv1@K@<>EVA4fkqmWQjEsHG z-3ZG@R@TGfFXI9ugT~Zi=u;eZSUMMYoOlw}VUgczFj0}~3x6a!Ov@w_XN;@lp#8z5 zi-LweDHBo>#ZUV~M$A~SP54m>dOvNI(%bZb_Cx^lK58LpQO2Bu36Wk04mJ^F9)Du!Fd4c{7zNXOIVS~fLvK%cw+je$FUqZ@fg(iA~0o{40gV= z;T&cDO7cD-=!$*shD=iN%fY|68X}(g*=1dJGVlcy)SFYsjO}_p!LmHKNy5(UOKEF%#4KJrRl3y zP77iyWs8Y7rcWN#s!y%5h1b@aIT|N;64RYy`qiGUIajpa0Uc+5I@yPiamVtp0eQ5Q zR@(@?r+4iSfbOUd}EqQrR z2UX;4^TqzH78QbR!xzH*!Fl!>V|;j-ktf?CruJRwS5eQx7}!UMhpzx5%;qAxBjT9p zO6i0XBCZ|2H4PIQ_?6+%Z*D~=8WPW5{XHjjlXMa|8CXkxzWi}7uC3XT;_}R^jc?ev zYSp!Yh!@>`OZO;r_DM2-hQUQF)alk=?}$D{)4%ToqJp8m=HHz&+un$wjj?y58kaWWO4%aF0G%Lg)XP)<|}0}Rkijl!x%XxR!cc_)e+>zbu&G^D=t#Q zxP$I`G~l$$R)!u=_V#_LBiYBY=3|Jd4(rH@K>mm$=PtQ~qIR)gj$jA4wvKOUyJ1Lk z?dYZfIvRf~vFsWGRyv)W2awR9A^7Yck z`&q?XJ<$j~AK#-=jd_D}&zaQTEGl1Nfv_MORVGLts(lmcl$8G5_8`uupffSSNo0O( z7Hh<6f3-MI^c1>D^j5v^ycywaXwUxc&&zA!(~B0yu^vWQN@D5B_fm=Pk2U7F^ihBquf79G3H%>Exz|A6V^T$7&&n-| zYj;sVvQWOoi{FS`4yg{DQ-1e&-Kcf0EWeP=Z>e-Ub&Ea^9BZqBqwqk_Ud=10JWxXwM~G!OlG= zo!M57XV;h3FpynCnr=vebIk7{K#oDZ+t-_4uJ4v%{IZzv8$)|BWrh=~)^euN{S2%k zD=%OJ;E3s*Z>dyjsw0ItS)zXVuN%fv=M8SBUFfl@k8S(xSYCsShWC_MQgvQ(!_4^d zH$vk}R2>wmQ??!mv@5W@WHlH+=hLZ=o`)c_IqwouL0bwd0gQDR1sB3kO8?HKn-krI zQs|&s*50Su5M-!=tT{tbN8^wybKJOVQ@+q9a`34?5z#hLF0iDHP+m~yiW50~r1k^6 zkAUw??&qI#)B1G56e$&$GjdBD^-G!GFyqpGw>ayBMMfSWB!4d?JuAa^qS|o>1~0YD zp-RFPiXdPll2&G8>b?^YeLf2lhxrsej>zL3-O?8&*#GPJujM1LRezJ#m@@b*VNynk_Llt6^%{*zd+ub1840x?CP?(Tn0HU#zXN z7}jAG4PB@&^|LQlZS-gAQIhQ1z^ZY<8fxLRoeB2B_i2a1-KWwTg%O^5=eBJD0Hq}< zKKtLZ)M(>G4;30{rs2f5IBJpT#V^j)f1-TzF@U=1s>n~)P1kT#gU}B*VbS*eL*x{L zk&Fv6`fj~VJmykM|DWf+xj{vr=Q{^x_ zBXgenz1P?XqkzoAmD8hr9|GmW>=}W4{}p~BC1LX#aP|socHCzk-*R!Hh8uSp&W(+@ zCjBqY-j|as%p0LAf6x(){Kyp!M=yP!eu^CW`&}Ds>I1ywqrf|UBCg&Jf38Tz?XeUN zu`2@1`u8~7eN*Ecgv!_=^Bp!5B6zjYJe{j3zeKJ5$f<8F!C#NwPt5~88g z@a)B2g2#RYhBl*J2lQnMEy^tb5*3@7;){*~E3J@oqP^!oki zK%1;U?ba~G);}97S7!>yx~f3 zKLor{7!T*ha8>foFxdm*n9_v5F@YbGnACm^k!x(|SSwIl>}WO`YqlLlX2b^^jfB@6 zMz6Ubg#YHK==0Sq3d1YXX&A@S5Pkt`uw`pFcc>p++%61tY$0=6Jz z)y6AB(q@IP!7D3R9K}T|bHXT_b~JHLbllV&OfxLaWJV(a)eqH{wRxo9vr2!G zgFgTCNT+IhKY>p@c`rhGpUKKG;VY>Yc&MB|cHJin(oHwn5~o``Q}~NO^4{vH#qaO! z?Uo;ZM*pm!CP;yultY6Rxf^>g>`#Y$=3m|mvpjC zdFSnpzdX4d6+CNdze_nW9T|&tmmCFF(3(9mHzy`?S0!>AU7Do|RLj<_Q6Fv8T38|5 z=c)N5>b{Vw^V-|~t4dDpN))z zjNR}*s4z~xe?r@H&B+5}RdIVSeb0Dqf<2BGE}v7Sc-l9fxS#|`zE z*m2?TAGFduw8Fm2DU?tYCP_&EsXmKQY^>_IQO`Vqh0C*zUil6`8@cot9Oe)b--3tM zmDYnNbs~~4FiCm`mV*tw;5sfp=Jn%b49$6=yLv%S#kd}TXOuz)zunq)#^Mj9n)lbl zv{q;ict|KY_>1)MtCSe}3 z;6+I{MgtGKN@4`uXL^5RrCz(AY`lt$!YcThniW4!R`d-MiT z4E4~24Ih$!5HIZ_tjF41PLUij3D&6?8E8HeETrepYv0H&9YcW=dZcL2xwj;jTL?7?F)Z_X=Xk=nZ9<>!6d~M~fgPZ!FhS!k%;9EnwJIdzus9_Hxm~(FBc0- TWOg=IK3-O2YHCSkDdhhHOp3+W diff --git a/NoisyCircle.ipynb b/NoisyCircle.ipynb deleted file mode 100644 index e5e12c0..0000000 --- a/NoisyCircle.ipynb +++ /dev/null @@ -1,358 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# Topological analysis of a noisy circle\n", - "_Test application for the topological tools_" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "**Imports**" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 13, - "outputs": [], - "source": [ - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "from model import persistence, decoding\n", - "import pandas as pd\n", - "%matplotlib inline" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "**Parameters**" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 2, - "outputs": [], - "source": [ - "N = 20\n", - "R = 1\n", - "SIGMA = 0.1" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "markdown", - "source": [ - "### Generating the circle" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 3, - "outputs": [ - { - "data": { - "text/plain": "(20, 2)" - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "phase = np.linspace(0, 2 * np.pi, N)\n", - "points = np.array([np.cos(phase), np.sin(phase)]).swapaxes(0, 1) * R\n", - "points.shape" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 4, - "outputs": [], - "source": [ - "noise = np.random.normal(scale=SIGMA, size=points.shape)" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 5, - "outputs": [ - { - "data": { - "text/plain": "" - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "

", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "points_no_noise = points\n", - "points += noise" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 9, - "outputs": [ - { - "data": { - "text/plain": "" - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGdCAYAAAAfTAk2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1lElEQVR4nO3df3CU1aH/8c8mQFZt8mhIk11uKUSugjHWktCQxGK1SgiW+KO9ElRSvMNNC7dWEZ0qtTbEmTbFW7W21Fi9WKqhwL0i1YyYGio/dAhESIKNsZTa2ETdNfJrN7RNgsnz/YNv9rLu5ifZze6T92vmmXHPnufJedjZ2Y/nnOccm2mapgAAACwkZrQbAAAAMNIIOAAAwHIIOAAAwHIIOAAAwHIIOAAAwHIIOAAAwHIIOAAAwHIIOAAAwHLGjXYDRkNPT48+/PBDxcfHy2azjXZzAADAIJimqfb2dk2aNEkxMf330YzJgPPhhx9q8uTJo90MAAAwDK2trfrc5z7Xb50xGXDi4+Mlnf4HSkhIGOXWAACAwfB6vZo8ebLvd7w/YzLg9A5LJSQkEHAAAIgyg5lewiRjAABgOQQcAABgOQQcAABgOQQcAABgOQQcAABgOQQcAABgOQQcAABgOQQcAABgOWNyoT8A1tfdY6q2+Zja2juUHG9XVmqiYmPYew4YKwg4ACynqtGl0somuTwdvjKnYVdJQZry052j2DIA4cIQFQBLqWp0aXlFnV+4kSS3p0PLK+pU1egapZYBCCcCDgDL6O4xVVrZJDPIe71lpZVN6u4JVgOAlRBwAFhGbfOxgJ6bM5mSXJ4O1TYfC1+jAIwK5uAAiFhDnSjc1t53uBlOPQDRi4ADICINZ6Jwcrx9UNcebD0A0SukQ1S7d+9WQUGBJk2aJJvNpt/97ncDnrNr1y5lZmbKbrfrwgsv1JNPPhlQZ8uWLUpLS1NcXJzS0tK0devWELQewGgZ7kThrNREOQ27+urjsel0SMpKTRzZBgOIOCENOH//+991+eWXa+3atYOq39zcrOuuu05z5sxRfX29vv/97+vOO+/Uli1bfHVqampUWFiooqIiHTx4UEVFRVq4cKH27dsXqtsAEEZnM1E4NsamkoI0SQoIOb2vSwrSWA8HGANspmmG5XECm82mrVu36sYbb+yzzn333aeXXnpJ77zzjq9s2bJlOnjwoGpqaiRJhYWF8nq9euWVV3x18vPzdcEFF2jjxo2DaovX65VhGPJ4PEpISBjeDQEIiZp3j+qWp/cOWG9jcbZypk0M+h7r4ADWNJTf74iag1NTU6O8vDy/snnz5mndunU6deqUxo8fr5qaGt19990BdX72s5/1ed3Ozk51dnb6Xnu93hFtN4CRMxIThfPTnZqb5mAlY2AMi6iA43a7lZKS4leWkpKiTz75REeOHJHT6eyzjtvt7vO6ZWVlKi0tDUmbAYyskZooHBtj67OHB4D1Rdw6ODab//9h9Y6gnVkerM6ny860atUqeTwe39Ha2jqCLQYwkpgoDGAkRFTAcTgcAT0xbW1tGjdunCZOnNhvnU/36pwpLi5OCQkJfgeAyMREYQAjIaICTk5Ojqqrq/3KXn31Vc2aNUvjx4/vt05ubm7Y2gkgtPLTnSpfnCGH4T8M5TDsKl+cwURhAAMK6RyckydP6i9/+YvvdXNzsxoaGpSYmKjPf/7zWrVqlT744AM9++yzkk4/MbV27VqtXLlSxcXFqqmp0bp16/yejrrrrrt05ZVXas2aNbrhhhv04osvavv27XrjjTdCeSsAwoyJwhiqoa58DWsL6WPiO3fu1NVXXx1QvmTJEq1fv16333673nvvPe3cudP33q5du3T33Xfr7bff1qRJk3Tfffdp2bJlfuc///zz+sEPfqC//vWvmjZtmn70ox/p61//+qDbxWPiAGAtLA0wNgzl9zts6+BEEgIOAFhH78rXn/4x6+27YVjTOoby+x1Rc3AAABiKs1n5GtZGwAEARK3a5mMBe5adyZTk8nSotvlY+BqFiEDAAQBErZFY+RrWRMABAEStkVr5GtZDwAEARC1WvkZfCDgAgKjFytfoCwEHABDVWPkawUTUbuIAAAwHK1/j0wg4AABLiI2xKWfaxNFuBiIEQ1QAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByCDgAAMByxo12AwBI3T2mapuPqa29Q8nxdmWlJio2xjbazQKAqBWWHpwnnnhCqampstvtyszM1Ouvv95n3dtvv102my3guPTSS3111q9fH7ROR0dHOG4HGFFVjS59ec1ruuXpvbprU4NueXqvvrzmNVU1uka7aQAQtUIecDZv3qwVK1bogQceUH19vebMmaP58+erpaUlaP3HH39cLpfLd7S2tioxMVE333yzX72EhAS/ei6XS3a7PdS3A4yoqkaXllfUyeXxD+duT4eWV9QRcgBgmEIecB599FEtXbpU//Ef/6FLLrlEP/vZzzR58mSVl5cHrW8YhhwOh+/Yv3+/jh8/rn//93/3q2ez2fzqORyOUN8KMKK6e0yVVjbJDPJeb1lpZZO6e4LVAAD0J6QBp6urSwcOHFBeXp5feV5envbs2TOoa6xbt07XXnutpkyZ4ld+8uRJTZkyRZ/73Oe0YMEC1dfXj1i7gXCobT4W0HNzJlOSy9Oh2uZj4WsUAFhESCcZHzlyRN3d3UpJSfErT0lJkdvtHvB8l8ulV155Rb/97W/9ymfMmKH169frsssuk9fr1eOPP64rrrhCBw8e1EUXXRRwnc7OTnV2dvpee73eYd4RMHLa2gc3Z2yw9QAA/ycsk4xtNv+nQUzTDCgLZv369Tr//PN14403+pVnZ2dr8eLFuvzyyzVnzhz9z//8jy6++GL94he/CHqdsrIyGYbhOyZPnjzsewFGSnL84OaMDbYeAOD/hDTgJCUlKTY2NqC3pq2tLaBX59NM09QzzzyjoqIiTZgwod+6MTEx+tKXvqTDhw8HfX/VqlXyeDy+o7W1dWg3AoRAVmqinIZdfUV9mySncfqRcQDA0IQ04EyYMEGZmZmqrq72K6+urlZubm6/5+7atUt/+ctftHTp0gH/jmmaamhokNPpDPp+XFycEhIS/A5gtMXG2FRSkCZJASGn93VJQRrr4QDAMIR8iGrlypX67//+bz3zzDN65513dPfdd6ulpUXLli2TdLp35Zvf/GbAeevWrdPs2bOVnp4e8F5paal+//vf669//asaGhq0dOlSNTQ0+K4JRIv8dKfKF2fIYfgPQzkMu8oXZyg/PXhoBwD0L+QrGRcWFuro0aN66KGH5HK5lJ6erm3btvmeinK5XAFr4ng8Hm3ZskWPP/540GueOHFC3/rWt+R2u2UYhmbOnKndu3crKysr1LcDjLj8dKfmpjlYyRgARpDNNM0xt8iG1+uVYRjyeDwMVwEAECWG8vvNZpsAAMBy2GwTCBE20ASA0UPAAUKgqtGl0somv5WKnYZdJQVpTBwGgDBgiAoYYWygCQCjj4ADjCA20ASAyEDAAUYQG2gCQGQg4AAjiA00ASAyEHCAEcQGmgAQGQg4wAhiA00AiAwEHGAEsYEmAEQGAg4wwthAEwBGHwv9ASHABpoAMLoIOECIxMbYlDNt4mg3AwDGJAIOAABRgj3uBo+AAwBAFGCPu6FhkjEAABGOPe6GjoADAEAEY4+74SHgAAAQwdjjbngIOAAARDD2uBseAg4AABGMPe6Gh4ADAEAEY4+74SHgAAAQwdjjbngIOAAARDj2uBs6FvoDACAKsMfd0BBwAACIEuxxN3gMUQEAAMsh4AAAAMsh4AAAAMthDs4IYht7AAAiAwFnhLCNPQAAkYMhqhHANvYAAEQWAs5ZYht7AAAiDwHnLLGNPQAAkScsAeeJJ55Qamqq7Ha7MjMz9frrr/dZd+fOnbLZbAHHn/70J796W7ZsUVpamuLi4pSWlqatW7eG+jaCYht7AAAiT8gDzubNm7VixQo98MADqq+v15w5czR//ny1tLT0e96hQ4fkcrl8x0UXXeR7r6amRoWFhSoqKtLBgwdVVFSkhQsXat++faG+nQBsYw8AQOSxmaYZ0skhs2fPVkZGhsrLy31ll1xyiW688UaVlZUF1N+5c6euvvpqHT9+XOeff37QaxYWFsrr9eqVV17xleXn5+uCCy7Qxo0bB2yT1+uVYRjyeDxKSEgY+k2dobvH1JfXvCa3pyPoPBybTm+G9sZ9X+WRcQAAzsJQfr9D2oPT1dWlAwcOKC8vz688Ly9Pe/bs6ffcmTNnyul06pprrtGOHTv83qupqQm45rx58/q8Zmdnp7xer98xUtjGHgCAyBPSgHPkyBF1d3crJSXFrzwlJUVutzvoOU6nU0899ZS2bNmiF154QdOnT9c111yj3bt3++q43e4hXbOsrEyGYfiOyZMnn+Wd+WMbewAAIktYFvqz2fx7L0zTDCjrNX36dE2fPt33OicnR62trfrpT3+qK6+8cljXXLVqlVauXOl77fV6QxJy2MYeAIDIENKAk5SUpNjY2ICelba2toAemP5kZ2eroqLC99rhcAzpmnFxcYqLixtCy4eHbewBAIgMIR2imjBhgjIzM1VdXe1XXl1drdzc3EFfp76+Xk7n/w3z5OTkBFzz1VdfHdI1AQCAdYV8iGrlypUqKirSrFmzlJOTo6eeekotLS1atmyZpNPDRx988IGeffZZSdLPfvYzTZ06VZdeeqm6urpUUVGhLVu2aMuWLb5r3nXXXbryyiu1Zs0a3XDDDXrxxRe1fft2vfHGG6G+HQAAEAVCHnAKCwt19OhRPfTQQ3K5XEpPT9e2bds0ZcoUSZLL5fJbE6erq0v33nuvPvjgA51zzjm69NJL9fLLL+u6667z1cnNzdWmTZv0gx/8QA8++KCmTZumzZs3a/bs2aG+HQAAEAVCvg5OJBrJdXAAAEB4RMw6OAAAAKOBgAMAACyHgAMAACyHgAMAACyHgAMAACyHgAMAACwnLHtRAQCA0OruMdkP8QwEHAAAolxVo0ullU1yeTp8ZU7DrpKCNOWnO/s507oYogIAIIpVNbq0vKLOL9xIktvToeUVdapqdI1Sy0YXAQcAgCjV3WOqtLJJwbYk6C0rrWxSd8+Y27SAgAMAQLSqbT4W0HNzJlOSy9Oh2uZj4WtUhCDgAAAQpdra+w43w6lnJQQcAACiVHK8fUTrWQkBBwCAKJWVmiinYVdfD4PbdPppqqzUxHA2KyIQcAAAiFKxMTaVFKRJUkDI6X1dUpA2JtfDIeAAABDF8tOdKl+cIYfhPwzlMOwqX5wxZtfBYaE/AACiXH66U3PTHKxkfAYCDgAAFhAbY1POtImj3YyIwRAVAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwnLAEnCeeeEKpqamy2+3KzMzU66+/3mfdF154QXPnztVnP/tZJSQkKCcnR7///e/96qxfv142my3g6OjoCPWtAACAKBDygLN582atWLFCDzzwgOrr6zVnzhzNnz9fLS0tQevv3r1bc+fO1bZt23TgwAFdffXVKigoUH19vV+9hIQEuVwuv8Nut4f6dgAAQBSwmaZphvIPzJ49WxkZGSovL/eVXXLJJbrxxhtVVlY2qGtceumlKiws1A9/+ENJp3twVqxYoRMnTgyrTV6vV4ZhyOPxKCEhYVjXAAAA4TWU3++Q9uB0dXXpwIEDysvL8yvPy8vTnj17BnWNnp4etbe3KzEx0a/85MmTmjJlij73uc9pwYIFAT08Z+rs7JTX6/U7AACAdYU04Bw5ckTd3d1KSUnxK09JSZHb7R7UNR555BH9/e9/18KFC31lM2bM0Pr16/XSSy9p48aNstvtuuKKK3T48OGg1ygrK5NhGL5j8uTJw78pAAAQ8caF44/YbDa/16ZpBpQFs3HjRq1evVovvviikpOTfeXZ2dnKzs72vb7iiiuUkZGhX/ziF/r5z38ecJ1Vq1Zp5cqVvtderzdsIae7x1Rt8zG1tXcoOd6urNRExcYMfO8AAGD4QhpwkpKSFBsbG9Bb09bWFtCr82mbN2/W0qVL9b//+7+69tpr+60bExOjL33pS3324MTFxSkuLm5ojR8BVY0ulVY2yeX5v6e7nIZdJQVpyk93hr09AACMFSEdopowYYIyMzNVXV3tV15dXa3c3Nw+z9u4caNuv/12/fa3v9XXvva1Af+OaZpqaGiQ0xk5oaGq0aXlFXV+4UaS3J4OLa+oU1Wja5RaBgCA9YV8iGrlypUqKirSrFmzlJOTo6eeekotLS1atmyZpNPDRx988IGeffZZSafDzTe/+U09/vjjys7O9vX+nHPOOTIMQ5JUWlqq7OxsXXTRRfJ6vfr5z3+uhoYG/fKXvwz17QxKd4+p0somBXs8zZRkk1Ra2aS5aQ6GqwAACIGQB5zCwkIdPXpUDz30kFwul9LT07Vt2zZNmTJFkuRyufzWxPnVr36lTz75RN/5znf0ne98x1e+ZMkSrV+/XpJ04sQJfetb35Lb7ZZhGJo5c6Z2796trKysUN/OoNQ2HwvouTmTKcnl6VBt8zHlTJsYvoYBADBGhHwdnEgU6nVwXmz4QHdtahiw3uOLvqgbvvgvI/73AQCwoohZB2esSo4f3IrKg60HAACGhoATAlmpiXIadvU1u8am009TZaUm9lEDAACcDQJOCMTG2FRSkCZJASGn93VJQRoTjAEACBECTojkpztVvjhDDsN/GMph2FW+OIN1cAAACKGwrGQ8VuWnOzU3zcFKxgAAhBkBJ8RiY2w8Cg4AQJgxRAUAACyHgAMAACyHgAMAACyHgAMAACyHgAMAACyHgAMAACyHgAMAACyHgAMAACyHgAMAACyHlYwBAMCQdfeYEb0VEQEHAAAMSVWjS6WVTXJ5OnxlTsOukoK0iNlMmiEqAAAwaFWNLi2vqPMLN5Lk9nRoeUWdqhpdo9QyfwQcAAAwKN09pkorm2QGea+3rLSySd09wWqEFwEHAAAMSm3zsYCemzOZklyeDtU2Hwtfo/pAwAEAAIPS1t53uBlOvVAi4AAAgEFJjrePaL1QIuAAAIBByUpNlNOwq6+HwW06/TRVVmpiOJsVFAEHAAAMSmyMTSUFaZIUEHJ6X5cUpEXEejgEHAAAMGj56U6VL86Qw/AfhnIYdpUvzoiYdXBY6A8AAAxJfrpTc9McrGQMAACsJTbGppxpE0e7GX1iiAoAAFgOAQcAAFgOAQcAAFgOc3AAAMCI6e4xI2LyMQEHAACMiKpGl0orm/z2q3IadpUUpIX98fGwDFE98cQTSk1Nld1uV2Zmpl5//fV+6+/atUuZmZmy2+268MIL9eSTTwbU2bJli9LS0hQXF6e0tDRt3bo1VM0HAAADqGp0aXlFXcBmnG5Ph5ZX1Kmq0RXW9oQ84GzevFkrVqzQAw88oPr6es2ZM0fz589XS0tL0PrNzc267rrrNGfOHNXX1+v73/++7rzzTm3ZssVXp6amRoWFhSoqKtLBgwdVVFSkhQsXat++faG+HQAA8CndPaZKK5tkBnmvt6y0skndPcFqhIbNNM2Q/rXZs2crIyND5eXlvrJLLrlEN954o8rKygLq33fffXrppZf0zjvv+MqWLVumgwcPqqamRpJUWFgor9erV155xVcnPz9fF1xwgTZu3Dhgm7xerwzDkMfjUUJCwtncHgAAY17Nu0d1y9N7B6y3sTj7rNbOGcrvd0h7cLq6unTgwAHl5eX5lefl5WnPnj1Bz6mpqQmoP2/ePO3fv1+nTp3qt05f1wQAAKHT1t4xcKUh1BsJIZ1kfOTIEXV3dyslJcWvPCUlRW63O+g5brc7aP1PPvlER44ckdPp7LNOX9fs7OxUZ2en77XX6x3O7QAAgCCS4+0DVxpCvZEQlknGNpv/42GmaQaUDVT/0+VDuWZZWZkMw/AdkydPHlL7AQBA37JSE+U07AE7jPey6fTTVFmpiWFrU0gDTlJSkmJjYwN6Vtra2gJ6YHo5HI6g9ceNG6eJEyf2W6eva65atUoej8d3tLa2DveWAADAp8TG2FRSkCZJASGn93VJQVpY18MJacCZMGGCMjMzVV1d7VdeXV2t3NzcoOfk5OQE1H/11Vc1a9YsjR8/vt86fV0zLi5OCQkJfgcAABg5+elOlS/OkMPwH4ZyGHaVL84I+zo4IV/ob+XKlSoqKtKsWbOUk5Ojp556Si0tLVq2bJmk070rH3zwgZ599llJp5+YWrt2rVauXKni4mLV1NRo3bp1fk9H3XXXXbryyiu1Zs0a3XDDDXrxxRe1fft2vfHGG6G+HQAA0If8dKfmpjnGxkrGhYWFOnr0qB566CG5XC6lp6dr27ZtmjJliiTJ5XL5rYmTmpqqbdu26e6779Yvf/lLTZo0ST//+c/1jW98w1cnNzdXmzZt0g9+8AM9+OCDmjZtmjZv3qzZs2eH+nYAAEA/YmNsZ/Uo+EgJ+To4kYh1cAAAiD4Rsw4OAADAaCDgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyyHgAAAAyxk32g3AyOvuMVXbfExt7R1KjrcrKzVRsTG20W4WAABhQ8CxmKpGl0orm+TydPjKnIZdJQVpyk93jmLLAAAIH4aoLKSq0aXlFXV+4UaS3J4OLa+oU1Wja5RaBgBAeBFwLKK7x1RpZZPMIO/1lpVWNqm7J1gNAACshYBjEbXNxwJ6bs5kSnJ5OlTbfCx8jQIAYJQQcCyirb3vcDOcegAARDMCjkUkx9tHtB4AANGMgGMRWamJchp29fUwuE2nn6bKSk0MZ7MAABgVBByLiI2xqaQgTZICQk7v65KCNNbDAQCMCQQcC8lPd6p8cYYchv8wlMOwq3xxBuvgAADGDBb6s5j8dKfmpjlYyRgAMKYRcCwoNsamnGkTR7sZAACMGoaoAACA5YQ04Bw/flxFRUUyDEOGYaioqEgnTpzos/6pU6d033336bLLLtN5552nSZMm6Zvf/KY+/PBDv3pXXXWVbDab37Fo0aJQ3goAAIgiIQ04t956qxoaGlRVVaWqqio1NDSoqKioz/r/+Mc/VFdXpwcffFB1dXV64YUX9Oc//1nXX399QN3i4mK5XC7f8atf/SqUtwIAAKJIyObgvPPOO6qqqtLevXs1e/ZsSdLTTz+tnJwcHTp0SNOnTw84xzAMVVdX+5X94he/UFZWllpaWvT5z3/eV37uuefK4XCEqvkAACCKhawHp6amRoZh+MKNJGVnZ8swDO3Zs2fQ1/F4PLLZbDr//PP9yjds2KCkpCRdeumluvfee9Xe3t7nNTo7O+X1ev0OAABgXSHrwXG73UpOTg4oT05OltvtHtQ1Ojo6dP/99+vWW29VQkKCr/y2225TamqqHA6HGhsbtWrVKh08eDCg96dXWVmZSktLh3cjAAAg6gy5B2f16tUBE3w/fezfv1+SZLMFrr1immbQ8k87deqUFi1apJ6eHj3xxBN+7xUXF+vaa69Venq6Fi1apOeff17bt29XXV1d0GutWrVKHo/Hd7S2tg71tgEAQBQZcg/OHXfcMeATS1OnTtVbb72ljz76KOC9jz/+WCkpKf2ef+rUKS1cuFDNzc167bXX/HpvgsnIyND48eN1+PBhZWRkBLwfFxenuLi4fq8BAACsY8gBJykpSUlJSQPWy8nJkcfjUW1trbKysiRJ+/btk8fjUW5ubp/n9Yabw4cPa8eOHZo4ceAF695++22dOnVKTidbEQAAgBBOMr7kkkuUn5+v4uJi7d27V3v37lVxcbEWLFjg9wTVjBkztHXrVknSJ598on/7t3/T/v37tWHDBnV3d8vtdsvtdqurq0uS9O677+qhhx7S/v379d5772nbtm26+eabNXPmTF1xxRWhuh0AABBFQroOzoYNG3TZZZcpLy9PeXl5+sIXvqDnnnvOr86hQ4fk8XgkSe+//75eeuklvf/++/riF78op9PpO3qfvJowYYL+8Ic/aN68eZo+fbruvPNO5eXlafv27YqNjQ3l7QAAgChhM03THO1GhJvX65VhGPJ4PAPO7wEAIBp095iW32h5KL/fbLYJAECUq2p0qbSySS5Ph6/MadhVUpCm/PSxOT+VzTYBAIhiVY0uLa+o8ws3kuT2dGh5RZ2qGl2j1LLRRcABACBKdfeYKq1sUrC5Jr1lpZVN6u4Zc7NRCDgAAESr2uZjAT03ZzIluTwdqm0+Fr5GRQgCDgAAUaqtve9wM5x6VkLAAQAgSiXH20e0npUQcAAAiFJZqYlyGnb19TC4TaefpspKTQxnsyICAQcAgCgVG2NTSUGaJAWEnN7XJQVpllsPZzAIOAAARLH8dKfKF2fIYfgPQzkMu8oXZ4zZdXBY6A8AgCiXn+7U3DSH5VcyHgoCDgAAFhAbY1POtImj3YyIwRAVAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwnJAGnOPHj6uoqEiGYcgwDBUVFenEiRP9nnP77bfLZrP5HdnZ2X51Ojs79d3vfldJSUk677zzdP311+v9998P4Z0AAIBoEtKAc+utt6qhoUFVVVWqqqpSQ0ODioqKBjwvPz9fLpfLd2zbts3v/RUrVmjr1q3atGmT3njjDZ08eVILFixQd3d3qG4FAABEkXGhuvA777yjqqoq7d27V7Nnz5YkPf3008rJydGhQ4c0ffr0Ps+Ni4uTw+EI+p7H49G6dev03HPP6dprr5UkVVRUaPLkydq+fbvmzZs38jcDAACiSsh6cGpqamQYhi/cSFJ2drYMw9CePXv6PXfnzp1KTk7WxRdfrOLiYrW1tfneO3DggE6dOqW8vDxf2aRJk5Sent7ndTs7O+X1ev0Oq+nuMVXz7lG92PCBat49qu4ec7SbBADAqAlZD47b7VZycnJAeXJystxud5/nzZ8/XzfffLOmTJmi5uZmPfjgg/rqV7+qAwcOKC4uTm63WxMmTNAFF1zgd15KSkqf1y0rK1NpaenZ3VAEq2p0qbSySS5Ph6/MadhVUpCm/HTnKLYMAIDRMeQenNWrVwdMAv70sX//fkmSzWYLON80zaDlvQoLC/W1r31N6enpKigo0CuvvKI///nPevnll/ttV3/XXbVqlTwej+9obW0dwh1HtqpGl5ZX1PmFG0lyezq0vKJOVY2uUWoZAACjZ8g9OHfccYcWLVrUb52pU6fqrbfe0kcffRTw3scff6yUlJRB/z2n06kpU6bo8OHDkiSHw6Guri4dP37crxenra1Nubm5Qa8RFxenuLi4Qf/NaNHdY6q0sknBBqNMSTZJpZVNmpvmUGxM36ESAACrGXLASUpKUlJS0oD1cnJy5PF4VFtbq6ysLEnSvn375PF4+gwiwRw9elStra1yOk8PtWRmZmr8+PGqrq7WwoULJUkul0uNjY16+OGHh3o7Ua22+VhAz82ZTEkuT4dqm48pZ9rE8DUMAIBRFrJJxpdccony8/NVXFysvXv3au/evSouLtaCBQv8nqCaMWOGtm7dKkk6efKk7r33XtXU1Oi9997Tzp07VVBQoKSkJN10002SJMMwtHTpUt1zzz36wx/+oPr6ei1evFiXXXaZ76mqsaKtve9wM5x6AABYRcgmGUvShg0bdOedd/qeeLr++uu1du1avzqHDh2Sx+ORJMXGxuqPf/yjnn32WZ04cUJOp1NXX321Nm/erPj4eN85jz32mMaNG6eFCxfqn//8p6655hqtX79esbGxobydiJMcbx/RegAAWIXNNM0x9zyx1+uVYRjyeDxKSEgY7eYMW3ePqS+veU1uT0fQeTg2SQ7Drjfu+ypzcAAAUW8ov9/sRRXFYmNsKilIk3Q6zJyp93VJQRrhBgAw5hBwolx+ulPlizPkMPyHoRyGXeWLM1gHBwAwJoV0Dg7CIz/dqblpDtU2H1Nbe4eS4+3KSk2k5wYAMGYRcCwiNsbGo+AAAPx/DFEBAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLIeAAAADLYTdxjIjuHlO1zcfU1t6h5Hi7slITFRtjG+1mAQDGKAIOzlpVo0ullU1yeTp8ZU7DrpKCNOWnO0exZQCAsYohKpyVqkaXllfU+YUbSXJ7OrS8ok5Vja5RahkAYCwj4GDYuntMlVY2yQzyXm9ZaWWTunuC1QAAIHQIOBi22uZjAT03ZzIluTwdqm0+Fr5GAQAgAg7OQlt73+FmOPUAABgpBBwMW3K8fUTrAQAwUgg4GLas1EQ5Dbv6ehjcptNPU2WlJoazWQAAEHAwfLExNpUUpElSQMjpfV1SkMZ6OACAsCPg4KzkpztVvjhDDsN/GMph2FW+OIN1cAAAo4KF/nDW8tOdmpvmYCVjAEDEIOBgRMTG2JQzbeJoNwMAAEkMUQEAAAsi4AAAAMthiAoAgAjU3WMyt/EsEHAAAIgwVY0ulVY2+W2H4zTsKilI4+nUQQrpENXx48dVVFQkwzBkGIaKiop04sSJfs+x2WxBj//6r//y1bnqqqsC3l+0aFEobwUAgLCoanRpeUVdwF5/bk+HllfUqarRNUotiy4hDTi33nqrGhoaVFVVpaqqKjU0NKioqKjfc1wul9/xzDPPyGaz6Rvf+IZfveLiYr96v/rVr0J5KwAAhFx3j6nSyiaZQd7rLSutbFJ3T7AaOFPIhqjeeecdVVVVae/evZo9e7Yk6emnn1ZOTo4OHTqk6dOnBz3P4XD4vX7xxRd19dVX68ILL/QrP/fccwPqAgAQzWqbjwX03JzJlOTydKi2+RhLcwwgZD04NTU1MgzDF24kKTs7W4ZhaM+ePYO6xkcffaSXX35ZS5cuDXhvw4YNSkpK0qWXXqp7771X7e3tfV6ns7NTXq/X7wAAINK0tfcdboZTbywLWQ+O2+1WcnJyQHlycrLcbvegrvGb3/xG8fHx+vrXv+5Xfttttyk1NVUOh0ONjY1atWqVDh48qOrq6qDXKSsrU2lp6dBvAgCAMEqOtw9caQj1xrIh9+CsXr26z4nAvcf+/fslnZ4w/GmmaQYtD+aZZ57RbbfdJrvd/4MsLi7Wtddeq/T0dC1atEjPP/+8tm/frrq6uqDXWbVqlTwej+9obW0d4l0DABB6WamJchr2gA2Me9l0+mmqrNTEcDYrKg25B+eOO+4Y8ImlqVOn6q233tJHH30U8N7HH3+slJSUAf/O66+/rkOHDmnz5s0D1s3IyND48eN1+PBhZWRkBLwfFxenuLi4Aa8DAMBoio2xqaQgTcsr6mST/CYb94aekoI01sMZhCEHnKSkJCUlJQ1YLycnRx6PR7W1tcrKypIk7du3Tx6PR7m5uQOev27dOmVmZuryyy8fsO7bb7+tU6dOyelkbQAAQHTLT3eqfHFGwDo4DtbBGRKbaZohe9Zs/vz5+vDDD32PcH/rW9/SlClTVFlZ6aszY8YMlZWV6aabbvKVeb1eOZ1OPfLII1q2bJnfNd99911t2LBB1113nZKSktTU1KR77rlH55xzjt58803FxsYO2C6v1yvDMOTxeJSQkDBCdwsAwMhhJeNAQ/n9DulKxhs2bNCdd96pvLw8SdL111+vtWvX+tU5dOiQPB6PX9mmTZtkmqZuueWWgGtOmDBBf/jDH/T444/r5MmTmjx5sr72ta+ppKRkUOEGAIBoEBtj41HwsxDSHpxIRQ8OAADRZyi/3+wmDgAALIeAAwAALIfdxAEAg8KkV0QTAg4AYEBVja6Ax5adPLaMCMYQFQCgX1WNLi2vqAvYBNLt6dDyijpVNbpGqWVA3wg4AIA+dfeYKq1sUrDHbXvLSiub1N0z5h7IRYQj4AAA+lTbfCyg5+ZMpiSXp0O1zcfC1yhgEJiDA2DUMXk1crW19x1uhlMPCBcCDoBRxeTVyJYcbx/RekC4MEQFYNQweTXyZaUmymnY1Vd/mk2nA2lWamI4mwUMiIADYFQweTU6xMbYVFKQJkkBIaf3dUlBGkOKiDgEHACjYqxMXu3uMVXz7lG92PCBat49GpWBLT/dqfLFGXIY/sNQDsOu8sUZDCUiIjEHB8CoGAuTV600vyg/3am5aQ4mgyNqEHAAjAqrT17tnV/06f6a3vlF0djzERtjU860iaPdDGBQGKICooAVhjk+zcqTV5lfBIw+enCACGelYY4z9U5eXV5RJ5vkFwaiffLqUOYX0SMChAY9OEAEs/pj1FadvDoW5hcBkY4eHCBCDTTMYdPpYY65aY6o7OXoZcXJq1afXwREAwIOEKHG0jCH1Sav9s4vcns6ggZUm073UkXj/CIgWjBEBUQohjmiF4vjAaOPgANEKIY5optV5xcB0YIhKiBCMcwR/aw4vwiIFgQcIEJZ+THqscRq84uAaMEQFRDBGOYAgOGhBweIcAxzAMDQEXCAKMAwBwAMDUNUAADAcgg4AADAcgg4AADAcgg4AADAcgg4AADAcgg4AADAckIacH70ox8pNzdX5557rs4///xBnWOaplavXq1JkybpnHPO0VVXXaW3337br05nZ6e++93vKikpSeedd56uv/56vf/++yG4AwAAEI1CGnC6urp08803a/ny5YM+5+GHH9ajjz6qtWvX6s0335TD4dDcuXPV3t7uq7NixQpt3bpVmzZt0htvvKGTJ09qwYIF6u7uDsVtAACAKGMzTTPYPn4jav369VqxYoVOnDjRbz3TNDVp0iStWLFC9913n6TTvTUpKSlas2aNvv3tb8vj8eizn/2snnvuORUWFkqSPvzwQ02ePFnbtm3TvHnzBmyP1+uVYRjyeDxKSEg46/sDAAChN5Tf74haybi5uVlut1t5eXm+sri4OH3lK1/Rnj179O1vf1sHDhzQqVOn/OpMmjRJ6enp2rNnT9CA09nZqc7OTt9rj8cj6fQ/FAAAiA69v9uD6ZuJqIDjdrslSSkpKX7lKSkp+tvf/uarM2HCBF1wwQUBdXrP/7SysjKVlpYGlE+ePHkkmg0AAMKovb1dhmH0W2fIAWf16tVBw8KZ3nzzTc2aNWuol/ax2fw3ETRNM6Ds0/qrs2rVKq1cudL3uqenR8eOHdPEiRMHvO5weL1eTZ48Wa2trQyBRQk+s+jE5xad+NyiT6R8ZqZpqr29XZMmTRqw7pADzh133KFFixb1W2fq1KlDvawkyeFwSDrdS+N0On3lbW1tvl4dh8Ohrq4uHT9+3K8Xp62tTbm5uUGvGxcXp7i4OL+ywT7VdTYSEhL48kYZPrPoxOcWnfjcok8kfGYD9dz0GnLASUpKUlJS0pAbNBipqalyOByqrq7WzJkzJZ1+EmvXrl1as2aNJCkzM1Pjx49XdXW1Fi5cKElyuVxqbGzUww8/HJJ2AQCA6BLSOTgtLS06duyYWlpa1N3drYaGBknSv/7rv+ozn/mMJGnGjBkqKyvTTTfdJJvNphUrVujHP/6xLrroIl100UX68Y9/rHPPPVe33nqrpNPJbenSpbrnnns0ceJEJSYm6t5779Vll12ma6+9NpS3AwAAokRIA84Pf/hD/eY3v/G97u2V2bFjh6666ipJ0qFDh3xPNUnS9773Pf3zn//Uf/7nf+r48eOaPXu2Xn31VcXHx/vqPPbYYxo3bpwWLlyof/7zn7rmmmu0fv16xcbGhvJ2Bi0uLk4lJSUBw2KIXHxm0YnPLTrxuUWfaPzMwrIODgAAQDixFxUAALAcAg4AALAcAg4AALAcAg4AALAcAs4I+dGPfqTc3Fyde+65g15E0DRNrV69WpMmTdI555yjq666Sm+//XZoGwqf48ePq6ioSIZhyDAMFRUVDbgh7O233y6bzeZ3ZGdnh6fBY9QTTzyh1NRU2e12ZWZm6vXXX++3/q5du5SZmSm73a4LL7xQTz75ZJhail5D+cx27twZ8J2y2Wz605/+FMYWY/fu3SooKNCkSZNks9n0u9/9bsBzIv27RsAZIV1dXbr55pu1fPnyQZ/z8MMP69FHH9XatWv15ptvyuFwaO7cuWpvbw9hS9Hr1ltvVUNDg6qqqlRVVaWGhgYVFRUNeF5+fr5cLpfv2LZtWxhaOzZt3rxZK1as0AMPPKD6+nrNmTNH8+fPV0tLS9D6zc3Nuu666zRnzhzV19fr+9//vu68805t2bIlzC0fu4b6mfU6dOiQ3/fqoosuClOLIUl///vfdfnll2vt2rWDqh8V3zUTI+rXv/61aRjGgPV6enpMh8Nh/uQnP/GVdXR0mIZhmE8++WQIWwjTNM2mpiZTkrl3715fWU1NjSnJ/NOf/tTneUuWLDFvuOGGMLQQpmmaWVlZ5rJly/zKZsyYYd5///1B63/ve98zZ8yY4Vf27W9/28zOzg5ZG+FvqJ/Zjh07TEnm8ePHw9A6DIYkc+vWrf3WiYbvGj04o6S5uVlut1t5eXm+sri4OH3lK1/Rnj17RrFlY0NNTY0Mw9Ds2bN9ZdnZ2TIMY8B//507dyo5OVkXX3yxiouL1dbWFurmjkldXV06cOCA33dEkvLy8vr8jGpqagLqz5s3T/v379epU6dC1lacNpzPrNfMmTPldDp1zTXXaMeOHaFsJkZANHzXCDijxO12S5JvE9FeKSkpvvcQOm63W8nJyQHlycnJ/f77z58/Xxs2bNBrr72mRx55RG+++aa++tWvqrOzM5TNHZOOHDmi7u7uIX1H3G530PqffPKJjhw5ErK24rThfGZOp1NPPfWUtmzZohdeeEHTp0/XNddco927d4ejyRimaPiuhXSrhmi3evVqlZaW9lvnzTff1KxZs4b9N2w2m99r0zQDyjB4g/3MpMB/e2ngf//CwkLff6enp2vWrFmaMmWKXn75ZX39618fZqvRn6F+R4LVD1aO0BnKZzZ9+nRNnz7d9zonJ0etra366U9/qiuvvDKk7cTZifTvGgGnH3fccYcWLVrUb52pU6cO69oOh0PS6RTsdDp95W1tbQGpGIM32M/srbfe0kcffRTw3scffzykf3+n06kpU6bo8OHDQ24r+peUlKTY2NiA//Pv7zvicDiC1h83bpwmTpwYsrbitOF8ZsFkZ2eroqJipJuHERQN3zUCTj+SkpKUlJQUkmunpqbK4XCourratwlpV1eXdu3apTVr1oTkb44Fg/3McnJy5PF4VFtbq6ysLEnSvn375PF4lJubO+i/d/ToUbW2tvqFVIyMCRMmKDMzU9XV1brpppt85dXV1brhhhuCnpOTk6PKykq/sldffVWzZs3S+PHjQ9peDO8zC6a+vp7vVISLiu/aaM5wtpK//e1vZn19vVlaWmp+5jOfMevr6836+nqzvb3dV2f69OnmCy+84Hv9k5/8xDQMw3zhhRfMP/7xj+Ytt9xiOp1O0+v1jsYtjDn5+fnmF77wBbOmpsasqakxL7vsMnPBggV+dc78zNrb28177rnH3LNnj9nc3Gzu2LHDzMnJMf/lX/6FzyxENm3aZI4fP95ct26d2dTUZK5YscI877zzzPfee880TdO8//77zaKiIl/9v/71r+a5555r3n333WZTU5O5bt06c/z48ebzzz8/Wrcw5gz1M3vsscfMrVu3mn/+85/NxsZG8/777zclmVu2bBmtWxiT2tvbfb9bksxHH33UrK+vN//2t7+Zphmd3zUCzghZsmSJKSng2LFjh6+OJPPXv/6173VPT49ZUlJiOhwOMy4uzrzyyivNP/7xj+Fv/Bh19OhR87bbbjPj4+PN+Ph487bbbgt4VPXMz+wf//iHmZeXZ372s581x48fb37+8583lyxZYra0tIS/8WPIL3/5S3PKlCnmhAkTzIyMDHPXrl2+95YsWWJ+5Stf8au/c+dOc+bMmeaECRPMqVOnmuXl5WFuMYbyma1Zs8acNm2aabfbzQsuuMD88pe/bL788suj0Oqxrfdx/U8fS5YsMU0zOr9rNtP8/7OCAAAALILHxAEAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOX8P4fEjUwQeym8AAAAAElFTkSuQmCC\n" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.scatter(points[:, 0], points[:, 1])" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 8, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "persistence.persistence(points)" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 14, - "outputs": [], - "source": [ - "dataset = pd.DataFrame(points, columns=['x', 'y'])" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 7, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "persistence.persistence(points_no_noise)" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 15, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Decoding... done\n" - ] - }, - { - "data": { - "text/plain": "(20, 1)" - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param = decoding.cohomological_parameterization(dataset)\n", - "param.shape" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 19, - "outputs": [ - { - "data": { - "text/plain": "Text(0, 0.5, 'Cohomological parameter')" - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": "
", - "image/png": "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\n" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(np.roll(np.arctan2(points[:, 0], points[:, 1]), 5), np.roll(param, 5))\n", - "plt.xlabel('Phase')\n", - "plt.ylabel('Cohomological parameter')" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/TestInteractivity.ipynb b/TestInteractivity.ipynb deleted file mode 100644 index 7d2c09e..0000000 --- a/TestInteractivity.ipynb +++ /dev/null @@ -1,311 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "outputs": [ - { - "data": { - "text/plain": "", - "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * https://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "", - "text/html": "
" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "interactive(children=(FloatSlider(value=1.0, description='w', max=3.0, min=-1.0), Output()), _dom_classes=('wi…", - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "fa96235a53da4c98bb4bbef6541cd4ca" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib notebook\n", - "from ipywidgets import *\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "x = np.linspace(0, 2 * np.pi)\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(1, 1, 1)\n", - "line, = ax.plot(x, np.sin(x))\n", - "\n", - "def update(w = 1.0):\n", - " line.set_ydata(np.sin(w * x))\n", - " # fig.plot(x, np.sin(w * x))\n", - " fig.canvas.draw_idle()\n", - "\n", - "interact(update);" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 3, - "outputs": [], - "source": [ - "import seaborn as sns\n", - "import matplotlib.pyplot as plt\n", - "mpg = sns.load_dataset('mpg')\n", - "def f(x):\n", - " img = sns.countplot(mpg[mpg['mpg']" - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "interact(f, x=20)" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 4, - "outputs": [ - { - "data": { - "text/plain": "", - "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * https://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "", - "text/html": "
" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots()\n", - "img = ax.imshow([[0, 1], [2, 3]])" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 5, - "outputs": [], - "source": [ - "img?" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 8, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'list' object has no attribute 'items'", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mAttributeError\u001B[0m Traceback (most recent call last)", - "Input \u001B[0;32mIn [8]\u001B[0m, in \u001B[0;36m\u001B[0;34m()\u001B[0m\n\u001B[0;32m----> 1\u001B[0m \u001B[43mimg\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mupdate\u001B[49m\u001B[43m(\u001B[49m\u001B[43m[\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;241;43m0\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m1\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;241;43m2\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m5\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m]\u001B[49m\u001B[43m)\u001B[49m\n", - "File \u001B[0;32m/usr/lib/python3.10/site-packages/matplotlib/artist.py:1056\u001B[0m, in \u001B[0;36mArtist.update\u001B[0;34m(self, props)\u001B[0m\n\u001B[1;32m 1054\u001B[0m ret \u001B[38;5;241m=\u001B[39m []\n\u001B[1;32m 1055\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m cbook\u001B[38;5;241m.\u001B[39m_setattr_cm(\u001B[38;5;28mself\u001B[39m, eventson\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m):\n\u001B[0;32m-> 1056\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m k, v \u001B[38;5;129;01min\u001B[39;00m \u001B[43mprops\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mitems\u001B[49m():\n\u001B[1;32m 1057\u001B[0m \u001B[38;5;66;03m# Allow attributes we want to be able to update through\u001B[39;00m\n\u001B[1;32m 1058\u001B[0m \u001B[38;5;66;03m# art.update, art.set, setp.\u001B[39;00m\n\u001B[1;32m 1059\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m k \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124maxes\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[1;32m 1060\u001B[0m ret\u001B[38;5;241m.\u001B[39mappend(\u001B[38;5;28msetattr\u001B[39m(\u001B[38;5;28mself\u001B[39m, k, v))\n", - "\u001B[0;31mAttributeError\u001B[0m: 'list' object has no attribute 'items'" - ] - } - ], - "source": [ - "img.update([[0, 1], [2, 5]])" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 10, - "outputs": [ - { - "data": { - "text/plain": "['_A',\n '_PROPERTIES_EXCLUDED_FROM_SET',\n '__class__',\n '__delattr__',\n '__dict__',\n '__dir__',\n '__doc__',\n '__eq__',\n '__format__',\n '__ge__',\n '__getattribute__',\n '__getstate__',\n '__gt__',\n '__hash__',\n '__init__',\n '__init_subclass__',\n '__le__',\n '__lt__',\n '__module__',\n '__ne__',\n '__new__',\n '__reduce__',\n '__reduce_ex__',\n '__repr__',\n '__setattr__',\n '__sizeof__',\n '__str__',\n '__subclasshook__',\n '__weakref__',\n '_agg_filter',\n '_alpha',\n '_animated',\n '_axes',\n '_callbacks',\n '_check_unsampled_image',\n '_clipon',\n '_clippath',\n '_cm_set',\n '_default_contains',\n '_extent',\n '_filternorm',\n '_filterrad',\n '_get_clipping_extent_bbox',\n '_get_scalar_alpha',\n '_gid',\n '_id_norm',\n '_imcache',\n '_in_layout',\n '_interpolation',\n '_interpolation_stage',\n '_label',\n '_make_image',\n '_mouseover',\n '_norm',\n '_path_effects',\n '_picker',\n '_rasterized',\n '_remove_method',\n '_resample',\n '_rgbacache',\n '_scale_norm',\n '_set_alpha_for_array',\n '_set_gc_clip',\n '_sketch',\n '_snap',\n '_stale',\n '_sticky_edges',\n '_transform',\n '_transformSet',\n '_update_set_signature_and_docstring',\n '_url',\n '_visible',\n 'add_callback',\n 'autoscale',\n 'autoscale_None',\n 'axes',\n 'callbacks',\n 'callbacksSM',\n 'can_composite',\n 'changed',\n 'clipbox',\n 'cmap',\n 'colorbar',\n 'contains',\n 'convert_xunits',\n 'convert_yunits',\n 'draw',\n 'figure',\n 'findobj',\n 'format_cursor_data',\n 'get_agg_filter',\n 'get_alpha',\n 'get_animated',\n 'get_array',\n 'get_children',\n 'get_clim',\n 'get_clip_box',\n 'get_clip_on',\n 'get_clip_path',\n 'get_cmap',\n 'get_cursor_data',\n 'get_extent',\n 'get_figure',\n 'get_filternorm',\n 'get_filterrad',\n 'get_gid',\n 'get_in_layout',\n 'get_interpolation',\n 'get_label',\n 'get_path_effects',\n 'get_picker',\n 'get_rasterized',\n 'get_resample',\n 'get_size',\n 'get_sketch_params',\n 'get_snap',\n 'get_tightbbox',\n 'get_transform',\n 'get_transformed_clip_path_and_affine',\n 'get_url',\n 'get_visible',\n 'get_window_extent',\n 'get_zorder',\n 'have_units',\n 'is_transform_set',\n 'make_image',\n 'mouseover',\n 'norm',\n 'origin',\n 'pchanged',\n 'pick',\n 'pickable',\n 'properties',\n 'remove',\n 'remove_callback',\n 'set',\n 'set_agg_filter',\n 'set_alpha',\n 'set_animated',\n 'set_array',\n 'set_clim',\n 'set_clip_box',\n 'set_clip_on',\n 'set_clip_path',\n 'set_cmap',\n 'set_data',\n 'set_extent',\n 'set_figure',\n 'set_filternorm',\n 'set_filterrad',\n 'set_gid',\n 'set_in_layout',\n 'set_interpolation',\n 'set_interpolation_stage',\n 'set_label',\n 'set_norm',\n 'set_path_effects',\n 'set_picker',\n 'set_rasterized',\n 'set_resample',\n 'set_sketch_params',\n 'set_snap',\n 'set_transform',\n 'set_url',\n 'set_visible',\n 'set_zorder',\n 'stale',\n 'stale_callback',\n 'sticky_edges',\n 'to_rgba',\n 'update',\n 'update_from',\n 'write_png',\n 'zorder']" - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(img)" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 11, - "outputs": [], - "source": [ - "img.set_data?" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 14, - "outputs": [], - "source": [ - "img.set_data([[0, 1], [2, 2]])" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 15, - "outputs": [], - "source": [ - "fig.canvas.draw_idle()" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 16, - "outputs": [ - { - "data": { - "text/plain": "matplotlib.image.AxesImage" - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(img)" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/TuningCurvesFull.ipynb b/TuningCurvesFull.ipynb deleted file mode 100644 index c7ca555..0000000 --- a/TuningCurvesFull.ipynb +++ /dev/null @@ -1,560 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "# Tuning Curves" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "**Import everything**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "%matplotlib notebook\n", - "import typing\n", - "\n", - "import matplotlib as mpl\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import ipywidgets as widgets\n", - "import sympy as sp\n", - "sp.init_printing()\n", - "AxOrImg = typing.Union[mpl.axes.Axes, mpl.image.AxesImage]" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "k, x0, y0, phi, theta, sigma_x, sigma_y, sigma, x, y = sp.symbols(r'k x_0 y_0 \\phi \\theta \\sigma_x \\sigma_y \\sigma x y')\n", - "defaults = {\n", - " k: 6,\n", - " sigma: 0.2,\n", - " phi: sp.pi / 2,\n", - " theta: 0,\n", - " sigma: 1,\n", - " x0: 0, y0: 0\n", - "}\n", - "sigma_x = sigma_y = sigma" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### Formulas" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": "cos(\\phi + k⋅(x - x₀)⋅cos(\\theta) + k⋅(y - y₀)⋅sin(\\theta))", - "image/png": "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\n", - "text/latex": "$\\displaystyle \\cos{\\left(\\phi + k \\left(x - x_{0}\\right) \\cos{\\left(\\theta \\right)} + k \\left(y - y_{0}\\right) \\sin{\\left(\\theta \\right)} \\right)}$" - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grating_f = sp.cos(k * (x - x0) * sp.cos(theta) + k * (y - y0) * sp.sin(theta) + phi)\n", - "receptive_field = 1 / (2 * sp.pi * sigma * sigma) * sp.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2)) * sp.cos(k * x * sp.cos(theta) + k * y * sp.sin(theta) + phi)\n", - "receptive_field = receptive_field.subs(theta, 0).subs(phi, 0)\n", - "grating_f" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": " 2 2 \n - x - y \n ───────── \n 2 \n 2⋅\\sigma \nℯ ⋅cos(k⋅x)\n───────────────────\n 2 \n 2⋅π⋅\\sigma ", - "image/png": "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\n", - "text/latex": "$\\displaystyle \\frac{e^{\\frac{- x^{2} - y^{2}}{2 \\sigma^{2}}} \\cos{\\left(k x \\right)}}{2 \\pi \\sigma^{2}}$" - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "receptive_field" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "int1 = sp.Integral(grating_f * receptive_field, (x, -1, 1), (y, -1, 1)).subs(defaults)\n", - "# int1.evalf(2).doit()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": " 2 ⎛ 2 ⎞ \n k ⋅⎝cos (\\theta) + 1⎠ \n ───────────────────── \n 2 ⎛ \nℯ ⋅cos(\\phi - k⋅(x₀⋅cos(\\theta) + y₀⋅sin(\\theta)))⋅cosh⎝\\s\n\n \n \n \n 2 2 ⎞\nigma ⋅k ⋅cos(\\theta)⎠", - "image/png": "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\n", - "text/latex": "$\\displaystyle e^{\\frac{k^{2} \\left(\\cos^{2}{\\left(\\theta \\right)} + 1\\right)}{2}} \\cos{\\left(\\phi - k \\left(x_{0} \\cos{\\left(\\theta \\right)} + y_{0} \\sin{\\left(\\theta \\right)}\\right) \\right)} \\cosh{\\left(\\sigma^{2} k^{2} \\cos{\\left(\\theta \\right)} \\right)}$" - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# p = sp.cos(phi) * sp.cos(k*x0*sp.cos(theta) + k*y0*sp.sin(theta)) * sp.exp(k**2 * (sigma_x **2 * (1 + sp.cos(theta))**2 + sigma_y**2 * sp.sin(theta) **2) / 2)\n", - "p = sp.cosh(k**2 * sigma**2 * sp.cos(theta)) * sp.exp(k ** 2 * (1 + sp.cos(theta) ** 2) / 2) * sp.cos(phi - k * (x0 * sp.cos(theta) + y0 * sp.sin(theta)))\n", - "p" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### Plot stuff" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "def get_orientation_phase_grid(step_phase: float, step_orientation: float) -> np.ndarray:\n", - " \"\"\"\n", - " Returns a grid of x and y values for plotting.\n", - " :param step_phase: step for the phase (phi) - in degrees\n", - " :param step_orientation: step for the orientation (theta) - in degrees\n", - " :return: numpy array of shape (n_orientation, n_phase). Each element is a tuple (theta, phi)\n", - " \"\"\"\n", - " # phase <-> phi\n", - " # orientation <-> theta\n", - " step_phase *= np.pi / 180\n", - " step_orientation *= np.pi / 180\n", - " phi = np.arange(0, 2 * np.pi, step_phase)\n", - " theta = np.arange(0, np.pi, step_orientation)\n", - " return np.array(np.meshgrid(theta, phi)).T.reshape(-1, len(phi), 2)\n", - "\n", - "\n", - "def get_spatial_grid(step_x: float, step_y: float, size: float = 1) -> np.ndarray:\n", - " \"\"\"\n", - " Returns a grid of x and y values for plotting.\n", - " :param step_x: step for the x-coordinate\n", - " :param step_y: step for the y-coordinate\n", - " :param size: size of the grid\n", - " :return: numpy array of shape (2 * size / step_x, 2 * size / step_y). Each element is a tuple (x, y)\n", - " \"\"\"\n", - " x = np.arange(-size, size, step_x)\n", - " y = np.arange(-size, size, step_y)\n", - " return np.array(np.meshgrid(x, y)).T.reshape(-1, len(x), 2)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "def eval_func(func: sp.Expr, sub_1: sp.Expr, sub_2: sp.Expr, grid: np.ndarray) -> np.ndarray:\n", - " # return np.array([[float(func.subs(sub_1, x_).subs(sub_2, y_)) for x_, y_ in line] for line in grid])\n", - " func = sp.lambdify([sub_1, sub_2], func, 'numpy')\n", - " return func(grid[:, :, 0], grid[:, :, 1])\n", - "\n", - "def plot_spatial(func: sp.Expr, ax: AxOrImg, step_x: float = 0.05, step_y: float = 0.05, size: float = 1, title: str = None, show: bool = False,\n", - " patch: typing.Optional[typing.Tuple[float, float, float]] = None\n", - " ):\n", - " \"\"\"\n", - " Plots a spatial map of the function.\n", - "\n", - " :param func: function to plot\n", - " :param ax: axes to plot on or the image on axes\n", - " :param step_x: step for the x-coordinate\n", - " :param step_y: step for the y-coordinate\n", - " :param size: size of the grid\n", - " :param title: title of the plot\n", - " :param show: whether to show the plot\n", - " :param patch: optional circle to plot - a tuple (x, y, radius)\n", - " \"\"\"\n", - " grid = get_spatial_grid(step_x, step_y, size)\n", - " image: np.ndarray = eval_func(func, x, y, grid)\n", - " if isinstance(ax, mpl.image.AxesImage):\n", - " ax.set_data(image)\n", - " return ax\n", - " img = ax.imshow(image, extent=[-size, size, -size, size], vmin=-size, vmax=size, cmap='gray')\n", - " ax.invert_yaxis()\n", - " if patch is not None:\n", - " ax.add_patch(plt.Circle(patch[:2], radius=patch[2], color='b', fill=False))\n", - " ax.set_title(title)\n", - " if show:\n", - " plt.show()\n", - " return img\n", - "\n", - "def normalize(img):\n", - " return (img - img.min()) / (img.max() - img.min())\n", - "\n", - "def plot_tuning_curve(func: typing.Union[sp.Expr, typing.Callable], ax: AxOrImg, step_phase: float = 20, step_orientation: float = 15, title: str = None, show: bool = False):\n", - " \"\"\"\n", - " Plots a tuning curve of the function.\n", - "\n", - " :param func: function to plot - sympy or a function of (theta, phi)\n", - " :param ax: axes to plot on or image to update\n", - " :param step_phase: step for the phase (phi) - in degrees\n", - " :param step_orientation: step for the orientation (theta) - in degrees\n", - " :param title: title of the plot\n", - " :param show: whether to show the plot\n", - " \"\"\"\n", - " grid = get_orientation_phase_grid(step_phase, step_orientation)\n", - " if isinstance(func, sp.Expr):\n", - " image: np.ndarray = eval_func(func, theta, phi, grid)\n", - " else:\n", - " image = np.array([[func(theta_val, phi_val) for theta_val, phi_val in line] for line in grid])\n", - " image = normalize(image)\n", - " if isinstance(ax, mpl.image.AxesImage):\n", - " ax.set_data(image)\n", - " return ax\n", - " img = ax.imshow(image, extent=[0, 360, 0, 180], cmap='viridis')\n", - " ax.set_title(title)\n", - " if show:\n", - " plt.show()\n", - " return img" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "def plot_gratings(ax: typing.Union[plt.Axes, mpl.image.AxesImage], k_val: float, phi_val: float, theta_val: float, x0_val: float = 0, y0_val: float = 0):\n", - " phi_val *= np.pi / 180\n", - " theta_val *= np.pi / 180\n", - " return plot_spatial(\n", - " # grating_f.evalf(subs={k: k_val, x0: x0_val, y0: y0_val, theta: theta_val, phi: phi_val}),\n", - " grating_f.subs(k, k_val).subs(x0, x0_val).subs(y0, y0_val).subs(theta, theta_val).subs(phi, phi_val),\n", - " ax, step_x=0.05, step_y=0.05, size=1, title='Grating', show=False)\n", - "\n", - "def plot_receptive_field(ax: plt.Axes, k_val: float, phi_val: float, theta_val: float, sigma_val: float = 1):\n", - " phi_val *= np.pi / 180\n", - " theta_val *= np.pi / 180\n", - " return plot_spatial(\n", - " receptive_field.subs(k, k_val).subs(theta, theta_val).subs(phi, phi_val).subs(sigma, sigma_val),\n", - " ax, step_x=0.05, step_y=0.05, size=1, title='Receptive field', show=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "def get_value(k_val: float = defaults[k], phi_val: float = 90, theta_val: float = 0, x0_val: float = 0, y0_val: float = 0, sigma_val: float = defaults[sigma]):\n", - " phi_val *= np.pi / 180\n", - " theta_val *= np.pi / 180\n", - " grid_size = 0.05\n", - " grid = get_spatial_grid(grid_size, grid_size, 1)\n", - " subs = {\n", - " k: k_val,\n", - " x0: x0_val,\n", - " y0: y0_val,\n", - " theta: theta_val,\n", - " phi: phi_val,\n", - " sigma: sigma_val\n", - " }\n", - " grating_img = eval_func(grating_f.subs(subs), x, y, grid)\n", - " rf_img = eval_func(receptive_field.subs(subs), x, y, grid)\n", - " return np.sum(grating_img * rf_img) * grid_size ** 2" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": "", - "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * https://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "", - "text/html": "
" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "interactive(children=(FloatSlider(value=6.0, description='k', max=10.0, step=0.2), FloatSlider(value=90.0, des…", - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "aba71ad883fd429f9b2bac9e1ba7f917" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1, 3)\n", - "img_gr = plot_gratings(ax[0], defaults[k], 90, 0, 0, 0)\n", - "img_rf = plot_receptive_field(ax[1], defaults[k], 90, 90, defaults[sigma])\n", - "val = get_value()\n", - "line = ax[2].plot([val, val])[0]\n", - "ax[2].set(ylim=[-0.2, 0.2])\n", - "\n", - "@widgets.interact(\n", - " k_val=widgets.FloatSlider(min=0, max=10, step=0.2, value=defaults[k], description='k'),\n", - " phi_val=widgets.FloatSlider(min=0, max=360, step=10, value=90, description='phi'),\n", - " theta_val=widgets.FloatSlider(min=0, max=180, step=10, value=0, description='theta'),\n", - " x0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=0, description='x0'),\n", - " y0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=0, description='y0'),\n", - " sigma_val=widgets.FloatSlider(min=0, max=1, step=0.05, value=defaults[sigma], description='sigma'),\n", - ")\n", - "def plot_stuff(k_val, phi_val, theta_val, x0_val, y0_val, sigma_val):\n", - " plot_gratings(img_gr, k_val, phi_val, theta_val, x0_val, y0_val)\n", - " plot_receptive_field(img_rf, k_val, phi_val, theta_val, sigma_val)\n", - " val = get_value(k_val, phi_val, theta_val, x0_val, y0_val, sigma_val)\n", - " line.set_ydata([val, val])\n", - " fig.canvas.draw_idle()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": "", - "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n // Apply a ponyfill if ResizeObserver is not implemented by browser.\n if (this.ResizeObserver === undefined) {\n if (window.ResizeObserver !== undefined) {\n this.ResizeObserver = window.ResizeObserver;\n } else {\n var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n this.ResizeObserver = obs.ResizeObserver;\n }\n }\n\n this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n this.resizeObserverInstance.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n img.type = 'image/png';\n }\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n img\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * https://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\n\n///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n// prettier-ignore\nvar _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"
\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n fig.resizeObserverInstance.unobserve(fig.canvas_div);\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n if (event.target !== this) {\n // Ignore bubbled events from children.\n return;\n }\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "", - "text/html": "
" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": "interactive(children=(FloatSlider(value=0.8, description='k', max=10.0, step=0.2), FloatSlider(value=0.8, desc…", - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "75bac2ab8604428a9d0928978ef62b80" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1, 2)\n", - "DEF_K, DEF_SIGMA, DEF_X = 0.8, 0.05, 0.8\n", - "get_tuning_curve_func = lambda k_val, x0_val, y0_val, sigma_val: lambda theta_val, phi_val: get_value(k_val, phi_val * 180 / np.pi, theta_val * 180 / np.pi, x0_val, y0_val, sigma_val)\n", - "left_img = plot_tuning_curve(get_tuning_curve_func(DEF_K, DEF_X, 0, DEF_SIGMA), ax[0], title='Tuning Curve')\n", - "right_img = plot_tuning_curve(p.subs({k: defaults[k], x0: defaults[x0], y0: defaults[y0], sigma: defaults[sigma]}), ax[1], title='Tuning Curve')\n", - "\n", - "@widgets.interact(\n", - " k_val=widgets.FloatSlider(min=0, max=10, step=0.2, value=DEF_K, description='k'),\n", - " x0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=DEF_X, description='x0'),\n", - " y0_val=widgets.FloatSlider(min=-1, max=1, step=0.05, value=0, description='y0'),\n", - " sigma_val=widgets.FloatSlider(min=0, max=1, step=0.05, value=DEF_SIGMA, description='sigma'),\n", - ")\n", - "def plot_tuning_curves(k_val, x0_val, y0_val, sigma_val):\n", - " plot_tuning_curve(get_tuning_curve_func(k_val, x0_val, y0_val, sigma_val), left_img, title='Tuning Curve - Numeric')\n", - " plot_tuning_curve(p.subs({k: k_val, x0: x0_val, y0: y0_val, sigma: sigma_val}), right_img, title='Tuning Curve - Analytic')\n", - " fig.canvas.draw_idle()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "outputs": [], - "source": [ - "# %matplotlib inline\n", - "func_1 = get_tuning_curve_func(DEF_K, DEF_X, 0, DEF_SIGMA)\n", - "func_2 = p.subs({k: DEF_K, x0: DEF_X, y0: 0, sigma: DEF_SIGMA})\n", - "grid = get_orientation_phase_grid(15, 15)\n", - "img_1 = np.array([[func_1(theta, phi) for theta, phi in line] for line in grid])\n", - "img_2 = eval_func(func_2, theta, phi, grid)\n", - "plt.plot(np.mean(img_2, axis=1))\n", - "plt.show()" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 14, - "outputs": [ - { - "data": { - "text/plain": " 2 ⎛ 2 ⎞ \n k ⋅⎝cos (\\theta) + 1⎠ \n ───────────────────── \n 2 ⎛ \nℯ ⋅cos(\\phi - k⋅(x₀⋅cos(\\theta) + y₀⋅sin(\\theta)))⋅cosh⎝\\s\n\n \n \n \n 2 2 ⎞\nigma ⋅k ⋅cos(\\theta)⎠", - "image/png": "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\n", - "text/latex": "$\\displaystyle e^{\\frac{k^{2} \\left(\\cos^{2}{\\left(\\theta \\right)} + 1\\right)}{2}} \\cos{\\left(\\phi - k \\left(x_{0} \\cos{\\left(\\theta \\right)} + y_{0} \\sin{\\left(\\theta \\right)}\\right) \\right)} \\cosh{\\left(\\sigma^{2} k^{2} \\cos{\\left(\\theta \\right)} \\right)}$" - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p" - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - }, - { - "cell_type": "code", - "execution_count": 14, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} \ No newline at end of file diff --git a/plotting_utils.py b/model/plotting_utils.py similarity index 100% rename from plotting_utils.py rename to model/plotting_utils.py diff --git a/sym_model.py b/model/sym_model.py similarity index 100% rename from sym_model.py rename to model/sym_model.py diff --git a/utils.py b/model/utils.py similarity index 100% rename from utils.py rename to model/utils.py diff --git a/model/__init__.py b/numerical/__init__.py similarity index 100% rename from model/__init__.py rename to numerical/__init__.py diff --git a/numerical/decoding.py b/numerical/decoding.py new file mode 100644 index 0000000..148a7c9 --- /dev/null +++ b/numerical/decoding.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +""" +Use cohomology to decode datasets with circular parameters + +Persistent homology from arxiv:1908.02518 +Homological decoding from DOI:10.1007/s00454-011-9344-x and arxiv:1711.07205 +""" +import math +import numpy as np +from scipy.optimize import least_squares +import pandas as pd + +from tqdm import trange + +import ripser + +from persistence import persistence + +EPSILON = 0.0000000000001 + + +def shortest_cycle(graph, node2, node1): + """ + Returns the shortest cycle going through an edge + + Used for computing weights in decode + + Parameters + ---------- + graph: ndarray (n_nodes, n_nodes) + A matrix containing the weights of the edges in the graph + node1: int + The index of the first node of the edge + node2: int + The index of the second node of the edge + + Returns + ------- + cycle: list of ints + A list of indices representing the nodes of the cycle in order + """ + N = graph.shape[0] + distances = np.inf * np.ones(N) + distances[node2] = 0 + prev_nodes = np.zeros(N) + prev_nodes[:] = np.nan + prev_nodes[node2] = node1 + while (math.isnan(prev_nodes[node1])): + distances_buffer = distances + for j in range(N): + possible_path_lengths = distances_buffer + graph[:, j] + if (np.min(possible_path_lengths) < distances[j]): + prev_nodes[j] = np.argmin(possible_path_lengths) + distances[j] = np.min(possible_path_lengths) + prev_nodes = prev_nodes.astype(int) + cycle = [node1] + while (cycle[0] != node2): + cycle.insert(0, prev_nodes[cycle[0]]) + cycle.insert(0, node1) + return cycle + + +def cohomological_parameterization(X, cocycle_number=1, coeff=2, weighted=False): + """ + Compute an angular parametrization on the data set corresponding to a given + 1-cycle + + Parameters + ---------- + X: ndarray(n_datapoints, n_features): + Array containing the data + cocycle_number: int, optional, default 1 + An integer specifying the 1-cycle used + The n-th most stable 1-cycle is used, where n = cocycle_number + coeff: int prime, optional, default 1 + The coefficient basis in which we compute the cohomology + weighted: bool, optional, default False + When true use a weighted graph for smoother parameterization + as proposed in arxiv:1711.07205 + + Returns + ------- + decoding: ndarray(n_datapoints) + The parameterization of the dataset consisting of a number between + 0 and 1 for each datapoint, to be interpreted modulo 1 + """ + # Get the cocycle + result = ripser.ripser(X, maxdim=1, coeff=coeff, do_cocycles=True) + diagrams = result['dgms'] + cocycles = result['cocycles'] + D = result['dperm2all'] + dgm1 = diagrams[1] + idx = np.argsort(dgm1[:, 1] - dgm1[:, 0])[-cocycle_number] + cocycle = cocycles[1][idx] + persistence(X, homdim=1, coeff=coeff, show_largest_homology=0, + Nsubsamples=0, save_path=None, cycle=idx) + thresh = dgm1[idx, 1] - EPSILON + + # Compute connectivity + N = X.shape[0] + connectivity = np.zeros([N, N]) + for i in range(N): + for j in range(i): + if D[i, j] <= thresh: + connectivity[i, j] = 1 + cocycle_array = np.zeros([N, N]) + + # Lift cocycle + for i in range(cocycle.shape[0]): + cocycle_array[cocycle[i, 0], cocycle[i, 1]] = ( + ((cocycle[i, 2] + coeff / 2) % coeff) - coeff / 2 + ) + + # Weights + if (weighted): + def real_cocycle(x): + real_cocycle = ( + connectivity * (cocycle_array + np.subtract.outer(x, x)) + ) + return np.ravel(real_cocycle) + + # Compute graph + x0 = np.zeros(N) + res = least_squares(real_cocycle, x0) + real_cocyle_array = res.fun + real_cocyle_array = real_cocyle_array.reshape(N, N) + real_cocyle_array = real_cocyle_array - np.transpose(real_cocyle_array) + graph = np.array(real_cocyle_array > 0).astype(float) + graph[graph == 0] = np.inf + graph = (D + EPSILON) * graph # Add epsilon to avoid NaNs + + # Compute weights + cycle_counts = np.zeros([N, N]) + iterator = trange(0, N, position=0, leave=True) + iterator.set_description("Computing weights for decoding") + for i in iterator: + for j in range(N): + if (graph[i, j] != np.inf): + cycle = shortest_cycle(graph, j, i) + for k in range(len(cycle) - 1): + cycle_counts[cycle[k], cycle[k + 1]] += 1 + + weights = cycle_counts / (D + EPSILON) ** 2 + weights = np.sqrt(weights) + else: + weights = np.outer(np.ones(N), np.ones(N)) + + def real_cocycle(x): + real_cocycle = ( + weights * connectivity * (cocycle_array + np.subtract.outer(x, x)) + ) + return np.ravel(real_cocycle) + + # Smooth cocycle + print("Decoding...", end=" ") + x0 = np.zeros(N) + res = least_squares(real_cocycle, x0) + decoding = res.x + decoding = np.mod(decoding, 1) + print("done") + + decoding = pd.DataFrame(decoding, columns=["decoding"]) + decoding = decoding.set_index(X.index) + return decoding + + +def remove_feature(X, decoding, shift=0, cut_amplitude=1.0): + """ + Removes a decoded feature from a dataset by making a cut at a fixed value + of the decoding + + Parameters + ---------- + X: dataframe(n_datapoints, n_features): + Array containing the data + decoding : dataframe(n_datapoints) + The decoded feature, assumed to be angular with periodicity 1 + shift : float between 0 and 1, optional, default 0 + The location of the cut + cut_amplitude : float, optional, default 1 + Amplitude of the cut + """ + cuts = np.zeros(X.shape) + decoding = decoding.to_numpy()[:, 0] + for i in range(X.shape[1]): + effective_amplitude = cut_amplitude * (np.max(X[i]) - np.min(X[i])) + cuts[:, i] = effective_amplitude * ((decoding - shift) % 1) + reduced_data = X + cuts + return reduced_data diff --git a/model/decorators.py b/numerical/decorators.py similarity index 100% rename from model/decorators.py rename to numerical/decorators.py diff --git a/model/dimension.py b/numerical/dimension.py similarity index 100% rename from model/dimension.py rename to numerical/dimension.py diff --git a/model/example.py b/numerical/example.py similarity index 100% rename from model/example.py rename to numerical/example.py diff --git a/model/gratings.py b/numerical/gratings.py similarity index 100% rename from model/gratings.py rename to numerical/gratings.py diff --git a/model/load.py b/numerical/load.py similarity index 100% rename from model/load.py rename to numerical/load.py diff --git a/model/noisereduction.py b/numerical/noisereduction.py similarity index 100% rename from model/noisereduction.py rename to numerical/noisereduction.py diff --git a/numerical/persistence.py b/numerical/persistence.py new file mode 100644 index 0000000..cdd6694 --- /dev/null +++ b/numerical/persistence.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +""" +Tools to compute persistence diagrams + +Persistent homology from ripser and gudhi library +Confidence sets from arxiv:1303.7117 +""" +import numpy as np +from scipy.spatial.distance import directed_hausdorff + +import matplotlib.pyplot as plt + +from tqdm import trange + +import ripser +from persim import plot_diagrams +import gudhi + +from decorators import multi_input + + +def hausdorff(data1, data2, homdim, coeff): + """Hausdorff metric between two persistence diagrams""" + dgm1 = (ripser.ripser(data1,maxdim=homdim,coeff=coeff))['dgms'] + dgm2 = (ripser.ripser(data2,maxdim=homdim,coeff=coeff))['dgms'] + distance = directed_hausdorff(dgm1[homdim], dgm2[homdim])[0] + return distance + +@multi_input +def confidence(X, alpha=0.05, Nsubsamples=20, homdim=1, coeff=2): + """ + Compute the confidence interval of the persistence diagram of a dataset + + Computation done by subsampling as in arxiv:1303.7117 + + Parameters + ---------- + X: dataframe(n_datapoints, n_features): + Dataframe containing the data + alpha : float between 0 and 1, optional, default 0.05 + 1-alpha is the confidence + Nsubsamples : int, optional, default 20 + The number of subsamples + homdim : int, optional, default 1 + The dimension of the homology + coeff : int prime, optional, default 2 + The coefficient basis + """ + N = X.shape[0] + distances = np.zeros(Nsubsamples) + iterator = trange(0, Nsubsamples, position=0, leave=True) + iterator.set_description("Computing confidence interval") + for i in iterator: + subsample = X.iloc[np.random.choice(N, N, replace=True)] + distances[i] = hausdorff(X, subsample, homdim, coeff) + distances.sort() + confidence = np.sqrt(2) * 2 * distances[int(alpha*Nsubsamples)] + return confidence + +@multi_input +def persistence(X, homdim=1, coeff=2, threshold=float('inf'), + show_largest_homology=0, distance_matrix=False, Nsubsamples=0, + alpha=0.05, cycle=None, save_path=None): + """ + Plot the persistence diagram of a dataset using ripser + + Also prints the five largest homology components + + Parameters + ---------- + X: dataframe(n_datapoints, n_features): + Dataframe containing the data + homdim : int, optional, default 1 + The dimension of the homology + coeff : int prime, optional, default 2 + The coefficient basis + threshold : float, optional, default infinity + The maximum distance in the filtration + show_largest_homology: int, optional, default 0 + Print this many of the largest homology components + distance_matrix : bool, optional, default False + When true X will be interepreted as a distance matrix + Nsubsamples : int, optional, default 0 + The number of subsamples used in computing the confidence interval + Does not compute the confidence interval when this is 0 + alpha : float between 0 and 1, optional, default 0.05 + 1-alpha is the confidence + cycle : int, optional, default None + If given highlight the homology component in the plot corresponding to + this cycle id + save_path : str, optional, default None + When given save the plot here + """ + result = ripser.ripser(X, maxdim=homdim, coeff=coeff, do_cocycles=True, + distance_matrix=distance_matrix, thresh=threshold) + diagrams = result['dgms'] + plot_diagrams(diagrams, show=False) + if (Nsubsamples>0): + conf = confidence(X, alpha, Nsubsamples, homdim, 2) + line_length = 10000 + plt.plot([0, line_length], [conf, line_length + conf], color='green', + linestyle='dashed',linewidth=2) + if cycle is not None: + dgm1 = diagrams[1] + plt.scatter(dgm1[cycle, 0], dgm1[cycle, 1], 20, 'k', 'x') + if save_path is not None: + path = save_path + 'Z' + str(coeff) + if (Nsubsamples>0): + path += '_confidence' + str(1-alpha) + path += '.png' + plt.savefig(path) + plt.show() + + if show_largest_homology != 0: + dgm = diagrams[homdim] + largest_indices = np.argsort(dgm[:, 0] - dgm[:, 1]) + largest_components = dgm[largest_indices[:show_largest_homology]] + print(f"Largest {homdim}-homology components:") + print(largest_components) + return + +@multi_input +def persistence_witness(X, number_of_landmarks=100, max_alpha_square=0.0, + homdim=1): + """ + Plot the persistence diagram of a dataset using gudhi + + Uses a witness complex allowing it to be used on larger datasets + + Parameters + ---------- + X: dataframe(n_datapoints, n_features): + Dataframe containing the data + number_of_landmarks : int, optional, default 100 + The number of landmarks in the witness complex + max_alpha_square : double, optional, default 0.0 + Maximal squared relaxation parameter + homdim : int, optional, default 1 + The dimension of the homology + """ + print("Sampling landmarks...", end=" ") + + witnesses = X.to_numpy() + landmarks = gudhi.pick_n_random_points( + points=witnesses, nb_points=number_of_landmarks + ) + print("done") + message = ( + "EuclideanStrongWitnessComplex with max_edge_length=" + + repr(max_alpha_square) + + " - Number of landmarks=" + + repr(number_of_landmarks) + ) + print(message) + witness_complex = gudhi.EuclideanStrongWitnessComplex( + witnesses=witnesses, landmarks=landmarks + ) + simplex_tree = witness_complex.create_simplex_tree( + max_alpha_square=max_alpha_square, + limit_dimension=homdim + ) + message = "Number of simplices=" + repr(simplex_tree.num_simplices()) + print(message) + diag = simplex_tree.persistence() + print("betti_numbers()=") + print(simplex_tree.betti_numbers()) + gudhi.plot_persistence_diagram(diag, band=0.0) + plt.show() + return diff --git a/model/plotting.py b/numerical/plotting.py similarity index 100% rename from model/plotting.py rename to numerical/plotting.py