From a4e6f49959eac59e1839d0d0ccae0d589bfe70f0 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 1 Jul 2016 00:03:54 -0400 Subject: [PATCH] Building out tools page options --- src/App/Controls/ExtendedTextCell.cs | 2 +- src/App/Controls/ExtendedViewCell.cs | 9 ++ src/App/Pages/MainPage.cs | 2 +- src/App/Pages/ToolsPage.cs | 95 ++++++++++++++++++- src/iOS/Controls/ExtendedViewCellRenderer.cs | 4 + src/iOS/Resources/cloudup.png | Bin 0 -> 779 bytes src/iOS/Resources/cloudup@2x.png | Bin 0 -> 1273 bytes src/iOS/Resources/cloudup@3x.png | Bin 0 -> 1703 bytes src/iOS/Resources/globe.png | Bin 0 -> 1255 bytes src/iOS/Resources/globe@2x.png | Bin 0 -> 2051 bytes src/iOS/Resources/globe@3x.png | Bin 0 -> 2803 bytes src/iOS/Resources/refresh.png | Bin 0 -> 1017 bytes src/iOS/Resources/refresh@2x.png | Bin 0 -> 1675 bytes src/iOS/Resources/refresh@3x.png | Bin 0 -> 2229 bytes src/iOS/Resources/upload.png | Bin 0 -> 533 bytes src/iOS/Resources/upload@2x.png | Bin 0 -> 969 bytes src/iOS/Resources/upload@3x.png | Bin 0 -> 1195 bytes src/iOS/Resources/wrench.png | Bin 0 -> 526 bytes src/iOS/Resources/wrench@2x.png | Bin 0 -> 887 bytes src/iOS/Resources/wrench@3x.png | Bin 0 -> 893 bytes src/iOS/iOS.csproj | 45 +++++++++ 21 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 src/iOS/Resources/cloudup.png create mode 100644 src/iOS/Resources/cloudup@2x.png create mode 100644 src/iOS/Resources/cloudup@3x.png create mode 100644 src/iOS/Resources/globe.png create mode 100644 src/iOS/Resources/globe@2x.png create mode 100644 src/iOS/Resources/globe@3x.png create mode 100644 src/iOS/Resources/refresh.png create mode 100644 src/iOS/Resources/refresh@2x.png create mode 100644 src/iOS/Resources/refresh@3x.png create mode 100644 src/iOS/Resources/upload.png create mode 100644 src/iOS/Resources/upload@2x.png create mode 100644 src/iOS/Resources/upload@3x.png create mode 100644 src/iOS/Resources/wrench.png create mode 100644 src/iOS/Resources/wrench@2x.png create mode 100644 src/iOS/Resources/wrench@3x.png diff --git a/src/App/Controls/ExtendedTextCell.cs b/src/App/Controls/ExtendedTextCell.cs index 73341eef5..34fb2467f 100644 --- a/src/App/Controls/ExtendedTextCell.cs +++ b/src/App/Controls/ExtendedTextCell.cs @@ -14,7 +14,7 @@ namespace Bit.App.Controls BindableProperty.Create(nameof(BackgroundColor), typeof(Color), typeof(ExtendedTextCell), Color.White); public static readonly BindableProperty ShowDisclousureProperty = - BindableProperty.Create(nameof(DisclousureImage), typeof(bool), typeof(ExtendedTextCell), false); + BindableProperty.Create(nameof(ShowDisclousure), typeof(bool), typeof(ExtendedTextCell), false); public static readonly BindableProperty DisclousureImageProperty = BindableProperty.Create(nameof(DisclousureImage), typeof(string), typeof(ExtendedTextCell), string.Empty); diff --git a/src/App/Controls/ExtendedViewCell.cs b/src/App/Controls/ExtendedViewCell.cs index 62c0acf21..9a6813273 100644 --- a/src/App/Controls/ExtendedViewCell.cs +++ b/src/App/Controls/ExtendedViewCell.cs @@ -8,10 +8,19 @@ namespace Bit.App.Controls public static readonly BindableProperty BackgroundColorProperty = BindableProperty.Create(nameof(BackgroundColor), typeof(Color), typeof(ExtendedTextCell), Color.White); + public static readonly BindableProperty ShowDisclousureProperty = + BindableProperty.Create(nameof(ShowDisclousure), typeof(bool), typeof(ExtendedTextCell), false); + public Color BackgroundColor { get { return (Color)GetValue(BackgroundColorProperty); } set { SetValue(BackgroundColorProperty, value); } } + + public bool ShowDisclousure + { + get { return (bool)GetValue(ShowDisclousureProperty); } + set { SetValue(ShowDisclousureProperty, value); } + } } } diff --git a/src/App/Pages/MainPage.cs b/src/App/Pages/MainPage.cs index 3c48c8b56..4761463b2 100644 --- a/src/App/Pages/MainPage.cs +++ b/src/App/Pages/MainPage.cs @@ -24,7 +24,7 @@ namespace Bit.App.Pages vaultNavigation.Icon = "fa-lock"; toolsNavigation.Title = AppResources.Tools; - toolsNavigation.Icon = "fa-refresh"; + toolsNavigation.Icon = "wrench"; settingsNavigation.Title = AppResources.Settings; settingsNavigation.Icon = "cogs"; diff --git a/src/App/Pages/ToolsPage.cs b/src/App/Pages/ToolsPage.cs index 5c385de4c..e8b29389b 100644 --- a/src/App/Pages/ToolsPage.cs +++ b/src/App/Pages/ToolsPage.cs @@ -23,8 +23,101 @@ namespace Bit.App.Pages public void Init() { + var generatorCell = new ToolsViewCell("Password Generator", "Automatically generate strong, unique passwords for your logins.", "refresh"); + var extensionCell = new ToolsViewCell("bitwarden App Extension", "Use bitwarden in Safari and other apps to auto-fill your logins.", "upload"); + var webCell = new ToolsViewCell("bitwarden Web Vault", "Manage your logins from any web browser with the bitwarden web vault.", "globe"); + webCell.Tapped += WebCell_Tapped; + var importCell = new ToolsViewCell("Import Logins", "Quickly bulk import your logins from other password management apps.", "cloudup"); + importCell.Tapped += ImportCell_Tapped; + + var table = new ExtendedTableView + { + EnableScrolling = true, + Intent = TableIntent.Menu, + HasUnevenRows = true, + Root = new TableRoot + { + new TableSection() + { + generatorCell, + extensionCell, + webCell, + importCell + } + } + }; + + if(Device.OS == TargetPlatform.iOS) + { + table.RowHeight = -1; + table.EstimatedRowHeight = 100; + } + Title = AppResources.Tools; - Icon = "fa-refresh"; + Content = table; + } + + private void WebCell_Tapped(object sender, EventArgs e) + { + Device.OpenUri(new Uri("https://vault.bitwarden.com")); + } + + private async void ImportCell_Tapped(object sender, EventArgs e) + { + if(!await _userDialogs.ConfirmAsync("You can bulk import logins from the bitwarden.com web vault. Do you want to visit the website now?", null, AppResources.Yes, AppResources.Cancel)) + { + return; + } + + Device.OpenUri(new Uri("https://vault.bitwarden.com")); + } + + public class ToolsViewCell : ExtendedViewCell + { + public ToolsViewCell(string labelText, string detailText, string imageSource) + { + var label = new Label + { + VerticalOptions = LayoutOptions.CenterAndExpand, + LineBreakMode = LineBreakMode.TailTruncation, + Text = labelText + }; + + var detail = new Label + { + FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)), + LineBreakMode = LineBreakMode.WordWrap, + VerticalOptions = LayoutOptions.End, + Style = (Style)Application.Current.Resources["text-muted"], + Text = detailText + }; + + var labelDetailStackLayout = new StackLayout + { + HorizontalOptions = LayoutOptions.StartAndExpand, + VerticalOptions = LayoutOptions.FillAndExpand, + Children = { label, detail }, + Spacing = 0 + }; + + var image = new Image + { + HorizontalOptions = LayoutOptions.Start, + VerticalOptions = LayoutOptions.FillAndExpand, + Source = imageSource, + Margin = new Thickness(0, 0, 10, 0) + }; + + var containerStackLayout = new StackLayout + { + Orientation = StackOrientation.Horizontal, + Children = { image, labelDetailStackLayout }, + Padding = new Thickness(15, 25) + }; + + ShowDisclousure = true; + View = containerStackLayout; + } } } } diff --git a/src/iOS/Controls/ExtendedViewCellRenderer.cs b/src/iOS/Controls/ExtendedViewCellRenderer.cs index ca0de6408..2ebb13e83 100644 --- a/src/iOS/Controls/ExtendedViewCellRenderer.cs +++ b/src/iOS/Controls/ExtendedViewCellRenderer.cs @@ -17,6 +17,10 @@ namespace Bit.iOS.Controls if(cell != null) { cell.BackgroundColor = extendedCell.BackgroundColor.ToUIColor(); + if(extendedCell.ShowDisclousure) + { + cell.Accessory = UITableViewCellAccessory.DisclosureIndicator; + } } return cell; diff --git a/src/iOS/Resources/cloudup.png b/src/iOS/Resources/cloudup.png new file mode 100644 index 0000000000000000000000000000000000000000..66994f79c867ae92077fd0d4f6a6c734c02fb890 GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv9xeFe(K2gt!8^`G@|GB3vOL^2+od zFpT0$g8YIR7@3$^SlKvu`S^uJ#igWWiJ|x_#%q0|$?vICuWyy$6q;ym<> z-EI~Q#y`YYRUiGC@-or9b5~WqrfvVD{M8{(XMJebX?~Z?vDNdg=^>s=QP{A&VY@-#k z7O&#mSLT)JarsN-hg6NF4`wI%iUq0oXUeVe^h%ykG$l>I#P6i%qNJuvtR=_SSavXU z>w~Jm{vl@8y@*Z52$Y-(SSX;uyfUIM}re-YN%OY!nlbttYoO(P} zO1jDQGWWU_8xmZA yIsbO^sw0xGcjh_!y8rq#Gx5%$Jo$ew>lpm@_-Z(~t}p_|7=x#)pUXO@geCy?V4&mx literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/cloudup@2x.png b/src/iOS/Resources/cloudup@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca53c5cd2b27c03456ef42c97e80731dcc4ba0c GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL3?$vW53n&XFwPF}32_B-^AG(WMT0N|O7HMp z1V&FsNswPK10xeN3o9Et2PYRd4=*3TfS|C5sF=8fjGVlJlCqYLuAYIRk%_69xuvzO zoxOvjle3GbmyfTXe?VYpSa@_yY+_PMdPZh;PHu5Yc|~=7LsN5WTSs?K|HMhtXUv*C zcfsPND^{)Fux0D^UHc9nJ$~Zc`HPpY-@J40!J{Y7Uc7w$_Wj4tU%&tS{rBB29VrF| zrdCfE#}En0w+AzoLjoDt9(+G%aZIjPRa8?qYK2PF*7QteSI^Y&POqL$qirXDZ#JH0 zdD!;*JY(bU(VuNjoH+60e1zB@F^g+vB5FU&|9L-O=~Qu~{Gagm8M%B4wfmw^Z>gT! zY;v__rAY2qMc#dRR=?s}rm!x1nY30+Q;XwbEO*c(;brGkmmK)tT%|r?52IAXS=UWc znJF@!Tx%}+C~tc*Ej;we;RD`MQCk}J^cf^8#fn}yv3R4~>gG$k8Dh3xyzwYpElQ)6 zJG)b}o9*G6NquUY{^q}Y6>cVTcj071`G&Y%ubLMZT1k9VT-Ls>sbG`WRz>dHaTk28 zWl{p)E^duI|3Zm}{bz{O28Gf~u3}fZR$j_i478pr>hM-U^w);-&Q@BDQHpQl4nC8c z`@~7}H*4;$1sA-wmTKIMTYk1!&8^qjO&c z%eJZe^p?utmcLwK8Rhcp^e*H*>uPnmCi3>3(_1y5{_0@Al|^ONOjfm(stOka44tkBO~_cm7?{QBVREIL11Kjo>wrIq zXVUHnqPFxM2Pt`Bp0xs~;erVhSOdSrVxZ~H;f<58taQ4=D5b@`M!$H~qM$>JN|YV0-biY@(eX^+Dl$*S~~0-Sw17nK(}y%CgHs_w?} zZS~ybThpW$6xGbgp+kuM4};BH4yNS(nfWSL%he4CCjDa!ece?)^TRhiU?ySk MboFyt=akR{04;fHqQy&>ty;T&!o;%Rx%c4FlV>kpzJB}u z&ReL`^C_Bzsq{ny6z%@A6?yMzK_*;!v**n)>kZkE$=9-d`vYweIJ$%CA z>#ky(SmtXtG31Tk+jON7+q%iV0H~pBw91Z+gb-oX{UCkelHo-JX@U zalO?8U4w0%qO%hZY;;j}H9wp!|0w@_zHoa*CKnSk!-LAnf7S+@i0hafZ%BUd%Hy}h zUIn&`$wEx$TfgqxCvelx_)$iG6VvMNEVq^_?A3Sc@ICgb=&x~-$oZ3t9aC@cGu*tK zB=XgTLx1AI*&h3j{8Db=mEzSfRC8hrrZl)r+c5J7^uXyIlOpKwCUY#c_&2-}-hp zNro;DkvmnP*$LZ8zU9X4rdm1?V9XrcuJ;QKc~%@N%inLj>QWnOWT8c*Xl0)!gI4Z_1ZdU#^nw>zBQ(5EJQQ}W+-Yza@Q9Ad>=Th?* zC%d2R^IeJ)lU?RTJve_=`U}^!?+?%HaOudXQ~GD&)pDS}^GDrEfzIB5?vt$%MHjEN ztrfVz!?1Oe;xp6aaIR@i2@DAiRxa`fT1q-ru0QC8q#%h~N8a7fx#+QK^{euI`gY6rzr3;c zk%{xPzNgd7AHIoru|M~s)!aFgqxU&~_Ooi)5OKE1QCfUXLdNqSo1^}k&*pp-`*TY6 zn%ibYJ#$Ng&t{e%eR{6^p{4fszNIS@zE3SWJ+DVg6AE6w(7%v*MrZoounu5Z#o+1c K=d#Wzp$Pz85`4t~ literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/globe.png b/src/iOS/Resources/globe.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fb1cfbf86ff2e35ded1a1c07bf7c084e420a25 GIT binary patch literal 1255 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv9xeFzyfV32_B-qqiB1q9Gar)Bfa@ z0Hbh9NswPK10xeN3o9Et2PZcVFCV{vppdYLsF=8fq?ELbtek?9vWl9fmbQ+rp1y&h zk+F%HxrMcjoxP)zi>sTvr?-D#P*`MiOl*8|N?LkGW^R5#VR1=mMP*$>Q*%dWcTfMs zNmHiIm^FLBqQ%QrtX;oh)0VBjlA;x)?a@*JmB2kvtIqgkMj?Y2@CyOnq}fTxuRV2Tk%8o zT)UPBN9^6*nT>MtR8~sOQ)3oC88Sz*{*+>cn`>6aqNh)m-<0%ESYvc(P47P2x|lT?bs`S ziyY0pH!-R$t(8{MXP#i-c$Yil+yt5SsUmal@i~>QQ1IyJrev3T9xzB!IvaY>UR!=)Blc!WAzyXIDSO#T_hP#Kb|7Z}o9yk!TMjOt`V zD~*bfgdlj3g6dq{TVQ&c5%`zUhc}iCZ-+d^nHq)$ literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/globe@2x.png b/src/iOS/Resources/globe@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c33e482993530c81afa855cd5535260c6da22268 GIT binary patch literal 2051 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 literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/refresh.png b/src/iOS/Resources/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..5ddde5968226e151ea889d91675f48f22689b1d2 GIT binary patch literal 1017 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv9xeFct>*gt!8^n{h>A%_Nz2H|D=4d|scUL!>**UAo0(f! zTG`mzJ2<+zd;9nWhJ-~#M#sj*Cnlw5WM=0VmzG!7)VFr_^i7;Hea75*iW;FWL-V>kvSuIBWeE(L zV6*&!lv@Muy~gCGY4L?WY*ZqB4{mcl{anRn-Nx0H+^1D?dkarYF=`c;YT=UAzq~n>fiwCao z+t?%0dBGhiTPtnJ7O!*p7dO^v_TAg^=girq$Gfkmmx#vwXAnKJ?y2`RyFQ5m9joNhxU=Svh$HMI~hwHFXV5Eo~ir z149#2Gjj_|Ya3fTdk1G1S2s^DZy#U3fWV-T(6GqpnArHlq~w&0%YDn7rq;HO&hGw+lcr3aK4aG0c?%XTUb<|>+6|kwY~8+d*PeX`4j(;!;?$XQ=PzEq zdj00DJNF(udG_Mv>$mSee*XIX=kLEe7QWufz`(rR)5S4FLUQdvUgzLY2DS&^-@I!! zOl)p#nwVApVOddLKmnp)q*+eo>3x;!rE%F@1X#O=bdEdjhd)Ks=M=m8k(U$-DFmuI^wwG5}8)aoPizK-= zR+r>0V~Xw(e8w@uWc}sdt!z)O*gjEXj5LouwT=0ah`iv0J$~Qg^yWV^Yjk?QK_vUm zL+8fFU%L2z-g+S^|LM*7OU8C@xO6U9vz5gzKGtk}T>A0UhaPWE_AR`>N$1poKJ(0% zY2_S0d(zz^TI6r9%6K|k<4jZj(iM-7Z<7w0eS_KbadH;R2M_V7Ve^}}uDZQNrNACMa2;9le6?U*Cf9rA-KDzyGm6vynU6$OG(eN9NiQOEF=$b3(rNTHWNkwT`#dnp7$*_-NbRm2lW| z))wdGnrD-gZWK)2RQclPExq)WTiF{Tmama_m26)hu$alAM=f>3;ro`3+EW?$0?jyg zGr89-4H9vXPi-zxxKZ4kX2=j95XPQ(jN{P&f+=59XM-= z^M^w^zIq4ueR#1{Vv66THL_(tpP%%R4>^^&EsS%vo^iSjN9$`7ZT6UruV zmGj)Va6~qp)#qJMqE*8pzLXu=+oU#ytx{3aSX9{ibCbHl?1iVYxVNxr>=tuc7`1Ay zX@aJS*XF0p8edGWidipI`*kT~ru)JJT)JmUeGFID?1p34Ub;BD`=n{ov<=UaK(|Zh*>$zSLEW;H8=Tg zC^B&VzUl0SZ!TTyY`N#Ya@{p~O?%uEySqC=+mdPym%Q84z^k9~!e^84Hy8DnM=b4g zUdJqo-TwU$=i|L5Z#``Im-k$sr1PxbY=>f0{jy`Ho|_ivUih2brS*BfjcUN6i0>~u yS>OFCfAja5!JbFl;YYGxzy5a2iD}y({yQJs0xwRPIR{w8FnGH9xvX4;wd literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/refresh@3x.png b/src/iOS/Resources/refresh@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1778dc21831e2f5b96848de1ad160f64cf5371fb GIT binary patch literal 2229 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 literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/upload.png b/src/iOS/Resources/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..c36c2b830e58ea71be65e5110a4fced04f9db508 GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv81Sr2#%6u0Z;ANy#8br*b?zfetk* z3GxeOU}R=tW#i!F;T0AUm6DNDP}DRwadYb_cs@0oz?K^n%__>RB z?mc+)@$=X3|C9u!fhN54ba4!^IQ{nWO}-`r0oDsEcW6Io)6m=TzIyBb|Cvl~Ihw78 zzmgu+E>J9X3MyiMaCm}b@>_GAFnb+8dtJBvIlG?a&JxSr)OSloH+pN|W-ZzL$6HSs zrJcNyc1lF$PROmL@&8?U-xtG z|CKXi1a7c>FyFxx%JR)@_d{704yJyiovq~&N2D_AirP+MkZz!RyKAHPA(pP0YM>Q5m7O52`OnMH4QCoT|EOsBV$uDa~nH*7gslL zzktBdu<+!}?3{wa;*!$3hNjlGj_yg*XUv{EZ_)ZqTet7rclhY>Q)kXyy?*Q7gGVo3 zzJB}uUH#O$Xr4wO#tvPRZO@AA+ebe68e$RI1rR-a+XT5XPrp>F>x_4-8 znxU=Vy=&8^9op)rcNlG&qpf#(*P^0;Td6v++6?avT5UKFv~itb>HD*WCEV)pWUY4_ zPu#verCk41>$~U`db6gdX=hse@64Eb>HMZNR`Ub3H8XQD=brdFLgm+MPuteV`M&zKS@cQOTeg-zr zgwOI`=I!R6y?;6~viqEt@jLUd=g$#OVZXowg$xI>%3d)xFwTnJ7}$8BDDTIcYg_i| zpMSscVQ=<>i_$+Bz3(09z7QO@LsPax_2u0Z9)_mHADf*I$sBQS{-9@Xb7fs$+gqJB QV7g-PboFyt=akR{03`qMJpcdz literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/upload@3x.png b/src/iOS/Resources/upload@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..eafb9d6238485919e411c99447bcb4fbb7456643 GIT binary patch literal 1195 zcmeAS@N?(olHy`uVBq!ia0vp^Eg;On3?$QL6;EYgV6+JE32_B-Uze1OB2q&jwKl;6 z7r7xh^IQ3{1N{T^vIyZoR$pJ6y<7g#E+r4Pr|)I~R0*ae4dKq>96K z%ceC4<}I2j$ocvIe|EtW?v`w?{*G_ z;UDu}JYAf7FCplm)EUh^Y{6ZL&5}p=vk7-CW~*wQ-x&2Ue?e%EQGk}4^a~M3HZ9i; zjc$Tz3j$iCABCTgcocR*@=@pssYf9vq#p&Zka!fdLh@1I3aLi{E2KY&TCwG{&SMN; zn0+ARh4crJK%R)M3^p0p5au?eU5dMy4hw`fCU-15VB`|`K=O;Iri*j<#0!QIrH!*n zWskTv&XMFjVw-bBl=p~i&XG-QiyC@oT(LCV|41q>D|XRNv1N(+Ys~|F_P$6E5yb#KAb7&rP!Ksqz%xxhLC>Rv((XBW&G|l+=^Ij}=&LNl|H4>$^u#&S)({c-Ssr#b<3Z z-Q994eqrQlmyWjwyFM(u9ajEso2k^1s|PD4=iO#yFYIG8e9iM>Tkr3+tN&NG6k9C& z!*{$=$|boV$*$=3HW`<>FND^9X^;N0EtFsXqSnonuVs3PbK@lQR*UCu=#EaAJT<3} zeNpbc3vF$cN6c(Y`&T$!v`J!ous8GY?)}o`zMI?9^10t%NuS*2-#p#bTY4FXwCekH kPM6FC7S~@pAUV~(N_5L!r|KCwz?{S2>FVdQ&MBb@08GF|G5`Po literal 0 HcmV?d00001 diff --git a/src/iOS/Resources/wrench.png b/src/iOS/Resources/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..2a90b09eea2f41b32be635c3dbb8865f8b9f5e54 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6X99deT!Hkk0R`{3PXKzxxg^Lh zn1PXrnT3^&gOiJ!M@UpmQbt}`RZU0Nz|_Lh-qp?B)5|w7C?qbkw7#jit!MhIdCRtJ z-?{I=!Bc0h-n#eV<@=AHfB#LIWGDhOZk?x#V~E7m+zUs=4jBkITx9GLE&u*#9c$PA z|Nqs+j$ZmS?R!d*n&8iq!O^kbn^&x0^=)vE4(;bO=(pgz-WVMpoc0 z>5(-3|3k$CTbK4L{<)gfQ@(h;--)ugtY7xl=N|~^&t+V8D|#)xmQAt@|%+ki*!O_XtH!vtP zJUS*WDLp5*ps=*OqNcv7wXLJGXVUapv*#{Yw0PO-4V$*^+_h)l@l$8cU%z?h-h)Ta zUcP?&{^RGb-+%u8+jSzb02r0Uo-U3d5|X_KGp(fqCDC{WO*|2S(X1g>8@#=Ywurw&VHJiY5EVV-fr;=yrPkh%^i$= zPk%4Vn6&1k>cTGZOp)g-yZlYek_s}GUgTY_DJ3^&TV_Rp)slw?S2`SSzO2d1-*!e! zPWhBwZ(Rt_(-U?sk%?EQvoPgKvL$tVYMB-?dCw=wADtRXl~H*`I?`?})3YT~Bf*(z3pE7m&g2gLVtzNrn*Pf%tPnEaj?aro`E@ZduZBCHRDSwuq)#BEGE-o;vd{D#BC6%#)HuW#q?5SnDTbN9I) zhbkBO?Ay7!`a6?=#mSw2Yjy_hxi`bdK{faD`9CKwC(VwSQMK6k+6JDEITxp{^5_t? zZIPUqu(S2BU+0B)>mF|N-zF%2wqdH!yrU(XH)z?O|FB!w;-!%JktXH}nSd9k#Mu)y zIQE`PT@ll}#ctwdb)VWpm(*9)xwJ2gbTv87yml{#?(HXYKe&`xN$r!?ocLtn2K|WG zRq>nNoxY{M`OrI+OkYU`C+)A_Z4X%o?ap?V_$BxJ`=!~xrd~RKI&l8;?Tgn{UYxSY zKRRXR#~D$5Jij@&Bp>*xe`w=+hj~?gAFAXI{bQQ>?Vqfo=e{yF!HnV z%(*4Lg2R1b1Jloo{0X~$=5RN2=u9Y+a;R9i(Ldjfx6|R14jaSXmvb^hxx%f5@7CGQ zEnR>6oQvvaz1KVc-oE9uO?6Alv=8DBLsybah + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +