From 988311ab399a8ce175530acbbdb66d65e649e1bb Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 13 Dec 2015 13:13:31 -0800 Subject: [PATCH] Add Alexa docs --- source/_components/alexa.markdown | 110 ++++++++++++++++++ .../images/supported_brands/amazon-echo.png | Bin 0 -> 12869 bytes 2 files changed, 110 insertions(+) create mode 100644 source/_components/alexa.markdown create mode 100644 source/images/supported_brands/amazon-echo.png diff --git a/source/_components/alexa.markdown b/source/_components/alexa.markdown new file mode 100644 index 00000000000..f9c48dd40bb --- /dev/null +++ b/source/_components/alexa.markdown @@ -0,0 +1,110 @@ +--- +layout: component +title: "Alexa / Amazon Echo" +description: "Instructions how to connect Alexa/Amazon Echo to Home Assistant." +date: 2015-12-13 13:02 +sidebar: true +comments: false +sharing: true +footer: true +logo: amazon-echo.png +ha_category: Voice +featured: false +--- + +The Alexa component allows you to integrate Home Assistant into Alexa/Amazon Echo. This component will allow you to query information within Home Assistant by using your voice. There are no supported sentences out of the box as of now, you will have to define them all yourself. This component does not yet allow the control of devices connected to Home Assistant. + +### Requirements before using +Amazon requires the endpoint of a skill to be hosted via SSL. Self-signed certificates are ok because our skills will only run in development mode. Read more on [our blog][blog-lets-encrypt] about how to set up encryption for Home Assistant. If you are unable to get https up and running, consider using [this AWS Lambda proxy for Alexa skills](https://forums.developer.amazon.com/forums/thread.jspa?messageID=18604). + +[blog-lets-encrypt]: https://home-assistant.io/blog/2015/12/13/setup-encryption-using-lets-encrypt/ + +To get started with Alexa skills: + - log in to [Amazon developer console](https://developer.amazon.com) + - Go to Apps & Services => Alexa => Alexa Skill Kit - Get Started + - Add a new skill + - Name: Home Assistant + - Invocation name: home assistant (or be creative, up to you) + - Version: 1.0 + - Endpoint: https / https://YOUR_HOST/api/alexa?api_password=YOUR_API_PASSWORD + +### Configuring your Amazon Alexa skill + +Alexa works based on intents. Each intent has a name and variable slots. For example, a `LocateIntent` with a slot that contains a `User`. Example intent schema: + +```json +{ + "intents": [ + { + "intent": "LocateIntent", + "slots": [ + { + "name": "User", + "type": "AMAZON.US_FIRST_NAME" + }] + }, + { + "intent": "WhereAreWeIntent", + "slots": [] + } + ] +} +``` + +To bind these intents to sentences said by users you define utterances. Example utterances can look like this: + +```text +LocateIntent Where is {User} +LocateIntent Where's {User} +LocateIntent Where {User} is +LocateIntent Where did {User} go + +WhereAreWeIntent where we are +``` + +This means that we can now ask Alexa things like: + + - Alexa, ask Home Assistant where Paul is + - Alexa, ask Home Assistant where we are + +### Configuring Home Assistant + +Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on a templates that you define. Each template will have access to the existing state as per the `states` variable but will also have access to all variables defined in the intent. + +The values of `speech/text`, `card/title` and `card/content` will be parsed as a template. + +Configuring the Alexa component for the above intents would look like this: + +```yaml +{% raw %} +# Example configuration.yaml entry +alexa: + intents: + WhereAreWeIntent: + speech: + type: plaintext + text: > + {%- if is_state('device_tracker.paulus', 'home') and + is_state('device_tracker.anne_therese', 'home') -%} + You are both home, you silly + {%- else -%} + Anne Therese is at {{ states("device_tracker.anne_therese") }} and + Paulus is at {{ states("device_tracker.paulus") }} + {% endif %} + + LocateIntent: + speech: + type: plaintext + text: > + {%- for state in states.device_tracker -%} + {%- if state.name[:4].lower() == User.lower() -%} + {{ state.name }} is at {{ state.state }} + {%- endif -%} + {%- else -%} + I am sorry, I do not know where {{ User }} is. + {%- endfor -%} + card: + type: simple + title: Sample title + content: Some more content{% endraw %} +``` diff --git a/source/images/supported_brands/amazon-echo.png b/source/images/supported_brands/amazon-echo.png new file mode 100644 index 0000000000000000000000000000000000000000..2b18b861a407b89e8d5c3ac46d5efb35601f0ec2 GIT binary patch literal 12869 zcmb7rbyU^Cx9^<80S?_I2#1gokP?+VbeDjDfFMYx(tRjFKw26pX+@9_qz;|Z-2wvA zodOqs_rCSk{qMc+nl<0qd-ne9y=P5)XV!e*X{gB);NHOn01zlD$UFrAc3T81aE#lW zPd{G>04Rfoini=O?qkJ&`Ty^e-ShvXfvN&Yt^XwRfBsM5ztvEc|4Tim2gEe~FV24x zWh4LI<)h&1|0&#(S^qI@Tkx;y%kaO{H1{u6jf2u*P&EN6$3aXJ@T~yV6aP53>JCNV z>o6!D1m7qBk)MbE)kfBX&qKho9C(%g^X(SLq4*!?R^6ivyl((L-+*Ts2&)4XWB+7s z5dx|~K-E8x^bYWC47~aL4=oP;4?n35WOn_Ncl!!Hv;g};;9U;dttIvV(nDwaAmmj$H!Wf$6@P_^8i~LhX(*WP*RkU)b^O(nrXI{<|CHXoJcG> zddOSY)+|jgT-zRWPGGF_PA$N|a}}YfO;;9MDC$lH9|T!4^~(9Q zu^J#__1%Gn?Fsh)HyC_%BF_Xg+Svek+SZ3n`j3$8-b)%@Rv#ik%xc-KN%H;T!3RR$CuGVj) z`$h!}njcs|QNjyblS4SIy!f(1I~MDq1rLVk>A*DdUU0HdYXMf z0vN>WX_hLk|JHbIwzZ=c_ z+2fEi@ZwR`L@hx$gYTR970exe(zVGGYsS~>*HH=kQ9)fa6Th1CAr3|u-NoOf(082Q@O_y2 zZrLQaH8-DFQbc3U0vf3CFm=mKafv@O*Ih{8tZ2J*a#|CGnmE}>e-Od*DvTS?UDH+uKq&{0L(g@1oz@GzIAAdbbm9a#2Z zDnD`4F+mX(sdIItcbi_p+>rsetZ{9ra63WchUYSWHpdvz6hEEP{Q@VS{!N_YOkBKc zE89pvgm{&Cd0){t<7n`P&f{`xmOF7nt+!oU1sjgqw{yL^pxcq9&N`13otpZ=pMFVA zFLw@aA^)0(63O4DL#)xJJy2(|40c+XG_O_2(j~_e++&Y@z^IZpgM~)BXqqT4;;uIC z^m7N6n02^}o`3r;B;L2RUDB@52x-y&!>#?O$%}#*T~nZlA#;Hy!>|1Q){wTeHTt zJJLiW;;Buo_I^2{UNjOP3S#7EpEzks_bV;pI4kEEg^6NRqa$hzcqkBP3T3a4hs~Hy z@zRW0bETB;rXF;pg#C)CfOT(##f34dK3C1C)ccJ)cqIUves3jUU@xS&^7eMA!mAfX z&c~i_&10Y%!=kMd2|Evh%27kFO&j8u`RgLKuMo(Qy`J8-&kOcpgf;`b&m9{uR3V zE?5NPv7VLRUuqpxgcaR+=iN&J;A_?_nb=I`AI(J)ot0zmkHSm{o#DB$by4$HlfP=m4t$hKHMyU zx1;my4hhynyl&n)eYgxM5lsDU>z(+y-1zl$(eV>m>6V}I`wNB?iO|O4oTmIaS3l16 z!DAg)qT|itonlkj@1?Q}$;UT4yM*q(>h8Y&gl{I!la8v|1=t4w=F*Vtc^3@bd#s({ zIKUm5{poB#L{i*c*52hxVs~dRgO}HT>HO#>r8FSnTt|qt^sWeWawtXThzMl0(}ZAX zlqH*(Lw?>T{EnC4{az38t5 zo|001Kk3jEmk%&ejzPnGIjV8q~&K*&?EpWp9% zf+USK4qg1kBI#(n)N`;Yvzo4>lh;J8Ag)q6#o?9b z$Ld6^9(ReGtS{jlY+VdiUF4Xm2Ex`ghr8T`<8NxgNk`@JIKB?xGmW}{O(IKXaTRsH zr47nIcAh16OzDlPL3`XUnB^MhALCu{;z;?a+duq09g7tGMW^Ra#f9we)1G!~HJz~f zoTJWzSARyHR^M60d_X?1QY)wiVuw?hKg(G`o%~-4Lf@KQ#S!(A5}zR#NSY0mt+2$rcymJvnpzQC9iK$`?BEu?Q69>dlm zAwsczOFSs~TcJt{?)nlHz8c|H;lqC_be|j2`LwCBZRISLNeNTXfSU`Im@3D?abJy_ zTV*JLd^PRU-ow1QVv5&1mWsXK0qLgnlRlMV_3w^qzz!4knWI>KJxDIqjS7R0c1O2R zjy61y7JL3WWv)ae+&h*92xB8=_?iKpVvq5wBGg?@N-4cLFpQjYMxX)aOSg7CwR{#3D)&$Ml_Nf;5)fiftrM$-6o$ zGyKsnRUzw(Cx_wo1;+YdH$Z`LPD)#jAkzA|1C)i9o8(Uqt2qgMI2c~Dsj^yXTWE6! z?LR}}hhBVne-g=t_$oqw4E0Z@n1K#bJ=2{NcK$d365bv;z))_#?P=_CxCJP(X@>J6 zLU2ZLJlPgJ=JUZ(jKtaRjApsTQ}Axj83XNevEiHc7-&Z;h=YHo*n-IS{g{ z$M9J563ULOkci~nxHH_T(#%eJaWsZEcs^DSAQRRfG1SqUP2tnd)7Ke0bTi`L)z(!4 zU+qjrHh*f{#z9Xm=pD*3MQ9aeMd-JBWTxsFL~P&n;alHr=dey~V+zy5FTyvAccrSr z$U6U>HUN?0L+$2rL%38rneJFs96I||m0*Y?_Qz!OQW%Z-`8+kxDmf7Eh3?@Yr7r%q zJsoQk44z}wLNc4Z_WDqU!dx%^$x>5*j9hA~vXuv=-JUPztpfGYVn5ZR%Y8FAJk~JV z(kt1?5Eku2-Y@hxlg+2Yex6ohG%e=gp()nJrYn|Njqso58YPF3MzYQdlBlWSZz*i6Cn3<}@^W==1M3Wot-R!nzFtKnO2Atw@j!ypwB zS%Mex;3tN+eSJK&?amHyyjM zE#6TG*6PZPx~4=rI&27*#bAAAkFX?!+r3yiU1QbDv0&m!`Yf33%(lk~RbX%ol&y3o z3)(fEO-?T1(vv4kJlrg#RpyBKrdrpGKk}(p*5l-f!?vlV1}qD6EUCll!$27`aEvLM zJPt%Xc*7P*J-`{iAIpj|+L9Zyak!5}T%K8pr>^!co2`{&jqBNnvhn?#Umj`IrAGLe zxxMge*%BK^lR!kJ=o^PQw3+*=_j2E#KH-{$fj85*riD4HrEsYb4eSl3?;?R>ZTey=9 zB5BZ81}h>eGb|8vU#F2joIqsqATS|Wve6l|S&1&ug-tSwD9qVr!A*>FRSVBBKa(~3 z*h#oG)oH`;&N{>ujBcw%UYO|LZ(9+o6yC}`jh&B z%&UMM@wy4g{seo-psq<8d9Qos>(8mS^Y4Z^7!4ckL^!eb81}4oa=aaKl zM>E1^9KzR&q8f$EASq2c(AI2y;(?OAiWoiF=A+_s2VSEY18Ms-H7d z39XKF&k&=swpx>TBkWZ$3t#yyvL8JorUY-<0W<59xu=^ItE?I|QEf#-HZj3($ zRBta3Zj2J{F~qwPh3d_ka^^oIek1cDOxAbnn4J{3zW>V11}i%%y6S6{zRaFG|6-Jr zK0EE}A~hNiza_Wpf5o|62E1g~K7{jp4Gk^G{MDgeO?&qH;k*Jui@K|*L_cfEhYC$3 zCAwSq#fW=<1ddFr{GO99nj$V;C+eR{>+;u zkl!sfL9PQzV!z)*RiVSoFaK1K%op`=t5@6TgOP8(e00RHs;y2>e5M=NbzCr<)Sry4<&OFp6ui{CA|!P|k6^u2uS5-~>U8IG1hA`%rlTYbaRBHEVspkZ%V$VZDby`@avVka>5Uz=H zlS_seF{6>xVAH;%a`HqLkaLoRECOxtd1(z9E=Fg4L$SyE*Ebpq!-|J654uh!Hq+2r zjf*^#kLRoC7tSsuM@b+=+Jz%u7c771c{Gv@>iuXjV{92wF>r3!AhineGKB0@`qq?u z2srz4!l>|?Wi{?P&pY7x$Sw^enAurcTuSo+*rxx*H#pGUquF`KDU5{G>@F@ETL^d2 zcSw{hBG2?gTrKa!DFfc?l#0~zgNlpaui;#z#$RH_#Xq;wlX-{i#=Zy+-Dvq%z?o&Nx^ zJl&7S@X+fK=WwZ7aIs59?>t*CnH|v0;pmZ@_XG*#WobPyDQlT5I>n%qT*ZeIawHYl za5K?G#+7jx?=KjH`oW*Es0=8tX|OzsQrn4ZH3|LlJugm_3o8nh0rfDb445#91clZ1#g1+lOQ&olZJc} zjnV=`j2TC%fKpd<#SONH=wfgts*y3rEK^DL2+d#w$Ms(yX{J{;;ozFcQjr6~K^Bx? zt_{Cc3Z+O;$=QMj&L2JqwXL|6gFLvV3hqpX7%~aLQAcwPpt9ABRv}2XS_jWL8i+3* zEl2=H`{@Ozkl6niywDQXtxwxR@THyQB{xZmdUoGT3A zpo9nfAd#h{vE3xRy>4*CwJ}g5L+{MN5j*$9*ih@_wPKLUKTzto^AzYme~b@ZFD5>n zXx{v^UREYZRYOF#+Jf5`9U@LJ|^OS)hgr;I2LG9nUl!MU`VxXjX9|R|Z)z`PZYVn8`zDTa+ zh==#-u2z5^KmQOlaoZJi-O>MQ7q4xci7Yh`B6)#5t>QXd2Ssgh1XTze`daX)rx<7( zQ;t8Y!lXcFQ?z>NZ#fiFqEmGA4(0VgjgSgt)Q0f^YU@M8C=p)9v(ShKlni|6Pu?(- zND}e+(SzV@8<{L2BXITTw(oofiRlQG0Bsf&Sx63|c-TQglRjYR=dD1+h!2_<=KLh4 z_cEC!Vx7AOu15_oUh#i+QYfoI8;0`V4T$4uB!Ex7IaU$9Z_Fs*t+iSNK2IjJ)C)rv z*8`#KX;USVR>`c8PicV$v`tAnIFsb7Z@$*uHO%DUx`g~t0}2Ecd?I<~s-K&-VlB&)Lp%&~zTOw>oOEEf%p zTvaM00s9*w3^8YC-9;aoSj|Zpz9*;fMKc=aE8an#DA!4c1e*b7j31gnnO-ep?QfPg zP|VP%QD5m6ClqBn=N(KS`-r8Ii5SH}_y?YUz8&>viOILae$F~elxvyb8=_N?d3>Fv zfSUz!i!sglGDkv7l*?n3Z46W6)xnN?98?c3f&{f>GLTozZp|xm%z%B7fbd}qlY8Kk zCG~xk9Z7dwMDd};s?K8(r%MAazI9@5#1qavx|jS#w-dzzE?XD@vQT8Rf`=5D-;Raj z%A;aH5Gspa$b)7Lk*MqM=f**knMGM!2RS%eRxq8C8C9O4Ay5UoOvIb4Fju-u(PcwO zx-k{9`r7-4q^FkT%RjIE78$ujmC=YL2S_B$^ZV#M7-9jF*qlNT$03WU+ItNKL9Wu3 zV}>Wsw>RVAm_uuM(f~SXif{ ziE$uSd@W{UMDP@SaWSki8iWc{6fyD|8jBOa^o=UHo*%L}83;u~{Dg2!8c^RK0~+z_ zumnu%6eiM&4e>Ws;IHKT``47c{I^>Qcxcf}V#L-xt|M6!)3eDbxx0)g!{04FI-FE4 z`e#_-lg08v3&&^Jj5^Rl*~TnoNr>UVi&|C`TS`Q4LW#VU_Z^n5w5dOS#Y2592c@gs zF%T{bLvEC;TSn#`rr}m7dOIlSnl6~yME-eP>fJN($5LP<1eb{*yi137X0r!|BBlU2 z`XJ_uiG?KHwld~n?BxR#jmftq8%QJ>D~Ac`G9Gd%AU6SG*j8%D!b(B!@)k&8Q?yZO zw8d}ZTJ(xR6?A#^34&7|R1#-n@v@IJ&r+K_dP}l~XQGy`oFT-*gIW{*wW!*$ysu#F z@`_y8OtqL98ON*d{1z;ZF!TwsFZD9?LEwmI|5>glU}e|XhXRlmyQ|zCJFj7Q3;5g5 zv&lrRK|BhjOucv~In>dXoOqv3)E+~XjI#qBQ2G9osT9!{dleO7#b}|2*2AL)Bg*mD z=%uH!$wY36I-v!Ll#`zB7Umx_?pj!IynX>e73>@2wdTu;BE*yCxdoO ztiw)jg$l@f(HK;`PWsccXU13g;dqSXZn8{Zz2wyr21yWE92{}}@lBjskO1A*$5>HX zdWerWa}kOi>oECq3)VH*uao$sSfC`)F=&DZ$pMuRH7o&bbG$t78Li$(lD|lc9 ztR~8V?o$bcH&I3y8iBj?kC^~}Sr+I54Nz24ccO~ zxM~4{T~zo{t_e?%Xe?ADu%s@R@Eq33JGW-^OOXYz-{cSSqDhpRtm*DyQvn)Rc@^*q ze6z^qZei62$NZX%!DT!9k>v>HPq)dr?+J_Y3{aHP~qG8y;#tyGMo8E4w;C z2VKV9vrvBAR&VYZg5&;Yq<%-O2nK2$1=Z5|kbh`D*m!9`V)!sIkyu$(+a;B=yW`w$ zK!fa2_RqJIUOGe6JJFOe27suxz>rCv#Ou}d+?D7g<2bRQrT&WW%DbMFQ?3*+?7d(` z$NhK&W0^}Ogt$E%y9a;inN#bMo)GwjRaYh`W}{%ZMDMG&g$M?Jrn z0JNsSV0)}pDc{!M>Rpd5P+$dx{<+^QQLa)y1vR>T3*^7*ohs*O{}6zn`5vCW7d~Rv z&nxI7YrQC9w_P5TG#)Fvm%ztT0iemftE4W2yPf3^eb$9w=%xtilT=T6-}H;!=W%MF z@Zh}?bLeL|Ud|BG?|1DM9&`^g=Gp8lB!almlc=B2+}V4kRo;~Qy_!WK%;94t+nI(> zCVMS@Ej?3B9_98?#DGR!1H3{pJ(M_xie2iw*wMU-c`Y*n#dx-~X^@iAH~X9pZ}Ghn z7pRQ7%sOA=?@jr#mlOCUS9R_!K;#`bli;ae{*|m6I1UenqK4hE+LvD~aQ>*6m>0s< zj-g5KnOB3?tVBm_bF1&D0jtapm%^9H+BD-#1-x@rU<$cx~y;37fk(ZS9>xdFo0 z@pNnZQA%8>djt!x()}4?Ak*N1^ifcPAREs8z%cuV${9y`G*|VuEr<%fi)YW zqT&W9f*A)F754$Q$@KQac}usN@W4s$GPCgMB1moWQ?W8H@TTxYmq)o_HlZT3zKZx=O^F)ox=ee zm@ifhLM<4rEyNtRv?J2()rXgYp0&SI?czd_H{#UC(vqSos34^zF*=}3>#V0hV^*YS z?Bvw8DqifOpnedBWp3*I+#{Yznlev>93*i4ZkQ}c@b=tnmEAUG?v!WQfeF@$XFRB= z#{bR?sNcW5EL2CnfMhKn1{5(q+skOlDvu~M04tP%(5x+{Un|XwtqdAT?0n^3@!@-~@1V50QHhZqrN+p^T#gB>nzVLo-%Wc8@MV&i z^Jb={Qxe3QGoKfn>0k=%MJtJsmW4D%wGTZ_?{yp?)gwn0d+Lh*dcTD^^2=3yu%svu zib}wnc_odVf(f#(MkJ@Ot0A};9XmTO5eJ++AaEPDwn&#r*irp!aKkl%8SJR4$nMLo ze8e+3i~!v2G*V^axRkK04xwk3aybq66S&@U4TS6#L7}KiA%ZeWNG&Es%IqwpMy{h}qE#Hu zm&0Wt$c`vT!ZA*a5ui%iXu?{io)r9!9nr9G4;)-gnBLCdPPYdBw)o9UkY?Mv-M`E= zIgrUVVq>17g7HZbl@phP{Q9=974&w{?0kW?M4CIe%rWDv<&ftM3Hz0%l} z5F$!O@gNfg7|1>lnJHLjJ<2^FEqzW1b_@ZkN9egim8ernSMen2$5KxE^&c$HggRe( zz`#X1o`I=3X?asfH0I++q{I0b!jnLDt-kH4G>puQ$Bx3B8<$rQ3iQfcKYH(%(|=n^ znwSwXoxq3j!_jigi_&)`83yg>PUUAdid3~;%)VrXwz2@Ez>8Ui3B3WHq`;b>%ol+} z6p^oexNxgIdHoqDyqD2t{BOVf`nk@l4F$Y55}2NvwoGMmOWPvNlbQJZCkAio{I}** z)t8Xe*n5`K)_7ku?mJ={m9fn5Na?k`$Km^CNtj+A8{;JO%Vd#>3OaGlpJMiZt=4r0WA3Vi6^$YO7y2 zNvnBU^SIad?s#a*Q`Zs;S$gR+`5kH+UzFb8Yoa-+hR67A5G%^U>-TuWevSk$nAH1( zy?RnN04X?GaXTVzcJiITGOoZT>IWWsdg)Svuf%D^?F62yP7`OCCSHAwBmOk+nu>am z+exoT0c~C(j!{yWd1`42@PG-u14k}f1cJ)8cLsQf^yoD^ECVUkrX4T{r&xvz;<2j~sb91+cty}-F+r@3hm@qV=-Sn|x zse|Q6_iRry8)Dn>bY#kF%zxp0E~`Py(P?rIyU92$Y3NjUbAP3y2ckrum*1=I!i>o$ z%hem$ly9%^{cQ_FjtI^e?Dp)rV>Mmfi$Q(&)YEWF+==R!<^1EnY`XVgSn231VQUZ3OP(R8z zG%Ue!8HRD|w%S;Aom6?*zVD-3MEUq!+4Ld(RNKjbWUNZcZ^`Q^$ z1bYiXkt%umySnYlL!+xdMI|$EK8*V48wYm`=wSxapFmgkr(BpDYy{v26{`J-JcP5qnzqTP^R?M9Z#mk4E(`5k%!_ z>K*S;%9UVySVBEillUA}YYxf2viu=2xn#c7h$*x5r92f9Y?_rwG3i~2S_|_1kP<-v zZH}5kv#)sH8!}NR#e%S2bJYQebAf6i`bf z8MXxZ2>;e4YSM7jPcN{%bLU}2)N0{wW-^1Mf`L)d2Gc_(fvB4$H|coDk4>c$HX?Rx z1sfIHWtuWW+0QROSssV*j>l!-?!yHCl4CxV=EmNmD?d#o$Er!mULrD4bjyig%ddRI zRK*bXbY1q zpOhXeL;hecwbc5PEMgDEpuz;B43m>17{|;Bz zzEXmD+Zwd{OD0d?CGbgYC|N)sfRO{N&qCynTw#k(qC{)$-Z4BLgTxDOPNJw(gFMB? zfxG2B4|+X^7mRyvNuF9>XfB%b64Zz9Vv;|qQbE%(#c#>TnWH`_3LBtpNo_Uf^lGSf zFjt|imIVpie!R4ziXnm_eJb_1q#_Z;6I5)L@&;gac^Pskt-KgYC8uz8%the{92bW>Z875J;@zipw@xA z!fTUiA$q7g*e?rI2EzE2<*_=`Py%LadTdEs)Qqb9$;o>7yCV00`ueeFt!MPv;Gt=` zM-ET7QeCJK)@8pGOkU2y$Dc=tMeGzXi!?*y9EC+5w7YX+f=>a$-V_p&s*wn97cRu{ zl&PJ%XR|>SQ=(mAvZo zS$s_GUY!HvEMkzFapl7jwvI8hCRZ_Wc}o+4WD6iYaH!e9c$WAil_DLNaE|}GFzJEQ zPK!o)I6|Co>PyF2gjPNln^X^SKL}PLr}weNAzyvJKvhgll69rgOW!ar190I*JyC`D z^AE#{vN<8bbI_NWGW0!DRvWVIGRRn?#I{l zUNPFY19vc81CN(+LgB`sF8vP}(>sszjT&7YyXz;_W#-zE7lCp1@}XI9OlZt?vFI2C z{b-Z0eK%NC`@T!xnj_YzTg=maLdJo?gN^}w7|M}VTc<(Iw!e?KXu!rxypf-w9D)