From 9131d607f7cf2c01c81ac492c25bed1b7e6f18f3 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Sat, 19 Jun 2021 15:18:30 +0400 Subject: [PATCH] Rewrite default pattern loading --- Telegram/BUILD | 1 + .../CachedResourceRepresentations.swift | 9 +--- .../Sources/Themes/ThemeColorPresets.swift | 19 +++---- .../Sources/Themes/WallpaperGalleryItem.swift | 2 +- submodules/Svg/PublicHeaders/Svg/Svg.h | 2 +- submodules/Svg/Sources/Svg.m | 6 +-- .../TelegramCore/Sources/Wallpapers.swift | 2 +- .../DefaultDarkTintedPresentationTheme.swift | 4 +- .../Sources/DefaultDayPresentationTheme.swift | 49 +++++++++++++++++- .../Resources/5789658100176783156-m.resource | Bin 0 -> 20718 bytes .../Sources/FetchCachedRepresentations.swift | 4 +- .../TelegramAccountAuxiliaryMethods.swift | 31 +++++++++++ .../Sources/WallpaperResources.swift | 19 +++---- 13 files changed, 107 insertions(+), 41 deletions(-) create mode 100644 submodules/TelegramUI/Resources/5789658100176783156-m.resource diff --git a/Telegram/BUILD b/Telegram/BUILD index f5b00ade87..0bcde3fffd 100644 --- a/Telegram/BUILD +++ b/Telegram/BUILD @@ -1469,6 +1469,7 @@ swift_library( "//submodules/TelegramVoip:TelegramVoip", "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/BuildConfig:BuildConfig", + "//submodules/WidgetItems:WidgetItems", ], ) diff --git a/submodules/MediaResources/Sources/CachedResourceRepresentations.swift b/submodules/MediaResources/Sources/CachedResourceRepresentations.swift index 266224f3d5..210abd57ca 100644 --- a/submodules/MediaResources/Sources/CachedResourceRepresentations.swift +++ b/submodules/MediaResources/Sources/CachedResourceRepresentations.swift @@ -121,28 +121,23 @@ public final class CachedPatternWallpaperMaskRepresentation: CachedMediaResource public let keepDuration: CachedMediaRepresentationKeepDuration = .general public let size: CGSize? - public let scaleFromCenter: CGFloat? public var uniqueId: String { if let size = self.size { var result = "pattern-wallpaper-mask-\(Int(size.width))x\(Int(size.height))" - if let scaleFromCenter = self.scaleFromCenter { - result.append("-scale\(scaleFromCenter)") - } return result } else { return "pattern-wallpaper-mask" } } - public init(size: CGSize?, scaleFromCenter: CGFloat?) { + public init(size: CGSize?) { self.size = size - self.scaleFromCenter = scaleFromCenter } public func isEqual(to: CachedMediaResourceRepresentation) -> Bool { if let to = to as? CachedPatternWallpaperMaskRepresentation { - return self.size == to.size && self.scaleFromCenter == to.scaleFromCenter + return self.size == to.size } else { return false } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeColorPresets.swift b/submodules/SettingsUI/Sources/Themes/ThemeColorPresets.swift index 57ae641180..c98bb9931e 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeColorPresets.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeColorPresets.swift @@ -2,32 +2,33 @@ import Foundation import Postbox import SyncCore import TelegramUIPreferences +import TelegramPresentationData -private func patternWallpaper(slug: String, colors: [UInt32], intensity: Int32?, rotation: Int32?) -> TelegramWallpaper { - return TelegramWallpaper.file(id: 0, accessHash: 0, isCreator: false, isDefault: true, isPattern: true, isDark: false, slug: slug, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(colors: colors, intensity: intensity ?? 50, rotation: rotation)) +private func patternWallpaper(colors: [UInt32], intensity: Int32?, rotation: Int32?) -> TelegramWallpaper { + return defaultBuiltinWallpaper(colors: colors, intensity: intensity ?? 50, rotation: rotation) } var dayClassicColorPresets: [PresentationThemeAccentColor] = [ // Pink with Blue - PresentationThemeAccentColor(index: 106, baseColor: .preset, accentColor: 0xfff55783, bubbleColors: (0xffd6f5ff, 0xffc9fdfe), wallpaper: patternWallpaper(slug: "fqv01SQemVIBAAAApND8LDRUhRU", colors: [0x8dc0eb, 0xb9d1ea, 0xc6b1ef, 0xebd7ef], intensity: 50, rotation: nil)), + PresentationThemeAccentColor(index: 106, baseColor: .preset, accentColor: 0xfff55783, bubbleColors: (0xffd6f5ff, 0xffc9fdfe), wallpaper: patternWallpaper(colors: [0x8dc0eb, 0xb9d1ea, 0xc6b1ef, 0xebd7ef], intensity: 50, rotation: nil)), // Pink with Gold - PresentationThemeAccentColor(index: 102, baseColor: .preset, accentColor: 0xFFFF5FA9, bubbleColors: (0xFFFFF4D7, nil), wallpaper: patternWallpaper(slug: "9GcNVISdSVADAAAAUcw5BYjELW4", colors: [0xeaa36e, 0xf0e486, 0xf29ebf, 0xe8c06e], intensity: 50, rotation: nil)), + PresentationThemeAccentColor(index: 102, baseColor: .preset, accentColor: 0xFFFF5FA9, bubbleColors: (0xFFFFF4D7, nil), wallpaper: patternWallpaper(colors: [0xeaa36e, 0xf0e486, 0xf29ebf, 0xe8c06e], intensity: 50, rotation: nil)), // Green - PresentationThemeAccentColor(index: 104, baseColor: .preset, accentColor: 0xFF5A9E29, bubbleColors: (0xffFFF8DF, nil), wallpaper: patternWallpaper(slug: "-Xc-np9y2VMCAAAARKr0yNNPYW0", colors: [0x7fc289, 0xe4d573, 0xafd677, 0xf0c07a], intensity: 50, rotation: nil)), + PresentationThemeAccentColor(index: 104, baseColor: .preset, accentColor: 0xFF5A9E29, bubbleColors: (0xffFFF8DF, nil), wallpaper: patternWallpaper(colors: [0x7fc289, 0xe4d573, 0xafd677, 0xf0c07a], intensity: 50, rotation: nil)), // Purple - PresentationThemeAccentColor(index: 101, baseColor: .preset, accentColor: 0xFF7E5FE5, bubbleColors: (0xFFF5e2FF, nil), wallpaper: patternWallpaper(slug: "JrNEYdNhSFABAAAA9WtRdJkPRbY", colors: [0xe4b2ea, 0x8376c2, 0xeab9d9, 0xb493e6], intensity: 50, rotation: nil)), + PresentationThemeAccentColor(index: 101, baseColor: .preset, accentColor: 0xFF7E5FE5, bubbleColors: (0xFFF5e2FF, nil), wallpaper: patternWallpaper(colors: [0xe4b2ea, 0x8376c2, 0xeab9d9, 0xb493e6], intensity: 50, rotation: nil)), // Light Blue - PresentationThemeAccentColor(index: 107, baseColor: .preset, accentColor: 0xFF2CB9ED, bubbleColors: (0xFFADF7B5, 0xFFFCFF8B), wallpaper: patternWallpaper(slug: "CJNyxPMgSVAEAAAAvW9sMwc51cw", colors: [0x1a2e1a, 0x47623c, 0x222e24, 0x314429], intensity: 50, rotation: nil)), + PresentationThemeAccentColor(index: 107, baseColor: .preset, accentColor: 0xFF2CB9ED, bubbleColors: (0xFFADF7B5, 0xFFFCFF8B), wallpaper: patternWallpaper(colors: [0x1a2e1a, 0x47623c, 0x222e24, 0x314429], intensity: 50, rotation: nil)), // Mint - PresentationThemeAccentColor(index: 103, baseColor: .preset, accentColor: 0xFF199972, bubbleColors: (0xFFFFFEC7, nil), wallpaper: patternWallpaper(slug: "CJNyxPMgSVAEAAAAvW9sMwc51cw", colors: [0xdceb92, 0x8fe1d6, 0x67a3f2, 0x85d685], intensity: 50, rotation: nil)), + PresentationThemeAccentColor(index: 103, baseColor: .preset, accentColor: 0xFF199972, bubbleColors: (0xFFFFFEC7, nil), wallpaper: patternWallpaper(colors: [0xdceb92, 0x8fe1d6, 0x67a3f2, 0x85d685], intensity: 50, rotation: nil)), // Pink with Green - PresentationThemeAccentColor(index: 105, baseColor: .preset, accentColor: 0xFFDA90D9, bubbleColors: (0xFF94FFF9, 0xFFCCFFC7), wallpaper: patternWallpaper(slug: "mP3FG_iwSFAFAAAA2AklJO978pA", colors: [0xffc3b2, 0xe2c0ff, 0xffe7b2], intensity: 50, rotation: nil)) + PresentationThemeAccentColor(index: 105, baseColor: .preset, accentColor: 0xFFDA90D9, bubbleColors: (0xFF94FFF9, 0xFFCCFFC7), wallpaper: patternWallpaper(colors: [0xffc3b2, 0xe2c0ff, 0xffe7b2], intensity: 50, rotation: nil)) ] var dayColorPresets: [PresentationThemeAccentColor] = [ diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift index e9dcbde476..10f2131129 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift @@ -859,7 +859,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode { let dimensions = file.file.dimensions ?? PixelDimensions(width: 1440, height: 2960) let size = dimensions.cgSize.fitted(CGSize(width: 1280.0, height: 1280.0)) - let _ = self.context.account.postbox.mediaBox.cachedResourceRepresentation(file.file.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: nil), complete: false, fetch: true).start() + let _ = self.context.account.postbox.mediaBox.cachedResourceRepresentation(file.file.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start() } } diff --git a/submodules/Svg/PublicHeaders/Svg/Svg.h b/submodules/Svg/PublicHeaders/Svg/Svg.h index 8ba7bec9f0..440279afcf 100755 --- a/submodules/Svg/PublicHeaders/Svg/Svg.h +++ b/submodules/Svg/PublicHeaders/Svg/Svg.h @@ -4,6 +4,6 @@ #import #import -UIImage * _Nullable drawSvgImage(NSData * _Nonnull data, CGSize size, UIColor *backgroundColor, UIColor *foregroundColor, CGFloat scaleFromCenter); +UIImage * _Nullable drawSvgImage(NSData * _Nonnull data, CGSize size, UIColor *backgroundColor, UIColor *foregroundColor); #endif /* Lottie_h */ diff --git a/submodules/Svg/Sources/Svg.m b/submodules/Svg/Sources/Svg.m index 08dbba0ab9..eb56cc50cd 100755 --- a/submodules/Svg/Sources/Svg.m +++ b/submodules/Svg/Sources/Svg.m @@ -83,7 +83,7 @@ CGSize aspectFillSize(CGSize size, CGSize bounds) { @end -UIImage * _Nullable drawSvgImage(NSData * _Nonnull data, CGSize size, UIColor *backgroundColor, UIColor *foregroundColor, CGFloat scaleFromCenter) { +UIImage * _Nullable drawSvgImage(NSData * _Nonnull data, CGSize size, UIColor *backgroundColor, UIColor *foregroundColor) { NSDate *startTime = [NSDate date]; NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; @@ -128,10 +128,6 @@ UIImage * _Nullable drawSvgImage(NSData * _Nonnull data, CGSize size, UIColor *b CGContextScaleCTM(context, scale, scale); CGContextTranslateCTM(context, (size.width - drawingSize.width) / 2.0, (size.height - drawingSize.height) / 2.0); - - CGContextTranslateCTM(context, size.width / 2.0f, size.height / 2.0f); - CGContextScaleCTM(context, scaleFromCenter, scaleFromCenter); - CGContextTranslateCTM(context, -size.width / 2.0f, -size.height / 2.0f); for (NSVGshape *shape = image->shapes; shape != NULL; shape = shape->next) { if (!(shape->flags & NSVG_FLAGS_VISIBLE)) { diff --git a/submodules/TelegramCore/Sources/Wallpapers.swift b/submodules/TelegramCore/Sources/Wallpapers.swift index 77c9ec5d6e..59b32a0346 100644 --- a/submodules/TelegramCore/Sources/Wallpapers.swift +++ b/submodules/TelegramCore/Sources/Wallpapers.swift @@ -7,7 +7,7 @@ import SyncCore public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: Bool = false) -> Signal<[TelegramWallpaper], NoError> { let fetch: ([TelegramWallpaper]?, Int32?) -> Signal<[TelegramWallpaper], NoError> = { current, hash in - network.request(Api.functions.account.getWallPapers(hash: hash ?? 0)) + network.request(Api.functions.account.getWallPapers(hash: 0)) |> retryRequest |> mapToSignal { result -> Signal<([TelegramWallpaper], Int32), NoError> in switch result { diff --git a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift index 9d35c1c9e0..5b5ce5bdd9 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDarkTintedPresentationTheme.swift @@ -48,7 +48,7 @@ public func customizeDefaultDarkTintedPresentationTheme(theme: PresentationTheme if bubbleColors == nil, editing { if let accentColor = accentColor { if let wallpaperGradientColors = wallpaperGradientColors, !wallpaperGradientColors.isEmpty { - suggestedWallpaper = .file(id: 0, accessHash: 0, isCreator: false, isDefault: true, isPattern: true, isDark: false, slug: "fqv01SQemVIBAAAApND8LDRUhRU", file: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 36542425), partialReference: nil, resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), previewRepresentations: [TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 600, height: 800), resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), progressiveSizes: [], immediateThumbnailData: nil)], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "image/tgv", size: nil, attributes: []), settings: WallpaperSettings(colors: wallpaperGradientColors, intensity: 50)) + suggestedWallpaper = defaultBuiltinWallpaper(colors: wallpaperGradientColors) } else { let color = accentColor.withMultiplied(hue: 1.024, saturation: 0.573, brightness: 0.18) suggestedWallpaper = .color(color.argb) @@ -757,7 +757,7 @@ public func makeDefaultDarkTintedPresentationTheme(extendingThemeReference: Pres ) let chat = PresentationThemeChat( - defaultWallpaper: .file(id: 0, accessHash: 0, isCreator: false, isDefault: true, isPattern: true, isDark: false, slug: "fqv01SQemVIBAAAApND8LDRUhRU", file: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 36542425), partialReference: nil, resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), previewRepresentations: [TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 600, height: 800), resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), progressiveSizes: [], immediateThumbnailData: nil)], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "image/tgv", size: nil, attributes: []), settings: WallpaperSettings(colors: [0x1b2836, 0x121a22, 0x1b2836, 0x121a22], intensity: 50)), + defaultWallpaper: defaultBuiltinWallpaper(colors: [0x1b2836, 0x121a22, 0x1b2836, 0x121a22]), message: message, serviceMessage: serviceMessage, inputPanel: inputPanel, diff --git a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift index 4d6bb7998f..394be80e9f 100644 --- a/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift +++ b/submodules/TelegramPresentationData/Sources/DefaultDayPresentationTheme.swift @@ -738,7 +738,7 @@ public func makeDefaultDayPresentationTheme(extendingThemeReference: Presentatio badgeTextColor: UIColor(rgb: 0xffffff) ) - let defaultPatternWallpaper: TelegramWallpaper = .file(id: 0, accessHash: 0, isCreator: false, isDefault: true, isPattern: true, isDark: false, slug: "fqv01SQemVIBAAAApND8LDRUhRU", file: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 36542425), partialReference: nil, resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), previewRepresentations: [TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 600, height: 800), resource: WallpaperDataResource(slug: "fqv01SQemVIBAAAApND8LDRUhRU"), progressiveSizes: [], immediateThumbnailData: nil)], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "image/tgv", size: nil, attributes: []), settings: WallpaperSettings(colors: defaultBuiltinWallpaperGradientColors.map(\.rgb), intensity: 50)) + let defaultPatternWallpaper: TelegramWallpaper = defaultBuiltinWallpaper(colors: defaultBuiltinWallpaperGradientColors.map(\.rgb)) let chat = PresentationThemeChat( defaultWallpaper: day ? .color(0xffffff) : defaultPatternWallpaper, @@ -841,3 +841,50 @@ public let defaultBuiltinWallpaperGradientColors: [UIColor] = [ UIColor(rgb: 0xd5d88d), UIColor(rgb: 0x88b884) ] + +public func defaultBuiltinWallpaper(colors: [UInt32], intensity: Int32 = 50, rotation: Int32? = nil) -> TelegramWallpaper { + return .file( + id: 5933856211186221059, + accessHash: 7039846297018949116, + isCreator: false, + isDefault: false, + isPattern: true, + isDark: false, + slug: "fqv01SQemVIBAAAApND8LDRUhRU", + file: TelegramMediaFile( + fileId: MediaId(namespace: Namespaces.Media.CloudFile, id: 5789658100176783156), + partialReference: nil, + resource: CloudDocumentMediaResource( + datacenterId: 1, + fileId: 5789658100176783156, + accessHash: 5949005087206403318, + size: 183832, + fileReference: Data(), + fileName: "pattern.tgv" + ), + previewRepresentations: [ + TelegramMediaImageRepresentation( + dimensions: PixelDimensions(width: 155, height: 320), + resource: CloudDocumentSizeMediaResource( + datacenterId: 1, + documentId: 5789658100176783156, + accessHash: 5949005087206403318, + sizeSpec: "m", + fileReference: Data() + ), + progressiveSizes: [], + immediateThumbnailData: nil + ) + ], + videoThumbnails: [], + immediateThumbnailData: nil, + mimeType: "application/x-tgwallpattern", + size: 183832, + attributes: [ + .ImageSize(size: PixelDimensions(width: 1440, height: 2960)), + .FileName(fileName: "pattern.tgv") + ] + ), + settings: WallpaperSettings(colors: colors, intensity: intensity, rotation: rotation) + ) +} diff --git a/submodules/TelegramUI/Resources/5789658100176783156-m.resource b/submodules/TelegramUI/Resources/5789658100176783156-m.resource new file mode 100644 index 0000000000000000000000000000000000000000..ba42f37225022d2c36c02cb844dfd653277db24b GIT binary patch literal 20718 zcmV)UK(N1wP)Htv?*QkAyt%_d0{8{+98gmq1P$N~U~Awc;I5SC_61fUO_qw@ zz;a-|%gy*@5r5B9z#yOJ9|C%1_>7}~4Zt2Ty=RqX-LC`6>x-a)j-7JgWpt!k*b-Qc z|M5|Yj@@$|k2M2sF5>UG5FO)QIM`?eH#9LfaT(AlhWDxznKAE~4N>p#B~StU2`Fu%|G@Emme+>M`@z`hB$75@BTy8S|UxsWr%niGvh`;B1U=ccI zysl#@@K<0K&<6Mb7>~4kF;QhU>Ud;VzHffZ4B%fuKcr=hg>5gRnN~O+>kB;L^Pa;< z)?OzAbBs1w6NBH>fppCrXH+AqXalktcgW|%HsDPY6dUEp z*^Q$}_h^fSn}LZj7qTkgbaZO`3j1`(3!M=0wt#q&Z_|OFfSnzWy$Eb?{(Ub}<$Yb= z+s+7P1#knhf8v04z%wxxv;%>4h$h-P%nxpAcG?x@CdQ3~t3)L2-Hyk0M?6|NB6{b$ zEK0e#p@$&aV6EA$*8m_0f zT$C4njyyA`aGe2sf{xNTz_o}bc?~%iAdR;QY4B{()(Bf?BW%Zq{F?@&}Z8yB6w8?{|6Z2;fdcfuw{j?Ed(Tpp_i{(ubFYIFp>N^uEMCwd_M?Q`IEBUlrWcDn@~3m1^v(OE2X zMjG^Hk9!gZ>VR7j;eBvie)u84RVj~+M9h7h&<>Hf7n|!n6CJ4)F}u#7C&0dhmLc~y^@5H99;>G}vA&@*qFO#gj!`a#djf^}?nbB7HAu4+4G9-P zyW0qrC0NaYX~3SqB;boiStuCV0{fucwJPLDtVJI9x4>V39}pMW5^1o$D5TU3X~-pr zwEue!vN0OPK{q1KvIO|iJa)F(46A{6%{BcLRM-+Iobx&2TtG(nB}NFRpya=(&=c`v zzd>2KjYwAngAiTP+Xz;3lt=b2;P>W+zk!ku{+8$WT@Q2x9z_WR4+A#>!_g`C6)@EN z8HPOnWk$FkN7~dAR{{4p1n@)@+3$($wbvtD$b(R(!w)F`Y(PB{f>IQyz8B@2?M?C0 z&cnn>BzyZcMvDzc&SGjUNHe5`Z!|*xB&tDZm8#ut03LCCcoj-%u>#zkk;;q${mjL; zKz8Cx( z3A4~U`h3R2NCnp?oPwyKo*7;@9@(W=A&2Naq!kk}{7oh1`rNW>>X0oTmMsrzd#oL(YCm}o04`%}Vxja4`#c7AeRN!tx)Xh%Fh)&hq z36$tC!~DMmviH72w(9Vh{hobM4Al$MkRuQXr5=x;MRLMoHaNrxgcAc%#zuQYskG1V z8ADP8vI>}oQi$G1gk>C&FxUB$5uTwPEbSv4&Y%l|#fkgbc!?^#N^1Ls5u;@5V| z^$SLzwg$Pz&`v~!CaD;Y$i6EAd`3CajtR5-Uq<t@tiEj^y5|p&?DcR@l_eSBu z?@(evF^|@5ku#GC+n}R1>kN_>W=C$B$3@P;yNKpglI=G?EJ5tFMH@Kr5%CVVmmm%I zHMylZ9f9oL=TJ#sF>n{+%Yxtnk{OIZ68Z{xs6>N#gwu;+D$;~Ux;z($vb;=4AgAFQ z>_X{GuXmy)qK4MuZofu}-sm(5s#&d?kBLFvGZr0N+l6qUPY_-OGHu5MG4sydTsGRXp3YS5BKiPAEtx;_IBgDbIfHI}mqnJA&9%U^d)drd` z+$xKk+@9?0uXc!|3k!Q-XH={unxc=bQOxjB(rue6WFueV^Zw3=l3IsCd{Lr1$%WzB zqKo;x?NT?_BS`&)8NXYJDwF(BgS@W|C^ott1#g3dsRoc6(d>pM<_22V+t=*M#|Xaw zq=ONvm$0*OJ0be%O)~R}mB>W-E72A?Ux~Zvk~hvEdtJPbq5r_Z_)AW0xQeS%R2@FtzYn>QQR_ z7kC@OAWp`wsAE-z#e0Zw%g=u6bJMp#^uq$e4WCt_l%!R7hXW_zZC11e{*Cy?pHNq) zUxajR7a?30XY*phWz~ppd)oAHucg6MO^&wC<@)Zj>_|XGMi=}{7;r_gl=2&*-OxgwFqVL zhHcB{j5qP`lz2Mc!P`;D#rMK7W;ch8gHgtECTwd2Zl939f1tUk&k#H=`X=x!N}xCp zB~#pmG~x$@ldMo;lt%(NcDo{?`Ay`^U4g=zr4$LhkqVxTd+npeHZQ=Y97>Rv`7!>1 z-v^CAhK*8GB@`r-)(I6thu!<5HHwS=5rwP#20gSpA;P|o1xq}yxfpmM)_x{LQi)l!+z9HpZzHXHF|icov8 z6N<6DfP(6&s5Xn?MU|AHoT?Yi=M0SSTFcP!(<|WXo1-Lw=@DGZRw(cP-zdRyCE_oC zKsBJw(AIEdx4lF1snFkOzZ3HmwnwsjPZ!jGZX-&99StN3nZDBBNPZv0fUibTgRjj0 z|6^`;Ejk9aMv;P2}qs0=Ym#mNKFUs#k7EbxPc@q|br#kh^-?7%wk6oTRaYhr`n;2 z#tLM1%*S@HnwcBiErRdwg6zlLQ50u_*^qU3^K1!ZYsRhJTI?_!G3VLxMmJ#Fdt0IU z%4OtMspdpejE`JQq_ ziA+G%Nhct0{8jvWWCRtsgGi=;njuZM9@%kY3a~E2kf-Yw?XX4%tOy{GjW8I4?4u8n zk(&*=BLezcY|YpNWidCD8(=vjw;?CuR-|DcBYyR-vBvo*G&T>#2EQeERhWgNNKYDQ zi>QQF4P>1XC_K4`5wO}u(a9cfW0%lXAbTj6_VI4nD+i(>AY%|OS06f>hbEbgNXJ7& z+u~sz7KjN}( zM@L~#vk4}l*;#L(EQefz-0gv1o6pWAgR~Q3=(`qR9l9gitxzaIxoQuY4S74s1=|e{ zbI_6JRkbt#<-X;UZCZj-ZZ6O9{Rg0I;zG3OS{b2sIS3VZ4>bSpMS4%;3&_oM=s?U( zvdM@7@apSThP2xD9?y3rxHC|R2-aNtWL!z|oQN>c+FZ{z*r`HMQc=63iY>o2>x!ZP zK~Zhi#;_Q$Vrj~Yxe+Tn9V=R}2TjWBG7Vzo|8BX~{4 zUZnSM8%H{YQ%aGuK9*rObatWx@=9l+y!nIi_CAkCIcLrvI|~2CG}n?}@3^Ms23Uq)=QTu!r1tkHLu&gml&yLT;;#If&K!=$D&~VKbbS1hVEsR=i6}w3akfI) zA}!2%%%rebjQcEy1R8ey2|67np*oFIQTn&lQK<`AbPq2SzH;2S1!iIW;)8>YM!AvX z#K01CiAuJqdG|@30&v!=J*0RwiAdTq6k?450@N?|q=Tp$6oI>Js^PAp4PTYqm zT`CnHy4;7|aUT)oyKAE^p+C)BY%U!Rr=nDAx61f6DZ6q@qaB_@{mj~$|A&PNM2mcZ zim6jE7tsP1M^}b4^a#gmdXQ|WpY9O0rX&xoD-=qRM)k|Pn@_rfb`A2jGom-DVEzKt z2;NWT;TXAM2JTrE;|SL1?*`mctUpir{|J)H&`QbN(kt6db3fji`EAncE!!BaVF}#v zBvUf?lWdJRJ9Cl0B{(#BYU#$)wW}8kkl&V`JIm#ZKu}hhB{4# zg({<^yt+PqfVA-WF3**jO}lKm$A8LzygR zpksD1B9pDz>GM#^RFJ&9MPy$_Snu#Y!G~mJi#_pgm>d-Ivb@HVh_{=)>+FSWnvIBVa%N4BF^~13fnj^pweShVWIu$O$wgVl|1A0S#@&lx?KeTmkC}S) z76QAQ>zImnWm7Z6z;7VDVRNxT2gInSCMeD!+BBC@$gaudh^R!A%?=q}HxSvJFB6|E z(mFIr`E8V{bTG=oH~~2rpCX5#wxJ1H0`WslNcRq>pm4>75q|$&sE=8;9_1aVD(G~V z=X#nOxEqQ`{tS84KN2r=L0PlikrVMPI$eH)dgeArT#NhQ)v@NLMu{pERDXbA{lv;q zM!_4{anUPDu3Wzq(I_uOyippF1G*vpCzWvQN^;yQ>Ro=l+0oWmCs381l#eNuv3MVWqLvcq7TVoG@s6-JD zivTV~+HD791D;`oHy@OlYgkS0RauR2L8XUaZKQCGXS$*>I2%!L+A5Z~1=*GB2-Yeh zfdbrp^SqwnDB4htv}85$LQCXi)l1F0o^;OYb?k!GN}`*rVqqxCAowH7JF7GTHVyYw zWjE}GG*Z5(LuSMo6t-|U2%4JB_W+_&I>g|bN>HlQtB4b)LZWjAFGM!b z$B4;ZY5rVEG!25C-aI*{z(6aoAI8OraW{Hh5k3-uM?&xGG@JzL7?@H`$I8zC~ zL*s1(_X1m@-1jI(_%syEMikBxq~&@b{_MjNJTT?C-bllRiIcKegu`iM`7EYC?8By@Fsng3ru+l=yLBam3Y#Y)!?sh%#DEaPr)VzDNoA)v6@< z1Y?mQncBf-Fyd-{iQL)dE+159E;LM(5^NrPd+J~HQL%6=YRNUk<+=VSZR^iQsbq^S zP`&F?@d5E3=(r6N=VL6Iux@td0X6E}B z$Yv}SnxjmV8D^dKBEC(Kw>QG(w^HXO#T;8A{H)!2DT+jP6@; zA0<>wR3ff4m4tO-E~>X(f+7Q{QHp^>`2)Wfr9ky_};qQ@KDPAUYBz@4B z6MK?hCrLLPPUcqh`=G>y$+&k@YKpRtH{yO|6%#8_?D-Ur=S$6+PDP2WS5TnLp9&+4 ze?dHr8%Cq!Hp<26;_=*LD6|z8E=C!?Yw#{M*$b69b_wu#gAkuJ48<=`Gi!An(%PLU zJg!AF$cK1)pKTm#un2jop(26u;SVy4@di3FA4VY$ui}!2i8jS$HtzOA2ZA{eK`|Kd zP*rAe_j7qoo%zmgS$yV=$WB^`wB1oiBVJ=Z>nRFb^)&%8{Ew2{wks7wu}4)tjeCE# ztT7j*5q*K&*PD#M1sS|>5XnvKqCjulJ>A)an*?x`(KaC4>sFMHH4`1H-H>g2dce5wt?J8$XNW)R^(;_z4qr$e@1$?;!OsM2g;meS9a32KYVl zPIE;|v!**1U_Ga!+{LMgVems+BV={JVd(TLNQ!(3;!3lZVHC8CV-+4&>P&5RmbB73Z<* z5#Bt{Y_J3w+?~)78g@$4ZDeNz--@!Bok^Zgkbjo&izu#m7COG?BC<8?&P%^RC(~&J zs}Ft%nHLGO!OjT#23I2|;2~s84y1S(hcbh&BeyJGKb&Yj+iI>8WSmbaHg&Nt`Oz>3 zqV{ADBJKJwq&;^4OSyUA=D?}*~( zRxtlcG84p`6%KMN;(p{#OzvwIx|rs`;p7*waAGua3N182$7`m+!FOZ#_Nzg;gyFUnAD>G+h#XQQ0Fpm>4Cf^i0*a9NOD+7%@}rq2FM#l?ghX~_mh6TU}m zWxu3SI+v2(QQiwvke1x+F&6P`(@^LqVg7VPHp)3Dn&MWh?S|)2vz=mKTkQB|nAir{ zZ%$h_LGUgUT zQjs4b>fm~U#Tes`kI0Xt&DY)Ejm+bl64)6Q)riW8va&6KoTyw&`5wa2N-cr96a5jT z*X)Woqz$O&Lo0NC{{w}2UP9i==jQz-CiF&3quAnG0dL}b)I;PmvndL_R((+HGh5I5YyxWEPG$#L zvkzt?*8K})6n}^!{rM7j?NPzWt3;Q)nTk5>c~@3z_k&OsmlY)#8KU;s(rn6&=B6z| z$pArw=6H0xzd$rSRf3|wxsFs4d<5bf-LMt1?S0V~scpBh*v*j_^eMUZ^76t^b799s zyl97*8-5Jwp4Mn{4HuXlc}Wp(ZW$s+pEH8Lh~lH0Ss&+2g$hI)UFNZQd{2yK$oAUa z@nQR#8*mY-RcMB&g5@C#T&=nA$q_Bq!A3*)b*ijFrE05zeFk7Knyb(YAJto!&B$*q%yBG0E5x#Z3t*b;U6c^nzM9kBbhy^idPFfjzCc zd1JSrB8cO$=RkErk%Es=q`{eLV-bBzx*W3UE6(A8|lOVBCc+9hcq(rEuirCkfKnct_8_u&@Ku_|-U!|rbuHWm?nBbi)q zB=93@uH#1cY=b&(uRxB}6mrYSuR^E9LPQ4*Lbl_16rTXkgeItuT^gK*@;hd6{)XNA z>=X0cc+`L5J<@Z#taG{s@o!P!9ExAL)5HkbFmzn5MMuVDbRwLD4CcQh=V_x^L$A1T zIXXR-n05OOHLCdz_&-FFKZcy7x6R)@ktf}S_@WI8b*7=rMfiS1P46m!|2UpoK)UPQ z(JZd@C13emL`Sn&Un64h$1HxpYI6feps-0XFb5IZub4lrkps1j5yWp%G-Z{!#`Z>F zescM&4k+{Y_eN`VHEUgE?!jM4pC$HJU=nJ5@DfUzyxHY-#l{Z=OlT-^Xs5^V&rk)i z{`;DL&&RzDL2pD#{u=Rg3y^(y9oc!B`(RgL7a9YRRu5W)TWhqEFf@$Vmd7@|ll8)6pevk-)GU!`I0B+z#1s zZUpFLv#XpfmbOOTSTiF`lgw+jN3Q!)#M!MekN*;RT2?&rb}~~3i_o#t%Ixk!1f!=D z&GZ@z-I3NTMiN3)IDi11ssZ@U%uQWqcB)rDxOwLDSE3{8Lv%dv9MPiHqPSj5qQ#@;1~n8^lOB9eGnt-1 zArWivSOwxs)*%n|4dk(wWVk`K=m`0g%(JI@AjA7pWPhB6j$XHTYfI8AnffB0@E3$1 zzbvIN?F4$6O zf_cx+k=9&{JhmXLd?_NGuc!WEHyTzKpmWfvbGf;f3qUcgwWtok%E~Q4ZuL@>C9$1Z zjMGp?>!&E`Zz1wDUm!UcI~VVsW=;X$o#bqQIu!Og&j|Nqbc~%wFvs9tq8ZrMi0siC zorXUlt=0t;)AFJq`XMj#CX^g^tP#9ab>9aav0Iw|ZzR0{B!N=I&qcJ#6UdeunDV-& zh#Ij1-OW*m?6)ZY%rBX-26=pq^@{PpYba2k)zI8F*d4>i;%*!L47;`aUs9f{My~$@ z$Z5!QTudW9&e{aUYTqI~2=2s8qEEhTL@>-p^wt`(=({@#9kqv>H?Kq;9G%z?yZ710 zq^B=CHPSHDe8j7odj{TRZNtpPUy6H*^jNa%OVNnvP-+xIR;lckX0ocI2O*>HG3+C& z19o=Cz4%uPU4pcaS1a@v(GlJUg~Q%5LS|{yrYH`%j`Xzk-O#b$heERM zA-#f*+_B_7w|zLW|3K8sH%QAph)Cw?*ebaPvgMrBJI7O;lDtNQh`kUsu@=R?E<*v~ zms4)Eb>o+jeFy0hbVToA{(me=?zD!H4Mw4z_mN#!Vub$=q|Hjv(Y#&#S=L6RVulfd zZYUfz8aNIa@y^IVB?>*&A);~}*|jA&9lL_435rB)hl-x>$Ic;ZhB&nsuq*E8A*$vN z)Gxm33iCVfCfc56haspfdJ}sX?NWk{#C3R2M{#05v*?x`cP`SNmm?d{ z%>&*a6&SZM&)AzGk7cPFqB z!uJZY1Fyv%>oXZK&waD_{znj@Yz>h3C;m-`e=z-GJKSG@cimu%zk-yh+7BcV?j@@;r(RMeYER#7Xr@kk$A=V3d0Gdf zf)=YC(>?@iHLyJ*fUA*%F##FPn*%;4Ggb04l$le4OqV4tulX(MY5N7mBO!j)Dac_s zg5+bl1m*QVf!u#*R=^y58j(15?+WZ9oB7D`xRuQV8wfVN`6iUWP>SkHTDff46%@X4 z&j0XG$e-5*1>V;pJ7XpCLSHmOn92|Rip(h~dy-tm(*b#64Jp0a3tOP{_#pM8rO0MJ z71_i`yS!#08CsFnCtm9OjyMK+?E?e8z6LoIci`URZ6I>c zilW^frnq>G%typ(Hs6so*Q2WQeY1E^9r8f`j(eZvXRu?^k)VWllAk}2ncyr#m0%4K zUGUEV>xrnHYzX(S&{6q4>Gp6L(t0xyHPXlY-I45~M;UL}`^c!i0Wr`}{2InTpa{mF zd|vb41}bPLqExPLkX^dUvH z==+h}LpNu9go=EdBC>BOs)pH%;$eTY!~O6S*|oy2FK}wI3vh1&xB*cZACPFXc7ej9@)yUY{^KILiKLnbx8h zm_+)F&$EmWl_0*%FP7O1IelSlOv|p1q{C8M^Wmv#_%y@;P0ez*SD>TFYKi5Bt|&WU z4QdW({m5IXB`sNkDZEarPSDC zPqW)MARA%;?nZhkN?o}a9hr9_gV%{FWH&sHjQuGoLVO)cFE3^^Bp2<#o^F{i-Rnnk^o;^Se8m*=%Na?qSO3ikxaD9{gitrjjP!r5I3)Xnij{K?a% z=E8PHN9{d`vRIFf&QFbCtwf&Wsb*)oX{`NGi01eh2pY&K*||vHU509IYaNd*B>a(0 zes~v~Q0|U~uSAOB*rT{RNAw*-P$K0b;#E5^#N6OwVGedJNKce_8WqMNuhZ!S&Ojuv zg_|kBSfg@eB(6s_1*u10E~r3W?{AT}JA!!PWr9`oM}hVzZ?6P#jT0mMu4ZUb_Gc&_ z+YXfmKI?c*EjpnJ5w@coc_q)GqwywGt63fJ{q0bXw|h`^&>h6T2~2NvoE2*_-~!}< z7OH){)#-B+YT58?%JUP*(OJkxJGDiboqHp@<{zks+czkE<=@!(P<4o){U7P9YL1!5FdlRk^;ZdBKhRkB8yo>oh9 zqqi`-qYNcDeuuI|H=r;~RA`O7r;m_rIShNQRv4IsI+>3rx`A+BSb<{Ke25m$U<-b9&@>EstRj=C$U_&O-6+6KO=`n2Lz+-VuIBOQcOFBck_bD5Upyl;`JG z{8NgW_$+cfUxPg%J69Zva^0Mmhj_Y16aWKIn66uazxNL8G;c4=LfmLAqO4X&a2=&a zs847Vg~DKvxsipe`l>{)ldxxw-51fdR3i^{ER84#hN2_2LxI0@9htqtUdW-z zG~4Su>_X*Sg#QH^et*2!U_WGp7c%Md0>aBVdm0U@I|)%Q*`gnEX11ac1;K3;wgr4S z%CHWjv(u5t8L7g5D4idMpw=F}X+-2`gKVinc3SF&2wSg!eW9CL4>kg~W1~1kkK4(v ztyLJ9Lvq=l6YGnx20c*5%J}+n)5?(BUWa0F-B2=NA5^v9-~6cBB3)k%GKf2p%%tx| z<~9;xqYBX+$GJRLtRt-@FfR@fgff(J+}j9IHzQD;kw^COdXIuxF9Yq-+c-00Vh;1vTs zP=adTB7AopIzh@B&%>>C#?uoQsu?l!b zBPXR8-9>9qXf0B-GhgxuVyvG4&Olk8Wk%ZHBKJUWP)s8Ha=`0QtT8ACBCWlQ;`O_m ziZp!_8VI&P!QhwB@p2V5Ph-KVMZKp$KYR$mr^E!oV3cm24V7^cB3nD5lE`L7x<41A zW;|uoQzTGD)PpFs<#yEh$PF#f@pD-LuWu}>s1FMZ$bOFLQtayWOU#BW*1ftDr5qKz zUvgGxX%=k_%0K^#S3=#PTaGYWj2vk2aUEC@a(yLjIq#OPb-i5!Mvp#*9AJA4Fg zBnmYZ9sN;N%_d|E9gL0@KX2zKbgb@DgzJ5taLe!hMDXg{<%m(q(e!CN)88jNz4!(no?g~VvzKb_WSc&Yj-;jAyOB85L_|@ZYAtxsYE;bq@ z6|YkK0+CW=5S_uy z%)`V?(i^>`B7s6hFXCP^u$*|L-Xu_}`2y0@h$_h3673d3n27*7dKMb3T>X*tC|CfXo7F^W)JThvePU9;hiKv9GRh_F5>!+Tc~FO(n+^*Ryt z%}vD?$i{dHMJke$`yDlfn%qCrrcRSj= zQS113C2HvRrdgcN5E1BHq>GVz`~dP&Yh$!vBT!e%IHAU@=cJfjmlw7*_xCX(3@J88 z?)^2`cGpN`hdH(005rw-eX|ShL7v~)sP$=Ro=OgwkKF(|4rq(oyvH4bR;>Y`*`!1<)wB+oXj*7A$Y@l#y&+@pjxvyaTs`;Fhaix@ly2_ zRj3YhE%vOiTpX`D)ZX@g7=Vt=$5D%>#n=V6EfDkkIPSeP+9IOw79uth6dN*ssWov6|u$rX{Fl*D{ns)rp3QZGkV15M5@JPio84V^N0kw@AAO3K^E5BjA0! z3B1;*CvM*&FTyaQPXqVDF32Olg#6|X)E8`pOewz%m{POpK12<`ebEZB@OR-oU#cw% zOAU*`0^CS(%EeAM>(o#+nHTDiGnt7u+z};fT#Cok>rTjnI>P5enwZz@8-pKSVQzS# zaSRG(*V}}|Jkbp0>n*^a(5^;dv9uB6`=j`spXy7XM98Tz`Ozm}kG&}rnj;Twv+cNO zP>H$WB{}G~3gNXL=mPh?k-8omCrq8WDtfQg8zH#N=I24q_Z|9x9Md z8xK&0j>iko1d%&P@0{2Zg`$d`LR59p z<;XV5B>+1C_yd_~l3u9mbz2W@b|&(6#vvjxima0E$c2B9XtIslqcG2_$leSSl`#{t zRP2IG57*uDsN?^gkRhB6dZ6|T%TXG+-w{%cyqLea2=vzG=Gy?)r7nl6HsWS z5ZNkY&}kCak(ULIw5;*>&;ovx**#kHG5(t^0F4Afb*&73_caO5*h2Cpq^xV zV)Jz~kfG>?Dx^W@p;V?P95?7D^IcAc{`3rjn+tYA27DB0?K`8R|4onU-rlTfM>a!@ zN9uiokLDVSLPK-SpI;aav<>cr@Ey1pGH;2F$7|5hIT)3cjY7xdY?2M>en`u;2=VvU zqC|qI(vqG-VZVgYVs3pG6;dtZ{L0Pl(tM3*D7cs2PG#@!L|`yT!S#JVAyxIXqz>y7%k z97~=>%VD4!;>8{}0yEI@+)jvr<Q{cq5!?$ECM&Jc^fG?`Y}U^xp#fc_3w<@a@>ugD<>kZ_GNTZV(#H!L~z#?>%!Y0 zM`8)d8V=-4tVFisTPO?^wxG2nnMd>@L(9x&2#V&&92tnTaccXA?a*<$k@W6HLs7rP+m|u znoB;~2;5gbuPrmX;TklUHEh(SeE;82K3wX}t{}TEjUOQs;5F1ve^$!#zel#=pUuCW z_!ouGUI~i*jKKZZ{J$F6w_f*o4ocYA;CTEe;MPL4yc~>-?v_UCzsm6X8&OH&BN1Is zDarYG^O2pEx)x_+A8orBZM2$Xn&KYpR;oXtaN5D<^?yZnnAQGuI-1+iob>FO65u~E z6tq&r4!r4jte4STZm^OMUM=*6R-tmQHwoUpYBmAqjpuGy+VnRWmAtphT=H{KORm% z1ZUI~KzrOz zq9JZSBIExP^I7YW{jwg}Yyao?%=RdQW-29_x)FC0@d7gBpFtU=%~3dONAvsEAP;K^;?F)qaoitM zKCcov5xtC1jzV^5XOa^LzD0!fRmj|kGiuBRa>A>OGZV{@bHKSJ@-(+W`T3i&eE-=f z{d&B)am7Rvl<6|q?Bu_j-}4S~;r|tLfrt`UAU473qf%yMrXVy;Yjphl+6YUw!rBV) zXID`CI>$z2#s$c$wlEnn3^}1Bi`Pv<)Wip<_+>F7GP4oXCr~2cOl0FUBHs8t$wBlV zQ)DJ9g%L#9`XVNM5DFOQ!t7hF?_6XXHKKlCBgwU|KalK!KSD^JbTvu=f1CVfPaTOo zvtrDzYD9jhBe~dVJCe!S4Y+qxD90`v$cP=0D|-&P_w{Ik(!!TgocUFa2nTCOPMvoq zvbs(1+Z8!hHM0^3lp@Y(EtQ<%re44S`3C$4hRi^oYN{rij_kS%FjaPKQNM_n$gkjK5GsqimFy;& zoQ0AZ%Msz(U}l+zgw93@%p|?!a1Y!^O@@UxQM&$VuI)qkv#G}8oh?yAG_5F{XpfH25r_iWK=j!%Y3Pn-TD?o* zyL2Z|1may}2Uv^U4yE#ZNcb%pyf7HqnhVW(yid5@)2HJ-ifC74vP6x6<~QzuI#OA4 z%d+j5lr^idrTKvyQ6Rk-{o2k&)lpuWv;(RHih2{2BmU6o2z4{UzEeowaVXv`Cw3xQ zd(8=JI`(1cXrF?#>eDE@xwnffR3IPV7}V`xQ_wHl8l@3!LdIeh#ep^OA=AjB{;2FM zN({n%Snc+R0tln3zMTRc+Y1@osD!4{>8%i!m6jd1-boWuv3YCg^HiUzQQLKRx? zq7co|gg3OUi`h6{ILBKd4!QxkxO>I)I#=VJX)qz>xx$dDPWV-vC6Mhju|5de8bsdBBK|X&o*^^wJRI3fe?~UNAqBq1CfJROgJL`~ z!1qBk$|odi@GB7262EwxwBS9J7-cGSlinP%*L@Iu59`Ari(<;RE zcnwGU-rSfqB)0&F0w<%`WOL*sEH{sTg6N?jI3H0Me{ejOAel;NgMUE@$Y$*pXJLyQ zdZXf!TX821ne`_U=}brDxfFrjudnEb?2aKhymvPvfL7_;4F$U9KFHR3lJrJ~2~_F+9;&^(7zNZ% zN3|Gzkp?{2<#Su3B*i7j_B=Afbu>X{Lo*tY5!Hw`7@Xt#JE4-m*5*cjLE+~}SvP%8 z#77>B;+jqZyeW#`{t=}M`869XH5;&9fVF#^Xj6?E6sDs*x*!O$d+$I;S0Ojc3>3my zY5x5p=@dq;Nd3(T*f$DtzNLf`=8WL=MP16!d`&DVr8 z=b#lTrv40d8~6%o?w1jv+n92n1rh}Jh#w>~1%P?Y%@JRB6U6NQh$hfD8yJsA?Fo(w z>AUV~2sb(o{r3|j_l@wvbY#Z_>2uo$@BSTOz?xk1iV^HGlu7#~N;Z5NHCj0h8Tnu3 z@m;Nao@;}`i+xb2?jNYG_c_#ky^v^Y)}j~cbaX4y$g#sacn{5Ofx1#JB3Rd;1j-DF ziqIW~Y%{kSiyKgEv=(JY9A#dcOS*kqg9?J5Cw(46GsL^SZ3OEK^VzLauH$7g&l?MZa zJhq!rQ|wvjNdF9VH@DK_ry;UAU)+F_AInqL;!q=Wzr(!_;#~ZjAQly8pd6`ORc}W` zphgvVKh7+At|&!Eo;Bpw&tAUAyf#}6G})}d5@f$k4nYZQ#5-BG4y9JP{g(5IwiqWb zB+L%Ii|n%(hMJogm7rCdUEDr|&+2S`=i7)Mb0cj}!JFdgfSje#9via;dBa0OxYonT zJsR^M?$HrfY=Mr9%gv4sW1)ix+Rdvx3^C)!q_C*WOpk}I}BrowvUL_CH{ z=N6*wP^*#s_h)37Ti73Yd9NU^Gs-&KlgV5S?}k!j3Uo=mxfZHW$L!H4d9vL6puZv` zHDLr`Qvrmo53&V5L46}Opr(OkW)t*51s@-wnCK(OppFW!n;V`josvL>H{B7*yBzmM zdhN__8h}P@o`*tOpP=T1ml-W%;bN5KF&t4Gb0YfP`y#tJ+ZkTNjFQ^LO?sb2T+l+Z zi=Fvdzd%g&@g&a=h#F5K+G8v_R%WB>`FD{mQmAHvT~SI?w&-UB;z^YJxDfw20T^L> z*5&c1Q~rOHS&tq$URzMq7`f<><@;{MWvXErIv&qMtrLE9dEl$1rF7qmPKX!rCptee8m=VeUi{H~rZtA> zH6v{8(J>qq{)YN=EI_AS5c0jF*=SjNq8-o?W*xWhQn(7MF=l~N(VD`QuYv5U{d}I^ z1tmUSjmXS{kYT*15x&Vr!@WYVei@IEUQIQ}2)z>%kv&z2?3RlW)sm@sWSQAeITeYY zj_d^sPZJG?6=yt!dml0jvrxBmYrQ}m*Lf*7;Z}kb6(3D{T=xW2>|0Eng6!yhJ%p|V zX~3Mk*D6G`Iz5Uz2rq4>zTnji8*Gqyjngaq9qHb20@Zk4j_l;iQGxHnWG3zwaY zJk6GlUG9b&WR^@uHlAgYOf=tPVJXR;++oCTj(iQGVdf+AYCw=T-HEuWRoD}LOOdhK zBjvRxkv>PWq2nn;ePl9tk3|UucO&E7jV@@0GIS3k-S&MG+w0pMC1G0HaysFqE5!nx zk;mBwMfTlts3s9!rFVV7O~_u_L<&jif=A8T{T^|DE6{0h3bJL^qvP{&(x>n(Lo|zp zQ;=gZ2N9$r>-$1FkIv6fbGg$I$>^rG|4Csz!8l-*5wf#T>~<911ab-T#=b$Ct(Os! zS|d!e5eYkm5%Q-ILHZuaUAr3u+9Iajt4-4cyk{3RRP@50sC)JQw?!po0wg@wU4l6(}1oNk$fffd|fQzs6w9SaUQQb6@{e+ z`h3=f=qR;Ng6uV~o^I_>>QIBj4y1=hoS2Bzdk}1oY?N2c-=pgBy3E4v|KAP;$#ZGs zvL}kvII~)gLEfhqe(odO^%_@@T-lw9!w8;`_cC_F-))f>7KfULT+kXh2({+_T~O+I zHYrWpqd>m1MM6iU2?u$+rvkA8?ds1`1w#vDp!$VBjw5)(l(i&tQ>!UX;c!?upX5Y@ zPRMXSJ>dI~M!|RsHAu^y?em_~P>Y8KhpS2N-k6GC5L~6-iQM*bv(Ue*=j+o1X|s`z z$6BJS*t^N>r6*9t;0l!X{#*QMq%Md6ZrjiVZAYZ8GcDLN_#3}Yv_M|j$0%#FeUW}! zd5E92GdfN?J02@V1v~GPxhOe-g8CQYZ^Kra&3P~l46V(M%~T0992xs@$8eOXu?o>R zUn5fVBNUq)m*?jnkB-lFF5mk;(&G7e-(@IXdL<1I3lZz>g^uRtJ&Jb;Td`4r9GjQT zweEwc3TH68IjU8-)V%Iga_@S6IEn}E?Xqz%LPz8;$i81%KjfL7Nla@lqe2y8yg$Nw zoJ|~1jdt`(=#~4;48}(f>hoHRB18L9uNw=%4E=KPg;W-NblEeyR->xH^ zTF-igvB;aef_QZccN4TlB!||%DFe`K^}ZCQ&u`cm zZZ`0kEZ^71Z0y;nGX6R0=>nXIygfH0%q~0-r9?fC-G#CmwS7OpMKHdg{@6@~!bl@9 zxgPWF%trr?^!&YgfdumMYJFaF7SdGLAr}5=l*srJQt@tBOan+z3=!Rt^OWnHj6IOq zvK)2gytqCt!VvsZZni^tWtK@$gUIMiBa*JCfu&yOxuIVoKLUIJDdPp|W1iXWxL1u^ zIL!#oPssV%7WLOXEyL&joyPg}77jwkUp`*?yF}alvmkgBHDz&wHL=D@Wom`8j-Nqw z0e+k7IuvSZgiMaD!v4_usM)&U-P~r7*^yRq;-662+&I+Eq1NYfJ0jj|b4PEpR-tR9 z`Y3EwsL`DpMj)Q&Hqx^_su7Xug~6ykbaTgebb5r2u!XG_*-I->_$Ax!H!YC2I0NsP z<$v+c_#J?l?MWoJrfQ0e-oN|o=I=-zR<^mKFY+Q|Eo@EEVBGIf$mVO5lQl5l`p6BMp@TokwwB`|0ZRW+@|ZoPg43W0bDO>>vW-z7P_)`?xwnC&po1QE{v zL3U58dLUdSBs)%1QLZ1Tk@Nv^yWswa1oXmlsKbpPeq%nz4O38UWpi|ddNn0{i*%23 zIQ~cE^W>ksYoQk+oSUGO_*KL^1XhOzcdSL3KCMt8kG1(WQMi75fiafkBQO z=QRtlOaI((GCEQ%cH1q5;jwzQMU7YVSZUy4ni65FQ4bvnjL?P&ucy*eb%}YHyeRH2DNEA!R0mInB8c#pE?jZ zEHAsfwi)*LpRn+6)SmQAl-_g*($=Sh^!eS45QJqDmSOiT`3rUq-Yg?{mBbK3$lO(N z3sfiRg=u6S($E?;C~SdyF#a0sdWx=y;Pqm{e@Xbk;R8`z_8n}KU|U2k@0{mn_eDts z_j_!fT+rQY@?VqOf20(d7yl-Pc4s?+<%2zdTHm{2B&s#d1Z&LD38Ysb9gmLC?kF96 zs>f%Xi{h)LA+A9M>R?oZ%z@Xj?VTe~rf}yxKK~@_9w8eDZ$x*kxn8GjX3f613~A}u zVHKH=&)@y=3YZ#g?2b~HQnPk2)uN29ctuxl&MCpk0qJXB9=;R>YL za}D-)G}>o5DoKnA{mu7O8YQxk7&2S;=d7?~h4xe!$;hq|4 z7>aHUodhqX+88@dEO=qDUjUk93X@L@g}G zo;TVQY4*FKz8QJoLvnKr5@sV@i9a(D8eSlCRaP1D7~SdzhBySa9C<`5P~GRLMk_s= zqRA$Z%;6n?O7|W?cAHhV85LjD1AmUusxP%PLnVaoc z19z?CuQf`!9vCxWOPGz3?`OP-%!e}&LvTI8299KnJIOpUdMlE9#EwAj{Hw@wbE2sc zz>yxGH2?+N_d;xVp}YRPLi$*3H{49JHk*KY)^#Rcc#ZsR+N<&CITyCES%Z$gei>f3 z64`n88X@x=`M3*8Y;CjO*w6sSbr??&vw9Azj`U<%2t6e^JYwwvRz%aLOd zCvWdu@~_31V*a@9%poCPa4$q`cJz78`6!iT2HuoOPsEkgVYhrwoiI~{?1W-;F&~6T z);*A6-3!?~3(?WB$!IVORs+E+aSaKR>C6+Ep4;{ zZwC4X{M&RjK?eR6*hj9V;i8(DoGm6GHy=b7{DI{9$bKl|;l!?HU91jDmB_)km-xg` lC!$D5u3esv!)0Xn{{y;j5@t0)Cwu?^002ovPDHLkV1g18w0Zyl literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift b/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift index b47047ed4e..19073f6a28 100644 --- a/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift +++ b/submodules/TelegramUI/Sources/FetchCachedRepresentations.swift @@ -430,7 +430,7 @@ private func fetchCachedPatternWallpaperMaskRepresentation(resource: MediaResour if data.count > 5, let string = String(data: data.subdata(in: 0 ..< 5), encoding: .utf8), string == " 5, let string = String(data: data.subdata(in: 0 ..< 5), encoding: .utf8), string == "= 700 && abs(factor - 1.0) <= .ulpOfOne { - scaleFromCenter = 2.1 - } default: size = nil } - let maybeFullSize = combineLatest(accountManager.mediaBox.cachedResourceRepresentation(largestRepresentation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: false), account.postbox.mediaBox.cachedResourceRepresentation(largestRepresentation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: false)) + let maybeFullSize = combineLatest(accountManager.mediaBox.cachedResourceRepresentation(largestRepresentation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: false), account.postbox.mediaBox.cachedResourceRepresentation(largestRepresentation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: false)) let signal = maybeFullSize |> take(1) @@ -393,12 +388,12 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana let accountThumbnailData = Signal { subscriber in let fetchedDisposable = fetchedThumbnail.start() - let thumbnailDisposable = account.postbox.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in + let thumbnailDisposable = account.postbox.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start(next: { next in subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])) if next.complete, let data = try? Data(contentsOf: URL(fileURLWithPath: next.path), options: .mappedRead) { accountManager.mediaBox.storeResourceData(representations[smallestIndex].representation.resource.id, data: data) - let _ = accountManager.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start() + let _ = accountManager.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start() } }, error: subscriber.putError, completed: subscriber.putCompletion) @@ -409,7 +404,7 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana } let sharedThumbnailData = Signal { subscriber in - let thumbnailDisposable = accountManager.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in + let thumbnailDisposable = accountManager.mediaBox.cachedResourceRepresentation(representations[smallestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start(next: { next in subscriber.putNext(next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: [])) }, error: subscriber.putError, completed: subscriber.putCompletion) @@ -439,12 +434,12 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana let accountFullSizeData = Signal<(Data?, Bool), NoError> { subscriber in let fetchedFullSizeDisposable = fetchedFullSize.start() - let fullSizeDisposable = account.postbox.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in + let fullSizeDisposable = account.postbox.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start(next: { next in subscriber.putNext((next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []), next.complete)) if next.complete, let data = try? Data(contentsOf: URL(fileURLWithPath: next.path), options: .mappedRead) { accountManager.mediaBox.storeResourceData(representations[largestIndex].representation.resource.id, data: data) - let _ = accountManager.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start() + let _ = accountManager.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start() } }, error: subscriber.putError, completed: subscriber.putCompletion) @@ -455,7 +450,7 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana } let sharedFullSizeData = Signal<(Data?, Bool), NoError> { subscriber in - let fullSizeDisposable = accountManager.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size, scaleFromCenter: scaleFromCenter), complete: false, fetch: true).start(next: { next in + let fullSizeDisposable = accountManager.mediaBox.cachedResourceRepresentation(representations[largestIndex].representation.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start(next: { next in subscriber.putNext((next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: []), next.complete)) }, error: subscriber.putError, completed: subscriber.putCompletion)