From eec904d34ea8245079e26c2e047be06e9249d713 Mon Sep 17 00:00:00 2001 From: Tiago Alves Macambira Date: Thu, 13 Oct 2022 16:28:52 -0700 Subject: [PATCH 001/116] Fix: codeblock wasn't properly closed Minor formatting fix. Signed-off-by: Tiago Alves Macambira --- .../supported-secret-stores/hashicorp-vault.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md index 3c7a9bb4f..76a33c54c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md @@ -64,7 +64,7 @@ The above example uses secrets as plain strings. It is recommended to use a loca | vaultKVPrefix | N | The prefix in vault. Defaults to `"dapr"` | `"dapr"`, `"myprefix"` | | vaultKVUsePrefix | N | If false, vaultKVPrefix is forced to be empty. If the value is not given or set to true, vaultKVPrefix is used when accessing the vault. Setting it to false is needed to be able to use the BulkGetSecret method of the store. | `"true"`, `"false"` | | enginePath | N | The [engine](https://www.vaultproject.io/api-docs/secret/kv/kv-v2) path in vault. Defaults to `"secret"` | `"kv"`, `"any"` | -| vaultValueType | N | Vault value type. `map` means to parse the value into `map[string]string`, `text` means to use the value as a string. 'map' sets the `multipleKeyValuesPerSecret` behavior. `text' makes Vault behave as a secret store with name/value semantics. Defaults to `"map"` | `"map"`, `"text"` | +| vaultValueType | N | Vault value type. `map` means to parse the value into `map[string]string`, `text` means to use the value as a string. 'map' sets the `multipleKeyValuesPerSecret` behavior. `text` makes Vault behave as a secret store with name/value semantics. Defaults to `"map"` | `"map"`, `"text"` | ## Setup Hashicorp Vault instance From e56b4a0f32516bf820dbd1e31569a55bf5e5cf98 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Fri, 14 Oct 2022 09:32:15 -0500 Subject: [PATCH 002/116] update code examples Signed-off-by: Hannah Hunter --- .../pubsub/subscription-methods.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index b963d13da..655484559 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -137,12 +137,10 @@ public Mono getCheckout(@RequestBody(required = false) CloudEvent ```python #Subscribe to a topic -@app.subscribe(pubsub_name='pubsub', topic='orders') +@app.subscribe(pubsubname='pubsub', topic='orders', route='route') def mytopic(event: v1.Event) -> None: data = json.loads(event.Data()) logging.info('Subscriber received: ' + str(data)) - -app.run(6002) ``` {{% /codetab %}} @@ -151,7 +149,7 @@ app.run(6002) ```javascript //Subscribe to a topic -await server.pubsub.subscribe("pubsub", "orders", async (orderId) => { +await server.pubsub.subscribe("pubsub", "orders", "checkout", async (orderId) => { console.log(`Subscriber received: ${JSON.stringify(orderId)}`) }); await server.startServer(); @@ -163,11 +161,10 @@ await server.startServer(); ```go //Subscribe to a topic -if err := s.AddTopicEventHandler(sub, eventHandler); err != nil { - log.Fatalf("error adding topic subscription: %v", err) -} -if err := s.Start(); err != nil && err != http.ErrServerClosed { - log.Fatalf("error listenning: %v", err) +var sub = &common.Subscription{ + PubsubName: "pubsub", + Topic: "orders", + Route: "/checkout", } func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) { From 490f4371501af5bcb05256cbd38fe6040362d14e Mon Sep 17 00:00:00 2001 From: Tiago Alves Macambira Date: Fri, 14 Oct 2022 10:25:16 -0700 Subject: [PATCH 003/116] Fix broken link in components-concept page Commit https://github.com/dapr/docs/pull/2875/commits/043a39d3d161a7b44b95a7099ec862329d70eefa shuffled content around and removed a section called "Pluggable Components", breaking an existing link to this section. This PR fixes the link to point to the section now hosting the appropriate content. Signed-off-by: Tiago Alves Macambira --- daprdocs/content/en/concepts/components-concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/concepts/components-concept.md b/daprdocs/content/en/concepts/components-concept.md index 2ec3c936d..9a2c2bf41 100644 --- a/daprdocs/content/en/concepts/components-concept.md +++ b/daprdocs/content/en/concepts/components-concept.md @@ -11,7 +11,7 @@ Dapr uses a modular design where functionality is delivered as a component. Each You can contribute implementations and extend Dapr's component interfaces capabilities via: - The [components-contrib repository](https://github.com/dapr/components-contrib) -- [Pluggable components]({{}}). +- [Pluggable components]({{}}). A building block can use any combination of components. For example, the [actors]({{}}) and the [state management]({{}}) building blocks both use [state components](https://github.com/dapr/components-contrib/tree/master/state). From 8fb7d502fa0c864d4d1af1aa8b6b2bec4f201145 Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Fri, 14 Oct 2022 16:03:57 -0700 Subject: [PATCH 004/116] Add Resiliency to the concepts page Signed-off-by: Nick Greenfield --- .../content/en/concepts/resiliency-concept.md | 29 ++++++++++++++++++ daprdocs/static/images/resiliency_diagram.png | Bin 0 -> 323844 bytes 2 files changed, 29 insertions(+) create mode 100644 daprdocs/content/en/concepts/resiliency-concept.md create mode 100644 daprdocs/static/images/resiliency_diagram.png diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md new file mode 100644 index 000000000..ab5875d33 --- /dev/null +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -0,0 +1,29 @@ +--- +type: docs +title: "Resiliency" +linkTitle: "Resiliency" +weight: 400 +description: "Configure retries, timeouts, circuit breakers and monitor app health" +--- + +Distributed applications are commonly comprised of many microservices, with dozens, sometimes hundreds of instances scaling across underlying infrastructure. As these distributed solutions grow in size and complexity, the potential for system failures inevitably increases. Service instances can fail or become unresponsive due to any number of issues, including hardware failures, unexpected throughput, or application lifecycle events, such as scaling out and application restarts. Designing and implementing a self-healing solution with the ability to detect, mitigate, and respond to failure is critical. + +## Resiliency Policies +Diagram showing the resiliency applied to Dapr APIs + +Dapr provides a capability for defining and applying fault tolerance resiliency policies to your application. You can define policies for following resiliency patterns: + +- Timeouts +- Retries/back-offs +- Circuit breakers + +These policies can be applied to any Dapr API calls and when calling components with a [resiliency spec]({{< ref resiliency-overview >}}). + +## App Health Checks +Diagram showing the app health feature. Running Dapr with app health enabled causes Dapr to periodically probe the app for its health + +Applications can become unresponsive for a variety of reasons, for example, they are to busy to accept new work, could have crashed, or be in a deadlock state. Sometimes the condition can be transitory or persistent. + +Dapr provides a capability for monitoring app health through probes that check the health of your application and react to status changes. When an unhealthy app is detected, Dapr stops accepting new work on behalf of the application. + +Read more on how to apply [app health checks]({{< ref app-health >}}) to your application. \ No newline at end of file diff --git a/daprdocs/static/images/resiliency_diagram.png b/daprdocs/static/images/resiliency_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7168f0ef14a1f8ec4dd9d810e6c566eb412475 GIT binary patch literal 323844 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

miD>q59iO;(WEBFtKpX8kKHW zU@$MBVB4-18idx}lpoDF!5m290SG;FoJhX*&aIiZ3%W&7c|X0-I+Y*2BD#EP5)4zs zalw;OkdQHmC{!b1^t)HBXBEqLdjy!nO>IAC(OtQUr{^Xn%8B`)A<@-$W)hKMolDWq zdz8Avouaay9V(XJ!lj0yk|=(fLWwh+8!S8Y)mBy^n5ACO+5g3V{$%r_w04gNQ!nyh z%8dG8N_BFF`%js#(ATq5VH=2@7s90!R57!q^XL?Kqd||ac(!~^Gg)A2)Rk!hZ#(q5 z){uGfRWSYI-){mz4iw(Te^L4}x95)Ys4*D;PH5}}1qDSTf8<{Hr(VrM)r}fZ?`*_e z$FW~kkaxex1iSjdgMwOuGV3C^WJfIazKv6gxmGBw)&r8O@R1DzA zqW?Lvr6L@0q*f_v4Y>=f!piM+@s<#5TChBtOybj{g6z1V+E0{D=8c~Xx>a;dX z8^yJWJpKz|w*?HT%Zy<~wYN|&k9F<7<=p#Dg(7kO^Dz}^ALGbQ@Ve3dzxaAsP z10D`==ib*vVgLCAj^%y8R}nt${*N|f>aSNvCE_s6Qmb}sE`0>dF60wCRveQKHQ>ba zE`b={L$lz}@u^$n{LIX?Pc@?$5f`GKX03UkBaC zk3nTaIFa8B=g|Sf+m!qdl!E75W&k*voBW!6@YOvG==UgwFFWm&^58vdBcC?jd~HHl zuZ;-3#8 ztdOYXW3h*fUoJDD!cefL?*$j8<8`YMX(~CUFg|Cw=xB{v#ipjik0bx5EQ2FzfaLyN zZ0UOA#?`@j4c+-QlJ_Z-+`Q+89Va4&WwnO@2sKa!lswG^2k!C`)lAeJl$M$Z2y3|Q zasKUg*ezp%g9`EsEn(I*Wf*k!BA4k;=E4p<&Vmsz(55hfZrA5i&LtRLuqj9BEc`3? z1iQn8qINp8k^H3OY7G!rmVU}xQ);X{q8HzgSTC8cQD#3{))iO?EFg>#07gJGOBWw> z-N?my{$e_!k6)7!z_7?bl3S`OEIR30PG@@}J9D=Ysn550qei}5o`t6y^lrA8Qd4$8 ztb8S-ED{_()o&@odS6cyWKu*b-H62{|62eK98O5FM9PeE6?GfiP|4O`OX~Oh(Eic6 zyOiJIFl`puMwX*}NtJ|fASa+GqM)FpN-m7~pY9!45k0XCIz2nU=px46V4?%`u9{p3 zV1s}wcv?W(pG1#(5&mOGpR^>*;p1e7MKEbfRkY`mj~mw8k$=z-`1}i~i|YH=^sFl< zN(A+4SQKbS03F@p1(6ssj6x!Tm8PX z{epf0N~h`_qZnOcM)ca<2C{UhI1fauE+3BvJ=3$s{Y<|rKc0qBUQsVcT79o>XUFaT zmt>(k7F=s+b=oZYqW^a_o^U^m-y7;(3+4Oke3T7m`@xsx9-zJh_b%#JSeA?0NCD5o zo=<_{QUdB`T!qO-gJH#nuPu=2We)la?ZBU>P)A8lelt(WIFoO;iUE+z1HZ+H*uff5 zWZk4Ge4rjg%yY$9LBFjBr0t=_38vUrC~`~OOTR~4to~GazGYh?eUAhbHzqwi#0K>M zn*tUBlj!PlFLO~!!k}PEudbv9M~_?lt=DuhWC;9zEA` zy%V}j8}p$A7z{)jD3Mpf&IQ=jJ?0C5)Z*osHDnGefmeSF7!o~z&uSfy$^UHyi`T1o zIx$0~kS+zcqXm`dF6b|3(c_Squn2q0vU_{0H6+ISu^0)0M#7xqdmV@xspym!Oe#u3 zsnU)du}`wX1Bi#kAyKT+y+3^U*o&D>0O;gbEkNg+-bl5t%s5@OVz>{Mvv`k+&-$RW z@xP~s_9Y7NFNH6K1uxACdYCC>E*t$Yu&Nrqf`2RfFAQ)xY^K8M-R>xkK=EGv>9b$FT;8h;aSq*O4l^HEwmdVEC8biS-9zDE!Zfwg6 zhG0kRa_B%##t1G-v1(qb|G9wRjU&ik%k%jnFKa@NVNYETYjZW+q&4jix42%!3i&dN z`ufs|BdWzNehmUXX8l&Lz`a$KSajwHNrgOT?vCVa_q`R5P~EC`sPz~564}Fbui_s- znJ9)s?60c$)qD+n(E2Sol%A@uWVbnHl%1=Le^4!99M@`{vym|3Hr$!3OVez)A!a_^Ye&v*TopiE$J)U`&7d`0 zC)#p?p(wdiCGQ}$V!mf1CC{2wz0?V#k|d@X|Llm0j9g03{Uc<`E?6<^A|c@Jlnl3R zreQhlRPFEMdR+Pe~?;lk!eOnn(MCbB6ARNnjcX( zwNk}71pXLbj@`lh$$Ri}A8RW&wDT11(R>P!ck&LIIcVa+7_Tu}_-9dgTn}89%9=wjdv#nrfxJ zq-HjUh0}*1-0$w;;?|Y+h%@(vVUc0ysPauggvDfGrP<2H&LN$U1Db`^LF&c|-<##V zn9c$ssTB>71OX-yLUcp|r;PV_6vF5g5d!He>{>vx*-Nx>O98=`R}-m|y|N~TD9|Xe zPbjiM$dm99h2cwok?nCgE7&?KEH-0(PirAh8QBxeIsrEz=UTM z5#DDCKHgnFW6^;sC($Kg1o0GYYOyqnd8dW1ZlzwQ&59@$p;oBl3t+{NftV-ezzK8v zYxXf?1m97&!bHVNerGk0(&ffKI#Tb*RiBb}km_qtScMM$&(V-BiXmio*;G;YSM5gK zH>_VRnbk%PA6V%)&u7AdNP^^~MI2{Ij{`}3noGpuxp8GGE$t;Ztz+uUW3TE|`vib~ znQ9CE0eVQtu`+3$r8a0A?B~+eg2j)2D%#o(=;7^551qpUiwia60!}6rPO86{O?2+_ zW!0#(b(XKIIV>!7%wPj2RKLee-^R|a$u^~QK+44`QG{2eH!YAMsfmZ*fS@p&kRNhy zu@h()H|x)?;Wnt`QSvBoF0_(&@ZZFjS|Nj(nVpc;xCkN2IGkCP><&yP2oQXkkRQ4ZJQdZddAY+Lce%A1AJ>ISo=a2T+SpiSpJ0v`j85p=VBZu~9biXi zv=~FEzPfY++ZFH~KVakeQZv5VY?=_?U@=w&`HAfAUc!&*NZzCF@^g*7t&{iPHZy@S zFxOi+9^YgC?sS?SaHOB-dR!DYPWL;fV7vJNV~xv}n@~I(zWa^X_!oTf277F(W#18B zR}9K)CfGZ{+WF2VOH>@BdK)f{j?;C6DrZCNlsbJ1;j;gkMMK}Y{M#WB;T-E;RuUHb zP!`FT;5>c5VXWONI&VyY0)FDvQKD&PI-yGkQEy|4GwJrNBji6kR@T&uTOJR#&UZyi z0$em24a4l4rIi)+FD%d$c=q6dd5;Z)F5uu!#bx5eJjY)?8SZ zsA7Nphuu=T~J*m!u*xoa44 zgRY}lk}>9)Bu&73labud8m~~Lhq6?k``zgX5o(0<$ipPiIjLp zT9C-fiwJiB@H;O^}`XdZEIoR@Xn^~=bE)fb2PRPlBGOeh?V|Xx zZWnGk>YGWL+vRzNU!DkG9@`pq602MQNsR(OSzXg_mjY!MOdpUE_N3XbqnCVxSY{N` zSRMHpADez3!4!v85=y*0HyZgO7#))es>;j6?Tpi{=0rRV+PEkmj%VDwa-ndn>wzqP z05As*h>$nXKGK0Y8qmXg`Vsvgm+}p6ks>lIWzeiQmB~}7%-rDPw$J``c)dpnXlDT9 zfbHdaR4l%V*4ZT`K;4^^vVYLU?6JJOU80LE8Hgy6M8UDd10Rdg+}r`meVz2oJ<;vg z4HzxH7?lh-<0x-T#xfQN{Q;OK=xbAU&)(mRrRO>4H_sc;%_&@b{s?@41l;Ge)sXXX ziyc@EV*ivA|XSD+^lvbd0ZNFq!xzyl1*11D4Q0&7q|+tY94wp@Sm zkiY2L8N9I5Dm(LvIry;P}$JIs{e77WOW z!NK8dz4E%2XQAmYAmC(hJrf2V3aFXsP-jv*CP3rzB6s$9t}>U=^cOrN*ezU0id={4 z%*!e{k{`Hwz^<*1X_O^Sc)tA(1=Wb_B@y`XFi4PXa=H)Q{ZuEI73-62oh##1R}WQY z(ifx5&g5716fH+ex6Js*KPN4DuMWX;)XLo#w(EIwc8ql%zZ2(F7C8ByXWa$LK7|ZIT^e+p- z0~sMOdCG|kZu7jKDqva~pPZP6>k&U-o$yoc02V9E^B5t`Cs*jBoFp8uZ}9BPGZckX zJb}1BX>_9*RCJ-%K?Rlw*WFurTdXgc3aQunUg4(cWl4LiJ%%37{to)hn;~t^BOzZb z&a_p|dg5+%E%v+sJ@wE2R8u<$E0+Zq{XDO&cZQH-)4Wm}s=lU7>wj_BW}V|7+0M9G zKl&_NuB!PTbs7v0*!Mj=ECOEIhnoT}MoS*AcU}Zf9DX#XM6vKj?kfR9$~93-|eR3y3iitpe7v4P8L9EeY+(560BAeRkMmV%cXpdzS8$HbJ#MNJv14PBo(61@+bu?>t=(!iH=Tl_3`*q?&%Pu2g zz+}h4fwF+A@modnFT?d0YZxSFf$#PogyN;Xze`QUQM;@f@)9Cn!R;r zlHRkri9nMH)*`!tprBU@8$0QHv^=IA=6d*51~7-~ z{o)!E4q1ZGCk{r+-KF&>W`5#b(-oWQcm%DAqOuf#9=i$E9*_ejhQf+8E!5=GoIIA( zoQlo58lrL(OBA%7PU7{U>QUFKG&pDwl=vYsrebasFhNlrfh3@$dZ(5$Cm}CcYrd+U7Dcq<=PA0{N8H{Nu-GAV5nYXJduDPEmY% zPRsH`BTJ_8W#ag-V<&VqZiztw&JqN;*-7>z?L~#UKuF#=pg1a|Q<9{Vopr(tj$oqWm#y^oN?D17)71 z7zB*1`$&=e7K_~ib7i8a^1KHPHK~GcKRE6>K^X2Z89totlWKZ&T0FNom);Y{YE)vo ztPSuKmE3}!unR+C%gmcKUD1kRQv53S!4)~enc>X< zxt-mLNIRG|5?+Hf@>hxrZd~;InKUSDpVA~9Kjd|#b#HhFvY~Lnw_+)6{$Oa%sYH_E zrV4A}G{d0C=7fU^0rL;~1E75PBZZ6gq(OM29K$WYm6?18{S;k$azOHvtGC%6%9c`l zDo$y126yT!R0c{NU^T0#`x|^z%mA2pn3qin%hl||7O2*Dy-Z;m9*$WQAVzz8RzJ!W z4P7g?)=RD3Yjt(IP1pDg@jSg6^EKjK=EgJ7d;#6?a0(~ndYc^C9a1Goau|XP8pNlh zh6brXY(j0|6VyU2zyil2;gv2aA(2oUt6qLKfkC3iqyy?oj?_sTy>-d~V@K&tqOvPV@LuH?7)*Mn7cKlFqU1dkX;G z<0xr|&%FdKU=(&JV5k$Affczo{UnZ^erfDu!nZdwq|1PF%8cu}S}-_g2$PsppgGmw z9)aXewJPv<6pQEI{H!D?S$95X3W!|(t_Q*4Vh%g&n?sps6r07pu%A>rf5aG;Qd--| z)4Ct`Ee#AEEp!73D$-u13WuoKCdyCp@EM{1hCz*-&y<3729=+E<*_z?>P--5U$7QP80l;92%6 zXtNhS1Dq~feo8Ip%Ps{$Eg!{uQgon&VhU7Um0o_@Daescz0}xdT&DA&&%Ytkq?S_ z-rj4wOP{$lZ~o$xNO1m%#$^SD`Fw6tN&G(jYK=i?+KfrL#7Fr*lrdJZ8Noa0RP4Gn z^`^?IS%pv;q!kn;OTWWvh$oE-T4hur>%50DB&qxM24{#xt9=x}^~>xrxu|NF00P=< z1LUs>d9BcDJtKJT^(|%RW zA7RoYXb%S12rjXz^;Ua7w?XgMghzW-i6Y~$0@b|Z@9&=m4vubwvFLnAv!ey=Q~)C~ zd&T`ApPzQG(GUq%q8=@1QvyOuWM$o7JUwY&5#JahGcIdEjf`G5upj(pATWMaYX3ui zX|_M)T2V*hoeJV6fS@4!^S>oKBg%e2%_^6014?q44t29#zszN`G>g;)(tFj)B{_cN zwRUKJQ*64-KS=D(Y39$nt*efKVTEw}u0aQ|>ldo}e+*vUR1ag()yHFVx zQXHz^CsC&|=tpKSjlf~HN{RW?e*-7Ray%%oG79**0ZjM+$}@uE(>q`0F$)f7Xie8Q z;3>_z_{IXsA)F4A_gD!#T2;Vqr?`7yLlmGcuX&Izw>AW&VSQ-!8$y+iXiydNRK+CK7dc18;wSO*MbW&=|g8zG@^ZN31s@(olF^! zixrl5im&7ppG88DGs=>1@4rfyXcw_PH3 z(yz} zM1byd-5vt{t81r{8Rs4&UJhzw76ZYl^-4Xt$tB?bpOIkhlv)Hz+doKpAdQ;44qOO2 zln5O3er~Px@tXA7odMUup7q0%%8~T}q%7HrOia77G3-Y@zZ%4h~!uvx7SWvbi}KbC|*O$;*p(v4-m3`6y? zyO3pjnjo#O)~eOu(rc@De*46ZCaiaT10a@Fn9^S&CK2MRGtd(BDQCKX{uwqMu+D%@ z{QS_m#E1lZLWnVPo=S8ym?HFmuveW8(FSU1VBS%rSX^vqC|au8@|%tyGZ0GGOQ7Ef=mYD4>c$t3Q3(ji(1pQy0er+ zB6@9j!>KgNpzC9u=~l%A=ev)M_-W(6)%7}N8? z6c%Op2#Q##)r}X&m$cxo6QakKLFX0jU}U0gACyYU2PFD{z}fhy*_ zdVl(ZJg2cx3>~tn5yd?OykU6hkl0WC29fViWC6j1P~XgE%r@s80yAz3+o;q zsFQ+`5tj$rs0k_5M=7OhaJTMzonK#U?~e80R(Y=F^VS;!x>1Eu&yROCoiY*6qbEpt z=gF4GYsx{P5(ssYeX!a)!f8l(_}y2$!9cWc+n+HuabwOAx<@AkX6Ew0z67bKzDc7q z&kHZy+FNBAC_dt}KJ0gTqzJkay9JW8g6>^8XU9sYJ3*s)t_s3j43-} z*{r04bL?U+^(o*Iy^hw~?k}|1u_)=ws8~CEePOb^vEkEr4)zcM0Mcqn)4SLYJ%9!q8EBWz-y|J@sF95fqa%p;REAkI*#@>;7*WAd6$bpwZb$gdbT-y zoqF_9T{S8Zr+qx7(i<>GRc|uJ?&Bwq?Iw1og*2xfrQpqbdiXH$$CMsk3_A;>>v}Ei zBPa?F3uhmJ*fm3syy7yQ`jI46a@7hXs&eI+dq^dBBsRI+v~4=B0bPF@Fzm8e|e%6_l@BaJK}#Tv3ZVTRLv9YVK$Bt*yLeOcjGd z>;d|3$I|q!PSWr0TCoBaPz&sqhL^tNMx@_@_)4$}JKZWQo@>tKk#cU~9sf!pxf=lm z4aaJU7hQb<+@0BW)B)sk#o9Fv>k+rsCw@&xPh`vHWZ&tI7E<9bVF1&ABEcw=wuzCg z+f$r~sFe=O`7Ldkf>(AOi8OITdFqnW`e{39y8WI@;Dx8+WXl8Ji}E^Q;$2|2jbufd zzWHRK2AOM;&+~Un(V&F>v|Kgq4UyAH-l+Nw&&s)Z>m??F)EAZzU%!yUtoSYGdq!d| zjvZPt%jx+9nbCLG-0siXEIA^cq8YvNy1kQA)_rwU0X>f|6;@j;NPEiLqS0A9y%Qcv z8#kWov3+7IAWXc?zps+Sbr~w?8sGHKv>*}C`9Ho?!(2l?r^8t*z|KH`ACn-1)SpUZ zb#vmdc#|YA8Fsmwn3FD=R*&Rp<4C!zzm|sK)0l>US9yJ6(n&wSTtl1$XLjQmqhnx% zGRAR=^}Qeu1#;9EX$2Zp$x?}YE+YHu6RR;EJ1t^urMoQ!4W|!-58R);4rzv&@km55 zgxRf*fH_K1trH_fIv3m)&l2k`&uf3X=Eil$@$h_SmEY_WI8nMq77%fEa`0_J!PZtT zd56wZyT!Lz_t(V7>$F3~d@lA~C!6(*{_Yo&)RJc!P0e!###U{QzW0X5gpz%Qk=HgT z<*NrKiaoc(-|3Xt)%)FMR*I$HV6riCJ>Bp5e8iVcj&PMSzlYyd{zxc>iVZGD^8W z0-Co5-nA#hNYgkV&bp?smqH43z>-Q!C;fKJec#myCa=q#pVRAAn^;!i6QpK)R<~bF zmPoZ?%saHSdR>vDZ^Z*56K^ z+fmxBhMSUhMx3peR*A4Y`;nJRRY9+q{Zb>AKPB!anQQPnpU}J8_6iJ8!DfvviGMHy zTtj9m!K3w*q~$|5fv#bfd7|sX>pUve{eXXpHwP@xm@Sv5qIAsX5$&KDbEz%{!59*m9hoc-kL6y_` z*3vO8Her9eN_~8xD|!XtewRMmtVgv{)OaXUuRDz6c6qpXWR7UwO5}6BLQD4A-4T*) zf-+--$n9?E6_QI}1mUxKA|63j{qD@P%riQT@pn=;ZaHcsC!5>BSl zLo%!WT7^u8g8U1u_UJ?pI&9)6wh>}aLrF8sWxh#h++s`S!q41utGkvq~dk{~||7-~qGk=RbMW5tN&Wn*N&8SlQE7%cRcESqG79f~%GGJNW zJ(O)7d_G6QY2J>>Xyd~Il!NVY7Il;&T0ShAf%5j)B}XE$;KkX>Ur^od3KhNi2FkH~ z0U1G7AW=wtIc^=a{*wO2DuTRNRI|SqKhWC8O3oSMUlD*jjX1mAP23CtUS_d8Hntg9^C%hm7 z+AfYb(IDBTbuNdLFw5ASr3BslyXU z0qO_rhgT^i7hBIA2Le`5p+lzUwoAw^7*Fqccx3sU{^N)C*{@Mbm%j?8`#AF|AoMK1 z9f47ZZR8b3S2qEH{lF}_eAh#JkL9#*14A@YiF;#E+1(QO@9wvn?TwTiA0ZPQVwTDKFc zSbjJEU52i~vQ?3G9&n{>S=Re1i=Q$h!1#;rgT$kM4wH<}`QcPGUCz6l*&pnq zM0fDaXlhp1GuJii?1w>tdu13X0;$U2c8}h0JRE&A%Mo8<`%rCh#VIML-bpR@@$bCp zZ*TA3ax($te&8NhikBQoJ%#13el8>F3pS@0C%J{hN?$-XK zC{_ROI)8E75;PNe*Ei%7+FaDoPuW~L26}1(yl<*ZSNdW+9X5XO{}}tK zuqwB%ZCQd6iYNjC27+`c(v5U?r=)bZ!~!uu>28p2=?u(o>CA)3>H?lj6r-QB80n%-loWk;5I2Yc@Y{=E09aGB?L7T5Xvvu+G$ikC55&Yp+6#!EBq8$5^c zn}oW?8{CH+^to#a`$MIMYok$=iK8i<+2Z29Uo6xLmB*LN$eP8hC-cM&4W%B6o%wAXgXR?dw17Z&qLJ;l({f4PRi0S3|KHfOZ&aT$Y z`zo6Wz%ESfs@24G5Ngq9XHyqAsjjW+4b9hrsSz@E_V($X=O?{2v?I=&Ge)&HgA&SS zzkOBA%;CGpGB`b0-J~jS&ONd1nr^Yck+QN%sb!kya?UNZJNx#PgK2)zdNGJmN8N~z z7!e%7fm|wcA2;hC+m`Y2e{sN;+2uWqEasYEDE3GkS#1Ilus7&q#IaizI`=MROUMz^?Q933U}SD=YV< z)wtUQV8P~n`KG&N+JE{cpRF{QB8di#_%?>Qm49+#tk6`r_t(%}_pL|osofp>A-f6% zSxK1Tk)N~$-&jd#Gi9-$;il6v#^zznQn6kYlI64wpa#&jYk z^AK>Dn(W-47d#-x=yv?^nNoEo-jyN%zUn(>P6^j+3k=)ZdWo?k6VJ{-#_))S%h{sv zZ$|8e{=oOX#hihL(AbRcAifLNw0flK_vd()kF4-w5s#XRDr>B8CDGO?5M`FzL2G8=Hrbj2-XdXzHW6Stz7ypA6VfJh=xc3@i z>J=MNpT!F6tF@Szn0&FkXAn&_pznRkdEP>n|0Y13Bw%bo9Jp!&sls{P30`p#v7(v? z9nwN)w$kczVG>T-u>a+gZ+GI581Qo3NEC$ytu3v?S!sDx(&+yYc7`kZs|k<9U{Cro>Y+Id-HFh zf3B%3EHCjxOJ`b|zCB@wxkj1nLwe)ZLkE?%AtmCfsw%wG8l8S=oy*xAMSGJk+ zXT>sLoRe}kn{Y6)=~QWR0xM=*8zj8_CXx~o=vPPc zBf`V+?9Pr}lyxx%oD6hLlha9sz4+6B=W)2saC}iSZKX_1NJz6jKW{kK=u-7(0&B6i zCTwARR+qv0Z1u+R-tMPjv!3fB{Xn&|-9GyKH~qPV`N2->L>%P(~_zAhpXTM(7mW4(KzTiSb3?y#}T z4kf!=Is9+GcSY>)uZ;&T^V6`XL5>I}%8#ZZmB6h!ITvO8IaF7-ujf8}ur!v0goI(+ zfn~8lo73{o^jxj6I#HwGHrycTD6g~g;m*XqW4(GU_v!tJ$zd?zoLwix=oJ`9Ci9r| z3lUoZ`?E>(&^N=srJnm$x2~`d=O%fM99*0)7hA4I`dbj?PnL$TT282(xpLY3&cmu1 z+wPR?BVKQ}l~0}B|BKrPh-SC7A8+l-wi&i`dWdWZ37SrepeZtk8}|@BI8c7+R>>Wc zfDlj=#$a0##YDHa-|{pZDYzD@I2~Ks8Fo(j&LlSK=gG#4ekFJPc;bGh9|J7?ni9hu zV@iZJ%V8m`TeX9xpFmA{>t3I|^-CYR-#!!XdJzr{wH~yk!n|%Rqrl2>)auWysxH|A z4CmjUqpFPQ3oQd00P5Gq;DCFJwb;^zn~5(6S=hO1Pd7Nhm#WZYqO?7Q_osI{D0g$$xKw!peTPfQR{Ag{O--{Wd$M@H z_}in=#C<+7K*R~?3@H1zhHI;c7Z;*D-EKNMysOnnu57DMA3Vr{~%$HWBK#HuA zv~osa4aRnMiGK%=9M9&PDoR$!jw zFiOoHQ5K$=hQHk&9;dGK#q{Zgj64dM^Y}M`+10!JrY74H*2F}q!AM2DC-6G=!;hGW zS*Ac-v49gV=oHkS|D7h-CKEAfCTx^t!~~-6Z2403 z-k|F)!CqUKl7UB%Q-x?G&D&2pOJu!XyAcKJY7YqG)5jlr zsuCOVXxFfwJ!1|9wpDrDcWB5VhHbOEv_Aq3>3KsHZFaP6NDNsPjqo|S| zi)Cmz^-SdAAjo`i^U^*6_{>6yRkwXp+K`Zf%P$>W^pRhP?NJ-eu=ttS^&t-}2;e+>vVZ<1}eax}e!#9d(X> z{JhZUF{Pm66Ubw^=vI~>_PqGtridU@QOrMKZEI8;oaXfi9Mh6p(< zp4oKedpx7#ZZ-<)l;~Q_S2rxQ`D8GkVCEJ?CW;-9d(B5z+cy2}^FxCd#8fsr%@`fM zy}XjS^7E}b6SJ4pqvt2@OFCh%KhVb6muX73{6NZ1Eo}FXRk(S98+fm1KuMjLEsXFw z+g-E38^#N}NvSleT$K=8TxgeobZe-+J;x6Baj>bBK_EBtw9_KSx=RkR>Osyf5i(t+<^XX4&F>)cVGSZ0An; zia=bvtvRz#Ujo8VuHWqVu*(}F%d7e9)2F2>PN|7fQ`!diji8?ux?Z+;V#zS3p(@3U z8S=RDwQ#PD+BPE|c#)#fUmNEa#KFI<>K-CX8kQ)c<^Cp#8Z=cL!Wl&F<6vCZKxj78 zPG>TVZM97wmsDlKoISbJ`95X7jU0cJ9!j*I)s!S;Et6pCr`co!8H-cb1*4sxU&F< z;-RN<8X7caZoywg1KYnDh^D``$a7d3QjcY|{Nr@9q@;MEDCGRruxfA;AZ^Ik|{!a?VUZ(Xx^DGgA3 zV)XDx(4@=yK(rb>6#8EB`=woT&4|TbRRO9EhLn_NPaQ@-&jVqA^W(F-JO{)RyH9C(V=f8;Vr) z=6{Y69zp1gKdq%D9roK8?;&I_NN`ACyGz!gxuSi{kJJXTY(JmvmzgglS!->|gQ6Tc zHOI_1w-IwQvkCRnu`800I?BfFxQO5E2s4!nQTxm8rtqMTsgaPAYwLJe`b{|uK6Eu| zwIeq38!Fq3V`%O@B&`IGzyc5qxwHCq5l7?D0N8xh+4Cz&O z;T*|P{Cg&bO*UoW5s_Uv%F6)XK=w{~Q^W5WI0@kyHX)3PH$Mruqq|~Xg*ES@>%m=j zSp#CjhQEOvW9VBaA_MdOf@W1&|6wTiNy_@KZm+@-=z@yS!y{_==+VIyElvyYfh!tA z#eUQo+7ZSZo|&koZ}^^yY4}`{aaAcKUw=<|TI!MY0SOD5vh+CUk9bboVT<@uPLyKR zzlLK-E1(QnQ%vq7s`Fz`{= z077!WSzN(4d{?c~bFuCh1=qp=58|77rW%w;P3tvgk~2?}+nn^p0uM0Kd|hZYh4-=U zNCXzv=h|_Rljr|yF1hbgvD9OR)P2Y0=tYD)TT$1X7tYB09PfgA4iDd>QKz+fJV^G@ zO;#0QLt6t^$*O1J0RdeL2^FJ0@A&1g!rg7yLclza^T?E41hfa_q;sKaXJP(NiL#cH ztBHE8p}*E57y~qH8Wx6|vzaq>ahz#jw_~WY$a>{MT}YF`f~wOtLc*BD_+C(%gH(Me z8;q=S?Cfd5L6?E6>Yk<)&l~1vrRhO%COQ$=P))(4FJxlrwd7eTkBKQ+x_F;N&lx3% zN%h^1a_`0_)(Lq1rl(-q@;Cis9mPi~VE@YT?wjMJ(ZWM@kWsyVM!_0_PfyIg$yuVq z5L#?E8)G?w@MSnQiX`;wrBhy)FhcvThpsLsq-=eEY>-jFijFszouhRx-d%JW6g=Db z*jSx$lVTMmg(66}P$L?fJI>3_c|2%zd5@2}_v9z8Q}Z`w0Q6$aL2nrvJ|*Yd`0K|w z({K+M!Un8P0KRO9dBM7lV9yMrgpACPN_FS*Y5f5SCh{m*0&@ZBlQa^;JcbcXK1k3P zg%sgZtZW)TLq}u5JT!Z}SPGHp80~p7m+x5z{Uz{>BYh zdV0E*^9wNkdEK5J!MJWDg3)B{_l0%`c4%6=L!oL!E`yrpzm&~kv06Jeg_ zVj9D#ua{D8TpU-@oqAT3$HP!9=;f>yl%4G{j5KiATG%00@>T=rd9rN_ciow6BaoC) zNy&zGx&=f@MVJ@nPFmpgejyGIpQ}|j^6+xYc*q&9Z1e<)prKci&Ash&0kf8P5q}9x705m%<2`U)MEhB)&SQCL(x>y4{_8aq zE-V)&dNK4SJSR`del}2?OlizaIt$I$KQ89Ua0B~LYR@{U8jL{9WVkx=Ei`y+48%;1 z#i~lb^dPbmf1@-?L|v*$pHqZMNL^~E4>BCV0@S6~O#&(6=wkx>M)`6ft$~a0q^ zToJtw=n4=nN9gSCWx1(ZFh=Qq@Ng7px3@MLH%0;2!&E|h^BfvaWkGJU(9Q_v`nq(# zE%yf&=2<|bRLH95^baO{aTdcuG4&9u7^j~&2m8?M z!ZyShr|r(N1-)VbnCC-fb}m03xL*KfeL3B$T+VpB(^KILwyS-)U#v1_YPbxc7;;>2 z3h5O>`}eC!-?fVLat)3DjBb#|f8qDW2#+ET5w>DTk;3|&@!$iLEjm&H@Mwy|F_HV? zFKI^y4YT7fNf9+hO+Wh|H?zC(Vk_&virRrJ5x4h43BtX4dr!iKOH?bhQ792chD7cr z(9IzfrYOkeO_T+MeKT+mDI-;zy|xFTul?v#y!C|{LTMxoLVs#21T~968fFu~NeHN3K5kU+s9Fs?-Wekccs6NR z?jOLoP6f0nL|3=4Z^elGLsQ46i9dM~J%)K81Q%gh6?4PYnMSW@xK{F>5sOtUg-+i`SOEDoa z>uQo;{ux*pO1TYBIkPuv(d!TXLYz08H!x68*l=LfY}u0Z>`<{i-{-lWU&Exw?~ZZX z{?U~4iBdgSD#JW?BIJwA7Rcp1%z}r8n9W&&M-ZZdS_k}*z$N}QFccLF)FltSNVhz> zvJex>8mnO|*{7evPRxlbjRs#IZ?`!hZbcj#btQ$RpXq$fLjZ)G_til8gOF!M`uIW< zvbkRu{GtlOz0MmNJ5|6m-P=SW;z1kv@y^QXveN$}CER!A6n();CTXzNH(V-?btsI6 z{i+z21Y((AFEwaHNLa%B#4tt>Jz!JZmdS&n z2Nu7^F^OA{9fhdp54g&sY7Y)`7Xk9lUEqt0xH+6H==aozrt6^kDDnF#KPMLp#^#-d z7&%k-vs4*hS=E(Q9OPNokCWfTHU!x)e`7v_*PNDuj-UQpX#_yW=z$ zN1O zKlq4iz=pzv*Y}qJ6KPCY4~($Pxn=3#08;e9f==G0FUr)X32f@ff=IFoEM1CEo0d-o z$#kj*S3bj*E`sW#pf_{Y!!&yo$Gv?0c#yWs_oufE0$6jQc<%X%Z~YU8x*wDCh6qAF z1t6_0DtgZ4kiZKGc_bdY6SwF_)hU^4Gl(9+ypv$RfXt86#mY)g($W^1S88Y~6crDY z3rem+X-l-u&*K@L!`wqxMoLWxc$$D)s6G57{b&k`KWS=gcB3ChtX@GyHVkl`x(Tsa z&l5_LrP>;q&d$m>I|k9t>#E7MQ(?!;+OnCrm6)YaNKh2m_#Mpf+lzR)IC;6oG@Nzg zoBU22foSLD>7n$`Vk1GtCDa`Oao_o}p4p;b-uLfEz5%j?a6gUOC{{NsXJ@kb?7~Rm&P@)x{*EvJ+j5$ZkLMr!th$OMd7J;XE2ccGyEs?3^2$Mvk{^^-i8lMJv{lB;B ztq$*E;M3Kp7~oqzK3H=!&IQRGOr|l+Q~gpO17*H=OGHorOom+8yA8>%@bLRS zhuk6yLWsXEglrg#1kEd8!yu92;xiO`^)J3wNoF(ug@-&tr}7}2?ehF9WZz-xkYRla zCTva_O+b!a?UmlZcS|O>A*tiOQNB1cS>G`#*NY(4_J-M7b&ay0CR0qx>fTSnx!L6> zee*T3C1qq%pimTXIa7Blk6RBx;eyTZWY2FSzV#bIZqSb)SxzcapoTS(C6m5?i5=ge z6%yP}<-#c|i!gPyG&sb>mffl|nwm>L$tQ(-{Ca)7r%^k*hD+2o=t1jFU%*%BADTe) zjth6b$mKzNu|L^wmq^!7f-jA8D_uWdl=vSQ65~58|9k}^@R~JsQ}L>^O1FkCCMQI} zk7TX@Z`?kb1Lz*H4HZbK@wCODdPfWi})07Y=D8-;lb049C&4jlmF41}YTu!=9M zWT~zs4V9HrGwvn{6^!B@=ttVnt${rfp4M!)Ax(kFgWjff;27&KIzf=|J_Nw`T2Ehg zsK^^t3JMB7GY#goPq%;HMMGJ9g*C(hwtb6A;tOj~RdPhS0i3N5-n^T|d>TKXwyZhS z1C#g;je+v%m^;-dqj!lA5RV=Pyt$deZuz6kPS0qKR{7G8JFM-~huD#Ssd!tfQS~!t z(E=awkb=5wSa83b{5bj0-lG*|G(mRj5AWis`RtC0CV?-b3C+vv?mQ9va`JFgY1H!_VVemgLVvB73N=Jy`S`&|3+ zD^NfkzFM%!5XWj1%@aS5)RC?1YtHE&osx^_W4e0viltk@Pfs#c)))ouAYYsOx$Vzu zmNqTfVaGe;l$wU!^l1wRk!<@eP?{c3r+blbe<4ot<>vD6Xn{KU%BEHTS*0MF<`k1t zt;5RHqE@CH0uq+d>-fFCGi9$ElL$+L1J^dt#_(&mm172@L;S@38s9oMMW)Q6_Z=Z=zrwq5r^l^^Vp8D6TC6nkShS^x6|B+&3`+z0H> zb$T}^wA`DVXVi0{7|#n#rW2J^*b%<45?S2u>gq}_EmhJewGh@5PR9gkI1U|D6R_Sm zRm$Kws#)B18KEYsmiXxhdF6qCKd^ z(_nYA2a^wPiYL|F2!wXiMyTB^hEyUqzvgj4 zQefAPkvo*X&soFM(w^QUBwXG!R;s%A*j12K+;ao?bFf<@UDB!jFRe*zBB1f+x@;Wl zcEpvmKEM5u*g9~*(Br^gIeXb^s5u3BU4PLgN;zH%k8)>9b)LMWLSP&GjcnjJN39VW zchNE7aaJp!@W`D*YR68^!Ao@_MTvOh6_L44`RO!qMGvB70F7nGy|=+b<;MA#ttxv1 zteaC&zjv=UEHI(BLc;#dO>nR|MR*wH?gIRjFXF@FBPp3ACN^QkonWEkx4-UJEspT= zTE;!1l_kn+AecMjfB)!ICJ7;GD>8a|p%=4p)#hlb$O**!V3_(0SgbSmjUT|ecDvDu zOwJdUOb%HWrg%Y&jmY|u04)w49t9AL!Gp^WPYya~cqp%~ZJ~)k+{LA`Ax_>FU{I9i ze&jcNL_ieShgPpvEhzHktm5r)i;UuE&Mb+7r-@;1G>iLZcD}pjD~8xPI1iY`yckI= zXQ?^fvJ+Dy9tYKo{<&d$jF+{7Vzg7vNU{=y$biFvFyrx{Eh!94zb`Jf1C<}>p|?IY zMr*ngD$>5;Eg-r)>rNCtz)WgX%vMDuVtzw)e)E}YdclO!&un`Faj7-AI2v}yNEOvW zQ%>frd08$%aZQXUo(c5 z`rcoNYLDk2rkiq$#a{y>5p93g$a*!raHyMmWja|2Z^69)CzWoXGv+myo;&{Yhekpq}^b$Rf@(@zurGf5>f5)z$A5dr`PDf1AY zZcV$!ug!s_6Y$!!aK`#0a?O^X#r9Ll`dQ zO41ph9lK~G-OOV{QU|tRR8V}Nn0DVQ*rho9J1nYEZl=97y66Mm%9{~QCZRLT^bQe7 z90s%XfC9tck-A>DVIWARGqu7A+Cf-Qa#0Tz zIUjrewRfGXmt9==#H|=b6dq2Jlxu-Ee==-p6PMjOzLzZE`@4)svy7%ET0u#guJbCG zUq`E?)OHs%Ln^fvh%oxr*>T~?1ap7H`Ww)ojw#d?sk!P^H?bdMRO|aQvC;>a^w?;T zI1gCQesY?M0{zl@yKLlWN6!HL$Rmxp07fSz!(6r6_Nn`Tt1H_65;&PjgEZ|)c3rlh zlLXWo*cOZ_uM0|;v#GV5HrQ7jm~)X9+=Zc$#}xYYS3(OwnwelC$dP>hECoTbu5)m| z;&Qgj=#?BF4LcpnF%bf^L<&nExkxcEYIlstEDwL8oJPUtwm-%ucynC zoilUtT3;i8zNePN2GFCVz^YMhmrD}>SwD!u1q@`gw|8>iJRqhgaI#M4;UbT4zp3#M z34%`DBOwUY)Iyf7=AeRT?JWsMQ1;>Xf1$f_b{uE4{X2grsNo#vmUc!E;$!e}K%!ju z&acLkv^cL+YsS_53z~*FE>1tztw)}p>ienntO$f zx(fUYkK7lOHDavRycWe2*ieT8m@LD{Z{aud9yuL+7OV22b^dhK4r&@k{AcjT z6#n1onlF1BgCg!T?wbWsOm^?gJg6X8T5F)*!)KH@l-VU~sBpG%bzk8rxWPF|lqCy1 z%D|LGqI_f&vhpSlz)N5gV|`0DGEe(p21EK`+IkNFP~bw=&{RAloZzyKLcQi1m& zc#(|>@QJac5asdV@^vvD?N12CrZ;~Ax>VLvcVV{)>f=5y&w?-~o4a6H`GY@;Yk2Yl z15AeP&t>C&xPpiD)DD z@AM4VNX#G=yoye98qI&VFpH&ik<0Ki$5C+IZzi!$1aiG9IP5@mTHV!>;4Rav*pJ-4 z3AHs>x)UMt5YM~q-Q7{5nT+AHQ>UMzdsJTN>A6F(4;X0b4eaDm`n1+id}H#$!Nhg8 zyuRS?-xVO-0rB+ll6uEG%!Ez@#G%ng#oXK;16A0WR})GKL51U&qXG?r9gldUt#p1D zm#oiEW@X(!JyG3^dNdgXrTdMTupjSrS0aqFviWb2>n=o8XF+amtE_QU_nhvlXm2=L zk~NECcC_2Coykmwh>F>|;b?{IkZgPQ_68V_d-+`!s{(vHwGJv&~EQ< zOkQW=2;z=`h`K;dBGWD&6chk`(@^CgkytC@J`&UzN@@JUwm&pesoE30PccrrV#8h; zeiJs$u=cbkwqk3pJ10|%c}@S*=g)c7Vf5g(8}*@B+aQQ8{B-kNE$~Sn%W(C@^@%PM zEQ+popA2)KqZx|=TS>pm(D=Z>%3bJqSt(y(3VIKU?4h@l}g$)U<&)D@lycH2or42g1sqkyE~r zovd99z5>h;he)PCS#lrfJT;0DjuR+0M`|FxfUu9;Ojo#Y5f%i@L;&I z+BD#CT8xf;t9AMnh+2hfEKL4yx(?Yh=qXg7m3b>^T0RY5K#VztqV;UIrRX%L_5r&_Khm3jB{CBScu+87DDBdh!D4sQ|vW2TFL zY(Yii-vI)Nd5RYk#c~G5gAWaO{q8F` zh*Ol)2*nY+;E$jfS5B z2X10;oG||`rgiC@ghMrxBWV)aTz=2fBYm)pAn;Moi{U_C53rT8gUNM=pX^lTBQSzg zMQCQ7I^Sp_=KLEUYil5Q3CIKS+kooj-S~N#LWIA99z_#l%Fg`Br;q(_OIZ>F-?|@Y zXzoY#j>(d6a%zNzGUj|Uu$(Lhok2CjF1P%U7gB#Z(yn3)ko<-Do(u+M0Cs!|Sgbp2 zlhD`4Ra~+O=0P>XEC6i_C8Cte|Lwg7!jBr^{Ri7Yj<8=Hsng*1g9e8;BYE{&9zA{& zI&V*wjpb#>i%Im1t}uga%ikZn3i|<91EIhC=UgWXxB-hBTs&amvJuWW&08LR{Je&Y zIe!m#+0KElS|7AUpQILr)i(ETSh6Ugx0+Z zKpJvy6}`@(CcDFFU!w^@!O}K4BO>|qfNm6q5Dl2wpbZU*LQrrvnykI+Y?QcCLm z27%g*C%obGl2I0jYBk{dp<&sy@I9wM=}-k#Dr8ENrRq}2ZB!_}lg_Jt_eLt+SB2u@Z+ zqhrGc!)^VqrH-{cacfXiM@RPD@b8xY8lGW(QFm}Z4n(bp0sI?o4mS(m)n8zlS89d_cIGr|d~+>D46C>X#{@R!)SSGy1atB0F)<*XBE>*Y z6sj7;WJY#A5-Iop@u67S@teu!2-xQ~Wvd$c&d-*(<37>N1ag4G*o^SD1uFT_KD_^b zfA_1;uD4^x`hWWh?cx-r^4n&MeG5@Z_?JgC^lE6N?J(O*0V9xc2Rb zdn2aD-_eEyA)$8?wzlKyJsmHY{4K}r)ZF&X?Eh&k#K~gVI2l^ z{e_cNce6r35K-X()fvccAZ$6D1d3`8*9e$gQ;#k1rrpbPK!h+lEpC{L{!RdUi}he_ zT!nZ`Lrso`nAH%~<&G)uzm^#M^f7H<7;A!_pCc1{=nTP=ZHIUmwzuV#lqfdqDtaBC zx+4t=`ZY*{VsmH0!DtdtCr$bAq2q(SbyOhuRo-{YMRCc5}#$zNbL`O3hpZ|LfPN$e( zTO>+*d^GsU?vMv^x#X<^Gxx=0{6|%yiuIGA5b}TT4+O8k-@Ly6=4$*1smj}yA}f`#J?G{nly>gB5y^pG7$4l-@*4CQ?3<~nY}&vBabFOpLcc4?DCm$@oMHg!|87Cr1@eiv3oT#-U0Wba<{#QKAf*%r>^$$!Y#zk zJ|ApkG46gKEa%6;5V(`lh&HVu0l>nJUK+5u1n`xL|Fk&}vT7w+uH}V61ZK~>?5@>f zo-&NVisL3Qnm}uY$Vh3jbj4G*pGBV0x)UwJ|2hXVd{e_*sA zOWBw{#_e4Ps?x^ zW{}mVgz@6cnesnLRv?FZeL%5tQMSvlH{LO$MA>0=<|l|6G&qy`?vtQ!@0DA)?aaAA zHSL-;O&WLsgZ9`b?*_EMM4Hg)(_QkHHO)$j*pC>)f3)h>M9TkcYB#)#+ww9oV~+iw zHNrn8!;MdhNVj;KWJ}Ye3 zrtSNTJN`)tup4p-n9nFF%?c|F+T=R`OjKF&+A^gG77Z##0KEu(tfYsCJgJ^8c4gsF zpK4jm^K(fLp3W(vIL>n#DQ4ucDA29KXyb{K6K|Zoo;Dq?rWM`6`ohKlD28J)P>cD+ zp>D^!?I+RLd6jeDBXfHWj>l5i0EwJWRYQh{ERaUp-x$HoaLV)UFI3N>6%wZQ(m27tsO1fenP(!f*yJ_ z?p3r5VVimaD5F7Z>P0Ec$Or{#5Unw$cvF(fb84sbV@{iHKvro;#XA$loVNWKtiK>( zEL6MLIvZ^OCXZ0<7qID@=f2=NH#L7a@kq)9jvi36_;n+o$St_{iG^ExbhW{8wbb~L zVxTOz$vABd1(lE{{qc!G5s`qm)U=AYAB+Aqz3`{dJwBk+_;*b#$(%6UY8qrl0^7xA z%GF&Ov+mXjQn5^O-@ktpcEV_u2|{%t>L+8Bc}4ODRV5!xf=GIvluyb%1x_}LQw1t~ z0=tjDDT;=L;+9U2mn^+|$Q4P}6UWy77)sHGbdsf{FJGf7uTAKZxT4MUDcKg_;}Z`0 zu8qY}o?_n@Ydd;iI!P+=O0eDV-wq=X(Kf)Q=no3{RFNz#$e(P5H6DEeJQ`ky=bDiW zk}-Y<(39zb>jb& zL5G0o`j2^~@kbW+giG@+osbuOueymQY*g&1T5zUk*vsxxDmP?ef@rsgo~2(@)LkI4*8x7{qbNHsCKY?o!{F}1o(ZRj+@0p#?s>G z^kN+Y=z1dunv$IG$uF3?@mp5qrd!8;j!F5c86r7-opGMMA$Y_k3+)}>|HFmAeL<_< zJ-;q}zfu?AWG?PQDAzXb-Z(9*1v}MB5E_az8n{927lESS1_9{8ck#=dkZ;4IV=T!O zGkFz_-teMre(_>f>lsbE4;q}GKujWV)afY;3o=rwq?9uQ#{E$z0iI2brE|f3HM*=+ zH)}gPNl357$D^q!WeAiRjS=$~5RaI9ZMOBiv#;e}laG2vy|udPE(Ul;mbm|5<-_1q zMb+qFLdBfKT-y^6LTztMf|}CQVWS@KJub^`0+OoA#dqM|_r)Y6`pZv2ydW;imyYP2 z>7@tcDuz>RA^|*enXUsK*VK$z^fdC9nL?gZvGloYCLP&pzxmBLEs?|v&>DsHZnDza z;eXO*I1w5V^T*IQ>lJeAUaj?=O2+!JryuUo^poW8Ie*Poc$-r7ffFG<* z;J*D}G?~9w_G3uK7g9nokYrwmpPlI+uj)p2a9I<>-6=Az$x8#5u9Nt}KiQx2!4n4g zLm1GKVC;n0&O~iWEge8Km;OCZjD$e`qDg#C#$+LnKe5Qk_=L5$XsGfnZ$gQVK2}H~ z^XSc|{3mz+YNwuGJuOZn7;lU|*YtJyzqc+Uc;N1?i*XyvR$U%otF`%wbjAXWe%EBL zSM$FHLR@(tjF50yqPK_RnN8d&R<2Al%Fq~N zrhnx;h-5V#B4rSk2-UAq@XlKbFr3q7eDuBTK(WPf-96kNxC#t#ADhhS#2XH`p2}Y5 zeC8qys4pOl&h^r!u#UTxBd5Bt13(CZ=V%`fZ}`O0(QYk9aV^46c^${=GkR7!{KID} z5g}FlT`Ja%zI8rB!yI-sk`{7!Quc4DJ~JJ2U}`wafsQ;?e`%al%onU=VB#bd{ZqF!6MbnPM$SDv$S> z!^uL=d2Xe($)UGNJenUXEU|Rt2E2PsMALR}MpXShwGs;L#JBp{X_*O3ju;?}?sX4c zNOZp;iQ0f4%`~6fNYLKd9VKx6l3_7+)|Y@TmM)>s`ti}D^qc5M{K;d{I|j2UujUK+ zC48x}zQ-^%w|707Wzyg*4G75+3w7X{9CNK(J$^}36P0)%^e@$K$dBJeTk9QizAe)B z19-3AW3t1KN26n;=YuxuE@)`!7@Iti5c{~gEU1;(EHjCYIyvb5A&B79$-F85WUb$_ z*dvJ3Q3z0%89ShM$J%jSpH)S$z(Ng|qRM!%C1qZJ!N-c;Xfl$FVKOwdIA{(tifQeZ zF+3H>I82-`oROToiS8*LT-{W}rsLu(T4;ZDV*DtD1SuJMG5UrxS{>57H&(#j{@luE zEc-7kLH*d6CVpN6fjDFJ z+vO621&KG5@K=oMi(dmWdkGpQro=)z!3Ej8Rh)qv5e{hlni0iaXuA1<>2~{g+8PEa zd;t)(t-ZABbUQnbLX@zC1mw`ONJbx>+8M>%RZ4-OOMKyn;g7;-!rJ;;mku{a<0I>C z?xu%dUj8ETue&k||3f;u3I`xs#MuETEak5M%n4^c2JK`Mc9<|-5RB{_v=4f_5li5x z)u@0VuLO+e#}wlng`!iBSTXkmZQ}WpI0>S z!!dKl;xz9rRB!U52;f=Wa<%;wvS?5k((xU=Sd34LKRA-u>ES_0Cc)6m7}NjBfw8&c|#Ddkvc zPXOffYpkFbKhXpjFh;6ZPD@2-h1e#@PO;z68WE`cCGfJ86EaqTP2_{eJ)n!@g=Msm$Vv$r+WTwyLIB4W7sr_JA1&+(P9=RjJqnY@ z*@C%>$hAZ!*&B|#8DIvGi8!J8(7a{M;BZYZek~f9Hx*6YCWCjp#;Jsy5DZdbJWz$H zH<0Z6FO}oQ`P-iobBlOH!2QondsZ7?-CTop7&zGU5y&n#EwaZsVXL2?xD?hHM`lr{ zcAssfgIjZyEq;5}Aq3Xom^?83B#Z`-sN96ue9%Y4YQ?QL5IIPP%1zMT!&XfFKmf06 zG%@n?SHFx4%k49>_+`4_2t`u!3Zt$ZX>~iM01_+{;(xqVvN3!sHh>z60ebOW01pOC zDGCb>wR2tHR88`@=8ilzx(yuQ)m_D#hm~tB+w)b$Hor!QGVj>Bl5(9>fRt#egijay z;ZjCf;mxLPW<3jE*z&_CWIe>9CnupGzwUzySq%;4TE;yZmM0$=fo8XU9v_A5cdPq8SC;!RZkMdmcdNvy&Nq6Q0b2JcL4x3F);9FNuGU zkv8fpz-4gX`)5+uh|E6ooRuTUO)=i&XN=dgfN+(Vm@SKoQbaOL&4%`0R_rPWGIgLx5N-q?$?lvCCZdx4fq~A7SG_ zU=lxblV$lxVWQ78Of760KTHE&e*B9#Yen$(0Lkp463`hPlB6b|hF z^#y?1R$B}Pu8SHeo5kMBdF^QvMOj=T1H%3ynP_S4cbO>CFKmO+fCZIYumqj|ZNi<}n5vf_hY>H1Qn?9i4AOxowJzoMZ=@swA`(W9T_l!9UtC za*8&n&VLq@QThv=msvel4(UkMVHUtwdGc}s$#dq{#(Fohk5=^KyuZXITgaWT-_PQeOt|Wq^$0q?DY|q;9U=hq;z&}&DWk6 zlbbfRut{Z@yS4aH&bbH!l!-bU;p>ZWh0axLpgE!%sC1JNA=lla(8gstGR6N#)mK1O zwMA>g5##_WARW>n90WzWySqE2ySuwfK%~37J4BEU=}zhHhJPRLz3;t$j6E0(IBeEh zbFLZRtR7zwo7-1OOl3T5=Y?!;*Z6APCdy1|b zLkJ~%H};gmziN~TD$>YMpmEQCCE5>KXe{H;%Ck7;Wv#)b(2|9_`IWls*4$t*c9oV0 zXwQ@v;NVBy(YLC=_nkkfkn+-E?V55vRX943vlPEDhdZ2^e~tfUAP(SRE_dngd#M0_ z0N6Xw5eHjL5rg`tRF*9&h!XDW*L5I0gZf@_vXcaSBf~2dT+hL!qxg#s>mD4ByK+As zaZG?4j7(l7CE24R$jY;KZy!M9X;Fx#iAIX%0e8Or(FR(dL2LqqD!}tu1sngnhwZl} z%dNf=-dMYQ(RPdxn4IKnSaZ*8X+C7b~b%fPuVc-Jf2DanlW*n+t|H` zvgl>Wh}{s_`707(^UmC8Fy*;nKoQ!G^wVWI-&ub_9JsWyhr>r&RW9@Vb~sOL!i_E^ z-|tLbCGW4-^MuM8t43ZDIhqGJY3QnJ(Xb~IOyQBGK^zljf9~rFC=O-Y;}cHjrep+u z82;lxo`gf4T)pk=|2=76(y_xXWroi0&l(NTen!+ExZLMamrf6yb)Xw?llWFTA1{<_ zczp}ndIeY#gAw>s?w`*hpUWHN-hK4n-VQP{#_UUG+VZyfKuepz^SH~=l62CWc z;`A?oJ!CCjK2}hl7jwN%tIGy0X}jKP974q&&+{!u)20z%q#dEpZ=@mvKf2~2po-=O z#-JNxPXmZ4@7b#0Aq6lyiljGc`)_6%Hb_JUOMD<-Qmy5KhV*v)&HCF((-*$2e)3Sr zt8}psBZwJC`fpbg0P|M{RLO_e|E9)4F;e70#cao0m20k7Ly(}LpuWS6dsF-ly+^*e z*4-E&YHbgktjP%VY}C4Gr!Kzj_1*oM#EN)T>^F@M_B@O4AzriY%J9Hte11y2pQCZR z1R~;UnFqX`y`aMdmaohJtfV3)B{l&>w|pAlCY=Elf)q(K@Y!(bilBc8=tHbg?^Hp> z(a`NOYM^4k#+IaJaD6lm%@+Wu;wKHwE5f&9|IccA!We^>j!#Gky_-lVd5qFu^kh;f zIKuH(S38_%S)5hCV~m(&HlI%60l=n0H7IC!m34s)7waCWwe~^>OT%x6Mb-p_`XqpJ+oP9;zcK}Yykk4u?LbxT&QVi5&@GbLnj;= zDm8p*Gp&Z$=%*SaBG(Vr<@-M!)fnK)ENvwwgvW|0B1QT=jH6P2te^VXC`^Y;&7>^> z(H6)ZDr8|K7wqC6q>!8}!Fk3fT_Z7kYiXbw@~J+jOCZ8A_Io92k+sKqc=)S?yI;+x z-k1_0w(aNZt%t2gCN<~Wj@p-&+sy~f%b9%fiw+9(zv1Pe6&h@I zhNyJfuS>Y_i?vt9rH>GM&eyYre2u9YIAl`m7kn~TGvH;yZ+Ooi+i%ucjA04bzkm1~ zVS&XGy-N|z(=IxR0W$g~yFt_!8iz3O0!5qrx7;GlC;eZaz&G;5t~P!i55J8P6N&8u zC9s^__;}$Tp5njJv$_6CWWa)JCAVRyQI%)GmI$Yewc`uEdy8)9A!q!bf3h-D zZrdlS)XG`|G6)kvzpQ=bC2fSXzS;vRj+KqPm(hw*hx)%1YN(I~BRd$_inJq3GpWJ{ zA~M75`ak=<-#hdFj#MD)i~X9EKUXY3w5AZ%)S#7_$?Axa$t%SI3sX7k0GvA3#varq zS6-hs^KR40W4Mp?Lt^wzV*K-0-=|VK={EBis8BOLH15TPyZtlB+?&ib03WgixTAq&pN9#`tN8A4kArcqD zr*{0o#N}B%7=^?}v@)=z(%a=`3PxcBiN=1K3Rc3pM34K;2^$tJrDbRiOp9Um2%(XoTu$oNG5WhYx$IDp*mDQ##v@b(V=jOWhq0XLQ-s zijC?(+cUYN7VD7i?h~>K2oZo(<#n~sBb_knTEf3Len>swzrA1aDy&*F0zvpAd;|c% z=SOhR*RpJ3DI~N)cVD3NItbY$GlDqQA5{N@d2mOcr`S3EqZlff!{qlI%Vkd5B zEuEB$%ZC|!9$CaeP=%DRomQ7q-5my@A^8nU_VJI;@5IaJ;Uc{u2GX(!pKzyNKbb-= z1=*RwpYw6q&@HmKIXSp_IVw1=N9B%M>0@T7Bo7K+m-n#)ipQf`4QRiH-=}qop! z-BrBwgFG0ICj3WrUN{0GRA)o%K^ftXJu+$(b{{LO3NB8tm6FhGY{$Tjvfd>!__)-$ zit0iMqP=${c3z%jtJz-P1A@}u0s9nfx%+r%meFyywd;6)X-&V>+z@Z65!G0_zSJE5+*U4W^(H0#zaM}e+%i2Ne$tB z2Yw}PMQ^{Xv3({EMD#R|jHz1lm{I@h1pv4WK-aeoa|UEkJ+{rFfWkXRZRh3k_LU~d zvKl~d)xl{ljXKslDcMN{+7r+*vTZ75mm@EUPE;(t|HIE* z1awaknl=hjd|-M7iCeCs7^hdxm7Ao;{h$~lB;||cd$;EHCqZj70e7VzXb4RwVs~`_ z)O0n*>rsK)p(xSH-Cc{*W$vAK`_tT`5spk~ab_bz!Rxpk6D$8lls;VWjR-Lvop7_0 zB?-`+)N#%y0dkF|xh5Z!1`tXKmaHR3DMh#iNEY+iKv3LPsVl!%z_yQPqdQ=osTu~7 zLRCdNZ=cH4oh>+~wc6O#D+VULSEB3*?qA#{v>*W%TJ7I*HbBR>Qf6}hIUJ#mJ&wj0 z966Aeo6xIlq|&YIKU2u6?)uK1E8tK>-is*_{8BhZXf}x#`I2v*ZMMrckoVr_9U2-X zP=E}ncyvt4K~~aMP(Fy$;vtHYPD@dl8-*5hLWl7g{^A(|3d|ynsqmlkQ3$_^>INFS zr3U)wz<+&71vJ+LO2Id;P9GoVx#^(c)J8I1;z|y60(>wi$_ET=?dS#qft09LJng-A z=9amfsd@+YEQkcdh5Kxzmz|fWJ3p`;ohy4g#;Z8nO)7YL6I-JH+xF{U`*0t$7rsD8 zMzb0&AXH616Y@s4sLlsTaxQ^L{d9)1Sdq?3kuLgc4lFSs;q|&NBzv18VshpHE|&Z2kHCwA;eiMyIj15 zB#0#BO@F?6oF9BjX&clY)~a^C&bZccb~19hN?M^DG`iv$J-;Bmb6j%?lL@iQW1IJZ z0pkSl+8qlsKGxJVPnT*r2dKJW;)NxwHv7neLBzV8AQw&C$fKO^kg8QLIdFsm4g1x(?26NQl&9&CmCb~Z)Qy~OG1H(WE z3nGU3`{+u73eJWvB$AVy(mycf`@-r@eNw>jv}cG&Ho_V=WI`%*k_=eyCzae7?z$36 z2|h%jpHnLNHC{L4l-p#_yuVxof8H>W6RjmaRot^Tor4O;+j$RHi8ppH89Ame9TmFl zWiHet$>vHLOev#{^jo9p{kj2ap$llKnI*IG1eJy%(GlW&WWjwn>*dGpP^xhnv=#sr<{3(Y_NL(9Oy}sH;l~XRcZsKA_gWVnzd&6@B-2Yi~HEe+t2v3Z$Q3+ zyd$G#*Qqn;3MZNssmBSfPwx`X+goQS=L+hFbk0y!ZU)o*(uj45K_b!V6bgKZm?8a< zzamTU`WU{0podY8raOu>DE-}}zaPY)A$V4v7NSgu&Z>&ar$c~JuzX6nr%)C{`txUx zVACvJ2(1gf&WP(M{mRqHSI>pRC6gmflJfT)D>9S{Xv0r#pO;vwqI(x@NWlPAePDhE z6XlO3T`bz=+&nFmIoys-JM>cw4=iD`!@!~z;sD^T++>l0=X~vH;Ssz_K`y^$mc+|I zU{S*4AD@Bw!;cdQ4%>~|4*Q4LXgnJ+z`%I02|Sv*TwvMvE(>OKYk5tQYjxki1Bs)@ zNcaN)b0+Duubr2Il*jNRHKAaix3!)gH#;pSs@W2G&^?a~>QihOKl?UzjauOh!NZcF z?o3<@Ohst9Qx>@z@WKE@Bmx^?V@#+7pY8HSdA&#Q#_{i%H_1m;PePYMkTPm+7N=8+ zjLZ!=0Sg)Ypr3l^8Ww9W9c-018GB~5jum{oW6Dc_yxCK~8D_yZeOPLH&oIuwyd?Y{ z4i@zU51_0bQ|62=UTzMVNVUmygrj!NmNzM9pP$ZgZa}w5#bqc^h7RW;k?EWv?9_uv zU4jzsT(;cK1k>gZ9Hvhq_@p7%evZ;@zpTS_D{+4(9kHL$>_P|wGq3}@EdXcfCdTIh zhb9oUHIW~YIyJ@*sjbc8r@L!+sGvIKS$vW+;>&3qH->NT5*al)K zo@j^BTwFc4(*|NKb{r^Z4_>K$!*@in4U{{6bpV1z1&9SaC+xoHu10qb6`>Gw@-E+H8Ffw!vOMRuydt0cJnv_ZfUWEnj81gvIFHql zu{ZmJE%{*JILUpcdq%HR%u1{;IKxH#9tZI(8?wP{wEPSP~(Q? zd9zHjR01>@4M0K;e@_Y`qI87Kf?hdQxY@|9!1&lCkvJVS@re#q3G}05i5Z<0F^})n zPDykNUr<28B$=23qP_ta(sHV*g)YUbZQ9z9a@OQ;0t*d>#FXVBq7^brFilE;aw2%y#9hJC=>an~YY0Lzmb6ksTHi0yd0u zy-i)U^YXG`qp}P^%^AJlTk;NpToh)$f`c*?@DQ(pQ!$7XxEJGOw!=??lhLe>Zok?j zCu#+jvt(q=+X{tslJYl(L(u3K7;Xo{ojSr(Lvk2{n+CVrk4(9{!xLm*z| z0Ns_qwuDXj+)T_kPkPRr&({T;_OCBlX%TaO3fr5hAf^sRTAcrJzFgA z0a~x6-8b};3Y`>kg%K)>%wC*u(^S4|NKG=MRHkys``&s*AZfWMZpF)-fu+R+DM;o>&c zTFi;v8BgJ|I~HfY750??gt802kB|&Jd|-Tnk|+Yo7SQ7yH#_C0Vu>>O<)MQA%U6X` zQzgALU5M1>tAP&n+GdSW=;5DOPh07cA%8j|pUA5_U&YxWpF%m|@8io$8AAn!nQ=_- zQ`x19Ozp{~$_ zZ>6z}G>0Y>?S8>X=#FcIo#^H1V4tvKn%H)be6dOTqIgm)mZA*+J_SXnljBKu|OkQm*UBk&~Ser zY{W{@z21zd2|su$!M;Cc4oi-afzIJLJ^ru5%T;wrGH~a&L&^|ot7D$I@f?q4rj0@% z7NM&+|A)&ST*xyRkOs;fkQ)J`&1WQ7aO`Z66;E<*57}8UelyzAD{E_*h*MS5-V(uW zBeG++^gH92#OM49|3-e4R|CAAgK&R{{>)o#nstuyXi3R%vf-dltFyiY+HyFCH9K01 zs_0B;hfuyP%0iW|^dYShkMJ!EG6m#GJ84Yn;%rvqm-QFz%?x+&P+}dUjqUh2a!frP zmMp*oBKZO`R!-0bOhOue>`h$jt1t7XjFid#c`qZ4E%f ze`PL*|4+lquECAlg`4OHHFZ^lBR5O05>t%F+7}c(1twayea;(XZDS{k7ZM4c*!ius zlY=7fFsxSZK=h97tI%tF<*70e5u!HYGGKR~V41LprDDOAT|NzY5n>$SZ{M@9B%XEu@{T_z z+BUM!S{IMf>AuwdHRvGU56`kPuGEb^>D@+$7S3qo)s*%1L-!^h@d=_XlkVz@egq&? ziCGbAt#yJ~X=Ai$Xle6b??>+`W&IUquY@wY`v=VmPZmSq0I^CeglQ3tp}Z3c$<6fJ zwsYZd+#`@muSV}e%2^bhg#}?s`UojKyjnH(^`Pt9h8w-E{us`+V&g(`m`a~gObagG%|`R_tz97=qUv-FU0T z`6HuUu@c0$9A|pEJd`KoripD^(rI4~uM$K&5) zM|mn0Vs#q9NKpEHM1n0iE?!p)2DU;*%;U9(2)Pj`dN3Jq53l^fl9#7<^wZ=T?aGH& z=<*Yf^8cyiPxrWjGI%tYHCdvzf#<(x!OL?p6WdSul0lBLB2`q9DV5}+_xRbWeYD*<9UUHN&eKt zyqD&y1$^S4XOps%-oVISuIZi+p`A+Bf=*exT21i>u-i4|rEbJy%!lCChn(f>X&0}+ zt9N^{4M$fhN?u&{{xQurnBtfbcm`diBaYsqVuzMJlq~jefny1ZFP0#$0~zpV2UrWs`zN1 z8e>5d9Lmx`5gcQv(Z#!oW-?bysZ>IkV-Dk8soAm>V)YIQdc`~6!vzot2j>UygAZa* zXdpp84=Lg;#(=O_IYE#sYxLW;{`P@GI)z#PsqD)UYB>n>B;=Fv+WXN_6HWExoL@%s z$0+vU=U|cd(UGj`A&>~5E9C#)=^1bULH~)m&Q6~*+?f-RvI-BzsW=$zjbM4mDz*ji zcAfIb2R|+s8%VJZ&u_X?dSi>qzntxRhSq7;d3O494oX&C0}u%b$z)5z;}~&?3K?Ta z>@ktW3qY99I#m6>O${r z&_DM!LNc?#e~g%#8dU}7cKHW@@4&v*#(k&Y)7bTiXi}LLHeF#uYGm+4M79YWbbUs) z`*3R-pR!H9CDoH0RRXLFCjy3t>_&|w1ApE)R8z5c6z_KN)Aw7$A>YRAS8p+ZH3Q*v z=aJ!y&BUDDiBS3$QN^&}YvN-DudowIBVpp4O~dwy`a| z#mKC8ByCS)orcr6-|@sbt!0AX2KYMX>_O<$n?B(RfB6FjdV{OYd!E{MaF_@AINurocKBYD-r8v`nIt}59Wg{BNzgO&liEecDgsQ&FV~~gWI5- z_eZ833(hvC$SeBU+^7_tr9yvl37yt zBk^Qx0bjmRjCZ7^j}4c)bQLAD9u(g3#4Z$Qr0@0MU_Wc}2Jmn7K@X+CjFk9Rq|(>#GHDrZ<|lmMD`ji$!zv*I67+K!&_hO%%+9iZek?{m9yc1t7;FDp2Spr zy~C!Sx{D72=I%6EvtL!JJehDgFGtd4JdO_JTrAdjgRje@RMwjpv#{}^I!X|h+)_M! za}FuEfzNrKUt%q+i*tExl$8`}G|VTM`Nz_yr!EF~J*??yp{o=S9NRcHi5?LpK+ z3sBculK?tvH~CvIj<3%{VZVD5jBpt3pJMwboMxwYt;#rSUO!%|?3%13{n0in)R9bR+oyHGl}9i-x^Jiey8uKrD`&U8W5 zldfwDS%sfLN~U9(-!6K;wlxc+ayTO|IeY7bMg4*_(Gg?#`5?gMstzs}fswyNzZ!sq z!?Xx7$%lo8+6<=p`H>C`4UsM5Q*3TwH5(4xo(G1xt2aoW*=}_4*F;yWt}I<+Ei)d5 zL6i&bu2*%r0HMf>9zzs)@cQj>@l{`DD+Bmsv}7^2lE0j8d!x3NfZcPx4Vd+UgHVnL zNFV~x!_ca+NR5$P7!^TTCqK7!>Z68fz;9k8(|{Hj{D1Zbe5DESnNt+q*Vf{__d?Zs zPe6}TgzD~hM(W3LuEXKzE765SRuZq(c_wgfJp(gnyh6fV?K4)?(M0 zRt)vaMVWZ}SKeS{a__CSz1s|oC%2M8%Rr1X)g#Ebvb9!;NVM=|eVb>)^5>34-5ngi z<#it~-pp(;tHv6P${?mAmCZXS!<@YHov%YLG_BclqL29sI>!7fQg}1v5pDY9MW_Lt zPq4<97LC}~k@rVLx}9KqvsY%}@rS^#v(7Dj&K*L4$0guy=6;N#w{3^FZO0_i9oAW$ zjMmM_W|KkR|M&4Gjj7tkDRc37bNFD!lynYaVGKk&LOeGdflv--MJ)9aBzN;8iF`p4 zaeTv3-aSyIf9PJpTKW8{Ox3pXZQ0K}KH^F+U?}P?$wa(_9`XU&&eB5rb=VZD%Iwb| zJ3!eFP_F(lWKw+Kihu(pi1B*O8sM{9xAdcAYkHlL^ZO}owRP3;b?P9V)c9wR$X6QP zr>^NI)w-$~1#op^3O6EG{x#WvR|8uIVyWI)Avdv{rd#E+NLWaiDGR>%!4#A4=?1LO_-|L}RP}MNc~3?o74B zYE6)oSBAfY+FJ>dnX2bML`UOeWC4f0F|%|Xan@^W^8O|%$+X<%r;QMBY8_Oaqi@=b z!<=;MM~N-d&;U3MXN|7&<$q`DD^4M6!>xm;bh`amW73;Q?eGNG6&SxA^s(dJXN8?n zL>(H=z+ zB_h=I0H4$d+|&LZREaVy*TGyzno-N5_*YB&@cN*?A7c9LE0kg~=dYtMfPB6?%X42e z``Q{AHmY~+lbO;;{8Y zv((n;if}Zi6XIzw2r4Oj4Pdca>n z4$NbJ`u^vAVBnl>|Hcmaq_0mRqKUWkCW7qY@?fHXGw{cJlDzj8v96*1(UE)oIO|BR ziIsq$uu1B4UU@7r1xWbvWi{|ISWzGN7riq_O7$N}Y73XE2`L<{MC+QFa|2#Zfo!^? zg5&KO!=gy)YFZ4RqK*~QNCc4yg%<-ciNld5u(gMyv3!He^ zI~i4keY4I@?+%m#%mCR11Q?WClnCViVKg^mpR3`vEBg&|+`+sJS@ zydH2Y7iIU>3bgLuOxBuyc4a#N_{}e#w_-Wc9>uhsKcThS!KAR|g!ODNT+ z>7Wa#gy$3w@5|RI*A=Pnvn$pKNg=&PPAxR=5$bVpdNv)H_58}{*9?frh~H9Y?EY3&g1-27|&ZpCd|hfLyH^0QdPhwL_1OPLY@YY_wRu&%$iyX zU4g_Tbac`UBPxL#y-U))QF+u$HN>R*soQ!fwVtOmUsE~vRR^s*ZrR)J_6%rHLE%-- z5d|~(ZAwRak53Ey&E8#0W;~;u_aLs@$>&LZ1Ax>0;((q%uc>J{1Hy(3Gal#EZo5i) z#LQ;erER)?6auIA3g{BkQcN-&BnJ@qp9c?ws$!x`jQqcL%n_T5dK%T!ukIAxcAwL0kUP{b_rkUVw}v&w zZd#6kxvz9p3)2}i(rN5sqdeEIsu}|(5RN+p^sU;`*qwLxWPbXT0SouyC+6l3V|OZ) zNMRwGsB>`?r|HIQHh>0SWYwUIro%>#p(pwdo!`ru3&QPWJfftC`r`zOL$R&XjNU0wo6+`DOQO~M@TuL zMAlmSxr>|yUH(IaX3xGLpAp?AqMYbazr_GYg4DK5xThO)(m5?rmw1`*2sRvDdoC_8 z65js}0c*~}V+8KLBVaT4{#qGC0btpx$t-=XC3`tw&AfjOP|jsnxXj8dm7HS-s`b1yKQ@#jpr6A@jN-{GN&Zi5UaP0ri#rFlA=JVrcE){BBS539;Q?x zZ@PG+t=&e*4tPv3zIJFfTZU3D@B((yt8?4I^10syLPKBDZ`Y0iLJi>i&ILH)@)Ksc z3xxkAJ~Q0VExf~#XmjZcVX-8)(8ek7e7gMKF{KZSukjmY^+dDX>GR( zu}sT7;OcNfr%GC+zTM>#4Kd&i({cwO7f(-g`*kO*xFCETKjG4d6Ig^{U}*s zVeOBZC$~7y_ZjUN`5R@48NpOSE{nCbHNb#U+kp|fwEM5ZRh4TCt}N*Eit7%eTs-61 zD^7!E8OQF|R-z4y@_6fKaWd1zPRjL`+(evot1&R$m~T!q|C+r}KK%Q%N&r**{DdR- z_%l3e)f+Z=o);wsza8d~+RueH%&G!xkp)Ch=ukiInRQNE&X46iBB(DFh!Ca;k_DmU zU_!o?Y@Tn8T)ErAqvTsHx$S+AfrVO;I&VX;w3mVENnUg1f<0{`#{o3pRsEUJU`zdx`fzex=(3A_9_moCl6^&MbtFycYS-G&1?9p< zekMUGeS-yuA)(krL`B(dHF}N6qyO3a-^&<{xX7?YiZmm4bRNT6>YHBax4*tl<^sTd z#Ja&gHI>A|>aTIo(FKm%pJS&)M^eQa&W!Ywc7OWU*5=ge-!p&8QeltX{5e>pl?aw0 zJ80A22)g{zGcH%RxHQysU@>27`yy?4!0uYH7SQ%!7$_RN@UCYsUf>_w6R2eo^I36E zWmU@o&?%a;Z>#Ej!kO;ZFE8$`Hyi>n>)#hEhUTLzcYIrRJEsYYynN!6-1w!mn-zTb z`ys;`oA4D;?zazd7E&L(ZH4CgyCMNm;C5_b~+kIx7_hRiRBlUQ_A^hEPPURsqu%aD6}gqo%ZBl(DL!10$i*@n8c zQ$8Ow>hc2u0A@c*HQO3_w@@UV)?Dj6YSnx+Uov?H3DOd(Xn)FgD;?JSWI+6m%T16v zEG#Pj690Khd4KEra6!Vl?Ueno%>(yvr9;LP{lm!NY|-bo6L0#&)7q?sQ0cX?!Iy>n zq2Fg!)mywIl9bJ7%7LA`2YV$w$EoHi?L9G7iDR10)N^U^oC!A{KRw5@$!N%GYD!i} zy9Q!?P|pNI!op}tVDXqO1nJut60C4s2Fh{=rURFw*3wMM1*- z;I-6o)cnR_OOmebW?cTzbaMolnW^En^TTWNsCVYwP1gvUeS@r^3(izArU-$$!2Z;i z*-GZg3LW&drPCOO+CXIIiH%R;g^v5=^WMb%?T^#9D^2Z2r1vbbYBy0I z++P0YMM8ZtUk2zzwoJ9pEaT&O?gNu-kPu7~p%{R47l@73cpoQqOJLPdWmQ#8m@-2| zC2lg#w?`*@U))czi=@9(B_P@V`7`Y~DI?h}BuI-}luJZAAn?upba_@uMQf_In=8`e z_74$*ghBWE&Dko(JWoNvIpb;f<94AqLU+}Mj)NLw)5|?2#Tw-g!RtuvGw4USGCIS_ za`_p+0L+QQhN%3XUm{S##~`A>S^LUl`iCSDViSpN+anFUs?W?+b?If}_q=0P+E=vz zrl6vowzAO%7)TYlUkjVPV|WtqY5U;GbdJ2oWAl;8bbQGBRd61kL}yYk)5{mOLSs)Z zx~trjCx6f%2f;w))+{fOSW}?H8nrcC3}~E4RHAe9Vyq=w5$9wMYsleTT=_SW4P4(k z^XRdSXnJ`Wqu+xKE6e;tT9j8GNqaB}Xaak1ge8URheKLH!<5@KbiT}AA`t$ShX05L z8ef=RPzJZ>yT>|74_e1|6S0{tRWu?Dz-i*m@PU-TMpBlmHdsX_Y`?@3b~v1u^7hfD zG5pk{+X{Iq+P+GsDmo*4-^=Hr)zuXlV2nnJgCp zNd!BY{g$GDL{i(`ks-3>+^Sf;EIFqf7~DjR3IoSFsScQxrfePhySWKpF7@M2G^^N! zz%=r2es4*c^3PJPSB7>&uC67LQC)T!#)t;Y5%P)-Aq`i z)$H<10K_YOZu7oNS^+vA0)-31%V8dsDKI`xA2*o8sTli$_$Tx5lhJ3c^C8~L1DD~}#BY3Za#ia>g3OcCwn=}`fds6l z{Bn^pbqcxp-!-+C_hRgxcdeXK&ZDXG4Habp#%!((!K{Bol$DEuh1%k3XDVJT)LyH& zA75AqC0!%(YOZVuV@IhIH$`Ga`p=f1tVU^XQiix+4B;=2j481 z@nWGbIv;B(Uk3@;b@wDlcd044ovyC_crlsDC*XE|cpb1XCGmbGUWUix`2!aP944j0 zZa2^)np32MPJO)&^87Fnt?apEfBblH_D7{BAl-2MMAM1c^R7QQo`O@ARlHT5jgc`v z-TjH8d1K_XE7BS)<^HIIw)KbUvex4FOsi|n?veYE!XQ+?f;B;HarkqXDjuh|>g&VI zJygPSart==3d?=l10Fcy>XQt2%%N}1rZZi^p!iIh5DotZpXb9(TWKG}CNjU|=Bf^)JMe@#i(_ z7r61Ed}b1ILA7L$Pc9;yXTb5Exvq6N)y`Y4Kl%}jCENR^F5%SV=MPNGgt1zdC(3q& zdOQ}aFRdpJy6YKeWsQ*;GaXOODXbO|Z3gb1)(gMZb`REsdW$()%F<=IRwk3<`Hi^r zal$)VoffBe>UBo`-!CNO%VR~qe6{KlELJF>TVim_bzAEA_9*6leUJ|{-z+iQ?6;V$ z9ND{g=Deu{ESfO5wVtjiS;7iQ*GR&fQ2{e=`VNMKdZcoRXIe~u0!|y=GLe@+RJIav zvLtcm3Wmd})cmrl=kSe<-x`?LK(A2)rd_ev|Ebc|qc|oH)A9{Y_q#$=W+0 zNsB(DjnC!lEV_URJl&2ST95}&)ZOo=UA&?QwAQv_x`EKENV;>+8K`km$4=}ETXFqg4Vjn~tSEkjL<5sa&HgV^u4w1&pcWZ^AGkZ_h zi^#>5{0qBvWaS0YX)W(b;nmumj|nS6A$!whA`1?wX~ zv&`-XS~lN)`=q>%^yaf4U^b$Dhl|Qj!zAIBpZc&A+G5Owl*TbL1rb(*LG|e)g|Yeq z^Cn9*K+FCce?W^j`8FIN{NaTHf@LFaqVC27usL{OKlml{))?h!7teGu?oE} z9&>4NeUaMdD9Ysw$6!W+R2QPZoQVkV2hfWytGskQMvvdTw!-(gH>meBq-JesGP4Y^-CWt zYA}@vc)X(I1688GbunK>d`Vfo>H8L99Zgbx@=s3WT z%% zS@9q4A8M4$NV+j;kPIBaiX~VAt^E!MvuYFpew4{`Yf$^YU9inqIL>>E!&&_(tM*0AiaV3n{rUHX2ADK8-^KZ%?kwflNW0 z<4`LMo;XLuak?y>(-n6ZZ9Vub*Lhh>Xd?fyEa2H>rJVWkW}~dwCx_3Urb|H|ROOTH zc8Sw$?jchmVLBR#uKgijs^x2t*4jIiC=U|L=O~Mfj2VvJ%gXA*wrlyFx|u}C#+PV( z>sDLL*YD;BieJB>`3B?1tU_z8`TGCpL1IzF0L1Gs87{66pitm_U~tPb9wENMmB5#n z?CwfF-b5crIwS%xHc3eMx&;q~8=~9drmg3NWq8gBgoKnLe1J5Nh}m=hHpLFFqJ0gk zI75jGY^o<`B>IG$nE}(`}sh>xzSpt*=|P{GK!`Anh8NFnR$XB!6@#l**8LB zsO1v_N7vE%dUHFajiFxpL~{)@>S+uyoHpP43T^mi9i80)Op^1kmJXjCS>9R_6xjUi z{Dl}u+ve@mfHRv4YuMXcYyy?&iy&;nAa;)$L~mW54f0s&8p*49J&!40k$Y zFMC5qLz9}!T$WFGudtP5{BoRy6hl~EK2^lXdf7u0Q`rV#!8tWo$7{}XO6BqH+ebUk zd*-S$g0s+KteZZJgP< z>VtbmeH$z$YOoDQ5IgMy?S)PLC%O3Vtc=l^#Qt+YbzVnes?wif_j#*fE4Uxw9 z6gMys5|qSi8+*<>olu8&vL-_HJ8k1w`J}hI8_ZH@s9&Hw*%lfZNf9++MsJ8%<Z8_-^za;6*!l(^hA=8v{+^1A!;&SM_v&JqNKw`Z)y0hllI*v>KW2*35Ijncv zvbYH;0A8Ig=~%hvJGcEqb85z+cG)4^=#jL2Hgmr_7)lr!ELacw*POL)x7l?W!V;NY z=m(e*uVVQg9C(yqJ}H$5YXl-VKqBCZ?>Pi%i;zQTx-X}WI{Ku%Drw8 z1OTT+U#3tVn^Z{z($GKT4hDHhKR+JR^J9=Gl46f%`VJRqEvTQ3ZF(kyuk}(GM*hrW zQTImTtGQp#cIZ4Wr?V&IxVN_i9?kw*$FZE>)?cWd;a_$H(Cfw#q!0fehR|sa^h+)j zx8IJ;l0aZ|E*hOx1tL3$7U=IT#xWIawH>k!HGCB!Vhao(}qPEX0QDWlWX65jMtwrRzlz$dj7HIrf9_6cZssbxnEC5;DOx7ul6# zYS{C_!|hA9qf7s1+&e#z#wmA(IUL_iG>>ILp2T$xo7uQqjVyAS0jp$~W%c!9WOT!u z7IWtPl9g5_lAoQjBIw!MpUL&-$wr)7k`^%rAS$AImkJI)Eq5J>Y5gl|8x&AY{ zyujA^($39|fK!FlFyQ46DdI8Z7t;W)$QltO>F#u#{cfS5U%>JCDrI7_wInG~+e5oy zw}8l-HwiZ{E@-M)r9ioCVW<8wHzx3%o9Wmp38}>Zm$Fju8^T)lU$9VPcJ?g}S2HBC zqxY60{?OIq)hMQ$qF;k#812>34V4Rt?jLTd)iBgqY$5|s?vI*45JOt`zCKPFOS-WE zyUL|YuGyO3x`f%()L01xM@VRz=+vBCjbF;-zT{Z=2JO%_>g=_k=;tJzQ zg~}wcW+(OF%(49r(t+wxHTO+j6tZ^7`n4|>Z9;wKEau8uMi2|{^?hR+y&yr}4v z4KzaG-5JU+g2FNv2*d>`(_=dB%Q-}Y4&T$zWY6fN@n?Yf0$NPhDmuovoFjAWy9D5< z-e8_>)v5r9Z${MVhDfIv90uMhcHtr~K({zKbjwU&-r02kOLjW=|p*lZzu zr;N72(qA7id#=GAH^1@N3vOL9zT-%J&X3MjuUmKIz~gF0UUD@?DQQmB*3Kui*8x&T z_iPKI9Q&pP)?-M@Cf!sR07=Vg=`^KeIq1?a`j&*ZynX(TOEe5(@iWk&3NchUN0`=e ze@pv2qsoB;J8H_yI`dwIXNj^ligeE1W@F)$BTaTmso`2P=Y=wCwRh)y8feM60N`#o z;Heek*4JctxGipj(h;vUmQtngS!5TKr4q`Vb}e<0Yu>W`{p@@mwdHca`5SOz8!Tj4#$xdiAn8K zCAuWR$LTNjDGpjxHMSp0Y!%@dAZ{i9Y^xfY;jJdjDjMMcS<`vDDh$EfZ>vWYV6QpX6-I( zP=Dq1W4n^qpUW&n1%GKWPeRLWw}+(IlJ<>Wtf-=5_flzxPagk*AG@0~DQ zkAkJ_asN2V-BN#eY4Zy7B<BHA-n0x13=|k=Xvyaf12IB*WGU64V8T5SmZeFt2T!F^B%FcNT+((*z`O{iR{_s;X5N zqo?cE{j|kYUEhG1N3rFhA!pr$wzpQxbdIC>JLDSxLT*YhMs@d0C`g5WMJtHQn%Oiz zOct$K8e(~q{#irAnjGLkV`eLMVQ)lRvFE3}Y?-IqFC?-~PTW=B5lC`9JkT|F2-lIY ziL(#^&Bo-LBJ7!ibuj-~Y?$oDe?k*ToO}>DI$+b^sS@$Z;(4Aeal*mI?$(h~MC$YL z@dWYPuQDo4nsuIh+~=uN8(S3%i;BumDEWVMy#-WMZQC|1Lxa*YAOg}kl%%vnDGk!y z-QA6pN`pvucQ?|4bV@Ubba#K7`}ywod)|MopEa-sm^FLPwa8)zN3Y+Exu2HnYE5EdV$Npx51H14Oab&S5PvB6)aS~R2)<+8g zoh8-TIMgSc!C?8FtFqrY7nS+nBt3PVj~B1NU~#JQS05g)4@IY%q}4P^_v(Bc--)^Z z-gRuUX<@@|a?*QGzRHRe(YwuOQ(Z7C(nNO=vwD1pB#ZO|q`{14F~XGcmC38qA0lf6NoDX4b{T=U0sx_TW2m z1vCP10*>FLyMp_(#>aN!B%xGRLQsU{>)V7gn6mfLn&p~HR!ssOG<_&$d#Z?}#Xz!g zxLBnK=vG#rkWdg#1xu=9(i&$tj_T66Pty9fx6-yc-Q6Cd*L}0O+9{D$rI4E&5+6$Z zAoWV9-hmJTppIMzJ|eTpdSV0iH@usQ{(@m6{i!`GR-* zXF)iRT`nWApTVz+zhk$ry2yJv&( zvjm5@Ew1~y+&1${DfRnPl;Cbe9x065Ud~xY==;7gp z=dy^F6SXgCsJHxHk~!_F!-q92$1*9>Mp<2Fo}WJze-H1mv+#~PjPLbw{7Gu|Gu_4i zN@i%wH+)H!z4q9f6cu*a26B}fV^9M@c0^}e!vp6VwH`1<)>q-;n@M*ACN!ci{=c3%<8_P729{P)Nyb?PZQQFB(vhc7CvD* zKbVgG^unqv;>}f)J+GY-lUZ2?715jwAL>=sY5R6^;709@aY@@O*WZ%>Q*j5fQpzaH{3eK_ofxd zQcs)mNNjem`05$%YwK23y3dwetr?PaZ>Xx~4t|>UBUXkq)q#Nsbdb~WxYkh0{ zobGRT`Um6cwsszyg&I1Ys{Q?j^89qcS7FiQGxf(lq{8i}9~_V$7pv4Tb0espIf(aG z^(Fl8eAEPV*FPzWtp{V)oXIpx*A{cA0&4O%0-VpKK;<&(x2N7*kvN{`QmWi`OZvVe z&RcUIez#5+)cDS|h}~k5CJbw60b7isHOgg*{5ogh1H+(IXr|bZG`{Ja*@72@WPZMx zu@l#JU}J4>YA!3=WNJ0c7<6?IjtbIV+4)dF0>Q38ytRaqB1}JJ2#$jk81XDrr}5r3 zQcdLI`B=7i?3KN3{v=$~TXS9`N#h9h>PM1~gv$;!njH>T;rn2PmD=lX#1q*rDHd3_ z@JfO<&yEWBSp5n@fQR-$<%IKJEr5v1AVJ!#JlL_r<9I)0B9{)L2u!2FYkgly3ka}@ zJolSEBh!#D{sH0i)L4%K?O?N6l-UH=h!Jr8N}{&iWb zxX#eLPdfb*Uo|gxUNB<;&|sG3`Fy7tc9&BqdOP2vD++AmCkL%w1HcBM17xoyXWf(w zoS_fv5jIqI&^l(yH!`?cl{TdS$Yuvz&9r7fC5=tIVxTd}v-csA^|{eCbf2tfZx-aT)s`)lu_wcxJPHa30Je(-v4k^qb$Od3G(Sxk z0|x1i3Xb&Oy<@2)^45^{JShq|8MM5{`DDblJcAwdR!H*&Q_jaYG7Jz~}GIw@Z)Ys=o@>b!dBPB@jJ z<*-@tRr;-M0kq=r`E735PS`OaN~*89bHhFBfv$WwF(>^wiX%POWOO}hwIYrh(#cZq z+<#l5GDt}|rrHu2{7uGr+y94U+Biom20k#7>tugIZvp^9APfBQu9F%f!Ad{|jR@(? zmd6Q2YudjcbB6Ad41a4M+39oJ3ydaL6#?x%%Z_-~l7+xck`&yT1(`iW;C8OS-aJge zr>7JMrp!#a;L~z`0ySMDJzV}0S+giZ@p-uB(`-74wgiT(XkVK0O3?V7iZuI@X{0YS zN!L3spN0p5M%w>_OMNO!@zCcY7#YV2w26V!41J<~huV+VjiQyV@Q$1LcuiEbFqxu0 zx0YeBqK!sNw*E%2VMv&zHMriGAzkWB)b|#tTPmNR%+UNaN)QgniVl zB#h4`un`9Atot&I5wvBBa-^V*s}?MxjoT@VKt%kMwlzusVhXV+FRaV00k($okpiv5 zTw%U!iDCldxN2G@VchSU2K9us|DO{_6H!(~A9MJCQz-Uymxmg5HRB!Pu#`!5zIr`= zep5C82!=*!_OeGJt_jU8JK*DhfX0H+h>OxDCeim&^W+xRT>D5~{E_gr z+6&JV{lp~n%1(Hc^BT8KPwpZ3aAV{?w`FU~{$^|P)mGmt)7YQNVs%!i4y6RbO=jia zUy_l@8TBviTRPPu21wB2J;t$kR#ItBs`L2k5IeZG=6_L-3ppZEt zGSZ^|!Y`pr=k_a(2GY)#zQ#eERXYz7%3Kk8W|nfzd_H=NVwK1|dEt&2p+{#Mh0laR zPc(5-gruHU*H-yPJQx$_^K>R}x63gOv@5~@06jFZIwX|y?HgL}(bSa8Bk{A+^KYGj z$Sq+FKxtX@?p{o)_$8gde#j*IS`j=N4cGCnOnJZ0y4WEOK$_tv8OQv;dH>ULi_qZu z7iPzHt^@m#v4QT67d2q&IA+0tIb@WPtBs>XCJYF1?gA`tsRY!66BG`~T^7f3Ke%{a zTn|ZQJ+*TIm^@x3M41R=@!LkkTJbKhr1W>tjYs1v*XE z{ssa-Yl-Md!vV00|9KFi#j7b-dH;Uh^D5R2{jA0KnGW|Kj6>ImWsy!~(0sVH*D$+* zO_Yp%qNp)$>ZRZ}$@>B{TqSCy)n|Ob5jcVJ z4&xz;Ap)uwFy(n9msb;cBuOsQ83EDXCD>Gr1G>zq9>zr>tP-FqkNF?0i|7%GA zCrCtFal7Fe%F~tk_t6L=XJw7zF4fCHW5U27FSZYPIq&bUh(7SaQu5;GwBOfx^W92f z1!+VNd0-H@hR&6`9)*;MjtzmIzNQh?UyEwM<_044RhY>3Z4rSy+DqgT%AWkYsK~c| zYu|u6lmhuNYMMYvSo?2M1g?`!xa|Tyb;r!g-pf;`>2#b&zR6VY+xc;)m0w zEltgDj{zw^BAx!PE`=Wp_>{GkVUfNIvKkuK5Bl8JNC+ADfSqlIIRKMv0g%(?qRe$Z z9wXb3FdE42GZE03d&*m@&{73c#83Zvi~s&@_Qiy#6qtM4CyQ(cb7jEq1SdS(HT^)E zUJis1L_AeQ%Ww+2sApmjfMp_}fc7360^B`%(Vx)J?~sfUu?76CDY(*fn3vd9+{$vHKG9Ja58zk<)rAAA+*onE z^3CmG5X*Ux1i8NQlMSAabOP`@wtzo>B$VlUW?Kv}WTf{cr6FqI>TxI=|RGFebjz+vX7Bgj=a|AlBgUDy5L&2(HSi8oMYO*Poz z1M&s{4+l>Qd2e@CIv3~*=iGVM48gx)uniruA~=MstiYZF!TH}uV33H6%=7ctY~NyU z&pyI}a&t>_LHJ!kNc~Iw^!G9T%fVbxqWl&%Z&^r5N9k&!VGink296rdN;CD-_!{xL z6}7?(BmnCh??)9Au#a^06+BEr{7(csuwQjdV}hUb=trf1~W{8ZP%PkP z1|psm2#C8qY|7XN*;)8XLbOCzGZz@?0g3`d4Al&Au(#cQt- zh{!S`a>QD+Da?i#c{1goKTYeHOo+dytF!Z?+ai-qH~a>l*O_E%LT~XOH}67>hPDS^ zYQ~6%CzP1{&N?S6K`8TB9S{Vy<7lLw_H6ijndZ3oFHd~W7ngi-ubPsfF^cLj-K zyI0y1z6Jz4(XMa-f_5QXN6E8TA%sADuPpn0Fg{!4u&Q>JVtx3fvbg#WI7U@SNOEr< zDAEw)1(VW=xM@vh?`D{r*706_YyU~4Ls4d+Uchg;eg5*-6rYO70Zjk^5o=9Ts@`bM zBY3-qM}vgyRSWEN{z~v-D-Z6*77PUBtPgQFkv1`suAd@=qWAE(TorwuMzVE3037ex z8Ar!tu}Wx>LgPDZZ0tOy(7G%Tt}arMAwYo>jI~1pP)M)Jx4{3;3<32@Btt_Z3-U;4 z?5ziNb)&NTkJZx{z)V|3I}^~YY^jzQBa4iB>)z<;@Q3d~b?XFULR?6!?%4sU7$L&= zW=Vf>2)~MV3V+MEthCEX^uRBlD7G9iK*T;#h`t`6>V`%%LhQ0W8b+X zOXrV&)Xmm@gqhTuYXoKIbZ@T)$jmn~d}+UP%%Ob0%6%8GsG`+i{dS~aEa-7x8YmU% zucL%DL;Rd2-l+{ku2o5YV*Ahgz8H|Pf2TtYTQx!?&c)v$6e4WP7g5GaxQ*eKvY zWcUhaHv)RaXT5~Gy{DWcU;&jD2~0O;E6X}dY%Vm|mMYw);clsRBPoMv64?|kL?=uN-I|9F9?C#xSp8(@vA zDPCu+r#wjRp;|o<|230I>*k|{DuR@OxCdNi;nbLdPMU-ww6P19bgD@z6UcQbZTEpJ zy&=7%Ad?i0DE*mNr8=X4x>#s;P{^7c_ixLFULQXNe(CzF$(32tBXMfmt%PdAz>G$ z$LS=D7g>a@AJrqFyuoR;DIwt0(9W*Bg)b8C-e)@G6iXGNlks_peiPVW)xps7t4Tg+ zYal%CcX;qIJnjs~-;Brp?cMc&_)--fkw08q;sO;}#fIOFYo(|McQViwWCBtCf+wfY zVcpX5^a5^l%>@%X9-!)&07isrgCzijTVAML4p+bMg?PSC%X~zq!IW&;cKyQUc$Lxb zh~bl)5$gna1XG2z=v`I%Wb}}hVl0mLKu>niJ4CIp4l^OuUTkc^sVFkf$_(r5y<2LY zdOla@=y-yHFsjBE!VT%(J3MuElAAhiI;a#RFJTT2F{;B?^MHv-eJpqof9=yMQDj9O zOc)!qI25PeXun^#4_55SiPE(`U)%%YB>+{H2axlnGQ!@k@$s?;YhS;~rO|O)Qj1SA z!wq#Gl53}fKCIq8UT^N^UPpWjeQVwey>sG#eGW&4eMCZ)J6N2xDz}k5?;UNGx#M8) zW6|@rU;u*f=TNVQBod%V|2NtKPwvwF2{Zr>UtEta17%M3ov#cLz`;*`CjVWX)=xv( z;AcrTI{Wc257!JRUEc6tP}NPof^{p8;yZ(OwCy;$heE<@Pz>QMY&p`gd=uT=c61ZW z5H~+T>QvQOJ}34#cpgl8a?{#iee;LBd~7pNX%?-r(6H+sdqOtHE~K)H%h-Iw3@M_A z%DL)Dzlw2T^m%C0lO1PLtp4OLPF_*O#F)Aq1Fd}uT=^(_o%m%%F@;Aa*Ma9eA6L!! zV+i=9ItF*mxd=yl(QAQbD$69+J!)8Or0y)vYfXnoueH0nF|a%6X!%6W3LQ*&3K_L^ zd_LdS3b_D|0RasMZ-SENKEi-zm4|uVW;DTG$UE8#_fQ-Xe-LY`;Pdxo8nG!BN1J(G36$5-#!*>QoJ^6^zJ2GiB0w~7>?5ajXxyu4GF zB;Ct4dfv?A4YYLNC;Pa?T9#=3eBJu?%`QKE=pAl`Amu>Mnn1k`(>W2v5b1tibkM@y zN=BA@wEa~2?srVwp(zGY6@y*}3d8I5D4!i4<0w*+z7S+OPX;EYjEjBY9M#@_$qAz< zooqCkdOKl;zj#vJQH#C{;$2pf-{w_K=d6(B>DX?|w50og%^KSgrw&@tUH*{y?G!3= zxsm~`nUb-0-`E%e4xzhNW!U|Rvo1a4oo0J=*KeOC+E(AaWgks$wTnBB+x>>e;%wX! zDUwFAu4HjY zzV;i2Tg-F99>|F{M1z3o;G2yY1bzcak)mVDwW%)!$h|ayMruHtV-16*7M%b@drYsB zN(Qqk6BI`sJYvHFI%CghSAn7-y)bY^O+#IgUJP%TSS5>Jl4jCH?IM$Sn%VYZ-{A9? z@N6a&m;9Fgvz$cPVumh*$q=^{*s(2BFPMf#TuL_rI!A>P361FWVvdZvUeb&R+i3i= zyj-V<1^OY88Gc0?w>`)1V-Qj*>~NC$3nQj>eZ{D5E#%ik-mOJXm`1Jc=?|~7t>03= zccw#aQkc2|-vtTh@b~#hs$oAW-N~JTo>5*Lj1|Zm;of930*y39K|46&sl`;`Z|75H zr!4@ORuJr!f`^yDo zV6S1RNeT4_Aa!{%EYd(B(bVg8U|yirT*L_ zCxa66?P~3VMg5m`wIOPo`gn_8Fd_;T#d0)IH+bGycwUyxE)qk#{2D_rzaWM^3(bAF zkGGd(eVAnu@<;iU1=OCv@bsiL2cm=a_=7@Ny~m0h6PI-}GO{p4-DkN&UaKGwL$FW< z&v09FZ4K`1$$j7Ch)OCogtyFe5}X;R^XqiS!q;v?u)+t7t>c>oUV{-t*}=4b7-4|f zVZ6Zsi(;ZB!S)oYy!JT3NHW)Z$bGSJIEfd_m)YPnUYEfJjET2S^@ZsOSYgprDcpIA zmj^EhL|=s~&_ao#!`lp@>XjeKCbGp_!Uf+bml2o6*WqL%U&Jb=pM61#bbJs9rJ>ZU zKYLbX9`tcoGjU9!EVzL*xg8%Kc!#O|JFfer1AD9!Vc4W@sf}B#fIw!>#ycz9rbW{d z9|HcPUCGYV5bc}Z5%dqifM@oYvul~ub-&u(M7`Shwcy=Ruch9K&t*mIW;ElgkOCAe z%r1r^36i{gQwERg*S0y}RPV=b?&%!V6(+fjsyIQ(O0>Yq3sSo9HmCP7lEdE}o=7-# zllJ=T!$Yh(<+X=%RbQ(&AKzGUmCNGx+ zGK%a$osI!p8_arz@}d@vcxP4~T6V_PaFU^XF7wdI8h5p;{*xPT*~1uqL^R)%4h0&= z=G{)U79S_q+M@4yz@wVU51PIrrV01WE|OD5f`_CfYDqJPi!M@YeV7aYN1(t@ocDS1 zn>Q!Ms&0=_`Z*gFFJ36+N!7k-P$1)P^0S$zxOx(c9B?3dnGDcEi`EQ{UmgPBpjK`3 zq0}Wc8?8TW@_<`EZQXvARnLNpzfQw>*rEmUZ6zZA$K8wQ<5Yq*#3Z#; zK}daDY#2C4LI`>?>Q2@cy2u0UMdyo*L+;ap&764~C9dQ3f^_1%F$x$_^mzE3Ap{UI zii_6dUQ=8RdJra%O@Oe{b6FVHK2Yjz&?OIiHl2}DHNXY|By5#`NZ5fu`gyf3gC_nd zL7}1AsagLYeVGJUrodt0M9TN{!t7-AykF^zmNWE^{W4l?=ex=|W@H_oSPrHGb-j-z z=j+pSmZcBDj<1WuqA@Wr>9t!qLPI{`dRfPTFvFnMMR49Z^u48|a>~MwbOE-F?Nq~Q z4JyoW$&t-7IY3KkP;}mos(cma#hrn!r=Gb&hq85M`X32eZtkw)x|!1-A7tI}Y?b9D z1r+7++bJg{NLItkAlOlmxQJhOtyOZG?=UX?uI!84Ld$h_G?TqvVHJ7<&*Jrqk~Gx?o5f+4avyB0JGD>wRR*OR{82JEi&HTIqYxKNU3|npH$xo zPuw-ggci!Ce1=fPnF<;IFn6m>)HUDy!=pxmlw?%=3x~LDeBZv`J{#>Z-T)pSW2H)b zlpLoL>C7-3c~766?VqM;fIk(vI0S)*?Kv7!t5~K0{*0>*Q)J@=GqGC1gR2<0J|DP% zKAwLksuTDvMt^V^L-2pCb@7X&fV)s?|nhLpj*1T&PF z5bc5Ep9z%pvwaRnKzEw*>fo)!9$!EgWi~P$Y#?44<|DP)q;vS}AABMpc=CrowU;V+ zBTbG0|Iqs@Z0f_i5Sl-qX!b(6??PF{!S$jYXA>7a3!}mnIX~n4@o$?$3Y?EvnzebmqJpv}74DGR_3q{pYP%qjWW%Nj~IY{ya+BnEB znl-Adn$_zT5Q#-XltzmH1USd~Wc%au(a{wHZ8*FNG!jnR)DvQ*d}3cQZA1xrqML+8 z6AC}nE)|p3{5`HF3hM96V&`=zj0H1cF?c-4KO*GKF10jFiH6U2N+)N*n;k}>s@?h8 zj#V3G;Vns&_<9Q-NBW-z4c0$#dhVZhlu7g(sLJF|;P9#@*ph5{bl9&ubJkG+Gn*GU zB>(MlpE|lCY>~tF9+TWt2?oO{r3#%sqmr%? zJXsw*DuUax;%{lTu${g0?cPq~^6*ZTfiVlr;lljcqadb{%acpZ0yn485 zl~k&mjwbc+iqmKevqJ6xd_cWHvXD`kl*DiDQIEjQ)sG(lHr z$`1PNmD|N`g>81j@`I#6gVdJr<9^OXoy`I|pZ$-aPc8MuX^qhu4MJb|oGZha4%$oT zOicgcVzK~7O6r;pVTq@e7e41_*7YuMcMV}6V_5dRwQN40DX;wy#^o5C6hSLnJU%w0 zg>KOM@+s-7y}A^fYKRj5%~$AH&-s&^EtY%}=Pn_9n~kQ;KyCj2#`N z{7hQ_Sea+~3?oYZckcG|97h>xF}d>Z2TK!t{24iM zuuz2BegDeBcCh-(?%7Q?inS+I+|n%u92iCoj%rwfH?$O|I08pp{|6jhceuX=&*Y6J zKRUBry>4=8w@@VzyK&Vo@pFoZK)?yyI|~GlbO(v|KI>NjO4FW}R~@Ym)qB_K4C{iA z@{NJ45W@&O3Ql_!WdjyQg5@bodf=N@rJO&#vQnXWe@1#cKjmhE?lo)H<+2u~Q2vIZ zu5IpB=1YcU8)gtDLp42CLomkL@h5E@4K{4w&;$xmXe%@j^C$LUV=Tr+zDFr|8E;rXPEhJ$H3<2|V!NLyx<|O20b}DLZR@%9b|I*)I+}aWYT&RgZ z)kB(icEA=8iLR}!Q#-Z5NRyZ&zogoNDZi~sDXaiWhL#Rl#sl~kp2sb(U}ajfx!A&u zstd};%52-=D^u932lJNG$#Fs0LhrK_d0doQ-7EJ;1^EYlzPyvp#Q~s9tpBlO9X@VU0Sh__QU+F1W6B>72FT7+k%nvr|ja^|T0^rn%bO z*|p&2KYR6fqoLe`g;9QfXz0ibP%y&FKC*_MTLesihZU@-qsZf$N zd+PV;_?7ST1%zLl{eOK2(B-8-a0%2*uB?|)J!J&;wi~{t#Qh|StN0BQd>q(Rso)+) zpVeG^dA=X!mNitTE4<6 z%O89B8NK`zxP9db4hver1b-CQZ_qh?mGy`{T;!{YTOC8d^9wlOmvYzw_95!y4|rUb z%35=l*^7(XgQG(q>jjo06)0Mh#dO|fnUo6X(zJ%3w2vI_K?6;*!b4sjzWv#D@%>tBe(Ltu=KkX( zj`M?z&H7_8S_rjh2mxlm;?{W0c23kRnikZ@>Tn^Fl{xR0?xEDx;Ra;HGEj$$GH^WD zCcvNr9gO}UpW7+S;dPNaL*03QIND~meQ=Y?X*!U zH-@!^T29L;r&HZk=`?>#^xAh4Pr2N@eX;OGcJ=o?nzYd#zp?i&WpB>c%>mY5akq>5 zYum{vs;pVq^1PK(H%?$dP0O;SN*`dH{4*k6F1C?Mj4k&op>yW%H2rYtAX^OCl>13zG z&+D))GU9y|CO6;v!?sHZ`B|a}IdyL6>27JY}S6BbB%A(gU^BU{xEvKkOD{!R0NZR9) zD%ltZIjZ(lOyIxF4eemq>%{L|He#+7tK)_07kYgkf#dU9h zUsww~z#7Ge9!Z43Xk6J)zC(hnQ?r4kn+l#|L}9%~_O!O>ioH8&vJ?hhLAhoBw7fN= ztId7M`&`XE4yH}*nu%dd-sgkTEg}E2PXAf7BXm$XQKc)L-}GKVz0MGy`L&`fXEA=> zbxC`yNR2h{(LtEQG-ws~oKEA`Qpu>9y?S->cXxR)!0PaZi;xdf?~$ONF;Jn{rv)oV z;DUtYJHbB65S6JiMTj6D*9os;$Od+{@lS>&57aq-uWCKo@;wC2e74qNxV(8C(LQbVoL|M!&!{?i)hUxHG~ zH92Tq)HQ61fD)^tf1xJm>5T2ob)YAc-uhi8qIw`O7)&!481nkMP;UB8<@8xCH(DBV zwZh+cX0w~3*C1?x5+6p{nSYE&k8-RDiq1qSroJXUt3A(%q%Gc=;4?**Mx1S^{8CM& zO?{AAhmT}`p{`Hd5g$)B5n3KIK*=VE6F^M*0{^vRX#+#Xmr2STZAN`?NI*BD*O_wY}lI$QdN;o;F z=pzrMpkUk)a&*Tk0iN17)9b3nK-651L_LwjrVdL}^VDs#pSmcS%;5v|z}qfM0i>52 zCLCN<_g!$JD|$dS)#{*7F;4^|v_ht-I);8Wi@8al(VvPP*l#M<08dq2y;_0NkcPUR zrh2uVMGw%b(27m8d0O7&&SDjIPFy1nm?$EkasATHwzzgU1W8PL4c4es`@cSd9d6iH zq2L@zEGib3#9s}xCMLMR`O?Rq+oDBl+Yda z1HbFDWiLAv(~-rmwebYhdZ)8uV0cCId%twYH^4av#EYm^tB;q|s+S&(4be?QK(?Zt z)fwLtdR2P|I*FPbTGCxeHRiv=Ye#l~eOiwc5kn>7WpAq@Hy$O;O-B%Ax&2$iw*miaA$ah4y)K>$J)Rl; zN*2VYlOt*Ptqf5;+gT!v`uZ|b$me$97af1Fe;X1MwZub9dY$WWh)X~19pa3}Cj=|9 zTGN%`zlbx-zzRrwIk`G$2|en;r*mL76xKmlUWs19d@=U}Ck9eIg&f1iM!R@Xa zd2O)HYoyOUD%0}QV&L3`W;vkUpg2cWT&R*D4*sH06zJCUSefKqSDc_&Cq+ZT?~6w# zpGF~Vli%)5u2Id_j4>Vzd7!Q(4+!b#5cc?$Lv!o%V?rrKy{ht(@xAYVZ1hMR_`FBG zB`h}o@74tTEkBNp%yoREu-TpL-16lipbFIILj6R^j)?xsRJSF+EEPAvD$u@;edMIbx!GVX>^R= z6rW-B3aUVEsx!Nc(*Wbe0 z+z$q6k+~QM6w#;wUrDXVnfLizMtV8T$-WsU{pVHg>;Zs`&Z5_-&XwDPc7x@HG^W2eg@J_m5uM{=Ot5)sMo&kryRkntnK z=yRBtKUBDDsnnS6!^`|rbKjQjyRM4ZnH~Z(zBDyW)GCA|AS$d@$C>1Q08ilsDwb|%p7hUy z-$Xnm)0ywSDCEna!Ph??9d@8{ws(yWv&5z-OZI?m9Vv2&VV!Ykch~(o??;iY&+r{W z=yZ6BO8&D*yrIuVi<|AvmQ+K)4cMfgSae#lG)^IaAT^mGt9ECV5&K+&8>{cPH@JY% zg|i%ub$r+6`$os!KHU!&D4@4NQ~AE%u1Z|*iX%EK`+xs@ic#)#0ne0FotdP|MFt02 z+TC;wED~_&`9OU_B@n>RJQ;_|w{QlT^6fVo&qQDtHq6-=p{xXvbi_QxQJQt{jU9MV zl34WE!=Ygn;Wj9N1KA;_4AkV90keq1BPI-$Yzx~GuU`Ar5(k_~GI1ig?-beEDsvP? zG~m-~yuqnxo1s(VsG!MP|MPQ5z4nStF2i-{+pjM?+?_p#cC#bG9w(-)*E33-cB;6C z9Xuk^w-2|n?wd;{n%*;|USqW%#B=jaGo6x-!@kH4s@Ta(6A3i3^SPB7F%AIs z^VbQe^ujhORLWy)zqh5lIp=8`EB1Nv*O7^3Y*#ZB?thyIk1q8l%`d*fZS3vK#dT>l26|7`XzPa*rH!_XSQhq+S%UX`$azjIC1c&;4#$MzD7?j+|Vep z?u6hHv_Ui&PFrMkW#GyO4dWlPbP8St1Gv*woiL5^RYv>8rLI38cF!2Y8)1?ZF_h$; zs?QIaYZ8Vz+D@cidmr}_f4=40yA)X!{Z!?MO7}hBijT-u@Xe zSHua1gSb|8PYmJXi&t{1RaG@OgqtK3;SG+pcWnazo(8zFg*o2B{*B&GX4)xgYZS6N9JgaqE+elIVd$7@%RBe7wRtHLX` zc=2v+&A@!A`enKHht8~S$(YpCQgo&{=15nY_v%@o%g`?{43pl#)0dMfz8aVa6wgwH z;`|5RWO3>mRfF(}wnEJ^_P^@1j2dnX5*1K=7xKa8b1VK}>kVut?e@w#F(W1>FI?c} zvZ6x6MZM!8c(^sam5QDHg@M64PyD&Gdo{h~z?Osb`~om7oQVXpdq6D;>=06+>tWIG zuh0C)5|@zLZ{Qp@B2uISK{9%N{1kcyA%l9+=QGSH#}`@^Mz{54x%E-gSZe{yt{iWi z=g?ZOCQ9_PK4IuZ-GcD@{BmrFbpo}&MoFI1o~v*#y55qy-=4yf>xX7h(QWI7&|CJ zHRifU<7bWQ0^3*PHZbDOG3paLRe|j_V&rBRCnlBZT+Rm#ww9|9ij_atK5{yW1)zzE z#Y+IEi}T72m%U$(92lbGs}%+%RKm)>bYbGE(o0oCfT98GbyL`K8(l1z$j_NV4Xo$; zmdIo<*gV+T$>JlS`rL6V3^U(jQhJbb6BL}vDfYvNx3!TyP zx$apf{@p_H<9s|@$37lesIUt9+UMx5=X^%teYCuwUT@6qdwq}XsZm;P(qz8|`bs8f z_^Z7C%eI+Z#>`|S6J-s;K3xV?>A=g(zbip+N>YoiOGk2Fngb5Ox4Ay*2<$gqk3K*K z9M(JFnZ{=cLLhaM1X2|Hro1m$IAdavFQAxcu|%j`{%UI&bT7NmC)2D1{0A#o=eLEA zy6YoQZs4gYm#Aat%=6G)zV^_1R=b-U`&J&LxG@xvG&dK?>#*~DLg^z{2?6x)Y@&>? z@yo?PdIMxVY4GSNQuRl)EAoKaS{bOG13``1VYlFA?Ks+0slkKx=_PBxE3Q6L$ zV*LgpdjAd=oEb4w$v;$JGOA$o12OOFtVV^?G@2^cW{wTRZD|@~_`B*Md=X?CuQsGS;TWY;zm>x&glWZc>a&FzCyBNcbfH zY7sRuOk#7l$FJPL!P-OFm?~nrQEXV6N78AYg0w(2;F(9SK z)u@MJ#Z^+K{rc-TS8IVt_WG9I^w;;zS|>u6cW+*e>B4CZLas{cleE@Oy;^`|20s=^ zC~%I9K{^((jX)~@hl$>Wl@XLDjhxLD4mBO-3tI{;&$KDvJIQMDKe}Fjd1>(5Qe3sZ zk}^))|M}kZvvVsodVPl2;onHv+3$_t4Fv>+#z-9|Tep27?7;J-k6|v?XAi;i1cK3T zHIczn2~buR?JW6XeT`Ygj_e=oqmQ&J0rfT|I~F1Yb6s803*Rjh>E|fLFAwVKysgni zksXO?H6)*4R zsr^Sh4SSvTdsjrEEBg@F&&O8}JlrDJj&I8?0Uo>9d2uM2Al>Rb*T<$d&lw8b{$bPW zM)LZdAC#Z@56sIou2(rB+15+nIS{sr=vua1(u9my&8nCxJH-Vnt~#Ij#SH)xJfs!* zMjiY*B244s!C@Yrt^r(ThtVxzhfj+wa~Kj>5?_0N>uR|qoMlr*J6#eiz1@)cU!fk> zxsH~~>-(#8M4)r3Qqib}b9psc9ojR%G*ze=r)wN^4n@V@>rcw?%eD&*4K-Ti!QZ0s z%1v}l9T7B~!`WM|`?#Q6d!$#Y+lIH)eBLRFEgaGAb8E5P@PaH%`MXaK1t%xLq}j+c z{7x^Sc>1idMa-C6e_5@Im$%d5At}Lx_?v1XV~?K8^7FJhwL2C5$lQ3N51F|Zi=%He z>O({V(2p9gR3^W<21Ko8=wLe{Pn3K%7}O7lO8gA#bVH99;qy&vB*8SZlkCva%+e`n z{=VY1LStC6@fI@cZdpAOl~-r#@#Us^G3o_t!YPY!NjzMp!Jrbh8)Axr?Z=KMzRX6wZ_b|*WQ zAzWzbdl?y;00|WI8Yv5xB6W5dr{3cs)`hxShjo-3XNx#30*GU!dp37kg=NA7r(8mS z$0@cs2usKvN26E)j$v9TMs6KoIGG>kTF2!tQ?=w}r`0CweRLqWS@%ZQt1gPAbanIh z%?rBsTW+LjACA^G)nF~Y6&=f{Q37we%bnf?!7VFvzzM%tsDNZKDJvoHe|3pk!#hJx z^OHEH^LM7LfT~``W@p!Cp*~aXvQ;PKj>8D6%^Q0n%H!`goy!nG>ecq9-gXzpa=Atg zgjV(eos_?J2DP#M_QFb5`^Wieh^YPhFqZOF_e-+2T4%RMc~iu{E+LL61whkHH#NdE zTfVT2Fe%=M}oLPD+Tz z;v&X=%M^Z$_yu<7iBYRX%1w=N8w?-a3XbvJK<07rZEB{*FQ0#1SKp}=DOTf<08zRin#k9` zrY{a@t$PL&*fl)?V&fZYbtmQ#!_xM9+JG|U-~^1WdK-Cj7Df~->q2zIofv5x@WbUF z5)yt$h0Ui>)OALUB6|tNi~-)6Dw1Z+&Y8|{w*};4ugk0h?{8&j@p68ugf$>1zc9a# zI3cHf#P^$?xh9Y-1}-$#&a%e{&gDb>pR}>IQkAn|Oq#tb((^CPUk~!yo(FPDq7mQ+ zG-9f;xeQ7{Q)>|KQR;eLEU6n)(1uTKu$}8~Kkl_d#W{iEbvHlif-$2sGU{1JWPV;j zvUVU*5BR$m&I6-VKraDp%xCp-`gSH7vkL-HhF=v504|ZJu#M{jJHNxzQg^?~dUfVQ zL6JXNWBo3R&u7t05#Zj@*gUp2UBW9m+=9wrfTV$h>((?(W8h1R$UIV%gh-T-9#m-0d;)vNQ3RUfW?c);PYY;Lw+^$%A3 zu;C{g1n~?;#Iq%86{$M#2)KELiIz!=JJ1@A-^3t38ph*oLO!LCn2_v(aHc|zl!RVbB(zL^2!@H?D^JeBF=^b?B}|@lj$u*- zus8-aL+~^U_u+N{QzB>ttO)gN>}MCITgyvlS&vohq*ca04ThBvXG=|o-`8M#C7zzQ z*0PCb(!)6Ps|3Z-V$l#*1n66VFIQ%6Gu^M;{II7LoJ^XeILX_i|o9G^V~ z6Id-4r{GpIWV4eO2SZgmQu3(GZMI9*HxDkmjwd_ezhjD~64i9K%WPgy&yv49^C@z* z!OzK)#q?$g#SCYI5Gu&A?6xK zNr-0y0!u>tKHZ0DI~GpsxP_xJAo#~&Pr%6;WIbI!~){RPULQkW#QNW_A> zjPbctU_=j$AGx=z^zMhiRURe4rxMHN3Tc%8v0QJefooJNWrhh4=`4&uxVzk+1@XJ` zJ-oM!k{9q&H_ls2yJCoYQk6LzZ)ui6`!yzrW`OyEw}VZ|v}_qHRIw-kkHkP8;R%1=6NG1o5ubgsD?xU0N(y!$!go?z%G|R^w}`J znGe;NQJ?e7Aju1faq?tuEoa!@MWCEPLvL|q4C!&rYZCk@0>78t*A@!{x*Hps&^{_&sI?&A zo||_}o(lGh6NVIihCGc}GN!d6d%tTC-OoneRM^{~N)>F^xN!=WIY&%}@Erj$WosxA9jnG?zwe%dmWwi+R9y64RQ0_gy?ACV=}WBq9U^?IKG z!Y|d(u&{ZCjLghv;PMDBQ+I;FIl>5HA}TC4v%HTc>4?P9)%I&#*ZBTX_cQ{XLeu;& z(a>-ZM=ur|TM8PMiQ{gK&7p;ttTX33?2zh(o;5Tgq7VYxl1ieR&bPrg z*o-`%x8nNKALAs5+eJoPpS{S{%6Sa0aV0Pd3Y=Dc)?4Vn0!_lr?%>ZAP0~r-ld0Mb zCHA2Qb_(_bH%rRCLt1VC{Y=X*Mkn&WbPPPF#nNwC?ej4$JN<<-K8r6RsXaiXW~Gsf z^+0si`FXKkYN5vRMpya8u9KIf=E$~jkX4+g+?G1gD?Vrx97^U3@OXWPa5n)?OntnAdpTe$sBw3}81A<#Z*PE?NuwYkX`t5X}L|EBT2F zy_AbjI$bfj4Hu_Es;w8%e`nXBrWqrUcajbp8GPsHKA0Vt$P_`LuGP%%n?L5y1e&f4=+tIY^%@jMh!yyLO@dW0AsoLDGn=JV@K%z3&q^ zgVAXZQo(xS#5r~ZJRT#QL|+Ito44zT?!@^PRr`lu0a8_`dz3A(&pAToAqqu)vaklN zqE*Wi=NHP539lTE0sUVf?OqeRoqYdb)*{c8)r9o=A_(Qu3i48L9N#R`2o z+kq$BFosrVrZIRpWvpF@Ui%0Zofky*RxlQkbv6hVvEDSE`I?ypQ)!kaXsR2o(6bX3 zQlr175sAP0MyF*CIwIsPH1x)4O4uP~z2YhPiGEGKXz&yzBp2_+XY2{ribimV8Rj>< zY9P9Bx)V{3 zyTgGvSSTdX{iw>+rE+D5K$D{EZ+|aPWCV;{?B$xiZNEMu0fF6wkl&bk=r~=An9tT8 zb(!1PCscqW?UA5cIu5QlFDf#M?knYKUS|1ev*OZ3>g?IUc)l9xedw2XnYNQ}eg*-* zkgmAjs(Kwm>`CG7X^^@O$U?RT^Uq=(GqJ}HitfRqRtmDsVXohq4JdYkmvG4}3uPJp zu0I$*eSzl*6rQ_gtTU9)k?PKw&bOFr`}tCOZ9o@u(35V$+#jWC)vrIg#0F|SsWB`M z&RoJlF#ciocl@Mjfsz9T4^PAG_`1(SbGbovGGE*Ta&^fKIUV{G+M2pdbp+5k)eh5A z$Enwc3II%ZLc%H@x`1v)NE7hvNT%Ut-p`zmpK>h5W7O_7**Ad_F)jM5Yu44Z(IsRt zN6*M44hR|ofT-Qdc|D?>*jU3o`kk*{wYDZ(0OBWVI_{Bxd?)c)u}n@`&9Yu}M1(`_ zJ=nd7?GFfsyFR`qkoQ~7`#_1CMzGxwt+wcs0@g4yWx3t<$>BXNt9TuA zezdv`H+x;On#!^2bv*bH9c={b#8vLcm;c&fXwbH@8&9Z${Qph5=iO=W~KL--OYB{mSmRYcp4$pUrJ!*;Szy`RGC9RzqVA)QN9x)AJE1 z7LgHK_j%nf*yX|p1wIYnb68n;J?EQO2^=T3iOT?`hxmxr81?@EuT2>8;lwV54*5Rs z+Z8#M7PG54AjSNBj@MOtyN!bJ?**DcmCaio$6m_RCYNJ;UH5xfc8YuEgIPPj*bTJL z5+u;A?>7|-zQ~pJIq6o0AnN%%Be)spHTQg94;vDKl)E(VYL33kd^qGj%MJb|GWt&Y z;S}Yn$p4_y8$a%oJPTe)k%(+TYBz3UO2Uq-AQW&mdlh|sRWsaR(u#D4pO_3`g~Br& zh0sXAL-E0Xjvd_kS=_Si|G2z8K+?F8k^>OzT>Eb|L?Wcy(j!0l+K@6}^G(+II(<7` z4+@%P*Va??iLW|?Nz_6!lA8Z(7e-w^*w9w=%hk9eVvsL1F0nV*?+FIf+Zj>O$t(?TA)jR$FH0Zt5ns*I`4f_nh}oh>aYLGwC{b zo2)!9%NmbZ2%#L1zVi4u{;!Y$730rb1zdyedZ6c*bvxI?3{IOb^gh!OKX_9slp$9m zDl@>-L{t`5F2^iMor-AKA;Nk7puftxPdun%MwmM>5zwnGsIa5{- z8lDJcobA2H_2hrzi~B;-MhWkqPa12o>m3m6F^n9lDf0rRt^A%T2JiOKf8Ccr%1A55 zV5O-`Q|!L^!dGFO%ZXx34#unE*V?yZ#3^ia^$$VuJLvy?ouffx!z={!-615fnyrbx zZ*ga}oUeSVWvVoi5(5}k`6H98xb-jRbj)RK#Tdm7xov8ErdJ3sv8^s&;VYso_*4I=K_(8h__? znPvfEcg0EbPV~2QZ9mD@{-|)RemwNM@B}yrchJrXCIuQmlj4kOJHm0PXtbixn}uSM z+9Ko;CNY+V5mV@7C|Lq@bg-AjcKrkj3Vq!geC6q1T}$*oNy0CXc5+lQy=_g|ipg#W z!fI0pc)dV7b)n--!~nU(7-&A|^rHdL3-gRPPldG4>Bcm(%9oZb;5lJP(tY`#YV;$* z)yXt!n?1k=bU#0NqB~vD4kt530L)pgCHR0A$UX7jux}r4$1P@}QONFW|K(ZF&Y=D? zfL^uKQbu22KieeA{m5a(b3JgWW`8V891laa-h3_IbZWP)cTdBQ;8>*&>a?{=0HErhrkBFh5ZrVqoNXGCIR|B^*w)$x(QngN2 zC~#c0{QM*;CT_gBpc+?Dj$S<%!Xz>mI~bS6T#c3&%;nggVLGB&e2Nj5jFZ?ILQ=tK zu2wa;Z*}Z^mG6GQA^rt}=+~Cx|CU_9h>J@Lo4&=Sv;CAt1klN1k{VSpp|6`PUB2KS0(E0SaB+Z74X=^gkrTzwxae8EGAq_pY?3JYPkc3Nx^P z6tW68KdFDQr2qFVlzWGe$cPsTM{*F_`ZA3@?X&)UD1n>oB>#y#A~BH@07pbt$tNNy zYonZT;&ip~WMm=2PcGYo6^5GfqAu2B^)Isn$iF4j2giC0HM5G7TBhM-WKvbmGTXT9!tvCion3i8Uq zedrNe0I)e?f*M`kf1R$RVCvDX$>J;i@n4_T=?r7coqM<-J#>R!&CSa6TzYIo+x#DL z%#9Dq<*&o~+m9P#ty0Epvy`=f+@iL1k&f;!h<6=;dMjmg4=9%3zZ#Iaq--C;X-78d zZG8RkdyBBzcFX)1JBL$*IR9qBJfm7UG>Nkl0 zr!8BZ;dj26zg3F1<}weE?H^m&4J}7TnL||u=>1DoWhewNC21VQm0nC&@BJ;Yk|_a+ z1?j&=o|y)i8l7m6d@L$(>1LslE;9XlN`&G6z=(=M+n;(9+3)MvoDGmHv;BRPYqBR( zTGyM9w6x>}%4vV+k=uObaq2%D)t?rkvSG*+6`|*ytQb0>4O~$_-elyepZA{QTs3_T z|L*tj2LJO`GH1Hqzo520DwK~)$$qH7K(n$ga3NgIRzp~Anst89CQKtiWx!M_cMK8v zRFOASyN4Nv{A-25L*-Bazi*c75TJGNW_7myCKtx$h1YFf?RW zLY?*rF*Shf8f8q4Z%30bPqwCU;w7YGA;PD&U^H(Y6g8$;jZfThD*?tPEjMDdIlc&2 zN1D^ai#iF3eQ(>ayJEbTP2licRVlrkDg=F&G(&>!5}L?+K5j~u0W)o%Dl8eA!(3T? z?d8yPM$W4U6jv}yZur}97DkzuB{pDgVj2gs4SAS_K7A2A!AzyofNy(9@dJ3yaqR!u zHt5-`K7xF#r?LGat z@jI=|MQkG`vkd#R`yt75vW6gx(bmF$3Z1-GKX#5W0+nC|t?kYcIC`!xO-QF)vix>= zTEVEfadA+Rl7L_oMUEU;@*hHljg50v9fHsGN6ca!a`<}1wUvU@yJ%At9jvU9`c><& zSh_7oeg^reLcg+dfhz$`l%TvH0 z%62AgA*v!=Z*U5N+;beX`l1HT1b#%T{srU}zzF@b<-Jn;e!sg~wbD~zx>fO=74MS( zlsW&I!Vj5mA{f6!TSw)IY3c7p3Z$N`dSvoC7jD2B@Bfw@?_JvUtZ}%8`u1lj_A_>c zBK6nL*e-!rTW>4tEDR%Z+X4m`N?~zH7Iv&E`)6mb_rVWuO6TY+Tq+c;myA1-h)9I# zmrwDPh0TKb=Ds7D4+7BL1rT84wiqij~x5sY)2y$Eoh zu{p&oSHry*>i6C(IopO3*x3XR))sof7SwZ~LaRMi^N&ftP{KoTtyRt)Y!?HfP&bPe zo&ZuEG{t|$xfPx>-z>xmTGWx)s)jZKSJ;qCSi3 zYA{=9P8JIg``U3Q#tyJKi6q(dC2&7A%it>X!mKZi7EK3LT84{9JXxqC^KXrP- zgV?l1qDEG$uCuXaWRA%639a_eU9Z^^=i79^mbm%((C7pV+qO6MNo}H?DF|mA1^5Dd z{JvgsK*68n07*kSOvKx*x{S9&yosP)X8b;6mYo^;CD z>o?GVq~a}ee2B{Al9Mz<)pM{f!SX*>!x_M2?DxtR_8s;B@2s-g|& zcXE>|%RmHZ)v%IPWhwnU>})c5u%8ah9T6=>&%Lzic2B~#&d-=)&1EluhSwq z(%QgnmZsTK&x9*s=*RU{G;;SaHFEYr+#k=FA{e8!>st{4K2TPTvB4(vO9sKgcK@h6M5=b~~-jpMn?`=d47*|OxieMLqPcA&;3s=@r4Q)owKWbDQpPHVK_JV0!* zk#RslI}y_lQ-LG(#s2br*<4QVdL63%KxJJMZce0dE%w(AU3dCMvXiDlGEpD}$$Aul zl4>_QZ@s}pT;->6?HflbGA!V44Leu9X)*nHT~Sduo=Osxc8Rj7|BZ2K=+tp>Fy4H! z9Qylv>(EM~vRz&^svpzWn$?tFY|<+pugk^xA>ev%xb14gW2wy6*w5Pqodn~~Tq9O1 z)qB{KLTdfnR3}+5Ztt@O^dq+~EM;}0MlRj>Sp+;(I=h2$;!Xx#p?Tr5f}c&+o7g{1 z@%buF(UZl>k+S9n-TYP@M?G%Uy}1?iX)s@ZQ`doTL3RQWQ0T>yf7T#?d)A=rS{?>8 z+A7ttqD+7P{%si)MPN*95+$-@OxVT<5_Z6JyPg%FF@Sz*sMC|iXM&9CXp^Gfva zKYr|8Ib0k(mh3mPVnSDvZpZ=kPM5@RyfN; zzC*DDn6J|TH%A;to~38JoixT;kSm(j$9SrU8{?s^xw+8N9qqWj^Hd(7j{+-EpfH7- z<$e0c^JZXcvv|*F{kg8$ji}J^MW=}bY?<7XSOvGgl%ps5`<%h;&rtJ1?XhuX`9QQ@ z?^Yq)`3VjB-E&07`MTNu_V2WnWVQiscHDyRT$9l;f*3JMs4q!nj4m=w&btLokDF-= z;K%yKXNr2T`=NvEvjxXe!_VmR9F)(2ym6-PZWQO1>9e)&>nGPnV235RoYaIerYgbJ z;C|%_tt;>z_UDHx*%{ZjF@={+5f0Y6QB`FQ?%N@gwI*Vd%}y|CmBZe4I}&jc{<0mv zt=+|M+%Ng$Z-8QCBMs(Gqig*AHb>BQayQ~NWK+#?g(wi<=G{~y1D~XE^B9!@(Od)_ zBM!EzefqE`0N-4WTY|(U!+5+O@R@aG#T*@}cZcr(Z1h^nD2aALL6beO-LBPX#_%y< z;DVsZ@}6ncx#5$_5-AJaaMQUXK8t_#zYI(URK+C$ByCL| zW8=3JNE|#RV|fi^FRz_0Oc)S6b=MOD?NdpOP~n#4@pDBiz6TPNLN@Xrruok4B?BA% zbdT)px%WS-{&Sa+ZTQ20jM@I|QB&5MN5UeZ=<{pT@_b{RJ4rU4Y`vUA4ypE5=F|jN z6^Aj>t1#QRe(HalkDA%D^+`)g#UZ?Z$5G3hbq|bfW`$KSAS+=hy*5ybwv`;$LB^D1 z8i>Vez2Jc@CLu>*_2H*GvBSv<)_Z~{IN!}74n1AIv|}cUV*kT5^#y72nCw8GPK9-3 z@eX3H%VEogQ%PC=69PWW^Yi)NQ#?_8fIlFSNCip5}N;N(rnmcD9t zZJ+aV3%S{=TCZjLSq-^sQF5sT__}`~i(#%s^AAQ(0O+lGG+MlaVgZJkM*f0M(J%%^ zCiNz#ZNMY&qpaZFle-OFxguZ^FD@+n8=+(zCrZ?-S~jkKe*q#CNZS|0n2fK{5&eAJU=?k`3I zdp+ip4a~MJ70C2zH44TK`r~+v>0so6=}g-?Ho{ zzw#gx$gnF|%FWmsCKOhH7TDxl;%>>*{Te)F|4CngdL$ifQ^Ne;M6RDYq zg-BJdPbO|@S;}0_8qTPeP_i}NA+HQaYX@72Sw=6802M=thM54PYdX#!wH%@*Zib-& zWAY9VOkt~^VGt5#mU%<`)L7o1JnN6Cy8pxTDFS*&>9D4JMVN@ajq0<^zidmFysdhw zoMx_L8u1AUHKy0nGvyjc$oSlj@_Fuwjyr<}M+@!9VyC#-63mOc@1all30MV2pSvv2 z)dA$2<)9~t_x}qfz~iyu0Az3KPrmej2enY*uY1*DKi+<#uGRPN8)K4?G**(p)KDqK zk25Q{wH68!uWQ`iIlp}1(awfjSV)uhUV$UdLC%i-6Mi=FvbQyyWUT(-IFVgL|D3g% zVX^HB>LE4j@ooLC)L1rno$76h!3a3ZtdCJ*9}*x`FVpma@C zZZTR*!`FuI!5Mz=yHuwN4Idw_4 za;hY$=u60a(jzF`eGGjeS;C%s1`d z-8CY3o#}rz4$fU_2rOSm+F~p=IS8!z-r4|;A!xv>_tagu6%M>=hT>#44imvJ{P|0G zQ$D;e9Ax=h%A%h{0gL{1d=~D)FE+(r`e;C@9yUD-bFQvatrxlTe=Sq~v^TdpfM70{ zNhamXwibrQ(W=wh3H7-rE)t`QjX;2D1;A4L;3`##;AAk{Pu>Pe=7)389J@*wswv*| zC$781wH~=ywbs{%V^K^rs_P`u5e57*&N7-!r?}dj=cG12&c&dTj zTCA@h9E?|S@m8VLLkx-0>At|4++${xMpsQNLQKOvGvT6-vFb$Z+U_0*KfR zpM^*mZL$8H&vG;V#$e;?W8y^JvJ)CkA2qev)r6K28Whw9OF5Ui=t0t`Ibr#MKYj5&OirVe1?Zu>np)3gf{>s^*Fx59YJp>0E7og(j8)RwhvGdUX+vo zvA$&9XDm88I!&+jb`anOrLELuY9eV8RZ~U5f!37(A}l_)-S6o};wckE;Y%pZk3guT z1!C_<1GX)-1aj}QRUN7VDUe?$h2|AXEHrJx?2Yo36ifB~g6Fit4o$8Qy*2}@wI1y^ z)D)dO{9bFbpulF))GsfU*%p#b3k_nJgWJ&dFr?F_>Fns+N=F`~PEHwH59cTziz}MB z$xYH-JPN%l8zU1<88=1qo#mb!{I8=k5aH^tGD%xG$Om`brxm5u1$)A)BX1Pq;CtIp zuu%6zo8C|w1=ZNle_y8#Xs)pK$8_0u7`?tNT?ud_H5*CFcwH*_!ocl5o*~($k&v5xW*uz<*+%TsiFWLEj}9UHS(dU>-PXS!pr4$As2-w^LY*DN zZJmxzZkT=Mb(n^9z9Cpr zBy=H*pira)@zCcoZY-xI1yucO#XaT>57Nu@Q&p6cXTLFv$XGV5GbC#)T-EZKQ{jJHFFyN%x)TBry0}>P6oJ=3H-Bv9r&lHGQ@0TRLvU} z2a-n!EE`E0qi=JT1u9ID8d5ScN zZ_sJ?!Yz_(LEbbFF?~Fo59_tVw3Db3Q8qtXKR<_zuXhZ|g1TrB5U+Y%b5JJA?T)C? z!6pl>r-Wa>a-d^mHiqY_jXI|CIX9_g*F-WCmEwJL>Z{VSh{*{iz;GuS4<6men2}KM z*;lG;Oeztra3^8GqJP8EK7p3wO)NKO_SIQ!vFDsqI!7WFr-XlFkeO^l1Ey3Bc`gV` zNy(t4L==JHZnY=9NmRg!Kd%r_{q(A`qvSedzQlsU85nf}j@C(Ny2C|TQ^bP(xS$zT z(pkygDG2UXX;cFqfCo}DZL>J&Xg&CuZj~u_S|3Y+wWajsFbT9 zsFv*s(C(Uh8yc}}T>Vr|4`>BKRnp!0B}V869T=|!zMZ`xA4wL!KHx%h4Beq4h1wr~ zR~}3N*Vx_6ky2wk#+{CgEAf;ZkVe6+2B^UJ#`U;HhXOjHHiggCZ6LF+DA+#$gU1Jg zE1$^|ols9nMU@9g2Wa)$`P05t3707n4SCwKd`zng8w3o%VEggG|m)lu|_!&wFPiGG?DppSM)f%JUMq^XMhw9w5<^sW-g0p2YiqM z<$JM$^CSi?NRYR?rQHg45esBuk#H(4D}{Rv#mVwUHUX^wRC`r_OiWi<)pycxUi$;F z%m>MVLyR=)OVNYuUBel%W$CzhO5n!9K~p4R*PX9a#ny{H3^B{r3}}jQe7?bj0W(7NA6LukKRfjPm-Kg$K?$H?#n0-)0nevlQAqHB24qyMWykT zeMA;|X2pBFIT3Mm9J7mCUIv^TZO{G7P4~%Kqr(u76`WMoX9A|tKNvfXUi|lm6;=Dc zj&JzRZum|QmkBqY|G=Gg1iCw!ZFfF2U za_9c_?wQoYn$dHHxi?vJWu5!^T)KE=)B*U>mnN-f2410C7R-WX@65Vym+O^l)(i78 zA{K*M_l(d>7xKq%wMpVrmt^*v-R^DY4-A@mp>;lwqw06#C6hbRmCk|^!?t7_d@wC8 z709}C6;XMf#sa`gI~qq(StutUBEqABflXYrDLD`R& zOL$mV+4Ht4RhEw{7C)&Qx2`NLIKFW<;n$=M4Wn2k^FZFy(1*L)Gt9IJ@h|RN(BdH8DHe&nb?}6vZU8sh3I6!S!+Fu9d2NWh3NsjY~*Q znhMxGZYxXWh>gf#S){e|8kj27O3dJ@1gL-<3Iz4=7e7#)W}bEc?I9K>HDQ;kqXFrw zCUG83ABQY~hNy3PoO4oW@O~PO_i3AOG;}OKI*UfITt`e+8VkBzM0oWQ0u5@kb@$?E zCt35bV!AnL{zLF)r8;T03{HPA);R;ttt3s@ z5NLJn_9XF&lo)_~R410Q&-82k{qBSBY>^c$V5ody8u=#!B&PH4bn!%o0xDp1NU+PZ z7CD48JKgUkyl+4-Ha0dF1sO$0VCRFj1;db_^r$DAWo*uB9eNyUjcc$oxN&j@$vJ0k zXd(h7SPak(7TQ$I#&v31#_xVnhiY5@FxzQ>$MN2YpEXk53RC`c>PA26m?hx8&W^Wl zJtJen|M|EUOH>RRtkW>Omt{gBWgUJ&+Sp8f7^p4@s;osAWh>l9G_;|{Fo?53MUfvZ)V2I2| zj3yZHn7tI`npb|lncx&gh(_BGqD_v#0G*8xurO9Cj-+#$Ic(_1QxwM=0kuPQU}v6~ z6d*^-^f@(|@GdzSDnF#27f8OXJRn_iz#n?;q{5*oX0hp75pj9^+#b_X37&F0{bk#9 zS?N*F6bLKsPKO}maRpC(gAR{0j@|(q8!PHuuQ5sp6hS}JuTdIvq=NEv=X8|zVPD2Z zsLE+|S^(0+Hc%66xsT6d{{sbb+y52RRri&E)4b%@H{21z+g-DTUslCzLnl1rb4Rmv z5oy%{X|*g4+#f5UAIW?le$tpHFHt8^TG3!^r1>eo;0DtPy_aZpnau(@K8s@k?k)S+ z``pwE^(^1N!ahJiNdnh7csK=wQ{oSe-caDT4+>wjK4$F~mBR0Sfl%8r$ zTLFxNhqCyprhtNGOm6z=YnRcDNbHxmq5b*>OkW_XKEYvFdK(Y&-otoZGL-qmZqp;9X| zUG3{Xy7zQAD0faF8=1@O>f7+_GjM#rnPQ_BgY^DN;@YyI zLbD_g@??_7@1QeL|lklw;%h_86GM@RL)R&UiFBD))O-jnl5i1* z#M|qwCMU~wcG7LF=4=IlFwrr5Ix?1gKDJN=<|xaiG$=2E9t1-F5J?I+7mG85IICOH z+I_r;bg)cEGY!PF2=gk4V79v{W;!2L^lha{@)w53*O( zo+-64K$qYEP$6~XA+dZcCkop6G5#r4MdW+E8jN~i6eD6!?MGUJWDOu8;cO9S+y2iW zg3Y~IKVixZ4N++>AtlU8qVVGl*BQmNmT$qcRq+@&ye*k%DXl~7CnDg}L2zApMBQRe zi=ZtUrc~XGf~NoOQ)EI=Ff= z)nMr>)?e_Rb~tKs9!amzR1s6mJrvy39v`l#wBPk?)YvxZDS$6I=c=s7H`?yisvFVAl-3~l!PCgAeMcR~brE>tFu8SR z;_X46;1s<9Y}Kr+yKa?+C(8NxU*ZW2Ag|~Q1v-VL*y!ou^3P&fx(kcxl(%`C&^-mw zdgH6G--yG6LBtw(o#g6b&)u%yC zak`mutnv=OI>mr0xK?N-4#Il*k7XHRqUfSl*l6bAro%l%c7>)csv(|-bEBqmzFR{t z(}{ERY?*zJDyj?Xqy}hV)zeHefZi`+S-C(T+-jQbP`FYHyCXxFkf@$ zUuvv~uC69M5<-heHF5y7aEBo$7EvU=ivf|p%eCE6Ny5Yj+A$|vRJqdqwZey^2HKy@ zoOYck$pF`?QFeN8OuKf(7vzFYLx5OOApi7f)YPHiOG9<@I38bZd1TDgVG9hIeuCcv z?l7KP=J&TT&LuVYTrN&e9td8LA#QxnI)QgW=K9W&{F7(c*lo>mr1VY@=FyH38- zEvBqnHN9orz2d}q`mS;a16Byhnu$J#cMO!w8$(k8u-Kim?1H~PRbrd`5*>|KhmJ^M zKw4{d%H?$o1u8H#_;L-R5ZhJy$%uFmnP|_Bq6i{fPQstgl zU3U)Iqab)~gQZkUxhI zh$rDR4pVSy5Q92riW($C)i);^r<0_0wwu5Aqoau5h!S0BJ1~t~-8=%7CL;_iZBOYyFk>@LQdWJ9u;*yiUdt4Kw zhN&WbeRmrc9UB}|I$LTXnh-!(a8Z4ixLQ@c%vDgx0$z{fYBYLj|E1|o*h~!&Vm$xC zsI$Sf(KBMv=+J#~xpEnnshlP}K%_7 zf93WOs(rj!dBFelX=8)%y6s?v%Ss6W8UG78Kpd-8wF}ohU=EsDeRmCXFg)z;d77wI zMH{_95O@2#!hr*Mk{rscFjVVCY-sBYTxTrbXfo{zm=p0AfhQ$uZ(r!Q z7iE7C?WEsN^oct$>2MSx;{OXTHXg(u9+$0Nr6%# z18w8gmlwAb;;UNt7Vf4%VtmcAPWZ6+`Bty)dHBd3X^7u0OM74p@D8wa++}7z&rFZ+ zIT{t6a(-U0oWsfS4p2274TnV`Y_gjJlrx?EP}Pv%TTXUlSmXcH|S)Mf8?roXnbxFLu)A13xWjeSPJwt#3o--Lll?imw0`%A9L2z@G# z1+L2}Z-iaDhD^Tg01OJO#qAFkxcpO_4ssy}8(FtVYr^Ke8#BoK&#{E{Hi}9*p4Qx7d+SLkPbSN*ulsYi)O2_n$jIb7MOl zu~Yll>9qYw`rJ{2qxUDY)}#k)G<%+Gby+u@44i>|07N|P=NhQ6Ge{2e0YXV?w-j{J7A$%0kmC;Xhe@e!xfN{l$xyIpo929P2;?uXALE^=D{zM5DG z!VSVIr5KwZa%0L`&1W;p>Fl`NHvrye@|fgza=iF~uryU?X6JP^v=4BZ&F$-J@VBUX zUe9>=#<*3Zd%sWby6aPf7I1r}sG5VZ`k&~1E_S4_lAO^o2L%WwKE0hi0@kyX2_TUl zu(K7pul;1Ye|)WOBd47QQGH=^r#+ZsE=c%R)Nx?X4&}Xn9Ccm0sCWIR#tA?l^8cuV znh2ntQ`_App?_&IqUks42zXvkPG3X-%CGp9gR^wYLSsBE_j3$Tn-rFA(sl&g{U1k|v`UEwgif zkDbS!q@HxM;-g+q2xWBj``W!r`$*=i#g;U@PFC z)fj2A7ZhQc&JGp&g`-}f_HG4koaJ*8YLA`}s>Bm-+`S3Ym5-HC!SmJ0@rglKK;{q( zutKxTOxzXD7h)`a69N7r;K(=dgjg>SMNJmUFfj?;V)2x$=WF69llRtBgMv8FzRV%bk-pcA(|0K{Ja5m|ry7 z_x?R0n3Hv`(SM{?a{z!{EHsGJBN+{_ETWxmIhO+-D5YWpR4;_y>T zHRR2g7-P#dK5s-D;PDW8W5Jhx02)VIAPGQ0~;OVz9Ry;IaDycZ;l#Ge>E0fD;3)cq%%F# z>=E}eCcGtR5Ny~{PfXWH(-T}g<%PE7-e6{L{tc+$E355tmugM352|>p_RA*qoVULy zQF;NP3d!?24X=VqA?RD7v)HtzfC{qrEk8-Vtlg8e0dPxGFSp4uD?2+{K4&)(D>#@5cDRd_?(BY>eCtUtnJ6RN796AS}PNkQf)+q zgruGgeaA(afl>#L5ir<@N)F)cx5)I{2Abcs*=WzCR_`vQN)VX=+Eryhaf9f-J45mY ztOj(X>v=r63uDbESqFXI^Dp!UZ;;|c_?u@m_!eoD-C|5Qe5alW=Kq<(o>Ri^evwPF@U zbVM=A)-(>tFtaQ@>rv>KlE`>xIlb57m_*NgI~1Ky)maBMFfDwYy=pe7@}SA6=QEgx z=vLZsaCF|xzYHW8T=r7%y$&Ga<5tMxwU|>64=?rm%dwx{ ztZc-9n&bPx*4;g-Bkm2Ed~6QF`t^7<{b0zH-Z(?eYO~scN79zE91v8BRJB<8F614h zKEUV0R8mpJ^)>5grc=Do8T9qU@P8lZ7mUW|va&dl&h~zgdNqo%I4(~00n{%tuj@%^ z@vl2booRPC0o?oE+XSD9l|=g@2R-j-oa~Vr$obL;i{W#3;lnuwI&`*duF`h+-9yGQ zS6tu6_41y0ak$@~v1iLtxN41#3UOEsFN>g0>M74=omfY;6I{nq5Sk;t#3t!`7%jFJ zWDesuN)-OJWWweqEbz_T$m2HSaX=EVu0`pwl>%>StOep+H?hS7Ie-Y%&zbx%o~XSB z4{c%#uB_N}bam}jgN6<^hasOOTbO3?m&Y?%_ItnS1ly7Y|CW#? zJMtY2Dg7`i7X7Z(j&ik_hZ8xTDpuiqwoJ`%;Vh23%y9IfX9-+3 z`h3&&_#6VT#!99p+AZHEZ4Jb!pRg-}J+2R|oIjpeO*dpYC~pyq=1NUV-yK-t2dz5c zZ+Ga3`Bb2$Bdg&20JOB45LKKVS8{iNzp)qaN5Cx3{kl7Rca(rSD&M~?!BO-Q_1ZM* zP~Z<%*Yi|9v`RN|Jb#BIG;gyK4p_&n%;=-wM{Qt{q)*#91}x{pcV*D!n1vVcdw>MT zQOnt?mp2>+u&2fhIKB|B|Hsr-M#Z%(-9T^+!GgOF8iI%51P|`+?ry;?Sc1DlaCe6R zg1fuByMBk%aXMc6MSR<_d8-xpGu}wsZDrbGqm=q%lL?NS!$EK=ckRL6iuX+kL#fUh zG@_w`PCR3q%tNx!9}-&l$cdVze_0!KfVH7qG#Rf>OcNy)XrF**wNQZ2_Hv|?659Rh zIpY}2>p_?;S|?I>{7Fn98nU)Lo@}PFtR|K=rrR%DZJocm+Eqtu9V!`iECMKJNgCkH zUf>*fJj^3+vteGozX+ulGBDE0XAXLAGGEXPcsdSwK zhLs&FR+cCN3Pu|G*u#cJ;D*NXQNuA1g+q0!=o8H6gj!$PrKE=yL`wc>h!T=~-$PxB>3 zRj~)@v1xmSPW^rKY8n(SYw`C;-qu9k&g!0SG4l#H!wz9AK+0$*wNp`fX8!Z5(z+&C zupblPUbrBR51OBbA9fe&h|)+T;4J3)Kd4L&bcWRwDeLa1zeM%b{Iso;*eGj#&I2m@ z(spY}1jm5z@o>IDP{zm>DD?u-YYnAxBM!vV^Or4qUNr;rzOV;pKwZB*ht#XP>B?F& zuOJkYY%PmkI$i5mZnx^KQz?rJ#Nuev-0oF3_G&oV@R~2r%|9?(1h+c@tu>e&2(iIOW_*F`?xcjfWzF*NFZNt0s9L5jr~fv-YGG7gp33srGOReZ0d zReaI!S9$9UznPkqT;tV++t#e$O*e=}wPY%SM`659i-Ovi)6%s3wIxF{mrA(|i{ccA z{4qV!fbvk2H(3zdgL4Oy6H1gs-hQy`!YjOvqphBbNtnzyqLDqESNL)&XYan|u_5%S^Qjbx3B2BP4&pU=7B*gTq_+XYJWe7b>v}EUCwE~uj(O6QP!@2ICDviD^ zICb`+!BvhS7ZPuRoVS^uRM#?|ONfMhAKFZUm=stKp-iKBWqri*Ew5WRjR70-d^nxP1%e4SDWW^-&{|Bsb4C$qVL0YUWjt)UkJCH4}@bUy$>Qw z_q=C@2|kztn$`CXnxHQbTRMI>1#fpZ#nlaa-?3k`DX~42!5`3?{{G$Hg~G!9eEh={ zNJ1&85pvpn0LGj`B;M!Q{^3hEbQ`eisjfR4rz_K4U%L528gUfE_sht!JGtd;z@M#Y zl}pd!a!CF1PWefj+_rt}mAPQ;xTE)Ny$EfxLMyRz+K#g1L-EPp2O}Pu!-kNO-~V<< zSExJdoMoM0#N)sQP{3KvR#LzS!d?j~9J0B%xR`|XgQO1LOJus=q;b8<;=*K_CbNM(ol=KapL`P$;uvdMY{MUTcRqq5+0V;}~id41l)9>a0GC zE2fMVIctY02{zvB{>F>l!TwM!BMnmr< z$ChzmDchl}7<{t4q_=h@4-(S`+#)cl>epe8^BS~I=V9x%`>j{)Vhi_XD@crXxUDpr z_aNfC4`$Qf|wxOepQ9BTd|f?E9@-8EGdr-sj!79?UoL!YQNmw&*EbvE&-ehhr_O zVyJ-j!eI%X>V(mdaDXM{i0tF-Os;mpHSrr`=N-$bp9MB`cg`I*~d| zqXd%q=J7yWzO(8XCpmeUg#;dq>;&lP3yeM| z*hhSlm+)b4i^*EuTc6#$a~J2;y5wNNa}Sl1aTkei(96TW(|;+d)%?9)s|RfR68AHO zwm7jc`_ltEwzWF$lc)8f3x10`EFE?R(S9`9!sAwS3ynpbb)+m_W960A}zKwYGjLw_Z`r$LC~W=A{`+pc6+jV;r4HlXaYu9s1srB;ZZ;-f8+fG-|!z z15)_+GNTQoImFBX+fjOms--1;8x%YBD)GXz3usAYf&!Tn#qWmaR7B2r)(R%%a}PbAQs7zLq`iR!L7 zuTY~xNcOI8Z&UiC)op}OrHeeE5J-i^o-t}%k`X5I{2mpAt|aE?ZKN4|(o0+CemW@I zrcKA3i%!?}Tx8$l2V^FbRVr`Y6HDB?(@3A`Jhb2Z7vo;Srd z{1O01AL5xz*~lB_E}*n6{xK&RPORE9ohvq{c+61in+;ha6mzCKMOWPl{rj7e2A-M^ zGuET+dN|lj5R~7};5IjLp|A6@N2xl1b;gm*DsQc*dqM zQVO1{OEVBU?{CB1`A;8ChVg$;N;MnC;qCy`-*LR{t&22yr4$rSSSwK^3IS53qNFZ)A2pD`bNY6C?bqF zr>S4laHM_PEAfnW6c3)B;xD38-6h6 zGwzoaFI}EDUkX%Oze@9lsVy&?V2^9zRGBtuwcHb1Em(mqJ|(W@g?lrey~*eI3(Tnd z{HOa9ETxV$RB@sLaLZmh)w%Eh%MpVGp(Zox7CPal1VyGleFFnsK2HyWpL7S5nf=$!RSuqd~ zkv9mb4#_g2qK=WlAVh$zKyg4bVW$<^%PW9r{PJK1|6*r}lCUp z{Hwt!K~?Y5sPgBmQkjvZ-u`8rPO_X7VXN*Z0pFu4Y zSq2wVZJ5uL(%dvQZ&Q>FFr({08cGl| zmX)jUYmE`oD@O$wPUtk!(YK8xPj6iGORe@2IqOdJ=wp$%%v`stTO(Ji4F7XzLM7WT ztqq0K5F?i$;C?jMgx|jj&bwIXf9fw*DrV}o3)L5?ixtzv$HgUnbiE#fr!&!adbqBd zt>1$hP9Kpw(5_Di0A>}eo^RoQlA)x2=?-yNDNK0oy{bLy_Bs zgQ|ntEW{|G6k!MJNbACf27`DX4WFa85M$7NEOZ4tB`h$;$C1pd?HVm|8;~A~N?GfY zsQRI3k$r}e*-4tsMStMBB4T;A@l}uuXF*g-RsfYa&G-FbE|+Vtjyzv2G8}<9jv>pA zJ=Sz_YhexPg^+=Moh;M43xRagg$@Lm8=Eq^s_VLI>xcbY1LBr;nCEMUH>dprjJs-I zt|l=QnN9~rB;KJ-!@m?WtE^8d<#7JwP=P7=YOr|QG%BFq5GI7%1#^SVm^BEY+8^ap z{{x>Hqpa=z=OFDxLXX`;LiFuTdfSwF^j6vPlbdgGz@Kjmy|AdC&l7mSsm@E;_1?d5 z3}`GiPf7Y)VqGzS2GECql`PK%EMl+MOUVWVNq7u1FtBYTTzW(+U}MM99Hnbj{OGxi zAKM=v|I-foq`7K%zk9{i{hfz}OUIO1{y)yL93Aozp*eLCjxf-tJ=Ga^WtDhLP$6b* zD6p@OER-9yl8ayWa(6m`?MZtLeR8*V7z`G(h1T2sb80Oq`5qvdoJq32DzhvurZ9VH zh(0!5zr*st&fkmN!xU`A+-^?L-=6w~_o0{a zQ7_s_;0@l{B)H5PsPIMNOdzZ<1lO5p`ptV>%7Wq^>(P<%Txh2`n_G%Ph61=0a{Q&D zshDiDp2OHeL~E^OekyVpy+;49*Q<^dy3hG$UImB>4FcNKv{Ma4`}?W@S+y}E!;);o z5L6}#xVw=p4y0VSBFq@kt;z_=F#J#2G)-Ef^z58mC-^t$9yPQF;*Y=QF zNmQ?=w@S>wA+TOa_maXs|+NQ{!i@}{9PROhd&1j=B4D#?R(OHp45&LSmvRdp$el(W$TMRIH+d$#E zS3^HM1EtxrTI>G>!-~El!OeG)(l5oHH z(Piz<7?VyXew@*#Soj+-$tQNcmghZr7O^a>>Z*;C9UEPa$9Ce5gVjb~z+$qsOcxpI z=L{5PF1ISu0(b-j7*zr>&UoK!0SA6aL=?#kmiMDxsE(6&#)fz|g;F~Si6t+oW@=i? zJGf8D$K&U`dn`wXIaZo7XL6#L9EzVpZx1bkQ9h?&YdsDeA{N<=`@wvY*YNGLf5nE>)>^VK?$F=il2H#PNGkU}SXO(s-Vrp2Y)V4%_uj=)?fa z1r?Rd&Q++_+iR8bJyYEr@kO;BthhSYOk84~saa*}58*&A{ZBGO%#-o@qXtC+2oy5G zHs3P4+Kfeh;4ld;on2ZYU~Ic@v=O^6XLzYBXXA&3{?c||ztbw_V!h3(NnlRp z(DHEX{qCamS>R6H{(Lh;U`ouUVlzKCG`C71fRv1aLX~qc78%D4F|YNsvh;QE-R=2- zH4^}Y6wsg*iAA9x4wRm^HVzImD!V)-d+FMc;n6Ix0603`mE{(o z7|XSchS%#c!4AW$9SFDHzZ>=1$=T~aiI3pADn8T*ldoc*ae{{K`3$p^fxH0I2y*A1 ztG<)1=TP=>nfWQmiLTPC_QN*kBVFpy>DF z`lH)%(JA8upvTm$*S)R$8gf#ao{oAXZnQa|taJ`rI|*;Uy8@w7S;qPC*PQ^6qxM8_nnH(D&+@b+XuhpmgEpdqDp`L*KY-a zUn)qusy+=s)}=bgflPqeQg6Ud!z_VtdS%_S;`#OWqB6IMwyIQ01 zH0tTkvni5VJfQLKcHY-MwJFnPJP>HgB2CikRt7N0~&|%9g0k zKE1#r@|gn3!c$n19=x1-t*XhgGHXqqyUD6q+%`lqtCk^)ng=SW9+@@}tZMWqjM_** zfUwRKk$1M~MBY4U#Wv{iGGy9=Wwg;|xHo+bh)8{$kLFp_Lq7BHFgeWH2!VUZs;kZd z-qTu46#^OLJ+m`iQ$$_c^`|*|3|Sb>F4o0QXId5u71(tMVfdR7!>prR_NP(0A3k3@ z)qLf)>StwVuc?%?N}*zALC$-sv0j1jE`EkR5|W&mfvMy@n`*W`>qwD_xvHxDFInQ18Va|xH4t8fMg-m5y8DmLsv{= zO<~IRBr@CUxZhms_ir4RjUn$6t>Y4Q*sM}(rvVlTy)MFvTFyus{=&Bet_ZL^0PYw|}YMQm$y18RHgWevvC*(UY|g#=df!W9(` z+fEZP0e1*fAAxPt5}Q7r(5e8}dUUE`^Qy^9M8@av6RaO-sAEWYM2cWNr`=Jben9g# zkValff980?%u^Zw)34|F2`vgw#LmEhVMQaGM^)ODh5kUUxWxQeLwzQ$dhe6eh++En z`Owy%d;E_OqNGt2lD|&gVbSPik%E)kVSa5+Z`V<<;i4_M({z%XU)2}iLd|MBo~hbO z0Uu5a<5N)=`IcbQOt8Yh=8&2JVE~St3m6CJvwoZnL{Q*+brz5AuSiXX{^KJ+9K?r3 z-$~Y3)QRj?F4GBZzSiEM9}sHX%#Ao<+{)-5;2sra!)Mz&CRcyYgh|{Nc*O0{-P5PC zw$BRP+wC!&n?p=RC7Kx7=KZFRKt$GOTM~=84-9XcdG{_m@cFs3(G-2M)Ux`UxM#E@ z99Jmb;E?>nw467ydM(-0I0Yd3O>>i@pFb+#i)Hy`-l0s(^Ie@Kd*75;r_U3I-6m6W zb2FcPuB)s2!A)YdCFc+ne!%xVXHi$_3Q6vMjhYL9!t5KaWQ^y#yNd%UtMtuC$4tcj zY#(4OL-WR~q91P2Zlhesk--bw()er0z-(k`ER!3(* zK}*D(g^UH7Ei`a-+g~!<+`Rib$B*7Rg+QWU- z8rv&hE!>bNT0?2sOGb7i+hyT$a&t+&%!~C1vdEuD#lBZ)tJK4pu2f9QDom$~UMp+v z6Hy$$o?~tjK7oKdsbreoaHNo8+Nj&_5#vag&iR&KxwojT+8ht2-x9FD?>FORXQ3=p ztKnmivOqQn_bXNy?eKwDFoL{v4?wx+j2AW3*oXr=Kj7VIL>CNc6#Tg9!G|55Kv!w7 z`|^BGC!7A8vxp|`XfWlsvvD5HHum>MB};Z;{o$5EWi|paC55c+vk{IB=xjjji_=^Zhk9zQlJ-4=ops z?OBoxCa|dt&*yBH=*Ouw9b$ube|p_k?_LmRj8-nIDe8#rB-*3f%oiPQF)iL;GZ?Jb z%)C@^?ayc(pnhpfQaZ39`MV6VaOGPFq7A<=T?nuC-LkA#bR1#g8FzFhcfpGT^|OaUcd$A!%u9BO z`U66&GiH@X=oq~+05)GiE`s!Tb`IKGOM8^0MN5#zkf7leveWi1qzu4^WXNe1apDtBHMDAC+Zk$4(qM`y1 zp@5ZU>M;}ItqD*;>KriIjEey?d1aW#{${HOks`!A)vZfI{fo=o$Un9EqdH_yex(rg zg2_(zi(Xbc??7R(?w3eC_1qTjuG4z?|JY=?K46pO8_Dvjfldb{mJW#fE8bs%1%rlF zQ=UUH;pv8EW6nwSK6P) zc%7up;@m8oFMi9nEynJQ_zBhKrggiUy_WFAk5Oy&xs{E4P@-o8FVKl#7wK@6q$^V+38Mp>D&3m@8Rpv3zfr(K zcBl)CBBI~|7uSucSjbWC+r$JjOyk?G?M>8Os0a(1E>v2AK55~e)Z={RNZXi587n_>Vc`f9lEB_!^fH`StLjex?>QNm#FjxxqHxvw#$&Zq! z=OF!F26zcnXh6KbR_{u;_xht*D$q<&WGXJ1G>PWCI3@yzn{qZeQFOLo?S6WHaNvKc zo1kXBu6e}dBuNKE!0-2`iXe!HP-}j?pUAUTfF@{!q@!YBP((vR`>ySc6WQI(steTr zO%*m|>5G1uEZ)nj{qci`q#JXehU$NorX4Dje^o=ArPeB>BjU)GxCpZrirv}SVSf@D z@O_;FMRCB=ngPNOeM1LwN3+A+RqUC}KIU`D`T@Ve(5xDZ&%9PRF%lieUx^;#FwpWW9z}yrd zh|AIy?1GH-NB-=_+Hrr?seCQ75bz~I(52ncOy1+Rw(R-Er6uUitS(m2qZf7@XwE80GwTA2e*ZhlgpF3hikr7m zjwxF@z^$P=#*K|+Vt6Z%%}M-^1=y}3}gi?4AoMvm%qI5psX;4qANYx4QUN1v>)}Y za1KJQO2)Pyl)Z#aP9j|`vZ4_Z1~(nEsC{6k-?9ITjI!SY@=4jta|kSDC`Wj^B8_&2 zzAnFjR&rxE0VO=IC&w>o9xNL4`=gmYq@@{^JNeH(D=%NW56Z5DtBiQf2oi}0P;Jlh zH-FpQMF;#rEotxVWC=*umim+~nQdr>l~~qx#{PW!QMUf=UZhgV{_gVooJLrbob_<_ z89D~xN$FCmKB-`&o#907sFcsi42!Yk84~d@g*HO9fByVY)=2cYH${?8X(q1v*Hito z@JxcM^EKwPO~zED?3V3!)e0X!g~nsPdzYi~+hmDSsP39h>j1AvI61)}vm>d4)57*Le5_sIPHwb7r?U@KrFR0I^{YHiK4Y-VpOw z&Vx{|r+G5!;1yrSqme#vn1BMaGaVLvXdQK7)J$;}CDQtbjo)gdRaR;q>)jOfT*^Ml z=9slf-$a~smm0}bYAw>i%S!=MC#qF}u@5%}VQ<&}Mpt~Cz}gFQc5X{xQl7S`jE>2U zGd=hrXLQNUR_`(0qjG>2&FV8`v$;-76_IyFjEOlZ2(THAFwL;=+>w?VhlF*$S(22W z0{O~B4mS`oC#T!5F(8oajmo@O+ujCY-Pf#bDk$E<4fcwWxbzJTF;12Z0!4&G2IIis z5$*3(X&RX^Glg3|MpB-#iUp1G@@3!su~k)PK($+cpYOkSW^mmK0~xOsqFz95=;2|f zdFwh8X@>wENggoP1@&?NAfO#=s-5I$@=?u7GWj5$t?)G?&$5+lEcQwj58UvcPW}Ha z^FYjZpuE>3RcdUybf2zb%#Hm43M=#qfu!69Q`F0cL#WyOhPnC52@vl^>i8(*ET}^q z2C}-0_*t-CHG-TKIw-j@;5~is_}+^j!4nqkW-_gF)knLqi_>)-`qNOzIEl@j9h;Vm zZOzoMmPcmfEl$f_DN6~;PsG1&)=&tbKn$Vc0MTX0#KajOmpP}09N3L48kt8UDvSKp z!S-~uA**msLwcHZeO+dLF%9p3O_BwT!+o2zwp&F1ru3-4rPf*u|C*K47zm$-Pmv~a{Ff)I1mC776<`I z14ZzxQRWo76r?j=8^_Zx1jN$ath2pW<(ZIDp)B}dZtvc>0k{sDtWa=RU1oh20_QVr zC%6^^+@}&}tHB8e)U4lU6%jLyuq3tt=4o^(si~9j+gn>3Gr8Pn3;mxzd@3YJ zb7S!p#-b${fPb&(aX+UNRX|Et5d+lgcw4%>m>)Ie_gHS<3{Lsefs+JZ})na zu&98Ht^ZtAAOdrYr|QQF4jqQS-y8!0xPcf5h2x+9bvXZccArX;sO01@P3}4pw+l** zdYk3#Fd#3cP$37@@0lk*P)7z%voV;yO&X+|NcOI#83In`b3{~uK$6mMUwNx;i4}Y3 zkjatfWZr;Rw+Hn9?AandWS%)87rP_s`r#o`WzRM#NI79TU-lRGcDnbn&(?sm{$Rqj z%l&V-$ujMWZOOifvZT1UfRTWQNbr|ghQg?c?2`|hw9&_yOX&BJz6}p#3pR%zpjcS! zP9GHxj`{Li9yogZU9nzaAOs$Kd3~pd&Ek*$dBthC;wNY1%BreZT0%m?-5KwU zQa9PH#(s}ZU|Yv07)h+mL4e;D8NNy{`KgyVw7_P$@Y>y1pgvNTGc?fRC5xB9N>nlQ z8;%Z$UFVhwMX!`KYbWcS|K~+N5cN;YPfvb^Q`IAjW>VF!G7^pu!us-DuW5_J;$#5} z{t4Xd;o_0;LYV2Ewa{Mx?^uH@XBWHy3QqpgEdd4+~jmUJc`amm%#dPXE~?jDfB1=)((Re)P7aNg>jZJ!X9eHg zlh&OD=BAGr0q4^4CU}P3N`CN)pjX=b$1hM218GTdn_sS>e~$yOL$qW*Ji1B_V>gK9 zs|$CtSVYFxnIOx{s6J8!9*5MMA?H{$^pQmPSqg~vh~$)qz1vcFHv2#gXz#9a8^o(k zdj@?o+?d{uIIPaB`t`9elzkva{T&eGy0MGj7v&8-3`!mxe*tO6J}Ih`cHRB^wF!KN zWW>T)80IC)9GDz52M)^0%1|&AtxKj8e_~?o=JZQ=@V6Us=o<_F5fRh5MZN}ty z7Sn+iku%ND$ZZUtBR)4Vm^Mx1Rt5Cwt#xudK3+)wAX-6tx$#~*E!l7(1#p+7$GK^- zO}HFPR%pcX2X|3@R#Q1xD=RA-Gy&{NN`Z9*uv}WbjKfHE&@ttySO68%#ZowjE9ufY z&wO=BkSHNa)xVj?{#X7!_9)`QPa{OP!H3)#$tTeY z&RVbQA!eUpql2i1m@W0BayS@6blkt?Lc*W#uEqdH=2-EkynIZO2eSHcCaNRG-oU(G z8=C(HNdExm0VY`YR(P)% zh6xhSd_csqQ0#_vmWBgwL)LIIe&ZOBe`Mj2h{EWV@P4=t1amw-qknOuXl%RtRvqM z+)CFYi%Ihql?~DRrv47i;1JdFqHb-<<<1pysUU3Dj!+48or!q`)pM_uDl3mI3Bpg z(b>SiZd}IuS4c_GyvJks?^8y6T|J!pSns}mE6^EwhEAz>4NH_6S662>e>Csh9;|MS zp3GWC%EqRq-1Ax$8$$r`{tLlu8+I}o`|4rh1e4N97y?j*vK%)jtM^T z*h!F}yjRg^azZ8{xf-ifB)}(*29KkYw(8jytEx66uz!I8d`n;mI`_uei=%Lf+BIV( zu`F1Ws23P37Vv<2w%Sw;>1hpjqyQAKqwqzQD`bY!`bP=a(tq_u5J#L=5Lw(KGy!AU zfgB<^IADBKtJv0dqY<&FCbDwN${{C){tek_=>RaHFwK4P{o;761^yn@Bx?}#@dEcX zmGyS`XMXoT?-K{t{Bn$>(dZ(p{0K}vUw;<+<>;D6RqZ+|SdT_cYhY}=G5MPu=*&U$ z@!>B}kB@y2X5O%)%%F%$O!OgG*g!+a453p7wOQs_>L=xeH*eFcWx9_n!y%X%sA=pC zZ*70HTzuZ^+Nbn?Mx}U7}0#Ep1SFaaoZ$m~OMnlcq8w=mk*6 zrUIr{`1k3(@RC%jcnPRfmxC(%1_!~)+QRy0>n>+3BG`{I!Jy{m#eO|A_DN&$e!vuM zi*39~L5eZ81*Fw%BH<`PI^XD13w)t43NzLl%R7G;mMhq5Dr90RnVgIvOU2+VAp2-G z4eKp8bA)Z!+LijE8m*A>l1XD7*g*U}bd|4%&amYIh2vx=?I0wA;At}P>FI|5aM|)< zA!<{!7^wM#Lq+XI{bGTQI#D^<%GvSH!d?rnKHjl{Zk^JszP*J(VUSbFG}qZS*oip0 zy)R-czaLov=1qm(#~~|HNPHj@jp$jJFlz73k4T(O0Rx|a_Eq9@P<=_oELNNF98yg{ zXi+jAmjj%l5N3_pUdia}xVEqv8G90acw)cl#xJ&l*Rv}A2JrcVffD~cr~o6B2DN#w zgaFEcM(odL1uF(9vH_LY2O4f90%~PZzJOwOwY4@;$--nuYs+sH+Qk5T@oHd|`})Ax z+9JARSuTtAGT1!VD%dV=%O24{0f(b3xQshm9=Pzw^dZsSnW!r8Yhd_~q^bLJjndSD#wKMVV>HAir4^@Jbn`eU;8 zGG{L=N7b)qbJpp02X7;kD$?Cl)pw$O;ozYHEFM3wz0vyx4G)cT--8FpChcsDOxmlz zCmM9aE^9r{0_Pb}Yyd3+6=qWiLcLake0&+;M&LpP;Dvr~1TmXimCG-S^q~nV65*M0 zIDaSjpr)p$P&8vxTeAwpepwRD~|T@Z75A4@$h<+KZe3L z(23uVy{fDhWA=+G!I@{bXP0_}0fb{K&~^Ei)?i{4P7q3-s>OWuZ`3r8%Ao(EP^VWE zdYJwOHu0rkVIC{#&+b?Wv*mpoF-0DIhbm~4;~y-*2PQ7}dg5B*bHCpA69LLD&&A#B zXg+JsbWcrThU2n#1YGQZ@kVzhS-8A`+<%43A4W4mDgZc9@Fk}LCCi=Lec>GOKP^56 z0ul@F##*T61FP$bqU0 zbT6LElm48F9&S+>~uhSnzJUO=QNKo)a zt^TNXx_}nz_shddrQB6^K1u@mKd@3{wfjuJ5vR^#PTbjxjLP{(@^|BWNnyk>synjW z(<656jk8`tr6$b^51PK8&QARO;>#A|dNKr_B4rMh;~%SBMO>M37BO zKmf#WAxlH1spWWggs&Bu!lt4jfUL@63w~V33j$p-AqlqsbrV?o{BeD zODqcxF}0)3{ImdF48!FJL-{V;Fyn6<~US36<4A8&sp$al)3d40G(TK$&89@ zP@P?P9V2Cd<9G8lqJXq!PpbpOcrn?`ASqnR~n#_e-nA4VX3Hvpdyfow_XIOK}UK;3m;3KBE1HFOjbIux$E+Ez~}NDZi7jEq!PhIZ0ifq>Syib?^PW{ zYRq~*YjEcM>@gnxAOuvh#+DWc=)AkQ=-6e3=nwN?7-r}nAiflUYmm%Lm>uPh;}xeZ zj2e{S(k``Lf#Q8)#f81b(?32Ysp&6|BeiB6526o1s|TpumyPwLV!|rNY~rcHDm|Y}PX_&+VFQ1-D*F!pnr`13 z+GUR_#;mN!jXt!eE?%1A3`WFt??+`FRf@v@7#rYb$$g3kB{fr%K7DrFsZBxpz%gs_ zk>yKLjKlloGW-bey{+kgnTbPiewwO)Koy{z4WuWKV5W80?pKv8P^t3yITKd7x_ z?=ZjMv$hjF%B$S_Cdr;*+BH``Yyjw$7K^({yFbQuXgi8E*m(X6fL}o^CPc$=thq+0 zsb>)~1)6F-oHNNx_gHSx7cPgwAcBRj1|%R={FxIXlLr}@kxp2mpM3%jK+{N~~k zqhY}B{%7-9|L%Mo2x1i%y`i#v+Tv}(b(;!&w@bF@?gmr_0wyri`2c|iV3T^zg}QIj zRZmbcM|f_dGY!9LyizpiOz&1#Vjjf`MxkEI?#gwCVmYIj^tyTk`v#i>y`MR=R5ApTehDrvHn(xM$MU-GA(ISd{i*{9D5swF(-lpb|LGod zCOf;^ku8v2LRS80XTa9`dK*Ge+PsCr{bc0}=*1R%#^*J#S<5k+O~@EZxjJ|T2O=N5 z)@Ppa-7!TVVv|?%>*JPc4tyF~x2IhF2DNM7W_*JpBy1&=6jGD$Q<9a5=>uA)xNy<5 zWi0!s_;}nw5)~g_h8=p6naKzZ{mMB&C~n`G+KVa3CO#^f@B9tM{zYW7Zy_dv9^?#2 z^l`JD!qtW0m{Jh@2i~nQbf-`t(p2u!UR!VnPIuLE0Ejo*AD!w4<3{4}!#Y@UFs+5Z z9%?BRmgvVjQK|}}Lj$#vQO*$BzNg;vttN0QzgMQ6`p2*O6_h2anD# z5Kn*DzzQ%-(L=k%jn$ZE-`VKqsQgH` z=ob}+ihxd8Ef2<&N}j?r8bb=*xxJkzEce~lZ1`D%A5)7pA22B&7XMf;il+2U#7UYk zj((*qm~OY()t)HSfrOiz=wcg8>k29!&0Ir&J+SS_Xh5amr|IV=ks~sav+qf@pDO5i zQBb8DVPR3RPKG=tkcrjH296TGx1a$-TnWx>)ypX;#Z~V5D@|PtLTeq9op#5n*dO<+ zUX+rFvBrYEU`?U16jINt@8k>sG9Ix@K?oBFXPG_>|C7J|n*?c>BGozOuGLr&4?}Fc zvSJp-T0?t=JCZ{^Q|E3y0*)0c?GZ+d^2Cgj38^l}tBr+CYL&;O?*t zAk7CxQ2%39fAfUY){u7LMJ)_lViH*W^GY7t(XQYc1GKRrqSU5oKt#c~!bA1Fbb2ia z&>bLo`_ZTrJabXINhJ@eCvEH)Q-wGnNA=RazvLMNB{4uJ3;bLKq69dUYkm`xC%tg@!QI*f zw$C`OoltQ|25X&hHdkg5E*v^0c*GtH6jb>|OOr*$9wt#qYA*b(#*u~r1@rL#$rNXF zL#ZJQV9whBjg^B5&uq(yZ1TyPhnJV8)_eY#8T!MZE?Yqk!SFr`0UUrmlyA za%i@a*UIh(6X|ZFmLY*Fetx0%mACo#s!-s1UDnik4299gT5?iEDiY$n6PnHYa`zj) zHM?wHJ^kU;x-9_%TS|3zcug+)BicNf7odm%lMbp6;`V06uWx{^1$!^WKg?WMftd>q z8P}zA?hlhRZV~>+kn}y`gYOEZgPJ)MZySd5Raky8ONk^;OGU`wNAU4?cqg16rmq{y zYV;kE3n^grW7zF^-q_k=i?TP;3b72WrJH5KJ?p)>5J|{&I+f~Qr zpG@)P*$T_kWA_7_Tbm>`DpWQ%Q0ZvL6 zp~rm)GCCJ>|TxdY(?ohJL**bKx=zP7{N3gi? z1y+g0u^-+(yvo8O`Ivu=&b(46$UxHacSI!`JzGxLLmUvLurZN&bxXtiQSV_%|4-fK ze=;%SK$lyIuq&`N#g<{^1|%i5(K(2(DuTfS3G;WP)Bu^Dal;|K*g z5?Nsve^ikOJ=p+*&a-gzTeoE;ixsaPJ<%(?$!-b8tD66Cpa4Uk1_Ty^Kvs>LYIRcq zdZQN)jHx{m)|>PRzEQRbXov0ee+TaOkBo$MyEO5go!#JYzed=fDT4>9njfzhS_B*_ z;CF@%Gn7Ykknm@r{DKCR?;GqWl#fm_gBtag8nb6>E|8SUc!Ry3aA^#GQ925_xv}Zh zk;BvBBHNBE5lphtDeZy@%^?1@he`NRJUk+A7Hm&9;eumCAkbyX(3WYwzE^iy|84Au z+Ft#ZgIIBbTLUdAsk1=DL#=miB(44RF>0H4u` zVZ~|(HeQM2OO7Tv;>vQ5)H*FuABkhAm%>4(HhY`IAmg~1=U^+01;mIp8|2zJ@n=Vy z$N!ST|Hsu^Mpd6Y&1UFbQ#|9Rdo zd~ggLo4wY3&pEG}e+E|wFlTFqrVO$GkW5L{fHSp2pt7prnV?TdHt$=qHoH!ta9Xb` zIMl#1sL*gOpm&z*Oc~e^vxf+yCT_kn+Oh>J9807QkGd$LP=g&NQ3Y8iQr{X})Aib^ zf1@Vg_XDdj!_mk4$bRE){tjbIZuuvMBf($fSc9lz1CGX_aljAOh<22+|g#2|KlMhrP!zVP3C02zOQbW@1M;(M_PUcBBA&83N%DM54W z$G81btu0>r2H!bYasz4C2Hjq$K}=zQVbpoK-dE`DoQ?dCPMZJDe>#J!Cl+v2I?o|m69=YtcEh356^ z98`V={0HKbSt~%UtnVYU#w>0W3Ju%ehIJM)awd-8YYhUm1b?3Yaream%L$H(sy=LD zM355khr3$8D3i=O?QhrnPc_LG?O4QBKmIl3Y9}d*`KuX{&}oXQRO=flE#VSh+EXIbgL}gx5pp}qNMQ#*sHq(n68U zT4^Exd5xPip>}A1+hM4p=2AVqp8Wxse!t zn~vXbB=AXfY4vFvh3S7sXzMVv-hz zh8B_lQxu#uMutsM&PPASVarj;?~_ayzYx_b*o^OyJv^JW%ep~-9}u9A1X6cu*5joF z2uVn=fM!t5T#6Xp+BF`u7bwh$!ib?ZZYq1BVWTL=9>mZMahUYRHjn4>)EMw;z!bDT zk-Hr)M+-xvVfYsp413~NBrgDD)U*kj+3S$E&t#=;#u@p&i3)J?+4s#f-iB=Q<0a+UC^8MSx{JE`% zVn5Zf+9?vl_hR(B&f(38$dsR1@P87)d<(?_Y^F{fi0=(omXNKX1$YqA20K^un-3;* z9le^3vk7+mCO%JG)9uQt6sAwQGy7gXzI60+TTXHx$$b`Ga5lEeXrZ8c+2X}V>4AkZ{4)wWdykYfC&&hlQ;4h~FhquBan9ywuD$Z81U&$dm{_&f@ zS@!D>-UlR2+T6gLp)$4|A#wvyM;KZ^^7~dC=<5?zf@tj`tEz$F63k{7L@aTLWnLcI z*-h|%Vgozl#B+-aO*?_%#=L?r0CsQetLE|FLt97*5nj_rw?!`!`u_YJrt; za~_NxSgJkA2}=qE7bnWl8{cdBSkD7%xf?|cZ@ya$j7Q}j-$;-F-L}G#g0{JI4qVi0 zjDQL4E}^keg{=A)@6JtHZSV-pBLSCb*a)nmO>IQ`HqMTJNuy+eGni!m6onu4e~B7{ z8wh~HN48z^$~C6oueBdT3ORiKeD>y>01ir4!^zU;TIJ|?oj^7|U>wQEBeU#x{U+dv zHZV5U-`3jFD>g))#_PPeGdzbyZ{O^CLglB%MQJayu#Cc9Iu7yEc3LR|koZ}=ZSIit zoRYKSqp5Ox%QXh+>jfRbegh~uK+g`RYyYYI3WBin)qSpR)Z<~aTewL*nDjyx>jxPoB;e|qQEP3yF4}=NA^WiX6RmSDN_#y&fw!_JM z#;r4gtrw$&)5X0Hn`*$mg+FW$HXtZcM3B${0mOW`^xD8W!r81RlpmVey^d}}1OrFg z9^MYaBOX+?F1LTSKn1YTH11!i9l%U=xUJ`qvysE8m+RES!q|SSw^+da<$Wz?U{DEM zFS*q~>xibI7uEC56z8XI>bafB>(n}Y9__gL|6JFiD3zvB*3{Jsw3;w+5Mj&vKz+Lx zi?j$>?@pyj`feSI{cRbrQV3ya3^+TzbmoNT*kL3ked?GlDsj9DH+9eI4r%DA%%+nb zCsF^CRm2D;4g6h(VF?`G0lm2sQKvsW*SB?ZxVxH+$0f9(t@nIGITWs8TyO7H{W)O z04Zok;B5CnXAYeA12#vGhu^&?JDVMknIrv59q;M&QV?yT^B>{}K)fP>OH-;Z;?<+Q zCIIoVe8*_2FLy|A>b!J2y0TnQ$Oh%p=_w(LrB;7{*|73ISb#X7WZg6D5wjOF>heqd zzImkkUbl-Fd65(0`1qLZrWS^fB`PG%v5bO=UWM10V{{;(;A^k5H=A zGqfE@VldszWDOe3Qy*iD z$qm9f0NWC1ILVn7!+0&Lpz&&U_Ft`D2ZWRyFgB8z_t8lOd}?oJx0-ek77APk3()6f za6z-fp%m%I6L)grB3s{3!mwRp>xd(VHY+dAW)g?-HvsQba=aHd2)Tfv{F;)WgF zcY*^2V@g{uAwAsjq2!tdTDMYASiUz$v=Lc57R^T?GU(->13<0-1yQco8hBf# zUFj;#^6_K&q6_3=t@ST*h+p29nEw5bwg*A)nSg`x)AmtGPg3M{{6N+H7cBcbmp9@- zgllb1y3>kk5E%iWYZYF_VUQ75?Q6o2t10hP?O_P;B}8?cZ$F%#@Q2W;on1QhN8$+o z->W22Uo)2RF z;J4=0sxOYAcgk7KFr3y`SH{67&xLF*e;-mggt%@UWPrt+Cn5GQr+zWdWV! zudAA#M>#UxzP8rE*WKOarFj%%d{b|Uh+My#jcET=o984JHx1mTt>PG)u;wVtc#;Iy)h?}oI z{UIA1-g6UW{c>Q%kN067WoiF0HWC$gzD3TQzfI0!E0Q2-0x-j;sGE5^pH2L z=(qRpU$n~Zciz8Mm}~ev!}Zr)ZU9b30Z3=!nM+RT(sa{KJM!c(cjEvW8i$#L$=|QE zmy2C#yt!_@lm7|@cd^4reN=8kc6hc;s;Q*~K839)sPQ)8RnikUn*LOFz6xX-WOx{X zkmF6h4t>GDMO(WyGB4QZsF!EmQ47fYZ&{)1bny{te) zqALo4S*6uPegwajS94OOc=>(fSmK_ZD;r!noc9OSmNJRB-jPyk6q}!bBZ*usV%jB7}uh z9M6VWT_Y{M%d<0LXi}h5ghvj#bUz0{I9uzar0DD_X#s*SXPm<5`quo~(lN&~m|E*y zB=cQr2iF-pD6ERI+-a}7ZPrGU?K{EMwkReu8Ex@z^kYG9KU@mqbpr18vXV{i0Wg0ROU=wrgXP z7tC)$&H471k8Vd?6s5sw!gh94;dDI-F+Fd0zW`MKS>b_-=xyx{b0Z3h8XXttzPmf< zgA+!xeA>StsgtvFZ;CZ^4l(-%pv6eFgn(uj6S>I{+MCmA@HBT0S*}!piPdhoS^f11 zm^zGlhaPMXlv}{87X$KTb*8+weeLXieleFb5%dILx{NN3Im3&mZz4$ev&^52aO&ffvu4cZ2HNf2T+14955@-mq!f!*+9ES8f_rMgL>iFA*QXUEZv-bUWr z;XtD;21LL}NK)b7&_<6|aWo7rG*N5Sorzi`5z4q>VUiVd7_Vli^z^3p&CVyxw=m$` zdFJ2PSqMJ+&)57eb@F*KEj?$RZ4(v_7KNY;jJQ5}59jJi_5`Jn_P)>cPw{#u2ZVmO z^w>uA&eBZ)KFSd-jBh!%?s5%i{r;U?>4xk{#SE;+ZkfN}j#hV9kWGew=!y?3 zyW3C#G5kJtu+cXPV_2DMK_+|^^#W5FS1P*KbgX{@7yfzYE7Log0FMHZo|aU*k)Dd- z;>AKO9%)2(d&YZQcxg-mJ5|{dm3e3F*_8U)qRLMmYo=14mJ8bN7x~pH&K66a6x;n| z|Ml>8K-d8H1>DjCr^>MP99*U8Fw^7xZ$6$!2Xj-qsK6ht&ZX38yHPk(1iy#_$4fPB z)3}oYbi0~?^lF>luQUr*zdn6hOm;B$u7y7fa;HNgCDZK+2xg(x!Di6WedQ~d427Wc zpU=0wdsBVPr|S#CLdeBCF$VE1mUc zhJ{A*l)8~DDfd0zX)_(v*YB( zwe!9W@u-*1hqRoqH7XO$Q8AmB&(!^1YWP+;Fd;Fh-RST>`U8IjO@j-u-Yl9=Jd^P~ zS7b|W*?mW=>@^Q?juOkQ@AYZ=z+_e(o!WMujPrs*W$+*9RZWSZ68kmT#Ph zyBm5&vdh>QY9!jmCseGBu+JJiX>F!VFD>QD&`Syhha>;AC08bh%6w8)59S^){$r*3 zGjdXsfN7QBh+r%<+H@*`Sm|q(WTgf>_owk7?wfMs+M$FZ z(Y&nrXchDZxSpWUW_-ieTdUOw`z!X40kE9P#*NRXoO;GcNSopt0Ahatu@Ck*rym8R z34vJ=kPUQ!!-Drk>LOH2OyoNgVlogwyPvITe2$H6#%3$!oGs-n45b0$t-6AcutnfZ zs25TijkX5VvaZqFGO!}j@PfF!Zco_&2ol*5KQ|QwXv`dT(}|Kj1Rw?9hxtw+%8Eezb(jPb7 zn7_u~eYKXa#jC}$-|?y2tO;R(b-BN^EyiQXxV)qVi9K8cRGg060g>5eJ;&1Q#hvfxKe)6AYjj6B(ltkIeP0+`bKy@pY?H9M-Y=~+H z#1!5lu@s+_Yk1VnejWyXjZ(&7Bt=-G?m%EY@Hgj7aSI^1e%0X${Jn`O$-sZmXiE{& zSh3sLjl#g4E7I~K5G?Cxm@yXPzC1s~a+U37{?3J?sjjIo-0Vx}ijwfXy;lorZ>K1b z*^e^M)TP?UD840h8>Tv(_ftcGWUAr1*M!S#+s{zc547G+%if>ZH)Gw}Ci!S}CwD)w1n{W65m+{D1_=ctp!|FSi`gIfBfbvZ)npD^4!C-LmaJ~ajP`M5YDZS4+@IiP zThy=(xh~_sXqH$nGW`D>i4+14(Sw#i$3qRT&U{g(UZ2gP@8YS_h{@^51}%%*NTPr@ zY9#;VRa_&AmW2hT@3YTPf}!tKRN#ymlBMK<9y;01iro&uT`trP2 z+@ont!8pv>q3j<&UfQ1)VMr%?TuwNs23I<)%l$YnHdH)o@Aon|m?j8cGq|NIJKZ-= zb>*$N+odG%_u+JMzBpZnZZHCZPNh7DG25gb_eg%J81_~fV}Yy_GQXTD8CV1IC<)vA>qq#5Pk>}%+b%^qR0FhILnoVMF6K$GBf$ML%g zZS4fXZS$XYz&*CG#l?4}h&cm-)Y|xhCYj7Cy<`Rk>rZ6>+`;G_UX7lj9iq{ zxPg48oI0&`k60!;y{p_>TBVIr3el4h=JPX+B4^<$SKAB-KF&bYM$k^=5d?|-?jI;K z^AE*Srfr1WzzWsGSsx~?tD}QFSxy3k7Lz?gVV8O=?Ap-W6b`5^C+UlAmNZpmxmM>B z_O>Jrm2GRIA!}5h8TQ`fMuOK;ZZN9DJ1Wd4^)=rG`n6u}6QGb2*g(4zYt%dq_Z z1JAdxP4k+GdHqmYKt|ye0EFZifG5KKIP25OgJVBR6w>hcRO#?*LW$|0u33QURnJS+ za>ZR_UkM`aW zD>0OWYVf*&btXbr9w_|C+ZBFCg#1gmZqG(2j~EpE)Q z`*k3t2feN)@;OQGSsX)6VI?5gB;O*bQX-C!R=L(jQM}4*LMfCURb*jLvFxkUqKbZ# zRYg4gD1Q(%E0xO8-b94Q&No#lzZx^KDk&g74LG=<-*X>&?k+S>&zMf%!4>NgJNAww z+h-4|tsywsGn>h9Z)aKJaeEOkZHb9!)X!IMlhVUFidcTGokl3tYLW+@;AbI_3~_{m z;Q}!akAy}XQ}Yk1k>5`Gf1e{jF@2YV{Vg_;3W#FpBgzrO56aAB<=4rn@pQXM6v|Qz zqm)$M)3EC6Xd&|BG`kpH&wVQ8h<;6nOxFg~lABDu{;T_1)ToE!FoI z(O9W}{Mo77=#_c(%y@+p-Nu^v&n06CoMTZ-w6af6yqBl;*xYO)8uAvUkHgX`?+#<;ipje0L?_ht-e-9N^y_s885&=zTJ zZEO4G%3mw1Ea!zOa!deK^5CQJQn_4uS3%O|hFqa4Dyq_S?eYLwXE4IjhWwC8c5FL{ELPKsPfli_6BWATprK%*xNoFeR>PA%g#td--zRR+wImLDWZj);m264oE zGFoU1Kd2=Ct3J2B3=2Tv562KWwglW>-l7apK ztD?RwQK#g<8POc$mlLRo6N92cfa7?j#k>L8AyWjPdWo_|#f}#1CbESo*7?4RezT$G zU;m3~n(SKRLXhBfyeNsfRgG9~3L(sxkdMj^7Q$@bnH%eJHMl(oq& zrorku0v`9*r~)v8!js=x`5%E+)AGV(YN%I5IgKyA~;{$5|j>Ud@K4gjoF zQ!2FG5h&z=yl!eSo^dwBySu($CyzYFTC-CrPUUL95EqQ(cDjbXdIPhDFUA~c1MD2( zBH{@d|1sNKkI_n=5#!HPm=9;38{(Jv0Zj?|IA|hB+ z7*x_uYkiQCpwpDG+kPywYo;8Xsb+LBu(>&y#$)1!bXf&24T z9)ym6_sGv+*sOwPTyD2KsYL3bVQoJwOL*e@7vhgrZ~CHB2_d{tY>T=~o0B^hS;eay zI<10!1$buE9M1N3H{2e_;B$x1>H9*`yxhG9fgrhdH`mtzc-#1_y(wmGLz;d{^E29i zfd6rPSio4zt{+Mr9GX3gAcC=Y^QqMQkW(w{a?>po!7(tCy?uDntY_|541hqE0;@&M z>Gt+ho6n89FIvAV{=vyW9`Wi~Gi&Q0v2})+t}rxHjYbDnJzrPe46k$WWv}0iROyRs zpvH~D%G0%z6Z*PuDJda0{PV==!!PqoOU1PO1D3X&1n5EuE3Lx$Iqa)=5e+Mgc{N&| zo^;QT7s%yJ%2(j$Dl&n!G?kL!<0%+35*-tT|apr@*uvtQKW+I~kh#{r%Tk6Wq~wcF>*D z<9US2{QPxCZ0B?6`z0)s1tSrgN@VD>{`O9tCZPth)9Hkm^%H)7=r9_d)*l)=6Sgm? zqjG7OE)DslhT2x~w}-RnS@jrEK|yanzl#w4fvkFa%c4DMW$jBpcLxCnM}5{6Sf}xH zVwlTyW70q<=9oY;QFA?w7PFBM!;jp~c?qvFJUslGcq^040*IbJ3h@1(=loZS09qKe z+>BHr(STHNQ^-)U*ddQbScY9)D4gr(nB4_gw;et^0{vZ-0n}6u{6nvfiEQY=;NK?J zh^g%6Yu>!6ocQ>*Ak|)~_+d9|(~gTjIX%fFV0yaD{VkKC#?;isT^qgHl@=3_lQ0As z+?X_KcwOt=-xX9;Nc5h$rH}dAG~Mw19xWNJ4>pKQq=~V}-Bzp@}ia(hMPTDhrzjh5lgY1(|z5qcbQ9chx z1hEpmUjpV6Orv9CGvYy!ro(3IQDoY|WWmfHTkDR+o`(~XwdsYrUecO*kqH=|X_yXRi<2B5@ygY1R z?J3&vg$sOU-M3TLf2;oMW!<3(e)-I}n^u@p-uWmB9OSanYLub}nzbXtn1Qy@Q>TVG z`mVWOUpjiRd`nY2-Dc5>ovpcwicyaR2m3U|f76+Jp_K(6AAmA%_L2+ELN1+BAcp(g9xIw z)EIz+TlQ{I3O*Ji%yF|jPePeg|Cox3Q$li7EC*Q|kMGN>S>~~=pa{L8lIR2as_%QF zfU$Q~U9J*7I-$U294-3}5RQ zO2C6{Xt+*^tY-R=dGhSRz8wyppS|es~gibw8r#;a^-GkNNN)qEl{3k_?aR4J#BkY`5w+2tP=xk`n!BF9;`Dvn%EYXg0n$=dr&n_=TRTK^40L6p#=;5It+l0E8vYz~ zGi9Y*G<}4uH&=81At5_*U587bVH;r0+Y8Z3Y?sa*ZbLQJ)ZqP}d^I#;uxavbmXpbv zgcXO?c<3lCGW@e~;q&2OVfPzthLnDs5A|Z>Zc9NuYKeE42hzYCzYQ+6aRob7!``FZIZ{{a$xD4>jgI(Zf;k?$SfWg zm>QB>S&Twksudh68lfN}c9lr`ea|wmCRyM+YGGL!20x>7PmLlm?L%I!a3-|Su9+pJTt!r2O^z@_k{e5t5ZtXN4O=_Rk)V{pTrcrgQx585^F9sYsI=brz z8*t`WSnG>@qA=!Z!KRqvmP9kNvuZvlbzd=gFX{BK7wyFpDcVoMV86xoV1{W93@fWK zr5fSst&9p;piq};#hOMSS8;zC8Tl4S(_n}lpv&#PHYLy3HRS({+0~?sYlj2Wc!%w; zQ>R@K4DeWLt(R;v$GmzvwE~NfzPICo(=djRkmBOvRS%vppOIpEH|7%85@J^R%`^RI zw@uB=3L*Sz4OSZLlfTHl$h2-y|F|5oF1F^%K7kod^b503^ot4#d6(5#=;=5+y!8HU zZ{UM3(j$_(F0XEG#(ghnSN2U9C1vcMasTn#+q>@{PPaBM93DL~zB~h)F4xOBZ=`k~ zV=Q6NL)+<4Re+^rvW@K4nBKUP&AGSyW<8;bp&!@<8!<0f@~D$og~2hl>pX6LmEB&a z9$8qi9GfcxBHL$8&yb0lhudy<2Ob7>^QV?$zc;>tfv!86Uc|n$hy>U~Powd>A1S>U z)hd3yVPLT59Nf#z7HSSfa&wldSfM%2*9RX3qt8C5e^3OYJuA_yb1ShWP(lCs5D;mO;fMVtglA{c zrqQ`Aw7PgG?;AI?S#2okxPmXK+SHhDYhsg==^(H)DOGBsjl!vt(C0!SkA#)-u6;mP zxTxAaQ5Z%MOxZ%A(^Kfb9NxR2biTKbl7LrZ1=9Et@A!tA>IQY+GCJ1<}Qr02S&?MwO zC&sjn7W?)hqEbS^x0cA58n} zl9Tj9HbJg1XU;+%vCMe*^N_~<6FZ6A5gjEJcGEPaq0!g9tv5Zcvkr|P{?4A`g1|_@ zmF0knra*k!yE{ktaS}Q^+Z-#w(*6ADrUDt0l*PTAYNny~@|aCux`qGTBPfuE$(X!1 zTS-YvE1R@lLT*UVNs4VKxCKx7^P}?D+l!bdr98JFVK2BUQT@m;e(QxCcLv!x!Ggoo zrGpFzDNr5k)!N$Hr^-{mc+t?nK(i!S6QYfnIWO%qrF@Z99SgV;hn@PaC*7f`|Lj{{D2iV6p$G z1v}~Cz9og`2&*Qw5>mrRo3hU;qn~?XQLxv6F<_?pm$d!_>jD|z1^A;P4$)Yuu(^wfrsh%X}zsB!TrmI2I`OR+6WK1*V~kJ4Aa=it%p8=2IcyzJC@)8CH>4oL4?H(^T?TU0i`V)L$=)rXC?5Y+GWsEqnnS5@n zI+k8bv99PQxgZdK0eefPjw7-GG|jzFH=~MzcTWxa0*SN(s-buiho`r>F#}1H6F`dg z7=sTAmYz%1)=rR)|KsB(lE-d3S!G>SuWijq2M9}#^lLiP5!~QR(sIX;|J>mB&`4k% zcIM51Fm4wdY5*;=uT1N?6$I3EXLbA5t+S_Qwq`pljEFWm9ut0ovCb`ulTAf0#} z?%z-dxGXS5MN}{_2r6~m6t)x!nwkOAUr6&v$zbNph7ubu>m-izpx~H#Z_g5XeD`uI zD0ek+0u~p=f&kmSuY85uGrvXaJ#23~kkkdWy*ELEd)KhcroFj14zCPzg>aNG{9nz% z7l;E16~`ZPq145o+m$bL+J4&KA!8z!t+vui#gdUVgRdO})5}gD03o;rOu%BZ*w56P zn3dJkn_nL&R$%Wm2O>R^|D3_!WB~p8yS0I*<{e?BnQRKN-oSdkwClF6+DS%_?5z-x9is9 z^9ILyecI!v=R-epBtsA$oKalrV}6FDN8l9(kwz@u?{^ph;G$FVnr4BSW>_ z!|hjFSK8=5Ng5uJ#6)<$H?Pz1$t;w5&t=2W_Hw5Fv&osQP4oII^%Lj%xkzSXAY6Q< z(LVd?=7A-%%GGTTBRB|bj?@j+kxvH@?+lj+ z5BZp1<^irBBA2;>d?3DmBF$=0Rm!6hP3SSb2MP{TGkH#TV`7iE(qzyqFCSxnD1I{M z{svV|wx4Rp8R~D_??Mo;GZQ%ad#c!5$^Wj%&u%8+SS-Q&hPPY4Q2Qf+b#leMbD^Kz z;7vZSaYJ2QXQg3)(vOD>kLfvf!?|)EQZiE_Dx&w^H+Wcfb}|hL!aF!f$NXfy4E)jo zWx7ZRICz9Idm(UBD@53A#4vKvkNS$<$CmDe(z9ePkkxy!2?>Zmp^iHI8Hs@C*qiD9 zToCuN_}<MJuQ-XHM7z*!iyQ$2!)Gi2=dygxxfPUnE#YzX4&VarH(C^r^IA`uMLp9Jmo&96FJaEr=zv$W z*Q1DnW}xIdO1?X0(m=VJh+@FO!?BnN=WzID#^Hi6=*40P-d6MENfXXtW@iZ1r2YKA zNh#nRi2`7C|K`a$z^4lMs5`QcAaHTzHyu7BYi`Zv=!Y@~`r!8#Kw@gvrV}O|%76ny zdIv>j9;KTlNogf5%CP_*o(;yZ!~Y%unBK%k6l=X&Rul=l&#*4wV19b3L{mxU6S=~9 zw`)NHva)aM^LGfTINuKnIXDWykjSxr8zt~m-ozo=;h^u0;gdk;hqGby@rbRoAzBXY zfi@n9eN*Ky$d8_Kf}A-BVG-x^wu%mxHl} z+%`2W=BXB&Ncjq*YWP;}9o}+~ zG;4E*Ra_wxt`8mSF2zxbU~FOb%_CzH5NQ^L9`Gwviy7H)>x`Yl9w^`p|Iy<-8v!ggq zn#(r-R_{^lo*oE|6xv@r<8E8OTHJF`kFw54>6r7ey77%pQ~9? zdT?kH1B=$3FM&piwg*h|MkpNb!@@KST{L={gpA-&Iw0hQ=Vp zL14WFeGpvHH2CUo1tn|sP_F{iX)`=dr$*VU>C6*hXe5hi91cpY%|#U~KtVobA>~Gu z6IbYlf{I&ARLe-?@ZWj|IxY%K%*3**l9~b#40PmS3?YSx>OcQ|Hx7T2ZzoW5-+n*bQcHWh$N=5a(VOBn4-$4^OQ&X^ zFBi8!^rFBnT5P89mASGnx>K7MZYDdL!;M21B$k*|oKi$YNnD=)0^Pq^0Hh+AgOXj< zAY@>DH99*MTc@V1D@nc0Xe@E1V)7gJFQryJuvMZyK9t17-lu@>u-5o6-2 zs$cs6`{XqS{2J5V90NEG&b~&2Tb)>&Ph3(GO{SDMQcMQ!TtRbTap|@X-U9B1S}}$pSG%cJ>PSQOtX0esG4?Mg?IF$1;Zo zLHdt2>%>M0pgtTl0R_; z425(3s57bYitpoWJxt+$A^zH^HJavhM<~Nrk$IU@s?MO!xll;r>#hhlYt@wV{rh)P zYHrW-V5@_d@_Qg~^+n#*c0ke_M5v6=Mn-j7^K|kqEHrD2n?-2U7n*8!y69f zd`H%HVDtyi^y7nn=f=CXRY)tsexv#0#gF(M-heuunT0;XnYUB?|ACLM(*g)~emJ7x zJPuQGFD-gy<+`x&_1_qs(PTOdz*qFHC!HzzW6qhW({5@t(pVcE%d-*$BtnxkYOlLk z=iVipPeo%8GchT{&{qRPM$q}BR{B+>ERSanc>7DeeE77OL}3!LcIvH*=w*v%HLxN<%JYH#WlXKi#&vRUa%455E@_>>R+bBcUAcdhABx{q({A zS@%0D%)!)z;=+xUs3>GKKKEi5%Twigx2o^tp!kQj5boXO+$pc#C3^-zPtTgKSWfmp zc5A6(CW96#B^8yJloN4%K6$p@GKFzqYip}XHnAR%#aD*_O`a74>^p$GJ?qyE7v%)MZ z$Q$PNA!0WsSgy;g;oiCEdAa_(Z}}1z*g3C!i`VLd0d9Q!hn|Y|)xds&%t)XfuOFCs zB}6P}lHHz#{PHk4*2l)WA)wDZ=LB%Bch+-w7!eBv7;d$E-t-fC;G|AKU+wl39~T#G zD%~DTTg~CegEXhhj4vt*@@h$GUxSQ#{QB}36~T}e`Sfrt#8#xQs~d&H?}4@M`&KcV z+$SqsFGCOas{Qs+Sw&4P5c461fRlDxHq)_8qn4kBItK#PGL7AlR;>)3oFH{HoVKL6 znDM3Qd)4i>DDDxRpKVwltG)#)ppxo|S@jQUNTL<%N{kYNrCI*P>(B{GT8k6U?88t8 z5_~}9Mr}%jl@6V_t>jvnKIc9jUd@!#Y`PzP?G@q9&6Abd$iB-1nB4kjo8mrnzn3E{ z9fuW<8S@IUohJBu{taMw?C(Q-k)$d>KG;79nfgCapL|>md|MT9-n9{2+dZ+mGN)|3 zxp28C$7`SOh)*f(Kx>6@LA0T>xW(2AAYpdOkY`7=?Fi#3{D$eOy728neFnwp%t0g>QTDHS64jIG?|f_rD$?`KuU zF!S@59a$FsRHJRi2m=jkz+^{Sf+-oM+4a-ETqBn42x-n(98S=2VQz_#g$?ANbF#Sho16`LePJ%kfI zk>6@g?~X*;34KP@0wry>4g7>_t zEF|WeVf!zfqIOW{DI|CNoJ8V{K3r~x*lqgHh?7%Or$3$H87

a6v8Ar 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 z

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 y0pq_ur~n>hanAkMIrjf2 Date: Mon, 17 Oct 2022 17:40:03 +0800 Subject: [PATCH 005/116] Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> --- .../supported-bindings/redis.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md index 8fabd7bc3..501ad2707 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md @@ -88,6 +88,55 @@ You can store a record in Redis using the `create` operation. This sets a key to An HTTP 204 (No Content) and empty body is returned if successful. +- `get` + +You can get a record in Redis using the `get` operation. This get a key where you set. + +### Request + +```json +{ + "operation": "get", + "metadata": { + "key": "key1" + }, + "data": { + } +} +``` + +### Response + +```json +{ + "data": { + "Hello": "World", + "Lorem": "Ipsum" + } +} +``` + +- `delete` + +You can delete multiple records in Redis using the `delete` operation. There is at least one key in metadata, {key: xxx}, if there are more than one, append key1, key2... + +### Request + +```json +{ + "operation": "delete", + "metadata": { + "key": "key_a", + "key1" : "key_b" + } +} +``` + +### Response + +An HTTP 204 (No Content) and empty body is returned if successful. + + ## Create a Redis instance Dapr can use any Redis instance - containerized, running on your local dev machine, or a managed cloud service, provided the version of Redis is 5.0.0 or later. From ba4b8bed0bc25f8a8f72fc374325e75f1266caff Mon Sep 17 00:00:00 2001 From: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 17 Oct 2022 11:19:52 -0700 Subject: [PATCH 006/116] Remove ServiceInvocation.NoDefaultContentType feature flag Fixes #2869 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../content/en/operations/support/support-preview-features.md | 1 - 1 file changed, 1 deletion(-) diff --git a/daprdocs/content/en/operations/support/support-preview-features.md b/daprdocs/content/en/operations/support/support-preview-features.md index 72cfb47ab..224d2e065 100644 --- a/daprdocs/content/en/operations/support/support-preview-features.md +++ b/daprdocs/content/en/operations/support/support-preview-features.md @@ -17,7 +17,6 @@ For CLI there is no explicit opt-in, just the version that this was first made a | ---------- |-------------|---------|---------------|-----------------| | **`--image-registry`** flag in Dapr CLI| In self hosted mode you can set this flag to specify any private registry to pull the container images required to install Dapr| N/A | [CLI init command reference]({{}}) | v1.7 | | **Resiliency** | Allows configuring of fine-grained policies for retries, timeouts and circuitbreaking. | `Resiliency` | [Configure Resiliency Policies]({{}}) | v1.7| -| **Service invocation without default `content-type`** | When enabled removes the default service invocation content-type header value `application/json` when no content-type is provided. This will become the default behavior in release v1.9.0. This requires you to explicitly set content-type headers where required for your apps. | `ServiceInvocation.NoDefaultContentType` | [Service Invocation]({{}}) | v1.7 | | **App Middleware** | Allow middleware components to be executed when making service-to-service calls | N/A | [App Middleware]({{}}) | v1.9 | | **App health checks** | Allows configuring app health checks | `AppHealthCheck` | [App health checks]({{}}) | v1.9 | | **Pluggable components** | Allows creating self-hosted gRPC-based components written in any language that supports gRPC. The following component APIs are supported: State stores, Pub/sub, Bindings | N/A | [Pluggable components concept]({{}})| v1.9 | From 8fdeb6182d23da53b304349c9576a07f0ffc2055 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 17 Oct 2022 13:43:11 -0500 Subject: [PATCH 007/116] dotnet submodule Signed-off-by: Hannah Hunter --- sdkdocs/dotnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdkdocs/dotnet b/sdkdocs/dotnet index 52b82d7ce..e87b9ad6e 160000 --- a/sdkdocs/dotnet +++ b/sdkdocs/dotnet @@ -1 +1 @@ -Subproject commit 52b82d7ce6599822a37d2528379f5ca146e286bb +Subproject commit e87b9ad6eefaa05390144d82642df13c5b4bed17 From 1fdcfbd7dec4a67d1234a507fc1a225a49ed9600 Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Tue, 18 Oct 2022 11:47:37 -0300 Subject: [PATCH 008/116] Simplifying kubernetes YAML config (#2908) * Simplifying Kubernetes YAML Signed-off-by: Marcos Candeia * Update pluggable-components-registration.md Signed-off-by: Marcos Candeia Signed-off-by: Marcos Candeia --- .../pluggable-components-registration.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md b/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md index c1242eaf8..068780d3b 100644 --- a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md +++ b/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md @@ -174,11 +174,8 @@ spec: - name: component volumeMounts: # required, the sockets volume mount - name: dapr-unix-domain-socket - mountPath: /dapr-unix-domain-sockets + mountPath: /tmp/dapr-components-sockets image: YOUR_IMAGE_GOES_HERE:YOUR_IMAGE_VERSION - env: - - name: DAPR_COMPONENTS_SOCKETS_FOLDER # Tells the component where the sockets should be created. - value: /dapr-unix-domain-sockets ``` Before applying the deployment, let's add one more configuration: the component spec. From 63495e4d595bb146a3fadbbdaad93b1a93aa59c1 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 20 Oct 2022 14:47:57 -0500 Subject: [PATCH 009/116] Clarify GH actions doc (#2906) * dotnet submodule Signed-off-by: Hannah Hunter * attempt to clarify doc Signed-off-by: Hannah Hunter * Revert "dotnet submodule" This reverts commit 8fdeb6182d23da53b304349c9576a07f0ffc2055. Signed-off-by: Hannah Hunter --- .../integrations/github_actions.md | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/developing-applications/integrations/github_actions.md b/daprdocs/content/en/developing-applications/integrations/github_actions.md index 1853dd718..b0424bef0 100644 --- a/daprdocs/content/en/developing-applications/integrations/github_actions.md +++ b/daprdocs/content/en/developing-applications/integrations/github_actions.md @@ -3,14 +3,21 @@ type: docs weight: 5000 title: "Use the Dapr CLI in a GitHub Actions workflow" linkTitle: "GitHub Actions" -description: "Learn how to add the Dapr CLI to your GitHub Actions to deploy and manage Dapr in your environments." +description: "Add the Dapr CLI to your GitHub Actions to deploy and manage Dapr in your environments." --- -Dapr can be integrated with GitHub Actions via the [Dapr tool installer](https://github.com/marketplace/actions/dapr-tool-installer) available in the GitHub Marketplace. This installer adds the Dapr CLI to your workflow, allowing you to deploy, manage, and upgrade Dapr across your environments. +Dapr can be integrated with GitHub Actions via the [Dapr tool installer](https://github.com/marketplace/actions/dapr-tool-installer) available in the GitHub Marketplace. This installer adds the Dapr CLI to your workflow, allowing you to deploy, manage, and upgrade Dapr across your environments. -## Overview +Copy and paste the following installer snippet into your applicatin's YAML file to get started: -The `dapr/setup-dapr` action will install the specified version of the Dapr CLI on macOS, Linux and Windows runners. Once installed, you can run any [Dapr CLI command]({{< ref cli >}}) to manage your Dapr environments. +```yaml +- name: Dapr tool installer + uses: dapr/setup-dapr@v1 +``` + +The [`dapr/setup-dapr` action](https://github.com/dapr/setup-dapr) will install the specified version of the Dapr CLI on macOS, Linux, and Windows runners. Once installed, you can run any [Dapr CLI command]({{< ref cli >}}) to manage your Dapr environments. + +Refer to the [`action.yml` metadata file](https://github.com/dapr/setup-dapr/blob/main/action.yml) for details about all the inputs. ## Example @@ -34,4 +41,8 @@ The `dapr/setup-dapr` action will install the specified version of the Dapr CLI dapr status --kubernetes working-directory: ./twitter-sentiment-processor/demos/demo3 -``` \ No newline at end of file +``` + +## Next steps + +Learn more about [GitHub Actions](https://docs.github.com/en/actions). \ No newline at end of file From cae4de60c65eef4e827fadff175148ded3c5e994 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 20 Oct 2022 14:56:42 -0500 Subject: [PATCH 010/116] dotnet submodule (#2904) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell --- sdkdocs/dotnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdkdocs/dotnet b/sdkdocs/dotnet index 52b82d7ce..e87b9ad6e 160000 --- a/sdkdocs/dotnet +++ b/sdkdocs/dotnet @@ -1 +1 @@ -Subproject commit 52b82d7ce6599822a37d2528379f5ca146e286bb +Subproject commit e87b9ad6eefaa05390144d82642df13c5b4bed17 From 54e15473944e240dcd50ccbfadd93f274b25e0db Mon Sep 17 00:00:00 2001 From: Bernd Verst <4535280+berndverst@users.noreply.github.com> Date: Thu, 20 Oct 2022 12:58:17 -0700 Subject: [PATCH 011/116] Update latest Python SDK version Signed-off-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> --- .../content/en/operations/support/support-release-policy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index b6411eaf2..1163b5be1 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,7 +34,7 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| -| October 13th 2022 | 1.9.0
| 1.9.0 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| October 13th 2022 | 1.9.0
| 1.9.0 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | October 13th 2022 | 1.8.5
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | August 10th 2022 | 1.8.4
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 29th 2022 | 1.8.3
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | From b5ed1515adb4ff5cd6ad4c0f6599c87a2406b6d5 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 20 Oct 2022 15:33:22 -0500 Subject: [PATCH 012/116] etag true for dynamodb (#2902) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell --- daprdocs/data/components/state_stores/aws.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/data/components/state_stores/aws.yaml b/daprdocs/data/components/state_stores/aws.yaml index 81584efb0..65440d580 100644 --- a/daprdocs/data/components/state_stores/aws.yaml +++ b/daprdocs/data/components/state_stores/aws.yaml @@ -6,6 +6,6 @@ features: crud: true transactions: false - etag: false + etag: true ttl: true query: false From 3422654634b52ebed8c56c27e1887b2995e4cf0f Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 20 Oct 2022 15:54:04 -0500 Subject: [PATCH 013/116] [Run w/o docker] Add tabs and port number (#2905) * add tabs and window example Signed-off-by: Hannah Hunter * edits per Mark Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell --- .../self-hosted/self-hosted-no-docker.md | 79 +++++++++++++++---- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md index 0fdf85a6a..8bbe050cd 100644 --- a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md +++ b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md @@ -6,36 +6,49 @@ weight: 30000 description: "How to deploy and run Dapr in self-hosted mode without Docker installed on the local machine" --- -This article provides guidance on running Dapr in self-hosted mode without Docker. - ## Prerequisites -- [Dapr CLI]({{< ref "install-dapr-selfhost.md#installing-dapr-cli" >}}) +- [Install the Dapr CLI]({{< ref "install-dapr-selfhost.md#installing-dapr-cli" >}}) ## Initialize Dapr without containers -The Dapr CLI provides an option to initialize Dapr using slim init, without the default creation of a development environment which has a dependency on Docker. To initialize Dapr with slim init, after installing the Dapr CLI use the following command: +The Dapr CLI provides an option to initialize Dapr using slim init, without the default creation of a development environment with a dependency on Docker. To initialize Dapr with slim init, after installing the Dapr CLI, use the following command: ```bash dapr init --slim ``` -In this mode two different binaries are installed `daprd` and `placement`. The `placement` binary is needed to enable [actors]({{< ref "actors-overview.md" >}}) in a Dapr self-hosted installation. +Two different binaries are installed: +- `daprd` +- `placement` -In this mode no default components such as Redis are installed for state management or pub/sub. This means, that aside from [Service Invocation]({{< ref "service-invocation-overview.md" >}}), no other building block functionality is available on install out of the box. Users are free to setup their own environment and custom components. Furthermore, actor based service invocation is possible if a state store is configured as explained in the following sections. +The `placement` binary is needed to enable [actors]({{< ref "actors-overview.md" >}}) in a Dapr self-hosted installation. -## Service invocation -See [this sample](https://github.com/dapr/samples/tree/master/hello-dapr-slim) for an example on how to perform service invocation in this mode. +In slim init mode, no default components (such as Redis) are installed for state management or pub/sub. This means that, aside from [service invocation]({{< ref "service-invocation-overview.md" >}}), no other building block functionality is available "out-of-the-box" on install. Instead, you can set up your own environment and custom components. -## Enabling state management or pub/sub +Actor-based service invocation is possible if a state store is configured, as explained in the following sections. -See configuring Redis in self-hosted mode [without docker](https://redis.io/topics/quickstart) to enable a local state store or pub/sub broker for messaging. +## Perform service invocation +See [the _Hello Dapr slim_ sample](https://github.com/dapr/samples/tree/master/hello-dapr-slim) for an example on how to perform service invocation in slim init mode. -## Enabling actors +## Enable state management or pub/sub -The placement service must be run locally to enable actor placement. Also, a [transactional state store that supports ETags]({{< ref "supported-state-stores.md" >}}) must be enabled to use actors, for example, [Redis configured in self-hosted mode](https://redis.io/topics/quickstart). +See documentation around [configuring Redis in self-hosted mode without Docker](https://redis.io/topics/quickstart) to enable a local state store or pub/sub broker for messaging. -By default for Linux/MacOS the `placement` binary is installed in `/$HOME/.dapr/bin` or for Windows at `%USERPROFILE%\.dapr\bin`. +## Enable actors + +To enable actor placement: +- Run the placement service locally. +- Enable a [transactional state store that supports ETags]({{< ref "supported-state-stores.md" >}}) to use actors. For example, [Redis configured in self-hosted mode](https://redis.io/topics/quickstart). + +By default, the `placement` binary is installed in: + +- For Linux/MacOS: `/$HOME/.dapr/bin` +- For Windows: `%USERPROFILE%\.dapr\bin` + +{{< tabs "Linux/MacOS" "Windows">}} + +{{% codetab %}} ```bash $ $HOME/.dapr/bin/placement @@ -51,16 +64,48 @@ INFO[0001] leader is established. instance=Nicoletaz-L10. ``` -From here on you can follow the sample example created for the [java-sdk](https://github.com/dapr/java-sdk/tree/master/examples/src/main/java/io/dapr/examples/actors), [python-sdk](https://github.com/dapr/python-sdk/tree/master/examples/demo_actor) or [dotnet-sdk]({{< ref "dotnet-actors-howto.md" >}}) for running an application with Actors enabled. +{{% /codetab %}} -Update the state store configuration files to have the Redis host and password match the setup that you have. Additionally to enable it as a actor state store have the metadata piece added similar to the [sample Java Redis component](https://github.com/dapr/java-sdk/blob/master/examples/components/state/redis.yaml) definition. +{{% codetab %}} + +When running standalone placement on Windows, specify port 6050: + +```bash +%USERPROFILE%/.dapr/bin/placement.exe -port 6050 + +time="2022-10-17T14:56:55.4055836-05:00" level=info msg="starting Dapr Placement Service -- version 1.9.0 -- commit fdce5f1f1b76012291c888113169aee845f25ef8" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:55.4066226-05:00" level=info msg="log level set to: info" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:55.4067306-05:00" level=info msg="metrics server started on :9090/" instance=LAPTOP-OMK50S19 scope=dapr.metrics type=log ver=1.9.0 +time="2022-10-17T14:56:55.4077529-05:00" level=info msg="Raft server is starting on 127.0.0.1:8201..." instance=LAPTOP-OMK50S19 scope=dapr.placement.raft type=log ver=1.9.0 +time="2022-10-17T14:56:55.4077529-05:00" level=info msg="placement service started on port 6050" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:55.4082772-05:00" level=info msg="Healthz server is listening on :8080" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:56.8232286-05:00" level=info msg="cluster leadership acquired" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:56.8232286-05:00" level=info msg="leader is established." instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 + +``` + +{{% /codetab %}} + +{{< /tabs >}} + +Now, to run an application with actors enabled, you can follow the sample example created for: +- [java-sdk](https://github.com/dapr/java-sdk/tree/master/examples/src/main/java/io/dapr/examples/actors) +- [python-sdk](https://github.com/dapr/python-sdk/tree/master/examples/demo_actor) +- [dotnet-sdk]({{< ref "dotnet-actors-howto.md" >}}) + +Update the state store configuration files to match the Redis host and password with your setup. + +Enable it as a actor state store by making the metadata piece similar to the [sample Java Redis component](https://github.com/dapr/java-sdk/blob/master/examples/components/state/redis.yaml) definition. ```yaml - name: actorStateStore value: "true" ``` +## Clean up -## Cleanup +When finished, remove the binaries by following [Uninstall Dapr in a self-hosted environment]({{< ref self-hosted-uninstall >}}) to remove the binaries. -Follow the uninstall [instructions]({{< ref "install-dapr-selfhost.md#uninstall-dapr-in-a-self-hosted-mode" >}}) to remove the binaries. +## Next steps +- Run Dapr with [Podman]({{< ref self-hosted-with-podman.md >}}), using the default [Docker]({{< ref install-dapr-selfhost.md >}}), or in an [airgap environment]({{< ref self-hosted-airgap.md >}}) +- [Upgrade Dapr in self-hosted mode]({{< ref self-hosted-upgrade >}}) \ No newline at end of file From da5e7a23afe961b5e69ae8d56e7d410d673cb05a Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 26 Oct 2022 13:04:42 -0500 Subject: [PATCH 014/116] 1/3 update per alecor191 Signed-off-by: Hannah Hunter --- .../building-blocks/pubsub/subscription-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index 655484559..82c2d75c1 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -137,7 +137,7 @@ public Mono getCheckout(@RequestBody(required = false) CloudEvent ```python #Subscribe to a topic -@app.subscribe(pubsubname='pubsub', topic='orders', route='route') +@app.subscribe(pubsubname='pubsub', topic='orders', route='checkout') def mytopic(event: v1.Event) -> None: data = json.loads(event.Data()) logging.info('Subscriber received: ' + str(data)) From 830b4c2076d04f3036ddf7c0f4f6ff49bcc760b7 Mon Sep 17 00:00:00 2001 From: wxbty <38374721+wxbty@users.noreply.github.com> Date: Thu, 27 Oct 2022 13:54:44 +0800 Subject: [PATCH 015/116] Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> --- .../components-reference/supported-bindings/redis.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md index 501ad2707..d47e06c1d 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md @@ -90,7 +90,7 @@ An HTTP 204 (No Content) and empty body is returned if successful. - `get` -You can get a record in Redis using the `get` operation. This get a key where you set. +You can get a record in Redis using the `get` operation. This gets a key that was previously set. ### Request @@ -118,7 +118,7 @@ You can get a record in Redis using the `get` operation. This get a key where yo - `delete` -You can delete multiple records in Redis using the `delete` operation. There is at least one key in metadata, {key: xxx}, if there are more than one, append key1, key2... +You can delete a record in Redis using the `delete` operation. Returns success whether the key exists or not. ### Request @@ -126,8 +126,7 @@ You can delete multiple records in Redis using the `delete` operation. There is { "operation": "delete", "metadata": { - "key": "key_a", - "key1" : "key_b" + "key": "key1" } } ``` From 61878784e50166e0ab490136a694925489f56235 Mon Sep 17 00:00:00 2001 From: Bernd Verst <4535280+berndverst@users.noreply.github.com> Date: Thu, 27 Oct 2022 16:30:05 -0700 Subject: [PATCH 016/116] Add missing rocketmq pubsub to table Signed-off-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> --- daprdocs/data/components/pubsub/generic.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index ef757e4b3..0c80e502a 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -43,3 +43,8 @@ state: Stable version: v1 since: "1.7" +- component: RocketMQ + link: setup-rocketmq + state: Alpha + version: v1 + since: "1.8" From 08455c7134e4f057b0f6b4ae7a303ea5be811752 Mon Sep 17 00:00:00 2001 From: vishalsignity <97443129+vishalsignity@users.noreply.github.com> Date: Fri, 28 Oct 2022 17:54:37 +0530 Subject: [PATCH 017/116] Update aws-secret-manager.md Signed-off-by: vishalsignity <97443129+vishalsignity@users.noreply.github.com> --- .../supported-secret-stores/aws-secret-manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md index 4c21f190f..e57aece7b 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md @@ -2,7 +2,7 @@ type: docs title: "AWS Secrets Manager" linkTitle: "AWS Secrets Manager" -description: Detailed information on the decret store component +description: Detailed information on the secret store component aliases: - "/operations/components/setup-secret-store/supported-secret-stores/aws-secret-manager/" --- From 2972c26540644209cd877e714898c0d0afc20012 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Mon, 31 Oct 2022 08:48:47 -0700 Subject: [PATCH 018/116] Update daprdocs/content/en/concepts/resiliency-concept.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- daprdocs/content/en/concepts/resiliency-concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index ab5875d33..0597fb01e 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -6,7 +6,7 @@ weight: 400 description: "Configure retries, timeouts, circuit breakers and monitor app health" --- -Distributed applications are commonly comprised of many microservices, with dozens, sometimes hundreds of instances scaling across underlying infrastructure. As these distributed solutions grow in size and complexity, the potential for system failures inevitably increases. Service instances can fail or become unresponsive due to any number of issues, including hardware failures, unexpected throughput, or application lifecycle events, such as scaling out and application restarts. Designing and implementing a self-healing solution with the ability to detect, mitigate, and respond to failure is critical. +Distributed applications are commonly comprised of many microservices, with dozens - sometimes hundreds - of instances scaling across underlying infrastructure. As these distributed solutions grow in size and complexity, the potential for system failures inevitably increases. Service instances can fail or become unresponsive due to any number of issues, including hardware failures, unexpected throughput, or application lifecycle events, such as scaling out and application restarts. Designing and implementing a self-healing solution with the ability to detect, mitigate, and respond to failure is critical. ## Resiliency Policies Diagram showing the resiliency applied to Dapr APIs From 0292942adeff8c610d93428acfd574c7efa403dd Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Mon, 31 Oct 2022 08:48:54 -0700 Subject: [PATCH 019/116] Update daprdocs/content/en/concepts/resiliency-concept.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- daprdocs/content/en/concepts/resiliency-concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index 0597fb01e..4db4ef93c 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -17,7 +17,7 @@ Dapr provides a capability for defining and applying fault tolerance resiliency - Retries/back-offs - Circuit breakers -These policies can be applied to any Dapr API calls and when calling components with a [resiliency spec]({{< ref resiliency-overview >}}). +These policies can be applied to any Dapr API calls when calling components with a [resiliency spec]({{< ref resiliency-overview >}}). ## App Health Checks Diagram showing the app health feature. Running Dapr with app health enabled causes Dapr to periodically probe the app for its health From 93eb7c06b83db0653524e4bf2f095bbcd3775486 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Mon, 31 Oct 2022 08:49:03 -0700 Subject: [PATCH 020/116] Update daprdocs/content/en/concepts/resiliency-concept.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- daprdocs/content/en/concepts/resiliency-concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index 4db4ef93c..bd7fe9491 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -22,7 +22,7 @@ These policies can be applied to any Dapr API calls when calling components with ## App Health Checks Diagram showing the app health feature. Running Dapr with app health enabled causes Dapr to periodically probe the app for its health -Applications can become unresponsive for a variety of reasons, for example, they are to busy to accept new work, could have crashed, or be in a deadlock state. Sometimes the condition can be transitory or persistent. +Applications can become unresponsive for a variety of reasons. For example, they are too busy to accept new work, could have crashed, or be in a deadlock state. Sometimes the condition can be transitory or persistent. Dapr provides a capability for monitoring app health through probes that check the health of your application and react to status changes. When an unhealthy app is detected, Dapr stops accepting new work on behalf of the application. From 717ef391de5a5cc5be838ecd30227b5552eb0883 Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Mon, 31 Oct 2022 10:35:28 -0700 Subject: [PATCH 021/116] Apply feedback to resiliency concept page --- daprdocs/content/en/concepts/resiliency-concept.md | 10 +++++++++- .../building-blocks/observability/sidecar-health.md | 2 +- .../en/operations/resiliency/resiliency-overview.md | 2 -- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index bd7fe9491..e2178559d 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -26,4 +26,12 @@ Applications can become unresponsive for a variety of reasons. For example, they Dapr provides a capability for monitoring app health through probes that check the health of your application and react to status changes. When an unhealthy app is detected, Dapr stops accepting new work on behalf of the application. -Read more on how to apply [app health checks]({{< ref app-health >}}) to your application. \ No newline at end of file +Read more on how to apply [app health checks]({{< ref app-health >}}) to your application. + +## Sidecar Health Checks +Dapr provides a way to determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: + +- Probed for its health +- Determined for readiness and liveness + +Read more on about how to apply [dapr health checks]({{< ref sidecar-health >}}) to your application. diff --git a/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md b/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md index 7d8027dc8..9385473dd 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md +++ b/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md @@ -6,7 +6,7 @@ weight: 200 description: Dapr sidecar health checks --- -Dapr provides a way to [determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: +Dapr provides a way to determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: - Probed for its health - Determined for readiness and liveness diff --git a/daprdocs/content/en/operations/resiliency/resiliency-overview.md b/daprdocs/content/en/operations/resiliency/resiliency-overview.md index bbca61db5..fea52eca2 100644 --- a/daprdocs/content/en/operations/resiliency/resiliency-overview.md +++ b/daprdocs/content/en/operations/resiliency/resiliency-overview.md @@ -9,8 +9,6 @@ description: "Configure Dapr retries, timeouts, and circuit breakers" Resiliency is currently a preview feature. Before you can utilize a resiliency spec, you must first [enable the resiliency preview feature]({{< ref support-preview-features >}}). {{% /alert %}} -Distributed applications are commonly comprised of many microservices, with dozens, even hundreds, of instances for any given application. With so many microservices, the likelihood of a system failure increases. For example, an instance can fail or be unresponsive due to hardware, an overwhelming number of requests, application restarts/scale outs, or several other reasons. These events can cause a network call between services to fail. Designing and implementing your application with fault tolerance, the ability to detect, mitigate, and respond to failures, allows your application to recover to a functioning state and become self healing. - Dapr provides a capability for defining and applying fault tolerance resiliency policies via a [resiliency spec]({{< ref "resiliency-overview.md#complete-example-policy" >}}). Resiliency specs are saved in the same location as components specs and are applied when the Dapr sidecar starts. The sidecar determines how to apply resiliency policies to your Dapr API calls. In self-hosted mode, the resiliency spec must be named `resiliency.yaml`. In Kubernetes Dapr finds the named resiliency specs used by your application. Within the resiliency spec, you can define policies for popular resiliency patterns, such as: - [Timeouts]({{< ref "policies.md#timeouts" >}}) From ac919b9fde127fa2d038095bd893e6c955820b2e Mon Sep 17 00:00:00 2001 From: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 31 Oct 2022 18:15:26 +0000 Subject: [PATCH 022/116] Mark pubsub.hazelcast as deprecated Fixes #2708 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../components-reference/supported-pubsub/setup-hazelcast.md | 2 ++ daprdocs/data/components/pubsub/generic.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md index 16962d4f5..2610e3005 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md @@ -7,6 +7,8 @@ aliases: - "/operations/components/setup-pubsub/supported-pubsub/setup-hazelcast/" --- +> **Deprecation notice**: The Hazelcast PubSub component has been deprecated due inherent to lack of support for "at least once" delivery guarantee, and will be removed in a future Dapr release. + ## Component format To setup hazelcast pubsub create a component of type `pubsub.hazelcast`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration. diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index ef757e4b3..ec02c93f8 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -1,6 +1,6 @@ - component: Hazelcast link: setup-hazelcast - state: Beta + state: Deprecated version: v1 since: "1.7" - component: In Memory From 638ab77f2b0ad107c45101ccbf57523f05900c8c Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 31 Oct 2022 12:44:44 -0700 Subject: [PATCH 023/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> --- .../components-reference/supported-pubsub/setup-hazelcast.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md index 2610e3005..581d5a874 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md @@ -7,7 +7,7 @@ aliases: - "/operations/components/setup-pubsub/supported-pubsub/setup-hazelcast/" --- -> **Deprecation notice**: The Hazelcast PubSub component has been deprecated due inherent to lack of support for "at least once" delivery guarantee, and will be removed in a future Dapr release. +> **Deprecation notice**: The Hazelcast PubSub component has been deprecated due to inherent lack of support for "at least once" delivery guarantee, and will be removed in a future Dapr release. ## Component format To setup hazelcast pubsub create a component of type `pubsub.hazelcast`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration. From e024c0a6e14dc030c766fc37fc085ba31ee62758 Mon Sep 17 00:00:00 2001 From: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Date: Tue, 1 Nov 2022 21:02:17 +0530 Subject: [PATCH 024/116] update supported versions list (#2916) * update supported versions list Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> * updated supported versions Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../operations/support/support-release-policy.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index 1163b5be1..0a3fb4917 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,13 +34,17 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| -| October 13th 2022 | 1.9.0
| 1.9.0 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| October 26th 2022 | 1.9.1
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| October 13th 2022 | 1.9.0
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| October 26th 2022 | 1.8.6
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | October 13th 2022 | 1.8.5
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | August 10th 2022 | 1.8.4
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 29th 2022 | 1.8.3
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 21st 2022 | 1.8.2
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 20th 2022 | 1.8.1
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 7th 2022 | 1.8.0
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | +| October 26th 2022 | 1.7.5
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.2.1 | 0.10.0 | Supported | | May 31st 2022 | 1.7.4
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.2.1 | 0.10.0 | Supported | | May 17th 2022 | 1.7.3
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.2.1 | 0.10.0 | Supported | | Apr 22th 2022 | 1.7.2
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.1.0 | 0.10.0 | Supported | @@ -75,14 +79,16 @@ General guidance on upgrading can be found for [self hosted mode]({{< ref self-h | | 1.5.2 | 1.6.0 | | | 1.6.0 | 1.6.2 | | | 1.6.0 | 1.7.4 | +| | 1.6.0 | 1.7.5 | | 1.5.0 to 1.5.2 | N/A | 1.6.0 | | | 1.6.0 | 1.6.2 | | | 1.6.0 | 1.7.4 | +| | 1.6.0 | 1.7.5 | | 1.6.0 | N/A | 1.6.2 | -| 1.6.0 | N/A | 1.7.4 | -| 1.7.0 to 1.7.4 | N/A | 1.8.0 | -| 1.8.0 | N/A | 1.8.5 | -| 1.9.0 | N/A | 1.9.0 | +| 1.6.0 | N/A | 1.7.5 | +| 1.7.0 to 1.7.5 | N/A | 1.8.0 | +| 1.8.0 | N/A | 1.8.6 | +| 1.9.0 | N/A | 1.9.2 | ## Breaking changes and deprecations From 47bd8726c81c92a6be1bff4743e4076d2a770626 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Wed, 2 Nov 2022 15:10:32 -0700 Subject: [PATCH 025/116] Update daprdocs/content/en/concepts/resiliency-concept.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- daprdocs/content/en/concepts/resiliency-concept.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index e2178559d..284176de3 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -3,7 +3,7 @@ type: docs title: "Resiliency" linkTitle: "Resiliency" weight: 400 -description: "Configure retries, timeouts, circuit breakers and monitor app health" +description: "Configure policies and monitor app and sidecar health" --- Distributed applications are commonly comprised of many microservices, with dozens - sometimes hundreds - of instances scaling across underlying infrastructure. As these distributed solutions grow in size and complexity, the potential for system failures inevitably increases. Service instances can fail or become unresponsive due to any number of issues, including hardware failures, unexpected throughput, or application lifecycle events, such as scaling out and application restarts. Designing and implementing a self-healing solution with the ability to detect, mitigate, and respond to failure is critical. From 528d6954824ca43dff029730215ee191d3736a00 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Wed, 2 Nov 2022 16:03:37 -0700 Subject: [PATCH 026/116] Update azure-kubernetes-service-extension.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../integrations/Azure/azure-kubernetes-service-extension.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md index 1eefc1181..a972b5792 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md @@ -7,7 +7,7 @@ weight: 4000 --- # Prerequisites -- [Azure subscription](https://azure.microsoft.com/free/?WT.mc_id=A261C142F) +- Azure subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli-windows?tabs=azure-cli) and the ***aks-preview*** extension. - [Azure Kubernetes Service (AKS) cluster](https://docs.microsoft.com/azure/aks/tutorial-kubernetes-deploy-cluster?tabs=azure-cli) @@ -106,4 +106,4 @@ dapr-sidecar-injector-9555889bc-rpjwl 1/1 Running 0 1h dapr-sidecar-injector-9555889bc-rqjgt 1/1 Running 0 1h ``` -For further information such as configuration options and targeting specific versions of Dapr, see the official [AKS Dapr Extension Docs](https://docs.microsoft.com/azure/aks/dapr). \ No newline at end of file +For further information such as configuration options and targeting specific versions of Dapr, see the official [AKS Dapr Extension Docs](https://docs.microsoft.com/azure/aks/dapr). From 19393252dea72f9c860787956a6afd772e1d0ef4 Mon Sep 17 00:00:00 2001 From: wxbty <38374721+wxbty@users.noreply.github.com> Date: Thu, 3 Nov 2022 11:22:46 +0800 Subject: [PATCH 027/116] Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> --- .../supported-bindings/redis.md | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md index d47e06c1d..95fd372d0 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md @@ -66,10 +66,14 @@ The above example uses secrets as plain strings. It is recommended to use a secr This component supports **output binding** with the following operations: - `create` +- `get` +- `delete` + +### create You can store a record in Redis using the `create` operation. This sets a key to hold a value. If the key already exists, the value is overwritten. -### Request +#### Request ```json { @@ -82,17 +86,16 @@ You can store a record in Redis using the `create` operation. This sets a key to "Lorem": "Ipsum" } } -``` -### Response +#### Response An HTTP 204 (No Content) and empty body is returned if successful. -- `get` +### get You can get a record in Redis using the `get` operation. This gets a key that was previously set. -### Request +#### Request ```json { @@ -105,7 +108,7 @@ You can get a record in Redis using the `get` operation. This gets a key that wa } ``` -### Response +#### Response ```json { @@ -116,11 +119,11 @@ You can get a record in Redis using the `get` operation. This gets a key that wa } ``` -- `delete` +### delete You can delete a record in Redis using the `delete` operation. Returns success whether the key exists or not. -### Request +#### Request ```json { @@ -131,7 +134,7 @@ You can delete a record in Redis using the `delete` operation. Returns success w } ``` -### Response +#### Response An HTTP 204 (No Content) and empty body is returned if successful. From 80b61c484c567d25237f6f889efe048091d59336 Mon Sep 17 00:00:00 2001 From: wxbty <38374721+wxbty@users.noreply.github.com> Date: Thu, 3 Nov 2022 11:23:34 +0800 Subject: [PATCH 028/116] Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> --- .../reference/components-reference/supported-bindings/redis.md | 1 + 1 file changed, 1 insertion(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md index 95fd372d0..8fe7638e0 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md @@ -86,6 +86,7 @@ You can store a record in Redis using the `create` operation. This sets a key to "Lorem": "Ipsum" } } +``` #### Response From 5cfba9f69c47d815fed5b4c1f89169870881e34c Mon Sep 17 00:00:00 2001 From: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> Date: Thu, 3 Nov 2022 15:37:49 +0100 Subject: [PATCH 029/116] Update eventgrid.md command typos (#2932) Signed-off-by: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> Signed-off-by: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> --- .../components-reference/supported-bindings/eventgrid.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md b/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md index d422a19c7..a7f9a3c99 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md @@ -44,7 +44,7 @@ spec: - name: accessKey value: "[AccessKey]" - name: topicEndpoint - value: "[TopicEndpoint] + value: "[TopicEndpoint]" ``` {{% alert title="Warning" color="warning" %}} @@ -102,7 +102,7 @@ _Make sure to also to add quotes around the `[HandshakePort]` in your Event Grid ```bash # Using random port 9000 as an example -ngrok http -host-header=localhost 9000 +ngrok http --host-header=localhost 9000 ``` - Configure the ngrok's HTTPS endpoint and custom port to input binding metadata From a64803c09d5cd90dc2a86262372a1ef5a4be2591 Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Thu, 3 Nov 2022 09:23:21 -0700 Subject: [PATCH 030/116] Add sidecar health image and fix broken links Signed-off-by: Nick Greenfield --- .../content/en/concepts/resiliency-concept.md | 2 ++ .../integrations/Azure/authenticating-azure.md | 2 +- .../Azure/azure-kubernetes-service-extension.md | 2 +- .../tutorials/configure-state-pubsub.md | 4 +--- .../supported-secret-stores/azure-keyvault.md | 2 +- daprdocs/static/images/sidecar-health.png | Bin 0 -> 82475 bytes 6 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 daprdocs/static/images/sidecar-health.png diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md index 284176de3..7b8cbe675 100644 --- a/daprdocs/content/en/concepts/resiliency-concept.md +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -29,6 +29,8 @@ Dapr provides a capability for monitoring app health through probes that check t Read more on how to apply [app health checks]({{< ref app-health >}}) to your application. ## Sidecar Health Checks +Diagram showing the app health feature. Running Dapr with app health enabled causes Dapr to periodically probe the app for its health + Dapr provides a way to determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: - Probed for its health diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md b/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md index fb08ee089..93e0e374c 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md @@ -84,7 +84,7 @@ To start, create a new Azure AD application, which will also be used as Service Prerequisites: -- [Azure Subscription](https://azure.microsoft.com/free/) +- Azure Subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) - [jq](https://stedolan.github.io/jq/download/) - OpenSSL (included by default on all Linux and macOS systems, as well as on WSL) diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md index 1eefc1181..04055ffdd 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md @@ -7,7 +7,7 @@ weight: 4000 --- # Prerequisites -- [Azure subscription](https://azure.microsoft.com/free/?WT.mc_id=A261C142F) +- Azure subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli-windows?tabs=azure-cli) and the ***aks-preview*** extension. - [Azure Kubernetes Service (AKS) cluster](https://docs.microsoft.com/azure/aks/tutorial-kubernetes-deploy-cluster?tabs=azure-cli) diff --git a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md index df08db4ca..7e394d708 100644 --- a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md +++ b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md @@ -64,9 +64,7 @@ For Kubernetes: {{% /codetab %}} {{% codetab %}} - -Verify you have an [Azure subscription](https://azure.microsoft.com/free/). - +Verify you have an Azure subscription. 1. Open and log into the [Azure portal](https://ms.portal.azure.com/#create/Microsoft.Cache) to start the Azure Redis Cache creation flow. 1. Fill out the necessary information. diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md index 9c1f63bd7..ce2e801f4 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md @@ -53,7 +53,7 @@ Additionally, you must provide the authentication fields as explained in the [Au ### Prerequisites -- [Azure Subscription](https://azure.microsoft.com/free/) +- Azure Subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) - [jq](https://stedolan.github.io/jq/download/) - The scripts below are optimized for a bash or zsh shell diff --git a/daprdocs/static/images/sidecar-health.png b/daprdocs/static/images/sidecar-health.png new file mode 100644 index 0000000000000000000000000000000000000000..a8aa6819a8f46bb8daf4d9225ec2ecea12773977 GIT binary patch literal 82475 zcmeFZby!qg_XZ3@3L;1<2n?Z!lynIU(jp<914=j2Fw}^Of=GvSBP}`77{xrPd)<4jwdbv>vK$csH30?&29biiv>FBm4hjPU zB!Q0$e8SzT^AiIDQ{PHTN>xEh3asknU~Xk=hJkT6+%-&0@!@mwX21BSQBS3$q+Uu% z1-#OU>LXbJOZE<3&0F{4C-SZ`2qB@)5Ka>Yp)r((Zg3Fc5J^gN*%*NxS*w!rqxD>7 zPI^KE7jJc+``5`0?G<3P&MV5YlkOB06~YpWQBQMHFr4$W1_Odh?^4#=SPX8I=tO#$H{=g}LM_40s2S@3A& zr*vcwO|l0&yEoH=RI|a%t+G#oec3tVLa~$m^=_Xk-LrPsI)-nxJ$=T0{YwC2amr2e zw`a2{)`#E7ds$6BDa2pBy-XC89(ntAErc%QO6^x)?+D-3?uJcdKfz7|gsA!+2gh>^ z3)p?sNWU!cmpa0n*lO#K6516*x0*r}{2~o^drzOmJDAKAK_7NeSZ~aE*_F8EA!p4P0RYKh(ev1_oBdYYaT#H!1KVoeKJW z7YCJ!_4^tmaq*y}x|D(f@LS!)$;`~&+0wyf7{VkDG=;R%&~edGdMsk%V8{8?)Zv*K zr-z;6#VZ&OJVby?J2RK3U=KT6duI_3F~&ch5CN_)KIUQs|M7^6jTobjk}6or!O09P zzkWNI#=CN2Bxb>J^CMoSkLM-eVAcXxMAcV12hCkrlaVPRpe`#fAc zJRHCi9L}EhE>Ar;?46nZY~*)4(q_&kPF9XCRu1;yi*}zrb8vMLV`RMO=&yf&j?>J; z>hGTHoqtUWm>}219WHLp`&@su4ZQl`;!_b-D-SbUU1=*jKs-Pn;{1aA5B_-m|J?bz z$A7%3^Y@$F{5*XBeDxo<{_|B$XEP@$2Rooo7xBNB=GV*ry!q?J2V56Z|A#34l=B~- z0)iGNc)<17qKOkYlYN!Mz<^*VNK0yXV6IK#d5{l{HEs)DG4#3~1|_!&O1fvPP0rR{ zk*X~t6VCa@aFazV2&X9@`I_hxgWHoZXy!d*Ns)dS3$yp``)(f5Q6)Dwx5%W)bI;^Y z>OF}^UChjziJmHBPc!gwFtJG>7?=M?ss|QJ)0dn5uMdzw8p*+_Jt6)WAbjwp|M?SR z<1e9S82hCEdpGz?&cv6$ebMX;7AELe{IfjY^~(o&F*wli1lE5U0MNuC#NWT3n3GgV z`oGMR1b9IF;J?lR10+rYPTdR$mL|LY-$VsG&?9!K1pa9De`5Hb82;9;|7pYjwBdi+ z@V5m1rwxD0;{ONO0N(bjEk50QV7A76Ctar zt8@<(7J7`R_6vfk*q9O1zSR?6tIKNDE+wDFOF)6w)Z&qAdm*gk+9IE4dA~dixaTRy55??E^%6ZXW~v# zEHYmox-MjfggPDC8>vNw3O?qSUub37k9!`~$CcTUn2C%!e|q#qqZYD|P)1+Fs>& zfx-xfmN^K%G#juOdcylsmk%Khzf%Bo*mEP-wcNs2GKz0DHP*$J*#})7BjValB~2!D z2Xq}+iqJQ2LoOWv1Uw8XGcSzzB9+~WTE-!3bx&4Fd&gI`KNdN+QKK(E-=1}`8mWyq z_)AoWw^K1MU(cAvwb6XD5odL?ojHmtow`rT*cwz`VAQ{&3Y4@&Z!DR%L{%K!}+=;V@L#>U};*AM4o_jqha$dC4GvT~jK zD|zcaf7|Xy7}4ZvBVO3CM&f^m0u8Jw_77w_ zFOp@+g=(o)Sm#a%n9+is5CUoy|DN_zIxepSZwlrQlTfNZIu;a8jK_Z3Q*9Z3wQ4>_ zeg3^@yy9qS(>MDT0_^nb;8gk$YV@UBkFXaY#TeVD#pINGMm`E)iQ*2UYK_Ta zvQ!g{uw?;im4ljJoV!%0LX2CBDG6O)>|1bWeKX5>`(xaCdz2@Y)DI+k`WaE8q+lj6U6O zMM8WR($<*8ItE1xUlXyl)nSb(p!fIGHs^#*)PY^HAm~z&DlmR>TUQ2Lq8I8R=t#jy zNh+y%IR|+kgtnU>RL>98>ndfwSljPZvFewttvnID;cSfcTcAoTu`EYe=VPzAoMufb z;mwI-ryeo8EXjaJxlZk@e#zJ<^)pJ0%aF6N7_>UP9uW(T=iIE5NP*NFaizDo**rRB zE4IB?2SdcH40U)EgiMkd0&++tVjDST6B0*8av-sxkcmKKyBL~q4tVP5cC9`hUipD~G)eQPZ zQocXAP0+FK&KIliAguW)hMgLXrD_5PTr`)e@3r@Tz5Ea21DOKR2yVp0%5{dh%XUX% z;g#)7!8z2RsSl5S_GehIRc(w#X3B@Zi#m{}!~h+)Io%c}z61f_nPem7ZTNFEVmos0 z6BWS{%SHBQiK=_nSy@I6yz`|U)QZ)2CUOq-fG|lh7k$WOj6+@)u9UFf%2wPNg_ure zLKF8gN!%=c?wg_>fJl6Bzy>%)bOoVgoPK4}qNJm(6tv`bN~Dm%{07 zj8-}fA-pR_zMdw_134js1-b$UA-V}9z+}jN^7P_gCRPp7k;*P$GT~w{UiIZcVI(&B zU4y%ZMGa@n%Tsk(8hI`npvtg2xs~7B1%z{aOYpg0F`#lrXa%^HEh8I_F^eSJFT%!~@9=>FMUmgRQZp_ONi2<80?EILQ36K@+SBp z)3ZB{YGrv&n|14%GQoP>`H?{r0Ks%$Y#P2yB=~bABW9?tezRS|J1hBRrY-MJg@?;9 z;HIRO$fBaFOVe7^f<=jsbLNAc8B#ZcJEWN|TO-mZ#s?c%JK5J;{pK66cgVJnd$SL( zWZu*?>MscgoR^+8l9Rpx>xpw1AP?|0^Gm&WtG;m$9RMr*pd(&0w42x5B1bc2+db9K zs?{f}MqQZ}JuzyzYHg-sT`z^XK*v{{SuOD|kt-yf5D;r2VzG^l$-KRC9ZgzSRZa}| zCc6tQ2%8w&Am??;X5ms{){- zBFs?+Gwk*ljyvv?Ll5n%x5-)c%2nGF-F=hpVxFEvEC^jD<9f0YgbLP?Ghk0wM@yq2 z^_!evBF_8pdzz0PrA*mns^??_`T{jxm#@Sk>s6^_Yd^Y-Z+TGmLe4}tJ0oL(h88$r zVn{h0{LDN^UG;pH-#ITpe?wI?U&JK~VxGo1solJ6MkzS^n-ZqjJB#t~6QzVJbLb&1RC3q! zZIq*+b$SZG9?QG;=L-i$%+nVQxaGjeo`H>V)(d;q)@;kPRtM-t5S4GgJk16DHc@;w zW1N+B_z4Q-;tX3Is8<>Z(t%%$gG3#ZXfBkR-w4X*HCJq;0+z`BtnnHW1p@YCtzCjC z_a>|PV|mPiu|hb4s%6s(z2Q<$kD1|Z;Q9KO2_=l#a@zGh}-I6h+thOm@&_p6J4`e4Wj4v^T} z%Y~o3dv}#L)xk&ai;oQr=y>VTT=kX_d$f7~%nS$$EA0YGX zw?p_I6wb%ztAss#b>{o6&mxBeu|V1zO2a|HUL}UI{P$f@YKn!mj80 zSZt(K?8El4SgvHH4gJRU4^=a!5^}k#FMhm4<$3lhx72Iz8v0%~V9*NKdX)uc*!$y; z%FJ7s+iq4#5P^<2x<;@tu}P&H3EIc8j;TK*Ku73<%~&kFYuF3?tqyyGh<&9n^|YJ6 zr7sOgf0|&}W@d_Dfr>+K@WxD`j&U;dSi$9oFadn+@Fq9pSh! z2mvT@*YU?IqRewKyG&?Z(2>XBcOi1j)9;_Jl>?@ePV(u+&aoBF3cqEsr1$9?r1TmwLKbpNBux~rc+%L%p|5H;%a?Ccf<2E6|=5Nr9}y=D+7D=2rUTK zu^wuG`Udh*iAmN}iPy@i6QD7Fb{j?y8Y_XoW>z;@s56n}A|k~Np_X8y*m1v5z&7Z$ zUzq?p$8+J*2TFnggx1il_txi0B)y2zJ;66MqmKbtJKt2VF02-fPC2bdd}7;`oBDF9}J2oRdOlO;6;k2(LBuLqlhhBxVs zt+MdSedS7gElR{q+*I#f#AYH?Ay`K#zSZ*G;%Lp~QJY&|PMB+(6G=fOBqLR;{tr$& znXQ}`@IBG%!m^9q1v(lDj;?^>e^z`L0OUo3{r7<8^!)CRpZniQ-IR&-`PE@#i2vDC zT0`iFA61_xdXvq5#YF#Nj6)ZEXVfBiKGE4Il1{9pEd|xCQlam^D+9jw2lvJz_GPh1 zIyIUtOqPL@2R_k^@fW?`tI`5zH z<*L#4j$*96f)aK&H753hD@(?s?guwmsGz9V7Xbqm*W3Nw z0R3II?xn;g*k^eH-1{4#x5*vPu08A0Z*l3??>PD+!AkN$+$Zb0KT}vw z9k6s$IFwvdcM1KVn|0~fxp05q7Y6w8fEAZe^h$&!y^@GeV(eu4)Bi#q;CwyZxV~}_ z{hN!yHK^oO6cwpKpkoDRR^jW|B={^O8==dN<7I#CWZz_AGz5QFi>&^Od>w$6 z707Y8=FU)~Ono@@M^9hbj#UfZ=^DheBq&WBnX?owd6M_goUcX z|95Ns16P27QOqp;M(_U^J@BXWMJyl0Ebs^4`L|Sl4Kg(qr!~!}SKEK~auHm#Ndkx9 zvbr;>J|n{>X>|v-ZU^&dZej3m==xK2es%tq9nzj8T`y8j1ShAw!EYUoTH{yNDxM1e zN|1Q@q~)+9SW}IbTCKPNvtw(mBiP_AEWizC#G zyW;tIybrfhomZ#oYBch-I4p1S{)Y^vumv1?P+F3pbs$Ip=fqW#Y|Mvf?LRFG>XaJY zShf7C)T?cuArMmQD_U;duzYHzMAvdlc%;Mc&eTl&4r9&V=?eeX7hekI>x(jvu3 zYg})owPUIMWOe!?jZ#~8cgz*CJFRI_flh1Ca?2-ul^TV5n(u`d;%==1Q7VFylii+$ zx_Y;Dz0p#$V2zKeUuwB*kVPChiB3VLrl#chgT)PJ_cj~OeS1rQJ>p}Cg#62!|I)F> zn#Oc9Sk_$PdVePLO0JGT_2J6{t?${mpyQI~nUvV14`;R{Fn#j5VF%{zyFDtA7eNit zO>2ffV(gS0agEVK*&1iJ1Z?Bp(TWN{RO`JxKZv^98&3&uf5D?~?M;&kptLbo!x|Y! zIK+-SG>BOyC49KfBpXMJjk?hnH5)1ctv@@qan@e+e3i!~CT2)2V0+hn(lyq=5dyvak-VA_G>$gp*>c>;9`~Htm>7yYco(_h}A(>%mXO&qQQ!WJBpV9O{p<*`c*U z1(2p7iY$|s_fFr41m%-NT)$pKj{j|9=LDHqSslZ)fu{WvNorZou3Kp!K1Xrrj>NJ= zZFFc2SOSQ}8n%wVq)%fvS*dcidF~s=JN`ZlaG6mB1r4wr{naCB@DymQ1IRzgI4vf* zKZ@lvdB@+@#`yxB?bTmkBJ|A1;HdVrSBF~ zZLpu@WNO^YN`y_>?96L7P&nEMd*=~6PJS@z;XHTrIjKH-VR^JH$Fj%wku`zK`k1CT zdadk@3Uu0Q8CaO_<7Ev0Hc9^m?1#4rbn1Tidy6_Jupjy$)+FNA6UZ3n-#c(p5XpcY z;ErObBp9b*wamunS+c4c7-7|7a%J~WCmND!J6dXP{UHF47`I{{SZRtbD~ITe_acvg z;EI=xz*esCIx!8ge|r=wnNBvDKEghl+oTzrV}MT}{#gt3z4);u+P2qa`)5btB2~+O4mI=G003S&DcZp)Rs5q?Y}eZ%3hBQsS`vwNyj*^|9N<^~ZVJ z=I!S=92R$uaHf0?4Eq9QyPdvXVQJO1NV>hZilpkwDqha7M{kHaKM3mJta%Kih!!Sp zZ|ueg1-yE^Jg_SVAexedpcQ`a*5wQ+?X2l@8PO!pbtREP%d_?Rv~K!i6gba9U{H6F>A! z)$ai5&yMT84NK|4z^1OK#35$292ZsNzDYMCOD|%1%^Mb`slH_iK0^(t5Zf-AryJI| znRh$eq*x7Pw}l8!-Tm-EZo{fj!k}+m{AiAh_hUX5MX_#K^DPYow9YFX3)jeXNb@P) zqoG|O|Ijm!-fV~k=AU5X)vcMQ!Hvf|RB1J%Qyi{|OGIt@9+tXWZI~kNBMtN%lq&4J z(8|?t@{H4AxZs1OW7U%k+2JAvi6MuH&(DDjFz5&{SW^IO(uo~hFn$WyjkQu}8!#OA zvS^ebfT*!bbbfLD*kjS%<(!oEudfKZDwm9#t@~;{op<4?pCwK9pfJEzOqct!0E`nE z1vu~0H##vnvA|%i`jJ~C!WyEr1_7#j%REXIyK|8$3pzfNuE@5GP;u*P{kBF`CN0;F zmNG)6i*-N#Y#PmT7_YQjXhZ*}g0*eJqB$+L_kcyM{xl766aj`K&E zFBZ3O0DON|d)-M+6=Fo314mh69d|EO+K#I635od}qZ;!ZF@1>qZ6Jm)%kkj-vEk%1 z5!J2MaHjd(oaBh+5Snp8?rEXVsD8yRux~GciEO}_o@@xU87|WG{_udZXqUl$GmQf_ zoq*+(cwvV7=9D?c!Z^gBx?7^Z1xR1tyb-> z((-w>hA}uzc`mm3ouj8y*8#Do2HoQI+Bi=A4nsj zF+5J4pFTfxS3PEN9Y$-c(|K=6q8Yv^!+>0&X?m5#H-Xm_|MIH-#5ilhC}*3qFP*kW zN12S9eg`~Fj-jYMe4 zvsW%_BYoadU#hy}kzd|bXgAa?NrkF@@kR>_y9{J26)NlwbnxTn-TnSf+~1MXCvL9t z`&ZANWU++=x*yF>y{jjUSj2Oqd|c3yYKvW4W}3hDhJQ%p3TGJIy|=!cc2n+P#f6h< z{rZ#&!^#bz2qJK-;f@`J7-}~p9*Y6Mowb4qye8L5@Dn3ir%GPkMgCMVfVq6iIrv5_ z@zQV+K{4h$rkf~MpR_vJsS?k}Di@}&P9Pk-f6x8BXsXx`{-px3<8`cDYn9CwI@n{r z=>|%%<|tP67kLGSHI*M?WYxPYXEYni4Ls+g)zYQkrrNFZ4u89<^j4$DK)B4k-ltAE z^aeMhT<=M^938iFy(mI#A5P#S2s$037IOINRgOr~XTZ+3!lJl%z73LnmT% zgc^Xn_reY0Zj)7?G^n!4qT6sSRk6-gnHKEu-_@TdcV~E#>4ln-V5O!5l~QW;kAF0l zzDNeA{z*qkq%aRy-AQ3#p*Q-OO*N?peHK1gke1q&SV!$UBBv&_R41UtxbYbr>N(03 zd*ij9WtPNFN$xR#H^b)WpUL(e?N~=l)A2R?i(`8L%nd8SGTCcg#<0q1K1^(v-!*jK z5fPL<*_XH${!TbG7rFuPDqih|jU2cGng(;WC6sDi(rDbnGF66tYovvt*X$Vl5Y}#k z=4+|Wj_K2o(CUNE#B(l6oF9c&+?~tGX7@UpkL{9-;O{N4OAvN8@2x!k^w1e)(?@=P zKRtlGVW*u9E_3|45lBul(Foc{0saa%23Cg)5BmCeX?sm(e05(bQ%A^V<5bn*{?eY7 zzK=(`xYzmGWDRm^F4d|Snl^Q3+o=ba|NVb(J~@!*d~eUXM!L_9F#ROxaJW-TFddpP z%osGvDc9813MBoEWAC%Zm$|NL@p8ceaEUr^?ErqA(n91G(ZV=ZoxO^|ZkY}Bjjk>_ z&bZA^$zrTUk>Kp15-Qrq!@30%hhwlw-EzE!{qMt#RWZkVs~!HBSRhG{#r`68Xrs+ z0FslA)jJk^t$P(PS6%u}p@3z(@k)xlUYjD~n|!YQN`jM7HoLW6O*_e56=??#G@6xV5?3jO8Pt}GijQu`xf z%X-B1>AaR0(2TkWdqZO=o>fJxUWK*7x7S4L!JUv2@zzfVF-V&2({0{RO&Zx5N(jzQBERhYAr>_twWMI{HMXR{1}@r(aRWn(tnn^$sJqmRKy+5n9FQ z=uXEP5DA9n$3nf@s)X)u4za}?*rq;t{BO7tCwD~eyY;flp0k5L#_Mzel^fB_d*Cn( zP+-}&gRewG54ehHUgd?FZD5zPpaAzw?Uu7ykM4flaor7zzDVd`!g+oQw%K(Z@_s0{ z+-l&C>3ySBVtyej=2>#fUSJW8{Z?{wG66TYPt{KWfNzrtE`abdyx<9zp^;65$?d41VS>hB}Q+n-@ynEySG! z7YpM5x%|%`vj2O(>&-l4c1yu)3BB}iKm+^a&P;WnZ~AS_U7F7=`;;7d8b#GBd7mmQ z?`!Ycq6;mJHL-?|b0w{bOjnRciz!?zNiJ%SmF1iVZ3rTP4cJttu7hSCwE8ii8XfOx zMH7P!dW?LJ=F^u=T~gIxpCDD3fIz~Z1N%L%zP+J*Z9&A_CVqU+ zPkxlvK{sI#Bdpai#py?OQRDT))jC3f?ZNccVWza?!U$5rVx7sds)|V0fB9}8ZIx-} zVfplh49Z!S_(38~4WmC0-7sB@U=h{m;Byzif$I=Pv1u!tcg9^`wGLRZ0VuhFOP`Fn zUM!G}4X%?bug6TqYS$C~QAo=#6XGN4)0*lzy?f7#9oEOkYLVm`<9)oG10?y1gQ88Q z>q8dyF97eh#tQW$r^X}3_4!S9z=PQuhl}4TK^W0fzr2^Wa&3rkdQ6+1T}GYnRS)2B zEEdM;xu3mUe(Hyj=4!3)k_x4D)K)Agg6rzO@k^|m;r~=*<2aJ^mtv4d%sLm5oJH3rolyT!?9#GH{^5>Q z*^T$#hw;D5L11F5jpgxWllQ2FhQ2&?P1T0wY8NM4ZcX1CBh#M_b6hAz3@`5IN;>)| z&H$5)acDRlwhbt2IeURa_!SrBnpD=AEH+*xzlM2gJ(Ty>rvcdRNTC?~%L41l=zJP~ zdVda|h0sxcT;=U~z;t@N$J^x^W(@lv;pb~C5Q7A(=Gr|RI1vgKH|XQ4@ z4s%%2JZJjmQ~ynnh}5-Uh%(%{Te#)%qKQ#P-6DUlJy-YC4#2qyQMV8d7D_goPOxLj zuB-;jK1Q30quldcn|o=%h5?5Id6VtH_dP{3s4L`b)FK5(i&n@H0`)uHYpmseKJmOo zH!^*ecm#lYWbNtx1vzV*Yl~bDo;#ckC5{hmdMD23n4R6nr>OE^`=x=~sF`Horv~ns zJ!)*tThC-ef!)x0D!;_}N!gNrQ(94ADD8DjBrynP<;yYx;{U+dsl>4fq~!7Fi}(`=um)a9$yL2=@AeL9Az`E%hXcsq4=G zBq*F!J-ano315Jy=Nb6#+$J@QVdkW8JO;qiPqc zKIj^?Mwjn*pQsq=#MND(J*vJ7lC#h-=hFW^6dA+O$*yw%0 zbfV2qHS35mCow!lVZOQc#)fMjfHNo-tS&9Pg39;&?9@3^4WMZ;qsl&zbfm*#chbTQ ze1LD&=!P5{0#TL)7xu(pDlSg1&5;(W-atISE#w|GO2Im8^zJTVF)j*w?gj0Mt=iJ> z{@X;1u>1QnLgBZ^z5z8XzE!K1ETHT7pOva2C9j?0Ym9y;22r1Ej3bIa95-7RUd=y*1* zB!`qw+Wxz?h&djTp4GMeQ>vYo%WEwd^5TlA1-;u4(m-AST&3x!vFB4>br zVXQoE`7j>AF-8VBI2+wJb+S*oX_MNJS+_T=4-^}w+_G|5TW_@!q3jN!=I5d3nRiPB zqJj!g2dD4j9o9zBgMtd$|ASk#*eEfVjZi`g%+t@G)L20{OpYUFkZAz5aGYP?;*Wq7 z8Mb|B8L#K;w?eeME1%MF$XOJz>;*qRV=1gd9c)h13nk*7@ehS$O9&q?WnguzlTp7z zlCuLAN5pOqL8qe8`x zc=Le1N=0c4W4!(-c*8G46n?vFV~daWyApw_fqJZi6~6*FqlE z!Ns&dx(G}x+&K@&3}mlv`d-jHptWTGp|vU4{bJJd87jkM^l5yv(SGiRUb6$&tV6;Z zuhEjynyL->TW)DN=Z-h*ua8?44cOU#{_*;yI2Uzn14!iaD&Vta z)JrYJVO{!00C^0#(ux5HTyrO)_#i%8rY}n3*s+lgRhiOM(n4o5l`_nulrvCl zB;l-u$2lbFv^TGN6HT(zvA!8}biTN=i~fiAcB9wQF7^)a*R zkMK$+4H5~2*CaGxVub*qTs#DX&$_;N^M|D%T`Q4fgcfz(`C5e$)cn?Qv-~5g?xO3% zK+I&=E@6ZY6Z;|IyIaC)d_)Onw#aRM6cIOCyX09@r)zb{d#rTgzCBFSkAY!np^a)l zU={3%0|oNxKyoc}PE4}9_Bg;>1F&d+yPzhRt}rH*vXYPr!XR zO%g_wxT;;=bjEIo)v^D@VRA6{3xm>hq&5M)plkK07T)p@S8>xi|C8uoM0E6{nWjefA-X{uY| zm5}e_WS@ATl+AE1jX%6-3+ul90dLoLE6kaT+v}lyH2nNX@{V8M?ZK7Ii=Zwm7aPk( zqVL}<95_cQ3I66m$TRlyDbkYo!>aEbcUv^exwidODa$!={CByDQZonA6vJ+HXPRD? zKwo94nE!0y!s#=|LU^+Hm{U^>4(?b){sh@$9WPs*;LC68zaF@xZZHDcsEFU$QNQhf zJD!SIQ$MK1j=i#BV*Rb{p5Lg z%YJ&jdr@=}muF@=GP_9b!n?C~ScG*fjoRHicD(-|>4l3w;U^SZ5%zNWD|>KAK~Ido zZ-ET$URB-9o^@<=U$NoF$5*=8jAY=zKZ3}AuRWvyyPS6zwVeM>S$DkaUQUmWoo|tD zo#Al7B=5Zs9v5nmyLIHI3rJhXA(l81ZmFbRLqhy=^5aP- zdeXju{+!n{rkTob6}unb#*`)d*Y6T=1AG|AAZKFxn5?Tsi;woNRxvOILDb*rO|a*s za26&9O{TR1PW4iJuTLO4?uYy_N61y22h9znYytJXQWCEbxS9;AGoV0XiyCVwS=sbc zd8Z+7fq$fT!5bjzR(cWJpgtx)O@q++s~ZO!ld?d$1U1q`P54iP$pwdPaHp!YCuw|E z6q3UxkoUiJjDy|t^zXDvgff^;Y==pvf5vy(*C@^b8?`YM@A4r0>+k3=19t5~uS)sG zr_6~f&%;fsT33n4Ix1DQcYr*L_}U8dzyK)+VO;(~8TUVI^!fFrfdfMAT-PEVrGwRUDcF2VQ;5yQXGEqn8=ti5 z(Ue^_3m+(Ry!Lp^`S(%6bs@K@mk=*b;u9ng7!3;}Dcn9;VXs*xD4zZj)eoH7eT%F> zUl09Zu)n_?CNkh>Hp^Hjb125zKZ==w`Y-B>@M%@_0(GOHSI2n3Zk1iixCjwSe{U%V z_i(Sv-x2QP(|X@!$+Rr60e7GEmobri01WB)%CKaLk3l+?dM7KzJw$I7~=x z0t)l=q8@gjIJW&eE1TKWiw4uZc)LY)}j5`Pdp2c_Qn#*GM(mm`m>yQmwj4tfyn>U z#f2mB2D5Qr&+Q6fo}B>CQqSEDgHXRMMShu zRNsNkhZ;viWAXmC3Mua4&t#NX>~4ucu_G0ezSk0^SD1_)vCYR(-pn&M9Ii;@9t=ImtoI} zmuq_m`n-;BZreApQm@&&Qrh?M`G*31#H9EA9}|va2*jfdT#BS%ret@~yG6(+^-T6U zK@K`~D}Ah-jmv-4rMzV#;T%%lgcg$JgjbbI!+rosQp4BR5~$0garXkRCNWCk1}b-v zm2>m{sa%;6{w;5O)6EK$tNrV78#aAxUwE5hmz9-G5Rq6Zjyq03Nf!;dyrC%+b$j|LU) zpf_m@v_B*z*{zX@q&Ao=e)+gEQ9i$!T9v#Rpz=6E8=AtZtLt^kU54J=Tl7qDH(xWj zdI!a1p)fm}LHvF-ARIVJ@!96(Tnm0H1i|${tz+p+vwR)H})(71jtC{4=QqLiKhv;!%xG|``yX?->jIlLPb=Z{X z_6I>a)NWMt7P#Ic(l>Qu%M>+qIPWy3TihNON+nI(i4ZiN%}#PMME30*hAr&8^bvJTsXF$8*0Js>=x$@u<)XUXN&eM+Eq+6St ztkTf8j-OlO5B-C0hNXhWV1@(zOBkQ^PU6#L1CG<2&U)fX9=Rl9{Kni9jxgIv-AKmN z^TyP+os^vVP=(?XN5NzL%`~8i60TEIJ&rqE6-dLqP*UqVLqlsVAnFI8n&$UmwO;Uiao ziWlXZsPEDjM@LDmALqNSy1(^RiZ3@v_BxiUI{f+CX}ZzPsgqk6uRNquQ{)D-Q9vWba()s~M42rT%GP@NM` zb44#Euijlu)|a@m-p7rZ2-G{5i=z5NuW(0$NunVic$zZfx3`L%<|6RzHpBjhxZL(`5)hI6PkdHUu1@l&0@q*<=04 zHxmD|PAx0KJfS_7i=oDiHmob*pw(*@zBN_%;mCKAv``F+`5?QOO5xMi2QIARS(d^m z1@$wO7YEt1^MDVdJBKs$Wa%8a{cprz*IEMt?zFA;7)80{tceHuzBrYBRL%DFO4f@; zAW6e1=7qZN`(y03;FL$kgxk1XvT_aVV56BU(oX>hx0nGX6Ui&j7LDPO0k}6Mqk7)a zg}1aSa@8>dWi?l(z>*90^+)ET^*%Lx_7gg1yD8_)^7%XV&0+@=Onzq{b`Q!(Z$D}k z-K>pt$9ZD^L%aB{O6(-y#NpUe9iCO@F{-Eb!ylaVj_z#wrBFwf<*BA= zy!Vo?i41s&gD-u%x5PxsYBXJ|)raM=!JTREU6`?9SG?K$m>)kGZF#j?77%_cd^=e~ z+>SJ&Va-ed$h4Ln0!SzgV$6N87!FTx5LePeiyXY0489*%x~n!~?(RHoJxp;lyY zW%li}7~9e6@jYU?9-=qTalAO^+hf84n)yd-JrQfu^a(i;DL!Yx?5hK6E5n>Lvy`y> zZZkaeExZn%v)$+FOKF?3Y<`GIpuF;Nf`C#CyDp>a%3!#8S9}`~qN91jgi;Fe++An` zN-TggT>br}W{Sc z-7@pGi)3Mi^{X>8i3s!ebYglyNei=5Jl|VW=gPOLkcJeX%HXVVSdP{;3W&(@+)t4w z+pIfC-abFX+!dG4bekW#*tqvDu~ss+m;>jadrH_RKuWZNCe2r8L)(&^zTi;39A~$z zGOBx_`~s*0*h=!>@AN~JY-SKF=(FU*nF=$!_DZ>zbEm(yW}LqYe>Mn}uQ5RyQ^S{V zfbS6KUJ^FEV~V4X*x~T6|7k9>SmDho1JBWo4khuQT2m zUneVmc1UF-@Uw@Szx`1UUEx>z;@P+48jyyk-!if~h*&-V0?=f(r75IX0m^rUcURZS zR@z*V0=)DS)mDDY2SIej&okPA8s986g#AVX+p15NgWfVSX)>PX+~J-3{0GbRl7e0I zz|mIo`nK4?mOHHRLFIuVRKALE)$0kL@nt7pbhYgL^H%k4A9R`N zNhq7?cN%BY6_lB$_T2Me!KtLp5?pSO?d`d4{hlzJVr%B1eB6WfxEjZR+Jinu&&2>w zZo=0vdq+A74L-U@6Wg1-b9wJu6xQRvoIh1gs*;^Lat!xA+h5dRyHK>(YM)qZ?6Sq6+5r;+qk2jp2|JGCf%MCcc0So zHjqHhLIFigOI9U=hgqD5m`Xq(`rY|f;375q#z0PJ?a@L)DNyf_y8H1-#_M;0Y=Lj& zkm=oVQ8wp3JM?k77KdEKU_>73z4IW03bsU#Vo6ceMdiCA2Ii~B#iNf1Utm!) zTqkh+(NH9=@cLviF*T5Vf1z9?qk2i3e%8CFVOITU9l-?WL%W4P_B%fM`56zjCoxk~ zEdYFV3LhaXq`Z)j$|2&suB_2pojIa1aJ+e)o?>}<`A6O}PjN!a;=y_!G*HJa;c)Ui zj&^6s$b0*hrB^Ht;X7EC$9Ae64=?Y0^=eV%ACz7-n?XPpr7t zbzd$hbJAo{jg-GQ^bfF9nnc_E^>X$nBxYiU%39l_s82~&!-=!@M96Ns$|Mo%FnBk(9Ea#C?e4sDtvqSQ+f&4R&K1dy z>JGSf*HfA8PsRiFJ49yJU0!!vxZI9j&wlWLoITvx!k_+8M-s1jcInA|vKF=@#$-}C z@uPW1arlg_Ox^~2yp>f_uE73WWz1`qW#3cvzXx|a&5unp2Y*sDuTsy{Uuuj|s>P@J zZllg4eVtU}waQ)3PqU-cX?d-jw$Y**FQO9Srsa?3Oe<<90Xu&q&-AU>6lS?*y7iud zt+E8M`Jbw1lIc#ucH_;`XHE0oLfs#U%}CzYMCKfpT@Q|qLN_lA42~ufbAU@3EO!{} z_b;Cr+{>G;VsvD0HW(xtCwe}k>E-JB?k#y1KV%Q5cEovj=$H~SqW z?2k_8=mV`+coENlwK=5g37Bh}FD>jBLdG=>5ui$(+3lXV0S@m|L?E#zmsls;Xbt92 zsb+lzckxGBHfNV9C6$B)v-BcB&8Yw!W`g?#Y~zB|=f@MTYf*W@r#f<^+nUr(Q3{n#!v_i`UAr0@=^$UCv)KM1Tl-HXix*;IQ}e45X6y=~4- z+dZz)=EJ@5aN;RY$BZ9NuZfo?;Xg_xcW7inM zrX`ko4gALRaoO=VMCZCcgp738kIb-6bQ|x-TZU)nDy?oz z3e(46mE)3 znW?9J-CAw;GsI_e2&viYKw!sx|eQ@q%;>otyYmu;Bh&gssD;=#lK9} z74QZO!|cqo5!9v_wY0Ovm+NthA1@V%t9D_bkJyhnltuxAX~=ye5mkHT?O09YM+k{T zc=45Dfue*dXc8L{f})wd*YPXulFou=tEb1f8@=Xupt!5m9=}r2Y-Cz6q^BP=;VG$7 zoikkyt?%8`N_Gqxr}5v<6LHQ+wvMu4#@472r|!f0HaHyo%B>s-uP~ouxlqrq)IJdJ zt^9dS1Ri3{F09CsPPkI3Hva`)Hw628^Yhd+jjLAGF3V2!YBLDqSIL;dx?V}$6X}y(OtsKSbC7%kr7`l>KKn?wy>2Y6UUt-IyljUkX zAiv~tm6%epud5HF-&AP(H)M~g)9p&MDh!z4)MLbe@||<3#v+aR_T=RI4EA5- zW`@b!;wW&=>j%CP*`Myv4Tk=XE`sYG>&+Q&rOywujKmypWY{lHy&Y}EN_Szx>_Wc{ZhT91JNI=*-9B)sJIXk@ zipg@G&9P0vBlx@AnK1wq99FO9*$Km6VIGMh_*cCuZQhKMf_b4<&llFS?%Z#1!QB>R_kw-(EXF+C+$nrq*Vo$8bJcxwr#WGRNXYdJvKv zDmR$s^<=U+vxsk8@@i2IXa?+r42&chWb!g^M%KH7hlM^0Rw7{=mzowkVHI;MG`g7kt&{U8EqR{L5krwNx zhr8|S2?P`6vbh#*zXKjb2fkn0u+2R{$`lMlI^5QX&2p9vdz3C`-Pk!IL1SL_B6i^b zSkA@}ujd;tVL#d=%v0d?k^Q^vuLUV2=kQ;sVhi3)eYeO)g->9+}TH--Csn8;g4M1akuu0TU=i+*lqcJLkX#!_3KTloX^-GS@iO9Bhz^b zn$9FhgD_<`oUO7c=MMqnCQ3Oz=5g`x<`JCWqm#f=JTgEytl%EAKA5hyt7>l%dem{Y zNgUs!hK!6}L%@E0UE`8+o%mUBeBG!8d6!Y+ofe~c^R7pTN_x|8Pp1^33-6~~8Lwv{ z$Ayy01!CH({of9a8oKv(3)3uLBufuJKD(z^;7Dt_+F)=u=mS*yRB(l{mvJ9tE(73|)b z7El>2H59-7RkXqBPcyHeqaZMx!aMU|d!1h6s%vItPB^#*R79iSLK~6+BXAp*c85Pz ze*+PFmRMP&PHM~$Z^&w?p_=)2Dm8uUI>Gwpr$>@;9{X0TK=NGG$J=6_W&x|Fvw!YL zM2Rc7q^fTE0F@m~ECCy3?D!c3CZ|Q4z&lDwK;?xUY?k)lAIGxruxz?)k8CME1LQzl z{>qxc#*-HObK!vH1<3VpEDr^mMc7Q^g(1&=#?uKYg%D0D7IOZqh_h$QcN+pUhVEGG ztwVd49X$;lJsbfc&ns8YTWtFCPHNwxpFhoySRXG|*VNC-j-<7!^JqiD@+46SxPI$D z+ib*k(cS*evc)1n3-Ep=LiVxssbTz9V`P?PyrJhGlZRXxw~*xpVjM!Ru!rMVgCDM{ zRnC6)4G=At_P!*~r@P*OIbP@Tw|WbWH#^*}gJ$!|+CAr22Tnh=!^4uX6|pRmsKiR zXKIq(!w9zd+M+UX&*jN;%zK94q$=9DPd)&d+R{5`y&7cnit)U0H@F_CtraB}7)q{J zx7=kJz@e*8S@c}My`B=D#G4#P;B&ISXESzTV+Cg#;}OzY558xdGfiR3V!PH673fC? z{7ii6qd!@{2Goj|a^`L1IZVHfi|2ivcGlZwfFd|XRgxjjhE)|&VBo3sWNU;!vIEWl zK^SAL)D_QTzOrr1b|q)TBMT?PHgv;ojvGC@$N7tTT=EoMrJ>G1jfZRQ6WLnx*T& zMxgSYdY?({#`Ms(wBOOOkD0+=6tl@cK>N0yum#02VE)Uze-<8yquT zc4c7&i^6M~+F#mE9;~DjnMakrck^W0r7_ca{8v|Q;>5b@#Y@%*fr>F;l-JIS>8MrOiq_PRHh+R(m(8EoW(94wnJ@0D9et6#taQdkJ& zvBD zFG4G~cehUE0?|>7#tQ(oxZ{xw|s{ZLbM|l`|!xC_(y-Um&F4k!|BB4d?Q?J898jTPLBUE zE7G;b=PvitpCk5@huR%hoI}MJ{4#Wk0>0Oe4WzFag-ijj}-MSEriR?YR*A} z)hX@Kpin;C3q$QHr$4t6Xq)bN*2{ za77O7G4rEkZViYBk*kzoEv_?t6zTDPR>GJAa=D+?idqJ*s?R0o^elHbyzEzX3Ks!oRv0$h^u+efylFbGri}nsxxAzQ!m@gam5}P5 zXi42V@lObiAsA5czDS*L|n$!TCgSRah|3Tn#A&|R+_uA z^B3A~4rb$gtMdo9MU^8gJ6FUqpkr;vrb|$;d!1n$NDLPA9%5u(Q3QnPOyT3jUjpJd zfc=~BX<%NK7;4dZBXqmyEgeCjw@Kjd}rXwIP!RG0FbbG^cA( zIZqRg@xX`2ieFc((ye(sj)%tdVYic^aRQo?Cti=9=}qRnd6I|j!N^LZ4a6~Lf&n@!Bo^K z*Gn?~RjN#H7QoYV)@Z=bdeSQ3-&edDYbmC%@csu7%MRQ2;C6<}G9B|ylyKS}jHWjC z?4Bx7ZGQY)qQtOyE{?tLk&gQ213hDSyoo(B?;K9$(C%xr%-t35tI#_2D(FWMGr6A% zA^jijSC*Lb%e-mFOGsKiLhNZ0SeU?6_KN#=}R9ooAWxR3gzbUiHVmw1FRhy)KX)%j$0&ah>b0a z9;%AB`<}t;AEGo1b38JzU{vM_L&kja{K{!GLcls^41X~gLrZ1Vd=)#+o8hF(>GsxC zrZS`1z1kQL`RIGfVfV6~7OZ0ur`1TD!n9ewDC{`|t$X+;{ncji*&Bw|hjSsOm1XNU zvg!_|ZByEp7H>RwKL_V-l>4?_Ti7PO#T=@wnF$n|hU#!>&QEVHv1&ZxFjKiua1+qz z_OwzTMBZ0ub*kF^%<87g**c%Kasu!x(J+$AC8-tDvR^Z9BCvNOx-CkzujY9j_J0g- z;|!9OWkOLcy6)Y=LYlKhSLAJT87C03lwGMkbPMt;{!1$H7NYif$2f{u&DC20&~%Dk zmL1=BU!XXn-WI2MrMjsn>xX^ZD&k>!UUs{Hog6_L&R8k2(Arr~zcU;zz)RsDctu}n zczrzlyIem`wG#e3AC)f?X8MEU#FoAmc+EL`5-=NfQ?-tou&XyLt z;gzXa2o9-o#5hmIRF)EKNn)6&n~g?&ClFYOu<{39^Gx}O7iYH978(~2%Jl0`S-~3? zU-jR*tOa08Ca@R`U8M3j6c{sJfM%B>+fv}RbFJ@sxquT89Ez5TfgZ>3p7`^4yK!;m z3>L&cJ$6W3^3C%pR)8>=Z5a6b3`PeXn92nKCFjX&}N0(i^ zCBB(k+(y{Fg6=2b-Z6)P6aGg25n1~^>@P%|k~NjfL<|zjHoA0g@e$#E65)tsyQt*2 zx`#*h=`q#?R$fBGTBGa2orI&~{eu01S~o+Z79NK%HMdm)F46$ovdj|zglp$~3P3hg zil!(9y_$ymk9D=}1<-YD9jv}2Q(p$3#U0+#6)5IMrMonhD#@QX5b%0@QB0a$cWGz! zN5XTkdKdmV=j)AHjKqGilJ+jKFO(N3AzW3;k)dfd|7O3^#Q)9?gDybK^sZL~hFs`> zK0a`|YfW6zwaSfb#J3sfA#cS@1dcl;PV!L0+{E2kl7KP!SODsJI5HS@uV*3h(V!In}zv($h&X z<xR{=WQb+| zcxb}d$L0(-$h*$j@H2mHEN?q<2|7+`{a_hckN;#4$BpuMi=X1_JmWEzLX{T*#8c;q zdjK-0_{vNYWb4cuE-D&IbHG2^aCDhQA=eT)&$uEM$%$|Ghn~&D^@(8qW9plu{V#8@ zgf*F=(T2V<+F{Wpq@hqVB9@)_F{ln@ zAjc)-*1l~?_#n_uZ`CN64h4dCTwalG8sjT3iLxDx1dn*98X2Kzav!D-;jeV%uY>Mr zM#S>UFpgY}=FBMBs($j{FPyZKZP75%8Rd)1lpJG>Ur9BK)$bkcKUYG?QLcumv1$v` zqB7WFIKY6tO=p$jt}q&F>C2lG_){DlJXz&sidu~#fN$#9+}1RAQG;Mev2gY~VIf=C z;$S_hyt8$5#gOl{o1hbe+o)n03i(dbV!^X}Nc#~ca(f-q3J)}5;OSZk+$vR?JBu-s zoGLPH>tP)_oW?CRsy%9k`%#v(jm%gNdG8=&YshE*_6AH^s1PL22Bk!1{eO;i@O#mo zfcs94tmqcjC%T8o&KW+K_JY+8v@4R$Cm=j-NZ*+z53IO^r@M`;O=PmkL02{*H>3~2 zMC{2fD*E1T#ZC%!ILx_ni1HB3v06xADgK+C)jgtDy+Z_+vT5}k`Q%N}cH1VYw%zv7 zxK7z35vyTH_-9)dYezP8vnLyRR7@c@yU;U6;D=AT=UHJbtrFWFJ`WRqGm| zTsDDovLskuuRNYep$p+8P0E{26M{y~i@XP;D1ui|(pb3yS#DRnM-`DF${(pLTvUZS zYO7ODmNQ&`oosnP*#7Df+&w?PRq8!l^bKf4|H0XsRrR-&cyXRh7~U|#TMQBSgY501 zUETz63PTs6O@tGNPbzCAH44iP?Jql9+?S~r4sg?3RAXy#Ty+HZHvPYc5r;di?gvL<}D%i z;>KPILDdIUEo%4hD6{t!93DNCbCoAmYSG`fiZ$)Tl}pY?P|x4B7RTDnSCBRC-M}|i zL-_=nD=}*JE%TQ-lq0HCTx7v0>q;+^L4D5`4aRDi;&(+T|EQWSpUkQ5rUF1~k`9Dl zcW97Uy87*zck2W&n;n8|boWZGFR&bdvOP;ducKhHAw7SDHe=9H@c~gw#PxY5b` zYZ!D|w*VG$)isvPM;6cLZy{vbDTEQxXF)xV|!E3`px? ze=xPI%e(&FlYR+he41k){CmDXR!u)|PqW=PjmrW4MK`GJ$zw+IGC%`KVB9aKOYHVfDoQ^Ti?9w zXKm730>r0eOgiTy&Z4QB=4s->$6ER2pnw+VujAn~?4^cV4~gBsVip{l4>wH?3`ROu zi4|w0C>J#<*UDZK*R!l41#-vGY}Zb8v7-NPLaFbbi zRrD!i>@aFZV(YXraH(5l+rqouwCy`YWi}BCr(r=PY>bMu^zY8M8sbY~mO5C78JIp% zs3sID0#_>jvSJ=(ja!XC2l}YS86 zJY5F<5XUq$5gvK6DfTylK6hL#d$~#ObB>gXA$ljEN?bLgO-`w|+kyOAa}hcHp)Y@2 z8sbu37e2*gZB}hMMYBW^jknR{a`D%)!ZL-A%T~Y6v6xAAFz^cW6Dluvx2L_!g54=P8Pxq4|^D%rUygbx4Q9znk~rASp*G zZk?S|APC`+z3{*hxFab=owS;j*5h5pzB5Y3Vw$y-jP7~X##t!GUl{;%GOYi|gG$)O zLUP;^wY{`?RnAX`*@|FuI9ft7w$5_RI7j6yQK!7uRW`zcx9G0@dFPaSZ}y7QL+y9W zL4ZQdH?8|YkL{ran$l)Y!Q{c)7?gbMR+%T_){0{5$7y*rnoSA$wE**oMG5;NZi zuM`84@ViDP6tW88*;~4565mlq2Oh&5l#OHb=NW@aPD}h3!>v}Q+2h$ka=(ujtPR^% zc8P?FX20ZtB(21(c;$j+l*PgkQe7as)G5}{KmCj=H7J8=PX!Kvn?7Q_#td(YWMKS* zH%hiS`vB$C4vQ!duvb zvj;eC>(dav8^t4$BtZv=ul)hLsNqnB6*urYajmcZeuxM`{70X?{*0_^pIvP^844yB zuiO20lHc(#-u`%Tt_lXOmh|&KyF0oDE5#a|OE>JAB5f1zKRwXbE@o;ZbvpcmY>gy1 z)~6zI*Q4C)qjC9};(xGzh+|zav_g@d5Q#JF_x>gMsL=CR!rZ?z-ju|I|9bO&P7YJ=k7tBcuQ{x5VeKXWp=+!fp4hJZf@ zEjYL(61@fumgxp561dZDI5^*r9j)BQ?3974v0^fp=>q$D@Et&IeW{8F7Jv!*@Pp}M zTEwD|25U~=AQ-;z9;h1KGRvjvXJV}e`|%C#wkX_oJp@#uLp5gNqBTk}iYy9#E}Rog z#39(s^PsWrT+ z5vL@!1u~ymQmDbHmQv10&S%br>wP14Y%zS}!B94*V}?n?UBQ+2D6A6RaBMJ$RXnbj zcrJ(KJh^=8HFSlzAr?0&jlBMiDeuUhuVYZE?bf?o@-FE55{GqeG#=^OEcv^v(QlAp2O}vf8Q@C#bKwG&{9bI zzO`7iRTLns(EJjvMsIC}k+1kiNI74ju#WD|F7Qa|^_^$X(8K4-X|FTG`aDq+8Sk@N zbe~gxy~8hen-`*qLKvRuSPO)Zj<*MLHyhb?UWRNjD>!RZtI-1)?;{3o5&LUpxm{U&S%&9Nl`IDB4z zUW(nU*S-s%tOK?X-B7IUB%a`hx)cfDVIw30zUIx zF8K046yqxZV(X9@DnwsRQw+w>Nk-X(VRM7kJV2s zv?#4BUxbN|6-ai;a85y=-u{LL^ds2{6G>2Ky6e_#;g3B-EK|R#)>Hddx5S}SHoRC1 z%u~Se_efFv?1g>x`fFgrv$M4IDkhEaP#`{0DS6{4B223uCPFH`^mP2)VDF|}*=n!s zGWHioz?p3k`2J5ngEXDT{ZTDMDyDr?fgH}GDtxEgI6qv10FK}A12j5`k1kw;V{s0A zP_O?z9Jk%HrY5p7wxy$P!bxm=_(4co#MqSRiS`>m2cNr_^K&}Jtr|)gzVw)w(42~P zLdoOXpEI7=Igz{?zu9vfSKCYycyAg`t<-l{q>ZtuiG%(s+f`%G2pz^Vn{7R!ZV$Bk zWt66IEBw%$#6lz;2wab(lEX^zDq}$mGpBMX7If@Evm~VQZ9zdf?>I7?-D=|Oju4-r z{XI-uZN^hs@Q?MwMPF++WLQUHsz+zAIYmsWx3@>);+ib`Q?syq>E6uw;GdY1pLaq0 zOmYu-Up|n@K3s;Sh;2sZ^@xuTz-F5ytxc3KaCu0-QGcMODDUqwKKIuMtBsB7n`v5}rE0V1Z@Umr(mO&=$v5QG;O7;xPG~-K=;W%v|!Ca51Uh<5%!E zqs)AAKFO9bv%H7GQiU(KUi&n8AED@nl5A~z9-`}e0Jg}>q^^$Ja@X$ws{LLMWyfRr za~B+nB6DSuAj@Pu95D+Y^;2UWg|vGbR6X=GtNn2(ebTCX&KIe`;DJW-CJ{7K<^*W~ zpHvx~bz{OS{%qvNhqutFHKE|Qiag(Wayf%hqx(sBp(ZPF{Ga;ovL%`cRZ7D%Y+P^& z!;xfJ5-6D(cME5Dy7TdVL(0Mr_gVd-^G2I?qjIu}Lt=9iIb;`&^+mZR^Ab~qD>xPN zU+Ay%QZ}ofW^q5)Imnx}HtK&&c$U1nMbz;qiCkRxSf`W|b9^%Ip?E4;@;BGO#HCc) zlU`_DFs#w~`Ve02Def+?Y@;VS!^duiVPHVXjm&oIpDQWJ=0te12}fIY)2lS9r6cm0 z6qZ&7I91k_t?eAYoeo<}#yW4cM#tjO6zNmEjM26k9_{j2-Gngg#i6#e$9#o6`zN%! zHQ!!oYL(X{x(MoPg?4M^r0?b8nS^x$prt(E;@QY((+-Cy+D!q^-v_rdrz55O>EO#Qk94JlI3}U0v)EM9uD&YeIZ$G2Z zQ!(r0hdr;>V4r_1k8}?TY7VU&Z#(Iig#b+)%F|!)xv0A7VWN2c`Sz;9dYoY{v)-D^ z_A*)f{Zp<~TtDp_{P&aH51#@S&*H2Od)K=g4Nh7Vdgwe_0n-ubJYM((kMn^;BdE2E z;0iBhtK~((I{YipI)I=&8GiO?z4>P<`J~%~| zCr>@v8d#O7i!wetqs56Alq(fp7ivjqlwS49@6cm8X72Fjo0TVh#}1biCiWb)YR##7 z5O9*3g}t(EzhP?)I^uaQ3X;%1HaNVbFUGQ3JyNj>O@V&ojdBh~{aQ3E+q3w_fr|uj z@{7*h+oa&ReZ;nWUu()M5@wUJvW!ZDQ?z4J&vgT;j27g-_?C~EqQRzvswu_4QEt?= zsS$#miqd~h|JcE8uQUmviqO>W9e7(fnzz)F%5B#p*CzJhuNs7_7l(8Z35BFe1(ng_ zcH;^ebhR*IN9$r{sx~t^xfj;u<)ef~|LFk(;H4h8GAbnvGP)H&OAUP_m?|jRR z-of#(&cXI<9aGBTgVOCp4s8X$zeY+bKfYvHjFk0^pAsT~%z_ke9_B5^Gee{k7L`Cc z>1tf*+X|ym>d%3WzuyuT{GppXD%ZDRaXJ4oX{XErFbY}^)Y>AlZ_D4dtlf-@H8-at zR1X4=CQ7gK8L_K5kMeXVFL8|$l3q;Tv)rkQhfV;Z zod?@ItlQczSNOvPqI9J{`WIO|HL*R=4VD_be$13?_@=i^ReLHH{MKRlA+A~RxS~8;>ayf4HXk+m8pD)Soqo|Y03)a1|E3TX$~ow-u=R&*1qn!<1cnUWDetkd1Xs>`x&W zJpS`J2vcg}Vleh7a=LgBp_x)dOSPHG@Q$boI!;bE3L2x#k@EY_&>RulvCopFD<~6t zzblVM4iZ+risoi4&^pGMyKyP6sWL`M)+#cF9*o|hlNri|3M2zyjGct7x~{^NhW07_TT9q+QKRa+h3;Xd0@^A_|El-F#f{1ch#?oR~g;)Gk^^>!`|1WiFQKJ^hBE zAUK(Qkb;_CZVgq#o)-NQavAF&z!Qr3D&E*SYPEq%)mxY9DDzl{_9j@#so!vBvEk^? z>a+JGC~vq3<^DjzniQSC3IyW{6LS{d6?Yr#9a^3X1@1>thF)Z}SGaAf%BarF%k2MV z6?=tyWr2^&wyN!O;*|Fhpv&iwL7A<>@T3D7t!C3<{@}?2D&>a<@iP-em?cJZFp+`AdEGKcAmC(5iJ#P0vQn9;yvV z@NuED-Gpo*L4o60Gx0TJ+8CGrfy0n|(muoWDjoH7Yem^?Oc#D0HGlWM)+tS*<`MFl z)@@^0t-|m~@Ez`CWUyiPau=(dwGO^^w{cCkE0w0O&3XIW2qQ4gul$ysl zCu$|hxZpMtrAny|`n*eH2kImas&tK}HS0nCt5k!ax(3mS{4llD!}jym7$r%^UKJ>MKz z-;4^|@6kab8eS^;PW99|G_Oze?E#B&h))YF-{>y4CnbJ z6Sg?_yN(&-)mISiBd@mK`AM7KWH3S$@y@U0x$SpDnx3ChVqbq{o@3J6H1+tj+J$tZ zrw67=@zMXH&hi^5C3`=;;D+@9P6PLv-Zp&})4o)5`+(vEab-O5( zq*s7zq^x9YA8mCtYN4BYY~%ty#cPt^>}IZW6`6rL&DlKOOiRsX4v*EQOQg7h2ElaN zH7Ygc{N%l1DVSN`ISiAL-}imQ99Sk9PWm0iG4Fi7CBv1^l&ym@(}yZFPr>Y(Y(7~iKl z8Y_cFdqWl4?&#(sr8wTIF}Vhfe<+C;4zV&nYDx=y$ zqNA_F2uXdYNxrtWtCU<-oDKVFnH9POpJng%1t%ya)AWbdJ;!u04eP{hA-x zkNfbghN2i-H9r^(ZpX+|T!{C}*XN9d&TU=pp;XA(Ro57eN+fWb1rzYQj+Al&5ry>W zuOA(o!lld6n^!HB*)|*N@^xR|estF7&{`C9-ApDBa94Ib5g-l5I+=JKO;$?fTr6l= z>Gb~nOi(LPEyB5#TYH}O2YX>gHk5Z<%Kp02s_$u5ElG46Z+1IG-IV*{*ockRvQ-ff|0ea{FmXO?LA|GmHnZv>>aE3ixFNf)oIh2?z?T$^a| z*!p494vWn@%FihQvjp=o)=LEz<=TNhi8x;NtMKUye6QfIS2|xOX{5{edFTUI+gsdIt2pq|M%-v5ZkWa z`mT1!uh0og2f_;$U3on^gsQ!pxggo>q#-p+Zr94( zwwvZ-7kt7n+7xJJSdjOZ&5&%-@2!W(kSY+$W!S5sxf?BCbLMWgiNZBliR1On9z zt68+m%XLG+xLg=Us^~QHQ-@%B9YwErtzcd9$whd_A#uIiQgE@>eSgXCtdLnPh0VBN zmjX*{ESY@2UKnuxOgECmWx`w~5|h>_fHrNf7qUc{_ml z@9SDx8&Uqxk?%i0^@6?63s>@-$o4K4e+>HyR0R`K9E@0FVptnyobZFo zXqic?quyTuYZKg~lzsiifL0B`d(P?`fe20L_AmeMb%?jY!!%Ss^~u5vLY`o;$Y~B6 zttE6Y${>L{&!F#ce_jU)P$3vuq^8GdLit>2ZK>fdP^+K{#Ovq3MTz#FLFBUGJ^H~y zB2PfQEB4DA*?gu1^>I*T*S0sb7hY<$C|fo7)WYD9?!V`!{|wGGbnj6J z43U7`c3pQf%vFuGnpbL@PgV)=G%S{ngs}gAH%OuhQx@BcB5?M-x>eP#+s}gvruDp4 zN5{@j*zCdj1a1(Z3FPq5&d|;^GjMm0sINL?ke8dj{6JDo8DhEak&NUX~`xCSXX*C#8C z0BrE8G1|_ zMe$hA+4@}+#wL=58j6R=7gK#)kW7?9*;#PWM;6`(+)NS&HMaaX@|>2zs$*aOo#a=L2jB zY$jPV4Lwg0-t;i}^4y5O%np7<7K;cAR=6uD9>g(dSFkS+#vRGP%{HjMR%yr_PSubw z+5NnNTtW`K3m3W70J}AF#urBoIM}9dt$Lbl4aB^}tMsSxH?kRz30*|1QX1d2VTgqj z#Q;QX;QDAG2Q;&QxLvCsG?;XmiJqlaUy?=UDvb`rq~aK2wuh6X%JpVE%NBfq-#j(9 z`)wJ}M+t5yckT<$>;1rvD+d% zz*AqQp{&Z37$fF)tvXz+XN8Vjthb};Ly3JyOkApV!w?Aq6eNPN=zTFS2A_d{!4^n( zfEWd=AQ6FWjT{A<;*@Hz+vVF!U2mNLq(@1ck2gDgVT8R}mH>_wI)5jABm`^sm0b@u zH=UTd>SO8m`<3A2H#pgkl$Pc1FHv1wIF;zV#UHddE4MXks|4K|3Yf$yXzXpLhF`z2n#i}xy z$VO5Z%t`e=&7S}^2@VIYpaWnUtl@<8l9x~l7&oX8!i!ZNA0P-5(RB$M^#P*UK|;V} zek8wnKos&8wBLV+Cz8kUWYL%eBG6*lYPS^jOp8RJ+c8FN*JW)la>wMn|T!$!L^F z>o-21a~Z=t0#+iYRce*Rf->k4qdQBI$iEO3VP;qqa-|~y;z~gs9mTq8xC1D0VE)hwM@OBUu{Ek0#_ST2k z>*3q>Xqpwo_33U0!~VU%@0j>B(3r?pVqpXgQnadH zLB`RyG^h(b!8xk`J(Yqn{F5Bo7y*=3Gs=jmx$(pjW9ADAaLI5rGF$nPng_47j-5|) zMfBrH`g(QBcQ3k`#wvFhB(KeJUvn>3OOh;Sj;8!&#zO0&VJwXcJb{3QOW>4@>UF0t z5mHMD__GD~ExpV|d!(10Jh)F~Yj`lqK+k#AVZ!h6cr`PRU7rPcdc0X-6nwm#Y&8OdR_1 zwA5q7v^U5nmBkvh`?N~B&0$EsQ4~_hi)!^LZ8+xb$U_lm&JMsuz}GEwG*GkNHo!rx zX-B0}vD(fV2YaW2~n&W?{#}S!NJXTJ$8D!o$b= z{t{bYuegQL@njjK=b4Z929Hk2=Sc32<}3`_ouzV?^mSDJ^yg!pt`k_#Adf}6fjco; z)ORO}?-pniVNBJjlS8@E7EAlPX_bBAptrH^^8dYZYst28Cs$M&$l4=|tz_txekv54 z3)P+`!O}6;T3~|;{j2V)^(fN3*Yc(waAJ$KCy4-*DD$7ij)zrJDGAV=F&-@z>&h9JI+uFE;)_wp z0HlE!zeS&!V>PUrm1vZU{@4kj8NltmmbRwP6#4XX{UuTlAk1HkVyNVZK>C{>kvMl5 zQ5dQFhWb*2!{kEG#ZNxOYVgvgso>iPe6y2~HeNT0?c;c^cS-=8=n1MW7Ne0ORxz&= zV6c#a>#LB|ywYL9sfa60oskBtd>RDSe2g%nDeD}gDP=D2-(qW6hw8^#KZEGJCpoX0 za=koYRNrC*H$)|udZ_ZI_ZLbHnBC1kyw%?mY+TYj;O+ zd^gvd1Ew%DqEc?U!T-3#l!QlqKbF=B`iA?*y>0c*XX_1rN(IP1Yb^|L-wvn{lq>lP z_?qHhOnHKcF+UDe?Rft>pkumfS;wtEs#&-+da*-zC;c|x{{~yYYK(z0lc^ky&f#Qv zX$E@{^OL#vX{5hM0cJc87e&AK0!_qz9%vHU|pO~*z$*7*q!=@SE-q`oi34hVkPra~{( zZk|^qH@zYK`3mEZnfhmD89Ij)+U8L%AZAGRh7mfvV<-!?euyQrwgp;zj9V@-uXnRJ zdPJIJ{8xV!e1;ETn0oj@o+R8(gwGiR$UGEY;NmnK!np%vw(=yB_Cx|&;U~xe<0GcA zOi@uJDanVneK4yqs-PLr6wciLF$+pbkMw?>6_0C8Q}p@g9ol3l)`1VEA3vGTRuKW2 zB|JLa-*QL~T@5_txi0B5Sbpx=LrI3?t%a7_{C7|aKQNsID)E3xJQ?hdr=yD>De#5w z7kIxEb+3zdn0@@GNaOucq#akVfq4|rMD)Jm*x~(Wp#so!<#jy#B)B-E$PUuI-;&JQ zfniHw{Q>O;Z}gS&(;p-x>CEpemVm%#yWWNLk{G}TNY>Ewzgl>HOk_*A3Q)SP{SzAW zKb@fe)U25a-q9zkvWr(Dzi{a<$wWBBV^o2c_x;CDYHB zHD_KO*n>~LQK7uyN5&n~PYE@7_B5#o=)fcF zK_V!4cfX-Wi@fr`9|>|qHkIcIXk$3{06Em2jod=t;BGV;dPMW*`T)EG!We7Eb=q7_K^(sB_i}XB^GVK zJJi%SxWv*#c;umA?)U=KfbunFyFxL4708x z^XH{Xp~eP&Ac%{?Gs+0V$N+UEcXRC5M%EHhwCIo4-1lhDw0>SZ%*TJ%Vur!VmJQ#w zw0T-jI4sk!cHoo=57Bg;MUgqH_fEixSHCr;>Dvab{%`@RT=Pd4q0x;(m-{}Z`LoGf3#g8EXJ(?F&n8o1ISm(=VuM8$Bbt{*0X5)Af1q)j z0N!2aESS{{xD}A)+mKESSNd0%2sZ8@# z6~mirld-e}6n%o#f@Vk}v7v3uNSAp>U5v$NsFHs6ywfgCZ=^~d@z@{{5+vYCGKstv zYtpCw;+OF5xdvv_<93iew|l5<@ewEbt{Sr!3T!hW<}E%puH^zPs)at*;CaL8>>-xH z{R~BQyH~=#s4NClxhV16r?W1_O_gElqD~xX8%A9*gWhH-c#jK+zd7dm2BM&c-?mM~ zMBXo#Cd9pocH+dI(>@t~k38wGTo#+9LM=S-Zu^~E&9A%Vl63sRx3M4dWK_+Sn6wCp zfua4KR60%!WQPQZsHi}VE_)a`BjowHuN2`IM2*QaA4J0CTa4((3?qe_s=CSB|YOpt27UQbbOL}~07N{)2o*Am6Cd4O*H zHRb*Lo$^gn;JxoxJttb<{2JFRr9L@y{D63H^(Eq5uV<}V78fE09O3$_mi-eN1}M0X z@LFU558B=lL%K=zIOdq;GErJOms?}XaPba7E=X-06r)kT zM+uqE&}+GaaTR!yh4MB8c`-IoCR#G&p`~I3q@y(es?a09?Tov;V2OfJBoUKfRe+Wu zS4q771S4*;D;8_|;F(vyn$U1#VnT73AzVV8n2xLT00ewo1fG9DR%v4Ru_pJFZcPO> z^_NTEGh15awEfh!*FkuPBle}6;xtQHqzH5`5{x*6IGb*4KsGNeRm8q}Mpyn}XM^8- z!B5wbc+E;8a0p?3eftT~=ovx&Y&CyN^aJqbX?Qt2BXW+-U*^+qA=`8>2;K&G8I8HV zYPe^Y!Yx^0w(Xf<)}~hbQ<0HynD-W(``@L7Xkg^db)Fz@p$`JY$u6}yDlU)XY$DDj zkH$J0Zl${M<>g2P=5*=2&JXh+qGs%O z+S@vx+6zuIGr4eEPUjZGJvFh9`J3>Fq@E^MqV-u{;3q)%4Jk1?&&bf3;)mONleyzT zD6qJrp|3LX7i~`y6qYwVKW(co0;EVd$gGRMML8EQsr_ngYScLJbTjM%l;2$)EXwDC zO7pZ*wH0h}GDU9X?yta>&)-H!RNi#UVv(zt*l%pkig8YT=<_=JZGRO*^spvBIlA@J zg#C%)r~_h=S-{dSY&UKaRH4vQ4o?~u*3-Xa6>c%1q$U4rfc5WffJ|cWu$djFel0fT z9dv&+?qLOP!LG&~A!q|{dwPw-;Q6NdQ4Q4(C8qNrD!JX&<6riYP5t+vWYP-XVjS+UKqTlHa2gmc;}M++t(tP$+2NMB0bB zb%Rx?CTG+V!jkC2pPSQO=vcF&IP%;^=k~`2k}UbGoP%t=mmmV`T z&(*Lsk8$A@G_r~3V~ElfKo>S?-a_tIGjpClQWFH703yh*>2g`H4d|-o;rFCauYO6R z*J!s$qh+Ex+McSa8?>77fgVc)YUp}B@7^ur?Oq~>mi*oh(b#nS+|;M@?NXL%iTi6A z_vbq6LMql2WcO4)Y)@6ohezIV)RZ)P{P3g~X_YeV|8wkz3g^AU{yGe1mv+ySK0xia zt*9}09xwNUp@gf;VzHK8Ij-faABryf`1I3#IZd|vf%na&Vq==VED6i#qgPRhhYa|{ zJ}G1jEpi_I>7_8BYSHTK2K2~+Y~<(SWBlT5Z$|>#n0?jG;`}S~Y-Dk3Aj>L1D}qD4 zIXXVwruom*3FGnZM-zCu^>`mm5c=>5Pz5VI)+2rNrbS(xNV=2q8Y6^zZeeQg< zRgn!Tr>L|)o}d5t>FVkZBCsb;wOWPTm}m{Hr$N}B966;yLGBslV?fx#eI`J_YyH0& z6@Ve=eS{g%@DifyBEQLq2r0f-QiI+ehifV7XF1QOzqeNI+O}5^8#^a>D%5b-r92NB z#Lak!4r;Y9cPg*-%J-dk0yv=Ej%~m@QC`3iJQMydn@HK^SkuK_=g5|f@^C;&>Zkc26pvEZq^m?yG9ot6~mrr%exh?{4S2rTnjqe#z3d5DMqB11>K+h|xR zpB*xZsFp~%Uk9FD(P|fKy4i}8kkgj)Up!TQK;*PW+ zT{9l|Rt@97Qrde{z@v~a((}?d#O}@lS5kEJDJl`Y$CWj&k6y3Zj_(=%X07;kl$xxy zMV8>&!?%Q`YPjYrzq8F*9xbQ@{ohq&;OB{-slpnxrn9Y7z|Tl;MhY&H-J_$YLaeGx zh-n*8-`ki>0FVzoBp)c!kB5tzoONl=rdfbx*2^OcijGz|=|&je?mnuVn6( z0H9WPL0-OfYna#g(MW6yAWRZ7CXf8gDHu(6r)wJ*t>y8~LYgW0+48M*krnEFq&RCT zTQCV~-YWtQkCPdIf{9>@loOx@ZXQ1jfYj}*URiJM~h-W}R#C-Ou zvh~kY@2>#~HSPlx(b}vKf54ZD^md0lB%7j~e-{zX=QucOufFl}ZZ`o!?lM3d#&jC> zwMFMB{qJ55p~)oFG&e|y&H$Vb zmC-C|u0Wkb_Zn2#g_;u=?DzS+PRVmZ@*m;88%faHaRV93oBfGwLZhb?ck-84IlfI+ zlylA+7F4m7|8Dn1F|dK4CV%BX3`-2WW2K|p!&s*m$WS zl^d__g*EqgJS0KGZusTjNK7iXI0({IXr5=${^-d>^Hmf=3KAs`Vpx(GnomK^6c4cYt+i4RFv)i1?qlfvSA7B0%76lJ1Fag%K34YepolBe~BR)yaJKF zatj*XY9U^}pt{vUq!FqeQ^vIdpE?1?RUgjj<=pobS!ifW4K15-49a=A-(H3nX+t;f zzFsg!-%Xs?eaeQ?H1_PsJDU(s<@0@_=fY{8uROI-gnmhT1N+&(NUHsK$J>jE9>DWU z78-gmUw&^_)q0LCGJuF|yoIJ0U}V`+(X_uy^j{4jq!PjNahK4D0XXX^gr|71Q8w|Y z(DZ`dCxvU~me!6ReK>iu+m@pDaFhrEN_jcSGMsqkYhL36~i% z&v*D{8vGbd@9u%1T8r;J74c_|M0wN8ozW{^Xk>2#+%-!AVD^S)L*GN65z^vnu{9%! z5EaR%0`nY0g=RNja~i_|L&LkWxxz92^Jt~VTg9+Z-8ObJ^3x&kz{aAZxS=5Xk7KD) z0S&>sU#~1}v_nXCCH6lO&G2V@gZEoKLVd-R@S2Wou+sg?c_^P^fLVt@MADC_2+!C2 zZwbTU0d(1R!;SE9lLk~n(ULsBnn1kNeUy17Ez`h&`USL*k5y% zqior#eTIRlRGqx*aX+S}n(C_xFY-@nM9JA;8nY$JT%csP+_Auj)LaYzz`EdgwX#W+ zXgwy#yOuP;OY>KrjvON663~R0W`_IJ(^TleAU`ltP~RueSC1Z)RqVjRnV9|k7t2^H z6@q@GX-fK2{01so3nOl64(Bvs* z_e@n*+}s0pkKffZkcFSlbSP;`&=b`gpH-{ot#0q)>RWGZj<4oT4CJG;;C$CZs-~}j zsWl@9Z^tof`hUc3HlTQs-}%H)zoavTubPdq^Q1SG2JDKmn_jUti`bW?2FNz(!W7y3ZY8x1B6f=3hV80-W|K$ z^ga9Kj!HG6^||8A>rvXDaThu=aoY#d)!G{p)NO=;T-wA;BozN_se~9j||bpt9;}V zDwu#O$r;x!2&(JacOb!<4WWU&y!#aGStJ^Z| zAkkO(>F1*7ovIZd6y!Zv#+`KM0V|115GzkPpVq6CGHP?S#exvwb)!8|W)uy^r6}4` z3*u=dPtbRxBc4n7T-;X`lHGmiImKV^xbK0QMxM~a+4!8o&+eH|C-r6juPn3qpLs3< zLDzAq8@wXGv$+wmc|2x0cAs!_9eHciqM|3Ec7(g5=;jB#Ril%Df5_hJnBCU~u8|)& zqz}rb$f)R9>;Duyga- z9Uy&VFv9)3xL{_h)H(h8s#eN&Jxxg;=cUzb0em8$aJi3`rlqLWdljVsF(5A%&$kMR zW+POI+V``(-(gnGhx;AbZ6#oe;3vx2Cpip^=4Z;nU0GzTD5N&VxM#!Lh%i-(H&mPogi8>q z6)rm*CVgkM#G*auLFW#pWjcxvJvpyq=tyFeO?R{vOz6 zSp!0jMvCmc*O+{$SCWx$GImxwQbqi6%$RkLpc3UMogbtrWa5r~-!!Pew;U~~#K}8^e=vlT9?`-K6 zfxDrCN73ueQi1XG8a&XRv%+ZC%X9XPn-y0lL@5F;y@#NGC>9l>9&BhvpDnl4fI}^V ztf&8HfaFzz0eNl<5MPu74ZRHAOz{VxI(^_%?EfYLH9EOzK;PrsK0{{hiF-T$zq5v0 zg`5F%2sP@Jo@3H^(ZkP;5*8Z=Y7aUSC_>FG$})UW7K?S>BoI>u2p+v^TA=^uXMJHq zy0r$L|MePaP*Sfy6`$R)&p~&r+}u)dua>U9MmzV@Ld)YsekY%vM5y-3o)9x}#T<=M zC8TsD?{N%tkA?i?=V({##mXM+6tpKd9aTFL*}`7iiW!#=CaEVL*iKo{(7d6%$3e)d z6Pd_S-Lcvma6EGF;w0@i!a*wNaW74_%v!9bB|Swf!{hzXp{_nJYcMT3q0i(^FvH;dfB4N=!>3e-W)b zpWZ%rN)xquzFPxp;=Xswo$w?vk-+H}tDaOD9=p8U+S6sP_J4uUZ9LEHvyRAow~>R) zy2Do^ZtWQkC))xPJCiu_kX4ecro5|I)f|%Y%M;atak^ejS98kMi^tI`-KU!?qeTMi z9-@32wQx@mOO2<*Hm61uO(68(N@mu@s)&tG>U2iWxUzMkOg*{2WKyvEpMkz-W_k_T zyCeGb!$exIXS5}s4|FyLY_d+C(2{V|Tpr+>eRy>AYH)$~&$7Qgt66b9^S>Il7o*yW zdpt2KGLVkz!B-hG?wzCsQ@^q9)$U|9Ry({|I-y1PvUdsR16&LQJnSVWS`t7q^JRkk3`f5jJ z!X4jB_bb9KfXSB#U}7Sw21_ab!-5mWdnieCpPPTnbwr?J2biBT!-tiQj|+gy((kJu zHXy}o>fJ-HCFzq-K3_FGyE7pIujLo)MaJjy|@Q7r*K|F48*sb5GvvP-dQ(&jM z*ERD0c*71k-sMoIl~vngbn|FufcNqBy0r&hVV87&oE(;L9Ydc6RG$KZgbO~HGUiJ6 zS~U0UhbL+=w}kK87a+8}!+v-EZftE=doOY_60 zXyeKQb8pJAt5_Rl@oF_W+ug~kaiT}Qr@eEsG8oXVMo$>IZHMg%MR>d*6+UP)jITU4 z6NG!(&+F`irMEmGFg~Vx@qUtNEZR@59zWxscY(bOurO$L*zD)OEKBCrD4=^8bAAFIm*B_Ms{9-l~Au+>NH}`w4ZktFFi6QqKWH&9h1LO^4N# zrSJ4jlQnbth@5IVwQ=H7m)JP^f9~}ijB)DyA$gDUk?r9h&fg3wN<~MRHh}GmGmsDp zsTTEMFs+~NoDv@0Ak5RWxGrg#wRoTv4aJJyRS|>mzB2c7sKYthJhS%8;%O%nUKsl( zM5nxM4!W219vdAFHQAF=rk1LfOF-RPZ|W!L{3Zsyl!F~R*wHI96zh`V`~%5D6j8pS zBfRieA~!Q*9R&EEUeCpUm-&TxzLF7;XEutGn&Mc}l4K;+#C{k3{0hMwW7O@SQIxFa z_u`&MT43zT|79;oN+adS>qY=|#5qeMi-p<7k+AZd4G-T6<1_?N;@Fur3O)cczNLFY zS3IRg-3qWnlYXtJMmH10$`9nTKJM=V(B5BXxBO~y4cyrg5Auk@sW7ufuiMTVKH9uP=nDCHrCp7kOwfiH#Yzd54ctFUVQm*kvU(DOqm^i1R^Gh_{ zQpKJ6Fs2IO2$q$me%0kTtpIKO&%4b7vFQ;pO^#yoq@g(1$4F$db>z=rQ4j zf=f3zi$y>B8Opu7kJX`>_ukTU^5}cXMf&TlgQYP#+{5G-^fadxMG)n@M-ktWw$dt+ z_%i0&3Sws)==^3H$FSV5e;FhSdF1GFUz}JltaQ)K$G0Q@bAW&|@JGe`fkX6Fl0$LA z=Z4&eM9~Ezv1mp|W2fVhDdtnd;bQa4O@71&=8X$yB^W>H_M7jJ8jP2VqHW+P zh`YYJyjra`QlH=5I;hZ*KN=qizK^xGW%7VZ7Jm@OajxSoZ`rZrBCY29u!7E{uV zOIefjI+WFO*`o!5>8K?F3-N?~%|+VnmqC>S26q#(jbu&}jG$43j@MC)JHA65gPCht z?Hu^aK?|o&gWq_UeNHufl~RoU>?D*Zq!Se{^GG8XB!@8(nC-hW?aSwcv|Y^A?o_a= zDv=_^G1U(>#}F?d7dZF5jAcBfHOHwfqftLNT>STQf8C0HTRT_LH4I;KScLqp>7<>`rT_jVw$KH_U@J|fn9 zujA>GgyP5aJ`2N|vBaqRAy(xMVME>((O&j>@6B4;R_Ps(OJ8{23sVJB%?~jB(LXc& z02IK8rf8B>o~zu-JwY|EcYSG{aYFMgqoTID{+%0x3Xe? zt>e02{6jszWLoVxltssC%HbWY+%zOpqBxR48A~#lz{t(sk|9MRjv0DQGM|&CB7J>1 zQNeEX!muKr9Z_8gVw4VDS7ydVBD4)Ps&^x*>fC}VMlVmuc|J3bTU|KBhKgxT+`zkO z*d0?n_UC?QA9f{G-mDkv5t_P7n06*}%ajcD{H28ji>@8Tpm#-1qy07iXj5N`#0wFR z`un6clFp}QS#GBEGWv6dr_X5YO?Icj#yRJqdxN(Zdw`~~`#D>88|^=*n{XHPbMq6f z3D`~2{Cy<*%}0^IMVa*rgS&j#xkU=8(8Dz-h0Dp;7!zl?qo;ILO2s-4g+$0L8sM9s zu42`+p=;e{BEHB&Un28SS+nApyMv~@1-0%azL71^^^nwYchb;vybS9$KTYs%B*(jD z|AJSIEM#<1Qb+gII(zQ2CGg^Dog^$Q{arEPm{j@Go;;*;hE+$%2-h>h!*NUhcWpQ8 zq8J;wqZf;#Vq1BK!vC}}0K+3f3}M2G9HeMLC5BNGNX%7`IsHkAEH-wX>$#kAcn*nV zpywT^SLnNg8E0{xopGnWy2hES zj`x2MOk95KRx{Qg&1dKB%1112Y#sl%r5kugb!g^0a+NRUHY#JJ52w~TpO=LTv2lqA zQ*h76GHMDVj!X;Oc$rqj?LPXTd_sbOwL(YUAJ1uiBK9B>q;gQskQF}VyyDz?CfK+i z6doQAp!;rM6;>f^M7Vr;erS8Ltvk4bdkwOa6{eMsV}5WtX8bsc&wm=|-8Sof;YbYhgu3!+ zPTw2r_b-_n4U4x)Uw#tjvgBt1Z9tq>Er(Py(nOZ9S3zBO!q3Y?vf;}yE5M<)WBepN zuSph-+Wgw7x-HnedFO%FRm`(gnXdT$908B(Xf#Xh;GGE1DHOpQR}ir_$X}gobc@N; zM>Ijx9OHVpZf-^x(v*V;j#R82`vH06g&p2v^K{KdI{)?0;z`0pZ}_EMC};Oo6ovHR zBMe{K=NG3>f6HSzK#g~<2T%n*bB$gGpi**Oh{P&-K+wt-*#4{w;orFECo`?vF4Dh` zI+9gutryBd5XVU#jz_qqsbt$R{LR+*RG)x*D=I7B4^NhBlX9gIhZG=RWBJSmYSr5( zM_8IRLYgC~B)R^qp|{-ox}AImP|H@Lts2!q`;=1M&Htg{0SR_T=8U*hb`W=$T~f(h zmQ-N6k&`zH62|NDh~l=z`Eps#g<6aGaASMYnq#f@35tJCSBO^vHSXEd*H81C?~&zS z##E&|xAFPPV{^r=8%>-2Of;t=z;o%JTEz<;ugS4UP5LB1Jse(1 zo~Yol#B=B0ze=E-rw)71fP<(Gd?KPNAO>pvC__cFhjYd&{|ag=5^Ho$@>XA6 zlK52jY2y>y4Vbaj4HR!$|3{$|NgW~R=Bz!??)b2NzX7GCk)8j!yGP)Ap>eK1&&VB& ztoKNAubo(5N`<@xpU)LI*GI+c)G31)s4&;#ku>OQ#9XNXVf7`7IPg?#w|y(gEVP z0^@pqas;EQvC~TI)C*wy<$At?N6dA}8W?P+TcTO_Dd*FAjS~KmOb1p!chqDh)(;kI z5@eL`@^jy7N7W&NEX&ok^7wEUu9$CPc5O}CrCcaR3tZwQxqrL>{Bcax8tJ=Tznn|* zguB+vBm(IM%l@lnlUu{Ae_quXxqCFgfBQGgL%1U#-RjYCY<45VmIL|tAH?)_h1>v{X{;sfD4yosi>f2E_o~P5fe%p;l2FO7H*1;=rYj7K$ztd zu9E-z`S41l?#xL<^fbmdjSB}N#&I4UDL+k)H|G4`zkuAuN7}qd?EFzu_H`6zi;@8A zS4etsTMD-o0cfOXLB5jxN-%3&M?b6}1`BYoeQQ4qI+zX_LtmJ^lP({(Vj9UOe5*ar zg^9i{+PF&PvGjeN5S}*TJwrerMTMCQofC7-Wnd$_z&*4HA@3Mp%!X4eGqMT29dLx1 ze2n~epP|8TI>kAD`kI*J*%H#1bMTw3DX7paHFhoi7ieoDyGwU{xTDPmuQZSwQ0=g+ zp~$a4H&$}m{NW4-GmVw_hxyBkVyAvrs904PI@QyP8mFbYm1geXdJ0JDZB{V`w(N3E{ch`-$?b^LbyEgNi^1qZ%t-xp$*zq>zV-(^jD|{AlR- zJ@9Y_Qm7HzjVN%}r)xD)il;0`eBF8tV74nH?+9y-?|9KGaZ>0WM#4;ogvi!I8(4$^ zLPAhv|3rGBg?@-~E`-$m4x@<9)dz9j<5nV}q}YUT+qQUhmmaGBElO_m+&xOO{MT+v z1Q$HTQ8v0O|2n;Zqn3K!({lkD=cB@}%(;r{CI%Ju`Uv0U>&P##`ri>9E7l&C&lNJ%W6Z_xbgm zws1r0<>m(L*H?O$4#V$-zkGKJ`rj35q1C&T^OoiTQq@y0O?$y@tP;rocAf~~ag?uh zKw#`D90VFm?Z$()ZTPhd^Kv5DgXJN4!jAPp^A-4GaAzmVxiNGA&NZZU@FE7jLcg8w z67gtC4G*p#shj)uB&&&_a;ynQAN_Eg@<*YKuKFrfIHlmTTfph>^7nO;CqmAVDR9aJTTa z+s9C$s8FOv8==cl^*>-bSU=kjpI?9Z=|0bY~2*mu#ZbI zKy~vgl#C<=jSnbA${SCNK4yfFRLdP!yD6tQSnydO?g8S z#e`h(m{7Cob#=sCqni-`=^$!SE$>r=OUPTj&L15YmK#0zcLUi%L4x_DqZ+2#%sFor zL{6i~ef=^tQ~TuNKrhEkfo>g#q)HJWOG?3$!bf=4 zxgF-KM5!b$L4-#mPw7=@WB#`8~=dl@e@yuAfi>q^1{y?-c;b%zj>Ecfv-ejvCA z&3f0Vm4`L0L7h&l4@zg+^H1|FxrA`OPXn&Y=9cNtmNi|`y&tIxg;7lByBR8!^DjC5 z`I)!n95u#1RFZn5%z_bRajAF{mIGO(N`YC63Emj6p}H~Rs{g(7G!3DUdhEedQ&}G! zA(PcE{<7=NLEdeo-9FWQhEHcP;B8uGUW%jd@jJ^tsRkwjqUm#?i}VVVCc^Tci9$T_ z;AkI;qN*%IErVUr&#eoUO7yDqT8$c!k-~&3o@ym4|94&@*|deCcL$#wS7~?n$D!2Z z4&&spYT--BL|Jw`yAhEKi`0V4rNIv+m$zbvJRA-HCWcVl4Y-FOtLP_`O0iDpx$6~0 zbJ$^$RvD+xK^_YRNX6$%4mac&jWx0fHR4Gxh$#iqQYfJgDb$y^D3IlFa+p-oiz_*2 zehw}(;O*Msv7WJ6rgt3;pM^3%TMejL;}`q$Wc-6S^CAJIW}F0h;SThU`-$LCX2u>* z6yM?MPDGANNc<+}J?Z2N|E}semhk13afe5EpMe?a?fz03yZyp5xMixHCEC*j{pUBF zt9O$j_0ZL|)LQLbhxdo8RKJUFkb3jnGYLKq%~UCyn^v+a74H3D>OVGpCKfahP`7CN zreiLb6?LX+r=%;a&H{8#S%v|58jw|lV)`9e#Os*{?*snt)fArZh%8skTs840jhr)a zj83-f+KMN9fX3%Q8vRSgq1&Q5PMX~(6Li-D_p3%P_W7+nl+WjV_}tp3Dej8RFaBa= zH~7gg^K`h`$K)MX_3a*kOWhwi2N=F_f4hUBzEFje+l$$nIn` zpnBSM>-hwu-Ih;o>;&6tnQ^I*anD@R&2{DP)!DA!P)B57y0LZv9P{&&mzd*h;}@WP|9#nO?bo)<%U9=7#6`}?PDwKx7Zm%tQe z1rPYY6c9qY1i^QG{vsUs8#Q~yjWg?0t#_DnY?sfq#j|zI`s|gimFQ-lsSd<(z>DCk za}CcaW&%yg`m+__={+`>|AGx96q_oE0T=_~hnY9auC`85dmq*|KHp#!10)3#c z|9#Wt$fC;ZA>34QCU*>>eTe{FVq zcCKsCwG>SJJumuuCl~&Rt5$0ZySzGeSBIXEPgGsyo(Q~zzI*236Emh$J)@#Hzcs_O za5@g$rQC8#%Ib`JMQs;aj1pfsWdhvxuW2hT(%|iEG27{oy%C<_AeR~vO#{qNHaXFb z%zw7)#%gFxahemvfjLOW#t`o zE^QBcX{bG}_aD>&ladV7*cn#MDpC+05)Ld+b2xoUNHshs>J`6#A_En3?s8Ww@A_Mx z<3Tlwk`V2_+s>NTu4?NI7cx-RMAmCmB*RBFv`0rc=n>jW|Nl1h+P`I6&uInao z`_b4QscFrdl7W3R>p4;+9z1!tlZLnK`@y3(mUifs2 z%P`hALk6)Hn3I}c_R}7GEDRjRn2B`Q;?gkgskhV`ITqpsjJCWk!|rOSeL!R50hWj$#p#% z0(B>v*d2I1P9`YN*O#2!EztNrOq3PS4p(6~B%M>wQ-MH1n)8MB$Lzp9(pKw27LXqB zB-K$UX_gs--fWtAyAxPpAXbgB^V+BV-=s^&BEeg6c8pri0#-&fW&E}KrA5>d@83B2 zy|Cn$)VYF9B=y&<>uB7gxT&7w>HxrP<}WNF@=60i-%G%`p}|^pjK8@mR+oKKrRF5~ z&oT0+P%OYzD>X=aVRc|3$wt1ztlOx{TJ5l7FLS9kHc@`+Td}uq_m++Pm{x8QQVbL1 zP{Y^Q?}b%z`J+BQRImXY0l7)0t7>rze!e#tZ@eIY2o z6(a%(z~mkXSmE-7ss`^#G&!c~=DUnO+J0WJpzMlO3ezu-4AF?WtAc6k1FCXMTs97q zN`Ua5-E{bj(P`&+LSc=gk8XJmUU{_3q2sU{B6s>yxpee;v3K z(&nbAwOJXCc7Z|gu>tW5)fDSeyP-Eu)Nh#v_~9MUy=w}SejUjHYNkUMeh!_JZQcz> z>4sAb}$5l;2{kwYf(O$JM0n_vbA{Jy^QiHx< zRy<5A8`bZ}kE^9TMyEsC%d$;`p9L4XP^4j-mR(`FUHmaCjEi;4nG^jS$03hJUO-tM zbUzMS8L?aLgpeVYx#%>l*QEUUo(BtGS~g(ozuNN zg*}MbnY}C5sF{=$CzDmaa=z;Ri@rmI&w0SpQF)J{r&PU37E*)dpEjIpS0@+XGmcKF zMoUgMtHjWCZKQw?mN(2ooojvC*#hfxk;EJfe0=J1`-D0~IfiySD?boAZ`7mH_8zS6 zRjQu8)u3EE?KIvIJBD{Jt&C0yo^FR?__C1X;WX~J4Jpe-|42A)H7V!H23dD zBbWW5c1%yV_Y62neEzj%aaBnAcyAxYYaQuCU0|;zOk<)@ziG<}ZQ*M^t2m!}X=mRTlu3C@mLq%M)HuF+Tl;bkQ$xleuc;s^wDX zN|mo_wGkN=W>2G-g9@K>wUd5U*~dBN4jJK0m@CoO=Dn$>V0RuivfU~S!0VA;ey>N2 zf-8LI?(LhG2J3T=>!i1{j@&;js;~O+d#XPw=49BcUQEql7oo3C zRUjtuujg)FmPtRs_IT?WhTV1%c9QN$2sNDF$njSO!HohWB`4==axv~N=RZ>Zg7<6A zPl8airy#64j(d*h&85KBoU{2ilgGxV({`}W-*?L8ah#50mH1)uRTIV}7WXGOhjABD zol>xuff8N_N=I|a|Ih^M_gKCv-H|-^pwh?Wl+$gt-@+ZKexJRBA9=M+8s5}I`*$#( zrZS8KGr9Y^ zW;MyJwQnp>*^u|*tG2-2ius*6cU9h%YK-7tyDZl6$(H=j4E8U^4beJ1?^?{1cMqF( z3lxKu7-C1cWk`$?_3*>*ij2$an3j{ zUFYCcvftl+#ZA3ZYACWko*@5f)xar6=Ki^&r@J^+#C3}GBJ<|{6`S=B?4sx(O~qDq zwg-PLy1!T6B<*~^fUa5zu+Z`)&l><`JK|oVY@FCME7$I&Mt<=C}xo6-ymE zZ*24SLZ0e8nR49kS#mF33QL)0MHZNI%8^4%G1(>!3!JXAgbN}J#kAwDO*VcbZ4CcV z|1cS{F{@XPx`l?btHuVq3FH(fb$acQDA>Rr+do}9NFsJ=@9UBhVpoGm@E4{Dmb%)2& zsv_ULTE4{7aVGD5V0y!}x9E22!D!gdB3)A?iA6vV*NHD578TD~;&Gx5HP>@KeQVhz zc}T}MBUN~~PnG#1$8hBC_ozZ4rEYGsch!^jNJT>K((z>=c*x*(@(z9z|JR(o}|&;}M`sZBLz#6b(!%#cr8H+8Q2 zWV$!-@UHBzuC%>eHo)6VYe)#h>Ub@ z^0hIa%XNId1qH6;;QjU?5;~aN{{6<{wbDHX)%kT(QSrido_SI@Z)!9!)y83v(h4(G z4TdrO!`gdSESd<`$~3Uc`X=e!wL|$`r6v@v|JA&vXCxL(6(=86R5)l z;XXZSx(zPNX-@vA@BombTY3YLJNL>E{m%_Gixf855!-8gReKw(zMkQRjP=4&i*>*L zpy$K+&WzDYm*{CXL;qFtF$0HhVo64US<|e*6q2rvhf6UupU^#?h57y0RfJ;@>|smd zuDe#*&na|0M}`+;!&Hw@aK|YJ6x)k=&c8OSlq@+!h0l?&8cOsJ*a)I;+qpv`EWN(s zEL)*=G>7ns3JcAcn0!4ZcYRA<>Y?kZ?{&5JzU3#4%_y$RiT#%Ja&tgqEa5eucpsmm zjGj=cP*8U_clVYRUPm}{FX{ho7CK~}aD65})=l^%Ax(V&6!+Ck@@{=}u;#JS=$$B5~m zuFu}W%!D6C>H@zy&o!wkM z^S{(M*h(bnD*;B{j%SqF|OgnS&Pj5jEfL!d{07mZ8z8OhR zweU3!;U0aagm#{QCpKjQ`OS|Oy#L%|YUbzft63C_Em!0R72mwFJLYVq(XhO9ecExn z6rMxZu>0ZheX{9{t|`aqbE6NqIyWQ))PVmmaox$LTdb`~$vp>GkJW+2^&O?%Tq>#* zF`NwBbanE%={jMi1wqA4Y7la1L7<|8+iOD=JA!|k| zwCsaiy;xVuSDyPLc2r?J2A<=vhg9E9ixCPS+zlSH*O50OX4~JO z+gaX!#YCw4;$0uV9i7u&gXzokU7Rv&{o~!p+nszf;qFm~{JGRCzyDmHpY#Kn5{$fC z+uAD=CLTZ3;A?4X-OT~~G-JBeux+la{7<{XT5&AQ5fkOA{)#>I$D^+&Y;wXf=3YO> z%03H3?GC`+VG+7c&{a7687Q-oV5l2mUOb`eFrML4pr%0G8XzBi)5ud~koq|d81p_V zoj&!bb7kEa%*^gdYLM1(*%^B~sqCl?Oxz;y<&RG4tJz?d^&1f2qZiI-tX-BR943fB zt=-IXdmk=P2TXn*9G@;?UTL2OhYa!|O|Qf#0ei?gD4o%c(;7>!z*Z{1Q=*o~6*}*3 z&CdIS(fS*@>p|#EDk`YG{81*WtY}TNZH05&ufI69cUr-E;(C)eO4BIZRg^+enIb%v zF<#{v;m)AU3Uq4y9?vl%=I$35k!2*sK9d zh9uBVQr$2;Sk|@eOhrgA`^>CfPxKN{{y7uShY7s$Z>)5k)^<9}H1-G_x-QSnSArOY zKIs^*9I%d&L+I|ibe8Wr9RilSs`5;c|AS3QsUN4i#{J$3I%?@x+jg@d>;WBV#WT8_ zb-VAajRkjxQ4G`Ed9u}pjxV?7=6G0J1*^=b)GX^Zno9PJ3>Q7GmF>=N_Kq@MS!y+lHbsW(Tc`v0zScM zO@*8k8$@5(UZVgogLr_7Gwl)by=_8p+jZ)Le6vX!@pq>~NAwH#n!t;_F{Rm?`H!Z9 z-^_Netq)BMCI=;Og0{{~43gE*kVH^kezK%k({YcuTshHa|2#Gu<&)y*vwiOn5@CB6 zYx!p5-kU-@!(-V(e2kyT5SHIsi7BbqurKUTp-M}O_N|>SfVrFT|JZx)wnR3rPvu4c$jIDzWz-z$4xnrR(AO~GS74nDH?#&Fe7uuoD z+$TsM{uS#_aXu}fqB%#n%qoQcM(>@d`-0}Zmv_D%R5$BhS-Ow!Cy_h1qP$k#97+23 zN-EB6V>DxBUj&+sM)}f525t3AT6_%(qQm4&fi#;#x993?k9fH4dDE(sW!p?x#ftg- z96D2v=RyO`HCKyknhpYXIk<$7uRc1}nD`YM6*$y>bsrj+o$y0F8++v*=D9lX4N?CN zweraAeXV@B#0|-mVR}>s4+*d3)%RkBVKl!A!`DZd~;I7DaWT#`5@k9{>-pz2nM-3W#zM$_3UG! zUVz6`Ti0-!p%O!hj~W~) zDs7SKKvUuEF-mdi#(a$3lT13Mgg>ea14y@p&E=(+CPq_8ps{=K>DM)LgD4xFZuhTy zaA4LJ`}6fNn%7l90sED7+qzIKZhtPt7K-!fP9skRJr;^jM@X7$i)%oJM>7?++shp- zPpc)B^T)jgMmOsU+dY-GANVf))AbJ%TVaY9)C&TFF)%IqZ^*>b_w)-TA7_XMH?+9t z3LGyDeUR4xrv4s%exaEAm}cE%pi!<&y_X?OT^{Qd?9i!2k8cDbo{usmX>$WJ6gT;$ z{2J9pQS{xDe?2ykTPbtu%FDeKk5^a7d`xG>l}S9YfHJwmC0Zuu{CxgCORt~Iji*dh z4yv43NnLLCq1%oe^r_Bka=K9qzDK&7QeWgb5R)4Z5pO(3%2wxlYHoKlvyNmmnmZ3! ze;G^xSpDvV0BFPLah+I=)GE_>*ndp&-=I@?ei8kQxYp-?QEM|S@AFOA*CM9Lj|9Y6 z`z_2>L7$4mu6H$Uo#BP_7fQnB8Qbqb#+chtcl@!fjD5S1q1;4o_ySM|xXjAG)FZ*Y zoT;8;_4S+Aus2JJm^0()IkQYjak@FZ@#gkWu79uiub2|83vm|P)sE_A$TKRS5q5o9 zsD^rA-e{ZQ?LNA#)SjBu^#DRP7-Y%!$|z)qc+zcM=`)Cwc~QffVaT0o)@9@6Q3^&n zbDt!;DHVmPS9}fC0C{om&0YideNDUF$rTm(@zDpgUJBw2^#*G2>K+UJx`3f*vG{mT z=wE>QFFG#2L&aZ)Riz|>D%%20dCJUgw&bM<*DD}MRf%$wZn@p*S&#tr77@Sw?C{cz z`0LT1<(<#Xox_hROVxDstQ((Ng+tMEimqus)+Qy zpD1CWN3<$(r@e97-*-;Q;|J)!7iT;rXbvIEny|g`T}Aab9iCBd(R!XRdX+?`@s2KX zkutPVGrif2<>2155u!s3j|E@VB87)qhT86eL5~7p^FcyZ+=8;P~C9X z@f2Wk#D?n@k{c-!+*KOrvs8S4L;4etxKk6}<2d2{w?3D=7}%;qjQ#u5FF}1?pP(4M z#DlFgSl}OOLhg(R^|+a1M>h+ZSULe(j6<0$tNl0+2|o?E8&3~#I3@o!yi|fk*G6)K zc4t67aC`zl>W+88fj5&3?;~=pasY~Y-{;4AhSgqJH}wt>e-8H)x2{1B3}21Gy8cFL zei?w3PG*BKC5c|NECUK5GbF9Ti1?pzSY|u(pyKX~nu(a3r2m2vXY>ik!7^Jr`0U-20ZOmicqtw|Vw-C`;@|_uxKQn|3Lm5v))Ao&L-U|-BL`2-gVtZi*M0lut?hA= zVsBV3nwa{UYKw#JD%a_Ym*P8sggd@Kw5-ur{pI&P3&abEe^->N&j#IG+rW>2e;7=A zzWnH8^_CpOwk;r>*;ah+k3Fw$nLT|!ypTa9Z_34DI4eD4J5&LY3P%t90+BT`{aKlRvzgwI!vVGQfp>IdlH+koc!#m}NRO+a%=y5Rhyu zX9OX?l$-D1CPu~QebB?nUN-u~L_xLTXbPAj?9`(41sNJ<9v+@}+YIufbRV1WViOk0 zGEGjoyLUwX>Fkm8`lbP@%_5G0F>#5uftC`$@aEaT?${_mlm1J|-L5AbiqgdPtyX2GFF{Jf40o&*?t-7(Ni z|5HQ96;>+hCr>0gJOSj=^TRuagJyy1t(?Dzmh6#RL$Rqz^!j$ix9(GaQ0z5_DrX$7 zid1}KH&g|n+u9sDc5LR<$7Zhd4>LQ?NMvv>OndHc+s|Ib$j z@cO$Qh!^X|=Q*P_0S&SI($GJobR6iSZ$Ppy^uRI-Ks$+X?F;-{BSP3(mB#^MCbHM= znW9VXJn1)mrk+o|e|C{yX@E;^5HE?4rP!AYcr|kWH=BYi^8(gdD-v zHBS=C?_%K!ir;pm!|Nq_yqA{+ZE&R(QEhQ`+~xR(RUgajBHcyiL`U;Ry#>hI2lvZlkKxPw||I5Yy`-gH&)BZR2B;lH;%z}KX z&mz`!w2aFYkgSp_NU~FQ+(lbkwjbj^mL(;Qx6_ecN3|7u$;#({ZKt})7thj}JwHnK zg@wg6T1ZK4=%gpNii(PN_4P+_k~$2>-%==boo=z<$w%M+-pjAL2(Y2#*9?G85?TyS z3FVNeQ)!`uvNsdzzay)w=y$aUMws9 zm2Lg?iSrRf5!#S9{f0quUen>eSIfo{Ez?{ZF~2>ueBG>fgX>b9ElqTL3BtE^1?QKK{^P_?*<%RwpVLQB=!&_`4k0RNtQ?>{g*-bvw2CI>H z5#L-pYD3{vg)hbai>IId_y=JJwkxmBs9#>LmhTWn9tJEEs*f~%j1)0#J(AH9cm5)K z{DfQWs9}`cNwP6W*oozT$*3}0JKsJMxG_;NXc@Hk(M$NbAO2{+t2p&6o~fNXIwL#E zcK53F(4P%#S#4PPa-lvi^~L&$j_&>cX%r1KA$2hgH4u>>7KFbaOZ~x7Y@nu`kN0S^BpkAG&{%K3B-_Md7P3YZHJSsWO+w&k)1oRb~asGC&p- zdl7kBEOUq>Vq$}MH9eQAL8n=(c zC360yfA?<%=6O_GTEWVfe!ClOy_58KA^m#mwTah1@Kif2bI_0Hfz)cl$kg!4vHCSv z=n^2Ebc?npl63x?hW$!)qE{%GfmF;>HIn>|pL%C=Q`Z3?lxiuTGM)<_o1m8O18bNt z#lFFJ+u`4CVJ;bP^3BA!PSGBinf}MLtEA0^;!}X%Yo=#h)I3r!nSaOR9X~}LTJ z{wTUOhY0z)?Gdxj5HcVk02%{JzIw0n zK>S%A3-~{gZ)Cpe>3!utKJeF8PC&Hj;u2jGB!MtU10ie2gqFOO57bXEl!yrqERmkW z-~FvZ3R!?Cj;CfFK?x<4GmNUV#O@N{jGNN*NOlS5iGk^W|j-uQOy-UM(KhB?Jqi)F7!cl-lnAe zcAEf(Jt=MrMAGcAB(&$VPFMoA>yic@_HsP6sE6Td^ZxI;#V_A}8bWo%EZ=+y;5qHOy0OdF(BgIsaZ3 z&mliPstcO{+zf!(l%i+Hl>`CM3z5okASP4wIQ-Tw8~@qP4B_24_so|?HI2$*r4BpU`&l#zbBJ#B8t0|vb2 zaMR%dkaMDbgaT3VMxcPH81P5_YolJjUFl1ayh1;^37P++!|Hl;hKe(Ko`o}$$TB1L zTZ28N%?1Io*wUR5jJC`YKh?%yq3WapH9#WbEq+h17~2gX+i%d8jZc~R1yq;BFSKjk z;f}v`M_yh|MV|S$ROkd`;=Fzlglz9YZ#`2!cdSqk+^6ze@qozq1YU*y&L>V#h&?oS zh5-8l0BC-lddElt%17xZmJsQ@jA5kn&bdtoAeV|#Y=FXV{o`cRF})P_(tz=so(BN} z$2PZqV86tfnUO;q+VkMIe*+n!D>em)V}pgk4|*U-Yo^^3%QFiO4&0A0p!~h~=H4}Z zsR9C*(M>jSm)lhuk?c(3T(u`olBadM-~ax(0A0(Ysj7R%k`3A*U`sD7K@8p1EzrJ!f*JEztX{#*O{vpk~-JRfj(Q{;bd1#)Z-`4*4= z_cG<&fcE`%ihm2-zYqk{1n8Pl>)!8kp{ zRRD9n9e>NHekq-^43JurcK5sgz03|kqJjCRV!s8aU%h838U#G>|Ag}YGn3yk!(jRUGn0Qf^Z%jAKWydy%;Y~f z^B*$x|3fqRoPyB#cL=qhZ;-Kx=hxR_PJW3gjhHV}=&=;~&TepN`jgK5Ifo0L$S;oO z|2i1BQME4hu{1zK50P5%XL!BI2jIDZLc%W&q@2<;5ufM2pt{Ms+~|ZA2bhki`zBpm z@$yT$zkiWDBgCs^eq*hsEALhF?Yi}{$bsBIUl;wF$Ws-GiJjS1Y`KAx&UubqzU3xu zp##M)(l}F+)@1&(INdd4=0BrQ(=B;WabcwLPEB<|zO(vht9tpY$)J^b zM{8dxhg@x*jL(x@dH5B3gGd7%Wae!JTv0tuzBVo7Ik{o-Xju3T?>PI|#PvzGj+gsM zIh;?~sBV~u2-guUaV#BoP`HlbOL-gnwl#(oGyeFn%tN(q z_EYabi4K{U*d}uQqpfp8WUgbzppL6dTawS8!SLNpKu{mg4F37s=NSsuqx#4Bj^`c} zoUy|;`LJ%@OR~1q?LBj9NFH*IyEL9n&e#}c%d$Ed8XWkBM$@5QUL1PGF|2dm^_oBe z_hW&?4S`krJGkl-q+3u_A}+}A5{!_|kTRclugLmmuGhxG9%z30@O=SecfRd+jyZ;Z z5t;T+022s*R&fL9&nls~Z5G^Q;5SjXUEU>nS7> zl$PX=$TkmYkb9ZdusO~u=@*4|A1E!cD3y(|w$M$^yK?m?@KH-L+wkP$-q8xLmKA-? zj|SqplMQBYDu)4E-mw@}E%tk3yhX!)Y+?iZfT`qW-aIHVU|4omF&aSVfR?7}k)E!X z8cvoQDmYE*t1@hs9Imd-hf^d~H9Rzxgxih{R^<-fVZ(&$ykVQma@AdIv@Wl|f8Z1U zB>?%Og!);?9$~w9z>@UVcA--U!w@ICdO

\ No newline at end of file + From 6f5788a9631000f351c261ab7825fc54b711ec40 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 15 Dec 2022 17:28:01 -0600 Subject: [PATCH 067/116] remove duplicate table row Signed-off-by: Hannah Hunter --- .../supported-secret-stores/file-secret-store.md | 1 - 1 file changed, 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/file-secret-store.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/file-secret-store.md index b856aa1c4..7862d0b22 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/file-secret-store.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/file-secret-store.md @@ -40,7 +40,6 @@ spec: |--------------------|:--------:|-------------------------------------------------------------------------|--------------------------| | secretsFile | Y | The path to the file where secrets are stored | `"path/to/file.json"` | | nestedSeparator | N | Used by the store when flattening the JSON hierarchy to a map. Defaults to `":"` | `":"` -| multiValued | N | Allows one level of multi-valued key/value pairs before flattening JSON hierarchy. Defaults to `"false"` | `"true"` | | multiValued | N | `"true"` sets the `multipleKeyValuesPerSecret` behavior. Allows one level of multi-valued key/value pairs before flattening JSON hierarchy. Defaults to `"false"` | `"true"` | ## Setup JSON file to hold the secrets From 15cf08d0386a1fbb7f2b7413326a859cbdad1794 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 15 Dec 2022 17:39:40 -0600 Subject: [PATCH 068/116] update acquire lock dotnet Signed-off-by: Hannah Hunter --- .../distributed-lock/howto-use-distributed-lock.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md b/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md index 6cb9e802f..e1cb80826 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md +++ b/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md @@ -62,12 +62,14 @@ namespace LockService { class Program { + [Obsolete("Distributed Lock API is in Alpha, this can be removed once it is stable.")] static async Task Main(string[] args) { string DAPR_LOCK_NAME = "lockstore"; + string fileName = "my_file_name"; var client = new DaprClientBuilder().Build(); - - using (var fileLock = await client.Lock(DAPR_LOCK_NAME, "my_file_name", "random_id_abc123", 60)) + + await using (var fileLock = await client.Lock(DAPR_LOCK_NAME, fileName, "random_id_abc123", 60)) { if (fileLock.Success) { From 8fdb4ca78ee13f37c33059ad6a4befbc07a57fe4 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 15 Dec 2022 17:54:55 -0600 Subject: [PATCH 069/116] update unlock dotnet code Signed-off-by: Hannah Hunter --- .../distributed-lock/howto-use-distributed-lock.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md b/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md index e1cb80826..21dac83e2 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md +++ b/daprdocs/content/en/developing-applications/building-blocks/distributed-lock/howto-use-distributed-lock.md @@ -149,7 +149,7 @@ namespace LockService var client = new DaprClientBuilder().Build(); var response = await client.Unlock(DAPR_LOCK_NAME, "my_file_name", "random_id_abc123")); - Console.WriteLine(response.LockStatus); + Console.WriteLine(response.status); } } } From 4f717d97a531242667bd49b7181fa5c33cf83d88 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 15 Dec 2022 22:19:42 -0600 Subject: [PATCH 070/116] change link for sidecar security (#3011) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../service-invocation/service-invocation-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md index eebf72b7a..0c4d3bc41 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md @@ -134,4 +134,4 @@ For quick testing, try using the Dapr CLI for service invocation: - Read the [service invocation API specification]({{< ref service_invocation_api.md >}}). This reference guide for service invocation describes how to invoke methods on other services. - Understand the [service invocation performance numbers]({{< ref perf-service-invocation.md >}}). - Take a look at [observability]({{< ref monitoring.md >}}). Here you can dig into Dapr's monitoring tools like tracing, metrics and logging. -- Read up on our [security practices]({{< ref monitoring.md >}}) around mTLS encryption, token authentication, and endpoint authorization. +- Read up on our [security practices]({{< ref security-concept.md >}}) around mTLS encryption, token authentication, and endpoint authorization. From 5d33c619759b05fb2e167417e5801050ea83c2ab Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 15 Dec 2022 23:33:26 -0600 Subject: [PATCH 071/116] update port to match go code (#3014) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell --- .../integrations/gRPC-integration.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md b/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md index b241ca3bf..40b53b073 100644 --- a/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md +++ b/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md @@ -214,17 +214,17 @@ func main() { } ``` -This creates a gRPC server for your app on port 4000. +This creates a gRPC server for your app on port 50001. 4. Run your app To run locally, use the Dapr CLI: ``` -dapr run --app-id goapp --app-port 4000 --app-protocol grpc go run main.go +dapr run --app-id goapp --app-port 50001 --app-protocol grpc go run main.go ``` -On Kubernetes, set the required `dapr.io/app-protocol: "grpc"` and `dapr.io/app-port: "4000` annotations in your pod spec template as mentioned above. +On Kubernetes, set the required `dapr.io/app-protocol: "grpc"` and `dapr.io/app-port: "50001` annotations in your pod spec template as mentioned above. ## Other languages From 24417b1bcaf8701711c3230b551facbd35e38e95 Mon Sep 17 00:00:00 2001 From: salaboy Date: Wed, 14 Dec 2022 08:38:46 +0000 Subject: [PATCH 072/116] Small suggestion to save resources for local dev This is just a suggestion, feel free to disregard it, but I found myself using that flag all the time for dev purposes. Signed-off-by: salaboy Signed-off-by: Mauricio Salatino --- .../en/getting-started/tutorials/configure-state-pubsub.md | 1 + 1 file changed, 1 insertion(+) diff --git a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md index 7e394d708..a26287101 100644 --- a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md +++ b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md @@ -46,6 +46,7 @@ helm install redis bitnami/redis --set image.tag=6.2 ``` For Dapr's Pub/sub functionality, you'll need at least Redis version 5. For state store, you can use a lower version. +Notice that by adding `--set architecture=standalone` create a single replica redis setup which can save memory and resources if you are in working in a local environment. Run `kubectl get pods` to see the Redis containers now running in your cluster: From 6411364a1782251afe4d08be9eeedd94fd8cff88 Mon Sep 17 00:00:00 2001 From: Lenshood Date: Wed, 14 Dec 2022 11:40:15 +0800 Subject: [PATCH 073/116] fix broken ref in distributed_lock_api Signed-off-by: Lenshood Signed-off-by: Mauricio Salatino --- daprdocs/content/en/reference/api/distributed_lock_api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/api/distributed_lock_api.md b/daprdocs/content/en/reference/api/distributed_lock_api.md index ba250e3ae..f79270218 100644 --- a/daprdocs/content/en/reference/api/distributed_lock_api.md +++ b/daprdocs/content/en/reference/api/distributed_lock_api.md @@ -21,7 +21,7 @@ POST http://localhost:/v1.0-alpha1/lock/ Parameter | Description --------- | ----------- `daprPort` | The Dapr port -`storename` | The `metadata.name` field component file. Refer to the [component schema] ({{< ref component-schema.md>}}) +`storename` | The `metadata.name` field component file. Refer to the [component schema]({{< ref component-schema.md >}}) #### Query Parameters @@ -95,7 +95,7 @@ POST http://localhost:/v1.0-alpha1/unlock/ Parameter | Description --------- | ----------- `daprPort` | The Dapr port -`storename` | The `metadata.name` field component file. Refer to the [component schema] ({{< ref component-schema.md>}}) +`storename` | The `metadata.name` field component file. Refer to the [component schema]({{< ref component-schema.md >}}) #### Query Parameters From aefd25594d6b669cd7d861bce5c671514e955245 Mon Sep 17 00:00:00 2001 From: salaboy Date: Thu, 15 Dec 2022 08:10:44 +0000 Subject: [PATCH 074/116] Update daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: salaboy Signed-off-by: Mauricio Salatino --- .../en/getting-started/tutorials/configure-state-pubsub.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md index a26287101..64cf08b46 100644 --- a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md +++ b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md @@ -46,7 +46,7 @@ helm install redis bitnami/redis --set image.tag=6.2 ``` For Dapr's Pub/sub functionality, you'll need at least Redis version 5. For state store, you can use a lower version. -Notice that by adding `--set architecture=standalone` create a single replica redis setup which can save memory and resources if you are in working in a local environment. +Notice that adding `--set architecture=standalone` creates a single replica Redis setup, which can save memory and resources if you are working in a local environment. Run `kubectl get pods` to see the Redis containers now running in your cluster: From a21176e7b0a24564efacdcddcdecf505e93c5f24 Mon Sep 17 00:00:00 2001 From: salaboy Date: Fri, 16 Dec 2022 08:23:35 +0000 Subject: [PATCH 075/116] Update daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md Co-authored-by: Mark Fussell Signed-off-by: salaboy Signed-off-by: Mauricio Salatino --- .../en/getting-started/tutorials/configure-state-pubsub.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md index 64cf08b46..49d2522c2 100644 --- a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md +++ b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md @@ -46,7 +46,7 @@ helm install redis bitnami/redis --set image.tag=6.2 ``` For Dapr's Pub/sub functionality, you'll need at least Redis version 5. For state store, you can use a lower version. -Notice that adding `--set architecture=standalone` creates a single replica Redis setup, which can save memory and resources if you are working in a local environment. +Note that adding `--set architecture=standalone` to the `install` command creates a single replica Redis setup, which can save memory and resources if you are working in a local environment. Run `kubectl get pods` to see the Redis containers now running in your cluster: From 58902c637e8632851527859a8e22ad536f82fa4b Mon Sep 17 00:00:00 2001 From: "Renato L. de F. Cunha" Date: Fri, 16 Dec 2022 22:14:34 -0300 Subject: [PATCH 076/116] Remove mentions of backoff from rabbitmq docs (#2978) * Remove mentions of backoff from rabbitmq docs In a recent change, the rabbitmq component dropped support for backoff policies. This updates the documentation page by leaving those out as well. Signed-off-by: Renato L. de F. Cunha * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md Signed-off-by: Mark Fussell * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md Signed-off-by: Mark Fussell * Add @ItalyPaleAle's comments about differences in message delivery Signed-off-by: Renato L. de F. Cunha Signed-off-by: Renato L. de F. Cunha Signed-off-by: Mark Fussell Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../supported-pubsub/setup-rabbitmq.md | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md index d78e7fc85..aaf5143e7 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-rabbitmq.md @@ -40,12 +40,6 @@ spec: value: parallel - name: publisherConfirm value: false - - name: backOffPolicy - value: exponential - - name: backOffInitialInterval - value: 100 - - name: backOffMaxRetries - value: 16 - name: enableDeadLetter # Optional enable dead Letter or not value: true - name: maxLen # Optional max message count in a queue @@ -75,24 +69,22 @@ The above example uses secrets as plain strings. It is recommended to use a secr | publisherConfirm | N | If enabled, client waits for [publisher confirms](https://www.rabbitmq.com/confirms.html#publisher-confirms) after publishing a message. Defaults to `"false"` | `"true"`, `"false"` | reconnectWait | N | How long to wait (in seconds) before reconnecting if a connection failure occurs | `"0"` | concurrencyMode | N | `parallel` is the default, and allows processing multiple messages in parallel (limited by the `app-max-concurrency` annotation, if configured). Set to `single` to disable parallel processing. In most situations there's no reason to change this. | `parallel`, `single` -| backOffPolicy | N | Retry policy, `"constant"` is a backoff policy that always returns the same backoff delay. `"exponential"` is a backoff policy that increases the backoff period for each retry attempt using a randomization function that grows exponentially. Defaults to `"constant"`. | `constant`、`exponential` | -| backOffDuration | N | The fixed interval only takes effect when the policy is constant. There are two valid formats, one is the fraction with a unit suffix format, and the other is the pure digital format that will be processed as milliseconds. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". Defaults to `"5s"`. | `"5s"`、`"5000"` | -| backOffInitialInterval | N | The backoff initial interval on retry. Only takes effect when the policy is exponential. There are two valid formats, one is the fraction with a unit suffix format, and the other is the pure digital format that will be processed as milliseconds. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". Defaults to `"500"` | `"50"` | -| backOffMaxInterval | N | The backoff initial interval on retry. Only takes effect when the policy is exponential. There are two valid formats, one is the fraction with a unit suffix format, and the other is the pure digital format that will be processed as milliseconds. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". Defaults to `"60s"` | `"60000"` | -| backOffMaxRetries | N | The maximum number of retries to process the message before returning an error. Defaults to `"0"` which means the component will not retry processing the message. `"-1"` will retry indefinitely until the message is processed or the application is shutdown. Any positive number is treated as the maximum retry count. | `"3"` | -| backOffRandomizationFactor | N | Randomization factor, between 1 and 0, including 0 but not 1. Randomized interval = RetryInterval * (1 ± backOffRandomizationFactor). Defaults to `"0.5"`. | `"0.5"` | -| backOffMultiplier | N | Backoff multiplier for the policy. Increments the interval by multiplying it with the multiplier. Defaults to `"1.5"` | `"1.5"` | -| backOffMaxElapsedTime | N | After MaxElapsedTime the ExponentialBackOff returns Stop. There are two valid formats, one is the fraction with a unit suffix format, and the other is the pure digital format that will be processed as milliseconds. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". Defaults to `"15m"` | `"15m"` | | enableDeadLetter | N | Enable forwarding Messages that cannot be handled to a dead-letter topic. Defaults to `"false"` | `"true"`, `"false"` | | maxLen | N | The maximum number of messages of a queue and its dead letter queue (if dead letter enabled). If both `maxLen` and `maxLenBytes` are set then both will apply; whichever limit is hit first will be enforced. Defaults to no limit. | `"1000"` | | maxLenBytes | N | Maximum length in bytes of a queue and its dead letter queue (if dead letter enabled). If both `maxLen` and `maxLenBytes` are set then both will apply; whichever limit is hit first will be enforced. Defaults to no limit. | `"1048576"` | | exchangeKind | N | Exchange kind of the rabbitmq exchange. Defaults to `"fanout"`. | `"fanout"`,`"topic"` | -### Backoff policy introduction +### Enabling message delivery retries -Backoff retry strategy can instruct the dapr sidecar how to resend the message. By default, the retry strategy is turned off, which means that the sidecar will send a message to the service once. When the service returns a result, the message will be marked as consumption regardless of whether it is correct or not. The above is based on the condition of `autoAck` and `requeueInFailure` is setting to false(if `requeueInFailure` is set to true, the message will get a second chance). +The RabbitMQ pub/sub component has no built-in support for retry strategies. This means that the sidecar sends a message to the service only once. When the service returns a result, the message will be marked as consumed regardless of whether it was processed correctly or not. Note that this is common among all Dapr PubSub components and not just RabbitMQ. +Dapr can try redelivering a message a second time, when `autoAck` is set to `false` and `requeueInFailure` is set to `true`. -But in some cases, you may want dapr to retry pushing message with an (exponential or constant) backoff strategy until the message is processed normally or the number of retries is exhausted. This maybe useful when your service breaks down abnormally but the sidecar is not stopped together. Adding backoff policy will retry the message pushing during the service downtime, instead of marking these message as consumed. +To make Dapr use more sophisticated retry policies, you can apply a [retry resiliency policy]({{< ref "policies.md#retries" >}}) to the RabbitMQ pub/sub component. + +There is a crucial difference between the two ways to retry messages: + +1. When using `autoAck = false` and `requeueInFailure = true`, RabbitMQ is the one responsible for re-delivering messages and _any_ subscriber can get the redelivered message. If you have more than one instance of your consumer, then it’s possible that another consumer will get it. This is usually the better approach because if there’s a transient failure, it’s more likely that a different worker will be in a better position to successfully process the message. +2. Using Resiliency makes the same Dapr sidecar retry redelivering the messages. So it will be the same Dapr sidecar and the same app receiving the same message. ## Create a RabbitMQ server From b73428716d0bbcbea7feff4d97c12638e470091c Mon Sep 17 00:00:00 2001 From: Syuparn Date: Thu, 22 Dec 2022 00:36:27 +0900 Subject: [PATCH 077/116] fix description of Redis maxRetryBackoff metadata (#3020) Signed-off-by: syuparn Signed-off-by: syuparn Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> --- .../supported-configuration-stores/redis-configuration-store.md | 2 +- .../components-reference/supported-locks/redis-lock.md | 2 +- .../components-reference/supported-state-stores/setup-redis.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-configuration-stores/redis-configuration-store.md b/daprdocs/content/en/reference/components-reference/supported-configuration-stores/redis-configuration-store.md index 2b853a1a5..61bc84273 100644 --- a/daprdocs/content/en/reference/components-reference/supported-configuration-stores/redis-configuration-store.md +++ b/daprdocs/content/en/reference/components-reference/supported-configuration-stores/redis-configuration-store.md @@ -49,7 +49,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | redisPassword | Y | Password for Redis host. No Default. Can be `secretKeyRef` to use a secret reference | `""`, `"KeFg23!"` | enableTLS | N | If the Redis instance supports TLS with public certificates, can be configured to be enabled or disabled. Defaults to `"false"` | `"true"`, `"false"` | maxRetries | N | Maximum number of retries before giving up. Defaults to `3` | `5`, `10` -| maxRetryBackoff | N | Minimum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` +| maxRetryBackoff | N | Maximum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` | failover | N | Property to enabled failover configuration. Needs sentinalMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` | sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `""`, `"127.0.0.1:6379"` diff --git a/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md b/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md index 3299f6c8e..ca6c2b54b 100644 --- a/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md +++ b/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md @@ -84,7 +84,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | redisUsername | N | Username for Redis host. Defaults to empty. Make sure your redis server version is 6 or above, and have created acl rule correctly. | `""`, `"default"` | enableTLS | N | If the Redis instance supports TLS with public certificates, can be configured to be enabled or disabled. Defaults to `"false"` | `"true"`, `"false"` | maxRetries | N | Maximum number of retries before giving up. Defaults to `3` | `5`, `10` -| maxRetryBackoff | N | Minimum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` +| maxRetryBackoff | N | Maximum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` | failover | N | Property to enabled failover configuration. Needs sentinalMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` | sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `""`, `"127.0.0.1:6379"` | redeliverInterval | N | The interval between checking for pending messages to redelivery. Defaults to `"60s"`. `"0"` disables redelivery. | `"30s"` diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md index 3c323b074..12c4de8da 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md @@ -97,7 +97,7 @@ If you wish to use Redis as an actor store, append the following to the yaml. | redisUsername | N | Username for Redis host. Defaults to empty. Make sure your redis server version is 6 or above, and have created acl rule correctly. | `""`, `"default"` | enableTLS | N | If the Redis instance supports TLS with public certificates, can be configured to be enabled or disabled. Defaults to `"false"` | `"true"`, `"false"` | maxRetries | N | Maximum number of retries before giving up. Defaults to `3` | `5`, `10` -| maxRetryBackoff | N | Minimum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` +| maxRetryBackoff | N | Maximum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` | failover | N | Property to enabled failover configuration. Needs sentinalMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` | sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `""`, `"127.0.0.1:6379"` | redeliverInterval | N | The interval between checking for pending messages to redelivery. Defaults to `"60s"`. `"0"` disables redelivery. | `"30s"` From 268da740ec06dc1e18109e66362dc532af20dda4 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:33:16 -0600 Subject: [PATCH 078/116] Docs upmerge 12/16 (#3015) * Fix: codeblock wasn't properly closed Minor formatting fix. Signed-off-by: Tiago Alves Macambira * update code examples Signed-off-by: Hannah Hunter * Fix broken link in components-concept page Commit https://github.com/dapr/docs/pull/2875/commits/043a39d3d161a7b44b95a7099ec862329d70eefa shuffled content around and removed a section called "Pluggable Components", breaking an existing link to this section. This PR fixes the link to point to the section now hosting the appropriate content. Signed-off-by: Tiago Alves Macambira * Add Resiliency to the concepts page Signed-off-by: Nick Greenfield * Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> * Remove ServiceInvocation.NoDefaultContentType feature flag Fixes #2869 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * dotnet submodule Signed-off-by: Hannah Hunter * Simplifying kubernetes YAML config (#2908) * Simplifying Kubernetes YAML Signed-off-by: Marcos Candeia * Update pluggable-components-registration.md Signed-off-by: Marcos Candeia Signed-off-by: Marcos Candeia * Clarify GH actions doc (#2906) * dotnet submodule Signed-off-by: Hannah Hunter * attempt to clarify doc Signed-off-by: Hannah Hunter * Revert "dotnet submodule" This reverts commit 8fdeb6182d23da53b304349c9576a07f0ffc2055. Signed-off-by: Hannah Hunter * dotnet submodule (#2904) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell * Update latest Python SDK version Signed-off-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> * etag true for dynamodb (#2902) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell * [Run w/o docker] Add tabs and port number (#2905) * add tabs and window example Signed-off-by: Hannah Hunter * edits per Mark Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell * 1/3 update per alecor191 Signed-off-by: Hannah Hunter * Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> * Add missing rocketmq pubsub to table Signed-off-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> * Update aws-secret-manager.md Signed-off-by: vishalsignity <97443129+vishalsignity@users.noreply.github.com> * Update daprdocs/content/en/concepts/resiliency-concept.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/concepts/resiliency-concept.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/concepts/resiliency-concept.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Apply feedback to resiliency concept page * Mark pubsub.hazelcast as deprecated Fixes #2708 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> * update supported versions list (#2916) * update supported versions list Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> * updated supported versions Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/concepts/resiliency-concept.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update azure-kubernetes-service-extension.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> * Update redis.md Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> * Update eventgrid.md command typos (#2932) Signed-off-by: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> Signed-off-by: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> * Add sidecar health image and fix broken links Signed-off-by: Nick Greenfield * update python to be declarative example Signed-off-by: Hannah Hunter * Start of resiliency quickstart Signed-off-by: Nick Greenfield * Update daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update docs runtime version to 1.9.3 Signed-off-by: Nick Greenfield * Update azure-api-management.md Removed one word Signed-off-by: Richard de Zwart * Use Google Analytics 4 ID (#2941) Signed-off-by: Patrice Chalin Signed-off-by: Patrice Chalin Co-authored-by: Mark Fussell * Fix Python SDK version Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * update code snippets Signed-off-by: Hannah Hunter * Azurite queue default port is 10001 fix: Update azurite port to 10001 instead of 10000 See [docs](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio#queue-listening-port-configuration) Signed-off-by: ThumNet * updates per resiliency example Signed-off-by: Hannah Hunter * Add resiliency images for quickstarts Signed-off-by: Nick Greenfield * Updates to resiliency svc invoke quickstart * updates per Nick review Signed-off-by: Hannah Hunter * Update daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * capitalize Dapr Signed-off-by: Hannah Hunter * Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> * Fix resiliency component quickstart Signed-off-by: Nick Greenfield * Update runtime version to 1.9.4 Signed-off-by: Nick Greenfield * Update subscription examples (#2957) * dotnet submodule Signed-off-by: Hannah Hunter * update to v2alpha Signed-off-by: Hannah Hunter * revert some changes Signed-off-by: Hannah Hunter * update routes Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter * Kafka SASL SCRAM Authentication (#2939) * Adds settings for SASL SCRAM SHA-256 and SHA-512 Signed-off-by: Andrew * Update setup-apache-kafka.md Signed-off-by: Andrew Signed-off-by: Andrew Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Co-authored-by: Yaron Schneider * Update fluentd.md (#2967) Elastic search installed by helm will version 8 series which does not let dapr connect with kibana(Because it enables authentication), After using version 7 series works as expected Signed-off-by: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> Signed-off-by: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> * Adding missing brace for json document example (#2968) There is a missing brace in the example json Signed-off-by: Chris Kingdon Signed-off-by: Chris Kingdon Co-authored-by: Yaron Schneider * Update Kubernetes job page (#2973) Adds a paragraph mentioning `restartPolicy` needs to be set to `Never` for successful job completion. Signed-off-by: Renato L. de F. Cunha Signed-off-by: Renato L. de F. Cunha * Remove backoffmaxretries from pubsub.mqtt metadata spec Signed-off-by: shivam * Fix resiliency run command in quickstart (#2983) Signed-off-by: Nick Greenfield Signed-off-by: Nick Greenfield * Update version to 1.9.5 (#2987) * Updated per feedback Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * clarify app namespace Signed-off-by: Hannah Hunter * Improve Hashicorp Vault documentation on CA certificates. (#2988) * Improve Hashicorp Vault documentation on CA certificates. Hashicorp Vault component documentation for CA related fields (`caPem`, `caCert` and `caPath`) does not describe the precedence among those flags and a big ambiguous on what those flags mean. This PR tries to alliviate that. Closes #2989 Signed-off-by: Tiago Alves Macambira * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Tiago Alves Macambira Signed-off-by: Tiago Alves Macambira Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell * Removing stored procedure references from cosmosDB docs (#3000) Signed-off-by: Ryan Lettieri Signed-off-by: Ryan Lettieri Co-authored-by: Ryan Lettieri Co-authored-by: Mark Fussell * fix broken ref in distributed_lock_api Signed-off-by: Lenshood * Adding `helm repo update` (#3010) Signed-off-by: salaboy Signed-off-by: salaboy * change link for sidecar security (#3011) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter * update port to match go code (#3014) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter Co-authored-by: Mark Fussell Signed-off-by: Tiago Alves Macambira Signed-off-by: Hannah Hunter Signed-off-by: Nick Greenfield Signed-off-by: wxbty <38374721+wxbty@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: Marcos Candeia Signed-off-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> Signed-off-by: vishalsignity <97443129+vishalsignity@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Signed-off-by: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> Signed-off-by: Richard de Zwart Signed-off-by: Patrice Chalin Signed-off-by: ThumNet Signed-off-by: Andrew Signed-off-by: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> Signed-off-by: Chris Kingdon Signed-off-by: Renato L. de F. Cunha Signed-off-by: shivam Signed-off-by: Ryan Lettieri Signed-off-by: Lenshood Signed-off-by: salaboy Co-authored-by: Tiago Alves Macambira Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Co-authored-by: Nick Greenfield Co-authored-by: wxbty <38374721+wxbty@users.noreply.github.com> Co-authored-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Co-authored-by: Marcos Candeia Co-authored-by: Mark Fussell Co-authored-by: Bernd Verst <4535280+berndverst@users.noreply.github.com> Co-authored-by: Artur Souza Co-authored-by: vishalsignity <97443129+vishalsignity@users.noreply.github.com> Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Co-authored-by: Ana Cozma <48124384+ana-cozma@users.noreply.github.com> Co-authored-by: Richard de Zwart Co-authored-by: Patrice Chalin Co-authored-by: ThumNet Co-authored-by: Jeffrey Tummers Co-authored-by: Andrew Co-authored-by: Yaron Schneider Co-authored-by: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> Co-authored-by: Chris Kingdon Co-authored-by: Renato L. de F. Cunha Co-authored-by: shivam Co-authored-by: Ryan Lettieri <67934986+RyanLettieri@users.noreply.github.com> Co-authored-by: Ryan Lettieri Co-authored-by: Lenshood Co-authored-by: salaboy --- .../content/en/concepts/components-concept.md | 2 +- .../content/en/concepts/resiliency-concept.md | 39 + .../observability/sidecar-health.md | 2 +- .../pubsub/howto-publish-subscribe.md | 5 +- .../pubsub/subscription-methods.md | 38 +- .../howto-invoke-discover-services.md | 4 +- .../service-invocation-overview.md | 2 +- .../Azure/authenticating-azure.md | 2 +- .../Azure/azure-api-management.md | 2 +- .../azure-kubernetes-service-extension.md | 4 +- .../integrations/gRPC-integration.md | 6 +- .../integrations/github_actions.md | 21 +- .../en/getting-started/quickstarts/_index.md | 5 +- .../quickstarts/resiliency/_index.md | 7 + .../resiliency-serviceinvo-quickstart.md | 1183 +++++++++++++++++ .../resiliency/resiliency-state-quickstart.md | 880 ++++++++++++ .../tutorials/configure-state-pubsub.md | 4 +- .../pluggable-components-registration.md | 5 +- .../hosting/kubernetes/kubernetes-job.md | 9 +- .../self-hosted/self-hosted-no-docker.md | 79 +- .../operations/monitoring/logging/fluentd.md | 8 +- .../operations/monitoring/metrics/grafana.md | 3 +- .../resiliency/resiliency-overview.md | 2 - .../support/support-preview-features.md | 1 - .../support/support-release-policy.md | 30 +- .../en/reference/api/distributed_lock_api.md | 4 +- .../supported-bindings/eventgrid.md | 4 +- .../supported-bindings/redis.md | 56 +- .../supported-bindings/storagequeues.md | 4 +- .../supported-pubsub/setup-apache-kafka.md | 8 +- .../supported-pubsub/setup-hazelcast.md | 4 + .../supported-pubsub/setup-mqtt.md | 2 - .../aws-secret-manager.md | 2 +- .../supported-secret-stores/azure-keyvault.md | 2 +- .../hashicorp-vault.md | 40 +- .../setup-azure-cosmosdb.md | 56 - .../supported-state-stores/setup-redis.md | 1 + daprdocs/data/components/pubsub/generic.yaml | 9 +- .../data/components/state_stores/aws.yaml | 2 +- .../shortcodes/dapr-latest-version.html | 2 +- .../resiliency-quickstart-svc-component.png | Bin 0 -> 67679 bytes .../resiliency-quickstart-svc-invoke.png | Bin 0 -> 68472 bytes daprdocs/static/images/resiliency_diagram.png | Bin 0 -> 323844 bytes daprdocs/static/images/sidecar-health.png | Bin 0 -> 82475 bytes sdkdocs/dotnet | 2 +- 45 files changed, 2372 insertions(+), 169 deletions(-) create mode 100644 daprdocs/content/en/concepts/resiliency-concept.md create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md create mode 100644 daprdocs/static/images/resiliency-quickstart-svc-component.png create mode 100644 daprdocs/static/images/resiliency-quickstart-svc-invoke.png create mode 100644 daprdocs/static/images/resiliency_diagram.png create mode 100644 daprdocs/static/images/sidecar-health.png diff --git a/daprdocs/content/en/concepts/components-concept.md b/daprdocs/content/en/concepts/components-concept.md index e6e1253f6..48ecbb882 100644 --- a/daprdocs/content/en/concepts/components-concept.md +++ b/daprdocs/content/en/concepts/components-concept.md @@ -11,7 +11,7 @@ Dapr uses a modular design where functionality is delivered as a component. Each You can contribute implementations and extend Dapr's component interfaces capabilities via: - The [components-contrib repository](https://github.com/dapr/components-contrib) -- [Pluggable components]({{}}). +- [Pluggable components]({{}}). A building block can use any combination of components. For example, the [actors]({{}}) and the [state management]({{}}) building blocks both use [state components](https://github.com/dapr/components-contrib/tree/master/state). diff --git a/daprdocs/content/en/concepts/resiliency-concept.md b/daprdocs/content/en/concepts/resiliency-concept.md new file mode 100644 index 000000000..7b8cbe675 --- /dev/null +++ b/daprdocs/content/en/concepts/resiliency-concept.md @@ -0,0 +1,39 @@ +--- +type: docs +title: "Resiliency" +linkTitle: "Resiliency" +weight: 400 +description: "Configure policies and monitor app and sidecar health" +--- + +Distributed applications are commonly comprised of many microservices, with dozens - sometimes hundreds - of instances scaling across underlying infrastructure. As these distributed solutions grow in size and complexity, the potential for system failures inevitably increases. Service instances can fail or become unresponsive due to any number of issues, including hardware failures, unexpected throughput, or application lifecycle events, such as scaling out and application restarts. Designing and implementing a self-healing solution with the ability to detect, mitigate, and respond to failure is critical. + +## Resiliency Policies +Diagram showing the resiliency applied to Dapr APIs + +Dapr provides a capability for defining and applying fault tolerance resiliency policies to your application. You can define policies for following resiliency patterns: + +- Timeouts +- Retries/back-offs +- Circuit breakers + +These policies can be applied to any Dapr API calls when calling components with a [resiliency spec]({{< ref resiliency-overview >}}). + +## App Health Checks +Diagram showing the app health feature. Running Dapr with app health enabled causes Dapr to periodically probe the app for its health + +Applications can become unresponsive for a variety of reasons. For example, they are too busy to accept new work, could have crashed, or be in a deadlock state. Sometimes the condition can be transitory or persistent. + +Dapr provides a capability for monitoring app health through probes that check the health of your application and react to status changes. When an unhealthy app is detected, Dapr stops accepting new work on behalf of the application. + +Read more on how to apply [app health checks]({{< ref app-health >}}) to your application. + +## Sidecar Health Checks +Diagram showing the app health feature. Running Dapr with app health enabled causes Dapr to periodically probe the app for its health + +Dapr provides a way to determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: + +- Probed for its health +- Determined for readiness and liveness + +Read more on about how to apply [dapr health checks]({{< ref sidecar-health >}}) to your application. diff --git a/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md b/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md index 7d8027dc8..9385473dd 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md +++ b/daprdocs/content/en/developing-applications/building-blocks/observability/sidecar-health.md @@ -6,7 +6,7 @@ weight: 200 description: Dapr sidecar health checks --- -Dapr provides a way to [determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: +Dapr provides a way to determine its health using an [HTTP `/healthz` endpoint]({{< ref health_api.md >}}). With this endpoint, the *daprd* process, or sidecar, can be: - Probed for its health - Determined for readiness and liveness diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index 844b7ea68..9a3463eaa 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -155,13 +155,14 @@ Learn more in the [declarative and programmatic subscriptions doc]({{< ref subsc Create a file named `subscription.yaml` and paste the following: ```yaml -apiVersion: dapr.io/v1alpha1 +apiVersion: dapr.io/v2alpha1 kind: Subscription metadata: name: order-pub-sub spec: topic: orders - route: /checkout + routes: + default: /checkout pubsubname: order-pub-sub scopes: - orderprocessing diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index b963d13da..c66088ea0 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -104,7 +104,6 @@ In your application code, subscribe to the topic specified in the Dapr pub/sub c ```csharp //Subscribe to a topic -[Topic("pubsub", "orders")] [HttpPost("checkout")] public void getCheckout([FromBody] int orderId) { @@ -117,16 +116,15 @@ public void getCheckout([FromBody] int orderId) {{% codetab %}} ```java +import io.dapr.client.domain.CloudEvent; + //Subscribe to a topic -@Topic(name = "orders", pubsubName = "pubsub") @PostMapping(path = "/checkout") public Mono getCheckout(@RequestBody(required = false) CloudEvent cloudEvent) { return Mono.fromRunnable(() -> { try { log.info("Subscriber received: " + cloudEvent.getData()); - } catch (Exception e) { - throw new RuntimeException(e); - } + } }); } ``` @@ -136,13 +134,13 @@ public Mono getCheckout(@RequestBody(required = false) CloudEvent {{% codetab %}} ```python +from cloudevents.sdk.event import v1 + #Subscribe to a topic -@app.subscribe(pubsub_name='pubsub', topic='orders') -def mytopic(event: v1.Event) -> None: +@app.route('/checkout', methods=['POST']) +def checkout(event: v1.Event) -> None: data = json.loads(event.Data()) logging.info('Subscriber received: ' + str(data)) - -app.run(6002) ``` {{% /codetab %}} @@ -150,11 +148,16 @@ app.run(6002) {{% codetab %}} ```javascript -//Subscribe to a topic -await server.pubsub.subscribe("pubsub", "orders", async (orderId) => { - console.log(`Subscriber received: ${JSON.stringify(orderId)}`) +const express = require('express') +const bodyParser = require('body-parser') +const app = express() +app.use(bodyParser.json({ type: 'application/*+json' })); + +// listen to the declarative route +app.post('/checkout', (req, res) => { + console.log(req.body); + res.sendStatus(200); }); -await server.startServer(); ``` {{% /codetab %}} @@ -163,11 +166,10 @@ await server.startServer(); ```go //Subscribe to a topic -if err := s.AddTopicEventHandler(sub, eventHandler); err != nil { - log.Fatalf("error adding topic subscription: %v", err) -} -if err := s.Start(); err != nil && err != http.ErrServerClosed { - log.Fatalf("error listenning: %v", err) +var sub = &common.Subscription{ + PubsubName: "pubsub", + Topic: "orders", + Route: "/checkout", } func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) { diff --git a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md index f302bc1b9..e73456d4b 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md +++ b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md @@ -405,9 +405,9 @@ dapr invoke --app-id checkout --method checkout/100 ### Namespaces -When running on [namespace supported platforms]({{< ref "service_invocation_api.md#namespace-supported-platforms" >}}), you include the namespace of the target app in the app ID: `checkout.production` +When running on [namespace supported platforms]({{< ref "service_invocation_api.md#namespace-supported-platforms" >}}), you include the namespace of the target app in the app ID. For example, following the `.` format, use `checkout.production`. -For example, invoking the example service with a namespace would look like: +Using this example, invoking the service with a namespace would look like: ```bash curl http://localhost:3602/v1.0/invoke/checkout.production/method/checkout/100 -X POST diff --git a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md index eebf72b7a..0c4d3bc41 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/service-invocation-overview.md @@ -134,4 +134,4 @@ For quick testing, try using the Dapr CLI for service invocation: - Read the [service invocation API specification]({{< ref service_invocation_api.md >}}). This reference guide for service invocation describes how to invoke methods on other services. - Understand the [service invocation performance numbers]({{< ref perf-service-invocation.md >}}). - Take a look at [observability]({{< ref monitoring.md >}}). Here you can dig into Dapr's monitoring tools like tracing, metrics and logging. -- Read up on our [security practices]({{< ref monitoring.md >}}) around mTLS encryption, token authentication, and endpoint authorization. +- Read up on our [security practices]({{< ref security-concept.md >}}) around mTLS encryption, token authentication, and endpoint authorization. diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md b/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md index fb08ee089..93e0e374c 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/authenticating-azure.md @@ -84,7 +84,7 @@ To start, create a new Azure AD application, which will also be used as Service Prerequisites: -- [Azure Subscription](https://azure.microsoft.com/free/) +- Azure Subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) - [jq](https://stedolan.github.io/jq/download/) - OpenSSL (included by default on all Linux and macOS systems, as well as on WSL) diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md b/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md index 793f5f834..5eb42a7cd 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md @@ -6,6 +6,6 @@ description: "Publish APIs for Dapr services and components through Azure API Ma weight: 2000 --- -Azure API Management (APIM) is a way to create consistent and modern API gateways for back-end services, including as those built with Dapr. Dapr support can be enabled in self-hosted API Management gateways to allow them to forward requests to Dapr services, send messages to Dapr Pub/Sub topics, or trigger Dapr output bindings. For more information, read the guide on [API Management Dapr Integration policies](https://docs.microsoft.com/azure/api-management/api-management-dapr-policies) and try out the [Dapr & Azure API Management Integration Demo](https://github.com/dapr/samples/tree/master/dapr-apim-integration). +Azure API Management (APIM) is a way to create consistent and modern API gateways for back-end services, including those built with Dapr. Dapr support can be enabled in self-hosted API Management gateways to allow them to forward requests to Dapr services, send messages to Dapr Pub/Sub topics, or trigger Dapr output bindings. For more information, read the guide on [API Management Dapr Integration policies](https://docs.microsoft.com/azure/api-management/api-management-dapr-policies) and try out the [Dapr & Azure API Management Integration Demo](https://github.com/dapr/samples/tree/master/dapr-apim-integration). {{< button text="Learn more" link="https://docs.microsoft.com/azure/api-management/api-management-dapr-policies" >}} diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md index 1eefc1181..a8dab479e 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md @@ -7,7 +7,7 @@ weight: 4000 --- # Prerequisites -- [Azure subscription](https://azure.microsoft.com/free/?WT.mc_id=A261C142F) +- Azure subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli-windows?tabs=azure-cli) and the ***aks-preview*** extension. - [Azure Kubernetes Service (AKS) cluster](https://docs.microsoft.com/azure/aks/tutorial-kubernetes-deploy-cluster?tabs=azure-cli) @@ -106,4 +106,4 @@ dapr-sidecar-injector-9555889bc-rpjwl 1/1 Running 0 1h dapr-sidecar-injector-9555889bc-rqjgt 1/1 Running 0 1h ``` -For further information such as configuration options and targeting specific versions of Dapr, see the official [AKS Dapr Extension Docs](https://docs.microsoft.com/azure/aks/dapr). \ No newline at end of file +For more information about configuration options and targeting specific Dapr versions, see the official [AKS Dapr Extension Docs](https://docs.microsoft.com/azure/aks/dapr). diff --git a/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md b/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md index b241ca3bf..40b53b073 100644 --- a/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md +++ b/daprdocs/content/en/developing-applications/integrations/gRPC-integration.md @@ -214,17 +214,17 @@ func main() { } ``` -This creates a gRPC server for your app on port 4000. +This creates a gRPC server for your app on port 50001. 4. Run your app To run locally, use the Dapr CLI: ``` -dapr run --app-id goapp --app-port 4000 --app-protocol grpc go run main.go +dapr run --app-id goapp --app-port 50001 --app-protocol grpc go run main.go ``` -On Kubernetes, set the required `dapr.io/app-protocol: "grpc"` and `dapr.io/app-port: "4000` annotations in your pod spec template as mentioned above. +On Kubernetes, set the required `dapr.io/app-protocol: "grpc"` and `dapr.io/app-port: "50001` annotations in your pod spec template as mentioned above. ## Other languages diff --git a/daprdocs/content/en/developing-applications/integrations/github_actions.md b/daprdocs/content/en/developing-applications/integrations/github_actions.md index 1853dd718..b0424bef0 100644 --- a/daprdocs/content/en/developing-applications/integrations/github_actions.md +++ b/daprdocs/content/en/developing-applications/integrations/github_actions.md @@ -3,14 +3,21 @@ type: docs weight: 5000 title: "Use the Dapr CLI in a GitHub Actions workflow" linkTitle: "GitHub Actions" -description: "Learn how to add the Dapr CLI to your GitHub Actions to deploy and manage Dapr in your environments." +description: "Add the Dapr CLI to your GitHub Actions to deploy and manage Dapr in your environments." --- -Dapr can be integrated with GitHub Actions via the [Dapr tool installer](https://github.com/marketplace/actions/dapr-tool-installer) available in the GitHub Marketplace. This installer adds the Dapr CLI to your workflow, allowing you to deploy, manage, and upgrade Dapr across your environments. +Dapr can be integrated with GitHub Actions via the [Dapr tool installer](https://github.com/marketplace/actions/dapr-tool-installer) available in the GitHub Marketplace. This installer adds the Dapr CLI to your workflow, allowing you to deploy, manage, and upgrade Dapr across your environments. -## Overview +Copy and paste the following installer snippet into your applicatin's YAML file to get started: -The `dapr/setup-dapr` action will install the specified version of the Dapr CLI on macOS, Linux and Windows runners. Once installed, you can run any [Dapr CLI command]({{< ref cli >}}) to manage your Dapr environments. +```yaml +- name: Dapr tool installer + uses: dapr/setup-dapr@v1 +``` + +The [`dapr/setup-dapr` action](https://github.com/dapr/setup-dapr) will install the specified version of the Dapr CLI on macOS, Linux, and Windows runners. Once installed, you can run any [Dapr CLI command]({{< ref cli >}}) to manage your Dapr environments. + +Refer to the [`action.yml` metadata file](https://github.com/dapr/setup-dapr/blob/main/action.yml) for details about all the inputs. ## Example @@ -34,4 +41,8 @@ The `dapr/setup-dapr` action will install the specified version of the Dapr CLI dapr status --kubernetes working-directory: ./twitter-sentiment-processor/demos/demo3 -``` \ No newline at end of file +``` + +## Next steps + +Learn more about [GitHub Actions](https://docs.github.com/en/actions). \ No newline at end of file diff --git a/daprdocs/content/en/getting-started/quickstarts/_index.md b/daprdocs/content/en/getting-started/quickstarts/_index.md index efae344ff..67380fa87 100644 --- a/daprdocs/content/en/getting-started/quickstarts/_index.md +++ b/daprdocs/content/en/getting-started/quickstarts/_index.md @@ -27,7 +27,4 @@ Hit the ground running with our Dapr quickstarts, complete with code samples aim | [State Management]({{< ref statemanagement-quickstart.md >}}) | Store a service's data as key/value pairs in supported state stores. | | [Bindings]({{< ref bindings-quickstart.md >}}) | Work with external systems using input bindings to respond to events and output bindings to call operations. | | [Secrets Management]({{< ref secrets-quickstart.md >}}) | Securely fetch secrets. | -| Actors | Coming soon. | -| Observability | Coming soon. | -| Configuration | Coming soon. | -| Distributed Lock | Coming soon. | +| [Resiliency]({{< ref resiliency >}}) | Define and apply fault-tolerance policies to your Dapr API requests. | diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md new file mode 100644 index 000000000..3156dfa9d --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "Resiliency Quickstarts" +linkTitle: "Resiliency" +weight: 100 +description: "Get started with Dapr's resiliency component" +--- \ No newline at end of file diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md new file mode 100644 index 000000000..f338bde8a --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -0,0 +1,1183 @@ +--- +type: docs +title: "Quickstart: Service-to-service resiliency" +linkTitle: "Resiliency: Service-to-service" +weight: 120 +description: "Get started with Dapr's resiliency capabilities via the service invocation API" +--- + +{{% alert title="Note" color="primary" %}} + Resiliency is currently a preview feature. +{{% /alert %}} + +Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: + +- Run two microservice applications: `checkout` and `order-processor`. `checkout` will continuously make Dapr service invocation requests to `order-processor`. +- Trigger the resiliency spec by simulating a system failure. +- Remove the failure to allow the microservice application to recover. + +Diagram showing the resiliency applied to Dapr APIs + +Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. + +{{< tabs "Python" "JavaScript" ".NET" "Java" "Go" >}} + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run `order-processor` service + +In a terminal window, from the root of the Quickstart directory, navigate to `order-processor` directory. + +```bash +cd ../service_invocation/python/http/order-processor +``` + +Install dependencies: + +```bash +pip3 install -r requirements.txt +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 8001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- python3 app.py +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. + +```bash +cd ../service_invocation/python/http/checkout +``` + +Install dependencies: + +```bash +pip3 install -r requirements.txt +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- python3 app.py +``` + +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the `order-processor` service is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off with accepting order requests. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 8001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- python3 app.py +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest Node.js installed](https://nodejs.org/download/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart directory, +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/javascript/http/order-processor +``` + +Install dependencies: + +```bash +npm install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 5001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- npm start +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart directory, +navigate to the `checkout` directory. + +```bash +cd service_invocation/javascript/http/checkout +``` + +Install dependencies: + +```bash +npm install +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- npm start +``` + +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 5001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- npm start +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [.NET SDK or .NET 6 SDK installed](https://dotnet.microsoft.com/download). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart directory, +navigate to `order-processor` directory. + + +```bash +cd ../service_invocation/csharp/http/order-processor +``` + +Install dependencies: + +```bash +dotnet restore +dotnet build +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 7001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- dotnet run +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart directory, +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/csharp/http/checkout +``` + +Install dependencies: + +```bash +dotnet restore +dotnet build +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- dotnet run +``` + +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 7001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- dotnet run +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- Java JDK 11 (or greater): + - [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11), or + - OpenJDK +- [Apache Maven](https://maven.apache.org/install.html), version 3.x. + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart directory, +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/java/http/order-processor +``` + +Install dependencies: + +```bash +mvn clean install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart directory, +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/java/http/checkout +``` + +Install dependencies: + +```bash +mvn clean install +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar +``` + +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest version of Go](https://go.dev/dl/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart directory, +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/go/http/order-processor +``` + +Install dependencies: + +```bash +go build . +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 6001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- go run . +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart directory, +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/go/http/checkout +``` + +Install dependencies: + +```bash +go build . +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- go run . +``` + +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 6001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- go run . +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Tell us what you think! +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps +Visit [this](https://docs.dapr.io/operations/resiliency/resiliency-overview//) link for more information about Dapr resiliency. + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md new file mode 100644 index 000000000..ef34f4a69 --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -0,0 +1,880 @@ +--- +type: docs +title: "Quickstart: Service-to-component resiliency" +linkTitle: "Resiliency: Service-to-component" +weight: 110 +description: "Get started with Dapr's resiliency capabilities via the state management API" +--- + +{{% alert title="Note" color="primary" %}} + Resiliency is currently a preview feature. +{{% /alert %}} + +Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: + +- Execute a microservice application with resiliency enabled that continuously persists and retrieves state via Dapr's state management API. +- Trigger resiliency policies by simulating a system failure. +- Resolve the failure and the microservice application will resume. + +Diagram showing the resiliency applied to Dapr APIs + +Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. + +{{< tabs "Python" "JavaScript" ".NET" "Java" "Go" >}} + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/python/sdk/order-processor +``` + +Install dependencies + +```bash +pip3 install -r requirements.txt +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- python3 +``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. + +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command to stop Redis: + +```bash +docker stop dapr_redis +``` + +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest Node.js installed](https://nodejs.org/download/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/javascript/sdk/order-processor +``` + +Install dependencies + +```bash +npm install +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- npm start +``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. + +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command to stop Redis: + +```bash +docker stop dapr_redis +``` + +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [.NET SDK or .NET 6 SDK installed](https://dotnet.microsoft.com/download). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/csharp/sdk/order-processor +``` + +Install dependencies + +```bash +dotnet restore +dotnet build +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- dotnet run +``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. + +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command to stop Redis: + +```bash +docker stop dapr_redis +``` + +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- Java JDK 11 (or greater): + - [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11), or + - OpenJDK +- [Apache Maven](https://maven.apache.org/install.html), version 3.x. + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/java/sdk/order-processor +``` + +Install dependencies + +```bash +mvn clean install +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. + +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command to stop Redis: + +```bash +docker stop dapr_redis +``` + +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest version of Go](https://go.dev/dl/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/go/sdk/order-processor +``` + +Install dependencies + +```bash +go build . +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components -- go run . +``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. + +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command to stop Redis: + +```bash +docker stop dapr_redis +``` + +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output belows shows the logs from the `order-processor` service: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Tell us what you think! +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps + +Learn more about [the resiliency feature]({{< ref resiliency-overview.md >}}) and how it works with Dapr's building block APIs. + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} diff --git a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md index df08db4ca..7e394d708 100644 --- a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md +++ b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md @@ -64,9 +64,7 @@ For Kubernetes: {{% /codetab %}} {{% codetab %}} - -Verify you have an [Azure subscription](https://azure.microsoft.com/free/). - +Verify you have an Azure subscription. 1. Open and log into the [Azure portal](https://ms.portal.azure.com/#create/Microsoft.Cache) to start the Azure Redis Cache creation flow. 1. Fill out the necessary information. diff --git a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md b/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md index c1242eaf8..068780d3b 100644 --- a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md +++ b/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md @@ -174,11 +174,8 @@ spec: - name: component volumeMounts: # required, the sockets volume mount - name: dapr-unix-domain-socket - mountPath: /dapr-unix-domain-sockets + mountPath: /tmp/dapr-components-sockets image: YOUR_IMAGE_GOES_HERE:YOUR_IMAGE_VERSION - env: - - name: DAPR_COMPONENTS_SOCKETS_FOLDER # Tells the component where the sockets should be created. - value: /dapr-unix-domain-sockets ``` Before applying the deployment, let's add one more configuration: the component spec. diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md index 6691c742c..0b2139fdd 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md @@ -14,9 +14,12 @@ To address this issue the Dapr sidecar has an endpoint to `Shutdown` the sidecar When running a basic [Kubernetes Job](https://kubernetes.io/docs/concepts/workloads/controllers/job/) you will need to call the `/shutdown` endpoint for the sidecar to gracefully stop and the job will be considered `Completed`. -When a job is finish without calling `Shutdown` your job will be in a `NotReady` state with only the `daprd` container running endlessly. +When a job is finished without calling `Shutdown`, your job will be in a `NotReady` state with only the `daprd` container running endlessly. -Be sure and use the *POST* HTTP verb when calling the shutdown API. +Stopping the dapr sidecar will cause its readiness and liveness probes to fail in your container because the dapr sidecar was shutdown. +To prevent Kubernetes from trying to restart your job, set your job's `restartPolicy` to `Never`. + +Be sure to use the *POST* HTTP verb when calling the shutdown HTTP API. ```yaml apiVersion: batch/v1 @@ -37,7 +40,7 @@ spec: restartPolicy: Never ``` -You can also call the `Shutdown` from any of the Dapr SDK +You can also call the `Shutdown` from any of the Dapr SDKs ```go package main diff --git a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md index 0fdf85a6a..8bbe050cd 100644 --- a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md +++ b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-no-docker.md @@ -6,36 +6,49 @@ weight: 30000 description: "How to deploy and run Dapr in self-hosted mode without Docker installed on the local machine" --- -This article provides guidance on running Dapr in self-hosted mode without Docker. - ## Prerequisites -- [Dapr CLI]({{< ref "install-dapr-selfhost.md#installing-dapr-cli" >}}) +- [Install the Dapr CLI]({{< ref "install-dapr-selfhost.md#installing-dapr-cli" >}}) ## Initialize Dapr without containers -The Dapr CLI provides an option to initialize Dapr using slim init, without the default creation of a development environment which has a dependency on Docker. To initialize Dapr with slim init, after installing the Dapr CLI use the following command: +The Dapr CLI provides an option to initialize Dapr using slim init, without the default creation of a development environment with a dependency on Docker. To initialize Dapr with slim init, after installing the Dapr CLI, use the following command: ```bash dapr init --slim ``` -In this mode two different binaries are installed `daprd` and `placement`. The `placement` binary is needed to enable [actors]({{< ref "actors-overview.md" >}}) in a Dapr self-hosted installation. +Two different binaries are installed: +- `daprd` +- `placement` -In this mode no default components such as Redis are installed for state management or pub/sub. This means, that aside from [Service Invocation]({{< ref "service-invocation-overview.md" >}}), no other building block functionality is available on install out of the box. Users are free to setup their own environment and custom components. Furthermore, actor based service invocation is possible if a state store is configured as explained in the following sections. +The `placement` binary is needed to enable [actors]({{< ref "actors-overview.md" >}}) in a Dapr self-hosted installation. -## Service invocation -See [this sample](https://github.com/dapr/samples/tree/master/hello-dapr-slim) for an example on how to perform service invocation in this mode. +In slim init mode, no default components (such as Redis) are installed for state management or pub/sub. This means that, aside from [service invocation]({{< ref "service-invocation-overview.md" >}}), no other building block functionality is available "out-of-the-box" on install. Instead, you can set up your own environment and custom components. -## Enabling state management or pub/sub +Actor-based service invocation is possible if a state store is configured, as explained in the following sections. -See configuring Redis in self-hosted mode [without docker](https://redis.io/topics/quickstart) to enable a local state store or pub/sub broker for messaging. +## Perform service invocation +See [the _Hello Dapr slim_ sample](https://github.com/dapr/samples/tree/master/hello-dapr-slim) for an example on how to perform service invocation in slim init mode. -## Enabling actors +## Enable state management or pub/sub -The placement service must be run locally to enable actor placement. Also, a [transactional state store that supports ETags]({{< ref "supported-state-stores.md" >}}) must be enabled to use actors, for example, [Redis configured in self-hosted mode](https://redis.io/topics/quickstart). +See documentation around [configuring Redis in self-hosted mode without Docker](https://redis.io/topics/quickstart) to enable a local state store or pub/sub broker for messaging. -By default for Linux/MacOS the `placement` binary is installed in `/$HOME/.dapr/bin` or for Windows at `%USERPROFILE%\.dapr\bin`. +## Enable actors + +To enable actor placement: +- Run the placement service locally. +- Enable a [transactional state store that supports ETags]({{< ref "supported-state-stores.md" >}}) to use actors. For example, [Redis configured in self-hosted mode](https://redis.io/topics/quickstart). + +By default, the `placement` binary is installed in: + +- For Linux/MacOS: `/$HOME/.dapr/bin` +- For Windows: `%USERPROFILE%\.dapr\bin` + +{{< tabs "Linux/MacOS" "Windows">}} + +{{% codetab %}} ```bash $ $HOME/.dapr/bin/placement @@ -51,16 +64,48 @@ INFO[0001] leader is established. instance=Nicoletaz-L10. ``` -From here on you can follow the sample example created for the [java-sdk](https://github.com/dapr/java-sdk/tree/master/examples/src/main/java/io/dapr/examples/actors), [python-sdk](https://github.com/dapr/python-sdk/tree/master/examples/demo_actor) or [dotnet-sdk]({{< ref "dotnet-actors-howto.md" >}}) for running an application with Actors enabled. +{{% /codetab %}} -Update the state store configuration files to have the Redis host and password match the setup that you have. Additionally to enable it as a actor state store have the metadata piece added similar to the [sample Java Redis component](https://github.com/dapr/java-sdk/blob/master/examples/components/state/redis.yaml) definition. +{{% codetab %}} + +When running standalone placement on Windows, specify port 6050: + +```bash +%USERPROFILE%/.dapr/bin/placement.exe -port 6050 + +time="2022-10-17T14:56:55.4055836-05:00" level=info msg="starting Dapr Placement Service -- version 1.9.0 -- commit fdce5f1f1b76012291c888113169aee845f25ef8" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:55.4066226-05:00" level=info msg="log level set to: info" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:55.4067306-05:00" level=info msg="metrics server started on :9090/" instance=LAPTOP-OMK50S19 scope=dapr.metrics type=log ver=1.9.0 +time="2022-10-17T14:56:55.4077529-05:00" level=info msg="Raft server is starting on 127.0.0.1:8201..." instance=LAPTOP-OMK50S19 scope=dapr.placement.raft type=log ver=1.9.0 +time="2022-10-17T14:56:55.4077529-05:00" level=info msg="placement service started on port 6050" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:55.4082772-05:00" level=info msg="Healthz server is listening on :8080" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:56.8232286-05:00" level=info msg="cluster leadership acquired" instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 +time="2022-10-17T14:56:56.8232286-05:00" level=info msg="leader is established." instance=LAPTOP-OMK50S19 scope=dapr.placement type=log ver=1.9.0 + +``` + +{{% /codetab %}} + +{{< /tabs >}} + +Now, to run an application with actors enabled, you can follow the sample example created for: +- [java-sdk](https://github.com/dapr/java-sdk/tree/master/examples/src/main/java/io/dapr/examples/actors) +- [python-sdk](https://github.com/dapr/python-sdk/tree/master/examples/demo_actor) +- [dotnet-sdk]({{< ref "dotnet-actors-howto.md" >}}) + +Update the state store configuration files to match the Redis host and password with your setup. + +Enable it as a actor state store by making the metadata piece similar to the [sample Java Redis component](https://github.com/dapr/java-sdk/blob/master/examples/components/state/redis.yaml) definition. ```yaml - name: actorStateStore value: "true" ``` +## Clean up -## Cleanup +When finished, remove the binaries by following [Uninstall Dapr in a self-hosted environment]({{< ref self-hosted-uninstall >}}) to remove the binaries. -Follow the uninstall [instructions]({{< ref "install-dapr-selfhost.md#uninstall-dapr-in-a-self-hosted-mode" >}}) to remove the binaries. +## Next steps +- Run Dapr with [Podman]({{< ref self-hosted-with-podman.md >}}), using the default [Docker]({{< ref install-dapr-selfhost.md >}}), or in an [airgap environment]({{< ref self-hosted-airgap.md >}}) +- [Upgrade Dapr in self-hosted mode]({{< ref self-hosted-upgrade >}}) \ No newline at end of file diff --git a/daprdocs/content/en/operations/monitoring/logging/fluentd.md b/daprdocs/content/en/operations/monitoring/logging/fluentd.md index 4dbd1d171..b456b8d95 100644 --- a/daprdocs/content/en/operations/monitoring/logging/fluentd.md +++ b/daprdocs/content/en/operations/monitoring/logging/fluentd.md @@ -32,25 +32,25 @@ description: "How to install Fluentd, Elastic Search, and Kibana to search logs By default, the chart creates 3 replicas which must be on different nodes. If your cluster has fewer than 3 nodes, specify a smaller number of replicas. For example, this sets the number of replicas to 1: ```bash - helm install elasticsearch elastic/elasticsearch -n dapr-monitoring --set replicas=1 + helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set replicas=1 ``` Otherwise: ```bash - helm install elasticsearch elastic/elasticsearch -n dapr-monitoring + helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring ``` If you are using minikube or simply want to disable persistent volumes for development purposes, you can do so by using the following command: ```bash - helm install elasticsearch elastic/elasticsearch -n dapr-monitoring --set persistence.enabled=false,replicas=1 + helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set persistence.enabled=false,replicas=1 ``` 4. Install Kibana ```bash - helm install kibana elastic/kibana -n dapr-monitoring + helm install kibana elastic/kibana --version 7.17.3 -n dapr-monitoring ``` 5. Ensure that Elastic Search and Kibana are running in your Kubernetes cluster diff --git a/daprdocs/content/en/operations/monitoring/metrics/grafana.md b/daprdocs/content/en/operations/monitoring/metrics/grafana.md index 7bdc29ead..edbd807bd 100644 --- a/daprdocs/content/en/operations/monitoring/metrics/grafana.md +++ b/daprdocs/content/en/operations/monitoring/metrics/grafana.md @@ -42,6 +42,7 @@ The `grafana-actor-dashboard.json` template shows Dapr Sidecar status, actor inv ```bash helm repo add grafana https://grafana.github.io/helm-charts + helm repo update ``` 1. Install the chart: @@ -176,4 +177,4 @@ First you need to connect Prometheus as a data source to Grafana.
-
\ No newline at end of file + diff --git a/daprdocs/content/en/operations/resiliency/resiliency-overview.md b/daprdocs/content/en/operations/resiliency/resiliency-overview.md index bbca61db5..fea52eca2 100644 --- a/daprdocs/content/en/operations/resiliency/resiliency-overview.md +++ b/daprdocs/content/en/operations/resiliency/resiliency-overview.md @@ -9,8 +9,6 @@ description: "Configure Dapr retries, timeouts, and circuit breakers" Resiliency is currently a preview feature. Before you can utilize a resiliency spec, you must first [enable the resiliency preview feature]({{< ref support-preview-features >}}). {{% /alert %}} -Distributed applications are commonly comprised of many microservices, with dozens, even hundreds, of instances for any given application. With so many microservices, the likelihood of a system failure increases. For example, an instance can fail or be unresponsive due to hardware, an overwhelming number of requests, application restarts/scale outs, or several other reasons. These events can cause a network call between services to fail. Designing and implementing your application with fault tolerance, the ability to detect, mitigate, and respond to failures, allows your application to recover to a functioning state and become self healing. - Dapr provides a capability for defining and applying fault tolerance resiliency policies via a [resiliency spec]({{< ref "resiliency-overview.md#complete-example-policy" >}}). Resiliency specs are saved in the same location as components specs and are applied when the Dapr sidecar starts. The sidecar determines how to apply resiliency policies to your Dapr API calls. In self-hosted mode, the resiliency spec must be named `resiliency.yaml`. In Kubernetes Dapr finds the named resiliency specs used by your application. Within the resiliency spec, you can define policies for popular resiliency patterns, such as: - [Timeouts]({{< ref "policies.md#timeouts" >}}) diff --git a/daprdocs/content/en/operations/support/support-preview-features.md b/daprdocs/content/en/operations/support/support-preview-features.md index 72cfb47ab..224d2e065 100644 --- a/daprdocs/content/en/operations/support/support-preview-features.md +++ b/daprdocs/content/en/operations/support/support-preview-features.md @@ -17,7 +17,6 @@ For CLI there is no explicit opt-in, just the version that this was first made a | ---------- |-------------|---------|---------------|-----------------| | **`--image-registry`** flag in Dapr CLI| In self hosted mode you can set this flag to specify any private registry to pull the container images required to install Dapr| N/A | [CLI init command reference]({{}}) | v1.7 | | **Resiliency** | Allows configuring of fine-grained policies for retries, timeouts and circuitbreaking. | `Resiliency` | [Configure Resiliency Policies]({{}}) | v1.7| -| **Service invocation without default `content-type`** | When enabled removes the default service invocation content-type header value `application/json` when no content-type is provided. This will become the default behavior in release v1.9.0. This requires you to explicitly set content-type headers where required for your apps. | `ServiceInvocation.NoDefaultContentType` | [Service Invocation]({{}}) | v1.7 | | **App Middleware** | Allow middleware components to be executed when making service-to-service calls | N/A | [App Middleware]({{}}) | v1.9 | | **App health checks** | Allows configuring app health checks | `AppHealthCheck` | [App health checks]({{}}) | v1.9 | | **Pluggable components** | Allows creating self-hosted gRPC-based components written in any language that supports gRPC. The following component APIs are supported: State stores, Pub/sub, Bindings | N/A | [Pluggable components concept]({{}})| v1.9 | diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index b6411eaf2..d83034d58 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,13 +34,20 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| -| October 13th 2022 | 1.9.0
| 1.9.0 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| December 2nd 2022 | 1.9.5
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| November 17th 2022 | 1.9.4
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| October 26th 2022 | 1.9.1
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| October 13th 2022 | 1.9.0
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| October 26th 2022 | 1.8.6
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | October 13th 2022 | 1.8.5
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | August 10th 2022 | 1.8.4
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 29th 2022 | 1.8.3
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 21st 2022 | 1.8.2
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 20th 2022 | 1.8.1
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | | July 7th 2022 | 1.8.0
| 1.8.0 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | +| October 26th 2022 | 1.7.5
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.2.1 | 0.10.0 | Supported | | May 31st 2022 | 1.7.4
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.2.1 | 0.10.0 | Supported | | May 17th 2022 | 1.7.3
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.2.1 | 0.10.0 | Supported | | Apr 22th 2022 | 1.7.2
| 1.7.0 | Java 1.5.0
Go 1.4.0
PHP 1.1.0
Python 1.6.0
.NET 1.7.0
JS 2.1.0 | 0.10.0 | Supported | @@ -70,19 +77,18 @@ General guidance on upgrading can be found for [self hosted mode]({{< ref self-h | Current Runtime version | Must upgrade through | Target Runtime version | |--------------------------|-----------------------|------------------------- | -| 1.4.0 to 1.4.2 | N/A | 1.4.4 | -| | 1.4.4 | 1.5.2 | -| | 1.5.2 | 1.6.0 | -| | 1.6.0 | 1.6.2 | -| | 1.6.0 | 1.7.4 | | 1.5.0 to 1.5.2 | N/A | 1.6.0 | | | 1.6.0 | 1.6.2 | -| | 1.6.0 | 1.7.4 | -| 1.6.0 | N/A | 1.6.2 | -| 1.6.0 | N/A | 1.7.4 | -| 1.7.0 to 1.7.4 | N/A | 1.8.0 | -| 1.8.0 | N/A | 1.8.5 | -| 1.9.0 | N/A | 1.9.0 | +| | 1.6.2 | 1.7.5 | +| | 1.7.5 | 1.8.6 | +| | 1.8.6 | 1.9.5 | +| 1.6.0 to 1.6.2 | N/A | 1.7.5 | +| | 1.7.5 | 1.8.6 | +| | 1.8.6 | 1.9.5 | +| 1.7.0 to 1.7.5 | N/A | 1.8.6 | +| | 1.8.6 | 1.9.5 | +| 1.8.0 to 1.8.6 | N/A | 1.9.5 | +| 1.9.0 | N/A | 1.9.5 | ## Breaking changes and deprecations diff --git a/daprdocs/content/en/reference/api/distributed_lock_api.md b/daprdocs/content/en/reference/api/distributed_lock_api.md index ba250e3ae..f79270218 100644 --- a/daprdocs/content/en/reference/api/distributed_lock_api.md +++ b/daprdocs/content/en/reference/api/distributed_lock_api.md @@ -21,7 +21,7 @@ POST http://localhost:/v1.0-alpha1/lock/ Parameter | Description --------- | ----------- `daprPort` | The Dapr port -`storename` | The `metadata.name` field component file. Refer to the [component schema] ({{< ref component-schema.md>}}) +`storename` | The `metadata.name` field component file. Refer to the [component schema]({{< ref component-schema.md >}}) #### Query Parameters @@ -95,7 +95,7 @@ POST http://localhost:/v1.0-alpha1/unlock/ Parameter | Description --------- | ----------- `daprPort` | The Dapr port -`storename` | The `metadata.name` field component file. Refer to the [component schema] ({{< ref component-schema.md>}}) +`storename` | The `metadata.name` field component file. Refer to the [component schema]({{< ref component-schema.md >}}) #### Query Parameters diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md b/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md index d422a19c7..a7f9a3c99 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/eventgrid.md @@ -44,7 +44,7 @@ spec: - name: accessKey value: "[AccessKey]" - name: topicEndpoint - value: "[TopicEndpoint] + value: "[TopicEndpoint]" ``` {{% alert title="Warning" color="warning" %}} @@ -102,7 +102,7 @@ _Make sure to also to add quotes around the `[HandshakePort]` in your Event Grid ```bash # Using random port 9000 as an example -ngrok http -host-header=localhost 9000 +ngrok http --host-header=localhost 9000 ``` - Configure the ngrok's HTTPS endpoint and custom port to input binding metadata diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md index 8fabd7bc3..8fe7638e0 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/redis.md @@ -66,10 +66,14 @@ The above example uses secrets as plain strings. It is recommended to use a secr This component supports **output binding** with the following operations: - `create` +- `get` +- `delete` + +### create You can store a record in Redis using the `create` operation. This sets a key to hold a value. If the key already exists, the value is overwritten. -### Request +#### Request ```json { @@ -84,10 +88,58 @@ You can store a record in Redis using the `create` operation. This sets a key to } ``` -### Response +#### Response An HTTP 204 (No Content) and empty body is returned if successful. +### get + +You can get a record in Redis using the `get` operation. This gets a key that was previously set. + +#### Request + +```json +{ + "operation": "get", + "metadata": { + "key": "key1" + }, + "data": { + } +} +``` + +#### Response + +```json +{ + "data": { + "Hello": "World", + "Lorem": "Ipsum" + } +} +``` + +### delete + +You can delete a record in Redis using the `delete` operation. Returns success whether the key exists or not. + +#### Request + +```json +{ + "operation": "delete", + "metadata": { + "key": "key1" + } +} +``` + +#### Response + +An HTTP 204 (No Content) and empty body is returned if successful. + + ## Create a Redis instance Dapr can use any Redis instance - containerized, running on your local dev machine, or a managed cloud service, provided the version of Redis is 5.0.0 or later. diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md b/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md index 94d7ea96b..b9d2113c1 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md @@ -32,7 +32,7 @@ spec: # - name: decodeBase64 # value: "false" # - name: endpoint -# value: "http://127.0.0.1:10000" +# value: "http://127.0.0.1:10001" ``` {{% alert title="Warning" color="warning" %}} @@ -48,7 +48,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | `queueName` | Y | Input/Output | The name of the Azure Storage queue | `"myqueue"` | | `ttlInSeconds` | N | Output | Parameter to set the default message time to live. If this parameter is omitted, messages will expire after 10 minutes. See [also](#specifying-a-ttl-per-message) | `"60"` | | `decodeBase64` | N | Output | Configuration to decode base64 file content before saving to Blob Storage. (In case of saving a file with binary content). `true` is the only allowed positive value. Other positive variations like `"True", "1"` are not acceptable. Defaults to `false` | `true`, `false` | -| `endpoint` | N | Input/Output | Optional custom endpoint URL. This is useful when using the [Azurite emulator](https://github.com/Azure/azurite) or when using custom domains for Azure Storage (although this is not officially supported). The endpoint must be the full base URL, including the protocol (`http://` or `https://`), the IP or FQDN, and optional port. | `"http://127.0.0.1:10000"` or `"https://accountName.queue.example.com"` | +| `endpoint` | N | Input/Output | Optional custom endpoint URL. This is useful when using the [Azurite emulator](https://github.com/Azure/azurite) or when using custom domains for Azure Storage (although this is not officially supported). The endpoint must be the full base URL, including the protocol (`http://` or `https://`), the IP or FQDN, and optional port. | `"http://127.0.0.1:10001"` or `"https://accountName.queue.example.com"` | ### Azure Active Directory (Azure AD) authentication diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md index 0817524ef..86d4a350c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md @@ -34,6 +34,8 @@ spec: secretKeyRef: name: kafka-secrets key: saslPasswordSecret + - name: saslMechanism + value: "SHA-512" - name: maxMessageBytes # Optional. value: 1024 - name: consumeRetryInterval # Optional. @@ -55,6 +57,7 @@ spec: | authType | Y | Configure or disable authentication. Supported values: `none`, `password`, `mtls`, or `oidc` | `"password"`, `"none"` | saslUsername | N | The SASL username used for authentication. Only required if `authType` is set to `"password"`. | `"adminuser"` | saslPassword | N | The SASL password used for authentication. Can be `secretKeyRef` to use a [secret reference]({{< ref component-secrets.md >}}). Only required if `authType is set to `"password"`. | `""`, `"KeFg23!"` +| saslMechanism | N | The SASL Authentication Mechanism you wish to use. Only required if `authType` is set to `"password"`. Defaults to `PLAINTEXT` | `"SHA-512", "SHA-256", "PLAINTEXT"` | initialOffset | N | The initial offset to use if no offset was previously committed. Should be "newest" or "oldest". Defaults to "newest". | `"oldest"` | maxMessageBytes | N | The maximum size in bytes allowed for a single Kafka message. Defaults to 1024. | `2048` | consumeRetryInterval | N | The interval between retries when attempting to consume topics. Treats numbers without suffix as milliseconds. Defaults to 100ms. | `200ms` | @@ -111,8 +114,7 @@ spec: #### SASL Password -Setting `authType` to `password` enables [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication using the **PLAIN** mechanism. This requires setting -the `saslUsername` and `saslPassword` fields. +Setting `authType` to `password` enables [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication. This requires setting the `saslUsername` and `saslPassword` fields. ```yaml apiVersion: dapr.io/v1alpha1 @@ -137,6 +139,8 @@ spec: secretKeyRef: name: kafka-secrets key: saslPasswordSecret + - name: saslMechanism + value: "SHA-512" - name: maxMessageBytes # Optional. value: 1024 - name: consumeRetryInterval # Optional. diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md index 16962d4f5..b26bd27c9 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md @@ -7,6 +7,10 @@ aliases: - "/operations/components/setup-pubsub/supported-pubsub/setup-hazelcast/" --- +{{% alert title="Deprecation notice" color="warning" %}} +The Hazelcast PubSub component has been deprecated due to inherent lack of support for "at least once" delivery guarantee, and will be removed in a future Dapr release. +{{% /alert %}} + ## Component format To setup hazelcast pubsub create a component of type `pubsub.hazelcast`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration. diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md index 250e681a8..1fbfa6105 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md @@ -49,8 +49,6 @@ The above example uses secrets as plain strings. It is recommended to use a secr | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientKey | Required for using TLS | TLS client key in PEM format. Must be used with `clientCert`. Can be `secretKeyRef` to use a secret reference. | `"-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----"` -| backOffMaxRetries | N | The maximum number of retries to process the message before returning an error. Defaults to `"0"`, which means that no retries will be attempted. `"-1"` can be specified to indicate that messages should be retried indefinitely until they are successfully processed or the application is shutdown. The component will wait 5 seconds between retries. | `"3"` - ### Communication using TLS To configure communication using TLS, ensure that the MQTT broker (e.g. mosquitto) is configured to support certificates and provide the `caCert`, `clientCert`, `clientKey` metadata in the component configuration. For example: diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md index 4c21f190f..e57aece7b 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/aws-secret-manager.md @@ -2,7 +2,7 @@ type: docs title: "AWS Secrets Manager" linkTitle: "AWS Secrets Manager" -description: Detailed information on the decret store component +description: Detailed information on the secret store component aliases: - "/operations/components/setup-secret-store/supported-secret-stores/aws-secret-manager/" --- diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md index 9c1f63bd7..ce2e801f4 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/azure-keyvault.md @@ -53,7 +53,7 @@ Additionally, you must provide the authentication fields as explained in the [Au ### Prerequisites -- [Azure Subscription](https://azure.microsoft.com/free/) +- Azure Subscription - [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) - [jq](https://stedolan.github.io/jq/download/) - The scripts below are optimized for a bash or zsh shell diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md index 3c7a9bb4f..19eaebdbd 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md @@ -54,17 +54,17 @@ The above example uses secrets as plain strings. It is recommended to use a loca | Field | Required | Details | Example | |--------------------|:--------:|--------------------------------|---------------------| | vaultAddr | N | The address of the Vault server. Defaults to `"https://127.0.0.1:8200"` | `"https://127.0.0.1:8200"` | -| caCert | N | Certificate Authority use only one of the options. The encoded cacerts to use | `"cacerts"` | -| caPath | N | Certificate Authority use only one of the options. The path to a CA cert file | `"path/to/cacert/file"` | -| caPem | N | Certificate Authority use only one of the options. The encoded cacert pem to use | `"encodedpem"` | +| caPem | N | The inlined contents of the CA certificate to use, in PEM format. If defined, takes precedence over `caPath` and `caCert`. | See below | +| caPath | N | The path to a folder holding the CA certificate file to use, in PEM format. If the folder contains multiple files, only the first file found will be used. If defined, takes precedence over `caCert`. | `"path/to/cacert/holding/folder"` | +| caCert | N | The path to the CA certificate to use, in PEM format. | `""path/to/cacert.pem"` | | skipVerify | N | Skip TLS verification. Defaults to `"false"` | `"true"`, `"false"` | -| tlsServerName | N | TLS config server name | `"tls-server"` | +| tlsServerName | N | The name of the server requested during TLS handshake in order to support virtual hosting. This value is also used to verify the TLS certificate presented by Vault server. | `"tls-server"` | | vaultTokenMountPath | Y | Path to file containing token | `"path/to/file"` | | vaultToken | Y | [Token](https://learn.hashicorp.com/tutorials/vault/tokens) for authentication within Vault. | `"tokenValue"` | | vaultKVPrefix | N | The prefix in vault. Defaults to `"dapr"` | `"dapr"`, `"myprefix"` | | vaultKVUsePrefix | N | If false, vaultKVPrefix is forced to be empty. If the value is not given or set to true, vaultKVPrefix is used when accessing the vault. Setting it to false is needed to be able to use the BulkGetSecret method of the store. | `"true"`, `"false"` | | enginePath | N | The [engine](https://www.vaultproject.io/api-docs/secret/kv/kv-v2) path in vault. Defaults to `"secret"` | `"kv"`, `"any"` | -| vaultValueType | N | Vault value type. `map` means to parse the value into `map[string]string`, `text` means to use the value as a string. 'map' sets the `multipleKeyValuesPerSecret` behavior. `text' makes Vault behave as a secret store with name/value semantics. Defaults to `"map"` | `"map"`, `"text"` | +| vaultValueType | N | Vault value type. `map` means to parse the value into `map[string]string`, `text` means to use the value as a string. 'map' sets the `multipleKeyValuesPerSecret` behavior. `text` makes Vault behave as a secret store with name/value semantics. Defaults to `"map"` | `"map"`, `"text"` | ## Setup Hashicorp Vault instance @@ -109,9 +109,37 @@ $ curl http://localhost:3501/v1.0/secrets/my-hashicorp-vault/mysecret } ``` -Notice that the name of the secret (`mysecret`) is not repeated in the result. +Notice that the name of the secret (`mysecret`) is not repeated in the result. +## TLS Server verification + +The fields `skipVerify`, `tlsServerName`, `caCert`, `caPath`, and `caPem` control if and how Dapr verifies the vault server's certificate while connecting using TLS/HTTPS. + +### Inline CA PEM caPem + +The `caPem` field value should be the contents of the PEM CA certificate you want to use. Given PEM certificates are made of multiple lines, defining that value might seem challenging at first. YAML allows for a few ways of [defining a multiline values](https://yaml-multiline.info/). + +Below is one way to define a `caPem` field. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: vault +spec: + type: secretstores.hashicorp.vault + version: v1 + metadata: + - name: vaultAddr + value: https://127.0.0.1:8200 + - name: caPem + value: |- + -----BEGIN CERTIFICATE----- + << the rest of your PEM file content's here, indented appropriately. >> + -----END CERTIFICATE----- +``` + ## Related links - [Secrets building block]({{< ref secrets >}}) - [How-To: Retrieve a secret]({{< ref "howto-secrets.md" >}}) diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md index caf8fb0ee..2c7a4651c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md @@ -168,62 +168,6 @@ az cosmosdb sql role assignment create \ --role-definition-id "$ROLE_ID" ``` -### Creating the stored procedures for Dapr - -When using Cosmos DB as a state store for Dapr, we need to create two stored procedures in your collection. When you configure the state store using a "master key", Dapr creates those for you, automatically. However, when your state store authenticates with Cosmos DB using Azure AD, because of limitations in the platform we are not able to do it automatically. - -If you are using Azure AD to authenticate your Cosmos DB state store and have not created the stored procedures (or if you are using an outdated version of them), your Dapr sidecar will fail to start and you will see an error similar to this in your logs: - -```text -Dapr requires stored procedures created in Cosmos DB before it can be used as state store. Those stored procedures are currently not existing or are using a different version than expected. When you authenticate using Azure AD we cannot automatically create them for you: please start this state store with a Cosmos DB master key just once so we can create the stored procedures for you; otherwise, you can check our docs to learn how to create them yourself: https://aka.ms/dapr/cosmosdb-aad -``` - -To fix this issue, you have two options: - -1. Configure your component to authenticate with the "master key" just once, to have Dapr automatically initialize the stored procedures for you. While you need to use a "master key" the first time you launch your application, you should be able to remove that and use Azure AD credentials (including Managed Identities) after. -2. Alternatively, you can follow the steps below to create the stored procedures manually. These steps must be performed before you can start your application the first time. - -To create the stored procedures manually, you can use the commands below. - -First, download the code of the stored procedures for the version of Dapr that you're using. This will create two `.js` files in your working directory: - -```sh -# Set this to the version of Dapr that you're using -DAPR_VERSION="release-{{% dapr-latest-version short="true" %}}" -curl -LfO "https://raw.githubusercontent.com/dapr/components-contrib/${DAPR_VERSION}/state/azure/cosmosdb/storedprocedures/__daprver__.js" -curl -LfO "https://raw.githubusercontent.com/dapr/components-contrib/${DAPR_VERSION}/state/azure/cosmosdb/storedprocedures/__dapr_v2__.js" -``` - -> You won't need to update the code for the stored procedures every time you update Dapr. Although the code for the stored procedures doesn't change often, sometimes we may make updates to that: when that happens, if you're using Azure AD authentication your Dapr sidecar will fail to launch until you update the stored procedures, re-running the commands above. - -Then, using the Azure CLI create the stored procedures in Cosmos DB, for your account, database, and collection (or container): - -```sh -# Name of the Resource Group that contains your Cosmos DB -RESOURCE_GROUP="..." -# Name of your Cosmos DB account -ACCOUNT_NAME="..." -# Name of your database in the Cosmos DB account -DATABASE_NAME="..." -# Name of the container (collection) in your database -CONTAINER_NAME="..." - -az cosmosdb sql stored-procedure create \ - --resource-group "$RESOURCE_GROUP" \ - --account-name "$ACCOUNT_NAME" \ - --database-name "$DATABASE_NAME" \ - --container-name "$CONTAINER_NAME" \ - --name "__daprver__" \ - --body @__daprver__.js -az cosmosdb sql stored-procedure create \ - --resource-group "$RESOURCE_GROUP" \ - --account-name "$ACCOUNT_NAME" \ - --database-name "$DATABASE_NAME" \ - --container-name "$CONTAINER_NAME" \ - --name "__dapr_v2__" \ - --body @__dapr_v2__.js -``` - ## Related links - [Basic schema for a Dapr component]({{< ref component-schema >}}) diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md index 4a1eb18ce..3c323b074 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md @@ -230,6 +230,7 @@ Consider an example where you store documents like that: }, "city": "Seattle", "state": "WA" + } } ``` diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index ef757e4b3..58fde998f 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -1,8 +1,8 @@ - component: Hazelcast link: setup-hazelcast - state: Beta + state: Deprecated version: v1 - since: "1.7" + since: "1.9" - component: In Memory link: setup-inmemory state: Beta @@ -43,3 +43,8 @@ state: Stable version: v1 since: "1.7" +- component: RocketMQ + link: setup-rocketmq + state: Alpha + version: v1 + since: "1.8" diff --git a/daprdocs/data/components/state_stores/aws.yaml b/daprdocs/data/components/state_stores/aws.yaml index 81584efb0..65440d580 100644 --- a/daprdocs/data/components/state_stores/aws.yaml +++ b/daprdocs/data/components/state_stores/aws.yaml @@ -6,6 +6,6 @@ features: crud: true transactions: false - etag: false + etag: true ttl: true query: false diff --git a/daprdocs/layouts/shortcodes/dapr-latest-version.html b/daprdocs/layouts/shortcodes/dapr-latest-version.html index db415d450..df0cb50be 100644 --- a/daprdocs/layouts/shortcodes/dapr-latest-version.html +++ b/daprdocs/layouts/shortcodes/dapr-latest-version.html @@ -1 +1 @@ -{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.0{{ else if .Get "cli" }}1.9.0{{ else }}1.9.0{{ end -}} +{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.5{{ else if .Get "cli" }}1.9.0{{ else }}1.9.5{{ end -}} diff --git a/daprdocs/static/images/resiliency-quickstart-svc-component.png b/daprdocs/static/images/resiliency-quickstart-svc-component.png new file mode 100644 index 0000000000000000000000000000000000000000..5dea0e1edf79abcb279fca2a6e398d8f0c2329ee GIT binary patch literal 67679 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 IS8OBx4~!1NI{*Lx literal 0 HcmV?d00001 diff --git a/daprdocs/static/images/resiliency-quickstart-svc-invoke.png b/daprdocs/static/images/resiliency-quickstart-svc-invoke.png new file mode 100644 index 0000000000000000000000000000000000000000..baff0ccfea126f7a71df771b35cf4a20067f957b GIT binary patch literal 68472 zcmeFZg`z10q;-OA8pJq%;Uhw{$Db(B0o2 zyzl4L`-y+x`*|GTFf-Teb*;VDxy}`Po~x2P7anfb{1%8>=CZvpLj7%uY5~Yw~-EPFyS-!V#2;G$0zS< z%}n-AF8s<`{sL!(k%SwY!9ymk#4BIbpP!=zO6J;;1r{CQFqd09PZoSFZHlX&I&P0z z@Y?d_?IDY~dh-j~R<@Z%-_0*=%ZVf&(m2ATcWIc49u;RYcSc}M)f~F3;%=VZX(}EJ zJK9&}s#;SvwJkv!ji2udChz51=6vURfES}nMDl`MQH1Dcwd}ZAuUb=c(ynl-v(~b= z;r4Y4^(Nw`iAO43WOXFXG1!I<)778yd^_vkh1tw+F?OdfOJi@#N&Cx`hu|rh&d{H` zccx0AU*frLCnZZnRHGdE#RSHb5`;(DSfYy9B749%wY`3drH42ZTtd(L3e!;W&yh~s z7wW<8^3TVd-U@AvJt-atzg#Bxtx32!8&Re`D}-)94K7NLPy?GSs9HJJjO*s54J&rfJf-yhZ_8#ppGr#THA$ z{QEKbThtpRHKgU`!T%a&P8JsS&ejet;G>3Y9_YB}C@Tq@IXvbuHFtPu!Q=k; z3F;CwQFmeR@Uex9Db)S3oxQWLyBOoeJA}bw)YH6-(2KXY*oragD62uG9h@wnw|V$@ z_!!0Up-`x(lewj^y3D=5E(d>!FvAtZY7{(pPr|5p6% zN}d0^@`iwr;P03I_R>Eu)pWLSl6H6u)^rj7zpeS};@@BV>q1dp)UE%fieGxZcoryH z9AA|8Uz;Y5pOSfP2n`K}CNCrTz#Sbqf#XeKadxojK;{|2^OOf&QaFI-?u!&pxY(MV zTZa1!#>tVd@O_b*^Cb_rJ&gCaD7_ktRD`09GMNO@-K2<_86aodv}@0!I_-;EV>>#0 z=Xdoi;mh0AsTMbny%#)EGJg&-E8#-@(J=nYFaKt&NU;>($guzV4)DS-21M)t`oBJf z7lP|~ka49I^5510pF*-Tee=Hyf`(B`0$rSW`H-3Xzle&G5Y`je{l6qVkn&Fp=6w;N z^go0}lOz_${2yyf6QBps)w18?NBobKfI=?)k2U=NpF;k$g#V|Ie;CvM{}e(Ag`uHC zNMLA)MOQsvF_i$ zLO#O!9Bp4LUlqFgYgI=Q>%rUvyUFT`mKb$)_1Wc|f>^c`cd5kNkM+#GZfWfxM>OU; z->}Kc%NMz=8-38siOqcXPVvp{$H@M=v!fM$_YD&-q2bzIIn0Isv>-btOff8jHCGaK z{~O`37*5ShkL`K&cPg|Z1BZu)8Qk1Fm5UkirAMES*Q&D2nnU4=#Dwk?f-#m;Ke`%k zqm=fy@PF$t5)0Qe+OCQ20?2r%J|m0T%^RN)MkXY1+_dZn?@AUK`(RjP{@iCi6fu4H>L`nijZI&= zG>(^j+3N78M!LGU`sMa_LtXQGwx5ocXO_?iIW?`_Q|ulpd#qn|ja&IR0E+;5E7iG6 zNWI3>bzu%ab~o`Q6?dd&j+Xq}d#^LS_SgD8YH}qA*v49S$By!6`yB6K9j|;z5%V(t z`hs$=GT*T3nW$TOpnKpyTn+sBSq{X7m-vC17nm)>qgHM|5fF9Dx+l#<_j2vgGFQdS zvujA`(-E~#5APlxPn{d_v3nR9rHs4(e9iCpLq_C|$zFd2QKV7nBTbLl2w5agiC(!q zx9woA?8ZlowEEf`@M`fvA= zLYn5q)lET(cNb+7?D85`zQq1)-)&|7@`E{keabI-7` z*XquF59i-FAbnE3x8yy3z7|CKH?zbUFcOO&r0pyZD3-9umt;Tb|4}{Zvp>O>qg@bN z+$Ed?y^@YjLO6Wq-ArR}``a*a&cuSF-Iew<$w2(dlfKhiQ^Kp`6&l&fZ!CG=_<<`8 zz3%HbFMj$Dl*4}rV!bp|O2$-kVX;Aw+Os3urQWx}C@A2*Qc`5B@9>IFOi!=OPPecC z8?!{8ZM9D!5NDM8`zN#JOvN~!BD)d(!)A#yhPtDH0`ukXANFpHzWC9vD#3lnsLHob zi>^2Ri}K5DJptRnlB&|aL6$_S4XK zL<*h}UQ>9dl04h(cUEluG90J_hD}6cy)NN*=3S-8>*L(7EI6`qfb$RkLpgFHY==&N zSFcN+_X44KA$#jnyn3c}-iJq-f>Ow*mbYFSI;?=^^)Rx(8mON(xbBPHuLt{^k*yY z8Jr&?i@TBap>SOR-;;v?|6u$68}cQ)&)|oyhjVc&oFeQQ2>Rqnj|Ez<$!ZU0q5W~^ zRg1F=)cF%Ys##$@jkYZJJV{Z{))ZmRLIkj`dCnfg=xc4q zC~UR9zCLCqrpC1&oE#jj_BS#bhzLFT82+8H8d0(v1pXK>2)F+Qq1VxAzw0;8=#)N+ z5wj11|NIV6N+jIWKT*JzmAZr7zK^G9#~@5}E2Mhk3jusXrmDA3i&41HgES*GRF9f_L`~7}OPtr{8UZqlqitS4=s+#GOZ(jO5pJive&nikV1EC#vIeiTI{~-Eg6r zZ;376&H9RwV4+_T|9AR7Edcnw5!a2rmnhwt5X3i>mF8sE%Ln2QeAFz~o&wGZ&k04x z#BPb^&_Kfc?R#RO1ebYA$_?Qo77r@}`luKL9(@nTBA{x?)h$M@CX2Y0Rdp`+Wxe!K zaejPrD5lH8DzU@!=8#V#fTt@9LdiqUYj0PYUteQW72A#eo^Lp2Kl90=ol2zVZ9^KX za^fNnR#dS?bLo(gEe;(2cG16^Ag;R_v~_taC&tH zy!vHI!XRJ_Dmv2q2Q}dXHRZEoll@AIVBT0RN>Mkv?nrCp>M)!h@5j;m9x&A6O+Wfw zx4%S(U4n2nO(!Lh{RN^1oExodsl#~&;wKx@BGdPaEtRi|z;hKf6pQ`?)9J$_*)-ju1NlmyTcTz&>5 zQW(fLyu0?freNaet&_#GQoNlRv41x-e}56Iy|q$3_^SlApWnK;Gz%LO-Y~Cp&eg3! z-6lq~^~!Qr#+&&6t`{g(D=DScP7=Yd>lBuDB&aIqG3-zF8)FkLxA?1AXwAYPC)`hF zTSyaxT|egPm#d(H^zQON6mT@T^Rv?|1xmeFhgCbRw0}r4O@~ehfAtB2_UE@V_F$rg zyDX-Z>XEs@0jlLyPbCh`E1!npbFw)G0UOh%zl^~7JJL9LD7(pL1Xw7UtjW$|?^X*_SW76a$P4qM{HnD`K>8|MJhlE=OCV83_#78m zhftt=n30PkBvhfdQ-#z5(t#!6{ZPgyV z1aQc*>r$T_o$sRE(m;;KH0vajKP&(b7&X`66<9gNY^C!;mwKJA&q#?)6i8&+Y2C&d zx<$8@8sJp_^uLho`m@#_6hAjW#M zrc|~|SJLaP*{FW=u5o3@cE37b?m5IU4&Ya>f54S_o}yu_ku8pv=3F3*-6{!2k1{j|3wcEK2 z`x9OniU;_Vk&2_qtGJ(40MB1}@f7l*UX-h4(;?>?*W;P{bWuc$F0EOsb17Bb(HbhI zuyNSaS^{PnKM+W2b#3H=s>xm$Q}h^0D?%hAMoWozo$cYW&HxmQ0Y?BhbGH4w4f z`fY&GWeN{=OZcC*X*Z17FC;j|L;>K+d+C=AT_U^zDc;-iN5`B+ zWmzCgaL<4t=!W>54HHo1DD-Cmg}^1&MPGKp_f;L;~rkH+mdl zDk7`5yv8(C#aQ+yy$Wi)&rkQ;$yG%eQhoLkP#O51FfHzBm&kfa+?3zBPX%!7)j1B0 z?3Q{2rp3|D5`OmhzSue`=m_NpC@CIWp-F>Q#oE!nd5;6DC+l>2 zP-f>PdM~>dJ1Y`;lO9%|cFp%bJ>?SNe+6U2wO%12w6~s?Y##05kdQFG7fNGO{%yF{ z$BPu3c6b~j>hiXX=!TiSb+{B8EyaWq;7+kZ&hx{(v;<8`md1qP*7eeX+@p_U@!S`E zX@y;&)28+Dzlgx!tcZ@J$E3L>qBv7^>i$-@-|6&-f3UjW-XXrwLY&!bdT?#*>KL&n zER~rx5lu2ohHKNQYyC@*{@fA6dh1-BuVL-E?_;5N*~qx5PfUvU#?NC;wvx2->>p{3 zQbt)wT$5$=_t(cd+FRu+w(2emq@>R5kq;yj1TY-IYzzos(4bAZX0}K!w|?31n9GLK z%~Oz!mteAwX2oDDb!3`7Uo;P(f0yL+V(}&3pUj}%3nQ3luI+tqahAhW?^ct9U%1b4 z^++X?n)vy!W5U5apsNLMLM%apv$(#Q9jC;4ZO*3?TM-F2X(`mmb}g2NQ$hbsOOmnFEz z{D{rggxeWD9Ky+KSSg)K@#>)4-MD~L z%*&(Y4i3ax`G_b~8K#69Z#)cOAk0`u?hM~b|{`~qnaKX7spBj=l8 z>lPjH9!~ocr?YKb!t!5Vu+g0mjK}TcHtC@-Wis&SWo9H-u|R>qjL`pJq*`6?Z(TQ5WKHt`9*vrYUY%_wx&31dFiCc>-+VS^#^9xdZ z_C^BsE$f{L!wsA}1&S;?slDF(%E@w#YAQ{P|AAkSHf^Ygh^mo~Ykrc)Jo{ml0G%Bp zmT1ye6`VE_hyFyb>uio|>+mwyBH85gMyGK|WNsVzQD?}t@^fBL-xERF=hhz1%giO6 zJJSdUbF|7k?G6~`zNioGlwekgVS7FhM}g=yZdkNwHBH- zGK+~Bf(nI-uyw_myx3A^6!Nt5Mx24ub8ir1u!3#1bwS$8<33gCYFjlIT(;P=R$LMk zl2AgBJ7nb5>6^1KWbzW810Yx2)*y4;qTV0fQhWX%+c*aek8=L*iDsW(z0-HSb=>DO zjr#POVwr?&(%bsA5B+G$tJ)s_c>w zD0tkh`qpPwB9eSvLt66Ik`UA4=M?sjqn2CrgwH+Gemc=HfGq9d={Q0dFh3eqB zGE7ck=n+Wm=c>26P-K*1G*0jzH?~O*>~q+0J9pDiw(YIo8>M*b1?bns-o7zp)PS~SA#OC33={cXY z-jE8D@IEM{t?y~*Dix4@Zv!f6dv_RVMc~o+lvg6TqRCe-^7_9y4nhZicAhS#eA0-S zxAu-=2^U*-AD+PzN&Slb6yHII`J*h6@ETHfz@Ed@O+Kx3W8`S9MlPhhVKDao6lv1j zechB>z*;RCJ^4%ILpI1bFUj@AnX?B`Qh(O05q$QF-FZO? zkI{C!A$`*JHKlRi^YlAk>Ownt0CSt^3vkpg8q94isr*zFK%2^a+4entHak9Fng+!U zAxaEKD!}fnp6~?!QQ~cqhXvBE*OU+A!#ko^$ME1yku~>r6$azuYi6Hat5n=wX8Tt6 zYHs&V`8mk44(eVpwVB?#mn~{riabDS1kjR7K689hV0h)+tv0|na3 zYt_XC20pIZA0BXIDJ@JxArJi1a8d))Fs|CVwQp;+hpLL7J&&c840>1|iJtt>sy*Qk zleo|%!UTgF>3$xV1uryP84PTIn;IrT5(SDYpVk%B892#%$q%B#;z`)EP=*n3=(As{ zRroXLvSn+tRv}ZWZ*E)OXN_Fm9j^REX1DPM;H6r)23P*rBUIk%%^MyU$4l>BsFdPo zT4^^TRoJMEHJNXSiHb5#gSs~M3RE_m{va+9Q>cqZe)c`3tFma$l!u7?n4w)0xYEO6 zz_BO&??tvRmw`J5)9W>aE?Bk9bK`uG2p9Xw^W@uAWmJ~aa@FeA%j43DG(lAMTRff- zyG(d(Pmf!~a@2UM1Q|kY`(5=x@jaG`T`g>v7sA)sWd6AV;wjl3&z*ShonC$vjkFsr zkx1WK+wDkkv$w6-pFHc!pJ+Ae#$O8i1k`f{vubzen&4X0W#c3pfhm1X+3m0@frLyh zm_K?l2F(4UnDs}r!+pvCQV#hj6^O`fd*)$M>;x{iUIuZHD6_jwO{gZ`&YNqy75RSa zGIa6&nFYxZh25wN{oKnNX&TXzLVu>os09wxp%PR0a2>ND@%?d^kwSz? zurYqc!>{HQYnAbT&E;EU^_C*6&)bgL%V7Pz!j{Qxn;wj`pAYVqUk4aa@*r-`aQ>q}X1xxc*!! zAH^i!rRIlQ<;Bvj43Z+B+)Zy{Aaz}N5Hq&E$W(Vev7}z%q(GD3!ZLmx6l*%O$R$V1 z?8TtGHMbNeJ={Lc&h-{CVJN85e#8`>aGOH287o7)>r;M6`s8i>@j7pW*V-vRt9;G_ z4&4;r<%bnJeS0^AB-k$cIRC1*kSR|OfBFe32^Eyccm~^{HTe=`)YLiNEgN->wTgFj zmyTRzFT8{dl}dHL@EI!$aG^Fcm11@t0 zEH{wu+m5I0bg3-8SR9+$C0yq}Kpc7rU1WGOXyA1WB~nh64OpeF)LLJj{zuV+dfmPp z?d_)>ei@dDX~E5kzRjV5{ExoV0A`F4KugEluES!C<5Fp%!&|ZRjqcJS1($i(iXx&u zO;#_bvM)_?mw&-^FG-mpY#@Kh$a~WXVhZgoguYJlJa2)DqO{x7c0oczO%kAAx5r*dJ#&X|z^Rl?ocHY(-IyB{^7;hRMQY z+A=0X`PUD}rdSoHYTue8hw1U$DM%mQWk*bS70ng+ovL6HdFzTFStnTERAU95LV5&M zr>$b(QIP)Y>jovtJmWSuOZI6AFtgyFe={uC}6 z$(o0EeDHJ5X>X*U?fi7AJYzRk>5KvxM1<1>D4L#}uAi3%f=W>r(=d3-*^FP%K?v$L zxm)2{%%@d*%ro&?o>>|9zz8Z(nq9p=DR38qer0Gq#+cYsnu=$9*$b0D45Ln}%CeTu76MrUma<2fp(Rpn6=K zhUGki2lCUo-Z`FZD_22ROp-xmk&{P+2dhVpmPH%A{Ym{t6CcC*u8GA2mnb#J31fJy zmW1`R+5Vbc#qvkNxi{yzn~GYkIDgaxNy>m;cJ_O)F29O<Tq>ASQe=<+L5VmAE^LNB)Nl;p`aahlBWVgF8mg zh)&gFHDn{$zZ$I_j+gVwo}~^ns+^<0ottorlk+|M!63&hEI66?20Cjlr(!`Oz8dI7V0gAt)HjD;~RaGVKB@dm0TV0LaNa!7-1VsiC zJ*e3#U6pOAB2O~(rjNc zyT?qBZlvp?oKV)&c199Cm_Cizagsngr*)a5oxZ5JMQ6HB+eW2qJj%&!)(eta@UNq1OJv#yWz_kDV=!cA#}MUy>xC252#={`<+yHyYE0lA@*2D-73e!m}qILMPxEI_`H4I~?$M zEE?$)`P{z>5=tY)s$aIotC0cMGh4kLUl)`no3L{S_jj`RgM&{qkhWVX3Zzlrwu=l1 z5b=04of13_wWV_6Cr>^IP<38)S}8P^0|iMlxR{E;ZQ#xp&IHHopfzw!V# z<5R-s(0nR6)hTZ2U|)6=#$ys+ik_^||14a?O!WJL7wORtHa?#tPmeZgCYLks0NPEB z1%*wDme$U=2qq9%o)cIcY=C4f992O1>duO=rDOtjdnHNk_ELSfFv(61K(o_hXGS5) zX2xkf^vAKD0|O52^@zOLGg8b<>ELJi%3OHTY1LSXxAHaTnZcZt%-&i%&-NzGpWxag zZSw8aE}-p8{0@`z?gpW@P_;FTqwr&LRd3#(xpcm3l{u*ft`=4w)DS!~?NuhYo-!4X zq9P}Y07|6$A!PvV{p>jx9;zNhi*KP(oWZEkTFruz%}7!HOAW<7RJ748w&&gs!fd|G zvHkoG$sc+MLDc8!UdxT8?YCGPSH5vaIWL_#Q1e9WJ-WICTmb&V`B`$pvBy zh(=>ZzJM)3e7DC0&EE)gDZgLJisOm1pP&vN?Enz>FUCaztKY^bwsMGmmzu&_41jUN z+cXmK9yiyxPTRg}mHeu}qcTyG*TG|T=N$Kic-c5WMJue&gK|VakhY+vR?Vmk8=k!q z!6=$52SZf9ZJyl~qzVyF@a^xpIUD=Nj{((DLuY9zn!>s@{mG*p5kAtG0cdA6RmkKWbN7?|*q@;guU zcG`Vt=6G$DEl+
=G*%9MAjOrb^xjwuMTZ9TA>Bv_tIF?YfCN6WPKYV|0*h~ZP5f7(w0Av6sBBLp= zT@+e~1H1W8HyW*uugjYMIZlJi!-why%#U2<_c=P67Ad4chrFOXSkBShN_Eg0+kFUz z1+s71d#issF22DJoY3?L*ujscAh@4hLKSha2SpWwzdz}4t=L5YS1heRg!D8I*G;7O z`M>x3KdYIXop5jM-0U|8=*Xi)D=!5~j)%>m?IP#j~2(Z`ZoR9}RF~PbHLEfHnhZ0QV5JKm5lV0*l#}ks{lnbP}&m)aZ~l&O-N1 zc*VTix*TY^txn5=hFhB_XQ*_V0YrhirP_e(>)k(+aRe>|Fs?`C$b%UiP%_|iV#hGW zqv;T4Jok0_s1(2PcHB|cxMDsrU;WcV1)b(1jZF}^FuXw)HaPZjHY?7uwJRASg5mD| z680Ud5RUnJ@fcsM%J|{o81Q9#aKB%ZT+}ax>m}AMY z01Z1`ypss%3T~6}^k>)B?m8U~W4{`O{K}6n$33i!ZH5aiPsqPeqKZtI32_)N4S!ca zeGGa3gc9k>uJDXk4&kzBV4zG3Y zh|5Mv3}a=aNcP}vx;PnVCM=Zl6^+oNP=Wj|#;fAh90hMvzHvrJfkGI7U2*cct+8I+dGp+9O(@TzDFnT*>~Y{{qp9}G zil6nGszq}wf&tKPeoZKHU6JICqqUK(-^aiqnr*uX5Y6Y-t{$%0zXAlq$o?T~;3SC& z)Y&1L{KFrGjfgprwg(Tq9su)o*hFAzF5VxTgAGtNz%JS*_IIMPl^=Or$Jtc1{{j&M z26l#{IQR9kWgDok{NU}RB!#7QU3xp(nB7g1#Zs2kb!H&!GzaOioWRK*Q>h6u$C&kmZ!L8>a? zV984KVb7;WI*=9=jXKu8J=(SmpmjV@a>Ro?WG%FxFak-fDym7KmHG@b%kNy{A)H&~ z6-*xElDSbN$=L5(omLIe${*+G78Q}MJ$ppi5W2+)$$tq3V79v>~S2M_~$EER;^nlJHqIs$}&HRDPz$vSgOQ&4*rnHgYW5mg(s*m|b z={vvf^rZE*tb{-5VcL z?dx0i5|&_|)Cc#wmbb-N`djEY&^6gzHr&b`DEj%5SF5k6u^UTyk_4AzxQ0!i&c~(b z746M#x^=Uj0uco#C-r)x=lg?#l3^z&W?Q|PsbE6wUHdaaAn*EHrBHI+X|9}#HNRS2 zZf%2Jc@+Q1%pO!SC)%Q8L&xS1Bfk~*`zRwK9AjxIVXuD@)QqJ{y8XZ&%PFDLHXf~2 z)rI%IU1$j*#hk5n9%E*0I(J$~;rr1;zqN|1k&=Z>>EgNORERz>LlMt)ezgDK zDoAt29lhv(Av`0daLl)GpWm$*0M3AGk=&|kVvDNwk?!X2S8CPQjMe21t>-e3YVR7x3 zQwyS}PV;ldomC~K-0;?)r!}7(>YF#68n-11Kt!tdr(RGnO%owN<+VN4{#@yvE~aqJ z#z|IRwz7{K^Q#B$TK2-?iI~>kYhPD?$Lyg3578KENh>&9+8Y2xdEc-?bEU zZSTVtQgA&x5=#;OvYDxmLP7qgZ*sVmTx7lk51{j=W26FG7J?^){yPd?WT{QMP$6_r z*rrSmQ`cPA9H5#D7|%E6*0vd4?(SV_8K?XTWBjKt!_p`)T3fS*N8VPk!l=ab_?fSv z0~`v+HD0^X__OIZ=lfS8oI)w5vUjdi4iOVQ-ejHu6QEj%Ovr%~Zw_Jef0$s!Jjbo9e zkGTcV&7Iv~LI)~yKz~TLNwwft~ebI<6}SC}&QLX)`H>*`7j*x{?f4|s+KV9##$m`=W_kdMZ*UmQQg zAGe>p`FHYtP7v>f+xfv+cj}E-aJ_|3HyAIv(9I{*)QrAy7ix4q`X!8U$54l-P`u6> zaJ7sAnfN40!eVda@QvQMT0v(Ggee9swc2;oV@?6G8FFd5Uw&|)TR%?!G;yT{VedT2 zwAhPS_Y-GQ{7d&>I4hdsoY-7NG0fWc;hoFitb`Pl^oVCiMlxJ(2+tbpX>ov5oN}S` z0yx~U*PeUx_z_DGwh%a4g5Q}eNn&;Pne&J%F7w~XXd5#LQv6Hq&HYQB51r}LoEO>+ zzS{||C;T<%0CNG#HhPsN>mqS8i4e^CLc?)84@A{2G56lZ$d;0dGLKa@X@m&7`0gy; z2fcFV;)w@ZU~a;glJh~K@q7*5v-r~_%Bx)#mmR|?{@M)oApZ)t9_fyv3e}$dO1r@o z@%fbc!zWL9-t1O}sf@EFJ()KC_0|mTa9pu8lAVyfch9x~%U%J+oX@o(1`+k33v>Nw zYkM}=pRYYT@(V=dR=uf_hlfW7Z?W?JKr7@nr&g{tj;M=$tiVC~@zVGM>&0=Q`yXb$ zn_T?`Z4S8cUO38my0`a9h21837riEA*-on*)@YNQ4F@kb5Wjiu_scgz68z6`6F&bDLprK1y0-owW&Wy7#s zyTx+%V$07i%lXF#lk9AqFT~RTrtS|@C_2Zn!*AhtAT7iyc__uEA(`&1fk(9ix)&zK%d>J=etQ8hozt(Yz@Q{;QCwGz9PJQqyy=X`c6yv8#|P9h^^3?z(ziv=jb`Wb7c9;T5wrR*63ZTz(%37rltG+ z+_k`>f2U}q0nP6)pLqZ3&wM|{u(qgpZoc}de#dUEN=1o}bES%!TUG{bnii-(S40$A4A7Z;?68_xGY%Fq<`|BuOIY zsp)FBo?{$maVv1H%4x9%om)mx_YU&c;TjkO!$X$o&M;Fj+0KTXWP}nZf2P3ZYpWNN zU)^MwmO|I~kmkJ2-$0c7rankZ0YU(`2Hq^Hlod46P4g~>95u59n);=3;Zj1&Lj?|X zWsk>LSB478F}Byl|cAGvrE0b~|N*UR?mZ`va4~NKEz8LHWK)56utZKe~Cc@jTsk8s&=sK}2Fm zRd@XM6{zn$y3GWOaDkr5H@TFPi?!;B>3j^i~&(K-TGg|0Ic+NLiQ;>d~piy zJY|AGXPI0P#%HMCD^-HDXpHy;jWQb3?*%#rw_Jl+%oIaQY;`qNYz)305v~e9?dEWKvr%PVaRv?J3p`kClI99mvT(xIJaw;fFD!rEWbfg-OVoW}4FC($#s}s!%$R3=G?Y zCJ42Ehgn=`7G~SS+KW{n z61hhA)mJ>~v;iC#9o~vm0p^?Nuj!x%${S4Dx7XWZw6vmX%eZsoV-zAZH>fJmxJW`W zV4q_s>~X;)sea(q(TB`zY_fe|x^$}6Cn$hEdp9`SaNjlbFddz^Q=}mbrU?d!QNfj@ z7WR3clr`kOL180AQYlS(ff|_>WPLE#kn(H$oAjX^P13KAi$mLTzv5&X<-GudlDm(* z%2C2?o;`3B1C=c|gxV86!2sKXRV@KKw)dJkmA#&=edV`40DBwXyl=#FkiJM~Ua1-7_SJ8}QAG`ICG z>8kpS_k}#ZR3UplPqC$w8i-EcC==Y5@C#_UhSIdZF+^echUxy9=%HzYuY76M(*mB- zNA3kEF?|n9A^}9<>O(&~ZAi#vz%m~=YAoskrHwowqaOJ=;UdLtDv?U5v`htjLY;U8 z9P$=ERf|N)yUB*C@jg3O#I!K+j$|y4_f}s*$Q}}^y}d_R6<`iV%~6wDz0<+js$43! z4$^JDSEfaE{{3A5{=o@vHpOpsvZ6h-AO0>M*Lke-E_wT}BM(@J$Tg;pQ~$0`v49E( z+@uw_;k)BR?OR}8Eya@h)xz1$Gu)LrOzCHw`2qYUhFm;Y=_I9K8u6T9*%Vd+D z?4KVKIJn@c_B0lx8f}3=U=_ycdhG#a!}j zhT@6`g7JL8opxCW&c&4cBGjNaS2Qjge~h(&Np5L4?E~SKF}wdLiTr}KAP(@N%Z!vX zEZy+xIAlLQQ2OL`_qp+-b~uaMfJ-ztF%6IwH(DVr`bJoQGyR=t-l{!1mc{$fFH$8~ zZR+x-7}xY}r1R$G@~s4Ds$1uP)UfR_n3Qh+{{4Z?_xBNYgWQk$qdsn?WbOD zbJ!;9IWD~VdOLvbliFMo*#1WdnFA*`SM>1Dj2IDG>hUPM15PHNu4?YdGCb4N3%v_Y z%Vp{oTNc?*2v_X}&npMgA$SS>tqHF5Z%Jd)CpwTHJi!)CYVTV4^y}P_|7ENUNBaBY z(&R_wnpKUNLGLe1&}RPPSBMOZh!a*7PETR&e1^rDwucP&0gNajW;18`QzyBM*DSiA zINvm()G-vSJ?Y!^Cc#=Kwpc-04?fpe$U1H$hLx1u0x4$2qC0&;LIOO8igs~)RyPou zJr~?1Fg-)F4az7xqFo%3*Tfb)P~(;$^rwkJQ1SqbQY2RHktz`tM;Kh}U40IQ#nR+Q zXhD#l*5zFI7=|Qqc?|B7BpM=~K;}X3QUvdQJd+b51frlXpU!#F#R*@Y#COSk0Yf93tk;R}MH-0fys2AIo#XJ& z7+E!8eEWEaed76=5&Jc!Y6|2NU;G^hQEr)J#_NB9ssS{>3h|YT7?XSl*Jv*njDye< zFtf#-a#bQ_kFG@L262<9umr(-Gh>MLHq)Fn7)b5tbmV7-Ok|-?z)5nXzlxStEbU28 z1z=4pC=6VnKH%e)NNOO~^MQQax@f)CuVT!M%PyVLriIw1i!k&9yh!UbujR51F<@`9*%`zQBrJTW?5nJ-IcU-astS2aL@Y zO$L*GKFfaIQng(Upq$JN=G2Q-*Dm8Oh)bOhCU{{c$GOm_`|-L;IMYiK+}8`KJom%k zxQN>!u`tGywX7`J5^?S%&_fVqB592ixk21bQOrd~t-^9wH-I+#p|nK%yA;olv><$( z$t0t=u9)Y}#VI&5-#dZy%MXpH(QZr_2{j)-!IpSs$~;9rPt);><%GyU$B%Kz>wAP6 zLNk7pkZ?cxLXBdRh$gC#%+hDtzFg!xa>(vG6|ztUEXJ#at-yrwbPIXfTtGaXf8GJ$ zv%|N`L>7ECKqfe30}rZwS!9$iZ_|^8ShO80dtBsu>RI)px#URA%y2L*xGVXmPrQAB z(gvUb;}r(^2|s^aCF6^`G8+k@Y+mi{eJ>K@;~$yVm%U_eo1gDAR+iKS(6fTtxoqo9HX=91_?H zzJDOyVRt5VhJu_|6Uq^Z=vbO+%lS&z?-ExUDHTXvQBe_8nZbtuWLW`U*&7_`S&gL? z*22Msd%7R#=_R@>^?jv_7kQ?;x%xrCKmA$f8^QAC zzrw>> z>Rbzy=qt>v8T5)sy)MGYfg&{0eu~LG^iF;VMC?af=T}huA;gGypyfH&K0(;!t0G;f zfN!{vn+8}8ppIM&N-RM)r%69XW`M6e=qt6=1})Yjs14s+Kq(`mqL`MJmWmvvYNZ;8 z`;VmCl~9P2uqj^Rjpr-#f$t8g0v6QMCFt zd2tJqlyaOWO2!}ff5Z@}ft>84&Imy36KFV%I>o)ywvyb8*e(P!Sgg(h&v59T0Kc2r@-MQB3=NJ?PBxsxMkq)J4;IB zp8@z<-@&8-Cw<$Ad?Gd8fpb`+4WVEnzLFS)7IQI(dtP?sXlc5o8E~&a6WTR<(ym^^?lte70NIum^iSGn=b;QbvB0pe8 zYlHK0NzQF^fp~vss9@B*2ps8>0`ZkZrd=bDexCCB!Hg*Hl%NV>EDE*#2q2Tv5Nwf* z%^n#=y^z?I;1H^exwh`F7m%I-HQCi9>D6Vt3ML2$;x!kCSFB4}28 zDwPKU>)}Y%X$@8F?maWNw4{19_7H=f8n?ImdDpJhR`4fs1e_3q?oB=2O1p5?6<%1--A5xLHEt>UJ0|d?6X&YvLU%G4Xhk zVHpJMODZ@kx6xYA)MDG52LGe>t~ELcdF>$HT2U* z;4p56CMK|aGe!_ss|Kx&CRW?rl9Cj8hvjrAD^*Z`0$E2{fV`&8a+2_0oq5#jO%?8x z{yrsGK`ur%>FZmBXd(~ve~%y;8X|~ruM0SvRYLDJ4uP-JD@r!}@o*sE#Cc1kf_IIp;P1+}aA>Ht&?&x6>;IA7LfzrnV zi2{i_-w6q6s1qXqBPm*VgEt*ewxy)#E+-07uuCAs=&EkbX;~Wh5Pa7GYvkcdYyE-R zn>-vhG!QLA_B0JZ5^W1XCEmE3KhvNu|5X~mN!9cCO30lWW_>7v`1gu|jLR?^tH6OC zbNYkOBhL|b3C1)t1YxD;Np1Ny4YNQ*FvJrZokbW7nNN0VnjRFnszsOpyY*$tnE(j7 zu|Dq?f(u5UqT;<}D}v0<9QJ8~^TR>=@HYhrL1o<|S#%&<9xEHndjs9wQ(;G80-|oX zq*#LMe*hy{hq%v+rLCE^o*z(;fI-w^gtHf%rZC+v!av=Qm8k0OfAnn!<$yZi4cckP z?l97z4kVXqrXUk#qd6^Dyu4O@V{q;hIBtS3^>?|7O93yZfQx5-&9cMKSRP&_J+BJQ;kQ=>KnY2k0+u-h`>L zVPOOT%;mSc)krrZI{Oi6gCUZq+ZZ{0j6GhgQ?IL9?dMje)%@e24G_&$tjmOvyDpgM z)Hp>|7-k>J#Qxx*m3#G?Lnt;_*ZP%g3N3(8xfg>1O=^E&^4fD7i~!i{KVw9Qg9Tc_ zi|hYA06Ih~5XBYi8;lZ}8Tuwnf``N~~IBgA8l>KdvCWJAiG& z49Do^OrZo;F09Eu0Vge2U{Nkn1LF)wC)y;V z+B`RPxUg}EWW0fPh_E#HmofguPsOg;t~@&t{}a7$c!2|S0e!pRUlmzm;8cRdeW-y# zkrf|IsV7E_?J?KXQo3JTR?=;L{NihFa6 zobL{A>$^LGxib$4qE70kciN8ElkAs~L){4YNR$bI^9o6y(3)|SgUn~Il|F3;2dI<4 z>PRGwwn{S^X=Mc(6$QZms0Wl?dc2pR@o`N1$9zn@C0~gGt$0u+{eS6AsIdW$4qUxw zPO&CLP|*QvR0ni`5%cQ$`ZTT8a)Zr0Ih_nuAn*qV-6+1JKCW|5e?~!*J^m0Ckr7pC zj_!Kv4|Av$igxMu9vzmp?||TTIN>)4DwGFBZ_)^I&1u5_yFIq0k=y07$7Y6xIv>(K|K{iLt~{ zvc{CI)kg*%Ae;>4K=_3CxckqVWHL1aB>ncf!~XbkjVS?v?RKP|GLelx+>esYaJs|+ z=M}p*Zo9l{@d=-k=D=N(R5=GC;SKp#_Fns&qef0HYZUmN4N1=f^ zMtILNkzFd^c@~|KUk1s)e^hNPF77%ewCs@tLkR!-W~kEK;PxcHm_GSg0Z^5pqzUg6 zQYbkAGOi?XB!so~?N>m=L^Am>&Q)&S)1$R>+Ki0}*v3V??=41AgesCo8T}0eAB?Ss zuJt`d^myL2N<&vBV4z0ih^HOaE4vU!=njk9s<>2je$m&m0mld+BHs#clImI!L#zQj zu3HpNFN@Cq>hHs&{Xj8D?YG{KZ_l@P>4X!E)o?z)%h_9yKTakf;{t06s{p8qmw*%4u!l<=8eaD{jP(|d^e!zW6i&P@J3ldB#%i@}sW3}DY)Mb~vgiTlRMM(9@@VqA z#ZYP`ECdRjCven$;;}XU!EUc92Mo(7pIpBV#?tE~<A|6;FS;<7rhbQjBVyBm>4I6TLruq|+~tj}OxR9xy1lZA#I3Vb3GMp8+-m z37Ry<%6oTIAT&4&(AxBU9-4gTIWR#6tRr!^H;Y^@w;Eq|9R2wgDlGnAv>rU;h8@Y% zp=IW72|nKt;DfM%<(D5-W{Yd+qwOsl_Jcrtu~3#OPmz*U4g}PAxSEJ@#;`(aRXclx51pg(zy<#6cJs#ELtU%cMi?tauLHKj@>rI&3Vp!2iNclCSRl`V&U91NL1 z#9w_+=*}Sn)S_^Y#2P^MLNp$Sl%bEcMZ&gRz32@8!;(Wmr8fHzy3Mr6#yZF{;&x-< z>+m>(;3B$0l=7j;>m;zBK1I|lJmg}aZ&Q3HWP#bc0g5kcAY36Z0&?-l;2j1?O|Zb2 zOytithiEk!&HpV-fFLl2Xh2n{fuL&NCB29;9RF_UalQ9?wPcI<-2u^Z7m(6aRM{RFgBC@oaH}9TjhnW8rq|!+3s~dSHo^5fGM8J4)E;xTt1>6&R5pDx{ba)QtQW;kXzxi5gT2!oJeDkO@cKBPMIAtG5 z_k7DIvD8pT)WUo4JUjd23eZbKuVS61;01W@9Yz)V3D{=E6DP$60YswV@CYyZ*K+9; zTFjlzFxj;EX>F)ZYC16la%nM?eDCsjB5+OsND@J#7oz17$;I-MY%m0(>v@rnWS2BY z#>_tH8z1XA%FF?Dzv6n=ZsJTQn}zgU=%?uik8ZlOV^Mo{cP(F@ z;;q)Z7!5Pz|x{clu;J$KN` zl)JlbfWXpU#l;fO=mR4q00g1a)id(PLmIm zO&A>i$(nD=n3+DeYeD6gCPyLa82sEFeS4+__Ec~*r?0{|8C;rwFgL?Z*Yayo1qN2tfY-LG2e_C^&P`fue5eMa!)o@@o|^&L+~{QI=ttp@Ed z)7*_#%0Guzkw}{eQ9DfJRC7$d7bd)3OSd zI1sKycw^{n^=g}Ef2b(}1F?AT;+IC<16Ox~83+_IKe!cR`0-1>DgK~T$Sg_t_?-af zo(o9sn3RiMWXG7$e?j+~lxv8$%>3ZU_>kvEu68~j#soR|597rf=w*H861aQtm(a5g z=5sq$z0qB6`jQNf@f~HwVd8mHYIMvrAJnp)c_6Z>{h61?u@60*-D)#tqEZ|%#oam^ zQvscNl<;p6ly2d8VC)=TCJf)HCsVX8kw7jud4%D4zSf_ZYxIIrAYFx4X?7bnQRx3X zag^lgmru1?;PxgiIQhlHj}qI6wb##@3(7AOxzdoK-upJObEX7(d?|-UZKpKT5xI@w z2i+~6SEVr^x1RZFZ7%vT(Ex}H(=?&hxVWA-$W{@i*$&WY-tlN%oprsg2+DFZ6V<_! zF`bm|s%{8E&cPcdExBA0r9^e1StL*_uZ&CS8x&^>Rt-Yf4#D=8QZzRjJTEzU4vT12 z%QX)c^2K`f8dCqXlSlP@yAU6q(EILl=J!erO6f*Ud-Bu#u*lWw3Vb#~fBhT0 z0fm2uhpg=$j)!-DrBpq70=C@EKajmPP!9wd_3QTV0)1my7_%aN8CCzVx>wU7p*_rg z#%k8DHH|FN-8O>C{KkCgR9f9dyTZ$U!Tp5|n1BT)tu3U?j`S1M+uT->LKbG)Pqa3T z0Ae*O#Ek1nA&nc2)G~IFxJ3F97vI=gKUm47&J-!ss5hod={^}s;PEMA0W51F)@5Z0 zy&N(R;Feq=R-VSlynJH(OC;Eglu52-blr3i7izz(2*p1;6zLrrbbfKB$`Jq$E zpD3nIX=y=-;HI5_%lq)K*+1YRFjpXPkxG-<3`L|=GzI;3PkFpCdB51(l<5W-jM$=7 zGQ(^>VR!~Q(L=;-`g%g3Ekq3*588SDgKx!V5D=ZN0YWQYs8J7v_t2U@Uy{*+A~S_$ zFb^pj2^U))15WsGI&_-ZFdpxi94pb8_`fvgG@#7SK55sagrG3ownJ)OUk{8%Il3DR zd-WYQs1^E?86N$H;mIpXB^(~6%HfN+;iDNUMy&LD*sMM^4%5*oQ>_D>8S+QkkUU3V zLAZzQ=8iNu{A~LXgZjCt&(CK2I*^PLDHh{LLor-AXmO)1pW+Y>)TR&L@BQoU&i$DT zkSn%R4gEXS?bq~e^b8av%$B&kn|vqojM7OMomTK>eg4IhxGVzt?I%b7ByE4LU}>0g zpd-qHl5KOOJ|wKpN*p&wyGRz6{6kpoy|9gb@~*Z&5wlaeOQqYB%AuAI0p)%7b@b_$ z3Wk{Ja7C{VPM_Tti~k_Mvb9ivqgFRX-20b0OUM3se{Hz?68f%B{&&~S{dIg56rgsd zQF{XcS115c`NyL`42MWK9(oe~W%G_{w@@kdbLLr@(JFQJG8bIiWZJt9UGv(#4$aX< z>I_UI8%}{dkov>+05m%xJGGEs8Vj^DnZ5@eMy68)iIrq`Lrt z_2lc*-SL8|WY@QhxqFAX?{bF^gh`aIkZitR&HY(x@X+{V3YdQWQXh0?Zo*Nka6V7P3ok|1aaa$9I*R!kZYBxrm8t10lmI* zUJt6 z`7pY8oF+e;SRe%*ZF8Xz z^&MJ_=Z*X=jAv{&cTuK5S{L;Gb17`73zxzLucD&t-VZYrFQ=VQ86tG6zymk*iUqI3 zhhHd0Sn$Vc@m_mkreB4y;4YiOnF=Z^uII0r%6D0mF}A=?~yP4JH zs6ilBuuT2N{G+u4w!UatmL`x!zC=*~3Km(i=hik(n>*lM`DYE6dbK91WNd|H0W-Jr z7S;=^JJVpBGKnM3^JwYCeHO;Wc{lbZ?kK+MuWy15B!u|JtXG`&vby1y%Z{)n?}3^6 zpz$9e#=q~~HZvVLMIOert4>Pa%TZEjb^PS3biCo`*&I`jO<43N&{0a#;TaR~X_N0m z-rw#qlAM(%GU`QJpw?Jem`L=Rkd!;L9dMZQXn|O?ZW%pWrD*d%JYOv$SkR(S?-IU@ z_Tlf0ra|jA(}J)2>4nLOMzpw}G_272c;fc=6ZIySNs+MMfQ#3~%{0qjCU7}o!6A$d zhd`HWDXp%Q$n!vX--o!KTza@3CGRO0Nvl%xaNI*P<#ygV=jS_x($E@8h%bH(Pt&UE zX>~u%+iJ3pr>$(8EJBHh&^OvKK@_E!xTMv{dr4)8FXjgE{ezfE{u9J69#YK>3P;!$ zEe;lz6)}dq{(iPz9l7x>45_RaaQn49CZVizSlKZ!6LDugcD z6kfYB6N*PAw~D`L0P0j|K*vA{=bNk-wprBUq4wBHv*Wt!co@n$(o9KXfNmqgsC&2b zHd-2(06o3TW{*b;=$d82{X!XvUhjz~PlI5ZE!FAe<&nHPbD?^@H=V`1HBPe2s7gP> zWHhyW<&d@njz!BW&!bQ1J&R)p8wd-7Sh(|ABvTX#q}qcgHZ$EaegN{d-rvY2;1>d4 zgVq>ImDYo7wTLpP1(eGG`>TpEG966c3d^7lsmDqeuIiW2Pv!PM>+gEB_k!e2fDAny zPqefwdi12>$sfK1XDhzoY$eSb9jbud()`723C-Og4yTHZiHo+?iO-W7eW{raI*F14 zQ=w}3zE>cWFO&5)JRi9Bzy>BHZ0WhL=QlEJt@mAzPD!5Uz4}A{`VtAz`P!#6SmfYD z|M$vB=)2yoCUW(?VD)O`UCruHg4^TeM2<^RsIO?mC@MPPc1yw&bW+~ohMAFaV{qWB zqyZqlyIPMyFSjV|F%rv(F=i7{3>@BX7-`S_1%blgUSlyY`GlY8C{Hq4e}s%h#$YPt zG4`l79jtZk>*G{4(0Avvq|l~d|5B#`8#L#a(`DJlA3HA%-bznn?Fu5}{G(oG>IVq? zlg9Tg_+h>*qkvc5dFVbbJ6e=vDZGoyA0I@c5<|g(H;V}$!v+}=o;i4IT8aKZ8_HP~ zFawg1_kLU_YI!Xh0p;T-@Nj3G&hyel(yHh-qa5f+$ahlnS6;v{Q6amRz&iR0olKZ; z1lqv&J2#EUhcVygD=nEFUIeeJRvzcdSztn78TYp3m+?UES=@ezIX@_rguK{C@-Bvc zPzbQw>dMDAJ8#x(>dAj53=HJSvrVg;3ZjvZ#NufDw%ovzOaq(vnUGp(e{!_PF)35D znQ6rJie%lo;_XPo-XtP=w|`scofo-!o!mt>Y^{?{^lW9AC_0nVFwl0vw1shgD=4yP z-H-39vggB-MbIQ)%I2Qd&-gSEf@qb_ufw?gt&8A)S_xT9%k%NB%Y5$b6G^3yeNBvQ zf`a(2_j(U073``mHYD2lERn_KfBeoJIjd#3tA)*1h24*Ir6dI&;Jri-CcpS9w!sfv z65~iPyxwq?^3>ij>f+)Esd{a_v500HbL@vJxlMgS9GK6YzV-?aitg`kt|CqSq4VhU z`-qp%8)0Z}k7^R$@?egN51%+4^vSMGhh5bZQCndk%G9jYVHe-k<|%~}O2ZV4$ti(~ zoQDm?E|kf^Hif84UP_1-uR3yjsET(nw|B_)xZ`Q+I#}fDk{WL6d#VyUuVB>BjFj{> zu6Fh+SnzyIOCt7Q?cbM2s()Ml z)21C<^$^Q-tzjf65^5#UKh>>aI?T?{^_mSK8(vW0m^GM*QJ9oa(z&V`)GH1U7j~O8ky)?XNT-OSM}5L- z!%p*&^4l6qCDrs_GD#@lx_1#Y2$#IKr|mH4>7~f3k5_^h&*$Svwb}O0MmWKZS76n) zi$e*hEY1Zf1j!!lf~HWO56@z2K;OeBQEh;@IG=N~d8*g4Qi}3BEJS4E;WE_Lbdn{4 z3#g}ni@o(8rjtCzjoyYGkHq*3M5*FxAdfumUoG-W&w7i2mKOrG5<-jfcCCNyc31Zp zd;R?v`MY!v%>D7a8;3Lw0k@+}-o&cp{K;;KRQI}recyZqTD)9(2McZJkr-(0yPo~% zHrn%8cE>X@EhZfXL@O;g7*hpu*zTeBMNHRfWVQ?FckB(Yknh6>wEx)4B@aQaBUeM4 zkL;MWC~#F3m{F1Bah$XprVdCSZWiH3hf)A*d7n65mGEprBu&!I9E#OK8WPew#nl{b zRhF~0=n}90C+#1E6gr{z6|f6PE2QU(Hs9xr{PVNbO(*^x&X-Fm#1b%g=43|`A`gDI zW6g=Yiyqc*_SHR~ajCSqsmX7UP*uHv7<&W7%|QE(&ZLSq-6jN!$awPI(b&@kBmm7= z*ShYz*^Q`B?UfNr(P;H4tu-g4M{-df7y^~EOS58sZhuX({UX#er{ zh27@!5RE_$cqo4jMWdNXv1bVE)p)KD{_Hb3SX2EY*=lFf*Wxe){>Fzavxp-WCV17S zn=+HW2TID}Q5EN#(ezNKiykBW*f`5c^o@~}Fy%%Yk*c^$q4V^Cjex*oouNu{5JHW3 z`t@E@5E5>p5T+flIO43wFB{Lhf_|?1)t8h%37*6~Y+)M-|ABz+saK`weN$4(363&o zhZuV8MZD8A3LnY2r}vPq9Zs6_C?O0EkcAo&Q>QS-%N(T>xT*VHga&t{2*(W?e{?~ zebF}{q@NoKdNP37956&tkU<YN<=qCG({BxP9g_swhbnmMTS21a8 zP=tyu@P`>sj=6&S^7|9?dES*4Z+G~KROrW2c#2J2*(U!5+AlRSm@9i3S0T!yXV9qe za=V{krETCZ8}ol{fJiE2PCX8y5`2gCcj)RinZ3I`7C%@sOOe44+=s_n>w5j{v?*iz zM&%b!XYTtT*55^}Mtu<+370dw71S!`No&N|oi~?L?dX2C{UUoHR%OjSI!Ib{lg@n^ zAhH=ayo$|W=Xj}7aoe?FK3B)YZ49;6rn?zWUbsPfj@br0%yKsag*Cd3Yj4IO#ob%L4~_lTJKvwS!tNgfImv$*_dDgbZ-y%QES6GEP7Z&)@*@Sj`*m_!#zi$a>BQpJ|M`d3_>j6mgSPk@wX=<3 zGx~C+&I3=Ey;!Pk<6noVN@=u2SB>f3^n+VcZLq$I)GRfLg_smp=r3tUn znnd|!LzLI#=dT1Ihp=ouFW3Bs#|sy4q-K_`~sRve)D ze)O)p&~M7C_&2RrGn~c4^DV75C_vYT)IpHt;!patX)>P@)A;9tNB%aKYk}=2iPxK)e!#i`+6-Md- z+nox3mS7UWk6!(q@6ZC^{iHZaOE|uNd{+&GP?pCSqWJpl}Qb`8Z-3 z-AY^Xj8S#qY9^Sjr(bycf0?bXM5;LUE^iAdD-NVLY0|?sRl&tnX0$emEH0+ zVT|Giy4f$Mew9JF-zKqJcg}8YhpkmslF6@RRu|5kr)c3V^Z$sHZh7c8d$}pQ*=la~ zaH%jS%B{#kGJSDABP2|XM5w)MV$=$XyX?5|Rf*2Qo!cFysvzh^gsY^J_e$!++M_k#qUQ?x9AP*j(E5A73kZGH6aQy@u%Sv^zuJYM*TE z-`}=dQ${50P<0Ja>ix9W`8prsqjee}6WWBt;k@T_>h(B3RbFB(lYUEe5pJV17=&&# zsBur&qvr-mEPlElEMyy*IazFf!aQH4pO`T@xV2AI9zD9hBUeD!a)KA;U_|ocn;oG^ z)1Y|V4k@E}2orNy-|FwNc3BR$6;n4NekHF|9as<-AM-~0oQ!z&Y!ReK)UW9~vZjIO zhi5gdI4WbCD($@$44I{B&gA+kA!x{kdb)zOi7+!daD9HYk!{l2DV$LVVzeODdoCtOuX zPP>*qm-1lek)qxpuAW~S1_3COAu@cYAS1Y8a*e&2R<_^kE#RAlk}@3i)&?hcr%vV< z#<5g{e2FhoaWGkIXh0okVS=bS08G19Ge9Sz26b_MzV6S|_a`QQY@?K&-416c1X4nb zgr?7}RV<9ucy!*j#(Y#`B2W5PC+LgU4`UZ+vp!aiS2CKzmMLyPe+{`^Q!VOZjQ$`Qv)><%=9VwBO^o#3)XCb(cI)><4B)WxiQF?Kx9R;x>Z^hrEx>W zTXcgALKh3~_Qt6cQ4x4&6B5Gimk)O(g(2c)4`o9-J zUv6x4z!VQUc7F-xZH&?mF7HFB$mBBn=N-Z8@dVsECkikP8(^b{moJaD={(y%MM7f{ z(9^GDMr#SMI;PF$#|q_HFnX>6)Boso`3Z!oZ6zC@EAkt3y~Hz|8HJ|O2Pg4RP?%4e zBz7!!#B@&1ZKyRx$Mw>|Vu&ebd*OU=Af#JJp^ht~T>7|Pw&4a$vuTRi(*(LKwjwtV z(w?u#UbnjAHAgVe2%avl!23*xtGpoJD9t4nq(?eq(kZA3yR-1Hn4F&wrwH?*SK*yV z2?sj36@2hDZxy@Li5pbRq=*rCa1Svs*Y4N)2c+hF5*eLTOGb|~dVO^)_MEZbBh0jj zT^_65?*xp7(J*75Oc^w)SZ9{1uwGLc1qMGO?zd#wr8f}tmlRA>KD{Bf`0nEp2>E5w zuqV1An*vRC1<6e;knx4xoFB#&TFs!#j{U$Kw^cgU&;8Vk7#*_Akj1D7HWKqT%RxE5aZ zl2{bv@)0t{?|5l(+6uos<&cyGwJakFZOH*Ic?2~cI9dDtLYiy0pRv~KwnJ!?KZ-!_ zeM-pQ1&cD@WV=6shefg;P;0b-)-mlXQqBN6tN;VPYS%TK{Ct+Fn!ox7>(#WQ*Bj$B zw2W+%GZImXu7t$fgIs$$)N5uBVCr7PAvGw>MK6!_q6{TSDzfYTMq$G^FiiiXv|h@^ zt=|5L9!y-N7^8oCF&Itc*-g)brM-1^*Zko@w~oDD*qVuHZoJ<=XxSXBTM;GMdF z=aNF*>*E7mAvg1w^5gY$!dcaJ&m>GhN*|hJK1(FZgOyAzV2tc!{mIgTF}d;J~pA zWO|e2k6!wMD6n@<`NXvsDnTDa|DBeG69fMjw0lvn*mqGYh`_YIm(@?enUxeg5BSL z)Xp~eKAmt72ze6~C^KTo($I})3}MiwjU(#RwY-sTgxyb9oyEebsQ_@4k>w!}k}Ja_ z%)G!>{%AFaLIAivg4EMH)6jOzTct_f?*Vkfc;}Fq%oo({cQ{?Lm#A;%$C@);taOFm z>nbnJDDj{;+hDDtJzz>jme1JMIdrc0gMIjDZ`N9Vo3`+zIOF*(?)@LQrQ$jVxsg=P zPxan)wj5=dI$KM}z0huaPDglX^+cScTqE~`>0$y;FE1SID8f>uv=;>XE>v@RSKdN* zel{eJktAomF8NP_i|*q`Ovb(6)tFuPSj7B3?}Q8i2k7?%q1ix6g~-d3Pu|4a5X0tm~cQodAKNZ-Jo8}x|!#n%zmjR1)XI1ih z0v^`hl~#LlOhONBI{|t5F587qo)655s8rFltCf17CT5jHh8uD{1_aI$QQ&{aiwmoH z(oIeF8=ymRm5Gnu%BCP_@8C`K-!z@Z29(j0k7v}E)M~_--!mm5deulQ1`3SU)`$%w zcK@*-i<_g~d(#2o?!CC;F@~+d=Eoxpm47RHVXpC@I9Q~$?)^5lLx$?E=B093y^iO4 z=@4W7Y`Q_YtroT2L%Mb`)6CIwmHkX+a&&^>wDpyoyo=2s{SS<_4qQnj=Bx2gT1vi5 zP#;!DFoJR*tLKhlKCPGzPm`yhoiIf|=%(LOyW@)VgpUAv6Rmb^h5`KIk)=in6X#KZ zLyWIB==X0FQw@C(EiAvH%ih@76~7P6Pv(BlHjjUNu%SU$cXt~uKE|ENSG#JdRFGWJ z<57<+%5g~mmEL3yDNpGj?{@q-P)|h&2U~_vDQ5-ADXCBa-&>lq_o3HT(_>duH(#r- zQ0g*(M1ln+q%|6+0RHmfwAlg`_YvoV+vO274LrBA@gw@c#~YO5F05vWGAl*WG=f8r z)h3R29+CK=?BQQG+b%NDaMB@JEwTI^lN0OL(=@=iNK{>o;BK3xboTOyshiyyvTPPn z1v_L$OibgP33}NuuTOefH?qP{qI%%4+8RYeUZz56q-R*o8PP~KO6E(MYqQ=>eJEK>FGgp$@#!q^#{WHRd>Wi^#LQ~Vmx$zRxURMyh9v%4pY)+-;DTMMqW|MCtq8SMqI((jr+hq@L!=#&w zW=Mvlvg{`DFxkB7tFhX%tV!E7;r4io{n~xFjn7&fW}T#<$C!zgo}EIIO(f}KfEgOS z0!^nW7e*i|Aw6^n=Rl`14f~cejT8whqbJt=l?Al>)w7r1Uit7c_43_%g(SWEfxJ21 zfs&TryUI>PW6e}8gLKr#$9Cefb$>f4X1U@pZVe@c4!fbGy#MLzP`oC)Omi!0di(En zA*$w#g~L~Z6s{JY@A{`*7gcJovSS&LX>A@Jzi&=CVJ5)$MZfw(6)bYi3FggA|GzAN zE6jb9r)V-}PvuVr)ItEK^3ny6?ap>T|8&6}{6ih>8bb8|wj2=J-B1zLdXyEs1Aq`z zT2AWn!7Gy4pDNPv7?eST+)e@~Y8l#aW=4*yUK;UKn81b)V1=SKDP+yMnL@zcJztLt zdVlet8vEfJt)sYL3<8&}o#GwNH`BK!#BU1g?J>#B80@jtFg56Y1H)@H=<72C{W_wW z^<2tgyBG}?xZu3ZR&KQVR~rxabKM4Bts|WCuX-TD_o`Q}zAAxXnY0w<4$nhEpJ`Jx z`8OksgXyLgE9_!~(cp#iJo|eNr=3Lw6+_wn=;6jf%LMA*>LPI3F~V;Ss~^bFA@++c z2a2UT{nh$A#6;jwEs%jM5aigsd^A0Ra)rv#Ni`%k`x%ATl@Y>={kIFFDLd~66MzrS zuzsui#Ot+IbW?+|)gL;CzRPdY=QoFdqGEwS$1lKEhl&}f-vW!IaLIc1Nx%ILuFB9G zE?tg1a6qm(^umJ4fS0HqjG-sd&=Q8p;uGF8H(^!ipPrPdumD5ahzNSZP#7SH?-Qc= z79xf0j)@61YalkFMBoke9>wn(h7(D809ndib9aQ}h$5LSWnwTIZ+f}}JD7ISW6K#E zE5acSfrlV?J3oYm2z;-p(Pk8f+p|}ZJ#cU&wEglN86w8ES6;+45=EluIg-ji=5JLu znM4&e%#*_px{{q&8!kvnLj2#sdeyM%>N)G>Q`Al`KR%SOtRw$icyYUdHx)bZ~zldIeV9SX&Gr zk^@Ehxxl<^Zq5_3%=*%?XUeDxy2P4gY5701JT4BU@C(ciDcHkL;0Y%s^R))0?d075i~M2xc+7z#&9^bGuF zYOB+}hAa=9GUc8;I9>LrF&%)$xgI6#WhU|A%l8FS!|`D&qQq9xXGD9cw}fZ*f1^of zy{$o|8!&HmwG3ncqID+V_f>1BksR`k!b$cFabH~_f2u;eBEgxB-;0F|G+0ah>vRf5 zBJY^|+2)>MA_{Hm{%jiAc=1~n+==aO@$0lan zWA}UUOMkTt2i3~u+C~^0Ok>Ce_Te7#Bh`1i?(_Ientq!!9*H9{q6+!dqs%!`q-I%Y za&ezosp+{WdKa_YZ_;=EY~MS=$iMR$$|Y#4^I|*w%LZ_76MLDFc2%qKYlf@G=A)~9 zB!$@@R?wJ;-WB(D!a+KK*rL&T;#yP@v4s07^)7$_ux;8jfjhw5lEhQ&6VP@N@<5$l z{=XukNba?*FaJKR2=u~5<>cUU+ZBBPjy{-z4?fcP&CCM>j}K1AcysNM9H`}b!8so z6~g{8pGyfIN-2+t>)sZ{6C6xhvp+rv?H;#*SPYSJl;8J3Ung_Were8OITDz^9#75} zxIUdd+kZzu0TR?Ea{#VR;O4sGKFC3T%NuYzMwFZ+ z2u(OlS~4iRAmO8E-29WL+YJ@*hwK&3!o^U;k?^{LG4ZMpu<94!ql{{7=Abh{DRdbW zUg39mEsAc^@;O{yVTNr!xk8OLafAgzF{@>~?H>eu;=t*f&_o%O~ zn><}Zrb>hbSncIi|P`^jRjo05_W+qNys{@^E!}u|!{1`i*sQYrwTX z^wTOaHFYU^Qz)lI)ZP|9^+?J!OEUZyW2@p~IbIQzz5I;>=zOE}f?@y_h?@4!3dQ#5 zHaXcSa#w%h^J0rj#?#zI`>9z;td@Ec`X}c5n9fXVHtLkAL8XY1Y3aWryC&JsLkS5= z#s^d5Q+d7m+TCw;{n&4o^(aR})Q7>FO&yVBZX*IbffH}k-~9vbrrBR5F(@>OAxF6=Qm8HY}y232m+0o=S6>h;^uL6 z`E@DQhcl`-c|B8Xf*^zbs0Pf{V*|pBU=*8F9G9&m1QNe|D~n8Blu4^Cw8|p zeJm%8f?NEmp7U;^x}R4TtrA#cj<5$Rg(1w}7PzsxWa-mFvDRi6(7_cZEfumE%=6Lh z;d~zQ_>Ghw#s@Dru3M}w4)qsX4kP=MiR$-rl=+8U%zaI^(*M*rOJFnAm*DdLd+4b)Mt-M7-jQPilA@wERfZK%yh4Y>n0?=j9Ab}}at;nZUhpt-7OIKByzf?OHrPCs-G1t6`IsPH=iB{rNx4pK^*`r% z*qMa+pla^Vc3XdMVj*E-<$1t*f#CiQCwXivJ2t~<^j2eJM#etBfFQ=qcqAG1!$ZC0 zHRZ2jBNl;S?bk&1EX(M~qRoEW-k&P%52RtIO1Z7DY9-|RqL0xbpAk_n9&~Ch*!j&P zMq>cId*+|gHg2rvXLZt!oRx>MvdLM< zHuj#Vbs(pB@@spE1;Xy7eDB}t_Oh);_eKcj8ZDl5!F!}=yk^9UZG8s&B|kA0DyJQx#mw7j+cn;R&@E+ODa3SDM8J zGJ+@Hdho675X@tr=iuPxi*pz(tRgwppV=r@PVz$!h>IvuK^L!@&;6${Fddtm(LY1lR zcitZHb^dH_XMBfszYz-V{m};jMs|~MI@e;UwGJJV#VK7Mw*I%d^5&^ux2ABPe66Va zvD^E{%8PZbLuwoyjfN5_g7T4305uZq-C3teVh?^NB}`2m42dX8Vi~>2eVS~crQyRQnNW)(MzR&))!`qCxXIrKKv zMR-K~wAtR6SpfXvts;#?VdedCk@y>mY&R)%Isnt*V371DL3<{iZIbSAEX~it$vs1< z67O6ET_Jt_Epr=!yWqKv+mz>QjGEs%a$jMn^Vico!dij9t)~;&u%1UO)EHmNY@22h zHan`pP|DEr`pgdzslNY3XuC0>;5#F{TQ-iF?(ZiPxOO>&C=Lqg)VtarhiIY6zh}*n zE*o~0hmW2OMXiB{=<4(q^U=l;m(Q}o@YBusOvnPEOiAiX7GPovaARLA#`vK+y;H)x zZX3MI%WqLnXG_RGqsSsC`Ow^;(Hps9)}-JqUM=d-I*XQHr{D1BP!&+Yl4kni;HlXaW^2KCFWfx;a_#u{@&BVoZn z)b4HpsWD@-^xdgH+g3tg=}KT$Gr%Q|kQ{V)*$T=KScmWOf3^DhzqX1UcjZv}SVR^D ze?4%`urEKCl#Gav{qc+9@!<>H_Fm(FMeYfYlJ~nw1MuPM@hU0Sp49 zj}r0Kxy+XV5q&{Sg95aQdt*GqTZaqmjG?9jF5q6jSIh}f`EQRj;91Slkp-qoC-D~B znX(*hYNd*Que2UvZ?*j1^>3`bkn9CVZ6_3X$CTHPz4d+8?8}DE*OFRxm*YOij*`_3 zkOg! zi2vec2_O2)S?i?NfMpVuQf%G)A9$*g@=6$98z)4wqfnTN(E0c7w+XmxUKp_yT2KXg zI)EVhB?$|TSPBV&$tYH+c8eryGRTkJ!A^+j+wx=<_eXneh}Oe_YbztBWgFJeMnoe} z5vtf?Hg8vA_{pbyf06+c#V5P-4rf|cdNXi4pQBF}EB2`U+(r*64gubkR__mM)ywNM zlQGG4U3>ut{bO_MH01L0BM6WN;zf8W*qLhbsv@A2)$ShsiM5B@g+?#$_I*a~I%&q5 zx>b+1nWHDy=5RYgQwf1x2Tx)5w3m!)LMo%!G3mW8?6gO%x!Zh;)$94{&z%}8)Pxq@ z!i^b7r$s0#bmw7IAkK*Os{mn?;p^j=8lCZt*dw!a^7R%S71P8F(H|E41If0+8pu&TOfUAnsw*mO6Dh@@<~MY<7??(UH8?v|8p zknS!)y1TnUxNCps-22?WBD&U`W6e3@4M$b$U+S!IdfCMIx8}=K8fu4^BG7lDKW>kd zWl9!)aT!gDQ6gxyO$0uCAqGnHA&M?gY((29(dZ^eii=yaw1K-)jM0tJ;aFoqgB;G# zvTLkn&wY5gbT6!{9qB>Qxd-rKZI9lMZ#cl^K*ZIv%Qy{o+AH7YaFjsu46LT5f5}-+ zdxsiFNsum0`9VNJKuFr8(jwIPmdQ3WDWf817N+JFd$SXP2?7KX6(NIJ;a1j7*_j)2 zQ)CwdK5+fg6!svaC{%Zq1vfKP7v@yeYCPSJE0O9?RhkDFHzEvFvE|P%j|HTZ0dhhF zGMn}{8hGIOoitV^C|EU&8#e4q70nHA4g1Z2VuzI__=~)w6RDFeG)Ac}t?G&BF zv_1G+hnC24XniZUMmJ(P6kcnGB?F)b>d@4r&+%4TKfmgQw-DUb-C(G!Xy)hnQtp1l z!;H1fD1q{HwD-Dl7ZoB{n^dC#WG>n>LLsSc4Ip88Yf$Cm@;>m~fMQ|VP+UDL^0#6lBFz?_lY3 zDOGk)-IruFo1*Aq-Iq>);05=oa{Hka6?1BU#>=JmT_4Ld_oR?|ksxy3k5VLb$S6i8iHM?L?)(sbxErGU zQmPDHqNDk7?~HsVx+|S0g{JsRm%7{LLOVb0u%p6;mo)-BGmAV*kS7rPMF5|p@3 zKlLajex^DMXx4Yu#}Wm49-$X*zQQ|&)5Ve<7Oh(!HHi_*C~nD=zQM#E@<^os@B>ogMHJn>rl&mq_|2YFzP{Fo{Hu%W)f0I<-gs;krGNsW$3OleMe42^mCoMZ>~Dvfx7M!^dklw)wD?)J5^D z#=bs=uT+;WM&fwJ*?K*07yrzv(4lz$2_R#SHu2hXYa4i$t-^&UgvFv{I}_;@M9{9HXl)4 zH&=E;lp4ishHY#Y5!Z!BCuADCM_z=6!<`og$VnJ3!@rE6F5BPNt03Ox^SRmau-R}2 zuh!AsWaD}Mf9($3e~ zVQWm|4-c+PlSZGrme2`lNb+kN?qgZ2JwB66yEIR&8%@y_g~q*|N|_|r6)7*iR2!w# z*X~>QF5ymJx0SDU8ac*Ov9k3mdzD553lfNpM8X%(D4>R_{;3+zL_{-yPR?$l2-J--YdY*V>MHB$NwlB$U(7zYDHpu_ zu^fqy#berm|IzUa!FnliM^s~T^n(x0QoN8QDU@)uH2ir>V8T|W>v=l{Yinh2TEaX3 zDowpGjy+vYg9o*bwA-9i1MSXrB1HV=F&YhdUV{^5Q;pABbYP>QjOF)%>*7U2Z&w+t zSRSfNMtxmlBR{H1F!Rn#BR0=V$MZzf1n6|Kg*?%FeV1S@=VY1V9u&rf&^Iu%8hzP+ zQq(q>hRx8)z~aJu64{t&bBDmLN2S7RjZx6x*4Nr~CFpR(_+ZR9I8#|=8iCF?L5?to zQ5bJ}JJ{X{*sNpTxDbYKNx*q&e@5hyBp`;3JWr`j{0$wX0=v{G|MbB=Yf+OOd1BYs zh=lQ*AA-{TPyH@df+DhBcf*qF-O)*~&Wfe@zfuT3ss!A%qMDa%>ewius_(GVC+3|+hJQg)e}tRZ7Y9tRrqM*1+=Yn7I3cN%i?LTz3TB& z^uum1q!2}A;)hD;2?#J!6ZJy9@B+!0Sh2uqv5F=bSMwy z1-Ab}yXWSJA2eGC;>gaIW{#bQ9o&?JC^#Gd3`C}nS=mi2XP`&-QY3=;MLP}$^9!1x zl_KW!$SyEdRh$3HN`8f<8j*_Hp#CQP4XeX$lLlNqSFtL&XqcKA4*Mb@No~0DOO<)( zR&4jGTyxN1Gk@lUU&Ls|5WiOGt0)C6MeZ(tqPY1S`l4&UBrnH;+SH8cnZp{KsLnK( z(OzUS7GC1lk|o;FExiutyn_8Cro9kSJ~`HaiZm#T^Yc|tn`!)Zyr=uJZ(nR80tngl z>K0ndG{9PxC~e6}$8FIu+pZ#4bBJ7F+rT1G2_YT3uM_iG=lsj&~RTgXAyb8-uK3S2MUx@#9njH&^a=~cS~f<5v=4(M44dkaT< z5RB)BXlFz2u>`$e{l$5Jra!1Q$up;>1djnYaG{k-q&Q*bh`!}r?j|yhx7a4!oyt0b z1i}&JDA74r9%F>(et;35!SF?~w2&NnnKIWz7i~vh)r!7ELgB0?yc8SG)9DQ$b^Qol z$`oc2XtX&*?)>M2^!obzu?{Pq7rl$5Rw0XO>X!*ect*ds)mzy**Qu;xJz`ECMa|+*hE<{X7;!YmfK;KK7~o98{z(=tBucxooc-oh zZNP9_8a;6BlXBt+iXtte572YOf+<33iw^Uj8BgzSEmo9g);T~k0TY)628smhwCG52 z;lN{a+?`aXNvnz~Rz_cRu2r~HMsUa4Us@((<>czQ*G zRK7ae_cmPQ*+Tfy0dX*fd5pL)=~z>VLpqXLn9r%DW&vx0pN#YXAi_Z(Lt zzpKBG6IyXr5^cng|CT1feMQ;>SS&(sZ7e5ie-U3bXZ;k7wu44eKeC6uJ$U{kZd;(&wf*|zcR{If9cXT;c?_U<31<>~z za?yr*SKE(rucx^NO;B&79Q)@V0+9QP&DAG{4DquuXopfR9gh^>=4=RCpW| zzm~5AECSY)vNt~n1Hw6Pq#hsl72$U+hxPKGyfqgCQsQAagXFKj_a{2JK7P=8zf|gU zW9RyaY6uHmD8vy?IN86Fr`=PT)t>eG<#IXoiA5*jw5_t--)65b7>g)&Ilc1t;r3}3 z@vGtdit51+9V$oD=A34fk2Hvs2BvUp^fX;9Y84xQ$1_|&()^x@*e2p>VLGtTlI|`@ z<3Obuq!h>2d;j?gD`_Cq;xxif8C*`xtz~!osX`-lHL?7nYlxVTUBYpBcN7!uXLzbU z=lj@y)(+g)-#$S=CCu1U@k2VJ>FG&ZTB}h4kgiL|c1eyaxK#Nu*Xgh=KWa4P+A!j_ zqS*tD8OLQCdtWn_-S)%9?KoX?F6+oxG(Nv;aCaPa9AMQz8Sw?-rfMV+hc@-@ACXSS zm7i>1)a9m9-1a0MqH|gZV4C8ub8;nFlgu_Xgar;@ecDI6Ir-8Z(3z5gC}-sUVX1)` zUNV&n`8sc-N8pN0eJ+GCK*sJPnE;XDw7PV6B=KObm>tNBuDV1YpyZ?qv@ptwbPfmN zk8nIsVok{O76fF$A?yW?XLxi0IFJ@{hcVBs-gw*;13uwT-0*6^TyLz^ZlBtB1>*t6 zK;Zxx&*6n&w&cuIub=S;O5MVB3u`5&{4Bih^d)=i13Lv_p_Kk}kI{{Hm-JBlW&J(D%E213!! zT6I13`_tx3!A=%12LmyxK8wTN5DaI`7EMM(yI*d|V$p6^u6c-w9ne{&!K{%P^N$y7 zMZ9M7WSr|eazNXsOu5hvZ)sAe(`c&4#T&{|{gnnj4m?vdf>s7FV@4l=Id(NMO!I?N zjj5uW$4$w&+foMhNH|xDUgMaFPwR=Gsrt^j*(3%f8i0jC!hcRmVg>l)cVOOKyJYUZ z9vu<+jNcPYVRcnwia%ZIXmzWnNu{q*7)?|=UD)QTqJ0G zq|geI5`(;mA|MCaHtB)iTJu(O)I(}6VFNVs^9r&^$vywR33y;ytO`yDy+O$2XUIid{$Y>>JPe+>SZon(8uK$)PExS)cmQNcQgc+5 zuoFYP@a*`SDnXAkY$__M#f$%!Un-!7r{nagP(iRxoP(Q5p!adB=-YW?@4$G9YFH>c zjW9+PqA9z0@7(DeGx7D_1l%*PH?()hA_~8&{#RPq*MEu+E!gFYUP+9G6<;}I(KWah z5PzvMLHUkj##zv5sQ)U!WO=Q_$770>uU^v(V(F});gkx4bdE5PRvr%NL-lHUFfva^ zaZD!gu%P@qU%svThql7QROX&=5TFQ(P3kt=-e(dG7^Rc{3^}0vJ{IiGy^=HqcDl5> z!g8KJJ|1#MCjOmEImZjO;Mks|Q2x%`Oq5#kGPdYBRX1-z@U0ClCE`nob`lf3Um{3! zNQsy-7sFqrv;y;`fIcYfwoWC)G~D{%#%I!NB@F;dus$V-aIgySMWDMmR2oxBJ#5iH zZP-}cl3#)1@LGwyLC%hPQ!I8w_(cRs}+Lq!`CIL6Q z>E*4Qw482z-}-=_Acw2|cu)4dZVq2H?FSn>{9zXv<~mNrI@N2f-gH1o z0C*5)l+dZ(vJ&lOIsM}=wy~_W^q{vq4a${ zQHy!HFeKf8X|FSzE5`za5HRE(+le0@HR-OB6OLi(wBqx>7N3dyLvS>lRlLpfepXhN zx7G_8iGYTk?~U&#`^=!Z`EVJv2^fdlJ=hf(T1AR4Zp^q}{Bv!{Go1|o_093yLl98I z^a7u?z2Q$ZIdP1Re=f{pnbSBUHL+$6fpc`*gXgAdv`|S*k0U(1rGsME!jUT&WpAfj z$!d(H%5jzRI|0WJ#z(W0R!6%#3=E$dnGl*Q)(H@fKj??d?4Nc0d!E!d%chx!Qk;}i z;`+$$HTMzew=)YohKkB9E)6GL$WI<}jV}f?p$H9P2mUp&33#wn_zh?FzaN~rCaj`085l`TEr``T)xrzf zi-Iv&JQ}Swmn6#Uv?BxwOJhWYE~v1aqoN-_g7-i4Q_3da)V9@pR^0VE zmw;F&E#{ZJ2r*E;Xo*tV4Az5L=g!VRv+IvGi zRY#9&y6M;((s{9wlu^uXS_fF4?LMLC5O0~{=6mukN!#mMbkG^ia)Pgpezje0nkGNU+>o= zs(t?9+i;Svl9ttYVG|)pM`sJk`&BGgLWn_FI1ZydGgLya=*FYT(}7Vq{YZ3M1FX8A zX2cCzI!aQ_X5EA$iM|k~SBvw>HL{7bF9ggV@uW2Ooy}K`4#xYw3P5wL%odI3$w{lA zh7*i40+X7|AS11g6H=1x{2(HW8a|KrC@Nbp{NdSE0_8HNh%9DbW(v-LnR8|_ z!d|0@oJ{Qs**ACoY9pXjU#O!eEt>o|;={0exq;Z~xKCVf-4xghXnHac%tzUV0J#r6 znI9}7)kXyS$YnpBXNzUz8Yrhh1Ma70{tXKLRmRP(;zjlcy~v$WUGJ*?-&%^8uIil_ zjj@x-hO1VTF|rl&#^g*gUhOaMk|lq7kLIroT#FHN zxfKLCQ9aU)q^Q|CKRtwbIjjvT#wUUpBnQyUbJbJ+tOW00o)AA@nNS%|WD;<>rvi49 zddPWyiVRmpWzv_*$6HKcSc7L&J`{T1P*ie0pxCoBC}|;dIv2{nRadw<9R_1^~tB zWim3Trnmw;c!W#v-)P*k;1QF^iEP5UG92%d56`wRIBhFXbSD7E#67x-af; zXMOn3pZN@7xb?(?0ywQ#J@A2vy{(S%$AOiapT0IwL^7y^H-$)1@x}7|BMw>F&_?2s zD&*Ur#(qSM)G7+2$Ld`72u)_wcD+0n8=#^fa%1N)pYdsfavo%e&@UuhP{sGJo2i17Z^^>3P!qgSbGr@7q>cnjU+O>DZWN z7AIDp|MBgf5Lp`^>B3a3Zfgef_r|ueA_g zSfmy7j*0LE)~DeYJ6n3pHxNp5UJpDzu6WwqDuBExI`!#i3Dy^Jaw1*U<9O8P*bN^$ zit)pH00)t?GFiu(jqI462QgrZUuz`HA8;~p_K1^PCXsy;Ap7$A`lFs!%|fTfP;8P$QV0EAZx*&2 zE(vOJ2G5Va!K;WGk8bGw0LNeNa9|D{ccvm1Xo|D2?07Jz(U+^b(;RmwWkC5Zzc-zS z)Xsx7Dv|ikq1kCj-q|ox>hwOisuEsY$y}w!9{-5Agmk8>5Y$W%ilp_<9K5Gsp&XY# z7`5mDfHwU6{KOz3$=yChmfzBV&IfZeLA;=+M9BzRaeoQWX3^m2Bx^#ToeO3ke9ZH= z+8ycOxF|!9-yFA(E>m+M7&95Y=3d)wic+f7u`-g?8!-BGwL~0Kb_e1 z%cI{GRQAwt4zr#)1W4orOh=8@seEy$Oo~(7UFk2_GJO&;0YgLdD~(2j&a}FjYY0h# z&13>*&w-sE`BZ!iqVZQw&6SA{xOX!n+pJWXbq`mEY1d~6DDbp;>YjEFv_UFSO9 zi~0$OB>=qIP&%W}l7W8wR7&Lc4AJLJX+YLc`ygr&*Ua;r0 z?B_i;|NVs@2tYx5V<|HXTF27y-=R-FwxS!5YhyDJC$pWx@i~^D&PQCY)wUp-ws|HK zU#5SB$nX@R1ckW!ZaV@W%ii&jrKv#WlIK`+6*H-&=CX2;i&Kzht&(XaC4%&4pmh-F zXM{CXFzpf<`W}UHLk+2qp5fvq_6yblHr8V%Xt>H?=QMASS&pj}1}4ShKA1iPqa}dB zB@TK&7(z!2#1c7|tBFk&Jw5#r%rz7guFPM_Dj?>#doz`l!r&hItNm+9J3sYQiJ=3M z!M1z0k=}PAX>hc~U#2nf@>t7|+cg$n1P>{VvWtzu3xl=8Z4Cz2>#1um!L#WD^MM7%77p$^ot>l7?H!9u<#u2udOzXKD+K?zc_V{6@k4^anv`VHTdj4 zERuTsK5{-)d!X&-=0DjnpA3@ZKK=2CEe=stPyK}bA4p-UzPaRQNUL5I=J2TxQeS7h zFS0@yFv--tUOkV_CB}wn{Jb%c%4z32jI+$~b*Qkb%U@@7x$ZmTNnShg1m{-+3b>b> z1efo9{#aAc012JRD-Nj4hzOaSh2c2vttYeb;pttDZgjgHT6%bG*SZTwF)8ALblKG> z1`8emAe{s9s62{rwt-55JIf7U@N36lPneOio!p1DVprOsH10Za!kc;`p*8|Sgth#5 ze6;VIbw_ioR4V;RfY&NH(6Al>3Y5u#YeN8H6S41qwmKRy5~=}@sO>S3OSR?8qJIj( z0k)Buy=eX~4v_Hshz63Jn_j06)Tm&_317rI6OX1RWjgmh+{@#-x%x9dU zL}cu@XKux*Hdj%g#R)QO4h|`chw}PSn|_a*b74qqtks%e30Wk9CC8_mIq`BnM3Hd6 z?#YL)cB~q1Z|iWw!}%%hPhgNFAW*?&LMV9Q_9&n^zx(Njv0Ou^vx zNS4D>jk!c+cpip#Y^KJc-@O^Czp3XB{|n?uiS_(o8>^<{y>R_ zMZ*o{w==Wt<`;iQ;t%x%lLOVh{SHix7VSi$QN~?nJplhvv~Ca8aDA;KHfYz9rwDs} z-oM?`mI$Xdg>@TNvo5`{`>sq)*H3@ojOT3Rwp*v8?t75kqkRP42Xx%;vU)FF(QPg- zsoy+HJ>|+{>PC4gBK`+-Wx8(uUI@bGz=LKbN7fQG;&Y0BPXrk8A~9UvbfsMI+OG2p z%7w5Rda`eORPAaS%kqU0Qs(l)Ws~v&U+Jww$%3X#Qb28)+UH;I&718nAKaqeVYy!B z_wID@c|JV)6OyC=>ItTBiEX??!~_S}k`sneyx2jZ!S_ z2Ac*4|9+5PSYH1@j_*WQ=~vgjU+|-YQOkqwG(_s(&Q!CX?kf7o(@&<$epJjF6EpD)7@GEx*WYgWg zAnQ-&WSmd;_UUW_cf*U@e@iOr+2Scz62qKWBW1}L5I+vD+~;HtSPoOh{=uf`7nkXT zHG7Sgpzzmx$4FT(2Yy5D|(VzU>ukSSr!3EQk!)W*PJMN4Ax88D!{r@m$jwlxnjth&Eu`usG^t zKrVY%1c1$)YDEUQ`mdn%_JDx8nLNcxt?WBx_fzTDm{2Bx2aJ+X5maAFl#5BjFD%K$ zfGe?*bWjL9^-q|aTn_r1W{n{MaDmzQl5D_VAD>~FV(q4QL7hkvSCe@riY^Bq2!+sk zIAZ^F$Z{~oyhGg~Chgun={j-i5Ww)Mw`@ycKtKveFj_)HQifZxvSL4)iDB6BX&QSO znKgH&aNj$qm1t#)d-V7l)52MWbyY0ZQC?0{Yu6_3Bz^iy$Ixkx>xRc-HjOblV!eX2 zFz_YNQ4$S+)woKCgcT#6QywXNj14K_*OgC?V8wR3IiN***EWrnEyH-ODM#r)iNe_v zd2e+9VOe7wj$^>thnJ@0B85$s=|8wx9hCyA~4@3+6AULka zXMb{iKfcry;7as0rm(LgVHlpoVY^VPRm(#zy5+fSj_+f|8|=9&*hj{)dPD1R^9p7{ zUTG_W15J+o?Tsa{PxiQZ7iyJm_i=K-_8aiRDUbB7+CbqLiHgv|j0g(u;AWSRE|re& z3JNOM6!<>58#*zizW)fBZ{;V@eLku;r~I}h_H5MiDkRIQhqlO!LjP49T7X#c;Oq1?!yz$Bz;>uI)WCp!Zt6|hf{;MVA@euZe*1-pt%I5hivR}pQ8bE`izct1f zGK6WR%>AFLsTEo(5*Z*YwkaPRViTV0ZB_^kc`=*26O^{W&1PcRk-%NRvYPe4F>t!F z70A$&5-zJHpnnTbYO`J%s_p#%$Y=#R_5EH5F`(isB_tOlLI^zftm_7#{d_wIu zVJ$`HEHoxvhbaor)%RJ1O@$Q;=g4~~ke1&(h=caa8|}+hZQR)%vZVjuN_(HGp|8#` z|IM?wu+6V&!sS}DJ@PB zZ#PhIC?bXP^1Mfg5e?d4xvmEE0YC256TH8=KSd4dd{*E@wF3H=XlD~?KbvFz1e*&8 z=B*t4js5B4U8q|^Mwx2~m+0xi;MqBaO5|{k-W)3>qu8z^AO95vdhCbYj#*;fF#n#a zeFh_j&6*e5=4Q<1*{UhU{k_2fi-VuQ4uj_hL&ciZ)D#C@`6DCp!Hmpn`fR=7a18dz z9itA=y{paWsQJp;!^cj=58GceNQ)Isf2-k;kW3~jq8dEi5GeipowGyaer4=G{Zlwd zVrrQ!`S=ekrHHOFI1>=5P0EnYz+do8MA1@&$SE>3uNYJk6yQl8#0`v|%0iJc#;008 z!!mGMCR_L{Anv-gc{Uw&d?OP;Aq>9KZWKx0>hDii;-lPfL1N$u0M5;()|>ZvcmZ82 z?!^X=SB@@O)>bFXny+T1>|$$tf%tf$)-@~uYGufpItYPIkdR7oGE%fZeB_%(C9d|2 zB{Uyru}lgZb8f$Bf1dB#FD%kbZHI-Uzb^)d@d{J*i!c$!7mZv0g@We)4TXF$Ue&0U z9;-eRio%eOA5_3V3TzW9!t|Zig!K@}_)keo$tevi0S_3|&Yg@HT=JYNmJj2cxsJg3 zsT2am1pA9r7-L_nF|c?ry7ZW3>XV}#N1}-yeyPS9Rzsk7_4(z|-_6}5W{Xzs`ulP< z^bwl{C}IaqI-v$LIru<75=s$Jeh*6lYE>RIoq`*2mt!60OGjH8mV~|t= z9limTGvC$!15VHlPgR96XvicF_0m!kUc<$`6J}D@IEo z%-lsR4=rJ*!-8P3H?R;nNAsqcWVEu#72(J4fkN5)PNz!YT17 zc|1BWT;;rJ@WiQ<`||Cn`n!wP<6Md84b8mk0UA6~n}+Bfvx8(<|78hg9UROn;Xsxk zD#8ep$|1-!!o{8n=$B0-d`8Zx)ExzYYssjud)Z|6_EnpJASeL~V4(~1?^zXcD`MSW zp&K+aI091E!aGBhnFXtD70K5Sb-NgI$z1OclYrqp&V8vytC6*!*(-;ghM9mk=6m^m zJkL3tQ4SMp^^kk&!jN9dVraz3QA_JJ!D-qa+c_ zBvD5vuPBMFqL;alf7 z!nji^@)X%IaF0Yg=B|@8gnspO6%{Eh253;fXH<(@06m}26z^~RH@bR5=5cQHIBYTj zNjRdeHqyX@lQd6)eqc1uGE!{-jOLX}Vryfy_AH50A67G!raAssJCl+YIl5mj&iL?8 zq1i__rH@VNF^X!HoviMcFnm`_mqx#5gjAW(kD$1Jw}bOM}% zu*2x4KtqLrdj!ySFlA`ueei%&E)jHn-xpDv{lo5+-NK=lpW?q*|3ZpH2e>QOa}0df zv%vbbweU~y9JJsL3^Ke1)fpsrDqGq>fcD71A18#pu}&Fz|577lx+74U^zL)>swXVK z`Z_QA8TXY129SdE2jq3N$H)aaKG+-}0If9Eqw227N!+>eGZa3@?~NscIwSyTrja3s z^B)7D!e|>6IJmyr(3{unFV{lbh@DV2LUuku6aT}f%5?TgM0$7e!N3(Gb#GIO)b_psm7iDm`zBI zc&OmXdd`62WXJ}Kzk6esCi^)6(hH!*nyQ^D0kA97)lP$)7lS$LN}K-L=|BR5K-BKp+&F+ozj31uI+f%AMlNO1k|uM{zj4H8$H~dAioN~ zGH6vbz_<^F1a%AUbyG?J`YSr1*s;%_zsZ-Z^aHDh4y;~lU_``O{8n5@$%P5P(KRf~ zl{@~wS^zpFiC9wsT@99;kooXKy1RDjSAa;q&{m4bqHhlZ6p!|I7U0cQAMEY!LPI2uT~1}X0dka|L%Z>2*~>pik(OGa zsUmq~sT8)TAj$rTEJM2;DH=dVU?^bU?^QL8st|50(;baX-@S`gZE&4Vjw>3lb!O~| zk3)1=Z;JW0&H7~Yd9z3FVn3&1^JLLe?$9AU0rlE^p%K8diUNu|tWQ8eix}yc zv=C2-u?KWzIQe)Px{gg*%?~Y4Q|Io0PqSg@i!gA_Owq!;AeO53SUwn5TL>Hhbm)g5 z6unLVk!ZlR85*Eew31focYdAad`;qt!4ewE@_s!Q3m-n_{&;F3%7fJZa7{5#Y!pl}z z&~D@_SS1rs<5HOs?;8%q0atxaCyo zd1FU|qPBnfHx4xG`5su?9;*gq7K;$)ERKch>FAJI8>{5-06AKxQ6~P|ZnU z-iK|bG(^%L>-Lw)sWP1G^Gpnha8LD{e8@0!^ zKVR33QOt*oXW%eDQNo@0Lowkpovooi{&wLp%qcbd!cg}ez2G~FwI^=0ztLvuKp+5* zD!AZ~5ceH?@r129*g&VVQyjpV(^Z79`dJHEl#nO0fkXV6(r*pvN9P(+ldU!#k2*J# zheIT&PO=vDe@3wYdq2UdxCloO1l-sZM4x2Q$qTJ7H3PF5l~H2Q0WK^c#%rQ!u?tC1 z_=&T4y6y@7A91E)O#_|GnFhF)1*u|XdPRR`gU&qKK2%b0cbfU5V6IH{!X}Xsa~T_O zeh~yf!u{g!gsO3@w6Eduu5cTTZT^&e%v@L{`K4O#6w&zYW6B{_%1~xDJ)2{x6c(=} z1&?QNie4Mhi|=b%hWSz^UyGgcVS6GidIP+`M>T+93^gbrs`(#r@eS!B98+(zn?w%K z+52rN3nVYi=8wVHds2l!In_n&w^{bi>l5bQIDe^@`-T7Rwr1lAsnbbw$`_^FgGcOX+I$_%uEFrVf=4E!; z$@VAWbU`cHaja*_6L_)kVfMbS}!hz;~pA^p%e8(e!JTrpu_JO~~YQ&@Ot=luLadOLM@zA8kWWi|=YmLktVsK-K!d zN-V1Z&F>Ma@L(<6CXe?<28Pm*sCNe(u_oOJs4@?a%XRWPT*Fmd^qS!g|9s% zt=7p$;v9ErS{*V}m4FdGtIP?kH=xdj{b12&ilxC4bA=(n`s0P`v-F#s1g+D70@B7L zrA^6B7b_=coOZR_zb78qo;w5_92^SQvz1uZ3_CP6*Pfni$Hm{rbYrIMr=9=)K)raa z5{^Q{@^&Y)rikaQbXFlgJb5^R#LdX8%H42J#qfc!g8Z*+{!nide$TFQ!%-+0Uiw|G zK@SgZHlDXf__74Yn0&$>56yuapRl)PTg(owZ|OoK!y96W1jS4hEzq(TgA$Omou;I_ zH>#R?g3$@Z3Rmk|Ngf_|3+@rV1g^9O%=KkDdVfj7!Ane7o^qrVl%;!pkQP`$^F`ZF za~1oRFDIZK^zA373eaJadyGR3(15wEKU4+-BcYYfH$ZXT9f8+ILkM+O!*nz`?rRZ+ zBBUjCIHL|s!{G;cKRv;3{|or%62_bo^+?E^9O2z$9HPU=UAJC8=GUU2gl!jdDME}L z^O4}UEb?M}%B)-TZx>~*W`|YRpUWbz0m<%Gi9_YZ&YWDDst)3%=#cyc9p+uWb_+Vf zdu&6v2XRv!KZ%|THG#{BKh3Few6X-XD?9!*-(p($S6F>Ru+SVfD~4vkNId^ReMCjb zkuJ{B7+68uo-lxR+}RRv&C({{tQmwMCjqiX09+Rq7=;iS&gWgUQgU4(H=QonuhJRi z@eTvr?`C=C-ZFI~C|>PYR(I*)?Gj6R+8@mG=E$~%-O_!VvB0sg89U<#>>5xqKzb|x zrIS9FF#Fx?78@Ym`mM-sdD2`aBXBJayHvX&YwV3=JA*OFJeH!Hv!&YcEAG4L#?-$c zCmp0iu?Hu!lK)lDnV@})mQGlz+KMj{evku5?;2CA#o2qI`{ab^$h?Oz2EvTy9FMuYcO<84LUF9{T>tm z=sLprN)JgSfX5ju;kh~n>e}&_5=AbUfqUf6SpNp1S{Qs1v+*!byk{*$hPREQhTKnxw-9`UK$G@N4t>bon) z;y(dWDX{+vfSXA5c>y5Z*_ym33cPqNk{Ocj5X+tM;#XK+u%Eh5E^u1&*u|h=UZamr zKO3zyuX30wAl;m+lX=`QpdS92?rF?e#gV&A!W*!7hiZghN)ef~@Y0|$A9`8f0K5=H zu6mHVtCM+SXdoEJO#zf23KPc(^Wqu!$1c@N|Nmbzpx1{Eqm>9^u}tFue=5WT1bkum z(IF~46QUx^h(CM)IrN_StigWIkoB=7@`KB6cBj6+zHW9S*PeB`M@~Bto`bmxw6F28 zSK#w|gd&ek2bULnjfC1CgZ{n*m!2J&5K%-(1U`Yg9yBL9F*jI%36SsnA3YpxVBvQ2 zT%|$COaHBm2$GpNMFT>F9=dKrc*Sqwik_0-$WM@v%Esn+Wl-hE6ck+fI}x=cOYL`$ zZqpoVSbia5BKh0tu$e=>nYRcLGrJc6bBZ(^`F7{~PH-#6-VgkBD#wLWTCDjl&oEoc zjTnrvY=9ets6d7rZ{ZF)gcHI^fUK53UXb7AGtAqX!5LZj{sUXLXQ)~gXNG%NHc*uu z3U-s(5~#S8>v_W;&1IqX2HOTQFt>{V0DZD^jC9=p-VP|(3d^nI{`B(Q6aFV+q#(NS zw%m%#(DLhfV%xXjo%MG~7`P9~P}T-k9DNceW#iw!?O@q{Y&50gPU|zca8Zcg=HsJx zbf_J33mXi}TDT0Tq5ObDF&i%uDlR1|Rbk^Sd*r=--(KcX`e#LZD_psyRduw?b^WTs zF{pW`s*vB|6TR0kk0|_d{kP)mp#SVYyYV@ohvYT~<*3DMn=d7=>T;4UXv6%R zkR3sWJ<&QgVWrYzk0qK2fngT^`HO2{4ej2kwXATho&Lh{Xl9+b1S~p#0p)53-EJ|a zYuOOAU~`L^p@hc)D#51{jb^(%z_E>?CbR75^z_G7imxh7QwcV#qOc{~GIWMw>bsG*{UU z>BE-E4uqrK7YL2iDpMWb|K9Mu)%aQ7-a9Oz1fMXD3}GLOsg;uT(O< zg2;-RBe8gJSg;|cxeoYJg6hM@zCOQs2=XN9SVw;Yzu@Vg8GQNJai>C|4ehO*>w6P~ z+CJ;+mcFcY7zauV1Qnslk9&uC@*hW>knpM^ZHC0zySghcTn47sQBN9%l*WPWQJb|xwCpW$-=d#u-5u5H9H(zHSSqx3$u{^(l@ z9pr(0z^stJ!H%@!pv!VOSWd_kCqeuW!H-U(2KZcUAnoAk?9|)aq4jFvUPpOdkB`qz zgGQ6HXeR~QKfgXz2{94s-(*Lo9UXb>Fvr-$x1POXGBW)dcJurorMOWLfyWko!coYq z;^^*W(Tj*f9W0l_bzUO|EIk%du-~KCynl#Kw#P&l(wDc!x{7NgiO{E}NhJq}Q>-P- z_3V1VqEIbhCD152=F{49!fPT6`H3&g%G!vp^S6NPMF&zGT9Hb$Y$QS zl`;PT#wkmGxYFHNSKm^x^MxO}LGD|Z89UvG^98Mp$Ga4{84BysDmjwP&dhROb-bU_ zR$|7E|0nXWh9nGp{y0a;HBB1M$YCa3KLvvLaBE=!tH=bAEAeBw(bHngd%5F*r$bbl zd&+-^C9i@!4-70Ui6L(XuvZ)Ob3=|tqR;F(0!+HPX+h*ks##aXZ~vMcc9TYTkM&!{ z&wg8)JOvq#;kQRab4&8klC$rD2f}X~UXM$-y!0J*anl$Ye5}wJh9PXZAj+p55oys=Z>NSV9&h(q}spyI{qz_t48{>tK$o|64nA>Ter_g(rWNR$hsj*Y&asm1peRVHA2G%HL%V~cbZiD(F|SicL|T^J_hy17p4iP2z5 zZqCh<^znLiR38lvsf;zv5u{QS(xmkMHyv3rGP=B@*zr)W<2dfQOLEkx&b$8d8rg_B zI-=Js#rbt1@1L`<^ckh_EX;vNL2-BpoG|<D8wNIt~!!oX;rG%0*V(sH&WyF+5JGl-m3McMbPX z;87Nb?!_Rmk@%~88XE0vd54PPn$?~ zH-&8yZ|C)y)?envE#QW(A{+0IMU_pt?xJ<$Bb1#cKqF}L3gxkK#WlqaRf-FvO{W_hw31c*jeG(rHG&B86nDZxR5_0~Nms}EWf$ARWyVfc zOg{tK9=~TDb+WYc&sJl1pnpBpugi4H&DI(cQVrYbnl6}wCSXyM?vJQ%-MKeT5cG-8bXUSyA zF8khOXJ|s!k@t+A=l6S_`hDI%-@o4e=)3JM79w16^u7#h|*FA0pYxX?3ePc z-I^tgq=+@d8r>>>eq!@Sx0gqpFDAizQY0s$9W%8LV9=}P!uDR}QzzbR?GgC4IBW=h z`e(7Ck537cWm0j$>ahLKIenOx;Lt$Qr|G8FUe_`yJ*gTxxeGa+4~8Dy*_9fjM;a%e*F23{ zpQ$~bfGyeNP6lKz!!UznE5xkN5M<}23liobo4iU(a4Aa1vfnAQVS_5l1;B2c6U%X1 zew3w%$)(|CS8=hBfkwRTkl-jCGAG#Hdz`O~^x63(ll?+jmGXBWN37d$lG!8m&+-U2 zmz{6z7P2ADjs6g6$w-Vz9DHW^z;;sgDG;mc`P<2KKn#5j@!+7wtcDem-Ukyu*DV8k z@q=fj@tvz7Y%h)cS%;7!F3&};}F_@wlj_2M;~D} z9ZF_f@?%()E7Ke^$m1_n!kf%?ejtbq?M;?Ly$4?Fl@wfG6O)Akw#(6JW!Dnsyy&f5 zwffQ1u!<7oA{pl_3w5&@&6+0VIdh)%aa!|>il=mgQ`dyA&(_h6rHIRCklXjtZN^4V<-2bZ8@hFF z#ClBKGGA#R__`Fy{9N}e`|_}>OJFW&eul2;M>JGIVzC{-shCA5nRgem{Ak2w)o%sd z-F%_mA5z7Be>ZaOX17dnV^cr6tR&=_zOA9IKiLCeq?_>cI*SDKt5|O*!xubz^@WOv ztm@Axd%I8(pLDZ87}m1kZ0nrcu~{rEG*rxEuCH#1REV7*BCC|Rcji0|i*2qA3KkP^ zTdZS^mX@f&!}ZU0BU5#>aYe?TC9zOa(kv=+-3y>%Vsnam`P1%gyE zrqSAAZm}}6dG4nQ*x$zPPJ&t7y@`el-D8boKNl93CPmho)G=Co2s2yFwQV&d<%!yj z=1}#;h_Ro=I+wRz-|s$`*xUR$`T3pGJfz51k0o~pVs5OEOPQt%V)iMyMvE9N`oggr z7%~mL6Xl{k?o9>#^%SV@+e*BU-CiLsjwvNh4A8!fEp55Dq+r$&85r4f1XH}w{ryIDxHBow^p@$fY{nkBK}+jhc;*22=T z4vCuzk9+*z(@(e?-uQ?rY2aOHysvLQ4ItsPfAr4X@159+h+%=}UXXMj?-Wqzw`=id zb4rze&c?MxJbNa*A<2#*jgG`>q8sY@CL55Wp`91iva{@wj$@UXJ(A*m=L-k|I;)SU zAj5pu-=&S!g^b345X>yfP3~@${Fz`+;a~y(IN|3Tyel2YF1k}ItBigk>hAKju=@;o zl}3aJ^lR3JjY^P_@Mc?vAABuN}h= z_~889BbLM~q`lpr>>B6!WE)^Hxhcm{Qc>5Ni0cOoPH6e?Qu2%qH)~7}EXJ{NONV#L%hjb*fdR zEGO?Rl^RN}sYs}=%R0;Ry6(4A-#^;st^^+5*4FEdJ-+dMb;zXn8O5vNG-+M-h$*!e z04uThPb||^D)^Yjo4r|(IXT3Vh-16h9OJ+pa+>Rnhf;igzFE~;<;W6c8AXSb=@Mk4 z*}Fp*T|yGt0J1CE^~1J{Nz1VW?7gR-K1IrGyQI@2SFhihPV;z8wF-j6YX&ogLy%j8 z4WDm5NO?tBAzs$r@Hp&0@%+SW0POVXg{5yusZ$3T`x%feSLtQ1Y-H#*A6e_YIHmzW zF1mMDfr8W+rg_=Ux)Q6#juDl=AZcH$#KY-dzFDQXp1%>8R9l0$p&2;fPo|H?)SGYg zKZ1oDE#8cfsD;9$RN5|&z|0P;>dv5VTAK6nsc&z_Q<|&apB@>pn6e57Fi{f(Ijesz zV(X%}fnNHjH_jgGvjo`)&jMTW{+A-w(Snr7sHm5Z4jT0|;>867W*rZsu+X(RDFiLT z`24ioF3!;2r54xmlh@;})ZpZ7ZF9ZXDk>)Hj-CCuTwmR3qF}2XB&}{gtucnA zmZv4y`y~6W>^}^}kjBPd(juFhJf{b3)xNQ~O?+&q|23COd=44Q0o_9u;_}^Mo^Anh zgAiR^*`<+hl>$c3GiZ^Y^(?N^)Smoe*^mCXNNJRE>YXjy&wtx&!*o-6Mf6fgV;E)W z)1xIgJ7(nvs-+q9_B?MPYFOywPIcH~N{bMSGU`^!^Al6yNBP#38IhxdeL_f0II@Xp zExB;(UGGVf^7E&!e&L^k$*mO70}bAA2HV#CV~XfUdx}O-uzV6RHga0THuoeYUY&>8 z$=^Ew`gmm#9}BSR#l4K%Ni@Jvl6=HPmDh`0q`3IW zo#_g%NlA5fl?&3ZcJ?{Z0C3T*$<8C_H2t-AjaR8%0^go%m3iOmIXx#(pj>amHm>xC zs65X*N2RAdkWm)pH7aY4-aCK&$YuY9+zU-e3V~D0sE50%N!x-3BK+lcKl%)^*ffy) zImawoCQJB@bYj80TpX!iOSs|zcgRz^TBgjywI5g<fb&~nWUQRSNVY`%Gc2r>oeTgLOI-_YU7Io%h|6LtZOuq5zdpAWs{*;BI zK}m2w@IugtoSVXHcI$arH!EbuZDaatz`WGDBYb#*1x35A9^Q^(M6_txTl9L(Cg0p3 zR=K#0H4Trt2HB}n<8p@8DNGpCrKEO1JOc>q-os$1u zH$kG~URKXYb3NEXaH4A6XM>@8rslvnxy+Ks;dVUHOJ^oOpo8GhZ^DP=PB{f9NK?*) zmY5<1Lqh{#^?|1$rtFuv-HcOfaST~UsYR!kaLN74{@bAZ&)Nz*9QT{huqd9sZ9)aF zU7k7Q|GJI!B>~?(9mITCsY08wo$1lxn+BiSTc0p)mwVWSZ%X_!>;c6Z?{!v-kNAX?Ug@ZwPsT+4 z08~3%CD%%#YdPu}c|)igfH);TshPc#LDz)L;XAV?*N;|S)Jo({0mE zCag3ghPuDH zhRX=3P-Lvqg^ShVrQW(T_>*WTN8BO@H-PIv#oxbja5oYC86KW6vu<0 z8SApXC*)OudaE1=OWwMFnwy`Z{3uA5`O>v7pL?1oN3l7fy7xsc&AL`ozJe2>>PRiM zzqjnyfc_NPODvv|FK5X~?)H^7z6pw+1)@4beFQ&m@+PD9%+Fudd10k|G zh_8q~l&17or>dE15mEMQ!Mg&Wg?D#vHiCy;QrD(Qk;(M@rWkVX@>_>0q&&WsHF@gV zAY@tusa>@)U2;u-O9F&Et2CAjx0Tg96e_1t%h+{$|Ic+}$vP{lY5NN+evRsv1X-SH z4aE<;ml>D*6d$Or&?~kVe)W^PmI)OyV8}!Bkj*Xf!1pdIF={Xkg+xkcgf^DUhJ|CY z^_#<0Pdk+=Vqu1)C#uY}k$#Mb#UY0nuQiAoX$8fs9G)&W0>7Df4RYlW;zm+hOP3^*o&Dr3?IMY_%n;aVr?>Au ze5foqOGAM(cjpn_)xbvGVq5N%Vu`nYThte{zxVK{b@5#NxZ}W<=L=H5G4H;8Nrl<< z^RzU2JdJ4Vy?5#v^XAgz6~dzsZpPxzbrI2LeK&g$$wldA#WpfL>{hLei!mlAznJ*P zW1&i;FxY&`yT6V$ew7t9JseQ+@$qtY?|ohv`!)*>fOoC}*5g&!XR*i?oy2oXvnBv4 zIaZ`c&oFHybnPcot1_O#nd%def=gr5@4puLhI5mem#?r!pM^!v@_ym>&kKO2sB)KY z%XF@ZOzyh=f2Ri6Grzw54Spmx+U_(?kz;UdngKQ3Q4o{m-@xwO^wV%>?@@&@i_Vb zF_Nes=c0jitS5$Jy@T-1j}aNAv#x0+MoG(^RSSR>>Ds0k2(ge~)mYsZe(41(zv#dk zmfA&oCr?BPUOQ7aS3~{mS|-<_%<>F3 zeSGr==0-gp61riK{rO~~6+_{q1>!%e{VPpnPKsX0P{O2rx0U=#BpT+jU1g+Rc4i^^cTy5H7?rB2Nq^Y4xy$ zq$QJ+QVPzpU@mmKM4IO-)@VZlpaIa>xnQ;f|E>$reSPQ@NKeBnqjF=&7EVq#O~EgD zz%N*dU%p6Gj_Id^sL?aK39%s`LsOUnF0P2~k*1{S6H!Iw3%V|!+Zyq6@Pz`at}FL4 z<}cKlKlRhyTMJG?GNHkb;Qz=X5Zh8-QPC_A6V&6MbGdeiEG6GCR!r&VuUr#4 zV17Rt5jVCTUtSSq7K38mrIQt2P$Ki#Fgjr+pY+%<7bIO?Q&*x(ZDUfWNToKd`*XPa z7!GzhyJeZA*W!|g>zf!Bu5kP!;Q!RiFzXBqfEuCH<%fFNgO0cGt4YB9y(w%@Iup@Y z8q>*tt&Vt)c0VoRXwyws&dk%7D*&vTyy}2oct|{?M)h{{+~4vDb3{1+_Ct_zJdYKl$g5pYm}ac%i7`mjtYt#}fL4e9 zXek_fT{w;-w+*no%_FQR$TPu13ZnIhC=(SO>zlmd_XH@Hj6d@l#hnc=o*La9t&Nu1 zjoIx|S7<-OzoAqvm}c`p>O|U!jZO;z;46E-*K#p%`_@gw#_Zu!Ubtq0G4soV8^94- zMv)zG-BXim<3yBVAWZW<5oPG;%uAWMyPzTft>z7m*@HfaM!CsivwsU=?WqpLB>_}V zz;vY`P5$@eoIONT89fr$_%R?xygyB{p(Sn)8kI+2>~f}+4f-e$9@+(t@T|L0MfAv& z)P>>I3>V)}8*MmJdT2{s^X911t=rTr!M*l6kh^Qj{ev1rE9Ba1zLS>es2UVi!-m ziZBz3kj;gLT$9+4Vxkde=ONLe`q7*F6R;u5&QemYH>`EnH8ZES^Vl(5!+mFl;zYu8 zaQ+umTCLH?s2fDPRlRo(9Q*%skAf@Y9#qpKyKQqfu_PL%e+po?rr-)*F9&ToEcC&s zSJ7}|G}NxZ2nlX7gsa9+Z*-Kr&#>i)Fc4~vnaCT+w`iF7V)UXwH4r9i@<@vGRP~XN zT>q7RmWiLLBfkZaMC+14PSR3!A4S^myC3JkHLf1hS^r+I`8u}10o}%kK()$Ip?f4> zZ|c}l%e>?r{g~8@im$bS1-I+GEI%bW^o+dY2CHs#k`nWfp`_g}ItH3>ZGMqT4c^KT z1;gHltq=KjM}K!&)#ta--}842ND8on6HLEkvW2?_7M5IKub*5FXCPwNJfCcxmYyfA zHA2@g%Cv}D4!1~d)C~HRlkprmsocYOZYWVt3G;Eh!E$Hu=0H`M&ZZYF(#b|`%uWp~ zmN?X=@?qDs{_mLHXFEC(3AOkqhj9HI8)BD4bL{q;W#qh=B@^0=-&fhb_hXCBgAaqG ztPo2;WhmpSQK7)95A>7b#%H=z=$ZBsQDY9cBD8b$Zr-ma=l-FQzR0yh*?XQLfDxRY_mqK=(f+x<7Hg^XB3Syx*PEa zB$gB=nRAdX>-lRxP7LIiDIPeWWP-eW&;`ZA;$~B-CT!$Wg*dpmd$EV0Rfs6xZ)rBV#D)(g*4+s-*o28+-lGtxv#Yo~zRZQo zT_ll!PjS3wQ^JawVOo{V)osR|J1u@ebV}|;f8a41THxxu?_d(x_pf{fNLolYLr%&z z0_k%}m|$_#4x32d+jm}Y2q?X;CHGHpBQ6?gdW@iUVSd&{Umoug#$|9vCS!`C0b4p8 zqbYU!mLJH#ahJu5hvbn;L-FC}8dYElR|R zjf9-%FK|P2NY4tC<$V1kt%7R3k&r+#{Q2#7RdiI?;EM_FfU}-E*bA^hcRccfo0@`O8q3m^{B8Fm1ttAfnW#^VrhK zNh@+DUoRSaWC&KcYJACZ9tFU8af;*+EJ3c|UCHbIxJjtIetK9HDoDxGc$}UdNgC7? zKmf#+K9a8iVSJ6-1vTmI0N4L!=dZ8G;AbBw8fFJ_?gl-{CMRW@1j61tOQs4~LJ|~9 z-Lx_nRe8Me3Rl0LZ>j!;AeF++ypr#cQ9+;PMW7*l#Sx!o?shA&T$(zx8};)p45q)X zYy78ckmC`BILa<5_;46tVdI(zDgr*XY_2z#G6rc-)3I63OQmHsms|2o{A|#EY*lJP zRSEhzC{aMf`(X_P{C6?L-k^O!RbwD-XzVwH82f*i?XLy#?Ar^)%pekUGRSaq0m|L` z9Lg;ljuRUDh^Pa$(-RrHBdqd+5hS4feNPyXAo=xN@d}*yyE<4Hwr2+K^fYKl;L!`u zq04;KK^87Ie*dkWneznV`H$P{5V2KIZ=i6J&t$i5Kb1n_xUJtgQAD|Q09uYbC>pMb zhN5kLzVCV60k?lww%~3l#E0Unf1B+kUIMi$b3G+}I@eBC$o{>taOaa4aZ5uNGg~Dp zgk&C*VEV zF*=z;rdRnFf+%;bXI>@Vd7eC{{5;~Ww@G+mPa_VYAX5PRqL@XM86wWP4aLC~1LTFG zv``?-GZwG^jIsGmE?4-|r|Hr2ti4d?r3PH)lZ7UNYm3ii(=D|ojy9*CHv?IIH=D=jIs3ALQwf}=+mZV zk?`ixK3wC(gp29i@qm~kAh0wEFzthX1eRCS7WgesZm12EE$Eu)M%WCv%gtpX-q(ID za|*ajDphVBaHMl~>z|7Z;4YqkO55!OS1t6Ex){=+>HQo# zOwH0AFENSVOQEI$0@SH?(q-$LiM_S>s3yjN#3{<%tc4Zfu;$ZnpavYunp@p3$>TW; zDQo6qU&6R_iKuqJm=G92fo0cU@hSu^Pc0`VK$c_xRHi|dOTy02y_)8~FNv9)4ARrO zCyfb;xuH75v7zbu*5uj6qbk}y5h90U&Rn3*k#)N<-G|xp(&^cd?G;9~rq0bLD;dlm z>n-j&7#F9LEvgxjLfiOyrAj&g`!*{G+;1%<*szBEe5pF?ohL$WvSa$o`E)f$`HXbe zJBRzBQMaY0qq`>CwsOONpkoRZM(V9!l)vctdX*TJ`*9u`-9eZ?7iP8Lc>w%(W)@ip z7&gyWhy}ydZ*saz3?Wd#`Gb!dk)$}sLw~GJSzWGuIRWLy(KA649i)!h%b-2nq(OaMtSWcs8AsR+Xk+gVD+5hgJJ|JX<6WA zOI{2)DffX+v8@)dq00Jcrq{X6ANke`bxz+N-=F-fJH1szZy2#fI!_-cg(#S^Q21j} zc{~m>l;iqvWa1n{*-`pfXj-K7%`FmJjeim~eJ^#qFdhQh@_zT|C5<~{Z*|f_ zVEe*r@uRUUuJ(i@0v;7gUmbS>U;)q|61l$m*7e`}$~Cx=;1Lt5z3{~T+L#n znUD!|U#d`UHajii_y9Wdo0Ow5m27<8<5y$pB$nX6^i$3%T3}Eo>+wcUbH2qW#|Fz( z-gxwR2CD`7T1MDTVam*(gVFmp0+xQny}^R4Yw~b6GCPP^*GsYiJ(GIhEpA-!h;X~q znoHU8&tN>sedmbbdr{-0n+5adMn|4?5GriPZ+=?A+IZzwE$AvfJ{Jg!u~jIrvdHHW z?j&OG>+V$UV{sD-nN&GOiDeM^M}P2lQ+b8$iQ>3cvJ&P3*r5ghz6V#kKdrVVf4(n9 z;UQ_jK|w*5)uTJ$qN=aGuDYyu_Ga_R*mFe?#SoH`HupI+oH1NsaO?@=!$_*;a@sle zk^6UrAXk$M8JDKq*K-&+E+Jd9NGJVIX~sD?P3Hkz*yPtNPQ`4*Yn;@)Qx&~``?SII&xgUuXg3w z!#CwNfiOqlHtU({!I7I=kC$&BTg|gbj*9n|K%+)CBNm{np8a-vnP6sE*txlVremwt zEm~AW02c(!(}nEabe;k5Cv-B_wf(Um9u3Im%}C&sAavHz3AY_3Ivb60`x*g|H_Gj# zS%A9(U?o}SJ={?N+}w6txooOfSgZA2vt&kOB1pswJ!^cm_zd_tsr)R{HPf=`1g2&{ zZ0+}unBnzxn#lkt#s<;!JF)G7xY4YbXb5uZtS98W7;yh+4*aoSuGOP`7KX=&!^=2z z4es6{1F-`5e9n0DVLDmw0UI}ZDDW9Vua{&37s(C?o2>Z|DjAn2O2BETfeey9boMus zfg00mkfd=jSIMyNA5Ao0nz}9Avym3AFw49i03$pazX#K&N|jvTAGp3^V`F<;X~L}6 z-E*2mE3b0f^q@SxrB%KTX3ZTmir&cIO~b^$%!~ z`ztQC<3M*< z5hCBY0$rYx0(!~oR=gCz%h72Z0CF3iwlRO@58ys&=bf4nON$&#db+D>0$@ET#M`^t z`9hbnH5Nx4va{ZMzt-+qZp9n{Mv4x)!GpnD`!@9^=x-THyKZ>vt`5ky8-re;-oP~& z3shhjDKnJQ&WLlAx_N~5oggj|L;`mFEpY^W15ddNz(8A(4}2Qk%}=7W$ke{`N94#a zYrf2c(Ia_3qXj7Bmw`rB*IKBzB9E5j;uL0xnNv$Bv_-y!R<068hZQqX^a0$GYHDu# zT`htm`k?&>9;d!7&n9SFoXZ*mxP>2KXB~hzxDN>5S&=W5G`uSK zWHbPJ#YT57;E%OlIRg5gtJ|e6tLppHZ|cp<_oH8p=^x}@A?rGC6y|jSPm4S#7 zKBwFt@|=6!{lksPYB5{*WBD`Q0m@{|1Lqwi(Xom%z80;kX4pc+RpGClMhOa+QJM^GMJS zW@dRNY5#dhXcy=gZc1!gM3F7@d~0!r_uTjW)?;G6N2mQ*SG;-2O zUQZfY{5a@^R%lXbXl0{cS|SY@ZrrHi#C$Y2{8qolIhSWK(sbI12r|s?RU$GhMu_p6l<3wK}A~d34Rbl@37}atotgiuz64=AG=w zA>cQk9D1=S2?#E))4A5?hCJS(q&n9c_Ow3v`U}ckFh$(P8St-UUCE@pf5!D!to>4H za8Lx_Lgi+$J`2aHCI})i-Ht7z7F?jsD0`$i;0VQBz+JPL4xq{m+^rQ!>p$fUt@{-@ zEX;NU+$pGcv}ieUJUM_@~;CZqJ!h>v8Sk@*8kc)r{N zP3t?i^bi=ZNug_M)Tzwcv1Zh=>`ujS0AT41(?&QWJH{Z37mdB@&G_PvDy0p$0j6?p zuDJ#*Xmc|%8%XYR9yr9CJqZmq;_nv`dt+?)sW$vsNg&wlteu7a2rGaMOMgYcOIY0t z<(y!5PnAI0D^JPI5R-f3g>bZ>1EU&6r$;ut!Sze+2=FG>Kc`{I%iIS?cE@PAtc!8C zjy2*H`yIdY8g5seF1U-n!gtlugvOYKXT>4#^`m~~TBwWsCvOyp;Z_>i4~- zZhbTxK%h{1q@eCPi=!w7{D6~jVl8ezFbj$~ww(0*s4{VN>WcqK(5_w#x@Ppi4hU`R zLCy%?|A8O0EoYeVuuvuN+4M38IO}(gzH8H0YjG}N1`R5Z0B%$3!%Z*s{S!37QUhTN zvfwJ&bgbc-`})Em4DCk2eM|Yy|08l>l1ITL6})sZqIi$A@_@v1C_mjFX9S*Tcg>lr zo%Rq;?b=lzMQP7zMvw|JU6$bL)}IgJL4jQ8&Lk(@99b2VmfC7$g1Q-}fZnUlHp_|a zjx+Un#S>CFuKxaLz_3gkZDG_>^X$^t^XJ3Bm20|>K<=f~GD$31@CtxQHL_l+a5VuD zb9G{zk?{WsLUtjjxqC&-&SJ8tK0)TsLfHfHV0ltUZM$Acv-=r)|GXDOYJ4t^C^{)O zgI0*K_#Ytn_e1=~A^UOPLZJVbkL-aQ1@I^o@2vbkrvG<*98AH4J+xQB_0+!~{l{1T m|1tkRHos%X|I@tri41ZSY%4*h4(QYXR;N?n;nZ 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

a6v8Ar ziiiW`=_Qn>U@~|L=#^Y6P4{sh@rSd1s`;9Syp1;iNOih}mVj}=`Nsp$0nz-LO|a;R zWMQZlU7ZyeZBm?QLWR;j4`&Md1n5E?pTlLY`c zl3pbEeVk!;U=MgCXc3JCgOu53w>JsXc;gmPXks-BSJ&^EN+Ay!dmg%`yd6baPrr0% z&h;FKurwS^uck0x)4;B5_3X8BHj!Z-cV1cKVZUS)1wkpDT64$%UZcbbZ#eoPV6w0ALq zDH+tKERkd2Hn%2Mxzy&6JE||-s-w68p>R*8;M!)Y# zmJNDDke>6xq;p{zkpu)2!HC8iLiwQ~~>^2 zw^RP@x;HEUaLhX_ZWB-&!F)!5jfKE2IEYzdihk3yczYCs5pS?wsPQJ@t!6mjy=UQj zyk$Ofk0+*(7S~=%)VF_pd^~%|e36K7WT4ZU7djNckSuh(D63iDI4GW2$xqUao=f@> zwF{C)a)Ks?zJEMDpLD_b=-bC?^!?J)<8UIR%Bfdhh){tZD=GT=`Wm1#AsE`vamnSl zZ$*4*@I{*lulfcpJ9S#?q3&l!r(^ z3=!IqD$SN#nYEx4$oBQOJ$3*#(dh3|LVxp#nat`#A$7}PnN-ga+DHPlkQR`D-Bbah zZANhOsYsGSOewr#-nd$}UMlx);QxkGfd*0qAec1IbS|s1*3(&_0m9HU0aI@`mW(!b zE2C6&RluBTamh8renZWTq{V{^;4M2zVoJxY>u&CUhZsHHw(0UH9cTOS(=2Z9FS5 zkl|y10n*rnj(&riqgYl=PIRJN8-Yb*nwc`8!_zKGw>TdpCCw3YzCsB$ag@uUdH8gP zcnrMZrv8?x8J2FgV^L=#tQJc;ZQZkYh=m^mY0_!Gh{)?ym%aq z9~QoS17hsh0|Nt5Rv3itbrh_=xUm78HBx>)nFDHINHS4ZS!hUzk|Px_JG(ec(6#g` zhLG?>piX3LM_{)mFrQgUEH~qXAmKCOh5&T(dYon z!fN^nZLsw_np#DZGK_}~SJa$(rax`)q9xZui|e&641CP^H*?#t%cb7{9oBQw{v7E0 zaBZalqm=o(aKcz1Fw(lb^nJAFD``Z^MQq)0g7dIw&i zfF2#P4eu~73p)K)+W)DN8527m%?XrCn++yP!adU_svyFLe>>8)VD_5Q7Vl|H?o2ed zRtDp)^urQ$rGU!lB50cr%40ivR{{~n{q8m4^fYcWiOW9;xR>fWhdAi}F4XwU{P!;C z-~pTmT>}qU^yP#BkaYJ7q|EE2no2bkoX*q5u5V06l;Vgm}0hYmlVUQI}vPQU@0b zHG-{=Kf%OC#QJs0!CX6UjBw~WJkUw%#C_9@d}+CbpPpr*j=%T%|G4_G{wlHcY&_ul7uzcG%(KN#c0Z|}YK zTyw2C*EaiGYrBSjF~9d8OcPU%UmkrQu_&XRTLwdGYjH9t80W@EltN@>!;|=iNi#o< z{Dd;B6r7MTW^}}>{^=f*)HLgY&6msuL3QR0{b~DaVZ8(|gWqJVSxo+4(J$lja37M;`)1oPe@2 zb$uZXnxK-eO@;p4sbuEj<0oPUbN-TDvl2nDm?gbbsL!J3{AX1)R+d=|5KUO8mYthz zqnl|%0uZibr@cA^=m-@e2mjkWB_oh7Aiu3Hjkos1U-*Lh{h|#a(!}TJXw^Uo@@nKW zN2NycgEl3XjadYf*n<{v)g3&Qp)^i^7~bsCWy(Vs(e3-|iWrt(TrX#=%t~|u1?X9F zc2AE-^%it}+1=mnQp1T+Re^XzAY4Ex4%!!St{R-W=iedeNn`0|f(l(TR=ssqF%OYr z3=k36ld2)G}IyDXr z#k~DA^S+&FCc5Cz9ksP+^}i*hhbxa00aXepKb}cJ%UY$Gg7?-@grlJ|MtccemHlS8mLCwFxvgR zyu{QU6=+II3YAxjL*83sS^i_vbvPxZBYYdgIKcYOigpaoqkmb%LU&(A`qil|VjIUe z5Y^EordA$RHngQ#WHLq8P(6bQH1D zlP^6w(Jg8HeB^J%)hPv#-8wB`xcVeS;7V%Q0{h$ebyRHSQFc)s9cP|Pfw$V9_Fobb zx+JP|kJ&rYWC?aGv>_cd(mri3qZsQ;&--~MfjyUqokh(cMj@bG zMHY)h58%GHsorV-a=_IX5b$Jgz6MA0i-nM$VA~jhkZ?C9ZK={z;@3&eHw5pZq4n_s zZf@jl*G_@@w$2#hJV)&yG5(O;nE-8y;ky|Am)BQggS*Oz*I{5#Mm9%SwQZFHIEymTlR-1+?wA^W=Dm6N@>;ILJOl5uEm zj4xtD@Tx0?>b3NYKU>uKW_&=OkMs_IharOTJ8@;-xi9$pD$U-EJ@MCIPVl5)ADZpt zb-ZRBbp1092D0Jlm~PEdD|5yl`{mqX;**9nux9J4dSa%f@4uTO{nCTLl`J4C+E|Gk z>;Gd-L`jus6FwZFWXvy6f3E?hYgjf@HUrLiDjkKv#k0&tJ@+R0etLD&vG|<)u6#WG zp3C*%zj((OC+p%1E!r;Z+(%=Sf)j~GmjTX>G`6}zC|aXWG+HBi^kZv|s! zg2QQ(LxeB3*L@Mun3RS#pYBo%?7{{U7=_=x3typXZE3ODubZO(PgUxJG+>cwmYCa* z;t(OVZv}LE=t@AwSq|EjI}9Rcm(!gmW<-OY!XjllB;eOj{TWoA5=?7itGwmpk`z~0 z6HI_we6@qQFiAcV{a#EQz8CXZogB{HU9+d}iS+Tpb$?EMIaagNniP{r40d&;^CHS? z_LPy8(d`1Z=`Wjkxct{|)zwt1I!Ez-n2;VjTbRT0T%~@B0pn#Ja*0`b z_0MGHANmmR@l|^w2r0F;!eGtKfvoRrUeM^i_Tj&uruBDJ4>?DAde(dPoD~o;|Jx8n zqsxl`ygj2!36)fcE`Ig7NgT<@NM<#Z!b!Rl30Mg|325$`8S9H1w%7b9vD6cc%J4w* zQ)-@d-FFU#en8%Z8RjQ*J0JA4eY)02pFdje#=^s!G~;9f5fhN@pl;5cJVC(-`f&zU zP@57E!QqQKT`w=1Tk7<5v5kiE-5k9{CsFu)$S}1`39(wFnt>ck~GNCpoX@vIc(lgz`-)X%SJeLm5Auj=`+1oRt~f*ZUhYu5G#>awp;J{ zMqXOm{hZ8Ocs=8ebnxB00LV<^osejlOo*q?TM8A0pA3szG*emVu?bt85OsS${N zC^2B*Jxd4j42nKm3MmK`;1=ttav+5f<1sk>4wUc>g?sFg-)<1=^evp#M+N!E)Re*0 zh@}K>PRNS>>itIdwJ3$>o{Pvi>9ka2+AsoFLdP#_tFGeMZxoy6<Czp!g=}|+_gB)3;Gc!@?-L6iE-VZG`_^Zo~QUZ4Jb$Fr`GnoOalm9 zAp&ANFpv5=TJiaq$g(|Hlt~lZw+yGe)>P2DSz#^IFz+bRsGH`$8U%t zBV92398h~`HF`V2g+icT2Xrexp@!HVhVUDr5237y^lUs<+iDzm{+CWc%7ZSTzZX#^DH@45B{U{ z!^N7GX1Pr1f%OETiR@L^voXKcrOiVcUe)?H^)XpOZUNw|&PHqbMD?P&jTq{|EE;`j z-hC$r;aLj)EO+aqcnmZjMUpb(1OIOxTNR6FFDX~!TGrK<(BjS=FAVAEor|4)`Z*{v zK1EkG;tRkNg_|bqvcNrqcWpFGHbVP-IM4X0Vr;--6_%RHEfx{cy~TQLfg%;lHwod0J+?XDn&P>31DCv1_()Z{8|0DWqll?%s zx$E~VRsSTzE4ezCTZp6W`UgAwb=wvnLRggs`Gnps-YXQKxHu*6ux@_m!Mq03#13;Ma?r{ZBvwQ+WQGut@uz7TnmMGp4wW7%zW-ZeH}f=EKpYbp?G&zex15OS zQv@le7Fi<(d8eqE89M#oE_gKB+MJ$$Tr0q%IkF*@v|x3UseBvIF){HM)J>4fsxNo~ zG)1UzqbhL;2?V^^14VG)K^=KUi+$+?C|4Z2sMxfFsKWBcuil$K_`!z+!(B41Fm7_i zJEq*v&^yblP}IWz?=+rLk*OdL+3WI@IAM`FcYf#nqGC;Sn%OL1;i(^*;YOb9N>jGH zzP6TSz1a3dy|28YqJLvJ6{fi@l>1TQClnh8ht=%IOVb)tO`_~Nu@WK(-YF7FN2|6x(#zwI4nsWF&weVjvt2z%DFh! zQFz67O+AWjzFMJ?aulE16hc*EO@jGO4yEX?yX>MA0V+k6tJh;@P6LjCL${7PAP zYUN$E!5R?b)s2roOu@KC+ZY2fs9JPDEh(UWQc^PKK5L zX3qb%{DV6njG9av#kNui{yR?%VSX2^LIFtSh}n$MAF7&YWCC3w`O=9iOPzj4M@IrO zGEW20UxbW~zE9spul@PO>)vy3p;fbFVsv!0T>b89w?eH-AMptWNtj-DK(^QY9oKdK zGXhgn)9E^M{NMY(0zv<|WE`vghD`eUFZP$^LkLZ*4{X5baA7ao6`7*WXgt2hw!{hw z*Ej`hy197CXOeY21wtg6(Mbfivr5%xoij7)j#eQ!=f(jela#z{3Ot)M{tW6x<2{XT z>VMMuL^c6RX~fQ&9~0Jx&vV&Kd;9wJ>tN;uR{&G+d_!gS7UF3ktuRs&Ma1L9f#nAc z)y|+2x$KTlr|=CHK5Y-gKqyaCl(ul>kDJYo65`Fxv{7)eRT=rdp^*_8onGh~e9!bD zgoK0_Y;7K~h!DRTG)-YvfBwXMLNJ!ISFPS5Re#g!0NrJ4IT&Oa@!5y&VO8I)Rfl_t zuX$}(8Zh6yx&QDqgalma{;8|)HN%RFir#yuO1#e(7d;ox3wjXk{I@Y>WIyZNBgYi7cl@A95rk|)NDTT4^_U4=M@$gcJq!bht^Ytn_ zy5gMue(f9}a2cQHr79HQXP z1QI%WeZh|Gq^zJGb$Qwq^}_v;Sx?^ylPz8nI#0CH>Gf|iRz0?e&2_?g#Y{3gW;S$? z+(=Q#=Mt@i$YjN$v{c%Zxr}8qsJOcnkJ>eR ze7SUV#eEZ9X0W!Sp@~gOGH(vZwt?Y@>ueY5epNz3g8ph>xB^w@<9Lp`BB5rvCMG7P zKI`_|fM-N+B+SE%jEtH>ipSM-vxPcoWjd%3QdA}0jT3X^yc3w}V#@!TgYqX05@Iyw zpH}EuHqWHP=2K1u7(^SJt+&qbC#S;VoZ~I)_WQZu&w2LfG957}K$29o+Lb49T2xvJ z%1`JDF*UIERt93OIE*A&b8%+&>O`O8E8_~D!tFz{TbQ`JW0XOcQTK)a2|I^m^*RIb>?#T4o>rc$I z>fEpCUnzJ%tUHJUw!t9eVE305-%`W+y$Bz32O`92-p*dYbheem9(NzYNY@UE2DVz4o)L3D>2g{&M!@D>LgU2 z>)Yne_Uxtu5S%%@@Y#SVb8}C4g_-cvp779p7*XU>Q0J5@?-!@heTM-0Ol=qb02PmG ze1ZxZKE(_L>Mlg6GAcvcaD4mc&({=s(hq>014CR-nNmWH2{|4CUtV8uJjs}ej#ZP; z_`?Srl8kFwSz_jHkj5uF?9I1U`TBZ1lq!IQ233uJ-;s@tLr)M^E+&T)PfJV7f1)@O ztpLP3p`}g!@GYRRvL*cu+_+g^DJ~k9UL8K6O#O0YW@_5sv$=#WlW7}1`8}TYzoTve zhR|I===toW6gRb8_T`P<_Ed3_y&TWS4;=6j5d~ie%oeC-Ihshl+TeZ*X_1GuJE^PH zY!KXCu6pa=GnM~#*{>VK1yQC2g@C@4<#6V8WCS8)nBg)Er8dxeTUGQI8zHm;+D?$4 zn03;~WAsPEQ;?o?-2(s;`-h;=9|Cn4R`wKI%heLQ)wtCf*`&m&bb`;wU~0IGfm6t9 zgy1RxH{8F}P;2Wu9B9TbGo_BPb-TSx74n)gv`2zM!KFuGC4=16^=bA86^fveV2hT^ z{$%*TSGw++Q|4E{5M?J_hHt1SZwavLt@@(7k-|xe3k&hZ`ol#*C4nXXnl=~dfjr|z zZaE!+ETf9gm<^si7Y0M3B)Hv{N;V{xifKu^7rpM#u~l8%T&o(oh^?_Bga1>7`7035 zhj(m$oXG9%O4%G_z71qmbFa~6CWS3! zWw;I66#T&ktr(=XM_I>*lS9rQAE7X$rKhtx?kL%l&_sr#B(Xo-d!75HgYY(*-yAwe z8>MMLVXy`fVrM#$EOMQddVN9bk4#)0{!*bkk@RGN zTH(jxuV!g%g>XRnCqaZpHxxVopB*TmqQcsS#oZO>`#JS7iJMD~ zLcMz4?sa*$uf@9N**bn^P77Xp&9^$v!2fwv0Kz6^c$Xg@(#omm-__i&gnm~zy2ROB zy+NapS!DfUq5uy>9Kv^W>lfy^{RlvrDV|g-XH{yC0<_f5R)Ohrsde8gVr}i5=c54Z zYPu}gbyuJ56<$3^7Dz>Q_`PUjd@)6XtQCZk#OgyvZk5DJDHig2=34wGj(w zEt4_DlU|KR4z}OTF^igUylg0>styXp=pVmkyqV;C($o^&?SRsrrQ{i;_=RDUf7n~oFChdklfr%kQC1! zdGaZ=UvY7|kdd+#GWQk=>0&*f)YKWXN)`V}7lZvp|NFrU&|24rAWlmQNQS_MOWUI( z6H~pOq&JP|4~Yu&o-=4TbsR772Xi%kc{;lmV4P>gvMMVdHF9zyqoIk*$;qY1hlGYk zrN<*iX7J|Q^?7&=4GxOx3Hn@mW%FxkX*v9!zzW7&Uk8RzMVIY0nJYJE=f6fry&aZQ z@`{U5u%hK{Y-~nVwO9`?k9lzMAo@#LCVEUMUVTvCm8btO6c0O#6^^}vj7xlG2IA|8 z?u&zmqNMa=IhYpAhEVJSxu(cs+rnR`4ksum2vf!JL$6o?{V8dw59QhEDe!D+_o-`m z3-0Y51g@!!cDL^ye|t89w|1a|)0iV<8O8WA|Ar7uLwNkP_`Vy1f6>1&Qby>eq0Ppj zn*Gn^_(VulwDz1?GpGqIHK{KmbKpNOOW0>Zlz3{tx24B$yTj&jw2%rMbbDXw!6N0D zwYb(%hurs`-z@efR#oOS-@rN6xc>afzH+Y0v6X&qf682ooY{Bfk9_6Sww>Mrm+WJGG!j51e!wEC{S?ydET8UoVq zgm3S;JzIHf`u8;7%gc}LysWpD?p0RR3K%8h7dc1koNiDnzN;jEeALzThmr5`qWcBo z-g~h&v9X4hA;c%b!d1vxPjOYFLt^TdcWLbyS@mHG{Va7nOp{4 z8lIk?$Wf!F15xBfGo z^=`VATh4AZIxdQ`lxi(ITX3eOtynM$FTDBS@;RDL3&BJ|Z&H(MsA;4VZ!9dtpD|T{ zyC?kFr|ST;u_1&rQkI}$MMAXbUG=9vz&SFcrNyrISljVjH|#l12}sn35u~I-VA92} zm4&RVn99>#*?*ROD3gknQ@L+eXmDzJLiC1O|IZic`WqyKbbHgd%*+Z_mGgkf zO`vs@8+eG)M*@K2VG=c6VMvf1(r8b5u%dU}M255J2Nn7sGAt=k@Mn=-A z@8Z1H2K4CeZl_3HPWLZZEU$(j`|tl!iZXw+7E?DZ7UMhq_0k`&xcF;>x(3}B@3CTFMp3(A zd3jW5M2@@NMz*56VGRg4CgC86Yf$$5JCeJJ4(=aI10)jf>EbyuNVi>dTpDaG&*DKK zP?$R6@G`xxZ^C8gIDP<+-;UJ7Mkw$%Fl$s*ile0F#G;c#0V-%#Gne}MdIBCpf<9Dv zn3q77yrm5_jjk#9mQpZSqEfG3bHi*X>=CmYWr!eX8(XpqQ2T2^la$ z3`U8A4}RKqw_`uYzPSJqh49>$R`Q%wi#4@-J!)xbg&}5A0vl1X_53_4N%)AxJGE^2 zdS3ic9qk`o6ah}|6~R@*ZMRGSGME~+QtY(Vn)ryNj3WlGTQx0fARs)U&~7kR!1(2V zWVmq#J#QK-DKGE4K5Q-14*&kozWs~f8A=oQoB-`9z(@Zey!88*S6@-Ipv%eEuQv7* zxZbLO_hvn|lF~`yc7~_8Iv-c{KV^8h0p8Bd&;K%X98)NOy!7s6?&yx>gPF3G8|lHet#Q7X z^dUf6Dg@d}OSso0nhNV)vM>36=dhJw)UK=c(byHYiOVz9I#fk|BBBT4=K zbm;swx`BjD&2z=-geuolvErL_=lSsX`|{YFCef$H#>UEA>->MtYD#|B$q^C}^;)qJ zF{oW)SD&6l+qXQz;Jqmlt2#NcySZF-CNxFD*s~@_e$LB)L=yUys|i`(;`MB3iU>NAno%$fS*Mg!@N`|0aJA4YPl6Ox|gY z`Kg*W?a{=ncN+~lt#pO*;UuiQ{_vv>)Kk|s;^-nQCBpbOhMt#!=#e1l?HQ_>8job2 z8fkQAbX-*C^GLJ2GN5_DUKc)HhKzd`<#iByXh2`YeAU9&iIoEYEm)!+bg(1sWI`cI zb$NM&lEKDh8dS8#l$5R09guVUd!Q(N>sSqc=xM{wBeM7tcMEZFSr{p*0hCqPCc-l` ztabQ%B40!%Wm5u`yR`$iRy2wlJxF<9boHH^hIC^bZu+TDJyRXp46DZ?tLpAe)S|&7 z;j(C;swLoR;2$swbh|viXosEWvMOMsJmb4rv)8g4b1k8GZgwEH*5ew|#PM7&zm0+(BU7c6>RR0v3c649vKT%3~d7=Jug@-{q`!|Bo< zH0CZKxh|Q**U?~@W83fY+WlEH{%V|^|MMpA4L|v#Qq^^xGq1#@LY=$!pCGXUD_2BT z2`*tIoJz`0hZ*xgX?|$CUrLnMlgIBv<>GW(Zij7R#jh5uY$?e2$s0?_rLhAvR<#HmIKSFK%TGzj^etR^Dj zKRE=W?LugZd4RJ2Q)cc6L3VL%TpAyIA{AW#vH_S4X$&<2{!Ev+9wZ|4!=wFYRI^Er z`y7{NHOX5O;xqUk-LJPxuj=aR9(wX)u#Cd89ZbLKmx}ds`@tW^jX8Dc)-PBSw>pKDx=@c}o? zX?b%Q9K#;El0!jPTv8%+wRd`Ql2HEDtS7-<<>gDC+1BMg%{-oSuO}G6o!&lv0zWBU z662K%$>0H&iFNbfTI01d=)W}!g4)?tD;o{m24BrdVjfpxnrvY=ii(}%Lo%)U!I+Yw zl6L!k^!Nt-+pBw}ZHI@}KA?o|Y#IyY zQz9nP~~VRjd0LR&&)_d=z$m3qiQvPOdOoy zN!v2Brj&N^RK+Nn+A4bW#!pEqq<`0i6BqxQvy@nDBZT)0#-Xj#eJ2#%(ZLthi>H*8 zmxoZ@K*778^eyM{Iv(2C%>I{onLxt z--fU-hvlwfmH2lm)KAbuR6dwz0=ovOXST4Ww<5n%`s-@Sr^?HlBEnx3b8Y@Ln(<#o z@sxHn*kK-$^t?d|iYXE$N2kHIu5BBrJ-iesX=!K586kO%tMgMOnlGbCX;(N0Lw^iMg;FCmtNQAT>GxLUl`G_>N?@j8A?(jhz0>Z-MudFsDk~Qg z2@_MfWm(^PlD9I>z%V122cP$HWDJPxB6()*s&uM+pBrt}X=PiZDI*PM%e{{pNof79 zo*Bg^>~Dnlp|k&&xN3Er)7Ge9c#8sg%jI3O_3Lqm51@PBOs!*7xuDGSQ+JmmWPeiH zm1EZD_WJdXKV2<3KJavjm&;#eWgjHk)+kpP5P~Tj{pK@27N*Ob_`f%HXva3&Re$#i z>a7PCJqL5e&{BaVOf!ZfL59XZV z8%pb!Pw%}2K=fxWb$p7$zwif|mVMLE;)vs7JI3{6lATWW#LJ%6w{%<0&}1Fa!ub2w zPVI~P_*n`}U=)%rTvMg&Gzf^{vKm=U?63JjbiU&a=bsK#luZvz>>V7&xpBFxpptZJ znd7(=O`(a_QiAgu0SeD$|2uj3;r^n8FO2u98GTvTu9!MDQ0Dfsk!#Mk_RX^UA)p<| z>M3RkX{Cn?7d6~34%oMkXl0VTrI{K<3iCzwBLLE2bv-fc>Fw29{}wMHVbV^m+ZdV7 z?Ywd_$h`TT=s7ZJvNsmO?_oqiEcq^ftIag4$xw)}{tXS3b zX+?nq>EF=wV0b)8ZnIH)SEcdo8vVAWvSn^nEC||lRjr9Q*gRoLdfe%Uq(=|Ok8*B2 zk`|0b`P7Sfd2P-Ab444WV3+S2bNh{N0nIIZS^ZEHgI->KJ~@T&B3nHSKT!|92{a}N z;p55vZQT5s(ne!idk9)298jqwUsl=N*w6w;cMbF`S18di49#kmnMFYbeU;CafBrP< zZH@9#TuJMPboxDB+AD2o{xbQbxkx}>o?IaYyHXe#I-rxo3L=)E+GdbwTBXuhJX%0s zSURXjjZg{vq}Tqm&fofh?|Kf_~3@JWCq&{H~j50)Iy=rzo6alh;%d4G*ul1&@Pr?g8)BC6H?&!3%qHl7TG@7fc z{l(>zaxvJcgT;lXoc{-@xnjSa57Fe;)YQ|67cK;yA+Z4gfu!0#z{G7SKan}W+S=#> zJ)nMYeb}#~{6n+ME6giiuidgQIiQHOZ)W|YNPgu-F`G(VrUsruhxwgy*_l-&ne)3im&Sa z6mr0;9}w#v`RFN50v#BC^~3OrIGY*NJq}jG_d$69SmR5YNZ$7Bp7k6+rx5v0k>)zTe5vI32Iz ztK-^g&)3cF!NFg9o8^20q?y`T5)|yHJ!=n67eFAP#9Uyjt*%}?rOJp`kk0udq25I} zH`_@o>g!L>TZ*28%o>PNNl8iN(Vxwu1tiihCIE^OfSfZz?5apUS9$73gqzFeK6S(H zfxFvsgyem(knPXDzFEVvdz==kiq4o4TE+`1)68 zoewIEp-=%yNtB;unn=}JdLb;1J3pL22bk?s5*{@>XtmiSJ+Ss!t+)I|bwRb}CUX6y zU@Y8Dlx8&iq2rEd-XeqkVePZHv5IiOv`F%j0WSH#g1-7-`r1En$kC!ZoYA6G&1hqN z6C1l?o$XE4=xiVRkj)1dE|8DTU~+K5Eec^ z$(WykuDN+5_ujc|3|q2yFv{9`{PN)USUgQf!0}O@(tr|&V!#(nTq?#}_(D0N-}lO( zRr>u8^gB2o2yJQ9=Fvb)|ARH-*F+bK1+BOce60)Kqo@FD4Qy$Us-j6i5`2HZu=v_B zIDxiqG~AWS%y*9~$9qdmNVp@f_MS|Osm^*c%FKIH7Q*EAoI{I4F2$7)?KbFl3j36Qm}=AhB&&u}bC8x-K5 z?EWn8dr@P}dU+^1iSmC@vI7d-v9hc+*yGwfFJjbn7O6@{lnLjZT-6yjMsA6`?pz;* z;_IM#dA*ab9eZZqD@#olN)N7#cfYwqOO<7kSUU4g-`?MxQZI}DYz#*X%hF#j?U}BF? z0aG(1Ox<^mqw||T#Z#?qWWCw5`r@sCJulRa`+H%f* z(eLu6MovkE43xNzhbH87kD<(9#vyJRaXJ_?g%!2s4S;3Qh^@j*X{n6z!Y}JK^bjgt zAQ*AHycx_d;ZaP}ay)mCq&mLP@hVEW28KQF_a`upwf;5piiEiHrC2MTpH!A0Odze}3@s z(S7UVXdW3de=Uv&{r&8;FPx)~ek0YOFYlD815~|cTcyDa3IS}Z@~|Gn-N?>61P zM+*%32|x>=7Cl{bfg{vWslP1tN0KsLq+75Wj}Xi`Tl0Vx+J}Oi100;)dV}4%RMNNt z?CLcIC1vl&$VcZ?vFU+4qlwJz{(l?M`#WY6RL#MK8CDRtsIz{|wnl^xY`Wjso@{N#A- z*7}0?bPu*7>TT3GO3d=!viI_`(mZfQCD*A?;~SnKLY^YQBU_Q7}N#LTUGb}emdmJN-Krg=C-%oQK? zQl0L9JEfdPLCq6uCRc>kJ^bAh4?Qmt7a8ucUb6P~Ro2GPW) z$iwkqjrW_4UGsTWdf(#U)b1BQBwY-MKvW3OszP@_I|Ml=XXAV-QCtAO#WYJkLu?+# z3$7nj`z9O|p$s7*A+?%Jcy$@~cNNQ<6XzvnPC!_i1}<9Siw}4bhS5#! za2W>=Cd2^%2W^#Tj*;KS+;_IRJ5lKEeq8&!4|!9|X7@)>g&yoK)@|Ry?A4_cnGOwP zj~iR~>Q~aZh4wRXJ_P*aGOUYfY&5cbI@Q{GrH+U?%Wr)7%w?WiwQQ@rw_t2(xpV~o z-P~>Rm*GX9eE9I8YOTyUKMB|e05tF8gpU~Xg3HI}Q(h6{)~HpI$kQ(iPJv1nYhQ85 z^n`|@vTamxENUG+f!MsLgtu%SHnRJA z3N#~+Mvlh9z-WgS2ryUJHyezLmxdC;26B8wAqD=kFiT|>6=cOdNl=NyMRSc83-@<| ziiaY$R2k5cRmw&E#q)L`XkfqfY$49{N*RB(sudDj^J0VdjXLY%9Gl@To*{XElCBvj zX@zA|?f}NgJBQVWfxjohqFofz;L6F?wzG1XGS5WjQ;9Hy4GU%ML$>u(8Z{JeN{3$tIb-IVL~5sFjqe%JNPmB!u<`z8p=ocW zF!yR7NZU*vyy6(6Y~cSBwv&i_CJMik$u-;z43vpFTK4~uvOa84HyqRU{h)atH$9n_ zREg;Bbm(2x+?U=%u`nQSOMt_nl2m;-Q-`y%knD|zt#)){_T%Tv&|MN2-Ly)RtY6{& z`AcNGc-+o;gg2Z&G#i3~NQe#SCf02KM>qrmnva!u7W*JxeSM4WVgi4N9DgPvQZtE- zodtiz+#9v>N?^6d_$91ku5q=unWV7(Y4o6j0X$VTNB(Eo4=+t|;LgWpjYG7~p?2G_K$$ll3Z}@tz1Sb^XgK{KaK-grTH$K5xyf!3xbM)}Uqi$Bv->yt*uY zU=TW?X?U_`!^3g!A#%2x|ApB26z#K37*X3~qX53&}V9?wfF=;*MpSIMI7br{v!IyI(3N74f8l5cZ(^W0}D%~ogA>z#S--FVf{ z>6WvTBYU1x?Z-oNZU^_}^+O)^BXT6_!EtezS|3iiq`u=y9pVL|ADsSj2fnV4MW=(F z^BNF~lfz+?{m%?xN=AP}|r?C?ZjhdhxLQzh_H&BS?57aDh(9y)J1O zTyMPCbRE%cZq1ly8XZMw?C=&;1hPt3edMQhS@N2lU4L+qO4>mS7C{D?U zDzTazMP*&-Qeu<&bRhGbUbMbsC{nbn-DvvSuv1c1vhD_r(t~{*&Y)eWaJn|SI$4L( z9i4>YLZcs{ME&~`SVOM8cJX}4#K+aM5=}`wJ;2Ux$&$>a<2|$$>x)F97Ic3#Zb1d> zVi(h;K~!pPXdw8`dqFG~MgY=46?sD}%+@32gzNxwb8}W*fyE!|x>{NOaJ` zg+M(h^b!AhkUlmzCYCki?LFQn8aN)eqffsuF7LI=yH#fmP^1MZUo$}&<%PV6`4f$oB6wp0YYGz~>bj7yZzGgAyfB1Zvo?feGgiVZ*#Unk9D(X0-E4tV8Rs zWo40-u7uopoJSQ4rVM=qZv}^$)j;t`tyJo-H^tO| ze>M!kO(2w4H%GVZCp-+N2+dF@+g>>S@pbjm@IqFrMUCJrYsT-1L1$MlFk_RVqB;4j zI7&7Xh2Tqd)U!&YYodrx;BlH7%IcxENaj9e#kSq5|2yr^rQvtk3NfbU6m4h=ygvE= zEY>3w6Myd)Z9RB|tgpp}UecK=edKZT&Hi1Fim)HGw zP}Gl|DWaRhD*Itd@d(|6xyE!hVV8u&MEtG=Cg=E=7+)}iC{UTe&h<4(w6`b95xS4( zR73*UsZrimC_mmL*|zlrU5SNSZDOK!bBjQp2NQ5mJex`Wn!WXAd5EceENnu9?PNjN`vRxm6s(( zZ!7O{CPR5crb0~5G_o%o3vT~+xvB)S<`0Cm$XjSx&WYig)glWs+fX>>9YnuBn|(|v zZ@5fk2k=o()1v?SV4?v~MUmsHr}4T&@bK^mcw8#24d6?`pm;hZRaKh;XST7zwHrv|7bc0;k8JIe%12Veh$~Vt$zN8 z;Ib7iofbWYWWT|LsTc0#vSu?`{TYk&JG7EynI-n&@c;XA5F=yalQo9y{+c7Q9vZtq z@KBQj9FjoJTS`hw3yRQ-MK98e1@{VTO86qZni*hld-X`er9w&`=FG=H4aW|Tt6CJT z$M@Gh5s*NZz;iLJLjjm!>|-q~@4Lx<4_)H1?rSTLxH9`>X zF+%Lxv!TXQi0<#XKSJ4M71Jr5Ly49W0vHGxx7U2QxIao#+=h1~)#^Q3%v@`6-?pl% zF{HQh8X29d_UMkik{j{+?+*dLC@0ywMSFQSMijmmZ|nv;XnO8t^-=i32g54!DW>Ut zr^RQjKi+=2dTq!b3Sm4^fL7*!UnX}Pgr)Ymybcrtr4yO*3q#6Hl7!(sv9cPvm}N>u z;Hj3RmO2j^d^?fVN;~I!9QH%|$D}*V%*Ac6j+rTCgmi8777>rp7aDzVUokg#}9+4 zLcArp($;tw_cqC9uCMVx&_P~KJkqW*cP}&@GZ&>L=J~&O!aJO!O+8Gv^3gNworSj{ z3?9tciiYw!I+3gWk=IsBxqaM+Eq;4@77q!%_`Ahk_uqS+BkA0qRL^qz(m3q_g=5BV zR*edd8ZB5tmz*vh5GX4UNIYy%{0pr@pe+g^^FlSf5urw6xXMXA=KeV$2QAp($3e)e zS@h?El%9sbN5jruvD&R|WmOT(&f07(@loH1D=HeizkQ&8SMrD%)M^n7`ohpkFy2tW zVIwp9(2_0&)&CsHAk-4Sx#GY#xIFSKSC{|P;__92c=`*H>>*xqvig|@)+BV~>%SMp zB}J6i9fMfVV#3$2XO~-{c!PD|ct%Pa;;LSLQORs|WW>fF? z#%c6$Ss)|9`ALS*KMnbUx~$|)=Z}y#uyRCq8_Mu|Z^36@lfTcI^vYV|!rmt@CB+N~ zSXAdT1NmbYvraNEDxK$F9}y~fxY*n|Vmw;p-#c8%hVB~PK*kILmww%-#! zeohcK@Hx|FHC__?0K}|tOk9T>Zz09;P5=`b{xEo|2*@{cUg7A0XGVd zznRM%iNg+^`%9-`-oWBy^Lu)yIB5&*N@)G+^jLR;-Oo9u)6+P4wWJFFySMHeapOM~ zU+B03Gl%Y$KWJbu8c$w9{-2T&I{*@pu`5v{#Us%w@D|1+y{fT`>8dW+#M~;T+nqTc zF59p<^##nTu>YQCeP01hP3Rk|%SX*lR)qr;G%8w)v1hal5-mryUq#?~-+5DnmiOd8 z0u1Cf82+m})kS7sZ@n1N9f)D@HHJEg-5dh`k~^#D=*a#cWSDPuM!Jnk*4PARUjeEQ zB9?b1g8pGiUZ$>E_+KB}!R-@3gN7=48ToB?sRh~PFgvfqtF=2|z32{Y(P(q=h+Rz-=Y)+1U@Scx1%6mgBmRE0r9>HO~ z=rGRNM9mCRBM(D(S-tgCHH1uvt~{z$S`K%2sshZ%@$k+T4y4y?_q@fmhS0>K0Kbu! z^z^>Cs{WMug@pzqX`IVjDW75lWWWMb6eOg^QUg@!bAVH1$wJxQ6VxOoeZg&jF;B6C zt8REE+jEIkJTNkzG0-*oGr*Dg28|}S%Aj019xv+Hwm&>`I+_+^4YBI+^>6({+UC*m z@wwumMI5@EfkyojiV_04mBUwH18oHgI69);-F@LLc|uFuzq(Ayq{@I zEQdhLJHE!!3b)aZ$G$T)Ev|;O*fYNt^U^Ux-ayzBNh0!s0|pNn54gXo#!lHV&W z&>-O1`NY_kPy2`BLBjBInxg#_o+om4RcNBi{R0KFc;Ru?O|0LUVEJ>%E#e9-H?FJ> z6IEIc(k%LIH}vgiwp!c>WAHls@fRnj7Klb<0dc!B2rAU{-qVSum1NL{>H$Q|(+b#% zUOcZxdia$=8t_i;+}}RG3n>hFlWV6+Yqm-F496Z%Jq(9q{)y;xY%kJbyPxlkJ;_)G zzw;B&Ptywql#oaIy#v8EBr#+zxh6U#h0ub-LL6WwJ^1V2c+0sMlZ$8p&vyNo=ZUz> zq2V8!kz0)fY+>>|%Re1$^JqgS5G@{p|l(S;`*L9AOh>V-`2fx z|FaZR5!Vq_(1uyX1COAuZfJXuwz->vr50d?LAU5PlF1(lhFv-~Gdl^uSIK&>gs6ET z+T1;0u_YgGkl0`AM%Eldn(|G{Nov4zBzy3Y>-N||{bsJh=>r2;6Ch`S4m_2yqe zHG_6F!tXUVBj^LGcis~cZl}`b>DQBY1JRVYswQTlCSlqrBKLSwt>sVmX&z1-GNw(B zL*hYycx6!P2bn7xOuA@MJw3h!_s!v`?ofQy=LNEZyq(4#2R}us{EHtk!7ed-|IGVw_t^FBp!xOH;`mleFEEhA1M<5-Xzsn?>8DI;eIt zr$~!RHstR>`dU^OGz}AeVL90V>CzweAS1M!KN+O>-vh<<|FGvIHui@MQ1J7UGBPr{ zsYBZLcwA4YhCZ^z#Kzv1e3t_2knw<5lhN$KH)_FjIiECOA^4>S;aEIuu@6X0VHih) z%k@xDX(Gj!`^Kf;wA*VpyNv+{!gZ@NMPDGNmc*w|FSOM!d|g(!f|~v4VrQh; zW3j#yGBiAsFYdJfTbLKSsNA%3@vdHc@@#F*P<<_IEb=P@)Cou(KL+Xie=Iu!FGS7q9QGU$A92e8FLsly_vw``3qHwX6%dU1ZW+fQKGXj?PD7Vqz#*c}K5gMbu z2B&e9z(YDoe<6s*KxOQT$j^QXiRTR~iT`)5s^Q!(os@^&*%I^CfmT^FuA!g_p zK)Mv9%Yl)S?ruRqLKKjY99mKlrI8Y(ML>FJX%z`+P(o5E0pUIKJU*ZA`@62e|G>G= zea_x%ueJ6*&H?bdS=^8@o|>wdVv1LSoYCG}4$iPx{!Fn3?$8B79Sce(iFW{KvEf-# zJG;Hhts0DuWjJ6od!NnrDfdJu68m30hBsVX4-%ASAE`8?4RC@ zhhBIweKD6J+;ryZxUJKzmj#0k5>@AB%KzM~A*yWR7p?6$tfd^00o`Oh8pD zoLG|Hpzl!axrmwx{5AAG`%|O$s*MQU1Gy_VmVv#Q?01NTi%Y2){5z-zkJ&)%p->d~ z=PWt1>r6QJ{I=uRU=SP=6CA#(3K3l5%3-hJp=6I+oTWB(o7u%1&X$4~TvfEQV=vOo ziNPnKwI5wT-aP7z1iR&g&8Bv0@7O-0nc=kaqLtz9-7zFVQhraE9tWQ*2ZzhkoYR0r zGhmUA-{a69EB1Zhd2sUol)}esA~rVSX+q}6$8q2Ju;-V#Uk1Llxkd!lZqKP=^V$n+ z=k&w6(cgt|+=_26H7o-|)2Z+3zn6O~776u2RhyMddM!ck488m|xRec5Wm5zI97-5J zjtf1C9?$}n&{FBz=yiAHSDw_v%8+fSSwz6ecC7vP0iZ zfr(T3>DA(+gSctU>Q7ddM|1D5-$5nJdQn~wgc*o!|uSjPJ~uXZm-DVSB5RYZlo=URN7KN<3p z;GTbMifzY=_ye2RU5DgItJgH9Yl{!jjDG{P&B04X!bPf3r7K6T-j`lyW1%sGM#Mc6 zrd$&!*=3$ql3o6sY~f+!vt9g3y*NAq>R+)2jo^OC1$&ZD%)R^7y@?DFhp&>r>;I#?;pYebS9bE5P$K16z?3Dkk9gt!Gq&4Mw|71?#tdG0pP{c_a|4&CU|(*j0D#;R>haOa&L=Ra;o(!4G&zj<+fc_wO63M|c2%H!@4@mGcY z1=3}w+c}BgQq!_D*G5I6HbYLV2ay+sMbEU3=vy6EJY9NhHOI%KmsFKkYVUIVjR#!< zp_sUe*r~=Q?K6~Z==>6KEZ@xf-V7_`c{l9&IMuN1>RcUbaT0d?cZ9w(azM7u>z;7p z^3w01nJl7_Iu*8;Xt>t&-jc`Ou*{Bu)+@9Paz1LiVVRtmKQnGnj_5%+c-q;J-Xh#~ z$h`_d#4)44aar(4VD0K$`^Bd7^&xr=Ui%g#!_T>Fnlt*aZsK5aXYi}SLMhJLR9brZ zsTS&q`Q!DZ{a!7QINz!*EOgkt3BGt*>J=X4urOeqU1?S^9=1Us`ZJEy+4+n0akl&p`=%gg!_L0R%v>%1-Ke6lI_|Zb0TY}o*r=vd=j$>oWCthu=p`8#~QFxJw zC3++P22RLoow>FZR3u4U7iQ*j^ig2BZEFHkOI0g_?(>v_5sVU`7Osqa3#NqNDnB`S z14MLtzVFUly7WUn;4{=QGb@$0;vp#rs=YI$_x*WJ&W>UGx6FZfdQsF}$SHeh`c(k2 z28HCfaYWKRXhOEf`0d+A&i0HyekI#F0-jDt$kMM`Rk!s`+wYSBfd97=G0mM0B=ZZgU*qGoyY2 zb#W~ntF-2-$h<*&CyxG3DiLC_AL}6Av2tJF*XB?6tQx`#Nl zo2UBf^}||WHv#Vda?$7|yjVW5Dneq6nw+*%Pd zLJeF~z5DB*o|Wh4qbMCzJ8(0VT77}*h&7d^DrF>%4G)Tx z7YoD257?2`rg&5<&p%ObQ>>;UQkDvxo;Er=5Z=&^=j7^H9#b)Pc^TI1X{O7e3@;>j z`<56V^^`k<@S0CWiRRv&Yd*@QRM$C?P}+c3OpL{#PWTsg!SEn7hRT=xX-L--ORz#v z_|{S$WpNdXnDePOJyX|#Z3_7{49pMqH#FwW2uu=`lA6l7^F|3A-Ai~EbNG<8B*VXX z1F(dtAq_$>&lCm8l`mz+J0V|d0868|4?F%QEPu;8RqY|l`g|iWp8l(KooovJ&wN*q z(^li+okef8m0+{#(9r_JG{ngm!r<%f4h)e_#nB`h!*Lzkb&o)#_z#WBsf6UmX4^As za^SOlW$mT17b5?*o8@~ATD0AN{@n{oSm)xe<&G#aU> z{QzMM)j2W$j7(t_Hj8jXjZF;f5kfMRL)72zrK{ckJ5^zW`vVb3*bz_L7ds36c4kvc zgYHnM_XZsefim47v^m7g>>etQ@M7#vteh@J#y7P)A@z4T4-I=9KttC+HZJ{YaP&_0 ze}{`LREIjrmV$tc1-rwMN5I(qM+!qmelz0On&<$jOm@H0FCPYp)yU?Pj-U~zC+;H1 z7~&K6^}=Y-86abIBH(%!$afLYvdMyWY{D@#}JSD?3#(na2V7-DTIbcc5jkk^*|$$<6BsM%r*lhprB{iMotDlg%KJV zAo1bPG2p4Z)NGK-2tCegUW1neGUX8Xw644TizFiS-KksbOwpu7>=-z6#;%<$EjwA% zD)DLI&aj>hQn*I4*-BDJBQ$ck@2)5sLC$ifAPddcG*~R4DVZRi@M&!}mi$3bo1+jc z|ITfSD(Q%Ly^bAJZ|RGZk>G&=PgFt3Vd0|*8B@<)TcWU~Y~v6xiW+$DoW;G027J_u zkmLS&scgVl zVritw_gCCVh}Eg#+KBKPy$23*nm8`$zfZIeL@P8*e_e3onQY_H(rXl@?j)uP70vV1 zz6`x*W(yCXq<}7~IN45x_4jSA5(ZBzh%$>7k@jX^UiI2_zIHp!kCNp^Ke9&WFu^_! z9jW#-?`A<5``oKORHXgGX+aG9XF4RVqVhAdj1arjHS*WIUM5vG4im(Kd+Lf5`LQ2A z>X9-_i{(zV&AO{tS!FLZV)-vULjg?-5S~d$*#cF*B%C-1VhBm-Q~%rF6kCi(UD0g( z?e959Yr&$ena(l&O9O^LA83T+DLia?AeISbN9DG*k_A8Vuiu!AiP`g8seV@aP0rA! z&Jtmmj$R`vY9|z{H}g6+AUP>wyyj)VaB`$U{^s(R|J6ab6$*t>dB#$|=O|4=5jX7` zAeA0Xc6l|?7{-6-(nFT6o1Ql72GFtjQ&~GZYzGbmvl`VwE<7?INun;tDN+N_ zhx_1Un~M?T%)?$9Qijh5s4$kz;wNCA$!RP+SGb@XdV-axP=9~K|EmiVi^o^EIFgnh zn}2=rHOdXakA}})otw1lKBpe)+eqaUk}c*v-9GF;{9i= z_h+ghNNGJ%V)Y zc?1#1r%?$G-p@)^3jcR3!R}jQgCTS=ma%--tKDo9RJ7sD;blzwLu(lA$`_c8mt1ah zkEm$X8EwStVi>XPZ=>1YB(*6Ow4)+nux-Aler$VKR}3lIPT!rWiC93Eh)?!g%y7DD zZg@zxGW?^nu`RlnQ-~Qi+78H|AGq)-e(oqm?h*QyzJA@o=+T@PEvcucN8)BVa zLADr+Nl5TpxqLoJaebbaR%A37h-1g70XvN)X_Knq1o&<_4Uhpz2cHByZ%gv+zOVVb1nL^X&8QRV`Bpw6i$n&!rszF zH;DM|n}4ziogp~T?m4DxNg9)>O0Q#P-urjI{`apej4-3b?m-&Wl6^?jE-TC6?#mmV zimWqx>%V!*OM2skcUr+XMl3OJspsZ$L|?vTBr#>i(4Ek3H-xP+)w7J=p9I&@2rJ6k z(aU%(F?=gD&EUd_Vjg@7xhycp=Zxj!^LCVfrAh6bC-Z-**@5nG2)LTOmK%BKzq>nE z4T3TsO9nbqH*FSs9DQt`U0;$s^EX-W`l2l%uGW&#slEJ$c!OCoRArS}Z_HRWAgMHl zPw6A-iC;CC&~MC5hd%HLiJXa{a9ML5y`*Tu# z{HG3r4nw$!0=%sOLpSD=&f#Ed7*fXyOwO2$bS$=+>9bPRNY?&w?O*NcF9#hG3=M-D zO5(%CkwrS-XN^}Eb2^wNlm%&Q`E&UA?B{cjWo)~!95{-xfm|1>RDV z22Y%|=z+{CZ~&}-@nOK##Z4fnMbFl)4*uO|Y;2I{!p?r~2wK+F#*jwvEw9~Nm>j#` zeDK98-wq~(q@pMw4_ad?o zDHX#W=Xu>}{_iOPfF)M~^1Sk9%UqT_78+l|R2VP*I?EJxUp@9XV&?7Kxa zw$3^Wo*R5tw{DSbVaAm7k~vYmIMU$%L=+)hvUBqRbH4k!eqy93X$>1H-N0=^tq0{d z8dkFlC4-7C-O|^Hs={))OEv{m>&TjRar0zLFJWj&CPvwS^V@g_vAz5YfEYDJ;utQ? zml2@+RQ?!W6`z%s7D+_S6;bHn1N=lVQ$Ro}rzxm#<5^OfH0%c3*7g!f1Z+*V{(5XV z9C`~7j8H8_S=i!@tDL)$>BfozoS{5iRomT4l8@h_9!A!##<#!xf%;MU7RbiGx={v5 z)NPUVjF3Q8-nJ4lwBxPCZgw~arY|gq_ryxy?0;IAA|#ZGu&l&x3{E$xz@d}s|Mqc? ze2a+humQ3{Wby1b>htIEPP=N!W|Qcklm;Sz0q>{I2~cekslMgL@>Y4q3V`BJJB(QS zk({&|`7H(Bu=*84M-nzHt>_zxeho^9($v z5!&3mYBfJ!jrW@!C_;WW@eKBws;kn6MA%e-Q2H1fxARc{Bv^bG?jNa&C4`{0lZVA* zlYK=~tPtGf;QW$&6$F3o-uqqPX@6c@lzjimwFa|E;DAhU#xvoUte@Mdq73QoH3=mUzN&z-k~8$ z8Cm1$U#)|}5NacQ%$<@kWwigkoNXTv+_9RufQqA&aAyK06x!`P|2G%=`wtwoY6e}0Ot=qpfAS@0lWNq&0 z*ZXu;J$q&#c&URtpviKxo9j?K!!Vj)6BO$os%4GELDllzhB_c)mQOavkyy8zlaygn zxU}kUJvDTy_P#DZHX@TcTVR^>o@xyzZ{AG@KUf*etgl7XLDeoGA3J=*f)I_+JxGcE z(0@Bi`bKFN9Dw<=CVTL#(OS6Uw)+0Q(SKj*KE%f>uhU#T_dS-8B`sO;Gi4I3B5QD9 zc!OuLd>!i_Km3oPdY}3Icwf6-Uk*&BeE0+*TxUW<0-cT*XOjC`8WBz}3`)~&))`km zgo#(e-@l6sn1+C$dEnuA;^dfrF=JX%Qi6KCh))-91fs@JDmto<{Tk)4C-Ns(rFW{G zV`IN}BiGN##+_`8+{DSNC)Vg1LWLJ8gRn3;6}e^(GEiVOU*7lJ0byiwky45Yyq5oy z(Qt(h;Owr24$z`xwb`?6Z_0+-3K1#uhCcj3zU*w(xUmViKPHJ8PmD{W*-guEm>~_w zHq>aiOT68Uw!)#v=1+oasqS4+WDQ;V3#Kw2Nss>nvZL_OfeC6RihGk7W8xPD!0epO z=Z4kCOiIfdswTp*GMJ3w*lV4qwo_OpKn+$_m^_%6>{B|-D~}{klz*pQH=}>^VGI55ZUQkeb2+$ZB2=1Ctj@%1*Fp5ek<$)aBDTMyk&M2= z#DYr!is^)O_qHaD9I<2mj7FsD*ugiPkuJp4u09%&v0LqiCdfqQ4AS4oE;z~oiKa=| zWj&AKyG4R3hSg`r|s_N(zEgXa?pQbmlS z2nB$hcT}ie;|CiWp?7TQK7l@Yz^KOplLqF!>mlF=f!`G<;Wm`ckiQviEi8oM zA-rFBB_>Go_2FS#6geb_g z1toUtVQO^Oc|^a6lnw*4O;0>aOfpAgj1H1k*UIWOA%6iaiTVBORLah<;!$kc8W5(O zwUwJ;COjw-Fa0Tcp)M&xfHA0Mj%Y$Hn|v^VC7(YV2$;Pk^j;lC8yTg!Txe=)0<#jE z&*o(4_wRSc{X1y-dogTy5lhp2Rj&GLs6`=K=hH6J$v|3A454*zHhJyN00~cDoV;~VH)rW1964zF4( zIzAk7)WyVclXS;*Urk0g#r2^Q7W_4%ASCmHrW|6>f{+bhlE_=%)Ds563z#x67Y$l- zPdDp<y!I*)_Fp6%jFMnx%~Z?)Y`v3$j~YfC2uxg z^{?2y1@IS)8M=c1v6uC?YQv6U&Pd|pz#G?33QCPiK#xEz?bp$dcl66UAykBsA%XY$ z@9l;-+-CX2_`1J&jFwd89r%;c_aHxIE*7Op*)89x1#z`yAP}C_$2({+Q=9m&N^Sj)g}^wF!2a7wRUaD>Ts5lt7}?RW7_$JSt+%jJuTDX_5H3h{Z^CPFay{TW0b(A zP-rZJXk=_g;A>Of*{#?u90Xu1B4qNYvI%+tE2VEK;gN$S*ZIbcBCog(neajpakZ(* zGypVTF&JbIrQ=wD8ND4yV#Sf3Cdf_$)tl(3bX3HjD&h`6Nh=Ww0E`>wNWv|8rXpb_ zc$b|M`}VaI``}HIVOk4Cdwo$Hh-jq=L;I5?Nu+*zn9W(;Xtk3pQIeI-UqJLTJqC(J zvk40eJ6M9LR-#VBn?}JkLH_>I*+GYjHJC&9ejdJ6Z_0m?aXSFIoC}CB7Jqi|CJTXKyZQ%+jDF%SV}`e zzApV)M4TGafH%o4^8VZs_Ab|KaF^u^(W3n7Y9ast+igUmb@&si1U^hRSga+p6B{Ej zpW-lYR$sE(QBPUMQ}OWgclJDC^g27yUlpQhL}+w>kaXX1#%99G~;)GhJP6Z8h$ zen+#lNvWc$b(#2_qp8s2n9r$ir4S(aSP@w`S1(>hM)rABM?N5af{^)QDP|k+3@$;g zjXjPZc3)MJrjx-5b3CCMbFhL2l!Zpp9RG@D(0Uz;m|p;Ej_G#OJLHHgST6ldeeHox z(XG||;M$YJt#By-nJo3=uq0?uW@j}UN@C!{EoHl5SmHmGZE1I4E`Y4eApKVDf3T6H zr5}lq^8QW=Mq|vDKXxR{W|r}>8OfFdd@mjvF`M7t!dP)y))2dq3UGfXY*2w6>F~D2TJ-PJc4sA#3SHfUC!Iokd!~N~YGVijVskHGF<(9uDV;W_>Ush3p)>We)F=Z~v!J&K{&QfvSHXU|RndUGTO2t5 zst>Cc9zZp!06dNRZIPL{Zyb7s)dCXtWGR;A$_Sns8x~r?ukFE`;PtF!(UzWQEiI%u z>G1d!V;4r};3$Ok&(ZkWCvL-f?}EiKm5}0*H!<+i-zzC7G@iODS z6DJjr5apCW37)+;sQWLQq^fuX%~U8I=c3Z~!Z0v=PYtOc0t1zFSD1zLvpVDHl{}X< z^$iA06(PxNicaduxx?4M`+KXN+p!5V+^no?XF+m&+iIM>fnX}FwVBGL5nz5A!Fm2T zdep_!go;oibO3p?YxdDMf|llN8{=ly!O}{Cf;EA_H zdyVz?JqQ9%UA;xTT~@lUe#9MxHJC9EJ4ry;lB053qxF@Kv3*NxV^kh~rbS2ykacaT zjr#5mgQ2KzYM=dy(z93;`@&n3F8ip4eZlj)H>i?xDZnmYv(IwA`u9vLXNEM8FWu4VU|2dbciZXe9hhf64oQR{G-Tu} z#O#fq(2KLqe+wXf?wO55rKCrUV&i{AaxH&&!`Y=zIiY_nMNSlv6>>V{*V_m)=}Ths z$*7rf6JMm&|2qFA_QT8F?JLF2Kd--dBSIhk3n~_TD54q7zd~jew`-A{o=zC|DFCx? zffT3jL38oec*gRr_)90YU~Q2^`!LY5-W&O_!1IXJXn6`}ikZY2*2Ld#0yX;|A~ruR zF&msA(vZOO}hZf-{sm3qQzbfT1~7LzdK!8L`+c1TW79&xC)a1k2hE6Tx|!gcN=-M z6dBZ1$u05z8dnCvEyY;=K}0PFXLMWxiiqO=I!PUkzGUSUT@y+=>o4RAp_`k#{vqr0 zZEZh~kZ4<+|CV!svz;vp;5-14{tdT&R~OE%l^exqXTHXD!>pyYzxZV6_xqcy;qs|t z(W3dhS&7*&gesad)Yw`+GVP8&r{=;W?k|llLj?|f+{(okX?xA8sx6wZ#Kt0y1dQj8 z=c0o%J(MsV8)jYh;LP$M*($I04GGP?DgXkzK-bNugIe>Sk|g2_SBV=Ht$t$2 zY;QNkB5w+?&$7i5%AQZ&^17+{Cx4aVaRXD(NfCN1Uh0`M`|ieo%I=7h&*Fgfi?}9v z1(LgW1KFitetGT)Ce{-4}gXzL7JVWq$X^ra>xMaRzC+ z3>#5d6z3~#s$dIeSBzcfOQ2pTOGZcHv0g|^!lelliLK(& zGq7!40fg2p`6O#AaTUk33)net2(A!(U$mm-y9b!i%~55B;djCP9@VH+=qobB*|q^c$o_f5fxqRnS3l_u zO2pN#lYQel+i>7N98X{T;j1b(_`-V>fyZ0Z@DcQQX(yxWjZ|jN9<*JXFF&7@EP%$} zlCcV^BUL!*K)Oxok-h>{tPqjF8z3aqT9cD4ky23UU7n;TdXNgZXh(^F-MQx0R;#ne z4wKh+o|>pbs#QR=pEUO#{x3j;v9qCG`D^ZBgZMx_@K1cWaEodNLw&cKT@giEjQKc{ zeH4nPP4Vg3vm49Y3g@ti%0~!R5BW+WnY&QjDnZo&vcnIS1eR`WnZ*0l1_lsE&pfhbcOPB;wWT)PhVZR573aiw#$KY+ z@bco$P6v0+Qyz&_xEBV5!Y;0f;YNH>@~=sX4TLlZL}Zz3;XD|-S9Lft47S|98er~% zDj3VTLZhjUJ6U}e>f5~BC~riBgE+F!6PiGR_)F7Po9RNi??V_a6BUf+>J|FWWH)#&iEKA#FJl`3>Vy8>XK`iDnvz z_Z$vH?dF0NoD@wNb6ChS*~}k2SIn7HOXpQa6uo3%n#`K-r&jVky%PX}6JFC-eX&Bv za=&kd-c@Rqa6sism_}Lgvp1@ru*k^BFxJodFxJ%6V6P{Gj?RceYp3GH4Fxb2=GXTj zoK%{rU-@i|K zVPRxMux@F$Ia!VT@o7re&=3w^D3k_K+DQ>PXS8Q{Fm;{>b(h}KdLd3HF)yo$i#Wh?>BG8Rv`qIw zU1I=k4qm=2tb}TgK|C$Pt08+)#A2`SYsjgqproEt_s5PHlb2ax2C>bSlzR^<=ayqwo6#Cv*hb^3@F9}PcGv6G`31r2ok`_)=+Q~o9gcJ=ll{Q?#9^>|c^ za2gdAf6@J<^~pCxpq^v*hHZa3f3xW*zwSuYD$jGG&jvT_X1%}ejx{|pdH9EP(3~BO zI7{$)0ZV+V)t<^`D*Xz;iOc}sM7UWF?batDJm2K*fSr~r;T@xb;lftU(TNJ@CVK>9 zksNSn3vpF_uh*ThZHD|GAn(`O{4EVzvwrWjYq%xe6y zx~zwk(GdQ)QmxkW?uA)0(bqD82DNAbt|QH#O@jO>fX4r9D6#Y{_+IZVWQ_?g8ey!d zh=K&OMa2rA60zbnMF|gm?8uSCB3|nk`!rQzv8d*~9>&>i6(8U+4>$K{xxpD!4YnfQ7S5X?<9bu$ zUvQ|fI_0LrGg?~+3&`*_NLhyWDiN$1xCUph?BdktcXssVdWE7 zL*GwxHUG?Eo;;qjebexm3n5V0hk8yzuXHPb%6I|P1_N~2C!c`K8m~k(zfsqG`|*@G z5ZICchO`lG-i5d~enSkt5bdq3mNS$FjVPdfu`Hrz&w$0*%H7>PSJNa1K)x%u0>6WO zO!>d8E{2zpm|^fyJ`z7>pU*3hiZG#_I`Lk_Q0aO4g%X9J(w#e%3(`*fRMD_dAJ)A$ zODi0Y{=smtn-Ij_AAhH3^sL6|wz0dHc>n%zqUY0@#p^S(KJ#jD=Ge!-OX(9VrkNL) zrPbnUoAwF(Ymqe{H$IFBQAIz7h5f>=KhWXyfwB_Xf<7_2|>OgiX>fa?T43#=7^>wDol5rK-z5V?a zq1mqytGV9z2kOTpM_6n=!I8iuI%s0$$7zwP<hA^T#;PX7qLt+^IP;LqwbG`7T;*4{ya3y$i3yn83kBp*lz zT*yj6K`kyVHpE4m8Hl8Ij`VB)Slq7TL}yapgnuU?C_>(|d#;D#SBih~#u&?jqG*WH z`QD91-?rHz_vZ~)_SWntM){veBh#GI0mQvx+`R8Q_)q79oT_50Ff*0JnFOIOI;-&) z*?Sf-j-tqv>1RW51oBR`-9eJWAY)QQgkv0j?{Z@&fSc{>dD=<7A;(~amKgv z``B;0irOCLj7__2e>`mx4r0+jknTLaSgZ71QV?d|c)GgPHF_sL}m7G+MJ*Lj_oCk>t1?QbkPlr)_xa%j;bI3@mJlU zyFc*Z1M2?$>noCEWMr{XaZ5`}NtjDs_3oh2b=wr@#RN@EKve2S-Dmh4+hAIdbJ_AF z*v?NsCCMkYI1wF*#3>T_?@Q5jm0vwZ(C*thd?~-Q$E|pb5kj z#H?ueeGd&W8cyAtBTNm0PE0-TVk$xoHF5v>iFvgUWKf)inzh~V;YYYhe3TpQI| zPu_Z8fNS;!1%0Rg@Vyq}%a?iHh}SJQ243zdq1>usM8c7EacVv2vzs0#RHIq+C3_~}0I#cxjC06>x0-0e7bFalCN z;abBmD0yMTLaZ`@Ox8p6J0*5VEa1wph#D%h8Da3#sPK zJJ;oQ9}0+2oUxA@M+>k7?()r?T6^zS1~a$+x&X~rcT%nIS@PG3G45`c<=6~FsZ?#g zyxXwxl0Ra=->Smbk!E9M znosM-y0L*Rt@28xy}Lbg45AhEFXQnqrz9_|3%!wm3B)~u z&Tc3{%vqu+Ck zqG=BkL%4+tz1&fvu_;Zx>E%JxC9hxK1S0`=Vx>#Rz=bnQOLp;e*H9`(pA5h=2NUgn zebH860<0Ff;fiD3tXOuIu4A^zZ4=UT9j*K{mW{%Hv)J6QhGfe&jkYlK1;@>7Bb|WSNmxcg+p`IK>G;w()YzuJl|H$rSu-$#J@Fvqh;z^wIU(p;&Oycs)Z`8%8@JOvAe7;G&JpDIk zE zbj1lXVZARV6HnNb5s~85^8TxA?>wX_@|pM5xiUj8h}O%?qJWVfy}jgU)!;cUAEp0)O+0hSdC zPaJ8nMdh~?qgiD(zH=#P=Tu{?E!bmAD+D+xE;*Le!MHXjBmC|3 zZm;OQ^cOE8Zm?UZ8WGE}pzq7=OZ)81@g9FLrUhM4PRreOSN61#H6`V)B!1G7;-ccs z0fb*ASbCS>`kr;W4r3boL&}iZs|y`on6;0mM{C;&z~H=~o?Bf_iAJNrBouE8bMv^G zn(H_#yUX{k7_hG;0ZrOr{GW=R6rv5u4)*kQPfKbiNyv)X1)D)>q2)-+Zlr>wltA-C ze~*)bjM6_wlh@d)3l@V zYbi5SDl6+BUYrO*5RTt=I%HJ&PWES?x(?enI3>wL0KQ=C? zNiuI^yJotf^Nz@C=$t{+h)5WrQS(SthBVziUxWVRvc}PH=jt|yXb(Y$4!B9V-CH8I zZF%SiGkY9npxEZyf&Q3`+>M3D`(GA16G`?CPiiIo^HD^#DKAr^)u^v5r7?0X7u}#v z%A`s3c~-w6$vP6|Hm@H)F(>t;`PH|QatSuxYb?|~6tF*9*m4Oil$i@ee$F)F%a@9s zyxKdY*wK!4;^7`H>UTT5>tW)$vhg){zR_L17&=(p{c`H$_1)rz0D`gRdVuZ8XSbQa zSx$j$g=P(Nr$}@&eNe;e(MQvF+gzrc3yLJMbXl_c;pI)Sy1L`UuT%Xt7rV1I-e>y} zlPtwOa}8igRrDnSx2VQU+?CxtmmMFU?O-2m1>?0T>7FTp8aN^Y^o=fZ4W5IN1$QoU zqX-`$3`#6?*Bmr58+I2;Ry7=uvTUcfNlBKdDfyEWl?l&&k2LA%&b^U76s*_kd^2?t z7gHgP1Q?WU;Ve);JkRl_jkkX4Mt65amvTX|jL=-!kS4|N?r!w)N7`*{wp^3Q!|4ZS zJJvarJ4)XBHq!UvZ$doa84qQC_;_(_FBR!a9`!soWt!0fb3)hjEhv3HjwvX*xUjb#7d9TxWEn4gdrq-D)wZK#XsFRn zE%8EN@~16}kB3w!{y;^0?2jVkEA9OlfrOmWo*;^f-hTaWmUM8MFAL#`TDJQo=YHGk z8SkH-e&A`IjIIn^m1B}Lm?_-A#MMnU{3d;T-qd=0sxPsSK~YXCbk6wx^Xac0ckFDv zW!_58KxOajQOk6p*8Tesa`#h)?e{x^OmarkuVt+>w-o#+FOH8M55B(-JwG}9A>!qB zr&#)DLE+S9wTCIVe^|nXn%2Gbti8$d`_E51f>bE~5i4KW*^z{B;4xzY2k%BGm%(p(GC_q21U$Ydb7sc$%FYf2FP7 z;GYm=j7vC6hC(8)wyjD8jKxyPuamPF8HB5S5QA;^;bBg3xFV_oh|H z&tLGj9lNHUTN1LmH!l|oVTqj@y@Pe4Wz#G#wB2TW#$J4zkZ-GE8SprJKGN9W`$Y(A z)mZEob(!>NGr`-MV)cQ+3Leq1n$5=N*Rh}@pej1;K_{7n&7R%E%4`1)GqZc9xZiBv zy+M3`?%y)*n#Mv6+fq#~mbbv!SQ)t4U#Q=pOF*HQrUK>uG(`QDD)?<%U`cQ7^bG$RR)#?o8?FfufxH++TDXq%DLZ_ z>3z=E9x|PLQgJTdJc+0?Qhbp?CbQ43( zvW(V96;^Xho|0(T8oo$I`DE)JPd1D_Zo+ypuIN@!oIt_xV%$+1UTV%_yqWn>)dxxW z#|5I;&aN$Me{{rek>9$EB1B`6Z9aY*I@4G2+0F~ziHmOkp8g@3WW1>TuyFX#ym{h@ z{|HO$<_9Io?53alEusk?53+5qNxXrc!A(G~vJJRPIbG7r&ScALCvbmlEXhiI<+$}@ z-Go(Kp~i1moUj&X8kVEBF@ecdvfTT(#W7k6k`;U`oh_2|NWFE2---vCrt#>f1&c4| z9>3{t?qI2Zoitq7Br5Ext#Ue58#I@tpO_K5 z9CUg>+>oOxE)pX(b6W0ev#)PLSyFEO`!K-ybJejjvA{OJh@>_ApEbcHV z%iz5li=F@DQ#Nr|{^y#yS6+fIVKd4uPl)Kj`QW}Rev4nGrj}Mu38qfNuJq%ExcpIUURu1-< zh#I*HtmrP#!=0~Xes6U66AuEF9+GIay`?A&7*;%^8x>6Gi5s6hjjO+A^MP<>rUe$H zax}4Gv9up&k}7-msS|EQLoc(a*MQ)sy)PNPd-WGz!&6e)72?Vfj6V0ILR)0C?6;TH z!1NdXh?EnUsciirkGjSWxyw|I;RFZWAHFS*R%-KUWmaGhvwkm~M4hlYXU1LM2p_^& zb$UAx-{OC+t@v(t*Vih-bf)GYbC=jozplHkJ>00H&cq@rrZXSk{@PZoo0xb;)m;sF zK7P5%dpB*#vV#^0Tm7{wK1NlxI$r&KX{bFkXq1}+-*D+yUcX8-o%UenM1nLu2sCR* zunoF@RJK(R@~t%PgEm^kwi+?(ijlE#aWr$mLf+fApIgk@SEr_?(y!SQfbKkGqGc+L z58#Vcrp(OE;dyA#_6f^hxY>c!;A z;DKA3ZS~eETM;)N)#QLdbUU6-7uQW5m49`SNU`9v{k*70Wao06+V9zB`Ue8ysuXqPJ~SH`0fMI_{fFSe)9zr(ke zui-`lohn_yH6#B@{2?weF#saS2luD_5n?YBKVXLg^z6hu8~a#37qY6OWV}8;liJ~c zrS4CQo2IplhI%(mFsN4Iax}(vp0chRghM9kSPU0R=a7MTnFo5`r=@hd;CY~fOfoNU zNh6WDVdGqtOU$+Y9D&hN8Yz(J+HvxDqtGWeu^NI<&lG7iMjpHkC$tifqCa}M=yF0Q z#n%rcrfV@B&tiM;|FFxE%1>7Q!F{0DYZGe6cY0%x!KPM`U)wCXZhHoNl`4 z>=x!&c(3&Cfk@Z838C9^Gzgyn{`&Ka+CKPETVI4)aAdaZa!dv@|k^GC&!c));3eoG|PB+edNbVmZ$6~OlM+DFk z*gToDeZMGB8-XjJ!jFbeyUko4Hrv^r=MHJ!$xecX!o2!kH#1qmz&gX;MfnQf-)s>J zNU^BTzn=P-7F@8@hs=j%F7CS44I-^RGXWTN+xZ;pU?mgmVOIB5o-fwgCfuMu;|Cfe zI$hRFF;UW&U9CP*)|^5hU}KjT_Nq%|HIr2a#SrpL+Z%x&-{7dXU_+I5#JONzsKQRK zcaQ&t30x$*4OGCZcG&rdWThCQ$P#~-^F=@Ah0zwK_ELa>l8%l#VRZ7g%=i#OZ%?~K zPqbRFm?as+6IW}oe*l%{yd|?Of*vpBl9h-!9?F9~9fyyJ%J1TcyEg9dp)+Du8PBwX zm_y<7g9D=CcIha^dkO}FLQxLb6+BH=KC?!iy;I_ULHs>7Jdg|HTVuGEwAK4)i9(bK zhT2Mh4`Wz?2t4nV1h*d|jr@L(RhZY=`N1F=s_-}Na#FTSWaex!pq+z4ekt8!ypiJUbPwDkkcp@u1iiQ4@k6b{3%wa}>kQTQFf}o7 zJ*Xlp{pHc%b$|9&z}>&qVbUn?T*?;q0uGAM!cAvPMn?L1O35oCPtI4ZgBDhI zjal>U5$Dh+OkRYRQyotVa#sos@X&oe3=JCq@ZPdzg%y>o!_JZqP?a{ zlN!UDN_S=0XNTMh-Ld*TLylP7ewm>oe8n>ZcAc4(#u+@F11o&p-hKH%S{EmZ-l(cQ z4{KFWas}oiTxa1=(rf-g{}%acaJA~^nd91#lBx-j5R80pS+**?u&-WwW0!P{% z6ze26M~>k$ir>(jv_5@++*?CvTEc?#bt|MstwSzJVU*wnAI{m`Y?#hf3wNS3nBU~I zU&{XFdW6|A_Mg%YJtZ$x9Gs8)!^cnSsFku;%<85Ay|`zsqXhx^wRtc)&3;j48Vub` ze%CraColGH4b^33q9P)GgRMtjt^LyEl(E>? z*REL))m3F~>IaLXXFSlUUQLhrc15P78m6P{Nb@&w*8k(ol%>8QXg&2@PHZw zPy#vjN?|HkXGljEWTSm3%1?0^~@Q=M@_9kS>%YC%_D?G78A`Aj7l}?Y;dgZ+-BbjW$UVF6 zI)seL0wtYHXBGGU0V$34?8D<4`&-9f*|mgy@7#pH)LnL@9o4Cl|FBFW{Cu#P&Jo$0 zN83+c1mcJ>GEj3e-n9$UX0O(6QDHGRHgNX=>V8fbi`7$Qq-QJ7h)pbT<}mi(8EKAM z3EUUT#4HCUT_)(RQ$Tx+Lal%H*+)@L%b}9ZX^bf;fuh2QcU&--8h5w%DQf^2GE(?p zVIu6()Hh`wt<~R4dk>d`R)XUsBD=d;UB>0R@jD=7w5;++W;2V@E=P$GMRZL@FLk!2 zWBFm?K(h2y@}XX9=Xh{YY8RHt0)@IEkm(vo4)8pv+9pXLTsuR;!AaaG!u2mt>`Qnh ze9K8kFM`N!3JY?rFDp#A*2B1iS~Nk;{u-NzLqbCGUjsy%Y-0%dJ>FQL3HI4xrH?k+ zri2H*Lt9*NIj4A7KkLHn@Uke-sJ3b6{nFNhy?wjl+n!aE-{vatJd5pdUxa(?CMPXT zL2{u`n-&bTSqkXOmjF0S=rx=Cx&7RD5|hPSpmR$<=8H&ObLVoHNW%QkM$qWrhTKbvyYbD!0Cq<>kN z=}rcH2cC%#^M|Q2!0S?ANGG?9Q-2*e$0WMAR607pfm|LCdoB)i&_&c1jSO6J8XojU z4;`+8_F{gC`UHAQfcTn-e*U77t8txSe6LZu@<*{i^7m&DK@%~;(s8Nf4>6nd7i=_| zd4=b7J4;QBh+)&}FPerNek%S*fDClyestSY5TrcU>CN=;4#f^8%x z{ZQW6OU?Ih90g#M;=@qp*0e1fPKj!@QX*%mA-~_K(JmytB{_yI^f6i>8IV9|&|LMe z8I2Wny6#~V9+3sa&(Xj%#}bD*zjd!gqEn??Lh*7_r(1D-PU9}nkb}>ahQ!`7P3wl$ zv}2U%@JWK(yzdcdI2M6FH{SdGtzEL%1z3Gk5 znk-RD$JL<-#e#Je%l*|K)zHbokFP=k+x}xC+(mz}?TwCB%d5Tnb`_spqxB1s`)Xt| z!^vys>&5x&5)$1wk2^P~?J8J8PTlaa>e=I>NaOg><4-LzE{Ta8oF;hpkR8W0~Ir zZwGnj?18o?%E0p)_2iCP5!dR7I@?E5u9!^qdk%gHI1tJi zJR&#~Kfjfl_tNm#8cm3PTS_skgm~^e7Iw+EHAur1-&hQoVr1)-6tIXylf$*?2gLe@ zE3KtP2R$mzml8iKW=K@oUS4(TQPNdw^_om*fFtaHdO8GX51G77xH+3eNB$$`!Jkl36&5V}JdJd5L84l1+3Ktlb36$MWK12fN(oj$u)={r50PRh`Mq{Udi@-4i1`NQCa z0PKhtn2rIv99X6NjTM?T_mNUZg|CY!7@*6LJLHX>4*yJwybc9;Xvn(cl-AYi(p@y{FB49)8O z9NFq6K&Pwyy#XR3j0V#2vMV8pZ_QAHhqx&sv5#e(Ri`Q9*AVgU3w_hs<_A`upQmW7 z+Enjddy?I*ITkj*m*mvjI-9;cwcc%AD%o14rJb-GL{=Z*ldUAXO?2Fv^gMaqRjqjS z9WQkmF|@un8b#;Vs-&vuvm|M<>-oA3_b$t-yr2#dKqq*A1<>U`oF0k5|1EHL`)HF) z)AB~?!NBc4sj1G&>cHddIW|5a%gp=6!(v4TPuZ?xJA$tIr^%~_w72RoKfbL>5+O5~>R@=y>LfPD)PRn{0=3uuv`3`D}-rPXJMR znZ4n^ITKRmTNz2ZNl;1KfgPM%&r|XC<*D4TWaRXzMQq=zpq^?tQ?i@m7~R%EH+*4B znEGMOyBs?%vOQZ&Y>(C9CW8ShC>M}pKh9STH!jdDP^<(AXdc!Zdboa9zN+73USqRK z_0;IW)^=kPeaU$E6(n=Ba92jF*X6}j?B9g~X+ACTZmh-2uj8#dFo|38w{xSdbKX9JPx>&4d%N!w~MA^?U|Ck81Z0?m<@CkqI@JG_NV6Q!ScwEV9 zIbbx&E3S+K#8YQyeBCcq*5xP*s=S&qL1=lYBB}Kq#MDU_obIqj78T>a^{trdDDLE^ zKH`zlMa08&nDYW_Rx(4ym7$@mDk3b~!IUNy7Y{}gTpdh>yp668Qdn7tdab774aK2jke9Q0UqpbAV zRymD^vq{XOd2L@BXNa019R|HR)b*Z5`;&+Wi~{Sk%|f<)*RwWoVSZuVBf%Cz@I+YY zA)od~!0*wOYMhYu*F0K57~k?uANoyT^y`m5>Cj*9zfu+qe2Th#$k@&d2A*=qKDe=8 zc{u80a{9|9#LZ~*e(Dc2N17vZaM*Pt^znH2>A{TrazxM)M}w@eOi`dJan9v;6;2|n zXf7JkdE-4HmS(1}B9-~rN^q^o-t=>wIXM8NS)o}676(FLpFXp_I!%lCh(%YS1extB4nL~&5iLzC2cwk@;!1r@zcN2G4F<^Yhs?jx4|1x_Hx0&>}0O|Vj zSh~^OJ??vuR+n9+-b3Mp;6T*D%*nKe$zIHfn-!$lwh>Y__O>1LU1qV(jIH%!d8#S5 z*YQWY&I{hYGPkp3E4lSr-wcLvOgGg0e&CPiKJ@jaa5}1^exQnq3ZComuC6>_ZDZm4 zXI!j~#!21Ia}lL%?yr}jInirNzS8neM2)Y!d~yWy$uNz!1nnuCCg0=Yr;u^=e8QJ2 zZqh5&@sONWT#3t9bG@3xtYm1Ko*R%ex(ouhbj!i1Uh@d+R*d0uOIw4256hjqHC2}G zGU&nLYAqa28e(uGJH9{l=!=Laus3ecj4T>wlC|nNjR?c(=PRm~8^I={cS{inAi5Mg z5ep|aueAX!X(xxuTH|3f`41`sYkHxC?$uK_Vf8v>B}#8W^bK8Ia88>vZ9P{+QMxWHuFW-KQQ= zWXiIdxZJ?)sra6u0|;o9uPA{4?H2tQ9P)Pi7aMOJN7Q_3v&V-Q?RE`pEgT^5TT6cG zI1+#-aAe__Ts)jUklhi{zi7z3+fxM=@IeHuqTM05IqgBFECr9ee^ip9|5Q0$Aap-r zWV#gcYDb9(^Gd4hh|YOtpGz%SGKQ|PojEzF{P4vYCMJhFrq%hSAL{)Qm_S|mGNHxo zuv7}T=$o}lmt%SsnXfh|SudZBVf-9bZ1? z=WD7j-mB%c{jOwo&)fKTtFU-C2fITepvRP6#hCGygy&K9kzoL2^XSRrHlZImk9#Hl z^Ii{Q=jR?N`j5bS93d+Y&RXUIdxLa522M2_+63$jXXJMHT&cF@Jbh_9x^shkfByY2gM zrS;aKZ3PotX2qUoF$KlYIQajSq3g7OFuKFbrG%#ct{6&~H95a(J9C}VlgF)Jq?oFz z!f0jb>5D(Q!-@7rET%GF9nHaHK}x)eCZc=ASX_iHu1@Aa&bYSy^9qlpBv(Kye1*xk z=P9V;ULfolrhtyATBddAOMa+nWM=^p zzK3Y;z6XlCO(+#8iALnN&Cuk`-DHhEq zhi@Y(Rx$7JNy*4+CDnHK7Aj7Bn0+79Rw+%Rw}Ng5txpWCQS1F*lRDP~-a#*+CJUS$ zav0<1psvjijNSJ2dz*Rh&IWUMH9oF{m`KHLmB)8KF?O-etTyV8u zE1|8<0I&M?jqRf&z4f(-tis++feaYhs6Zhfd9KYcjjS6&LkS61!D z(!f<;OThhYL+cAE8Tj{~APFFQtr3tG=K~`rA)FI$K6Fok_rOTJfH{++6!36m8D!3W zcYaWEsiJI2Ust0Up)3tz3=9e!R+EVfqd(k<8WwpD?>=1}yx8;xD6|t|;s?HZTh{#B zT+4Q!1NcM7-_Fh`#kRXn^p;n5SnW}5k8$Y_gaH`Ep|bL}9rDx~=umF7$=3hwqQr8h zILj77|4rI292yfm0SF)tq!l;cq2YtjzwLwIF!OiMifcst0K0B z&*PXzlhX;Gi@2LxjBUn;wVlDOGz0Ue5K1`^)B$E~aKXU$D|8%rX}R98hoArPm(WEu zuKx7&7YL_RC-k@15tUQL$8BKrtrEt5&bYMn2=L0r!#ePD2cC*f7yGhG>Ly1wsNeW2 zl|fCc8^+})lj{%4uTON)j1M&;Yt8zI)%r{3doWMU7)V?mXAhEo&IWdOi&XZEX7WIo zZ^n2uJ6E_ExN88ho?R;eQrXW$21@!?i&o_1Uwln1fom=e&14VjZQaL=?PrdGN<#SqlSacxfFh9>Pc{jQy zP{e#P)l|PT?IVqfNKTC9S5AITY589>VF62C)SDWXY(t8r6#)meG0T+bi5;S zPTstY*YBw78FilM3VZkJM413$VgQzO01V3uOe6 zJ8AuvBV(-%*U9*h5Mwt$lXU;)>&r8nbZ**LPv>T%mBo9C8|R!zW_MSnVn@8SmkFM` zy;s!kM5~M%mt8+Xp7hYkNm3UZ+*mnA8+4G7gC_Tp`j~O)c5MPy0bxSJNnEZl|FeVt z)AKk~@ZW^)H`7`)T&Odq@awWE`v7>aNyH7koTG~7wH<3f!e)3zupunAhO%PGp&zs$ z1$77D=;=>6Gl=3iLf?jbC#ZGnBXdGk4_u^*o~)DuMDaH>On)Xga<7l%DvGsFesv7h zOJA1$VzeTZWZ%?8vQU@I+CDz)5sfb)gA4ml==gsi-9q-~+nzQc+jt9myYBw>4`4+3 zSjU9QZa+rB5IzBm0S?B^#aI+Wt+ z;80^b6-mz?2`VaDUZ^0ib2z!BDhdw3{Hn#qwb`r%G$`Urwwf!$myA6l&;C;x!X{+;>$MxW_W8=Y0S!H&}hpf4J>B?@v&&ZZ~bRw{Jdjp5O;xGPNLL zVgiF+A7BRt1}Glr8^hVIJRi7qR2P4ECQz+SmbA02RcH}<@Hp+%s56k9^`TR3{LJ{7 zO8gsoT zMx7ky27Gg=!^3N#0tHj4La#KsjuJ}mNoywIm0*yib$dFywM=`0u7A{&$B|f$}l<&?2e@te@j4p_tVhopO&0uvSu_$J1~gg$r_7LzF4< z*AQ9f!+{_F(*nqidRtwNe7)!Zp66&nb~y9(Z$A3%Z}7r3U#(MKq~|;4YT8=dTZGq+ zi0}E*s@d_SXjPEDEcI?Ubbp=)+ram}RWExv%+{Fc?rGy0$&jV5))h|h!-yOwOZbTC<^Z%@hGwpd{ffuS_-h3qDu8IQ+e}b6YGLLII=^w-tV` zY;W(C49leK;Lp_7zYW&(_E?hPsUOZCtLxb#34ZM}VQHVAwRD0lN$PYl*FNI7^ZSTY z1_LAfWwi zIq&`FkMEgZk^h>q07t!U-XC8h-}|DRO;&BjF5_=Z>{84Bfhm5H!t@$gr@w%H)8t=XW}#ADdNGWF0}knt_NqR={#GS6@J; zd_PC!10d|MdF9f(kb(<3fwLO+ct-Gb)!QvzEyD-?9l{6kBNL=Rq6*C#2|$x+&ktBj z^GF6QW+^lMPnE5^gc`@!2ia#ygd&J{oL}A7vqJUwlu|jJ`tOMvtH_6 zw4~+a7IcLPxjo+K$hfG?^}A#=oz$2Ny6Fg1cRjFrY9ou zucarf(00w@ZayH?S~L|puR)%;(pI5+fqQedZqW=`+RLue9z)Y*Ge^WKuQ^rLRSn!8bZRu`uzD{8t9ZHDPl3gzEAU(1=lnOjy<6Xv z<|(LdHdIFHGu}5c_%e}P_p{`?{e)yqSv%1+FKgo86A=CAj^}1eGdlw3OIZw}UA`?g zK{;qIBS~&*K#-u->eT%DGE}(tZxf@u2mfn5iuz;KJ$N0G69$2D>wF!mMm;vUP~6J1b^pGJ;ZON}OvwkDxM}p0XJgM$VA*j5t|w z&{uZmDtF9Y$LC1C!MWDSk_BAOX+^RPMOg2f%XGA&if7 zjjBsy-EW!sK=}CKxCUMb3;MpTm0g#66O<~w?JZ`%PFmcqP))-PIo7-`IUv4?XC;tk z`xy{KQBC}`<F#RhOw* zSwYzyUNi9P#_i^wf4D5&NzrY^n=C)=ZAIumvrf^J7g?ce(65CESyc7hj6GVyjz1{& z+a*mysEoU7#`ovxRvp&I1*Rw2N{Esf7cEoID*NMxn1ead+>bVglsk2f5=MdpsPocjB2h{MTkaP3wc+zW>ws%Zq`fi&c=UdhmIJg6X)gdtuXxG z2OD~@vcg6JWv&?UGl?9?wzgz+z;p@ZCh?wLq@!Ltp~W#NmiFGs_E%Ca(xPNom!nBo zcU>+-+|1R29z?n;3u;t)=^-?z6^B_&U#K=Oe?*LxK;eHX4>eDy7WceO`Jqe!noEL3rS zjt`=!T*ef))Cu=;IbwbHh z`H#mx6L%gfC^oAt3se;wz4Ud9ZAMIj#C$~CuYA$jXOSpJ8*R}qO{f6xkMRifr)a1m znR|9rpK|;$_NP7|ocTKNyxh)NqTnr#2=VF#>4R|6+h5Klno0RjxA1m&_oT&}!2hvE zi`a;{GRU|g*~jkR82+gSEMrGFDMPz`DSk+D^O^md+rOC{J7?7m?BoV)ryd@E+a7IM ze(&YIpJ2*QKSFP0m+X?zbCo*>B%hvqUW?<3P~`X zB4?*ae5*NZhNx5fvDq|l02(n`)rRimHjScMb;=<6S#7OK2VL(15+@Y04FEh8*Je9y zIU$%SF0^1DK>uu)FT=ejBRi9INNPf}T8%dRT!uFEI6>xq#vhULdT(1qqKTm?&a{k z_Y26F3+VH-vZ6~tMQL@iC+J~q+|l&(t8J8#vB?$^0cHIy^YKn~WM#{~Z}gNByEmN7 z4ku`~+o8JIt;e+7c~qiSYBzsZ4KSWfE}Q=1P3-x~QLbTiGD50BTKPTtaH*!uWP$y) z$LzFrXVc?pY`wbsVPcP$%G;K&-T$4g=jEG{Z6I#S#@L>J|0$7rGoK;?A=amv^zH1y ziG}P-qPp|@;3Z9d`yi9Lg{FjIR;l@p8`y?rV*c+c7{vRN%oXVK$>8I&b$Ip4l~5=; zzjeFb#2uh)0-mqMX<8X(R2dzSwKTdd{ecs|TNpZ36bY@tp|VF~zq4MsP!l?J?H1SY z6YPc0h>=1(U6U5euKo8-$lmYFfkzqTD5q?xe3`MsB{4A((a{%l>n^y_Vpq?5Z}l7Z z-LAD8eB1pYF^$fHADUXk|3^l81PKpNv#fEa6aIs^|E(G5*pmRdGAuPs20BdyAbr(j z1w-65vh~WBu|UDMVw`D9Co}b^NPwryWJrr6yO*i!08}5ABYxoEhtHURtb=1MCw_0$ zr^N1FESo9)=^!~7QxT>k`m&7_H$hxk!yfCk-zgrAH=8+$> zFa69pxaz9QFvB=dBB}c}v@DQGr>eBd}V&gVxXGQ}?ioScuXWu0_wj)(t%p}62+2UoYN$aq`NMe|9N>#YW-m09;c@v4r zdU~XR45EG(2F?oeYbx?V#~A$%@NVs$irFq>&Xp}1B9_UX7ctg24tlFG8B3 zrhn0fI{}y@@u+cag!aM>|Eqkh5p^2Nj0GqP*((M&DOAGYo^120cuKs$SA66CVR~%uE_yS4wyK2g^mjV`WD7(*L+0!)DU=oGG?PE(c?wG zUk&YhsP?fhaIF6j6?fQQSuKu!Dz4%>L#_KLpd&Phuyh*qA8KV`v9J<+I)zkdPIK)d|Als^g!cqCHkb+(Kr?> z>(-@%@y%nQNvp04!%`WZ*Hw}9);J~3wF1r~QXEuoZc}kpT__RxQP;tUkAiZ(visL( z>bycMx-L&o%4}Yn=%dC-%@h*{!hugF%rU#BI{yN6!2w-Z7>?ksY|n${e_z`o;(nLI z+>^pIZgtU*xYYb8efCN_p^=63B;<0^fEhWD_7!6ZinK7I*%DMQmtj&l0O}d-3v(jXMN_jmE*Zpbl1ba%TW!5fUgeUO+z@EP+g3Yd63WpbSoXu)b*zh<;HNQKx#N#eAx_ zr@y_RyH}}3hU+=8yME%Aut?{)UVNj=ONKKdVlkc!}q3y^Kazd66sm6O?{Y zUPub>d6T7FO>C4<487ziBfz-&F4p)lcv!6#XHnHjE7_|JWUo!2kwQJ{d{7k6_ztgw zxU7wyR%$$b$0RT^=1&~4G#m!gRY;CRb$fh12%MY!u-xx>aZZApXM;^U$=JT;k~H29 zA^bbt({V=9eZ62|)ZNVvWq8P$xNs#<)wD$RXuEP*p;X?Pi>qV$^~A!%cDeU=L4~b< zn=t6h6GnjI#;P@OsnD0mhy`^?7CJD?Lm9YIJoiUOb#P>&p@R2G3sBSSQHSC>KwcxT zf_%?Bji#zfXU$^1mOS3WwOwe;$tRyyXTeoY1=ILd>`*k4o_Slo{bgfU-28AlX-y;7 zLD4Dot-imHVR`M7!xW34ZCLiFr z{8nzT$~gG^93^Y>iFzv{Y=~J5jXHMseR2CYk3SySMzxahc_9bciZ(b>$s&O(_7>#1 zUj%YX+NrJqU%f635ky%=_i+MZ=Tedcy~oVTmmBG<#r!acacAf zIKeg28haU2{I9MEb0CGa5Lr%d5v4jiBE;Dp>rG4CZ+UFnCYW4yyv9la0`V zS}8U%GOpWA(Zj+$xQHHIfv#&7I+u3tTFn23o=%gU)L-yx*b7YMK{gfnqU(r$1;_dY zBWrYj#<#v?nwD&X_iH{mAluu`yoitgrk^<&oR*PY>0$vbEcz76jzrDlvfpiO_59F( z|NgiMKd7bL12Ij-Guu5x?i{Df1JfRPoG>}}6n3;A81-TW3-^7I}`zMh++DE+RVgMVqu?-$)d#!`ibvL%S_TZYuPqKI*6xp3#oFEnbl zu(GC(=Nm>g>#YC;1O!ea1oVDxMt+(Ss{L7Eg+_E*K13K2%JY|CiN(&b71cYQJ#*s? z;dM6W(*o`yEmv`2y@I47WQc1<_4-q6BWQQQX|0JWkt@0S@hNr=XIUU%R2vMMfBf2* zss2u4&bJ%E7C~HBWn5ETH1{i}@&Zh~-N|Y_L5}|oi#7$tx9|tHsa82INMoN3iBho? zrKjW@Wwi`3(dbY(2Fl;RkITzu=neD=#{LK-5pTkzkZS7?oMzUPD1v8?O5h2r2ft)2 z(5_)jsZv#aJZBjNf+E$fj$MfR#bdFtpi?#fey6$AhEJSDOk|G#pYAdPIH&s5>4u1; z@!R2zZb^4;g22Fm0kCBn4!Bc*HEuEAu9Mz+;|{fb;fE&_yL8z{bURrJ&F>YpeG~G| zXz`OoE+t0t9}#>(|I8|?^Y?#*qsi!HY~r9>TteWB?Y*=c26}!(bOER0f0&&%s@$sK z;(TNf`ruy8|^IPF)Z;-)>K!)1Z$Qfgod=p5Ep zFDcT1Y-~NGcQ0->a47+Ciz}PCfn29WGd%x+fpVKP>ue>^6bx(pi<;LM}e2?Ldi66Vz6`S z%k}Ze;(LF7t{9a6ueicy@KNi7TkA2vtG}zr3?g zy=;)d8!ur`8uy>bEP1Xxni<_Lt7u|+)+@91%_3YltS1`v5|~WcwGLiZw{9e{zg*{U zHd$X2nB%R4+C=}{vG1gaA3(Vx;l|Sv@cO{L=q+Y8MdNDHN>0x|8~)iyrPhr&i&a-X zSFXuu<5CruY(&gv>_H3HH_-$c#(=u}>`+mzwWW6fqCa!vdvhw$a`H9j{ODMri8iow z!hL-W9ep*yMD7wCmZpQ@nssRwKhV18R`}@prngTITkQeX-YN+Czd<9Joe*}-+r)k#k(5^Il?xn}1QG(?OS@aIQi_(=wn59y2=g9r3D@ zC6}7hxdZX({h$k0;67CW;UQz*k1gX%pU^G0j99@*bPLmx#iF@^w_UTi36$}|>6$bB zz+E`jqFsX@`vwo!7j2g1gr5;-le>SkLYSQ;2MjY!e7`f8IP^t#5G9!DAkNZ!jTo*k zlK>VK@ym$_kK1w z`!dQvIS!>iS?r54-E(0(=jKEgO(>EtW1r{KQwdXb(af2OH)vJNmH8;WV`@uC*uTyZf*1nCi?0K#;`A?_g>XSTW zPj>gk_8{|a=y2*Yg#PMC2%`h4Pr^QXc?LrkZ-f|a7o7k3{s#5Wxw?l(*bFAJwN+KN zguUcfKPOi#eo9@(&VpH)+nrp|ZVROINA7iR)ycI9n&?Wk^Y$Ow?+?AbeRMzgJPuQ) zo)07Q-&bpeMMm}pFE9x!PKbm1E#{$FynL72n$7o`zvJd70wS5Cgmm1*Mq6oVbK=+awccU55xVL{UzJPwu{0P2(oFoeIG#U{MXwc5@t)^C zR{i!*1WoP321r~Xro54JQ!(M{*Fv(S3b#C6}%M7p?|RqN}>oE=Fep zK#~wsgiT`U>686Es#6eppna~NJ3$LX>*|tBZ<#SjQ%_17#WYAr3<5D6-u-2%jh81r zpYI*7Po71=?5~#O@Re0I#FPe8aUYsFN~FfOJgpcm93f z^oge6bAbZALniqyHqsgi;w*<;J})f4)hAUOpvHcsM$Lo?hhag)QCFR^RUHWS8r=PO z#?U)oDJ7r5cU;kg$KKNTx0b-zV@|^3Eca9dRsX0gx=4Rb3!~LkRw1h}bd+fA7R?}J zl4y_OhIZ!2I_`u&19u@Zgoqh)H$zH=^m8C|T8Na?f_;QM!()qCI}4M(YO!I$*tkyRlr4w!9WVCNq8XTKzdDX z@O)vvaK=?J-b%B8afar*g^U5oJe?ApUj}vfavGq&N=Q97mo%6ZyrckEaqaas^8YVez`*vsCt<8;y{_OR@|z@7z7 zfK~~=D=oTQa<%yO{>KLEnX;Y;dY=QAx>DnnmVwl}1LK|FAbif~i4;G22@1# zk$3oiSAqUxrZ)WH(|-n&XC$BbFNV!!D3a6hW$D|PNlQOt(Ncwvd>)~WZjkXx_le&i zfWJ8&E*Nfb8Ut$E8>^2Dd+t zv&DVeYGtw*)1l%K4QLEG%+_>PK>*Om4u3*u_o`FQ1V`CU8?!*yipJ6<`Hav|k>>w+ zxleQ-dmhz#ZNnti43P)x1>ziugVf#0=<5u>N+5+_4EZ52(6?<{5L?6}tW)cDNR@g= ze1@ZhcG_RxN(JOFc;6fbeGLjF<<<6e^cg9DUX^Y#F>>W%)mx4qUKks@taRBW_0vv1 zEgj+h6XQCz4BtngBQxfG^?G<<84@)R{T7Le zr3odqRS4v?KJ^rItLhov`{s$7_6!4k%YAB6so^Q033##w>3rSuwn86|-xSZ-m>;T? zD$YVX5R^-!J^p?4k<#`6?tDUvF-g^rIu2fU#o2x!ea$3@m8Fd8 z+2e#AZ-cEP9@;H2S99q@+l;ahYuu5Cd+f-CV;P!038#{EN zg(TCK9V*GYz%%kzQ=<_HhHE*`8$V`mBhr!?Apq!y)TF0w$yRPf#R5E z6hBOi5C>@{PecG;VQy}Ht;=eM0ug+mH(fERZfyM@=k?f;YK^uJt4A|xnFw;SD`ixp z?D5w3{rDNa%|$5-!;gOiuW)~>Qm3e0JFXsbYZJ|e4ty3*lV`pXd4)=4jaVo+vhj@9vJ1u(21XR}& z&R(bIFx?Ac>i)D_tpL$iFmBVQo7D@a&o)msoj*iTN*jhYb>!W z_J{o`9|hHmB@4ODvQkkF_5el~pYf~6k%YhJ^KaF7Gh~zgg#6DX$4_=+C!GHYI>-7e zvyJdM)TMXBnU{=}_Lq{?qC12$uh87^xZbQB4RJDbs;S0p42l1~A1d0G9@VwF0H9=# z|LLbAH;luNKB@U`(RP569Ns6pTZ)AK=lqzIJcP$olK=&O`R6}8C?C?|>DSW+)t>x_ ztK#&?SZ=smk~v#{A6*k&PZhMAW1)~V|B9X$u~v2rr796=Lri(t$owtQPb!JZ=$e`$ z1~PTrqS&ii)P|l|$#Cmzv$?e<1l)QEjwQv?cQ5G^1VZl?=Lt*vzx>fJDre;+gGrj1 zzQg@YywIffe{8*FR9s!qH5f<(4FpdE2?Pu75E2OP?(R+?xVyW%6FdZWcWs;iL4&)y zJ9EkNzVpqjnV$`;)!cLHR_$H2tIE}-)s!a#w+id+iOt}U2?=c9S-jOFQv5-IwVIa8 z(rBdz%thMNO#WI6gVAhl%)FjiQki8RyTxH%-T6$Hrm?`Ae3|B>u3UqBdV4P}yweel zNvhCSn971ZeJdlF?$X-(p@-C(?lvlbs;LbSE9sio3;@oqmmV;ZvvaL##Z^_b z#l)Iz5VzG`z|dDqjw71+|3v~1FA27T<`z_?;7o`5()Xcd2u=MMFMMqK8Y{8{s!a+F#y#9NOmFtOvF7fLxsMtppVCy!HZ_U~)BZWYuY@YR zEpqtL3_z9tUc)CrUSXn#U2_Sbw44SWPIIEzS%im@HOUMtD%LA1IDtZuBu@Huz#3Ap>-Q}FMV1=()gNqSRU;=hhcpZAAsk_!!)Xfg4bEc(?Op?Ab&nBOD$ z;AA{Q8uLfmDVq)>KSihRX)PbObqUX{et?C{4DW?d$7lJ{37a5?P_>X1S(8q%x57EA zwR+-w8(j|0>2k+hfJ`tl()g%pW(#5;2zv`T=c%VPw%!eRMt(x8-Eu>)Iu|szU+=B4 z3drK)St;4ef}Lwi#pN}I@!4Nxc4hLeEB#YgqAi%!1B!f%w*a2Gh`hr~;~Q}A!3sQA09PO44z5`f3bN(D{cH@K4j$*33Y7&zjaO^v;( z1chjSwZv96JcZ&6u_O^EY0qg@8^%PV8!0bX{ZUh7ay;OdymMEJpi^S&LZZe|VdFk7 zIxiUHuq?K>Dxr{4_d&0Fn52A_q%{r23yL@RUuskFLP>!%?0@+mZ^U?D?={qpRd=8z zVrQ-z@|z?^NL*dP=Obt@o|j6>@+&;S>;@k$wqnKi>rlilTZP<64xq?&!UP+Jeb_U~ zQ_56oRZ< zMrO=BlZ=NT;=1D$6o_Wi_|QLjTl83Ap|r_@)9>1DzroQP#6UeB$66Yn)pWS*+0YD@ z)dh1x^C&5G!z_*vIe%lmdnbH!57**Ps-E@oRd7_X zMzM;I4-D>?hELdZuBhwF=|1&KsXkZ~1MF{*X;cB=Qw=5o+Q~vgLs`6*4ZB^Beiy2+d^&x zzs~bA!Y;4XCgMK6`(OY6o(<+*sl^I~YST-{Ho7b*C%2pL9L11aBd?)tsp1=svzS#n zZz63|uEO=(8K=Zp{tgrnE%r8H*%d~WwCpNniENyKC0h$1$z70MSx3Xs8~WA#>k^gV z&-?D*re-hIzN{wDO{xjXbnRj4z>M6J2pTw#l((WurK)M9U{F3FuLe{qZ(#GS9o2yz zkbYudzYlji`ieHA!vnTzx&5@{^(<3dxWSC63X0FED2RstiERG5kJGtC5Sw$X9R6_% z)-;qx07zu0Nhaj}4iGZ`@ zbpW$*a};jVw0*0FR92ziqmj)`Y&>;8oA^fHp{?&*)fr5MuKx<6A&P-gWYYE~={yC{ zln>`@x8u9gTR4-12?U*;Y-u3(e-1?ugs4?ET%0MJEV85O>FI%qvynBh39&ooQ2(-hJX@^2r^8 zsHkONwXnU2a;AN%dvsFKo^AZu6h%jzXQa>aHVrxQ2Ri^c-_ZLA1j(!))^DeMVPs)J ze|EMH{+Bo3LoaBMcI8#H5faQt#>mz#ItrjiWAF$jvR`F z9G#hzk3w+X!NkBBT;jo{Ca$xafJ__T&(BkEFpKz3*O8QDol5erIc%%P-!1Or-YlHuf@6QcYW}M>#&%D^h)>Md84v!3cioyk{R$((S z*2*^7rDhTN&gU5-(hHPtl?;fqY}N!kPBz*>sB|YM-IcR7r{K0bQ;zAfuirz1wG7-Z z#z~~ytuK|hY_1nQ&~aw^Yur5sbmgFUR=@k6pRSYc>6D@i^e6LnMP;I!lgOV;NO{ zt2S+)2j5uJdiUpykI8JFz=ovA&av|*5@TMC_qxa>j$BoK=++6mg@|Mz4V_^=V;R8HkI!#BHthRBD!fUyb0m`Q5LLYcFlA zV@B=UEr7AqQ{4{J1Sk6P(Ac2KbIkIDV1A{(@1}At59ZU^0*oP}Y5I>%-N_G!(j{6N zjs0tWXn!qwnKkVkWU36u5h^QJ_s}oDd7NYcom zGWZ0&asOlcgI!J40$T(vy+bAQA>{iq12n6;S-)fK3XBq`5k^Ba+O}c0vGrA^EYjna z)BbpJp)3@QTPLCt3p+NrgI;aELiGn-^u{K3j-v5yrwPw?YPiDF<=HWiw{($CdEkG1 zSQoI~4M>r8$q*g87MUvd$}dkARBQy&g>7QG1F`AAs2KK%UNSP)Ub^~?Ca2n%%c2w8d(@JsCMb7HEgnjrq_G&F+x z&X^D6OzJaK6_|Rf!KZ&H9D32Jl%WR`*+7{Hu~bUb+OPOZKdx=uK;m*e*$?Ymq2v|9p$*4um_Vc$M7_dmv>;#)?N9 zg|H|3Z?PGcRr1%6-n%fFCjLZ($t3I0FUZeKRr`KV;O36|{xeeHi(nq+BdlpwDn9x5 zzyD=TVs^^nEzylwf=9L%=@Kz9QR4qRcI7}_G&ICRKbxUqt80i$jD-#tqwS@IV4q5b zqiR@9r1th^eJ`iQ|LXb%5MKxpgwXPb(!eKLVABmET=)(36SB#?ibrESC#rsLqKpL- z$!NIpHzwE|I1|}-J_V$}Xe!U=b~wi_B#-<2=LV3+=&+#R&*PTsN?zy$pEe(-lTQJ~3R;3H`DvY)%wm;`J(ED3P90T3>U^w2TX&56y zSQ}2rgO=%02g)r!jA#Z>9M(F=44p$88a^Aa09uvzNTy#tpjimQmA1AfM>oz~8j@b% z3->nl9&J(Gs!@ueWGwUJ)VKe=JoFQlm(VlwiQ(~IyTlGyP$)=m*uvvQ_;7luLUXc; z5LW4Sji`k~j5%wr>VT@nBykbz{+h5S(PI9y)A!VhuFhCE zFK9mY=baJ|wrdPr-|df+S2gO*OYf;(yfhD1uz2KU;Su3id!!&Vd{zqu8#%-;ak?#L z<@OWIOTSM7d4+!Hx!#uyp1vo65%CGA((T;E-*zBULt8hd&sb3z)uk?ULAC;E4Z=1tX5yNgv&D3kOc7XA@{fYX;A0=`UUc-b`yh&sy%n(uf#32V1~%=l0*>%s+r`3t?AkyXZTB}uUFb`@<~29 z;zSsvgwaaJ;Z50CjdoIC;jG{7iy7L8SP4!bh%BK3$oBE_7RYr#UXbmcR1Q*=VhsN^ zq!qwzl5+Zxv;yBuW17m}zkVmEyQL-I%lvOvvHXRJm8WBTk3ug%0Nq{UiM$@As7;hk zv%&k*U-H90P>6_)4gI5tV{ZVCV^>K^ny6vrD;nj4Vn+&z{)L;hM!X8cC1LyB7@ul} zoyho_UsGj$%T5i4fk!LQ%-1rQ?18T^V|M&ncJ{xEF3f;iPRey`?hLcPS6epHA-sDx z@=r9#h6$)Y*(|kYHxWW!E=cgL@-<;u2=$*hHN|lP#F5AQMtZWZ7z1L6vuy@Aj)zOd zC`-V!KvxxF+J*{H%$P3-o0CziR{{{5Bf_>(6y9T&f0eP|$dLH2`-#z~-yiqnymZ{o zN((*IY&^LQ9gP$tL#e@dGO$N+*|k1Q{M7dn2(I(NA%H&xlsqtf#-xv5`fgKzK?8$T z0c2x2Tu!IeILO*zf2(l0;u4~9za$G{bGeb`n$2vfp3cAk!bzjBMz^Vnd}M$V<4gW% z0I@DaN6cI82NV>@&fw{E$KGG1ckORHt>d8uQ@a|oc0+OUn@EdfmH94mkf1+iTCA-# zXDa3`7cKfC*X!=&V>bop@!o{|&kHpJ4sPf&E7;_H;UzwIBHlVVf$3Ay8rZ|jkxt86 z!MEpiD$O4`vny8}ZcsO-El!G;L{jRo-_!%&h ze~u0v_C0{!`qBO|ek|Q;+d*6C?{tbDTcKLS>Cq3icfb6Sri!mt)19`~RjN$%bS1L} ze_Nz#@(-sNhgD?aY(Y-JWe0cOyi1i35)p-5@vJ^@Vo7Ud-t>IxDuXNQai(=>SC z=%o2Qx<%^GT=_YUL_~&k>~I7EDvnFx+*wLc0LZ1~9Yn<;iclPt2=ox>?V9i8E-kuZwOm_lXPS$^i;lzlnEaT0#wsC%_Dt-75s%Qb2F$wL z16)#YaKR(T+)}Hu9JGG9Nky?UD!JA5b9aG+e2k>!qbX4CVcM+KFP#o;WOxF*(5k}` zSLayY8)eoll{xsRwpSiMH-RezK!2LI~P@j|&QUdE!JhXy)aVPW18TyTB- zU>p-bgvj3kfrWG-72~0&7S^lh>zY9v^^q`@D}sFyQp7~FONA6yk@UNnX)|`l+UWjF zh#6M8;6)Pf=s}dxb!g@>{bPlYN90AVsrUyE5Y|4xVFx0_2)-E6D~w>t9I>2)Ha`+h z&bQZ`UtrN9ZpX^xW|p|$j;!S#{@HW&3!qv8pP{ay4BEc&BFiGb0?d8pZkuwe%SaQV z<{v#(sju#8oS)?ug{|5aFNAG4pzoGJwT4A;cDk&hW(YKwsv0u=GLG;+X?Dt-T=0_2 zIPjDcs@rk4;5cZ?iY)Rc9BG z!f2gIi2M_gn8F=aQUT*meWTv&uZe^R)BX`1x`srEd>6txRWl~Lj3*r~j(M%T_t38n zo^*nZ92FBc%${E0q0be>hB53VE{N9*jBZB%D1j{wh-WF_)VMTscl9yV-0P7!95+&P z*d1xn%3IDjxF2*eEF1F}=(x}cv}+ykv6X;uKMmiOF9jkI}sH z@&=sJaehuqi)e&iEuc7VjX(toF!5Nega8q2qk3hN(fDtabV7*piVhE77CBYp4{oi5q?f|i zlN1rN8hME69r9R-=cN6%>48X+!;7xMImCOs8Z-aYF5dOmnnl7^Q9nt(6_V?fr4Lyc zYBX4%!ts!~-p~e^o5b*FjJ@RM1!LL#IjBVKf>$-Ux}P6QsRbxdA1^Qz?ZjaPh0%)( z$=e>%Dp4x$U7UVFs0E%)FFkP@w3=roeIgVmAc_wE}5MjHzcZxz%?sK#>uDdjapm0D6rZl_30>aHw2UO3aKy~Ao=IS= zfaRkna4ftGm&BsK7#4oBSEKZX9|caolRCKy8nQWX_L+bY&X~bYpX>X+dyo2~Hz-c| zYXTxFYL~#Z;rdP`Y|G`7`~$Pyr<7q%{x}D0mPkaAdq+C!B{d7{i774g@&2WQ#-fs} zG2iD%jh|l*r>~>MMu53$Rkr$_tO{RrmvR;_I0oP}vTv6C!wv@bSa0^t`*;N?BgLxd zK<xOB?j&tDc|m zfHx^3K~JZiIVi$S*%Tpn3)15CK6eXIOC!|+Fz7WpqpRf_3t80|t?HOvrMR7v;ds3c zlB-dDM^3;!;6Lv0j%OvJFiLtz`?b1R(M&SesJWUTr>BXS z%KY(-w1`Lo01vYj-VucuJCLIF8Be{6%${ot1^FQAhA65sjR_EBBcdw9ca$ z-s<+ZDBMGotoW0-W~K4*_m+z}^LyAD$ou#HZLP7^kLhupeh7CR^r&0Emy77iTfQPN z$nntQr4%ycK+n%YQTDfn$5rfm7lhob`(E>~Uqbb%1Z1O`a6i@)nPXR1>9V|1P;(i; z0_unz?K8$1snT0;!)ERmmD!{%%-EDE$7Emmd5vp*7kuI?CD0wwx{i4I>A=me#J*#M zd~$Unz9u}otgiQDIJFt+7|Iq9sj$1&eha}i^}7f1$#jXl@$w5_R&<`wiKb~<90Gx+ zk*p_lu-O8b7(~Qf-P><_YFoK}%UmoqY}{)gBV|I-~cNdr*S0+oD;_cSlIQosZ1>d)(&nz`uNR58@so2*S{ z^d$ab#jbgX`WBM7GOAY0_*3p2L7-wSeGABn{(XdltbTlhzC$(KaF+P56Fs+?53{NPqPZoedxOT^e<_pZ= zC@$USOOM;;W@^*=CzmZ{&a+V+6XuFoHREQk5O1KEEejS zZQt3p7q0%P$BIZgk_3%v`4MSoH((8KQVz$y>*#`hG-N4rv&*?cJB|{xBg$IXG$!M<$2cca1NoIqmWzsr&y^a)y8Od<4z`V)8yL3s@4$x<6&pa=F$NYV z$q3OBpZ6iywrKLcJEF^uxegD4#02*<=I{IIKOd57Fcr}*+lvg|%pbPKOf?=s$sY1_ zZRFadG_yl!#r;@lKK{t>ffO+aV}Yn;rX2)yhZ4IDBS>R4b3PZP!S~BOrt%u*l!ws3 z+B_Mxdffe}AcAV}Z7eR4(Dh-!Dq%6Y2L1`7Ra~h1wOv8vN{);~8iuyHhGd~-*~uS5 z3y&%(u3tUd(%KsPDtQM->x0ylZ=>Pot z{P}iDYieAj6tc{p&JCG=tQlQADCIVPf{hNUr6AjXKPa$+S8 z$RR$%GPK^{NvAVDckTA3RgX70{3!pdF}J=B!lzg-ohPl(O(MzzhIy*elFHfDovlk~ z%{N|?dOkFsF+3m*=qnL7wiJo=?JRfpw3cLlao**ikYKNQq43Xo0%Z1{crKo{tNko_H}F@ z3g2+pX5n{s0$=FgFQHa4t*Y`_!fLy@5i6I?87MALSv=&^*gQCAD6msh>_-*Tk9K`d zaunuw2YoUB8d!Nu*Zado17(PV{12``UbbDn;DVDIYSTDQ2gQ!W`myIyFe2f*>jXNj zmXkU6meVdZ^>n4Fk<{P}`?9-BF@d;b#)Ek;r1sIj+TY#6p^z(2fkxO|z65caL`mWm zVOStt1a(?2{Zh)*=JM9E{bL`?vJUfHjrmWpSEz*Le?d*{*3A19$dol+oT|g5E>c)m zMnJoYuN68VJ(jbHnIa38*3521pu&MKg7LDfTxfP*Z`suVx_e-4#WwD^8*A?`*2x++ zsw^9fBnd~Z8{2;L1b9<`SqcSK8z}D9BiIe*$(+|2=a{H}o@jIY#1{n&9S0GYOQF!1 zo~%sQhX$Fph^A_1h5_RBREfv)RDq0uHmzxhfiHQ)V=Jh*x<>VxjyzFPY8;q6@-JQC z{2~f!d8LN>KPaOY#O@^4qhTPTH$UC&e4QSU%x**%O2Y)P)I_c@81ifZRtS=kvvyZt zEXGVxXkig1CzMOOD)IYd8e6iI(36sabv)eR;IB&2-D`fE_{MD4K@$wxy2I7*-ds;m zJh6yM}pqwAISuFXZf?R`!6Eoi{yS*)l50SfYUeer!?L{JlWFsj8xb8av6WxbofMUDFmIax zncSo4jgIFj4n6)~L<7rxzwq#Huwr26a9+)AQvW{ToE6owzR2-tYSgUjunicC*6BRk z2w<%f1p+33C+I8OJXui*Y_(qMIc*;6{f{CN zRf^-Pv`UK4HFJk@OzK8Sw0QqT9U@Q*KQCxTyOS0Hpj=_R;^J?#U0gsJ9*%4oUV6^m zdp|CINrMe*Lc7BlB06eP>R0E?+($kz=k(mM81h?<)JQrU{p!mPv>$r6h zQtWfZ=W-V(`&t_HAz!TXHAVWLudAUF&A@baMPh8)aJOAee~`*zUql*O@#4X>@r8vE zMah_P+r?x`a74ry#k<}ScsRcun#f9qbOVYKS;)m#DF=)oOZv1pl0BRrl0Q@&e-R?fwSDjY9iCc2G`>w8?fIg+>T4dBCQUG0N~+m9l~ zbJPlWND3S?T^MKSB1mi!G7Ehl*I+l*J)?A1S9uyb9wa^ZjYu)47U z>T4PK`}bWLy)^BDg_QdzZlqC86+G@G*EoUgoY1R7kCT!5k<&E^AQf4HWK3av()MGP z{9>f6yBx~uX~7Lo%p$7ojLt1>qky?*%V9zFH?_5nrQVPR_K=c zGk6U3+c^;xsM(h%WXI0QWuscPWUedW@XbZ|T>%%P7{>s!EG4RNP$hAn8tTBkB;AD< zWjqR{s#}F5?bzWkzh-%fu$I=bkj{D_(Wd(O!eC;Xk) zfLm{a9V^_FhZHgg!M*}>6lCpHRW)*RbA1vgXBOc!3DukmypO;C+lP~GRH%g6?CaX7 zJ_n_e`b#7y9JOpqH4N+zg!oYxA1p}(k51yvX5J74$LJTz&jps&L6CzI7(LJSn|5AbcIp^KY zX_JN7c3BQ;B3L70^w~yk`Z8|KM0)eB1#i@Bh-t9}osKf4dJ`@NB`d7$a=CK~rR}E6 z6PMK6_PI(n|SM9vfj{BP)noD4|9u6!xN%v9Shs4bTVygWBobffAH z-N(yy(B0LXMT1)GZnV**Pg)HpW~+}w{~U*zzgcUz$*|%Kaa(VZ{r>v-ZyOiZoUqh7F{~gj1eAO&B`%ny305pz3uiKz zTff~__i0Drw(Ett`dDjH4(|066PN5|L-qHWn)ZeHreri{#3;m`JY|9xqUkKWI(o!Y9GzT# zS(N-HVado>uvg$RgL!+N-D-QbvDvauRCZve5?r%>UeR}E{U~Z+W+1E; zw-)}JhP}-y^S7Lz3mt|;mH@Po@!^D7fdm;rN*X2x4oA?CNe>Q3!z9I+Ih`Ikid!8o zogHC4b3{e0VZJyx_(Xq|hkvD;Km7D6hgaYvk{Ck~>_A#XIj(s8*F(s}Yh4%<_Vt2< zJ^g3$|89{)mmZe1j1fm{F9ldfpN#5MFtERbc5{~;9HVo$j^kVt?;LP$SP6w<#cpxwC87?9>FkWe|!?n?CW~`FzCO4DsN}_8C+ZVOi5lhww zX}>J_&MX92}PTiM5rx-S7ZkCU^GEA_r>;R(s$| zZMerW4N(Ppl$c^RCm*?K8FY*1BQltB5x}WU`P3x5px{@4^M#VgHbElw9i$?Fj}?xv z55W3`iY(*XY3_*xtIUjm3+J_gZ@A1gh{~nxA6MdHVXI_o7&jyepwG6I^apKZ@&{^bTwRu)mjdf=`2uDdAq+X z6({UjwH9i(y?$~RgvYpBYzcQKEjG}jkgMX|=gJ`A8W>@<+0us`aC2j{g;ApBBwn|_ zvQl(%W*=YrNhG^Lmh4dC$S1fa<4iEC1<_h>s=;ReZ-nfvIAP@B8x^>yuY<;NC=}M$ z(wNx83xOy!s7!L227*on2q<>t5+UG%bY9dbJYun#G75vv7Q5h3Bt}l}QJa1YPL-3O zqxea&EcMTGRO*49A0hlon1`roE}_&M*eyY>`oTUv!mp>^}vQ(j634@SMIL z(YRPTd)Z4N5M8<_V4-%W-WmGxfE86Y-Ndh zpu^yicjS^7rl~4c>9H8PennqlqPf2e<6UlBovqpB^t?A>jU;H5Tca^D+Fa?#s3zl< zIr7hb{qgj#N&pnna)^*w0u|pf%9;7-5CEOR%3ou08pj|d|262KRA7D+9jMx>tUY|P z{lkyV`i33;5-o_q?Zj(U9(Mm8*K&!r(HQMzvmAPqvX)nOMc;d3l3^S)f}aLccXqRt z`#ClW-KQPgoAM6Q?g%U*b)IQ2Q9{{9H6 z7c;1xL$XO35#vn?Tvv<=213}eRMWyl8dpP==_|GT?l<(@-rIE&ggxg5jR=n|KjfiU zV6^f`3yp;KXUd43gI(tqt}QFcJ3Rz#+z({#PE)44b`l{t2{c$>50dxyZR*(z9f4+h z7iOpkb1fm#lHPj)z&}XDVQi0tn;I`t? zU#`wcx}o-+DdRN#-U9*J;XbXuVK#ie zRC2xtVlDw(O_PHA1?sc4B2U>*0}8As@8-qhLhtH_;E38KmlaCNT3ddcZiS7YScL7( zk5z!)?Ft~BvOMYfVqz4~!agkbqhUEwYHP3S2Fdh7F6eV-lc__6h)%Vc6NmqXpcJF# z+Fc8q%r|n^u&bBQVsn}*W`j0b=(sj~4WE>AH%5eydIwci<+5Mrg+auKegwc%MKtgq zux;7GKAm^Ie_;EL&~~RI17v=Km1-ye-?1`J`HCB(la^CdvT|--{G+iI+T_7IHL9(| zKC5(bCVzTyU?vkWtgSx0Ho2$Hy32SR9K-r3)j>+XuU9@+rrL>ZhOu5}S^|$1=)4C+C^eLEY`)!NUr>PgR5dt>;}ChkJ|GP@a{Y{opc?VAI!eZrC3g zPuC~peDJjybc5H^lmwzY|9?@QoYF1Z@Or+6 zJza0~e2uAm{jkT*e~jorv#^1mx&r-NIkVR8CHP`sroHmd;*j3xrXQZ>W^-t5{++ z+;c`VtI+f8hWJ;O*I6r^Pnn?fEv;H7XEddd{lYFz5W#{B6u@dL6ZKnqkIN!4iNYkv z=h1oEgW|l>=>5lPzx*M#*Ns(?e!m$we1e1bjP`o|3Wc3w-RT~9HB~@y&T16MlfSrE zx#>bC_ogNT5#O@3s;{S>SZOr_!U%$a=g{H~n6W${Y85cT%G(4a;|O8oi1IIl!6N0g zD*hn8BIAC>h@u&0L~b3+SX804-(WHSFX&Z#fxSrUnEMugKnx3!^yZ=b_M9&WQWVJg zMrZYKoTjZ>e=78baOq9tU8qa+VyOV5V~GpAg~kl?K#tKlFnjifjfD)|%Rj)?VD!#- ztX+mQY@*P8zf5Zgp?Hf2MkeY{7!Cex!!*M?pI~dAI7b!>Oz#mI;T*51rhvIkmrhzm z?L^qd0O~D+YFe#7je=QW??jv+NAlh4KmONn+B zVP+c_j#<(NK2y_gA@^BW!QNjH`)Jvr&(8I&RsuHwN5vNG0m>QdT)U?$# zC}Gc?Jp?R@=#Odvqw-Asha_#-EG3!C);>tQHr>-#k=nC~4Wr;KY|c%mGXoMi;PbYH zvICrHr^DQKZx_%{8|1^QI>NNWT8(iX?BBY8K6PZh0WbsbIx4ck1R=GP0LF$6Q%u6B z*X8(7O$I+xPN6p+nN%|Pg}Jv1@#emHorll?Dsgaln(_%v_xFK7LuR~onefz`tB%1& z0qX-pPUVuXeOL9?*Oo|j2)o{6>`LSHB3$;CY5Psq13KNR3zuEpA>dN=hUf&vQ`??! zLbuhk`@;&uDYXM0dlaXmpI{5K0O!?l`dX$ew1e}aBqsl^O`FSw!HDB?dmg!RGmaO!_}K#6o7E*>R0g!ot$(lVEiLMYx z-vEnAZ%x`yi1SLT*|9Uw0QkGl=mql7cLu#RednXKT?>stOy^OL4e1o(l;x+N-<-oN zOXhu{do8I%GkwZPY!zYod+(M!GxakyJNHdQ140$WdA&t-HDMJi{lOSLJMXL^UMl6= z(a+;Qdz5UgV9pUR*Ob>#cR?hwNU&ldg~|Pb0pbH0kIlD+nyh)I)C}Z416Ar{B zhUAO*ZN=dil(7HsTFQ+I`o9&LFYpD&2Xr_sTS8m?6`}OP;UabKysDU4rwyN zwzk6AR|^stIBQ}P6gtNpndhitVUk-4f4L|$goE|YNCO5#6zcq}Ygqu0@nzVd(vx z0|Ff9YFuhoe1e0>sinkaMtc$+L{7bqe|N`zz3E+moy=^p}Xp^yEMN}AsE9)|uWiYJ!;wCbHwio($e?fpf^0O;yCI?@o; z#N(Kmt12wIncRB?vBSO{ep_OswybPrSBM?!q)_ylYXs20TZF@r)=QXT`R2QfI1eQ`={|M@m_A5b;+83ulCS1BDk3HY^|9UJ&JQyTo{V(y87#I~&uzzr!IIkA34w+15 z=x4v^MNeUidAEzrHQIexJ$Ae}tb60_;`N%c(nfKP~Xz%^U zh<`{=HvnWhbtd@es;zADE=BM^7M~~#ki*0;1}xenS^Th^(~B8gD*iEAt%Hj-N(PDjd|NqYe{_92Sstb4%$O zd{3k`V~R*hmbZF;ssTA%539>`zXO|8Dq_U^r2%rnjC(1Gv^@$6!{$!*GH3#j%0PKSU z)|l+OuJ=(r%2j_;a&~3cU+CM1plH@#y}AD}7iOGcmNy$n9nAY3%;w6Tdzt@OxqaS# zx^lPp$3A<`?qb+LC=BhcBRBDmpKWmQUJ*GKUijrmDo9{a59(R}Z|`DC#5?Ld$%xDX zPoldDf=3HwQLSK*G1Q|308Iri>?OYklcTw@J5M%)rj|Xn3E#NDZ$=0+!x4<8%bqVI9a81WuMDFP+g_d0R za;su)|KRUVZSsnnGe0W;$PYx zT@}{jU_RB(p+K&spQ6V?>nWng9X^^&O|xi+A>LoXC)V#Qxba?@8KuRBOz5Vz#!7tI&8)KP8S;FsfKJJdw0xh?9 zNIlE+jY;XSAI4!YqKS$8!M8sNA9D8wCe@YY5}G_s?r#mOPiYogTS!Wjp5Wv$RPxRK zxe)U>?~p#8Iz<1H|FV-l;$*z-h|~}stsh`j1Rw8LXrRe{4-FQ2dc^tqKGh&S!+;S? zbR6!U*3Z6U!Nr`+y=3`@{qaTR{lAZhTfhEl`(BxfamqT%^JvIrTZN45CirprISXrH z@dH#~PK6n!RN0SM;Jv{}6VAz|3Ku%2e3NsF`){-(uAt{fC*p4pHE^uuYR0tp;u-YC zZSIlb+emI(A{oz7u|}9+@JUY#oXl$B>WC4Fwe24yJ$}u_c&?1aNSWTW@={)9?10a4 z0ipp$Bw2db9lxv`g>EJe^^UWs6m$|CY)6hFFu2MHFEXSPKKrj}C28}A&=9}_ zeBV3MB*tmht_Xr9z>}f*kQURi2JN%iIB|dy;C((5Xn(?Z!5uE3oB7Sxgl54?W*OZx z%UArR>Pixyai9L$89uwXKaP_~KHGdM(~_bDEvO|dg&ePa?!~^}JT;dF8mxzZ zxQBln$d8KNerv!;%`sg8m+JXQQek^pjmy)R5)&i-IU$o+aiU-DiLOW)wA zXjuMzz0dqs{!M3uot6|7(*^)d9OYymb&?6+eQ3D0E z2O_1zU-&tMb^nNyz!UmamHV{M%)pU11_LeC!2m!|HIvvW72MmqDCOwb&Ii^r7U$Ka zLomZd7K8A4w+Frd!uV2SPDmyyvU#{Op%0ckLM!xEYtST@iyJ4M!$jy{`IYM44v=3_ zva~jvif9x;14M30w|~-;h z_okeIi0i!PWzoQW)=!o%mZW{L--19JxQ@m-zhjJcLf(%_I^H(;$0uZdW#T<&iGH;m z&+y~myS&Ca)3~u!UxYr#DsCoY7~IBtPK67$=x zL?nxXM9S@z7z43J%qsqYr2AsegI6pMezuZQdw1hbWzxZRUq^wmbJ)o-6E16KP$rW#q1?-J3_^h!1d+n)C~c} zRwrJ3ji?&m(!rmum;`kbHIR$;DUSUx`?vDa65Kv(|Y44*XYgvao72WGA+((&Wj~7w7$eI z)W_d{3`|xg7=4p-y6)8gkZ1wFYYSGkOx7m8=(k3V(e%y^1P0d+jLfC+?qi`izF}js zvR=o8_!lItf%PI^37=8R-~7JH;KSp*+_?gX>bb_^*@4@Y_cTFCUTPW2FMrJ zwM9Fh)1123Kh?{r5GB}%TGc1e*nc=l2h^No7F!J>hrzaYqBS4(gDcneKPOz>8+~^2 zB&)30d)dM#+wy=}FK;6A^aJK{@nQ6Q`DwPU=lw^OmA@r(LZ{{WFW8mkR<6=+4i0e! z1LS-5K)wfZhX?*ga zxxTp5olWt2$w?q{un(KsNH^%TwmX-9gDovHGmr%$n9sk10q5X!{ecMCq;BIMOBk0X z?jsG?5BJg6fATgnIWaM?P>#JnkeUzrUEc~my-<=6PeD$_fEtR7Z#v+7!8(l)RZ(*Jn6ITjhNjX9gU3U#Wda;T_?{mLXr|-j-<5%=-z1 zpb;~P7Nq2-fpuf{!;ccmOdKR#&F6!Lzx_6invu*pvL&^=6e7$`F3F^v*7$qMHRS@l z%i`${I6ppnj97npc^rzSI$evPehH+~h$k2NUF0tr#hmM@%!crxbQElZ3Kw|;=xn9H z7`uZ7^BxZJJzef+MoNn@pwz>a{Bou(wedEu198^F+Sxas7ehiVEt2H*T(nGx%rJui0lA zuupeh%z2#G5y&%tt;{Ph^SF;mkylh?-LWS4l?`SwG+ujs?%<`#SrG2Z!Do+;rA1Yy zHM}(#fw=$5AU9;BcqE5tIWzLS-0ZAaEy~>w;PN*m26E6^-!s(bqPyW*ZGVvoDSV1W zXKuQ5hOszOnQ7E+A84p(%n2&o+Ux6k$%3JajM3%=7qsGOep*}Z<)&ngn~!E{_}c5& zWPWUh+XEfodai-@cx0JEJF96Qh{}aLINDZ?10-HN9%CTCMn<>}{TyZeSpo-Pm%0-f zqSNO+G<6+K4`oRVkWlZsb%%DNW8!J)M>Rze`TbO_d%woN53w$q`s~?y`Ov;JU!-mj zzBNA7kz)IMp3qGx2s7FO*1O;6t0y4bwI0VOBW=FZBRBg*vV^0`E#uSbLc6aP$Gej^ zdrRJ5)ZGn4{qe-&jAB+l{XDYjpaa=aY z-+~7d(3~jUjR!R3JgvvRD$w<~cz6obwC@65$;eymD}7>mZCGy&8S4sNGI@{(H%=ue%bdxK%QfILKe;au)cGzMSGC6dk=Q%b|FKGa>MS6X9tXyYX>S zN*|f2o|-o{HvMRZ=<}&Dcw30M`R3{w_Aj&LJnHJgaYM&Zit>0n3P#&GDx{=#FC+jr z=S)6WBm}c+J!7Wvbdp)S!Cz{?f1;~XRZ{~Id$SYQ6*ne%5{#j<3$qvLOy|=yzK*6; z+$gzip!Mb=&}0G-E8p6z3bL}|Kb5R(czX6s!ic?pcQ~X$ z>>sPTTU|o_o9487D7x5$mP5F`pCFG#_N#4pQ}^+AuwHP%`f4`j^dl@8~L0K7Zrku6Kw71_i)599I=(OpwV*u+gc6FE{d@*GInk zL^xuljHLMY88^3Nyy^41Si)KbHzwQ00i&q`)9(jVMveGM_UC7qUIvtK9;fqKleS-Z zyoe=>V006EC&0-qgi8NrF@8T!;_gp6Znk_KtNMmLf&NfbY$HClXR&Q< z2AmGM4~X69hN=yzgcc9H@k{=2v5t2_40(>-S|aEmW)GLFU)i2mJF)Vil`QmcmZf#Q zrVP0ygGx+)FH$0h5VSt6cG&F-0=xA^0(p|a!Ju1my zAni>CYyL?Fp7uB5W{k?oR?W7l0jFIrCg4gq05%mGOsA#a6-uC6kLFERJ2*PrzvwA6 zOSRyTKDJn5S<}b#dXuu!Vqf6&&l!ET&wDnPA^)bqH%%Z}!SHUhX9+S1q$*FTIzcQ( z=j>Q}9YA}WaJ3+csI0v_0m7WTOup>>rQN(Si{S~6pj)}Y`;rQywivOmww(|6E%@Pc zTZ=ug-U5cMpNeiD?)smaGcMN1V%QXTq+~C>?+QnwiF)1Ou##psU7_`~v1yon_9Z%8 zLfWH!0BsISJ9k=62>T^hWmDb!r=+I#I`CJ#^Ty-`9`1c}8J;5~ObJjySF>bXuM}Fbg7-_O>x$#9n$| zTLHyd!H`Os%o9sW`P`%qm(EZoms%S5#N`n1M=PzdYK!3RsjEj$B$KY!?(7KVAM%=K z-b{ZPb8T>7db)Q6bmSph)Pp0Ex%8d=5Z2>+6z~$aGI_=GS8t{*B_gj>KpPK3tByT4 zN>VOF;d4M`P$=>mA{diUd&9G0m5imaQL=E1KxQDcx;+-c>Dl2(p`O=@%Ywz(fn-3f=e`IeD#S|PJFTQX=S*E$G zE4>#47Tc)V9al4Jw2Lsl;H&pYeFIo3-8w5LnK$*V7imO(Uk$po;H=FKU%IX?8yPjw zeh0oxuEA2nSYpHw_qwXUfiLCCa`vuCQ()D~V zg{(Q3D8u{F5fENy?K?^X4=cjg|K60(Scr%1ZNnV#5*u~hok9P-G@l;@b1E}FlU5M{ zKXHL^uMG1IS?C9wInQuas1bG$!yCmXLJ5d~>2%A?7>M90@6e}U0$4nG-2LX5w9oaN zm$Zy>pR(9KFc|qO(U|&DI@cW4%BWaeo?VL(=VsY&et*&OUbBq}pFT%6U=QHdKKiin z9i$8jj;nCeM$(*8tKG@m7yt=Y29$2LY2tS%KabXv1GTG8Ubr5rcKpblv|p0%EH&a= z8^Im~Ea2+#^V&6pt>_~GyiK*!ZQib`_=l9GZ=wJg~_84k8}9k@BaD#o4M zfgi?9*Ke_ZpucyLnS@-n|J zNT>l|qI5pGna94wjc4nHLeKiwBpNT!r-DO8z;Y&;_A7n?558?^WqE$xm&YxR4}Q%~ zc!Cy4Z`HVu;S;Fo193UWQ*t&q#3ijq8u%QTYFZI++EJ5bp}<;44Sa#(Eu`@r=zx(w zsd~uT!A=CHLxWmrAv#qj+K;lW;7GC4p5dPpd0IIfR@cehlHWe3w*hRHNmh>jL z5<<~ZkXjDz3e-z=eV(uQ*JB7h2t=Nq=7sv+|1|j6DJd#E5Iq+jpPJ1o^sVE;4I?u0 zTeaJCcfgY?nMQ&VWs38#R=Jolq4L$yk9yPg=J2<;;k6QP-xB$~lN4#{-Tx@6aKF;1 zSt4N^P^|^75{voj>cBmM#=Ez-A>th|lh?M7b7ZoNKnDczZ#Yqw$^+|3alhuU@QEvb z#Gx%_f7=hy+7-yJFKLzm`3MTzc;}PCrEwQ!=15x{@^Na(#V~$;3NP|PaoeMt?n?76 zcI?adi*;oAZP`*BQ_%GnI4KPXsG0#R{=YAum3EqQ1^(MBmSh0YW^sjC%|0r~eZ<<+ zOww&;vS|(pP>7OMxe-*Yx(N4?u_2zoPN9Osg#(cZbr@*dpPcm+*aZ#3M%WwH50>%> z3zDy^zn;*XLpDDsx_0-`8~N2$iDQgS&kt<{Pb8=tcftE%=LHY=}8A3lV!P zzx&=CG%tPsKGz&gXEPil&RP$8>E}aUst;$mK7$%($GvV~@TV8WgX9jRLHS4<$!J7)HY)U+pc2%C>-AG2Hp|oBpO3V16VTT| zu~O|)M_X-9{hblm^qIDEO-II=JvLL`Rc|F19OX~&86PC7A-`$Lh!5+^PhE8$%|iSQ zlUNT!VELhSb%*aaC~5eDzM1d^Ue*3Ogf-}B+?!NMQoDW6Xf&IZ9f!-4N~8Fbcti;b z`%jl{xEqOTPgA9_o>K4(2c_-?e18&lCpy`(<$W@>O^U-={8ZO(wnn_^Q~&q?tkb@) ztgY^nqWgs};;G{raxzflPyizC6r|`jO^mPc6vdhJMEL*S{*7lU9s1c8QNX4_X*&t} z|6|0BpI#VFm1o@se}KMBM6rK~)GHGgzUQWvy#+lLc9@U~spN}jYLpz13_faz)T=%1 z=@`Is+&;3Cxgi&pADHOaGtXr|4-SWToTV^aUe7N}+THHsD`qv5!#ByggU#Wd@Kp!S zmd5RnBi1~SEK@1YmYP#gQTJE0+cp@|`Tj^7-%ub3S`^kLMKq+L`U02Z)n|*b;>+s= zLyzBezb@bXu`kv3L;R?NjQosFXt1Q!n;s4PuoxTTPcFNa9fL!35EoMtx3+q~Jva;_ zquXdx#Q%8#rv7BQdk(K2bKh%@82qIMG>%Z{8@TcJEoXMP>RgFhE)Kz|KN98WX|K6&-_R=ai z(5M|%2*olKhJgMnnN&mqk>PQ~{rnMV%z630fyw2v|5x)6iL^J{o#5r)r9t()nFrYQ zO-caBiTGvr6&+B#HLpV}yb?RRg{{7&Ia5$9KfB6yn46mmN~dCG27d%*4h;@2O;1n9 zCuGOEu#|QJjp|OTtE9h{PXkW(Fe?I|5?4Q;R|PSIF*|>6`_{qB%Zn!VW)4aVjpNdS zZ$e*;6Bg#>`EXjv8vq#c)3$u-Q?E7(pQ-n5K_J;vi!Njc?5m$CPj?hm{HV0(68Xol z%SP0bG;`&REq0Pv*_hkkyWf&Q$pM{pHjzPtraRN?d!lch6J+kc^kyg?+(kl}$wW8w zAPZdZdJJ3b2T>|&C9#M-QFGDry|&~Pw-?SfkT`Ky_^m&4g>NH5&1U+R(#_DyS>I8Y zN%uAuNqc1Zon^8~!Bt^cm}bxNSw03b+Qqa=&6IRc6_1P01vBXMLlT65d8KwPZgs7@ z;G3MXKcGDeKznMiy0JGZS<5d`@f~bf)fkYp($ebU*@y)|Lu3_1WzC$XIU#~N+YiFfdhDkWc2BT9dMf-vQc%pMI@Fa=Ky zp#S)efUAOs;KV7VzlhVLbkr8yk049}x-je_gkR)T$vf0#TIke+?Sjq zy0_TZ-)zhE4L3UK&#-YkHVtw%1D7{BQX*7zROwc_VCflir&V?bHXZNJeiQ8XUqN?> zwGI*-Meax)L(ajYGzVvpJGJ*-;ca~na+;nT3G9qZa%TcF&z_-R+e>#xIj`E67y$Z& zzzNaA*fV0IUOZ)1EPGkL9F`?kK^bfCK=kkORQn#}FPtF#PS zO%-hpercp{+YfCnI;Cr&3;bD zqa+6g%dHLLvp-3|TpH`=0`JjcNt&z^Ko|SaK0IYM=?TN{RepEY<{3L>ueAsJ}z-c0r z!ZdEt!R989B#qeKZvXsdg>Ck7LgD$#V&qJclod_F3C1{ID?9c*U7=@j*w&_!{0JC( zGdLp_n5M8g82D*x3BL(Es_>|P#7+l<(FQxxll$2{FQeQ!r&==mwFrPAx$SiYN#a~F zHEf5GpZj`+n$0v@PVp}`sI=sDdl3lcK1X&YLy^~0#cE+$(tm{f z+nT6X;&OZ~ripnL|J6O}Z@-YZiGM%sMQ9 zo-G+NN$$BO=3z*L4jAk?9#R2W;WO=YxA!dVH7U%>Fw#v;1ICvicpvNwwL)z~=?}sb zyg=BqMsGgkM|DwC4K}3!?e|`5m~wr1_Z?`^!n^%l6)U&HNN3pDAvG75*5v!V8bl4g z^|zJIO9CXq?sy+&JzNDbyZ>CRR<)mX$vhV}X#W%v&IJ?j7t`9-@&1zRDn?qutKWNY zSJmhy^iih2QY!0{#$!Tx+oVn`U-W)6+bwe!z2GA{LO021^D6ScV1je z+A`s_K$oxttBxClexjF}l@)B5{l*Gk2lK9ZMn?X#_2Kh0(`TWg(GPg|t5}$N8!Uil za%Mz9K`mmTQ`c(cz;2Cq1{jR6#uCAGCfJ4pdwmq&cVL!RnRH-;JUKTiVPU}=CdL_# zW?#WPKPtk)YH-ejh`9YBnTm$FRNg!%f!M*q_;6nl|Gu_XGFT~nQ$@?^mAP9>Bf=xIg-7`dIg`MgMq8m%0-?twDW7H<=aXrMQXvhF9+T zAK2QBm=Hp2EiITZz&Qb^*wf(CUlm5;2u{cseloBq#E9(x+(x%uQIyk+z?Khh@jZD! z6?BU=BxkjarJ$kL%&?Ez-gjphByTuq`)l5;`<^x}3ln);?+CTKz2VdW-ueJcJjZEH zG+t|F+e`KU#ec{V*`o^2(?yn=4iTbYJepyLX=c=NP6L3WoFqV{T$B)SiNZ*pfddI? zf)K8-5kM|OL;YESj^Pj-N@2x_#$y%Ay)kvN;qHY6DQ%UHM^gAGqL3$ieBaq7u}LDj z)Oxn^v?|1OiejKCv2;Q=l$#S`fmo!4Ybjc3=^EN=hg%VrIVHh|bkdyOHa$IAZBrQo zZ$M2{CmT=|FW&=6{B>3@AfK1XWL8z7JYXgz!vwlV>6DjqSxSwmefFy4pJ^7EezpC8 zlbt>80UtY`J)N*>z1Fp9Y+?@oUMT}~aq2`_6c!XaB&gzByhc^Rj{d^KP$B);^96ZU zhK(1`RKbxc=mdVa*g^TiRxF}69$N4DpQw^LZhb19mCHBkUa8-g&#pUPr0$fFCuZ!9U|#-CBk`{@8HMgFdk zwozzbk)^J7u>g-fF(rj)C*H-PZ8jm_4y?V66wj#AD9rTZwuZz}eP=7nwkuYV(F!CBha`^W`2ggTZ_)mVcjsj_vWJq`?~k*dIbuKNi|SI zjZIoL&fSk8y`!?tsH2EK_2A(!)(_w3^Q{S3|1=A%V!$!+X@8KQfsBXp`LhUW?`!f}+& zP-Vaj6s#V2OU+WlMk08mj_0I42+wP<9^`=e=b;IeSYP{g#EJXC@XB#H1zl13EVZPC8TknW==hULzfJTcJf@-&NiSl0az^YyEKQ)VO^Nh@@B1!Pm5umWWF=a^PT6X$du8GL-}J< zbqSQ4XhEP3oe$Y;b<&tf?>5Oa4$&fHw(MR~!v+Q6+P_5I~; zz}~8Rxi{9@S=+l^rjp7xOAcLaVz0h`mI(B)RbkNA*S=(ia4CYQzka~)4b79IJHDq| zUMSd7TRsOZD!=YAd-~9ul8z*^ZiD1uyi;AccCc0e2xD!7pFFTSpBh4b87a%@H~$vd zG{aS%Y;Pvp_pNp0!i5a*S|pYJ-2-j*M>@cxc7c6#AzNs^4%~mSzSAePn`KuW{g{Cn zw;>I>gr1GF>c}FgD~k{4cQ^$i(^46~Lb?n>_4i;jxWpOhb?$;96KZqBfzJhqHiv>d zYm5z9rP(3+>Hw#`s3!$kfUlPu*yKqKJlR`zBlWL{kYNG8$V)CaPyohlm37659rVKY z#`+88c)|>gt{X?3oEX!&-eGUD^9Lm-V|*D&ZOm-(u$}M4^SwdMg@Et6L^K>xf*Q~* zxF?_)jg{(eRguY)UD;j>%L{hBM>}em>$time|IyxvNe$7N^26zMOmzh3rK@l!C!u% zONGDey7gR4>LcqNp#NqS@>?j`l{z=*^gSb^vx!;(E0gF%J0kw;+ebMMa6&U$sOcVN z$)!*phPs~;;O|D<>6=j!u6TOW`d!)K_>w=%o!!p%C%51GA|s`YO467V>Bh&Ekj@A< zDc}+n0V+dXfC8wT z|3=#r5pa#>$ex2`D>BPKQ+JK}hPu`h5oX%X@D(QzU(38pL?=QLS}L3y%Ft-F0?@W) zcTSEEtP^Q>qjlpzcBkC*t3_j=l*9 ze=6Y4@@w)ioo}ZFih%McVg~TX&OD%$>(2WMMNvR1jSGks(HOG8{>&(za5h%Ps!hXo zkS1%MP&Ra7L5a@VNDpR(n|HP8N;hCh!&83(I#;FA%NwHcELB6Ac5l8H>jMs54gf(1 zs^30`fydU?a^R=VIN-gf~+dqYHeipY79H~=m28w ze?0@dQmbO*n@|~4%qVGB*Z8s7H(`LQ0B}45+;AzJLfyvbb)=90eM%}C3l~=k`6s;s zRUWGhs?W9J-6Ks$lK4i?!@*9I8yrr-y-*oVNOhwnDqS^Bcc{7bRGth45#P7iBzoA# z@JQ`?E%%J{1=|Ghpyu+lTaUKi5v!4KnrTF%}ShTT%>3D>C^kHhm$YBsYZ zuOB2ts$d!qDv|`waqojde=If_)5 zL}G~!&@7ZV6gAnNrbQZJ9NL37oKoifux(DtuQp(0L5ioPiRphcwVpVA0aB=h_G@z@ z0rILBfKG9sW59mc@QAYIciY|higvRt&F$UNy9Je8yJrBPArg1FGubZ(9pmG!gnHHh zyw|d@EgCtrf;y7P7G9C?C^hd)Mf15CbMNi@9scqba5>TIm#F^_T?oYk7Bf_t0y77s z{S**H*wSV=4DTBMGNzj|rbgO;$m7dE_Qo{H(4~@kx=lH{0=K)Un3c`DE=(Ka0eBLZ zYz^vSd1yRW&Af-%?;S;El$gZLVK;Aodp3iBLALmOe<9TP`ZRd9Z7Wa5vg_whV1|z7 zK>pIxwSxni=#+)d0o%QAK~N?S4;;!p)DftOSg(jBjlEAim7J5quRt|RO(o;~Pv2*o z?h^B2+@ySudXtoZw#FckHW9+H%iBf0`AaDG@{d~EK8r_z_=k#(n6Xb=a!$@g-L^=s zit;b5Po7|Gi#?4*`&NB-ax!D27d7XS9b{O+BA+Po5xp!s0PLNcs~iA4NOjs1(vTYm z%e*{4zi?0f&n-ES`|(rI^q+^xLGix_4+DV=YvaPY1>+@rOT^^=Mat1W`)tIU%5TGC zK?U@`xUyu5>!O6BR&{@?(@ENZsCs-Xr3WJ?AYZ%(@ZLO?z;LkjiO$*@N-MxCfr5@sa^^RcgoTKQirv7(K9q=$;MIMke@g9R-)YST;b4K1TLh>5Yxn9%#wI4?@jem*h# z_5QzfvU3=O@q#C#J5YNrGg07QCjTV9G3Xv0co|eM15J81jVH31yFENu+CQw=6n?6j z5|0qqL5qMIP5Tv4f!TxyO~_b6LS}R1rXf7PVvi{X?LEb;&(V0Bj8B~!QbcQ8Iq27$- z!+3#-I1!Oe&==n?7_(u2zV-+meo%R2ca71IqQ#i|%-RXzsm5}z2CQD|Cw%3aAefs& zzc3aGJxT2Te9o(Ee5#_xqHI|h!+8V_)^H`QPrvM6CYYP z!{x}?bV>#Gr^m$8u$t-&mL@oz`47*3;$QC#(A@~g*r?BNR!#W7{@2KjgP=eQ;3*1O z0z`a|vbQPKKoqCG73O;xbypl9ORSev7^2amqiDG78$qfdNaT2tH`qFNn_oWS)Ve_qrBpJ*}b3_#VcJ7KD~ZHmNzyf0+=rm19k`iC?EQdTUr8^4bhnTL?*Bb-q(H#+ggg_WbA_D(Uo-vK4(rK-bBS9qg*l8Aw%7+x!HlU`j z|Ez%Xs&r71D-;9*_)N|nLwypwRx!s30#7n#4}KgXYI$#1Sa*LD&x0bE{F5`;}ZkT}3^KiQe(8H?7__+S(G%MNjEFL_3+CDu{I&%oWc z{kZCg(|T^!d0?=Y(9?`i29h@^S)1}Sesf0|Xc$iEygsw6^j(nYvwuHx)}N&O@~@fz z$mM${CJ=9g14C)&R1>Sl@4tu%ekjsg#mB6A*oFpUcd8eOTw3cW+J6`rKK|*lQsgT=RzzVz`-R(`ke&fLv0GP_4? z#KZ2wuJY|^Aj;?n=^v{b1v1jo8m@ozV?0|uB4$g51_#ysTGA@ccx*R9w~UIQ2v2Re zwPLbSaKmH44APXyBfGB6i<1;Vd{BL5NZw~j{D=teZ!K|V3}49UF3gqYJj~yI1QJAqd=y>vO`;i!n)36$D%ks@3&%baEpt+hy0~BD#m8lP@iMLK!Gy zdPtjuZ-Lfhz{?NostSjEN>tZ_6QQqeBV2xB=z(;tyiRI@$O{7uDE7HMOBfL8{|T0D z6U6~zHmjdppqmSWu3GE3Kr#52{}M#$PF>J!6{^csM|^1?Q*|(~jZnJEjBgp?SQ%!O zYjaz=H4WRZ)@+|hz9^xiXk&$Xwr}YjNa`MBZ-vIN7yaH~D?W~=oMz1+g~wC2ve3SK zO8m>9>(k4bg!FV1dRe5+A6u=$R13P;o7mne{J|FV?4bBgU!w&l|IN83MQ5icS6)72t@j%vt() z$qGIa%Bi2CR>l3*znLyc=8b42t?uskwlZ032!sQ`D`yp~SJKS;;A(z*z7C?Vua6X` z7IZRfiP+2_yh8kQz`zYOj|jDoJ;u zgA~&%N%80o@L7(}+y)4Z&ZGfj22JA^AH|WP-zJ0DtA8KGv~`V! z;@{3{n^UG1etic6Oxvp5&tCF?T;x{#DEBap`J_P4B*X#Bwg?zHThXeUd)`)bYuja5 zS>x7v3OZwfr=eUVC_Sk&g&A#o$&84L%h|le&FQDfSo7BE?k=64a;S7?A}HeGiK;%m z&p5Y}jI0I9^mi9z$d01<+C~9j2>7J2xmi2WQKZ@&mLCDCj3EyNjewj_vBA{o{<3#^iJawmn`%D7}1we`MSgl!5c4n4JPPCE$ z^xnS*+qeucPcSLtR&d8f0MkE82pX0RLq$f3K~9|ANnIHl%aOjTQ!6-d*WsThT8R1#!w!Y?dvKPx|0!+Dl!@qzs_p{ ziPgR>LX+K8a8#O?zb$<<(a*Pl4lW{q78ggXrEkLT7%q|&$;`zCP_Coip{spVBA5sE zk5=c9NERmJ#HJ!xVa~bPFQXeB?G~Rym1%`Iza}<8w^B4qOUo{o(4-_hS6v7h&4dEJ zXLw#CW_=YPjtE}3)1w%H149v!jkNJD`k{6( z;<3dfK;?8~cJI!;0*0a26Hcu8KJO(M#R~}%4uyt{Uh@WhYWww)wFzq^)0epbs6w>z#EeF!nEAcQzyW>ot~gdg_Bkb|pMbcjuI z<$RJfx20@w4CE_lNrTfHzFbl0F{eHG5P1JHEkh9twjS4#SlLZOSzOD5cw3{X2-_+@ zY8q|Bv?f7{lhQpv4zv@jH=f|bgv+{~&eFQ>or0H1YEZPwX`&1!+cA(Di(qi}ddlWA z<;&k`1~TZ(mtPvKQ~@3HZ(0}Ku(io=(&7}8xn_2)C%QICJe#AUAsr8*CV*7?UwQr) z>G;fpe=kZR4v=`Bk7NIz=6+s@0DDhf&M|Wu+)7(S zAXMD97zW{TTZ+cI?+39iP!Iv;Jx>vKV4rx{2_zj&LKtdsknr@)yC6$QRmes@BMTuO zhox_hJScHBJjak|8?1*-$3Y8!@)x^r#iT1p_M8 z(Am1MyA#M^&a_AcpD1J^_puWV!J7_tIMYqakOJVy5=X0#np?5!B zl=@RL16);QM@J%AqyaoJFMdH`0`G=vIn5`;6$O`rJdj;kBiGG!Y%E8V%EcS`bs2N&C zUdp-k?i>66x%Hi4AV-tFDzmCf-+8vyhh-+>>P*G|2w9!Ivo ztb9`*x2$?7cdaNW02V~-U8CdEqO%Bf5LD>HH#MBc=2H~b3{BtxWzZc>Y{D-szkAA{ z)VTg= zVl`UaN@KtyNC${d{43yY0q+=`%~u$xKbeNf$3AHgWQ-heb5(O%j!Q_G15@{8d;7i& z*4LbOUoJ2{=d%avHe8`~D6go|DHFWa^l8@DKb@49bU3~OV(xGfK)c6GRrrStDfm3x z@$Rko_x=CAPTu(D{CSsNs0RrFK?pKD2M604FuVH)($axuMa+ljSZJw%+P(5M;?76x zgex?1JI7~b#gvw^m|Iv-P*ZFkB^Uzo z|B&haM`XI6E_0OjQDlS!`Ndyij`w(TDRRX3>ZDKq+!IfKuZDwZ1?VkNOLZ;~i?u!^ zCBIDtX^SBMhYQMl+22Pnr*E8)VvVC+!0iOkFpgb)b2SZBR>$v1#Jnox#baZ2F^GR5 zRkT5n$sKm_bb1F0jZfmdwXKq!aWr_2yFXLbskGGd0hZpbw(H*Q)}*zLlkZ(bVk%YG z7NMaG_V^bvZ?Ikh&O_S#2&md(fkJUqo{x(LI2CvdVnV= zex-1q3+Mmyr6_2?m!i;TDbfL7Dvq!H*OQ>K@Z~3Y-oL62+tf~le8Tk{r7ePe|E(n~ zkAqN#ztqAnMe$R8O0NnIh&HgBT*{CpN$9As1LVbMOk!`ora99+5>iM z;c@m;^XS~2sk&{R*ip5wV5o)D{~j0aT?}ADfx(hE&tSA3ML50qqiV<(nv}MqX2{ss zuy{f$K)n+`gI@RWQ~Ugq*G@QG%g_)p{YX#H)Z8WdPML6oH(B<7M-^~Q$?A-ksCjG@ z$TfPV`CR3HZi}{$+H+f1*pMxiaSRggoy&`S*>S0!Fa+(&?N>HD3ATT8+F6o7y9G8_ zs3jrOJn7pSbj?zqFjn37_>VEY(gLx6nfa0v8=J~@G+0KH7aK2;xpMV}<=bqKX9K_Q zAKp~9rl2HxC`5-}VCQH9Z!Dc2s(EzcT+3hT%N&q-&_Rv%iKrZOtsXom< z$HLf>F|lalFbp3Zg|~jlGH~zk++1Vd_*iI>wy-HjM$9Iqyl-evijFJ(1OW+092oD8 zQ(7c6@lr(Q@o$hpfTPT|<`3y7fgs4>=pv&W>0NR~C=!bgJ_|*_6GT5Myy&f0#=mawqvQ?co2#9VHow0_wzI6?#RW5BZ5hyID?v&?iSUUV&V7zMWQcCCt z&5u{*=tF;IlvBZM{F3E2cL~#tP8;DYJnF}@>oxCSNG>;Vt=;H1gzrNe`4ifGKMlXg zpI4CMej6G_ZyPV^aI>bzo3B1=EECj(86j$0)E%oWQAwrl_9v8CMO~dG%}`jP{mvp~ zi}DYjeB!Gl_T;D7wg)=lh`@I~eq0eTA`G)P^u zks#M`QdjwLOBE(_*aT%r0naCxs%y^BM;u|WJ=T_Gv&;+zhC@{g2Om> zm#A_QmnE|aO$(oZ@Cp$^R6A)L8pfU(5E^S`A_;*)KE?MXYgkA_qog31L^LC_;On77 zrNKPa{N#xBY8w5n?3-M9|}w z0j}+xr8*@WQ6tMIr2h|F-yKhd_s1PkMpj1ID=D+Gva^ZRp8=YsX3SlSy5qF4Mr-lQ`o zdaA;lBzDD5fUU^ZAU09Jv}Uy(?^JvK>+a3DHw1+dq8k`GekgLqu$Awd)$>kBc(wC~?n;6Un}DWOcXm?1|z0NLzv}zg9t2RlPYs zCe}|)G`y#arfSmMP3K6Sf@7j ztSqm@_`t&&RtnGP+$MJ&Dw)p)D~M-*haSb~1&LouZLlz!(}JL!TnN{9W1?C-Cu#6h z>B=2p@$;P;i(p`BuU@CAX7ClA#pz0}eb)120ng|vkFmqyhQw?+;`(9vHtM`~xZupdymGz0%Ec`=mp@8_nKooNR6@XFo3N&1>GxsbCanh48>${9H z+CIBJKS9r^l03E=*}5?a{fs8fg-=v<{M7 z|+U((( z-vj!~jVa>Xx%&tq@j_jlcot=MT#*$ER;qNo460$icv{1iTKORn z&EX;zZH@0tzdg!IEQurGu~awW_!ZGi>ixyAwj+oQTsoA9fGWnT@1}(?CLy5C5#{sA z19IRh$`2Y_vJWP?R~*yhS0wC?)Fxy}N1xW>1t(d5Z0te0&SOc2G<3x)%o4zr*kSx} z`aYkJH^W=w{-cUCetZ*u$4BLt|g9D3s&SaM}`$4+O`BAhB@oYxt)t^pA znC;7wf$!J8Gz|^0z4ctC_>V~#wr)+ev{rscK@pLXQrqvX&g&m#Xytg)zJ}bz(_BP~ zWGcpUVq$8#9T9YkQXL2aN6Lkzsj)+)N`pWrc=9K{=D{h#QShLGoM+jT%aeo{#U7MY z!5Ti67{(oJbIpaYhD8as;5}l@m2!hx2w!}FhaLFH%w~RCbgZ8_zG2TJO->oqvW^>T z)pcAZd*QF@AM=9`5+c!!pk?A5weGLY`9|F=?hHPu5LZ`cIi(-krUR1itI}|dWz4BM zj~o`(ZH#;UU*_pMi^}D*Vy>HayA`i+T&&=q!&N*K=-avoveV% ztL1-vez3luZi!YqXwYu!FWdQ@+NL=KHvp>eMuG03q z+790Nq20<9IXZ?zIaK5EN#9bOEKc96g1ER(wV5&8i+x@Bq_RUM=a0eJ%exvT(m8Y* zYSY`|0aZ*z9-X%2{Krfq#UqfN_=4+Y5!l47fi8L}RbS-nE`VAvn_m!3B2%x(ewk55 zk3epmkaZ)e;sq1wRQZ9wi`h=+MaTM)>O0S}rPPp~{rH-oOdLwy?h(50#gA-l)YolT zFJZr_Zi`k)T0+4Wtkrs7JdKJ4SN@+70TT?Lvy1vL7;xli0x-9_S6v>tgkbCDA)cBr z@|ZgOAVSW~gvZI7km7U364Ej&XFu1Fu|)71+$6rqbpL+4$DKQ|Y|Ni3pWM88GjYq^ zsW-yCWVNfiI7~9FQvjBsK3wVARjY3z^VL_>ALn@Egrd@ZHDSK~#ro{QQWK;@;*5qY zO*mEeaz9gKef=ygCkIzYO7C~p>Q4Bq2ubH{5Sw74Ec_L}K1?iae_JUfz#IoOE{XyY zaKj1m9$BsyG9rwcvemtCi3YG%wHh6~LlTvi^)4=P^>r#Y{St>fw`bn%x^eY zloWSZGyq~7$4Xp$j~gvioU-%*edvf$oIl%8e&J(NHBEy7RjD(yZqpyK;-s2p9S+Zp zrsm@2+r0OE)NN(XJQs}l&tBKf4W$vDFAELhm5ONnU=1>M=@HZ?(}?kKf1Qqa;z_R^ zCF}psr=MtkUc^PWd6r#9ik>Ja)A|IDxgIqL^jTE_TZ#2Etl>SMVhn*f+osR~9`yD- zxS`tz6fB`r6-MV(olagU_O|E~j|&Y6F)h>`@&K>N5ohbT&iEIEwIIQA#U(_x zf}_Zv-qDP+QdCPOT#Da4AYnwi&V9E5(J}l+O0+vi7HX!gr|?QX-JBW+#2cQNW79ao(RkX!mDJsh*m@carkitd z@c=u<7dyN#jB!c5qtUO}b9+SY8O(Cg?I>K*iINbqLSTEQW;RQ8Pa3nhWZQHnTifhl zD?eHI=UGdpVy(_6?yu|r>U=go8g>5j)dRcOO3XH0^WCVRGw)~JJpNo4u8MF59osGb ze#?>UK1!P8u}xpDksS3=?{+rtPwLUtb09dzA*E3*@1L@|2(d7t%;X1B@COCDLM+Xqssee1BO6DpC04*T$HUE5)$&csHpFl$IFk4bBqtZTXT$l z@HTsQ9gQfe(L?WEu9IAE9>=`Znv( z;5kSks@s=lNFIa)8}cYvB~JKJ7*Zy*wHUY6&6j)f3K7w)1iQfv^=J?G^?96!8i)p+ zZ}LyF*Mo7$&ydMU`w#li6VdS6k#_*F-BBHh2*A@BjtJniAR;XOxZC_JUcl_V^~f^{ za9sXf+>2}FABY$QWIJOmmEF@DRY4GL(nR8FdzHkspkQrI)-jVE>u0R*M9WGe?nD&r z!b?xyG!xGdMW6lW+wgD4kT&ACm(g5~j<2c|=^Mw#7hqqUgifD`f#es^PBhYwk2lTZ zEu_C;-OzmpJ*AQ^nqqnlG}51L0}0EWW!PqX5C2(UPz6joj+~OxPEMmMuu!6YIas>+g?c&MK>{N^Bya+}aT+!Q>_2Jx8b-u?`{vVin0l-YSja*vHImZ-_- z!+EsO8U4~?lUUi*!a;=&2Y`DmO5t?Hy`P6&**xv|R?ya`g4$PJ z18y&rm0;pbcjUFV-Zgvy)fN$v(Q{1?ra_|&w(oTrdBV+YLQ9cuk51aml!ilDQ1l%K za>J;i5d%E*fiw9=Rcfc^frX_8Zp}ub2Q74}#PP@;E}|Uk)FWIoCO~qrE?-f5Kh0d% zHh&m27G;wYc+CzpJ04^R`JC*Q`5<(}&dGem@6#6YLVoG@K*V+i$c~l*8ioMJf~pT&*ce6W;?JPD1Cs4G_0)K#xsB zBewb~u0BaT5PGe}F=dK^4P2d%s#1wzrqiCoj(Xbrzsv+H_ z!wkUZd>%glh~QN;Y1lxgofkxvC($0s@!m@SQy_4tV_htOo6Wx6-NtK z1|(k>csYf(wd$0iwD{IIn)xQcKwxPuTA~0*w;Ir1Lqg9^sk@G>Imv~qwEG-+{|eB5 z7b!`{<&-t%)#-dNpYTfzV*Q3p<`Y!3%x?0d8vAROZ$Ns|)l!R!bfl9vqu7qjO3b%Y z+#NqBI;->bIs(i>w}Bt443qDdq=FY1_umi)84y?Y-(?Nd!c5^R5a4+b?}h95*MAh98y za{E)j74&cSQvm`6*orZ{E2^tZH#w=)Bs9U6{2sL+?_Qn^%Ki{80awc{vsS-P-20No z=CpYC;8x2;8sHl{;qBtSiED^?E&Cu==W0A{436r36LPRd!>Ki>7h7Td;hP1&ncq^$ zqk^Wj;7#ipYW`i$MJ&0a?f8^#w6+X3l1&Onk+eQE49i>OEa3s zpGjQmT^rClqJv%{c9el5DWVU38|@R@#Um*6hK%bBqS*)i&`gJIAddRua50l!VB&G! z>O>4}shgbK=GN);IJqokr8lu9D76J~y@o~jc&8!ynrOffw*LNTI1<2I7xaSzDaY>z zg`LM9E5ZbyCLU{M)GSltuwc4lH!70RFp3)CB#ihq6QQ*=ulIt9iRt@4G?vWq#Z$F7;+A~4Q2h%PA(%TEL3Z`I zUOkmLm$Gxx(p3S^A-TUTvjP%b(wN-VX-}t$eDA)X$1V86`}ZyYP|hGbigod^hh6u& z>8U`Jbhy)QKaYGQZ_7Hskzoos+GAS5ct}NaN&r|dHx;xFZ#!71oA%flvZ3gB7q2Z_ z>nZoIsq$;P_2)2`)N$ksapHptZL3}i@9eSd-ZaBzYnk&krH*29-!aKjwfnwuTGzd% z*MB^DCZHr8zNV?h({Wiwpp(bEnNd2vO78hV)5&lw1(4vkEZb z{JFF~6>YVZUB&oMZ+D2?ZA~-_JY;8%G@5UC*%U!9Jlo%@LZCGZvl+_MbZj=WJFvku zWBQ5sqG67hbe~~90O}q%pkFVLR_@*RQ01*R#|ge_k9_vpbh&r?fJm&<-axwjsL#lp zOuG$?fK52KRh=7VAoKBClfS1k=i zA^&>Kgjn|&CF`Us5#Cqt%{iX6CU*{PbA(;ZwD;G=XEeh_s)zz3wq(ZvF28E+3Yr|q zV;hm3z8mommX2`{gtiFeMh$5a-6sT1&ygWmRh@azGL14q!g~@IhD@t7mvKTgdGzA{ z5+2)M1#7W{WUoV}%Y}dLuUgnv!;g~NAqq?NsvU-w%u0!z-eDHZ8Pe3x%Izm(?I%iH z;Hu-bqiZ8{PYIWg3?JJN>_E;zaqP-NtY<#LQ)W5;x#zH|mqHTvf7H$3@`HfiMs>z%qI z_civ55H!EHNtF@NUCdFchFogndk;ih0)DHHz(ewBiy=&i0>)($(vJ{w4@DW;LAk)B zq45mv((c1&Sk2N$IwNvMO=(os#jRz#5;l;>a1^uP>Gqk+){sSb(Z*=OI)9o_;dBK& zpgia(nHu|oDyz$0-5PG^d^y>rX$c~CGQs&JoLC-oTz6}2p+;asw|%9SvFG?r`fLix z1bngn49U3kE4OTCae`&hq|u{y=xTtY4S{DPA#dPe-7OTid-2oa#d0OZ5saJL(&xm# zIkBIPV#vDGYe)rPoj2zv5j!B%yU%X*l=>LNIxi2mjqun`>c#b}77M>@Repbm-lWj< zqnhz9L7H`Ny7!T^nRG(g(Sr+pyy7=ZhBdP?KYT6C4dr4=u`O68lHS2!B=G?455{zL zMVS!5KOTuMn|40!l0BBAKc?j7A34HRU+@(><>dKwyr_Fhn=c6YlBsbzT$QnQt79{_ z1i8DSX@_9_lW|73+`=TeZ;zk}spMr#EQc%LA^G3Wms`;`#f!TTEDWbrY3CsC>Jnv5 z$}VxTiDlk#nyy?}ixxk$d)&5Gr-b51rn=3fo3l4wkfXKH3zka4SBTyEr4Hq^a^bNR zJC|~U!jZI!AOw(9!A6Jh59LAIb+@`vgej~t;+n3Ikw0fh*|`iKPQF5kyEo@pd5|OC z;EE?VZ2ZW(y=H#}QSXDlal46uvrx96*0b1a<2%#9J>jyhG!$Fj_%9pI`_o%vfo}qK z9wt+ZbG^}e>t7xOIl%)X*PxWs79mj^2sB34qc?0GtRk8E{@QdYN+XwjYJrThZYSqw zC=Scj6XP<)J)A~vuX1!<8oVoLGITx1P4JmqJO4}6k203oi4EO+D$#P$WbSLup!_wb z0u|`_Pu0rMFCdh+gWSA^!2=Q^BEcc!9etDsJQmC~m%`=)-PKJ`x*c}EiKiXHJIrTC zO3CieT`OJgT~x;Yoq`S^DQ(H$CE^Kxm+yCv_#O*Otl-+8wry9s(WLs5UCFOTlke&~ z{4c@kL)Hf`chVeB4}xM4^-z)H01ybJ{|nkLKLtRFB?v1RkmPB?m;TpRlmw^da9Lls z)FRrvGhCo51N1|T|A#Kre${INa-P(qqa_lMP^p6IQ(;{gN9RAz^D^cIGe~{{wGvr~ zv<1Omk`S7q>%r#R>Q7I;nCB7`&&;h=t8AU8XU})`T!D^>Ni5mJ^E3CW#O0B1NQC3u zvQ?(6k5A-zM(SUZpneLz0}@@4JJx+<04tpTi4F&It$O`w`)Flr$y}UKze<&><=T1r z^n6i2l0^YF@;Kg{zNy{Ar?Ty%&j~#{YW)WH@cc`*OCk_Pqt6`^^W8mC$ofli;Gb2E z*T!5Pnf&fema+aNpmb{Aq;_5mxPaQLI8@LvKgYrMS38kYxrL|qqM14G!SDnA()BON zC10bc;!b99^&hGPpf@)|%*Lp>r1m`dP7B=<>F_8%yKARnTngCpXH(aRi-q=vuXZ43 zQcjQ4*mR4({tsrVB2a~mBl4-^zmtl7z^U0g3@^6-F5NpsaJx?|kYN419)9tGA9bQ$ zUWr1RKkO~zBG*Pn0E%~<(|l?QFA(~-4)%B9bpK;`5*%wpEF*#NPJnqQ@y(gpWQg)b zy8WDN%VDB3ExWTL=F)PG#rtqoR&DFJ1iNG{H`T@ae>Z;_y!^y=Kg;D^t`dLqkJe(m zlAo$O5{XU{+;dM}1JBO?lf^qHi(eH}U#_-Q<>6*dBO)$XTG9WYE8#C;a+;4vOQmnDj#N#FbwvNd@y&cN90f6!XwCDj^m2z z-#GA}VQjEKaE0g6^Y$-=B)^I}Y#NfgwaPF+Y6Umo^~rRWmiH$}@BIye1z7ESYqMm- zY1oC2jPy&jeW2qSBNYyD|3kX7@ql!frS=@GSTT^Au{PrKJh6F7^bc*__-gSuruS@s{-czl*+HDiIS1Wzv)JDc=0E_JW2z zB>&cw1n8W2K>tvAt@6n9U$6_ZJBxj3--Heqmlzx-Xq=!r%==?UU)?a}|J9F+pR!HB zx_NH&EdBk1p9QJ=lwYq|>z;n^ypiK3kz=12yAUcFdnw&{4O8C@W)D}wi*v;mIO{fQ zYxXD7Q_ZaZUo)7RiTQi))7MOuj)T8rgJ@8}`1E+!@o*!~%+6uM6=u;d`s8R;-g3AP z61+YIDJH#~WH|@L8c+p*&E;}xd*1wM7jb93-YwD@)PVkn>H6t^g;D#b|D%O}R++9N zT2e6s3@(>WngOU*xW6V8S(fR zzF#f{1U7d;-tYezeX5%e8kI7izrQM0&xq*ERtvfa6)za)jtzS2jFNp`eZIrw0hQWC z*y+s;>6yDzzXlQ5Uw?A()6Zbv{d#??*`36{<^zPqQJAi4T`|{bj>k&gZelw)_Kq`q z{F`~g(zs*)XWC}2r}|o)p3UJ7)7I*r^^Sar^SJo0fS{)NbswZa1YGz*_3C0)!Z~yT zp^ZxG$=H>V&`{1b*70iC&c6no5KC&R@te2lY+Lf2R_%J7iW#W?{m+4!2+h~hYGGCQ zJq~{b9xzwi`1@--$I+rVQ^4FO+;(b4PmXrv@ug52pP~9ZQfMLP z

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

VrFUT?ecy@wXy4$mGu|!U)p+oOekGi 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 Date: Thu, 22 Dec 2022 16:14:54 -0500 Subject: [PATCH 079/116] Add lightweight analytics pixel to dapr website (#3025) This analytics pixel provides high-level web traffic insights for project maintainers so they can better understand how docs are being read and used. This pixel does not use cookies (or JavaScript at all) and is GDPR-compliant. It is a clear 1x1 pixel that won't affect page rendering or load times. Signed-off-by: Arjun Devarajan Signed-off-by: Arjun Devarajan --- daprdocs/layouts/partials/footer.html | 1 + 1 file changed, 1 insertion(+) diff --git a/daprdocs/layouts/partials/footer.html b/daprdocs/layouts/partials/footer.html index e159a171d..a29a0d6b7 100644 --- a/daprdocs/layouts/partials/footer.html +++ b/daprdocs/layouts/partials/footer.html @@ -24,6 +24,7 @@ + {{ define "footer-links-block" }}

    From 3ce9862a4b3d33fa5bc9ae111fae3e6b0bc51881 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Tue, 3 Jan 2023 10:24:06 -0600 Subject: [PATCH 080/116] fix link Signed-off-by: Hannah Hunter --- .../components-reference/supported-bindings/commercetools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md b/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md index 6ae767d25..2f5daaed2 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md @@ -51,7 +51,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | clientSecret | Y | Output | The commercetools client secret for the project | `"client secret"` | | scopes | Y | Output | The commercetools scopes for the project | `"manage_project:project-key"` | -For more information see [commercetools - Creating an API Client](https://docs.commercetools.com/tutorials/getting-started#creating-an-api-client) and [commercetools - Regions](https://docs.commercetools.com/api/general-concepts#regions). +For more information see [commercetools - Creating an API Client](https://docs.commercetools.com/getting-started/create-api-client#create-an-api-client) and [commercetools - Regions](https://docs.commercetools.com/api/general-concepts#regions). ## Binding support From 90ed3f6c66464ae3b196c66117f711f136d65ab5 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Tue, 3 Jan 2023 10:55:30 -0600 Subject: [PATCH 081/116] fix link Signed-off-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> --- .../components-reference/supported-bindings/commercetools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md b/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md index 6ae767d25..010edf1c8 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/commercetools.md @@ -51,7 +51,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | clientSecret | Y | Output | The commercetools client secret for the project | `"client secret"` | | scopes | Y | Output | The commercetools scopes for the project | `"manage_project:project-key"` | -For more information see [commercetools - Creating an API Client](https://docs.commercetools.com/tutorials/getting-started#creating-an-api-client) and [commercetools - Regions](https://docs.commercetools.com/api/general-concepts#regions). +For more information see [commercetools - Creating an API Client](https://docs.commercetools.com/getting-started/create-api-client#create-an-api-client) and [commercetools - Regions](https://docs.commercetools.com/api/general-concepts#regions). ## Binding support @@ -67,4 +67,4 @@ This component supports **output binding** with the following operations: - [How-To: Trigger application with input binding]({{< ref howto-triggers.md >}}) - [How-To: Use bindings to interface with external resources]({{< ref howto-bindings.md >}}) - [Bindings API reference]({{< ref bindings_api.md >}}) -- [Sample app](https://github.com/dapr/samples/tree/master/commercetools-graphql-sample) that leverages the commercetools binding with sample GraphQL query \ No newline at end of file +- [Sample app](https://github.com/dapr/samples/tree/master/commercetools-graphql-sample) that leverages the commercetools binding with sample GraphQL query From de0bdd806bfb5121e8443a96d4705100d6500c72 Mon Sep 17 00:00:00 2001 From: Tomasz Pietrek Date: Wed, 4 Jan 2023 02:07:48 +0100 Subject: [PATCH 082/116] Update deliver policy docs (#3007) * Update deliver policy docs Signed-off-by: Tomasz Pietrek * Remove deliverAll policy Signed-off-by: Tomasz Pietrek Signed-off-by: Tomasz Pietrek --- .../supported-pubsub/setup-jetstream.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md index 0d51ab1e2..d2ac9122f 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md @@ -46,8 +46,6 @@ spec: value: 1 - name: startTime # In Unix format value: 1630349391 - - name: deliverAll - value: false - name: flowControl value: false - name: ackWait @@ -68,6 +66,8 @@ spec: value: 15s - name: ackPolicy value: explicit + - name: deliverPolicy + value: all ``` ## Spec metadata fields @@ -86,7 +86,6 @@ spec: | queueGroupName | N | Queue group name | `"my-queue"` | | startSequence | N | [Start Sequence] | `1` | | startTime | N | [Start Time] in Unix format | `1630349391` | -| deliverAll | N | Set deliver all as [Replay Policy] | `true` | | flowControl | N | [Flow Control] | `true` | | ackWait | N | [Ack Wait] | `10s` | | maxDeliver | N | [Max Deliver] | `15` | @@ -97,6 +96,7 @@ spec: | rateLimit | N | [Rate Limit] | `1024` | | hearbeat | N | [Hearbeat] | `10s` | | ackPolicy | N | [Ack Policy] | `explicit` | +| deliverPolicy | N | One of: all, last, new, sequence, time | `all` | ## Create a NATS server From d9f56b9137f05ef44716bec4900cc27ff87cf4a9 Mon Sep 17 00:00:00 2001 From: Joao C Costa Date: Wed, 4 Jan 2023 01:13:24 +0000 Subject: [PATCH 083/116] Corrected rendering of exports (#3035) Signed-off-by: Joao C Costa Signed-off-by: Joao C Costa Co-authored-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-deploy.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md index fb860a9de..267447227 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-deploy.md @@ -64,9 +64,11 @@ There are some scenarios where it's necessary to install Dapr from a private Hel - having a custom Dapr deployment - pulling Helm charts from trusted registries that are managed and maintained by your organization +``` export DAPR_HELM_REPO_URL="https://helm.custom-domain.com/dapr/dapr" export DAPR_HELM_REPO_USERNAME="username_xxx" export DAPR_HELM_REPO_PASSWORD="passwd_xxx" +``` Setting the above parameters will allow `dapr init -k` to install Dapr images from the configured Helm repository. From 0d9b5a27927655bda60566b11195e2fc08699863 Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Tue, 3 Jan 2023 20:18:45 -0800 Subject: [PATCH 084/116] Update docs for PostgreSQL state store (#3033) Update the component due to changes introduced in dapr/components-contrib#2302 and dapr/components-contrib#2379 Fixes #2966 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../setup-postgresql.md | 71 ++++++++++++++----- .../data/components/state_stores/generic.yaml | 2 +- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-postgresql.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-postgresql.md index c35e48397..263381df3 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-postgresql.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-postgresql.md @@ -7,11 +7,13 @@ aliases: - "/operations/components/setup-state-store/supported-state-stores/setup-postgresql/" --- +This component allows using PostgreSQL (Postgres) as state store for Dapr. + ## Create a Dapr component -Create a file called `postgres.yaml`, paste the following and replace the `` value with your connection string. The connection string is a standard PostgreSQL connection string. For example, `"host=localhost user=postgres password=example port=5432 connect_timeout=10 database=dapr_test"`. See the PostgreSQL [documentation on database connections](https://www.postgresql.org/docs/current/libpq-connect.html), specifically Keyword/Value Connection Strings, for information on how to define a connection string. +Create a file called `postgres.yaml`, paste the following and replace the `` value with your connection string. The connection string is a standard PostgreSQL connection string. For example, `"host=localhost user=postgres password=example port=5432 connect_timeout=10 database=dapr_test"`. See the PostgreSQL [documentation on database connections](https://www.postgresql.org/docs/current/libpq-connect.html) for information on how to define a connection string. -If you want to also configure PostgreSQL to store actors, add the `actorStateStore` configuration element shown below. +If you want to also configure PostgreSQL to store actors, add the `actorStateStore` option as in the example below. ```yaml apiVersion: dapr.io/v1alpha1 @@ -22,8 +24,27 @@ spec: type: state.postgresql version: v1 metadata: + # Connection string - name: connectionString value: "" + # Timeout for database operations, in seconds (optional) + #- name: timeoutInSeconds + # value: 20 + # Name of the table where to store the state (optional) + #- name: tableName + # value: "state" + # Name of the table where to store metadata used by Dapr (optional) + #- name: metadataTableName + # value: "dapr_metadata" + # Cleanup interval in seconds, to remove expired rows (optional) + #- name: cleanupIntervalInSeconds + # value: 3600 + # Max idle time for connections before they're closed (optional) + #- name: connectionMaxIdleTime + # value: 0 + # Uncomment this if you wish to use PostgreSQL as a state store for actors (optional) + #- name: actorStateStore + # value: "true" ``` {{% alert title="Warning" color="warning" %}} The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). @@ -31,21 +52,17 @@ The above example uses secrets as plain strings. It is recommended to use a secr ## Spec metadata fields -| Field | Required | Details | Example | +| Field | Required | Details | Example | |--------------------|:--------:|---------|---------| -| connectionString | Y | The connection string for PostgreSQL | `"host=localhost user=postgres password=example port=5432 connect_timeout=10 database=dapr_test"` -| actorStateStore | N | Consider this state store for actors. Defaults to `"false"` | `"true"`, `"false"` +| `connectionString` | Y | The connection string for the PostgreSQL database | `"host=localhost user=postgres password=example port=5432 connect_timeout=10 database=dapr_test"` +| `timeoutInSeconds` | N | Timeout, in seconds, for all database operations. Defaults to `20` | `30` +| `tableName` | N | Name of the table where the data is stored. Defaults to `state`. Can optionally have the schema name as prefix, such as `public.state` | `"state"`, `"public.state"` +| `metadataTableName` | N | Name of the table Dapr uses to store a few metadata properties. Defaults to `dapr_metadata`. Can optionally have the schema name as prefix, such as `public.dapr_metadata` | `"dapr_metadata"`, `"public.dapr_metadata"` +| `cleanupIntervalInSeconds` | N | Interval, in seconds, to clean up rows with an expired TTL. Default: `3600` (i.e. 1 hour). Setting this to values <=0 disables the periodic cleanup. | `1800`, `-1` +| `connectionMaxIdleTime` | N | Max idle time before unused connections are automatically closed in the connection pool. By default, there's no value and this is left to the database driver to choose. | `"5m"` +| `actorStateStore` | N | Consider this state store for actors. Defaults to `"false"` | `"true"`, `"false"` - -If you wish to use PostgreSQL as an actor store, append the following to the yaml. - -```yaml - - name: actorStateStore - value: "true" -``` - - -## Create PostgreSQL +## Setup PostgreSQL {{< tabs "Self-Hosted" >}} @@ -65,13 +82,35 @@ Either the default "postgres" database can be used, or create a new database for To create a new database in PostgreSQL, run the following SQL command: ```SQL - create database dapr_test + CREATE DATABASE dapr_test; ``` {{% /codetab %}} {{% /tabs %}} +## Advanced + +### TTLs and cleanups + +This state store supports [Time-To-Live (TTL)](https://docs.dapr.io/developing-applications/building-blocks/state-management/state-store-ttl/) for records stored with Dapr. When storing data using Dapr, you can set the `ttlInSeconds` metadata property to indicate after how many seconds the data should be considered "expired". + +Because PostgreSQL doesn't have built-in support for TTLs, this is implemented in Dapr by adding a column in the state table indicating when the data is to be considered "expired". Records that are "expired" are not returned to the caller, even if they're still physically stored in the database. A background "garbage collector" periodically scans the state table for expired rows and deletes them. + +The interval at which the deletion of expired records happens is set with the `cleanupIntervalInSeconds` metadata property, which defaults to 3600 seconds (that is, 1 hour). + +- Longer intervals require less frequent scans for expired rows, but can require storing expired records for longer, potentially requiring more storage space. If you plan to store many records in your state table, with short TTLs, consider setting `cleanupIntervalInSeconds` to a smaller value, for example `300` (300 seconds, or 5 minutes). +- If you do not plan to use TTLs with Dapr and the PostgreSQL state store, you should consider setting `cleanupIntervalInSeconds` to a value <= 0 (e.g. `0` or `-1`) to disable the periodic cleanup and reduce the load on the database. + +The column in the state table where the expiration date for records is stored in, `expiredate`, **does not have an index by default**, so each periodic cleanup must perform a full-table scan. If you have a table with a very large number of records, and only some of them use a TTL, you may find it useful to create an index on that column. Assuming that your state table name is `state` (the default), you can use this query: + +```sql +CREATE INDEX expiredate_idx + ON state + USING btree (expiredate ASC NULLS LAST); +``` + ## Related links + - [Basic schema for a Dapr component]({{< ref component-schema >}}) - Read [this guide]({{< ref "howto-get-save-state.md#step-2-save-and-retrieve-a-single-state" >}}) for instructions on configuring state store components - [State management building block]({{< ref state-management >}}) diff --git a/daprdocs/data/components/state_stores/generic.yaml b/daprdocs/data/components/state_stores/generic.yaml index bd5d3a4cb..6959e0aea 100644 --- a/daprdocs/data/components/state_stores/generic.yaml +++ b/daprdocs/data/components/state_stores/generic.yaml @@ -139,7 +139,7 @@ crud: true transactions: true etag: true - ttl: false + ttl: true query: true - component: Redis link: setup-redis From 6357701de68029c690505b8790d0f27bf23bffef Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Tue, 3 Jan 2023 21:09:44 -0800 Subject: [PATCH 085/116] Fixed issues with a11y on component list pages (#3031) Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../layouts/partials/components/bindings.html | 19 +++++-- .../components/configuration-stores.html | 3 +- .../partials/components/description.html | 7 ++- .../layouts/partials/components/locks.html | 3 +- .../partials/components/middleware.html | 3 +- .../partials/components/name-resolution.html | 3 +- .../layouts/partials/components/pubsub.html | 3 +- .../partials/components/secret-stores.html | 12 +++-- .../partials/components/state-stores.html | 53 +++++++++++++++---- 9 files changed, 76 insertions(+), 30 deletions(-) diff --git a/daprdocs/layouts/partials/components/bindings.html b/daprdocs/layouts/partials/components/bindings.html index 166efc797..465fb2b1f 100644 --- a/daprdocs/layouts/partials/components/bindings.html +++ b/daprdocs/layouts/partials/components/bindings.html @@ -20,11 +20,22 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} + + + {{ if .features.input }} + + {{else}} + Input binding not supported + {{ end }} + + + {{ if .features.output }} + + {{else}} + Output binding not supported + {{ end }} - {{ if .features.input }}✅{{else}}{{ end }} - {{ if .features.output }}✅{{else}}{{ end }} {{ .state }} {{ .version }} {{ .since }} diff --git a/daprdocs/layouts/partials/components/configuration-stores.html b/daprdocs/layouts/partials/components/configuration-stores.html index d9d35b134..19a123a73 100644 --- a/daprdocs/layouts/partials/components/configuration-stores.html +++ b/daprdocs/layouts/partials/components/configuration-stores.html @@ -13,8 +13,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/description.html b/daprdocs/layouts/partials/components/description.html index 7cc5a1bf6..770fa975b 100644 --- a/daprdocs/layouts/partials/components/description.html +++ b/daprdocs/layouts/partials/components/description.html @@ -1,7 +1,6 @@

    Table captions:

    -

    Status: Component - certification status

    +

    Status: component certification status

    -

    Since: defines from which Dapr Runtime version, the component is in the current status

    +

    Since: the version of the Dapr Runtime in which the component first moved to the current status

    -

    Component version: defines the version of the component

    +

    Component version: the version of the component

    diff --git a/daprdocs/layouts/partials/components/locks.html b/daprdocs/layouts/partials/components/locks.html index 4039e5eb0..109ba9ec8 100644 --- a/daprdocs/layouts/partials/components/locks.html +++ b/daprdocs/layouts/partials/components/locks.html @@ -13,8 +13,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/middleware.html b/daprdocs/layouts/partials/components/middleware.html index c98f9e4c2..32a1486f2 100644 --- a/daprdocs/layouts/partials/components/middleware.html +++ b/daprdocs/layouts/partials/components/middleware.html @@ -13,8 +13,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .description | markdownify}} {{ .state }} diff --git a/daprdocs/layouts/partials/components/name-resolution.html b/daprdocs/layouts/partials/components/name-resolution.html index 816873583..a16dd0bc5 100644 --- a/daprdocs/layouts/partials/components/name-resolution.html +++ b/daprdocs/layouts/partials/components/name-resolution.html @@ -15,8 +15,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/pubsub.html b/daprdocs/layouts/partials/components/pubsub.html index 244a6f623..01c80e7ce 100644 --- a/daprdocs/layouts/partials/components/pubsub.html +++ b/daprdocs/layouts/partials/components/pubsub.html @@ -16,8 +16,7 @@ {{ range sort $components "component" }} - {{ .component - }} + {{ .component }} {{ .state }} {{ .version }} diff --git a/daprdocs/layouts/partials/components/secret-stores.html b/daprdocs/layouts/partials/components/secret-stores.html index 05d105bfb..2412f8b1d 100644 --- a/daprdocs/layouts/partials/components/secret-stores.html +++ b/daprdocs/layouts/partials/components/secret-stores.html @@ -27,10 +27,16 @@ {{ range sort $components "component" }} - {{ .component - }} + + {{ .component }} + + + {{ if .features.multipleKeyValuesPerSecret }} + + {{else}} + Multiple Key-Values Per Secret: Not supported + {{ end }} - {{ if .features.multipleKeyValuesPerSecret }}✅{{else}}{{ end }} {{ .state }} {{ .version }} {{ .since }} diff --git a/daprdocs/layouts/partials/components/state-stores.html b/daprdocs/layouts/partials/components/state-stores.html index d42c41047..10a45fdc9 100644 --- a/daprdocs/layouts/partials/components/state-stores.html +++ b/daprdocs/layouts/partials/components/state-stores.html @@ -23,16 +23,51 @@ {{ range sort $components "component" }} - {{ .component - }} + + {{ .component }} + + + {{ if .features.crud }} + + {{else}} + CRUD: Not supported + {{ end }} + + + {{ if .features.transactions }} + + {{else}} + Transactions: Not supported + {{ end }} + + + {{ if .features.etag }} + + {{else}} + ETag: Not supported + {{ end }} + + + {{ if .features.ttl }} + + {{else}} + TTL: Not supported + {{ end }} + + + {{ if (and .features.transactions .features.etag) }} + + {{else}} + Actors: Not supported + {{ end }} + + + {{ if .features.query }} + + {{else}} + Query: Not supported + {{ end }} - {{ if .features.crud }}✅{{else}}{{ end }} - {{ if .features.transactions }}✅{{else}}{{ end }} - {{ if .features.etag }}✅{{else}}{{ end }} - {{ if .features.ttl }}✅{{else}}{{ end }} - {{ if (and .features.transactions .features.etag) }}✅{{else}}{{ end }} - {{ if .features.query }}✅{{else}}{{ end }} {{ .state }} {{ .version }} {{ .since }} From a1d4b22c0010900a268d2875c50d54b87b05ac2e Mon Sep 17 00:00:00 2001 From: Syuparn Date: Wed, 4 Jan 2023 14:30:07 +0900 Subject: [PATCH 086/116] fix links in wasm middleware docs (#3029) Signed-off-by: syuparn Signed-off-by: syuparn Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../supported-middleware/middleware-wasm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md b/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md index 343b25a12..e95c6671a 100644 --- a/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md +++ b/daprdocs/content/en/reference/components-reference/supported-middleware/middleware-wasm.md @@ -14,10 +14,10 @@ extension. The Wasm [HTTP middleware]({{< ref middleware.md >}}) allows you to rewrite a request URI with custom logic compiled to a Wasm binary. In other words, you can extend Dapr using external files that are not pre-compiled into the `daprd` -binary. Dapr embeds [wazero][https://wazero.io] to accomplish this without CGO. +binary. Dapr embeds [wazero](https://wazero.io) to accomplish this without CGO. Wasm modules are loaded from a filesystem path. On Kubernetes, see [mounting -volumes to the Dapr sidecar]({{> kubernetes-volume-mounts.md >}}) to configure +volumes to the Dapr sidecar]({{< ref kubernetes-volume-mounts.md >}}) to configure a filesystem mount that can contain Wasm modules. ## Component format From d19b1d8eaa093d21ed8618e71cfaf2d9fe320ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pepe=20Garc=C3=ADa?= Date: Wed, 4 Jan 2023 09:29:26 +0000 Subject: [PATCH 087/116] fix typos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pepe García --- .../building-blocks/observability/tracing-overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md b/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md index eb758b335..38ac85d25 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/observability/tracing-overview.md @@ -18,7 +18,7 @@ There are two scenarios for how tracing is used: 1. Dapr generates the trace context and you propagate the trace context to another service. 2. You generate the trace context and Dapr propagates the trace context to a service. -### Propogating sequential service calls +### Propagating sequential service calls Dapr takes care of creating the trace headers. However, when there are more than two services, you're responsible for propagating the trace headers between them. Let's go through the scenarios with examples: @@ -45,7 +45,7 @@ There are no helper methods exposed in Dapr SDKs to propagate and retrieve trace 4. Pub/sub messages Dapr generates the trace headers in the published message topic. These trace headers are propagated to any services listening on that topic. -### Propogating multiple different service calls +### Propagating multiple different service calls In the following scenarios, Dapr does some of the work for you and you need to either create or propagate trace headers. @@ -115,4 +115,4 @@ In the gRPC API calls, trace context is passed through `grpc-trace-bin` header. - [Observability concepts]({{< ref observability-concept.md >}}) - [W3C Trace Context for distributed tracing]({{< ref w3c-tracing-overview >}}) - [W3C Trace Context specification](https://www.w3.org/TR/trace-context/) -- [Observability quickstart](https://github.com/dapr/quickstarts/tree/master/tutorials/observability) \ No newline at end of file +- [Observability quickstart](https://github.com/dapr/quickstarts/tree/master/tutorials/observability) From 36743211b034b7eb2f352235b09f217025f39e6f Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Wed, 4 Jan 2023 17:10:43 -0600 Subject: [PATCH 088/116] Configuration API quickstart docs (#3009) * new configuration api quickstart Signed-off-by: Hannah Hunter * add new file Signed-off-by: Hannah Hunter * updates per sarthak Signed-off-by: Hannah Hunter * add diagram Signed-off-by: Hannah Hunter * updates per Mark Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../configuration-api-overview.md | 33 +- .../howto-manage-configuration.md | 9 +- .../en/getting-started/quickstarts/_index.md | 1 + .../quickstarts/configuration-quickstart.md | 639 ++++++++++++++++++ .../configuration-quickstart-flow.png | Bin 0 -> 30297 bytes 5 files changed, 673 insertions(+), 9 deletions(-) create mode 100644 daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md create mode 100644 daprdocs/static/images/configuration-quickstart/configuration-quickstart-flow.png diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md index 5f2ac9096..2e95f6b49 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/configuration-api-overview.md @@ -6,17 +6,40 @@ weight: 1000 description: "Overview of the configuration API building block" --- -## Introduction +Consuming application configuration is a common task when writing applications. Frequently, configuration stores are used to manage this configuration data. A configuration item is often dynamic in nature and tightly coupled to the needs of the application that consumes it. -Consuming application configuration is a common task when writing applications and frequently configuration stores are used to manage this configuration data. A configuration item is often dynamic in nature and is tightly coupled to the needs of the application that consumes it. For example, common uses for application configuration include names of secrets, different identifiers, partition or consumer IDs, names of databases to connect to etc. These configuration items are typically stored as key/value items in a state store or database. Application configuration can be changed by either developers or operators at runtime and the developer needs to be notified of these changes in order to take the required action and load the new configuration. Also configuration data is typically read only from the application API perspective, with updates to the configuration store made through operator tooling. Dapr's configuration API allows developers to consume configuration items that are returned as read only key/value pairs and subscribe to changes whenever a configuration item changes. +For example, application configuration can include: +- Names of secrets +- Different identifiers +- Partition or consumer IDs +- Names of databases to connect to, etc + +Usually, configuration items are stored as key/value items in a state store or database. Developers or operators can change application configuration at runtime in the configuration store. Once changes are made, a service is notified to load the new configuration. + +Configuration data is read-only from the application API perspective, with updates to the configuration store made through operator tooling. With Dapr's configuration API, you can: +- Consume configuration items that are returned as read-only key/value pairs +- Subscribe to changes whenever a configuration item changes -It is worth noting that this configuration API should not be confused with the [Dapr sidecar and control plane configuration]({{}}) which is used to set policies and settings on instances of Dapr sidecars or the installed Dapr control plane. +{{% alert title="Note" color="primary" %}} + The Configuration API should not be confused with the [Dapr sidecar and control plane configuration]({{< ref "configuration-overview" >}}), which is used to set policies and settings on Dapr sidecar instances or the installed Dapr control plane. +{{% /alert %}} -*This API is currently in `Alpha` state* +## Try out configuration + +### Quickstart + +Want to put the Dapr configuration API to the test? Walk through the following quickstart to see the configuration API in action: + +| Quickstart | Description | +| ---------- | ----------- | +| [Configuration quickstart]({{< ref configuration-quickstart.md >}}) | Get configuration items or subscribe to configuration changes using the configuration API. | + +### Start using the configuration API directly in your app + +Want to skip the quickstarts? Not a problem. You can try out the configuration building block directly in your application to read and manage configuration data. After [Dapr is installed]({{< ref "getting-started/_index.md" >}}), you can begin using the configuration API starting with [the configuration how-to guide]({{< ref howto-manage-configuration.md >}}). -## Features ## Next steps Follow these guides on: diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md index 4de325ba6..b05722312 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md @@ -8,12 +8,13 @@ description: "Learn how to get application configuration and subscribe for chang This example uses the Redis configuration store component to demonstrate how to retrieve a configuration item. +Diagram showing get configuration of example service + {{% alert title="Note" color="primary" %}} -This API is currently in `Alpha` state and only available on gRPC. An HTTP1.1 supported version with this URL syntax `/v1.0/configuration` will be available before the API is certified into `Stable` state. + If you haven't already, [try out the configuration quickstart]({{< ref configuration-quickstart.md >}}) for a quick walk-through on how to use the configuration API. {{% /alert %}} -Diagram showing get configuration of example service ## Create a configuration item in store @@ -68,7 +69,7 @@ spec: ## Retrieve Configuration Items ### Get configuration items using Dapr SDKs -{{< tabs Dotnet Java Python>}} +{{< tabs ".NET" Java Python>}} {{% codetab %}} @@ -304,7 +305,7 @@ asyncio.run(executeConfiguration()) ``` ```bash -dapr run --app-id orderprocessing --components-path components/ -- python3 OrderProcessingService.py +dapr run --app-id orderprocessing --resources-path components/ -- python3 OrderProcessingService.py ``` {{% /codetab %}} diff --git a/daprdocs/content/en/getting-started/quickstarts/_index.md b/daprdocs/content/en/getting-started/quickstarts/_index.md index 67380fa87..727b9a17b 100644 --- a/daprdocs/content/en/getting-started/quickstarts/_index.md +++ b/daprdocs/content/en/getting-started/quickstarts/_index.md @@ -27,4 +27,5 @@ Hit the ground running with our Dapr quickstarts, complete with code samples aim | [State Management]({{< ref statemanagement-quickstart.md >}}) | Store a service's data as key/value pairs in supported state stores. | | [Bindings]({{< ref bindings-quickstart.md >}}) | Work with external systems using input bindings to respond to events and output bindings to call operations. | | [Secrets Management]({{< ref secrets-quickstart.md >}}) | Securely fetch secrets. | +| [Configuration]({{< ref configuration-quickstart.md >}}) | Get configuration items and subscribe for configuration updates. | | [Resiliency]({{< ref resiliency >}}) | Define and apply fault-tolerance policies to your Dapr API requests. | diff --git a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md new file mode 100644 index 000000000..bba89def1 --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md @@ -0,0 +1,639 @@ +--- +type: docs +title: "Quickstart: Configuration" +linkTitle: Configuration +weight: 76 +description: Get started with Dapr's Configuration building block +--- + +Let's take a look at Dapr's [Configuration building block]({{< ref configuration-api-overview.md >}}). A configuration item is often dynamic in nature and tightly coupled to the needs of the application that consumes it. Configuration items are key/value pairs containing configuration data, such as: +- App ids +- Partition keys +- Database names, etc + +In this quickstart, you'll run an `order-processor` microservice that utilizes the Configuration API. The service: +1. Gets configuration items from the configuration store. +1. Subscribes for configuration updates. + +Diagram that demonstrates the flow of the configuration API quickstart with key/value pairs used. + +Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. + +{{< tabs "Python" "JavaScript" ".NET" "Java" "Go" >}} + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/python/sdk/order-processor +``` + +Install the dependencies: + +```bash +pip3 install -r requirements.txt +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +``` + +> **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. + +The expected output: + +``` +== APP == Configuration for orderId1 : value: "101" +== APP == +== APP == Configuration for orderId2 : value: "102" +== APP == +== APP == App unsubscribed from config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +``` + +> **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1 : value: "103" +== APP == +== APP == Configuration for orderId2 : value: "104" +== APP == +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```python +# Get config items from the config store +for config_item in CONFIGURATION_ITEMS: + config = client.get_configuration(store_name=DAPR_CONFIGURATION_STORE, keys=[config_item], config_metadata={}) + print(f"Configuration for {config_item} : {config.items[config_item]}", flush=True) +``` + +Subscribe to configuration updates: + +```python +# Subscribe for configuration changes +configuration = await client.subscribe_configuration(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS) +``` + +Unsubscribe from configuration updates and exit the application: + +```python +# Unsubscribe from configuration updates +unsubscribed = True +for config_item in CONFIGURATION_ITEMS: + unsub_item = client.unsubscribe_configuration(DAPR_CONFIGURATION_STORE, config_item) + #... +if unsubscribed == True: + print("App unsubscribed from config changes", flush=True) +``` + + +{{% /codetab %}} + + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/javascript/sdk/order-processor +``` + +Install the dependencies: + +```bash +npm install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {"key":"orderId1","value":"101","version":"","metadata":{}} +== APP == Configuration for orderId2: {"key":"orderId2","value":"102","version":"","metadata":{}} +== APP == App unsubscribed to config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {"key":"orderId1","value":"103","version":"","metadata":{}} +== APP == Configuration for orderId2: {"key":"orderId2","value":"104","version":"","metadata":{}} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```javascript +// Get config items from the config store +//... + const config = await client.configuration.get(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS); + Object.keys(config.items).forEach((key) => { + console.log("Configuration for " + key + ":", JSON.stringify(config.items[key])); + }); +``` + +Subscribe to configuration updates: + +```javascript +// Subscribe to config updates +try { + const stream = await client.configuration.subscribeWithKeys( + DAPR_CONFIGURATION_STORE, + CONFIGURATION_ITEMS, + (config) => { + console.log("Configuration update", JSON.stringify(config.items)); + } + ); +``` + +Unsubscribe from configuration updates and exit the application: + +```javascript +// Unsubscribe to config updates and exit app after 20 seconds +setTimeout(() => { + stream.stop(); + console.log("App unsubscribed to config changes"); + process.exit(0); +}, +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [.NET SDK or .NET 6 SDK installed](https://dotnet.microsoft.com/download). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/csharp/sdk/order-processor +``` + +Recall NuGet packages: + +```bash +dotnet restore +dotnet build +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {"Value":"101","Version":"","Metadata":{}} +== APP == Configuration for orderId2: {"Value":"102","Version":"","Metadata":{}} +== APP == App unsubscribed from config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {"Value":"103","Version":"","Metadata":{}} +== APP == Configuration for orderId2: {"Value":"104","Version":"","Metadata":{}} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```csharp +// Get config from configuration store +GetConfigurationResponse config = await client.GetConfiguration(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS); +foreach (var item in config.Items) +{ + var cfg = System.Text.Json.JsonSerializer.Serialize(item.Value); + Console.WriteLine("Configuration for " + item.Key + ": " + cfg); +} +``` + +Subscribe to configuration updates: + +```csharp +// Subscribe to config updates +SubscribeConfigurationResponse subscribe = await client.SubscribeConfiguration(DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS); +``` + +Unsubscribe from configuration updates and exit the application: + +```csharp +// Unsubscribe to config updates and exit the app +try +{ + client.UnsubscribeConfiguration(DAPR_CONFIGURATION_STORE, subscriptionId); + Console.WriteLine("App unsubscribed from config changes"); + Environment.Exit(0); +} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- Java JDK 11 (or greater): + - [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11), or + - OpenJDK +- [Apache Maven](https://maven.apache.org/install.html), version 3.x. + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/java/sdk/order-processor +``` + +Install the dependencies: + +```bash +mvn clean install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {'value':'101'} +== APP == Configuration for orderId2: {'value':'102'} +== APP == App unsubscribed to config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {'value':'103'} +== APP == Configuration for orderId2: {'value':'104'} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```java +// Get config items from the config store +try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) { + for (String configurationItem : CONFIGURATION_ITEMS) { + ConfigurationItem item = client.getConfiguration(DAPR_CONFIGURATON_STORE, configurationItem).block(); + System.out.println("Configuration for " + configurationItem + ": {'value':'" + item.getValue() + "'}"); + } +``` + +Subscribe to configuration updates: + +```java +// Subscribe for config changes +Flux subscription = client.subscribeConfiguration(DAPR_CONFIGURATON_STORE, + CONFIGURATION_ITEMS.toArray(String[]::new)); +``` + +Unsubscribe from configuration updates and exit the application: + +```java +// Unsubscribe from config changes +UnsubscribeConfigurationResponse unsubscribe = client + .unsubscribeConfiguration(subscriptionId, DAPR_CONFIGURATON_STORE).block(); +if (unsubscribe.getIsUnsubscribed()) { + System.out.println("App unsubscribed to config changes"); +} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest version of Go](https://go.dev/dl/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/configuration). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +Once cloned, open a new terminal and run the following command to set values for configuration items `orderId1` and `orderId2`. + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" +``` + +### Step 2: Run the `order-processor` service + +From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. + +```bash +cd ./configuration/go/sdk/order-processor +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +``` + +The expected output: + +``` +== APP == Configuration for orderId1: {"Value":"101","Version":"","Metadata":null} +== APP == Configuration for orderId2: {"Value":"102","Version":"","Metadata":null} +== APP == dapr configuration subscribe finished. +== APP == App unsubscribed to config changes +``` + +### (Optional) Step 3: Update configuration item values + +Once the app has unsubscribed, try updating the configuration item values. Change the `orderId1` and `orderId2` values using the following command: + +```bash +docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" +``` + +Run the `order-processor` service again: + +```bash +dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +``` + +The app will return the updated configuration values: + +``` +== APP == Configuration for orderId1: {"Value":"103","Version":"","Metadata":null} +== APP == Configuration for orderId2: {"Value":"104","Version":"","Metadata":null} +``` + +### The `order-processor` service + +The `order-processor` service includes code for: +- Getting the configuration items from the config store +- Subscribing to configuration updates (which you made in the CLI earlier) +- Unsubscribing from configuration updates and exiting the app after 20 seconds of inactivity. + +Get configuration items: + +```go +// Get config items from config store +for _, item := range CONFIGURATION_ITEMS { + config, err := client.GetConfigurationItem(ctx, DAPR_CONFIGURATION_STORE, item) + //... + c, _ := json.Marshal(config) + fmt.Println("Configuration for " + item + ": " + string(c)) +} +``` + +Subscribe to configuration updates: + +```go +// Subscribe for config changes +err = client.SubscribeConfigurationItems(ctx, DAPR_CONFIGURATION_STORE, CONFIGURATION_ITEMS, func(id string, config map[string]*dapr.ConfigurationItem) { + // First invocation when app subscribes to config changes only returns subscription id + if len(config) == 0 { + fmt.Println("App subscribed to config changes with subscription id: " + id) + subscriptionId = id + return + } +}) +``` + +Unsubscribe from configuration updates and exit the application: + +```go +// Unsubscribe to config updates and exit app after 20 seconds +select { +case <-ctx.Done(): + err = client.UnsubscribeConfigurationItems(context.Background(), DAPR_CONFIGURATION_STORE, subscriptionId) + //... + { + fmt.Println("App unsubscribed to config changes") + } +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Tell us what you think! + +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps + +- Use Dapr Configuration with HTTP instead of an SDK. + - [Python](https://github.com/dapr/quickstarts/tree/master/configuration/python/http) + - [JavaScript](https://github.com/dapr/quickstarts/tree/master/configuration/javascript/http) + - [.NET](https://github.com/dapr/quickstarts/tree/master/configuration/csharp/http) + - [Java](https://github.com/dapr/quickstarts/tree/master/configuration/java/http) + - [Go](https://github.com/dapr/quickstarts/tree/master/configuration/go/http) +- Learn more about [Configuration building block]({{< ref configuration-api-overview >}}) + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} \ No newline at end of file diff --git a/daprdocs/static/images/configuration-quickstart/configuration-quickstart-flow.png b/daprdocs/static/images/configuration-quickstart/configuration-quickstart-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..29dc6f44c9e731845cb785981822f9bdd7265870 GIT binary patch literal 30297 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 BTF?Lh literal 0 HcmV?d00001 From 90cf4cf865c61562f042fcce2026f2661dfc2c5f Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 5 Jan 2023 16:47:07 -0600 Subject: [PATCH 089/116] toc restructure Signed-off-by: Hannah Hunter --- .../building-blocks/_index.md | 6 +- .../debugging/_index.md | 2 +- .../develop-components/_index.md | 7 + .../develop-components/develop-middleware.md | 47 ++++++ .../pluggable-components/_index.md | 8 +- .../pluggable-components/develop-pluggable.md | 112 +++++++++++++++ .../pluggable-components-overview.md | 69 +++++++++ .../integrations/_index.md | 2 +- .../local-development/_index.md | 7 + .../{ => local-development}/ides/_index.md | 2 +- .../{ => local-development}/ides/intellij.md | 0 .../ides/vscode/_index.md | 0 .../ides/vscode/vscode-dapr-extension.md | 0 .../vscode-how-to-debug-multiple-dapr-apps.md | 0 .../vscode/vscode-remote-dev-containers.md | 0 .../operations/components/component-scopes.md | 2 +- .../components/component-secrets.md | 2 +- .../components/component-updates.md | 2 +- .../components}/middleware.md | 41 +----- .../pluggable-components-registration.md | 6 +- .../pluggable-components-overview.md | 134 ------------------ .../operations/components/setup-bindings.md | 2 +- .../components/setup-pubsub/_index.md | 2 +- .../setup-pubsub/pubsub-namespaces.md | 2 +- .../components/setup-secret-store.md | 2 +- .../components/setup-state-store.md | 2 +- 26 files changed, 269 insertions(+), 190 deletions(-) create mode 100644 daprdocs/content/en/developing-applications/develop-components/_index.md create mode 100644 daprdocs/content/en/developing-applications/develop-components/develop-middleware.md rename daprdocs/content/en/{operations/components => developing-applications/develop-components}/pluggable-components/_index.md (67%) create mode 100644 daprdocs/content/en/developing-applications/develop-components/pluggable-components/develop-pluggable.md create mode 100644 daprdocs/content/en/developing-applications/develop-components/pluggable-components/pluggable-components-overview.md create mode 100644 daprdocs/content/en/developing-applications/local-development/_index.md rename daprdocs/content/en/developing-applications/{ => local-development}/ides/_index.md (90%) rename daprdocs/content/en/developing-applications/{ => local-development}/ides/intellij.md (100%) rename daprdocs/content/en/developing-applications/{ => local-development}/ides/vscode/_index.md (100%) rename daprdocs/content/en/developing-applications/{ => local-development}/ides/vscode/vscode-dapr-extension.md (100%) rename daprdocs/content/en/developing-applications/{ => local-development}/ides/vscode/vscode-how-to-debug-multiple-dapr-apps.md (100%) rename daprdocs/content/en/developing-applications/{ => local-development}/ides/vscode/vscode-remote-dev-containers.md (100%) rename daprdocs/content/en/{developing-applications => operations/components}/middleware.md (75%) rename daprdocs/content/en/operations/components/{pluggable-components => }/pluggable-components-registration.md (96%) delete mode 100644 daprdocs/content/en/operations/components/pluggable-components/pluggable-components-overview.md diff --git a/daprdocs/content/en/developing-applications/building-blocks/_index.md b/daprdocs/content/en/developing-applications/building-blocks/_index.md index d0df0b4aa..6546d234e 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/_index.md +++ b/daprdocs/content/en/developing-applications/building-blocks/_index.md @@ -1,11 +1,11 @@ --- type: docs -title: "Building blocks" -linkTitle: "Building blocks" +title: "API building blocks" +linkTitle: "API building blocks" weight: 10 description: "Dapr capabilities that solve common development challenges for distributed applications" --- -Get a high-level [overview of Dapr building blocks]({{< ref building-blocks-concept >}}) in the **Concepts** section. +Get a high-level [overview of Dapr API building blocks]({{< ref building-blocks-concept >}}) in the **Concepts** section. Diagram showing the different Dapr API building blocks \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/debugging/_index.md b/daprdocs/content/en/developing-applications/debugging/_index.md index d6d77e77d..bb9d76df1 100644 --- a/daprdocs/content/en/developing-applications/debugging/_index.md +++ b/daprdocs/content/en/developing-applications/debugging/_index.md @@ -2,6 +2,6 @@ type: docs title: "Debugging Dapr applications and the Dapr control plane" linkTitle: "Debugging" -weight: 60 +weight: 50 description: "Guides on how to debug Dapr applications and the Dapr control plane" --- \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/develop-components/_index.md b/daprdocs/content/en/developing-applications/develop-components/_index.md new file mode 100644 index 000000000..cb9f7e8a8 --- /dev/null +++ b/daprdocs/content/en/developing-applications/develop-components/_index.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "Components" +linkTitle: "Components" +weight: 30 +description: "Learn more about developing Dapr's pluggable and middleware components" +--- diff --git a/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md b/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md new file mode 100644 index 000000000..31874b473 --- /dev/null +++ b/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md @@ -0,0 +1,47 @@ +--- +type: docs +title: "How to: Author middleware components" +linkTitle: "Middleware components" +weight: 200 +description: "Learn how to develop middleware components" +aliases: + - /developing-applications/middleware/middleware-overview/ + - /concepts/middleware-concept/ +--- + +Dapr allows custom processing pipelines to be defined by chaining a series of middleware components. There are two places that you can use a middleware pipeline; + +1) Building block APIs - HTTP middleware components are executed when invoking any Dapr HTTP APIs. +2) Service-to-Service invocation - HTTP middleware components are applied to service-to-service invocation calls. + +## Writing a custom middleware + +Dapr uses [FastHTTP](https://github.com/valyala/fasthttp) to implement its HTTP server. Hence, your HTTP middleware needs to be written as a FastHTTP handler. Your middleware needs to implement a middleware interface, which defines a **GetHandler** method that returns **fasthttp.RequestHandler** and **error**: + +```go +type Middleware interface { + GetHandler(metadata Metadata) (func(h fasthttp.RequestHandler) fasthttp.RequestHandler, error) +} +``` + +Your handler implementation can include any inbound logic, outbound logic, or both: + +```go + +func (m *customMiddleware) GetHandler(metadata Metadata) (func(fasthttp.RequestHandler) fasthttp.RequestHandler, error) { + var err error + return func(h fasthttp.RequestHandler) fasthttp.RequestHandler { + return func(ctx *fasthttp.RequestCtx) { + // inbound logic + h(ctx) // call the downstream handler + // outbound logic + } + }, err +} +``` + +## Related links + +- [Component schema]({{< ref component-schema.md >}}) +- [Configuration overview]({{< ref configuration-overview.md >}}) +- [API middleware sample](https://github.com/dapr/samples/tree/master/middleware-oauth-google) diff --git a/daprdocs/content/en/operations/components/pluggable-components/_index.md b/daprdocs/content/en/developing-applications/develop-components/pluggable-components/_index.md similarity index 67% rename from daprdocs/content/en/operations/components/pluggable-components/_index.md rename to daprdocs/content/en/developing-applications/develop-components/pluggable-components/_index.md index d6a82273e..82ed69cbb 100644 --- a/daprdocs/content/en/operations/components/pluggable-components/_index.md +++ b/daprdocs/content/en/developing-applications/develop-components/pluggable-components/_index.md @@ -1,9 +1,9 @@ --- type: docs -title: "Pluggable Components" -linkTitle: "Pluggable Components" +title: "Pluggable components" +linkTitle: "Pluggable components" description: "Guidance on how to work with pluggable components" -weight: 4000 +weight: 100 aliases: - "/operations/components/pluggable-components/pluggable-components-overview/" ---- +--- \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/develop-components/pluggable-components/develop-pluggable.md b/daprdocs/content/en/developing-applications/develop-components/pluggable-components/develop-pluggable.md new file mode 100644 index 000000000..e3f92b1e5 --- /dev/null +++ b/daprdocs/content/en/developing-applications/develop-components/pluggable-components/develop-pluggable.md @@ -0,0 +1,112 @@ +--- +type: docs +title: "How to: Implement pluggable components" +linkTitle: "Pluggable components" +weight: 1100 +description: "Learn how to author and implement pluggable components" +--- + +In this guide, you'll learn why and how to implement a [pluggable component]({{< ref pluggable-components-overview >}}). To learn how to configure and register a pluggable component, refer to [How to: Register a pluggable component]({{< ref pluggable-components-registration.md >}}) + +## Implement a pluggable component + +In order to implement a pluggable component, you need to implement a gRPC service in the component. Implementing the gRPC service requires three steps: + +### Find the proto definition file + +Proto definitions are provided for each supported service interface (state store, pub/sub, bindings). + +Currently, the following component APIs are supported: + +- State stores +- Pub/sub +- Bindings + +| Component | Type | gRPC definition | Built-in Reference Implementation | Docs | +| :---------: | :--------: | :--------------: | :----------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| State Store | `state` | [state.proto] | [Redis](https://github.com/dapr/components-contrib/tree/master/state/redis) | [concept]({{< ref "state-management-overview" >}}), [howto]({{< ref "howto-get-save-state" >}}), [api spec]({{< ref "state_api" >}}) | +| Pub/sub | `pubsub` | [pubsub.proto] | [Redis](https://github.com/dapr/components-contrib/tree/master/pubsub/redis) | [concept]({{< ref "pubsub-overview" >}}), [howto]({{< ref "howto-publish-subscribe" >}}), [api spec]({{< ref "pubsub_api" >}}) | +| Bindings | `bindings` | [bindings.proto] | [Kafka](https://github.com/dapr/components-contrib/tree/master/bindings/kafka) | [concept]({{< ref "bindings-overview" >}}), [input howto]({{< ref "howto-triggers" >}}), [output howto]({{< ref "howto-bindings" >}}), [api spec]({{< ref "bindings_api" >}}) | + +Below is a snippet of the gRPC service definition for pluggable component state stores ([state.proto]): + +```protobuf +// StateStore service provides a gRPC interface for state store components. +service StateStore { + // Initializes the state store component with the given metadata. + rpc Init(InitRequest) returns (InitResponse) {} + // Returns a list of implemented state store features. + rpc Features(FeaturesRequest) returns (FeaturesResponse) {} + // Ping the state store. Used for liveness purposes. + rpc Ping(PingRequest) returns (PingResponse) {} + + // Deletes the specified key from the state store. + rpc Delete(DeleteRequest) returns (DeleteResponse) {} + // Get data from the given key. + rpc Get(GetRequest) returns (GetResponse) {} + // Sets the value of the specified key. + rpc Set(SetRequest) returns (SetResponse) {} + + + // Deletes many keys at once. + rpc BulkDelete(BulkDeleteRequest) returns (BulkDeleteResponse) {} + // Retrieves many keys at once. + rpc BulkGet(BulkGetRequest) returns (BulkGetResponse) {} + // Set the value of many keys at once. + rpc BulkSet(BulkSetRequest) returns (BulkSetResponse) {} +} +``` + +The interface for the `StateStore` service exposes a total of 9 methods: + +- 2 methods for initialization and components capability advertisement (Init and Features) +- 1 method for health-ness or liveness check (Ping) +- 3 methods for CRUD (Get, Set, Delete) +- 3 methods for bulk CRUD operations (BulkGet, BulkSet, BulkDelete) + +### Create service scaffolding + +Use [protocol buffers and gRPC tools](https://grpc.io) to create the necessary scaffolding for the service. Learn more about these tools via [the gRPC concepts documentation](https://grpc.io/docs/what-is-grpc/core-concepts/). + +These tools generate code targeting [any gRPC-supported language](https://grpc.io/docs/what-is-grpc/introduction/#protocol-buffer-versions). This code serves as the base for your server and it provides: +- Functionality to handle client calls +- Infrastructure to: + - Decode incoming requests + - Execute service methods + - Encode service responses + +The generated code is incomplete. It is missing: + +- A concrete implementation for the methods your target service defines (the core of your pluggable component). +- Code on how to handle Unix Socket Domain integration, which is Dapr specific. +- Code handling integration with your downstream services. + +Learn more about filling these gaps in the next step. + +### Define the service + +Provide a concrete implementation of the desired service. Each component has a gRPC service definition for its core functionality which is the same as the core component interface. For example: + +- **State stores** + + A pluggable state store **must** provide an implementation of the `StateStore` service interface. + + In addition to this core functionality, some components might also expose functionality under other **optional** services. For example, you can add extra functionality by defining the implementation for a `QueriableStateStore` service and a `TransactionalStateStore` service. + +- **Pub/sub** + + Pluggable pub/sub components only have a single core service interface defined ([pubsub.proto]). They have no optional service interfaces. + +- **Bindings** + + Pluggable input and output bindings have a single core service definition on [bindings.proto]. They have no optional service interfaces. + +After generating the above state store example's service scaffolding code using gRPC and protocol buffers tools, you can define concrete implementations for the 9 methods defined under `service StateStore`, along with code to initialize and communicate with your dependencies. + +This concrete implementation and auxiliary code are the **core** of your pluggable component. They define how your component behaves when handling gRPC requests from Dapr. + +## Next steps + +- Get started with developing .NET pluggable component using this [sample code](https://github.com/dapr/samples/tree/master/pluggable-components-dotnet-template) +- [Review the pluggable components overview]({{< ref pluggable-components-overview.md >}}) +- [Learn how to register your pluggable component]({{< ref pluggable-components-registration >}}) \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/develop-components/pluggable-components/pluggable-components-overview.md b/daprdocs/content/en/developing-applications/develop-components/pluggable-components/pluggable-components-overview.md new file mode 100644 index 000000000..96b1260cc --- /dev/null +++ b/daprdocs/content/en/developing-applications/develop-components/pluggable-components/pluggable-components-overview.md @@ -0,0 +1,69 @@ +--- +type: docs +title: "Pluggable components overview" +linkTitle: "Overview" +weight: 1000 +description: "Overview of pluggable component anatomy and supported component types" +--- + +Pluggable components are components that are not included as part the runtime, as opposed to the built-in components included with `dapr init`. You can configure Dapr to use pluggable components that leverage the building block APIs, but are registered differently from the [built-in Dapr components](https://github.com/dapr/components-contrib). + + + +## Pluggable components vs. built-in components + +Dapr provides two approaches for registering and creating components: + +- The built-in components included in the runtime and found in the [components-contrib repository ](https://github.com/dapr/components-contrib). +- Pluggable components which are deployed and registered independently. + +While both registration options leverage Dapr's building block APIs, each has a different implementation processes. + +| Component details | [Built-in Component](https://github.com/dapr/components-contrib/blob/master/docs/developing-component.md) | Pluggable Components | +| ---------------------------- | :--------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Language** | Can only be written in Go | [Can be written in any gRPC-supported language](https://grpc.io/docs/what-is-grpc/introduction/#protocol-buffer-versions) | +| **Where it runs** | As part of the Dapr runtime executable | As a distinct process or container in a pod. Runs separate from Dapr itself. | +| **Registers with Dapr** | Included into the Dapr codebase | Registers with Dapr via Unix Domain Sockets (using gRPC ) | +| **Distribution** | Distributed with Dapr release. New features added to component are aligned with Dapr releases | Distributed independently from Dapr itself. New features can be added when needed and follows its own release cycle. | +| **How component is activated** | Dapr starts runs the component (automatic) | User starts component (manual) | + +## Why create a pluggable component? + +Pluggable components prove useful in scenarios where: + +- You require a private component. +- You want to keep your component separate from the Dapr release process. +- You are not as familiar with Go, or implementing your component in Go is not ideal. + +## Features + +### Implement a pluggable component + +In order to implement a pluggable component, you need to implement a gRPC service in the component. Implementing the gRPC service requires three steps: + +1. Find the proto definition file +1. Create service scaffolding +1. Define the service + +Learn more about [how to develop and implement a pluggable component]({{< ref develop-pluggable.md >}}) + +### Leverage multiple building blocks for a component + +In addition to implementing multiple gRPC services from the same component (for example `StateStore`, `QueriableStateStore`, `TransactionalStateStore` etc.), a pluggable component can also expose implementations for other component interfaces. This means that a single pluggable component can simultaneously function as a state store, pub/sub, and input or output binding. In other words, you can implement multiple component interfaces into a pluggable component and expose them as gRPC services. + +While exposing multiple component interfaces on the same pluggable component lowers the operational burden of deploying multiple components, it makes implementing and debugging your component harder. If in doubt, stick to a "separation of concerns" by merging multiple components interfaces into the same pluggable component only when necessary. + +## Operationalize a pluggable component + +Built-in components and pluggable components share one thing in common: both need a [component specification]({{< ref "components-concept.md#component-specification" >}}). Built-in components do not require any extra steps to be used: Dapr is ready to use them automatically. + +In contrast, pluggable components require additional steps before they can communicate with Dapr. You need to first run the component and facilitate Dapr-component communication to kick off the registration process. + +## Next steps + +- [Implement a pluggable component]({{< ref develop-pluggable.md >}}) +- [Pluggable component registration]({{< ref "pluggable-components-registration" >}}) + +[state.proto]: https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/state.proto +[pubsub.proto]: https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/pubsub.proto +[bindings.proto]: https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/bindings.proto diff --git a/daprdocs/content/en/developing-applications/integrations/_index.md b/daprdocs/content/en/developing-applications/integrations/_index.md index 337db1c12..a884aeb5c 100644 --- a/daprdocs/content/en/developing-applications/integrations/_index.md +++ b/daprdocs/content/en/developing-applications/integrations/_index.md @@ -2,6 +2,6 @@ type: docs title: "Integrations" linkTitle: "Integrations" -weight: 10 +weight: 60 description: "Dapr integrations with other technologies" --- \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/local-development/_index.md b/daprdocs/content/en/developing-applications/local-development/_index.md new file mode 100644 index 000000000..b06587df5 --- /dev/null +++ b/daprdocs/content/en/developing-applications/local-development/_index.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "Local development" +linkTitle: "Local development" +weight: 40 +description: "Capabilities for developing Dapr applications locally" +--- \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/ides/_index.md b/daprdocs/content/en/developing-applications/local-development/ides/_index.md similarity index 90% rename from daprdocs/content/en/developing-applications/ides/_index.md rename to daprdocs/content/en/developing-applications/local-development/ides/_index.md index f74c56e54..7c9bc6dfa 100644 --- a/daprdocs/content/en/developing-applications/ides/_index.md +++ b/daprdocs/content/en/developing-applications/local-development/ides/_index.md @@ -2,6 +2,6 @@ type: docs title: "IDE support" linkTitle: "IDE support" -weight: 30 +weight: 200 description: "Support for common Integrated Development Environments (IDEs)" --- \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/ides/intellij.md b/daprdocs/content/en/developing-applications/local-development/ides/intellij.md similarity index 100% rename from daprdocs/content/en/developing-applications/ides/intellij.md rename to daprdocs/content/en/developing-applications/local-development/ides/intellij.md diff --git a/daprdocs/content/en/developing-applications/ides/vscode/_index.md b/daprdocs/content/en/developing-applications/local-development/ides/vscode/_index.md similarity index 100% rename from daprdocs/content/en/developing-applications/ides/vscode/_index.md rename to daprdocs/content/en/developing-applications/local-development/ides/vscode/_index.md diff --git a/daprdocs/content/en/developing-applications/ides/vscode/vscode-dapr-extension.md b/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-dapr-extension.md similarity index 100% rename from daprdocs/content/en/developing-applications/ides/vscode/vscode-dapr-extension.md rename to daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-dapr-extension.md diff --git a/daprdocs/content/en/developing-applications/ides/vscode/vscode-how-to-debug-multiple-dapr-apps.md b/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-how-to-debug-multiple-dapr-apps.md similarity index 100% rename from daprdocs/content/en/developing-applications/ides/vscode/vscode-how-to-debug-multiple-dapr-apps.md rename to daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-how-to-debug-multiple-dapr-apps.md diff --git a/daprdocs/content/en/developing-applications/ides/vscode/vscode-remote-dev-containers.md b/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-remote-dev-containers.md similarity index 100% rename from daprdocs/content/en/developing-applications/ides/vscode/vscode-remote-dev-containers.md rename to daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-remote-dev-containers.md diff --git a/daprdocs/content/en/operations/components/component-scopes.md b/daprdocs/content/en/operations/components/component-scopes.md index 4b878caed..b24a4273a 100644 --- a/daprdocs/content/en/operations/components/component-scopes.md +++ b/daprdocs/content/en/operations/components/component-scopes.md @@ -2,7 +2,7 @@ type: docs title: "How-To: Scope components to one or more applications" linkTitle: "Scope access to components" -weight: 300 +weight: 400 description: "Limit component access to particular Dapr instances" --- diff --git a/daprdocs/content/en/operations/components/component-secrets.md b/daprdocs/content/en/operations/components/component-secrets.md index d5e0ef056..b7e1f0a51 100644 --- a/daprdocs/content/en/operations/components/component-secrets.md +++ b/daprdocs/content/en/operations/components/component-secrets.md @@ -2,7 +2,7 @@ type: docs title: "How-To: Reference secrets in components" linkTitle: "Reference secrets in components" -weight: 400 +weight: 500 description: "How to securly reference secrets from a component definition" --- diff --git a/daprdocs/content/en/operations/components/component-updates.md b/daprdocs/content/en/operations/components/component-updates.md index 287638d1f..583eee28e 100644 --- a/daprdocs/content/en/operations/components/component-updates.md +++ b/daprdocs/content/en/operations/components/component-updates.md @@ -2,7 +2,7 @@ type: docs title: "Updating components" linkTitle: "Updating components" -weight: 250 +weight: 300 description: "Updating deployed components used by applications" --- diff --git a/daprdocs/content/en/developing-applications/middleware.md b/daprdocs/content/en/operations/components/middleware.md similarity index 75% rename from daprdocs/content/en/developing-applications/middleware.md rename to daprdocs/content/en/operations/components/middleware.md index 705f46fea..270ca5f19 100644 --- a/daprdocs/content/en/developing-applications/middleware.md +++ b/daprdocs/content/en/operations/components/middleware.md @@ -1,12 +1,9 @@ --- type: docs -title: "Middleware" -linkTitle: "Middleware" -weight: 50 +title: "Configure middleware components" +linkTitle: "Configure middleware" +weight: 2000 description: "Customize processing pipelines by adding middleware components" -aliases: - - /developing-applications/middleware/middleware-overview/ - - /concepts/middleware-concept/ --- Dapr allows custom processing pipelines to be defined by chaining a series of middleware components. There are two places that you can use a middleware pipeline; @@ -14,7 +11,7 @@ Dapr allows custom processing pipelines to be defined by chaining a series of mi 1) Building block APIs - HTTP middleware components are executed when invoking any Dapr HTTP APIs. 2) Service-to-Service invocation - HTTP middleware components are applied to service-to-service invocation calls. -## Configuring API middleware pipelines +## Configure API middleware pipelines When launched, a Dapr sidecar constructs a middleware processing pipeline for incoming HTTP calls. By default, the pipeline consists of [tracing middleware]({{< ref tracing-overview.md >}}) and CORS middleware. Additional middleware, configured by a Dapr [configuration]({{< ref configuration-concept.md >}}), can be added to the pipeline in the order they are defined. The pipeline applies to all Dapr API endpoints, including state, pub/sub, service invocation, bindings, secrets, configuration, distributed lock, and others. @@ -45,7 +42,7 @@ As with other components, middleware components can be found in the [supported M {{< button page="supported-middleware" text="See all middleware components">}} -## Configuring app middleware pipelines +## Configure app middleware pipelines You can also use any middleware components when making service-to-service invocation calls. For example, for token validation in a zero-trust environment, a request transformation for a specific app endpoint, or to apply OAuth policies. @@ -68,35 +65,9 @@ spec: type: middleware.http.uppercase ``` - -## Writing a custom middleware - -Dapr uses [FastHTTP](https://github.com/valyala/fasthttp) to implement its HTTP server. Hence, your HTTP middleware needs to be written as a FastHTTP handler. Your middleware needs to implement a middleware interface, which defines a **GetHandler** method that returns **fasthttp.RequestHandler** and **error**: - -```go -type Middleware interface { - GetHandler(metadata Metadata) (func(h fasthttp.RequestHandler) fasthttp.RequestHandler, error) -} -``` - -Your handler implementation can include any inbound logic, outbound logic, or both: - -```go - -func (m *customMiddleware) GetHandler(metadata Metadata) (func(fasthttp.RequestHandler) fasthttp.RequestHandler, error) { - var err error - return func(h fasthttp.RequestHandler) fasthttp.RequestHandler { - return func(ctx *fasthttp.RequestCtx) { - // inbound logic - h(ctx) // call the downstream handler - // outbound logic - } - }, err -} -``` - ## Related links +- [Learn how to author middleware components]({{< ref develop-middleware.md >}}) - [Component schema]({{< ref component-schema.md >}}) - [Configuration overview]({{< ref configuration-overview.md >}}) - [API middleware sample](https://github.com/dapr/samples/tree/master/middleware-oauth-google) diff --git a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md b/daprdocs/content/en/operations/components/pluggable-components-registration.md similarity index 96% rename from daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md rename to daprdocs/content/en/operations/components/pluggable-components-registration.md index 068780d3b..d7e91e347 100644 --- a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-registration.md +++ b/daprdocs/content/en/operations/components/pluggable-components-registration.md @@ -1,8 +1,8 @@ --- type: docs title: "How-To: Register a pluggable component" -linkTitle: "How To: Register a pluggable component" -weight: 4500 +linkTitle: "Register a pluggable component" +weight: 1000 description: "Learn how to register a pluggable component" --- @@ -10,7 +10,7 @@ description: "Learn how to register a pluggable component" ## Component registration process -Pluggable, [gRPC-based](https://grpc.io/) components are typically run as containers or processes that need to communicate with the Dapr runtime via [Unix Domain Sockets][uds]. They are automatically discovered and registered in the runtime with the following steps: +[Pluggable, gRPC-based components]({{< ref pluggable-components-overview >}}) are typically run as containers or processes that need to communicate with the Dapr runtime via [Unix Domain Sockets][uds]. They are automatically discovered and registered in the runtime with the following steps: 1. The component listens to an [Unix Domain Socket][uds] placed on the shared volume. 2. The Dapr runtime lists all [Unix Domain Socket][uds] in the shared volume. diff --git a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-overview.md b/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-overview.md deleted file mode 100644 index 247259d8a..000000000 --- a/daprdocs/content/en/operations/components/pluggable-components/pluggable-components-overview.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -type: docs -title: "Pluggable components overview" -linkTitle: "Overview" -weight: 4400 -description: "Overview of pluggable component anatomy and supported component types" ---- - -Pluggable components are components that are not included as part the runtime, as opposed to built-in ones that are included. You can configure Dapr to use pluggable components that leverage the building block APIs, but these are registered differently from the [built-in Dapr components](https://github.com/dapr/components-contrib). For example, you can configure a pluggable component for scenarios where you require a private component. - - - -## Pluggable components vs. built-in components - -Dapr provides two approaches for registering and creating components: - -- The built-in components included in the runtime and found in the [components-contrib repository ](https://github.com/dapr/components-contrib). -- Pluggable components which are deployed and registered independently. - -While both registration options leverage Dapr's building block APIs, each has a different implementation processes. - -| Component details | [Built-in Component](https://github.com/dapr/components-contrib/blob/master/docs/developing-component.md) | Pluggable Components | -| ---------------------------- | :--------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Language** | Can only be written in Go | [Can be written in any gRPC-supported language](https://grpc.io/docs/what-is-grpc/introduction/#protocol-buffer-versions) | -| **Where it runs** | As part of the Dapr runtime executable | As a distinct process or container in a pod. Runs separate from Dapr itself. | -| **Registers with Dapr** | Included into the Dapr codebase | Registers with Dapr via Unix Domain Sockets (using gRPC ) | -| **Distribution** | Distributed with Dapr release. New features added to component are aligned with Dapr releases | Distributed independently from Dapr itself. New features can be added when needed and follows its own release cycle. | -| **How component is activated** | Dapr starts runs the component (automatic) | User starts component (manual) | - -## When to create a pluggable component - -- This is a private component. -- You want to keep your component separate from the Dapr release process. -- You are not as familiar with Go, or implementing your component in Go is not ideal. - -## Implementing a pluggable component - -In order to implement a pluggable component you need to implement a gRPC service in the component. Implementing the gRPC service requires three steps: - -1. **Find the proto definition file.** Proto definitions are provided for each supported service interface (state store, pub/sub, bindings). - -Currently, the following component APIs are supported: - -- State stores -- Pub/sub -- Bindings - - -| Component | Type | gRPC definition | Built-in Reference Implementation | Docs | -| :---------: | :--------: | :--------------: | :----------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| State Store | `state` | [state.proto] | [Redis](https://github.com/dapr/components-contrib/tree/master/state/redis) | [concept]({{}}), [howto]({{}}), [api spec]({{}}) | -| Pub/sub | `pubsub` | [pubsub.proto] | [Redis](https://github.com/dapr/components-contrib/tree/master/pubsub/redis) | [concept]({{}}), [howto]({{}}), [api spec]({{}}) | -| Bindings | `bindings` | [bindings.proto] | [Kafka](https://github.com/dapr/components-contrib/tree/master/bindings/kafka) | [concept]({{}}), [input howto]({{}}), [output howto]({{}}), [api spec]({{}}) | - -Here's a snippet of the gRPC service definition for pluggable component state stores ([state.proto]). - -```protobuf -// StateStore service provides a gRPC interface for state store components. -service StateStore { - // Initializes the state store component with the given metadata. - rpc Init(InitRequest) returns (InitResponse) {} - // Returns a list of implemented state store features. - rpc Features(FeaturesRequest) returns (FeaturesResponse) {} - // Ping the state store. Used for liveness purposes. - rpc Ping(PingRequest) returns (PingResponse) {} - - // Deletes the specified key from the state store. - rpc Delete(DeleteRequest) returns (DeleteResponse) {} - // Get data from the given key. - rpc Get(GetRequest) returns (GetResponse) {} - // Sets the value of the specified key. - rpc Set(SetRequest) returns (SetResponse) {} - - - // Deletes many keys at once. - rpc BulkDelete(BulkDeleteRequest) returns (BulkDeleteResponse) {} - // Retrieves many keys at once. - rpc BulkGet(BulkGetRequest) returns (BulkGetResponse) {} - // Set the value of many keys at once. - rpc BulkSet(BulkSetRequest) returns (BulkSetResponse) {} -} -``` - -The interface for the `StateStore` service exposes 9 methods: - -- 2 methods for initialization and components capability advertisement (Init and Features) -- 1 method for health-ness or liveness check (Ping) -- 3 methods for CRUD (Get, Set, Delete) -- 3 methods for bulk CRUD operations (BulkGet, BulkSet, BulkDelete) - -2. **Create service scaffolding.** Use [protocol buffers and gRPC tools](https://grpc.io) to create the necessary scaffolding for the service. You may want to get acquainted with [the gRPC concepts documentation](https://grpc.io/docs/what-is-grpc/core-concepts/). - -The tools can generate code targeting [any gRPC-supported language](https://grpc.io/docs/what-is-grpc/introduction/#protocol-buffer-versions). This code serves as the base for your server and it provides functionality to handle client calls along with infrastructure to decode incoming requests, execute service methods, and encode service responses. - -The generated code is not complete. It is missing a concrete implementation for the methods your target service defines, i.e., the core of your pluggable component. This is further explored in the next topic. Additionally, you also have to provide code on how to handle Unix Socket Domain integration, which is Dapr specific, and code handling integration with your downstream services. - -3. **Define the service.** Provide a concrete implementation of the desired service. - -As a first step, [protocol buffers](https://developers.google.com/protocol-buffers/docs/overview) and [gRPC](https://grpc.io/docs/what-is-grpc/introduction/) tools are used to create the server code for this service. After that, the next step is to define concrete implementations for these 9 methods. - -Each component has a gRPC service definition for its core functionality which is the same as the core component interface. For example: - -- **State stores** -A pluggable state store **must** provide an implementation of the `StateStore` service interface. In addition to this core functionality, some components might also expose functionality under other **optional** services. For example, you can add extra functionality by defining the implementation for a `QueriableStateStore` service and a `TransactionalStateStore` service. - -- **Pub/sub** - Pluggable pub/sub components only have a single core service interface defined ([pubsub.proto]). They have no optional service interfaces. - -- **Bindings** - Pluggable input and output bindings have a single core service definition on [bindings.proto]. They have no optional service interfaces. - -Following the State Store example from step 1, after generating its service scaffolding code using gRPC and protocol buffers tools (step 2), -the next step is to define concrete implementations for the 9 methods defined under `service StateStore`, along with code to initialize and communicate with your dependencies. -This concrete implementation and auxiliary code are the core of your pluggable component: they define how your component behaves when handling gRPC requests from Dapr. - -### Leveraging multiple building blocks for a component - -In addition to implementing multiple gRPC services from the same component (for example `StateStore`, `QueriableStateStore`, `TransactionalStateStore` etc.), a pluggable component can also expose implementations for other component interfaces. This means that a single pluggable component can function as a state store, pub/sub, and input or output binding, all at the same time. In other words, you can implement multiple component interfaces into a pluggable component and exposes these as gRPC services. - -While exposing multiple component interfaces on the same pluggable component lowers the operational burden of deploying multiple components, it makes implementing and debugging your component harder. If in doubt, stick to a "separation of concerns" by merging multiple components interfaces into the same pluggable component only when necessary. - -## Operationalizing a pluggable component - -Built-in components and pluggable components share one thing in common: both need a [component specification]({{}}). Built-in components do not require any extra steps to be used: Dapr is ready to use them automatically. - -In contrast, pluggable components require additional steps before they can communicate with Dapr. You need to first run the component and facilitate Dapr-component communication to kick off the registration process. - -## Next steps - -- [Pluggable component registration]({{}}) - -[state.proto]: https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/state.proto -[pubsub.proto]: https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/pubsub.proto -[bindings.proto]: https://github.com/dapr/dapr/blob/master/dapr/proto/components/v1/bindings.proto diff --git a/daprdocs/content/en/operations/components/setup-bindings.md b/daprdocs/content/en/operations/components/setup-bindings.md index 7f1ba34eb..3af31760c 100644 --- a/daprdocs/content/en/operations/components/setup-bindings.md +++ b/daprdocs/content/en/operations/components/setup-bindings.md @@ -3,7 +3,7 @@ type: docs title: "Bindings components" linkTitle: "Bindings" description: "Guidance on setting up Dapr bindings components" -weight: 4000 +weight: 900 --- Dapr integrates with external resources to allow apps to both be triggered by external events and interact with the resources. Each binding component has a name and this name is used when interacting with the resource. diff --git a/daprdocs/content/en/operations/components/setup-pubsub/_index.md b/daprdocs/content/en/operations/components/setup-pubsub/_index.md index 1df2e94d8..aa3255aa5 100644 --- a/daprdocs/content/en/operations/components/setup-pubsub/_index.md +++ b/daprdocs/content/en/operations/components/setup-pubsub/_index.md @@ -3,7 +3,7 @@ type: docs title: "Pub/Sub brokers" linkTitle: "Pub/sub brokers" description: "Guidance on setting up different message brokers for Dapr Pub/Sub" -weight: 2000 +weight: 700 aliases: - "/operations/components/setup-pubsub/setup-pubsub-overview/" --- diff --git a/daprdocs/content/en/operations/components/setup-pubsub/pubsub-namespaces.md b/daprdocs/content/en/operations/components/setup-pubsub/pubsub-namespaces.md index d2ed4b4c4..81099ca5c 100644 --- a/daprdocs/content/en/operations/components/setup-pubsub/pubsub-namespaces.md +++ b/daprdocs/content/en/operations/components/setup-pubsub/pubsub-namespaces.md @@ -2,7 +2,7 @@ type: docs title: "HowTo: Configure Pub/Sub components with multiple namespaces" linkTitle: "Multiple namespaces" -weight: 20000 +weight: 10000 description: "Use Dapr Pub/Sub with multiple namespaces" --- diff --git a/daprdocs/content/en/operations/components/setup-secret-store.md b/daprdocs/content/en/operations/components/setup-secret-store.md index 307ba0e2d..bd4190c2a 100644 --- a/daprdocs/content/en/operations/components/setup-secret-store.md +++ b/daprdocs/content/en/operations/components/setup-secret-store.md @@ -3,7 +3,7 @@ type: docs title: "Secret store components" linkTitle: "Secret stores" description: "Guidance on setting up different secret store components" -weight: 3000 +weight: 800 aliases: - "/operations/components/setup-state-store/secret-stores-overview/" --- diff --git a/daprdocs/content/en/operations/components/setup-state-store.md b/daprdocs/content/en/operations/components/setup-state-store.md index db4e06b3b..6c1fc74f6 100644 --- a/daprdocs/content/en/operations/components/setup-state-store.md +++ b/daprdocs/content/en/operations/components/setup-state-store.md @@ -3,7 +3,7 @@ type: docs title: "State stores components" linkTitle: "State stores" description: "Guidance on setting up different state stores for Dapr state management" -weight: 1000 +weight: 600 aliases: - "/operations/components/setup-state-store/setup-state-store-overview/" --- From 74a8bd27de8d7a1e77e402778b30686d8510ec61 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 5 Jan 2023 16:51:33 -0600 Subject: [PATCH 090/116] tweak middleware doc Signed-off-by: Hannah Hunter --- .../develop-components/develop-middleware.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md b/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md index 31874b473..dab4df14d 100644 --- a/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md +++ b/daprdocs/content/en/developing-applications/develop-components/develop-middleware.md @@ -9,10 +9,7 @@ aliases: - /concepts/middleware-concept/ --- -Dapr allows custom processing pipelines to be defined by chaining a series of middleware components. There are two places that you can use a middleware pipeline; - -1) Building block APIs - HTTP middleware components are executed when invoking any Dapr HTTP APIs. -2) Service-to-Service invocation - HTTP middleware components are applied to service-to-service invocation calls. +Dapr allows custom processing pipelines to be defined by chaining a series of middleware components. In this guide, you'll learn how to create a middleware component. To learn how to configure an existing middleware component, see [Configure middleware components]({{< ref middleware.md >}}) ## Writing a custom middleware From 20c446543bb313700fa645911f3287563227a221 Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 9 Jan 2023 20:22:07 -0800 Subject: [PATCH 091/116] [1.10] Docs for Cloudflare components (#3032) * WIP Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Complete docs for Workers KV state store Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Docs for the binding Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Mark Fussell Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> * Update per review feedback Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Ignore links to cloudflare dashboard Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> * Update daprdocs/content/en/reference/components-reference/supported-bindings/cloudflare-queues.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> * Changed per review feedback Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com> Co-authored-by: Mark Fussell Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> --- .../supported-bindings/cloudflare-queues.md | 250 ++++++++++++++++++ .../setup-cloudflare-workerskv.md | 250 ++++++++++++++++++ .../data/components/bindings/cloudflare.yaml | 8 + .../components/state_stores/cloudflare.yaml | 12 + .../layouts/partials/components/bindings.html | 1 + .../partials/components/state-stores.html | 1 + 6 files changed, 522 insertions(+) create mode 100644 daprdocs/content/en/reference/components-reference/supported-bindings/cloudflare-queues.md create mode 100644 daprdocs/content/en/reference/components-reference/supported-state-stores/setup-cloudflare-workerskv.md create mode 100644 daprdocs/data/components/bindings/cloudflare.yaml create mode 100644 daprdocs/data/components/state_stores/cloudflare.yaml diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/cloudflare-queues.md b/daprdocs/content/en/reference/components-reference/supported-bindings/cloudflare-queues.md new file mode 100644 index 000000000..2a1420b6d --- /dev/null +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/cloudflare-queues.md @@ -0,0 +1,250 @@ +--- +type: docs +title: "Cloudflare Queues bindings spec" +linkTitle: "Cloudflare Queues" +description: "Detailed documentation on the Cloudflare Queues component" +aliases: + - "/operations/components/setup-bindings/supported-bindings/cloudflare-queues/" + - "/operations/components/setup-bindings/supported-bindings/cfqueues/" +--- + +## Component format + +This output binding for Dapr allows interacting with [Cloudflare Queues](https://developers.cloudflare.com/queues/) to **publish** new messages. It is currently not possible to consume messages from a Queue using Dapr. + +To setup a Cloudflare Queues binding, create a component of type `bindings.cloudflare.queues`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: +spec: + type: bindings.cloudflare.queues + version: v1 + # Increase the initTimeout if Dapr is managing the Worker for you + initTimeout: "120s" + metadata: + # Name of the existing Cloudflare Queue (required) + - name: queueName + value: "" + # Name of the Worker (required) + - name: workerName + value: "" + # PEM-encoded private Ed25519 key (required) + - name: key + value: | + -----BEGIN PRIVATE KEY----- + MC4CAQ... + -----END PRIVATE KEY----- + # Cloudflare account ID (required to have Dapr manage the Worker) + - name: cfAccountID + value: "" + # API token for Cloudflare (required to have Dapr manage the Worker) + - name: cfAPIToken + value: "" + # URL of the Worker (required if the Worker has been pre-created outside of Dapr) + - name: workerUrl + value: "" +``` + +{{% alert title="Warning" color="warning" %}} +The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). +{{% /alert %}} + +## Spec metadata fields + +| Field | Required | Binding support | Details | Example | +|--------------------|:--------:|-------|--------|---------| +| `queueName` | Y | Output | Name of the existing Cloudflare Queue | `"mydaprqueue"` +| `key` | Y | Output | Ed25519 private key, PEM-encoded | *See example above* +| `cfAccountID` | Y/N | Output | Cloudflare account ID. Required to have Dapr manage the worker. | `"456789abcdef8b5588f3d134f74ac"def` +| `cfAPIToken` | Y/N | Output | API token for Cloudflare. Required to have Dapr manage the Worker. | `"secret-key"` +| `workerUrl` | Y/N | Output | URL of the Worker. Required if the Worker has been pre-provisioned outside of Dapr. | `"https://mydaprqueue.mydomain.workers.dev"` + +> When you configure Dapr to create your Worker for you, you may need to set a longer value for the `initTimeout` property of the component, to allow enough time for the Worker script to be deployed. For example: `initTimeout: "120s"` + +## Binding support + +This component supports **output binding** with the following operations: + +- `publish` (alias: `create`): Publish a message to the Queue. + The data passed to the binding is used as-is for the body of the message published to the Queue. + This operation does not accept any metadata property. + +## Create a Cloudflare Queue + +To use this component, you must have a Cloudflare Queue created in your Cloudflare account. + +You can create a new Queue in one of two ways: + + +- Using the [Cloudflare dashboard](https://dash.cloudflare.com/) +- Using the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/): + + ```sh + # Authenticate if needed with `npx wrangler login` first + npx wrangler queues create + # For example: `npx wrangler queues create myqueue` + ``` + + +## Configuring the Worker + +Because Cloudflare Queues can only be accessed by scripts running on Workers, Dapr needs to maintain a Worker to communicate with the Queue. + +Dapr can manage the Worker for you automatically, or you can pre-provision a Worker yourself. Pre-provisioning the Worker is the only supported option when running on [workerd](https://github.com/cloudflare/workerd). + +{{% alert title="Important" color="warning" %}} +Use a separate Worker for each Dapr component. Do not use the same Worker script for different Cloudflare Queues bindings, and do not use the same Worker script for different Cloudflare components in Dapr (for example, the Workers KV state store and the Queues binding). +{{% /alert %}} + +{{< tabs "Let Dapr manage the Worker" "Manually provision the Worker script" >}} + +{{% codetab %}} + + +If you want to let Dapr manage the Worker for you, you will need to provide these 3 metadata options: + + +- **`workerName`**: Name of the Worker script. This will be the first part of the URL of your Worker. For example, if the "workers.dev" domain configured for your Cloudflare account is `mydomain.workers.dev` and you set `workerName` to `mydaprqueue`, the Worker that Dapr deploys will be available at `https://mydaprqueue.mydomain.workers.dev`. +- **`cfAccountID`**: ID of your Cloudflare account. You can find this in your browser's URL bar after logging into the [Cloudflare dashboard](https://dash.cloudflare.com/), with the ID being the hex string right after `dash.cloudflare.com`. For example, if the URL is `https://dash.cloudflare.com/456789abcdef8b5588f3d134f74acdef`, the value for `cfAccountID` is `456789abcdef8b5588f3d134f74acdef`. +- **`cfAPIToken`**: API token with permission to create and edit Workers. You can create it from the ["API Tokens" page](https://dash.cloudflare.com/profile/api-tokens) in the "My Profile" section in the Cloudflare dashboard: + 1. Click on **"Create token"**. + 1. Select the **"Edit Cloudflare Workers"** template. + 1. Follow the on-screen instructions to generate a new API token. + + +When Dapr is configured to manage the Worker for you, when a Dapr Runtime is started it checks that the Worker exists and it's up-to-date. If the Worker doesn't exist, or if it's using an outdated version, Dapr creates or upgrades it for you automatically. + +{{% /codetab %}} + +{{% codetab %}} + + +If you'd rather not give Dapr permissions to deploy Worker scripts for you, you can manually provision a Worker for Dapr to use. Note that if you have multiple Dapr components that interact with Cloudflare services via a Worker, you will need to create a separate Worker for each one of them. + +To manually provision a Worker script, you will need to have Node.js installed on your local machine. + +1. Create a new folder where you'll place the source code of the Worker, for example: `daprworker`. +2. If you haven't already, authenticate with Wrangler (the Cloudflare Workers CLI) using: `npx wrangler login`. +3. Inside the newly-created folder, create a new `wrangler.toml` file with the contents below, filling in the missing information as appropriate: + + ```toml + # Name of your Worker, for example "mydaprqueue" + name = "" + + # Do not change these options + main = "worker.js" + compatibility_date = "2022-12-09" + usage_model = "bundled" + + [vars] + # Set this to the **public** part of the Ed25519 key, PEM-encoded (with newlines replaced with `\n`). + # Example: + # PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMCowB...=\n-----END PUBLIC KEY----- + PUBLIC_KEY = "" + # Set this to the name of your Worker (same as the value of the "name" property above), for example "mydaprqueue". + TOKEN_AUDIENCE = "" + + # Set the next two values to the name of your Queue, for example "myqueue". + # Note that they will both be set to the same value. + [[queues.producers]] + queue = "" + binding = "" + ``` + + > Note: see the next section for how to generate an Ed25519 key pair. Make sure you use the **public** part of the key when deploying a Worker! + +4. Copy the (pre-compiled and minified) code of the Worker in the `worker.js` file. You can do that with this command: + + ```sh + # Set this to the version of Dapr that you're using + DAPR_VERSION="release-{{% dapr-latest-version short="true" %}}" + curl -LfO "https://raw.githubusercontent.com/dapr/components-contrib/${DAPR_VERSION}/internal/component/cloudflare/workers/code/worker.js" + ``` + +5. Deploy the Worker using Wrangler: + + ```sh + npx wrangler publish + ``` + +Once your Worker has been deployed, you will need to initialize the component with these two metadata options: + +- **`workerName`**: Name of the Worker script. This is the value you set in the `name` property in the `wrangler.toml` file. +- **`workerUrl`**: URL of the deployed Worker. The `npx wrangler command` will show the full URL to you, for example `https://mydaprqueue.mydomain.workers.dev`. + +{{% /codetab %}} + +{{< /tabs >}} + +## Generate an Ed25519 key pair + +All Cloudflare Workers listen on the public Internet, so Dapr needs to use additional authentication and data protection measures to ensure that no other person or application can communicate with your Worker (and thus, with your Cloudflare Queue). These include industry-standard measures such as: + +- All requests made by Dapr to the Worker are authenticated via a bearer token (technically, a JWT) which is signed with an Ed25519 key. +- All communications between Dapr and your Worker happen over an encrypted connection, using TLS (HTTPS). +- The bearer token is generated on each request and is valid for a brief period of time only (currently, one minute). + +To let Dapr issue bearer tokens, and have your Worker validate them, you will need to generate a new Ed25519 key pair. Here are examples of generating the key pair using OpenSSL or the step CLI. + +{{< tabs "Generate with OpenSSL" "Generate with the step CLI" >}} + +{{% codetab %}} + + +> Support for generating Ed25519 keys is available since OpenSSL 1.1.0, so the commands below will not work if you're using an older version of OpenSSL. + +> Note for Mac users: on macOS, the "openssl" binary that is shipped by Apple is actually based on LibreSSL, which as of writing doesn't support Ed25519 keys. If you're using macOS, either use the step CLI, or install OpenSSL 3.0 from Homebrew using `brew install openssl@3` then replacing `openssl` in the commands below with `$(brew --prefix)/opt/openssl@3/bin/openssl`. + +You can generate a new Ed25519 key pair with OpenSSL using: + +```sh +openssl genpkey -algorithm ed25519 -out private.pem +openssl pkey -in private.pem -pubout -out public.pem +``` + +> On macOS, using openssl@3 from Homebrew: +> +> ```sh +> $(brew --prefix)/opt/openssl@3/bin/openssl genpkey -algorithm ed25519 -out private.pem +> $(brew --prefix)/opt/openssl@3/bin/openssl pkey -in private.pem -pubout -out public.pem +> ``` + +{{% /codetab %}} + +{{% codetab %}} + + +If you don't have the step CLI already, install it following the [official instructions](https://smallstep.com/docs/step-cli/installation). + +Next, you can generate a new Ed25519 key pair with the step CLI using: + +```sh +step crypto keypair \ + public.pem private.pem \ + --kty OKP --curve Ed25519 \ + --insecure --no-password +``` + +{{% /codetab %}} + +{{< /tabs >}} + +Regardless of how you generated your key pair, with the instructions above you'll have two files: + +- `private.pem` contains the private part of the key; use the contents of this file for the **`key`** property of the component's metadata. +- `public.pem` contains the public part of the key, which you'll need only if you're deploying a Worker manually (as per the instructions in the previoius section). + +{{% alert title="Warning" color="warning" %}} +Protect the private part of your key and treat it as a secret value! +{{% /alert %}} + +## Related links + +- [Basic schema for a Dapr component]({{< ref component-schema >}}) +- [Bindings building block]({{< ref bindings >}}) +- [How-To: Use bindings to interface with external resources]({{< ref howto-bindings.md >}}) +- [Bindings API reference]({{< ref bindings_api.md >}}) +- Documentation for [Cloudflare Queues](https://developers.cloudflare.com/queues/) \ No newline at end of file diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-cloudflare-workerskv.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-cloudflare-workerskv.md new file mode 100644 index 000000000..2adf72a76 --- /dev/null +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-cloudflare-workerskv.md @@ -0,0 +1,250 @@ +--- +type: docs +title: "Cloudflare Workers KV" +linkTitle: "Cloudflare Workers KV" +description: Detailed information on the Cloudflare Workers KV state store component +aliases: + - "/operations/components/setup-state-store/supported-state-stores/setup-cloudflare-workerskv/" +--- + +## Create a Dapr component + +To setup a [Cloudflare Workers KV](https://developers.cloudflare.com/workers/learning/how-kv-works/) state store, create a component of type `state.cloudflare.workerskv`. See [this guide]({{< ref "howto-get-save-state.md#step-1-setup-a-state-store" >}}) on how to create and apply a state store configuration. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: +spec: + type: state.cloudflare.workerskv + version: v1 + # Increase the initTimeout if Dapr is managing the Worker for you + initTimeout: "120s" + metadata: + # ID of the Workers KV namespace (required) + - name: kvNamespaceID + value: "" + # Name of the Worker (required) + - name: workerName + value: "" + # PEM-encoded private Ed25519 key (required) + - name: key + value: | + -----BEGIN PRIVATE KEY----- + MC4CAQ... + -----END PRIVATE KEY----- + # Cloudflare account ID (required to have Dapr manage the Worker) + - name: cfAccountID + value: "" + # API token for Cloudflare (required to have Dapr manage the Worker) + - name: cfAPIToken + value: "" + # URL of the Worker (required if the Worker has been pre-created outside of Dapr) + - name: workerUrl + value: "" +``` + +{{% alert title="Warning" color="warning" %}} +The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). +{{% /alert %}} + +## Spec metadata fields + +| Field | Required | Details | Example | +|--------------------|:--------:|---------|---------| +| `kvNamespaceID` | Y | ID of the pre-created Workers KV namespace | `"123456789abcdef8b5588f3d134f74ac"` +| `workerName` | Y | Name of the Worker to connect to | `"mydaprkv"` +| `key` | Y | Ed25519 private key, PEM-encoded | *See example above* +| `cfAccountID` | Y/N | Cloudflare account ID. Required to have Dapr manage the worker. | `"456789abcdef8b5588f3d134f74ac"def` +| `cfAPIToken` | Y/N | API token for Cloudflare. Required to have Dapr manage the Worker. | `"secret-key"` +| `workerUrl` | Y/N | URL of the Worker. Required if the Worker has been pre-provisioned outside of Dapr. | `"https://mydaprkv.mydomain.workers.dev"` + +> When you configure Dapr to create your Worker for you, you may need to set a longer value for the `initTimeout` property of the component, to allow enough time for the Worker script to be deployed. For example: `initTimeout: "120s"` + +## Create a Workers KV namespace + +To use this component, you must have a Workers KV namespace created in your Cloudflare account. + +You can create a new Workers KV namespace in one of two ways: + + +- Using the [Cloudflare dashboard](https://dash.cloudflare.com/) + Make note of the "ID" of the Workers KV namespace that you can see in the dashboard. This is a hex string (for example `123456789abcdef8b5588f3d134f74ac`)–not the name you used when you created it! +- Using the [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/): + + ```sh + # Authenticate if needed with `npx wrangler login` first + wrangler kv:namespace create + ``` + + The output contains the ID of the namespace, for example: + + ```text + { binding = "", id = "123456789abcdef8b5588f3d134f74ac" } + ``` + + +## Configuring the Worker + +Because Cloudflare Workers KV namespaces can only be accessed by scripts running on Workers, Dapr needs to maintain a Worker to communicate with the Workers KV storage. + +Dapr can manage the Worker for you automatically, or you can pre-provision a Worker yourself. Pre-provisioning the Worker is the only supported option when running on [workerd](https://github.com/cloudflare/workerd). + +{{% alert title="Important" color="warning" %}} +Use a separate Worker for each Dapr component. Do not use the same Worker script for different Cloudflare Workers KV state store components, and do not use the same Worker script for different Cloudflare components in Dapr (e.g. the Workers KV state store and the Queues binding). +{{% /alert %}} + +{{< tabs "Let Dapr manage the Worker" "Manually provision the Worker script" >}} + +{{% codetab %}} + + +If you want to let Dapr manage the Worker for you, you will need to provide these 3 metadata options: + + +- **`workerName`**: Name of the Worker script. This will be the first part of the URL of your Worker. For example, if the "workers.dev" domain configured for your Cloudflare account is `mydomain.workers.dev` and you set `workerName` to `mydaprkv`, the Worker that Dapr deploys will be available at `https://mydaprkv.mydomain.workers.dev`. +- **`cfAccountID`**: ID of your Cloudflare account. You can find this in your browser's URL bar after logging into the [Cloudflare dashboard](https://dash.cloudflare.com/), with the ID being the hex string right after `dash.cloudflare.com`. For example, if the URL is `https://dash.cloudflare.com/456789abcdef8b5588f3d134f74acdef`, the value for `cfAccountID` is `456789abcdef8b5588f3d134f74acdef`. +- **`cfAPIToken`**: API token with permission to create and edit Workers and Workers KV namespaces. You can create it from the ["API Tokens" page](https://dash.cloudflare.com/profile/api-tokens) in the "My Profile" section in the Cloudflare dashboard: + 1. Click on **"Create token"**. + 1. Select the **"Edit Cloudflare Workers"** template. + 1. Follow the on-screen instructions to generate a new API token. + + +When Dapr is configured to manage the Worker for you, when a Dapr Runtime is started it checks that the Worker exists and it's up-to-date. If the Worker doesn't exist, or if it's using an outdated version, Dapr will create or upgrade it for you automatically. + +{{% /codetab %}} + +{{% codetab %}} + + +If you'd rather not give Dapr permissions to deploy Worker scripts for you, you can manually provision a Worker for Dapr to use. Note that if you have multiple Dapr components that interact with Cloudflare services via a Worker, you will need to create a separate Worker for each one of them. + +To manually provision a Worker script, you will need to have Node.js installed on your local machine. + +1. Create a new folder where you'll place the source code of the Worker, for example: `daprworker`. +2. If you haven't already, authenticate with Wrangler (the Cloudflare Workers CLI) using: `npx wrangler login`. +3. Inside the newly-created folder, create a new `wrangler.toml` file with the contents below, filling in the missing information as appropriate: + + ```toml + # Name of your Worker, for example "mydaprkv" + name = "" + + # Do not change these options + main = "worker.js" + compatibility_date = "2022-12-09" + usage_model = "bundled" + + [vars] + # Set this to the **public** part of the Ed25519 key, PEM-encoded (with newlines replaced with `\n`). + # Example: + # PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMCowB...=\n-----END PUBLIC KEY----- + PUBLIC_KEY = "" + # Set this to the name of your Worker (same as the value of the "name" property above), for example "mydaprkv". + TOKEN_AUDIENCE = "" + + [[kv_namespaces]] + # Set the next two values to the ID (not name) of your KV namespace, for example "123456789abcdef8b5588f3d134f74ac". + # Note that they will both be set to the same value. + binding = "" + id = "" + ``` + + > Note: see the next section for how to generate an Ed25519 key pair. Make sure you use the **public** part of the key when deploying a Worker! + +4. Copy the (pre-compiled and minified) code of the Worker in the `worker.js` file. You can do that with this command: + + ```sh + # Set this to the version of Dapr that you're using + DAPR_VERSION="release-{{% dapr-latest-version short="true" %}}" + curl -LfO "https://raw.githubusercontent.com/dapr/components-contrib/${DAPR_VERSION}/internal/component/cloudflare/workers/code/worker.js" + ``` + +5. Deploy the Worker using Wrangler: + + ```sh + npx wrangler publish + ``` + +Once your Worker has been deployed, you will need to initialize the component with these two metadata options: + +- **`workerName`**: Name of the Worker script. This is the value you set in the `name` property in the `wrangler.toml` file. +- **`workerUrl`**: URL of the deployed Worker. The `npx wrangler command` will show the full URL to you, for example `https://mydaprkv.mydomain.workers.dev`. + +{{% /codetab %}} + +{{< /tabs >}} + +## Generate an Ed25519 key pair + +All Cloudflare Workers listen on the public Internet, so Dapr needs to use additional authentication and data protection measures to ensure that no other person or application can communicate with your Worker (and thus, with your Worker KV namespace). These include industry-standard measures such as: + +- All requests made by Dapr to the Worker are authenticated via a bearer token (technically, a JWT) which is signed with an Ed25519 key. +- All communications between Dapr and your Worker happen over an encrypted connection, using TLS (HTTPS). +- The bearer token is generated on each request and is valid for a brief period of time only (currently, one minute). + +To let Dapr issue bearer tokens, and have your Worker validate them, you will need to generate a new Ed25519 key pair. Here are examples of generating the key pair using OpenSSL or the step CLI. + +{{< tabs "Generate with OpenSSL" "Generate with the step CLI" >}} + +{{% codetab %}} + + +> Support for generating Ed25519 keys is available since OpenSSL 1.1.0, so the commands below will not work if you're using an older version of OpenSSL. + +> Note for Mac users: on macOS, the "openssl" binary that is shipped by Apple is actually based on LibreSSL, which as of writing doesn't support Ed25519 keys. If you're using macOS, either use the step CLI, or install OpenSSL 3.0 from Homebrew using `brew install openssl@3` then replacing `openssl` in the commands below with `$(brew --prefix)/opt/openssl@3/bin/openssl`. + +You can generate a new Ed25519 key pair with OpenSSL using: + +```sh +openssl genpkey -algorithm ed25519 -out private.pem +openssl pkey -in private.pem -pubout -out public.pem +``` + +> On macOS, using openssl@3 from Homebrew: +> +> ```sh +> $(brew --prefix)/opt/openssl@3/bin/openssl genpkey -algorithm ed25519 -out private.pem +> $(brew --prefix)/opt/openssl@3/bin/openssl pkey -in private.pem -pubout -out public.pem +> ``` + +{{% /codetab %}} + +{{% codetab %}} + + +If you don't have the step CLI already, install it following the [official instructions](https://smallstep.com/docs/step-cli/installation). + +Next, you can generate a new Ed25519 key pair with the step CLI using: + +```sh +step crypto keypair \ + public.pem private.pem \ + --kty OKP --curve Ed25519 \ + --insecure --no-password +``` + +{{% /codetab %}} + +{{< /tabs >}} + +Regardless of how you generated your key pair, with the instructions above you'll have two files: + +- `private.pem` contains the private part of the key; use the contents of this file for the **`key`** property of the component's metadata. +- `public.pem` contains the public part of the key, which you'll need only if you're deploying a Worker manually (as per the instructions in the previoius section). + +{{% alert title="Warning" color="warning" %}} +Protect the private part of your key and treat it as a secret value! +{{% /alert %}} + +## Additional notes + +- Note that Cloudflare Workers KV doesn't guarantee strong data consistency. Although changes are visible immediately (usually) for requests made to the same Cloudflare datacenter, it can take a certain amount of time (usually up to one minute) for changes to be replicated across all Cloudflare regions. +- This state store supports TTLs with Dapr, but the minimum value for the TTL is 1 minute. + +## Related links + +- [Basic schema for a Dapr component]({{< ref component-schema >}}) +- Read [this guide]({{< ref "howto-get-save-state.md#step-2-save-and-retrieve-a-single-state" >}}) for instructions on configuring state store components +- [State management building block]({{< ref state-management >}}) +- Documentation for [Cloudflare Workers KV](https://developers.cloudflare.com/workers/learning/how-kv-works/) diff --git a/daprdocs/data/components/bindings/cloudflare.yaml b/daprdocs/data/components/bindings/cloudflare.yaml new file mode 100644 index 000000000..ac287102a --- /dev/null +++ b/daprdocs/data/components/bindings/cloudflare.yaml @@ -0,0 +1,8 @@ +- component: Cloudflare Queues + link: cloudflare-queues + state: Alpha + version: v1 + since: "1.10" + features: + input: false + output: true diff --git a/daprdocs/data/components/state_stores/cloudflare.yaml b/daprdocs/data/components/state_stores/cloudflare.yaml new file mode 100644 index 000000000..e409e8691 --- /dev/null +++ b/daprdocs/data/components/state_stores/cloudflare.yaml @@ -0,0 +1,12 @@ +- component: Cloudflare Workers KV + link: setup-cloudflare-workerskv + state: Beta + version: v1 + since: "1.10" + features: + crud: true + transactions: false + etag: false + ttl: true + query: false + diff --git a/daprdocs/layouts/partials/components/bindings.html b/daprdocs/layouts/partials/components/bindings.html index 166efc797..31fa0c58f 100644 --- a/daprdocs/layouts/partials/components/bindings.html +++ b/daprdocs/layouts/partials/components/bindings.html @@ -4,6 +4,7 @@ "Alibaba Cloud" $.Site.Data.components.bindings.alibaba "Google Cloud Platform (GCP)" $.Site.Data.components.bindings.gcp "Amazon Web Services (AWS)" $.Site.Data.components.bindings.aws +"Cloudflare" $.Site.Data.components.bindings.cloudflare "Zeebe (Camunda Cloud)" $.Site.Data.components.bindings.zeebe }} diff --git a/daprdocs/layouts/partials/components/state-stores.html b/daprdocs/layouts/partials/components/state-stores.html index d42c41047..35d28d46b 100644 --- a/daprdocs/layouts/partials/components/state-stores.html +++ b/daprdocs/layouts/partials/components/state-stores.html @@ -3,6 +3,7 @@ "Microsoft Azure" $.Site.Data.components.state_stores.azure "Google Cloud Platform (GCP)" $.Site.Data.components.state_stores.gcp "Amazon Web Services (AWS)" $.Site.Data.components.state_stores.aws +"Cloudflare" $.Site.Data.components.state_stores.cloudflare "Oracle Cloud" $.Site.Data.components.state_stores.oracle }} From ebf64d4a35f64d8b3539faa0af5887f973d823dd Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Thu, 12 Jan 2023 11:08:59 +0530 Subject: [PATCH 092/116] Add docs Signed-off-by: Shubham Sharma --- .../supported-pubsub/setup-azure-eventhubs.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-azure-eventhubs.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-azure-eventhubs.md index 85044b27d..f3bba3c9a 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-azure-eventhubs.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-azure-eventhubs.md @@ -105,6 +105,14 @@ spec: value: "myeventhubstoragecontainer" ``` +## Sending multiple messages + +Azure Event Hubs natively supports sending multiple messages in a single operation. To set the metadata for bulk operations, set the query parameters on the HTTP request or the gRPC metadata as documented [here]({{< ref pubsub_api >}}) + +| Metadata | Default | +|----------|---------| +| `metadata.maxBulkPubBytes` | `1000000` | + ## Create an Azure Event Hub Follow the instructions [here](https://docs.microsoft.com/azure/event-hubs/event-hubs-create) on setting up Azure Event Hubs. From 9094ec86e0ba3648ec6a0e098b5c9f74b6761ff2 Mon Sep 17 00:00:00 2001 From: Marc Duiker Date: Mon, 16 Jan 2023 22:15:32 +0100 Subject: [PATCH 093/116] Change --resource-path to --components-path (#3058) Signed-off-by: Marc Duiker Signed-off-by: Marc Duiker --- .../howto-manage-configuration.md | 2 +- .../quickstarts/configuration-quickstart.md | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md index b05722312..45468c798 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md @@ -305,7 +305,7 @@ asyncio.run(executeConfiguration()) ``` ```bash -dapr run --app-id orderprocessing --resources-path components/ -- python3 OrderProcessingService.py +dapr run --app-id orderprocessing --components-path components/ -- python3 OrderProcessingService.py ``` {{% /codetab %}} diff --git a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md index bba89def1..4baee305d 100644 --- a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md @@ -64,7 +64,7 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +dapr run --app-id order-processor --components-path ../../../components/ --app-port 6001 -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -90,7 +90,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-port 6001 -- python3 app.py +dapr run --app-id order-processor --components-path ../../../components/ --app-port 6001 -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -187,7 +187,7 @@ npm install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +dapr run --app-id order-processor --components-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js ``` The expected output: @@ -209,7 +209,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --resources-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js +dapr run --app-id order-processor --components-path ../../../components/ --app-protocol grpc --dapr-grpc-port 3500 -- node index.js ``` The app will return the updated configuration values: @@ -309,7 +309,7 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +dapr run --app-id order-processor-http --components-path ../../../components/ --app-port 7001 -- dotnet run --project . ``` The expected output: @@ -331,7 +331,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor-http --resources-path ../../../components/ --app-port 7001 -- dotnet run --project . +dapr run --app-id order-processor-http --components-path ../../../components/ --app-port 7001 -- dotnet run --project . ``` The app will return the updated configuration values: @@ -428,7 +428,7 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --components-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` The expected output: @@ -450,7 +450,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --components-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` The app will return the updated configuration values: @@ -537,7 +537,7 @@ cd ./configuration/go/sdk/order-processor Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +dapr run --app-id order-processor --app-port 6001 --components-path ../../../components -- go run . ``` The expected output: @@ -560,7 +560,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "103" orderId2 "104" Run the `order-processor` service again: ```bash -dapr run --app-id order-processor --app-port 6001 --resources-path ../../../components -- go run . +dapr run --app-id order-processor --app-port 6001 --components-path ../../../components -- go run . ``` The app will return the updated configuration values: From 05bf098c46ae857df62eea043a556dfb4f1f9a33 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 16 Jan 2023 18:30:01 -0600 Subject: [PATCH 094/116] docs: improve consistency on directory mvment prefix (#3061) Signed-off-by: Samantha Coyle Signed-off-by: Samantha Coyle Co-authored-by: Yaron Schneider --- .../quickstarts/bindings-quickstart.md | 30 +++++++++---------- .../quickstarts/configuration-quickstart.md | 10 +++---- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md index 5c3b8b491..15736c9a9 100644 --- a/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md @@ -46,7 +46,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -73,7 +73,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/python/sdk/batch +cd bindings/python/sdk/batch ``` Install the dependencies: @@ -137,7 +137,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -253,7 +253,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -280,7 +280,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/javascript/sdk/batch +cd bindings/javascript/sdk/batch ``` Install the dependencies: @@ -339,7 +339,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -455,7 +455,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -482,7 +482,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/csharp/sdk/batch +cd bindings/csharp/sdk/batch ``` Install the dependencies: @@ -543,7 +543,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -662,7 +662,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -689,7 +689,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/java/sdk/batch +cd bindings/java/sdk/batch ``` Install the dependencies: @@ -753,7 +753,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: @@ -869,7 +869,7 @@ Run the [PostgreSQL instance](https://www.postgresql.org/) locally in a Docker c In a terminal window, from the root of the Quickstarts clone directory, navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following command to set up the container: @@ -896,7 +896,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS In a new terminal window, navigate to the SDK directory. ```bash -cd quickstarts/bindings/go/sdk/batch +cd bindings/go/sdk/batch ``` Install the dependencies: @@ -965,7 +965,7 @@ Your output binding's `print` statement output: In a new terminal, verify the same data has been inserted into the database. Navigate to the `bindings/db` directory. ```bash -cd quickstarts/bindings/db +cd bindings/db ``` Run the following to start the interactive Postgres CLI: diff --git a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md index 4baee305d..e457612a1 100644 --- a/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/configuration-quickstart.md @@ -52,7 +52,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/python/sdk/order-processor +cd configuration/python/sdk/order-processor ``` Install the dependencies: @@ -175,7 +175,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/javascript/sdk/order-processor +cd configuration/javascript/sdk/order-processor ``` Install the dependencies: @@ -296,7 +296,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/csharp/sdk/order-processor +cd configuration/csharp/sdk/order-processor ``` Recall NuGet packages: @@ -416,7 +416,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/java/sdk/order-processor +cd configuration/java/sdk/order-processor ``` Install the dependencies: @@ -531,7 +531,7 @@ docker exec dapr_redis redis-cli MSET orderId1 "101" orderId2 "102" From the root of the Quickstarts clone directory, navigate to the `order-processor` directory. ```bash -cd ./configuration/go/sdk/order-processor +cd configuration/go/sdk/order-processor ``` Run the `order-processor` service alongside a Dapr sidecar. From a95ddf4d43bd9723aaaf3e303cdc817f96711b9a Mon Sep 17 00:00:00 2001 From: Roberto Rojas Date: Tue, 17 Jan 2023 11:52:50 -0500 Subject: [PATCH 095/116] [1.10][AWS DynamoDB] Documentation for Partition Key Metadata Field (#3052) * [1.10][AWS DynamoDB] Documentation for Partition Key Metadata Field Signed-off-by: Roberto J Rojas * Update daprdocs/content/en/reference/components-reference/supported-state-stores/setup-dynamodb.md Co-authored-by: Mark Fussell Signed-off-by: Roberto Rojas * Update daprdocs/content/en/reference/components-reference/supported-state-stores/setup-dynamodb.md Co-authored-by: Mark Fussell Signed-off-by: Roberto Rojas * updates status to stable + fixes as PR review Signed-off-by: Roberto J Rojas * Update setup-dynamodb.md Removing unneeded dots Signed-off-by: Mark Fussell * Update setup-dynamodb.md can to console Signed-off-by: Mark Fussell Signed-off-by: Roberto J Rojas Signed-off-by: Roberto Rojas Signed-off-by: Mark Fussell Co-authored-by: Mark Fussell --- .../supported-state-stores/setup-dynamodb.md | 90 ++++++++++++++++++- .../data/components/state_stores/aws.yaml | 4 +- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-dynamodb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-dynamodb.md index 3e08b9f7c..a3b1781de 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-dynamodb.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-dynamodb.md @@ -21,7 +21,7 @@ spec: version: v1 metadata: - name: table - value: "mytable" + value: "Contracts" - name: accessKey value: "AKIAIOSFODNN7EXAMPLE" # Optional - name: secretKey @@ -34,6 +34,8 @@ spec: value: "myTOKEN" # Optional - name: ttlAttributeName value: "expiresAt" # Optional + - name: partitionKey + value: "ContractID" # Optional ``` {{% alert title="Warning" color="warning" %}} @@ -42,19 +44,20 @@ The above example uses secrets as plain strings. It is recommended to use a secr ## Primary Key -In order to use DynamoDB as a Dapr state store, the table must have a primary key named `key`. +In order to use DynamoDB as a Dapr state store, the table must have a primary key named `key`. See the section [Partition Keys]({{< ref "setup-dynamodb.md#partition-keys" >}}) for an option to change this behavior. ## Spec metadata fields | Field | Required | Details | Example | |--------------------|:--------:|---------|---------| -| table | Y | name of the DynamoDB table to use | `"mytable"` +| table | Y | name of the DynamoDB table to use | `"Contracts"` | accessKey | N | ID of the AWS account with appropriate permissions to SNS and SQS. Can be `secretKeyRef` to use a secret reference | `"AKIAIOSFODNN7EXAMPLE"` | secretKey | N | Secret for the AWS user. Can be `secretKeyRef` to use a secret reference |`"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"` | region | N | The AWS region to the instance. See this page for valid regions: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html. Ensure that DynamoDB are available in that region.| `"us-east-1"` | endpoint | N |AWS endpoint for the component to use. Only used for local development. The `endpoint` is unncessary when running against production AWS | `"http://localhost:4566"` | sessionToken | N |AWS session token to use. A session token is only required if you are using temporary security credentials. | `"TOKEN"` | ttlAttributeName | N |The table attribute name which should be used for TTL. | `"expiresAt"` +| partitionKey | N |The table primary key or partition key attribute name. This field is used to replace the default primary key attribute name `"key"`. See the section [Partition Keys]({{< ref "setup-dynamodb.md#partition-keys" >}}). | `"ContractID"` {{% alert title="Important" color="warning" %}} When running the Dapr sidecar (daprd) with your application on EKS (AWS Kubernetes), if you're using a node/pod that has already been attached to an IAM policy defining access to AWS resources, you **must not** provide AWS access-key, secret-key, and tokens in the definition of the component spec you're using. @@ -70,6 +73,87 @@ In order to use DynamoDB TTL feature, you must enable TTL on your table and defi The attribute name must be defined in the `ttlAttributeName` field. See official [AWS docs](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html). +## Partition Keys + +By default, the DynamoDB state store component uses the table attribute name `key` as primary/partition key in the DynamoDB table. +This can be overridden by specifying a metadata field in the component configuration with a key of `partitionKey` and a value of the desired attribute name. + +To learn more about DynamoDB primary/partition keys, read the [AWS DynamoDB Developer Guide.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) + +The following `statestore.yaml` file shows how to configure the DynamoDB state store component to use the partition key attribute name of `ContractID`: + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: statestore +spec: + type: state.aws.dynamodb + version: v1 + metadata: + - name: table + value: "Contracts" + - name: partitionKey + value: "ContractID" +``` + +The above component specification assumes the following DynamoDB Table Layout: + +```console +{ + "Table": { + "AttributeDefinitions": [ + { + "AttributeName": "ContractID", + "AttributeType": "S" + } + ], + "TableName": "Contracts", + "KeySchema": [ + { + "AttributeName": "ContractID", + "KeyType": "HASH" + } + ], +} +``` + +The following operation passes `"A12345"` as the value for `key`, and based on the component specification provided above, the Dapr runtime will replace the `key` attribute name +with `ContractID` as the Partition/Primary Key sent to DynamoDB: + +```shell +$ dapr run --app-id contractsprocessing --app-port ... + +$ curl -X POST http://localhost:3500/v1.0/state/ \ + -H "Content-Type: application/json" + -d '[ + { + "key": "A12345", + "value": "Dapr Contract" + } + ]' +``` + +The following AWS CLI Command displays the contents of the DynamoDB `Contracts` table: +```shell +$ aws dynamodb get-item \ + --table-name Contracts \ + --key '{"ContractID":{"S":"contractsprocessing||A12345"}}' +{ + "Item": { + "value": { + "S": "Dapr Contract" + }, + "etag": { + "S": "....." + }, + "ContractID": { + "S": "contractsprocessing||A12345" + } + } +} +``` + ## Related links - [Basic schema for a Dapr component]({{< ref component-schema >}}) diff --git a/daprdocs/data/components/state_stores/aws.yaml b/daprdocs/data/components/state_stores/aws.yaml index 65440d580..e8af47bc1 100644 --- a/daprdocs/data/components/state_stores/aws.yaml +++ b/daprdocs/data/components/state_stores/aws.yaml @@ -1,8 +1,8 @@ - component: AWS DynamoDB link: setup-dynamodb - state: Alpha + state: Stable version: v1 - since: "1.0" + since: "1.10" features: crud: true transactions: false From 735f6738c13e96ea57abbc0b5e6c828588cdb012 Mon Sep 17 00:00:00 2001 From: VuiDJi Date: Tue, 17 Jan 2023 21:35:09 +0400 Subject: [PATCH 096/116] fixed a typo in sentinelMasterName and it's examples (#3064) Signed-off-by: VuiDJi Signed-off-by: VuiDJi Co-authored-by: Mark Fussell --- .../components-reference/supported-locks/redis-lock.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md b/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md index ca6c2b54b..7c39c9f6e 100644 --- a/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md +++ b/daprdocs/content/en/reference/components-reference/supported-locks/redis-lock.md @@ -85,8 +85,8 @@ The above example uses secrets as plain strings. It is recommended to use a secr | enableTLS | N | If the Redis instance supports TLS with public certificates, can be configured to be enabled or disabled. Defaults to `"false"` | `"true"`, `"false"` | maxRetries | N | Maximum number of retries before giving up. Defaults to `3` | `5`, `10` | maxRetryBackoff | N | Maximum backoff between each retry. Defaults to `2` seconds; `"-1"` disables backoff. | `3000000000` -| failover | N | Property to enabled failover configuration. Needs sentinalMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` -| sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `""`, `"127.0.0.1:6379"` +| failover | N | Property to enabled failover configuration. Needs sentinelMasterName to be set. The redisHost should be the sentinel host address. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/). Defaults to `"false"` | `"true"`, `"false"` +| sentinelMasterName | N | The sentinel master name. See [Redis Sentinel Documentation](https://redis.io/docs/manual/sentinel/) | `"mymaster"` | redeliverInterval | N | The interval between checking for pending messages to redelivery. Defaults to `"60s"`. `"0"` disables redelivery. | `"30s"` | processingTimeout | N | The amount time a message must be pending before attempting to redeliver it. Defaults to `"15s"`. `"0"` disables redelivery. | `"30s"` | redisType | N | The type of redis. There are two valid values, one is `"node"` for single node mode, the other is `"cluster"` for redis cluster mode. Defaults to `"node"`. | `"cluster"` From 77688ac0556519d61f4a5783c1629bfa3ab45290 Mon Sep 17 00:00:00 2001 From: joshvanl Date: Tue, 10 Jan 2023 12:18:32 +0000 Subject: [PATCH 097/116] Now `version` has been moved from to subcommand: change all instances of `dapr --version` to `dapr version`. Signed-off-by: joshvanl --- daprdocs/content/en/getting-started/install-dapr-cli.md | 1 + daprdocs/content/en/reference/cli/cli-overview.md | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/getting-started/install-dapr-cli.md b/daprdocs/content/en/getting-started/install-dapr-cli.md index 258ff34e0..4c8d39880 100644 --- a/daprdocs/content/en/getting-started/install-dapr-cli.md +++ b/daprdocs/content/en/getting-started/install-dapr-cli.md @@ -188,6 +188,7 @@ Available Commands: stop Stop Dapr instances and their associated apps. . Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes + version Print the Dapr runtime and CLI version Flags: -h, --help help for dapr diff --git a/daprdocs/content/en/reference/cli/cli-overview.md b/daprdocs/content/en/reference/cli/cli-overview.md index 7ac94c482..ef9d17e05 100644 --- a/daprdocs/content/en/reference/cli/cli-overview.md +++ b/daprdocs/content/en/reference/cli/cli-overview.md @@ -42,6 +42,7 @@ Available Commands: stop Stop Dapr instances and their associated apps. Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes + version Print the Dapr runtime and CLI version Flags: -h, --help help for dapr @@ -73,8 +74,8 @@ You can learn more about each Dapr command from the links below. - [`dapr stop`]({{< ref dapr-stop.md >}}) - [`dapr uninstall`]({{< ref dapr-uninstall.md >}}) - [`dapr upgrade`]({{< ref dapr-upgrade.md >}}) - - [`dapr-version`]({{< ref dapr-version.md >}}) + - [`dapr version`]({{< ref dapr-version.md >}}) ### Environment Variables -Some Dapr flags can be set via environment variables (e.g. `DAPR_NETWORK` for the `--network` flag of the `dapr init` command). Note that specifying the flag on the command line overrides any set environment variable. \ No newline at end of file +Some Dapr flags can be set via environment variables (e.g. `DAPR_NETWORK` for the `--network` flag of the `dapr init` command). Note that specifying the flag on the command line overrides any set environment variable. From da62b1833c22a9aa6874240eddf12d9ccd0f9a1e Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 18 Jan 2023 14:08:54 -0600 Subject: [PATCH 098/116] remove optional Signed-off-by: Hannah Hunter --- .../building-blocks/state-management/howto-state-query-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md b/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md index 0aecc3224..ce9f4346a 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md +++ b/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md @@ -16,7 +16,7 @@ Even though the state store is a key/value store, the `value` might be a JSON do ## Querying the state -Submit query requests via HTTP POST/PUT or gRPC. The body of the request is the JSON map with 3 _optional_ entries: +Submit query requests via HTTP POST/PUT or gRPC. The body of the request is the JSON map with 3 entries: - `filter` - `sort` From 235626fa0fe4cf6d2c519e35dcc1829ac41f8e1c Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Wed, 18 Jan 2023 14:14:18 -0600 Subject: [PATCH 099/116] `components-path` --> `resources-path` in how-tos and quickstarts (#3016) * find and replace comopnents-path to resources-path Signed-off-by: Hannah Hunter * missed a couple Signed-off-by: Hannah Hunter * updates per pravin Signed-off-by: Hannah Hunter * mark components-path as deprecated Signed-off-by: Hannah Hunter * reword Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../en/concepts/dapr-services/sidecar.md | 4 ++-- .../bindings/howto-bindings.md | 2 +- .../bindings/howto-triggers.md | 2 +- .../howto-manage-configuration.md | 2 +- .../pubsub/howto-publish-subscribe.md | 12 +++++------ .../pubsub/subscription-methods.md | 10 +++++----- .../state-management/howto-state-query-api.md | 2 +- .../ides/vscode/vscode-dapr-extension.md | 2 +- .../quickstarts/bindings-quickstart.md | 10 +++++----- .../quickstarts/pubsub-quickstart.md | 20 +++++++++---------- .../quickstarts/secrets-quickstart.md | 10 +++++----- .../quickstarts/statemanagement-quickstart.md | 10 +++++----- .../tutorials/configure-state-pubsub.md | 4 ++-- .../tutorials/get-started-component.md | 2 +- .../operations/components/setup-bindings.md | 2 +- .../components/setup-secret-store.md | 2 +- .../self-hosted/self-hosted-with-docker.md | 4 ++-- .../en/operations/monitoring/logging/logs.md | 2 +- .../troubleshooting/common_issues.md | 2 +- .../arguments-annotations-overview.md | 3 ++- daprdocs/content/en/reference/cli/dapr-run.md | 3 ++- .../setup-azure-blobstorage.md | 2 +- .../supported-state-stores/setup-redis.md | 2 +- 23 files changed, 58 insertions(+), 56 deletions(-) diff --git a/daprdocs/content/en/concepts/dapr-services/sidecar.md b/daprdocs/content/en/concepts/dapr-services/sidecar.md index e50ce3675..473f001c9 100644 --- a/daprdocs/content/en/concepts/dapr-services/sidecar.md +++ b/daprdocs/content/en/concepts/dapr-services/sidecar.md @@ -49,10 +49,10 @@ For a detailed list of all available arguments run `daprd --help` or see this [t daprd --app-id --app-port 5000 ``` -3. If you are using several custom components and want to specify the location of the component definition files, use the `--components-path` argument: +3. If you are using several custom resources and want to specify the location of the resource definition files, use the `--resources-path` argument: ```bash - daprd --app-id myapp --components-path + daprd --app-id myapp --resources-path ``` 4. Enable collection of Prometheus metrics while running your app diff --git a/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-bindings.md b/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-bindings.md index d17bb6eae..2f5294044 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-bindings.md +++ b/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-bindings.md @@ -35,7 +35,7 @@ Create a new binding component named `checkout`. Within the `metadata` section, {{% codetab %}} -Use the `--components-path` flag with `dapr run` to point to your custom components directory. +Use the `--resources-path` flag with `dapr run` to point to your custom resources directory. ```yaml apiVersion: dapr.io/v1alpha1 diff --git a/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-triggers.md b/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-triggers.md index 6b37300e7..a98cc37ea 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-triggers.md +++ b/daprdocs/content/en/developing-applications/building-blocks/bindings/howto-triggers.md @@ -41,7 +41,7 @@ Create a new binding component named `checkout`. Within the `metadata` section, {{% codetab %}} -Use the `--components-path` flag with the `dapr run` command to point to your custom components directory. +Use the `--resources-path` flag with the `dapr run` command to point to your custom resources directory. ```yaml apiVersion: dapr.io/v1alpha1 diff --git a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md index 4de325ba6..af70ae08e 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md +++ b/daprdocs/content/en/developing-applications/building-blocks/configuration/howto-manage-configuration.md @@ -304,7 +304,7 @@ asyncio.run(executeConfiguration()) ``` ```bash -dapr run --app-id orderprocessing --components-path components/ -- python3 OrderProcessingService.py +dapr run --app-id orderprocessing --resources-path components/ -- python3 OrderProcessingService.py ``` {{% /codetab %}} diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index 9a3463eaa..134bf696b 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -63,14 +63,14 @@ scopes: - checkout ``` -You can override this file with another [pubsub component]({{< ref setup-pubsub >}}) by creating a components directory (in this example, `myComponents`) containing the file and using the flag `--components-path` with the `dapr run` CLI command. +You can override this file with another [pubsub component]({{< ref setup-pubsub >}}) by creating a components directory (in this example, `myComponents`) containing the file and using the flag `--resources-path` with the `dapr run` CLI command. {{< tabs Dotnet Java Python Go Javascript >}} {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- dotnet run +dapr run --app-id myapp --resources-path ./myComponents -- dotnet run ``` {{% /codetab %}} @@ -78,7 +78,7 @@ dapr run --app-id myapp --components-path ./myComponents -- dotnet run {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run +dapr run --app-id myapp --resources-path ./myComponents -- mvn spring-boot:run ``` {{% /codetab %}} @@ -86,7 +86,7 @@ dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- python3 app.py +dapr run --app-id myapp --resources-path ./myComponents -- python3 app.py ``` {{% /codetab %}} @@ -94,7 +94,7 @@ dapr run --app-id myapp --components-path ./myComponents -- python3 app.py {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- go run app.go +dapr run --app-id myapp --resources-path ./myComponents -- go run app.go ``` {{% /codetab %}} @@ -102,7 +102,7 @@ dapr run --app-id myapp --components-path ./myComponents -- go run app.go {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- npm start +dapr run --app-id myapp --resources-path ./myComponents -- npm start ``` {{% /codetab %}} diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index c66088ea0..a176d9402 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -47,7 +47,7 @@ When running Dapr, set the YAML component file path to point Dapr to the compone {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- dotnet run +dapr run --app-id myapp --resources-path ./myComponents -- dotnet run ``` {{% /codetab %}} @@ -55,7 +55,7 @@ dapr run --app-id myapp --components-path ./myComponents -- dotnet run {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run +dapr run --app-id myapp --resources-path ./myComponents -- mvn spring-boot:run ``` {{% /codetab %}} @@ -63,7 +63,7 @@ dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- python3 app.py +dapr run --app-id myapp --resources-path ./myComponents -- python3 app.py ``` {{% /codetab %}} @@ -71,7 +71,7 @@ dapr run --app-id myapp --components-path ./myComponents -- python3 app.py {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- npm start +dapr run --app-id myapp --resources-path ./myComponents -- npm start ``` {{% /codetab %}} @@ -79,7 +79,7 @@ dapr run --app-id myapp --components-path ./myComponents -- npm start {{% codetab %}} ```bash -dapr run --app-id myapp --components-path ./myComponents -- go run app.go +dapr run --app-id myapp --resources-path ./myComponents -- go run app.go ``` {{% /codetab %}} diff --git a/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md b/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md index 0aecc3224..209eda9d0 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md +++ b/daprdocs/content/en/developing-applications/building-blocks/state-management/howto-state-query-api.md @@ -96,7 +96,7 @@ docker run -d --rm -p 27017:27017 --name mongodb mongo:5 Next, start a Dapr application. Refer to the [component configuration file](../query-api-examples/components/mongodb/mongodb.yml), which instructs Dapr to use MongoDB as its state store. ```bash -dapr run --app-id demo --dapr-http-port 3500 --components-path query-api-examples/components/mongodb +dapr run --app-id demo --dapr-http-port 3500 --resources-path query-api-examples/components/mongodb ``` Populate the state store with the employee dataset, so you can query it later. diff --git a/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-dapr-extension.md b/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-dapr-extension.md index e80b80239..85dbfe828 100644 --- a/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-dapr-extension.md +++ b/daprdocs/content/en/developing-applications/local-development/ides/vscode/vscode-dapr-extension.md @@ -33,7 +33,7 @@ To create a dedicated components folder with the default `statestore`, `pubsub`, 1. Open your application directory in Visual Studio Code 2. Open the Command Palette with `Ctrl+Shift+P` 3. Select `Dapr: Scaffold Dapr Components` -4. Run your application with `dapr run --components-path ./components -- ...` +4. Run your application with `dapr run --resources-path ./components -- ...` ### View running Dapr applications diff --git a/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md index 5c3b8b491..4eef26f5c 100644 --- a/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/bindings-quickstart.md @@ -85,7 +85,7 @@ pip3 install -r requirements.txt Run the `batch-sdk` service alongside a Dapr sidecar. ```bash -dapr run --app-id batch-sdk --app-port 50051 --components-path ../../../components -- python3 app.py +dapr run --app-id batch-sdk --app-port 50051 --resources-path ../../../components -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -292,7 +292,7 @@ npm install Run the `batch-sdk` service alongside a Dapr sidecar. ```bash -dapr run --app-id batch-sdk --app-port 5002 --dapr-http-port 3500 --components-path ../../../components -- node index.js +dapr run --app-id batch-sdk --app-port 5002 --dapr-http-port 3500 --resources-path ../../../components -- node index.js ``` The code inside the `process_batch` function is executed every 10 seconds (defined in [`binding-cron.yaml`]({{< ref "#componentsbinding-cronyaml-component-file" >}}) in the `components` directory). The binding trigger looks for a route called via HTTP POST in your Flask application by the Dapr sidecar. @@ -495,7 +495,7 @@ dotnet build batch.csproj Run the `batch-sdk` service alongside a Dapr sidecar. ```bash -dapr run --app-id batch-sdk --app-port 7002 --components-path ../../../components -- dotnet run +dapr run --app-id batch-sdk --app-port 7002 --resources-path ../../../components -- dotnet run ``` The code inside the `process_batch` function is executed every 10 seconds (defined in [`binding-cron.yaml`]({{< ref "#componentsbinding-cronyaml-component-file" >}}) in the `components` directory). The binding trigger looks for a route called via HTTP POST in your Flask application by the Dapr sidecar. @@ -701,7 +701,7 @@ mvn clean install Run the `batch-sdk` service alongside a Dapr sidecar. ```bash -dapr run --app-id batch-sdk --app-port 8080 --components-path ../../../components -- java -jar target/BatchProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id batch-sdk --app-port 8080 --resources-path ../../../components -- java -jar target/BatchProcessingService-0.0.1-SNAPSHOT.jar ``` The code inside the `process_batch` function is executed every 10 seconds (defined in [`binding-cron.yaml`]({{< ref "#componentsbinding-cronyaml-component-file" >}}) in the `components` directory). The binding trigger looks for a route called via HTTP POST in your Flask application by the Dapr sidecar. @@ -908,7 +908,7 @@ go build . Run the `batch-sdk` service alongside a Dapr sidecar. ```bash -dapr run --app-id batch-sdk --app-port 6002 --dapr-http-port 3502 --dapr-grpc-port 60002 --components-path ../../../components -- go run . +dapr run --app-id batch-sdk --app-port 6002 --dapr-http-port 3502 --dapr-grpc-port 60002 --resources-path ../../../components -- go run . ``` The code inside the `process_batch` function is executed every 10 seconds (defined in [`binding-cron.yaml`]({{< ref "#componentsbinding-cronyaml-component-file" >}}) in the `components` directory). The binding trigger looks for a route called via HTTP POST in your Flask application by the Dapr sidecar. diff --git a/daprdocs/content/en/getting-started/quickstarts/pubsub-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/pubsub-quickstart.md index 33656b97e..cdc6b559d 100644 --- a/daprdocs/content/en/getting-started/quickstarts/pubsub-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/pubsub-quickstart.md @@ -56,7 +56,7 @@ pip3 install -r requirements.txt Run the `order-processor` subscriber service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ --app-port 5001 -- python3 app.py +dapr run --app-id order-processor --resources-path ../../../components/ --app-port 5001 -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -105,7 +105,7 @@ pip3 install -r requirements.txt Run the `checkout` publisher service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --components-path ../../../components/ -- python3 app.py +dapr run --app-id checkout --resources-path ../../../components/ -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -235,7 +235,7 @@ Verify you have the following files included in the service directory: Run the `order-processor` subscriber service alongside a Dapr sidecar. ```bash -dapr run --app-port 5001 --app-id order-processing --app-protocol http --dapr-http-port 3501 --components-path ../../../components -- npm run start +dapr run --app-port 5001 --app-id order-processing --app-protocol http --dapr-http-port 3501 --resources-path ../../../components -- npm run start ``` In the `order-processor` subscriber, we're subscribing to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. This enables your app code to talk to the Redis component instance through the Dapr sidecar. @@ -267,7 +267,7 @@ Verify you have the following files included in the service directory: Run the `checkout` publisher service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --app-protocol http --dapr-http-port 3500 --components-path ../../../components -- npm run start +dapr run --app-id checkout --app-protocol http --dapr-http-port 3500 --resources-path ../../../components -- npm run start ``` In the `checkout` publisher service, we're publishing the orderId message to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. As soon as the service starts, it publishes in a loop: @@ -389,7 +389,7 @@ dotnet build Run the `order-processor` subscriber service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components --app-port 7002 -- dotnet run +dapr run --app-id order-processor --resources-path ../../../components --app-port 7002 -- dotnet run ``` In the `order-processor` subscriber, we're subscribing to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. This enables your app code to talk to the Redis component instance through the Dapr sidecar. @@ -423,7 +423,7 @@ dotnet build Run the `checkout` publisher service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --components-path ../../../components -- dotnet run +dapr run --app-id checkout --resources-path ../../../components -- dotnet run ``` In the `checkout` publisher, we're publishing the orderId message to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. As soon as the service starts, it publishes in a loop: @@ -544,7 +544,7 @@ mvn clean install Run the `order-processor` subscriber service alongside a Dapr sidecar. ```bash -dapr run --app-port 8080 --app-id order-processor --components-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-port 8080 --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` In the `order-processor` subscriber, we're subscribing to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. This enables your app code to talk to the Redis component instance through the Dapr sidecar. @@ -582,7 +582,7 @@ mvn clean install Run the `checkout` publisher service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --components-path ../../../components -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar +dapr run --app-id checkout --resources-path ../../../components -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar ``` In the `checkout` publisher, we're publishing the orderId message to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. As soon as the service starts, it publishes in a loop: @@ -706,7 +706,7 @@ go build . Run the `order-processor` subscriber service alongside a Dapr sidecar. ```bash -dapr run --app-port 6002 --app-id order-processor-sdk --app-protocol http --dapr-http-port 3501 --components-path ../../../components -- go run . +dapr run --app-port 6002 --app-id order-processor-sdk --app-protocol http --dapr-http-port 3501 --resources-path ../../../components -- go run . ``` In the `order-processor` subscriber, we're subscribing to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. This enables your app code to talk to the Redis component instance through the Dapr sidecar. @@ -736,7 +736,7 @@ go build . Run the `checkout` publisher service alongside a Dapr sidecar. ```bash -dapr run --app-id checkout --app-protocol http --dapr-http-port 3500 --components-path ../../../components -- go run . +dapr run --app-id checkout --app-protocol http --dapr-http-port 3500 --resources-path ../../../components -- go run . ``` In the `checkout` publisher, we're publishing the orderId message to the Redis instance called `orderpubsub` [(as defined in the `pubsub.yaml` component)]({{< ref "#pubsubyaml-component-file" >}}) and topic `orders`. As soon as the service starts, it publishes in a loop: diff --git a/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md index 42772e58d..12f3fc51c 100644 --- a/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md @@ -55,7 +55,7 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- python3 app.py +dapr run --app-id order-processor --resources-path ../../../components/ -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -164,7 +164,7 @@ npm install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- npm start +dapr run --app-id order-processor --resources-path ../../../components/ -- npm start ``` #### Behind the scenes @@ -278,7 +278,7 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- dotnet run +dapr run --app-id order-processor --resources-path ../../../components/ -- dotnet run ``` #### Behind the scenes @@ -389,7 +389,7 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --resources-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` #### Behind the scenes @@ -494,7 +494,7 @@ go build . Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- go run . +dapr run --app-id order-processor --resources-path ../../../components/ -- go run . ``` #### Behind the scenes diff --git a/daprdocs/content/en/getting-started/quickstarts/statemanagement-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/statemanagement-quickstart.md index 97a3051d4..b1c75fd07 100644 --- a/daprdocs/content/en/getting-started/quickstarts/statemanagement-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/statemanagement-quickstart.md @@ -51,7 +51,7 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- python3 app.py +dapr run --app-id order-processor --resources-path ../../../components/ -- python3 app.py ``` > **Note**: Since Python3.exe is not defined in Windows, you may need to use `python app.py` instead of `python3 app.py`. @@ -172,7 +172,7 @@ Verify you have the following files included in the service directory: Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- npm run start +dapr run --app-id order-processor --resources-path ../../../components/ -- npm run start ``` The `order-processor` service writes, reads, and deletes an `orderId` key/value pair to the `statestore` instance [defined in the `statestore.yaml` component]({{< ref "#statestoreyaml-component-file" >}}). As soon as the service starts, it performs a loop. @@ -300,7 +300,7 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components/ -- dotnet run +dapr run --app-id order-processor --resources-path ../../../components/ -- dotnet run ``` The `order-processor` service writes, reads, and deletes an `orderId` key/value pair to the `statestore` instance [defined in the `statestore.yaml` component]({{< ref "#statestoreyaml-component-file" >}}). As soon as the service starts, it performs a loop. @@ -419,7 +419,7 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --resources-path ../../../components -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` The `order-processor` service writes, reads, and deletes an `orderId` key/value pair to the `statestore` instance [defined in the `statestore.yaml` component]({{< ref "#statestoreyaml-component-file" >}}). As soon as the service starts, it performs a loop. @@ -538,7 +538,7 @@ go build . Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --components-path ../../../components -- go run . +dapr run --app-id order-processor --resources-path ../../../components -- go run . ``` The `order-processor` service writes, reads, and deletes an `orderId` key/value pair to the `statestore` instance [defined in the `statestore.yaml` component]({{< ref "#statestoreyaml-component-file" >}}). As soon as the service starts, it performs a loop. diff --git a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md index 49d2522c2..13c86ea49 100644 --- a/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md +++ b/daprdocs/content/en/getting-started/tutorials/configure-state-pubsub.md @@ -317,9 +317,9 @@ When you run `dapr init`, Dapr creates a default redis `pubsub.yaml` on your loc For new component files: 1. Create a new `components` directory in your app folder containing the YAML files. -1. Provide the path to the `dapr run` command with the flag `--components-path` +1. Provide the path to the `dapr run` command with the flag `--resources-path` -If you initialized Dapr in [slim mode]({{< ref self-hosted-no-docker.md >}}) (without Docker), you need to manually create the default directory, or always specify a components directory using `--components-path`. +If you initialized Dapr in [slim mode]({{< ref self-hosted-no-docker.md >}}) (without Docker), you need to manually create the default directory, or always specify a components directory using `--resources-path`. {{% /codetab %}} diff --git a/daprdocs/content/en/getting-started/tutorials/get-started-component.md b/daprdocs/content/en/getting-started/tutorials/get-started-component.md index 79ab0f635..9f5d6f6bc 100644 --- a/daprdocs/content/en/getting-started/tutorials/get-started-component.md +++ b/daprdocs/content/en/getting-started/tutorials/get-started-component.md @@ -65,7 +65,7 @@ In the above file definition: Launch a Dapr sidecar that will listen on port 3500 for a blank application named `myapp`: ```bash -dapr run --app-id myapp --dapr-http-port 3500 --components-path ./my-components +dapr run --app-id myapp --dapr-http-port 3500 --resources-path ./my-components ``` {{% alert title="Tip" color="primary" %}} diff --git a/daprdocs/content/en/operations/components/setup-bindings.md b/daprdocs/content/en/operations/components/setup-bindings.md index 3af31760c..44d762dd6 100644 --- a/daprdocs/content/en/operations/components/setup-bindings.md +++ b/daprdocs/content/en/operations/components/setup-bindings.md @@ -62,7 +62,7 @@ Once you have created the component's YAML file, follow these instructions to ap {{< tabs "Self-Hosted" "Kubernetes" >}} {{% codetab %}} -To run locally, create a `components` dir containing the YAML file and provide the path to the `dapr run` command with the flag `--components-path`. +To run locally, create a `components` dir containing the YAML file and provide the path to the `dapr run` command with the flag `--resources-path`. {{% /codetab %}} {{% codetab %}} diff --git a/daprdocs/content/en/operations/components/setup-secret-store.md b/daprdocs/content/en/operations/components/setup-secret-store.md index bd4190c2a..001595325 100644 --- a/daprdocs/content/en/operations/components/setup-secret-store.md +++ b/daprdocs/content/en/operations/components/setup-secret-store.md @@ -65,7 +65,7 @@ Once you have created the component's YAML file, follow these instructions to ap {{< tabs "Self-Hosted" "Kubernetes" >}} {{% codetab %}} -To run locally, create a `components` dir containing the YAML file and provide the path to the `dapr run` command with the flag `--components-path`. +To run locally, create a `components` dir containing the YAML file and provide the path to the `dapr run` command with the flag `--resources-path`. {{% /codetab %}} {{% codetab %}} diff --git a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-with-docker.md b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-with-docker.md index 503bd039d..3211ac08c 100644 --- a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-with-docker.md +++ b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-with-docker.md @@ -123,10 +123,10 @@ services: "--app-id", "nodeapp", "--app-port", "3000", "--placement-host-address", "placement:50006", # Dapr's placement service can be reach via the docker DNS entry - "--components-path", "./components" + "--resources-path", "./components" ] volumes: - - "./components/:/components" # Mount our components folder for the runtime to use. The mounted location must match the --components-path argument. + - "./components/:/components" # Mount our components folder for the runtime to use. The mounted location must match the --resources-path argument. depends_on: - nodeapp network_mode: "service:nodeapp" # Attach the nodeapp-dapr service to the nodeapp network namespace diff --git a/daprdocs/content/en/operations/monitoring/logging/logs.md b/daprdocs/content/en/operations/monitoring/logging/logs.md index 86fc9c523..c8b6442a7 100644 --- a/daprdocs/content/en/operations/monitoring/logging/logs.md +++ b/daprdocs/content/en/operations/monitoring/logging/logs.md @@ -58,7 +58,7 @@ When using the Dapr CLI to run an application, pass the `--log-as-json` option t ```sh dapr run \ --app-id orderprocessing \ - --components-path ./components/ \ + --resources-path ./components/ \ --log-as-json \ -- python3 OrderProcessingService.py ``` diff --git a/daprdocs/content/en/operations/troubleshooting/common_issues.md b/daprdocs/content/en/operations/troubleshooting/common_issues.md index 59bad856a..eedbcb601 100644 --- a/daprdocs/content/en/operations/troubleshooting/common_issues.md +++ b/daprdocs/content/en/operations/troubleshooting/common_issues.md @@ -225,7 +225,7 @@ export DAPR_HOST_IP=127.0.0.1 This is usually due to one of the following issues - You may have defined the `NAMESPACE` environment variable locally or deployed your components into a different namespace in Kubernetes. Check which namespace your app and the components are deployed to. Read [scoping components to one or more applications]({{< ref "component-scopes.md" >}}) for more information. -- You may have not provided a `--components-path` with the Dapr `run` commands or not placed your components into the default components folder for your OS. Read [define a component]({{< ref "get-started-component.md" >}}) for more information. +- You may have not provided a `--resources-path` with the Dapr `run` commands or not placed your components into the default components folder for your OS. Read [define a component]({{< ref "get-started-component.md" >}}) for more information. - You may have a syntax issue in component YAML file. Check your component YAML with the component [YAML samples]({{< ref "components.md" >}}). ## Service invocation is failing and my Dapr service is missing an appId (macOS) diff --git a/daprdocs/content/en/reference/arguments-annotations-overview.md b/daprdocs/content/en/reference/arguments-annotations-overview.md index 90acd19ef..5af0a4ed4 100644 --- a/daprdocs/content/en/reference/arguments-annotations-overview.md +++ b/daprdocs/content/en/reference/arguments-annotations-overview.md @@ -16,7 +16,8 @@ This table is meant to help users understand the equivalent options for running | `--app-id` | `--app-id` | `-i` | `dapr.io/app-id` | The unique ID of the application. Used for service discovery, state encapsulation and the pub/sub consumer ID | | `--app-port` | `--app-port` | `-p` | `dapr.io/app-port` | This parameter tells Dapr which port your application is listening on | | `--app-ssl` | `--app-ssl` | | `dapr.io/app-ssl` | Sets the URI scheme of the app to https and attempts an SSL connection | -| `--components-path` | `--components-path` | `-d` | not supported | Path for components directory. If empty, components will not be loaded. | +| `--components-path` | `--components-path` | `-d` | not supported | **Deprecated** in favor of `--resources-path` | +| `--resources-path` | `--resources-path` | `-d` | not supported | Path for components directory. If empty, components will not be loaded. | | `--config` | `--config` | `-c` | `dapr.io/config` | Tells Dapr which Configuration CRD to use | | `--control-plane-address` | not supported | | not supported | Address for a Dapr control plane | | `--dapr-grpc-port` | `--dapr-grpc-port` | | not supported | gRPC port for the Dapr API to listen on (default "50001") | diff --git a/daprdocs/content/en/reference/cli/dapr-run.md b/daprdocs/content/en/reference/cli/dapr-run.md index ef03ae703..995211012 100644 --- a/daprdocs/content/en/reference/cli/dapr-run.md +++ b/daprdocs/content/en/reference/cli/dapr-run.md @@ -28,7 +28,8 @@ dapr run [flags] [command] | `--app-port`, `-p` | `APP_PORT` | | The port your application is listening on | | `--app-protocol`, `-P` | | `http` | The protocol Dapr uses to talk to the application. Valid values are: `http` or `grpc` | | `--app-ssl` | | `false` | Enable https when Dapr invokes the application | -| `--components-path`, `-d` | | Linux/Mac: `$HOME/.dapr/components`
    Windows: `%USERPROFILE%\.dapr\components` | The path for components directory | +| `--components-path`, `-d` | | Linux/Mac: `$HOME/.dapr/components`
    Windows: `%USERPROFILE%\.dapr\components` | **Deprecated** in favor of `--resources-path` | +| `--resources-path`, `-d` | | Linux/Mac: `$HOME/.dapr/components`
    Windows: `%USERPROFILE%\.dapr\components` | The path for components directory | | `--config`, `-c` | | Linux/Mac: `$HOME/.dapr/config.yaml`
    Windows: `%USERPROFILE%\.dapr\config.yaml` | Dapr configuration file | | `--dapr-grpc-port` | `DAPR_GRPC_PORT` | `50001` | The gRPC port for Dapr to listen on | | `--dapr-http-port` | `DAPR_HTTP_PORT` | `3500` | The HTTP port for Dapr to listen on | diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-blobstorage.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-blobstorage.md index aadc6a5de..f4922097c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-blobstorage.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-blobstorage.md @@ -133,7 +133,7 @@ kubectl apply -f azureblob.yaml ### Running locally -To run locally, create a `components` dir containing the YAML file and provide the path to the `dapr run` command with the flag `--components-path`. +To run locally, create a `components` dir containing the YAML file and provide the path to the `dapr run` command with the flag `--resources-path`. This state store creates a blob file in the container and puts raw state inside it. diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md index 12c4de8da..d19c817d3 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md @@ -360,7 +360,7 @@ Memory Store does not support modules and cannot be used with query. Next is to start a Dapr application. Refer to this [component configuration file](../../../../developing-applications/building-blocks/state-management/query-api-examples/components/redis/redis.yml), which contains query indexing schemas. Make sure to modify the `redisHost` to reflect the local forwarding port which `redislabs/rejson` uses. ```bash -dapr run --app-id demo --dapr-http-port 3500 --components-path query-api-examples/components/redis +dapr run --app-id demo --dapr-http-port 3500 --resources-path query-api-examples/components/redis ``` Now populate the state store with the employee dataset, so you can then query it later. From 089814c38c18f0cf4c2a5a294205a2b433e119b3 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Thu, 19 Jan 2023 18:21:10 -0600 Subject: [PATCH 100/116] Adding Solace PubSub Component Docs Signed-off-by: TKTheTechie --- .../supported-pubsub/setup-solace-amqp.md | 108 ++++++++++++++++++ daprdocs/data/components/pubsub/generic.yaml | 5 + 2 files changed, 113 insertions(+) create mode 100644 daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md new file mode 100644 index 000000000..13c9fd1e9 --- /dev/null +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -0,0 +1,108 @@ +--- +type: docs +title: "Solace-AMQP" +linkTitle: "Solace-AMQP" +description: "Detailed documentation on the Solace-AMQP pubsub component" +aliases: + - "/operations/components/setup-pubsub/supported-pubsub/setup-solace-amqp/" +--- + +## Component format + +To setup Solace-AMQP pubsub create a component of type `pubsub.solace.amqp`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: solace +spec: + type: pubsub.solace.amqp + version: v1 + metadata: + - name: url + value: 'amqp://localhost:5672' + - name: username + value: 'default' + - name: password + value: 'default' +``` + +{{% alert title="Warning" color="warning" %}} +The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). +{{% /alert %}} + +## Spec metadata fields + +| Field | Required | Details | Example | +|--------------------|:--------:|---------|---------| +| url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
    Use the **`amqp://`** URI scheme for non-TLS communication.
    Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` +| username | Y | The user name to connect to the broker with. Only required if anonymous is not specified or set to false | default +| password | Y | The password to connect to the broker with. Only required if anonymous is not specified or set to false. | default +| anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true +| caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` +| clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` +| clientKey | Required for using TLS | TLS client key in PEM format. Must be used with `clientCert`. Can be `secretKeyRef` to use a secret reference. | `"-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----"` + +### Communication using TLS + +To configure communication using TLS, ensure that the Solace broker is configured to support certificates and provide the `caCert`, `clientCert`, `clientKey` metadata in the component configuration. For example: + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: solace +spec: + type: pubsub.solace.amqp + version: v1 + metadata: + - name: url + value: "amqps://host.domain[:port]" + - name: username + value: 'default' + - name: password + value: 'default' + - name: caCert + value: ${{ myLoadedCACert }} + - name: clientCert + value: ${{ myLoadedClientCert }} + - name: clientKey + secretKeyRef: + name: mySolaceClientKey + key: mySolaceClientKey +auth: + secretStore: +``` + +Note that while the `caCert` and `clientCert` values may not be secrets, they can be referenced from a Dapr secret store as well for convenience. + +### Publishing/subscribing to topics and queues + +By default, messages are published and subscribed over topics. If you would like your destination to be a queue - prefix the topic with `queue:` and the Solace AMQP component will connect to a queue. + +## Create a Solace broker + +{{< tabs "Self-Hosted" "SaaS">}} + +{{% codetab %}} +You can run a Solace broker [locally using Docker](https://hub.docker.com/r/solace/solace-pubsub-standard): + +```bash +docker run -d -p 8080:8080 -p 55554:55555 -p 8008:8008 -p 1883:1883 -p 8000:8000 -p 5672:5672 -p 9000:9000 -p 2222:2222 --shm-size=2g --env username_admin_globalaccesslevel=admin --env username_admin_password=admin --name=solace solace/solace-pubsub-standard +``` + +You can then interact with the server using the client port: `mqtt://localhost:5672` +{{% /codetab %}} + +{{% codetab %}} +You can also sign up for a free SaaS broker on [Solace Cloud](https://console.solace.cloud/login/new-account?product=event-streaming) +{{% /codetab %}} + +{{< /tabs >}} + +## Related links + +- [Basic schema for a Dapr component]({{< ref component-schema >}}) +- Read [this guide]({{< ref "howto-publish-subscribe.md#step-2-publish-a-topic" >}}) for instructions on configuring pub/sub components +- [Pub/Sub building block]({{< ref pubsub >}}) \ No newline at end of file diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index 58fde998f..b844b3fdc 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -48,3 +48,8 @@ state: Alpha version: v1 since: "1.8" +- component: Solace-AMQP + link: setup-solace-amqp + state: Alpha + version: v1 + since: "1.10" From 5c2c449cc3a8e7c05f0cddd1f56a6ae3d9750f8e Mon Sep 17 00:00:00 2001 From: Filinto Duran Date: Fri, 20 Jan 2023 23:25:19 -0600 Subject: [PATCH 101/116] add information about needed ports for kube api to reach (#3078) * add information about needed ports for kube api to reach Signed-off-by: Filinto Duran * correct identation of next paragraph Signed-off-by: Filinto Duran --- .../troubleshooting/common_issues.md | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/daprdocs/content/en/operations/troubleshooting/common_issues.md b/daprdocs/content/en/operations/troubleshooting/common_issues.md index 59bad856a..02d39fd50 100644 --- a/daprdocs/content/en/operations/troubleshooting/common_issues.md +++ b/daprdocs/content/en/operations/troubleshooting/common_issues.md @@ -50,45 +50,54 @@ spec: imagePullPolicy: Always ``` -If your pod spec template is annotated correctly and you still don't see the sidecar injected, make sure Dapr was deployed to the cluster before your deployment or pod were deployed. +There are some known cases where this might not properly work: -If this is the case, restarting the pods will fix the issue. +- If your pod spec template is annotated correctly, and you still don't see the sidecar injected, make sure Dapr was deployed to the cluster before your deployment or pod were deployed. -If you are deploying Dapr on a private GKE cluster, sidecar injection does not work without extra steps. See [Setup a Google Kubernetes Engine cluster]({{< ref setup-gke.md >}}). + If this is the case, restarting the pods will fix the issue. -In order to further diagnose any issue, check the logs of the Dapr sidecar injector: +- If you are deploying Dapr on a private GKE cluster, sidecar injection does not work without extra steps. See [Setup a Google Kubernetes Engine cluster]({{< ref setup-gke.md >}}). -```bash - kubectl logs -l app=dapr-sidecar-injector -n dapr-system -``` + In order to further diagnose any issue, check the logs of the Dapr sidecar injector: -*Note: If you installed Dapr to a different namespace, replace dapr-system above with the desired namespace* + ```bash + kubectl logs -l app=dapr-sidecar-injector -n dapr-system + ``` -If you are deploying Dapr on Amazon EKS and using an overlay network such as Calico, you will need to set `hostNetwork` parameter to true, this is a limitation of EKS with such CNIs. + *Note: If you installed Dapr to a different namespace, replace dapr-system above with the desired namespace* -You can set this parameter using Helm `values.yaml` file: +- If you are deploying Dapr on Amazon EKS and using an overlay network such as Calico, you will need to set `hostNetwork` parameter to true, this is a limitation of EKS with such CNIs. -``` -helm upgrade --install dapr dapr/dapr \ + You can set this parameter using Helm `values.yaml` file: + + ``` + helm upgrade --install dapr dapr/dapr \ --namespace dapr-system \ --create-namespace \ --values values.yaml -``` + ``` -`values.yaml` -```yaml -dapr_sidecar_injector: - hostNetwork: true -``` + `values.yaml` + ```yaml + dapr_sidecar_injector: + hostNetwork: true + ``` -or using command line: + or using command line: -``` -helm upgrade --install dapr dapr/dapr \ + ``` + helm upgrade --install dapr dapr/dapr \ --namespace dapr-system \ --create-namespace \ --set dapr_sidecar_injector.hostNetwork=true -``` + ``` + +- Make sure the kube api server can reach the following webhooks services: + - [Sidecar Mutating Webhook Injector Service](https://github.com/dapr/dapr/blob/44235fe8e8799589bb393a3124d2564db2dd6885/charts/dapr/charts/dapr_sidecar_injector/templates/dapr_sidecar_injector_deployment.yaml#L157) at port __4000__ that is served from the sidecar injector. + - [CRD Conversion Webhook Service](https://github.com/dapr/dapr/blob/44235fe8e8799589bb393a3124d2564db2dd6885/charts/dapr/charts/dapr_operator/templates/dapr_operator_service.yaml#L28) at port __19443__ that is served from the operator. + + Check with your cluster administrators to setup allow ingress + rules to the above ports, __4000__ and __19443__, in the cluster from the kube api servers. ## My pod is in CrashLoopBackoff or another failed state due to the daprd sidecar From 11f90b03bdfdae01a72ce4d2274466f25b9bb0e2 Mon Sep 17 00:00:00 2001 From: Tomasz Pietrek Date: Sun, 22 Jan 2023 01:48:05 +0100 Subject: [PATCH 102/116] Add docs for domain and api prefix (#3040) Signed-off-by: Tomasz Pietrek Signed-off-by: Tomasz Pietrek --- .../supported-pubsub/setup-jetstream.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md index d2ac9122f..815430fd7 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md @@ -68,6 +68,10 @@ spec: value: explicit - name: deliverPolicy value: all + - name: domain + value: hub + - name: apiPrefix + value: PREFIX ``` ## Spec metadata fields @@ -97,6 +101,8 @@ spec: | hearbeat | N | [Hearbeat] | `10s` | | ackPolicy | N | [Ack Policy] | `explicit` | | deliverPolicy | N | One of: all, last, new, sequence, time | `all` | +| domain | N | [JetStream Leafondes] | `HUB` | +| apiPrefix | N | [JetStream Leafnodes] | `PREFIX` | ## Create a NATS server @@ -162,5 +168,6 @@ nats -s localhost:4222 stream add myStream --subjects mySubject [Rate Limit]: https://docs.nats.io/jetstream/concepts/consumers#ratelimit [Hearbeat]: https://docs.nats.io/jetstream/concepts/consumers#hearbeat [Ack Policy]: https://docs.nats.io/nats-concepts/jetstream/consumers#ackpolicy +[JetStream Leafonodes]: https://docs.nats.io/running-a-nats-service/configuration/leafnodes/jetstream_leafnodes [Decentralized JWT Authentication/Authorization]: https://docs.nats.io/running-a-nats-service/configuration/securing_nats/auth_intro/jwt [NATS token based authentication]: https://docs.nats.io/running-a-nats-service/configuration/securing_nats/auth_intro/tokens From b445c0314bff04607ebeff21abc356158b3074be Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 23 Jan 2023 18:37:29 -0800 Subject: [PATCH 103/116] Docs for logging options in the Configuration spec (#3034) See dapr/dapr#5462 Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../configuration/configuration-overview.md | 31 ++++++++++++++--- .../en/operations/monitoring/logging/logs.md | 4 ++- .../api-logs-troubleshooting.md | 34 +++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/operations/configuration/configuration-overview.md b/daprdocs/content/en/operations/configuration/configuration-overview.md index 75bd9517d..6edfa5b84 100644 --- a/daprdocs/content/en/operations/configuration/configuration-overview.md +++ b/daprdocs/content/en/operations/configuration/configuration-overview.md @@ -48,6 +48,7 @@ The following configuration settings can be applied to Dapr application sidecars - [Tracing](#tracing) - [Metrics](#metrics) +- [Logging](#logging) - [Middleware](#middleware) - [Scope secret store access](#scope-secret-store-access) - [Access Control allow lists for building block APIs](#access-control-allow-lists-for-building-block-apis) @@ -85,7 +86,7 @@ The following table lists the properties for tracing: `samplingRate` is used to enable or disable the tracing. To disable the sampling rate , set `samplingRate : "0"` in the configuration. The valid range of samplingRate is between 0 and 1 inclusive. The sampling rate determines whether a trace span should be sampled or not based on value. `samplingRate : "1"` samples all traces. By default, the sampling rate is (0.0001) or 1 in 10,000 traces. -See [Observability distributed tracing]({{< ref "tracing-overview.md" >}}) for more information +See [Observability distributed tracing]({{< ref "tracing-overview.md" >}}) for more information. #### Metrics @@ -104,7 +105,29 @@ The following table lists the properties for metrics: |--------------|--------|-------------| | `enabled` | boolean | Whether metrics should to be enabled. -See [metrics documentation]({{< ref "metrics-overview.md" >}}) for more information +See [metrics documentation]({{< ref "metrics-overview.md" >}}) for more information. + +#### Logging + +The logging section can be used to configure how logging works in the Dapr Runtime. + +The `logging` section under the `Configuration` spec contains the following properties: + +```yml +logging: + apiLogging: + enabled: false + omitHealthChecks: false +``` + +The following table lists the properties for logging: + +| Property | Type | Description | +|--------------|--------|-------------| +| `apiLogging.enabled` | boolean | The default value for the `--enable-api-logging` flag for `daprd` (and the corresponding `dapr.io/enable-api-logging` annotation): the value set in the Configuration spec is used as default unless a `true` or `false` value is passed to each Dapr Runtime. Default: `false`. +| `apiLogging.omitHealthChecks` | boolean | If `true`, calls to health check endpoints (e.g. `/v1.0/healthz`) are not logged when API logging is enabled. This is useful if those calls are adding a lot of noise in your logs. Default: `false` + +See [logging documentation]({{< ref "logs.md" >}}) for more information. #### Middleware @@ -130,8 +153,8 @@ The following table lists the properties for HTTP handlers: | Property | Type | Description | |----------|--------|-------------| -| name | string | Name of the middleware component -| type | string | Type of middleware component +| `name` | string | Name of the middleware component +| `type` | string | Type of middleware component See [Middleware pipelines]({{< ref "middleware.md" >}}) for more information diff --git a/daprdocs/content/en/operations/monitoring/logging/logs.md b/daprdocs/content/en/operations/monitoring/logging/logs.md index c8b6442a7..397588b69 100644 --- a/daprdocs/content/en/operations/monitoring/logging/logs.md +++ b/daprdocs/content/en/operations/monitoring/logging/logs.md @@ -109,7 +109,9 @@ spec: ## API Logging -API logging enables you to see the API calls your application makes to the Dapr sidecar, to debug issues or monitor the behavior of your application. You can combine both Dapr API logging with Dapr log events. See [configure and view Dapr Logs]({{< ref "logs-troubleshooting.md" >}}) and [configure and view Dapr API Logs]({{< ref "api-logs-troubleshooting.md" >}}) for more information. +API logging enables you to see the API calls your application makes to the Dapr sidecar, to debug issues or monitor the behavior of your application. You can combine both Dapr API logging with Dapr log events. + +See [configure and view Dapr Logs]({{< ref "logs-troubleshooting.md" >}}) and [configure and view Dapr API Logs]({{< ref "api-logs-troubleshooting.md" >}}) for more information. ## Log collectors diff --git a/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md b/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md index 4d8abc7a5..6d124098d 100644 --- a/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md +++ b/daprdocs/content/en/operations/troubleshooting/api-logs-troubleshooting.md @@ -77,3 +77,37 @@ time="2022-03-16T18:32:02.917629403Z" level=info msg="HTTP API Called" method="P time="2022-03-16T18:32:03.137830112Z" level=info msg="HTTP API Called" method="POST /v1.0/invoke/{id}/method/{method:*}" app_id=invoke-caller instance=invokecaller-f4f949886-cbnmt scope=dapr.runtime.http-info type=log useragent=Go-http-client/1.1 ver=edge time="2022-03-16T18:32:03.359097916Z" level=info msg="HTTP API Called" method="POST /v1.0/invoke/{id}/method/{method:*}" app_id=invoke-caller instance=invokecaller-f4f949886-cbnmt scope=dapr.runtime.http-info type=log useragent=Go-http-client/1.1 ver=edge ``` + +## API logging configuration + +Using the [Dapr Configuration spec]({{< ref "configuration-overview.md" >}}#sidecar-configuration), you can configure the default behavior of API logging in Dapr runtimes. + +### Enable API logging by default + +Using the Dapr Configuration spec, you can set the default value for the `--enable-api-logging` flag (and the correspondent annotation when running on Kubernetes), with the `logging.apiLogging.enabled` option. This value applies to all Dapr runtimes that reference the Configuration document or resource in which it's defined. + +- If `logging.apiLogging.enabled` is set to `false`, the default value, API logging is disabled for Dapr runtimes unless `--enable-api-logging` is set to `true` (or the `dapr.io/enable-api-logging: true` annotation is added). +- When `logging.apiLogging.enabled` is `true`, Dapr runtimes have API logging enabled by default, and it can be disabled by setting +`--enable-api-logging=false` or with the `dapr.io/enable-api-logging: false` annotation. + +For example: + +```yaml +logging: + apiLogging: + enabled: true +``` + +### Omit health checks from API logging + +When API logging is enabled, all calls to the Dapr API server are logged, including those to health check endpoints (e.g. `/v1.0/healthz`). Depending on your environment, this may generate multiple log lines per minute and could create unwanted noise. + +You can configure Dapr to not log calls to health check endpoints when API logging is enabled using the Dapr Configuration spec, by setting `logging.apiLogging.omitHealthChecks: true`. The default value is `false`, which means that health checks calls are logged in the API logs. + +For example: + +```yaml +logging: + apiLogging: + omitHealthChecks: true +``` From e93d700a83bc5c38d5df13ead0c2e7cbe1faff6b Mon Sep 17 00:00:00 2001 From: "Alessandro (Ale) Segala" <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 23 Jan 2023 20:20:45 -0800 Subject: [PATCH 104/116] Rename mqtt components to mqtt3 (#3059) See https://github.com/dapr/components-contrib/issues/2359 The old component names are still available as aliases Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../operations/components/component-schema.md | 4 ++-- .../supported-bindings/{mqtt.md => mqtt3.md} | 15 ++++++++------- .../{setup-mqtt.md => setup-mqtt3.md} | 19 ++++++++++--------- .../data/components/bindings/generic.yaml | 4 ++-- daprdocs/data/components/pubsub/generic.yaml | 4 ++-- 5 files changed, 24 insertions(+), 22 deletions(-) rename daprdocs/content/en/reference/components-reference/supported-bindings/{mqtt.md => mqtt3.md} (93%) rename daprdocs/content/en/reference/components-reference/supported-pubsub/{setup-mqtt.md => setup-mqtt3.md} (92%) diff --git a/daprdocs/content/en/operations/components/component-schema.md b/daprdocs/content/en/operations/components/component-schema.md index 0e4ab7822..d87ac4017 100644 --- a/daprdocs/content/en/operations/components/component-schema.md +++ b/daprdocs/content/en/operations/components/component-schema.md @@ -44,7 +44,7 @@ spec: ### Special metadata values -Metadata values can contain a `{uuid}` tag that is replaced with a randomly generate UUID when the Dapr sidecar starts up. A new UUID is generated on every start up. It can be used, for example, to have a pod on Kubernetes with multiple application instances consuming a [shared MQTT subscription]({{< ref "setup-mqtt.md" >}}). Below is an example of using the `{uuid}` tag. +Metadata values can contain a `{uuid}` tag that is replaced with a randomly generate UUID when the Dapr sidecar starts up. A new UUID is generated on every start up. It can be used, for example, to have a pod on Kubernetes with multiple application instances consuming a [shared MQTT subscription]({{< ref "setup-mqtt3.md" >}}). Below is an example of using the `{uuid}` tag. ```yaml apiVersion: dapr.io/v1alpha1 @@ -52,7 +52,7 @@ kind: Component metadata: name: messagebus spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: consumerID diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt.md b/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt3.md similarity index 93% rename from daprdocs/content/en/reference/components-reference/supported-bindings/mqtt.md rename to daprdocs/content/en/reference/components-reference/supported-bindings/mqtt3.md index 17a6cecaf..9e4824d83 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/mqtt3.md @@ -1,15 +1,16 @@ --- type: docs -title: "MQTT binding spec" -linkTitle: "MQTT" -description: "Detailed documentation on the MQTT binding component" +title: "MQTT3 binding spec" +linkTitle: "MQTT3" +description: "Detailed documentation on the MQTT3 binding component" aliases: + - "/operations/components/setup-bindings/supported-bindings/mqtt3/" - "/operations/components/setup-bindings/supported-bindings/mqtt/" --- ## Component format -To setup MQTT binding create a component of type `bindings.mqtt`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. +To setup a MQTT3 binding create a component of type `bindings.mqtt3`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a binding configuration. ```yaml apiVersion: dapr.io/v1alpha1 @@ -17,7 +18,7 @@ kind: Component metadata: name: spec: - type: bindings.mqtt + type: bindings.mqtt3 version: v1 metadata: - name: url @@ -63,7 +64,7 @@ kind: Component metadata: name: mqtt-binding spec: - type: bindings.mqtt + type: bindings.mqtt3 version: v1 metadata: - name: url @@ -103,7 +104,7 @@ metadata: name: mqtt-binding namespace: default spec: - type: bindings.mqtt + type: bindings.mqtt3 version: v1 metadata: - name: consumerID diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt3.md similarity index 92% rename from daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md rename to daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt3.md index 1fbfa6105..abcb08314 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt3.md @@ -1,15 +1,16 @@ --- type: docs -title: "MQTT" -linkTitle: "MQTT" -description: "Detailed documentation on the MQTT pubsub component" +title: "MQTT3" +linkTitle: "MQTT3" +description: "Detailed documentation on the MQTT3 pubsub component" aliases: + - "/operations/components/setup-pubsub/supported-pubsub/setup-mqtt3/" - "/operations/components/setup-pubsub/supported-pubsub/setup-mqtt/" --- ## Component format -To setup MQTT pubsub create a component of type `pubsub.mqtt`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration +To setup a MQTT3 pubsub create a component of type `pubsub.mqtt3`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration ```yaml apiVersion: dapr.io/v1alpha1 @@ -17,7 +18,7 @@ kind: Component metadata: name: mqtt-pubsub spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: url @@ -59,7 +60,7 @@ kind: Component metadata: name: mqtt-pubsub spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: url @@ -96,7 +97,7 @@ kind: Component metadata: name: mqtt-pubsub spec: - type: pubsub.mqtt + type: pubsub.mqtt3 version: v1 metadata: - name: consumerID @@ -119,7 +120,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr Note that in the case, the value of the consumer ID is random every time Dapr restarts, so we are setting `cleanSession` to true as well. -## Create a MQTT broker +## Create a MQTT3 broker {{< tabs "Self-Hosted" "Kubernetes">}} @@ -134,7 +135,7 @@ You can then interact with the server using the client port: `mqtt://localhost:1 {{% /codetab %}} {{% codetab %}} -You can run a MQTT broker in kubernetes using following yaml: +You can run a MQTT3 broker in kubernetes using following yaml: ```yaml apiVersion: apps/v1 diff --git a/daprdocs/data/components/bindings/generic.yaml b/daprdocs/data/components/bindings/generic.yaml index 4cbd411bb..c093d9bb2 100644 --- a/daprdocs/data/components/bindings/generic.yaml +++ b/daprdocs/data/components/bindings/generic.yaml @@ -54,8 +54,8 @@ features: input: false output: true -- component: MQTT - link: mqtt +- component: MQTT3 + link: mqtt3 state: Beta version: v1 since: "1.7" diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index 58fde998f..dc76618e4 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -28,8 +28,8 @@ state: Beta version: v1 since: "1.7" -- component: MQTT - link: setup-mqtt +- component: MQTT3 + link: setup-mqtt3 state: Stable version: v1 since: "1.7" From d6ce7c1d621dbe222d6a69212fcb45bc487583a1 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:07 -0500 Subject: [PATCH 105/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 13c9fd1e9..a3d0e955c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -9,7 +9,7 @@ aliases: ## Component format -To setup Solace-AMQP pubsub create a component of type `pubsub.solace.amqp`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration +To setup Solace-AMQP pub/sub, create a component of type `pubsub.solace.amqp`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pub/sub configuration. ```yaml apiVersion: dapr.io/v1alpha1 From e33e454b5f2e348d7e4482dfbd872f9d4acee202 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:32 -0500 Subject: [PATCH 106/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index a3d0e955c..b6ebf90e1 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -37,7 +37,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | Field | Required | Details | Example | |--------------------|:--------:|---------|---------| | url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
    Use the **`amqp://`** URI scheme for non-TLS communication.
    Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` -| username | Y | The user name to connect to the broker with. Only required if anonymous is not specified or set to false | default +| username | Y | The username to connect to the broker. Only required if anonymous is not specified or set to `false` .| `default` | password | Y | The password to connect to the broker with. Only required if anonymous is not specified or set to false. | default | anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` From 3faa75e0c771904e3b4b70618ff3bb844e12781a Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:45 -0500 Subject: [PATCH 107/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index b6ebf90e1..ed682e6cc 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -38,7 +38,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr |--------------------|:--------:|---------|---------| | url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
    Use the **`amqp://`** URI scheme for non-TLS communication.
    Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` | username | Y | The username to connect to the broker. Only required if anonymous is not specified or set to `false` .| `default` -| password | Y | The password to connect to the broker with. Only required if anonymous is not specified or set to false. | default +| password | Y | The password to connect to the broker. Only required if anonymous is not specified or set to `false`. | `default` | anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` From 83fd12d803997173b79e579efa92ecc586d4aa71 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:47:53 -0500 Subject: [PATCH 108/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index ed682e6cc..f6601bc27 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -39,7 +39,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | url | Y | Address of the AMQP broker. Can be `secretKeyRef` to use a secret reference.
    Use the **`amqp://`** URI scheme for non-TLS communication.
    Use the **`amqps://`** URI scheme for TLS communication. | `"amqp://host.domain[:port]"` | username | Y | The username to connect to the broker. Only required if anonymous is not specified or set to `false` .| `default` | password | Y | The password to connect to the broker. Only required if anonymous is not specified or set to `false`. | `default` -| anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to true.| true +| anonymous | N | To connect to the broker without credential validation. Only works if enabled on the broker. A username and password would not be required if this is set to `true`. | `true` | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientKey | Required for using TLS | TLS client key in PEM format. Must be used with `clientCert`. Can be `secretKeyRef` to use a secret reference. | `"-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----"` From 17e5e5017aa933c5e832ffc1feefb55e3f4e9cb2 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:10 -0500 Subject: [PATCH 109/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../supported-pubsub/setup-solace-amqp.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index f6601bc27..c923d675e 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -46,7 +46,12 @@ The above example uses secrets as plain strings. It is recommended to use a secr ### Communication using TLS -To configure communication using TLS, ensure that the Solace broker is configured to support certificates and provide the `caCert`, `clientCert`, `clientKey` metadata in the component configuration. For example: +To configure communication using TLS: + +1. Ensure that the Solace broker is configured to support certificates. +1. Provide the `caCert`, `clientCert`, and `clientKey` metadata in the component configuration. + +For example: ```yaml apiVersion: dapr.io/v1alpha1 From 1f25aa03dc579f168eece99bb2d2ab2400c7d294 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:18 -0500 Subject: [PATCH 110/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index c923d675e..54263693e 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -84,7 +84,7 @@ Note that while the `caCert` and `clientCert` values may not be secrets, they ca ### Publishing/subscribing to topics and queues -By default, messages are published and subscribed over topics. If you would like your destination to be a queue - prefix the topic with `queue:` and the Solace AMQP component will connect to a queue. +By default, messages are published and subscribed over topics. If you would like your destination to be a queue, prefix the topic with `queue:` and the Solace AMQP component will connect to a queue. ## Create a Solace broker From 874a6651735e3119429bfe366f13755936f8e28d Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:29 -0500 Subject: [PATCH 111/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 54263693e..38411258f 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -80,7 +80,7 @@ auth: secretStore: ``` -Note that while the `caCert` and `clientCert` values may not be secrets, they can be referenced from a Dapr secret store as well for convenience. +> While the `caCert` and `clientCert` values may not be secrets, they can be referenced from a Dapr secret store as well for convenience. ### Publishing/subscribing to topics and queues From d0492583f632343b697d4fa9b7dd3519e4340581 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:36 -0500 Subject: [PATCH 112/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 38411258f..58ae4e5db 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -101,7 +101,7 @@ You can then interact with the server using the client port: `mqtt://localhost:5 {{% /codetab %}} {{% codetab %}} -You can also sign up for a free SaaS broker on [Solace Cloud](https://console.solace.cloud/login/new-account?product=event-streaming) +You can also sign up for a free SaaS broker on [Solace Cloud](https://console.solace.cloud/login/new-account?product=event-streaming). {{% /codetab %}} {{< /tabs >}} From 5ef2b250f48c391bd4c9a320caca00669034d3e1 Mon Sep 17 00:00:00 2001 From: TKTheTechie Date: Tue, 24 Jan 2023 13:48:47 -0500 Subject: [PATCH 113/116] Update daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: TKTheTechie --- .../components-reference/supported-pubsub/setup-solace-amqp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md index 58ae4e5db..6bfe09f49 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-solace-amqp.md @@ -110,4 +110,4 @@ You can also sign up for a free SaaS broker on [Solace Cloud](https://console.so - [Basic schema for a Dapr component]({{< ref component-schema >}}) - Read [this guide]({{< ref "howto-publish-subscribe.md#step-2-publish-a-topic" >}}) for instructions on configuring pub/sub components -- [Pub/Sub building block]({{< ref pubsub >}}) \ No newline at end of file +- [Pub/sub building block]({{< ref pubsub >}}) \ No newline at end of file From 9d7e29538569aa4666b31f765f8321b470e169be Mon Sep 17 00:00:00 2001 From: Isekai-Seikatsu Date: Thu, 26 Jan 2023 00:24:43 +0800 Subject: [PATCH 114/116] Fix secrets.json path typo (#3087) Signed-off-by: Isekai-Seikatsu Signed-off-by: Isekai-Seikatsu --- .../en/getting-started/quickstarts/secrets-quickstart.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md index 42772e58d..9c445992c 100644 --- a/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/secrets-quickstart.md @@ -106,7 +106,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/python/sdk/order-processor/secrets.json): ```json { @@ -328,7 +328,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/csharp/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/csharp/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/csharp/sdk/order-processor/secrets.json): ```json { @@ -436,7 +436,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/java/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/java/sdk/order-processor/secrets.json): ```json { @@ -543,7 +543,7 @@ In the YAML file: **`secrets.json` file** -`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/python/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/javascript/sdk/order-processor/secrets.json): +`SECRET_NAME` is defined in the `secrets.json` file, located in [secrets_management/go/sdk/order-processor](https://github.com/dapr/quickstarts/tree/master/secrets_management/go/sdk/order-processor/secrets.json): ```json { From 62c4b17fb9d27f1322a4f63843ff3575d5bd957c Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 25 Jan 2023 16:46:03 -0600 Subject: [PATCH 115/116] update strimzi link Signed-off-by: Hannah Hunter --- .../components-reference/supported-pubsub/setup-apache-kafka.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md index 86d4a350c..a18b8c261 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md @@ -337,7 +337,7 @@ To run without Docker, see the getting started guide [here](https://kafka.apache {{% /codetab %}} {{% codetab %}} -To run Kafka on Kubernetes, you can use any Kafka operator, such as [Strimzi](https://strimzi.io/docs/operators/latest/quickstart.html#ref-install-prerequisites-str). +To run Kafka on Kubernetes, you can use any Kafka operator, such as [Strimzi](https://strimzi.io/quickstarts/). {{% /codetab %}} {{< /tabs >}} From 3fa9fabee0263bbfa5b752652a72a09cf1805648 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Fri, 27 Jan 2023 00:27:13 -0600 Subject: [PATCH 116/116] fix typo (#3082) Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../supported-pubsub/setup-jetstream.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md index 815430fd7..d62a73fe3 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-jetstream.md @@ -62,7 +62,7 @@ spec: value: false - name: rateLimit value: 1024 - - name: hearbeat + - name: heartbeat value: 15s - name: ackPolicy value: explicit @@ -98,7 +98,7 @@ spec: | replicas | N | [Replicas] | `3` | | memoryStorage | N | [Memory Storage] | `false` | | rateLimit | N | [Rate Limit] | `1024` | -| hearbeat | N | [Hearbeat] | `10s` | +| heartbeat | N | [Heartbeat] | `10s` | | ackPolicy | N | [Ack Policy] | `explicit` | | deliverPolicy | N | One of: all, last, new, sequence, time | `all` | | domain | N | [JetStream Leafondes] | `HUB` | @@ -166,7 +166,7 @@ nats -s localhost:4222 stream add myStream --subjects mySubject [Replicas]: https://docs.nats.io/jetstream/concepts/consumers#replicas [Memory Storage]: https://docs.nats.io/jetstream/concepts/consumers#memorystorage [Rate Limit]: https://docs.nats.io/jetstream/concepts/consumers#ratelimit -[Hearbeat]: https://docs.nats.io/jetstream/concepts/consumers#hearbeat +[Heartbeat]: https://docs.nats.io/jetstream/concepts/consumers#heartbeat [Ack Policy]: https://docs.nats.io/nats-concepts/jetstream/consumers#ackpolicy [JetStream Leafonodes]: https://docs.nats.io/running-a-nats-service/configuration/leafnodes/jetstream_leafnodes [Decentralized JWT Authentication/Authorization]: https://docs.nats.io/running-a-nats-service/configuration/securing_nats/auth_intro/jwt

miD>q59iO;(WEBFtKpX8kKHW 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

VrFUT?ecy@wXy4$mGu|!U)p+oOekGi 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 Date: Thu, 3 Nov 2022 13:54:51 -0500 Subject: [PATCH 031/116] update python to be declarative example Signed-off-by: Hannah Hunter --- .../building-blocks/pubsub/subscription-methods.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index 82c2d75c1..a6d4c3cf9 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -136,9 +136,11 @@ public Mono getCheckout(@RequestBody(required = false) CloudEvent {{% codetab %}} ```python +from cloudevents.sdk.event import v1 + #Subscribe to a topic -@app.subscribe(pubsubname='pubsub', topic='orders', route='checkout') -def mytopic(event: v1.Event) -> None: +@app.route('/checkout', methods=['POST']) +def checkout(event: v1.Event) -> None: data = json.loads(event.Data()) logging.info('Subscriber received: ' + str(data)) ``` From 54d43c280baa97803a754530635c15d8babaea89 Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Thu, 3 Nov 2022 16:15:06 -0700 Subject: [PATCH 032/116] Start of resiliency quickstart Signed-off-by: Nick Greenfield --- .../en/getting-started/quickstarts/_index.md | 5 +- .../quickstarts/resiliency-quickstart.md | 158 ++++++++++++++++++ .../static/images/resiliency-quickstart.png | Bin 0 -> 67679 bytes 3 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md create mode 100644 daprdocs/static/images/resiliency-quickstart.png diff --git a/daprdocs/content/en/getting-started/quickstarts/_index.md b/daprdocs/content/en/getting-started/quickstarts/_index.md index efae344ff..c0a189dc0 100644 --- a/daprdocs/content/en/getting-started/quickstarts/_index.md +++ b/daprdocs/content/en/getting-started/quickstarts/_index.md @@ -27,7 +27,4 @@ Hit the ground running with our Dapr quickstarts, complete with code samples aim | [State Management]({{< ref statemanagement-quickstart.md >}}) | Store a service's data as key/value pairs in supported state stores. | | [Bindings]({{< ref bindings-quickstart.md >}}) | Work with external systems using input bindings to respond to events and output bindings to call operations. | | [Secrets Management]({{< ref secrets-quickstart.md >}}) | Securely fetch secrets. | -| Actors | Coming soon. | -| Observability | Coming soon. | -| Configuration | Coming soon. | -| Distributed Lock | Coming soon. | +| [Resiliency]({{< ref resiliency-quickstart.md >}}) | Define and apply fault-tolernce policies to your Dapr APIs requests. | diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md new file mode 100644 index 000000000..84c7554eb --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md @@ -0,0 +1,158 @@ +--- +type: docs +title: "Quickstart: Resiliency" +linkTitle: "Resiliency" +weight: 72 +description: "Get started with Dapr's resiliency capabilities" +--- +Diagram showing the resiliency applied to Dapr APIs + +{{% alert title="Note" color="primary" %}} + Resiliency is currently a preview feature. +{{% /alert %}} + +In this Quickstart, you will observe Dapr resiliency capabilities by introducing toxic behavior to a microservice that continuously perists and retrieves state via Dapr's state management API. + +The resiliency policies used in this example are defined and applied via the [resiliency spec]() located in the components directory. + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest Node.js installed](https://nodejs.org/download/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd quickstart/resiliency/javascript/order-processor +``` + +Install dependencies + +```bash +npm install +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +The resilency spec is located in the components directory and is automatically discovered by the Dapr sidecar when run in standalone mode. + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../components/ -- npm start +``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` redis instance [defined in the `statestore.yaml` component]({{< ref "#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` +While the application is running continue to the next section. + +### Step 3: Introduce a fault + +For example purposes, you will simulate a fault by stopping the Redis container that was initalized when executing `dapr init` on your development machine. + +The Redis instance is configured as the state store component for the order-processor microservice. Once the redis instance is stopped, write and read operations from the order-processor service will begin to fail. + +Since the `statestore` component is definied as a target in the resiliency spec applied to the order-processor service, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +```bash +docker stop dapr_redis +``` + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Retries will continue for each failed request indefinitely, while waiting 5 seconds in between trying again. Once 5 consecutive retries have failed, the circuit breaker policy `simpleCB` is tripped and the breaker opens haulting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. This behavior will continue for as long as the Redis container is stopped. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +### Step 3: Remove the fault +Restart the redis container on your machine and the application will recover seamlessly, picking up where it left off with writing and reading orders to the Redis state store component. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +## Tell us what you think! +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps +Visit [this](https://docs.dapr.io/operations/resiliency/resiliency-overview//) link for more information about Dapr resiliency. + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} diff --git a/daprdocs/static/images/resiliency-quickstart.png b/daprdocs/static/images/resiliency-quickstart.png new file mode 100644 index 0000000000000000000000000000000000000000..5dea0e1edf79abcb279fca2a6e398d8f0c2329ee GIT binary patch literal 67679 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 IS8OBx4~!1NI{*Lx literal 0 HcmV?d00001 From 8bf29a5b90e9ad5e67f04bc50f49ec7c51e6413f Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Fri, 4 Nov 2022 11:33:11 -0700 Subject: [PATCH 033/116] Update daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../en/getting-started/quickstarts/resiliency-quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md index 84c7554eb..0d2764803 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md @@ -11,7 +11,7 @@ description: "Get started with Dapr's resiliency capabilities" Resiliency is currently a preview feature. {{% /alert %}} -In this Quickstart, you will observe Dapr resiliency capabilities by introducing toxic behavior to a microservice that continuously perists and retrieves state via Dapr's state management API. +In this Quickstart, you will observe Dapr resiliency capabilities by simulating a system failure. You will execute a microservice application that continuously persists and retrieves state via Dapr's state management API. When operations to the state store begin to fail, Dapr resiliency policies are applied. The resiliency policies used in this example are defined and applied via the [resiliency spec]() located in the components directory. From 802aaf11ce1c5857de0e098320ff053b79529244 Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Mon, 7 Nov 2022 10:43:02 -0800 Subject: [PATCH 034/116] Update docs runtime version to 1.9.3 Signed-off-by: Nick Greenfield --- .../support/support-release-policy.md | 24 +++++++++---------- .../shortcodes/dapr-latest-version.html | 2 +- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index 0a3fb4917..093d413d2 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,6 +34,7 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| +| November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | October 26th 2022 | 1.9.1
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | | October 13th 2022 | 1.9.0
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | @@ -74,21 +75,18 @@ General guidance on upgrading can be found for [self hosted mode]({{< ref self-h | Current Runtime version | Must upgrade through | Target Runtime version | |--------------------------|-----------------------|------------------------- | -| 1.4.0 to 1.4.2 | N/A | 1.4.4 | -| | 1.4.4 | 1.5.2 | -| | 1.5.2 | 1.6.0 | -| | 1.6.0 | 1.6.2 | -| | 1.6.0 | 1.7.4 | -| | 1.6.0 | 1.7.5 | | 1.5.0 to 1.5.2 | N/A | 1.6.0 | | | 1.6.0 | 1.6.2 | -| | 1.6.0 | 1.7.4 | -| | 1.6.0 | 1.7.5 | -| 1.6.0 | N/A | 1.6.2 | -| 1.6.0 | N/A | 1.7.5 | -| 1.7.0 to 1.7.5 | N/A | 1.8.0 | -| 1.8.0 | N/A | 1.8.6 | -| 1.9.0 | N/A | 1.9.2 | +| | 1.6.2 | 1.7.5 | +| | 1.7.5 | 1.8.6 | +| | 1.8.6 | 1.9.3 | +| 1.6.0 to 1.6.2 | N/A | 1.7.5 | +| | 1.7.5 | 1.8.6 | +| | 1.8.6 | 1.9.3 | +| 1.7.0 to 1.7.5 | N/A | 1.8.6 | +| | 1.8.6 | 1.9.3 | +| 1.8.0 to 1.8.6 | N/A | 1.9.3 | +| 1.9.0 | N/A | 1.9.3 | ## Breaking changes and deprecations diff --git a/daprdocs/layouts/shortcodes/dapr-latest-version.html b/daprdocs/layouts/shortcodes/dapr-latest-version.html index db415d450..05f5194a4 100644 --- a/daprdocs/layouts/shortcodes/dapr-latest-version.html +++ b/daprdocs/layouts/shortcodes/dapr-latest-version.html @@ -1 +1 @@ -{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.0{{ else if .Get "cli" }}1.9.0{{ else }}1.9.0{{ end -}} +{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.3{{ else if .Get "cli" }}1.9.0{{ else }}1.9.3{{ end -}} From 53b1521690d1b5c31210a6bffceb8aea8218f226 Mon Sep 17 00:00:00 2001 From: Richard de Zwart Date: Tue, 8 Nov 2022 12:11:44 +0100 Subject: [PATCH 035/116] Update azure-api-management.md Removed one word Signed-off-by: Richard de Zwart --- .../integrations/Azure/azure-api-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md b/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md index 793f5f834..5eb42a7cd 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/azure-api-management.md @@ -6,6 +6,6 @@ description: "Publish APIs for Dapr services and components through Azure API Ma weight: 2000 --- -Azure API Management (APIM) is a way to create consistent and modern API gateways for back-end services, including as those built with Dapr. Dapr support can be enabled in self-hosted API Management gateways to allow them to forward requests to Dapr services, send messages to Dapr Pub/Sub topics, or trigger Dapr output bindings. For more information, read the guide on [API Management Dapr Integration policies](https://docs.microsoft.com/azure/api-management/api-management-dapr-policies) and try out the [Dapr & Azure API Management Integration Demo](https://github.com/dapr/samples/tree/master/dapr-apim-integration). +Azure API Management (APIM) is a way to create consistent and modern API gateways for back-end services, including those built with Dapr. Dapr support can be enabled in self-hosted API Management gateways to allow them to forward requests to Dapr services, send messages to Dapr Pub/Sub topics, or trigger Dapr output bindings. For more information, read the guide on [API Management Dapr Integration policies](https://docs.microsoft.com/azure/api-management/api-management-dapr-policies) and try out the [Dapr & Azure API Management Integration Demo](https://github.com/dapr/samples/tree/master/dapr-apim-integration). {{< button text="Learn more" link="https://docs.microsoft.com/azure/api-management/api-management-dapr-policies" >}} From 04221174e6a27b5b0b3e0bb66081db1ef0f5e187 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 8 Nov 2022 11:16:24 -0500 Subject: [PATCH 036/116] Use Google Analytics 4 ID (#2941) Signed-off-by: Patrice Chalin Signed-off-by: Patrice Chalin Co-authored-by: Mark Fussell --- daprdocs/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/config.toml b/daprdocs/config.toml index e738b6b15..b89160e36 100644 --- a/daprdocs/config.toml +++ b/daprdocs/config.toml @@ -27,7 +27,7 @@ disableKinds = ["taxonomy", "term"] # Google Analytics [services.googleAnalytics] -id = "UA-149338238-3" +id = "G-60C6Q1ETC1" # Mounts [module] From 5783d9a4322fbdba124f8509be96f4277306c944 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Tue, 8 Nov 2022 09:01:22 -0800 Subject: [PATCH 037/116] Fix Python SDK version Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../content/en/operations/support/support-release-policy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index 093d413d2..2da2fdd50 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,7 +34,7 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| -| November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | October 26th 2022 | 1.9.1
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | | October 13th 2022 | 1.9.0
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | From 3cf224f8ec2220a1b84af82376d4971317d6dca2 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Tue, 8 Nov 2022 13:27:03 -0600 Subject: [PATCH 038/116] update code snippets Signed-off-by: Hannah Hunter --- .../pubsub/subscription-methods.md | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index a6d4c3cf9..c66088ea0 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -104,7 +104,6 @@ In your application code, subscribe to the topic specified in the Dapr pub/sub c ```csharp //Subscribe to a topic -[Topic("pubsub", "orders")] [HttpPost("checkout")] public void getCheckout([FromBody] int orderId) { @@ -117,16 +116,15 @@ public void getCheckout([FromBody] int orderId) {{% codetab %}} ```java +import io.dapr.client.domain.CloudEvent; + //Subscribe to a topic -@Topic(name = "orders", pubsubName = "pubsub") @PostMapping(path = "/checkout") public Mono getCheckout(@RequestBody(required = false) CloudEvent cloudEvent) { return Mono.fromRunnable(() -> { try { log.info("Subscriber received: " + cloudEvent.getData()); - } catch (Exception e) { - throw new RuntimeException(e); - } + } }); } ``` @@ -150,11 +148,16 @@ def checkout(event: v1.Event) -> None: {{% codetab %}} ```javascript -//Subscribe to a topic -await server.pubsub.subscribe("pubsub", "orders", "checkout", async (orderId) => { - console.log(`Subscriber received: ${JSON.stringify(orderId)}`) +const express = require('express') +const bodyParser = require('body-parser') +const app = express() +app.use(bodyParser.json({ type: 'application/*+json' })); + +// listen to the declarative route +app.post('/checkout', (req, res) => { + console.log(req.body); + res.sendStatus(200); }); -await server.startServer(); ``` {{% /codetab %}} From ddc252ef822eb2d57462644800420cb33990d861 Mon Sep 17 00:00:00 2001 From: ThumNet Date: Wed, 9 Nov 2022 16:44:08 +0100 Subject: [PATCH 039/116] Azurite queue default port is 10001 fix: Update azurite port to 10001 instead of 10000 See [docs](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio#queue-listening-port-configuration) Signed-off-by: ThumNet --- .../components-reference/supported-bindings/storagequeues.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md b/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md index 94d7ea96b..b9d2113c1 100644 --- a/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md +++ b/daprdocs/content/en/reference/components-reference/supported-bindings/storagequeues.md @@ -32,7 +32,7 @@ spec: # - name: decodeBase64 # value: "false" # - name: endpoint -# value: "http://127.0.0.1:10000" +# value: "http://127.0.0.1:10001" ``` {{% alert title="Warning" color="warning" %}} @@ -48,7 +48,7 @@ The above example uses secrets as plain strings. It is recommended to use a secr | `queueName` | Y | Input/Output | The name of the Azure Storage queue | `"myqueue"` | | `ttlInSeconds` | N | Output | Parameter to set the default message time to live. If this parameter is omitted, messages will expire after 10 minutes. See [also](#specifying-a-ttl-per-message) | `"60"` | | `decodeBase64` | N | Output | Configuration to decode base64 file content before saving to Blob Storage. (In case of saving a file with binary content). `true` is the only allowed positive value. Other positive variations like `"True", "1"` are not acceptable. Defaults to `false` | `true`, `false` | -| `endpoint` | N | Input/Output | Optional custom endpoint URL. This is useful when using the [Azurite emulator](https://github.com/Azure/azurite) or when using custom domains for Azure Storage (although this is not officially supported). The endpoint must be the full base URL, including the protocol (`http://` or `https://`), the IP or FQDN, and optional port. | `"http://127.0.0.1:10000"` or `"https://accountName.queue.example.com"` | +| `endpoint` | N | Input/Output | Optional custom endpoint URL. This is useful when using the [Azurite emulator](https://github.com/Azure/azurite) or when using custom domains for Azure Storage (although this is not officially supported). The endpoint must be the full base URL, including the protocol (`http://` or `https://`), the IP or FQDN, and optional port. | `"http://127.0.0.1:10001"` or `"https://accountName.queue.example.com"` | ### Azure Active Directory (Azure AD) authentication From 37844bcd0cec42b972d9ab231c0a5bf7ff86772b Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Fri, 11 Nov 2022 19:00:20 -0600 Subject: [PATCH 040/116] updates per resiliency example Signed-off-by: Hannah Hunter --- .../en/getting-started/quickstarts/_index.md | 2 +- .../quickstarts/resiliency-quickstart.md | 158 --- .../quickstarts/resiliency/_index.md | 7 + .../resiliency-serviceinvo-quickstart.md | 1204 +++++++++++++++++ .../resiliency/resiliency-state-quickstart.md | 900 ++++++++++++ 5 files changed, 2112 insertions(+), 159 deletions(-) delete mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md create mode 100644 daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md diff --git a/daprdocs/content/en/getting-started/quickstarts/_index.md b/daprdocs/content/en/getting-started/quickstarts/_index.md index c0a189dc0..67380fa87 100644 --- a/daprdocs/content/en/getting-started/quickstarts/_index.md +++ b/daprdocs/content/en/getting-started/quickstarts/_index.md @@ -27,4 +27,4 @@ Hit the ground running with our Dapr quickstarts, complete with code samples aim | [State Management]({{< ref statemanagement-quickstart.md >}}) | Store a service's data as key/value pairs in supported state stores. | | [Bindings]({{< ref bindings-quickstart.md >}}) | Work with external systems using input bindings to respond to events and output bindings to call operations. | | [Secrets Management]({{< ref secrets-quickstart.md >}}) | Securely fetch secrets. | -| [Resiliency]({{< ref resiliency-quickstart.md >}}) | Define and apply fault-tolernce policies to your Dapr APIs requests. | +| [Resiliency]({{< ref resiliency >}}) | Define and apply fault-tolerance policies to your Dapr API requests. | diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md deleted file mode 100644 index 0d2764803..000000000 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency-quickstart.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -type: docs -title: "Quickstart: Resiliency" -linkTitle: "Resiliency" -weight: 72 -description: "Get started with Dapr's resiliency capabilities" ---- -Diagram showing the resiliency applied to Dapr APIs - -{{% alert title="Note" color="primary" %}} - Resiliency is currently a preview feature. -{{% /alert %}} - -In this Quickstart, you will observe Dapr resiliency capabilities by simulating a system failure. You will execute a microservice application that continuously persists and retrieves state via Dapr's state management API. When operations to the state store begin to fail, Dapr resiliency policies are applied. - -The resiliency policies used in this example are defined and applied via the [resiliency spec]() located in the components directory. - -### Pre-requisites - -For this example, you will need: - -- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). -- [Latest Node.js installed](https://nodejs.org/download/). - -- [Docker Desktop](https://www.docker.com/products/docker-desktop) - - -### Step 1: Set up the environment - -Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). - -```bash -git clone https://github.com/dapr/quickstarts.git -``` - -In a terminal window, navigate to the `order-processor` directory. - -```bash -cd quickstart/resiliency/javascript/order-processor -``` - -Install dependencies - -```bash -npm install -``` - -### Step 2: Run the application with resiliency enabled - -Run the `order-processor` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. - -The resilency spec is located in the components directory and is automatically discovered by the Dapr sidecar when run in standalone mode. - -```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../components/ -- npm start -``` - -Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` redis instance [defined in the `statestore.yaml` component]({{< ref "#statestoreyaml-component-file" >}}). - -```bash -== APP == Saving Order: { orderId: '1' } -== APP == Getting Order: { orderId: '1' } -== APP == Saving Order: { orderId: '2' } -== APP == Getting Order: { orderId: '2' } -== APP == Saving Order: { orderId: '3' } -== APP == Getting Order: { orderId: '3' } -== APP == Saving Order: { orderId: '4' } -== APP == Getting Order: { orderId: '4' } -``` -While the application is running continue to the next section. - -### Step 3: Introduce a fault - -For example purposes, you will simulate a fault by stopping the Redis container that was initalized when executing `dapr init` on your development machine. - -The Redis instance is configured as the state store component for the order-processor microservice. Once the redis instance is stopped, write and read operations from the order-processor service will begin to fail. - -Since the `statestore` component is definied as a target in the resiliency spec applied to the order-processor service, all failed requests will apply retry and circuit breaker policies: - -```yaml - targets: - components: - statestore: - outbound: - retry: retryForever - circuitBreaker: simpleCB -``` - -```bash -docker stop dapr_redis -``` - -Once the first request fails, the retry policy titled `retryForever` is applied: - -```bash -INFO[0006] Error processing operation component[statestore] output. Retrying... -``` - -```yaml -retryForever: - policy: constant - maxInterval: 5s - maxRetries: -1 -``` - -Retries will continue for each failed request indefinitely, while waiting 5 seconds in between trying again. Once 5 consecutive retries have failed, the circuit breaker policy `simpleCB` is tripped and the breaker opens haulting all requests: - -```bash -INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open -``` - -```yaml -circuitBreakers: - simpleCB: - maxRequests: 1 - timeout: 5s - trip: consecutiveFailures >= 5 -``` - -After 5 seconds has surpassed, the circuit breaker will switch to a half-open state allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. This behavior will continue for as long as the Redis container is stopped. - -```bash -INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open -INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open -INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open -INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed -``` - -### Step 3: Remove the fault -Restart the redis container on your machine and the application will recover seamlessly, picking up where it left off with writing and reading orders to the Redis state store component. - -```bash -docker start dapr_redis -``` - -```bash -INFO[0036] Recovered processing operation component[statestore] output. -== APP == Saving Order: { orderId: '5' } -== APP == Getting Order: { orderId: '5' } -== APP == Saving Order: { orderId: '6' } -== APP == Getting Order: { orderId: '6' } -== APP == Saving Order: { orderId: '7' } -== APP == Getting Order: { orderId: '7' } -== APP == Saving Order: { orderId: '8' } -== APP == Getting Order: { orderId: '8' } -== APP == Saving Order: { orderId: '9' } -== APP == Getting Order: { orderId: '9' } -``` - -## Tell us what you think! -We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? - -Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). - -## Next steps -Visit [this](https://docs.dapr.io/operations/resiliency/resiliency-overview//) link for more information about Dapr resiliency. - -{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md new file mode 100644 index 000000000..3156dfa9d --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/_index.md @@ -0,0 +1,7 @@ +--- +type: docs +title: "Resiliency Quickstarts" +linkTitle: "Resiliency" +weight: 100 +description: "Get started with Dapr's resiliency component" +--- \ No newline at end of file diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md new file mode 100644 index 000000000..1954befa1 --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -0,0 +1,1204 @@ +--- +type: docs +title: "Quickstart: Service-to-service resiliency" +linkTitle: "Resiliency: Service Invocation" +weight: 120 +description: "Get started with Dapr's resiliency capabilities via the service invocation API" +--- + +{{% alert title="Note" color="primary" %}} + Resiliency is currently a preview feature. +{{% /alert %}} + +Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: + +- Run two microservice applications, `checkout` and `order-processor`. `checkout` will continuously make Dapr service invocation requests to `order-processor`. +- Trigger the resiliency spec by simulating a system failure. +- Remove the failure to allow the microservice application to resume. + +Diagram showing the resiliency applied to Dapr APIs + +Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. + +{{< tabs "Python" "JavaScript" ".NET" "Java" "Go" >}} + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run `order-processor` service + +In a terminal window, from the root of the Quickstart clone directory +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/python/http/order-processor +``` + +Install the dependencies: + +```bash +pip3 install -r requirements.txt +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 8001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- python3 app.py +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart clone directory +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/python/http/checkout +``` + +Install the dependencies: + +```bash +pip3 install -r requirements.txt +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- python3 app.py +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs + +Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault + +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 8001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- python3 app.py +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest Node.js installed](https://nodejs.org/download/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart clone directory +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/javascript/http/order-processor +``` + +Install the dependencies: + +```bash +npm install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart clone directory +navigate to the `checkout` directory. + +```bash +cd service_invocation/javascript/http/checkout +``` + +Install the dependencies: + +```bash +npm install +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs + +Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault + +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [.NET SDK or .NET 6 SDK installed](https://dotnet.microsoft.com/download). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart clone directory +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/csharp/http/order-processor +``` + +Install the dependencies: + +```bash +dotnet restore +dotnet build +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 7001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- dotnet run +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart clone directory +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/csharp/http/checkout +``` + +Install the dependencies: + +```bash +dotnet restore +dotnet build +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- dotnet run +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs + +Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault + +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 7001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- dotnet run +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- Java JDK 11 (or greater): + - [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11), or + - OpenJDK +- [Apache Maven](https://maven.apache.org/install.html), version 3.x. + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart clone directory +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/java/http/order-processor +``` + +Install the dependencies: + +```bash +mvn clean install +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-id order-processor --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart clone directory +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/java/http/checkout +``` + +Install the dependencies: + +```bash +mvn clean install +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs + +Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault + +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-id order-processor --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest version of Go](https://go.dev/dl/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/service_invocation). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +### Step 2: Run the `order-processor` service + +In a terminal window, from the root of the Quickstart clone directory +navigate to `order-processor` directory. + +```bash +cd ../service_invocation/go/http/order-processor +``` + +Install the dependencies: + +```bash +go build . +``` + +Run the `order-processor` service alongside a Dapr sidecar. + +```bash +dapr run --app-port 6001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- go run . +``` + +### Step 3: Run the `checkout` service application with resiliency enabled + +In a new terminal window, from the root of the Quickstart clone directory +navigate to the `checkout` directory. + +```bash +cd ../service_invocation/go/http/checkout +``` + +Install the dependencies: + +```bash +go build . +``` + +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- go run . +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +### Step 4: View the Service Invocation outputs + +Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 1} +== APP == Order passed: {"orderId": 2} +== APP == Order passed: {"orderId": 3} +== APP == Order passed: {"orderId": 4} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 1} +== APP == Order received: {"orderId": 2} +== APP == Order received: {"orderId": 3} +== APP == Order received: {"orderId": 4} +``` + +### Step 5: Introduce a fault + +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB +``` + +In the `order-processor` window, stop the service: + +{{< tabs "MacOs" "Windows" >}} + + + +{{% codetab %}} + +```script +CMD + C +``` + +{{% /codetab %}} + + + +{{% codetab %}} + +```script +CTRL + C +``` + +{{% /codetab %}} + +{{< /tabs >}} + + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0005] Error processing operation endpoint[order-processor, order-processor:orders]. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0025] Circuit breaker "order-processor:orders" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +INFO[0030] Circuit breaker "order-processor:orders" changed state from open to half-open +INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 6: Remove the fault + +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. + +In the `order-processor` service terminal, restart the application: + +```bash +dapr run --app-port 6001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- go run . +``` + +`checkout` service output: + +``` +== APP == Order passed: {"orderId": 5} +== APP == Order passed: {"orderId": 6} +== APP == Order passed: {"orderId": 7} +== APP == Order passed: {"orderId": 8} +== APP == Order passed: {"orderId": 9} +== APP == Order passed: {"orderId": 10} +``` + +`order-processor` service output: + +``` +== APP == Order received: {"orderId": 5} +== APP == Order received: {"orderId": 6} +== APP == Order received: {"orderId": 7} +== APP == Order received: {"orderId": 8} +== APP == Order received: {"orderId": 9} +== APP == Order received: {"orderId": 10} +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Tell us what you think! +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps +Visit [this](https://docs.dapr.io/operations/resiliency/resiliency-overview//) link for more information about Dapr resiliency. + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md new file mode 100644 index 000000000..c4df04973 --- /dev/null +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -0,0 +1,900 @@ +--- +type: docs +title: "Quickstart: Service-to-component resiliency" +linkTitle: "Resiliency: State Management" +weight: 110 +description: "Get started with Dapr's resiliency capabilities via the state management API" +--- + +{{% alert title="Note" color="primary" %}} + Resiliency is currently a preview feature. +{{% /alert %}} + +Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: + +- Execute a microservice application with resiliency enabled that continuously persists and retrieves state via Dapr's state management API. +- Trigger the resiliency spec by simulating a system failure. +- Remove the failure to allow the microservice application to resume. + +Diagram showing the resiliency applied to Dapr APIs + +Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. + +{{< tabs "Python" "JavaScript" ".NET" "Java" "Go" >}} + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Python 3.7+ installed](https://www.python.org/downloads/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/python/sdk/order-processor +``` + +Install dependencies + +```bash +pip3 install -r requirements.txt +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- python3 +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command: + +```bash +docker stop dapr_redis +``` + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest Node.js installed](https://nodejs.org/download/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/javascript/sdk/order-processor +``` + +Install dependencies + +```bash +npm install +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- npm start +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command: + +```bash +docker stop dapr_redis +``` + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [.NET SDK or .NET 6 SDK installed](https://dotnet.microsoft.com/download). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/csharp/sdk/order-processor +``` + +Install dependencies + +```bash +dotnet restore +dotnet build +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- dotnet run +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command: + +```bash +docker stop dapr_redis +``` + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- Java JDK 11 (or greater): + - [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html#JDK11), or + - OpenJDK +- [Apache Maven](https://maven.apache.org/install.html), version 3.x. + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/java/sdk/order-processor +``` + +Install dependencies + +```bash +mvn clean install +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - checkout + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB + ``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command: + +```bash +docker stop dapr_redis +``` + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + + +{{% codetab %}} + +### Pre-requisites + +For this example, you will need: + +- [Dapr CLI and initialized environment](https://docs.dapr.io/getting-started). +- [Latest version of Go](https://go.dev/dl/). + +- [Docker Desktop](https://www.docker.com/products/docker-desktop) + + +### Step 1: Set up the environment + +Clone the [sample provided in the Quickstarts repo](https://github.com/dapr/quickstarts/tree/master/resiliency). + +```bash +git clone https://github.com/dapr/quickstarts.git +``` + +In a terminal window, navigate to the `order-processor` directory. + +```bash +cd ../state_management/go/sdk/order-processor +``` + +Install dependencies + +```bash +go build . +``` + +### Step 2: Run the application with resiliency enabled + +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. + +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components -- go run . +``` + +The resilency spec is: +- Located in the `components` directory. +- Automatically discovered by the Dapr sidecar when run in standalone mode. + + ```yaml + apiVersion: dapr.io/v1alpha1 + kind: Resiliency + metadata: + name: myresiliency + scopes: + - order-processor + + spec: + policies: + retries: + retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 + + circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 + + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB + ``` + +Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). + +```bash +== APP == Saving Order: { orderId: '1' } +== APP == Getting Order: { orderId: '1' } +== APP == Saving Order: { orderId: '2' } +== APP == Getting Order: { orderId: '2' } +== APP == Saving Order: { orderId: '3' } +== APP == Getting Order: { orderId: '3' } +== APP == Saving Order: { orderId: '4' } +== APP == Getting Order: { orderId: '4' } +``` + +### Step 3: Introduce a fault + +Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. + +Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: + +```yaml + targets: + components: + statestore: + outbound: + retry: retryForever + circuitBreaker: simpleCB +``` + +In a new terminal window, run the following command: + +```bash +docker stop dapr_redis +``` + +Once the first request fails, the retry policy titled `retryForever` is applied: + +```bash +INFO[0006] Error processing operation component[statestore] output. Retrying... +``` + +Retries will continue for each failed request indefinitely, in 5 second intervals. + +```yaml +retryForever: + policy: constant + maxInterval: 5s + maxRetries: -1 +``` + +Once 5 consecutive retries have failed, the circuit breaker policy, `simpleCB`, is tripped and the breaker opens, halting all requests: + +```bash +INFO[0026] Circuit breaker "simpleCB-statestore" changed state from closed to open +``` + +```yaml +circuitBreakers: + simpleCB: + maxRequests: 1 + timeout: 5s + trip: consecutiveFailures >= 5 +``` + +After 5 seconds has surpassed, the circuit breaker will switch to a half-open state, allowing one request through to verify if the fault has been resolved. If the request continues to fail, the circuit will trip back to the open state. + +```bash +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0031] Circuit breaker "simpleCB-statestore" changed state from half-open to open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from open to half-open +INFO[0036] Circuit breaker "simpleCB-statestore" changed state from half-open to closed +``` + +This half-open/open behavior will continue for as long as the Redis container is stopped. + +### Step 3: Remove the fault + +Once you restart the Redis container on your machine, the application will recover seamlessly, picking up where it left off. + +```bash +docker start dapr_redis +``` + +```bash +INFO[0036] Recovered processing operation component[statestore] output. +== APP == Saving Order: { orderId: '5' } +== APP == Getting Order: { orderId: '5' } +== APP == Saving Order: { orderId: '6' } +== APP == Getting Order: { orderId: '6' } +== APP == Saving Order: { orderId: '7' } +== APP == Getting Order: { orderId: '7' } +== APP == Saving Order: { orderId: '8' } +== APP == Getting Order: { orderId: '8' } +== APP == Saving Order: { orderId: '9' } +== APP == Getting Order: { orderId: '9' } +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Tell us what you think! +We're continuously working to improve our Quickstart examples and value your feedback. Did you find this quickstart helpful? Do you have suggestions for improvement? + +Join the discussion in our [discord channel](https://discord.com/channels/778680217417809931/953427615916638238). + +## Next steps + +Learn more about [the resiliency feature]({{< ref resiliency-overview.md >}}) and how it works with Dapr's building block APIs. + +{{< button text="Explore Dapr tutorials >>" page="getting-started/tutorials/_index.md" >}} From 5b7b832bc4bc56ba9819d414ded98d6413e4954f Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Tue, 15 Nov 2022 09:54:19 -0800 Subject: [PATCH 041/116] Add resiliency images for quickstarts Signed-off-by: Nick Greenfield --- .../resiliency-serviceinvo-quickstart.md | 2 +- .../resiliency/resiliency-state-quickstart.md | 2 +- ... => resiliency-quickstart-svc-component.png} | Bin .../images/resiliency-quickstart-svc-invoke.png | Bin 0 -> 68472 bytes 4 files changed, 2 insertions(+), 2 deletions(-) rename daprdocs/static/images/{resiliency-quickstart.png => resiliency-quickstart-svc-component.png} (100%) create mode 100644 daprdocs/static/images/resiliency-quickstart-svc-invoke.png diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md index 1954befa1..773c328f7 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -16,7 +16,7 @@ Observe Dapr resiliency capabilities by simulating a system failure. In this Qui - Trigger the resiliency spec by simulating a system failure. - Remove the failure to allow the microservice application to resume. -Diagram showing the resiliency applied to Dapr APIs +Diagram showing the resiliency applied to Dapr APIs Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index c4df04973..f7e8523e0 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -16,7 +16,7 @@ Observe Dapr resiliency capabilities by simulating a system failure. In this Qui - Trigger the resiliency spec by simulating a system failure. - Remove the failure to allow the microservice application to resume. -Diagram showing the resiliency applied to Dapr APIs +Diagram showing the resiliency applied to Dapr APIs Select your preferred language-specific Dapr SDK before proceeding with the Quickstart. diff --git a/daprdocs/static/images/resiliency-quickstart.png b/daprdocs/static/images/resiliency-quickstart-svc-component.png similarity index 100% rename from daprdocs/static/images/resiliency-quickstart.png rename to daprdocs/static/images/resiliency-quickstart-svc-component.png diff --git a/daprdocs/static/images/resiliency-quickstart-svc-invoke.png b/daprdocs/static/images/resiliency-quickstart-svc-invoke.png new file mode 100644 index 0000000000000000000000000000000000000000..baff0ccfea126f7a71df771b35cf4a20067f957b GIT binary patch literal 68472 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 m|1tkRHos%X|I@tri41ZSY%4*h4( Date: Wed, 16 Nov 2022 13:27:34 -0800 Subject: [PATCH 042/116] Updates to resiliency svc invoke quickstart --- .../resiliency-serviceinvo-quickstart.md | 131 ++++++++---------- .../resiliency/resiliency-state-quickstart.md | 4 +- 2 files changed, 57 insertions(+), 78 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md index 773c328f7..f37a240b1 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -1,7 +1,7 @@ --- type: docs -title: "Quickstart: Service-to-service resiliency" -linkTitle: "Resiliency: Service Invocation" +title: "Quickstart: service-to-service resiliency" +linkTitle: "Resiliency: service-to-service" weight: 120 description: "Get started with Dapr's resiliency capabilities via the service invocation API" --- @@ -14,7 +14,7 @@ Observe Dapr resiliency capabilities by simulating a system failure. In this Qui - Run two microservice applications, `checkout` and `order-processor`. `checkout` will continuously make Dapr service invocation requests to `order-processor`. - Trigger the resiliency spec by simulating a system failure. -- Remove the failure to allow the microservice application to resume. +- Remove the failure to allow the microservice application to recover. Diagram showing the resiliency applied to Dapr APIs @@ -44,14 +44,13 @@ git clone https://github.com/dapr/quickstarts.git ### Step 2: Run `order-processor` service -In a terminal window, from the root of the Quickstart clone directory -navigate to `order-processor` directory. +In a terminal window, from the root of the Quickstart directory, navigate to `order-processor` directory. ```bash cd ../service_invocation/python/http/order-processor ``` -Install the dependencies: +Install dependencies: ```bash pip3 install -r requirements.txt @@ -60,19 +59,18 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 8001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- python3 app.py +dapr run --app-port 8001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- python3 app.py ``` ### Step 3: Run the `checkout` service application with resiliency enabled -In a new terminal window, from the root of the Quickstart clone directory -navigate to the `checkout` directory. +In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. ```bash cd ../service_invocation/python/http/checkout ``` -Install the dependencies: +Install dependencies: ```bash pip3 install -r requirements.txt @@ -84,9 +82,7 @@ Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter ap dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- python3 app.py ``` -The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -118,8 +114,7 @@ The resilency spec is: ``` ### Step 4: View the Service Invocation outputs - -Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. `checkout` service output: @@ -140,10 +135,9 @@ Dapr invokes an application on any Dapr instance. In the code, the sidecar progr ``` ### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. -Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. - -Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -218,11 +212,11 @@ INFO[0030] Circuit breaker "order-processor:orders" changed state from open to h INFO[0030] Circuit breaker "order-processor:orders" changed state from half-open to open ``` -This half-open/open behavior will continue for as long as the Redis container is stopped. +This half-open/open behavior will continue for as long as the `order-processor` service is stopped. ### Step 6: Remove the fault -Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off. +Once you restart the `order-processor` service, the application will recover seamlessly, picking up where it left off with accepting order requests. In the `order-processor` service terminal, restart the application: @@ -277,14 +271,14 @@ git clone https://github.com/dapr/quickstarts.git ### Step 2: Run the `order-processor` service -In a terminal window, from the root of the Quickstart clone directory +In a terminal window, from the root of the Quickstart directory, navigate to `order-processor` directory. ```bash cd ../service_invocation/javascript/http/order-processor ``` -Install the dependencies: +Install dependencies: ```bash npm install @@ -293,19 +287,19 @@ npm install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start +dapr run --app-port 5001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- npm start ``` ### Step 3: Run the `checkout` service application with resiliency enabled -In a new terminal window, from the root of the Quickstart clone directory +In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. ```bash cd service_invocation/javascript/http/checkout ``` -Install the dependencies: +Install dependencies: ```bash npm install @@ -314,12 +308,10 @@ npm install Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. ```bash -dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start +dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- npm start ``` -The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -351,8 +343,7 @@ The resilency spec is: ``` ### Step 4: View the Service Invocation outputs - -Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. `checkout` service output: @@ -373,10 +364,9 @@ Dapr invokes an application on any Dapr instance. In the code, the sidecar progr ``` ### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. -Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. - -Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -460,7 +450,7 @@ Once you restart the `order-processor` service, the application will recover sea In the `order-processor` service terminal, restart the application: ```bash -dapr run --app-port 5001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- npm start +dapr run --app-port 5001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- npm start ``` `checkout` service output: @@ -510,14 +500,15 @@ git clone https://github.com/dapr/quickstarts.git ### Step 2: Run the `order-processor` service -In a terminal window, from the root of the Quickstart clone directory +In a terminal window, from the root of the Quickstart directory, navigate to `order-processor` directory. + ```bash cd ../service_invocation/csharp/http/order-processor ``` -Install the dependencies: +Install dependencies: ```bash dotnet restore @@ -527,19 +518,19 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 7001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- dotnet run +dapr run --app-port 7001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- dotnet run ``` ### Step 3: Run the `checkout` service application with resiliency enabled -In a new terminal window, from the root of the Quickstart clone directory +In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. ```bash cd ../service_invocation/csharp/http/checkout ``` -Install the dependencies: +Install dependencies: ```bash dotnet restore @@ -552,9 +543,7 @@ Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter ap dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- dotnet run ``` -The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -586,8 +575,7 @@ The resilency spec is: ``` ### Step 4: View the Service Invocation outputs - -Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. `checkout` service output: @@ -608,10 +596,9 @@ Dapr invokes an application on any Dapr instance. In the code, the sidecar progr ``` ### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. -Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. - -Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -748,14 +735,14 @@ git clone https://github.com/dapr/quickstarts.git ### Step 2: Run the `order-processor` service -In a terminal window, from the root of the Quickstart clone directory +In a terminal window, from the root of the Quickstart directory, navigate to `order-processor` directory. ```bash cd ../service_invocation/java/http/order-processor ``` -Install the dependencies: +Install dependencies: ```bash mvn clean install @@ -764,19 +751,19 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-id order-processor --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` ### Step 3: Run the `checkout` service application with resiliency enabled -In a new terminal window, from the root of the Quickstart clone directory +In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. ```bash cd ../service_invocation/java/http/checkout ``` -Install the dependencies: +Install dependencies: ```bash mvn clean install @@ -788,9 +775,7 @@ Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter ap dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar ``` -The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -822,8 +807,7 @@ The resilency spec is: ``` ### Step 4: View the Service Invocation outputs - -Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. `checkout` service output: @@ -844,10 +828,9 @@ Dapr invokes an application on any Dapr instance. In the code, the sidecar progr ``` ### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. -Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. - -Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -931,7 +914,7 @@ Once you restart the `order-processor` service, the application will recover sea In the `order-processor` service terminal, restart the application: ```bash -dapr run --app-id order-processor --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-port 9001 --app-protocol http --dapr-http-port 3501 -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar ``` `checkout` service output: @@ -981,14 +964,14 @@ git clone https://github.com/dapr/quickstarts.git ### Step 2: Run the `order-processor` service -In a terminal window, from the root of the Quickstart clone directory +In a terminal window, from the root of the Quickstart directory, navigate to `order-processor` directory. ```bash cd ../service_invocation/go/http/order-processor ``` -Install the dependencies: +Install dependencies: ```bash go build . @@ -997,19 +980,19 @@ go build . Run the `order-processor` service alongside a Dapr sidecar. ```bash -dapr run --app-port 6001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- go run . +dapr run --app-port 6001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- go run . ``` ### Step 3: Run the `checkout` service application with resiliency enabled -In a new terminal window, from the root of the Quickstart clone directory +In a new terminal window, from the root of the Quickstart directory, navigate to the `checkout` directory. ```bash cd ../service_invocation/go/http/checkout ``` -Install the dependencies: +Install dependencies: ```bash go build . @@ -1021,9 +1004,7 @@ Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter ap dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- go run . ``` -The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -1055,8 +1036,7 @@ The resilency spec is: ``` ### Step 4: View the Service Invocation outputs - -Dapr invokes an application on any Dapr instance. In the code, the sidecar programming model encourages each application to talk to its own instance of Dapr. The Dapr instances then discover and communicate with one another. +When both services and sidecars are running, notice how orders are passed from the `checkout` service to the `order-processor` service using Dapr service invoke. `checkout` service output: @@ -1077,10 +1057,9 @@ Dapr invokes an application on any Dapr instance. In the code, the sidecar progr ``` ### Step 5: Introduce a fault +Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, service invoke operations from the `checkout` service begin to fail. -Simulate a fault by stopping the `order-processor` service. Once the instance is stopped, write and read operations from the order-processor service begin to fail. - -Since the `resiliency.yaml` spec defines the `order-processor` service as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `order-processor` service as a resiliency target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -1164,7 +1143,7 @@ Once you restart the `order-processor` service, the application will recover sea In the `order-processor` service terminal, restart the application: ```bash -dapr run --app-port 6001 --app-id order-processor --app-protocol http --dapr-http-port 3501 -- go run . +dapr run --app-port 6001 --app-id order-processor --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3501 -- go run . ``` `checkout` service output: diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index f7e8523e0..8e505a154 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -1,7 +1,7 @@ --- type: docs -title: "Quickstart: Service-to-component resiliency" -linkTitle: "Resiliency: State Management" +title: "Quickstart: service-to-component resiliency" +linkTitle: "Resiliency: service-to-component" weight: 110 description: "Get started with Dapr's resiliency capabilities via the state management API" --- From 68f8951f746e1383e71bcb3d3c53bd9a5c7b5931 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 16 Nov 2022 15:49:55 -0600 Subject: [PATCH 043/116] updates per Nick review Signed-off-by: Hannah Hunter --- .../resiliency/resiliency-state-quickstart.md | 123 +++++++++--------- 1 file changed, 59 insertions(+), 64 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index f7e8523e0..34b49bb47 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -1,7 +1,7 @@ --- type: docs title: "Quickstart: Service-to-component resiliency" -linkTitle: "Resiliency: State Management" +linkTitle: "Resiliency: App-to-service" weight: 110 description: "Get started with Dapr's resiliency capabilities via the state management API" --- @@ -13,8 +13,8 @@ description: "Get started with Dapr's resiliency capabilities via the state mana Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: - Execute a microservice application with resiliency enabled that continuously persists and retrieves state via Dapr's state management API. -- Trigger the resiliency spec by simulating a system failure. -- Remove the failure to allow the microservice application to resume. +- Trigger resiliency policies by simulating a system failure. +- Resolve the failure and the microservice application will resume. Diagram showing the resiliency applied to Dapr APIs @@ -56,13 +56,8 @@ pip3 install -r requirements.txt ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -```bash -dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- python3 -``` - -The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. @@ -95,6 +90,11 @@ The resilency spec is: circuitBreaker: simpleCB ``` + +```bash +dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- python3 +``` + Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). ```bash @@ -110,9 +110,9 @@ Once the application has started, the `order-processor`service writes and reads ### Step 3: Introduce a fault -Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -123,19 +123,19 @@ Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a ta circuitBreaker: simpleCB ``` -In a new terminal window, run the following command: +In a new terminal window, run the following command to stop Redis: ```bash docker stop dapr_redis ``` -Once the first request fails, the retry policy titled `retryForever` is applied: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -Retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -228,13 +228,8 @@ npm install ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -```bash -dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- npm start -``` - -The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. @@ -267,6 +262,10 @@ The resilency spec is: circuitBreaker: simpleCB ``` +```bash +dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- npm start +``` + Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). ```bash @@ -282,9 +281,9 @@ Once the application has started, the `order-processor`service writes and reads ### Step 3: Introduce a fault -Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -295,19 +294,19 @@ Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a ta circuitBreaker: simpleCB ``` -In a new terminal window, run the following command: +In a new terminal window, run the following command to stop Redis: ```bash docker stop dapr_redis ``` -Once the first request fails, the retry policy titled `retryForever` is applied: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -Retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -401,13 +400,8 @@ dotnet build ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- dotnet run -``` - -The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. @@ -440,6 +434,10 @@ The resilency spec is: circuitBreaker: simpleCB ``` +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- dotnet run +``` + Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). ```bash @@ -455,9 +453,9 @@ Once the application has started, the `order-processor`service writes and reads ### Step 3: Introduce a fault -Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -468,19 +466,19 @@ Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a ta circuitBreaker: simpleCB ``` -In a new terminal window, run the following command: +In a new terminal window, run the following command to stop Redis: ```bash docker stop dapr_redis ``` -Once the first request fails, the retry policy titled `retryForever` is applied: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -Retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -576,13 +574,8 @@ mvn clean install ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar -``` - -The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. @@ -615,6 +608,10 @@ The resilency spec is: circuitBreaker: simpleCB ``` +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- java -jar target/OrderProcessingService-0.0.1-SNAPSHOT.jar +``` + Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). ```bash @@ -630,9 +627,9 @@ Once the application has started, the `order-processor`service writes and reads ### Step 3: Introduce a fault -Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -643,19 +640,19 @@ Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a ta circuitBreaker: simpleCB ``` -In a new terminal window, run the following command: +In a new terminal window, run the following command to stop Redis: ```bash docker stop dapr_redis ``` -Once the first request fails, the retry policy titled `retryForever` is applied: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -Retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: @@ -748,13 +745,8 @@ go build . ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -```bash -dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components -- go run . -``` - -The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. @@ -764,7 +756,7 @@ The resilency spec is: metadata: name: myresiliency scopes: - - order-processor + - checkout spec: policies: @@ -781,13 +773,16 @@ The resilency spec is: trip: consecutiveFailures >= 5 targets: - components: - statestore: - outbound: - retry: retryForever - circuitBreaker: simpleCB + apps: + order-processor: + retry: retryForever + circuitBreaker: simpleCB ``` +```bash +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components -- go run . +``` + Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). ```bash @@ -803,9 +798,9 @@ Once the application has started, the `order-processor`service writes and reads ### Step 3: Introduce a fault -Simulate a fault by stopping the Redis `statestore.yaml` instance that was initalized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the order-processor service begin to fail. +Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -816,19 +811,19 @@ Since the `resiliency.yaml` spec defines the `statestore.yaml` component as a ta circuitBreaker: simpleCB ``` -In a new terminal window, run the following command: +In a new terminal window, run the following command to stop Redis: ```bash docker stop dapr_redis ``` -Once the first request fails, the retry policy titled `retryForever` is applied: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... ``` -Retries will continue for each failed request indefinitely, in 5 second intervals. +As per the `retryFroever` policy, retries will continue for each failed request indefinitely, in 5 second intervals. ```yaml retryForever: From 1769f15faca5654d87a73891e099700a034e1cfd Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Wed, 16 Nov 2022 14:48:13 -0800 Subject: [PATCH 044/116] Update daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../integrations/Azure/azure-kubernetes-service-extension.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md index a972b5792..a8dab479e 100644 --- a/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md +++ b/daprdocs/content/en/developing-applications/integrations/Azure/azure-kubernetes-service-extension.md @@ -106,4 +106,4 @@ dapr-sidecar-injector-9555889bc-rpjwl 1/1 Running 0 1h dapr-sidecar-injector-9555889bc-rqjgt 1/1 Running 0 1h ``` -For further information such as configuration options and targeting specific versions of Dapr, see the official [AKS Dapr Extension Docs](https://docs.microsoft.com/azure/aks/dapr). +For more information about configuration options and targeting specific Dapr versions, see the official [AKS Dapr Extension Docs](https://docs.microsoft.com/azure/aks/dapr). From 2d7f4cd1e426ce01380172f8183f2e6528c1213c Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 17 Nov 2022 12:10:41 -0600 Subject: [PATCH 045/116] capitalize Dapr Signed-off-by: Hannah Hunter --- .../resiliency-serviceinvo-quickstart.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md index f37a240b1..f338bde8a 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-serviceinvo-quickstart.md @@ -1,7 +1,7 @@ --- type: docs -title: "Quickstart: service-to-service resiliency" -linkTitle: "Resiliency: service-to-service" +title: "Quickstart: Service-to-service resiliency" +linkTitle: "Resiliency: Service-to-service" weight: 120 description: "Get started with Dapr's resiliency capabilities via the service invocation API" --- @@ -12,7 +12,7 @@ description: "Get started with Dapr's resiliency capabilities via the service in Observe Dapr resiliency capabilities by simulating a system failure. In this Quickstart, you will: -- Run two microservice applications, `checkout` and `order-processor`. `checkout` will continuously make Dapr service invocation requests to `order-processor`. +- Run two microservice applications: `checkout` and `order-processor`. `checkout` will continuously make Dapr service invocation requests to `order-processor`. - Trigger the resiliency spec by simulating a system failure. - Remove the failure to allow the microservice application to recover. @@ -82,7 +82,7 @@ Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter ap dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- python3 app.py ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -305,13 +305,13 @@ Install dependencies: npm install ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. ```bash dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- npm start ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -537,13 +537,13 @@ dotnet restore dotnet build ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. ```bash dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- dotnet run ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -769,13 +769,13 @@ Install dependencies: mvn clean install ``` -Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. +Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter applies a Dapr configuration that enables the resiliency feature. ```bash dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- java -jar target/CheckoutService-0.0.1-SNAPSHOT.jar ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 @@ -1004,7 +1004,7 @@ Run the `checkout` service alongside a Dapr sidecar. The `--config` parameter ap dapr run --app-id checkout --config ../config.yaml --components-path ../../../components/ --app-protocol http --dapr-http-port 3500 -- go run . ``` -By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the dapr sidecar: +By enabling resiliency, the resiliency spec located in the components directory is detected and loaded by the Dapr sidecar: ```yaml apiVersion: dapr.io/v1alpha1 From 302f3dc8a2f8a9030ae41dc34892d21836284aa8 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:35:31 -0800 Subject: [PATCH 046/116] Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../quickstarts/resiliency/resiliency-state-quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index 6f5f37224..44a44f58e 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -745,7 +745,7 @@ go build . ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. From 21a7611c2b78ccb379fe8c69a03f23e5ca1b8c27 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:35:39 -0800 Subject: [PATCH 047/116] Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../quickstarts/resiliency/resiliency-state-quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index 44a44f58e..335874d91 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -228,7 +228,7 @@ npm install ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. From c8bac817e7b8a4131c4b23566ed6ce0b90330d05 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:35:46 -0800 Subject: [PATCH 048/116] Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../quickstarts/resiliency/resiliency-state-quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index 335874d91..441e6f5cd 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -56,7 +56,7 @@ pip3 install -r requirements.txt ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. From ea5ae8dc0d61eeb2dac31aacf154193276d2c03c Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:35:52 -0800 Subject: [PATCH 049/116] Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../quickstarts/resiliency/resiliency-state-quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index 441e6f5cd..5c522dea0 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -574,7 +574,7 @@ mvn clean install ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. From 081f0bf277cbb17af2feb676606fff8bf57bcd17 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Thu, 17 Nov 2022 10:35:59 -0800 Subject: [PATCH 050/116] Update daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md Signed-off-by: greenie-msft <56556602+greenie-msft@users.noreply.github.com> --- .../quickstarts/resiliency/resiliency-state-quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index 5c522dea0..fef5c94f7 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -400,7 +400,7 @@ dotnet build ### Step 2: Run the application with resiliency enabled -Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: +Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: - Located in the `components` directory. - Automatically discovered by the Dapr sidecar when run in standalone mode. From 1154bc7c3480e1bdf6d60d220bfe9fa1088ace1d Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Thu, 17 Nov 2022 10:49:36 -0800 Subject: [PATCH 051/116] Fix resiliency component quickstart Signed-off-by: Nick Greenfield --- .../resiliency/resiliency-state-quickstart.md | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index fef5c94f7..d7ccf1b87 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -58,9 +58,6 @@ pip3 install -r requirements.txt Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. - ```yaml apiVersion: dapr.io/v1alpha1 kind: Resiliency @@ -112,7 +109,7 @@ Once the application has started, the `order-processor`service writes and reads Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -129,7 +126,7 @@ In a new terminal window, run the following command to stop Redis: docker stop dapr_redis ``` -Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... @@ -230,9 +227,6 @@ npm install Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. - ```yaml apiVersion: dapr.io/v1alpha1 kind: Resiliency @@ -283,7 +277,7 @@ Once the application has started, the `order-processor`service writes and reads Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -300,7 +294,7 @@ In a new terminal window, run the following command to stop Redis: docker stop dapr_redis ``` -Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... @@ -402,9 +396,6 @@ dotnet build Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. - ```yaml apiVersion: dapr.io/v1alpha1 kind: Resiliency @@ -455,7 +446,7 @@ Once the application has started, the `order-processor`service writes and reads Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -472,7 +463,7 @@ In a new terminal window, run the following command to stop Redis: docker stop dapr_redis ``` -Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... @@ -576,9 +567,6 @@ mvn clean install Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. - ```yaml apiVersion: dapr.io/v1alpha1 kind: Resiliency @@ -629,7 +617,7 @@ Once the application has started, the `order-processor`service writes and reads Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -646,7 +634,7 @@ In a new terminal window, run the following command to stop Redis: docker stop dapr_redis ``` -Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output below shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... @@ -747,9 +735,6 @@ go build . Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` command below, the `--config` parameter applies a Dapr configuration that enables the resiliency feature. By enabling resiliency, the resiliency spec located in the components directory is loaded by the `order-processor` sidecar. The resilency spec is: -- Located in the `components` directory. -- Automatically discovered by the Dapr sidecar when run in standalone mode. - ```yaml apiVersion: dapr.io/v1alpha1 kind: Resiliency @@ -800,7 +785,7 @@ Once the application has started, the `order-processor`service writes and reads Simulate a fault by stopping the Redis container instance that was initialized when executing `dapr init` on your development machine. Once the instance is stopped, write and read operations from the `order-processor` service begin to fail. -Since the `resiliency.yaml` spec defines the `statestore` as component target, all failed requests will apply retry and circuit breaker policies: +Since the `resiliency.yaml` spec defines `statestore` as a component target, all failed requests will apply retry and circuit breaker policies: ```yaml targets: @@ -817,7 +802,7 @@ In a new terminal window, run the following command to stop Redis: docker stop dapr_redis ``` -Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output shows the logs from the `order-processor` service: +Once Redis is stopped, the requests begin to fail and the retry policy titled `retryForever` is applied. The output belows shows the logs from the `order-processor` service: ```bash INFO[0006] Error processing operation component[statestore] output. Retrying... From 320ed537ff69fe515ec53e769bd9fc54f7236aee Mon Sep 17 00:00:00 2001 From: Nick Greenfield Date: Thu, 17 Nov 2022 15:40:38 -0800 Subject: [PATCH 052/116] Update runtime version to 1.9.4 Signed-off-by: Nick Greenfield --- .../en/operations/support/support-release-policy.md | 11 ++++++----- daprdocs/layouts/shortcodes/dapr-latest-version.html | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index 2da2fdd50..4983d8e80 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,6 +34,7 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| +| November 17th 2022 | 1.94
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | | October 26th 2022 | 1.9.1
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | @@ -79,14 +80,14 @@ General guidance on upgrading can be found for [self hosted mode]({{< ref self-h | | 1.6.0 | 1.6.2 | | | 1.6.2 | 1.7.5 | | | 1.7.5 | 1.8.6 | -| | 1.8.6 | 1.9.3 | +| | 1.8.6 | 1.9.4 | | 1.6.0 to 1.6.2 | N/A | 1.7.5 | | | 1.7.5 | 1.8.6 | -| | 1.8.6 | 1.9.3 | +| | 1.8.6 | 1.9.4 | | 1.7.0 to 1.7.5 | N/A | 1.8.6 | -| | 1.8.6 | 1.9.3 | -| 1.8.0 to 1.8.6 | N/A | 1.9.3 | -| 1.9.0 | N/A | 1.9.3 | +| | 1.8.6 | 1.9.4 | +| 1.8.0 to 1.8.6 | N/A | 1.9.4 | +| 1.9.0 | N/A | 1.9.4 | ## Breaking changes and deprecations diff --git a/daprdocs/layouts/shortcodes/dapr-latest-version.html b/daprdocs/layouts/shortcodes/dapr-latest-version.html index 05f5194a4..49eb9f024 100644 --- a/daprdocs/layouts/shortcodes/dapr-latest-version.html +++ b/daprdocs/layouts/shortcodes/dapr-latest-version.html @@ -1 +1 @@ -{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.3{{ else if .Get "cli" }}1.9.0{{ else }}1.9.3{{ end -}} +{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.4{{ else if .Get "cli" }}1.9.0{{ else }}1.9.4{{ end -}} From e2fa30d3c205f9e9170c748092f1e3b3761ca284 Mon Sep 17 00:00:00 2001 From: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Date: Thu, 17 Nov 2022 22:34:21 -0600 Subject: [PATCH 053/116] Update subscription examples (#2957) * dotnet submodule Signed-off-by: Hannah Hunter * update to v2alpha Signed-off-by: Hannah Hunter * revert some changes Signed-off-by: Hannah Hunter * update routes Signed-off-by: Hannah Hunter Signed-off-by: Hannah Hunter --- .../building-blocks/pubsub/howto-publish-subscribe.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index ff530a047..138dcc5d6 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -155,13 +155,14 @@ Learn more in the [declarative and programmatic subscriptions doc]({{< ref subsc Create a file named `subscription.yaml` and paste the following: ```yaml -apiVersion: dapr.io/v1alpha1 +apiVersion: dapr.io/v2alpha1 kind: Subscription metadata: name: order-pub-sub spec: topic: orders - route: /checkout + routes: + default: /checkout pubsubname: order-pub-sub scopes: - orderprocessing From b540fa308cef58efb7e3738c303f235773d1419f Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 19 Nov 2022 19:04:57 -0700 Subject: [PATCH 054/116] Kafka SASL SCRAM Authentication (#2939) * Adds settings for SASL SCRAM SHA-256 and SHA-512 Signed-off-by: Andrew * Update setup-apache-kafka.md Signed-off-by: Andrew Signed-off-by: Andrew Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mukundan Sundararajan <65565396+mukundansundar@users.noreply.github.com> Co-authored-by: Yaron Schneider --- .../supported-pubsub/setup-apache-kafka.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md index 0817524ef..86d4a350c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-apache-kafka.md @@ -34,6 +34,8 @@ spec: secretKeyRef: name: kafka-secrets key: saslPasswordSecret + - name: saslMechanism + value: "SHA-512" - name: maxMessageBytes # Optional. value: 1024 - name: consumeRetryInterval # Optional. @@ -55,6 +57,7 @@ spec: | authType | Y | Configure or disable authentication. Supported values: `none`, `password`, `mtls`, or `oidc` | `"password"`, `"none"` | saslUsername | N | The SASL username used for authentication. Only required if `authType` is set to `"password"`. | `"adminuser"` | saslPassword | N | The SASL password used for authentication. Can be `secretKeyRef` to use a [secret reference]({{< ref component-secrets.md >}}). Only required if `authType is set to `"password"`. | `""`, `"KeFg23!"` +| saslMechanism | N | The SASL Authentication Mechanism you wish to use. Only required if `authType` is set to `"password"`. Defaults to `PLAINTEXT` | `"SHA-512", "SHA-256", "PLAINTEXT"` | initialOffset | N | The initial offset to use if no offset was previously committed. Should be "newest" or "oldest". Defaults to "newest". | `"oldest"` | maxMessageBytes | N | The maximum size in bytes allowed for a single Kafka message. Defaults to 1024. | `2048` | consumeRetryInterval | N | The interval between retries when attempting to consume topics. Treats numbers without suffix as milliseconds. Defaults to 100ms. | `200ms` | @@ -111,8 +114,7 @@ spec: #### SASL Password -Setting `authType` to `password` enables [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication using the **PLAIN** mechanism. This requires setting -the `saslUsername` and `saslPassword` fields. +Setting `authType` to `password` enables [SASL](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer) authentication. This requires setting the `saslUsername` and `saslPassword` fields. ```yaml apiVersion: dapr.io/v1alpha1 @@ -137,6 +139,8 @@ spec: secretKeyRef: name: kafka-secrets key: saslPasswordSecret + - name: saslMechanism + value: "SHA-512" - name: maxMessageBytes # Optional. value: 1024 - name: consumeRetryInterval # Optional. From 18f5e6669021eee9de038b44be7b907ccddaf173 Mon Sep 17 00:00:00 2001 From: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> Date: Wed, 23 Nov 2022 23:08:31 +0530 Subject: [PATCH 055/116] Update fluentd.md (#2967) Elastic search installed by helm will version 8 series which does not let dapr connect with kibana(Because it enables authentication), After using version 7 series works as expected Signed-off-by: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> Signed-off-by: vikram-thiru <113989405+vikram-thiru@users.noreply.github.com> --- .../content/en/operations/monitoring/logging/fluentd.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/operations/monitoring/logging/fluentd.md b/daprdocs/content/en/operations/monitoring/logging/fluentd.md index 4dbd1d171..b456b8d95 100644 --- a/daprdocs/content/en/operations/monitoring/logging/fluentd.md +++ b/daprdocs/content/en/operations/monitoring/logging/fluentd.md @@ -32,25 +32,25 @@ description: "How to install Fluentd, Elastic Search, and Kibana to search logs By default, the chart creates 3 replicas which must be on different nodes. If your cluster has fewer than 3 nodes, specify a smaller number of replicas. For example, this sets the number of replicas to 1: ```bash - helm install elasticsearch elastic/elasticsearch -n dapr-monitoring --set replicas=1 + helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set replicas=1 ``` Otherwise: ```bash - helm install elasticsearch elastic/elasticsearch -n dapr-monitoring + helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring ``` If you are using minikube or simply want to disable persistent volumes for development purposes, you can do so by using the following command: ```bash - helm install elasticsearch elastic/elasticsearch -n dapr-monitoring --set persistence.enabled=false,replicas=1 + helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set persistence.enabled=false,replicas=1 ``` 4. Install Kibana ```bash - helm install kibana elastic/kibana -n dapr-monitoring + helm install kibana elastic/kibana --version 7.17.3 -n dapr-monitoring ``` 5. Ensure that Elastic Search and Kibana are running in your Kubernetes cluster From 976dcab9ce725c1ed9ce7b5e77d8d56de3e89777 Mon Sep 17 00:00:00 2001 From: Chris Kingdon Date: Wed, 23 Nov 2022 12:54:39 -0500 Subject: [PATCH 056/116] Adding missing brace for json document example (#2968) There is a missing brace in the example json Signed-off-by: Chris Kingdon Signed-off-by: Chris Kingdon Co-authored-by: Yaron Schneider --- .../components-reference/supported-state-stores/setup-redis.md | 1 + 1 file changed, 1 insertion(+) diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md index 4a1eb18ce..3c323b074 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-redis.md @@ -230,6 +230,7 @@ Consider an example where you store documents like that: }, "city": "Seattle", "state": "WA" + } } ``` From 9ee2e27b40514c35885cb1e40a9da18265b1e894 Mon Sep 17 00:00:00 2001 From: "Renato L. de F. Cunha" Date: Fri, 25 Nov 2022 19:37:19 -0300 Subject: [PATCH 057/116] Update Kubernetes job page (#2973) Adds a paragraph mentioning `restartPolicy` needs to be set to `Never` for successful job completion. Signed-off-by: Renato L. de F. Cunha Signed-off-by: Renato L. de F. Cunha --- .../en/operations/hosting/kubernetes/kubernetes-job.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md index 6691c742c..0b2139fdd 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-job.md @@ -14,9 +14,12 @@ To address this issue the Dapr sidecar has an endpoint to `Shutdown` the sidecar When running a basic [Kubernetes Job](https://kubernetes.io/docs/concepts/workloads/controllers/job/) you will need to call the `/shutdown` endpoint for the sidecar to gracefully stop and the job will be considered `Completed`. -When a job is finish without calling `Shutdown` your job will be in a `NotReady` state with only the `daprd` container running endlessly. +When a job is finished without calling `Shutdown`, your job will be in a `NotReady` state with only the `daprd` container running endlessly. -Be sure and use the *POST* HTTP verb when calling the shutdown API. +Stopping the dapr sidecar will cause its readiness and liveness probes to fail in your container because the dapr sidecar was shutdown. +To prevent Kubernetes from trying to restart your job, set your job's `restartPolicy` to `Never`. + +Be sure to use the *POST* HTTP verb when calling the shutdown HTTP API. ```yaml apiVersion: batch/v1 @@ -37,7 +40,7 @@ spec: restartPolicy: Never ``` -You can also call the `Shutdown` from any of the Dapr SDK +You can also call the `Shutdown` from any of the Dapr SDKs ```go package main From 661a8ff5c846f8cd4548a465d1c92f4c455563f1 Mon Sep 17 00:00:00 2001 From: shivam Date: Mon, 28 Nov 2022 22:41:02 +0530 Subject: [PATCH 058/116] Remove backoffmaxretries from pubsub.mqtt metadata spec Signed-off-by: shivam --- .../components-reference/supported-pubsub/setup-mqtt.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md index 250e681a8..1fbfa6105 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-mqtt.md @@ -49,8 +49,6 @@ The above example uses secrets as plain strings. It is recommended to use a secr | caCert | Required for using TLS | Certificate Authority (CA) certificate in PEM format for verifying server TLS certificates. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientCert | Required for using TLS | TLS client certificate in PEM format. Must be used with `clientKey`. | `"-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----"` | clientKey | Required for using TLS | TLS client key in PEM format. Must be used with `clientCert`. Can be `secretKeyRef` to use a secret reference. | `"-----BEGIN RSA PRIVATE KEY-----\n\n-----END RSA PRIVATE KEY-----"` -| backOffMaxRetries | N | The maximum number of retries to process the message before returning an error. Defaults to `"0"`, which means that no retries will be attempted. `"-1"` can be specified to indicate that messages should be retried indefinitely until they are successfully processed or the application is shutdown. The component will wait 5 seconds between retries. | `"3"` - ### Communication using TLS To configure communication using TLS, ensure that the MQTT broker (e.g. mosquitto) is configured to support certificates and provide the `caCert`, `clientCert`, `clientKey` metadata in the component configuration. For example: From 1da9cb47f671f1b0717d8fd06ca81d80b66fc91b Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Wed, 30 Nov 2022 15:45:08 -0800 Subject: [PATCH 059/116] Fix resiliency run command in quickstart (#2983) Signed-off-by: Nick Greenfield Signed-off-by: Nick Greenfield --- .../quickstarts/resiliency/resiliency-state-quickstart.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md index d7ccf1b87..ef34f4a69 100644 --- a/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md +++ b/daprdocs/content/en/getting-started/quickstarts/resiliency/resiliency-state-quickstart.md @@ -89,7 +89,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ```bash -dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- python3 +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- python3 ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). @@ -257,7 +257,7 @@ Run the `order-processor` service alongside a Dapr sidecar. In the `dapr run` co ``` ```bash -dapr run --app-id order-processor ../config.yaml --components-path ../../../components/ -- npm start +dapr run --app-id order-processor --config ../config.yaml --components-path ../../../components/ -- npm start ``` Once the application has started, the `order-processor`service writes and reads `orderId` key/value pairs to the `statestore` Redis instance [defined in the `statestore.yaml` component]({{< ref "statemanagement-quickstart.md#statestoreyaml-component-file" >}}). From f5bccb74f037ae451f4371abe713e028036f6079 Mon Sep 17 00:00:00 2001 From: greenie-msft <56556602+greenie-msft@users.noreply.github.com> Date: Fri, 2 Dec 2022 10:19:52 -0800 Subject: [PATCH 060/116] Update version to 1.9.5 (#2987) --- .../support/support-release-policy.md | 17 +++++++++-------- .../layouts/shortcodes/dapr-latest-version.html | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/daprdocs/content/en/operations/support/support-release-policy.md b/daprdocs/content/en/operations/support/support-release-policy.md index 4983d8e80..d83034d58 100644 --- a/daprdocs/content/en/operations/support/support-release-policy.md +++ b/daprdocs/content/en/operations/support/support-release-policy.md @@ -34,9 +34,10 @@ The table below shows the versions of Dapr releases that have been tested togeth | Release date | Runtime | CLI | SDKs | Dashboard | Status | |--------------------|:--------:|:--------|---------|---------|---------| -| November 17th 2022 | 1.94
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | -| November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | -| November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| December 2nd 2022 | 1.9.5
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported (current) | +| November 17th 2022 | 1.9.4
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| November 4th 2022 | 1.9.3
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | +| November 1st 2022 | 1.9.2
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | | October 26th 2022 | 1.9.1
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.1
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | | October 13th 2022 | 1.9.0
| 1.9.1 | Java 1.7.0
Go 1.6.0
PHP 1.1.0
Python 1.8.3
.NET 1.9.0
JS 2.4.2 | 0.11.0 | Supported | | October 26th 2022 | 1.8.6
| 1.8.1 | Java 1.6.0
Go 1.5.0
PHP 1.1.0
Python 1.7.0
.NET 1.8.0
JS 2.3.0 | 0.11.0 | Supported | @@ -80,14 +81,14 @@ General guidance on upgrading can be found for [self hosted mode]({{< ref self-h | | 1.6.0 | 1.6.2 | | | 1.6.2 | 1.7.5 | | | 1.7.5 | 1.8.6 | -| | 1.8.6 | 1.9.4 | +| | 1.8.6 | 1.9.5 | | 1.6.0 to 1.6.2 | N/A | 1.7.5 | | | 1.7.5 | 1.8.6 | -| | 1.8.6 | 1.9.4 | +| | 1.8.6 | 1.9.5 | | 1.7.0 to 1.7.5 | N/A | 1.8.6 | -| | 1.8.6 | 1.9.4 | -| 1.8.0 to 1.8.6 | N/A | 1.9.4 | -| 1.9.0 | N/A | 1.9.4 | +| | 1.8.6 | 1.9.5 | +| 1.8.0 to 1.8.6 | N/A | 1.9.5 | +| 1.9.0 | N/A | 1.9.5 | ## Breaking changes and deprecations diff --git a/daprdocs/layouts/shortcodes/dapr-latest-version.html b/daprdocs/layouts/shortcodes/dapr-latest-version.html index 49eb9f024..df0cb50be 100644 --- a/daprdocs/layouts/shortcodes/dapr-latest-version.html +++ b/daprdocs/layouts/shortcodes/dapr-latest-version.html @@ -1 +1 @@ -{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.4{{ else if .Get "cli" }}1.9.0{{ else }}1.9.4{{ end -}} +{{- if .Get "short" }}1.9{{ else if .Get "long" }}1.9.5{{ else if .Get "cli" }}1.9.0{{ else }}1.9.5{{ end -}} From 28f05d286bea940b7b03e1276f908cf5bfd31a69 Mon Sep 17 00:00:00 2001 From: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> Date: Mon, 5 Dec 2022 18:30:48 +0000 Subject: [PATCH 061/116] Updated per feedback Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com> --- .../components-reference/supported-pubsub/setup-hazelcast.md | 4 +++- daprdocs/data/components/pubsub/generic.yaml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md index 581d5a874..b26bd27c9 100644 --- a/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md +++ b/daprdocs/content/en/reference/components-reference/supported-pubsub/setup-hazelcast.md @@ -7,7 +7,9 @@ aliases: - "/operations/components/setup-pubsub/supported-pubsub/setup-hazelcast/" --- -> **Deprecation notice**: The Hazelcast PubSub component has been deprecated due to inherent lack of support for "at least once" delivery guarantee, and will be removed in a future Dapr release. +{{% alert title="Deprecation notice" color="warning" %}} +The Hazelcast PubSub component has been deprecated due to inherent lack of support for "at least once" delivery guarantee, and will be removed in a future Dapr release. +{{% /alert %}} ## Component format To setup hazelcast pubsub create a component of type `pubsub.hazelcast`. See [this guide]({{< ref "howto-publish-subscribe.md#step-1-setup-the-pubsub-component" >}}) on how to create and apply a pubsub configuration. diff --git a/daprdocs/data/components/pubsub/generic.yaml b/daprdocs/data/components/pubsub/generic.yaml index 0d8873b7f..58fde998f 100644 --- a/daprdocs/data/components/pubsub/generic.yaml +++ b/daprdocs/data/components/pubsub/generic.yaml @@ -2,7 +2,7 @@ link: setup-hazelcast state: Deprecated version: v1 - since: "1.7" + since: "1.9" - component: In Memory link: setup-inmemory state: Beta From d6d51bab8bca2a4ab8b29b80c62e80fe516fbd21 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 12 Dec 2022 17:13:49 -0600 Subject: [PATCH 062/116] clarify app namespace Signed-off-by: Hannah Hunter --- .../service-invocation/howto-invoke-discover-services.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md index f302bc1b9..e73456d4b 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md +++ b/daprdocs/content/en/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services.md @@ -405,9 +405,9 @@ dapr invoke --app-id checkout --method checkout/100 ### Namespaces -When running on [namespace supported platforms]({{< ref "service_invocation_api.md#namespace-supported-platforms" >}}), you include the namespace of the target app in the app ID: `checkout.production` +When running on [namespace supported platforms]({{< ref "service_invocation_api.md#namespace-supported-platforms" >}}), you include the namespace of the target app in the app ID. For example, following the `.` format, use `checkout.production`. -For example, invoking the example service with a namespace would look like: +Using this example, invoking the service with a namespace would look like: ```bash curl http://localhost:3602/v1.0/invoke/checkout.production/method/checkout/100 -X POST From 05850e7f5b380aa60ce962fd881fe534d501e169 Mon Sep 17 00:00:00 2001 From: Tiago Alves Macambira Date: Tue, 13 Dec 2022 17:35:40 -0800 Subject: [PATCH 063/116] Improve Hashicorp Vault documentation on CA certificates. (#2988) * Improve Hashicorp Vault documentation on CA certificates. Hashicorp Vault component documentation for CA related fields (`caPem`, `caCert` and `caPath`) does not describe the precedence among those flags and a big ambiguous on what those flags mean. This PR tries to alliviate that. Closes #2989 Signed-off-by: Tiago Alves Macambira * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Tiago Alves Macambira Signed-off-by: Tiago Alves Macambira Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Mark Fussell --- .../hashicorp-vault.md | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md b/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md index 76a33c54c..19eaebdbd 100644 --- a/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md +++ b/daprdocs/content/en/reference/components-reference/supported-secret-stores/hashicorp-vault.md @@ -54,11 +54,11 @@ The above example uses secrets as plain strings. It is recommended to use a loca | Field | Required | Details | Example | |--------------------|:--------:|--------------------------------|---------------------| | vaultAddr | N | The address of the Vault server. Defaults to `"https://127.0.0.1:8200"` | `"https://127.0.0.1:8200"` | -| caCert | N | Certificate Authority use only one of the options. The encoded cacerts to use | `"cacerts"` | -| caPath | N | Certificate Authority use only one of the options. The path to a CA cert file | `"path/to/cacert/file"` | -| caPem | N | Certificate Authority use only one of the options. The encoded cacert pem to use | `"encodedpem"` | +| caPem | N | The inlined contents of the CA certificate to use, in PEM format. If defined, takes precedence over `caPath` and `caCert`. | See below | +| caPath | N | The path to a folder holding the CA certificate file to use, in PEM format. If the folder contains multiple files, only the first file found will be used. If defined, takes precedence over `caCert`. | `"path/to/cacert/holding/folder"` | +| caCert | N | The path to the CA certificate to use, in PEM format. | `""path/to/cacert.pem"` | | skipVerify | N | Skip TLS verification. Defaults to `"false"` | `"true"`, `"false"` | -| tlsServerName | N | TLS config server name | `"tls-server"` | +| tlsServerName | N | The name of the server requested during TLS handshake in order to support virtual hosting. This value is also used to verify the TLS certificate presented by Vault server. | `"tls-server"` | | vaultTokenMountPath | Y | Path to file containing token | `"path/to/file"` | | vaultToken | Y | [Token](https://learn.hashicorp.com/tutorials/vault/tokens) for authentication within Vault. | `"tokenValue"` | | vaultKVPrefix | N | The prefix in vault. Defaults to `"dapr"` | `"dapr"`, `"myprefix"` | @@ -109,9 +109,37 @@ $ curl http://localhost:3501/v1.0/secrets/my-hashicorp-vault/mysecret } ``` -Notice that the name of the secret (`mysecret`) is not repeated in the result. +Notice that the name of the secret (`mysecret`) is not repeated in the result. +## TLS Server verification + +The fields `skipVerify`, `tlsServerName`, `caCert`, `caPath`, and `caPem` control if and how Dapr verifies the vault server's certificate while connecting using TLS/HTTPS. + +### Inline CA PEM caPem + +The `caPem` field value should be the contents of the PEM CA certificate you want to use. Given PEM certificates are made of multiple lines, defining that value might seem challenging at first. YAML allows for a few ways of [defining a multiline values](https://yaml-multiline.info/). + +Below is one way to define a `caPem` field. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: vault +spec: + type: secretstores.hashicorp.vault + version: v1 + metadata: + - name: vaultAddr + value: https://127.0.0.1:8200 + - name: caPem + value: |- + -----BEGIN CERTIFICATE----- + << the rest of your PEM file content's here, indented appropriately. >> + -----END CERTIFICATE----- +``` + ## Related links - [Secrets building block]({{< ref secrets >}}) - [How-To: Retrieve a secret]({{< ref "howto-secrets.md" >}}) From eac8e9ffbf5f23b2c4db058126bbe307f8c48bcc Mon Sep 17 00:00:00 2001 From: Ryan Lettieri <67934986+RyanLettieri@users.noreply.github.com> Date: Tue, 13 Dec 2022 18:47:32 -0700 Subject: [PATCH 064/116] Removing stored procedure references from cosmosDB docs (#3000) Signed-off-by: Ryan Lettieri Signed-off-by: Ryan Lettieri Co-authored-by: Ryan Lettieri Co-authored-by: Mark Fussell --- .../setup-azure-cosmosdb.md | 56 ------------------- 1 file changed, 56 deletions(-) diff --git a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md index caf8fb0ee..2c7a4651c 100644 --- a/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md +++ b/daprdocs/content/en/reference/components-reference/supported-state-stores/setup-azure-cosmosdb.md @@ -168,62 +168,6 @@ az cosmosdb sql role assignment create \ --role-definition-id "$ROLE_ID" ``` -### Creating the stored procedures for Dapr - -When using Cosmos DB as a state store for Dapr, we need to create two stored procedures in your collection. When you configure the state store using a "master key", Dapr creates those for you, automatically. However, when your state store authenticates with Cosmos DB using Azure AD, because of limitations in the platform we are not able to do it automatically. - -If you are using Azure AD to authenticate your Cosmos DB state store and have not created the stored procedures (or if you are using an outdated version of them), your Dapr sidecar will fail to start and you will see an error similar to this in your logs: - -```text -Dapr requires stored procedures created in Cosmos DB before it can be used as state store. Those stored procedures are currently not existing or are using a different version than expected. When you authenticate using Azure AD we cannot automatically create them for you: please start this state store with a Cosmos DB master key just once so we can create the stored procedures for you; otherwise, you can check our docs to learn how to create them yourself: https://aka.ms/dapr/cosmosdb-aad -``` - -To fix this issue, you have two options: - -1. Configure your component to authenticate with the "master key" just once, to have Dapr automatically initialize the stored procedures for you. While you need to use a "master key" the first time you launch your application, you should be able to remove that and use Azure AD credentials (including Managed Identities) after. -2. Alternatively, you can follow the steps below to create the stored procedures manually. These steps must be performed before you can start your application the first time. - -To create the stored procedures manually, you can use the commands below. - -First, download the code of the stored procedures for the version of Dapr that you're using. This will create two `.js` files in your working directory: - -```sh -# Set this to the version of Dapr that you're using -DAPR_VERSION="release-{{% dapr-latest-version short="true" %}}" -curl -LfO "https://raw.githubusercontent.com/dapr/components-contrib/${DAPR_VERSION}/state/azure/cosmosdb/storedprocedures/__daprver__.js" -curl -LfO "https://raw.githubusercontent.com/dapr/components-contrib/${DAPR_VERSION}/state/azure/cosmosdb/storedprocedures/__dapr_v2__.js" -``` - -> You won't need to update the code for the stored procedures every time you update Dapr. Although the code for the stored procedures doesn't change often, sometimes we may make updates to that: when that happens, if you're using Azure AD authentication your Dapr sidecar will fail to launch until you update the stored procedures, re-running the commands above. - -Then, using the Azure CLI create the stored procedures in Cosmos DB, for your account, database, and collection (or container): - -```sh -# Name of the Resource Group that contains your Cosmos DB -RESOURCE_GROUP="..." -# Name of your Cosmos DB account -ACCOUNT_NAME="..." -# Name of your database in the Cosmos DB account -DATABASE_NAME="..." -# Name of the container (collection) in your database -CONTAINER_NAME="..." - -az cosmosdb sql stored-procedure create \ - --resource-group "$RESOURCE_GROUP" \ - --account-name "$ACCOUNT_NAME" \ - --database-name "$DATABASE_NAME" \ - --container-name "$CONTAINER_NAME" \ - --name "__daprver__" \ - --body @__daprver__.js -az cosmosdb sql stored-procedure create \ - --resource-group "$RESOURCE_GROUP" \ - --account-name "$ACCOUNT_NAME" \ - --database-name "$DATABASE_NAME" \ - --container-name "$CONTAINER_NAME" \ - --name "__dapr_v2__" \ - --body @__dapr_v2__.js -``` - ## Related links - [Basic schema for a Dapr component]({{< ref component-schema >}}) From 7d07eb9aeeab2dd9528703f40aa1ceb72f599eeb Mon Sep 17 00:00:00 2001 From: Lenshood Date: Wed, 14 Dec 2022 11:40:15 +0800 Subject: [PATCH 065/116] fix broken ref in distributed_lock_api Signed-off-by: Lenshood --- daprdocs/content/en/reference/api/distributed_lock_api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daprdocs/content/en/reference/api/distributed_lock_api.md b/daprdocs/content/en/reference/api/distributed_lock_api.md index ba250e3ae..f79270218 100644 --- a/daprdocs/content/en/reference/api/distributed_lock_api.md +++ b/daprdocs/content/en/reference/api/distributed_lock_api.md @@ -21,7 +21,7 @@ POST http://localhost:/v1.0-alpha1/lock/ Parameter | Description --------- | ----------- `daprPort` | The Dapr port -`storename` | The `metadata.name` field component file. Refer to the [component schema] ({{< ref component-schema.md>}}) +`storename` | The `metadata.name` field component file. Refer to the [component schema]({{< ref component-schema.md >}}) #### Query Parameters @@ -95,7 +95,7 @@ POST http://localhost:/v1.0-alpha1/unlock/ Parameter | Description --------- | ----------- `daprPort` | The Dapr port -`storename` | The `metadata.name` field component file. Refer to the [component schema] ({{< ref component-schema.md>}}) +`storename` | The `metadata.name` field component file. Refer to the [component schema]({{< ref component-schema.md >}}) #### Query Parameters From 6d3f537f2f8ccf31b3dd9a28f17622a105e27cbb Mon Sep 17 00:00:00 2001 From: salaboy Date: Thu, 15 Dec 2022 20:52:43 +0000 Subject: [PATCH 066/116] Adding `helm repo update` (#3010) Signed-off-by: salaboy Signed-off-by: salaboy --- daprdocs/content/en/operations/monitoring/metrics/grafana.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/monitoring/metrics/grafana.md b/daprdocs/content/en/operations/monitoring/metrics/grafana.md index 7bdc29ead..edbd807bd 100644 --- a/daprdocs/content/en/operations/monitoring/metrics/grafana.md +++ b/daprdocs/content/en/operations/monitoring/metrics/grafana.md @@ -42,6 +42,7 @@ The `grafana-actor-dashboard.json` template shows Dapr Sidecar status, actor inv ```bash helm repo add grafana https://grafana.github.io/helm-charts + helm repo update ``` 1. Install the chart: @@ -176,4 +177,4 @@ First you need to connect Prometheus as a data source to Grafana.