From b08a6fe2c1de88e028330ff97a7f13a70c46260a Mon Sep 17 00:00:00 2001 From: grdddj Date: Thu, 15 Dec 2022 15:51:50 +0100 Subject: [PATCH] chore(core): delete unused code from micropython UI [no changelog] --- core/SConscript.firmware | 1 - core/SConscript.unix | 1 - core/src/all_modules.py | 10 -- core/src/trezor/res/__init__.py | 21 --- core/src/trezor/res/cancel.toif | Bin 114 -> 0 bytes core/src/trezor/res/check.toif | Bin 180 -> 0 bytes core/src/trezor/res/click.toif | Bin 141 -> 0 bytes core/src/trezor/res/confirm.toif | Bin 88 -> 0 bytes core/src/trezor/res/header_icons/cog.toif | Bin 152 -> 0 bytes core/src/trezor/res/header_icons/nocopy.toif | Bin 147 -> 0 bytes core/src/trezor/res/header_icons/receive.toif | Bin 109 -> 0 bytes .../src/trezor/res/header_icons/recovery.toif | Bin 148 -> 0 bytes core/src/trezor/res/header_icons/reset.toif | Bin 189 -> 0 bytes core/src/trezor/res/header_icons/send.toif | Bin 104 -> 0 bytes core/src/trezor/res/header_icons/wipe.toif | Bin 159 -> 0 bytes core/src/trezor/res/header_icons/wrong.toif | Bin 182 -> 0 bytes core/src/trezor/res/homescreen_model_1.toif | Bin 409 -> 0 bytes core/src/trezor/res/homescreen_model_r.toif | Bin 602 -> 0 bytes core/src/trezor/res/left.toif | Bin 73 -> 0 bytes core/src/trezor/res/lock.toif | Bin 72 -> 0 bytes core/src/trezor/res/pin_close.toif | Bin 272 -> 0 bytes core/src/trezor/res/recovery.toif | Bin 148 -> 0 bytes core/src/trezor/res/resources.py | 18 --- core/src/trezor/res/space.toif | Bin 34 -> 0 bytes core/src/trezor/res/swipe.toif | Bin 137 -> 0 bytes core/src/trezor/res/swipe_left.toif | Bin 130 -> 0 bytes core/src/trezor/res/swipe_right.toif | Bin 134 -> 0 bytes core/src/trezor/ui/__init__.py | 45 +----- .../trezor/ui/components/common/confirm.py | 62 -------- core/src/trezor/ui/layouts/tr/__init__.py | 9 +- core/src/trezor/ui/layouts/tt_v2/__init__.py | 17 +-- core/src/trezor/ui/loader.py | 132 ------------------ core/src/trezor/ui/popup.py | 21 --- core/src/trezor/ui/style.py | 23 --- 34 files changed, 12 insertions(+), 348 deletions(-) delete mode 100644 core/src/trezor/res/__init__.py delete mode 100644 core/src/trezor/res/cancel.toif delete mode 100644 core/src/trezor/res/check.toif delete mode 100644 core/src/trezor/res/click.toif delete mode 100644 core/src/trezor/res/confirm.toif delete mode 100644 core/src/trezor/res/header_icons/cog.toif delete mode 100644 core/src/trezor/res/header_icons/nocopy.toif delete mode 100644 core/src/trezor/res/header_icons/receive.toif delete mode 100644 core/src/trezor/res/header_icons/recovery.toif delete mode 100644 core/src/trezor/res/header_icons/reset.toif delete mode 100644 core/src/trezor/res/header_icons/send.toif delete mode 100644 core/src/trezor/res/header_icons/wipe.toif delete mode 100644 core/src/trezor/res/header_icons/wrong.toif delete mode 100644 core/src/trezor/res/homescreen_model_1.toif delete mode 100644 core/src/trezor/res/homescreen_model_r.toif delete mode 100644 core/src/trezor/res/left.toif delete mode 100644 core/src/trezor/res/lock.toif delete mode 100644 core/src/trezor/res/pin_close.toif delete mode 100644 core/src/trezor/res/recovery.toif delete mode 100644 core/src/trezor/res/resources.py delete mode 100644 core/src/trezor/res/space.toif delete mode 100644 core/src/trezor/res/swipe.toif delete mode 100644 core/src/trezor/res/swipe_left.toif delete mode 100644 core/src/trezor/res/swipe_right.toif delete mode 100644 core/src/trezor/ui/components/common/confirm.py delete mode 100644 core/src/trezor/ui/loader.py delete mode 100644 core/src/trezor/ui/popup.py diff --git a/core/SConscript.firmware b/core/SConscript.firmware index 36b6d9e5c..8fe612717 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -572,7 +572,6 @@ if FROZEN: SOURCE_PY = Glob(SOURCE_PY_DIR + '*.py') SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/crypto/*.py')) - SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/res/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/common/*.py')) diff --git a/core/SConscript.unix b/core/SConscript.unix index 9aaf8f8ab..7b20042e7 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -524,7 +524,6 @@ if FROZEN: SOURCE_PY = Glob(SOURCE_PY_DIR + '*.py') SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/crypto/*.py')) - SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/res/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/*.py')) SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/common/*.py')) diff --git a/core/src/all_modules.py b/core/src/all_modules.py index 7472feef7..2ed8a27f8 100644 --- a/core/src/all_modules.py +++ b/core/src/all_modules.py @@ -137,18 +137,12 @@ trezor.pin import trezor.pin trezor.protobuf import trezor.protobuf -trezor.res -import trezor.res -trezor.res.resources -import trezor.res.resources trezor.sdcard import trezor.sdcard trezor.strings import trezor.strings trezor.ui import trezor.ui -trezor.ui.components.common.confirm -import trezor.ui.components.common.confirm trezor.ui.layouts import trezor.ui.layouts trezor.ui.layouts.common @@ -173,10 +167,6 @@ trezor.ui.layouts.tt_v2.recovery import trezor.ui.layouts.tt_v2.recovery trezor.ui.layouts.tt_v2.reset import trezor.ui.layouts.tt_v2.reset -trezor.ui.loader -import trezor.ui.loader -trezor.ui.popup -import trezor.ui.popup trezor.ui.style import trezor.ui.style trezor.utils diff --git a/core/src/trezor/res/__init__.py b/core/src/trezor/res/__init__.py deleted file mode 100644 index c5d3ae3bd..000000000 --- a/core/src/trezor/res/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -try: - from .resources import load_resource -except ImportError: - raise RuntimeError("Please regenerate resources via 'make templates'") - - -def load(name: str) -> bytes: - """ - Loads resource of a given name as bytes. - """ - return load_resource(name) - - -def gettext(message: str) -> str: - """ - Returns localized string. This function is aliased to _. - """ - return message - - -_ = gettext diff --git a/core/src/trezor/res/cancel.toif b/core/src/trezor/res/cancel.toif deleted file mode 100644 index 79de5e5f8d5659c21f58feff9d9e2025b3a2dbe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmV-&0FD1tPf14*01yCX0000TjKK{+KoCX0P=Er^fwdjj0z?O*R*3?TIB$r%gt*Cm zGv+k^&3}_NkQt-lOaL3Qmo>1{KV)J9dq)|_A+=L@|1U!PRoi~6R=rQfAg0Wg- z5FE$+WyaQQnVt7T5(=TQlJkc-@VdvE_8u*(&j20ZL*H@^Y}Ec9`h8x_Tt{vs`FT^i)UEB_y-8l{K>2t;!bKeA i^8lkhtfTyO1VesnM|m8;co;x=c!gSWaz0Y<+CBiYx>#KR diff --git a/core/src/trezor/res/click.toif b/core/src/trezor/res/click.toif deleted file mode 100644 index adcef93ff3160be86e2631dd433fedd46facbd0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmV;80CN9SPf14*02Kg%0000j%P|VVKoo@GUs1FW+#8r9c!L$}O<^nK0D`V3FgM6M zkc9^k(%S?TOcCYzHtRGW%rLl4H(1)k`ZI%2fUDs-w(c?I9=9;(jN6fUa>@n@j!1*^ v+@iL>MrJldywuzH=}Ohf0G8%=VTGt_wNI*sJbBeq?@BMdyfrC*X(QDS72`l- diff --git a/core/src/trezor/res/confirm.toif b/core/src/trezor/res/confirm.toif deleted file mode 100644 index 2fbfe253e202de7e547b24662e7566604f9b4c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 zcmV-e0H^;{Pf14*01yC70001EWB>yJ2;~5w7=E#XsfPda!Sv7n`yt%_oD8BM?tF%T u^9%(b?vMZ6-~X>?VEFz2{r~@5U^O5vND+t&5?Bv0^CuUC4giykP z*E2AP02z6U{sV#5vw8-B|8T%K0m0_{0wVYS29f?hfW&+ThMz#HzX2r4zyP8+7=Vfx z89+w(GcY{(e;#DbpZ|QQY$P=WU`-Ic$Yvtjh3p1ox53=34RkZYFD$5jMDjb(PKFE6 GFaZD$hC})Q diff --git a/core/src/trezor/res/header_icons/nocopy.toif b/core/src/trezor/res/header_icons/nocopy.toif deleted file mode 100644 index f193be0ad5a9298f219ece7fec766eb3b5c93436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmV;E0BrwMPf14-01^O)0001c!^8jv0{`?F7)m05tV{118UFugV_F~ogt6d1P$P)(A^x`>g8`87!2ZC0 zCXh(M|KP#^_V^aH|N57N*8VRM1a`2iP(N^n6v@B=OkHi`@G P$)D>H9-hF(fDZrwg?TNh diff --git a/core/src/trezor/res/header_icons/recovery.toif b/core/src/trezor/res/header_icons/recovery.toif deleted file mode 100644 index d9c4779852cd9971f7146900967b32f81296625d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmV;F0BiqLPf14-01^O*0001EU|l2^Z&lMz)uE)KmY&#e}C*h!{`6+ zSN{dF1^&HfWpDs88vg4sFf0Tz9{y)xPyi|Wa-V^L!LarA|DW?2z`*Dal)>=jJe2Y2 zKNE$A314Z~xb)zx=-*X!(B--~`Gq0@B`KjgC82fg}KP C0ZNYm diff --git a/core/src/trezor/res/header_icons/reset.toif b/core/src/trezor/res/header_icons/reset.toif deleted file mode 100644 index 581917864a45cb70fc916525a198fce0490c5085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmV;u07Cy%Pf14@02lzV0001EU_b+ma8}WqcXL@F%nAR2U_Ud6sqhEH{vQuwU;O{S zI_>5E|Exgv@BcOo3<5v?>oG7m{NE3f4fsEwfnmdcIj{*o{xdRs{LcYqKm5|+{r88PSpYN#Y8L}T2iOhP rKyy5xmi*63eF-r^;V;g}b KQAtS%JqQ4MaVYNq diff --git a/core/src/trezor/res/header_icons/wipe.toif b/core/src/trezor/res/header_icons/wipe.toif deleted file mode 100644 index f19ef0ea8405fa8e46ad4c23b1d5e46921205787..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmV;Q0AT-APf14@02lz10000*&%F)8Fc5}ehkr#NxutVO%_d|6Bqm@3*nm(n1#G|w zu!$vpBtVH@Z08bxjUQX5^PN&5Mx~q*%R}-vdCRr)3wlCbLoVI}Yw^RoE&2pc8`r_R z$Ymflx`<}b{DgHdmX@n0OyoT;#lF68q{d(~g#~Q?5bWeSTfh!{z{KnAKWcC28yIk8A$|i`TpM=+(r@$?tTppZC6f@9r@S7B96&I&h$D ztzQ#4hE}dUGo581#~9aA6fO-{6lb)u5nLR8E@OIXr3q$FFm~-nDB$6Q{RAn$N1yDQ zZdFkly$67j&xt`DmAiv&)HQ!NMd{C5q5ajDAI~=fL$?0m$FDnKe2elY#IN{<{0@B1 z3xa_8WmX7OT3`;3oT94g9pdw*8mNQ(-BWn1>Xu~zJe@^^C$!;71Iu4!{|!eMOAAE# zg}fWrg5s%UOgWmb#rB0+fB9ED9p^=A{z+BLBv&xGAvNBk+%?9>azQ`~$MWUM+069l z_j7Gy&=m6=pO-pQ6L{hKnI3sd$I|-E&PcZ$^2s%Nx)})_!*n7AhSn`t{0i^qX1F$V zlM8UeQ9Hn+p)u~t1umF}FCSgNlY>+cbW#0pXycjk9l6ElhUh52K{$>5aXMIe0x Dz#Yht diff --git a/core/src/trezor/res/homescreen_model_r.toif b/core/src/trezor/res/homescreen_model_r.toif deleted file mode 100644 index 2c954ac4170f2561b928107a25823e7bfadf34e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmV-g0;T;_Pf15y09*i00ssK*k}*tEK^Vuc(3-e4V9_{%xZoshy2$b*k$^ZfVp2#P zYSKXl6HR2m7~{~AfM^skT^=FPK@uShI5YgZGPCR;g{`2`gEc)&)!mN$S! zZIjB0ufVZ%L?WNv1Oan?vHigi+4!zdo~eQmy-PI550LP#nYUL!${^o*Pj2V9=FjQt zokD4cKA*G5!7Xaec%(BN8T;O-Jn~s0HxtLx^=0Z_Gk_ zMeL)j{kUGoC*0Wg{}VeLsgWY~K!jnI*!}y*&NZz@i7Z4xW3bexf5IVH_UwPcE^1OL zynU(Tl!TVoyxoJOta!F(d$wo)E%xA{?5nLZx#K-=V>Q|&a@&Wp25$r8Mvw9G`H8)T zLE8Xo+-H$*XX$&^hT>#^c4L_e*w}yjv1`0Obdv16RpzTkm)qaABY(&weww ztL0tbDXV@Zzb&|!Ppun*a(l9FQM#&1V_$cESg o_1f}O2stp8C+*c?cnhKicHzdY67ytkO diff --git a/core/src/trezor/res/left.toif b/core/src/trezor/res/left.toif deleted file mode 100644 index 8c148c38a0d292198d0c42b5bfe1523cfcc2f919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmV-P0Ji^BPf14*01yB@0001EU|?wAVgQ40`x!x0!vFtZ`rCgw2=_ch_P?Egpr9a7 f_Wl3=|L=eQ4+igHG)x?(4z3So4%}RrJrH{VVqGAE diff --git a/core/src/trezor/res/lock.toif b/core/src/trezor/res/lock.toif deleted file mode 100644 index d196a2eef9a736a6f92b6ec2fecb33eb2b4a2757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72 zcmV-O0Jr~CPf14(01yB?0001EV7UIjmVtp`!vFvOB^emL{y+0So`K=#dZl0U85n-q eF+5(+p!h4E;p=*#)Bnz|`tyFze=@;c2mk=ARU{(- diff --git a/core/src/trezor/res/pin_close.toif b/core/src/trezor/res/pin_close.toif deleted file mode 100644 index 09c601fb17196fba498fef701519e7bdb48ac2d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmV+r0q_1)Pf14}03HAY0RRA1Q87-#KoH!slKvu5MIeDhDkLyvsLU7m08hw2(xBu4 zAVdKbcAvuG1&AKW3LP|VK;SrJnBB93venMb>Skv)>aou6XX8U{_MM1K*8s{PJ5M-4 zsJ_8?-N3S=@Dpua62{0s3_RB8c=v*?UlA2if@ANhT;z#xPozry0aAXrLP3ci>`YKP zrAf*!`U_x}^ef*o;Dj>IYl2^Z&lMz)uE)KmY&#e}C*h!{`6+ zSN{dF1^&HfWpDs88vg4sFf0Tz9{y)xPyi|Wa-V^L!LarA|DW?2z`*Dal)>=jJe2Y2 zKNE$A314Z~xb)zx=-*X!(B--~`Gq0@B`KjgC82fg}KP C0ZNYm diff --git a/core/src/trezor/res/resources.py b/core/src/trezor/res/resources.py deleted file mode 100644 index 1483dc59b..000000000 --- a/core/src/trezor/res/resources.py +++ /dev/null @@ -1,18 +0,0 @@ -# generated from resources.py.mako -# (by running `make templates` in `core`) -# do not edit manually! -# fmt: off - -def load_resource(name: str) -> bytes: - if name == "trezor/res/check.toif": - return b'TOIG@\x00@\x00\xa8\x00\x00\x00\xed\xd21\x12\x820\x14\x04\xd0\x0f:\x06\xba\xdc\x84#x\x04<\x82\xad\x9d7\x80\x1b\xe81\xed\xac\x82\xb1Zc\x10\x1c\xc7\xfce\xc6\xd6l\x99\x9d\xf7C\x12\n\xa1\xb1\x92\xf3\x879\xf0\xba\xc7\x9a\xf6\x1e-\xab\xcf\x00\x1d\xe0C\xdfr\x0el\xd4\xfe\x1e\xfb\x9a\xf3\xd3\x02\xaf~\xe5^\xe1v\x81_Vt\xf7=\x1a\xca\x07\xa0\xa4\x1c\xd8N\xbc\xfb\xe6\xb7\xe7z\xa9\xf2>\xae7\xea\xee\xc7X\\Gn$\xf9yS\xba\xd4\xad\xed\xde\xbdI^\xeb@\xf9x@\xc2E\x1c\xe5\xf3\x00\xa3>\xac\xa3\xfcu\x04C~kGy\x1c\xc0x\x18@yx\x85Zrr>R\xf0\xda>\x00' - if name == "trezor/res/click.toif": - return b"TOIG\x10\x00\x15\x00\x81\x00\x00\x00-\xcb1\n\xc2@\x14\x84\xe1_Q\xb4\x10\xdc\x1b\x98#x\x83\x15\xecMa+\xe4\x00\x82\xae'07\xc8;\x90\x85\x07\x11\xd2\xdb\x04\x15L\x11\xe5\xf96\xeb4\x1f\xcc0\xb8N7X\xda\xc3\xfa3\x83P\x80\xab\xe19\xb6\xee1\xe5\x1e\xb70\xe7\x8c\xdb\x91yr\xca\x06\n\x8eH\x83\xf3\xdc\xa2\xb6\xbfFf6D\xbc\xd4\xdb\xf8\xe9J\xd5\xc9\x00\x96\xe6wa\x85\xa8j\xb5O\xaa\x86\x0bd\xb6q\'\xc9\x92,\x90\x1d\xd466\x87}i\x9d56\xa2\xe5\xf8|\xfe\xcdf\xe4x`\x8e\x92}\x06\xd1\xac\x05\xaeh\xc1,\xced\x7f?G\x8f\xd0\x1cZ\xdf\x0c\x9a\xfc\xa5|/~\xf8=\xe4\xd1\xfb%[%\xd6\xed!\x19\xe2\xf49\xda\xf5\x8dd\xd3\xa2\x0c3\xcc\xbcWXo2\x8f\n\xaf\x90L\x13\x8fZ\xe3\x8c\x8dA?\xbc5-\xe7O(\xdf(\x9f\x84\xb9\x81m\xad3\xe5\xa2+\x0fcX\xd9\xfc\x86\xd1\xc9\x92\x11\x13\xe0\x0c\x81PK\xb3\x17ZhR\x8b#\xa8\xd9\x144-[u\xce\xe3\x186\x99\x92\xee\xac\xb4\xa8n\xa9_8\x86\x0ei\x8fl\xfa\xa6\xb0\xc1\x8cF\xbd\x89f\xaf\x99\x04\x92-\x9a\x02\xf4\x98\x0e\xb4\x92" \x17\x92Q\xb0A\xd2\x8f\xc6\x9d\xde\x8898\xc7\x82\xa6Z\xc2\x1e%\xcc\xe9sz?O\xc4/\xa2\xb5\xd7\xe2\xd6s\xf7F\x98@\xce\t2j\x92\'\xf6\xee\xd9\x1b&"\xec2\xe5\x91x^\x05M\xcf\xa9\xcc~\xeb<"\xeb\x1ag\xbd\xa2W \x191FX0-\xa6\xd8\xa2\xd9\xb0\xc9kz\xd9\xf3\xf4(\x1cY3F\x14\xd0B+\x98\x80\xfa\x03\x86p[X(%\xc9\x1d\xeaDz\xd65\x1aO\xb2M\xa7xG\xc8\xfb\x0e\x84p\x91\xfas5G\xdd\xe2\x11a\xf8|\xe8\xd0\x9d&\x05\xe4\xd3\n \x9b^\x11h\xf6\x12\xbd\t\xe6\x8ee \x1c\x91\x84\xb2\x01\x9e\xbc\xba\x05&e\xc2d\xf4r\x95\xd0\xfa^\xf1r\x15\xb6\x1aw\x90e\xeb\x0e\xbb\xc1\xbb6\xce\xc0\xa4;\xce\x1f\xdf\xa1\x96\x8c\x02\xe5f\xb8gW|\xfe\xf5\x9bC\xf9f\xcc\x88Z\x13\xc8\x92I\x15\xc2\x08Zl\x05\xbd\xc2\x8eV\xf3\xbc|\x8fT\x92\xa27\t\x99\xcf\x1cY%\x99\xf8\x06\\\x89\x91\xf8C\x99guW\x90K/c\x16\x89\xd4\xc0iO\x991!\xe8}\x8dt\xe0\xe4\xa3p\xa4\xf9\xd9Z\xc3\xe6\xe3\xf5\x81\x06\xb2IFP\x8e\x12\xa8{Em=\xed\x98L\xd0F\xfa\x12\xd7\x16d\\\xf3\xef+\xbb\x1fZ\x99\xb5\x98\x80g\x94\x8b\xa0\xe9\x1b\xd5\xf8<\x86\xc6\xf4\xaa\xa4\x08\x9a\x1b\x14hF\x1cjI\xc9\xdfel\x0c\xb4i\xbf\xa0\xf5r\xf5\xca\x18H\x8dte\x80\xdf\x92\x8b\t\xf1\xc26\xd8\x931\xab\x04\xf2\x87h\x8a/\xca\xa4\x89\x86\t74\xc7\xb5\x9f\xbd;#\xcad$d8x\x8c\x89d\xe2\x8e\xd0\t\xd42\xe5\x92%Eo\xaet\x93\xc9 \xc6\xb1^1h#\x15\x8f\xdb$T2MfA\xad\x8c{\t\x93\xdaC\x93\x1c\x13?\xeaV%\xaf\x89A\xcf\x90PR\xc0\r\x8e\xc4 e\xe4q\xc2\xf3\xc3\n\xeb\x8c8$+\x82\x96\xe4>\nZ\x87m,\xc3\x96\xa5\xa1\xd43G\xb67AZ\x81\x10A&D\x01V\xb4\xee\xa8\x9f\xc1\x1ePC{2\x9f\x85c\x05\x0c\xf7\xc4\x9b_\x88I\xc8\xe8\x99\xb9\x93h\x16\x99\xad3\xc9\x90]\xa1l\xc8\x98\x91\x8e%\x15\xb1h\xca\x18\x93l\xd9=Z\xeaJ\xaf\x92y&\xd3\xa4\xd1\xcc2k1\xa1\xa0)=0.\xc9\x82\xa6F\xcb\xb3&\x11\x9a\xbeK0\xb6\'\xfe\x9c=\x0bB\xbd9f\x93L\xc0\x0f\xc9\x8c\xdaB!\x10/\xc4 \xf6\xaa\x95\x10C\xc8[=\xc9\x90oR\xf4\x8apt\x81\xef\x08\xfe@;\xcb\xf7\xb0\xcf?\xcctM \x06a`+\xc9\x92\xacqGGy\x06\xd8\xed\xb19\xc1\x9e\xcf\x86\x98\xb2Q\x9f3+j?]:\x15X\xa0YaYl\xe4G\x19\xb2\r\xc9\xc8\x8e\xb05bSo2\x88\xe5{\xfd&s\xe6%\x85\x90\x9f\x90\xa3-\xfb]\x06\xe3\xb8\x0f\x99\xc9$\xb0\xdf\xb8\x03\x9c\'\x94\xf7\x9d\xc6\x99\xfa\x02\xb3{H\'`\x1eglU\xd8\xac\xf3z\xda\x0e\x11\x91\x11\xd8\xae|\x8a\xd0\xb57)\xb5\xac\x11\xf0&\x13 \x0by\xf7&\x98U\xe2\xbe\xe0u\xb8\xa7~_\x08\x19\x1c\xe3\x9b\x10\xeb^\x9e\x87-f\x02\xac21\x14\xea\x84\xbc\n\x9a=\xafG\x04\x81P\xd0\xd4hx\x84B\xf1(\xdc{\x9a\x84\x98\x0e\xe4X\t\xa7Q\xa8\x91y6\x10\x1fr\x00f\x82\x96\x185\x91o\nY\xa3\xde\x8c\xc4\x0c\x9f\xf1\x04\xfa0\xd2\xabz\x93\x04\x02\xbfOxUF|\xf0\xdbf\xc0&1\x0b\x18\x0b\x98:\x99\xc5;+\x19\xa2\xd1J\x80)\x12A\xab\xc8\xbe\xbd\xb0\xd9r&=\xf1\xd3\x9b\x93/\x99\x10\x99\xf4\xe6\xc9\x9c\xb3"\x9f\\v>3<\xbf?Vx4G\xde\xea\xcc\xdb;cwzD\xb47?l{;\x16\x8e\x07\xd0j\x02\x03$\x92\x11\x91\x91\x90\xe0\x9e\x90\xe12\xc9\xd4\x18\xe6\x826q\xbf\xf1\x94\x08\x85\x05RH\xe6\xd6y\r\xf1\xe20v\xf9\xf6&\x8e\x8e\xc7\xa0\xa8q\xd3\xd5\xc5\x16\xae\xae\x04N\xe8\x16Y4\x12/Z\xe2PKv!\xb7\x024\xa8I\xcc\xd4-\x8f\x10\x073\xc1\x96\xf2R\xbf\x90O\xeb\x89\x08\x85\xc8e\x92\xc6\x94O\xd1\xab\xe4\xf4sK(\xf3\x98\xc1\xcad\x93QV\xb3\xc0\x92H*XIy\xea\x9ea\x96\xcc\xd9\x9dp\xe2\xfc\xec\xf1\xba\x0c\xcb\xa0\xc5\x9cdW&\xa5\xc4\x90\x1dg\x9d9\x7f\x94\x06\xbf\x8d;\xc8\x07]bNH\x07\xe9=\x11\x9d\t\x9f\xb7GD\xa8$\x0e\x92E!\x84\xf4\xee\xd5\xb2\xcc\xbe\x94\x0b\xf1D&s;_\x08\x1f\x8a\x7f\\M\xbf\xf8\xf4Og7\xef\xbex\xff\xf4\xfe\xe9\xdd\x17\xcfn~\xfa\xa7\xe9\x07\xff\xb8rw\xd0\x9b\x04\xad\xc31x\xc2t24\x06\x18P/\x10B\x81\x170\x8f\x9cZ\x8e\x12\xb2Pj\xd0\xde\xe3RZ\x8fKG\xbcH\x90\x8c\xde\xad\x8e\xd6YH\xaeI\xe5\xf9\x92%u\xbf2\xf9\x1a\xc6\x82\x8c|*\x8e\xae\x7f|\xfb\xde\xdb\xff{w{\xdc{\xfb\xe3\xdbG\x07\xc4\xa7\n[\x83vR\x04b%\xe6\x89\x0c4\x12>\x03\xd9\xc3\x16\x11\x9bV\xd8Tn\xc8G<:cs \xf6\x90\x10\xc5\xe3\xb93I \xa0\x9cs\x8fG\x84\x0c\xb6F\xcaF\xce\xca\xb5\x8ef\x83\xb68\xa61\x01~\xcawtt\xb0\xfa\xaf]d\xfcX\xdd<\xda\x0f\x80h V&bm\xa2~:\xa7FL\x00\xb9\xa8A\xa1P\xa1q\xa4\xb7\xe7\xf3\x11:h\xd2c\xf1\x818\x01:\'\x1b| S0\xaa\xa0\xdc\xe1\\p\xbb\x995\xc9\x19\xc5V\x15\xd6;&K\xfd\xc3\xf1\xd9\xcd\x87a\xa3qv\xf3\x1fJ{\x17\xd5E>I\x91\x8c\xc8\x1a\xa0\x885\xfa\x86>\x05\xc2\x0b\xcckZ\x97\xf6\xac=\xcd$C64\xf6Xt\x92\x93\xba=46O\xb85\x92\xec\xe9\xb56Y\xa7\xbc(\xc461\xef\xf5\xeb\xf7N\x1f\x85\x0e\xc6\xfd\xd3\xd7o\xf0\xae\x83x\xe3\x1eZ\x01\xe4\x0f\x04Z\xc4\x85\x995\x85\\\xd3\xe7\x14\x08\x1f"\xc2\xe4\x9a\xc4\n\xfa\xe1k\x8fe\x8f\x90H\xdb\x83\x9c2\x84\xfc,\x1f\xce\xd8\xf1\x80\xb7W\xd91/\x02\xcc\xaa\x1dr9\x99~\xf9\xa8l4\xde\xfb@8\xe8\xceji\x0b\xd9\x80;\xc0\x89\xcc*\xbc9\xa6D\x8c\xd4\x1f\xe1\xe4F\xc9\xa8G\xa5\x93,L\x1bX@\x84\xf8\x9e\xe0\x89<65~\xc0\x8d,J\xe3\x1e\xaeP\xabFL+\x8d\xd3\x98<,\x92\xaa\xfc\xfe\xe3\xd2\xc1\x98~i\x8d$\xear3\x85%Q$\xdcVF#\xb5)\x19\xd1L\x8b)\x85\xad\x04f\xd8! NN\x85\xcdG\xa2\x03D,\x9bI\xf8#\x19\xb5LhT\xd9L\x88\x0f\xba5I*8\xe3\\\x1cbN\x93\x1e\xee\x81\xa4&\xef\x98\'\xa1\x83\xf1oFv-\xc4\xa0\x91w\x17J\xac%\xe3#r\xbeE!\x1e\x01\xa5&\xd6\x87q\xe3\x0e\xb5\xd4*\x8a\x87\xe637m\xe4\x03\xd6\x00!\xa4\x819\xf7\xe6i\x9b\xfe\xe9\x05\x9aA|`V\xa80E]W\xd0(\xb5_\xbf\xf1\xa4t0^\xbfaoF\xf9\xd4\x02\xfe\xdb\x12\xaf\xa0\x0c\x98\x8ez\x93\xf5\xc0\x96$\x132\xad\xc0c\x13>\x14\x1f\xe6\x01q\x02\xc1\xe7\x006\x89\xf8\xd2\x9b\x0f\x8e\xd3\x8ee\xd3f\x93\xacK\x13w\xf2d~\x98+\x17\x8e\xde\xfc\xde[O\x83\xcf\xbd\xb7\xe8&\xd4\x99"\x99\x88\'#\xb2c"\xd4Z^\x00\x89\xa4\x08j\xa6h\x0f\xe7d|\x0f\xe2\x81\x84\xd2\xf6 \xe7\xdc!\xc3\x99\xcb\\)\xd8\xb2\xa0\x1a])\xac\'Z#O\xf4iD\xbd\x82bR~\xff\x81\x99\x9f\xfe\xf7_\xef\xbet\xef\xf4A\xeb>|\x81\xffAt \x82,\xa9\x88\x17\xd9\x94 \xad\xec\xe599\xd4bk\x80B&4\x1c\x9f\x16\xfbC3\xc4&\xc9\x82\xbd\x07\xd8\xc3\xd6\x10\x8bdr\x98[7N\xb0_sd\x1e\x9e$\xf3Wr8\x99e\xa3\xec\xd07\x1c\xa5\x1a\xe6\xc0\xa4\xc9ayY\xc6g\xff\xf5Nw\x90\x83\x8f\x8b7\xff\xe6p=(\xff\xed\x8d\xd5G\x97\xad\xc7\x1d\x85;\xc7\xc8ER\xf4\xaa\xa0\x95\xb0G\x19f\xefJn%\x99Pcz\x8e\xdb\x1e\xf2z \x9f\x13\xf2\xa7\x03\x99.\x929\x9c\x19YL6\x02\xb9\xcd\xc9e\xca>\x99\xa3\xf3\xccg\x90S=g\x07\xa5\x9c\x7f|{W\xaew_<\xba\x81LM\xfbp\x96vL\xc7\xe4\xa6\x9d\xb6\xd3\xfc\xe8\xc6\xdd\x97v}\xf3\xf1mq\xb5\xb0\xb7\xe3\x11B\x9fzs6*\xc8\x80U\x81\xcc\x98\x17\xd8\x864\x94\x9c\xba\xf4\x9a\xf3\xea\x12:\x98\xf3\x89\xf5\x83\xf2\xb5\x06\xf9d&\xa6m\xda\xda\xa6\xf3\xcd\xc3\xf9\x06\xc5\xb9\x8e!\x9ddq\xeft{\xa6\xbf\xed\xa510\xcc\xc1\x9e\x1c\xd7\xa5\xc7)\xb4h\x7f\xb8\x9b\xcfz\xdb\xbf\xbaw*\xde\x16\x96\x91\xa3\x04\\L\xfc\xca\x0cHd\xa1\x8b\x91\xf8\xd4\xa4\xb7\xc5\xeeh \xab\xe0\x81\x84\xf0\x0e\x91\x87\xbbu\xb0a,|4{<\x17\xf3\x81y*\x1d\x0f\xae+\x18\xad\x98\x1e\xaf\n\'G7\xb6\xe7yv\x13v\xa7\xb5\x83|0C>\xa6\x03\x0e\xb5\xe1\x96\x84\xed\xd9\xcd\xed_\xbe~Cn\xc62J\xd8\xe7"\xa1\xb1`DL\xc8\x18r%\xc3\x99\xa0\xc5\xee\x00\x85\x96O\xc4\x99\xb4\x9bOHd\x88\x8b\xf2\x98\x0b\x91\xb95\xabR\x16x\xdb\x9e3s5J\xbe\xab8\xbbA\xce\x0c?\xbe\xbd-\xc7\xfb\xa7\x831~\x9d\x10i\xb0\xa6\x13\x92k`Q\x9e\xc8\xde\x83\xf6\xfd\xad\xe6}|\xdb\xddWP\xf4\xe6r6$UQ9Rgz\x95gQ\xc6,\xb0\x0e\x85I\xd8\x0c6"\xcc\xb6\xf3\x91?N6\x8c\xf0\xfb\xcaN\xcdp!\x14\xd3\xb6\xe7\x19\x8d\x0c \xd7\xff\xf9\xeb\xb6\x1c\xdf\xfb\x12VU\xc8\x1av[ \xa1pa\xf7\x9b\x18\xb9\xa9\xf7\xbe\xdc\xf6\xed\xff\xfcU\xfc\xa9\x9c\xd5\xb0\x1e\x89(\x9dL\tQ\xa8E\xf0"\x01m%E\xc2\xcc2\xa6v)\x9f\x1a\x0f\x13\'~_\x89T\x1e\xab\xc5EB\xe98\x8a\xdd\xaaD\xe6\xb6;pX\xc2\xae\xbc\xfa$Y\x98\x8eiG\xed\xc1lp\xcc\xe701\xce\x99\xf6+\xab\xed\xee!\x159c\x01e\xc1\xf6\x04\xcc\'#F\x85\x94lN\x16\xb4\xd4\xa0@Xa$D\x86\xf8X\x83\xb6\xd0!\xfe\x89c\xc4\xf7?\xa1\xfb\x1dc\xa6\xe9LID\x9b\xee@\x16H\x0f\xc7\xcd\x988\xfa\x14\xc1\xa9m\x19\xde}\x91\xec\xa9\xf8Oh\x0fx\xd49\\#\x1f\xa0\x85;V`#\xfc\xff\xee\x8b\xdb\xbeGztb\xeb\x0f\xf1@Z\x95\x10r\xbcF@c4h\x03\x95\xd7 \x90\x15\x19\xe5s\n\xd9\xab\x1d\x06Y.\xce\x86\xc9aNNTpR\x18?\\\xab\rii\xf2:\'\xbcy\xec[\xc7*\xfe\x92\xad\xdbn\xc0\xd9G\xe2\\Ey.p\xed\xe0\x16Y\xb9@\xa6iN\x7f\x86\xd9\xdf\xde\xdc\xf6\xfd++\xba\xb5\x98o\x96O\x1f\x8czUo\xced\x88\xd7\xc8\xab\x0b5)d>\xc2&hj\xcb\xf9\x136\xb7\xf9S\xe33\xf1F*\xce\xc1\xa7\x81\xf7\x1dY*L\n\xef\\\xdb\x9a7\xf29\xba\xb1-\xbf\xdf\xf4\xe0\x8b\x98\xbe\x8b\xf9\x8b\xc1,\xcd\xdd?d\x1cN\xf0\xe9\x9f\xb6}\xff\xc3\x83p\x92\xc6`\xd8\xc4\xc4b\x0f\xbc\xe4\x85\xb4]\x04\x1e\x9b\x84\xddBS\x84\x13\x8e\x04-\xac\x99\r\x96\xdb\xe8\xd0\x7f\xd0\x8fq\x84\xb6\x8fq,m\x0frg\x94\xa57O\xf3\xc35\xd0\xe8\x903\x8b\x88^\x0c\x93\x8bCs\xb6\x0e\xa9\x1e\xfdj[~\x9f\xfe\x19-q;\xf2Z\xe4n\xac\x87|\xa2O\xff\xbc\x8b\x0f\x9a\x93\xf8w\x89,F\x9e?.F\xe4P\x86%P\x19\x05HC\xbdQ\x93\x80Y\x02\x16Q\xbfFH\xef;m3\x03:\xdf\x04G\xa4\xb4Fh\xee\x10y:\x03\x1a\x1d#\x0ea\ts\x0b\xfe\x1aFb\xf5\xe2\x877v\xf1\xb9\x18\x86oF\xfe\x87\x7f\t\xe7\x9f\xf5v\xf11\xf1 G>\xf0\xa7\x8ay\xd0_\x0bG\xeb\x02\xa3,T.\xd6\xa8@)\x81;\x89\xf4\xb7\xf2\x01[\xa0\xac\x84\xc3\x04M\xc2V\x14\'\x17\x08\xb1-d\x8cW\x1b)e\x8d\xf0y\xfd\x0f\xbb\xf8\x10Q)\xd5K\xec!%\xa2\x83\xf5.>7\xdcI\x939\xb5\x8b\xa4\x92\xf3\xd7\x8c\x02"T&\xc0-\x10V\x01S\xc8B\xcf\x1f!Ct|>r\xc6\xca\x9aS\xb9\xd3\x12\x89x0\x0e\xab(6\xb4\xc603\xcbE\xe9\x80I\xb9\xb4;\xf5\xac/\xf1g\x11.`}\xee\xd6\x1a6\x91\xdc31\xfes0\xfb\xf4\xcf;\xfc!\x16F\xee\xf4\x955RJ\xf1KaC&\x15J\xa4\xe6\xd3/\xd5\x1a.\x13\xdb\xa6x\r\xc2#\x14\xb5\x93\xf9\xe1\x8c\xa9\xd0\x9dWf,\x0eLt\x14)q\x16\xc8\x07\xcf\x8d7\x9d\xce\x8c\xd2\xc1:\x8f<\x87\xd8#\xcc};\x9f\xdf\xf4<\xfbbg\x9bk\xe1\xec`\x16u.\xe1\xe3\xbc\xaeR\xc8\x02\t\x89Kj\x91\xf2\xa9\x92*(RK\x0cL\xfb%\xb47\xbc\xf1\xa9\x05\x99\xe3C\x96`6\xb1\xd2\xd0\xf3\xf1\xdf\xc9\x1d=\t\xd3b.\xb9\xc17\'\x1a\xb9\x8e\xfe\xfcK\x88\x0f\xca\x17\xde\xc3\xfa\xc3\x9f\x7f\xf9\xeb\x9fl\xcb\xef\xbf\xffJ\xebh-\xae\xa2\x1a\xe3\x0b\x88/\xdf\x83(_\xf8\xf9\x97\xbf\xf8\xdbO\xfaw_\xda\xf6\xfd\xaf\x7f"\xebmX\x07c{Vg\x8fDR\x1f\xc9\x82Q\xe8,*\x98VR\x845>\x86\xee<-\xd1\xeed\x9e\xe6\x17\\\x1f\x0fJ\xb4\x05\xb8\xa0\xf1\xb9\xdc7\x11I\xf3\xc3\xb5\xb2\xd2z[6_G\xb0G|\xd7pr1(\xa9\x06c\xb0E\x89L\xc4\xa0Q@\xb5\xf3\x87\xc6\xa5\xe7\xf3\t\x17\x94[\x07M`*\xd0\x17_(cd\xd26\xdcr\x14\xa0\x95\xe6\x9eG\xc7\xe8\x11\xb5;\xcf\x91\x8f\xbbY\xbd\xe5\xea\x95UX\x05\xc2\xc5\xf9\x84d\x88\xd0(te\x16\x8a9\x1a\xc8\x873Ls\xca/\xb6\xd9\xb7#/\x06\xb3\xc3\x95p\xb0c\x86\xa8b\rl;L\x88g\x9e/\x9f\xa8\xed8\xb1AdR\x85&)\xa5\xbaM\xe1\x88K\x8f\xcf\x08=\n\x0b\xf2Gv\x1c\x94\x98\x1f\xe6\xaf\xe6\x08\x0b\xf0\'\xcd\xd3\x99\xa3\xc5\xa6\xb8\xd2\xcc\xb8\x05s\xd4~~|\x8c=?d\x10S=!FUP\t%v\x07\xe2p\x9c\xc6\x01R\xb1^9oB)\x91\x8f\xb1\xbc)\xf7\x8e\x01[L[I\xa1Q\x83\x19\x9646\x16"\xca\'\x17>\x18\xc7\xd2\xcb\x9f\xaf?\xbe=\xc9\x9c\xcda\x8b\xa8\'\xe6\x04\x85\xe3b\xc7\x84\x0c\xb9C\x84.\xf2ao\xc4\x1c\xe2\x83,\xc2y\x9a\x0fJ\x1a\x1bG\xe4\x12p86\xb3t\xcd\x94\x94L\xd4\xc1\x99\xe7\xc9\xc7\xc4\xe2\r\xb2`:U@t$&@\x02\xfa\t\xcf\x00\x15h1\xa5,D\x9b\x90\x0f\xb1\n\x85\x0f\xed\xca\xb6,\x8c\xb01\x1d\xcc\x94\x82\xf8\xb09i\x0e\x94VjOz\x0b\x08Q\x1b\x98\x8d\x89Q\x99\xce\xbeA\xfe(\x91*\xa8\xc4\x9b\x89\x89\xc3\xca\xc4\tpI*\xe4\xe2|r\x91 \x1br\x89\xf9\x90%\x90;Q\x00\x02\xc0\x06Hq\xcf\xf9t\xf5\x80\x0c\x99\xa5b\x8a\x99\xb15BF8\xa1O\xd1s\xe5\x139\x7f\xe6\xc4\xc5\xb1B\x8b\xb8U0\x9fD\xe8\x04\x85\xd6\xda\n3\xe5c\x88\x0e\xee\xa1\x99\x8b7\x1d\xe4c\xacE\xc2\xa9\x04\x92\xb3\xe1\x15Z\x87\\\x84\x12\x8c\x0b\xa9\xe89\xfa\x83l\xe8\xacq\xcd"\xcf\xa6\x80]bV\xbb\xfdy\xe7\x8d7\xbb\x9b\xf13\x1e3\xf4\x9a\x9fQI\xa3F\xe3_\xff\xc0\xaf\xce\xbf\xf3\xfa\xa5|\xc4\xa0`\x8em\xd3F2\xc8\xacNH\xd8MB&"T &\xb6\x85A|\xc8\x8e6x\x93\x8b)DF\xc6\xf3t&\xe3J\xa7#\x96\x8c\x99\x92\x99\r\x0f\xcc\x1a\xf8`\xe4\\\xef:\xff`M\xa6\xe1\xd7\xc7\xeaZ4\x96\xfdi?\xa3\xfd\x18\xfbt\xae\xdc\xbb\x1f\x9aK\xcb\x9d|\x88\x0c\xac\x1aG\xd6\x19\xac\x99\x92\xcf\xc7\xc4u\x8b\x02\x9f\x11\xd9D\xf5(,\xc0\x1f\x979\xc68j\xabS\x98\xcd`\x9d\xcep\x842hG\xd6\x1e\xfaf\x16\x81?\xd7\xae\xb09D\xa9Lg\x83\xf5\xae\xf3\x0f\x0fR^\x99\xc3m\xcc\x84\xf28-\xcd\x98ys\xdfF^sW\x08=\x80\x8f[\xad\xc6\xcc\x89Y\xdb\xf2\x81~P\x85^\x0cJ\xa2\x85\x8c&\xe1$\x006I\x95\x00\xad\x04g\x91\x8f:\x82t\x88\x00\x9eBZ3\xd3qwh\x94\x0c\xe7VF\\\xcf"\xf1\xc6\x94\x97\xfb\xc3t(\x80\x0f\xfdu\xac\xc4-\xf3\xdc\xdd\x83%\x857F\xee\xe0\xec`v)\x9f1\xdd8\x99\x84\xf1\xbd\xd8\xc4l\x13ZE\xd6\xcc\xc5\x9d9s\xb1\xad\x82)ap/\x8d\xc3\x82\xf6\xecH\xfe\x1d\xc3\xa7\x12\x16r^\xe78\xb1\xc1\xbc\xc0\x93\x15\x92H\xd7\xe2\r\xb4\x84\xd1e|VBc\x86\xfe0\x13\xe8\x95\x10\xca\x83\xf9\x8c\x85\xbf\x9c\xc5\x9e\x80\xe6v\xf31zv\xf4\x0c\x98\xa4cCd\xa0\xddFK\xb1\xc5\xaf\xb8TI=\xe1:\x00\x7f\xc2s\xa0\x83\x84\xa4$o;\x96@\'\xca\x99M\xba\xa6\xfb\xe5\xf1\xb1\x9c\rg \xff\x08y\xcc\xd0\x9f\xe1\x01\xd0\xf1\xc8`\\\xbdr)\x9f2\xa2\x1d"^\xadwP\x12\xf1R)\xc9+t\xeaF=\x04\x9f1\xf3\xc1:\xa8\x90\xc7`5X\xa9=in\xbd\xd1(\x80\x8c\xb4\xc9\x9eBK\xe0\x83<\xda\xe4D\x87\xee\xc9Z\xc3g\x82\xf6\x98\xcd\xe1\x9b\xe7\xbc$\xbb\xb5\xbc\x12@\x8bL\xdau\xfe\xe1\x01\xd0)y-\xfb\x06=\xfe\x1f\x8c\xa7+`\x9e\x93Kc\xe2\xe8\xf3\x19\x0b\x1f\x88t\xb5k\x7f!\xd9F6H\x83K\xa4\xc2\xce\x04\xd4JK\x1eu\x94\xa8U(\x9d@\xe8p\x98\xb6\x1aL\xd6\xa83\x1d\x1e\x1b\xac\x0c\x1b/|\xd2\x95\x1a4\xbcb\xb9\xdc"J\xc2):\x1e\x1e\xec\xe6c\x90N\xa9_F\xd8\xc6@N%\xd2\xa7\xbf\xe5\xc8\x89m\xd1\xbf\xdb\x18_\xcag,L\x89O\x84O,\xd1fB\xcal\x8bA\x96\t\xd4\xe7\xd0\xfb%\xf7\xac%\x1dsl\xe4\x14\xc2H\x9d\x11\xa7d\x8e\xf2\x82\xc8\x07kv\x00\xc9\xa4\xeb\xfe\x15\xc9\x18h\xed:?\xd0foV\xce9\xf0\x06\xf6\x89J\xa1V\xca-1\xaf\x9c\xd8YV\xec\xd1n>\x86\xf9\x8c\xa1\x8e]\xd0(\xd4\xdfC2\xf3m|\x82\x82\xf9\xa4q\xc2\x06\x9d\x13%z\xf1<\x87k\xf4\xc5\xe4\xde=\xe5\x86\t\x94\xdc\x03[\xa4\x85\xf9\xa8+\xd6\x02\xa2\x14\xb1E\x10\xbb\xfdIW\xe0\x900%k\xf8\xdb\x15\xb5WL\x07\xff\xc1\xac\xf4\x8f\x98\x1f~\x83_\xf4\x0f\xc4\xa4\x15\xe6\x9f\xae\xc4*\xb2\x86\x8c\x9a\x19\xe5C$\xa5]\x0e\x1e\xc4\x07\xfd\x19\xa7\xd3A\td\x88\x17\xfa\x94\x96X\xa2?H\x01Kj\xcd\x036\xe8<@"\xd8>\xe7>\x1b\x15\x9e\x0b\x8d\x99c\x13y5\xb7\xc9\xf5\x99]\x87/\x9cwx\xe3\xea\xaf\x94\x0c0\x93\x12\xb2\xbe\x84\x8f\xf0`&\\\xc3N@c\x86\xb4\x88\x1d\x99\x03\x7f,#\xe6SJ\xf0\xdf\xa1~0\x1f?LI>\x91C\xec\x162\xe2:\xac\xd2\xb1\x89\x95\x0f\xda\x84\xfe`\x0b\xe9\xf0k<\x16\x96\xce\xcc3\xc7\x95\xa5\xc4\x8cb=\xbca\xd6\xc0gE\x99\xac\x80\xce,\x82<\xb1\xde\xc9\xe7z\x1f\t\xad"\xe13<\xe8\x1fDl\x93\xd8\xd3?\x18^\x89x\x7fb\x81\xffKWL\xe8*\x11\x8c\xa0\xff\x90|\x98\xcb\x91\xd4m;\x12\xb3C\xc4\x05\x98\xa4c\xb2\x06\x03\xfaD\x87\r\xc2(\x88\xc5,\x9d\xc1\xf7\x8eS)\xb7\xc8\xbe\xd3i\xbbpn\x0cc\xe3\xda\x1f\x88\t\x86\xe7\x10\xae\xd8\xc9\x07\x88\xa2_b\x0f1\x89V\xd6\'\xb7\xf7\x8a\xf6-\xe1V\xc8$\xbe\x17u\xe9\x12>%\xf92&\x16\x10\xe9l\xb0\x8abj\xd7\xe80![G\xc2\xa3\x12NEx.NA\xab\xd1@?\xe0\x8e\xdaJH\xcda\x17\xbc3\xaf\x89\x0f\xdc&9\x80\xd6\xe0H)\xebV\xc4\x88\xd6\xee\xe4s\x05\xbf\xec\x1ex|\xbc@\xb7\xe4\x06\x94VY\xe3\xc3\xadY\xba\xbe\xcc\x1f\xe2\x93\x0b\x1f$Q\xa2\x88\xd6J\tw\x04?\x95NiI-\x85\r\x1b\x05\xcc.\xe1\x83k\x84\x11\xd1\x99Z\x16\xb1A\x8b\x8e\xd0\x1a\xc3\x06m\xf0qt\x1c\xa1F\xc3\xe7\x93\xae\xd3ud\x8d&B\xc4&bf4N\'\x16\x83x\xae\x7f\xe5\xda\x7f0%qbu\t\x9f\xf7\x85\xca\n\t\xf5q=}\xc9\\\\I\xfb\xa3\xcbK\xb6\x99\xcc\xd9\xe7S\x99rxp\t\x9f\xb1\x9c\xddZb\x19\x1d1\x11r\xa9\x1c\xac\x9c7\x11=\xca\x85_n+\x1f\x93\xd3\x9e\\\x96p~\xe5\xb2"F\xab\xfe\x15<3\x07\xb5\xd6\xc8\x88)\x995QYK\xb6\x94\xf9n\x7f\xfad\x0f\xafB\xa2\xf8u_\xa8\xea\xb8Y\xa5\xcc\x9fy,\xb9\xc5\xb3\xf8\xcf\xe1\xf5K\xfd\x99z\x84\xa6\x96\x8c2"g\xcc8-}>\xcc\x03\xdbZ\x86\x95\x89\x9d?\xe2LN\x1e;gVb\xd0\x8c\xcf\xaf}Ki\x85\\\x0c\xb3\x82\xb7\x7f\xa09\xee\xe6C\x8e\xad\x98\x11\xf1]\x1b\xdeE\xfb\x14}\x9c_F\x18\xe0\x0b\x9e\xaa\xbb\xdf?\x80\x1e\xfeu\xf9@>S\xfc\x8a\xea\xa9\xf3H\xfdaB\xf5\x00\xa7\xd8"*\x03kP\xc3>\xe0\xce\x8c\x08\xad\xa8&Frc\xe8\xcf\r\xf4\x1e\xbcb2\xe4\x0ef\x8a\xe3\xccF\xf8\xad8\x87\xdd|\x90\x04\xd2Q\xd7,#\xbf^\x11\x17Gli\xc7qf9<\xb8\x94\x8f3hZ\xf3\xe7\xc8\x8c\x8d\x18D-\x8f\x8e\xeb\xa9I\xf0\xc6\r\xef\xa1\xfd\xf2TL\x16oV\xd6\x1a\x9b\x8b5G\xfc\x89\xa4\xe7\xb2\xc1\xecw\xf3a\xc7\xba\xfb\xc8G\xbe[\x03\xe7\x03G\xcc\x0f\xf6\x0c\xdd\x06\x9b\xf0\x84t\xbe\x07\xf2QB\xcc\xe7H\xf8p\xebH\x08M\xcd\xf8\xa2I\xc8\t\xe9 \x1f\xdf\x1e\xe1S\x0e\xd1\x87\x99\xf0\xa9\x111\x178p\xbf{0|\x9fs\x05\xbb\xc0\x1d\xc8\x1cr\xdfu\xfe\xab\xef\xf7\xafk\xd6\xfd\x83\xbepA/\xf1+\x88}\xcf\x14\xaf\x8e\x96`\xef>\xba\x13\x81K\x0f\xe1\xcf\xd4#4%>G\xc2\x89Y\xc5\x1b\xc4\xe2\x1a\xab\x88(\xd5\xfc\x01B9\xee\xd8?\xa0["g\x9c\'\x1c\xee\x86\x9d5\xc0\x07\x99\xf27x\xfeU\xffFw\x7f\xd7\xf9\xbfz\xfb\x17?\xee\xcb.XGK\xdd\x13\xd9\xc0{\xdd\xfd\x83Y\xe1\xaeT\xe3\xde%p\xda\x7f\xf7\x85\xaf\xde\xbe\x94\xcf\xd4\xf2\xd1\xd6\xd8#s\x04\xe6L\xadS\xc2\xc7\x8c\xd1\x1c\x8e\xefEX\xd6\xed\x11>@\x08\xce2C\xe7\xeb\xde\x08\x1ftc?Z\xf9\xe4\xfcy\x1b\xcb]\xe7\xc7\xb8\x7f\xfa\xe1\xed\xab7,\xe9\xa5\xb2\xe8\x1e\xc4\xfb\xfc\x07b\xb5\xef\xf1\x81@>\xc3\xeb\xe5\xed\xfb\xa7\x97\xedm\x99,\xb1\xa4\xef\x90\x18\xbb\xa2\xac\xa6\x96\xcc.\x7f\xd0\xa0\xe8"\x1f\xb9Sp\x87\x18\t\x9f\xee\x81\xb5\xa9\xec_w\xe6\xd0\x9d\x1ft\xc9\x02q\xc9\xb2\xbb,\x07\x8eOz?\xf8=\x12\xe8_\xef\x939\xb1\x10\x82\xfeu\xb3r| \x96\xd8\xba\xf6\xfe\'\xbd\x07\xef\xca\xfe\x18\xa1\xc4|L\x99.\xadI8\x8a\xfeL\x85\xcb\xd8\x06\xd3\xb2t.\xf2\x01B@\x05H\x94\x96\x07\x93X\x13\xa1Z`.\xca\x83\xea\xf2Q\xf9`|vsl\xfa\xd7\xd5\x16\xb6\xa7\xbfo\x96z7\xb2\xdf\xf2U\xf3\xd9\xcd\x87\xdb\x11\xbe-\x8dOCx\x19\xe2"\x16\x8d\x81\xdf\x91\x8d\xb1Pr\x0eE\xf86\xb6<\x9c%\xba\x03\xbb\xce\x94\x91YC\xb0\xe9|\xe2%\x8f#!\xbe_"\xea\xe5\xd4\xdd\x7f\xb8l0V\x7fy\xf3\x03!\x846^\x87\xba\xe3\xb3~\xf3\x83\xd5_\x1e~7\xe6\xb3AH\xa8\xa4K&D\xf6 \x8f#4\xc9\x8c\xadE1\xf1b{\xe2K\xf8P\xa03\\r\xee\x92?\xb2X\x1a\xb5f\x15\xef\x0b\xa1\x15f\xc8_\xa2\x07\x0f\x9f\x11\xc6\xdd\x97\xde\xf9\xb2\x7f\xa0\x1eu;\x10d\xd3\xbb/\xdc}\xe9\xd1v\x92\xf3\xf9|\xa6\x92\xbdm\x03\xa7R\ty\x0eQ\xa4Su\xa8\xb1\xf5\x11\x16j\x0e\xb8\x83\x96\xf8\x8c\x9c?\xec\n\x8d.\x99\xde\xf0\xc6\xf0\xfd\x98\xf2|\xb4\xac0\xee\x9d\xbe\xfb\xe3\xfe\r!\xb4\xdf\xbf\xfe\xee\x8f\xbfz\xfb\xd1w\x81\xb3a0\x8b\x05\x99]\xd6XM\xd1\x9ftii\x1dm\x89\x9dt\xd0 b3\xa3z\xa6\x9c \xca\xc8QZb\x06@\xe7\x00K\xe4\xe5\x08\x1a\x19\xfd\xedG\x8f\x9e\xdb\xff\xde\xbd\x7f\xfa\xe1\xed\xe1\xf5\xab\xb7>\xbc}\xff\xf4q\xbe?\xfbH\xf8P\xfeDgz!\x80\x8f\x91\xb6)\xcdt+\xa1\x9d|,!\xe2\x83\xf9F%\x12\x91 \n\xfd\xeb\xfd\x03"\xb1o\xe9\xc9\xac\xde>\x8e\xfd\xf0\xf7\xbf\xf9\xe9\xe3\xe4\xf8\xb8\xf1\x9b\x9f\xfe\xe0wF\xcf\x89\\\x96f\x1b\xa51\x042q=\xdf\x1b(\r\xbc\x8d\xc6\xa5|l0\x1f\xfc#\xfdEh \x01C\xd6\x98\r>\x11Q\x13\xbb\xa0\xbc\xf6\xfe\'\xbd\xfb\xcf\x9c\xcc\xfd\xbb\xbf\xfe\xd3\xd5[p&<\xc3\x82\xce\xba\x1c\xee\xf7;uo\xc8\x155\x87\xf8\x98i\x8d\x8e%t9\x1f%dJ"R\x12\x9f\xd2,\xfb\xc4\xc4\xe3\xb1b\x1eB\x0f"\xde\xd7\xf1\xee~L\x0c\x91\xd1\xf0z\xf9\x93{\xa7\xcf\x8a\xcd\xbd\xd3\xf2\xf6\xf0\x98O\xd0\xed`i\x16fI\xa7]\n\x99\x85\xf0\xa9\xd1\x02\nc3\xdd\xa0#O\xa3\xf1@>S\xcf"\xf25]\r\xf7\xb1Mn0\x85e\xcd\x1d\x8a\xfeu\x9c\x8f\xc9\x9fHL\x02\xcb\xe0\xb4\xff\xfe\xfd\xaf\xdez\xdal\xbez\xeb\xdd\xef#\x07\xbe\x1d\x83\xee\x10\x1b\xack\x01l|:\xd4;\xd9`\xf3#\xcb\xe7\xa8\xd1x\x08B%\xedU\xd2\x7f\x85Q$\xe70K6\xc7X\x7f\xe4\xfe\xf6\xbb\xc7D\x0f\xc6\xc1%\x9a#F\x1d~\x7f\xf6\xc5\x1f_|Zl\xfe\xf8\xe2\xcf\xfe\xb3\xdb\xe1\xd3t;\xc3[X\x0f\xafci\x16p\x82\x05\xce\x11-\xe2\x03-\xa4\xb4L\x97LG\xf9\x98:\xa5\xc8\x00\xa7\xc6C<\xc4`\xaa\x16\xf1\xfd\x10\x9f\xa9\xa3Q\x0f\xc3\xdcl\xe9\xc6\x89\xd01\x12\x8a;\xdd\xce\x1b\xff|\xf6\xd1\x93\xb29\xfb\xe8\x8d\x7f\xeev\xcc\xd2E\x7f\x1f\xfb\xc8\x84\xc7\xe1\xbf\xc4\xc6\xda\xc4\xd6,\xd8#\xca\x8d\x89l\xf0\x01\x8b\x1e\x8a\x0f\x184\xf5\t\x89G\xf0\xf7\xfe\xb1\xf2\xa93\xea\xee\xa3\xe9:\xd7g\x8f\x96|\xde\xee\xfe\xf0\x16\xf8\xc3\x01\xb4^M>\xbb\xf9\xb8l>\xfb\xe9\xabI\xac{)\x0b\xfc\x0b\xb3\xa0?\xb27}Gp\x81d\xa2\x93a\x87s"{\xf0\xd5`:?zx:L\x08\x19\x99)yS\xf2M\xe0M\xa9C\xdd}\x9f\x90\x9e\x95l\xe9\x0c\xaf\xe3l\xdc\x89%\x0b\x1c\xf3\x02z\xd7~w\xfaw\xf7\x1f\x89\xcc\xfd\xbb\x9f\xfc\xdd\xb5\xdf1\xe1n\x8d\x90!B\x18p\x92E\xdc!\x1e\x0b\xa2\xa4t\x16D\x05\x98\x88AD\x08\xda\'\xc6\x122G\x8fB\xc7\xf2a\x8b\x90\xc14b\xfa\x0b%\xa4\xb7g\x96\xbe+\xe4\xcb\xfbL\xaf{\xdc=\x8e;l^\xb7\x13\xb7\xb1\x04\xb7\x84\xd2\xd5[\xe5\xed\xfb\xa7\x0f\xc5\xe6\xb4\xbc\r\x0e\xee\xdb\xe8\xd4\xa3\xcfl\xe8/\xd1\x82\x8986\xc8\x8ah\x10\x1f\xe4\x81T\x8c\x1at$\x94\x1e\x91O\xa3a\x94\x8b\xe3\xc4\xec\x85\x90\x91\x17\xedVb\xb1w\xa3t\xab\xc7X\xaaI\xf1F^1\xd0z\xf7_\xbez\xeb26_\xbd\xf5\xee\xbf\x10\xd3\xfd\xee\xb1\xdaW\x0f\xb3\x00c\x8f\xc9\x97\xc5\xf6\xc0[\x85\x98\n\x1dls\x8d\xc4\xc4!s\xd2x\xc4\xc7\x12Y\x18%3\xf5(M\xf1\xa6\xd0h\xbc+n3\x156\xaa\xbf\xdf\xdfWR\x8e\x8d\x10\xcamn0;\xbc\xf5\xce\x17w_\xdc\xc6\xe6\x8f/\xbe\xf3\x85G"\xdf\xca\xa7M~\x10\x1d\xa6u\x91\x0e\xd9\xa3=\xe1c\xa6\xfdN\xba\x8c,\x9dG\xe7\x83\x84L\x8d\x8a\x1f\xc6rQ\xa7\xa3\x05\xd3\x89\x96\xca\xc8Xb\x9cI\xb4\x88\xdb\xcc\xa8\x7f\\\xcf\xb2\x7f\xfc\xe6\x7f\x9e\xfd\xc5gs\xf6\x977\xfeC\t\xd4\xd6\xe6u:\x18u\x1e\xd8\x97\xf19\x04\x8f\x82)?\xb8\xd5\xef@\x1fY\x10\x1f*m4\x1e\xeb\xa9ysr\x81\x0fQ\xe1\xfb\x8b\xe4\xf6\xc0(\x08>\xbd\x92\xaae#\x19\xc7v\x0c\x99\xf1\xf8\xab\xc9g?E6\x9f\xdd|\xf5\x9f\xe2N\xec\xd6(\x99:\x9b\x8e\xe5\xe0\x9d\xc5\x1b\x99{\xaf\x0b%\x84t\xe6OFG\t\x89\x9f\xc2Jy86|\xb6>z\xd0\xf1\xcda\xef\xa1\xb7\x00_\xda8\xdb\xa7\x0c\xa3\x05\x11j\x13\xd3\xb6\xe7\x07\xb4\xaf\xad\xaf\xad\x89D\xbb\xeeH\xff\x18\xf7\x88\x91&\xcd\xc4\x1e\x17\xd9\xa3\xed\x1b\x14\xcd\xa3\xb9rJ\xe1l}j\xc3\xf9N\x84\x19\xc7I\xf4Dt\x1a\r\xa3|`\'2\xc8\xf2\x88<6\xda\xef\x1f\x13\x1f9%Y\xd5f\x1a\x94c\xde\xc7\xbc)G\xff\xedz\xb5\xe6\xba=xG\xc7\x83_\rGG\tDs\xb6\x87\xc6\xe6T\xcf7\x02x5\x1aOFH\xd8P\x98\rw\x94\x91Y\xd4g\x94\x90rbW(\x1b\xa1T\xcf\xad\x1e\xf1\x8e\xbe7\x9e\xbb\x11|\xfbm\xde\xd5\xcc\xb9\xe4\xe0\x96\xfb\x9bg\x8e\xd29i<\xf1\xe3\xf8\xe0\x1d@=g\x7fa\xdcR\xda\xac\x85\x89\xdc9ga\xef\xde\xde<\x8e\xf4\x8f\xe3\xad\\\xe2v\xb7\xfd\xb0\xfc\xfc "\xb1\xc7\x80mZH{\xc3\x9f\xc6Sy\x80\xf3\x02Y\xb3A\xfc?\xe4D\x94\xb0\xb4\x1eE\x1b&\xb15\xce\x14e$\xb4\xc4%\xca7\xee\xc6\xb1\xf8\x10?2\x1d\xd9\xc1\x8d\xc4\x1c\xe2Q\xac\xa5s\xeb\xe9\xd1\xc1\xe7j\x8et\x8c\xf2Y\x88M5BWgl\x0b3\xe2\xfb\x8a\xa4\xc4\x0c|N\xb82\xb6|\\Vq\xdc\xad\x11\xc2}$W\x7f]\xdem?06\x08\xb9x\xfat\xf0\x89N8\x88\xc6\t\xff\xc17\x888(\x9d\xb9\xce\xbbU\xc8\xc8\xe7\xa3,\xd5\xa8n\xdc\x1fw\xe3h\x8e\x84b%\xd3\xa6>\x8e\x089\xcf\x9e\xb8k\xc7\xec\xc8\x05:\xe4L\xad\xf5l\xe8\xd4\t\xd9\xccO\\\xf6l\n\x19\xb3p\xdc\xea\xf38\xe7g\x19#\xa3\xb9\xf4\xf8\xfcc&\x89#D&\xc6~\x0c%fo\xf4\xfbX\xe9D53\xbam\xebc\\7\xc6o=\x1b:L\x08\x99\x10#\xf1(\x9aD5\n\xca\xa6\xc6\xc4\x92b\x83\xa2E\xdc\x8e\x9d\x07m\xbeO>=\x7f\x15sF\x94=\xf3\xe2\xec\xd9$/\xe3\xf6\xd5\x997\xdb\xde\xe6\xcff<;:\xbeCH\xc6H\xe6\x8e\x90\xdf\x037(O\x7f\xd6f\x11\xc7\xb1f\x8c\xab8_l\xc5\xec\x05\xb4\xfby?\'6J&\xb6=/\xfac\xd9S\xe8]\xce\x86\xf94\x9e\xe9\x03\xe6L\x80M\x85\xe6\x98y\xbf\r\xad\x9a\'.\xf8\xaep<\x8e\xd5\x0b\xa1\x14+!\xa6\xa3\x992\x1dg\x88\x12\xd11\xcb5\xde \xe5\xb3i\x0b\xb5\x1d\xd1x\xe6\x0f\x93\x11\x1e\x15\x10\x12;\\\xf8}\xe6\xa2,"K\xe7\xeal\x98S\xde\xf6\xc6\xdd\xd3\xf5x\xc4\xb5\xec\xe2K\xdd\xc0\x9d\x86y\xbf\xbd\x9bO\xe3ky\x94\x8d\xbc\x1e\tm\xe3\xfdC\xafB&l\x0c\x96|nl\xc5\xf1p\xdc\x1f\xd7Y\xe0Z\x9fQ\xb7f\x8d\x99w\xe3\x87\x89a\xd9o?_:\xec\x10\xb31\x15\x95D\xc2w\xc7\'\x15y\x0e\xb9Ly\x84\x1f^\xb7i\x87\xf1V\xe8\xfa\x87\xb2\xe8\xb9\xd3\xe1\xc7T\xfd\xb6P\x12w\x1c\x15#\x94\xb0\xc5\xf9\xb35j\x8c\xa3\xb5;\xd7\xa8fL\xbc\xd1\x7f@\x1c\xd5[\x8d\xe7\xf2\xa0Eh\x10\x85R"\xa3\xe8\xfe\xc9/\xc8\xb3\x8a#nAD\x06z]\xcbHI\xc1\x1a\xe9\xe3\xf74\x1e\xa9E\xea\x12\x8f\xf3.\x0f\xb4H\xf8\xf4\x8f\xb0\xd5xn\x0f\x10\xaa\x90\x92\xd83!\x9b\x94Xe$8g C9n\x0ba\x16\xd1|\xc4\x81\xcc\x98M$;\x08-\x9aU~\x1a\xfd\xa3]\xac\x1a\xcf\xf9AO"\xc9\x81\xe98*\xae\x8d3\xe8\x0e\xe6\x8568\x03b6\x02n:\x8e\xc8\x8c(f\x021~\xed[\xd4U{8\xb6\xf8\xc2\xa4\x1c\xab\xc67\xe4\xf1\x9c\x99;.\x91\xc7IIa\xee\x9cu4\xc7\xb5\x94\xaf\xe7\x0c\xcc\xd9\xfc\xf9\x1b!\x11\x19\xa6\xc55\xee\x11\x01\x87h\x975\xdf\x1c6\xfcD\x93\x9a-\x17j\x9de_\xb0\xc61)\xa3\x8b\xe1v\x13\x87d\xac\x1b)!k\x91\xbe\xb1O\xab\xf1\r|\xa2\r\x16\xa6\xea\x8f\x8duHo\x9d\xf3\xa3\xd1\xf9&\x13\xcd<\xb6k\xea\xa4\xa2\xca\xf9c\xdd\xb2\xfe\t\xc9o$\x1b\x9f\x91#\x14\x89#\xbeKu\x82\xcaF\xdb\x9a{T9\xb3\xd4\x9a\xc8#\xe3\x98\xbb\xaf\xf1m|\x0b\x1e\xc7#\x9205\x07\xfc\xd9X\xf2\x8b\xcekT\xcf\x95\x03\x8e\xf4/\xb0ql}\xc6\x8do\xd1\xe3\xfb2<\xda\xa4\xc2V9Gd\xed9P\x82W\x99R\xfb<\xaa\xcc\x96\x88j2Sitw9F+ly7;un62+I`GC|NgWyF#rIZdkVY& diff --git a/core/src/trezor/res/swipe.toif b/core/src/trezor/res/swipe.toif deleted file mode 100644 index de5920b8f35daa6fd670ab98013c5fe44d8b77e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmV;40CxXWPf14@01yCu0000jj=>GWKnw&oIfQs#0f?jn=zw%UItX9-pa42Uq5(=k zkSH(2V8`c&HImo6TU}M=l3Uh+XVSfkB8;V6x;lUks* r^{PzyfyR!Fe;rI}Pxaz#TG&TQ=bTEDX|amwOLlaLPVTDP#&`Y$@`6AB diff --git a/core/src/trezor/res/swipe_left.toif b/core/src/trezor/res/swipe_left.toif deleted file mode 100644 index 0eb06d004ace3db7b0febed69f383eb1126ca56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmV-|0Db>dPf14*02lyv0001EJj%!b1Of*Cc|bJ7xBvIS0zd!%mjlrW|Np;dgh>3? z2hjol|NmzKF~0o&Zx5m!fC9`Q#^?Y4{Xw(>P=FQ0c=-Q+KZw5g|NnfbI2%M=JdiQ~ ka#`unRU`Gf50AYPSb^rhX diff --git a/core/src/trezor/res/swipe_right.toif b/core/src/trezor/res/swipe_right.toif deleted file mode 100644 index 9c3e3d1c9a0d28a0789370273b5c305df2ac8495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmV;10D1pZPf14*02lyz0001EWB>vM8vzi-aPdDAh!Xhs-ycMO`v1QlB>VsWe>Ncf z`TzfTAY}mLvH int: - return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3) - - # import style later to avoid circular dep from trezor.ui import style # isort:skip @@ -102,45 +98,6 @@ def backlight_fade(val: int, delay: int = 14000, step: int = 15) -> None: display.backlight(val) -def header( - title: str, - icon: str = style.ICON_DEFAULT, - fg: int = style.FG, - bg: int = style.BG, - ifg: int = style.GREEN, -) -> None: - if icon is not None: - display.icon(14, 15, res.load(icon), ifg, bg) - display.text(44, 35, title, BOLD, fg, bg) - - -# Common for both header functions -MODEL_HEADER_HEIGHTS = {"1": 12, "R": 15, "T": 30} -MODEL_Y_BASELINES = {"1": 10, "R": 11, "T": 22} - - -def header_warning(message: str) -> None: - height = MODEL_HEADER_HEIGHTS[utils.MODEL] - y_baseline = MODEL_Y_BASELINES[utils.MODEL] - - display.bar(0, 0, WIDTH, height, style.YELLOW) - display.text_center( - WIDTH // 2, y_baseline, message, BOLD, style.BLACK, style.YELLOW - ) - - -def header_error(message: str) -> None: - height = MODEL_HEADER_HEIGHTS[utils.MODEL] - y_baseline = MODEL_Y_BASELINES[utils.MODEL] - - display.bar(0, 0, WIDTH, height, style.RED) - display.text_center(WIDTH // 2, y_baseline, message, BOLD, style.WHITE, style.RED) - - -def get_header_height() -> int: - return MODEL_HEADER_HEIGHTS[utils.MODEL] - - # Component events. Should be different from `io.TOUCH_*` events. # Event dispatched when components should draw to the display, if they are # marked for re-paint. diff --git a/core/src/trezor/ui/components/common/confirm.py b/core/src/trezor/ui/components/common/confirm.py deleted file mode 100644 index d8f247fd9..000000000 --- a/core/src/trezor/ui/components/common/confirm.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import TYPE_CHECKING - -from trezor import ui, wire - -import trezorui2 - -if TYPE_CHECKING: - from typing import Callable, Any, Awaitable, TypeVar - - T = TypeVar("T") - -CONFIRMED = trezorui2.CONFIRMED -CANCELLED = trezorui2.CANCELLED -INFO = trezorui2.INFO - - -def is_confirmed(x: Any) -> bool: - return x is CONFIRMED - - -async def raise_if_cancelled(a: Awaitable[T], exc: Any = wire.ActionCancelled) -> T: - result = await a - if result is CANCELLED: - raise exc - return result - - -async def is_confirmed_info( - ctx: wire.GenericContext, - dialog: ui.Layout, - info_func: Callable, -) -> bool: - while True: - result = await ctx.wait(dialog) - - if result is INFO: - await info_func(ctx) - else: - return is_confirmed(result) - - -class Pageable: - def __init__(self) -> None: - self._page = 0 - - def page(self) -> int: - return self._page - - def page_count(self) -> int: - raise NotImplementedError - - def is_first(self) -> bool: - return self._page == 0 - - def is_last(self) -> bool: - return self._page == self.page_count() - 1 - - def next(self) -> None: - self._page = min(self._page + 1, self.page_count() - 1) - - def prev(self) -> None: - self._page = max(self._page - 1, 0) diff --git a/core/src/trezor/ui/layouts/tr/__init__.py b/core/src/trezor/ui/layouts/tr/__init__.py index 442cf1e9a..70848394a 100644 --- a/core/src/trezor/ui/layouts/tr/__init__.py +++ b/core/src/trezor/ui/layouts/tr/__init__.py @@ -6,7 +6,6 @@ from trezor.utils import DISABLE_ANIMATION import trezorui2 -from ...components.common.confirm import is_confirmed from ..common import button_request, interact if TYPE_CHECKING: @@ -19,6 +18,10 @@ if __debug__: trezorui2.disable_animation(bool(DISABLE_ANIMATION)) +def is_confirmed(x: Any) -> bool: + return x is trezorui2.CONFIRMED + + class RustLayout(ui.Layout): # pylint: disable=super-init-not-called def __init__(self, layout: Any): @@ -256,10 +259,6 @@ async def confirm_blob( raise wire.ActionCancelled -def draw_simple_text(title: str, description: str = "") -> None: - log.error(__name__, "draw_simple_text not implemented") - - async def request_pin_on_device( ctx: wire.GenericContext, prompt: str, diff --git a/core/src/trezor/ui/layouts/tt_v2/__init__.py b/core/src/trezor/ui/layouts/tt_v2/__init__.py index 0dbed22e0..37284f74f 100644 --- a/core/src/trezor/ui/layouts/tt_v2/__init__.py +++ b/core/src/trezor/ui/layouts/tt_v2/__init__.py @@ -562,9 +562,7 @@ async def confirm_payment_request( recipient_name: str, amount: str, memos: list[str], -) -> Any: - from ...components.common import confirm - +) -> bool: result = await interact( ctx, RustLayout( @@ -579,10 +577,13 @@ async def confirm_payment_request( "confirm_payment_request", ButtonRequestType.ConfirmOutput, ) + + # When user pressed INFO, returning False, which gets processed in higher function + # to differentiate it from CONFIRMED. Raising otherwise. if result is CONFIRMED: - return confirm.CONFIRMED + return True elif result is INFO: - return confirm.INFO + return False else: raise ActionCancelled @@ -663,7 +664,7 @@ async def _confirm_ask_pagination( paginated.request_complete_repaint() result = await interact(ctx, paginated, br_type, br_code) - assert result in (trezorui2.CONFIRMED, trezorui2.CANCELLED) + assert result in (CONFIRMED, CANCELLED) assert False @@ -1060,10 +1061,6 @@ async def show_popup( ) -def draw_simple_text(title: str, description: str = "") -> None: - log.error(__name__, "draw_simple_text not implemented") - - def request_passphrase_on_host() -> None: draw_simple( trezorui2.show_info( diff --git a/core/src/trezor/ui/loader.py b/core/src/trezor/ui/loader.py deleted file mode 100644 index 97c6ffd04..000000000 --- a/core/src/trezor/ui/loader.py +++ /dev/null @@ -1,132 +0,0 @@ -import utime -from micropython import const -from typing import TYPE_CHECKING - -from trezor import res, ui, utils -from trezor.ui import display - - -class LoaderDefault: - class normal: - bg_color = ui.BG - fg_color = ui.GREEN - icon: str | None = None - icon_fg_color: int | None = None - - class active(normal): - bg_color = ui.BG - fg_color = ui.GREEN - icon: str | None = ui.ICON_CHECK - icon_fg_color: int | None = ui.WHITE - - -class LoaderNeutral(LoaderDefault): - class normal(LoaderDefault.normal): - fg_color = ui.FG - - class active(LoaderDefault.active): - fg_color = ui.FG - - -if TYPE_CHECKING: - LoaderStyleType = type[LoaderDefault] - - -_TARGET_MS = const(1000) -_OFFSET_Y = const(-24) -_REVERSE_SPEEDUP = const(2) - - -class Loader(ui.Component): - def __init__( - self, - style: LoaderStyleType = LoaderDefault, - target_ms: int = _TARGET_MS, - offset_y: int = _OFFSET_Y, - reverse_speedup: int = _REVERSE_SPEEDUP, - ) -> None: - super().__init__() - self.normal_style = style.normal - self.active_style = style.active - self.target_ms = target_ms - self.start_ms: int | None = None - self.stop_ms: int | None = None - self.offset_y = offset_y - self.reverse_speedup = reverse_speedup - - def start(self) -> None: - if self.start_ms is not None and self.stop_ms is not None: - self.start_ms = utime.ticks_ms() - self.elapsed_ms() - else: - self.start_ms = utime.ticks_ms() - self.stop_ms = None - self.on_start() - - def stop(self) -> None: - self.stop_ms = utime.ticks_ms() - - def elapsed_ms(self) -> int: - start = self.start_ms - stop = self.stop_ms - now = utime.ticks_ms() - if start is None: - return 0 - elif stop is not None: - return max(stop - start + (stop - now) * self.reverse_speedup, 0) - else: - return min(now - start, self.target_ms) - - def on_render(self) -> None: - if self.start_ms is None: - return - target = self.target_ms - r = self.elapsed_ms() - if r != target: - s = self.normal_style - else: - s = self.active_style - - progress = r * 1000 // target # scale to 0-1000 - if s.icon is None: - display.loader(progress, False, self.offset_y, s.fg_color, s.bg_color) - else: - display.loader( - progress, - False, - self.offset_y, - s.fg_color, - s.bg_color, - res.load(s.icon), - s.icon_fg_color, - ) - if (r == 0) and (self.stop_ms is not None): - self.start_ms = None - self.stop_ms = None - self.on_start() - if r == target: - self.on_finish() - - def on_start(self) -> None: - pass - - def on_finish(self) -> None: - pass - - -class LoadingAnimation(ui.Layout): - def __init__(self, style: LoaderStyleType = LoaderDefault) -> None: - super().__init__() - self.loader = Loader(style) - self.loader.on_finish = self.on_finish - self.loader.start() - - def dispatch(self, event: int, x: int, y: int) -> None: - if not self.loader.elapsed_ms(): - self.loader.start() - self.loader.dispatch(event, x, y) - - if utils.DISABLE_ANIMATION: - self.on_finish() - - def on_finish(self) -> None: - raise ui.Result(None) diff --git a/core/src/trezor/ui/popup.py b/core/src/trezor/ui/popup.py deleted file mode 100644 index db698ff32..000000000 --- a/core/src/trezor/ui/popup.py +++ /dev/null @@ -1,21 +0,0 @@ -from trezor import loop, ui, utils - - -class Popup(ui.Layout): - def __init__(self, content: ui.Component, time_ms: int = 0) -> None: - super().__init__() - self.content = content - if utils.DISABLE_ANIMATION: - self.time_ms = 0 - else: - self.time_ms = time_ms - - def dispatch(self, event: int, x: int, y: int) -> None: - self.content.dispatch(event, x, y) - - def create_tasks(self) -> tuple[loop.Task, ...]: - return self.handle_input(), self.handle_rendering(), self.handle_timeout() - - def handle_timeout(self) -> loop.Task: # type: ignore [awaitable-is-generator] - yield loop.sleep(self.time_ms) - raise ui.Result(None) diff --git a/core/src/trezor/ui/style.py b/core/src/trezor/ui/style.py index 1727492af..70b97d6ee 100644 --- a/core/src/trezor/ui/style.py +++ b/core/src/trezor/ui/style.py @@ -1,31 +1,8 @@ from micropython import const -from trezor.ui import rgb - # backlight brightness BACKLIGHT_NORMAL = const(150) BACKLIGHT_LOW = const(45) BACKLIGHT_DIM = const(5) BACKLIGHT_NONE = const(0) BACKLIGHT_MAX = const(255) - -# color palette -RED = rgb(0xFF, 0x00, 0x00) -BLUE = rgb(0x21, 0x96, 0xF3) -GREEN = rgb(0x00, 0xAE, 0x0B) -YELLOW = rgb(0xFF, 0xEB, 0x3B) -BLACK = rgb(0x00, 0x00, 0x00) -WHITE = rgb(0xFA, 0xFA, 0xFA) - -TITLE_GREY = rgb(0x9B, 0x9B, 0x9B) - -# common color styles -BG = BLACK -FG = WHITE - -# icons -ICON_CONFIG = "trezor/res/header_icons/cog.toif" -ICON_SEND = "trezor/res/header_icons/send.toif" -ICON_CLICK = "trezor/res/click.toif" -ICON_CHECK = "trezor/res/check.toif" -ICON_DEFAULT = ICON_CONFIG