From a3a9751228b61837f9f10678581192f548fd36a1 Mon Sep 17 00:00:00 2001 From: mciesla Date: Thu, 27 Jun 2024 15:49:21 +0200 Subject: [PATCH 1/2] added multi-component fota tutorial --- docs/Coiote_IoT_DM/Multi_Component_update.md | 142 ++++++++++++++++++ docs/Coiote_IoT_DM/images/multi-component.png | Bin 57050 -> 11591 bytes mkdocs.yml | 1 + 3 files changed, 143 insertions(+) create mode 100644 docs/Coiote_IoT_DM/Multi_Component_update.md diff --git a/docs/Coiote_IoT_DM/Multi_Component_update.md b/docs/Coiote_IoT_DM/Multi_Component_update.md new file mode 100644 index 000000000..38ed9d9bb --- /dev/null +++ b/docs/Coiote_IoT_DM/Multi_Component_update.md @@ -0,0 +1,142 @@ +# Multi-Component Firmware Update + +Remotely update a component of your LwM2M device's firmware using the **Advanced Firmware Update Object** `/33629`. + +Object `/33629` is designed as an extension of the Firmware Update object `/5`. It supports multiple instances, each representing a "component" of the device's firmware that can be upgraded separately. The specific meaning and purpose of these components are not standardized and can vary depending on the implementation. However, they typically encompass elements such as bootloaders, application code, cellular modem firmwares, security processor firmwares, and other related firmware entities. + +## Prerequisites + +- An active [{{ coiote_short_name }}]({{ coiote_site_link }}/) user account +- A device which supports the Advanced Firmware Update Object `/33629` + +!!! Note + The **Anjay LwM2M Client** supports the Advanced Firmware Update Object. Learn more about Anjay by visiting the official **Anjay Documentation site** or **Anjay SDK on GitHub**. + +## Firmware Update Object `/33629` + +Object `/33629` defines the update process using **4 Update States** representing the phase of the update process. Additionally, a total of **13 Update Results** may be reported, representing the most common outcomes of the firmware update process. + +* **Resource** `/33629/*/3` represents the **State** +* **Resource** `/33629/*/5` represents the **Update Result** + +=== "**Update States**" + + | ID | State | Description | + | ----------- | ----------- | ----------- | + | `state 0` | **Idle** | Before downloading and after successfully updating | + | `state 1` | **Downloading** | The new firmware is on the way | + | `state 2` | **Downloaded** | The firmware download is completed | + | `state 3` | **Updating** | The Client starts updating its firmware, after which it changes its state back to *Idle* | + +=== "**Update Results**" + + | Result | Description | + | ----------- | ----------- | + | `update result 0` | **Initial value** | + | `update result 1` | **Firmware updated successfully** | + | `update result 2` | **Insufficient flash memory for the new firmware package** | + | `update result 3` | **Out of RAM during downloading proces** | + | `update result 4` | **Connection lost during downloading process** | + | `update result 5` | **Integrity check failure for new downloaded package** | + | `update result 6` | **Unsupported package type** | + | `update result 7` | **Invalid URI** | + | `update result 8` | **Firmware update failed** | + | `update result 9` | **Unsupported protocol** | + | `update result 10` | **Firmware update cancelled** | + | `update result 11` | **Firmware update deferred** | + | `update result 12` | **Conflicting state** | + | `update result 13` | **Dependency error** | + +## Prepare the Firmware Update + +1. In the {{ coiote_long_name }}, go to [**Device Inventory**]({{ coiote_site_link }}/ui/device/inventory). + +1. Select the device you want to update by clicking on its endpoint name. + +1. Go to the **Data model** tab to validate if the Firmware Update Object `/33629` is present. If so, the Object is supported by the LwM2M Client. + + !!! info + Each **Object Instance** represents a component of the device's firmware which can be updated. Click the Object Instances of Object `/33629` to see what components can be updated. + + ![Firmware update object](images/object-33629-instance0.png) + +1. Go to the **Firmware update** tab. + +1. Click the **Update Firmware** button. + + ![Update Firmware Tab](images/firmware-update-tab.png) + +1. Select **Multi-component Firmware Update**. + + ![Multi-Component Firmware Update](images/multi-component.png) + +1. Select the components you would like to update, e.g. modem, application or bootloader. + + ![Select component](images/select-component.png) + + !!! note + In this example, the modem firmware of the nRF9160 SiP is being updated using the delta update file: `mfw_nrf9160_update_from_1.3.3_to_1.3.4.bin` which is provided by [Nordic](https://www.nordicsemi.com/Products/Development-hardware/nRF9160-DK/Download?lang=en#infotabs). + +1. Upload the **firmware image**. + + ![Upload Firmware Image](images/upload.png) + +1. Choose between **Pull** and **Push**: + + * **Pull method** (recommended): The LwM2M Client receives the URI of the file that is to be downloaded and pulls the file from it. + + * **Push method**: The LwM2M Server pushes the firmware file to the device. + + !!! Info + **Pull** supports the following **transport types**: + + - `CoAP` or `CoAPs` over `UDP` + - `CoAP` or `CoAPs` over `TCP` + - `HTTP` or `HTTPs` + + **Push** transmits the firmware over the same transport type as is used for device management, which is `CoAPs` over `UDP` by default. + + !!! Tip "Which transport protocol to choose?" + + Downloads using `CoAP(s)` over `UDP` tend to be slow due to the limitation of the maximum CoAP Block size of 1024 bytes and the required acknowledgements for each Block transfer. + + Choosing `CoAP(s)` over `TCP` or `HTTP(s)` usually results in faster download speeds. However, not every device supports these transport protocols. + + + ![Basic Firmware Update](images/push-pull.png) + + +1. Click **Schedule Update** to trigger the Firmware Update process. + +## Download & Upgrade Process + +If the Firmware Update is scheduled successfully, the device starts **downloading** the firmware at the next practical opportunity. The actual firmware **update** starts once the integrity and authenticity of the firmware image has been validated by the LwM2M Client. + +![Upgrading](images/in-progress.png) + +Once executed successfully, the status in the **Update list** panel changes to `Success`. + +![Successful update](images/success-multi.png) + +!!! note + While the device is updating its firmware, it will deregister and reboot using the new firmware. This process may time several minutes. + + ![Deregistered while upgrading](images/deregistered.png) + +### Monitoring the update process + +During the update process, the status of the firmware update can be monitored by reviewing the Resources **State** `/33629/*/3` and **Update Results** `/33629/*/5`. + +To find the Resources, select the **Data model** tab and open the **Advanced Firmware Update Object** `/33629`. + +![Firmware upgraded](images/object-33629-downloading.png) + +If no errors occur, the update process follows this pattern: + +1. **Downloading** `state 1` & `update result 0` +2. **Downloaded** `state 2` & `update result 0` +3. **Updating** `state 3` & `update result 0` +4. **Updated** `state 0` & `update result 1` + +!!! important "Update successful?" + Does the **State** `/33629/*/3` report `0` and the **Update Results** `/33629/*/5` report `1`? Congratulations! You've successfully updated the firmware of your device. 🎉 diff --git a/docs/Coiote_IoT_DM/images/multi-component.png b/docs/Coiote_IoT_DM/images/multi-component.png index 4f9d431108852e9ca49837bbedbc75306b42a6a5..f5306cd4d6e9648296e56b29664d4e2c94b6d5c4 100644 GIT binary patch literal 11591 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 literal 57050 zcmeFZbzD^I`UeUKf*^<@AWCgQN=mvxL`Ay0L^_5VIs`;4LXeVHa_AhGp^;8$7+~mz zp$8b^F80~`>~r@0ZTI=}-p^<22UxS#dh2S~jPFGcJq$SA6 zD;fv3#eqyjC5l~~Eq4d>CW*PCXt0JNTwCT0HLtu9R|{kkWO~IbC=w#$O-LYpqaTZ$ z-q5%%o}7jT+my=w!g$&U|80Kl9R1*l)kOg37hf648(2(t=iK}yxo^x}!I~KsFUi2d z`ub5QRh>T8OgFF+_bR~-4ppz_j4hS2&Wwah;*qZ4cL%JT9OvpNMJ($$`aaeLi$}!z zbl;U3>Qr%GiC%eutf`UreLF~B87TPTt;I?AKAqdci>w66jE+T160;V=1vzHbc<$as zWsKC|PQ8M0p<90_dA_Y)RKMh3C4lPSq}r;s#_5WFPMw+Hmb^zAp^YfRXG zR(!8@^61_}Ci~bZsjiszvrgZsxFx3I&nHD?xYU`FPdGZ?s|3a4l*py?@ZNfH_j~xU zi1Y08#2<2c8|^ap-tlWw)Z=|G!BKnm>Jc4BcO-5b`)1efF8=ZdhwfW03^AT2GTOd5 z3{txHA~+)Gdhy^)q$Rhmf^m<{8LuukQQ}@@TMCyTdwXl{vnbtnJnWM9CBkw^_X^6} zdT^_Mc{qLj#pr31@S?7G2^QD05XqEZxZZ~Ae1Au2;oAI_d}l^M2G=xLx&cdFcd(Hu zlK3@EZCLHL@(;4>Rnj;Q1F?iz6B=*I@6z6^X$@r9W_gSgDaFqvJv#XT)idxuJN(KBo?}*c89?8Aat0@YAz*s@5oWb^U(^EIFlix+f7HM+Y}1^ z?_I911f4W?8fIL?6HOA@!e+6nZfJ&fR&hCEQ9J3Zgoa>b`Wz!IIObz5LUy7Lk(S%d zgQ^pslG|Cm?u@6}@9jPNLet~$OfGhvZtvS$0Y6scMtVx>Sy@24BwgjKl)($4;ok%zA_ghtOae_I z8#KgY(ccG|n!59Gt`hm*#JwK=c3C)Rc4J`!=hX)0tEXS>yH5c^q*I5e$r>rFZ5ygP zcZ5%qiR`dVi|{AUL+e}x6^~X`@n$xDNzqi#nQyOs7Bm7eiVkww|MZnv0P=?Sn(AapBGcuVbV zb*o``kl6T@{of6Tv&_7oT1-5qCU({PuQ2V7F}N zC&HJUrPp%h4jDot$=XFS$f`rcrM)9Z+gWbQ4y!s05mY>S`c?6B$eV9FE1vvh$sZ}w znO9!83FrrJJ-*jZwt}~RcOs-t8pHc4_XRATZRr&+uOLN8rYTiCZemD`S&S~Rc7#Cl zvM=6xlXppk@XhS`>yy}pGpgd)%d^otdPfYtoOLvy2E;bU(UqDT7f;e|UB7mS%Z(Gt z6B{WX|A>`Y^H$|8l3U7+wL?mtPnm9k-;F%JQAHX3Zv6Y|ce(H2?^ECBzbnr%zL0wN zcz|U*+V`0n6Ibpl&FA{E6Y{pd7~Ka)OXlQ2;&X)aaPu;9-fF(rV%Kudq1LF*-_=~? z(+jqjKV*3N>3G3rfq8**!E#s5Md+AMF8YPiPWpF^QZ`q%Jhp?+8lT~xg&+`!B_svH z3wbmw0?E@t=cH))rJblLDfB3Z6~sdBYZ>HMDs5Ixa8?LuvJbysQ&CE%P^Hwc%Vo($ z=h9ibePIlfogcIugjf@oca_Jjy#y`j6F>D zt`Pr;!0MN8{NMQZ_$h6+`o*)46+dKHWRhpJjI#fj$Oo&h-=z7LI5_S`>qqNHbauPe zATh_Gpyx;L2-oOz=2ZGr_P5M=NOTULR`&Dd9OXE!EW6CEA3eiHU*Rff*jBdLlV;s! z+-3@rJUVx;F`wF5?{jaQ+K07M-lO}Ht9<*x`>y+Ot3qo?z6Ror>o2Zn-N_dcw&)i# z^r=ESO>dXZV%{JH9}{n0Hz&@%=O}0|v?26RkdXJ*y#iiQn<2Y=yA4p1Lrv3BymQ30 zsqdqYtxKCSS{6iPLmOW#Jk;i!xZ{`gCM!KleNZWjCM&fkzvou>`yThiDZcD@z8=1A zop|UMv|haK$C7w6H7jRClzm5ecd4O;SL<$VOodj|uy5XzJgX7!5$bh@bPxf0TXd>vl`Sqp%qoZ(+NHH}b z%^EeW@S5loVG1!p(K>1y-iH-*;DmR%>3-~w2;XksD#=7&m@ieGP2D{| z_^IMqmA`=hjkBJ!<8y^O~8*MpWOkp<;V){}D$mDQ8g){k7m5%Tv1WUs@lxX|{;Jqahb#JXEBXaC|Wt zUgfcay`wOPVj5$5My5|TOr}9*M}}mS*dZSt;TfGA6?Xl+E> zQo&s93}#Pf+Xq)Nh_G?+dg{mbAFUE36T0|(N>5AK%e+JEXZ2_EHu^V+$5F0dT`Cu^ zFWg_;>ec8_=n`WZxV89p;y#ti7tve|du}dr52eE|H7+ixOopWbbRBf5NX<0jfCWUR z;DAZS4MIPnJVGf&`J~bS$dcxdp+g(@K?-Fb{o9872sd9*koWraK`K`(@%WA})ix9l zIsCNO?f1r+%izneyT>Kt9tv4)p<0w%$Xh_m%sqBoyzB`YyDM>#CTq`aGNT6W?bR-W zbYF3ka;@mDlsfe^fhkbAcz^Wv}CklabdNyDn+j@a*7l^gvZn7ib7o7 zI(R!vqRg*w%5k2xwY2%DyiD;N5-mCC?I>X>s%$9-ClN}458bv`qpftU^m|W|BwTve zC)4-3_rfSAx%tcC6?CUlo9JMgEgE7<2`)jS-I}3E5!l|CMST}bA+E8AUySQPQ$@R7 z@+es$vgVWbxAprMOJxStP~$1CnzQ5HB=~E%1)6_LYg(wrWG{4+4i2A$hf5Op_Mh`? z%_cvsdCE<@EOkC$wEOxbV>h>BaKfs$FMJ;tZRjnz<%K5N`OsIJ8DM*^cQ&xJ7+8OL zVT-zl7(IKwYddrBRpA>orJ^uJm+4(%0^0BjJ4C8ic@!UsN z?k%jL<_mPZ@sWq?l~)o5Gdo0UdD%FmN_h0sWNBPnvf%Cf`%*fcgf~;J2wwG5>QlhK z$YSkHlKOt;O7s#^IJ10cvToulOe$U+0{9fM7P|75N=jJlz%>CD9`-G)E5H>t@E;5N zE*9Re*H~E3vG4u+S{gDKW=E>>k%J{ENe(&e8g{!%Xjgy-V z$dUfCU$Yk=u$u$}!{tE#{`aqWT6o(0F_NR}Z_5G}$bI>Qo0p4+`~Pa@W@Gsm%`Tt( ztJ$yX`qyycmz{~K+IU*n>pr$|07wl?P4c0zFpv1JLTipt>!P1jgFd4z?HODg^IUun{K?3C8kY=Srh^slh~=2swAAcz+CZ~Mdw z45FalHtL5)G%@~dp9G{wOH_X|$;&0MT4UoN@%%8X;(s&A%XI{TQvQDF|4j2AYW@w= z|HGRh4gc4?*AW0NLq`4J*9yz;M9!qY4~-n zeA{8jNTx#Edyh|sH*pA*Osf^(Ctp=vU-h_Iyd8jxF=6J3m?9o-%Q$7;d8X>{Wi&`d6~&*p|?`x+S*zC-; z$PgWS?JePTp^*Xg6(FQ!{IV3ejx_dsiiFP_%A<1(3USvi|0Y*<;_4I}>UVy;+_=OT zAwF<|Mx{FHjQrfmSWpFMNj2+#ycp+xy3>|O6ra`QezZNCMTb|fB6YU!1~1TD4<){5 zNkqwYz0eEc0PSI&iRYlN7(%1cgTCO_xn?TWg*-?DO@r#sC=8og?|}@rY8msb7ugnk z6vl7mtaPEauU>;#6;e@?I~nBAi?GXIrI>B9*4slSV<<3s{rg2ISp4 z*|M2XpW6gD^u2aHSCa^T;`ZFa!L93>;jNkv7h@=R&0T-$vi{>+s8*q&NEGIV)T!y& z$pKL?L}9~E-BC;nrOEXox%tyAII2!w2DI5<BbY@h4GN9Nk!D3JEYuPBfStmGwq3mwsn22g|}yxqk&-DWTgIDeErdp$zI zN_XQbbNKyE-0lh3epdRz-vMwB9dLm3NIz?F?67M=ZiB5`5x|as?uoc$oSp9V30n11 zBb=IvgXwEwc76OuaO)oonC<2pO0*i;%EYa!+LDQmu-t;$!--F&4-6{1B{3U(1~509 zm$ekX9v7IKZ>{%1)M3W~Vc2@D=g!;=KX4Gd`k8A3lmjpn2KF~UdrVe2AFgJnUiF7> zlzynN9cCAPJX-y-Bg)i&y#QJX(aO8}#P+Pn-0cQ*(nSGbU)GbaU7&w%6Et6k*%HId zec;}RkUA%T^&m}yiS6?WDhb0*uk1glE*V%fhPyiixC)~>i+u82v!8pD7n-rS{`W+1GG|s}HociSiDS4^>CmnTXhlqv(wQo=Eb7;Nq*f-L!xJSi?lDatM zJEG0``X(hT>OM^o=Cnr$Irfo?PjOMrZjyPllHj$%db8#?t0eO9I;O=Pbb$fXaVD0_oY*8C6(2>t@6UeR zw+UM>yr+A1Flv&8) zTN2?GjSPRSaX4zR0#Og>0>22@J#kT0g;bSqRwAx8s%&PbnLsj3JHv#gt$|)&LV9FO z4<_u2h;g*oJlah&ar%MtQ#|F5+5A*EF_q4a044?6oTzZki^}Sp-)WPi5})Ng+uj_En+r(AC*cI@*-=Pfuxi@$%0WK%=^w zIwpQ#(qb1(erYFrtCpI6C z6c`|w;|yOw;%Bn?`o#GNx^1R_(`S!Q>zP(B60cJ{z+KPIkwKWBn-Ak+#@jabT8uHB zK6^TvRk(nvMH@reZ6G`A5n@}y2Egt|SJv(iD43z}Ap`?;em;Yw*#7DwXPq?1o-C(( zR$@icc|qvsgpN0;h5MDoHp_WtP|HOgN@#>u{5JG>55nWxN@aDF*W@L#RkPPS>!QX- zXq@UX?Iq}YwEY>LD=w;1gMP2TT|1=d%#dR2vnenb5%mW27Hyw?Kp4KBaF_SRYl`Rr zKx%@nT)p02h4bnmtGw6#R`o;n_yQ|rK;0>hk>_lPp!fcYY0NbADV-mGJUSI&9w8x^ zBkXdrnvDs4vj>Y4Li)O@-lR87c=3eRTTpX{RcpXwJ5rXU1kit(6WyXe32YsyyejN1 z^SwQ^)(4`>eP!X?2*Tq{@m|ZFS&lVulxGhNiYAQDBJy6xs@T#}?ZmT+ddOxOqR*e| zvsLZhBQTnA-Fw{$uavyXXC*yUeJN`uJIG4M*vn!f4N9Wvq&u1)yGYK-mQzI0myoeF z10*LEgCoKB!tsy)%F$Ph+Q=0Fk_5 z=`d>KLA)&REw+*Hgq(bT#D8MCKH!2rvS`swzH!pCU#t!!IsNWPq{~H*6XLVK@=35N z*Q3CyFXixLy(n9vKztCd792@UF3iQ1TX6s|bDZEx!MqkNUVs*F)`O^&@!%Vh!Vdig z%btK12y!{*?C6@C!%~(=AUra1NYFnM^_fkKI{KRGQ6Wv|>kWkZziW~NzNUvb~_8n&#+lpQBjpF8@ zSKERJdyP4b+%80&ALh-JBF7cHk3&%!<|+|1VuIFkIR|@7J!K!bV61n{#f`e;HsjdY z-Y!Kb6;eP6mGg*9!7}+HONDsQp!u~r10#COYDpVyS-NcKo4g?$y#lvkhceibKfp8& zW5s5T?s%cY5H%U2inrQ$*hYEksOj3^-1Bb~eQT12@<#NO>J!dwG{IZ7M$q=$&cf%n zY;Phe9S~_vuY*ATEkPWGRSe>aQ~7xv#7R+57sIgK|pd;HTx%HOk|9-^!uT*@_pt|$Eketw(v$w0oTxQSFjIy zIPZ0e-6*_a+$xpE9bDK+wdFO0mf@_7xyx@&syGz@*oqb`NluSEl?z7sG76Dk5E3w0 zW(?8~Y!C85!9iOI8Bw2~7Q&1@HX*E$5TOsA7LlGU5uVjUG}VVcwsF=NjQZet*BPJs zp||QU&X3Fv0ozfI-PhXs)ul0;C>~()9Vl&I>k3lIkqHfzG`A21hb8G~;JMa$*H^jH4 zg^i03wHj1qoWQPIED}P5L6|_hDf1~ZO8cRz4G8N@)ULC9qePg<2L7x-N*UeD;kvaG zz2%*@xDjXn0na`zHl8*7TJoX2R0%xngO89za4r6GRL!1pNgxRCY^b27H9kDsw}x!T zb?JrPXbxbPj4gXdoH=fSk#DY3-NMa2dw7J(3xYzb<~%+WcJdN_JX{@YlX_rdYy^fk z6bV8ehO}n5%f~3~pJQtAS*6!;kmn)?l5i_Ev=Pb&k}*>)mfb0NX|UayA*s9~6 zC`9Kv&$s55e#qyL_tKnwQm_T?c@8Oe?G;&mJk48x<_KNU8>u>2jjHomt7z65==XIB7j0r`>l@Euwa`#sw$V0XCh*ezLrd@lRxh>LvyEX}@u zVR@=OVcSyBP(WuoJbM?d*XR_N;&(XCaRKD=D*~{db z5A}dy8K$`kQs+nC5__y6g`P(04IQA(^$|NrVc=PYW4_U@fgJm@*g`pYkPu-wC=k%-*kPKaAEtf-T?=R48NXhhg$lFl>Y-PpKsh$*rRmkgJf(y8(dd0W60=bjf%wcn%yUJK*-vBgOhbiyHOfRUvkDW( zb)z5vJ>|iec=ifbFVif11PCt`vU5ob-lA!u(@uQ&h6$v72#!D@PQ*EEfXiN2fu}wA1SD+L> z?2F-AL7}1}yy`2m*$FZf1Z;=i+PlnWz+?O^@G2~I@Q94&=UP5AH$YRWFPJYUWVJ3r z!(%E<`rWwnrF@2%o0OCXNdSa5jC^R&HDkG1g2RG5t*cFJ)Z5~hRj*1$izP0Wt$DLC2p9^Fo>iO4) zn~ZBg*1j&x6%SCz`T*U)<|5p$(lr;xvHQNZdZ^aJaCGks_j)qN+P(Zuu9#t;#a;9F zf0+W6mb*p2og56$#X2Gp+aNtn0+fghsbL^-eU}N|>mlMJKv$7hZYA@YKgr;~ixe2l zNHcdXkcb)WPT*tIlLTC-yc{RDAdE zlpPPMND&7Qtlcu0;qF>I0bM)}jp&r|G#(Xe8r6oM&I$G{c zzL(OAWHHnWO0ejP#hX{L+gS1JHwc^nd{gnN0J#HE)u6!ylfx+LxE>Ek)t>c7XQOO| zLb$8et(`tN5G;WiJr~fzW0g8a523)#$n2`)?!#5Vc&+R!6o%{v)B zg=x78cN2Bn*tqKvo)upu=H4<+I%cLU0lGx1YCx0ehwyNwlC8rAzR{?@T>%fr#o0dk zng?s+$DkS@p5W>Enq8jSZ~uo(F@pO-0zGMd=`mHA*jSxn!Pw=F=8Y+1tbky}`-!9j zLE@+B#w4E&J(m3!NyENvN%dulq`yhsjs~TBQJ#)eEkmedx42z7F`R|29vbe<{?VS(52 z^y8hIZefMap#nu2Sk*}O5sMu9bOpj`iPP<7d2+$Y!_s(wRH`ELsE}4JZm#wmuI96n zFJ(51v_;}`H|S=T6CHF$F9QIc2BP4#mqOE?=11bM?{zv^HWLe7cg-`dg{>YN+#GO( zZ(0J(tEYNf>%OWSF&KkV*ZVwp!L{Z$u#LmD3eS7a_WW*2+JoNZUCY0gI1Qcbswel~ zbL8o6z|ORN{e^y%Ofh`$r>rWo>LY=+7&u@GK+VaeNk6K|%iTNhM5kP`G^FT{8}aFG zd&LK3`km}w^FMX&{UH7}ER#YNePRT2yB6VrEm^QKS?yY7%twd?TYzqB39X#Ft{ol& zafiu#HmAFwPn&}5tcDb9bg0*zdiDNi^kb;b(_tNx>hW?7o!OSnv=LOMQemE#M-AQ4 zVeqbPWp5oV!(088dvgcLkXma9-WgW{ZZ{`Ip&5Z&}~2;GbM2p|+L-SDykA+A-N15}I>q@^JUfrdtw6Gr@;|Tn*{kp~4d_ zsykVGCe%G)mFQ4;&0`pR=`g=ty-i$!Cx%|NKAMLoS zFr9h0iGYuruA#EAk`xj?f;RL&!ObT%=Sh)ngG!FPc{X*^*T`Lf=p9LyH=u$M`>TV^ zi<*3ZUFGl+3^=5WT{|J%bw>4?2&X>`2*;nbwATb}0>Kljv32Q}=GQ0(V%qwi z)Pk!r(rOeWy!VSCS|3o?<&dqO3Vv~+K`VD98<;PAa>0O*cTWr|83`q!xy#jN#V>e7 zu48Dn7V_%#U+O$8oK-vm-)v}ybys>Q?cH&espK29;=&dU`hn%xSFXM``nKKxc&*$n zr$A(hnv28JWw(PR+nza>E2~d@PZ7TK#cpGNPz4Ie-Hubrv5=7U zl^@?W0T-AERwlXKaD{QPf2;vWJrJsZ*K)I;!2Cw8;+1g2R=%d)bAW!Mvj(r97A6TS ziLm(u0zo-0HnNKCFpuP-k_<$-O>{X3SXI=BO$c4PX4+}>a>@tsb#Kc9lB2-KG;#9u z>X^*ufSPohCQ}yvMZ6YPKT?W(G~uAxZ~;W4h~SVBZ=*dR!7%GCFCwwq&KS-9c7^6g z{AyuE3CU3WhQE59|G4J(Vjw>4wns_J2TJ@#wffyhFGDXVPG`=6Fh1=h%P7ns&=nk3 zsA z>_-v~6a0fEcjL|g-?doLhx}dAN4%fN+FOBhi4_G*q?xsf-~^vG8jr^~G;zk>Hlz(| zd6IbG;We*;4Ee)p9~9se@P0;5y7sk;R1VC^*!b(=QDwp)i+o< zx-CuFDt9O3?A4bPgqu-(o{x3?aAC?XXRNA)R+Ce0p4Z5!_uGWSLEN??faK~eTHhMZ z)9IHDjJ5FCZp6o59}cT#CtgYJ_w4sK)kTC$9O}}j+l#KG1qYqp-q%FopWHvP?Ce4X zAuK$<-+UUcpAL5eJbSzt68;qU^ynPU^p^0Hols3+p^S`{U-SNSo*XQ|Xe-`rDq6^K za%}UKZZ2L0yWxtD8<1lPMTAS9SPwekZ;6su=@e0lZ4?Isv*~O7NEN;BFmw`?rPwvU zJA5_?SO%L3Rw>STI7A7SUxub?3-!>7NLLBE<~PJ2gdw}C!B>eH^wuz5vmumMk=_79 zebuyiPOiqTQ)mzI%y>`W&tB*fQqR5jlYof*uK|(pyu~!wUfoO(QIm8L&Y*wX(#{}j zyE`DSp1}CsF|71ooh?%V=g2fBNR5kh>(E)FLRoWtFe(dhhgqz1*CQ_SUxoS4$zu-z zp=^%aeA}G@JK^Od*Cy!*7@tZ^A#4ruEV2#xw9&O*{S^-8L@koVsCYyw<#-6kHU@=X zM{cbcvwwQI;j>vl@=qiwqA%xB5WD*d)j{-DTjz?1u_t2r8@{!suz$$~e z=$MX5kP!yKQHiP9OT)W95fX=Qi@4lH26vCBa@9Z49ceEnyUnLy+FF*icIdShuN;*2 zXRD+hZ8eroGgnNGqBUBdKlIpYe1CEN4T*0{Tx9<2ueXFgQlDO=Dau=Fgn}^*YmB3) z<`%BUDObaMC>yIA(hoiUEkg23rQOSlk6NTgjcyeTiZN~^6(^eO2q3X6=l%}gQN7~o zsA$EmcEYf}T40Q)x*ZstU5FK=0gE(w`%>txivUApl_*SD@50yvX`v7boCT_Kgv%tk&5vA4T zTaR#sD)oJ27h!eEmo8G+;hj0N+h3kK-?6DgJr=Kb>++7f?K#X>U?q002%q2YCZQJQ z$svuhSziF83!Ams#;%h_vMj0%2**?Glg^H`WuH)3Uq@-q7p^PEM1UH#!{QJ?Y$`L8Nzs(KL&*2?{xZ&5li`$Do*ibXC(+`MI4KZ&7TWTbTp!9c zC!8FCXmvR#i)nQk3Eh6>t{yk-opMm9l<<(bUBk$fqy8&9Pljk@$8qCJTS>Zto+cwco`MyV!I^wOCzM z?ljBP4WnTF5TG(8Gu6$k0XO~9hak>;w6`69ppzus}}Cu#gn zIUwh~*wib3Q#$P{5x?zF`^o+)nW1G2yH>u7#Tr!%S_0_+o!S5l-U=-pqhbAWYcmO- zL;k63MGeg1X0s1$+I!u?`wr%pzs6=u)8exCBnpA_XnUL4{w4?itI6K}4oivDwdr}* zPgeZo=Dn(DxeYQEwdovdrH?5=epB2BMOR zquBmB75w`;r0Z}Ae3uoz?EMt4^RKrT9s@`dW!;Y3KiR$Ch)Hh(XyrZT9|0ZN4H$boBs3q~=r~mIKzZ3tD2O>9tZ6MQrDEB|mD-NKSue>YmPmaRx z+mHkR`g^Z&B>c+NKPTFP0zj|243QiE!!{^iZo})CpGBO1U&k&pKrfSlB>ewj8(4sC z_=j!(VcWoe*p`6){}a*{vb6q~quJ}y!_msqt^fd9x`3mp{YK%^QuzId15z`Pkg?c) z{NZJ^np3azJAmp+B|m|+2JkjZQlCVJVLTx{rw7~yu$L`dD8exL+5Zx>f#QUkx%%U4 z1yERpHL_oHf2?0{0^(2GXI!G9Wiwsl)y00uytKTgt!EKKzml9<=KQOD@rOVOG$dp_ zs<;s6e5*t^WI#3xOWFKlWl8tPSVk z7u0mobCmw)l7Q}YWpIa1d}f2g^i*DLgD@aN#wUlr&}7C@niNrgZ8)1d#yM^-Dq09f?BA}sMg=+s}g z`=9ClLtWqyNdLnOmnQN*N9|Wf_8(^WhZ%m?jQ^jI41thEUw`F@-`&{-MN_~=I=n0l z0U*$J(JU&JRD70WK+etKaARB>>S$!wpB6Y=WP%(q07NO#os69xb%78!EEND=LAU2`qyW`ONEj5(JT!rzhEd$6HJo z+wVn{p0fki_a9uEFxLW~16e+UH;-3wZGq|n*cFlAYcX8dw}DxVm-R{70l?~%o>VER zdDm4B3;>i?O2$n5{#^hsF`LlTOHex%U0e9C#3wgNW2#qiNq08vdg}6t)9XJhGF3+$ z2bjI7*w(1{&27gQ!*<#oRn$bw+)B6&0hKrV&P`M6M0n@t$8H8bx>Ra*g+p1m$ zaQU^`yTOCh=`+XJ_|&FTFmPGm6@2|#&1F#wbeM?OXVWepst*Y80dk;0UA7bDxx_T0L)s>O$8?<9 zuh)llD`24UEFcWqfAt0}wPl%UV-P)(&j08a-O*Yf5BO?UV$)_fz3K=KkeUgv1u`aP zm6t#SQtRtFFL}r=-b}gnNsPe2>(|3y#=WQK@jvwxJ3pFtnEU>YjXPWJ1I0+StCby) zVdu&601itK(gKJPmn866T{ZX5V`wTiYqkd}SLD4|<1h1`69Dwv?w&)r+JO7-qwEIyMnpoDVvKvZDaFSqzL2q65d@%y$br=9O|3ck-njUjXN@xQ+QAd@~|5#ckj$Q z_L_WvIo(X%M5t*v^zI)EdMurOKbj_TIDicoDA#_`hRP@*%8g|0Y8A-r23{0oh~HKO z)!0bDx2kkDp*yZom1Q`9M@ItiD@U6j*C9JO|Fe&1;|+fx&R%Nbf7}A(_sF*3=xHB= zR7t;l`RMzzutzCB1Yl{KtngR)jPgZ)I9tvOPkj0m$Aw#b?AdnEqnE)8G;d7uwshwOiSG|QqbcKE$ zD2M}41gxb!oUB-dsY*gq{C7qTkfK`bFaWw_-yZo(rQ51H)Q(hhvjNs|jd;|Oht6)ON`Pu1lOe>@8q2mGlqxNKe7GU#GbGl5&{iostO)(MqQm!b)Jy#B{Sg>Y*P*}I*=2`;t#fo}%Isa1i~@i; zD~~C#j^|2K2vP9f8amluD)P5LMjG%9pAz{NxmS>cSPp{~3o+B3h5MO(K!qWAYE^wc z_MP^++;@a=z_uMCPbaS!3_!YRFpV!ggn`5YYlw7kYXt+!tk596H-6vh>nAyv=HRdI z&zDg|42j1SkA-!m(;g978#-THke?E|a-4(|jXMdfyQ;YKV?xC0iyKG7OD!%wZy4OE zH^%EJ5;@TlJKAs`Im=iKyA9DUx|M`J-Rhe_X?#Gf3Z`%aIU&_5fWSoP>BaJeHNi?i z?b`J1EXJ8kTvm;(Q6QMX5e4*tI5QzBj&;XNX_&+DGAjg7Wt0HMVm6_@f=^PerQK0@ zPbzHwyjKi`J2gHEqy+h|3STCTbU)z^H5qUgWviGN+vyl3nz;4|WD!bR#M~A~0i_K6 zi5&pw+o2Fml&rHnT6|~R-?a;pzwob2jIXa^@G*~uZY)n7D7 zOqmBwb4(pNv0VFkuKebs>ObS>&SeLkG&RRi`ACskWwVV1qLGy-GvO}8ei-7nEL z*DsTUVoUMn4C@1&4~$?#TvanTgORjfVA_+bhaT%O^}X{fF|v!l{1y?D210xj?lgc@ zewjQdU~PyPnNCw4Cl5;cBYIbQOSeE7yzcC>{)`sTdUi$E?~>`oIi|bBJa_LV7n`8@ z7EX|LcjSI_#wnOqDwmr52EZiRB!N+9b}oxNv+N4=X}qdu{B|P`G|)44`6X}aMQ!}g zPmh7RJSU&|FriCr52Ul}$7{Uy><5*Ei1n$2K+}^XA`7GjKARQM;heT1yHw(y#g`f3 z#=h6r$P~@pp+LQCI~0H;XQj>!08rHz0jE1ps}KOr#bynsrfMHxa|Do_q%j13oxR+R zR0D*v127ngK4T%Ep;|073K7fQ3Fgo#cLUw4Vc3PduJblSIckk(uIpkRTlPSKV=^FS zx+MWv-^?;FJL1-cn2yV8(2WxS#W(@n*(50ga4T(s0DN^Ye(uuh?r;LiVhIt8QXa`;N0*XaaqT|0kjrwUy64@e;I2kQ0a+33STdT zPh8eye^t1wVGj0zbkW&cGi`~v)gPT-)ePqR9-#E2k1e;3K(|XBTVA_>Q)mVy74s%jW*rBAs08wszXZM>yb1 zW7b8l$3Bkr+m>AIlM4IcFIraynLk{VRP!w(hOW78>`*8B zZRSS*8jcp)ZYv+}5D`(f30KJ)=Rk**c)3ziB%1zy zXSN+huB7_!LoxetsQc%1Cj&R$QwO_2zX_@&c|`N{u@v34FrQ9*X@Hve?ymef+xbI< zqIr@wkhC~Yfqu_Yd}g?wlY7|RlWOT!VAlGMYO$n`t-vAsieSlv-AK8XEkKun@cOIKk)7E1)kNmj&llWNlNioKL1#yv1?lWygRxcvq2iPE zQIa<|bxWOcd*mlEJ0{)5@LQ;kCOm~nGb*LT`}(Ie;2-Xlj%5P&6%%>5eS=NM3JyyP zQucFW35OF`Ob|!haW^bJvk#U&DB8k=s2n`=1l;s2*n#a6WwvDwlW{3SA%`Y9_q`6# zn=Xzf#Vlmd(Voa|HQmOg9e-|RZ|>l3_hQ|l{Ef{6!&;U&YMvqg(>Wxj7{hBY7LIRE zZM@dy5n#g@dTxC};x6J+_PtC4xmE<%cgmlh42Q^-B};w5DHE8<5YA{+ykz`XfAl~Gec;APD~3tMsUw% zf;7O=^;ij9&-bO=uxsrUO>?w|{*KDnaova>WwE5rP?8(2G|*W09QjkUw?d!Irl z5xqxNAFCu?j1kzJ00-6=lyhTd1Nsi z?SvextgINxwHPL=AB~wrg+sTvt|^#|kFXT-HCTc0 z!AV zs0dO-=@6pFf(=mV9YuPTP6CO*5tM49mw+?{A@oinQYAv9hMFKPK!5;A2qEp={_nl- z7st>K3{0N=?6u~a^S5jtWvyA83JqPfcPqQl`!|8i*V5B?<=$7Bq-K@t!HwUDr2y4n z+rHBUxwwq#xUiSNlVK96CmGO_|3X@3BI04&i1sX-z6B&E`$w3 z=QmTLoB5|4foy!oyCWPFfM*C?WK$YF9I)A3m?vv3D2lujW>qh;rBSmsiru!%0Wq ze-ABm4VIfe3?q-}+67l3DA3i+dK5e(C+VEq@RKLaH2B`g6vF zU-KKPr)<30EkX8ODD4SyLQ94t!c&NZ&|W!Z!xI&se`~QZ|0@&By9G|4Q_I^=l1H7C zTp$yd8>gCIF6Moik4_#k(N`dpWa9*3AqGXo_7UF$MFdavq`bsHFM6NY#HsMbHV6Bb zf!F-%Tw>-*G4HddDUC1@9<`ZWvk{+DQQ^%^b;cttPSoA z=~h}@%hf9}Lv6qq40i`sbzIqwno7xrVy;bS^#9>CXo9FCUg~Pm|vaW^! z^3V>9!AGD2#c1Jh`ne;;L%yH=R?HYn}2MJ5 zeTOOwazS5g7h6jX+r7FL;QzcpiBJ)SUuu^GZpdvTbFX=Uyme_a>RU%-YkJvY^+=S2 zyyB^WWb)I+o!Ga2n9R3?@O}HUCJ=dQ`?yKr?K`rONSQYO+gBsrqLDBRO8_M=n+qlt;K8&96$v94Jwr$gOuuW zfy96puS`T0KwG&ywj6C=N_ueSjml>9K8=)qZAA)foT~KKUoN2+;w{uSuxQ8s>+4u! zbU5tk(y{tCw2z1KS3m4Lxe^3sRE)D}S-AEj-sCZUt^aW~rr}(+>CyHDrY8gFjsy;s z2#6@%tJhi5&1`lG?w4vy<&Om}UHp9)ddNR+V-H$@|4a%0(brkVx~oN>Zj$$CD|j;S z>viMhkGN>CZk6SS>YF4TukdZSZnV&wBDiS;{7ad>@S^3Ne`xye6U-d2@it!Ny+_kW z``ZmuqTa2*zSgQy-XrL+|7e6hRmf2G;W?caY-gA*j}yavoo zIp=h1M&JUi7i?A)#Yi7)QqY_^tH!>%{|@P0v{7^T&xBi>*ACb zO-X(mX^@DO^7d)Dz}s#rRpexa=53k$2dB(+4lZNQllD(cfq)$cD1=QAg4vf>G9IMW z7U z^WXY4i44BA^7YITyjIYIv(#i6q{VVs-(x$x=lcj!TpaL)_EO9;&-hzro)PQ6kQy9* zUB~Utgdy2Se&0=CsSET8!*FV|XbPG^9vOOyC-=QSf(=AWe&+@!r zA6%pyT0X)9klk5_2)t0X9g=ACh|87GWRz2#z?Xfd7F_Tk6PrzTN`%g04+g1x=dL1@4J z{7^*`b1|Lm{oELSxvvdwt;VT#W_f#od5Vr~*gDj)@%E9F4O1VLAzkz6Au{0H7Wm1; za_2;@XTfw>ZctLSUo_rQUAgjKJAKn!ESY_K=}9x-gnzt!B#ld|ns>ZnY1MOR4R4{G z!8S8HF#i`4b~ENf>$1+=tHY0GyUNVVmKQt#(Q>!{%4(~RsX$-YL$4!qKsc%|-#o8m z?V4`h=$h`xfe4mWG?4y z9!#I9vl|O;dDw!3u2&lheV_6u&7E263!3{L_1;CfE5?59q^$kZM%Fg)3q2*rB1Wh5 z@DFScvheLtX6q43%hCGFATEodY;JOxU)vF2;oR>{4Z71t+FTteFV`qz2m$CR5;wVU$z=Z-GH)9SOpsNh4qRUWn< zhyzP2q(D4>|2};2e%an<70h2=latNxLOptrBp(bi`M=!fs9}LG^rfGOeDQu@ViE0pKBLymxIa z*4jLu7*HC~>wsqN-BSeq*k3L?!Z6uPZFs}aDH4ydw}+XqTwQJ)lqSDbNfSiN zG6=HU?3o%z-^?i z1@_U)N{@8!E*WgM7~dz&@}G62twr5Wy-d~r8OF*ud-H1N2DwC$ax-$erTcv8f|wMRzfeI=9*GU=IF z?9hI1lZTS0O%Odc2;bq5+&z^)H7(~-(skFRB9Wt>yQN*VtMcv8ZGy%W$8ugA zC9N}Q5bpe$owHI2;wW1RZAZ(~cWV`ABa{{*+H8xjxO0;GceAI!PZ%Ca^_CA6t57Dj zC9KpHPHRw7s_cAu85!A>htIetja6=Ljs#<7fe^bMpg+jX_LQ!{ ztUInH{VdN%Je>BEsc8QqGLs;x3aE!4S}70Dj1E&6K9!jK;3Ekt`tF@A*MsIx z3;rmhwI{2N7S)t5wL9LtgUwTvUI`DlPq$0;H)EX76K17Yu0MgTY1%ETtVTW#CGy{M z%No_4p^v`=GVta?`MWU*6lZYRHO4birr-erPc^`E=3Gb z;r{f$jKU=JPF1?x!m6j;P@v50_2Dcd`_RybiM*^Sw&R`n@?er*jq8hCjuo7}?RTMm zW>~wGi5R+6{#At2Bj6xr{>lkZ$_!WU7@^*_6R5*FlUzbca1#(p1zBKz;E75^PS z%rC&oXv}TP(8RhbdV^HAzwa=bFTj(o>+RS7<7-}R8XO4i&FnmHKXFCy$VGPB*la{g z(2h}VOeK=N!5`u{Nx5jdh1<#hV1uVaWrwoxq%26vLW6oc24ZpTez5|w=Q7xfDF0)9 zn%rEF3xlTnTN4dxM?U@uxRdk5-^6(co*^c&SAG&bwe}W&(ClY%6SY5IO_REdl{=G0 zwL|2E8L&k1U zZ4?p0r9vO1dR{Z)cZJb7FC@0t>6(nV$@dOMp9~EM6^}4ENOu2xc3E{>c29ImOR1ne z71h4IwIl6pR_%%~wV9Ug_08N~q8SGT$_PTxOe*~?(Isq={zdUl4*UCNhuEk}V7uP_ zxL1zP#rABD);)rJWU1ZL;!=)1A|OGblr8gs)6UslAWY;RlsnJ#5=**;^^j3$ReW(K z9e&}o-%YX|sY^%}w$I9SWOcUtYUHh6DXhgq}hAO z(`O2Zh4x{AaIF}R|LCEs=D(SL12`?oM&|1EuabDjg!hto+k?Lyy1vai({_KXJ+KYx zSX@8^`f;824vCrE4l&-33Oew@+Bg+C@D8ixo@#g&NAP;7g3CGTVOb zG>gSOZ&6_<1PB^(7hISd;hlQIr z->9%(a4sfg?i_}0iY581%g=rcd#7Vgrw7FIPTLs(InBV@_p3m)E@YkDcpFzM>G!NM z{_OV7<&OX%faey^-c9QY87&p|p4k)tdSYICBFg3GV1CJ@SSdR$D5sw3GPj)EF5*87 zFqPzIDZt2>QO@t`K+vV}pQMk~Y6Y$QE*d95q!&_;22}%tWxvI&R76V@9Vq^8Vw>`U z&G&z*cO$NYm}_UwadMwLT>fZcp!3xQ1rfbmZkC6Q$3HV~3%HLBXzOm7P9uFCBv}?c zX`Ux!*ri9Y{*Mjj%e_PV5n#m1=8WIZLa-z`aBcjK!}7Ve)yeE45hw9LtAl}0fAR>| z4NnZf#C52Kt*m$H=i%RQA;9F)(KtXo%XUH`XWokLZi}Of2AU@E#3X%F3Sgi5tZ)j zRV2zuI16|lDZ4?)S*6I?QWH;1P%?oJA@{WN^c8NHE+g%>Z1K~ejf&E?)BvS*ZdHboFb;ce8vE`Eu)go&Py^k6N zTEG$jzKQTs#-y4v8+&`RHTvH;1j5>jTXPxN|DHTr<&m4OQKz^iOs`$m{i$qPtBj1s z%QwQieDCW&Y-!{_?{Q?c?wDJNJatIjcoA! z!q@)S2W4EIJ-hhOYUe}Ys~5rtPx7bG|uW ztZ+)!rCTO(rjJsGlzeK5;sctcXT}}ARk8ixN+-G{$@Fm196RmhmBXs;e30IQg08n} z;6CZ61&~V=V_4{!(u5Q0!$o2RM={jvtn|nY_O+{7}_rC0J}y8JJW29ZBC; zyAV(=9JR9Y(h7e2dqBZ!5zpW-Wh=82x4VU~OJ*lZdfzR_(3%pyI~oL^(*K1J#W19s zs-+L&R($Y^cOEN39xR(SyZOTi{%M7VemuD8aDW@?oUr}Jt`=te34G{t3TGms8sQa6*oA1Tl<(_KAP+#^ zT$lp&R@2N*430OZ5Q$>r`ghaaQ$_59hNgo4VX(J#_i^ZWFs%FW;!v#~0uMkUO9A-p zlGd3tXS4s@FN_%500UqFWO^93?tv->cJc~Y=Kf*CPB4UF^Y+|0MM3;N?OH0*5ruZZ zXM3HNy#cIFd3#AHitJYV42E>?ZFwvkTJVM?LTuFeEoEanh7}4B-hb<~3mpl_M zp9V8e`7P0d&G4KsQ_kp*9V{5`@C;-j4P9BK5)t>LL0u;gpBPj$8LRn=G4cBa!IZdB$ao|jZLHvpL3V*0Bi57|Mz8adUQ0En z`p){PVAO0`J%~_au(lhnK^i=`e4p$ZPp7Ac?l0uad8)TMgmGUGu4iwQ`6SGR>bw(0 zru%IK2Ver9L*fm|h$j@gb9|MKYoLGbUP%-D>9F9XdHG z-1(|%h@VC)+QFAJ?&g^&a@8m44*#9z%^$5JWAN7UDrNMk5!YM?fpMC>`E$}`w8-D12-Z{>mQVIcGjjydT4YmIf=DRTMCHz0`>J^w>yH} z)Dak*DuLkcV2kJBquvF$-ddZfEuK8l&--v4FltKPw;{P2&YN>(aSxUlo`v#(I;n@_ z|60uyvB(^-{GpJSkJu+c*W$AODn~!Qss+8|Y2DgLo>j)>d`SHhh*8-)Wv3>aZYqj^V&i`+URTu{g4D zhc&*0b37L40JHxEFp3V7Ux%4U0`Q6By`RXz#i&CtJyqzt6k9SNwH> zn_LV6UKzZwzJJ8{XKaot{hg2eUdW)DmOAy(H=;FM1)GWgRX8)v+)vn4pxRUrQ{e^+ zjkqOCQyx;>gV`2BL8WOuyV0KM@3RjXDdsa9n}=Ng>VdNR^u7CTli&CwLNDh;Tk+F#!*mz zcXF#Q)_EtqCm`I4!f@0vVZ19Lxv`d~VzK}2L^;#&ijIvq67V*%UmZ&Vm8IxAt$e++ ziS`Le`O~5F+&i}n*ke;%;x>lfp@$z>l;c+B>d=SAuW zp(n0F@2Y;vMqS*2DS2JJmLoj!Niukvmsh&lAjb>^wBE5FO9T0Y#0ZBz_Ru$)TOI!S z1~9)p0N-Hx;RC>aSYd-gJIF_&E_HTV@HPKK|{ppE> z113DhJCrEH1DeZ`$vRM=2ORUhS2fA~Wq9CPY_hZmM2$&C%^YsmPYkd1>iXR^bX~Jw zQem@nM0$8&r((Y$;MG^jH{KSU0FYsBs;TaZ zC;JBJn*g;d(5urJM^T~AtI|g+WpHacu|vtsxAa@E+cB=7aoeS#pSyfkMC55=4-@{y z>;%fV>pT6iOCoz)I!P7|<7@(8*;0ScUor@jZR@JN`6TY6rIgk29l%`em83e~oR@Wc z(vhI`f#`s?=uax|M+nF%O#2TiJE9}toj*r(c=&{5Z{#~3S$`&<`Be0bP1=4 z_K3;LksG;i&-`!_ZvyCnA4;FeWK>(%FI?ivqhmkrzvwJIF{^pUk5usVSE~4}m$<`A zj0I=HF^K(D)OomP1X|u{D?{s?W<1JmaIN0Hr7qM0 z^5VNDqOc5c45@!z>v6{w-dMqy>LK7;U#gaW1J^%`PekYXkG!*X4DD$5z}Qg#9P5out%2L)`q z7QA_nu0<*qzvUI01rV1Sj7>7H_Nq3&cxhD=kl#A9&^ntp(|PdCd)3cTPkw}%Qp&*=+!CZ%=g!k+_cVWgO(vl(ld-#p1eKS=ACk`)wWoHA_85?)A>z)bpa zIaC+FzzN|{O0K1`JZC+A3KDKbq@=W}2}C%i<0)gf6K&Ft?0uJ`gGsN?)E?Df1ns}a zEm~%)AZxp8JW^DBK9sl;Zk^nd#w@mL)a^b-d>wjx4w08*0692$v8LxPH~71&g80=j zv>yd0J+O4q(%X9_XvKxRy7yrtv2EyOi81gwei!58i%2;ba7Ojy!NtGOu)s3QW9n;~C>_#eqkqtFJGsBs;X8{GOOk z^f#@=ugvn73DWcC+r-8pmCY^Jl?Lx^I-k##I4-vnMb03$O79H{21<8q0(SYT@x$87 z@!SnRxb2l?zyg_@2e6LR0b=sFLmVUghw~e5M=U($)hZ6np#=f#Z+hZ4+jg^FT|T`u zr==dnCH%$`Eg-*5g02e~;;HTANaWS28(KRX7gB&*P{j6|_NQ5ZI5+xpBa}U{L&MN< zG=ctiz|rC1GqZB4RI0K!k(Ys)Lx`nX;(V8HlTo<_DA+SG>g+Dz3oLAd@pH9y*qlhv zsj46xCL9*>QBgwKEeI|O;wSM{l`;0u2fck~B3g*clZC=djas%Su)qhy!Z=8LUV!-{ zK?3_lffWTEu=!*EP=ZL@Js1_WOIk{nh{rRIUV5Dn6n-&!Z1w@Bvc=!!Fd;5td4@{; zSZfGcPqR*?G_Q=>j+|h&LGs^7c(?wzF$b+x;&U)jn?cD*1jX``4z?sf&N%Rh~(@ z4uCh}6QVZ~xEUnG(*ADWkmduP^&yPjZhBmX3N}Wncii+?x)i7zGjep4-s``)-4f6E zE@uz)RfliY;8Iq5DBr9%=wd59w6b@-00x+Nso!Mis`yfZ?vxuM(i1u0%IGCsD9QMu zRnr70IEKYqVMxa-OGo*Zz6V~<9-6WETWZ{;Ozm9y-(_Qdx=+wkBJiqXI3B2QY?bvM z|EdVF_mSO_irS(zAH3F`Zuu`AdPsvOtH4k{}8hH1! zy7M?vZtwI8Y&-jjHFeriM+Sc_e;?#Um9pIiH`Cp26{^ zC=iSIj@rO8%YsIuM2m3iRm0yKteUomp#mgEYHAIm3;pTHHCx(NGJUGH*5Mu&L>YFo z<1xUHXCq*p_Ph8syGmB3uE*fKoA-kacu7Mb&HeE`28QA)I_My)4WC@FyF!AVt3ScX2^);D_GGPegK3-jbSMXlrMppt%UM*VqXl40&K7Z=R91M2Q%*Pqq$79t96q5bhLnGLr=;%ik{I&`A~9i(jT4=wi+R;b&>nC5NWhtM6ug%68U) z-8SIF)k-{1uUW&4UBR|q_tL-G%FBAp7djf-l^1Eo(^O135W1;Q>+W)7iZD~ zb!3{0cvfAU&>3J^@3tOcEjSth+5h>xbJ1`!{F-vjqIZHZ#7DI~U>n{(eI5-w*sWXno(6W1lC!bQ%nG zzV#crA7fH{9S-%`f2jG{h|#*91g)@^IMKdws3Cl=kS=-{`_kqS^0!C7$@P(+%}df_ z4=aD?O0VS3+~WN2ZIBKgzjpA@m{0~==AK4>p)g43GH+x*h0vqS-cErl%~(?(>jS>< zr#$7YxtENxJ~d1{PneR6o>Nox0rGsT1)0)}xVF6WU&4RijiVv{2#R$0J$<+6pi&S53capT?00?6l?_0_I+R@8A>MEnic-JVLoUgh^*i(v61@K zv{XdpC2&8AjK|q1(A$z0TF?HcB)HxF>sohsM?Yz)02|lB?btOGVgvhWE=$$`cO6cA z?~{a~@CotPslaRU`G3joUv~BuRA~~yJ1wrgD1EHrVg1;`??N&<2 z7^!syfRsNSADQvB2`GL($IQ%Bt%I(;Np1ya$LYjo4e~Y`>&<5+i#sQ-9L=%wh$5-B zXjPyG>Y}dsZV#G|#FK=HYX-D*%j4_twYP3hAI(;+TvJUdY3v)OjEV0mam(%;O@50- z3)u1;(SnTd0~%+y!VweJ>eAuDcgJ2_J1Vg7r=8YCb$hCQx4iVL)KT@qf`4^pp&05; z$up!NEfYdV%NUV-b(mVYJ3O^K}o~0;{AiYl;C)rogF%F9yQOoaEPZ&d27d0 z)MT~i-#HF5fqP7g#ITlbU`3LlgfBep*{NEwh$Q^1TVA;9EvM}X=M*EgBAWkGorw>E zWrAsrJea~#KmGoL^&Nw?epH@*P_5i6sltP!raV1zvN@kzA5Q2Dm?=juMI5{+@ILjUH!d$p0tXW(@^eEq{Ya5L{YO2wlkCo`Uip|m*U73dX>;Guq*XMOBFTf?f4(b zB3H`&%vg5uot2DUkaF^71O=$fLeuVQXQ~R!_l6p44MY5_8h*c0+F|wh!lfzsp?37x zgoIo4UXlS}1eAPsK)93Z7_z%Q==QQA47qzg6$zcRZY!>zB`j<_iesJoCGx^P?+H4F!+BOd_l9wvNPp0V4@w69 zdXJ(Ot1fAcrOAXZzK`|U@V?AD{@i!FU>L}#S_;gxEo&g}Z@)QL>-;9@YvZAzH|GeX zy+$lyk; zU~krIQdiEZ+Gs@U-#LMTqLyPiMc%gB8=d@ zRlMWnQa@%P5%A!(A|P~-y8#CQ$}8zuY+1rS$9+@?H&7aJD}xn+`JdkL>igCaW9Hb{ zYO|e_F078d_EJyeTB5^uEjxWy!8>yEQuV*Ek3Xdbd&VK>^sNG9gRy_Z4>W2ds9Tt{mQct!Z7fo!8^L%z4ZUdC9ERgx3MOl3dCaaGcrXK5h@riHvA z2HkFJ#xl05=&!3gMa{7%3Le>`wEKGkYx86RZf9A3x_jCkvi;2a*a(a8_2to%Wg=LtPVJoCZGUha8A4Yz%mVo;f47Z`%6#h~>9UJ{E_L zR{cemYDVqWBYpZJPz+Z=g;RQQYeS4uFk8VMFlxPyINz6N0_XrHe@~=LWy>?ShJs0* z3doYC9vH0*CI)(QDF|-PUs-^4?l{IRH`t<|xA^>=yTjJel04u%j_zokyhThO`J`aV z-(H6SaWIruL~KeRAU_yMD|Orb05d1C{BfTMg0FL>DsQLkM#MkEVJMPT|BGG^T|Rr_p=es{E~*Q|>D=(ewWS!QRD073=@U0?^Qq zxCBC2*WNww7k~3HT?UCU<=I1c$mwrx#oxs5W3AH+*Fr1K@ymLZZ#1=9`hlzT4V)Q zc1Uq=Gzc;C8 zKS5PEFp?puDnpSq+CK5E{!|mQWW4htVkePeA0Z{3oXA}pro=CPk4XxL{ ztg72x#uTMGv|Igo$0ELX)_c_g!p66J9!=1S-vY<^Ok3P{pfsco*J+3-NHTADymgU_+z_ERn$5{3Z_g-(J#6DlBy=>TK5ch!0TqX_wu|#QAj2DG+9ut@8jxRTJ6{5K` z;o~(^FTcqUl88+Xs8Z;R$xQm~S2t)!;tA9-RphCV`?Aqj!23ff!$bpmbFAdw$ziO| zlEWNVEi=ETnDlY&&&JytkR)lu;uHB`+t+Qoz1l4fRJnz zS-mUSX{p-eRDH+c&#Rjj&)ug3sz@<1EGJLR^?(_{*HLtc7mY9EFxU$4#Mr|0_`3-RYY$BmmKJI|siZw;q1F$W-hST05 zLwGCg>hei3@OEkXaWG~5SB7ERjKxbb*&82pd37&p-?p@^_IIuSZBcBl9p@x0X;`wL z`Ie#2_Fjyt(Gqj-mukbqicOc!jWiQKrhheV@wlj{p$~-hK68~SmjHA^+Ei68$HxfD z9cPpIYVGVu86~DZ7EB3K09T?K%h<8!Lb5F2=A0z?PwLJs7Q`>r#hqIFBP#E z&c40nL*VK`dWEO*g}~Q)ZA*WeF5hc~!#)ZxiD81c8!2a0L_7MA#Z!2g6hZc0nHq>QxahztTM-4I?%|0p!Ge&rV9PsEFa2x8!JgM16IqNzPsg7iKK>KrF{O7PO;p{aXUmu*?VVDN6B(_kZjeBx?QF3bfd=B6&$3ji5&`-*B{Aox@}j?p6oHpAxVD0+L{#Pja7q-s^jJ!!~F0j<*$3xH3I z_J7A2d>RL^5L1vvD0RqCG&W-p@mooo_C6)zLN2gX?QmQ-s5|24$^QWCK!qp$)Xkig zXVM30JMX%I0gf9cJcIX|)QfY6xF@OQr7O+Mw8pk#k*)ZE?st7dh3c`-Rp=8*uSTE* zU>^Q8532OLEPX2*Pc2CcweSsl0=_DK=U7^Q6j?h2;E`9f8#wnZilu=a$ba|zDOb%X zA%Pv6b(71_e6oR61S9Ea*3uMc^!l58f1VjSAg>B1Sp$Lf=BYMnx?RA1A2BkEc&m+E z32dS^ljgMNS?XaC9BQdo2PJ|`7Yi@|1V*NMiQyaiqc()I*uJ~a7Vr~`&yiLX@MQ)6 zc6Ln0y1%QT4C>+fTYz1`yeCIhvAbZ2&NhSZ<;>s)bX!OO=27M`fI*PTHA#jy*gz;}6wz^g!|2u->so9_~JHlMeRDdVl10 znzhfLx(DMAJ>ReMvO8c-zLWqX!2~Bal;Q9XQ^)rx*!nu|K zmZHNgw#wNYMrro22DeSV`zl)EMbc#pYxuTV-j%TKU~#x@KXGhh$@Sn!B#IkLO;P6N zJ`W>?i)Q3-o{C>y8OEChRELRRj&(b#obk7w`jkVU*LNlAPKgF ziH#yER|Q`y^gZz$QBc>fQ8=&Bf$b03%aivcWR8s6s8^u2PaQ`*eDbTdmNAvxPPRE2 zM7mDO4{>8tUXcdP!D9#7-92KqgxakFkIRnX4Kk69}XUVWoWvk)!E-?}PLtRS|n2tGD;&|g7r?#BWTARHFyVW*i z3JVo;LicjFb5$LX8rP&=lUm<%Wq#IjrK+(12*S0i^bQ#UiYHgE3h#X`R-3z|3eQ~5 z4c$8TAuHEwdWG+H$^f4gkkFreEpYpAyoExv!%5bl7V3?2;dZx^f_Pj6(AoQC1R5MF z-gcL-zb+iE#~4j{dsJfRYEcARtVT~drWjBXPz6MqQ?J&v7BCsdL55MZ3P0ubn!};`WYxDFrq(Tb@Ion!wo=#$ihV!E3E!ne}e7R~qUa ze~yBY<6R`Tq9l_Z%@29RpFA+H%MiXvZjyQXzY1JP3={>H3Ai&7u8_hBsqP*3C(jwm z=*UH?3K%cPeNK|;44o*Q$PRB}GzQ`cCVQbas?2lx2#a6KKavfL#GbQ%vkke1^8zNQ zi}u_+s6c1-IJEu5I7K5?8|+^^~ zUC$6X3Tt8D7yX)SUe&tZtMg+cF zXXuNvLAI_DU={%dp#z8I1t%M}W@X6qJpdKK^!>tQua=72pC>5S&iUynpaK{4xKVo2 ze%h=W?+nJCWIykGVF!>z+kT2%)|QvqOFov&+6UL{C|U9y=-qYq7EbAS8c_--wwE3Y z>3hcnzHPDY!n}qVm--;w@stKy_r9$Ox{_`Ho|$X{%hd+DvCFxfIA_lDZbt!fU-RLRUiIYfm4W06zXT{}zz=4c zo!yA?X~Mo_cM5{r#`S7)^)+XMM*i-cDdlT>xbQGvaxwWR|450E1oaZ8GuI?nSEHh7 zK0YSzv|eGsJ^iWs+b9KIokHHN#}w1XkD=_0bQie2;g;52pEr4^jS@a}UZcgK< zU^%n2)sMEE%4cGm9fPD@H&1mo;vTvimX@Wq58$Q>?8o_p0MXqIwcE7EU-f6gsW4xyJI?RL zYMLj16W<%QrG0kuq+atG|EPmMy=1m4xmIs$0FG@k*r*$M`U^~0tCu9+7F={r*12>? zb!CTHoZ}`>!YI`~+5m}nh8xPg?}*;|BSQWPfDzFJ1&{P_GcP_Gc?OmnZlT89p3dCb z)5>;hpVXM=$lU{oGp(8f*ZWTwI(E4|*7**$vcJRbwcDz2aD4A4dHPmoZ=lYe^a!Z# zK`R*r)dj>#n+@OQ_H<-w7;x41oqPRNa})mWGR-(WaW;qg8#c>EXfs7up|YNPP(UoC^51PoE~RF>1(nOEI)=gZ+H zgqej!s+p!;5MWTobD7^gj)Ra0ctiLyHa(hF`+#nS8YDJ=Rc0eiNz!P>0wz3Fn-X`z zO9x^Z`9~T4<%qQ0)lsGHT@1GQdSuW?Kp+ndqBbNtV?moefNub+iK%H&j?U|4&wZ%F z-Zea-OZJtta=#K_fl>3~V}V4?#2Arln%hs0f@Pe$#ETYoOPuY| z(0L77f@%%|#wbRQnMhD|#9u`?(?5==);N3^nyxo*H$1S#TJU=$^Yd67{~E}$jNld< zrrL8n&G9r=f40S7VUJRCjtTx?-Sw_z>8?^WFwS6y_V^)lRHGya<4S(6{MCPdD44@90A$QoUf-a z*Dy;SSMsvWe-*;)I6AR<*itx`gkpJ)ESa8AP3{RHCZ(u@Dkpoe-W28(l$=?b4Ik`c z&QA$!8q46f-ULw_#U=8P&8r`dPo5ysaN%}t~YNuJfCYC+Iy75$wUe0=d`ZYX`3)BmUT70efGfUsSrwt^5W~ku-shr?e&%yf6OqPg_PL1`O=+ zTLpMgCct)Acm+N1|7-8sqoLluc%~6uxs3=#Ob=XCL$}*VM&sT}d6zE66@>ETrvdWbwml)S=}qP&tvQ<$OTof!-bdHv4NFoWOfx7P2U-}RqU z+2^zOIcJ}J_F0wRtn{ks^)c36^&X6BBpF+(3GUa+`S`+4ra9&;E<7d{ZZ!ZeMn0D3!Zs8c*g(GbJ)x!Igtg zzxr<23a9kr!p5pfI|(?eTR3Hl`}U~8cAv&WA!vJFnQm~Hy|A`VT@$ehEuEmRn(Vc6 zD0u9h_H`Q2Nsp06(`0burm@%KVHvdF%CWQRredef>Kjg9)(B%iG0xmeK&WoPdV3zA zzEx9L-?y*$FaFOAX3G_F1xVLs<#N)+~Zp-~ACV$S67S_F^Mau6IpH>Vn zlLJd+j}w6Rz>4R-taV~a49VEAdg>WbVn1$rz4q5n**=(R$rYG?wxUHCLVF|m606_#dNP7O|6cq2vE0#Q!stQ9`zj`rmM-CEwIzl8GXn~WWaqZT%~>8j~do+0+8WfLOb-Z-77*tyQq=Z2hdmF)VlmYdanKDxUCy;k|{5vlhrY0}JyUDsG& zZK@el93hp8W5tfSoQbNIC~TSNDL5@SQ2A)1OXaiTZ~5^Wh}<&edi4()j~PX7IvF4L zJvCtk)rvIgE0AStvWz=p(;Tv13^5$t3*H=0V+=UwYWJTbe(2flUSeC*)J0P2Gt4Mr z+WsBvh3H(4jPL9j?G@ZwFzlV9xG~C{5!rJM=WtK=O_gu6v_OI-*ayw=+NJO{RZ364 zl308$<9TUUfG$lJX+4P6M)+HK-zQ$xM`Ta!s?WYykf3WChcPXX8@E`03i}dr!zD9v zE&2G)aSMav1Jhwmj;{|E?`PL0C6BB^*ljluaByU(p_rU& zCco|RXvDDhJF{Numk}vpz5|S3U6U?I=vsf9Z2rl;w0zP6_+ER+$Ctm5#5?Al3ht0N zi1QiAITfF-HzwvzlpP?7x^#~9N3GNo16NB^-0!sX<`o*^=^{siNld|kI32Lns46b0 zG=M70ZFjR=6GRwL?JXBI)HwV~b^W#%zra;jV|MyFBlrK6B)M+O0lOfp&tqbnqbIsS z!W6 zcg^sv&?JbszH0EQ^P_J!?bF#kW9=1{tli(H!OfWl=3la%LsncE8*UJNb5GXyb7;T= zfuV9Uc@-+y#tXFm<3@mA>aVjiF+NDq+93EaNNJX!3F4~mvBCn{95y*^Ks{>D0?GA~ zW3JnRJ8#p4!;4v46Z{euD*6eUMPNlbJXA9J=}J9tTtyNKiE1aUP^FUgZQ!0yU62vT z*5`)ftjmNIS2??LwhX@uO4Oj&40mjpj?wfPjjd}q-4KoqNgOdLbS!B;86LCgbM|Sm z%Y6v!1A%XLt5K1*>m$G-I!@f|q)tZexU-bLex`4!+o}AZ2Yesl7y=XeZ<4tva zU-W>UKRRKhpf~gQW##QN6jN@Yp?B?EN8b3*+;cA0RCZjk@l5mg9DDE3rz$%R0uIfj zAjKbin^}Gx4kp33Dx;+Er4(gzko(T8eRPqWr6up>S z079ib>v&J%YH)z}+gH)Lf1<(kE7Z;L0BeFEHKq#|<+=Vct&^71I)*chD#;nGHc2>N zwk~I5t=-Q92AwD4LB`HAKhs(FEuJYFc^8>|SduMtw)9C}uoQtba;w7$ETu*{`N9*k z?fQfr+ReGU`W|%EukE4|YW7aG_SDs%bs5(XSOYim0ch+cXRVoujl~y>1|?q5aHzf& zIrTNSBnj-?A}KyhN)Nb%SWh*X2`(}`5!;2!dMU08vLQL00G@c(DUWNc)XqCW7P?}_ z5t~IEnF;NyRhMx$AZ#w`y`byJH(+14Nw+#$+`?PugwtEaQ`F0yHJxLGoA>vQ9=+u| zZ4A8CgjWzM=6+gDi85+W-&j_$C3!R21_A<34gGc8uCQ>X;)ahdd8$^ZebMK$>D5v% zu^{+YDe6E#lbr@N0k?_W)iI+Ggy!_`w_)JF?VpsNSYmpNX!|wCCrxR?I;}5$@#k^< zhm+hCh4>(Lh=FX7b$rytJBFqzow|?J38H`4bXKKb=pOD_j@$#XMkpk-FP9dd?Ogmu zsQOKHyP))dobgE)>D}p!IB;QDx6o5t{OeO$_Fb}hwWXN7*JS)oc9IJCSz>XrCOJBf zn}lsaCl){gtqUD52q7!v>f3P9??Z~wyvWV|*2xfVCbBHOoffG8!D6k6_(1lCXw zcXS+vf!cEYk z)tn{D;hVsXlyEHX)Az{g?-qa!Mt0#uX9%SASlZ!^*^@N?rWB7kZu`XQ44&i`L6nEN zMLN#Y)`ez@XXn_qch08pObO4F%*~n?iGpoYc&3DBN_g`*4h--VfjU1{${SmG zOGCDY0gR+Ph2SX!Pa${;!65;jLhuxV0}i|q;=ff0Oko~K%6Kj$aKRMmqU(}9~5HVxbIrsSN54=1CUM>#Y!7SxtW zooz9KKclZ$BgOqOT8@8ehyhOeV>GOOiEYE+OK0{bzAwY=wt@=E+K%P7$j6?(9tQ4% z2>2xEi@f@t15+%CDk*@34)ygIDlViA)8TA_pC_Vc0XBAm%`vDF_h)p1DPD@*uJ0sJ zqOb|tx+0;OByqF6*X{#hdn-fq`-KF3bI*1h0Nz=Mm7OZh5}o8?Zu2@) zTu)?TYWQ9GW1q0)9O8o4h5;D%|FYY`3<9pjHMp|viCJmB$OKVm2r2I*s`!RM=QW9yz5Vb-WX$JD}MZtQP)VkYE}O2n!fb}PG-Pd z*KcKud%edW@l4Z5 zuNFN!FcEY7h58)nnI9>SscoXAwmgy(8=8=M1&(X}|S^Y;4lkJ08pgU+b#c2eQfqCfNavYES&8pQz-&q<{X zOAw*5h-66S?w_xXCEGGIAhPPJWS0O>{W4 zVL#A@I}HtLg@#)6^ClZz1LtdFu@ZXQKanYETL`ZDozuEAU|T--<>$m~(q#!NGitAlb>NG;qs4TUAFA!h(r6dj*|AlBv((5gOg?r z!RQVduIZHx6f(t>;@&413 z2mGVsL5w1#M8e8z<3EA2=mSPjZf;0$$lzY<2|Bs&@uz|-_qVm?=wzNP9pUCA0{Y3X zc(m1UeKEKVcc9+3E@?lo?pQQcf%93OLw=<4GZ9hiWT%uGG-zZNd>2SC^~QG zgC>eJuF1z{SP+3aSVGtd0>G+cRNG%(bKD#V^BSwPCa_X1fwW6u!`abAt2mcaP(eL7 z9$f#Iwd)SqYaP{Fr63mJr!vVf%)QsQ{V4+FLB7#5)`i_GJ#NEvk>%q1=@ympd(p}J zqXX8@ zNpYMVwZz;aQ2>xdp)rTJFuAxX-2@Oc#@yPma3#M`E+`lv%U7VwrAb`Cn_&pe1ha%f zM@5Ank;MbDt7|Q Date: Tue, 2 Jul 2024 15:48:59 +0200 Subject: [PATCH 2/2] after karolina's review --- docs/Coiote_IoT_DM/Multi_Component_update.md | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/Coiote_IoT_DM/Multi_Component_update.md b/docs/Coiote_IoT_DM/Multi_Component_update.md index 38ed9d9bb..4690d8466 100644 --- a/docs/Coiote_IoT_DM/Multi_Component_update.md +++ b/docs/Coiote_IoT_DM/Multi_Component_update.md @@ -49,39 +49,39 @@ Object `/33629` defines the update process using **4 Update States** represen ## Prepare the Firmware Update -1. In the {{ coiote_long_name }}, go to [**Device Inventory**]({{ coiote_site_link }}/ui/device/inventory). +0. In the {{ coiote_long_name }}, go to [**Device Inventory**]({{ coiote_site_link }}/ui/device/inventory). -1. Select the device you want to update by clicking on its endpoint name. +0. Select the device you want to update by clicking on its endpoint name. -1. Go to the **Data model** tab to validate if the Firmware Update Object `/33629` is present. If so, the Object is supported by the LwM2M Client. +0. Go to the **Data model** tab to validate if the Firmware Update Object `/33629` is present. If so, the Object is supported by the LwM2M Client. !!! info Each **Object Instance** represents a component of the device's firmware which can be updated. Click the Object Instances of Object `/33629` to see what components can be updated. ![Firmware update object](images/object-33629-instance0.png) -1. Go to the **Firmware update** tab. +0. Go to the **Firmware update** tab. -1. Click the **Update Firmware** button. +0. Click the **Update Firmware** button. ![Update Firmware Tab](images/firmware-update-tab.png) -1. Select **Multi-component Firmware Update**. +0. Select **Multi-component Firmware Update**. ![Multi-Component Firmware Update](images/multi-component.png) -1. Select the components you would like to update, e.g. modem, application or bootloader. +0. Select the components you would like to update, e.g. modem, application or bootloader. ![Select component](images/select-component.png) !!! note In this example, the modem firmware of the nRF9160 SiP is being updated using the delta update file: `mfw_nrf9160_update_from_1.3.3_to_1.3.4.bin` which is provided by [Nordic](https://www.nordicsemi.com/Products/Development-hardware/nRF9160-DK/Download?lang=en#infotabs). -1. Upload the **firmware image**. +0. Upload the **firmware image**. ![Upload Firmware Image](images/upload.png) -1. Choose between **Pull** and **Push**: +0. Choose between **Pull** and **Push**: * **Pull method** (recommended): The LwM2M Client receives the URI of the file that is to be downloaded and pulls the file from it. @@ -106,7 +106,7 @@ Object `/33629` defines the update process using **4 Update States** represen ![Basic Firmware Update](images/push-pull.png) -1. Click **Schedule Update** to trigger the Firmware Update process. +0. Click **Schedule Update** to trigger the Firmware Update process. ## Download & Upgrade Process @@ -114,12 +114,12 @@ If the Firmware Update is scheduled successfully, the device starts **downloadin ![Upgrading](images/in-progress.png) -Once executed successfully, the status in the **Update list** panel changes to `Success`. +Once the updated is executed successfully, the status in the **Update list** panel changes to `Success`. ![Successful update](images/success-multi.png) !!! note - While the device is updating its firmware, it will deregister and reboot using the new firmware. This process may time several minutes. + While the device is updating its firmware, it will deregister and reboot using the new firmware. This process may take several minutes. ![Deregistered while upgrading](images/deregistered.png)