From e07246d25dc84de5ace918fc8d78da9a72bde4f0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 21 Oct 2025 14:35:01 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/routing/utils/ChildFactory.kt | 11 + .../com/tangem/common/routing/AppRoute.kt | 6 + .../img_tangem_cards_vertical.webp | Bin 0 -> 10092 bytes .../img_tangem_cards_vertical.webp | Bin 0 -> 4764 bytes .../img_tangem_cards_vertical.webp | Bin 0 -> 16410 bytes .../img_tangem_cards_vertical.webp | Bin 0 -> 31462 bytes .../img_tangem_cards_vertical.webp | Bin 0 -> 48844 bytes .../hotwallet/CreateWalletBackupComponent.kt | 1 + .../WalletHardwareBackupComponent.kt | 14 ++ .../entry/AddExistingWalletModel.kt | 2 + .../routing/AddExistingWalletChildFactory.kt | 1 + .../CreateWalletBackupModel.kt | 13 +- .../routing/CreateWalletBackupChildFactory.kt | 9 +- .../routing/CreateWalletBackupRoute.kt | 4 +- .../ManualBackupCompletedComponent.kt | 2 + .../completed/ManualBackupCompletedModel.kt | 10 +- .../entity/ManualBackupCompletedUM.kt | 1 + .../ui/ManualBackupCompletedContent.kt | 21 +- .../upgradewallet/UpgradeWalletModel.kt | 20 +- .../upgradewallet/entity/UpgradeWalletUM.kt | 2 +- .../upgradewallet/ui/UpgradeWalletContent.kt | 31 ++- .../entry/WalletActivationModel.kt | 2 + .../routing/WalletActivationChildFactory.kt | 1 + .../walletbackup/entity/WalletBackupUM.kt | 1 + .../walletbackup/model/WalletBackupModel.kt | 23 +- .../walletbackup/ui/WalletBackupContent.kt | 206 +++++++++++++++--- .../DefaultWalletHardwareBackupComponent.kt | 39 ++++ .../di/WalletHardwareBackupModule.kt | 33 +++ .../entity/WalletHardwareBackupUM.kt | 19 ++ .../model/WalletHardwareBackupModel.kt | 143 ++++++++++++ .../ui/WalletHardwareBackupContent.kt | 162 ++++++++++++++ .../model/WalletSettingsModel.kt | 28 ++- .../utils/DefaultUserWalletImageFetcher.kt | 18 +- 33 files changed, 736 insertions(+), 87 deletions(-) create mode 100644 core/ui/src/main/res/drawable-hdpi/img_tangem_cards_vertical.webp create mode 100644 core/ui/src/main/res/drawable-mdpi/img_tangem_cards_vertical.webp create mode 100644 core/ui/src/main/res/drawable-xhdpi/img_tangem_cards_vertical.webp create mode 100644 core/ui/src/main/res/drawable-xxhdpi/img_tangem_cards_vertical.webp create mode 100644 core/ui/src/main/res/drawable-xxxhdpi/img_tangem_cards_vertical.webp create mode 100644 features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/WalletHardwareBackupComponent.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/component/DefaultWalletHardwareBackupComponent.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/di/WalletHardwareBackupModule.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/entity/WalletHardwareBackupUM.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/ui/WalletHardwareBackupContent.kt diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index d3f4ee15cd..e7c231fd1f 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -63,6 +63,7 @@ internal class ChildFactory @Inject constructor( private val detailsComponentFactory: DetailsComponent.Factory, private val walletSettingsComponentFactory: WalletSettingsComponent.Factory, private val walletBackupComponentFactory: WalletBackupComponent.Factory, + private val walletHardwareBackupComponentFactory: WalletHardwareBackupComponent.Factory, private val disclaimerComponentFactory: DisclaimerComponent.Factory, private val manageTokensComponentFactory: ManageTokensComponent.Factory, private val marketsTokenDetailsComponentFactory: MarketsTokenDetailsComponent.Factory, @@ -189,6 +190,15 @@ internal class ChildFactory @Inject constructor( componentFactory = walletBackupComponentFactory, ) } + is AppRoute.WalletHardwareBackup -> { + createComponentChild( + context = context, + params = WalletHardwareBackupComponent.Params( + userWalletId = route.userWalletId, + ), + componentFactory = walletHardwareBackupComponentFactory, + ) + } is AppRoute.MarketsTokenDetails -> { createComponentChild( context = context, @@ -542,6 +552,7 @@ internal class ChildFactory @Inject constructor( context = context, params = CreateWalletBackupComponent.Params( userWalletId = route.userWalletId, + isUpgradeFlow = route.isUpgradeFlow, ), componentFactory = createWalletBackupComponentFactory, ) diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index 55e85465d3..aab2ba7f89 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -220,6 +220,11 @@ sealed class AppRoute(val path: String) : Route { val userWalletId: UserWalletId, ) : AppRoute(path = "/wallet_backup/${userWalletId.stringValue}") + @Serializable + data class WalletHardwareBackup( + val userWalletId: UserWalletId, + ) : AppRoute(path = "/wallet_hardware_backup/${userWalletId.stringValue}") + @Serializable data object Markets : AppRoute(path = "/markets") @@ -347,6 +352,7 @@ sealed class AppRoute(val path: String) : Route { @Serializable data class CreateWalletBackup( val userWalletId: UserWalletId, + val isUpgradeFlow: Boolean, ) : AppRoute(path = "/create_wallet_backup/${userWalletId.stringValue}") @Serializable diff --git a/core/ui/src/main/res/drawable-hdpi/img_tangem_cards_vertical.webp b/core/ui/src/main/res/drawable-hdpi/img_tangem_cards_vertical.webp new file mode 100644 index 0000000000000000000000000000000000000000..331074925c61bee7dd33d3c11df4ea26ece6a0c2 GIT binary patch literal 10092 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 Dj%NGj literal 0 HcmV?d00001 diff --git a/core/ui/src/main/res/drawable-mdpi/img_tangem_cards_vertical.webp b/core/ui/src/main/res/drawable-mdpi/img_tangem_cards_vertical.webp new file mode 100644 index 0000000000000000000000000000000000000000..554d4f864a91874e9b08d5686db6d5e76eb478c8 GIT binary patch literal 4764 zcmV;N5@YRBNk&GL5&!^KMM6+kP&il$0000G0000-0RXW806|PpNEQzO009|AZ5v5) zzBBw8?*SpA{}X^k6{5r7YCoJg2->zy%%AtRA3;P+Kuh?+utL|iZPVJc*7cuibuuZ%L9Y zNs??!CI0`1^A-%?N=#yXwR+2lkRVBt+%_u;29{W;rfUG}_<=Q-2W`{M^sjKyJ7Hv{ipvpC zFBmQu68gd1<3&?!FtE!3J*(7=2vsL@o7bHW*c^xKcFaMmP34R!i3l63 zIH{*=o9RrJB3qj3NHI&xk4dlCY2KF(8dq~pvDp#3Y_-=qvpDme7rbDMKAUQ{vpNPg zVrsDD5G2t6KqkVjHe(F}{^zW%I=0wjgV`LB_Z_#=_CUJHRXT>YDg}3n_uvXqo~2@p zV5T`&5-KC4m<;W4s?4o-)=( zi8-2FG>8->T>=aF;0m+}1JtHLPzJxApnKVC)-VATX#}a%ey`LRNvHBrLJ|yPIv;>A zGKi#Z;S?dYnrJ|eJ*N>1T8ydZ2HYDd3c>^fG$c=o6t=QhC^kVyu>-QKB*#wK0lW+D zZo29{@KOMAX(Y1)1c!vk1pp-YgJCeJ8qpg$r;uZhfcOR{r?_p#agP&ykfvqSbB#%R zNI!&eS>x&U#2IvExVIT$jNQ)9;j))p$sy#>8W z7igjZ7pTD1^85%5UgAKapvJbS+tKL`Je%BIK`BBeN!}+C1%p^juV4TZ&=M)bY7-1{ zb~8ug(G=Z8s3a2u39gj_WPs!4gc}l1;J=CT>9Ho@aYT~A;W*c#3)MnJxK>D!gd&n= zBqn7BRJ8>I7vsj^Ot9yv9mDYB)gg!Pcr zsP$y2_QYo;EFoVK^|^cj_a+C#M^B^>ZY_;-ODP6bOATUPzqfncMp@myHb%jBhICDMU_ zE3$x0O1pwquoS~~J!uE6D{O!h7FPUurL$vK5(7EQ70~vJ8)^9IZJ!EL_1?+V{PH9o zIMd#rce=_T>-epaT}_Lj>}L5FpZ4M{RL_E@s3XU|L`6LMAquV}YfG7ce5??t`G8V} zyX$lR!wk4SM~!esQO2AH={8OF*$gyM4ScmN`nc9way9)NqI@_$cr=zS_KnUI1E7%X zOBU4#9_K%R?w05ZQpAxO@?j(!obqfPHRDk4ZP^)F#;^n^w)z%wFg zP*SS<3kN8YD(SU(x(1FK!%;F0H)^(&32)tI_r)1a&;KJXxz3p&?9fl2UMy`(FQ<;d zrgh-{0MyLPs~v{jDjcJ4fkIh!X&J>Me;Yml!2UdvG&bx}#5+d>PIRTrl*v;xx*vugi@}FM|roX(_Ccg>lIU`B$El-f%AE(?^^o{5MU7V zq^)FpIk#6!$@w=_l{7$I2_*MOQi^nOZlfaZ^+0s$2?n7sUJokhwSx*Lq<^XRsmMZ4 zpW9O8)gbiR$j8W=xFLp+q`Q1G7bYK(YV7N#$?&s02&P2TO#3OC64Rm!kT71w^hGh&hikG&KK0Oq<9EA_fV zFqWoQBA!R!vi~`6&>@ZULZ1?3eZPvlN3``!t1LzSx=0t8MukKR%iQyX8b`;;DNoAJ zP>fii(lXl&nT8Qt4H0p&e3`ZndoS)T-1k`=XrQi5`6Owy)8T%nvagK(1LjlORk zZO)3?m4y^7Dr6gZPpl}WXfvEs%(707&9GaqF%dD`dwA)st=lVDs7>jHWHRPKA$k@+ z2kC!ws2qG?Yf?TWg?ptJ-0 zZZRe&XrU+r176k%1wGV}_M<7*E%0G_U^*nllMNez)5AsO4PsR2GC`^9q;$POVX{a9E}y}fkp7y&_+6EjU7mW!FgdJJcgg@c*W5qPSVr=IU4w!F&+~1 zd^dP`K>t^}-$9hdw)1MXaO-lq%Fx1WJMOZ2;b^MGcITHE>v3hHBf-rq{@>}FR;F%( ziXsa~;k7d9>Shu=f!n%ZXL+B^7r*ltE!FiiE$pJe)B1FASL+P@OgDYqHF~9auRohZ z5yGvswcTk9Y)@~bq6FchQo5c^K#DFh=y`5E0|RgcVUo01dGdXhTH0V_P}(tgU!LU*n*n*FlP1UcC+#J_6llvhi0zFXJFO?gr7CwB~lDuxi8 ziW>X=VYA+;yO|m%!P+|nwIu;)f7%$51Lb|jpI_RZBR+~_`JZfsQ0>@e3~scTBTAQo zrqDA4?S0~2dfenqE>*OIEM8UD7?GnCuhit^WIr>ulM?pGMR@K5q>R&U>;bC(YonrQ z8v0Y79Tc(1F$AHC4TWexWpHq(tLVuP|0-q}Jk|P3MJ)v6o(Ko#tBialQw&|tI6?O0 zDSN~2$c+gg=A{{gd!twi!Szz2Nh2rw{j(bUq%Fyp(JMXc{@I~)Z__y+z_pt9S@vC< zLC6F+R7#9Pj_-N8a~@MH#z-^~whN`F(s^63wKU~H{M4tB0CeI*AsgI^APXU;&}EB& zEX`^Y%V)QD2@|Fw0F$UBMv=bK^sm-&*2jUovNh%*U2&48Iz2Z7o#p<($RHFr~Fu(ymi zo9@V$oKFmj5Iez1kHdeO4M1xl)Opvv&*t|}STY-)zPmW);eu`rPhik#6=jzYq!oVmKVi*f3&z2_jbw}MLn620u;!>oTC3znwDzZ{XcaI8d53XE>k`o!xWF7 zT2Ykkvq;$<04^pfw!CDXx#U||CsgSUxcE~@${6-yU^!uZPE5+H@`c6}F`J}C#9yczYa36q#K7br5Te;nu&WBT!A_j zJw_jrKcu;}>>kd>;c^XU3fJrk1SbUj-E+&|q?OjMP=|;qh>5r`m%Cj9cu;fbL!2%x833aj!>-sr$AQPZlXX%f!I#ssjzgH@g#3-(JI$-Fgt-BcWa6?7qq>v&M3lauU7oB?(EF&$ z24o{+{e)=T({Whm-h_sAvhtfa%Q|xRaw;rhBFB4fFwh~uubkN~*!aF&k$c&N}q}zIm@k#;$z0jAAykIuye1L?eaYOv0FyOTQ4cIj_5thv$@A}j^`cD zJDhho?s44XxyN&k=N-lX0RHtfE_s>c%yaAR67YVB$Y!-WWq%k;#6n&}YLW`mf4RUq z0FT8tk?UV)CdpCc8?8K|grXZU4|}e2wH{i&$Car&qbo{%|6~XePLl- zoW8Yxkmvp_H}J>{zJIZ!&Lfyx0GFlkUyFK8T*D38#G0dDAg8V;-i@q2HeLsulHS}C_hKmQyWRT zkHAd{)4zwPq$4`4QVf#`ivKZi7){Zjo}ycUq~rhc>q{dlawJ5dVCT2K?}5n)4Y=N| zxyejah(JVvdc)Za{{qDx$SPBLwL`x747pl=SZ1lOY?RA80lsd5q`6Lt4O?Eo2hcv_ zB8o{O_{-L80*%X1Ss(8fPAb~ZCwO`gC<>_NMtwCZo)aFfxc;K4|A~ITQm^QtvCSUt zku?@%D9r@1KaX51Tw#ed!1?aP+8*(L4co`9+nwRt58+gDr~UW1de+uO#w1}@C`eCr zyXc+=v&7+9mj7cS{y#RRAy_hqLV{naSG98Fb4WCmn^X5@dmi*=%UcI)vat%l6|)LK6OeI*3{04&ku_-$f_y^QFX|8QkBxWs|s;5qN@_z9BDSiHMp(^E)ty%yDh qhQhkUl3VKU?7l~b+^lRgKfp^GM4s`zm`%3;t`k_I!TY_)sme%7q6-56S`wnln#$bT@Bjb+^*=2M9AE|p5Rq4w{>udbfZ<6vkn`kD ze>}aA|Ai73|E3oHtYG>yOfyE>;MQSH<|Mt9tu`|9$u28Sps*P1zx)jYh6bdNrtpEn zV}G!wM|=(Y82cD>G~M#d2ofquWb__@;rz~# zS(KRnMe%l}(CcuJOI_{ybSmrC4QQwa~Q02EjZB zVi9ed{?kjPkV~c5Qmx)n>s@ivc)t4F{ro1uHUT#l9WK4yT#GJ-lIhs#2*FBshEffy z8HJ-gx$W2gMYQxXXGg6P{rx$n%fU^tgI&j@&`I_6dN`<8_{Mce(BW3o#)8H%Y>TKE z|9Vw^|2O7xh;q-cpdk}RHMH4xZ_{BcfMl?~9dTC6a&!|t`T)|jV6fhc@Ix=XgKGmV z{VYyo)c5)^7ena)F|{iX`Hh)OZwgtX(rWY#UDLxvpPg8E#zf(xbt|w>d(sZ|_*BV^iTo#6!gK~AV548?`q|O6Ns{?s+Dbrp3 zb}z(zp|JiI5^0?5^Qi2T631{fv{_tXVi5_4*f+ zG}j?|e~tJe7%nD%MyWwPu6G8nc9Uo5tyhRBz>dQuU46~mr-P$#!Lw{Y-KWeFHWJzt zRr-$)$>tqS1$jh6%$>JIl}h;1JGvTT(6yV=v2(hpNA1W&gXnhg39emRHGYJi5-v9~ zrMJf!Ny0?pG_%5EXZg`=GWvo$H)(;9XCRZTw^(a{d4+C{b&F!#i+Z5gTO|f0@F~i& zn1ib{T2QFj?HBL1C6a~^11fO`u_z*E(2qZ2Yzbj%Q{@Ml=_g5Ryt7pSCaP*}%C7}VBRJ?bz3>d-bF@@{mKY3Dx8E92 zy50;oPd3LQf6jC|^?vNUjXvav^i}E?(mzs*%465?pX~SXma%fitq~utn+aGbZ!Evo z2{WgF4OkU+F@40&v^~NMdN z!ZoSyGw0wu`&b=ya;?szsawI!d?PQrAD$dnuo1w)kptk7s@19LF}vsO#D_$#C>Uf$ zCI(t9@(`i7;Nfb8A)T5-(e5w*l57O9TO(vQtph$59M^NFV6R2f{UxLKXN?hGs{{`9#Wx3Xuv9n`L1Qm2h=VNf>WM7tx zC4d3NwV|pW)F|*%5>df3QpgaQktShp7<>xBiN%@#*fnLIR#DNt1m7Q9LSH9bLf_hy zO4J2jJXeQEtat;?ba|*|<9_oJM$QzYx3_Jm;6?YXG!5XqB_s*+v#AF{OjWxHO9|v7 zL0_k9LZ3HC-f*VyH~F>POlh4w9zbS79Ep3THE(6B$*SiVMjiN|0Y1|)mT){XWg)^A z*ta>D3hl9Ddsgd@e#;ZG`E2l(aqn17MkL>JrkM ze#>nebtTPl1@wC34}jXjFrNL;jE65X!-O zRCUuaOE78wT+?to5xFvNJRkY&3YNgD(WnXp5nabPA3QbS@74Ek;VCywLH#7lbnZ40 zFf;$^QR?K^i*oWvrIPA%>7|-(+a%OD!|Rl}kampTl%d{+u0UH0PtgkgGk=pz)I854(z4Hql=2RQp%@`mVjoen8#-ERwktW89zezScC$# zF;cSPt{|(WEE~RD$Ibg}J+Br_HTM;qBT3DoWU}$D1fluPw3S&b?#MbeYrJ@tEn3f*w&Bl~YT17T4sN6=&|L2LMS?)Ds zfbuMllNRD9obHXH{pnE-)V?4MdPr#LjX@3=M^{hf+#+wI6m1byj+A%GU!LeN_Jf7E zVwBB`^s<>pK=fI;9!1!n7Je0ddK>#d2 zKeR_~!1GwBIwFV{gg8m5TaLU6&VK=4;ix^DMLb%UK%1@YZOGCRADn~5ehAR4d|N85 z?_z?pkkGTA7G?{X$1Z?ywA-b1ULE9Vhf5_*(KE$9>LDz2PGyS;Ku?hVcaPcrY-)1I zXu}>zA$T@`;UrmUo><27L;UQeG5E@KoUh1$qCHmkZ<23bwBLoQjF@vD%#vafG2S)= zL2!!Aasl5(HFA+6+)hAfn+}7MX=|+FKn%AWceaKpqtPa3t`1WGooi*IO=OEJ}yPbGZ&T0F1-vXlm*F z#^kO}1+S8BBud!V-1FJy8aNI2wwTWa!1e?5fFmZr z#XFtFx#7V(QD(1hgn7>JxsN};49Q&~rC3D~9Hqymg5)Ui5+w=>Dh*$oGAWaNuei7x zokb3OMK;GlE(5sXL6Ox78w0~0m8*8Kx_>A*PAQVRl}zj43b2@^W)Kg$bDl~BQidOG zd85tc=SQAPCNlZ6xfL-ZknZ2n3ouXYrMPBv^{oxf>7XuWwIR)qLeEQpp(PlaPNPc8 zptZZAx;Aq?J=L+m)CmNXqk>{57V9sl7%E=_;RP)WSF14>&N6RnEM zLV(2?4PDg=HFlI+XO{MQ)7*vrripNZuN}^?0$0JYf{!9ojc&d(PEV(EB~)5=Ex*kL zlMvb+@^MjhMDjzKJ5pD>bN;fUXQq5FAn;Jw@P0AW8Iu; z!c~Ga4`6jX(*vaaLmGQWM6{v7r=mHdu{X-P8Bb|{)+3g7fEL3FlJ0l)DxJJCFv zX6@;wz;OQGeE>mPePU2b06hbLq7lBn<~n}-Qdq7G!jT1A+y))G&J>l5Mk^lK%#`a; zPZG18_7n#Z+=7}W!*t%=ujHZofQ+gI9sYAF}v#Pkc{L;bNRJDQEw--?Ix z@&Sw_sF@cId-aUCo?WlX6g#b#TX`cH)}J=Re|U`9S03 zSPJwuP~;z%AuAon9>cW9@_cnMghye~;_bd%wr0>bTASgczP!kMnr*h3N|;!5Y6gX& ze1$yj}@PHCE3 zz!i)sF3-c+h%>BNss<<|N*r#be1SV9kO%ioFteuk0 z1%0+kvV(MSFD>*Fre_5eR4D7_VcIovayrCfUg3*oSbr0&VhwnshK0mEc)lI1f*7Q= zl7Tf&kK|@E$#we}1!R%W4dH^@S0j~7p1NcO283DR3x;f@1hB7CV~y^*caX)bg7NwE z`Dk9);ao)H!$$D|oqq^pnK0%ckjD0`0Kj1|8Tc}t>s~_ylTr223^>SxoTU4xkKq$w z?oo(#LcBadoE3$BV#WS^PXuO$y7{fok&?8(af#u(tf2&hOA8aYq2z{BgQUfQNoiNd zKDK&1vp1&$t7KH3V1d{VwH*?q_=8$rC18n8i@jK0qa@Jm;3Y_ZnKV%{bvX__Bbcr5A zM|9IeTSswPGmUN#L@p_U&2a39VA470qYK_XE_=duxQ27c-mHthUkw8Pm>O10PFQi&Ddn9zG2+>gk`d>QD&By#d@GHkYX2DYXVs3z+smM#3bwc~j|DJtz2{y3;twSJ|3^_8?sLKzjPM$M!BRF;ym(rB7 z6d_9aXK+Isu-`14@K(ttXsAuZ2Ro_m|1M6FRLKR&^L;4cot{cEw+Q;X%=GmUjmO%D ziE^>#$(Zcf-#9%)iH4JtBMIxGxU3|{WTMZ+u2kyd)gAyj2!H#$alE+}Eb3Pfr_#vh z#2tfS?*HlSVFC%D8P{vW_Mko9Z}$PEeK9a|x$LnS;C8AxruCNmxm(N>FYWyntCw-j zbVuN7qVo;ENJpHG46h}D%m|3DET0mbb*gMzQd0EZG;G>v@V+^b47~Ew0YvOgW=T0%rp>JG>E6|h^hN<|8l-CEqQvuVF~%TGkV;hDl->9U54?P zN{TTITTen94i~)SelKd!5Qq&#PYU&rfi;;G1fbN1qc&CZQiQtL^GuchJxY-S^CViL_qyN7CA4&A_B>a+X67Oj<>+B$G}>)}hRNE=xk?@QQz!2h1RRrT9}eGr5#n3@YXt*1#8 z&2=SBKI2?H85}!CcQhABut_*36*0Mo=(Q{6E+$mVs2R->ihEW(PyCV*;@fM2R}PMw z{lq#2AR8yo>$?_>iQk_8fQKc;L(tp6oNavQr-ZoTK9t20z#1X^RY?rm?i4{U{&hhI z7`u`T>xajGhwo5EpZab?oEObctwN%|LVJlO`?{7OdX9;;2qO%~;Dn&^4-0Nm+%VDT z4iT}p{SnU{-u4r)bc{BoVo;`6%?6J_*gh;3`Y4RkEIu6=FDN%vir^gWuI?igQYBVC zE50)?srq&P>DatQcQ0W}!1~0wrVK*uA-|4V7n!kCyM^D>R`U6z0gJPcb=L$QRPRe< zy5osRe0g>k@);*Yas{3XTUi9{QM_M`(-48nNFR_xXcRK6OVdt-DSlcCp8xZ zAl`%ZjZK~Hn&=qts$-KVQUuX)89Y#z(nkwR+h{%3|MM(0kCJtPPE5{1N5m9!F1L^c z>o5NCa*wJxTh8&z6cjfut{ss}T9CMRCdJ{zgTmQ|xrlr;LuMCJB<{&9wp*`OfvRsP zFo^3cO>6tB%@bXO9(O=fFExFIK)Pd6k87UPdVqFpKMf9KT~n-x=gzG|IznUN@xpZS z6qtm|BhJ`a4U20V1@N>N@7-mJvKTL>8fgz`l+7!H46p)zKz0qb4F^u5@iGsNweOID z1Kje0a~4C`mS+lifD&_h(4!b^)#@9ek^&(lZ7tHp@I1xrEUqzQYYRH((%3ou>qA$T zb5iG6yuU&jFj+=bU`Z)A%bo5)b%oYekaT`}v+2t-G;7jI4Hbp>i%~_w_?3>hCJqY~ zb%-iCh3zbh@k34Ywj*GY7PjEMYbvAObQNAF2nV95LIh;W<75o2>&Ee|(JYP{y1XM@ z83~RsS)V?a{?xY4+9=o)mX z%@VJ!@L8^ye&+RsqFY4F#XE$wyx#4!hJ~lWF(>Q2j(Iv^89k=Pq$${(of*MTRYOI& z)v$K@mc#3(Q9ZivK}Ha>3GEP~cU+pDlCK!J3R!SXeGPX9b%B z7^02!oFFZ;{^=mrahZ}?moSNFg7hj*%KbqIPNskQkW^LVhq+Ps8yh2mm* zc7^uE$Ylx9HIo=KROMsK!EtbELxtd5&S)xDtm0|oG&e0NReWsV=fW<_h)TuES2#nl zgxD&q6a*?QnMX@$s50es)$Ld?hQ#rcKJU3iOemXIT_&1iPza(rlKEy6t4;GPR<3K4 zlMEAU)#Aiv8=2WFnx{BD34+OXKS<3uL=^0Lb8Yt9Qs^FALo$ZNYZwrCt|m`yG?#v< z`Mw0ROwfh9%afCd5kq(8pj<&0*W=xQkF$(J*5Dk2EfGLgF!&Nw)ntSO;xHqauDw== z&lTHV(BlZI1zP8U4=KJ+hh|CDRWZO)gl(Z)X+zm>;NxdXwy{IntAgi$K@UN_XBz#r z(3O=m{fB45PLJP&qbsS#fgv&H`!J?_I7}2PZ!C=RjNm)CRSka-Y;=(V-LSc{Zs`ZY zItET@`0IyW`zo1Rsqv6Ppv1M6=XW%-V|I>8k6AqWK-wqoi?|LD!LAYy-`4r{33C(k zeL`u8<~SuI(-vbXJo*+A7ukw!$8UxY`o9g~>*y+m%wnSsg>fUp399J6&F)%zFzWkU~}BNZOIEir1YT)B9-yYf@-ti*k;kGT2@AJl-&S$BN{iH`t*N=Xns1+?QOw%qsAQ;B23PBf**Q z7ZwgC0lco8qBon?rYY>Q_AkvIo+L!zV3=)9siUxv3W-JP_~6SCsC>$@6>1wwoz{bf zDYM+UV5$ges~;VT?eG^`p*Hu6zeR$pox!%=AGEwGG3mv&FpW~9HJj*P1I>o5c!Ol z_u6@A=?&niB+sjDP@1e?+^O<;uk#}g6YnauR~QbywWWMMsk6s@ckq?u^x^Uh5DL>m zUEb7+)VOZHNOTt2V&JYK*F5}w`y(7OGlA#;Z%nBhz1Z*hH|^i$EXB zs1as6fAtU>BNFjgZz^a5dXckZl+QO7aQ=^F3jN6{F3y6kQtf*|YxfMI(#Q*0Go{O+Fg6WD4rJLqt51Xcw2wedIwI3nsZGL|D zOq27JqsL~q^wg75-DK>EqieJCEBCvca6f&oqh8DKMJ^;v;(6AKNilB^k1ytm2*~`o zy{GH^(@Q0}$x$jd8U63O(S3g?yxGaY5Zf#}_o-Yi?0B)51ZcmWgn6soScK5AMqLzJ z)k`8%v`MAiJ(*V$gP6i85xoex^WM>on=?D{(qy(aU zYFyq6*|-fP8RPytgLY&o&-7Ay%cdJiNX&K-xURfk z?*5OqmZRMI0659+ZV`jm3nzYnh+@J5CHD4f`I z5B!Z@zKQ{C7TL-?Vpugg-BMX|S#{;CGwwcG2GUCL-r`zHD!g144%$XY4RVf4(NuWA z;R}SeIPtbgM~ysmsEBg|VZ}xp8s9pVij+}KVo;JNkcF9hZXuiGd@j60>BZm1x&uxH zdoB;qUAiH{9YQA!@2(9tO$tx7ixGIyMa_56G%NOtP;7G`+E(BZnC!Rg`oof!j=g`b zOhUq#7YvGVl_JCmp-izb=2gh`N|r*EfWK+hJ`Ws5=^8@m==dlzvMer4xDgs3kwhYU z`05s6(idK#a)9VFOJk z66wmgTDJ+d4rBh?l(*7wX2XGW!* zNWc*<kmkeiCkUfz&TJhGv6kvQJrg@S3`T|>8w zHmd=9nONh=hSEMVfFu26m(Fe4PA91ze5erZ9ru+wIT`tc0ciFjIxv{7)vyl zT`SptjsqQXxDfGkn2h>)7he zOHEA+;vgNBr+s5AP8>*=FCpHFByl3ODmu+Xumg;iqPBy3 zwrMgeF=oK9-f127eLA9|t>qe9pP1XHM)1Y(T(P9W@9V{#Qs9S(VDcNJ!4sw{GS(Aj zt_&s>Aoj*Xk&uOWzQj_Q(*pn&L5rH0q@KUD!qKKnCXC1g8=m!{CsyD|`OBtkMP?Lh zP($*da6eoln4oX9Xu=`siMPd|`C&Z6)W^zR*~^O?JPdI#ViEAYhG4v40|s4*#$^*m z7b$Y%X@3_8gAGMa6TYAkToD4>#m>>jCAIa@FG!z?x42hyjZ3;2Xt zQg~2@tVrZCR82@gPWj=_Q*cxbkE!(==91EB3?za>MF@caGUr`zfL0RB&H|P-cac*V zUuGY8+2{&c$5^KBLWr;~4D<*AQ50ys#Na*4ZMcmjacp@RuySJ{fo;^T%`KsqChSkY zlo4jJLZkC{_j0FwD|Gf|yfMPSFh;*T;nuQF51*E;7chkN*ZZ$=p2-rj!pk87w|0B) z%Kx14d1cEzU2ScWbYV0ob&6)%m-w7Bp*A7~xUDwQrE};0di65t6Rh#Hzp%Rhk=A?n z#CMBTda9P1QUTS1YBOY9uaO(=%FQ&8&qqwlxf6I5&qt@law#MIE0vlXXl->v9cA#$ zIfjSQrvmhNye#m=@&6q5l(qjFpI%SRF~LjPnOEl^ci=XS4V{z`Fw=yRHP5b<1*&RA zi;jz1&QqSKgeC7_tqbLkmW5UMb}gmLn#(bscCW3g7_fBWs>yu_AEKslomQchAn&&5 zt)0|!W0yI@*9>M*s-y_5E~ugM!c`LsBsGMxE1Q!oA$&~W?o_lyxZeNrZcT5R+*J(R zwqj2zZkl|#_pqD?J0+fQ!OVDkaHxjOhfp{hSpm~CT}%nvjYN&9<4T6Z;Zp55=N}F} zwkQ`@#g9q7zQS8+?(7M}G%sg+nNtg<(FIjP6)W#<$_!I5JyGPs?^PF$R_Y0~TfX~L zKHrNH{uqDW4y<%ay4E&$cyV-6T*M0nH-VxEZKieq`<#%E^gtN4={F@+I9Z6CUFD=f zLkkCg(T#O`zfD(4c^LFU)@5?Ob+cwBefJGXXdi`id4$>>N8 zawUe=(ylDpS7jWN3egycMXT({_otkp5BG@;m<+tQHKd3v4qu?ey~uht-d`=GhBtcK z`X%-e;$_kc@_@iFZn*TdDcg1pHKjjN%RJCLFsv=@L6xzdpakV0V^cy=Q4j=`dR0NR zdM&mz?@;{A93S-{MJteoQ(ob5iDzl-%ofRT8y5=t6S>?c8N}d}Z*(puG8tS`rF)gA zZCzvDEyw$k2qEwuhf~s7rW!9eO1y)wb74}^iQJ7h~2g8c5nw{T!+FU)>iEtdyEPY*XAPQ^)l9hJEa5xwtD;;Z&&vqHK^rcP9o( z{zBhVhWg=9E{m41sB$ws_YnQMu2{^$Lk5aO%upEj`;EJwDJdgW0bCsFU2_<J-b6Io z*l!6#K_J&Fk(37>WkRkTQ`4kj&a6SdbELosWD~dFE?7<$=d%vM8F*o84Q;CIBz(V< z&)U?mud*d$@8KdBpI0IWl@)2@zd9In5iheiC;ZHY&sTjOq_~Q@hIkf4)RFOfSp=sG zahtua9;lU+k8#-!J^PO!EKY!m&$2V8p<>#Z^>G2Z!F*e5n=ay-=f=KOJMxmUcwKof zo{}Dz0W~SeQq~g8A|_W4XCY4}Un*fX%;6q^@0oYp)SfS{l-j=hca-BkTnp%VB_zD>!fQ-%*;AnlCxE!e37=ij!7;W`}$ zme@pI!X}TYQ%L3`K(M9nMZpm#)fMbTuE-vXNpaZ^xmwmn6crX&rWZDHbq+>e0K>(l zWOI^g+at3tah)@NMgR$OkZmD7RX@k16Y5g>&Oo1EjG*kOFpXFm1ac}WibLi3;~RU5 ztpv7t$VF2?4(YDoHJ1|S=#;VwmUU?xB2O3e>Pws$u7R}W7$7uIr?>80Ggryn_k$8H z2|#zb^WaOCXR)+%1qLZ+RxHQTb*)Lym{x_wG0%Fv<5zg-+t4d*?F)5n59L&__-N39G$ecQSt{@Y>0IjZ{n!2384~RR#R@=B9rj=Elc6dN zE5*NUs3GPKkPZ~Y-vRt^KVt>MpO{E`L-fI##LxGC*-DsvXbB4lmQyFQ&UFh4jCCXVU^+?E5;YFfofy6fN}lX$Gg$zpVs z{kE5x8-u>Sy3y_p>y4^-lc?*gs4+3y)!-<-IN4f;#ROvEha1om2bWj<@1sb{fC)C& zw#T|g6XhwEy7`gpRX{Mj;3I2&YkUHq+3sFhy*on#$+AqHP9064T~7;V#lqnkv(N-p z4NGx>lB!1<;q!rHr!Xp>;SzL5KxL~-oVU0UuKcO)sx0QIf^fD<>#z*pJNqBk0NBYP%{#7 zkT-#f@$57?La3);=%F^DDkb3AD_CEzNSv9$r`mWQEHn8NC?WUH&J`ngSquT~-*@>K z0fN>`yK?k;k7EdL|J;6qy=;)SmxK$?C`*LShE@vy;~&?*JHzk7r#iQm`pXO>=sbt9 zv2#;bGC&&Y0*98zE5*5x$ZWA$S8Y3Lr+=I--i9S|E9GE-7URr|CRZB zX!>!nVaZDDPUi#Rv%4E{yr#=9r=^3o3Zsrz+R0j zonR(9^~Bu$zta|tqN<7yd8G^$50TpSz-wR6*~Vt_c2Lf>>`!lK5jzvNp8lC%UA z>_$~Wb5XurzV&6nEZg891V#Cy#*UTM@+`F1=jS^i)u|&w-H@1V7b^THpmvAZj^DNb%WCT3_FVY&unzc3xQeaT1iMg6`<{)|N> z-HokDGU(Hp(?$Pbs4vOa`WG^<7W?fx;(BtC!>BLcx+yH?J0?@!P;z<^{34F8Vx=8* z5?oo%_yE{k?G3`Wj%5_sL5MOom|jCZ6n;t8USb`Wp_1OO4@fWf3 ztV)2at~nAKR6|Lrx7|R_8)5M^%?e#3I;>%cQNYGTe-9wQ(TV3xQL=gw`}{`%o4m<% z^Dx2k%+##;>^6xRdWH9^(sKgvk#Wl~6K@w0S`BhI(1*GA0k%rrfqxVw!4)$#nc6IS z4_3#`iI;)n5*o5Erw7_pWjYgUUu2(Z=PNYB00s+rEJvG!Q~WT{2=qzYeF z_qhHsk@;zZq1AR%r9zYGzPiRn43-AJf-BcoJjjsp#!go3G1uYZ*1xjsTp`NdIN%bo z)foOfckN&*WSr4CoVaIdF~@bMr}0G~#Vijt%Mo!f=+{R&Bmo?q#7SZbr8MNw`t1UnzL9I-WK)$_CI3)mD2vsf{sOo%XZ#fyI**&| zr``3pwx4YwhIJz;(2&iv{y>;<(!brnLGNTr!z;zHEvu~9bXEQ()D`hSRoswB6Mb3S zt<_TDvJE%`@^(NrDe={?)Z!<-BRE<3Hq9JicZFhu$#o&~WbvL(=Cq1%lXxI-m~zvD0C zsNB@1fVlQdGTh5!F!2V0q|cnIw_TS!%y-+tliEO(vCnti>aro@$j)JsigX#Ht-WOe zZh2a?2n3azKL}v9q{|$6Pj5v`;x^Vld!3~JF3Pi#o_k=SF;soD0r#8UdARH-Pczv8 z5%IGs3>WVz=iSC3>Ps`M`K^@A^If>VB~`S_ZtUpl+5k@<9?E%^>HcsbjAO=)>iCNg zDcwbE$uMny@$}WDSS|=2R))oqOUXDptj!C+u}oe$B67FBhx{YYT+Fay@COoAoT8*d zP!Ixy4ZuN2>Lx{4OzR9R<_;WQgkFYQN3gg#_#HJ=QeL$@dCxABhysUrH`R&Qg)xFc zH42s^-MDi|3T@4H_~1&3r4`+3oRySf9CMCG*bJ38XR2SPk#@#0w_`R3g^t%kBEi3; zDyLq(tLpK$rRn$+i?NHE;|1a;d6}y?2<6P%EZF7C2SH1}yL6rAxeG7pG0u6&!y@sY zDOK3ICFRPia|mKkcm^hSEc1M@TobKnUSBLRcQ!@mb7uCEQ5Fls3IrLg@fZ4%U(9pE zPgBzers2Ie)MiwT!l_!)At6TsaBa4(s#rIicWr2>_Eo!2%tPkV_VXIEQL0=&yJ(fb9 zujn7J9$k(kANZIr1*w_JcAq{_+>B$HBimI_J<8|pt!!#*hDlbiBYLYZgeHQjWlG@? zTjgn4nY(8bUm^A$Xq99aox8v{S=~?rP4J8fL0pFAON^i+ra?v}yEOY}^`j&WRnzRr z&F!QO1bpJz(-c7-@1u0O!VI(yg~o7rQwPl_vlAzxWpp~WnL1{TrUv3~BN-BmSmsVKyxPL@}HH4DXf zA|GPq;TX{Vt@8~;-Ep_H?MJV!wh#UUOqObu!k%tZ4HnSI4Dep*oE5CLjqHB4+#C?u z@-Y$K{$9LyBN{<@c#iEez+J>uk+?D#eerjTR%0Ybb+Dh6;HX47-*`bXN4b3eK$h!s zg{rR;NcxEnTXGh!kJwFM#dcbyh#;bgN!So+_3Yh`-USTBBxO`Hd=ru1E~h;{^_
aE!thm#AkIA)=k5~XMJ#P0Tc*gCGApu*n8g*W4kM;hbZwi1X+E<% zuy^h$D8wv|<}Oazgq2P8XU`o+mC(-(3)hGv`5L+SZ!;!*acx<#fs66^!FA!Qjvgys z_XLO-pHAco5KpUiTnA-B0$F~AMxdEwR0{ygnNrhIXwIJ%;X9{kGY&I!&VIVMPLpOy z`Ma^cTN;3=Vz)!(5IIqE75{e|m{t=a$XP9DY|5Cj)cgO%sy^ zjMHglHgm~ixqN-0`))7#LYSJi%y8xqIZZUA?PbKd==G#? z6=6^9qiZB@>7eVRQ30ml6)mFHiNp`)!L~sZD=P zL08(zk)hc>T0mBo$Rs^(8M!LT7%6L8^2__P1E>rEYGw{k`sYfw&-RS@L!`JZ35_3x?Mx$n=tum11O+oJ!kYD9qipFBX) zFBkyeMjucBMwbk34knl)Tp(XwMovT8bUp|`hqH0K3)y+mY?+C75R_%}$RoUI>}{Iz zCHjavL7D!+(ZA{2d*1!_PaI`MInU)XOWkw@x3MX)>g24g!{)Nb4U>4HYNuahWC3j) z06Xn5J)+#ANBDaZdv`o<1CR=s0geISkU(^4IsESs*foL`Uv(EPexlL=k z_>$_PWNS@p*u}fu)<7lhzi72f5)LEnaKpIXkb}CtvK{`*!uVf9OL7H{os!2H>zlaG zww(XRx`Gw6xWXrSzP_nU64s)bO`ew(ax zwSFK}lc2f)YU#r;I|9mIvZDV3?a@eQJAk-tMoI~QOIM~HBFh=J{cmFbg-(ywKuPFC z0Bqh&a&7GXzailt<fgnsr0Md12kXB>^Z&%?|JM!+0PyuKyE^vI%KIbj z8#>t&AhMx$(xCO$KDf7xVeb~x&RiWJ%kEN4PID2@C+<5N6#K&*oZ!3EylAMF^@@yw zXtj~huW91Xj$9pppb`F@H?MwQa8T@(ILCI4dGMk*sV2|6(Gp@WUAcUfJhvtRln*?9?ubgEJBeWT zZ=s~h*_VBEsmqtNFC1}HqoEF>luUB(#xLS2K7{W;RHUHTdKu594*Z?;!~dw-FR_;Q zo|}S$i+Mf13ZGJ7n~^`Hs!38Z9h-_nCO`6l$MWemfb$MRRC{3CorGgJQ!J3H+0MI9=lndr|>6K0jIFPtu$@%l!y(zIV5oV8-ih0Y`s zzu)K5AS2eVOh;UfkqW#R!aYbH>LpPM^u<@3Dsj_tn;T!H7((8USACU^XkgXVbDkpp zID!RiuVqarLD?A83O(kI)Z~IuKC@4tsL5~v8PK>*e|D1=P)HTx+%-1m#lRu(Xfx@Vn(KKc zEHGtI?;2fFKpB3BP?ma+yu#tx*bsV6TAa0n1kGYS&h!)z0U0{(|GMn8o`*E9-8#s# z(Oh>O#_7fhDQDo7B4osVN?8&YYZvdx2F~CIlMjHq*{kDClWbK~Y=*oDu+iRZq19J> zlO8tB@!jr}m>7g-f291BlVbZ0;{4gg6Ab;rVQw4ecY2&Q!8YibwPiCIu2=3Qf~2Gj zYxSQzWwPIJa4*6q9>rnILLfUjtBl^BB^(cSMDaF1Zv=C40 z&IOH?A5n+L^W>pGR*wjVBRIp-Z^FW_V7N-3IIXW|NN2$jvSq04L(F(cm58yOdBB5B zvahsqxNV^{LZCmAxo=^BH0#EL;>htFe!Fj1&pB}5WFw^6Jb8i_SlU3D9g)`!C(=KO!c8THWlnO-RbhxQ(PG?g6{BN4g8Pv4Q3W zdl%>F+wm<)k|jx!ZJEUXf3pjK2@#7%R_Ke*%vuo>;ElFz-ECXjT5=eJ2Ef|73#LiR zpMTx9Z6rwj*FAHYCehu$B7zOuNQ!ds{6ClWsrMvFwrbn9ZB_4=qs+{d|HQpBdl6~H z%xmi_`Y0lN(Y9^7ZDd=BNTdM+WbLc4twmCfjQqBR?Vlk@R{W!E+tpQFuI90A+qQ9K z`^vU$+qSK>ch7jHyW)8&{=a`T&Q<44L_l!c$dS~Sd%~&;CwK3K56F#d+qI&*??(%d z!o$}Dp;i9jyt{#!2-=DWNRX|BVSeT7N2EP=CaB5v`S>5}AOGL~EC2cHK`@pIo;mTq zvtIJ>h0E>U=6WR^K6CQCAN=4K|Jm_=ho*2MJJ_7Al;a`2BCtme;9_mcEzPdK=HZwtCZ$O4@jPOhCya0LSi{9XgKA1mM zY>&3qn^Da}L@6a)i<9g#3FPXBe9qgvK!*~wdT-pT=8}FfK18x*YLN7Sb1WZV@vDdY z(Yt*07n|3bu6A-!BEH=hcKvV~nLQoFO~hNDdCZI49>j93!F0Qq4zO?_VF#cT&ItG6 z3`PkgfN;$dKj0~TAb+CR7;mjMll}ma61DIR;W4yZ2Z25?R2vtccHhU)zIFy4oLIuUCmc9Pq(2!jO!D z5Ym?rEQUn{1K=F*efYwaBLFDODv0-Q*bsNS=;aI8O-RPC0`rNU9egCI_zjVjjnF*F>lXdnt zF2q-DIU86MzxL}CzXFCimCtKEBimet1)Av;)ohJg^{wLsBAYkk`4X5)SW;wygj z#gAWPyqRl#>27~*yjqRe&A}eRz(L_+akI&U((PDYy!Gj)l#yP^uo-Pwv@o1_xjpI+ zy2S{Q3tyRw-to5cJeF%Im@0PHr-M=~Y>$z{V$fP##)W)v=7_*zfY8Sr(3-pS@56f1UmlXkZd@iBGzl1-xOhCqBN8UO-8 z00L=+wBS$x#7NG&;~#{w3~@Npp=h$w>G$fjT+}Cr6Im`!&%RRTUp-IcRVPcm_0go6 z^bz{&P7OvQu%Ouzih!h$OUMZuO)?+jJ$9e3vIjsG@+E7%-e|R+3zJxZd?&^&@Za-# zZ(c^+9u zK!)uvZiA=WdY=yd00X4s<4JE_UK>gz8!MfDy`Btd2oVH^puJTE`lbn#-Cp^(?su6N z@i#8{|NKAy&;R(3|Mc%};@9>k&A0WB3I=FRD1Ak%NWgn^y6*FJ9KZxpVWpwH#OJ@W z+3ybqm5iTp0TD+9az+t6Cz=q!_39U&@D#QO;as(|z1I9EfB)~`S7No}T5OKKBhU#$ z9GoLs?ZgZR`T5NC$AnPS;Fjj1YYM@zpH~E-;baUs0O4!_Vi-7f&U?(4mGJ_G_C+$K z>DHi~iv_sb2iN7AvM$Chxn7qOr9EeK+5jjDT?|o9yv5I?Lggt4D>cMvs#D3B~}aW_TDJV`@_Az$J(vC3YY zH`-&Km;9#3g*?RIcmgyBeRBY!fl(qB^USNBZOj4fkOHL6?JSOxpTozBgV}7DO@}4P zC6hZu28%{=K0jqiE)2;D89wq^2lyPB4i~jEE<+4TX5^qM1HUzOz3*RU`s4Ngw*=Z( z=Y9TYyxJRda>1P||M{z*Uwrlm_>hj4hNHD%E32)oXg;B@$Z&~RSLsW$Xn0WV4v>H9 zDJTG~I$%7Gl|cilqH=PMmCA==01UsW%q_amHL4cSJGc7oJ_dy|l|j4LuN5PjQ||uz z2jBSo)#fPomuH!Jw?FBX643yPYZqfzRzTtFvS zs}kK*A_eML6g_K@5#g}WN3c8ge#*w(u#9~)3zc`s72hS`6rCGV;sdy{21_8J6`Zf6 z;xY%9Q+{^O^Pq-MywUCUx~)>wr}o+R#h;$})g#kaf2zFxZm$ViL@t7;5Ze1M4oE%af$HU{2anmCLaHlb|?1!i+X$Rl0 zY->0WBwWMTi;B2f!wkqkti>=3ZCiKXeP8_ef&X%ODL`{D-)iRrfxp2{GOkg)1n{nA%r0O@y?dj#Y3Eiy}BBYvx{#^^qL&bmMx;+BGcB46Ok@fn5`q5d01g zWe7`waFoZ=j`d2FSUmOX!=w!w48$B}->u}m_tpG2KR_|mN9~odH_txTu@Z#evCW$uD=5S7_miAG!Ek5=Hsoka_D{k z!YRWSP)K!J>+{xGgYGyTRC^PayNGUaGJ&?)SlS%t2W_}8gOMQ6aoauh7j)P#$~}zX z_|tEW8)yd*0I&_h5$>hr~tIA5!MBJiNG>9b1UQ@4#d3>lbFj6Y%o?Z!sn1estl^_JppC9L zdU^eaIu54@ISig^j;8=Xq*DIE?r)duK&jykr<36BQU`}5MvEF5!g-WN5$8Zs!Mwew zRz8887wnvI%LJsO8M~ejgmZK&h2>l|*;i)p)yT=_lP~-7&#l+D9in1ygZABxeFlZ;}qqs!e zG$tQ9CNcu#+G?0GdBM3i$D{BT8Lez6M>l|(lpGw1#wK+Ck=?Hk z$=QvcWMx2$2z4Q*i8f3ZbVpPRaJX3<1*8K~z*2zx7wn%gKpzQ`eN@KI8gNLU@fh`~ z_@vR%6@z>N4lAX+6>L`Rv<&NS?0$7F&Tjsog%O^^Gbw4wz^t$sTF?<}5zjLuA?*VP zRKN6ni*p5Ozf#|}v+j|;C2s$UvYNS{G)A|?y?w)Bg>YiRnwj#fMD7F>VO*fhV1Huw zUYvo$^g-r*7nqE_smG}XaE~% ze4>~|hOYg^pC1Q<3`vw6UNx;SSNFsF5%z!3_cL&*nopJ%YpbZ}iUh=Y3<<&r#)uGx zvB_9KW9z970fiw`14n{v+yv-#t^-1iCpo4fDt zd3#p=l+#N^m^Fqh009P9hp(YvABt;f!KZx|*|_Gn|CoBY~jm8PZ=bfqw{)pBfv;fcW7(U|>m?t&3m0vbJLT**XOL-X53wHR(hotPdM0u0UzY%m%W6UZiX{h{5<4RpJcNMICPBPhZ@f;~(UNg@{x5E%&?DP@c{ zsEYJDFjV8<*X@tQoD5f;nY!Dr>)EH5by*0uAm|X_xcc+q@2lYA z2^Z@5tV5H@YC*Hmca=tLtt&%T2Rg~Y+V}~^ExT76^zD2Z{W@Jp(ooup`fk}h+EBWM zR)RDwo@0s>DMhsYOldi?(Z*|k?=YzlQLeSaj}%xi0U)4<%)W#(Q}#6m-luUB2koPX z)5Fve`U=cs*d4obi@sJLj2K<=N>IGIK{JD}M9Ra0isF)x2ROKJLx?7Cm=<=G*A4kI zWG<&T`ylOr4GRheRvsZ85u8GNq2~IbrNLk3xCV2@?!Mu_UR)8^V#8AhNJLdKvIzi_ zl}w8gHY8Lst!44XIUxlzYF~@yB+k7cd72mvZ^CVqud5*kv&#_yWgR5e;7urQ#F%{V z+7Q`5FVxBK5j1$Tv7o4xLAc1r;bO8JMdLo@2>ILryjt^lVvrk77xe5(-%^?-3%CLz zq-fOe{jxpW6x&KFm!dsJ_4jx8jr_=ZjbRF5`d{b4W5%@j@q(T%8Z9dC zD}8(y?4Dvfo+Yw8kC;|$BM)Vq{fgbSi83+S1RwCczx7QoRFJ~9_7QqPQ7j0MkhuV&phIbZz%j4BZ^ziC zxeKCGgns-lvt^i+17#r1tqU>b4A(1zdcsW5q|P<02oaZ5 zRMb+yRg)VspyNr4djOV*C4W+=DSM8#ET+NAnLr)y77NM&8Xg!dg@a4>6HH`*8NHMa z00Ty^EgZn9*v4rn-sS=zpLNA6HvC48D5t?g=pro;|fQt77Y%2%6*VgLT)FUBB>YebLr!)Gt&&?bT>dg z8>?3WMrf&?_#`8Jyv~4{KB$*tk^%)^w+2Ljw0TSG4e!HS0CD|7#qjzW=QpENE^$Or z%4&d>E)UQdII(UmcwNn|OqeWtmT`;u?e_-ZqmgWA!h74ce)eia6fLXJ@*?@(xivCY z8&Qd^ZCk;8SYyaLl+47Hj_l3{l3O~dqLp*#l(Rqp9qeh}OUtMmRMDgM_jXDVnjk>i zO4t(GN}IGEhO-Eo($CVEM-Yk8!0BmZW2|lc2$UvD~K7Nx@ybuIYC$~Wt;$AQ9fOrQN@-+ zkap@ox9Gaz1}lnUG;AlwJJ(Rw!3ciUa85>?iB1JtCjR6BVwZMcMk&+*$gTL^%gx7} zV%n9eu2IZlNDE|_Z=zp>!Xe@;b%EZ*lLjXZ_ifu?=(lqg>rhY{9S!W)48KpqFp!t% z6Ega7EAT0!0V_>|5bj;LvylS-nANoipd^`6&r0y9I8K0kLMu#eNzIP5GX@~dXEfcg zLQ4@wVi%7_d=MVQ?FE_(R`d455-Y139zt6yg^s_!yKXF$H3E!L0?MJb4c83YXo;?8 z0NI=yWz<+9FAEI$u&Jn`RkV(Z_D9OPpyj#4t0}k;W^{18za-7MMI&h+3CrV>-Gi;n z%@4MLc5G6m;6x)=F*V(CCbv$Wl7LyAa|WVbGwH!uVmN{)2q7E*+ zBmj09=0^h-2o9{YDsbvP3mI>qPQS^~&LaJN#WF@Dpj%^wJg}Aa=XYO&u(k|5V49$@ z@o&SK+`7=qKF=yr)C!ByRYWYATUirxvMD;@2{*J!S=_UCy170xUQ5tuD5gk_6&cJ- zJ#%0Cs*csg&Sj|b_cd^B3GRYj0_m2~0#!kp!R_ZC|sB`lo&NazF=It!`-1$u#G*c+N* zMz{s}0Al@IGG%=@y=WGY>Q6RB8mw4eKUS0!j0d!h!}}1_hVV5VQ_}1QylW!|fXbN^ z2S^eqKQ!}LQX|Cu%vH#YW(+GE$-x8+BX*t}5f2%Vat3LK$9y>-AZ4d5^vr0=3;{!F ze#IBfe$npX*7ST!mPs)X$_Ax0SQy;g^=_=B7@jr|{Jq=9Q#i4x2!~{%VvI)(WSNEp z5KGE|DCZHn8#`bX;IiGRjhyU;Q`;!lxUjs0rLvGhL?)F#C9{E#DB_K9hszQYblVbHa@rI{WyOP*I5KSY)XvEkBm`*TZZ`!@qFcvV( zWuQ1-(HTO^BZ`B9Vb1}N!a-@vUUvsi+c;~$2;!kSR@t{3w2;8dVKT=3C+#$_%e?^i z*$qJo;Y0VkY4?O%Jq*GbMiDfSTxpvIbZ%H8a;MZycLIB`s=&lxeMpW=Le-Adj9uyv zR@8pqOg|(ZgpjpCOs&CK__S@qOWT4AcF!7L+9*-fi5H;MOx@q^;8nTJlPylQ%sKEK0668{QN(4S^xy0l9 z=oEc#kkEjd@xCmMpz-LkoI{>nVBL z<}-lmktS@$SQ{akBTx%ACA|lw9k=bEMYhor*zsDpc$A1KCCeVpEn!*o zWX&mDLNX6YycsA@fw&+*D+R2=w{vVzoN01Lefer4@U zOJz>D4e3bBU2S4m#vv?hnEBSb1TwQ&?bu0*diMFXmA_gZiA_31l*XbU%VsZ8u8VfZ z=3+z0qNTizpkO2B*3lp#3yULliyG4&M5g8j&Y9Bqj-FC2Sc-2L>9WA*NNhI5tf9ju zL1suLjev0k^i{im-~M+HPehnm1uTwM&5RK(=HZoasl`Txj8mlPVQVqY3^eO47OrR> z7ed@M*ushBjPPu*dl$I$XD*?T>J%bwp{Eea2`|~5DcnR_iTk=~B6y&p1AUB=nOh;? zC>sFCYWauytVcd?-o+!DtqEb&6JKV*8c)(NgMgHCLipu$2GB#EOLnIV8{)6^K|zyS zN30=iC2AurIIt06>19fiV1ZNl9H=NeIX)HidFY>l1(Tp9*fISGwaUZZ zNV#Wsu)Gb&U-uK`(qm;&gJKq!ng$4wH61v*p#pe5v~;r8cLNi*9D-2 zzwzHOYdPN35t=z*JS!5)-Zh_EMj>Ip`ztV88;xTR&Mq0v3=GFK~|yT_+R_rPQ+F z!rjH$K_n$|Wq>eFN|+CAJ+mRPHazc^sGETyV!}gZfV_U^Tn1o1$zq}0t=8)2COG$C zn%rxI7&A!I;mLiogbgEIv-=nB$CqF6h+v;bC#8;sj5!PiPPzUWDz7TBQfz z8E^x^+Gkf#&jG~|050dBCfqZC_mR;2d>_P=iXe6i?3;GS=5`N(;PMT`9AD^0mdkhT zB5%x|P*}s;z-P)>1Sw5m1^Q=R@eWo%5n>vt9k7&<6vBnD(~iLXbt<;)s@<`PRska( z7KA`>-+ts(FC~?cWcGfpHA-U6UHuV5B|dMXd#CL_!b|(>>`{XSy$AO4F;MWqG(yL2_D@g?-KAZ$dxEVjok6gGl-EfT z+>b+=VHw9xwii>2D1hb^HV8&7KH3(nlTbLK`8qT?m<7tJy#<4uH%90q(bf*7n2f?w ziEzd4hH$%&AWwf=LrGI9I3zs^1EbC$o11AE5aFfi)%60Q4oB4?QjAt>0v1R*S~C&5 zfBP=C#FI9+zb>5yBe-dIZ;6n_NqU>A3mrYGsa+h^!-fzVj3p~*W?bD$8v@jY5F04_ zmK~XtokmTGm6OVti$Z4svGM#mI&C0$Y~w5cqTQoy88WCBGIbEXuC$OSn$p^!BZLRH z47DCFU|VEnZNY_jrnQE+he(-aB1h+%HN}X1ACV-mi_g8$9LF5H$UY z&9!3B-lW6S;RwcELJy4Yd=D7cMhAgVNbMHV^n$>KKZAu? zTteEg7Bnq!F&7n5M{SMH6M7vt(Ck&bo@z|lA|gfMwtXKHr(^7~qcIlTp6NzR-usew zX`z+1c&2jG?%GDDCsPW4YDOo=tZ}EzhfxCDYH6KIvG(Pusw_5ex%^Nn=Va||KuZ~3 zh@r(#{X2^0pTBjG)Rd$~ z<+do)*M>K_VA$=%5cH+S7Ma1OCZsQnP8*OS_1rbuEQfEqBDH^L13sn^Q`XI@)uLnhHM}Z8Z;%yZ632X3OCg1NSXN< z>=1zpoqf1}FqX?Hw=CDgtDH-wu<)YYwavJfVNRwbz^EMta{I$0gcAq=dl0T@gTe-Q zU>wX_gKktN+_erMGi5t0cvOzjkY5I(@L)KEyI?>rL$PV;314bxfa`XjDB9k)cAhTq zHSZ2kf|^k~1%t-MpiG0zMZ?r)E8>Q|r-)N-*XG^pxB>8c;S2>TRy)pMD~KMfJ@I)X z#Oz1nTx_chn(x_t2Fk5-rus-qPpm~ScrsY0;wTBR(Jj-Xx*a4wpOMDwdG>DSyXeP% z&~}}q){_gw0o}WNxCXjW?o<9KJp@B~*Y4ORW-n_>j%7V*6x67lh_)(K6u(YPM$HX^ zQz2iDW|d7-wDL%qB5$jJhyE6<50zX6meWokBA_b*vH9bo-G{b`y>M>|v-ke$M?_Eo zFeQpi>#ac5(Qv|HpR&rBWfmwwJ1QkxOwF6$lRfgHAG2pc#7;w&_l*HOY-Ra_$AJrw zde!dKOi5?&`!#itp2COB1y#f>)^UlP2rbmD^q5!h+_%$!EHgTRc8+?Yr4_7Mfp>xJ zqjflcc_ia?!B-5pYWHB%=Io3inBL!|v97FEMIli*bXdpaYikrsfqQ)%rCM8d z9ti+qBY`*Vj&0>%7v&*arAQy=>~hoY;1aj5^+7$OPT*0o zCor~BRS>N7GGjGeY>ErDACqdNo+%mu`HzxKIcR&2 zt#V;14hVVWbQ4aL;>o;f_h=hs=Ei6Z9#^10QjTp8L4sF1U@adhkPJ*0Dgl@`NAIm` zWLUH43rZ6D2M4Gf5zq|a4iGt|oSbqqyjSh+?K=g6fHnqafOyu!qC|3LD;OZ`No7w7 zcpxDi$}9oWHYb=u#dEuyM2Z9erB0>K2by>;>^<2)0s15L| zU6d>2?4wL+b;CU71?BjvEFqP%h$CI=Xo)~jJlqU%#@pT@mQY66Ppc?GUJ(p~ee$(`9zEd^W#jcjdbBm2QD5DDBa3X=2dLaXNV*LC$)9 z;N6pe%PJe#=THYbWPz)UHN_gugIh}>7{Um`S}i0S#7Nt4%#_0JhujzK9&8hzIEX0` zZ3kPt5Zmd>*eNkVTg9MSAS^|xyabOh1D*?(gWApsYwl;31yWPS9J65-5!*7cZbTfe zU&zhL_w4T5^DyWK*_23Tq+k|FNIR@mJmr@X7P6r=@J%TTn&m)$x$YuduHx;vCuF(t zz||pn9Fw{lgpe@u@j&&1C8M!0G47h(AL*P$m3%fzHlZ-k$tW0>!G4S>5&(KKYjUd< z4$btxf+=Z`wOP~{Bg>>7nzB@DI88vfX`gk|GH(ln1eAGu&F(9owGh>lvo|)>zW&*? zT3f}81D;Y5@8wpKbSULaT3hB8dU}(f`cW|!AFAk zt9Gxoh{5~RN{hmgY@)`Xm3CSvSja*xTZ5D%%p_R^aO^%6a2D1fD{rD1lSe5uEvv@wZNCjOq?b>s6?z;H&l znHEG44nTtb(V!|x0~lVWS<#|7qlE8 zw4vyi9Z&7K4?sHyqKGFS@ZJ>GL-A{bfsk>-y|2*Hv=iPK_U5`Sf%RIVie@X`OyJ59 z2fqM&EY`sjOi^s$a>qV{K|p%mBZ8M~r>R+dR4rk(7^7)&`6i{HCCn{Fa5TR6TEqFX znV^Y#Wu<|k2@M4RV4S*}Qa(0z zFg})JE#rV0)jB%(-m|c|6|wvAZIDh$@I-~IMvZPO`bc3^(0~NB5*zzCh=F;xnF#(vm00C458RZfL>o017X$@ zfvhX%3z`O&fKsGD&6vy)nf8fNd8czhE94w=-;<5{N z2CABnOLn&w!s4FyUGlO-bu?Qx5Tu9u0LMQdgJO0`hp%I5TJvi7!5l6E8{ZUg62_JR zIo!5O$21)+j1q>YBP<;);{nwoXP*|}z3bLxTwf3Zdr?SnYw*DJbR0)gLJ=5I$(u)^ za{)BOJmUzolO@s!=>0cyBjE(`Qi*Ml7POBdX=U!#y}9e~CH4DOY)H!uyK8F`Hn0^H z$pl^D(TR1uQnQldKnfsmDy{|k#8r3z^L4FL-Xbnu*KeA6`HH_vVmE) z1TJhYQ)bl_NVty|HNg2;4ho?hRWQi;-qTup|Bce7YjA2}*npAMnBsm4QhPS9 zGs~b!A-175W`ML6>2lxjTu|f`*gN7uWHb&!**1G0ZanzX{T(l(LOS}n^SYsvNf!8tzDkbHnRvoTbT5odIBiy(dz=!{=IfYxhJU& zPO16c|NpDBP3mf_$RJ>^4WcMUuUpi(YbHrq6rUjMe^bXLFf#&SREhUni#YoKQD^ka6lO}b%QKK&eWB&kOw5Bu97DOmhU~-BF5pxAE{Nwdn+0Mab)l) zX#=vlc5UYh&zXHRWB|bw;T|bb=J;rY_s{_^c5Wx71p>eKItVyZ!Avx$m@vz^g&}yxe{OLskKXJ$UcBEo=eELRl>$qkEK8Ff*(Jbul1!2@{pTLfEU#EDNqF zX!{L-VcHR?h?X@tR8O^4fX3@c%_1;agLu>Rz_?-e#9D?;PRaDf8bPTs_PvL809wV0 z0?nvBhr<97l*Yj@rLy4yD@R0(IM~|He9tcL2<7Q6bjXGv z!(jkLcQWT%AT*o|b~hM!@5+@->1dF_xRM^k?ETi#3Mo`)T&gbSF%SLM zrD<`OWhRinECSO0pUb$P2q$R|5;YjO- zq*0rqJjDgO>vq(i6Gat9rZ0U5(F{rmfz7lcMM7U1q1OpgYfBkaK3sX<^9j6iJf(mk zTL?v%WVCsi0n!87aaaKMl(%{*Z>g2-UAe-`bX*aFYL)SMw6-RK5}X2tCbbhJX2ddT zNTaIYBh}#eDmvq>;a(Hh1Odj{9%4p}NlrT>mG^0DnOG#6A>kMVPY$?u>H&g9sXdzyVTFNkShFz!a)!Q%5g*2nITQ?+{wlA!|wAAq5IU zNSQfq*j<~WG?(_3pVAL3zQrG@m&1J2i!YJS>y`yTD2g7XPLkC0A^6aSAMk;eWR{lj zKv5LfI(8@dr!DMI4|9~qA8g>9h#!P5D=n)TYQ*ic>U(d zAvg#4Q~;meSG+(xzPu|=Te*F8<)DxnAhIrXs{tGbP@_Vn(;`ZIzYE^O?V&kaa6VhW zD_+X`@)WZ+Vb2J)7_{`<23r;g7KgB~)eXs}?b`dX0Qh=(c@{6R#oy0TnnsKkXS5r^#(mSmgG&F>@J-BfYWApO>H{OrJWt9j8MEx zHdQ4kv@#jv+XxH|hNhsGfk(M4Nyu$u*zrh(=7(bjEx|JN6}x*&QsO{lt_hCQf+|T4 zt6SChY~XAVmp&5qkYv-WSgl?zs^#yMP26(~=DMCgMtF01q%k;X7#>1HU`S30t<28l zj@`LEH4hTt>yVd=EJ^ut++Szz=>A-;-}(f#u${xg=kc*xf^Wgao0kfT2YNmC6e?y6 zv^0`BJUDxkk9?dSE%y}y9(?b?W(;JL$SYLKY5FHnHhNw5UOBn0!HuzJ5#hiE%yJ%$ zdy@#o$?!etn{e>fT|d(OWIUNOA+IO-G?^XK;2czhl0D{>t|V#lYzz}>L@J-pekBZ6AGHBbP~msO}bWwxI(&YhzYXoa(K>wg&%3x)ujO>*fuMM3SJVz zC0WP5M#T3pZ$ArXM6eH4Xf%!}Z% zq(WhwuLw5SXSON17@DNOuFvoz2LVaR5=!@uHc`Q+^XCAr~>cG$?H0UDEp zkmiQnvC((G=xb9GgmY<)h9GIRl&Q3m>nyFF7|Q$L&g0a8l5r8RN~{^qiq1KM*FC#J zJ>V45_^1{W!k}JsIXXnf3$}t>5J86Ig57o7^KWfFm#_CyThvL#0I^r=ojz;&EO3ubH|u;lxBasD&IAx7+S!|uARJ~OQ5k`&*^ zM{ch5nWdIsEtQWMi8F_urR)rYr1qkw0QuPpKTM@ht<>%*=C)&jBTPKQsGZ%A5(I(^ z!T0WMx5<9ByPpjKeUMJ4+@czRI^@8PJG>SHqIFeO6ZI z>l7o1_gRs)Yi@0Sw(1?bOZUk{+@};>8yu!F5rc`8=Yhouz=o9PGqt>-SFghupGJ~! z22UZuwm>c{fF)O0MH?*{BXT*KQiSKPG^+(fVA%_H*EZ&5ZL)%tFME~a%KW}jngt=k z^&`c~tkXZEyLWNP8_nPQ?DJFG#5V!})?<-9NCJtqkEU1&!ABB^q&XABU7mnLFg^!qETs}JGqw^I#H~Aa2X}waoH&CCS}3n;Db2a0BUFfD|25xm zPWGHpq-(ks2MX$4zf2Dntg=*gZ5wc>oDy*enmRfRl6iqr+CK2WClc;`Mbx&E0V*cH z@6^UnJBYfe4>DjS?sB;Yoz7Hgv0e013?8KbhO&JWtd0~TI2qX|Sa4Z``$^j^rvm9{ zpiywc?&X%Tv8?=Qo=?_gGQNizrK4 z4ay>Izk#>9oZ4^;rqQuuWY-=5>XC}P1QDFWh6^z}wlRoOa!XwL@9%EhP4ibpHHvZ_ z7J)KK%&ll7b3HAzRS!az&HD86G&`vSh>muT#tmeIOp$n%EHa>Q5&}-jIiW1W0$O1D z^Se(3Yco#rghjHVR+wGP);{w;LCB2`wgrJk}eZ-n~{FOfKeUlDIS7v4y2rE&I8S4cYbi}e0rnnimzt2OO z)rK?5;eg$rK&Os+5*$9F0Ju7CSCmI<_pk?cvLGEAm+Y?XTs3~F57HQ=P`?8%?;AAv zJo0s%JbLkw4oo~(sH10w7}GWgxg?m%kl{c<_9z70fsiEAD2SUKO)0*`%8PZZ`b{BO z0qz(S-}@Nah}}(Zh;_L#+@mAYRsqB%muLoK%45hno*A{ielFV^pC14r3?Z1WJs@Ba zH!5o$qyU;J=Z%LbK|MI*V;Z&!5Sa?!dlGElosI6c%QEeVmkc_Ov8}4H}TL9 z5Iw}pu!P#B*7TY(QjW$+=dHy*O&hP-`_U-W%~iC62^L(ids=FOWlYV;MYsiH)<)eR zUw?nWTgc|k4&EN6(k`^?^utG-P`G+#H*!TLQcpYQc=ov*pQemf0MLp?jR#Oe-W9uh zJEvv8=sBf|C`N#g4P5$gUSq8r~lQ1hzz)6cWaGVk6U{T8;L@?pL-Atc?*^! zr(LDX0{AE|QVlAd5!DFv6F3;AlS1i}Oz0OwQRk1ojiVsHV}5VOc853|c<8PUt?8PLp-s^`at zYZR)`oR22U0q@`rR=dQ5a^j4tX+x=1E+8!(v4eJoY{;S7rYP`fBVO}x?88k(4&9;@ zBYlN^B6-&P^b4$=iwYQ#j-o zFav28l=;v|E#zFI* z)YRPsdM@OrC2L9<2}OxouWw^)Ap!q))9%>B{U_?dHLY}wrb@S{tmH8zV{a(uh#;S2 zxJ8o|W9!N^>e=}SHBLk>*P(#`YT>XBblt})vdXxI(D7&*2-Gstn|4QcBf;>-5K2VC zxL8;cnx59I3mPh7S2dfGbdy3=n;_^PQ=JgHc-YHF3U?D_%jhGKpCxc}20F^U3x?5H z>S2ZYrrovW`?_xj^zI8EeFWX~NVi@jGpe<)JVu)AstvPrdkGo;CM#6AK~bOx=os&h zR5pZ~HH1fjizR?l&-7BzQj~qs?!h+mc_Qp7O|B)SQF?(TAXpiDxtQ+j*lsh%)CCa* zF`O8@BPV5VIS~Fx0e05J_j#2ULQ+m&lX9d6NF7|;IZ)+fXDc?ho~Vm*r`t(wK|H@fEC;`<~%eAk5bI`@)i;<+FctyjAD>wX{aYPr}cPh7JD;Cv`h63 z$Y-=`cp7y$F50Y_+MSFHqkU5kU`dW9aB27KF5Gjg<5*u5?3~8E zn;3LeV?kwUX!bU(Ohx8_E>U)FK!LzT@FHoGQV-UsZi{HpA&J-R1zcDzgv7MSJ-h1$ zpWhzb1YXCIT489z@s?D5K~^tWpmwAt6$na{qZ2~-zn4k-^r$PN>;axFb4oja8p2^K zuotHgfI`L#Dh=xLxNCQ7k)JTn$uHjmD<2S|lfj4;K7Z+qNlh4=n09WkiF$6SmWI9a ze!a%#5K*L@UA6)sNja3yM6%F7nu1eCtc!L}wb7t}yeMeWB&8CN`0eicz*e=F4ny&C zzdCg96hoMI!_V8*vc{bk%^#XhD^Y%O8VXZ--rKCtMost8qwVu&9s)KxMdBYJ7_r>&ybA~w5kW0(ZN0MwQ z$CQWyegV?HYjzi|e({CB9hIhvVA9{Ge(1uZxR|wPJ$N5b;Kd~xa*Gg?K?YE-qwUhS z8ed`-UkDLE(t(s}+}eS8aTaYllkVAFxWlqv^8NCNBrK5!wu4|GJxr-w7BdtMq!NLY z8Q~xXW>!g#vG?V%-?Kq!s^cLL6nr4$ahNi{0PRhXn|9~c-as}4bQ$De21Tk1S;_5w zP>*e6lTRCQflE}aNttTz>C>iTM8lRP`NSks5k-axUV4G!ARBd>{hHl{doKMFM^p;{ zl1vGwmKX-3YGffW0IiWF2`v3!$-@$tI+yIBT3!jWCe6y?SF|T4l11l49VT+u3&NBF zS{O0)FXWcpgmJ3^cy8BotshqK9}2C1o&rb|qCo8xfSQuj4OpxN zn1NPWr$r7>7Ff?3mQ2stotoT}WCa~?O5em7F_{?HJ^Gh69@>jmJ=5>C|4^KPm^P3m zFM^C$#(oT-HGZDM!i|BuZt0WWv-b6O8sCy($ErGd;s{$I&p3f%f;0eW%VJf}%`TK0 zbnn06zH^wqs@O+P59NlLq#|bni=0G*-IX{cvQG_q|C$Z1SVq;@eCL#osO-7=J1NA{ z0SdX(qXmeWa9g}_LA3E1-fez|kH)p({gc`cXRttxDBfL{UnThBO{hcOpg|>7E%!tj zN2bK8s+iGdw@girU>1F`Uciv1bYm%!$G@v~$k$m*w}Q*_r@qwhWQFY~f4=#g#2;}F z_8;@aH?@<4a-xxS?c=uR$W5)(*W^Ef2u{ud58V8;C!kbUJm85)5~?bHk5b?u=MeG= zT(-aqQY9QO|7tEbW|@CtyZe!kzt|EdJ5p@KK%4ZAnqXgKO<&g1tysVsXLtzFnTqQS zV-!FhirS#Ny6BcTm+1q0K_@31ZH^)=INkmleC&-+qH?^VKW}wTEu7^M$E!6LRDHFE zzkThcGiB;0K^*}Wl3ZJ$B%GQ!!Y5SFbg;nIS|>0w73{3BhQiBOfYWoBqg9~@LHiZ5 z9Y{aFyLE0Hmq!&TuAeP^;gfzj=kkctY`h38C{&hU%d9Ifxh#|CZACy|2mI{UP61c( z+iL1;dt2_Znnd~h9o$P3c`tklvyUG^C{=WVOACzGYd&^kT*3-PH1d7t7g)Sr<2!Nw zJa^@?T(iKGk*ZK90MT8oNRafDJ#RM9L7USYbJEShj|u+)M@nvkJ$=vV$Oj+p;5edP z$5V=&Dve)(%taww2BXO^-8|r7CQ*Z_(H~2IJ?ZUml3tn>p z@^SeAMtCvHs^2DRb$D#7)9CqnC-z~$%35Jb{zze-h?-W&zk^6*+(gL8IgfwATmIJl zVz4~S31-zSw0H#tij&4mr;dkBjhgBg9P6Rd0Io zX?8?by-iN(J*_KdD6AV9NMmiq3`{hB{>8Sp%CQLVHhDJuw{y^YZ(l-~Adf03C<%}1 zn(QMLwF1LY?l)&LR5pFGFv{W#BEx( zr?|;==vUGJd-*il%7DSqPbK%i>x}J|l!LK%vF;tleWtH)>Qkt|`ntKu{7-8Ul2b^; zph|nLhcldwj=L!3JU(oW!id*x?j${;U(=BJN}O`=eiIh2e6BN(+;T!M>vGX=MIX(0 zFs2T0UmR?^iBW4Z%^+4N?(D<1p94z)HNCTs;0j<4IMI9G#;zePYRH&gWJ3Td1W2oc zYim3qX**42!Lks>i#=|yZLx9)tRw0P=IIfcjx4u|B3{k-;*CY5kP+wg%OrbMTfi`) ze~%6D1B_FrtUz;Y;j90r18n?slD7ZZjByv=krK(>5S0T9huAX~+Fhj<5+?XyfFi@e(idtmN;L(oX0xAdGg-~7j1bB)t$Y`k8IG(O(dH=S6lfqQ2y4-$L zg%y<7R&hbzlMQyI&oZ6{ZsPI~=pS5L0l}<-&FPV?5ZH?Raq=n(w29pFU-j|QM=w^m8WhQL3uadp*F7Q8h12uhNCpX6ftAlQWs zUgkJAk~G$zd0s>(%6%cJyjA<2Y0(o3g2l{~N;|12OkOp^t7$9WH}`IQqf>|PDuwJA zu5E{(KPhnY*7@1{Hf1HV@2GkuaopBM?@S}KvZsomf?9fyv6G}$=VR2+W;>X{A|`Gvvn8=0&F zk?eg48>$pf%8z+!dwWmb8GgZEfmBP~qCu07bN1`WgWW-a)4#%_6FSH(gb*T4yA9%4 zQlz!Sj@xSd1S4`li_|ihX`9wj2avz*x7k1@6|9}j?$sji*Y?^8Zx63|yi$nlXy9$~ z2sAt4`Jv0iFTtD6CCtlpq~a|B5r2N7-Qujwz|IxAxz+gsNTdF6>RNY)pFj4}x1T0YqIK_x9^>-WWlOn;>Caib_S zhlqms0HZH&K9Z}q0bzFoc_6p}(MUmlIk)eUOWi9tI{suCka1;fYT6j=qN5KAqx^-8 zzR_}hc^u+k2bcK=%Xs!PX+RpGb{Cd3l19PH%0}+?Zx)BM@gFBYJHT!128C=Zou`AS zPt&47MhCU|u-zy&ZEM6}dV180aIL+Q`4MPp^O1m-hj4kbz|TG^{gXO`()TxJI;9IU zLyFH>e;WI@pjMeSlgvZgaVSgzbmkJcjwU(U(olct`9TKtDJ06I@4hP+$Kdy34;?(& zgon06<)Yigq*V4|;$4Hf)6lP7orvW~t%_#qwZCcIpWH^ErOsn^GAl^vdU6dP9Kfyi ztmyM~GNo=o&oL9(nKfXrAAqrpu)JIF*kUVQN%cK1B(az4WzuH933Y2UlI}$Nz`Y6$ zMlnSxi2nWy5a^*bEq*yE)0_oZRh;%dDZ}`sy?=XZPZBpd#*aPhi=_oT0a`j z@ZSzbU+cGNr)95oXLoW-hOj?lvsEA(jY%yS^T+Q`P;XlV9&A`clx%!S)|RiY9hTq+ zB}}dO;u$nwE?GmTS1K^mc}r1UNnSc^?4a=G=l*-bSZ~GQNn>3=1Z}B4Wi#QN&(2n{ zh8fPl>onT$&wu}doY(+uyPW^vSi#Z;O8!#)Ja@uI7a$Uy*bD5OK5SZN9|HAjVl3sc zd_(Gakbxfi8>(mW+JgSX_RihkJAwGp`{4N3S_*)r#b^%_L~s5~{IgcA4f`*|Mr_MN z!=5$tO3p`#iJhOM819Zhu=Cf`QWfig#@^4HT-&S%5^h7sZZ4vPv?WJFiCtqFoBhe9}Spy_~8Da z_@D26>|#B!@?vE1V5jh5tisFPuyQ;pzqBs}`||2J;lEFczZu=mE+t+j>wTlRKc-2# zqQosa`DFV{;7uMf2Y$v$8vEZ&jiLNW51>cY;N9nI_0+WkPSLYr_fR3WR|lE`2!=a* z-8JSGb!s8mV#STOn0eOSKA;}+H>ZlW%(jf)2@ckOgi{HB+}~gi(naS90%A0)=5slJ zQoPiJct%MKVAQ%2KZaiKk#;wKe@L8d-;Nmd_0BpuYEw{< ze%D?I2v;u$+?5$XV-gx%%fniQgWz|Nq2^|~{TkCX@w$-I7~-{^#}czoRy5z_cr#Ho z{opP&{*>NLjQ37`{YWU0Jr|rH7_^$8BD;xh4g_wb0E}=v^%F28yq~h%pnlZI z^U+LK+B7(cYlGsoUAnEdMzzO<<75nJ; zbJXuZN1aF;N(cjzVva`&StcqB^Ejb}&a(v_m|(wuoB$}I7@9#0hlab>%Zb-sei~8_ zJ@m;~!a58Z@}1KTZFaii^&LDHN7XYLp_h=J*@@nbaCCB%_E{9A?aL#k%Efx+bl8+I zUMmJ~^~yiT;_B2abX#mbVHGjK@VxTiiCN6WmA; zu}ovqV!fI;V-8XR`iP>Mdo1gxGYy~|Jh{L(eT>#B-7Sxv#N`E3(8PnFLr4@=9YgO| z$&C3Y^S+}Nbj2ujO-y}B1~&@CLPei0KMnB=5CnQ_hpYq-%F_5D0S9@oPjma?kOui~ z=KB4-GBl7I^8#nxU1{@QFeDOrHaQ^-@WtA{sLGO8)TSMOO4g{JUk z$E|JcPKC_PpjpqM7&Ay=_(7kSVX^00>@l4k%xa@OzV~f1GEpdV@>7`4(COmDrJZ?W zOwIF{f@0^vJv$8=NEuNMX0p|n+E6fWg3}39&40`vPX^bA6pEiDKd@k(fUitP?oC1` zd+YhRIAI&`!MRlnETk1Hi|#KE!0~@8dV_^zsNS$YoWMejm82C$saHoKmjLf4p%~FB z1Vz0rYo?8Q@3j2-n(7!_t+ex_Q$(aHyXNft5{$nx2KRI)e}GDlPk_+3q95BxAfZAN zntw$00s2AwQk++^5edp*Gs1>MwES}jNPa%lheXqSB9)QynM= zZS~r%>GrkVoelp=(n?OE*m>ec0eP8nx{h@Yf1~rw20o^T0J3`U1)1fYIY~g;=p5}2 z@VA;#Qro^bRd~1hPHtpl4|(8mu)H^O?*i5^|5)VMZARa+@fGT;50|mxtSr}e$<-jf zF)JKJ)+`7@^brH)6}FhHI@)e_G2ZAcKW_Um$%V}=&%@AAxO6VP#e6@^LH$Q{oxcNX zW#c+cW>S7LWwKMHGWFOYZ3;|JYqL1R(nIdS8rfP@%{%xA+}*o$|6V zNIe;P2cp9qfaBYcR0|8wBuL&b*=U(JDl}?KFCTAML|w;U+nZXCrGFaQtr~cNwkmAC z?U$ZjVIvBfO;`c%Hy5Y`7~0~+k^oXq6hHINJ*`jhfeDUr6QlcR1vh4;S zIswsI%>6MDS$N^Wc@KH0Zq;icqA6AQ#CcPPf_#7(Doz4Sk%9 z)?WiK)Q1&VI4BaGL2e#`@s*oj@R`4+0rX|-86(4t4)$#1N*wK8x%5d_WT;((aI6

1Uq7MXZV3Bvko{-I7bDgt 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 literal 0 HcmV?d00001 diff --git a/core/ui/src/main/res/drawable-xxxhdpi/img_tangem_cards_vertical.webp b/core/ui/src/main/res/drawable-xxxhdpi/img_tangem_cards_vertical.webp new file mode 100644 index 0000000000000000000000000000000000000000..0cfeca614e9836022d236d4eb0f1e30ef58d82b7 GIT binary patch literal 48844 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 y+re@LJ literal 0 HcmV?d00001 diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt index 84d8828d8f..4c21e1dfd8 100644 --- a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt @@ -8,6 +8,7 @@ interface CreateWalletBackupComponent : ComposableContentComponent { data class Params( val userWalletId: UserWalletId, + val isUpgradeFlow: Boolean, ) interface Factory : ComponentFactory diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/WalletHardwareBackupComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/WalletHardwareBackupComponent.kt new file mode 100644 index 0000000000..e6f3f9996e --- /dev/null +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/WalletHardwareBackupComponent.kt @@ -0,0 +1,14 @@ +package com.tangem.features.hotwallet + +import com.tangem.core.decompose.factory.ComponentFactory +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.domain.models.wallet.UserWalletId + +interface WalletHardwareBackupComponent : ComposableContentComponent { + + data class Params( + val userWalletId: UserWalletId, + ) + + interface Factory : ComponentFactory +} \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/AddExistingWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/AddExistingWalletModel.kt index 22d2db296e..c8506fe4f2 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/AddExistingWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/AddExistingWalletModel.kt @@ -120,6 +120,8 @@ internal class AddExistingWalletModel @Inject constructor( override fun onContinueClick(userWalletId: UserWalletId) { stackNavigation.replaceAll(AddExistingWalletRoute.SetAccessCode(userWalletId)) } + + override fun onUpgradeClick(userWalletId: UserWalletId) = Unit } inner class AccessCodeModelCallbacks : AccessCodeComponent.ModelCallbacks { diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/routing/AddExistingWalletChildFactory.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/routing/AddExistingWalletChildFactory.kt index 729d2a693d..5c0660cf08 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/routing/AddExistingWalletChildFactory.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/entry/routing/AddExistingWalletChildFactory.kt @@ -34,6 +34,7 @@ internal class AddExistingWalletChildFactory @Inject constructor( params = ManualBackupCompletedComponent.Params( userWalletId = route.userWalletId, callbacks = model.manualBackupCompletedComponentModelCallbacks, + isUpgradeFlow = false, ), ) is AddExistingWalletRoute.SetAccessCode -> accessCodeComponentFactory.create( diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt index 41d158f6f9..0e1da6c079 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt @@ -3,11 +3,13 @@ package com.tangem.features.hotwallet.createwalletbackup import com.arkivanov.decompose.router.stack.StackNavigation import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.router.stack.push +import com.tangem.common.routing.AppRoute import com.tangem.core.analytics.utils.AnalyticsContextProxy import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.navigation.Router +import com.tangem.core.decompose.navigation.popTo import com.tangem.domain.models.wallet.UserWalletId import com.tangem.features.hotwallet.CreateWalletBackupComponent import com.tangem.features.hotwallet.createwalletbackup.routing.CreateWalletBackupRoute @@ -65,7 +67,7 @@ internal class CreateWalletBackupModel @Inject constructor( } fun onManualBackupChecked() { - stackNavigation.push(CreateWalletBackupRoute.BackupCompleted) + stackNavigation.push(CreateWalletBackupRoute.BackupCompleted(isUpgradeFlow = params.isUpgradeFlow)) } fun onManualBackupCompleted() { @@ -94,5 +96,14 @@ internal class CreateWalletBackupModel @Inject constructor( override fun onContinueClick(userWalletId: UserWalletId) { onManualBackupCompleted() } + + override fun onUpgradeClick(userWalletId: UserWalletId) { + router.popTo() + router.push( + AppRoute.UpgradeWallet( + userWalletId = userWalletId, + ), + ) + } } } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupChildFactory.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupChildFactory.kt index 44d740af6c..4bbcc396c6 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupChildFactory.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupChildFactory.kt @@ -16,31 +16,32 @@ internal class CreateWalletBackupChildFactory @Inject constructor() { childContext: AppComponentContext, model: CreateWalletBackupModel, ): ComposableContentComponent = when (route) { - CreateWalletBackupRoute.RecoveryPhraseStart -> ManualBackupStartComponent( + is CreateWalletBackupRoute.RecoveryPhraseStart -> ManualBackupStartComponent( context = childContext, params = ManualBackupStartComponent.Params( callbacks = model.manualBackupStartModelCallbacks, ), ) - CreateWalletBackupRoute.RecoveryPhrase -> ManualBackupPhraseComponent( + is CreateWalletBackupRoute.RecoveryPhrase -> ManualBackupPhraseComponent( context = childContext, params = ManualBackupPhraseComponent.Params( userWalletId = model.params.userWalletId, callbacks = model.manualBackupPhraseModelCallbacks, ), ) - CreateWalletBackupRoute.ConfirmBackup -> ManualBackupCheckComponent( + is CreateWalletBackupRoute.ConfirmBackup -> ManualBackupCheckComponent( context = childContext, params = ManualBackupCheckComponent.Params( userWalletId = model.params.userWalletId, callbacks = model.manualBackupCheckModelCallbacks, ), ) - CreateWalletBackupRoute.BackupCompleted -> ManualBackupCompletedComponent( + is CreateWalletBackupRoute.BackupCompleted -> ManualBackupCompletedComponent( context = childContext, params = ManualBackupCompletedComponent.Params( userWalletId = model.params.userWalletId, callbacks = model.manualBackupCompletedModelCallbacks, + isUpgradeFlow = route.isUpgradeFlow, ), ) } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupRoute.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupRoute.kt index f063a1f796..f210f5b8e7 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupRoute.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/routing/CreateWalletBackupRoute.kt @@ -15,5 +15,7 @@ internal sealed interface CreateWalletBackupRoute { data object ConfirmBackup : CreateWalletBackupRoute @Serializable - data object BackupCompleted : CreateWalletBackupRoute + data class BackupCompleted( + val isUpgradeFlow: Boolean, + ) : CreateWalletBackupRoute } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedComponent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedComponent.kt index bd40e6bb1a..b3fbee23df 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedComponent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedComponent.kt @@ -29,10 +29,12 @@ internal class ManualBackupCompletedComponent @AssistedInject constructor( interface ModelCallbacks { fun onContinueClick(userWalletId: UserWalletId) + fun onUpgradeClick(userWalletId: UserWalletId) } data class Params( val userWalletId: UserWalletId, val callbacks: ModelCallbacks, + val isUpgradeFlow: Boolean, ) } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedModel.kt index 9abbb6caff..67ec256e30 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ManualBackupCompletedModel.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject +@Suppress("LongParameterList") @ModelScoped internal class ManualBackupCompletedModel @Inject constructor( paramsContainer: ParamsContainer, @@ -20,7 +21,14 @@ internal class ManualBackupCompletedModel @Inject constructor( internal val uiState: StateFlow field = MutableStateFlow( ManualBackupCompletedUM( - onContinueClick = { params.callbacks.onContinueClick(params.userWalletId) }, + onContinueClick = { + if (params.isUpgradeFlow) { + params.callbacks.onUpgradeClick(params.userWalletId) + } else { + params.callbacks.onContinueClick(params.userWalletId) + } + }, + isLoading = false, ), ) } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/entity/ManualBackupCompletedUM.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/entity/ManualBackupCompletedUM.kt index d45f370259..d647fa285c 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/entity/ManualBackupCompletedUM.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/entity/ManualBackupCompletedUM.kt @@ -2,4 +2,5 @@ package com.tangem.features.hotwallet.manualbackup.completed.entity internal data class ManualBackupCompletedUM( val onContinueClick: () -> Unit, + val isLoading: Boolean, ) \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ui/ManualBackupCompletedContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ui/ManualBackupCompletedContent.kt index 77535d8e94..b3b0da92e4 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ui/ManualBackupCompletedContent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/manualbackup/completed/ui/ManualBackupCompletedContent.kt @@ -65,8 +65,6 @@ internal fun ManualBackupCompletedContent(state: ManualBackupCompletedUM, modifi PrimaryButton( modifier = Modifier.fillMaxWidth(), text = stringResourceSafe(R.string.common_continue), - showProgress = false, - enabled = true, onClick = state.onContinueClick, ) } @@ -75,11 +73,26 @@ internal fun ManualBackupCompletedContent(state: ManualBackupCompletedUM, modifi @Preview(showBackground = true, widthDp = 360) @Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable -private fun PreviewManualBackupCompletedContent() { +private fun PreviewManualBackupCompletedContentRegular() { TangemThemePreview { ManualBackupCompletedContent( state = ManualBackupCompletedUM( - onContinueClick = {}, + isLoading = false, + onContinueClick = { }, + ), + ) + } +} + +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun PreviewManualBackupCompletedContentUpgrade() { + TangemThemePreview { + ManualBackupCompletedContent( + state = ManualBackupCompletedUM( + isLoading = false, + onContinueClick = { }, ), ) } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt index 00ca37071d..3544180c6b 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/UpgradeWalletModel.kt @@ -53,14 +53,14 @@ internal class UpgradeWalletModel @Inject constructor( ) : Model() { private val params = paramsContainer.require() - private val _uiState = MutableStateFlow( - UpgradeWalletUM( - onBackClick = { router.pop() }, - onBuyTangemWalletClick = ::onBuyTangemWalletClick, - onScanDeviceClick = ::onScanDeviceClick, - ), - ) - internal val uiState: StateFlow = _uiState + internal val uiState: StateFlow + field = MutableStateFlow( + UpgradeWalletUM( + onBackClick = { router.pop() }, + onBuyTangemWalletClick = ::onBuyTangemWalletClick, + onContinueClick = ::onContinueClick, + ), + ) override fun onDestroy() { clearHotWalletContextualUnlockUseCase.invoke(params.userWalletId) @@ -73,7 +73,7 @@ internal class UpgradeWalletModel @Inject constructor( } } - private fun onScanDeviceClick() { + private fun onContinueClick() { scanCard() } @@ -100,7 +100,7 @@ internal class UpgradeWalletModel @Inject constructor( } private fun setLoading(isLoading: Boolean) { - _uiState.update { it.copy(isLoading = isLoading) } + uiState.update { it.copy(isLoading = isLoading) } } private fun showCardVerificationFailedDialog(error: TangemError) { diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/entity/UpgradeWalletUM.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/entity/UpgradeWalletUM.kt index ff2ae172d9..c4b8dfdb51 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/entity/UpgradeWalletUM.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/entity/UpgradeWalletUM.kt @@ -3,6 +3,6 @@ package com.tangem.features.hotwallet.upgradewallet.entity internal data class UpgradeWalletUM( val onBackClick: () -> Unit, val onBuyTangemWalletClick: () -> Unit, - val onScanDeviceClick: () -> Unit, + val onContinueClick: () -> Unit, val isLoading: Boolean = false, ) \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/ui/UpgradeWalletContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/ui/UpgradeWalletContent.kt index b8e01bb64d..515d01c482 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/ui/UpgradeWalletContent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/upgradewallet/ui/UpgradeWalletContent.kt @@ -3,7 +3,9 @@ package com.tangem.features.hotwallet.upgradewallet.ui import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.layout.* -import androidx.compose.material3.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -103,11 +105,11 @@ internal fun UpgradeWalletContent(state: UpgradeWalletUM, modifier: Modifier = M onClick = state.onBuyTangemWalletClick, ) PrimaryButtonIconEnd( - modifier = Modifier - .fillMaxWidth(), - text = stringResourceSafe(R.string.hw_upgrade_scan_device), - onClick = state.onScanDeviceClick, + modifier = Modifier.fillMaxWidth(), iconResId = R.drawable.ic_tangem_24, + text = stringResourceSafe(R.string.hw_upgrade_start_action), + onClick = state.onContinueClick, + showProgress = state.isLoading, ) } } @@ -116,13 +118,28 @@ internal fun UpgradeWalletContent(state: UpgradeWalletUM, modifier: Modifier = M @Preview(showBackground = true, widthDp = 360) @Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable -private fun PreviewUpgradeWalletContent() { +private fun PreviewUpgradeWalletContentBackup() { TangemThemePreview { UpgradeWalletContent( state = UpgradeWalletUM( onBackClick = {}, onBuyTangemWalletClick = {}, - onScanDeviceClick = {}, + onContinueClick = {}, + ), + ) + } +} + +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun PreviewUpgradeWalletContentScan() { + TangemThemePreview { + UpgradeWalletContent( + state = UpgradeWalletUM( + onBackClick = {}, + onBuyTangemWalletClick = {}, + onContinueClick = {}, ), ) } diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/WalletActivationModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/WalletActivationModel.kt index e437b475da..eb31a235f9 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/WalletActivationModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/WalletActivationModel.kt @@ -147,6 +147,8 @@ internal class WalletActivationModel @Inject constructor( override fun onContinueClick(userWalletId: UserWalletId) { stackNavigation.push(WalletActivationRoute.SetAccessCode) } + + override fun onUpgradeClick(userWalletId: UserWalletId) = Unit } inner class AccessCodeModelCallbacks : AccessCodeComponent.ModelCallbacks { diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/routing/WalletActivationChildFactory.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/routing/WalletActivationChildFactory.kt index 77684cecdb..6cdbce4153 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/routing/WalletActivationChildFactory.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletactivation/entry/routing/WalletActivationChildFactory.kt @@ -50,6 +50,7 @@ internal class WalletActivationChildFactory @Inject constructor( params = ManualBackupCompletedComponent.Params( userWalletId = model.params.userWalletId, callbacks = model.manualBackupCompletedModelCallbacks, + isUpgradeFlow = false, ), ) is WalletActivationRoute.SetAccessCode -> accessCodeComponentFactory.create( diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/entity/WalletBackupUM.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/entity/WalletBackupUM.kt index 457edf278a..dbb699dda9 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/entity/WalletBackupUM.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/entity/WalletBackupUM.kt @@ -7,6 +7,7 @@ internal data class WalletBackupUM( val recoveryPhraseOption: LabelUM?, val googleDriveOption: LabelUM?, val googleDriveStatus: BackupStatus, + val onBuyClick: () -> Unit, val onRecoveryPhraseClick: () -> Unit, val onGoogleDriveClick: () -> Unit, val onHardwareWalletClick: () -> Unit, diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt index 19bc899913..5b5c884ea0 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt @@ -1,16 +1,18 @@ package com.tangem.features.hotwallet.walletbackup.model +import com.tangem.common.routing.AppRoute import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.navigation.Router +import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.R import com.tangem.core.ui.components.label.entity.LabelStyle import com.tangem.core.ui.components.label.entity.LabelUM import com.tangem.core.ui.extensions.resourceReference import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.wallets.usecase.GenerateBuyTangemCardLinkUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase -import com.tangem.common.routing.AppRoute import com.tangem.domain.wallets.usecase.UnlockHotWalletContextualUseCase import com.tangem.features.hotwallet.WalletBackupComponent import com.tangem.features.hotwallet.walletbackup.entity.BackupStatus @@ -21,12 +23,15 @@ import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject +@Suppress("LongParameterList") @ModelScoped internal class WalletBackupModel @Inject constructor( paramsContainer: ParamsContainer, private val getUserWalletUseCase: GetUserWalletUseCase, private val unlockHotWalletContextualUseCase: UnlockHotWalletContextualUseCase, override val dispatchers: CoroutineDispatcherProvider, + private val generateBuyTangemCardLinkUseCase: GenerateBuyTangemCardLinkUseCase, + private val urlOpener: UrlOpener, private val router: Router, ) : Model() { @@ -45,6 +50,7 @@ internal class WalletBackupModel @Inject constructor( style = LabelStyle.REGULAR, ), googleDriveStatus = BackupStatus.ComingSoon, + onBuyClick = ::onBuyClick, onRecoveryPhraseClick = ::onRecoveryPhraseClick, onGoogleDriveClick = { }, onHardwareWalletClick = ::onHardwareWalletClick, @@ -95,6 +101,12 @@ internal class WalletBackupModel @Inject constructor( backedUp = userWallet.backedUp, ) + private fun onBuyClick() { + modelScope.launch { + generateBuyTangemCardLinkUseCase.invoke().let { urlOpener.openUrl(it) } + } + } + private fun onRecoveryPhraseClick() { if (uiState.value.backedUp) { getUserWalletUseCase.invoke(params.userWalletId) @@ -113,7 +125,12 @@ internal class WalletBackupModel @Inject constructor( }, ) } else { - router.push(AppRoute.CreateWalletBackup(params.userWalletId)) + router.push( + AppRoute.CreateWalletBackup( + userWalletId = params.userWalletId, + isUpgradeFlow = false, + ), + ) } } @@ -132,6 +149,6 @@ internal class WalletBackupModel @Inject constructor( } private fun onHardwareWalletClick() { - router.push(AppRoute.UpgradeWallet(params.userWalletId)) + router.push(AppRoute.WalletHardwareBackup(params.userWalletId)) } } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/ui/WalletBackupContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/ui/WalletBackupContent.kt index aa68dc3e7d..101304c7f6 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/ui/WalletBackupContent.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/ui/WalletBackupContent.kt @@ -1,35 +1,43 @@ package com.tangem.features.hotwallet.walletbackup.ui import android.content.res.Configuration +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider import androidx.compose.ui.unit.dp -import com.tangem.core.ui.components.appbar.AppBarWithBackButton -import com.tangem.core.ui.extensions.stringResourceSafe -import com.tangem.core.ui.res.TangemTheme -import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.features.hotwallet.walletbackup.entity.BackupStatus -import com.tangem.features.hotwallet.walletbackup.entity.WalletBackupUM -import com.tangem.features.hotwallet.common.ui.OptionBlock import com.tangem.core.ui.R +import com.tangem.core.ui.components.SecondaryButton +import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.components.label.Label import com.tangem.core.ui.components.label.entity.LabelStyle import com.tangem.core.ui.components.label.entity.LabelUM import com.tangem.core.ui.components.rows.NetworkTitle +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.core.ui.res.ForceDarkTheme +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.features.hotwallet.common.ui.OptionBlock +import com.tangem.features.hotwallet.walletbackup.entity.BackupStatus +import com.tangem.features.hotwallet.walletbackup.entity.WalletBackupUM -@OptIn(ExperimentalMaterial3Api::class) +@Suppress("LongMethod") @Composable internal fun WalletBackupContent(state: WalletBackupUM, modifier: Modifier = Modifier) { Column( @@ -46,11 +54,40 @@ internal fun WalletBackupContent(state: WalletBackupUM, modifier: Modifier = Mod Column( modifier = Modifier .fillMaxSize() - .padding(horizontal = 16.dp), + .verticalScroll(rememberScrollState()) + .padding( + start = 16.dp, + top = 12.dp, + end = 16.dp, + ), ) { + Banner(state) + OptionBlock( modifier = Modifier + .fillMaxWidth() .padding(top = 8.dp), + title = stringResourceSafe(R.string.hw_backup_hardware_title), + description = stringResourceSafe(R.string.hw_backup_hardware_description), + badge = null, + onClick = state.onHardwareWalletClick, + enabled = true, + backgroundColor = TangemTheme.colors.background.primary, + ) + NetworkTitle( + modifier = Modifier + .padding(top = 8.dp), + title = { + Text( + modifier = Modifier, + text = stringResourceSafe(R.string.onboarding_create_wallet_options_button_options), + style = TangemTheme.typography.subtitle2, + color = TangemTheme.colors.text.tertiary, + ) + }, + ) + OptionBlock( + modifier = Modifier, title = stringResourceSafe(R.string.hw_backup_seed_title), description = stringResourceSafe(R.string.hw_backup_seed_description), badge = { @@ -60,7 +97,6 @@ internal fun WalletBackupContent(state: WalletBackupUM, modifier: Modifier = Mod enabled = true, backgroundColor = TangemTheme.colors.background.primary, ) - OptionBlock( modifier = Modifier .padding(top = 8.dp), @@ -73,30 +109,125 @@ internal fun WalletBackupContent(state: WalletBackupUM, modifier: Modifier = Mod enabled = state.googleDriveStatus != BackupStatus.ComingSoon, backgroundColor = TangemTheme.colors.background.primary, ) - - NetworkTitle( - title = { - Text( - modifier = Modifier, - text = stringResourceSafe(R.string.express_provider_recommended), - style = TangemTheme.typography.subtitle2, - color = TangemTheme.colors.text.tertiary, - ) - }, - ) - OptionBlock( - modifier = Modifier.fillMaxWidth(), - title = stringResourceSafe(R.string.hw_backup_hardware_title), - description = stringResourceSafe(R.string.hw_backup_hardware_description), - badge = null, - onClick = state.onHardwareWalletClick, - enabled = true, - backgroundColor = TangemTheme.colors.background.primary, - ) + Spacer(modifier = Modifier.size(16.dp)) } } } +@Suppress("LongMethod") +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun Banner(state: WalletBackupUM, modifier: Modifier = Modifier) { + ForceDarkTheme { + Column( + modifier = modifier + .background( + color = TangemTheme.colors.background.primary, + shape = RoundedCornerShape(16.dp), + ), + ) { + Column( + modifier = Modifier + .padding( + start = 12.dp, + top = 20.dp, + end = 12.dp, + ), + ) { + Text( + modifier = Modifier + .fillMaxWidth(), + text = "Tangem Wallet", + style = TangemTheme.typography.h3, + color = TangemTheme.colors.text.primary1, + textAlign = TextAlign.Center, + ) + + Text( + modifier = Modifier + .fillMaxWidth() + .padding( + top = 4.dp, + ), + text = "Keeps your crypto safe and offline. Slim as a credit card, safer than a bank vault.", + style = TangemTheme.typography.body2, + color = TangemTheme.colors.text.tertiary, + textAlign = TextAlign.Center, + ) + + FlowRow( + modifier = Modifier + .fillMaxWidth() + .padding( + start = 24.dp, + top = 16.dp, + end = 24.dp, + ), + horizontalArrangement = Arrangement.Center, + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + FeatureItem( + iconResId = R.drawable.ic_shield_check_16, + text = resourceReference(R.string.welcome_create_wallet_feature_class), + ) + FeatureItem( + iconResId = R.drawable.ic_flash_16, + text = resourceReference(R.string.welcome_create_wallet_feature_delivery), + ) + FeatureItem( + iconResId = R.drawable.ic_sparkles_16, + text = resourceReference(R.string.welcome_create_wallet_feature_use), + ) + } + + Box( + modifier = Modifier + .padding( + start = 8.dp, + top = 12.dp, + end = 8.dp, + bottom = 20.dp, + ), + ) { + Image( + painter = painterResource(id = R.drawable.img_tangem_cards_vertical), + contentDescription = null, + ) + SecondaryButton( + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter), + text = stringResourceSafe(R.string.details_buy_wallet), + onClick = state.onBuyClick, + ) + } + } + } + } +} + +@Composable +private fun FeatureItem(@DrawableRes iconResId: Int, text: TextReference) { + Row( + modifier = Modifier + .wrapContentWidth() + .padding(horizontal = 8.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp), + ) { + Icon( + modifier = Modifier.size(16.dp), + painter = painterResource(iconResId), + tint = TangemTheme.colors.icon.accent, + contentDescription = null, + ) + Text( + text = text.resolveReference(), + style = TangemTheme.typography.caption1, + color = TangemTheme.colors.text.secondary, + ) + } +} + @Preview(showBackground = true, widthDp = 360) @Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable @@ -119,6 +250,7 @@ private class WalletBackupUMProvider : CollectionPreviewParameterProvider, + val onBackClick: () -> Unit, + val onBuyClick: () -> Unit, +) { + data class Block( + val title: TextReference, + val titleLabel: LabelUM?, + val description: TextReference, + val onClick: () -> Unit, + ) +} \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt new file mode 100644 index 0000000000..b3499d68fd --- /dev/null +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/model/WalletHardwareBackupModel.kt @@ -0,0 +1,143 @@ +package com.tangem.features.hotwallet.wallethardwarebackup.model + +import arrow.core.getOrElse +import com.tangem.common.routing.AppRoute +import com.tangem.core.decompose.di.ModelScoped +import com.tangem.core.decompose.model.Model +import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.core.decompose.navigation.Router +import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.navigation.url.UrlOpener +import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2 +import com.tangem.core.ui.components.bottomsheets.message.icon +import com.tangem.core.ui.components.bottomsheets.message.infoBlock +import com.tangem.core.ui.components.bottomsheets.message.onClick +import com.tangem.core.ui.components.bottomsheets.message.primaryButton +import com.tangem.core.ui.components.label.entity.LabelStyle +import com.tangem.core.ui.components.label.entity.LabelUM +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.message.bottomSheetMessage +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.wallets.usecase.GenerateBuyTangemCardLinkUseCase +import com.tangem.domain.wallets.usecase.GetUserWalletUseCase +import com.tangem.features.hotwallet.WalletHardwareBackupComponent +import com.tangem.features.hotwallet.impl.R +import com.tangem.features.hotwallet.wallethardwarebackup.entity.WalletHardwareBackupUM +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@Suppress("LongParameterList") +@ModelScoped +internal class WalletHardwareBackupModel @Inject constructor( + paramsContainer: ParamsContainer, + override val dispatchers: CoroutineDispatcherProvider, + private val router: Router, + private val generateBuyTangemCardLinkUseCase: GenerateBuyTangemCardLinkUseCase, + private val urlOpener: UrlOpener, + private val getUserWalletUseCase: GetUserWalletUseCase, + private val messageSender: UiMessageSender, +) : Model() { + + private val params = paramsContainer.require() + + // TODO actualize strings [REDACTED_TASK_KEY] + private val makeBackupAtFirstAlertBS + get() = bottomSheetMessage { + infoBlock { + icon(R.drawable.ic_passcode_lock_32) { + type = MessageBottomSheetUMV2.Icon.Type.Accent + backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.SameAsTint + } + title = stringReference("Finish Backup First") + body = stringReference("To upgrade your wallet to hardware, back it up first.") + } + primaryButton { + text = resourceReference(R.string.hw_backup_need_action) + onClick { + router.push( + AppRoute.CreateWalletBackup( + userWalletId = params.userWalletId, + isUpgradeFlow = true, + ), + ) + closeBs() + } + } + } + + // TODO actualize strings [REDACTED_TASK_KEY] + internal val uiState: StateFlow + field = MutableStateFlow( + WalletHardwareBackupUM( + onBackClick = { router.pop() }, + blocks = persistentListOf( + WalletHardwareBackupUM.Block( + title = stringReference("Create new wallet"), + titleLabel = LabelUM( + text = resourceReference(R.string.common_recommended), + style = LabelStyle.ACCENT, + ), + description = stringReference( + "Create a new secure wallet and transfer your funds for extra protection.", + ), + onClick = ::onCreateNewWalletClick, + ), + WalletHardwareBackupUM.Block( + title = stringReference("Upgrade current wallet"), + titleLabel = null, + description = stringReference("Move your current wallet into Tangem Wallet."), + onClick = ::onUpgradeCurrentWalletClick, + ), + ), + onBuyClick = ::onBuyClick, + ), + ) + + init { + showPurchaseBlockWithDelay() + } + + private fun showPurchaseBlockWithDelay() { + modelScope.launch { + delay(SHOW_PURCHASE_BLOCK_DELAY) + uiState.update { it.copy(showPurchaseBlock = true) } + } + } + + private fun onCreateNewWalletClick() { + router.push(AppRoute.CreateHardwareWallet) + } + + private fun onUpgradeCurrentWalletClick() { + val userWallet = getUserWalletUseCase.invoke(params.userWalletId) + .getOrElse { error("Cannot find user wallet with id: ${params.userWalletId.stringValue}") } + if (userWallet is UserWallet.Hot) { + if (!userWallet.backedUp) { + messageSender.send(makeBackupAtFirstAlertBS) + } else { + router.push( + AppRoute.UpgradeWallet( + userWalletId = params.userWalletId, + ), + ) + } + } + } + + private fun onBuyClick() { + modelScope.launch { + generateBuyTangemCardLinkUseCase.invoke().let { urlOpener.openUrl(it) } + } + } + + companion object { + private const val SHOW_PURCHASE_BLOCK_DELAY = 3000L + } +} \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/ui/WalletHardwareBackupContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/ui/WalletHardwareBackupContent.kt new file mode 100644 index 0000000000..9635f67b45 --- /dev/null +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/wallethardwarebackup/ui/WalletHardwareBackupContent.kt @@ -0,0 +1,162 @@ +package com.tangem.features.hotwallet.wallethardwarebackup.ui + +import android.content.res.Configuration +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.tangem.core.ui.components.SecondaryButton +import com.tangem.core.ui.components.buttons.common.TangemButtonSize +import com.tangem.core.ui.components.label.Label +import com.tangem.core.ui.components.label.entity.LabelStyle +import com.tangem.core.ui.components.label.entity.LabelUM +import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.features.hotwallet.common.ui.OptionBlock +import com.tangem.features.hotwallet.impl.R +import com.tangem.features.hotwallet.wallethardwarebackup.entity.WalletHardwareBackupUM +import kotlinx.collections.immutable.persistentListOf + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun WalletHardwareBackupContent(state: WalletHardwareBackupUM, modifier: Modifier = Modifier) { + Column( + modifier = modifier + .background(TangemTheme.colors.background.secondary) + .fillMaxSize() + .systemBarsPadding(), + ) { + TopAppBar( + modifier = Modifier + .statusBarsPadding(), + colors = TopAppBarDefaults.topAppBarColors( + containerColor = TangemTheme.colors.background.secondary, + ), + navigationIcon = { + IconButton(onClick = state.onBackClick) { + Icon( + painter = painterResource(R.drawable.ic_back_24), + tint = TangemTheme.colors.icon.primary1, + contentDescription = null, + ) + } + }, + title = { + Text( + text = stringResourceSafe(R.string.hw_backup_hardware_title), + style = TangemTheme.typography.subtitle1, + color = TangemTheme.colors.text.primary1, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + }, + ) + Column( + modifier = Modifier + .weight(1f) + .padding( + start = 16.dp, + top = 4.dp, + end = 16.dp, + ), + ) { + state.blocks.forEach { block -> + OptionBlock( + modifier = Modifier + .padding(top = 8.dp), + title = block.title.resolveReference(), + description = block.description.resolveReference(), + badge = block.titleLabel?.let { + { Label(it) } + }, + enabled = true, + backgroundColor = TangemTheme.colors.background.primary, + onClick = block.onClick, + ) + } + } + AnimatedVisibility(state.showPurchaseBlock) { + PurchaseBlock( + onBuyClick = state.onBuyClick, + ) + } + } +} + +@Composable +private fun PurchaseBlock(onBuyClick: () -> Unit, modifier: Modifier = Modifier) { + Row( + modifier = modifier + .fillMaxWidth() + .padding(16.dp) + .background( + color = TangemTheme.colors.background.primary, + shape = TangemTheme.shapes.roundedCornersXMedium, + ) + .padding( + horizontal = 20.dp, + vertical = 16.dp, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + modifier = Modifier + .weight(1f) + .padding(end = 16.dp), + text = stringResourceSafe(R.string.wallet_add_hardware_purchase), + style = TangemTheme.typography.button, + color = TangemTheme.colors.text.primary1, + ) + + SecondaryButton( + text = stringResourceSafe(R.string.wallet_import_buy_title), + onClick = onBuyClick, + size = TangemButtonSize.RoundedAction, + ) + } +} + +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun PreviewWalletHardwareBackupContent() { + TangemThemePreview { + WalletHardwareBackupContent( + state = WalletHardwareBackupUM( + onBackClick = { }, + blocks = persistentListOf( + WalletHardwareBackupUM.Block( + title = stringReference("Create new wallet"), + titleLabel = LabelUM( + text = resourceReference(R.string.common_recommended), + style = LabelStyle.ACCENT, + ), + description = stringReference( + "Create a new secure wallet and transfer your funds for extra protection.", + ), + onClick = { }, + ), + WalletHardwareBackupUM.Block( + title = stringReference("Upgrade current wallet"), + titleLabel = null, + description = stringReference("Move your current wallet into Tangem Wallet."), + onClick = { }, + ), + ), + showPurchaseBlock = true, + onBuyClick = { }, + ), + ) + } +} \ No newline at end of file diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt index 419a988ef4..a160447313 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt @@ -38,11 +38,7 @@ import com.tangem.domain.wallets.usecase.* import com.tangem.feature.walletsettings.analytics.Settings import com.tangem.feature.walletsettings.analytics.WalletSettingsAnalyticEvents import com.tangem.feature.walletsettings.component.WalletSettingsComponent -import com.tangem.feature.walletsettings.entity.DialogConfig -import com.tangem.feature.walletsettings.entity.NetworksAvailableForNotificationBSConfig -import com.tangem.feature.walletsettings.entity.WalletSettingsAccountsUM -import com.tangem.feature.walletsettings.entity.WalletSettingsItemUM -import com.tangem.feature.walletsettings.entity.WalletSettingsUM +import com.tangem.feature.walletsettings.entity.* import com.tangem.feature.walletsettings.impl.R import com.tangem.feature.walletsettings.utils.AccountItemsDelegate import com.tangem.feature.walletsettings.utils.ItemsBuilder @@ -112,10 +108,15 @@ internal class WalletSettingsModel @Inject constructor( title = resourceReference(R.string.hw_backup_need_title) body = resourceReference(R.string.hw_backup_need_description) } - secondaryButton { + primaryButton { text = resourceReference(R.string.hw_backup_need_action) onClick { - router.push(AppRoute.CreateWalletBackup(params.userWalletId)) + router.push( + AppRoute.CreateWalletBackup( + userWalletId = params.userWalletId, + isUpgradeFlow = false, + ), + ) closeBs() } } @@ -354,7 +355,11 @@ internal class WalletSettingsModel @Inject constructor( private fun onUpgradeWalletClick() { unlockWalletIfNeedAndProceed { - router.push(AppRoute.UpgradeWallet(params.userWalletId)) + router.push( + AppRoute.UpgradeWallet( + userWalletId = params.userWalletId, + ), + ) } } @@ -452,7 +457,12 @@ internal class WalletSettingsModel @Inject constructor( primaryButton { text = stringReference("Go to backup") onClick { - router.push(AppRoute.CreateWalletBackup(userWallet.walletId)) + router.push( + AppRoute.CreateWalletBackup( + userWalletId = userWallet.walletId, + isUpgradeFlow = false, + ), + ) closeBs() } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletImageFetcher.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletImageFetcher.kt index d27eb2dc8e..293be6f47b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletImageFetcher.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/utils/DefaultUserWalletImageFetcher.kt @@ -1,6 +1,5 @@ package com.tangem.feature.wallet.utils -import arrow.core.Either import com.tangem.common.ui.userwallet.converter.ArtworkUMConverter import com.tangem.common.ui.userwallet.state.UserWalletItemUM import com.tangem.core.ui.components.artwork.ArtworkUM @@ -45,16 +44,15 @@ class DefaultUserWalletImageFetcher @Inject constructor( .map { allWallets -> allWallets.filter { (walletId, _) -> wallets.any { it.walletId == walletId } } } .distinctUntilChanged() - override fun walletImage(walletId: UserWalletId, size: ArtworkSize): Flow = flow { - val imagesFlow = getUserWalletUseCase.invokeFlow(walletId) - // emit Loading and wait wallet - .onEach { if (it.isLeft()) emit(UserWalletItemUM.ImageState.Loading) } - .filterIsInstance>() - .map { it.value } + override fun walletImage(walletId: UserWalletId, size: ArtworkSize): Flow = + getUserWalletUseCase.invokeFlow(walletId) + .transformLatest { + it.fold( + ifLeft = { emit(UserWalletItemUM.ImageState.Loading) }, + ifRight = { wallet -> emitAll(walletImage(wallet, size)) }, + ) + } .distinctUntilChanged() - .flatMapLatest { wallet -> walletImage(wallet, size) } - emitAll(imagesFlow) - }.distinctUntilChanged() override fun walletImage(cardDTO: CardDTO, size: ArtworkSize): Flow = internalGetCardImage(