From 2337464565951d84ba25d819774c3d5cc430b56b Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sat, 8 Apr 2023 16:06:18 +0200 Subject: [PATCH 1/6] Add methods to access child content and render plain text --- .../MarkdownUI/DSL/Blocks/MarkdownContent.swift | 15 +++++++++++++++ Sources/MarkdownUI/Parser/BlockNode.swift | 15 +++++++++++++++ Sources/MarkdownUI/Parser/MarkdownParser.swift | 6 ++++++ 3 files changed, 36 insertions(+) diff --git a/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift b/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift index 07da9cc9..31b48688 100644 --- a/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift +++ b/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift @@ -60,6 +60,15 @@ public protocol MarkdownContentProtocol { /// } /// ``` public struct MarkdownContent: Equatable, MarkdownContentProtocol { + /// Returns a value with the sum of the contents of all the container blocks present in this content. + /// + /// You can use this property to access the contents of a blockquote or a list. Returns `nil` if + /// there are no container blocks. + public var childContent: MarkdownContent? { + let children = self.blocks.map(\.children).flatMap { $0 } + return children.isEmpty ? nil : .init(blocks: children) + } + public var _markdownContent: MarkdownContent { self } let blocks: [BlockNode] @@ -88,4 +97,10 @@ public struct MarkdownContent: Equatable, MarkdownContentProtocol { let result = self.blocks.renderMarkdown() return result.hasSuffix("\n") ? String(result.dropLast()) : result } + + /// Renders this Markdown content value as plain text. + public func renderPlainText() -> String { + let result = self.blocks.renderPlainText() + return result.hasSuffix("\n") ? String(result.dropLast()) : result + } } diff --git a/Sources/MarkdownUI/Parser/BlockNode.swift b/Sources/MarkdownUI/Parser/BlockNode.swift index 9fb93aa7..4686106d 100644 --- a/Sources/MarkdownUI/Parser/BlockNode.swift +++ b/Sources/MarkdownUI/Parser/BlockNode.swift @@ -14,6 +14,21 @@ enum BlockNode: Hashable { } extension BlockNode { + var children: [BlockNode] { + switch self { + case .blockquote(let children): + return children + case .bulletedList(_, let items): + return items.map(\.children).flatMap { $0 } + case .numberedList(_, _, let items): + return items.map(\.children).flatMap { $0 } + case .taskList(_, let items): + return items.map(\.children).flatMap { $0 } + default: + return [] + } + } + var isParagraph: Bool { guard case .paragraph = self else { return false } return true diff --git a/Sources/MarkdownUI/Parser/MarkdownParser.swift b/Sources/MarkdownUI/Parser/MarkdownParser.swift index 059d0a38..45c8165b 100644 --- a/Sources/MarkdownUI/Parser/MarkdownParser.swift +++ b/Sources/MarkdownUI/Parser/MarkdownParser.swift @@ -14,6 +14,12 @@ extension Array where Element == BlockNode { String(cString: cmark_render_commonmark(document, CMARK_OPT_DEFAULT, 0)) } ?? "" } + + func renderPlainText() -> String { + UnsafeNode.makeDocument(self) { document in + String(cString: cmark_render_plaintext(document, CMARK_OPT_DEFAULT, 0)) + } ?? "" + } } extension BlockNode { From 60a6a38addc21ed8b60678db298746c0062594f3 Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sun, 9 Apr 2023 16:21:33 +0200 Subject: [PATCH 2/6] Add the Markdown content to the block configuration --- .../DSL/Blocks/MarkdownContent.swift | 7 ++- .../Theme/BlockStyle/BlockConfiguration.swift | 10 ++++- .../BlockStyle/TableCellConfiguration.swift | 5 ++- .../Views/Blocks/ApplyBlockStyle.swift | 28 ------------ .../Views/Blocks/BlockNode+View.swift | 27 ++++-------- .../Views/Blocks/BlockquoteView.swift | 20 +++++++++ .../Views/Blocks/BulletedListView.swift | 10 +++++ .../Views/Blocks/CodeBlockView.swift | 2 +- .../Views/Blocks/HTMLBlockView.swift | 14 ------ .../MarkdownUI/Views/Blocks/HeadingView.swift | 23 ++++++++++ .../Views/Blocks/ListItemSequence.swift | 13 +++--- .../Views/Blocks/ListItemView.swift | 10 +++++ .../Views/Blocks/NumberedListView.swift | 16 +++++++ .../Views/Blocks/ParagraphView.swift | 40 ++++++++++++++++++ .../MarkdownUI/Views/Blocks/TableCell.swift | 10 +++-- .../MarkdownUI/Views/Blocks/TableView.swift | 16 +++++-- .../Views/Blocks/TaskListItemView.swift | 14 +++++- .../Views/Blocks/TaskListView.swift | 12 +++++- .../Views/Blocks/ThematicBreakView.swift | 9 ++++ .../MarkdownUI/Views/Inlines/ImageView.swift | 34 ++++++++++++--- .../MarkdownTableTests/testTableBorder.1.png | Bin 63025 -> 62541 bytes 21 files changed, 234 insertions(+), 86 deletions(-) delete mode 100644 Sources/MarkdownUI/Views/Blocks/ApplyBlockStyle.swift create mode 100644 Sources/MarkdownUI/Views/Blocks/BlockquoteView.swift delete mode 100644 Sources/MarkdownUI/Views/Blocks/HTMLBlockView.swift create mode 100644 Sources/MarkdownUI/Views/Blocks/HeadingView.swift create mode 100644 Sources/MarkdownUI/Views/Blocks/ParagraphView.swift create mode 100644 Sources/MarkdownUI/Views/Blocks/ThematicBreakView.swift diff --git a/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift b/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift index 31b48688..65a60068 100644 --- a/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift +++ b/Sources/MarkdownUI/DSL/Blocks/MarkdownContent.swift @@ -60,7 +60,8 @@ public protocol MarkdownContentProtocol { /// } /// ``` public struct MarkdownContent: Equatable, MarkdownContentProtocol { - /// Returns a value with the sum of the contents of all the container blocks present in this content. + /// Returns a Markdown content value with the sum of the contents of all the container blocks + /// present in this content. /// /// You can use this property to access the contents of a blockquote or a list. Returns `nil` if /// there are no container blocks. @@ -76,6 +77,10 @@ public struct MarkdownContent: Equatable, MarkdownContentProtocol { self.blocks = blocks } + init(block: BlockNode) { + self.init(blocks: [block]) + } + init(_ components: [MarkdownContentProtocol]) { self.init(blocks: components.map(\._markdownContent).flatMap(\.blocks)) } diff --git a/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift b/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift index 8c5f00d9..6ca7c0b6 100644 --- a/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift +++ b/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift @@ -15,8 +15,16 @@ public struct BlockConfiguration { public let body: AnyView } - /// The Markdown block content. + /// The Markdown block view. public let label: Label + + /// The content of the Markdown block. + /// + /// This property provides access to different representations of the block content. + /// For example, you can use ``MarkdownContent/renderMarkdown()`` + /// to get the Markdown formatted text or ``MarkdownContent/renderPlainText()`` + /// to get the plain text of the block content. + public let content: MarkdownContent } extension BlockStyle where Configuration == BlockConfiguration { diff --git a/Sources/MarkdownUI/Theme/BlockStyle/TableCellConfiguration.swift b/Sources/MarkdownUI/Theme/BlockStyle/TableCellConfiguration.swift index 59cd6c52..64440316 100644 --- a/Sources/MarkdownUI/Theme/BlockStyle/TableCellConfiguration.swift +++ b/Sources/MarkdownUI/Theme/BlockStyle/TableCellConfiguration.swift @@ -20,6 +20,9 @@ public struct TableCellConfiguration { /// The table cell column index. public let column: Int - /// The table cell content. + /// The table cell view. public let label: Label + + /// The table cell content. + public let content: MarkdownContent } diff --git a/Sources/MarkdownUI/Views/Blocks/ApplyBlockStyle.swift b/Sources/MarkdownUI/Views/Blocks/ApplyBlockStyle.swift deleted file mode 100644 index acfa6051..00000000 --- a/Sources/MarkdownUI/Views/Blocks/ApplyBlockStyle.swift +++ /dev/null @@ -1,28 +0,0 @@ -import SwiftUI - -struct ApplyBlockStyle: View { - @Environment private var blockStyle: BlockStyle - - private let configuration: Configuration - - init(_ keyPath: KeyPath>, configuration: Configuration) { - self._blockStyle = Environment((\EnvironmentValues.theme).appending(path: keyPath)) - self.configuration = configuration - } - - var body: some View { - self.blockStyle.makeBody(configuration: self.configuration) - } -} - -extension ApplyBlockStyle where Configuration == BlockConfiguration { - init(_ keyPath: KeyPath>, to label: Label) { - self.init(keyPath, configuration: .init(label: .init(label))) - } -} - -extension ApplyBlockStyle where Configuration == Void { - init(_ keyPath: KeyPath>) { - self.init(keyPath, configuration: ()) - } -} diff --git a/Sources/MarkdownUI/Views/Blocks/BlockNode+View.swift b/Sources/MarkdownUI/Views/Blocks/BlockNode+View.swift index 6ab45fe0..b445dbc4 100644 --- a/Sources/MarkdownUI/Views/Blocks/BlockNode+View.swift +++ b/Sources/MarkdownUI/Views/Blocks/BlockNode+View.swift @@ -4,36 +4,27 @@ extension BlockNode: View { var body: some View { switch self { case .blockquote(let children): - ApplyBlockStyle(\.blockquote, to: BlockSequence(children)) + BlockquoteView(children: children) case .bulletedList(let isTight, let items): - ApplyBlockStyle(\.list, to: BulletedListView(isTight: isTight, items: items)) + BulletedListView(isTight: isTight, items: items) case .numberedList(let isTight, let start, let items): - ApplyBlockStyle(\.list, to: NumberedListView(isTight: isTight, start: start, items: items)) + NumberedListView(isTight: isTight, start: start, items: items) case .taskList(let isTight, let items): - ApplyBlockStyle(\.list, to: TaskListView(isTight: isTight, items: items)) + TaskListView(isTight: isTight, items: items) case .codeBlock(let fenceInfo, let content): CodeBlockView(fenceInfo: fenceInfo, content: content) case .htmlBlock(let content): - ApplyBlockStyle(\.paragraph, to: HTMLBlockView(content: content)) + ParagraphView(content: content) case .paragraph(let content): - if let imageView = ImageView(content) { - ApplyBlockStyle(\.paragraph, to: imageView) - } else if #available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *), - let imageFlow = ImageFlow(content) - { - ApplyBlockStyle(\.paragraph, to: imageFlow) - } else { - ApplyBlockStyle(\.paragraph, to: InlineText(content)) - } + ParagraphView(content: content) case .heading(let level, let content): - ApplyBlockStyle(\.headings[level - 1], to: InlineText(content)) - .id(content.renderPlainText().kebabCased()) + HeadingView(level: level, content: content) case .table(let columnAlignments, let rows): if #available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *) { - ApplyBlockStyle(\.table, to: TableView(columnAlignments: columnAlignments, rows: rows)) + TableView(columnAlignments: columnAlignments, rows: rows) } case .thematicBreak: - ApplyBlockStyle(\.thematicBreak) + ThematicBreakView() } } } diff --git a/Sources/MarkdownUI/Views/Blocks/BlockquoteView.swift b/Sources/MarkdownUI/Views/Blocks/BlockquoteView.swift new file mode 100644 index 00000000..48f1b39e --- /dev/null +++ b/Sources/MarkdownUI/Views/Blocks/BlockquoteView.swift @@ -0,0 +1,20 @@ +import SwiftUI + +struct BlockquoteView: View { + @Environment(\.theme.blockquote) private var blockquote + + private let children: [BlockNode] + + init(children: [BlockNode]) { + self.children = children + } + + var body: some View { + self.blockquote.makeBody( + configuration: .init( + label: .init(BlockSequence(self.children)), + content: .init(block: .blockquote(children: self.children)) + ) + ) + } +} diff --git a/Sources/MarkdownUI/Views/Blocks/BulletedListView.swift b/Sources/MarkdownUI/Views/Blocks/BulletedListView.swift index e231356d..9d523724 100644 --- a/Sources/MarkdownUI/Views/Blocks/BulletedListView.swift +++ b/Sources/MarkdownUI/Views/Blocks/BulletedListView.swift @@ -1,6 +1,7 @@ import SwiftUI struct BulletedListView: View { + @Environment(\.theme.list) private var list @Environment(\.theme.bulletedListMarker) private var bulletedListMarker @Environment(\.listLevel) private var listLevel @@ -13,6 +14,15 @@ struct BulletedListView: View { } var body: some View { + self.list.makeBody( + configuration: .init( + label: .init(self.label), + content: .init(block: .bulletedList(isTight: self.isTight, items: self.items)) + ) + ) + } + + private var label: some View { ListItemSequence(items: self.items, markerStyle: self.bulletedListMarker) .environment(\.listLevel, self.listLevel + 1) .environment(\.tightSpacingEnabled, self.isTight) diff --git a/Sources/MarkdownUI/Views/Blocks/CodeBlockView.swift b/Sources/MarkdownUI/Views/Blocks/CodeBlockView.swift index 27cf26c7..86f6d941 100644 --- a/Sources/MarkdownUI/Views/Blocks/CodeBlockView.swift +++ b/Sources/MarkdownUI/Views/Blocks/CodeBlockView.swift @@ -13,7 +13,7 @@ struct CodeBlockView: View { } var body: some View { - codeBlock.makeBody( + self.codeBlock.makeBody( configuration: .init( language: self.fenceInfo, content: self.content, diff --git a/Sources/MarkdownUI/Views/Blocks/HTMLBlockView.swift b/Sources/MarkdownUI/Views/Blocks/HTMLBlockView.swift deleted file mode 100644 index 83504c5f..00000000 --- a/Sources/MarkdownUI/Views/Blocks/HTMLBlockView.swift +++ /dev/null @@ -1,14 +0,0 @@ -import SwiftUI - -struct HTMLBlockView: View { - private let content: String - - init(content: String) { - self.content = content.hasSuffix("\n") ? String(content.dropLast()) : content - } - - var body: some View { - Text(self.content) - .textStyleFont() - } -} diff --git a/Sources/MarkdownUI/Views/Blocks/HeadingView.swift b/Sources/MarkdownUI/Views/Blocks/HeadingView.swift new file mode 100644 index 00000000..7c25150a --- /dev/null +++ b/Sources/MarkdownUI/Views/Blocks/HeadingView.swift @@ -0,0 +1,23 @@ +import SwiftUI + +struct HeadingView: View { + @Environment(\.theme.headings) private var headings + + private let level: Int + private let content: [InlineNode] + + init(level: Int, content: [InlineNode]) { + self.level = level + self.content = content + } + + var body: some View { + self.headings[self.level - 1].makeBody( + configuration: .init( + label: .init(InlineText(self.content)), + content: .init(block: .heading(level: self.level, content: self.content)) + ) + ) + .id(content.renderPlainText().kebabCased()) + } +} diff --git a/Sources/MarkdownUI/Views/Blocks/ListItemSequence.swift b/Sources/MarkdownUI/Views/Blocks/ListItemSequence.swift index 142b39eb..2139172c 100644 --- a/Sources/MarkdownUI/Views/Blocks/ListItemSequence.swift +++ b/Sources/MarkdownUI/Views/Blocks/ListItemSequence.swift @@ -20,14 +20,11 @@ struct ListItemSequence: View { var body: some View { BlockSequence(self.items) { index, item in - ApplyBlockStyle( - \.listItem, - to: ListItemView( - item: item, - number: self.start + index, - markerStyle: self.markerStyle, - markerWidth: self.markerWidth - ) + ListItemView( + item: item, + number: self.start + index, + markerStyle: self.markerStyle, + markerWidth: self.markerWidth ) } .labelStyle(.titleAndIcon) diff --git a/Sources/MarkdownUI/Views/Blocks/ListItemView.swift b/Sources/MarkdownUI/Views/Blocks/ListItemView.swift index fe9a9c4d..11643ac1 100644 --- a/Sources/MarkdownUI/Views/Blocks/ListItemView.swift +++ b/Sources/MarkdownUI/Views/Blocks/ListItemView.swift @@ -1,6 +1,7 @@ import SwiftUI struct ListItemView: View { + @Environment(\.theme.listItem) private var listItem @Environment(\.listLevel) private var listLevel private let item: RawListItem @@ -21,6 +22,15 @@ struct ListItemView: View { } var body: some View { + self.listItem.makeBody( + configuration: .init( + label: .init(self.label), + content: .init(blocks: item.children) + ) + ) + } + + private var label: some View { Label { BlockSequence(self.item.children) } icon: { diff --git a/Sources/MarkdownUI/Views/Blocks/NumberedListView.swift b/Sources/MarkdownUI/Views/Blocks/NumberedListView.swift index 99a07f16..fb3098ef 100644 --- a/Sources/MarkdownUI/Views/Blocks/NumberedListView.swift +++ b/Sources/MarkdownUI/Views/Blocks/NumberedListView.swift @@ -1,6 +1,7 @@ import SwiftUI struct NumberedListView: View { + @Environment(\.theme.list) private var list @Environment(\.theme.numberedListMarker) private var numberedListMarker @Environment(\.listLevel) private var listLevel @@ -17,6 +18,21 @@ struct NumberedListView: View { } var body: some View { + self.list.makeBody( + configuration: .init( + label: .init(self.label), + content: .init( + block: .numberedList( + isTight: self.isTight, + start: self.start, + items: self.items + ) + ) + ) + ) + } + + private var label: some View { ListItemSequence( items: self.items, start: self.start, diff --git a/Sources/MarkdownUI/Views/Blocks/ParagraphView.swift b/Sources/MarkdownUI/Views/Blocks/ParagraphView.swift new file mode 100644 index 00000000..7d5e4acc --- /dev/null +++ b/Sources/MarkdownUI/Views/Blocks/ParagraphView.swift @@ -0,0 +1,40 @@ +import SwiftUI + +struct ParagraphView: View { + @Environment(\.theme.paragraph) private var paragraph + + private let content: [InlineNode] + + init(content: String) { + self.init( + content: [ + .text(content.hasSuffix("\n") ? String(content.dropLast()) : content) + ] + ) + } + + init(content: [InlineNode]) { + self.content = content + } + + var body: some View { + self.paragraph.makeBody( + configuration: .init( + label: .init(self.label), + content: .init(block: .paragraph(content: self.content)) + ) + ) + } + + @ViewBuilder private var label: some View { + if let imageView = ImageView(content) { + imageView + } else if #available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *), + let imageFlow = ImageFlow(content) + { + imageFlow + } else { + InlineText(content) + } + } +} diff --git a/Sources/MarkdownUI/Views/Blocks/TableCell.swift b/Sources/MarkdownUI/Views/Blocks/TableCell.swift index a75634cd..b3ea865d 100644 --- a/Sources/MarkdownUI/Views/Blocks/TableCell.swift +++ b/Sources/MarkdownUI/Views/Blocks/TableCell.swift @@ -2,6 +2,8 @@ import SwiftUI @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *) struct TableCell: View { + @Environment(\.theme.tableCell) private var tableCell + private let row: Int private let column: Int private let cell: RawTableCell @@ -13,18 +15,18 @@ struct TableCell: View { } var body: some View { - ApplyBlockStyle( - \.tableCell, + self.tableCell.makeBody( configuration: .init( row: self.row, column: self.column, - label: .init(self.content) + label: .init(self.label), + content: .init(block: .paragraph(content: cell.content)) ) ) .tableCellBounds(forRow: self.row, column: self.column) } - @ViewBuilder private var content: some View { + @ViewBuilder private var label: some View { if let imageFlow = ImageFlow(self.cell.content) { imageFlow } else { diff --git a/Sources/MarkdownUI/Views/Blocks/TableView.swift b/Sources/MarkdownUI/Views/Blocks/TableView.swift index 140655ee..4d0c3467 100644 --- a/Sources/MarkdownUI/Views/Blocks/TableView.swift +++ b/Sources/MarkdownUI/Views/Blocks/TableView.swift @@ -2,23 +2,33 @@ import SwiftUI @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *) struct TableView: View { + @Environment(\.theme.table) private var table @Environment(\.tableBorderStyle.strokeStyle.lineWidth) private var borderWidth - private let columnAlignments: [HorizontalAlignment] + private let columnAlignments: [RawTableColumnAlignment] private let rows: [RawTableRow] init(columnAlignments: [RawTableColumnAlignment], rows: [RawTableRow]) { - self.columnAlignments = columnAlignments.map(HorizontalAlignment.init) + self.columnAlignments = columnAlignments self.rows = rows } var body: some View { + self.table.makeBody( + configuration: .init( + label: .init(self.label), + content: .init(block: .table(columnAlignments: self.columnAlignments, rows: self.rows)) + ) + ) + } + + private var label: some View { Grid(horizontalSpacing: self.borderWidth, verticalSpacing: self.borderWidth) { ForEach(0..p=mfM5KvI zQIOC}0tD<3AZUOH2?UkU0s#pjl91#+uX=v}duL~N_TIU>J3AvY7)*Pg_i5kn_fwwR zC+)0OEM31;Mn-1E@neTi%g8L^%E-v?Tk;2Zrj>38J;;WhwmKwJ(xEm6{&NNCbllt4 zR%QqIdx?yk?0Ok_=q=#aTz12M{yr+ZU1sr*=NHMy-1L=^`}H0>@Cf}RfnVq|KOYxA zlKu5=@Z6(C|Gs+>_tD~i|CZkeee8nkpRM3QG3c0csEo|oZP2gm@zYzU!INsfhwaaR zM{q&tXHf?DXZz1b=x>yf-$}(_8JPnz#}6Mob47NdUp|G?7PGf+SE#|?-rmECU$>_3 zGBh;gU4z4HR(p3`ONV}*;J;e1&lDkRL<7}qVSQCkLpY=SOyAk^ME2>i16j9aWEaUT zS-I)JRhgJ7)%~4)_>;1VKmPmU`B6Fa-K+n3%Ynsx19*!T-PO1JSM2ut!m0S-9nuvi=7)bp8Pz z9_8)Zbs?R-9x zT9xex=Guq7HrA_FGVw2opAJpR#KY6$fAVpEAr1sM#~J@cUXtOm$fRkwr$JBqM^5=d z@x9(x`U6d_W>1W|$KmKAt)Ho8__j?o6aV<>7%t;l|Lt};H~i|G%(f#xqwgKqrkdh| z>UR*=+V#MPLOBCzKUxvfBR7=x&97~hU=^oHY1fv|esS6RGrpJVf)+cv zTBkb)A(nD3EUQ|)bJ$D&*M*|NYb(Y*7PedtP@Is-a1m5z{ut&;txYv|5S|IOiB1aP zS66*|@$l#9e@eZ|EY~f`Yui~1yN)Wm-Y2^@)Ijy;g?2T9*Zx55!mip^BNu+P{Y8|E z-H%~DzdFg~En&A6)2eu}Nz<+G=WKtD{=|s`0ljPJr@hzyo@W1-)2vuY%FB^Pqv@mp z)XbEnhOiU+;tC93g^+iii6<|xVQ5FPu$#nj7ZCev8u>3U?u`5^lZHvEC5H#4BB_Mj zBEb=&`u)gs0iS@w2(dFI=mtN=O!o9O?J!kh=XIiwIWL`&&69~q15@>zpM4ORMCU)r zW`Dcm6J}J`VoP+${PL$;tZNai$esV3dqBasbBN`TJ(D8tyVKy>gI(j*0&4^fvDj;U zg+=#usGsY8$2q4N6tm3L<72jR#CuDwU@2?918pa`d((V2*CkEx%pP+|$c#~r9@O8= zIy`uFOXr~g_#-E3pHed>t!?Q>gg|`|O%}PKYhS4c2sej`7%Z&)S?o-5PMC&x)Jj_# zf=j2l-*^WuZ%`9~!(*OVyIndjfX@u%tbIYY{WdQ89@QXsZVl67=3b(WAVY2E_mB9- zO81o~EIlmbddzAj-sSJ*oo>dwetsTYDuNm{kf!{|Q|;?t{RpX$Znm0oZ>qs~X`@5# zoPjBqT^_ze@PLXNHq04Q83-N1jMCGNZ~`6b-xlj~2An<4Hk)mWn2yt6X3e+xa5wTE zyqj>{6}s}`F^~RGYs(ao>zQUu&e)vvI;U~5>(Ca}^glQ%rO zyc_q+3@3_HrR2)pvz9$B%Zd$Z=^Ru}lk9QuRTSBl$e!vY+zPLA)8CD!WLRP@niQut zv?+NI%U}#tn|yCpHm}36brBI%ueB?%QDrY1mM2El6*qjUE=w!BDE_v-=tgnP+LcVd z6#~VHj3(oeGz{bMoclJg(tSAfi-)cig`|j=A-=yHlIvc`T1~>vQxM$SeUF<1ds?wV zT243){Nrub!2Xu?@+%c5;c=n4mqu?BdKMs8G;pVI(kMZk#=;{?#A1aM-w#4Yi!Q&m zO@~h;b8!n_HAvCvVlbKOSx0O$+@8M3Ym09)DmqXU5ZYU!A(_6}Zz1`X=zOH_+qeD+ zn&mPIu_9+h18l-NNGhJfvBclsSqxM^kI*g%$cRu?UKlnak72>Y;C@--;$s`(prEyg zqT)2dEHCzVuVF6*q3Av6qyppaXIjnTCV8h8vp0$l@3KWJQ10VMJCwQTLxYG8&Iq_|i!U zkDhoDh~adNvthXTws{Td_jmRqQQ!{DLmNf?Q`qEryNFhYaQ^X^FzmPZ0s;;U>b?kZ zV;3ul4lQr)Lwdb88gwJ>f`)+NI&9FdsWJba8;BDz+RF8XuZs}kaqe@+hD+#=$=Q{Z z_Z#QY_meZdJ|b}LCeQFWfA0*8ptuD1YB+ZUCq^;3c4#7vxo@Vjz|8-W;IlIBii$Ul zHUC((;Uap}QX{gwUEB1tB1y!OO5FO6r>pcBx_-WG7xvh<&K@)FfHtaaUNKxksK+|{ zm+X|z7FdYANF|s_Kl_cX!qYz57V|BnxQ(-qk|&M3a+UV>TCu=*;qmSD?HmCrr$klw z)~K;eM3pX3^*J5bwDKX$(5l2MuV*PekDJXzO=jHSMDC||=5t=o&I9)nqldWV_=d}Z zF?(EOd7n^RYVq90d;e4f)x;Usp*&`fd3DD)d9{=pl2&1}A`xBx)pjoN$e}BZgKM!#Xr>StU40xm!79JYZs@C#XRh6}Sopj;SFORM zBRIiuev^ryj@m%I1V4{hG*QoxD4a9jwYqbpK}(|tzSMLN|COh3951uCvh9`H@UH%h zf!X}rBPcO)MSBWtBbX$0!)ZncJuKJ_~bbr7_7p2FN(i7{_LRv%v2OBopR#6bsbsIFl9@AzdThWr@jB6U@{OFMTs1@ zNb4PLjhu;hX-!+1iC7E`e>=0J4V}SYdV9NZr_8eq*ccr|$&LC}PhYx)sF$jR?C|8> zh_gu_hs_|@vGZ8tY+_03(esmZ-+>>#Wv{xWDiuCYunKlz-E= zaX)i10L=-hoS&!Su=tY?AGw)VW=m!Z>=7>9uFv1RjY!Vu*P0uHRj}0HgixD=NXe8` zGBs2|HsUo8e{8yE+nMg>3XN8ZA6TXcn}mt{;u=!_Wb3PBM($uEjPDr5-hO3#hgC`- zmY0EsMSosK@&VnMEJ8(0MUR*S>QElzhE!9&WIt)5M)p(?6EPE>$p}v_RzR{(AmT?1 zXWn(DAa=Bx_9_?{AM0aSBZMEhO6XckbRR7{To^qZ)ne^l?!OxqWZ&-tS0p7yc0D0h zR>}267IuSf)^~eGQ%j}Z`%(2O+%sbTqswyjC!Pi@|CU#dcV5qdc zmi=+9k^KSHO~m0e+vjUQu@7MQ3_4l=E|SRLyj9w>|j1;^`m5Oc`n@5g1{@9UDiG&)`Y7rIqfO`W3KSJzo|QPv&g%$M)ov&~7hCJghO^cPZMT^{3+R=RVtbVjtovZL%qD%_!NF273H-~e83U5-Ri0#Lc+&8P>sT*AdMKDt%6_b&j|>7vcWdn z9w)x`sn~Orc}?wLN9foFS83}#b~iuSpKH(O@mdj4+X_1jpS^Ne#0kg`!|li}%i7Cc zcCpVvlDF)L8JnI_e#eC+?BP2wxFZ)Yr`Ko*=#Mlo_uJZhnii=UO`G%V$g{b3Mzf;DsD ze#sV6dPsBOOkcd)#08U{U|g^7YWUI|!apbNQ9)F5L%-)W=+TQ& z5pKkA?cZXhVU9*RBv!ytv<)*vQtdsh3k?fU=lB|u^ zf~?ckYWGSCj4xCBsv{)}%Mod)xr&?y>?Ll?GxjmGJ7X%c9JyI4d~$7y$qnD3@m4J1 z%)>1>_HN!6>+T#%CWme<BM|@pAVgofXwl z8tiLXck(MP{&n2wVL3N5tnU4+hV+{TjowB6qr15Qcdgz%pdWdu=XOcDh4%Kea7^p+PZ8#c7}kUA4-n0Z|KMsjS0@X zBcx}tS7yJXoLW$W>x)A;Po4%|d9@**Ky?!Tns69`#Mp4ct2e*@55Z2|gAL}V;FMOX zbX^)upZC&Jn2AS$)YfrI)qi?w`9UXlhn)9r3W7VMyZug}vu1=5&6t70O+}YOx7GSw z%Q%ux5tpN}Nej)?sV zp3T}%DF|kLVT_#BZRm&Ph?M!8tt1-9%>L1mVwV6NcHdK%AMvL~eUnuhB_oQMoDz%^ z)gZH(N_>KQN~O{b6M3TCyH}u$q0Mw7{~}tzYAwF5qdFDd(l+UB(c(}dIlk^egcUbi z_fC}=N7FeOC=2bRRCag&iI28h6MejH8z2j7OwT1w-@9is<8*Z3uZQD8=d(dDveHvm zvHoUDq*~-oS<@$BDTu`K;u)Cu0SzyxB48$~@jVEywPX7C&5^TO>TEIV-+#~?+79J+l6nWba3i*n@R_%c)W>#me%N;2z~8YcD+ zX&LFnGeTVG_SVe}mk$%MZ0qyHgF}wVm;L7Pb14!we^w$Or3+{hia}^B zBK_Ptrep8$i6H9n@pzlyo#u)pWFHGdRO*QDISVhtZm*@^;9*mB*i_m0ayL&oLC6+t zYtqR^+L^@IJ!b~8+@~TI9r4HtvDTsG_d}KCcjHMJe&L#R8%)3cNfkMoSE@WUlzeNn zLG8+1!{h{Pgs;=XO!(OHKQw^JIl8r7Vqj>8>3wTF;oS&sedD&LN;|~tsczP~DO2`N zaWsu!j`QitiENcWH*;l?-%-?YmcSrDsO$dipU9puF%f%yIhVF#o}M);rtV$Z`ljg1 zDMaF?W|KrVg4`jZ?7-pU@3Z%=b0pamE$9AN2=9XK1%w3e%zqOJn;VM|`8QXWo|_(x`$(G_Xt*MSC@yVww-qY z`$Rq+sqp>-+hFN&J1)a_&)p<;c`rN813}u;)f{v#h*Rm%b|R#Y6nw%hh| zDj}L3)*voQ?pVeh!@IR+=gJqAut{ZfQ-}D4` zxU(peUVh9C11k5do^B9J5|3Fx#e9u(^2j)E>5bUw@;DJxl#b0kos!fCgwJn#R#KBY z!>w)h-ZTx1LAB^*xNZg^q>8L>asYG4<7lCiSL;b+o^mj}kMy219x*=6($IO*hA&at zrnbWE+S4|?=6n848rTZi?HerM2-k7!E3u@L7aN83hOuqQy;%t-8YhsjjIccCq3wv? z9;p8{?T08wk3MJ-8s_&H zuDzDb@X+GCViw*E@$rOsa!)qOto#_RGV|;og0t0iks6dy8{Um8#Vf{>F@j4updvSg zT`stz>GyiT&pouF&E)O*P*0~>@s!Q8J;rxtb^=R9ZU&KC-_YeycR ze`AQ+@ArH$0&_ZWn5vkMyw%3+=+kgt_@Zi0PYvBHRE>Xb$*DJg&mY|?GJbB;+VFgz zqk_N*U>5@Fc#UnaZbCYtarl+{B#r-R!r4*jz;auDmGa2fAmO5c> z3wLTi!3>QJbuIXrZ^v$eT(PMs1vSWjpXf+cDR*o%BzO@?p8eeSUcI)Gd zZIgLQwd?eJFUs8m#ccqMNV#=L(Gso*5J1W7(0D~%S2SF9Kd0sRN3k!+SI+vE$O#;B zgk8xnoZ|Jd$7|ytm?#;MIP<1(qwEgy^lU-Hr-F($s05-BTayZ&6=g2Z1_h>$OY4KH zQ4eXE-Ud^}gV~!;Q3$u5(d)Ie%W;E?HAW5ov9*(djqK^_fAMojsx4H5DWdRJlUbPC zD1^1zD0!uf+-!Bh#!yV>w-DbS+v`mB<;nGIuDP5o?9p4xtcfh1C7?dZendX4&mAdj z3&>aN*2|TSg51qxNuO^7|BdGfcu0n(3$pdYLWG80x`m^;&3=8#16AhgW1QWc6u)ss z^x(FY%C_-xA7-ERKWlSF9E!qr4CFjBKLw*?(rX$w-ra)QH@obp4#lq7jHh=R7k?!c z#kCKj8hqpzx^_J;p-RMRcWpW~9)>)v%GB+|xrxzz?-y%)Z^}JllW-|5!ZG-@*>$HQ z8M@78o=FA$T(7KEk8WVaz3~`hMkaFPkjtCM(S25rdD{$;9lVOzs5Jal_oK<{&!5|9 zjj!nPjlgbSLfBDT(6(;vKJ8~C)<^ohT2tdx#%?08itVD$^)v1OZO$>zffJ!!$le4naQ@rJLM``7N@>zI!it=O0 zs;^=5+a2?nwn5Zz?=CzM78U$nVWC)GC8GcF!957`nV9o-S9VgU{)aFL(<7>h4G%)r zye(f?SijrvIl0tp>)i<2mS)U7p-Y!8vX?cOjokWv=y|zVe+B$R_9?qB=2Oe8)9&ez ztGymHsoeM{FxEDKNnJKnWd21WJ;AhXoYt=Zd9fMCW&;&pL!_cJKiZqB);~m-G)uTN zWJX1T+F5<=Px#2z+jJclcyQ=FaD`!fs;j~#zH3@4BeN@;r)luQAt>k1QG^tEtassM zSI+on!d^bBq6<~5ozw2vobRPQIUVS;&ziM zp!BjkE@iJ~I({{+U2D>`DPBQwrISO9b2G*^KI*F8xyGknCu0^2k`QZ##jzb_?lP6PhI__3VawsM z?o|Bh@3wMtR)EFRXlRIdG1zF7AgcV+q{+N2VwLP7O+`?{HY*qJ>yK?6lu?|1mJyoy zRjuDYAT*-|+#mIcdBlGDl?P}ErD=!hVUG;J9^Un0D=*>dYD)!6CuOA7L5VUkeASgq zdQn0M*T$^!GJFw>+&*evQIb^e?(%dGM;~G-EkVrw53&2H>cHE#-vb*}uuGCc*48G7cH-5X-a{XC&X!&&ZpRI?KN+F8)tnP2R^Ea#h zn^ph+TD;-m7JhXxW?H?!9%s_sSx+CX%hDo@SP)iRwBX4P_x4KbrEP&`{Y(LN(nrjo z+VM$rD#1FSmos_EHv*C@xNyoBe;-uM9I1-Q3cnXY;5U;c8Vlo83HXjr(vf9t6)tZ? ztc8!0;tI}vmpLq@&-pQkf^IJ;O1tJZB=VOj@%ozVNTa_lO_vN;$xiw-Hkq1;STii# zFuh~If}~%EoT@3#+6L8v-NXr*fh+R(2!D?PH?ILdOb|>Omq8Yz-8YmhknUa=!-ZZk8A^aQQedC%j5)R+HTP?Ku7eV?f8#=*?0Cp5UcAU ztFb>;6rP+4I)`wl@1I}d8}Xk>E_17cl->1fr)0l0>c3PfC4{(J{p`@<^FYm1^?i=7 z$Yt1`o4cj%f$TbW_?JAT07Rsmt5MS-%^2mC0@SMTtC&=t@vkOzgNX6`O%1_5h!s#? zZZ#pJ`=olyuh%Sqh(avKjKeSEMqRBX#Fs9f0L3X#7I{p`NdSc%4)NxsnubaLA9Qzv z%k)M)-+oGsRfg~G6-$7O%JDwvNA){UKTe-Utr=Q8K4Kw_5GRS`s+Vkaa^r^JGbE%B zcLOTf5xA9~?lwU}0`6gL<5TEIi`6gAOabPxBf!0JHiF&|ZLLrmTcrZ#P4Swy$F8qp zTE$W?LGxmBt@Mj3c@zXft1v)o!AU=)50DpAP5~`3pq-_y_erGaJCIW3Xzo6&L zCn|2O#V4gQz5?Q!bMCd79<_!no@~J;VgBwRL!?4~a?ZjKcP}BrRshO>q&*#X0PzVT zrS&Gq1{Ey6pI0|^63nP~GHy;XcI*ld=so|ieZd;cumRAdx68RWsfb02>gTxk|E(1I zKu_Z#YE#h^3s86qj%NVBCTT!7dWzKBeKSg=@7n|{Rtfx5g za*VAqx7X1w_#X!wX`XfOy@ar*{-QIz=mfw4hJzA(zl9K>%UN{%qp}27_P~TL~ zXWgm2d+Eu>PqTyBPhMKm2skl^3#UeO3>5||PO|6j_?SKkFtog=XM;1R7eFVybvK9`cSwMp_T)Ac^ZZt81-LbIy z{mLjHJBT8J8o0nR{=xhwAmyMO7dMQbC5)SYyKNt~&cDzmRumKjGxyarY8bPvnK107 zL%o^mJUoB}*B>1KI)Jbr#4nV}Cr4(AVq>&v0ih| zN7#iw9Im2#st2V0r2BlUV>qPy(T+b6^;|%f7>7sNe+TT+K4)*cXJ`7V zgrIABs1(doQ@sCnnjKr0*Ig4KHW-jzNZxmE@vdhX!iMMWWKk5Xbezg@b^(hq{cMSC zq$^mA)nGB66Ca)KscA$}6uO(0!b`b895a)!H%Ym~A#41Mi@WHlwwdoV3eagaTDfdM z$1kMKQ}EX-viZfyPwvOTBqMQ9*VWW>0o~2=>M?5kcGrzK)}>v>mb?f+6_rSmY&%Vx z741rq>lEPc4-zXf**p6Ie~{PQ4RkK_egi3kC7Ema@Bu;#+@ys}NMFEp17e&oxZ(sP zJ*iI7Wjy4rTIcIkpo7r23olPb>3HtmQ3LTYBxuj+Ct&$S&2N^cn#Abk?k4C_bZVT> z#kSPz{5^idsQz#CElafv6b?@S?Wg*PSUJIbbHjHCP-0!U0xA_Bt}0QEPs`$lxwt!w z>x;lB+!fdBXdcMoxQ>h)>^KwQUuWymIFm}K|BA1bV{3!K@AtI}edtelZ;mfH2nhnb zC9%7@^jDWiIb=zZ3G=g(k=rmN(rC%|(%6A)n@p!h59?*@=a_Ata>LiPA*<{65u}OI z?}=P6SEoJZ1HvmZ{4>bz=(-%tBO8-cLK~ieY>=|eMkahLqVREAd3WmCk9kB;4fPNn z-8uA%>WdRhgCbDY*MimPAK0hVDee40?q28T2xg~(__d}>nGy`w6H zoNomjgH#c^f#W91*gtO~YrOe+o6*!9*pE?yyMfW3jF20x7+wY|nri^mMqfKjFRdT> zsy=lk6p;h7pMQJ?FSu&1=7l?x?(BvXu1Tq8N)M$WEQAi&_V@VbePKP~%p8MCmRI_^ z1OxGuPeZk7HllwVmV=6zv8HT;MYO2n?;*25>>5+KByu3T4L?2sL6kLmp*R4++U^Hj z8p%H$xgj(||09f>w?LRqc2&9WhMtH}4eDpb~h@k5Ugmfz4g! zR%p_CDxrL`E;on?6CBYGxi`iMd5!A9XF+RU{KY20ZumV;#~PD?@E#`%zo-d@6S1rTiy`~uggKQ@mF&nMZa8~9mF{1Af7yqu9q0_1VG7ANrMEQG~_Vl zlyuo?XM}oF#a&2@skQmaMRJEHn*}M^4jIgcoKC|tB(O#4!Ol}S_^y-Wz!CbjT>o~_ zOz? zL?1|O&^bVRsYPk|@GXiZ8i?ai6#Rq}-X=7h(dGtLL%v+fg{&tJQTUi^*M(ag$G9^P zPsG@#rPf6|Sr-~6$&yaQyH@WO=h0A)t4|cd_@~nZU}KA>n5J8h-#;brp|pbwHkL~Q zz-@)AZ08`^jf3ug*0Ay^M<=_b+^D-PX-7fnNB-Nvia18@2(#iqCZ(6 z@*u_TOnDaZ@$v@kr+!`APh-Hv#LCK8MHOzByIecokGgs9e5 zaQ>2{!=J8wXBOasu2wLgj!7O7qnp-#s$`ZYROx`~K{umv@z&WMjf-{UW74@J&$TT` zbc)@sw&NEpX=e$M-Fm#?C81_3Fvp-cP4G!)+8374(?yUPxVjy`(p4ji5)JRI%oZNh z@x(ITg><~1lJQlw*BZv zURGpUi#T(%Px`TE%Am`L*d(vt`KH8z9e`C!feenlTW8@ALwK<0I3?#DM#xV5J$T5}OXg!kP+c zUJx;ttM*84pH5A&-y20x=Cx@}%D^w2C%0(JEtjvrJWIfmKdAAufym@A=8NZ|17@)& zq?X1!CGpc7c7e&k23z<`i#>UM2hCV^R!deF-ptP|b%bg6Z@Q7McB*)U(o!xm;FB)S zl8((TK5f^PwbyO@G`{b2eoZ}FkLJAk3uoqS^Z=DR7I2aZtF_mu>2EpSU3E6$99}1; zN}`go`s9c${}jLLl$c!}rcEKv$ZsMqn)GfhG(^E^dRpYlwuc)*)`*5u3~i~(GzU`& zIs%CqsDw3(A$GLw$T0mzq>FbI6}t6kDJ8sZ{i<h1MT>EFMIc zFw5U#J0GlB>JIX)Kxeyta0d%7%q z_de-O8S4h|J8kj=ZaBgrdR&;j=FYI*le`fj;?Y_&_+G{X&C#l}>$d4o^GMcW*FzYh zWxJ4Wu_gO&V@k@jD@?baGPCRy@&59xPp zaAbuP(&1!}3aqvqmv%=u;P#{%2hGJrsfP(Epf7TjN9wgOZ5-v=tk@{xw&k{9E6aHf z$Y7zjyx>~mozR@*BecES99cHopCMdWES*~F4s`340+W7UN(g6A0ts>{q4e6fd%gX8 zhQ2M2aKu{&<+OK8Q?>lbHt@hF;mk?#Y$D8IeCy`G9)pi}cev@yAaik8%d~ski+n#3 znVZ7j8NyKJ^7@czH6SyGwWZDQ369@DRhDPEx1qmi(7Z>4z=dfyW6oD8jGAPmxb#$Q zkq0_hZ(8_O$)|yew-;Fcsk2rYqsq-a2zPSP5o|b&mMxh%C~_LX!sWA?;<^sEE(p9k{YCBP=2|bdoZ1C&J)8%#q43sBa4rx z$Satjtou|x(Z5hOF^C01rJ#3TGDXahfeRS{+r-dVI8A{#PCjb%b;_2a$8jox3KoMo zrPA@wc?PFXh&N|*SI66}+r7=|Z7W$g8ZM2s5`VB4az=B8(vx>lDixc}G~dozOc)y5 zx~fcod>-K)a@x%eL0QTb>%)P1@$3oI@`2%NOrmS7XcKKn?f!C>qf7VSB;0E=tJ@lY zR%%-il-@MEObM;f-=4NQMPnxErp=ADFRWnCDfd<%rAZrY;8Rbq*aGYr8)aETQR3FE zZMJie%5`UcrRB`+s7>Tcv}*-^VTKZb%3QuNv+&|i=7?w~zZYO1XB7mlkMblz9ZCNH zFd#?Opd-kO?-v^L*dPnYgPAj~L|j{jQ1ih8ODblC&Dk#DisMbT71Ccx*WAIf#*y-Z z<=-6X{x?!GjrgM1%eb%3i^Y0RR(4}5L>MM|{PCXpwE4vRc-I@2ZTMNq-j(C40))sG z)Y3WB`S2inm-dKF75P|tMq5tu7ZD98m&yjDasuq#fVV8qk+k-c+2qt%QFKn8xe3(a zgV`TkgceWe{b#)Y*1kOZ?jH6-y!)Ok&`q2{2q6d-x=QVi9xJ?AMG;4KT?37UUvR1q zDa(tNQMMK9HtXxwjx6!lu@7+29t+>?H!fA#R2zsFf*h8lw;l0$spBUDPdoi$lA0bV zF+>{gaU-b>=9>=MyK3H9JIY5g+fTi?11hDoYuH5Dh=4WC4dzywoZ^Co=cj5$79Q^1 z!;cdc>tn^RMdD?<~m7(RaULpwxiJH?iyt`m7?YIMd$#hy0H7Z#tqhd3lu zwL5<<$o@zcpoN*IZ$fxLzH0DuT>~qINV{_>SGu-!6<6+^m9HE?Lk0f~%#omHHATajAo5$uu2vowTk910s?*DLoRt+b{C0GSf^o&)%iCPh zkIZF)%HrLMP50Kh9RaM{ayQG(nxjKory@G~@}!GgwoKxQ>iKYE0%VXJ`mW zEaVPOOSc^buB+ql_Sh5}MY(9rul#2)yBs+obZs{h(|It*)ss2XS+Kt%5E~u}U-@N& ziYLoeXMaqsxvdWkzeTFsCapP#zA=u zU7nnEnG#J|&b7q*!}wifTln}pP)N`jjWqGKQD{nu`;iou7|~qbR(bP|a<<>bA=TnY zGb^+4QzS`Jk(j4tfWx-8lqSs6HH`PN#}juZA40x=AL+)H0O5M3Kl^=X-NiFw0S@~v z^){O^J}UR;Wr`UQ+Jgd8bT^^>;sGR3P53nKhF0=v%c44UfH{#-U^!zW_I(QkLHs-S4E9EnlHrGPX$H#7P(a8FHSIB0nI3U^z|pOgcXey9WcqlspUS9 z6giM$3U2KgMQx0F`xy!@6s*GkfH;WIrnEqp%AW^#hRf0_xdu+dgXLr?%4eah( zp=b4qSLAFqRV-5c3{5%Vn+FS7#QtagX>9i|D)_(ZOFxvyMU_k@={C$+P3W+9)Ic7A zKS)ujE2wpQ#UFfH{m>hj6>Vq9Qblf_mSd>N@Cd5mI=Ca^&WuO|sMLlb*bu9EOv(q~ zVsq%?=!7};;>e5pt8$-TU28`u6d@gOfMlWYww(?xD#DBE`6Ma%$|L!opntl^qS5^4wXSb zRlmF>;#6t5BqU?9?d(~Hw1pFfdtPj*^=TM;iF&f3{~`l+ZN7VlTk^O>WXW#xgoG=k zOdA~V?>waxS|CkmF9cqRuzv74ndEuH4c;vd~h z?o%0B&HRYogK->LLE1+c|7dS+p+N@K_X9cpway&zgb&ZXyo{QcI0F?+TnJ@3^tb1l zlk;acA$mek{n6>`$2V5}6LR^Bu}ZPwHP6ODEM#vh5Nq*M@5LCjd8XYF%{{B`=V6oTptZ;7>$ z6eBO#_DG+2%%th@>0!+uj_nLxFuVc%f*RMLsrce)utQz{bnd4!eEpi0%ndJq^Ts6z zv1t5p{GUwKR0EA)KI3ZOnhsx4D?=;X3;f)vtk!@1+<-bEHJ$%hoKOo>48QjVn3GQ# zDF5QLlpuz`Y729(NBna{@r|{Sc>g zw?7(eTr}id^cO(b@kX)E<{N*y@#Q2DRc*?Ro)q%`k;(gCpachRk@igo0v3d|R+p?@ zOUPs{{n6;kkq^jFfb&pdzydOsTn07FbMm1cKi+-)($T`4# zG#SMFG2T-Iu)tEDGXf zNF<<3NyY*D_RZ=wgOCAps7}Fb^dMxsmR(c}`Yba?haB2tbLMOv``&64 z@Vu_mqH28o>)ofhOob)IPnw9)?ume8E(q!9d4rpmog5)JYE2+Kz-)MTqI2uMkx^9RpT)0ET?PjxoV}c@`R~Mky~8O3 zIuyt(1nogk=A(GQf<>~z@{;|-3r z=yy!j1v_S-MNxGt3cJV7uNO4bsB5Ks> z6o@MNfo*XirYw6Wq3Zh2rsh>ex*UxF%`eoiwJ~XmJ?X7k+Po-g4HNjzdEo{7-{=q_ zpxAIP)DpBKV3SD6Act@}n$to~&K%mBOb4h?VDB99rs>e;WTf|xnWK$ihGvi{WDzhF zG2Cn3F9u8$g1FPd(g{L-a(0S9r(eOZ`Wx8&IVelE4#h1z2!iu0dK;mDpM2IkB^#ny z`kgyM(w@EgmVmDRNkIY=L+PJ>!~WHLz^DbFdn&T4On{ggZg%hcMJto@=;RFMQxTw# z_kZupELIy?<~|)8M;&R7?uGY{*%_rzEd{ovwt1COd*Eia8zuqF(=fC#!rsdbFo&VU zP{5${LlpB^IIzv$Oi%d+q4~@~F@$@ROD@wO;j6yB@|C8=L`YQJzga2xR?AE_SVL6Z zm$Gy4X0eP*6=`5sGluRJC0NvqncAs$yGiz}2O%~Jz9oB*krVQ#p`~5gX3d)ctG}$a z<2)IF*!Gb|ElM5mYWE@f6L8QFXUomzhNQfkk^lQ*;k%vDy}**dS>`&p$Sq+9WUI;^ z3j!2xT@*NXVQ**#&-zeoKyOJdBl_#q zVn#LS!uhil0s)|E%HR~pzDrBzk_!K6E`pi|45z$=�p_z6sDocd*9befwz#N8H9 z8-TC2Fz4X_8PIEcvb4P`4n@qX?1C}vRr^TE+=EbgSipe;UgV=2pgXyzjeeM(7Yu^F zztX@87a-2~V4`vD2w!Ik@{DuARJ?))^-2-z6tib40SM{BDV-?MQ+SXRaGHC^RFacYuEM(rVrWg{ccn$B9J?u8hu0L=_2-O%vUq0Cpc^20*1Mj0 z`w#5%{1(-^_tg>LD2cDZkS%_ia=c^JG5o`}WZb+#S563uJ`{>ouDTh*f(~1 z)gezz!`w~>M1S3Yzgfe~o~ta#sy8P;@Pdzd@7a?zX5;hF6bDK=&(X2EM7Cq<>9?18 z;NS$2Kd(TyL(wiMb}ZV`tq{O2Y_{rMNZi3lW5;}h&cvCZJd_t~+5Pf`x`$j?(bmof zO~BQ_0dMhr(E5Sz?2ynj()wcFDD35Dfa%P-QH?*2khp0y7(KNlEbn+7fI)G4qEeg9 z*qM9TnK3FC14A}nj}!DN7{n1>X{Uy}$& z7oZ(ck3xuxB3h;Q*h7cu*!_1o#>K-Ppy+<3JS^9$(x|cvY??Lbh-f3)^SG#^<~m63 z&GxhMf;+Vpv=qsdj?d9M&k8p5j~=DXkimZQJZF79g1CcSo!vNn9cF{4O_AM&w;@@} zgZd#Ly`g#yKsz3P3ozT6QzT$gR&`)^Ck@n-k2W{J%3qQvWprOx?^twq=}wc{o7;ec?z3U@cp*R+y#9I*u|#gIrL;d@>QZiLya6E%w=KVR5}1hCE6 zR|9_t2hq?VE;;xP#5+JY%(n-c>)9>3GJk08I~#a;4%^EMD6bW(BNl)&{DgS=kbrlD zkTUs0H$aF0_>EbXMJ_oTOzKle8;&+qe`!PY*Dfe5oSw|yQSrdIBHCu{B~r=UsL=rAP~W<_qbW@JK(u4 zwmjRQCu*3wWG@mj@b8M)`ME*uh!jXX;1N4fu6BnyZtcngg}P!TGNK~DdenZyI%D5D zDG^$Iv`NUVLt^_jW0t);FWC)ba@HwpR8IsUc3){ALQ=ej5^!otaY57b*r;CNY%lh$ zVfF{)t@n|)$a1f)RV<$}+B11J2>0pL#(nB+t(X}VeC_L}y6-$SM4wvTU_xH{B=ikm zIJAvf{TGww*pOoJ%G z5tScC(_tSg9GDCP&}*1bcm$h%+%1)#y38pRwUm400wxet1RUK8;(bMKQN=)Y{txM( zOX`)YO?`^R#&K6>-bAxVX$dQ&~_7gZq z-tzTjOWzD;=jvO}TRW!t7cMhT+PsBwWeQm=Sk8IC7FadZeO?i`Kf+Yis5K?|fFYu! zga~tZiSA99L3#{?7*t24OZCxplr(2~fu5R+a^xwGq>ZmB&uU$YSR0KglP)bTgK-2K7P6g_Vlm$z4d~fsJC6(Va zv3*gCR!@ z+4dt8dqx|xqM^9#?s!TI5=hQma2`^f(v6~efH;;3v?GA=~JMszx;QPKN5S#4OkBD?f0~vmsi2R z`~%MgE;-t&HZ-wQgn)tSj3287KTk3kjxE|B@<869>hR_FQJR0Uh3i0fuEg(vI#LB> zgbd8OL+zl}`%Gsc+hOcG6<1!<>lCX>pS?g;^N2TSg%tmRc{Vb2^Fwx0_{;Yht)_KU zk;oPn9Rcx~E0IDI5#fAMQA$pmYf!}$25JMvXJW1ob&%<-X|z%kd*gY()pja#;2Tt= zZxhdL^nTa;0CFJEdGM@so=*i@k*DhNU4_m5Sn(b0wixCun$9dqVvP4Y-_u&I)M21j z`i9wH#DNZlf_!j*rB7%#WJ~PiE)hyaaLwIHhLCI8Wen@yUB|?_rX4;Gq7SH$w9yuYzU7ZL9w%_(40N@k#V_Z$)QWBjKhg zvuW$voh+?ld&=>$+?A(t@JQQWypHp3pts5k+tGSZE<)fQ(KnxiskuGD&*hS~ZryV?WD#9n;+8{PayOn|4rJR}*$M#(DwD4v?y zWM$hmMej&|_7#ttW@)$XFSnd@eo2w^Ok}-)QG9(zwtMcuhyh8t?=MMH5zswoJX2p= z{%brxF=&^CQiG@3mRkPd*2tfA>wCgiRyxcjoUm~%VrFnAh^J&RC{;=BYDT!uyHfV& z4OhOlEr}Q;J~~>EOm%kp@orR(E00&RWLr+1G1+ARvB-bivMDzW0KPF6z#-WK|LZ+kS8kYqH$*a!{ayYDn8arS=3P=FI5j$U7BD&?zTb^DNd z^Q;_bVpg>wLu^RW+=9g~s*|`pDhA)lxiTL8y5mbjfO!tuxNP6NSM|X)IHmo(+(AFI zJ6fG+4v{J}hIh9XjEIYbZ{NYT&sHTP{NI)od>n^*flWZ}kyc7V-UQW?WZeHJMtJ-NhzuAq4t`&C1}hFeW%~w zeNnm6{>VA=ZfToFTg*wD>7={PQ*@z*Zk;}4w0`RAuL?rmW8g1(#s4K&^efbCYAH0s z6hH7lfLYCIh{*rs@ts zNh2T3+1qkm*K~58;X^Bq#&*6>>n4hd=?gy@MJ&l5t*F(lekd{6N*G?1 z6c_e)Fbc2W{BaIy&-l3lFEK%XC|3r`y1k%4_!+zwWfEk%r;rNqURU9<#1?ypFnyH> zvxTZlw-G5@N#;CLpxc$si6@YAMD}%z=I%qoIkD6?bIj%dXtFu29-t#ph^nie!L{ug zyO+FUGBB(IW@U*ybB{MoYoTs2Y+Ju7#A3$7V>HyEK0?{;Z9Q@u+?mYCF~+Hf&Nb^Kp8sjT^rznLm@; z(=gRm0&+TTy^hkU9vjS(ps}*G&@=G{S_ihx!a`I`9`e_(FayV_E<@;s5-4RbpLzql z?jlH|jn_I!1YHIeFNQvB_&_04ZGny#xzH{r+?brPQkr$c-xsn2@5d@PW3%O6I;%-> zw*QDt(tYAR`0aqmSN!zm%6R_IIvshJ{Rv12_1~d@obRbWmX%qM#gksB?@;QU0PCzS z4B60#81nvQ$Gy7_OeW_vt)Zgxi&jyk!rml!8O!UJ{R*QIU zw?IwIEJuOTq3jBc9KxIOtK7@&h+Bh~K-Y>7@gFV!x$eic-`Ak)I=`%z|MzumL3)z! z$ZR`GE(>aXltGC7z$<-xFGRSb?1;Ei*nv-0L*k$}5<~8XNC3~h!&B0c^f~dJ6?xa6 z&R4-N#DMfBEUwNt_cY{ZisO2aM(r^MYPkBf{=D}7#r^tW)bS+Ho;^ba)}i$v0>!Jj z>kUxX9LwLeAemPA_P{PApnw{s!=4>u>I2v~rcdFNEJUcu8MqkNlWG#~F98}g95Y%u z0alDtZ#vYZZhS~%Xs{j@`!j`P(kR2$g8ol>AoS}U$>N1~K#ZIRm6o7hQK4W7nw`2U z1MHe?Z`b*bPgh}IUN=gSaTYWiK5B|2Yhd_XdKF*VM)Pxp#&wQkoa^P}(w{$n>FI0h z8k4a(I8z zN6)!p`|$%fl_R#w}=rU8wla_ z*-R>eK-}k2*LrA(HnDmNL;BBGsA>f_Y(n9r8>oLC%Up%$DwWB=s3ZkYg?Al&7?v0VQC1>M;QzC53Yy;_yImc0gg%Q$_ zb1zP`kWYT<+<2Ed(CBxM@ebBo8gh9w0;9=w^0trOeb5m?N$% zPuQ88FmRi^Cz3yo0G=eX8!yD@uR9!F>own|u#RSyeqU%)ssH`@I>)juU#6jDt}z4tvt8oZtk0_`MBA*chpA#xsLVx zF3ppTXt&^-5lU8Tq0Q3H|1xD(y0Q0M>zcw+6PU&j zlEw{MMc;R@Rhe@W%X@IM!N+d;y<91yUbp<~xhF&K;|h6$hf-q4lrixm1o2a6e^%aon!D(`#o?XFk!s?tY~BZrtdz021{6 zd8(&hk9NoH>E4gIFC@c~Xw2doRx77`LOEqaF1t7sSIyH>n~zy$^Ap~H`&F&i9d?Y{ z*V`7=?&_6-E3%sEJrANZ5WC-Y!F{ve0IL^5kLD zI^bA>yc@VSHhZcVF)$An4*AzprD;QKPi*qSGnZ)sSf3RJ7q8+MLg}0M0-g1Ab zxO_-Y{-yv&&CZa%S$Zhj^4sqzo|vWdNP6+H)#~*+x|u!q#Re(TOS@0`r&HJ^6CG*^ zbF1bPINaSnyJrPe_gNA!Ta%9O5!GyUiOzric3D}%1FjO{)Ga<-P*Od^*OLSy?RKN!$_8Im+MEicd=1C z?OYDdX;AUdj*-uPW&rz;fm7#$G^O8Jvb9u*=F^Q9hA2W@Vs-IrPp5TN4YId>*ZXd^ zvYUl*R@~$57AsX&SZb}vj5QqFUK#FQ^#7#Yle&mnDY9lu^>U2;Zs@r-I87cJcAnbc z^UNE6z2iZ=Q!r!f8@9T6#0a^z#MGJHwejJ*Yv zOK5nwL^i|x`}a4}>cf>!QEGWOzZ)-dBb_|L*uErEZnN1OZL}a9v=ru(5r)+K_9B>< z0;>ae5X_^IwES(0h3Utz&*S;Ubz`ihU`(pF$k%XlpSelCAK$E~$VPcZbkBc1ai;Zdyt0(PlfQQ$gO*g>(rwBR_oEOeWAy zHZ8`_dw0}4Ip+gXQ?SU{Z9d-o&Vxg%{6e$cNl$yH0S$$!9QQtlcjIMG^3iYNK2HZ< z7m)`mFKW~*(e{1iWp#=DPs;Ld2(**(=O##r5UB)*|&(odn*r^DUDsPw5AXRMQw;G{Z(RVltj4 zGJwoa3d`7|gIbZNS@L|oe zf4#~_a7|r%B-wR8irT(DjyJwYgq((UU(>4A6$gP6j)6FPeDw& zoAoKOyZ8!Jl>eAoKH{uI_o*S?QsXNr{9H)&6`1nI!eG_>u1xARR>YRy-$zOu+;Spw zFSjmQ z$-C^#<}8m43qdYUF55h!O}Lvj`SqkLYbv?u;)ZW>Gk2L?Ysu}37erV;dQup!%n4Zy zIAmK@?k3nn+e5IlOT?OIV!VNn!G@2bk&wZQtcTZx#D9kD5l3ENt^{r1?RObnE&+a+o88($f#e2cD=W7x@033FBt#T_y%4Vmrl(`-76>!G^US!d$L} z=L_YY=~^bHl;7r{OH8TPVt}g-=J8Y8j7GQcwBL$n{N?2BD z^tv|8MN9BojMBq%r zO>{NIFH50pMgy->JyilzEpAsyo|PcIG#e=?;M8$nVbIMgzGw&Tb+W&3J@i?k-Hu$`eEQ~h>{!W z8y;Klyi=*lT{|d3VwqS{Cy7NnVIHe)SC0hve2B$H6^#rd z*~A|n41dD%2eCV~>O51fyE=C&Qf9aGkgbjxOuht|{MVbZWIgA>>^4&T4yv9X)XA@; z;uZy=>5caIgzxEbr%9CRd{fWI5PGZCWt3I4;!^d(9o$8_RCX>L}+9o>u5o9*1{HbyVr@V{?Z z)_XDiR`#;PM&A~aW9@Fk@y`HKwtOaQITKIA(!9m$W3)GRf--B=ZBW~wZnKRena%@# z#k})DhPGKP-9VzWehO=>0gsc&h*?Z^quY9zS;QApw97CoSv4Vbf__-L@I=5_4r#4= zskZQoDK+6ln1`qbIMUgjejJi|2u^vGb`II@5VUZ~WD^P$(sQ0#_#B6E*Nxaz&BfTQ zU6|m2ExnxOS(6u)+poV|sE>N5EDF0C=$YN?a@^QMnRZJOAI7eDfo!o3-)ov{+WDtH zq3f*zRFBI2=BsK?Z>JD=We1>g_F)_Yua`prCK*@ZX=UM}^TlP5Ora+zc=be(*obk= zO|Q29`@4~Da$|C*6WNfN1xkzngY6*agW;i-Swm%{^~d|f@|n!f-N7MypvwYEyH0C+ z&qZ<$x3Z_AnbdgOCzv+E&$%BW5#UX=^g(F^%DO{VWRFzbqy0Vo6Q+;${mAV;<^EXq zsbfMRs+V~WG(ViK^q?}|DQFvG9LKxF7{-DJRV*hy&QT|Ei`j5&9*Ky(J zpH3PFW!5KaVKvTSW!eknGfJH4MDcg86KjmAC?Qw*8h% zje0Nj7ZRD!-VS+{G=q&H3_gnob=It=zCBi@?XXUQQ@8w}YCY`QwU_Sm@$6enony08 z`j*p$8@QXrlb>_WOLF9p)}qF8svn~me6)|^A}IeX+0fR7!M4}%V)-nRmRuZLKNTvn zTf(?TNCto)wUje_mb7uq%PYn&9xt66bhHbgCt9^?Cb!xlc$OD5HlK~*^FjW6c@bTu zS21F(ZRG7jE%^by-kYId9B_bvz*Ry_)lPM`*vZ~3ms)B28hO!|eyeGTXJ2s^uDe{% zqvYFqTl)vRyv_k|Emw4bH~&>rY#u%tMyvM$0&kkWXAW$q->tNGtV};IVx2Em8R6IG z%M?my1Q3uo;cPvdW%^(7D1}N)JTG-CXnQwglG6 z8eyDs0=}J&THF>=g>Q=Q;|lOqqXj1P#qT$_JzWI8Bm>~FEz~H^=v5LdrAV~b2rDhtytr)mEJ%ZM+R&DO zdMB!K*uHjWXs{$#sBX+EzsmYZ*J=p#kwqK<7*&j9TM4uGB$_T7)v*~ZAN)C}#~_J$ zr$E2-dSKPDI?#HxOb=;oMz3%9CNig4Zo$UD_IOEghrs+BiC}?H@fUpBU-`I05PF_} zHbpD9poxRG7=zREME558iPYGB^o1U^v0vx?9my?X;q@y;)k!&R{k3v@h$(Lbq7w>s zINa5%C9MuSPQ%+Dc3z^?o;Fa+AXij_JL`MbCOy~JUJw7*V{liZ9h1$X3~iKU>g=cL zGdal>%2O*9=i2YrO5ybW!Nil{VO9swI?w!7S(}ajO^+NAaQUe!HY*+wz$Z9Av zRVU3WFt7Hl8=c$jFRGZbn#Oc%59CQ_q7Zx*9w4$Hd>+*W&RhX+i6sW8n=}UpcRGq6 zUr8nn)(C^?mHEBHFEG>I$QJI9$;@0S9Etw986eqx7|NcqnA(QM9%_V;VeVAJ?%om4 z;pzW*hcFR_xihMH!>$}IxmMPnl*)grGFrMnIB%*N!y$f^{Ivqk1oK6w+$==i0pa1Tn%{KEI&yke0JAI5pY`Ih-()>;6mL>%!d z0GItJk@)sd^fMV{NTtuX!=_SJ4acY zcHu#uAgPaqS=F&~{#vCTl4FWQVC3t*#q1lwq5}bWdz}LAztovN!i3!3QBpDH^;1tt0)Co=VP8469Zh)633qE)n`GF z2x6q*(&dj%K9b9i8eu^~zuw9kjPeg7=S_7+0qZi&h&MN>k9+EnU~0|Vo=hy@@|ms? zwuM%Pk2_jt#Y=b}#3|6bH!b=rrgMB?4vZUeznu+?8Y!b8Kylj>hDZdLof5p4VvH)O2S3y7K zX|40Xus3*&T+3q4FoFT?i=B56<=e-zYh;)O8ed~1iql@wbu3|mSKu;~cLdh$C;&9r|r&e4%vc&%Xt;PS^q!Aiv<&jV+=xB)IYRL3J3Mbn)N}(BQ(P zhRFPIfUW`H;H|b(7mJC{sfi)=!l*&VxxcqPWhT?B{7Liz0J8O$J(OSodiG67&Iaa(V%phaQ8Snjp#_J# zrz|++j>zzxasL^k3+jJAGEFx~aPA7m*3W=5>}(DO_ux1Fxy$_t<`j>d8H(4678B%o zXt_3OaG&e{+8t-_8pQtS3?lxHunO=e!U{+g#mJrU9V;)P%V$sJhr@|MpYtV`LY}s! zuXz$-D}XiUY|SH-`A1u9isyeQzjpikx^Bdb=-C}_)Gs0| z-#Y;ygjQY=(3So>-%4Pq)s10Nt#1%YSm+}*EN2hM5w zrR}x;*UJ$ArGnOPFg*v1F_BG*NiL52tt*88y!uTtC^X{zD>VMSA_rJTrqxi)UPfX4}jfp61Q z)FtAcBZvc(c%KNHWS(j^h6sEEXH=y=Ws27Ro`o)Im#OPM8bx# zsIb+*t^QK;?!Y&3W8FYOU3>JZTAXVG69S3d$<^TOKYp?*n>G$DT?FgDmadZgPw?RU z05lg-glJ1;RYs{xQ~}bepBHm^I^~TSK;X_c<_VT;rJVxfalq7VG!NLKGxgrl;3now zU&AOtLs$B*p}Td(f7sBovjgyAwWn(L8t~=uynxotf4EkestevHT(8IbN-@`UtB>l0 zfu0Gk?$@6jP^>lP5b`Di zG0xN@_aD{d;0t!K_gm;DrH(-_Bv{j}#yngfE>3-yQ;B!-nxklujC6VuH>CWd71iwF?{6n^VS7$*I1<>^E%*b1F^7w^9H+SdN4 zCj=mtK@AY}KI`#0t$t}?+kje1#eqCcx|Nvc48X|nr7j?-b=i@ql)G9Uf=iDmcYyn^ zcZvW0dJcnh-MoO<$*y0{%kKamn>`q8XXsZIOdfp^DNdfM#nM4d6wY)OJ%SSb&&R!- zJa=|>y%h29V0r|{ONi*%)tv&g3T0C`HB&_8O6;2G;~_ft;Yk9MY_MkM7GMZ!_!bAK zZ7kRk6N|VFqz87{rI4y~{Dkt5qqwG|blvaVq#hp<*d1ZlEaEk69|LTDJFuF3|HZK8hK? zO>;$Vk6Nx>b>34&lEjzsj0KHP5mDh4^c7hx=Y+z0ph+~P^ zNzY>0nB~X3!v;=OZv85}Z}x$M-tq+WB1;79b;_o!S6=?f6TR`+r^cZsyHt`NDYc(6 z2^Tk1>Q00C<}K;Y(op^23$zn6Fb`@obZ$TWbroHNvf^KG0hQoa1|eZ$$h>)FOZkre zdi71T@6m=rDPR*-US`QI+NFPT8F6&rUt7nC>kG;!Wt?waB1DP%r}LEs4RKCP_6lEk z1@Feq)zW|{(GgkMYwjhPv}&@qab=B<$LC^=CX-x-bmzgzVTpXDjpU#UohTTZ0DPg@ z=5qr9S9d{3kT@3IpKN6FrMZJt@~EeQYR4tjsY@7E11N)LQ!hflsGwxTze@W9hn+|B zV^$&fPpQ~0@SP{`6jHeV3Q`_w`r75F6BC(FILLn0(31~L8O+s! z^rL8#=-$tOD5vEY#W8F0vS)%6UouEpsLOHqjA`#T9mG;T?RTCzHvEHxSSLk)cE4vv zpPKaUirXRtej^3Jg_9>!K>NPGnMe2sr)djfOdHH`daB zq)Gv3ii}H9HZ76-kzfpv^}BPpv5%EGwR#EBuPtr!%d_;Si%tf1^s);XQ*26F?^s~K zD61LF$1llyPZru*R#%J|hy5}@ogP5(?}m=@&X0G@Z_GYw&{~ya&2u%ZD{PM?0du>v z+Hsf()Q>vhx5w_N&5;lqTVgUYXoLB)`oSw%@NB@5pBBZ6kD|fd;T#?a1d*~{quzq! zZMhbQi^$VyyX*j!RBZh?jd@=qEI`**!oFrB*jI7>ggH`dW=47Y5Ymbf3w(q%B;?a= z-zr2_{N-F1M=~NMtTN)OF{pOfDa46q-#|)Kapj~(m%OU@ZH9q^rxjyX2M_V^U&}y2 zj^bZIZZQ~tfM*S%{OsP=p<$PCUPcC~o1X81kL>eTtJNoq;H{Ff+eh<9X zAo17<@Wp_9r*rlRXuZTfoaA$`go!iD(-28OOa=oY%O@<*a>Hpvmc(A46CJB>C#>Vs z&a^({8)u1pW`N_*26zS^jRpIAStJ5auaxT}9$y&C5}-RVUm1Ll-jzMpf9?i^-LWUF z6*P_Bh2=wzGJMu~KVDyI@!BB#XvJtNVxdhtn%|stbs(sPYyMNvC!3zHn$1tB>96yB zi-@q?Nbd^PzKE#h|9sMOH7WtGWJuv6U#?M&1Q4Q}E0PQd{fmI|d z1CalmJ`MtO@Z23KsXdTkASdg&#Jn6<)D1>7X?&)%TVkA8juSH*Vn&1*KQ)*+06Eyr zsBZM|>uhbLx#}UfvvVbL zvGzn{w>ThB-p%wME||uGe}tP2Wf!^fb@VJ**{_0pUGQt`1Sa(0rY*JH<0;3^6+_M( zjyK7yauY@aN-39V-ST|4$t#z~GHA@od>4`tSsAqB*|5Tq<&`40{DKmt5VtosEXv{3 z=Qz;(5^0k*5`q)XPx_+Sy2r!i+Y}9moB`a)%*U_x5pS$rxg?q_bH)cnNZwv#BE$86 z5h46NR6_Oisd9}q0Xc^a>s9l(=fRh~KLN=+2)320e?LzGouLqk`AM?VZRps_3af#F zz3dIoXF$wUpD6@rqgDH+q&5GLbN~VC0)I;lYUoFBo%i9GiAcF^IXqV5M5)ZfGu?f^ zv=PXAaUT@tL^gjgm!`un;WZEez|(NSFfANx&19fB0NyMDq|mofetJ0|P!Y4w4{$z! zJ>)}fR4t?^Yb$#%ehle|H&3yQ(KVx?R&P{)!kHyo8hH47`dcSR*{y9xy-}cZ`QQ#h zSU9R~5x21-shz641Eh_xmQH9az;xZ2nR|m&Px|f(JW&%il`|;p8jJ3^JYA$^>s`&? zA5K-=ry1WZaagc4RbRg}TAIxfOO>kBO*9bAzz`FIp(4cNdZ`ZIX$;{yPg5Sb4R#ykH?BTHs>Ynl#ZnB>Nx zq_DFf$``_xE0uOgfdt8@PM{WPYwhLo8*ZhN((rt`6K-|^VVds#y__}=-&rrPZ3r+4 zF6`G{U`!d#+yIUXZO(vti~fpnJAHn`NeUnwl`H^4!k-`qIaFLs%h4>$hdV3g@^5IP zhn;8SWd3q`7EF;Y&^}bf3dL#8G@|kkigb7rk$!>u069Nb6Q29yLmlQ#BUG@_|^#)b-E3A6*5xh2JSaRNcm(yW4)GjfrH%=QaJ@ywzL(iczM_ zes;v`_x1jBlALK1|8rFdh&XAt`jwkK2_HHBRYlyP%{Rw1D57lXU{5!Wx(!$W5f;S- zS}_0BB2E>+a&Nfu9qh`<^M6Q9+7?JD{dwHCQBr@#Hzo;*a^V9c0t=i4|B#5Yx4oM3 z_alv>c_aik(c?H(dQ@ldJ8xrJ=%2g1Kq-jrJZfgY8U;iO&8n~u++c4Bo-OeIYfTAP z4_!rg!r})%jglM3l3{EW)Pl(tck#LE_KclIo`=L|M2O_c>Q1@Ml9U2ZQz9J#-CF}F z30>FtImzSgs49S?JApv@41{csQh=Tk8v+Q&`zgoeXS5A|#O4s!0CLspo#(j&d|?p@ zaw(0}f25_>Z+X=%P=f2;*?db0vi=5*ojb$%hn|`>60@&9Y6OH_NH`m~a&(^$ zcc*Zr%q%+r6B**w@fqIDUp)2aW1XQ^3Jt|HCGNiBCOq9*X1DTN@uCQ-E)xGcgib! z=WFWS5n%e+qyYN9WCs)zx+PE1)9FP-SfEXG5o3YHEM0c w~qVA%2$s4D8K!#{_L zf&upF^#V9z9;C(d;|Bn~j1r4R=zIg8u>W9a9&iK&dz#V7=$>#MklsLK(fE9xvxtG8 z0zhc{K6xyUV;C^x$)0lO=-kMQ6OU6h@?S8b^;MDb2bzAgaG~?KM9z$G@Wn*nTwOUVl^&!bAtL-tO?*dltDU=^Wy6{nyHZ>)5n60b57-yW3E;&)BRT=ERYO`o%bOYP z26WSyHZ)PdPzDg*BJhXO@D+vPx}JY1Z^!57-}+*a>sH5=u3~^a$XkN-?O+D{CHxdB z_oR)Th6)6iTk025JQE;iVzlyxX#l;-UEbJtm8Ae=v$~IQ$*$LIMF=mZ1$6W&bK5q- zDnKw?HG_l~V5iGPnC=#BzJCLa;}+OMZ_Gb*b5*Yz4=jkPFDk{`9Dwnw9(8QzR0TQg zj*%CU$zH&#HfgdNkcDf@wcIBr?=N?^$a)Kw zgB$Az%TrrDU47z0h?&P$9Y?8&w89R7)5*N#;Y9?o6USu9X8#wE@e_VN&$H>umz*{8 zDqGKPA>N$cTvntuH#=qQ5-s14YLuf+;R;8=XPLnjTMt5dw`Z#UV}m?Pg-uK$Hy-z2 zCUzH3GpX&&y*rpXRR_+O1k16_eNrLIX$inru~H_phvQHxa#2-I`%zVd`0fbm#Ly}? z^SvOQ4=pf_O2Ni=ek<&817x`;iVG=!|B`#9ZWCF&qvbGWDTo2v#p%~O1={ko_3~lE z?-h@VzI>-u4EsD|);XI36eFh&ART=0a-DF|iS3SfG4BqD{osJlo2K$-gLEdqD&@G; zC9+bWc(F8a7q}u*J7|hy%=PPlHFMN(xuOn!3dDu@rew#q+fgwCfB}u=$Zdl?;<8a( zv#AuD(igKgWc=7_V+w$cH#VR5Lrt{>uXCWm+4H<~wWK`(P@Dmqiczz9v{N^K$rq3# zHv|9Yw3OqbZI9O{J@E*@1_^3=;Jp-t{0&v$JK?D7t&vu`6}tt1SuL@=U+=ute_3?( z=Vm+*)H;EHkaD*mQ+s!^*7JHfN?){z!@g%6-?P}_;89}m?wW%wD7&qL>#UrzM5!3h zr+C_xf|EWG%BL?f$sL~5_5yC95(VD*Zfy2bJ8%q#rf!=}g9M=B@ce@8%d+*#)9cQTnU|<44#~EY~(xUJOF-v6PyJ? zy};{*?YH_gv~O^T7HTDR{I|mZp4Ftz7L1$e8r}ewWZ}oW6bS zp!%Iro#D$a8eeMEB=&z@b|`@BB!MRxF$onMUCL%=O1hkIZfc$xHvoK8m0HG)aw8o znb-F<99Y`=rAd`{aji;P*?1GyZgE(gf3`xH8Bb{=$Y4u63S|mx@@GU|0~WRZUwI+_ zBz#w3lVBGbKpApAB+EZ7r(~BS!;l+SkfKlt1A1>2IO~RX%YJSFqs`aSruw-V$y*R} z-Gzq~5|oYAtpmxziRal+Ma}4cV2uwV%k#ng><`1IWbnxO(1#n`x{4BX1&GN%xgK(HIshw_12G2lta{*a{N_b z^IKaz0mVZa&%5eRkL?jfF;6R~#Q}$GWz-^(*_GvO`_x>yTDt-DLb397keupTMaUx| z$2EVc2ym+>uL0}#i%#UA+VYw|XTA1O=LI6{-8<1OU=Eb5XO4ow<759b2RHBsP!`R> zpm{CzK%?y}wKQ@aK>IG>&Z){y*)K{AMp^GQP-B20GuAiH_!LA)*L_Zq5T;xxse{a` zTy+OBhYdhYJuIRgIEA74_1`cIq)r}Wl)fz0HSNPOCrK~gU1X9az0es)-_Pv?hWlWD z_(Fp1_pw46Gm+~yv&omJJVhy{| zTrc6nQpy}Le1pG$&C+n|#jMo|>Gn3@&(XP5d|Pi)<(c<0n=>de%j!nl7D~!RrP|9K8HC;*2lYSDbmuO9l7%j#f zPoPwoF(9>H?k=v>cDa97X_{3kNq*{8(K|+TGg)oeZ`)Gk2H-iyxs$Kr=JLDtb9(ED}9$TV`){d2m^&!Sk$x_zvdts z!B(b^w0`?VZ;;bGTF$A?8l^VjWaU5X9J^WkCIG%3Zhq>iYBAC0-d^1u4RouzPk)U< zxVXLz8P3*rG5ZPZ<7&w|_|rxEWra_bNKZOS>c_s+G#&$gzUzJ_AyQkpdTav-D#Q=< zPYU*z^5@nV?9Jkjocj-p>kjgI2cmaR-c2OCk62W~hugAaHh{5H&qb=_U~}A!2wR5T z@>Qt(Wj>e}M}*aW*ZGc%l97-lU5e2dZ+XFXfo1sa?HvO0gX523jOamz(budb_-i&l zIM9Q1&6mHbkiu>G*1@fP1wM$uk_YBw`)?jRVHPM=alf`ls-Hla-P>a~T?e2P8#a!r zB2P;aKxah+_f7Qmo#oVxUQXWpLfC%o@A}{zSJ5rcc&NV8#V%Z3+A98sL;mC7nd#cSns1Y1EPBG zy*6nPCEwmiOnw4f2YaWvS4vw(03ZT^SXX*EWM!1=9qv0)7apE7Dqr1O&M!{6dwue& zDQDzCm+1O6&Y1M>H0c15U$Mg&kXqx_ee|HX2>gc=WZ`js*iLW3QdApk>rS-iR2m7y zYk%9)A6QK_{l!=p?{4jdTvI`> zJ$R*FE|tOoh~cZbCgYc;ivo|RY&u1@KpsNpR|dC8MH9KQklN|`>2dvQArQs^3S8(@ zCvDo{-D0>Z${UoKbzFw0TUSh#z={Tl(lgem{Cr$lTe0M|$^`iEUB01RfVS%rmNXa? zKqgZ14D=-joI=GC3_2v~@1Jrh^=P{6h8P)tBXwUJVo0DG|FUGEZ_Bj=pkBpiBQCr; zp?5z9+7f6Day^#|O1pUU9w``W&8TyPEvMXm4IdW!1=OL;>Qw%Il~f7u4j=%(FK`~M z_dPXXqwuVUATcFO?pH2&^BD%mA52`5g>AXuch?QwGu?q-JxW(^o3WsXQlQ%zrbXLH zj-kc3S|HT%p?#Pu_i13kh_iLf$hlW8nNyjw{6on)8A>k;lAL5}tmF)jeSS!YmqC_2 zN>bgDQeNKa#ln|9v7Gvyk29px&kygKAE-B<&|7kUUK16Bzc@{$9JwJ8s?(+Uj{*#QTy z^6HBve0+PIYs`F$SY#g@e`Bux0x9Xt^C0(xHxpLnNE z0#dLPRdg)@VX*M}Ci=YIPLHeX!|^rWSc}-7N+I$=)%Xiwu%1N4c2??Y;0#5K+1hWTQwc~qGVB;4(;6$+=aY83IP<0okt@oYFRg!^|H$Le+1NG%0 za*R?%%EZZvjjFl!U*gF@h`Xaabj;;oeLkoHnC1-o@+=m_xzpj)&qFJK#h*rWp~{FL z^uXu%AYLOw-c%$*W7>}5osec&acZn-R`bU`;2B*hv(19*c#!|HTEgm2nTBolhD+yl zlYiWi(P{fsCb|EMq7>NC^8&c0exu)^aVsT!`5X=RK1chuL02QizHeqtY6yO*B0^k zpbNaK@qPjr9`AyhdCKg-!S(B`%1tVb0=kY`9D0ol=q}EdixFO<5O8yJ|y;?U}BC<;b{b!-F`< zQvYgXS47}GsJ7GO_ZD}vF#Q4D3}ah4QDKD|awYln#Dc{x`KH5}=B6aWIB@Dht8Ovz zzJmSxIv8t1s95HR%)s|}$8MnB?0OFx<^8>5sbDstu23P8KJ?Y#g||R6a4bpXFNDS5 z3`wzcQWr$lzj_4`qLsqQxH{IdM`18|n2erskF|C%P$AF|FgJU{KlE^3LEHVPDyDQk zxU1w4l-@Y+j&3Emf2-WbRIjUbSh3ilZg~B%-2u-u5vbykyYs(S@r)hIrnz?<7v0zM z5aqbx^}B(Rv&TKCI#rwZ5NTgNsNF?hOY$S3M2+{F#q%5EGDWtA)0pu>yZfjZ35*2g zE+l<6sisYw4i8!Yk#=zP^%5|Tr&WTnbv-46$fMebS*YI11=ZR)?kIXN_k#-67t*w! zL85wLJY9tz{SDyOxJYc^fKfj-^iKe@QTI4sSD=} z@J@1$8w&%pu(%X=#}D;>WN1-K2UgDIQjQugVrL3Egt+Qz9Wb!2jIANIq>;nTa`=Cg z*dNk3(<$d3vuFUb9UWa1eE4;cHqx4SS?qbVmbPLM@on@l@W7ix(vacsDv(|pn-%{1 zZv)zNn4AWgBb+qsokbo>_L`BX!CXg8DXIs%#k+ZyKrtwigS~MAOLX{WLq2lFyT25Z zesBToM&A2cejtc76YCLgdPu`eL0#kKuY|Xp7?9e{DurAg`Q{Z>yJOZcFW?t60Kf7F zc7Q+ml~;zS|NMwW#+#%ZabUp6d#__%%^>&*4psOhce1Cr8EYl3 z5f{R(4mX+6oRk%R9>0ffrQ$UQhCsa;c*Z^gQonVVoYxR48gi!~e!0R*2==}5<{68D}!&@mEROTx# z8L(EA!YR{yPfyfFlxiSz|9nnH1P`dsy$1y$aKO92--4_lx}bdb{V})|_~(|njOHX1 z`BByA@Y5G0yuibIxz!u+A2Uz|>FTbu%8V9$HuE=`5GNIm%Cx{hH+l%pF)NSToF*pv zUrH+gV)E@P0f)aeLJtW|tzGkzx!zK9b*ElA>UjTigb9!;$5d>6KL@H!9<2e$Dh^8N zi2?8SJV2;CkOCGDoE1@9K*LK83xV4c@xJ?$R!I8^9iT5~EyLV_fcmVfi^cgo5i7df zY8jkAW_;D*FjbecLgD2@yC4^x!0J~Jqf~ovNJ?ZyXV3RAO&t^v#V?JPk&16W+JdT9 zg@~~7w<#pU{6NLl>gR9oyForFnKI}FD-#@e-`IUt$1Cj>?|xSy(uDly|DuR~j~d0_ z7#x511?Xw}`HO7h0UN%hdypL)&mByVdaC0Tu$Hv^l73cHHP7R5?=#*Z$ksYJ(2hcX z{!{+B-Cb#EIi8_F>I4$lY>G_i>r6^$G5qbf*6V_W>QWZ;{?O@m1E96m1wel73>&o` z_pL{JMc;YL>~hU?R9Zk5wU!QrS9TckZ14B9-P?uL(r&xp zOEm8ljnchA%GAL(2b6u9n~7bPVI%+|`jESOaqX^SJ@4RT3KLqtCH2D=g$4H1g})uF z3@g`W=NsTq7zZKx6$4)9S7ZIYaxKKQ@~^dS z=OVo-d3+pJAxJdllGF%)ok7pO+q%QLw_T2AQAE zf7PD;AjjyrxIxM|R8@IXEIZj%uM|`gCj$E+r<4D^dOpaJC=4p@-z<+`;_Y~AP)zCj zzuNoqa46gUeMFIz2&H7pQW}yhB}^jORhEoUJ!Knfq3nc5$@3IKc8al#tr%phM6#B# zg|Sw$OZNTyxy`8OeUI-SzvK6NkK_0L;pm^nZ1;W5bzj%{IX~xl-Ysjc@Vc4&pSyQR>V< z>n2ZFKSJI`7&}L{!;|&XP1^BKR4x^Wf~&l`+;+AoV+`6?y)_f@1|!Aw?;5TO>?hbg z!gdbAO`aYVD`m1LH+3*$EVNucaHxxwI{uV>s#0;sKiPBu$R>V6+K=6=FO^3OKByQ# zxWGW2>FlD}Vg;@`KLqArh)Nye&@1K6wcm9=7JiZ=G?sl?$`#8)nwf(HqX!dKsD>zF zbD+w8g;Ko^tDCdF6^TlO{^4thCW9?_0~UixxMeN(A!mTyL(4P9{d)JLL@YdL-TuOv zw!8~mi6iJ4lvtex-ZSWH$6?&lXMA`lUGmMMq~g!D`Q?nxQ1Rd}5882IgqAn%nph*0 zV_34LLHU)sTxiQ;(ZsX`iK^CXA5 zjANXPxr5Ih3f_JpvRcVuYK=4)BLYTsMm+U%x~>wZ(y_)2nRywACI1VN2rUvD)P>lv zc(!rZv)4K9H*E>lztS3gF3bi%LE4XRVBL5UrWP>^#IU?NP$9xNfEUk=^$@ z^b#u_ss$oW7#asg4TaW~-^w|LXkUzd$W_w1_9cWF#A_9yMcx)DAIH0}ws!SjW%+Z+ z{w*DcjE`XAQ#O;keROR%&oU+~TmvE7xGM^yi?V3A-JbRlNpaIvYTBMN8-wW@J5ud= z$n^a1nJ=IsoYEHRZ^b2M`q}75u%NPTe9?1LPY`v3c4aIqimR7`1J)`7-IBvRS^KJL zbM5?#30UY&)$b`shlgq0s;9a!Ip|#fwVz+eaY};KrKc z%L&H0ti`0W{Rf2iAOf2^NPCoGwg7>RJFs(H1a|75Mo|K4D+vVFW&uT18e!{mP~r|e zIDbjO!Rh;tcR&@y#6*L9aOEA_QoupiR8|+U*UK+uQv#S~BExf{VN16Pe-61DqJQOG zo>lG#GjV-1mK$17K^ zB2LryX9rPguAi)mJuY55VA=s9XQDnSGLn}h@gna#4_ksMbO~aNq?IchKF5+7^B5 z;dlV5Xw%FaK@DxW1!gpVXyvOFV$tTM$9mkS1ZJ@$9|h)o!=rA~gTYA(upXJ05q^wy zf`pYzy|iocY_UiG_j*q^u#9xn%8E$)xv_^yaXqKWV>r={PN+c4#21W3Eb{k>=t^4T zO7sD~aIicLn2b#oI?Y11SFMZo2k|X-SvFrE-PW06G@HCFV{vkH^+c0K=;y>tZuj6+ z&ptvqG{}Z)i0%F)i~tF-bYXBp-$y%li5CMxF%cImWYhX$idv~PuNL_alX3Vv-W}<^iLwa#YjzE=ZN22!RZ{c7cWSXOt^@`oyvZj z#Tk@Z)^@vIGGb)Hy3z~maj&5XCR=@WvgxgJ>8Bk6L!xp~yp=e-EniJ;Yt{Rf)`^#2 z9xBxzxg=syPamxn4Agcg5^_M$&~D%YLvMrU%t}GxzN0HI=&$S6a-1?hX%+41ZC#*! zbX)!yh&C)0rX2tN)c^`SUaGr4IFt>N6cTp#c|xTr>yz9%;HZN^bny?rJbaO{0>nn7 zwKd5R|6(y~g!Jcr+oug3M*&!lpK|l)9s_!7oQPFAgpl{5+NFODYFH>gEY=TdUbzl2$9Dry-(fdWZo8hYHi5&T1vy zbV{7$U4do(jsu=yPKDc}x$=Ukr9ZSWrB5QQ@cHUj9$x-U({J=R4p(UvD__U^6?Y#3 zXYBG&R7m5Wuy`q|UDB3w>d&2~x*DzBZBy(K(v~&8C!1`Uy7SZ0y!M{`#L-uRS2)Px zDF$Ix8k(+fw1i)Ak>TfXBb0_ND(JvTBI-@je2d=_BFn6+%#w*JFm5{6G2PT9Y;6K^ z!?=e?AGOukX&M)8t5#$;kE&P0ckx|llInPQ6D5D6Ho|;l*Uu|Af|cvQ{FiRx44}Bk zz3CEG>ftvn*|D!bKVXturN==@f2Ye*e!h3hnr^4Z#bB31rete?QvY~VrBY#AMN>y8 zS+avsk8I}Ev8AbJ9!DestQJVSKKO@L0AdWZNaPl|NXQfJLB;iL71fxD!RJLXu17`WTa={*L<1FGsL&DOvBen0xJu@gHJ9j(oCogGA z$Lc~1xu=IJSAWSo$d1e|x^mG0{z(D=xc!=8!annWStEhqtvv6D{WOgD2K=m0eOUq2 zvY%UQ1$wRM>bc~h04(%Nms{?Uo`yT_>V44_Q~>veIt#KdMDQ=T0{?ag|75si?@c)iN#Eqr zQ{am|V8?W-8$94OuW1VpB?2c=oAV!*XSh6)5I4_FowIwTR!CV-6d<` zq!I)f>7Rt7b79KlTFf#(cxx5UC|by~n>g!^>Jv=>S!kfTI;sFOnP>7CooOEMGs2>c zs>YF?mu2kgmD);MP&zf`xk$b?>O(BAQP6AcJ_?efzvDHVdeR@cWu7jox%fUkyZF7p z{DOYxL|5@0vjxTZLrsru-E+vpE$!?u{*0G&`?-~;(h>AjWC$N^(SC%=bO_FA?U(b! z7brz78g+)9Y@xCBH{f~Ei>@hB>>j$@fwS)9RltjYSFZ{G9NRU}b4 zWm>OQI?-%I^gQ zQ{#~m#NJBeGZnLID2M}OJQGwKvIVNf6oAKw&7Gp3`+xWHQQA%v=JZd*Qdr&+@`3Er z6K3P#{$suxrqltOBI_?bPG}9Ut(C zO?9?hh&8$N-&B4&$7z7ssL&lylZfmp@APqDtBoFXqpi^(wL`|Rsqu&_V) zM?;-V5B;ARci%iE&vp{yALDd9e*B0v3t~WGwtd(~798rhQ*6|M6KSnR_wDWEzNDW7 zgA`~EQ@7t|B@Yob{ips0xn6o65?A0Xfd9^qF$aEWD0QCvnGf`zwI|lU6uOBz^^t;X zJVL_HC^knvL2vsF1`UqXb&B z^c&`sX^ZlpDZ!u*FzXe5v4xi8C z`v$5%>-U`4jIXyLlIdneFEeew03!Kx1Ac&8hnl8b2urV|)C*Bw$3Du<#WaTNM8mX` z;%<14_)ohblkk`2@c#Wbh!`)A2dkc{3D(u z$3qanA`jxHp1!#5y1su8Y#gtncaJX^?v{{8rh$8fZ1~>3?qJoG<KLQ#;s$FqRAZ&clF#>8!wriU&${IzoY#s}tgo#%#(tePNEcg)ui zqBZI-sBqmRy0niFI}si&PR=a~HX32oKR`(!4%<-tNubdFI!M1K9{@!K4ha_Wc(s&O zxKW?i`LSv}O-hb5g$?*rE+lh31w;F*LV`0;{EW9NcB?#vD!wvV9Ds5(63$QpKA-Aj z`Z)~kNsd4Y1*EeKYFF@fmy+enE!~!VVVNQ_T>x_^+XY6@*kvaap;41g zV}J^W`mx`kGb#aJo54EbxwyItj+(H%d4nr4i^KxEo~VV9MD#9xB$qejF3VTLKH$Di z0Cjx5K5yE-5&D=JwO!&2Q;}v-X;!CPQ)QM$bD7G!c>hS*@IvkRAn;ZL`YLA?2AryP zudVnUPlSA-#2W1~X5lS9P-+vNRl0(^NCL@6IZpVpUeS_nsY^iPQs|x|?0~n7&jT0B zfDn}e@lek5oy^XZ!;OJf4CB)aE!SJ+&PWgnH*tX$R1WkgX&EXw`@NBU?8f^tGWBEft5kW+U$=++F_5pm=g zPlER&v~?MA&c(h4>OGTz&B!V9LTwSjI0jrrjJJW_i3X0cD+APVX7?BbkG-5(4}f}F zRZ7EeO0!{n{zT_r%?ZmR8yO01BsZ|6>)S(4N^<1v;`J%0C`Xxvw7Ks%sYKf3w}+Gn zMq3}3a2))!b7=65zLCwhQ5UGPWh-2O2^Beb0x>!5ba3niONsMPs=HyivB=Yom-rSr z{G(+M84mTQDz89AJ@Po-E*Glqxe**Jg){2AP^k*)tNOyQ%w;(V5LZ41y#txENBC44HrV;7;d`1Tv39LijC{qh5- z5qc>hobO5m@U{SqW;W&Bb+0`hbsR{*MXWI#~Q-&&OFB9To=^S&m=Duir9c{ zrZ$MXxvL_sX;gaV9;VA??n$0~4{+dDFfcE*OOxu5O17e{br*2jzUnC$?z;+QJ^tJJ z#zU_u9D;q}{9gUNOd;aa7{|1S3h74gyagWa z+m`LiKW$g&o`*vd=@3_a$#YwINI&9lcV`}-v2c)=LYxi3~*cSPvZHJI_+$ zIZ{x8V;BFaj7MER*tgmjz%7_Lte@8a3OX~OLDdfKJ>isu>4kd61k}nOWv+q5YxRv@ zyMb6LKFC<(NLPPW*>EfSx9r0_SdTn(C?a+GDE}qpxirH}Ih6DxKa~sHo>wk>UN^!c zWc7v-zRUX!m_)DILL4HJ{3`n*?NwV7l1ZnA*B9n?9ZWQv9&8-C5i-HjDP;n(!6@aW zW8#4MTe)J=*|cpiKy2Rnd^?uwiHI*~L5(8*E@Eq8T-_l_Kj)e!!%a?GKz7Ux-f92t zPkRD}=R_0n%7H}Wd#+wI&StlNFlE(;Sltz6P$Z{%Anm?3#DiwGB}Db-k1sg?CCil9 z0b*kyE|w`J&NW?KWtY&*y`F-DP@=Mb|6|?s;qZ@L`-%4(AiyJc$m^-UC`xSJJ}k)J zhoYX?)zB=-NlLqI#gxrH+OLkV(FEb@Nf50N8Tx=|U^60YPa`B_L<+W+9r=4D$-lUW z@cH&|iiyomH|!{qXax5)`koTN8U1(7Wvu*Nr?Z^UY=IVEadIs?%^CtkyoCNqveD9l z9>DShU6Nl)QJk*P>GQeC7C(~vQF)&fxzuom*D~&Uz~(O-)8>POv{t6&Q#AqE^j+x{ zu@JQJfFHiF%`ryE-rAu6M2SlU6u1j2iWv@LWr+m9ADbL>E)GCc8fP04)X=+bt zZn?`zz6#PyfRKXQnFbM;65?{rHJXK%%AtjWvVdUbWs#JUf00A?F<8KqzxN%q#J7R% zhy+LXUQN~oaQp4e+;a*x=3*JnH<3F*O`0p4z0U#+R|*oK!iGg#hhruRo8{nu15W?> z(1D5K3Hd2_dOy?W=8|DonH)tUDLvM4HQk3?hQ+!0!x7o7cFBoTu!!U1hJ7kcvbT9t za*PfccIoY+|5Z5Fu{)urZ}iXzX9|R0ER z1kcWdx2Y^Ss|(Ysh`#`6&;1-J;r4CmX^6X|arC&eWD6`t()-Ti%O;!$A~5B~`3T_1 z!fSUNTq{;8K6pHxj$v9=FtVb3+!Q+}DLe;Pt}|HAS}bmz)<>XV25IFMKgomBrkgBy zc9v;BlfX#39xz1BN6;`zOv_xf!9F%Gt@Piz>!5Wj7*?cLo@I4`M(NaLM_}KhASL&c zQ|X1%1bsYRcLS^46sV4x81PQUb_~R~T5Xr{YjDG$>EV{zK~3-aPTLl**QT#M&q;JN zGa~5#?cjDJp-rM8T|=%8!hfT#{B57D5q4+@xv!9#U+L%ojdcVg0H1ZHyT75T#C38wfQR z@iMmiog_0FEY4Z#}w7Kb^LTliVu zPV?P)D2`rIil=HEYug35&b|JT!$3tFrLo?`<4IkN#q!wbKei}n(p4)#6!nIUGFz$t z8Eo)2?aYJ^x$rs@iyi>OO%p@XwpZ!0L6~02rn-Y}qt}qI=r&^3nSAinUTL!7IYaL# zL@B6>LbYX$*fAto^(=-q|MiN>f<`R_4sg2?TB0UqBPo^!MDddar@U%W1$#c+((plx zZy51#cRH|a<)x)1BDbE?==S!4MCVgIy#-I2nS0~upBP#s#ZMBmV+g>Gmi|d3Rn6p%U-JDrBHP~R-u$1kStV&>ku1$zcI+Gd2H%32ab>mmo54v%E!KeMlg8!c? zk$;zE>t4gN&^Tf0vr@f5E`OhFfBfiI?aNHBP1SXgihDf>2Jx$Dh_Ov@p*Ku>-*_QI z=}Ca@$kF7=QYY&X+yTVjI#P6>exp`h=0++WmA$_9yY6zVS3KSgQ0S3ej#`vo=T`r4 zYa?vrUHi!u@p>>Od5rE-Ub1~6RcbF(#9O{v8B!|Z_W@rvz9ner;AHbzws;*4XzJ>G z6TMgl1KkZOEzSkr^HrK&*#Y8Q3M;WASl07XYF;3is^a#@vK!StRxh%`wMt+}a!G#O zRu;7+jXd_;cwF>!&Qvbi$Vnayv3jp+o*+&00vLpIo+U(wrk;^&8dcg}-xoV*i6z7y ztf_IG!ok-&KAT2+e>{SHJ=-#`@G#PA2YlLm#>-i(Y5ht>Wt~FnKF^sf%a#Qw()GR_ zxm1K4=XPUiGq+WSx#7%%Th~+svGH)6AFdB@<2@w3+~x5Z9`h}NkKw)gOIG6w@p`TD z%T^oD&&7XKTUwmh$@XvOJ-#}C|GEvWKs%$j7{LFJGne$bVreoo@dK~P1Ls;g+d}gC z_s8;L51d!-1Z;;jF!dJ4VNUeNa0fczd2<8 z)46K^hfR7eZJ2G_*B7iH_TN0sIypv7e?kd*g3MXrO6Lj-Xt8BVX;cd`yBRkO$Uk8D zq5E;>E^9vlkY@J8;f)A4YowtockbbDdg#A)`sLH)NN(MFtoPu?KjA7lW}Q>Y@sj0o zy{I?4bWeIF{9yI$|MmR*)IoaT*k>Q1;$A^fQIXffb*0&HW^`f1TlLTM8<}skJj`-X zflU`sQBf`zWYw!d1Mjs}>>B?D5epmQG&oHgduXUA!;XxW@D_OMz7oH`HdadbVzM$tGml1e=tqWD}-u))1T3*JjoX zfgmy>J@f!+s3f5!5dw)x2%NQ@dEfJX=Uk`#^Zm~CU3y&@2%GG^*Iw&c_jBL(^E|m~ zW-PV&*Uf9ztdY8O@!a(_Yb4lf)@;z;^b>felc)*3tVLWmKC`B*S8f{o5b9=g$=%d+ z%@OeZrZwx={<>xZbO`t|Tr2zU?=P%9yk_0^_a)Y>dE~if{XfT;fmi6?3-AT~&EK!< zUa$Sr+Dq4e{|ere^E_vM z1H6J0LjNQ(z<-DTeucgdt~t^D82o%{&82gvZ-lO$qijf>yBw|UOqSone~QDYmKjyl z<8V09=ibkC^?FYodj4+0)S;+OmMoR;6P{S*^ zKac*v28|NZ?K zoZ*k(|1*F;#^=ZU__02I#D^d8@yGt~uPyY){`dnQ{0m_Hzz09@!4G`!10Vdr2S4z^ z4}9=9#qa|k{lG^*@X_A{+z)*C10Vjthd=P)4}ACoAO66H|BLV;YT|2;`6 z3VjIy%ZY9rq&7X8NQYVFQA-JZRw(a;3NW{qu3}IyX$FB_*iccs+sNJ~*>ypx@e~@b|x0inH9> zF!$g2ceQbNyWxH!hQ-qP4k<=eBo?|)s!l%^y<_VN-%V&6|Bbau>`$R>b*9g3*!<(N zevH{ANA7C?q!Hb^hAF?YJO}p_z>x z@++w-$vaZjs^UaHVx5+LsF5>Uqvj}@acR1>UM;-;shN=bNjmCV9_$;Q-vk$qhYscL ztIcU7MDnT!ncKqJ&uU8w6eW-juVeMA_mWQeE7V(tAdOckoJgV^{jhNwUXnsr3$ZQi zGmjDuGInNv`)g9EnKN0_`L({YDmWlJMOCzr(!5;5LQFR4sg6g^ejZ+$U!@#6cEjIj z;@-Oa@(j77-)5|v8*sl3#lG9NX^y8~y$;u?^2aXnM!#4Jwcly^^Imx9I$i2~9C3N6 zJjx;MdR#>L%;9fVNjKd>?cHqchLPP&qg4R`CdtuRpz?jY{$yd)99`;?eBr9#H0GxJ z<{ulMV4nP_ldfbq|HRI^d&hd-y?1^DP2|1$kiF~qj>%a_e@w`tiQ~enL1zaEo*i`| zIVt++ugg}IEtat#Et6~iK*<(AJ5P!y+NiqXe53c@MPJ}T^stLE<*f1adiXU&86wMjA-Z60_HG;^vtwgU zc?4YrRqQJm#Zi~a3WvQNx#?+LMs#KKG&Me&-{`>zkdFL%U#TmL9a!K!t|Zy~d3Skg z*(y7v8CkW0uW`yIX3&-yjBp~(5iyW}4!o_vS8<&GqX)WB20Thc>TXaI{v}KO8q2sz zY_LKUS!5M;BpEDJ(;`KtZL@?~CDsB$ri(;j2g?eLJ9Xxtn3Kt3c1SkK7%iUjFlQNp z`!Rp-)28P%b3Mf?F7&U1W<0^9l2I7<#UuSUmyDDx-iNDMhyG!adHW_uGxO8d9#eSu zAeN*u%ej%QLeHij^+=l|O8NQU?>IZ=I6ilxK*tm@bygv~%E|cT`=1rd`$HPP$h+01 zaZ8%Z%cp~L;7AfFJ!+L71+QW?_Fhj}mJgeAQP2}t)ZXzYcuzp#0r7q(+W)#$ryk>Y z{FwdpWos`GfC#4Aq!r|7Q_+<@^?eW3PK-tNN>7_PwAu$LDy?L5Gntvcq9=b>N^3OS zBl$`2`jrW#ZWj5>MJ^XhrmMk9;X-GDC>`&4pu!89D^^YAxI+CF)WpbWseBX4^1(-a z#_^p=a!q>uPs~n)9mKucpjJV+u5;5#Vy-caFQo!cm7L;^bYuj@N$^c6UsEfEhfXae zg}pf_Ul=AL(Wurp233pUIT2q^f)HVZ!3+9c?!1T5qm!aFo=v;MaAV!W>Y*)L%rM!X z%&PN0r%zDP^Z63i;;XQBZt*;px51yDdg@a$%iQkzhjO$Dm zgSeMXm17)xlxAlpBy>5gEL3&IhKXd0A2e<>m^!W5b-CT-`#Ll?YF``{xhm<|azXeE zX$>A<9qTZ(u1kQEuVWreM9BJsh#kg=bi?X_V5dn67$XMGBsQA}{D+yA`%Idlg=$!c z*q0Ha(>_!vK8;Vj#t5SrfJNvxkWa6~PdIM7oVZTmgF3hFRvaUHA+aDc*|PH}H^O-e zXBMHXo@21T`6w+brTK~7Fl^)TGOz+*f@6Yb9{Rbv;AYOZqABSfd#KTu_d=n!o-*DK zO=ENFrXBv{r*q^V^u$O+r{NB7Zj7Y5ddt2nHX7Sj<&G?T92Gsa&(T@D)Cob(3!y zl4kxfo;s2vg6)G@<8Di+s~0JV#F`-`h0uV%P6VMwTlbCF&)wcj+P;}7uf_4hEw4g* z>6>M_YwV02MdK~ivYlPJ8xV3pvi%TB!Af_J5x0kwIFr*F5%h)w3YNIfzZ~0ISwW_O3|3o#lZ*r)o&kR)83LbER#|y z7tQy%oWXb-5x2_&sq^Y4KB>Jfpr#J~>z@QS+@V0Uh|EOG^_ym0Z*I(Akm>K-Whk&J7&>U& zNuqV`>e~9W0~6+kjo1<(*&A*4NakfXNchT5&m*b?jv> zTT+=a{ZKvPQ=qKiY89ojn{}|>=v#|)!v}MTQ@kAc*Ftt=dM?e)3Ac~M>o5!{;Bisg z+yr&jbxFT1&pNF(=o@53ftZ&bnef7}o}w(W=D}_i!0nNSkN3^md`zE1#5M-1!^0<{ zH~M|so+@pJvWN+~+tpXV+n#%rwvBCDCdxV7<@)V?e_U{lr;aUqt#s%q^!PEFDB=-;hUsz=DIr}!uZv1@zY$v zNWMDR;}Fu>-(nZXqtl@JA*1@+*j4 zno-M$zXF{eY3^d2zwgxcJM*ni+f#xp)gJ%^)OCzpKMVh)mann|4baV^N>B8s-&p14 zG!d2WXOr(>1*=ee!FX(0_fn%Fy3FBf+!_z;a$uLII*~6jHWKzvH|Tg#vityCHAfRd z#Scb(ayjG&a;JL{GP2~A)ja%+;PIu8}precYxsdjxyR0g#a_^_JE;0PP?N>g~$g`%j5|F zW_u_X@%ifT!0eU90$9n&ws@Ha4V8;YNgA0siNo>=RJCGR8z@;YBW7sr%Jn&Dt*lI% z5+%PrN`w(4GwJPjVY}P}8f-22iVPu(^~M)xA$dY@vq`U(n9?i%20gO(iLx zPP*CYjMLDuGl(&Fy?Va9vL8_;TF01V!P$D6G^0gy#4H=mYGqY*e#QE@P&YnKOlsKE zjGv&c{N(JYml*B~ zvblQEVbHL37jqoL%)snC6k=yg$hfF;GgHrhsF$Y()KqeE z4KC>1QnDVjJ@L%-7t^s|vj%%tAtp+Mnbu{&?~k`MAs;k4_#xYeN_IL_N0?nb8iWMf z7Deq(nJPld}{(l7TuM$CX6%A}Q>S zGiJZ5z^|kcwyIdFmk5oyL*j z-yDHQS)#Y2KXzSPmeW!D5EZ!3`YXYqj-kq*tUr=JCUQfUsX@7w# zThF)ueIU~$?-K{T3g$y)-m?GL-U%JxKEk1YH|IPP^5;Dvs*c&4P!p$gJMx789w1>E;K%%tD!luniX zO1;O)OIS8M#4)*}5gxJh=QEabz2$2YfBl(j@w%l>xNWFra6AFUM(i#6TxgD(>EKmS zcqi2BF;b!#Ely?dH$OOhgrgH(l1SWV_3GAvFn#Of!xm~w$sfn9zqKb_S+FTQK#F3{8el5%p7=v!TZo8zEpz^V`d#V|xrihjyU|B6+S1C7Vgxp$RU ztiGxINPWtd4U^87kX}wRK`&)L_lPElYDCU@o~1K}o`#~tkBOu> zD~vWebzX+l;_v8B=(`v2*(Nr4a>~Z<9`}usL1D+$`_I1ghKe){jh3?alJ{Z{n8jKr z9>mD-$!Nv~{*GdSPv$zu zwSv4h-m~AV8BbYA#vJ|Nn~EV7{j+!9(D&A@k)5WLhh;gd%v_~lqu#u_fKC-vl7l0wr^_~ ztus-`ymx-A{CEsf=Vzm!i-&1mUQQbd%kg%loG=MH$+>*}YD)+H02gG@rPvJJa8c22 ztafObg+8aC(euznrtqUkqxSx%k_qZQ#><3$jkd^Hax*#c=zJJ6wJoX1JFPAwLfZcq_j7^&H`t??)Z*`Y!3x1pDosF%w zEe1-Csts8h=YH=3)4$s9=8)eCv56ft$O`6|>8jUz*asKF*%kGJ7BaZ>Q|N=;^b1F@ zYKV{{A=vJIv3;ES(v{HcASpqxXzt;JqyG45463?p>&wGucLtzXrDk3|qn`&xC0xevX^9!aqO)S)LqR1A)m=#OEOz4{~!i-9%0rV9k2pyky5_z@Ln>>_>F>~-ME)j z+JRtkHw$CFnr-A0A{d&3;*L>qSnJ$^>2(}MID?~av%B|hj|A=z!RK0!0lx->$OLwB z9My3DG3&QBuAO@F%{o0>*vfF~ zQUbRn&%m!k z%lJ-v%@KpHAb8cVqet-s{-P+aG0c(0qVwI_>XlyqbzJ0l<~C+|xmlc3qL*x-FmPGq z8)PucOFG|R-6iw=fsdD0+GlxE5A7rU#7aO}FQxm@!onO!&EzeJ17)Zd1EQ}w!Q&3O z5h*pN0tF0wS4x7VXj}bc>}~pbVpS9XDq)HeU7O~T^{cxLhw96~ za1^t^aNu{{jGIu?bpR=PI({suJOh7G#?8i_Ye2N+7`$v)+`uofb~LhO>`19Umw-GJSYVGcBEBJL&ZAP!n% znwC?+AkMO5G#?ypy*c1Cz7}R}GJ}h0Z{nah zo+SDoXC%++ND2|zBJw1=8ao`Jv-TvZnpFBZ@Yu@<%U&rR_i|+ z_`x@g7d7&FTrL}E5MGvQ(C@4?!U~RN>nSM8rD%X{YyALEtFKF!6-NEKNFY+^I>OuM+K)1hxC(7Md3 z3Y|*^3P%Q%EXw5)+fObpnBH00*IUdn^$SP z2`<+!pC`{kmLtmg zUM;$-DR_rVK$Xdpt9usbBSO971#uQ_PnfaR++Hmko|Xeohtz(J9uR}_EXWMaYDn4% z+Y3ftlU6cmxWhY!l0Q8Kj-`O}4yGPH3ie)Y)M%zT7u=1y4z ztPMH(iC>i0u;N2XkC$y~ilAL|No>ph6u;sQ9<4&2ba>#!q#Z`}#2- z+-^y%zpy8DH`%ysWZc(K;d;Qe=m^ah@ZAj5{Y0k5iINE9i~W|062*I7cvz`6*o4K1 zZkwstT{d=-$&1;v{g+cfuUQk;Vmj%5`_MDyz#A0p*yN^gBsTLM{6NJ{a6YrQeh&E) z_}c!oooI8p*Go8BhT2k>`Yd?2xR{A>^VK{Mqxz zILj%%KI4C`*OqM8%((bd7&z4f!K(J3xvSX^X`8l>iX~!1Y_Hr*y+M49kB$T_i#cOh z&3@5{<6ZRi+Wo?#%~PiZ z=$D@F=WBB#>%4NpW*OL0#aV7PapPjPK!Q8hxUwuxqao9=QKF^na3SG|(b6Y|@5a@L zVg|L68DfGStCT0_ZP5E{=-)b*9LIj{(%bP zsUFNFCWo+0{c^w65h?Z=rs^#%kA}Gy@Vqf8Dj-oh;}Wu1y5gL~#N1Zy>PfeY!oNF; zS@^bG+cdwYz!nk7-QbQ*`p7IVUETeE{859}>0N+U&?C$ZMY4DS8~D+7cjn?89jDw3 zzp_bk|5Um^I2E?4#y#}MO|RifZuj-1@=!M*ZMDhba#Qw(r%5-8{$-Roy8kM*xhvwy zpUF3a=Jcy?&{Z650b@4b#-5@-bY!gK;Cue5pf}l+$meJ{{rNV}N?wm})Kc(=^&XJz zH-cdZ%Si#7E&N|To*fc&F|Ir1uvekw$6ienOZ?{~aGA2^#tOfX8Grk}qLa3?YpN(Y zygk)|+MhqH`X;x$_xh#3ZAI^hts0hV)@TPpy#P*vKzot>#U~hrDatK}lSqi~hM)@T z^^<9LZw~y-kER4IMz{FJ{avDNgT1F;9Wd~4^Dgq<+czm^bcHiVlg|C^33_%ASQsV^ zd)^QGlI|F7%VW)Lt703a; zJg4+`ZE5P>NJW7S>iZ`qZ-+h+f9{$|sctaZwrF8@`B5;9LcugzIHS&u4x#;PTo0}9 z6osUzUmLn!9GB&hTomy^1%O!?byU8ov9Bv)f`ZZc$5AC2y|CiIFxgc*ROG@;%RAyU z-wCkGbJ%~qOx*Q}_^4$UE~Kf2@o_W?q|A>71(8`xq#$Qx{Tb*{e;kKqnT^PR7Yxlu z=YP*f0>z%18ae;esoS9~VOI6UsUW(FQP|^)gDTPW?WUKaAWIUk8^t%(*6i2tuHP|Gptw1@^wQVLhZ7lQKCG zOz$|LFKa#0pWLqmPlpue^ubKVi5{SLV;C0M!lBrpWsjx}JIE&Woy&lRn!b520^CTVowFG z>#*$&NM?KlPLFr0?g-qaQ~s;gK+K2iLaarlvt4m_pSk#i`z8_lzWXLjfG*+Z)#+fH z64nx?bfhtB0?m?kXwDk-aAV7VKY8sN=;XQ~i$pxHHY4Uko;qrpu@Pu;`Bv?+Lx4)n zHto`rxw~`tronIZt19)(xBj$6NQnyrkolyJm;D)JS~knaL(?Z;+V`)IfJ`u!5k%#QaXEFVNjIh;AiSY6?)QkSRAqtZzd5LpW=fou#7I$z(d zW0rAoG;x_=^rPWOqj0#~&+%)_-YaeKezj(syB|HYAI@K1X26=qDzfBQQDDmJD03iX zH{HNdk8h@k6w zAUhTQfV&|N*aHFvBFm%1vl)#h5Mpcmzgl&^RiQ9>4ZE)D-A{=5?ATKAoJ!KO1>fl zFd6|q!^aV5^jaI`1N+{*T`cC!R^XnOu4peWGmWwn({|qH-pt~MsFq`@N^|8|cVx#8 zmnSXQ^K!1(4VND!qCLb}-}HXTSbQS)_!6mR)x8$O;Ww#Ql!dv^CGQ4{D>{fZ#R2vg z?Z(sc!2I9|=0mw}VK%G;O2}kKP>?GEM-9Pqvo6`_0LH!HmSEx5CwrzYaq^BUr*k#p zD+zdoVwcoFGG)F8MIup0TvN?NleNo{Ku*DXHe(g9jysjYX}B3+TUB&=&Jyl&j@)-m&K=Hy^Y! z75LwsvB++?B>(hUngYN6qc5-n&7J^MUwQb`>Ee)>o9}OrsL~U|Ixqj020L_)GUpES z-WF2d>T6@P+6>HhW0PlJOyF(&)q7L0-EP`8=&5r`>7o|3)8cLqLvC!)Wm!g0YJ$Vy zPuzTa$r&)fQ3=IolY+YRQNmw|^=-)tj2(&DyqW?n5B)DPu%wqn$Jn1Jg5D6cKXrJHs8!CYma$IfwR|_jsngQwbC(@W^5W96zsNC1E1p)bXivgNcbA8LkeYQD1Boii z8}hU*j&OjRVkw_aBB?bqYp>>)&R8dRMHH-TW56ND1zK^V`DJ-c!tRy@4521cVm95Q z&Ce46kUciUI4Y|8yTJUA4lM-pwnpYalmI)J#jf$BL>#;5?Ax5vEffP*J2)ZNky6O% z(J@YJF#a%3cZ6i5UEIV1eK&U9&QxKXkiX%X9r^Pf$m!C%`@)X5Bx05yv2Z!E97!q0 zJxy3uI;EtaL}&C6{9`pwK*ExC(x5emL}q9sy7U1Hq|d$MnQ0#IDxurKNCCZYy3m0Z zgq3sU7im<-b_U8GK{be4j?!WR3nGeNN?ZGqY@3<-NqC}pXE*(@=1Sy91ARV1G_taN zyv!Vb7jhM0++>tzWA-*WCtM|EHHbA~mJI_*Wi^G}ZZSx_=}BOQXe{imicj-6>`W{Y zVJey;M0}JaTW=}k*v5TvVcjmh6e1KfDehla4b;BRdG~+Kc@Yaki!~BT18by}V)iW= z)UEx-d|})uy=NZmp)2{Uko(A)%!5c9!f!h?8Z2PWHS0{Mhe^hQ zu8eSrIm@zuq(YCl-|8?<$zA&JNy;>|Wd>5JeBxexcRj`hmALqZm#NEz%%VC>90M90 z<7#?^6$r3nI_#yMg3rk97x0v5zXf$&TJ@8@en?#@F zCnmuqgfR;p=8+4g)|oSG^H_RNSNAGktG=Ka4P0><$!XHY6zPj@NY)xOs&UqVqbu2h zD(C21MY8=L>Fs*e@hIWCBZC58Uo~MSmhWC0!=rH`GWsy(0@2jxwS$UwPn|}z2+t_> z0PlQ#zp+dXgNm!NQ{2{=}YG6>pOyN z1rGk|e^fJNs``UxBkw#%hy;yRn)!_ezbh)p4OowN1*xZ{?!U!i;>yd1j;+NvUFp4l z$6Ouwa<%od-4s^7J~AiZF7`zYW>AMRmr6V+74~h-m;(GtT1A?4seqIKf4QJafC1-a zhnJny`Dqd9MZ=*}9ts-T21bIfuRe~8Ql;e~m1TT5V}*)pV!*G^YAnUULXI;}X`|ie z7s{-!kf(64qVAEw+^qzrxVrj#)({fxU2Ougo9?nPYUBlwiJ(6Ior#>Ci#!7tJwMv4 zu7O9rY@pBbg2yCdb#zML4I{N>wYSFPZuyy`;Jr}%8Gm{u()_I-T(g-51VM6*{TYAJ zTl?g$j(k?3?6Il{nq;YD70cJ%$YknH3ejLD?RYOsIf$?^dV%{gKH`mdago2(+zYOL zHhSCwLxmP(24J(1tn-S^%yUHcqdNABoU(pk@9b9$rYI|1Y53y3fnPSjSPg0Q$IE*H zOM=M`4X33d>)LGe3Yx1vPP^yY7>e|wT~+;p7UgdZ>OACx_&B*d`TIv+V#bA9kpuru zkgc|YHpv);IM-wlB=W$&Ob@AWE_NpKF`w2eoorcLcOFR+^r6LY&PQM1#o-+oq*?DK zhX^?nB?$Kb^l79K4w7?cQj#`*&(l0Vkq-NSjP7|6yYM_f7Q2AeM=3`G$Jd(OB ziW$QX<>@(|FmCcN6|CtuoIeg(QuKF50X4 z2_5(YZtb=x3+PirQm@telVVoe`YE5(Sj-(Wnn%4x%=wQ) z)rhwF517HWGVaOnKQt2GaMm-c9MhOnNTk?)gO^i*-)i@;Kf{y+Y(~xlD}4j1dQsBj zqE|FgSzk@j1U?~ZBVt=iiE_#ZUycXfK$F$@J+aE7-Co@Tau;#!xF{Y|kTG!lV+FneZ9|j0oBGF-6%o;RUSt+17&2tA9k;Ore=C zG&GKuHu>@G&{bLI8I%db@~Heq)=&JfTXjR_NZKC|-lZ2#M_9I?N}BIeiuEPggZY$x zCn!heOtmp~83v=%ENTtJiC{)>h~BrGhT&(e0vnecM`^7O7)g``Kn+@=BfJmmU(qm(Ty6 zNK|}!z<-v;iM+~5&S>69QP~$HdJkoTQf_djk)AwRJ-G6zuWi;A`w0nIAI*|CdZkC| z}uE6k`BkA`pH-q<}^JBCOpVwGPg$A|THlM$ZH z!6e43SKzSJ&=wSWq}lKB5U*$W@wiJh&V`Kmwdh2Yx0t|aJ*)O8ReF|!++S1fKUiwQ zwyr221TKJ7M#KwSi;yYPWJ1S0#q;ke6obT^eD&9g+8gM_j!Q+dR_z@R zSvkgf1{biR=wm4_x?x^v4M8103v8889)f2S!tf2hpkg~y27P61nBU_Gs-g8kl8?E- zDwk5uEd@Hf6uUZB7-Y055dQAO2<>!BQ@JIPSsB!$>4K>M(`riz!kB}b`D+$racQbA zU@UT2rTC}Ru48ra_HI+);o5h6{_dgDK-|D0joa8-z5H;0^HW|<7AULKcG!N3tP%^9 zznski`8KI97Ah7hfZg?ixyIFnn7`glCY@Oo8W`8_l*1WgcD@psz3_4RXi%PqNA685 z)nCk!_ALvpEjEn|*h>mnH2i|$<`gYYMoOS8davDy+DDW*iz9%*a2)g4M{eaDet91OG>M+Jjnq-vcno&QTIOX-AbK|INty1vc?78BSW) zndGZ47yLqSB;QfL&Q8jH(x9U>dyE)i<0``zuKrO_HB^pSq0@U; zwS%d-6*`wQy1atp&D^m;Qoy3Jer_S5m^-;G7yGjf-%ByC2{2Rz$?nu+97m=BExd6e z`%6#PtkM={E2)Vc5;Aq8E&-R7jIh35V1KYl zZ&KCT!OI*d-$SazGJ*q2Gt$5an{kK#7boIfI}L*`M27WjahN)jp!bu~c1%1TzMK3} zsCT%YUpphzuY<igL6<5qwx9G4bUb(1;~u)a)wTPH_nApJ!e>@7Pn_c5#Q>c}Nq ziu7hW7O$68cGf=%(1Xn#u+ypvk>e=~dcbbhbPJocm5su9tFwl(3ih!+j%Wd&TbM(x#CP(j*MbO-agy}2*T<;>l7K7tIKW03q9#m+e1^Grq zR$2OWV5gdkh_!UBKaK1TZ9C_2@v_7yL{Ukt^(g>(WKwb9q%NDX|9GKwo0U=@T{dNh zkH%i|DzKEe_S%;!=V&OHaX)$EEP8c1PI7~r4^t%z1tY}<5Aw^Gffd-60w1}~C^QQy zx>OI(-bJ;(un!6DX3Tyu8@5q}q|Tl5U>Bt~Op-wT&11mzxgRD%P|lRLi$N;hYU&kF z;}m=B6SYW3_D#MKig~2+4$G*{NcT{uv^_eX9h2o3IIkxhhlmI@P?X39X&fm2z3{cM z@{seSYu$RmddxGKp48#66g!elXWOb&L^WwV?_R1m4_s7#*iwZ3N{uB zlmW#`{afED0(5S%ca?#|Cy2mzVa);UphUb6iThVN`yVR9FsREO)*3^X`9oV)WpMBu z5U?WSn}C2dvFDfnq6S6JtY6QcN%t|gu7^|!8$G>Xw2XK2M=E6Q+VbqbXcDJ_By>*K zk&kP0MIh7-v+i%^$bYB8U07rPH&+An9h?6@Y90mubE?qg!84WBP81019{eM3ElEQ8 zkAk-}K>02#{wOKvum97thg8G=MkNsbZ-MB4hG6+0YTyr%@_&Iy`QIB?&~b*x>i?yR ztLz01D6@vE(J`VkSBmW}8arj>y#j_1^gBpvWPnnvP%b3wAyusE7gO+yc??J!nPh$k z&<3Fk3EBE#Y^V@EpQ#Vp6hOYBkqdg24<_(Cix8bd{mhBbKh{J$Mne)O7AgT1Km~+- zxNa+HAnj!PZoB*V?3Kvx_41%B7>2o-H^X#V6%x(){50TW&PVBhqDkGbmC%oR)c=Q5 zKvkE6+rz)3jE6LX=TY4kJ=%sgmM6c&p+P&lP8}8|Anr#94 zGH!Ni-F=c=w83u`e@yI)1w87{JvzO2;}}oOBR^CtHF0NC@thjVnDMDb>}p6UL2PEEyvAih44ha47rNgQ!_2s<*Ij;g2AEq8Xckh&mbIHU?v6Hw+0Cfr|>R5IP5k3|{ zG8hBWy_PR8bE;i_;zMKA1Kse$nK4Ws1lJjWL;X}YC+ZxNiWdWF(lc^}n_d3q2t?_o zL+oDM@xV_}UsSin;bXU^Ox@CsN;Tb{$vA`^nBK#TFa$pNh6&I;?nz;^vSzn%s%k5ufWE7sMOroZ3tQw?fJWERpe zNDjK*TM9B?HluEN6-qiUo#GT5haFYeE>v4eeGi=MDgLPbr;arp*XS1Lg+xtxNO94I zT3&RcdSQ~14Q|ashTz=-v}i44AO*2t7D8|tXu>*3am??Mo4NYP3-U88su8u3A5Hw;}IZWh}ZKJF=M&E2>3*3*Fo^baizj>5`cRd?IO=J<9ZLm4infHJ7$ zA?H{S+4c^QZQ|Ps+zm#@a6Lc2z3KdTA`&!*|`WJMt#^wHCjucGu|Jkt$dKXV8Z})oEtkoZ|MOwz((2-YhAE}1y$>PWT>LXiXY5Pnbwu7&NeoJo__ z%L0oYJ#yUm1!A#Y&+XesnO^_c=>U*?JxR}?F6JkQBY-PHTjw$=wN=ht7}4ox4jh|$ z`2?sy(AP*y4Am8j0@G4^Hq+^6-!=Lhsn&2!VmD?jPby{mF>OBTS|Of$+vi>)>5He$ z;R`+QKwdaB%>_RCv2X)W*gRW+hYCM4y6hPmJ?r*;y{AZ{P7dVH>a&vh^T2n~zyqy` zCXy9!xt!#^%kSp2jbD33XKiECz}iwgdwa*L9mhm%wNZd@^xe@`bw$FHcJfQWIU}xH zJ|v0`-U|Vx$IY0x_A2-XOsEq_MzYM2`j20L8g!fUC?WIUi~U-*ibjHCLs^XG45td>>)j48qT=-(N=aLvqYJ>HSrV@Yy)>&Z%e*$BL~NhFE17tQNBiqj674WoAG5I z$UW~x2=d>6hkV(VGY?kmB!6e-#CpnybkJNN#Wb$QV+?<)$@AgJI++=ZUiitj<8l2^ z_EhQtTS+&(VR&aUBh61#cOQxGnG*e0UHR9Nh~^ij0OXt!r><4+c*qF*Ty1w1ct{t~EVHEOz53;LeW9;IGSdq!7l z5d@^*?88De2z|*5_Q-Gju@6`HMl#Kg$*joM7qVVS%m$_RhMX`$hJH$pa-oUjsLrF; z22G$x2s(Kla#x6llAD-|vzP;eh5LQb%%NpBLr~$LRhJ%c>ElqPEVmLB7w%)({csWaN+WIrOHF4IR*?HKF93<(I z#{8?zUZqj5CZ`A2320IVtN2CD>;PZnw~Z}Wlc>x5mBX6WXX+46yyLM38$Sj}cJdOv zn>+;eIr&$hDlf(OLyal9Q`v%U55@Sr=UtcDu?McmoEZ#}@KuJ7G(K2ae2Gs;#?6WW zE0D_OCzS=}Ntth9%bpBgiUKyPbYuU2I|S#}M(4yJb2?L5&_-jb_VXD2FQ=GW?`_pM zL>OT1LA;7bJJJ=S7XY_2=X&^K0($XHM-M9Cy+_jhKN>f4ZLiyqX?tt09v!8mo>M; zG(C%}ngZ4pSDCgnU7TCN0z4)w`JZ^~SfD@W6>8eV$;%I*9rJSCSA9#*;Ssqwo9aI% zR=}=}1>TQ14as2a;-|)(z1Xr4$$MHq@$F}-hMKp!jXh|XScg65ilrj4BS^K`)CHV% z6Lze}PdiK>2J1{rI8|-WE^AP?cpowrzi`XhQ3qRxv|WMZu~;BFO3C4bMvzhd;Qwxv z2Mv%$Tbj1l-FK&%##{YN26g{Y)ZGi&`!$T9_ElZ^NG4Xo%(kv=0$nM}TY+{zB>%3S zG=wtHi6M{l$hQJEq}fxC(_REV8lGG~;KRRBpga8LTL5tcYN?One=Vn&hHNTvQ2Tn5Fzd9W7kXEg3k zqqk=)AjIEV_wgzcmrnL%3MsSaY61NlYYgC zLIBw1{rsO`_qF`jfZ1=Ttj?e3?Q7o{7yw>8E0)f)yfof5$%m-8U9VaElfZcpaj>(Rz806PIptyeGydH{5{z@V?;SvT^%EW5TKOx zD=cW4&_7wErgLd&;=Z(>A!w`Nw<#3@%gFM519&w5F0h#>p4Fy)YlCTHUv&iM&$+}n zNG6*j#|P6PK`$YEQuw7nk20-jeY&H6vdaFsG1=vnUIrvgWwVXTP9!8;Ml7(_Zj|e5 z{PsZ|9XmHSdkNs+v=Ez~Ck1!a71Kf-F6%7=;fNVaU)b-NHVr}l#esw|KfiB*pubeq zfVQ5~5kU}8K!Oq^OO}j^AXy|y z79{7Kqk@PEC`itrWQt4`S&<+)Q-mT)4u#}c(E9+lzx#KO?$HnZ(xV^mxOi%x9oCv_ z&bju{Hb898#!lspYC}8g(vg^p^aQ(r&5*_tBy->Pf~q-HRgSDbZE4n8WvSU-crmoM_l-So4v`_rZc{ z!{}l>BH9NTKhD6@r{OEFZM5xZUizM4Cxb4H$$g3%&tanBVUR6?~>=PRhL!#k7wjl-tZ_UviedHY)Kh5iaGmO2hAe3I9+rQRAzz4C1U0o**u ze`zkyHlWb6dtg*MYOss&X~C*wSAvC!++Ymi1|?8 zE|0+yM)B1u;W_9sI_nUa!6Z$yUiY`9$owWAGxR+rwIlvfZ&YusdiAV}8V}{aK{|T?62bzRU>-t9wF-A2L)<0FyG>nCx@}Rn3+-5vkAn`n$K=kU;N+ZRfR59DuBXbs_P_osuN8)(WY6R}@@L_|r-Rz4zSomW~^ zqRe^&8y}zjrfMNEn-z8$5oO(*{Ljs|e;ezWY%s!p(T64QmPEA7j0+019W%y@tNLAi z?*EtceWa@uG&D?mZogIe8u5NDmHY4OSFa?zl9Q6uU0q$p$1z=(zu`ZXA?=G{%c8L@+F_4SC!iT7(8w;4R97)z$nToa*BCG94y;!iZl=ejc{A1$%^M zO%2LyPb=W?%nLuBf`Rrqrzpw~HOlh&Z59<383{INgHfgbMKc0|7PN^7mRcn>Ftn&khu zTmE@hQ6cDGH#Vl5yL6$?Y54O`U2$xF+1>}@jgTb+`w7#L71 zGJoT#N%8YK$=N_|vQ93$qPE%vx?+wS92D&e9`@E!R(5e7t*;kdpq=z~a#FRnvB`;u zASo*@PLq<73SSP9dJ+;A#*{34aW^-Ywdid}f{?=K=;({Ck&(EvxWK^6%&smjQOrSV z23u{v`}$Pogt*Db$-jTHzLWv}%YFZmH@}^05l;N(=B6P@QH$K}?ru(Qu3T#@bk^L< zW2MiwuI6R0?MmY1q1lG99eY<--4ujp>PONK z+V-x@dOA_$yLZ_yf2fixB4qtYrtf8MYCqPf75-J^EP>dh1S%kLuFe>=#ml;=V{xWTPimO1f;sj`v=dY_zg6 z**8%+wu?PYaA;+YaNO(?_f2*b`a7s?8~a6?dU%%0Zc@T=P}4Lv-lnp}Yj?~w7HM?n z=~4SWt3GsR@AYqkeD zI&Z4T8@P;G!@sdTd3Vj;p0jF&o7}WlhKbK}r6{Okvs1XkvY^I3UECE~xyQzL|=kC$VgZ(mPbdzOk%qZzVetH*> zhKaYq5J(<9T*^wPz}xu~CO(e0tQb(`CHq)l`SKKyL>8jkbR9eROu}UtTjbl6e7{Gk za}yV7P7P@2^Sut?Q%~k~LD@@_W9E~6`K!>CmdOu&s6Dv4@!yK7Dy8Ve=+DbdX z^CubM>Vk2_6uV0q>;$avPUa{KG5sM}B63n8$b=pJ;RJLBFmhrMCwXuc)|Vt96z8W- zd`>XC9aku=US%YCSVV{Rstl9qxfwXt<1yW;`OJIO!wpuslw)$V-t20=Qrf5J&G98G z#<5e-vi4TifIj=*WbYkK;)%iUNp>3F)HhX7>7hccY^B|g`4akjYdiQyZ`CY#ZL~1K z+BNHS&1Zf-TO^uhuv@Fy6%rTT8G3CgA%fZJLnqW`$gG%L_P#;sz15?uGsardDU|zh z#6k%D2FrzFph|o=>=sx3!g3ns^4bgJ|_*<{dey6t=GQ zZjTHj6Xv{!xV!bwPXyAtL-nF4Yj5u?X2f&2zklZDO40BAwBBLw?^GgVO&3B&I5i5+x7RMTnY z;h`UOx)swsb~AA;VHFv#c?VQgViov@>GzlZg5|0*>UVq9SfMqJ@w3}C|LR$H_BJT> zCA~!=^w{h8SO+s{Lg!x-Zht~dz=4!I-eQI;e_kjdj2=+e&R16Ld~^Xz^l?h8pV}^= z_w55veT8fOxflAd9y8Ic@y#PuQ)nBuJh*PMZNo4@<9pO&Ci3~%*5cDAy`z%)k}k1$ zuYHxas>+VNi&N;n`@23_^KNmnW}*=sN^EsE(3iD^)TL?otzsw_1i_lcXC`^DL{v*2 z^7hI9q5c6!ImnraTz`B4tLABn%EhWdEz61%%I(VDuU}qfZmTEqc8~G9Wa)bfUz{4h zUWO3X`l8^LFkLC_rw6HaAu^|F*3v={sz;ySUs;^UW` zR^vQYyP7zt?Od~zlbc{CKA+$?k|S1M!)~Rlf3qYB&)f}c|E z^;!&^M6paE(!w}rnGrg;VcL zaZpd+ov;wNPoO~2ZRO`%wdkn3i`$TAS}9%T-io_B_sJo|Kb>;3iPDyyr^u{!y^&lW zB`>^M+QMt=xmE-3xrS?7hjD?m%Ur`!V@gq1#Z$qU6Jdt zeN8Fpvv?mm&c&K4ny~an=T*$bvBq*`MWX5B?mpLViIRVmSG}fnnquYDqGaAgv=}3*2y2&9xIJ_9E{-`vwG@i6MTbDfk5Xp zkFGtm@q9R3&VriNC)agSuK&4{OP<`q7|*uvAmp^r9p_ZyW2U7&Y%^>e?aX6s-jx46 zN{dA>saXyHg&a;i5Kh z;*2<%#hTr59-j6GPsZFVVr{mK(Xx_<5=eEpFrv2#Mw!35|V^))UhF#O|GsNz|yZ_E^jxw0suLyu1t2 z2%2MnH;g|tppr)G20D&nQ2%pB#;k4Q>hwp>oe0=4a*wg**#Yv~E?*#%V+-;X>n!1x z{H+pN6#iUjI{CGP7257g*j`hx{q2FJ{HN`TV*5tvYObym-mX03Zhr*1O2Jjzx2sxV zTC++b>ynNj<}l%}>>2vh?$5P-a|D^Us`P8LiK8G8*u#0ZjIEN~=j`VhD*Ky-ShFYt zwFdJa#G9oBhx6U&6hArow!)fM_?X*F*ODE;12GOg4{F!%i42IfiuoiXHKY7bR$Z3r zq?mGF_?U~fLXTCo2P>z(+f*Qo%ESJKX@_LGx`{VKKlx+r6R1v&?Iq{ z7XcClB!2^|0{W6X(ZiXoOOJVeVv{^H`0hrrmw0_CXU;YMIcpA$p64nbNVIz}2+?!1stFZFBgE`C@?4V}c&?X@G}n+!!PKm+69<-HT!f30bz2Lp zavt)50ksN$P>x*+`bkGS`janlSxA)4ucw*T$6!tAJ#eL}c{OQ-<4;XHiSJtW4N3VM zK5P;%Xz=a0e!Jcuhk9Z9yY{y-*#c4xiyPKAOVbKN;>kvra?%Gq5|Q|gtOeCC1em=E z3Kz}d73IkJiBUqyL3X>1*|jG9_-oahq05Ib(n!psTz7Dt`|YDYV`ONHG5Bj-lUU=Z z_Gn&h>Irynz4o6=M*7|c%J@F&&uKiI%amQeJBc6V?NQ-NUl1jECknzXI`vKs8@|BJ zPl+qE&&{!F?Zg2TTpoOi>CL~;X<-c~Kj_2BnMGZxAsSNq$j~20@Iw{9tV3zc{KyW( zoJz-#R>J~KpZ!_gqv!SBKm0Dr-0pWh0idb;X&dTbOoiI(?;~=iHIJ$Q$`vPVguch( z_fGyL{{H)Bb9BojtT2S3LccRo7n!&jJ0LkNt%7Cj9vU>rqwr|k3>yUScLb;S1;0rV z1Z&=l`iM;J-Hp z3MUOr3^$c%ZzsatgNV=;%D%P>4HN}uzZ$VT6Tg1gf%kP*kXoyYmuVoLiwJ#rl&>^BdiEXX zE#cuuDZS9a9@bd8?95qMpY_GAK;Z4igO<@{0dTTChWn}XZ7OC_e8+5jxp~DOgpUE% z9ngu`{>ABu3;i>zv9f{50V!V}6ac3~YRvzA$}CN&we>^7%o?7~Tj^M17G<_Cn|AOa z^8^cuuqkG8FAjnXhN@=LpVV#nuT3Xqy|}w?*l9+3+8ln7pResxyj^YE znt|XP^-4JI65!g_VD12k-I;$%uFES3^FhZY6>C06;<4^M#&z{>Dcs+6tpXUnYH3#2 zHrnoOq7D9TBbj!dHUDB`IsHtS(9->MW}1?Rmg8Oowa4H@Q}jPXtDLQ0k;g@_x7vbS zwu(`IFTZ9I##N1zP_Dw41oD8DsMA+skrBS>|^7PBZ9NZ^hf%@{QswVpyFWmM$(r_&t8;`4@0t#qk@ifrWn zK%v4sGq_YNJ=U`~Z92G&F{+D8Ajqxu&p_X+6>uD7N$$%c89ut)BFyqAqHSu)urMf@0HNg=PjyOq*vV!YcmuWKv5>Tw7T*s;~qF$z_diJp|j zVbkQX;Ya(#2gLW=97Rf#7UdX2?|~^_rTQPH+|}8<2TO{$Fix{EdF}yzN)!xksPU$a z@K|K6nac5#FN@>En)IE=h+MQwQ5N{cb}Xb|3?R#lR2&hb^_XuFiViM=DJYvO3Y0lM zYa6UJH~$ZQ^U+48pvY7J35CO^>6>*Nv!%Ou4_KG@8jS|A6!`6(V{bvI`iQ7r*Lc_> zH(%#=Tt`6qMRIVC4hjKSnT9uPU|yW{8YMrQ zW~!R;Ku*EI#$=Gl@@l5GZQW?S?mi6Eq@7Zr!gLuc;5w)@v|g-hC!i5S<*x{XcOTUK zEXOJ7G6e&OC|561P!9`$i3d_(JG9@C=DhU~oLC&(o6M-dWxq?;?WQe3K_d`H@xrk| ze6yWr4oXm3&zfoE-IlU5O|xn3wi(YJ(!niFo|Zh2XTiqZts^HGF;TDUaT^ z1E^)XRi8efh;yB4p;Jj5v*le|Y}P6bF8?X%Fqsih65UoU?nZ*j)~d8OXBGC%?I7*Z zea?#jSB(BwT=9Vnt;MIRvZ47!%{Dix=U$jdF`WUPQ`v8%+>_?rQCo2pTO0TIJs{Y{ zeoJ+)FR2IR{Fj7e`=;9^idC;WdX@EebzO$P8@OBR@}`vQ{mvcV?%fR|r$a?1&s8En z36~#lmlLm2ti)fBo3>AM9$a*+u{MA&F0#JU!^WLu^h?5fO#@;!%6{vOf5aVZ4?l^X z`mwuJvr*cgOkT?1vu=y3Bk_V))!%3>A+>EqkpzubOD|r!5(AR2m`oa5{n+6AJ4%}@ z^GD^z)YhdvpRV*Cs7Q=h_Ku1yB`WePyDHb~y60N<)gGdkuW)H|jL7y|>NLE+aj*Ep zVrZi8@qWu)#n+*NCL!;UFW;99YPFRXzlxUol=up}o5!I0-hUw21^-YyFR-9 z(@M4HzrsRt7E`l}351!2+0lvJmVZXhoL5Mx;tlR@)Pq@aJn61524+wUpZ)^Ty9*wSM7s}$o8nnRsS8%K1;HGHr>1D& zrkK{h3@7`)ziQ{;|7@0sekXzfxPD`2cyDKmr{eR)ZtLh}IPuvaE?^meQDE5*;EP&4Bv^oYME6F;;&%NTtJ&JN;DWM~W2+ z8Ei5i{}as4|49XjMAuAc>38fKXm*2EPU6rc8o3v5pfd`7koFn~%Cu;M;t&B1Dp9>r zm46nkfJmY%popFwec7?O2mcDdvZu%TBJPah1CQv`Bj;h^B`BrK=2oNwpuxBmoy?oxI&ys2^GjHA1Or^svn1_Q(S#t}LH zqv;|yYlR!=GLgz-)>H7hCS=BaKAbJu^B_RYYb~et_&;M3@bZzA!8<=agy(14eyljdwANTyMK@kRoL?Q^_uy19+i z-^H&t&rCGgneg>>>{piFUaq`#*B9_FbD#u!AWh?4It&=%c7P9UlH8{8G`6GleTJ>7 z*PBcLmBwpZvmGT2OC;BGqnlzW4-?sV)*w|+Rw&F|DK*5S zL*et^3e|gHSNv9j@WvjX3fgmWVM`6Eq@Nd8_x^<00uWJI$tR64P1gjJ^qtY{jJQ^- z;uc28cOK!sHx)E?Spy$lpPKG3cxW7`E<5nrxSDSLdgfUthP0lZPhujHH_Fn+?mwdiN3M8Y-KOykQ7rOJ9+h^*K5-d3A8i9%TDzO0lyG@Ulcm6O<(_&QvtdJMAmP-_19sd<>n#%8)(;D zQ2!}ez|84Ue7Ul|rrFstM@SkP@2xNUTYXA>L2{Twh^G5gQv0Ix#hyz*l@*`W(1UdU zB5YjMVCY@TKvnmzcLfWROA;A!CGkKl@)nhlli9{DW_RK+GrV?vN%pmAb7NGk&b5bZPNs!D6%q>6EKu<(vz{8 zWmr`^gu#v$b062(LF|s(F6er%F`EPAuhKLI+yll1Xj%I)x19!1o38dIn#7swRPa3* zh>{xx`*K{*5LUe*>xxEKt+_Op_2t-U_#S-ZsQk@V{QE9Uzh;GN*eD|Qj>`~Tk)}fZ zk)H$}v~_M>{`c0QOM;^mW@Q(hKcTE3C^DsZin01GE^Td<#LQUxnm~6 z#E%hjihUv@j>JnoW=|2z%Rzc}Rur0}fDRwi0U*q$cjZZn6BKUc-`H`+2>)|Th`Jw( zt53=-qNuuzz9Y=h`EIk$&t_bJAsZr7jfjBZAz=c$bFeQ6AY=R)M)AB;s z0!$Jkxh)WOxS*b5$Qewy36X($02E58sEibI7XH9$Sz-5iEXP(P>7e)4wxk|}6?0Xw zcqvh3P}?NO1EEYX7(SomX~HltA7c_KxSUrKE?)C+NaT$2n(&wiwmShObcc>($LvO| z%ZNFUHmqK68M@4Tk!I9qI;!M9xZ0D+P30%?6TIE!OD7X6(AI+V7)?a#X(if9@;Roo z{>3Q7{U&%UWzT`FwdOjOXQv@VT&0;`1(=w(nm~)vNz&xR2ZU6*u=s@6W~^=Peuk1} zKhnGDwyD$l6#@!X66reYn&KrxoH;FJ7-ErB4#+zKV>7)Kp#9Zy!)#VM*Bd1a=*pzN zLA8AJ!N`~EOAbbVvf4uRba09Oo@2T_dBYKDP%E$gt5$9$>85RBFCVH87Gg!00?4l! zlJP(U%=o8D7%zUU9a1)TyB zz&#ebb-L7Gk}Hy*7S};q;QV%Y%JE#z8dOL#je{+gn4m)AS!T5>0BE9I=Ly9=!8W#% z{?h5pHkSC8hs9Wyalkro3Um#(A!;bvWVuny~+COY@_wAbTvCM0OP&qf|5Sk6ko0}sKTkNc{$Edq1_O0vZ<*9m8P z4ITT&clLs}Y0k6b9^1(T1t>boy-w4f{sR{f{grM!7l;yGtM1F<+s2uTav@_hOI`KRbia$_XN* zvEjuJ>3yDCBQ6)BRbst-0#eiql}>eEFn^<*I4r)by6!7&pUSau_s&zl7bDjyG$NOO zkBH>?goAwB#~b*&Z`224V3et8^g zdPdS$0t$>~`H02AGc0Vjvw6DRcCVZr5C$LrMHNXtkznuhf#1Xv_f@~?zYt~zSK)#P zS-xvPLge1*6x}w7`ANOBTRvLvUDQbCxDBV$8av?R!N6{j1F7z;@=4;c`bY{u4=ziA*%_$T z6OqBeB3h7}1RGaID?9%|_3^>7<=t62l!lf$1CwM)#)rI?zet*6T2+E?3OF6I=^GYB z%$J>~iarXO(=k)>K2Tfl4{W~DQJDT(t2%3}+j&hUkb1ph%FmckNwK^gXzd&sqpO9>t$90GaPI`~Ypcy5msXCUd_vkl)Fv4rcy z_bCc@;5}tW{|OQas9N>qu=idmYCdQ&MO!wiu%b#bysJUvOrS-g)+pR^_o`Nk<&w8n zrk`7c)cy$-4tFD7OKf)^2Xis(XN57Q#KO)2FqotX)N22|THd;F(f7w9AX7$PghXjs zFf-jO0HSl8=h^UEs1Zz95_FUr`sRN`# zuX4z0A57h9+gYR9I7%}^srr~|q1=xA5-W;NEM?eA45{O&0Q_N*1-CKTO!jo2$pJvo zqd$zkUSH!|EfgA(?)vF7HZ9Q||6kXI+k?dvPKKUUTV5e%wPLuL8DscC%=_CW5t{qW zoC@4f)f+UU?9YppE1#?Yv820k6o|Zs4MjNW09?_JgTs?-#jsJL{u+?hb`E-u?YWjA zt#$zK4jYY(xPXB7{8+a1z$49lzoee4nJS`RW?N`)@@+|)-8HPAP|}XM@L!WQ+0tdQ zmp_69o$-~)i3x1H0DBcN@Ztot0mVX}-ZlC1l+1pe{)l(LP-un$6+}R3!kFY{7@gee z_M0v!26A*{Eq~ObwQ8$qO^ezus5=(YrP@6N9_d^;x%FlCjBlD&j0tx2aR{x%vWVva zcF3G^p9;RdPhAXS=nF$KlIL#gt&fP}m!&!KAUT%q+jYQ=HoKYIk zm~8fr-v2{u&{CiO(fZ5k@(kQvEo$8p($lKU^$zdtb8^h%^LYp)j4S`nLU+oLeLD?- zV&ZB4uw?Ip&i_b+tRSDcz9vc<>3de~>f$I|IUhGQ{n-rkz0I)Bmi>R51e#u0A4!UP za#rno1VU8`17Ln)JfVfCCpcAC&ges>bGBd+?{&E{UVtZMw@?NBS&<(=hXhuP5WECX zUzq@dk3bNW!?Wb~oOMUV!@xb#5v6ToKJKxcFE+pGzgBzLiL!6LGq;c)#!qQo`eoQ_ zv!jDVNyI=2X>~{fpL^^hsW2HxuJ`Onwf5lmy)em+H1SBzGaZDmMDN2#K*+_NZMaij zO8LefXsI@pqA;iDnTvV7lf4U0Z(>59d+=`F1H%Sf9^gnLSF+!BZDEMs3LZ~Jcyr82 z^kdr~rmoDthCbV!Zqk$78ht9gZ3Ss^Ha-P7wc}qnH4B%Q7!B&j91=MT_pYmum*ykS zxtFHl)M-U1eq@)tfC(O*H@v<@?+@ydA(7*~KP|~S%YocicQccHgqY#w#sp_FhH;q^ zye-gfjekn@;OsrF;)~N=03rtXoi4G%yf1DVkTK@lFYut4(*E2)?|%wup$~^+$q4ja z7mp-At*%v#I4Sl;gFd%`g8xLiFi{sc~J$sMEP~igs{UfiQmjzveFK-d~_C#2EZ~7Yn>FwMt_` zH_!mg29lu3b?hD`mtrnqf|vC(F^~;PW}gpH*7p~f#^L~|Xg&gkEI|Z?n3r34<_4PA z3$u-sS}db9sspp#owbq}AhNVI8?7HFvhr&AOSIhy0A^O<*46`&%jscaOUN>(Nb@@y zW}ElBOXrJPmc61eTiX0Az_{ z&WNcWkXu)~QWNvigyWvADez;+ZItT1J2m?Oo+uWahN1UWt-v$c7Y}N$ey_hjamFKu zt6JrZbsSn45;4HY$D8g2@D^pd*hGGS;*wEc9dPn>0L8=X%C%dsq=02&#unHz6`I7% zD7ufY)ck&V_;Q_9Yy{q1w%zCk5(ngroD%$XjfdWguhS5CLj<6bXCJCp$(FM-lVmf5 z69M#V2gf$)8{KF@^+s#UR+c8GHY7B%rkCZ`6j%-85K#2#rHlfGTeOn^}p2GWraFj7okt`}s2xUv?0gFrtN-DB!H!OEZWo z_c_K_)Iv-+^(mkOe>d&IwXMq{d!j$&rFh)&*_%>Wt?7P@&!8`K#0zA^unc2l8%=7| z1&@pD63~wOa$5-vG`O5Ttr?s}0u5$wcokIFxUJnvV}bM3kTV zq|sKAKLNR4IGwfi5htK0T7Fvb;Z%T(+!9d1E&A^sfYDX#0q!zYPRU%(%aV(^Y!48c zgHpzY`@zQQ0+g&MFda4}VDrX-XpGDQz+vtaPv--cKcLPw&WN`WiVoE>-DaS@(@$Uw zc9!FM6OFG|3A%DQ4#@UhSyf+FvZ9Q&lYkeHJyCK)I84YI6h9ovP|2MD>1Fj=7RKV> zPWlk7F>Aqw+<}w=yg?0K?<|EUhdYRJA0(|lB6r&t*xk55AyIPbTLi}$c&pO9Cj@rD zv1`AZ2nucvr6Ls2Dv5;`+vSXT3dxoDg%C9BbQ- z)5Bws7xrJsp6BGG`qj^V7+-dV7fwr#ss~mjtNR}0!zqxyi_deb)U_0F^uOkO3_Z|2 z{7H_^i4SnA$z~bI5$=&BVPKQGZG6)agq}kghQp!JYWmNv#n=1 z94tP=&3rre1HS+4N9JOvr^aCIi9;5~1N<&agx0STs{_z_NHMHzPv6@2h*NIovIQWcdE!>@vzlFgWr_1W zmefjs#u_gKpi+v>#X-#gPx$Xa8FJ}@OYeRW`AO(vK_(LtDhu5La{BiJCnFysxN%+a zxJGewbrmSsf2Wh_Ywwg!ZU$Cq{U~Xuo1Lz^p8)K#J9f$WS4u}}*Hn~5ow;8PhRpy= zQ9lyjVxVkx90-(_Y1zx5S2sMXU+!g%9a7h|!m0P;>sjSYZJP@4!Gpo=dXT=ql)B_L zYR|6Onn@#a1FOE+?xh_9jwFjYypk(B?_jg8vS0FGJ7`E-c;GM&5XCCFCzPTp$qE8p zAo<7$+_R<vAQ$dQ%U{h1o<-NaN&1!K<&S#FeF)wX|eWy)vqdvxVSKZ#uV27nN- zk5$tjSVw-f43eXvF9dc}Y!MP5ZeA)27ohB3a3zq1*B{i^eDT8o3RR~9y5+3@<~;bK zMUXJ^8QbVbG-OiyoO6ZlkS$v z7?P#kF}AFeDuiV@g?N^DO__An8=e9obH9=+JtG?n3{N<(y329GH!NZ1(un0asYfc&BisVSXqLJw zR+j2i!HzZ6+2VDzTEon$k)Ra5u{zk9YO3|;t1DZ8=eT72H}a7lO~345|Az$r;WwTy z7n8EZiGGhvv0<#txOPUb%)+M1AVQivLcLF^x$hdI4@BgY)SG?sr{Sdx+2~2> zcDdrgk}tCSZHt$%)}*=UHKEsamU&Q8c7O|El%86%Iz2%gVou6T9toNKD46ryUG6oj zYpt(2Gxn@rDmsz^P-gL8P^Ojmd7UMz1h438)<=Cui*ev&9TKN*n0bgQTpV6ddMh!& zspsqCdko@BmmK?1$VRWAxHz7c_zWG2fhZrti{m3q*Cn*SpF433cAq8h(-~m!pJ~nB zko}RX?=GBbHU)dsWT6I6P$Tcyhb;=tI$HQ6ouZ2iLf+chHW!y60|t4@z6Z~f11zH* zo)SG>;Ow`n4)5~D-X0;|-;%02;8M_uKm z@PX)wrYDHZ{E3qZ;Ql(1Ls4n~XGr;LGieCyL9$a2c7NAsrwmN#~E$umvi$vwA_cE>HBsH&Lfsf z$jXb?F_&ZLcPIm;yiu#ua$2GY1k@r3C7b-H!$=K188YG?re&aDPEY|f>D^n5b3lUB`&I6NeN-_l zeaBff{WgDb{ZtSQIv}_~`gTB7Yef@l!EK23jki`GYZD;TFrc zsIfwWUnq<3T2zamX9u1cZcSaUi?`1{6z4n#nurTpq{W@A{4bN)B^*zj9QyLvZ)Ek| zkfxgIRU&NI=GoN0IT~C4qR&UmpKTP0?~b<%xIxschV4bh{EcP8rhFz8AASh?VT6*H zX2HUvu(N6koA2?Db|CNlIwR9Z8;=2`uky{I5Me0NiArH!S`qgOz9wF(Wh45#^mnL& z^r(m9vt1^bKG{yL%nx!V;#e(BmA9<3+Q9su)AL4%IG5O0OH;L0g$%fyelsQ5J)TF# znVSHg_8g!l<Ses42b25~a zE(E^RWwlCL^i($o92N*-orJI>-p?;SKFjW^(+V#WhoqlksJEoGR%xMB5!3|+A#MX7 zst?4|HWt6n0*`H$d&>*K(O5ibebTLy;o<={J_>pd&`~sS?O~@JLf>WBn1j=M001%3 z_C(ilb6);QK-CFo$w|y=Laj>G9`$3%uKKx4XaM|VDuS-v?ro+{y?&4PIq zhI^`hk2b;vZyrAAR!^?zd*uCOpi9HoN4&?Wy4n}S*8H#9Jk)z>-W9V^JQk$FGoPOv z+$sSMI%@qLt#A?lAg@WtV^D0$200GgP4Q{j z@C?>wy5fJ|N;?i9QG9Su>eFvtS>M1a1 z?6p36QL$t}vPu`t3;Ot#reIt2zXy8P;I+AIt-kA*a<%O>jlT))s&IS)Jy1;^@|p2)|vRv^k%~`{fUygf&By7 zJrX@q?sLjacv@%eMO96bdE3Pgy!QS|4YaJHfOuid%OTmP?c!kz8Pi(uO>69LSCCe| z!Ak{tEx}otcK9Qg1vT*E+aPV32tPhFDE7{CR_H+Pf@q(<;eLZOV*Xdrtg7AC$&>F& zMF&pkg3vu*)6t3Layt$E*P{$SIgLwT+&-v0@2ZUnP)o!(SI)ikogUQrO?d7TxenAy zK?$pS=kyV_v_K24_qJf!B|l!0CdiSpbt9V z9ORLE80oTt*E?$<(iBB+S>`^1fzLTT@0b)~-$={u1RV>p^!X#GIVt!s4RW^wzwSFGnINL%6cY+SlfXJ z?h~YoAu8#WquDg&wIdf8{_-H%A}4z(qkx<+A9q+DVH)WPwGhU`*sHE|GjB23M6lRX zocnxk_z!K%OaB!@+?pD{Sna|QGTZ~IW?6v|{gP{Dier!JI%o6##FbkEUwiQTfz~h} zbvhL%^Cjv=T^PJT-$9Zm?z>L3I{IgXU%QOUT7|vaFj^`4^I-30T*wpvYXU%)F4i;% zBn@}}qDJEzI-4h$TGHwbe4&Vq;mtVvU!0qO6_2`^D{kMnJt=VRB2vQQT8N@*O~!fAz+i}`6Iuvy3Amk=~4>ed_25A{Tz-8+>z5rBCDh`vpqke&~ z1R(YxSzXTy5Gz((hgM~559@0P$*!NVi=EhyMVtEuaPv)jXM<-2z?0;FXh$SaU77hw zbZ02IF!F*;d0{i)0~RFho=y2c?Ewx{9t)`oqQ;=X%5}X21RRZ9b+)z1_t_zL3Ein_ z>Z8Q_c{dZm>)cXt@1C<=4Dc+fCSf96T%faYb7m;Y?`h+xvQnA0aE9wDJ-)gNiP4dV zfIhU=vZ;$Ftgm6_xO+A{O69bvh+s9w+A z#ulMN^5P60qc}nTX`i9K-OtM$pl|GddX83?Q6%%b*MMis2cGUHsJ|d?Mw66!qAN`0 z8V-f;d`mXdd#eH|lHX8E^W&`>3y_YM%TzxG$2~lyp+A%R6LqcU6@z{TP2&$!x4?|C zp3WH98scl%`Pl9yDKKsz68JbM{3hEa)zImQJOo+WO5Ms4Ojy+(?rsL+{Ta({O@zBn z)x}~0y6@C7ZiNC-pd9M`v;Spz^{FuF42Y;hPIgP(sZSCwTxUjME{E9wiYgHedw- z*;dI-(?U2Svh_WZcF1Lz<(2CJ{9s)&sKtC>a`ZnrW}Ax&!Z5H$(-^0s4h|!h2V@jt$nB z(sb+fHH|q)k%O?{8~}a%;B@5765P=WkbemuqLZ>~;F5BMl`bv^1jtCoI<5HA7)BT-O3hNL;bX0QR5RoV~=fzcK@*>&3P7>N~+ z46a0UBB+VOtW8=Uda#piQ=WkFS`Z!|v?(@b4V(2Ev@&PPV{d>>nk+W!1M#XYAAf*C z$Y{&()#aTa8lQ#fEz|i}(R|bA5)K~STG)9d3 zo_O%124QDcvqA`N z-EDZfyFq;6K&9M%X(d-#4jNy{+&Xwmfan~<5UtajNCSH5IsnjDE_D8V9cz{zdU0Kl z2W)qJ=Yeg#vmJLTDLC-0KW>0m=%L#6eAA=ihEl+<4UK?M4aNdf%JQ zcGvm1av8=t#0{EZHi*p_Q4r`1y;`tb2izN>y$dsj`7wC~4gjDn(8tbbVUm^GD$4T% zptdB8c&}Sb-t(_^@IUs&gCBphXbcurzqFA5Y?ZbpM1U!i$=u&Q*rrSVBR1OY(Zney ze+Y$7$lz`F3u3$HAmj&nkjgZ{VUBR`F6;iHRm)K^L%a#BROD8qpi-^CGs1Jt7pn&C z*>S+NL3bkw(p@zH``jVJl=!vcd5r!q5Hxy#Z;nf9cMRM>@I|K}(s$s*1Gr3Dse;mM ztib<~-axh@9}rBJuM<9;ydZvPq;HHk7XiZaz(+$+Oz~F5Gx#VFFb{QJ6Ph_2#qR)3 zB92N7)D-PtdMp`}y*9py#nn5f29n8=xs@P|t;56)%rtyYs<<3$!W(>!-w7An z^^!9ctm3Rn@V-t7!omXwd4`=lPVR#UMENf#3}~9tLRfNf`NpZRdaSBXSLuB$$>1-W z?rBo8jV#xS#n9T{SI$RxXqu5hbSyn=+LG_J__LJ*-9Nqi%kYL=Y-{yyA-o+5gZqU6DEoCI~4<0F~LoS_Pyw+kEUCR1mB)(sa#Z!}b^+EMZTYNRvHQmf| z@vwl37}Lm~)O|UFkRDL;%_Kfk!Gd^Bn&w>5_5LC00Ne?Msb@mgn<7y5vnc!^M}r1W zgJRkt&|PfhGVX2)A#eh_BKfs(WoIKM;{n%fS$pAGKqnu#8tP8INHy@>(eFd&qeZsaM^v@k z>F?9&sJhOp>0DfZ0k`EQubPGor6%bi{0{C}R2E}hSIa5oJ@lOOIa5iax8a}>8Btma z3Z>C!s;0B1fmOAihXSX!9)F9B-fmQO)&|X#7FHD?Ga55Q&Wth3F?fNctvm>>A^Y7I zjmy;+tz0Ek`j7)L`Gzr9PC1FcC65i~&bhG(hraj@L;(HErgqxFC?}GQ|9e_Y)X+87r zb&`AQTEp=Au_#N>ZQXIRo=|k_xdJ{SqhBFN7n>GU|O-VOB3v`1=(u4R7^Cc!2n#v~zpr{B((6XEEi!kx6!|XWTg?hsr=eLSe#rlX{O4_;Q zetAIm!*Ya_zT9~_o#5CxT*zTTSAKUNU?*4O#V$p7KvhOLfIutMV1$3D@)eNl8`l9C~Hdf+LP>&qHGOiHyTPIWh!f7R4B5REj!vz+tHbDs0u_kG>hb)DBfoeo(Qg<4-0c8kYX%_6(ml8EE4&zAVP>jHP$Wu=c#O&B;Ncr}86F!grPu_wV5+*7{7ScaBHWtAd+c_ zMIzmCX^p3_bDy_z#&JdP&38MrT943nWnsQ)F`7*Gbu4KJB<_1907>Kb9~YYq5B?^N$$xr{aKAdVw`jnGJXAvXcb^- zQCBMeLqIoMqtNZL*BlSkeOKrcK-Z{*+N^UYIY)Az|2^cV(4s9>vHaF(G3#381VW&U zm1kAtcK$$5(7iR*oUudS88;+wU!H5Jqr7w8+}l4U+tikm2Frb>Wq&MinI{mct6o#A zCnO!^!qxN3T{mg9f<&%xNEcpvYZ}%0(2_U2H1yjunVkqz<`=}8HMJEm!}&zh$V@KBd@9tk)|Vdc1zlTn{4LTvfB^2i&H_l=wB! zQ*yxoBI8Uy#$!aaPl;~WO%vm@ya9?gU*5=D4mzlSycTTl*?{l_57F;;eag{Om zno4%c*TA{XiV`&Q>|?SWxLmpm*>)99JJ}91PTWBn?Vvpzvhar1W2JwKfm4622c#e# zmu#^5!|Y=~5%%bI_!PL{vT~|NCa2-fE@jXtU9rll#oLd_`8K_5V5Dplym`Yd2)>`H zgn!i>r-n&&r%n{Hn^5ND_!wH8(QI1#hGRnzU5{50#V2?w`P;7**9vM<%cj~)^x z3MSk0Ww7siPzLmXM8roZ`%R299!Tw#hMHa$5rr1T6IMAMqflH#m2Kj7g`2p+$`vyr{0kjpPupiE=DqNoc2{Qjho5EJ5q8gmIbbUi z0Jt8V?KrrEoiCStona6!^k^REbo$C&SNswcqr5~>;BMzzrZ>?HBtDL+)lj1lA5rSb zg&$TVR-Hmk=9b`3du}GUvG1UB68+Ry=Bt&NQ(a=7WFY#*s9bv6Sm5Wm-ABy4G7IuEeQ z8Hbl4Cza8u-WDI&J0Z2=bOYN5BCGgWZTu5@%{?JHi-q;YmZVr2OIX735d%1BM#y14 zU4R~xk`xqPc#gvtvYSREmbTyBdTVrMf61>ZSao(kzdTp3k?8ipeWqh`3x2%_6)D%& zuLR*ms3$eb9zft1Ov;sVI!v&;^sQE3hU0+E-%UbKL3r!f%=cNu^)34`vT{tW_uFea zNGlacRKnG?a#dZHE=bNmra~mUvZ-r82$*`Bg~TPSx#_fuDxoN!kcIi7?aNP$(1a0B2+~(_YnrrnaWx-KeWF1=*S&ACk#tiBW3=c^-P8QzX zJOW{7>^Me~iKMyf`9Ak#FIjJgqOJkaA9XK}K-Wdj+NQn|1?g2FjsiWk83|Te&Aq=J zLjH%fiXTX~dG9pJk%2T6`!y>10(D*hKgbrl#Q*qQka>t#$Slm097U0uyu_}{?G5~- zbV_hb1sho^C`_i-+mG&Ys{O0&$m&rTYw!A#FOs1EiKb~_%jK=_ZALtD??YV)=_p*^ z%c;pnQ6L}1gqs4^!?$&125=GL=@3%B9Z(uiE^lJwAx?OyhA1(U6%S!n=5_MOh2#In z`0bOPfmx6f@DVe={y-#ubBFm<($VAvq4rqpEDut*lGfC!dj^w2Fi-?L5z3%CM&&Fe zdZx}_jw_x#2PVQHZ@2-Z_aiyJP@wlxKZGJHlg9M-XXz=BP&`fr6~UT5p7$n`QhC`J zD5={`nWZd{7DOrZYuDTfP?U54A`FAN*)?^$WFJ4G0QXz>b>G|1;Q0r;CIP%jwhWwm z@PN~sj|f@Lu}RQYmE1mwKQ1(Y;9byntMt_~JDQI}V2cP2$@|}&3i$#j39?DkD&^;z zdO4^afvnkpj^@b!amvo2ai2E+$mPls^2i)^Ww&b z)?bNdqa;_$ZCL=V1jb8B>WjG#+UpXef7JsrVk`6M;#r^$O(w#S6e_$CsU=XX3lBm6 zOZ%|6pSdpr%_jv@(I!J!64p3-TTflGh#-@Ku)`xP(5&EmH<_soL$#dun8CP<7yVM^Z}Y8L1T|5e8Teuhf#TGd+GwxMV8dq-2`qCO?i9fOr! zM{NOOpJcXSs457E-%>+s6!b|;JKSDuB>>0l4!Sv1Ao-Qo?n|I=YBW8U8n>t;@tnHh zlFO*13s53U{;ela*l2WfYtU!sJ`>H0nWn0FVZnn;O3BHy*37{g<8Ut22Gy;Scgzk&>0HLL9>L|czDiw5}y9xcUKNOrQ#24NeStxVVU0Kp(9A)*3= zl;)sd#wE%zuW{p*wowx}VY69YM|{!TW&+)b)Wk-|p7Repu;>}1X1$%$SIeyZ5T~FD zZE-f}aC>`L@Ktm?l0{gQTEe2M{SP0pVVdXfX4e#KYAd%7L3^#c;x9&p;{Ma^(U2#6 zs&$>}jqwt#=Y8)&-XXi;ttrF+P~gwD3ie0vpqFa7-TNi|0YE+orEaQ-mrLQd6-ctVwYRD?@S}CO=;_1L^UoH>m&D}J zK6ke)*z%Gi#3oG0J}Q74hDhOIl~*1okWP{A*im}L1Vgx72+HGR_#xdyV5@5gU(C?_ zWn5l8*Po(JrGfCxZ8pDx+*3ZOP%q%sXlsU7Mj zC_Wg_2gwRBt@`t@sgC+{2%AbQ6=^p(#Izc|dI;i{uy8aDIW^eN;pb3@beqD~T@a9V zGPO;GB~LVkX$IvTYDZ+flh9DGZ7(tG$q!D21>kGP6By{NC`$Z+8y54yzHZUXmgW8m zGtl2$I9Gz3W{)tt(4-c7;oxKxZtfucP?XK2a=C0q?c9B`aD$bA7nwsEL8|NZe9Qov z(B4wJx%c8yyKAV9sP)%yBh0u_$O6a?V~cY!O^0D`Ov09S3SBz$zBR@%7$G<}B7E!+ z7qjvODr3VcJ7sg*5o`THHlJz3GF!dnWXi&(yKMIQ)fboMir&o*e%Dedazh$a{>)

F@TUEi`wT=mIaG%Yp))}gl)1E`UFTvTULAW_PVeSNMHKhCGL-K zrwuibv)wlH1<$PvXHw+Sc3Svc)|K`FL(=^X^WdK+c_)ZY!ZmpV{k_KCkQ z1~K4=C6+HflTG1jhslk$r0&Z{XTMNMO}83UdgS?|XAWuv{`I9AX~W1v_O{LxFMazm8Y=7+aHfo9qU0GKKpFJn9}($Px=WP4Bw(^~RAc4>2ZF`J1Mh3CgJH+Fa}R6uP? zGI^40K2+_hP}5yOdxR+){CIMn>wRPl@jH{flEVB)wayw1O7W;|Sw=5A*}NAp^gA?O z*T+fZMB8FE+S% zXyN?1Kw#e+mV#RY(Q8^Gp?*cQDL)~?SD7*ZIN9#DGX*6JoVOul%;4nEGrk88@gM~W z2jhB+s~hN5rZ=UkV^XP#0cN_Zo%fwxIK2X>v+dxX^lA|w>O{2vjQ5b_pb?}a`NNUD zIVEPIKfTi~rUdQjNjqVJ9iG>`$>5EvQ(yYg7HNwlg!3#`lckvH&x+u*6=7HGzy`dI z9YvrZstA566S?Nim zFE9t%c#*_fa9v`}t1A}_YM6@P^dX=8;9>~#-6st8j|W0`&_=C~gPK=YWz|Ux0YViZ z0NVCkCl#l<62Viv#$Gq{=%3mpcYtv%lK%~wbxObb_4l5redQt0aC0P=r8y6$4~t9J z;61M|Y3^Q)qCeOVBHWj_J?ZNjc61lI`0G9oEkYyNxME(<3LU~niig|6g1*D{OM~J4 z6M|8c!DxHl96SFe`3W;>N60Xx&9*qe@;G61C;-~HRB;i`yLENQyLDT!#lQpga-X-4 zE%%dl&7~{qHY64hlKzm5{BTInU2o(^Vq5%|QZs}BVa-n-EOzNE_F}d#2|~Cx8!JxM zAigHoX}QiXPP{%5?k70aSuV5sgIuY&6IRcJqP{OkK1$vmgw-lfy4lt|cYNSl5MxSj z^O6*dHBFOeHOT5k3UmnKoApvbyL7xiETi7ZZ>_-nz8$%O@tL*YfBC<|I10&X=w)9H zQ~dTII!dm3f6*B&XoB-ssipm~lb?Ss|FGM)SZ=y-`g5WZo79R)UtZ*RpWUcuz*$Pu z#>KOd1=p+J2|4WwjHI)XoQ#&P;#`?DwH>W*EHLe^^g0Sgg+}<-X<~3q=|MF4DCpuZ z6Dd|13%uwDSpnVX6opT-jy%M81H9-W=eF#60*|Y|^zykwZCy15lEJ>jk?}g?zMy!6 z_R<}d=TpIR3};wSn1#swRPJ#H-~@N&c6oGdQEOM+vcdre{8IF~6Ar+bFJiYWIV-*P z|8hcYqvEFOI%-*?PurWNV(jV{o^@8-~Guq{M zw43Agn$F#Di~dA|B5S}A12J71D4B&!LJxq3g(SnKK&zfa_3+^7QGZ@hO5aS)G-mji z#WsYzg~NM)r=e;TeA!WdUb(Ea9VD-LR{XEQ`GOn>c$pL+v`>klP`_V61q%U)X8c_9 zHuLXuD)IWlK)#!!P-~-r?;G-7b}P6Nw{H(A@*v|;nu38eRiaR2tQYxot`aaAXoU6D z*PY=z9WOD%hXS=W3i!#Vf>Aa2%|`bl)}5hgn^O6)ACxF$D#){vO$p=O{z!EP`Tj&c zeP8hM#>8z*-0wxbvEnvv)r~!FZPVNc4jaK?BRFgXht&*fBahoifHx|K-E2Hg_TT!SjFC>;9g=d8A(6)$Xg6BKK!?7<>^rYQ|4Fh>5F}x5=OVP9ZlV6sF z^e#2}D@}-BASH_QE<8({hdN~8MFR0S@?GRRH`$rS=IBssA7{GA#5Bfe>9L3OuF_>C z3#IY_K`8LaFMLr}Dp&Mxh$NqHV*nd7urUK0Gq5oO8#Aym0~<52F#{Vj@V{{ef+^}1 WKilEsKkq=npN85A)qEAJEB^vQtewjM From ceb311fc05d43bcabf6189e195d23b9abcc6f4bb Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sun, 9 Apr 2023 16:23:42 +0200 Subject: [PATCH 3/6] Fix building with Swift 5.8 --- Tests/MarkdownUITests/MarkdownContentTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/MarkdownUITests/MarkdownContentTests.swift b/Tests/MarkdownUITests/MarkdownContentTests.swift index 1d674675..b55f42f2 100644 --- a/Tests/MarkdownUITests/MarkdownContentTests.swift +++ b/Tests/MarkdownUITests/MarkdownContentTests.swift @@ -219,7 +219,7 @@ final class MarkdownContentTests: XCTestCase { XCTAssertEqual( MarkdownContent { TextTable { - TextTableColumn(title: "Default", value: \.[0]) + TextTableColumn<[String]>(title: "Default", value: \.[0]) TextTableColumn(alignment: .leading, title: "Leading", value: \.[1]) TextTableColumn(alignment: .center, title: "Center", value: \.[2]) TextTableColumn(alignment: .trailing, title: "Trailing", value: \.[3]) From ff23dc6f43cd6d1e7a8768e6758823805685d17e Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sun, 9 Apr 2023 17:00:10 +0200 Subject: [PATCH 4/6] Deprecate block-style methods with a label closure --- .../Theme/BlockStyle/BlockConfiguration.swift | 17 -- Sources/MarkdownUI/Theme/Theme.swift | 45 +-- Sources/MarkdownUI/Utility/Deprecations.swift | 260 +++++++++++++++++- .../Views/Environment/Environment+Theme.swift | 11 - 4 files changed, 280 insertions(+), 53 deletions(-) diff --git a/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift b/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift index 6ca7c0b6..0ee2a56d 100644 --- a/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift +++ b/Sources/MarkdownUI/Theme/BlockStyle/BlockConfiguration.swift @@ -26,20 +26,3 @@ public struct BlockConfiguration { /// to get the plain text of the block content. public let content: MarkdownContent } - -extension BlockStyle where Configuration == BlockConfiguration { - /// Creates a block style that customizes a block by applying the given body. - /// - Parameter body: A view builder that returns the customized block. - public init( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body - ) { - self.init { configuration in - body(configuration.label) - } - } - - /// Creates a block style that returns the block content without applying any customization. - public init() { - self.init { $0 } - } -} diff --git a/Sources/MarkdownUI/Theme/Theme.swift b/Sources/MarkdownUI/Theme/Theme.swift index a4bae55a..d00f927d 100644 --- a/Sources/MarkdownUI/Theme/Theme.swift +++ b/Sources/MarkdownUI/Theme/Theme.swift @@ -117,7 +117,10 @@ public struct Theme { /// The link style. public var link: TextStyle = EmptyTextStyle() - var headings = Array(repeating: BlockStyle(), count: 6) + var headings = Array( + repeating: BlockStyle { $0.label }, + count: 6 + ) /// The level 1 heading style. public var heading1: BlockStyle { @@ -156,22 +159,22 @@ public struct Theme { } /// The paragraph style. - public var paragraph = BlockStyle() + public var paragraph = BlockStyle { $0.label } /// The blockquote style. - public var blockquote = BlockStyle() + public var blockquote = BlockStyle { $0.label } /// The code block style. - public var codeBlock: BlockStyle = BlockStyle { $0.label } + public var codeBlock = BlockStyle { $0.label } /// The image style. - public var image = BlockStyle() + public var image = BlockStyle { $0.label } /// The list style. - public var list = BlockStyle() + public var list = BlockStyle { $0.label } /// The list item style. - public var listItem = BlockStyle() + public var listItem = BlockStyle { $0.label } /// The task list marker style. public var taskListMarker = BlockStyle.checkmarkSquare @@ -183,10 +186,10 @@ public struct Theme { public var numberedListMarker = BlockStyle.decimal /// The table style. - public var table = BlockStyle() + public var table = BlockStyle { $0.label } /// The table cell style. - public var tableCell: BlockStyle = BlockStyle { $0.label } + public var tableCell = BlockStyle { $0.label } /// The thematic break style. public var thematicBreak = BlockStyle { Divider() } @@ -249,7 +252,7 @@ extension Theme { /// Adds a level 1 heading style to the theme. /// - Parameter body: A view builder that returns a customized level 1 heading. public func heading1( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ configuration: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.heading1 = .init(body: body) @@ -259,7 +262,7 @@ extension Theme { /// Adds a level 2 heading style to the theme. /// - Parameter body: A view builder that returns a customized level 2 heading. public func heading2( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.heading2 = .init(body: body) @@ -269,7 +272,7 @@ extension Theme { /// Adds a level 3 heading style to the theme. /// - Parameter body: A view builder that returns a customized level 3 heading. public func heading3( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.heading3 = .init(body: body) @@ -279,7 +282,7 @@ extension Theme { /// Adds a level 4 heading style to the theme. /// - Parameter body: A view builder that returns a customized level 4 heading. public func heading4( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.heading4 = .init(body: body) @@ -289,7 +292,7 @@ extension Theme { /// Adds a level 5 heading style to the theme. /// - Parameter body: A view builder that returns a customized level 5 heading. public func heading5( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.heading5 = .init(body: body) @@ -299,7 +302,7 @@ extension Theme { /// Adds a level 6 heading style to the theme. /// - Parameter body: A view builder that returns a customized level 6 heading. public func heading6( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.heading6 = .init(body: body) @@ -309,7 +312,7 @@ extension Theme { /// Adds a paragraph style to the theme. /// - Parameter body: A view builder that returns a customized paragraph. public func paragraph( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.paragraph = .init(body: body) @@ -319,7 +322,7 @@ extension Theme { /// Adds a blockquote style to the theme. /// - Parameter body: A view builder that returns a customized blockquote. public func blockquote( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.blockquote = .init(body: body) @@ -339,7 +342,7 @@ extension Theme { /// Adds an image style to the theme. /// - Parameter body: A view builder that returns a customized image. public func image( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.image = .init(body: body) @@ -349,7 +352,7 @@ extension Theme { /// Adds a list style to the theme. /// - Parameter body: A view builder that returns a customized list. public func list( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.list = .init(body: body) @@ -359,7 +362,7 @@ extension Theme { /// Adds a list item style to the theme. /// - Parameter body: A view builder that returns a customized list item. public func listItem( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.listItem = .init(body: body) @@ -427,7 +430,7 @@ extension Theme { /// Adds a table style to the theme. /// - Parameter body: A view builder that returns a customized table. public func table( - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + @ViewBuilder body: @escaping (_ label: BlockConfiguration) -> Body ) -> Theme { var theme = self theme.table = .init(body: body) diff --git a/Sources/MarkdownUI/Utility/Deprecations.swift b/Sources/MarkdownUI/Utility/Deprecations.swift index 1a17aa07..a0229ca4 100644 --- a/Sources/MarkdownUI/Utility/Deprecations.swift +++ b/Sources/MarkdownUI/Utility/Deprecations.swift @@ -2,11 +2,55 @@ import SwiftUI // MARK: - Deprecated after 2.0.2: +extension BlockStyle where Configuration == BlockConfiguration { + @available( + *, + deprecated, + message: "Use the initializer that takes a closure receiving a 'Configuration' value." + ) + public init( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) { + self.init { configuration in + body(configuration.label) + } + } + + @available( + *, + deprecated, + message: "Use the initializer that takes a closure receiving a 'Configuration' value." + ) + public init() { + self.init { $0 } + } +} + extension View { @available( - *, deprecated, + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a generic 'Configuration' + value. + """ + ) + public func markdownBlockStyle( + _ keyPath: WritableKeyPath>, + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> some View { + self.environment((\EnvironmentValues.theme).appending(path: keyPath), .init(body: body)) + } + + @available( + *, + deprecated, message: - "Use the version of this function that takes a closure receiving a generic 'Configuration' value." + """ + Use the version of this function that takes a closure receiving a generic 'Configuration' + value. + """ ) public func markdownBlockStyle( _ keyPath: WritableKeyPath>, @@ -23,9 +67,149 @@ extension View { extension Theme { @available( - *, deprecated, + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func heading1( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.heading1 = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func heading2( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.heading2 = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func heading3( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.heading3 = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func heading4( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.heading4 = .init(body: body) + return theme + } + + @available( + *, + deprecated, message: - "Use the version of this function that takes a closure receiving a 'CodeBlockConfiguration' value." + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func heading5( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.heading5 = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func heading6( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.heading6 = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func paragraph( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.paragraph = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func blockquote( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.blockquote = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'CodeBlockConfiguration' + value. + """ ) public func codeBlock( @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body @@ -36,6 +220,74 @@ extension Theme { } return theme } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func image( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.image = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func list( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.list = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func listItem( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.listItem = .init(body: body) + return theme + } + + @available( + *, + deprecated, + message: + """ + Use the version of this function that takes a closure receiving a 'BlockConfiguration' + value. + """ + ) + public func table( + @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body + ) -> Theme { + var theme = self + theme.table = .init(body: body) + return theme + } } // MARK: - Unavailable after 1.1.1: diff --git a/Sources/MarkdownUI/Views/Environment/Environment+Theme.swift b/Sources/MarkdownUI/Views/Environment/Environment+Theme.swift index a0ac2472..7fd986a3 100644 --- a/Sources/MarkdownUI/Views/Environment/Environment+Theme.swift +++ b/Sources/MarkdownUI/Views/Environment/Environment+Theme.swift @@ -18,17 +18,6 @@ extension View { self.environment((\EnvironmentValues.theme).appending(path: keyPath), textStyle()) } - /// Replaces a specific block style on the current ``Theme`` with a block style initialized with the given body closure. - /// - Parameters: - /// - keyPath: The ``Theme`` key path to the block style to replace. - /// - body: A view builder that receives the block label and returns the customized block. - public func markdownBlockStyle( - _ keyPath: WritableKeyPath>, - @ViewBuilder body: @escaping (_ label: BlockConfiguration.Label) -> Body - ) -> some View { - self.environment((\EnvironmentValues.theme).appending(path: keyPath), .init(body: body)) - } - /// Replaces a specific block style on the current ``Theme`` with a block style initialized with the given body closure. /// - Parameters: /// - keyPath: The ``Theme`` key path to the block style to replace. From 45bf21d549c885f8aa6d15bf7cce773d5129eaaa Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sun, 9 Apr 2023 17:14:49 +0200 Subject: [PATCH 5/6] Fix deprecation warnings --- Examples/Demo/Demo/HeadingsView.swift | 4 +- Examples/Demo/Demo/ImagesView.swift | 4 +- Examples/Demo/Demo/QuotesView.swift | 4 +- Sources/MarkdownUI/Theme/Theme+Basic.swift | 37 +++++++-------- Sources/MarkdownUI/Theme/Theme+DocC.swift | 45 ++++++++++--------- Sources/MarkdownUI/Theme/Theme+GitHub.swift | 41 ++++++++--------- Sources/MarkdownUI/Theme/Theme.swift | 6 +-- .../MarkdownUITests/MarkdownTableTests.swift | 8 ++-- Tests/MarkdownUITests/MarkdownTests.swift | 5 ++- 9 files changed, 79 insertions(+), 75 deletions(-) diff --git a/Examples/Demo/Demo/HeadingsView.swift b/Examples/Demo/Demo/HeadingsView.swift index fd97066d..9447c3e1 100644 --- a/Examples/Demo/Demo/HeadingsView.swift +++ b/Examples/Demo/Demo/HeadingsView.swift @@ -25,8 +25,8 @@ struct HeadingsView: View { Section("Customization Example") { Markdown("# One Big Header") } - .markdownBlockStyle(\.heading1) { label in - label + .markdownBlockStyle(\.heading1) { configuration in + configuration.label .markdownMargin(top: .em(1), bottom: .em(1)) .markdownTextStyle { FontFamily(.custom("Trebuchet MS")) diff --git a/Examples/Demo/Demo/ImagesView.swift b/Examples/Demo/Demo/ImagesView.swift index 2d03e484..3b8fab36 100644 --- a/Examples/Demo/Demo/ImagesView.swift +++ b/Examples/Demo/Demo/ImagesView.swift @@ -43,8 +43,8 @@ struct ImagesView: View { Section("Customization Example") { Markdown(self.content) } - .markdownBlockStyle(\.image) { label in - label + .markdownBlockStyle(\.image) { configuration in + configuration.label .clipShape(RoundedRectangle(cornerRadius: 8)) .shadow(radius: 8, y: 8) .markdownMargin(top: .em(1.6), bottom: .em(1.6)) diff --git a/Examples/Demo/Demo/QuotesView.swift b/Examples/Demo/Demo/QuotesView.swift index c0f2082e..6f6abc70 100644 --- a/Examples/Demo/Demo/QuotesView.swift +++ b/Examples/Demo/Demo/QuotesView.swift @@ -18,8 +18,8 @@ struct QuotesView: View { Section("Customization Example") { Markdown(self.content) } - .markdownBlockStyle(\.blockquote) { label in - label + .markdownBlockStyle(\.blockquote) { configuration in + configuration.label .padding() .markdownTextStyle { FontCapsVariant(.lowercaseSmallCaps) diff --git a/Sources/MarkdownUI/Theme/Theme+Basic.swift b/Sources/MarkdownUI/Theme/Theme+Basic.swift index 1aaf15f3..68071135 100644 --- a/Sources/MarkdownUI/Theme/Theme+Basic.swift +++ b/Sources/MarkdownUI/Theme/Theme+Basic.swift @@ -19,61 +19,61 @@ extension Theme { FontFamilyVariant(.monospaced) FontSize(.em(0.94)) } - .heading1 { label in - label + .heading1 { configuration in + configuration.label .markdownMargin(top: .rem(1.5), bottom: .rem(1)) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(2)) } } - .heading2 { label in - label + .heading2 { configuration in + configuration.label .markdownMargin(top: .rem(1.5), bottom: .rem(1)) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(1.5)) } } - .heading3 { label in - label + .heading3 { configuration in + configuration.label .markdownMargin(top: .rem(1.5), bottom: .rem(1)) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(1.17)) } } - .heading4 { label in - label + .heading4 { configuration in + configuration.label .markdownMargin(top: .rem(1.5), bottom: .rem(1)) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(1)) } } - .heading5 { label in - label + .heading5 { configuration in + configuration.label .markdownMargin(top: .rem(1.5), bottom: .rem(1)) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(0.83)) } } - .heading6 { label in - label + .heading6 { configuration in + configuration.label .markdownMargin(top: .rem(1.5), bottom: .rem(1)) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(0.67)) } } - .paragraph { label in - label + .paragraph { configuration in + configuration.label .relativeLineSpacing(.em(0.15)) .markdownMargin(top: .zero, bottom: .em(1)) } - .blockquote { label in - label + .blockquote { configuration in + configuration.label .markdownTextStyle { FontStyle(.italic) } @@ -92,8 +92,9 @@ extension Theme { } .markdownMargin(top: .zero, bottom: .em(1)) } - .table { label in - label.markdownMargin(top: .zero, bottom: .em(1)) + .table { configuration in + configuration.label + .markdownMargin(top: .zero, bottom: .em(1)) } .tableCell { configuration in configuration.label diff --git a/Sources/MarkdownUI/Theme/Theme+DocC.swift b/Sources/MarkdownUI/Theme/Theme+DocC.swift index ccee0060..5d7f61c4 100644 --- a/Sources/MarkdownUI/Theme/Theme+DocC.swift +++ b/Sources/MarkdownUI/Theme/Theme+DocC.swift @@ -21,16 +21,16 @@ extension Theme { .link { ForegroundColor(.link) } - .heading1 { label in - label + .heading1 { configuration in + configuration.label .markdownMargin(top: .em(0.8), bottom: .zero) .markdownTextStyle { FontWeight(.semibold) FontSize(.em(2)) } } - .heading2 { label in - label + .heading2 { configuration in + configuration.label .relativeLineSpacing(.em(0.0625)) .markdownMargin(top: .em(1.6), bottom: .zero) .markdownTextStyle { @@ -38,8 +38,8 @@ extension Theme { FontSize(.em(1.88235)) } } - .heading3 { label in - label + .heading3 { configuration in + configuration.label .relativeLineSpacing(.em(0.07143)) .markdownMargin(top: .em(1.6), bottom: .zero) .markdownTextStyle { @@ -47,8 +47,8 @@ extension Theme { FontSize(.em(1.64706)) } } - .heading4 { label in - label + .heading4 { configuration in + configuration.label .relativeLineSpacing(.em(0.083335)) .markdownMargin(top: .em(1.6), bottom: .zero) .markdownTextStyle { @@ -56,8 +56,8 @@ extension Theme { FontSize(.em(1.41176)) } } - .heading5 { label in - label + .heading5 { configuration in + configuration.label .relativeLineSpacing(.em(0.09091)) .markdownMargin(top: .em(1.6), bottom: .zero) .markdownTextStyle { @@ -65,21 +65,21 @@ extension Theme { FontSize(.em(1.29412)) } } - .heading6 { label in - label + .heading6 { configuration in + configuration.label .relativeLineSpacing(.em(0.235295)) .markdownMargin(top: .em(1.6), bottom: .zero) .markdownTextStyle { FontWeight(.semibold) } } - .paragraph { label in - label + .paragraph { configuration in + configuration.label .relativeLineSpacing(.em(0.235295)) .markdownMargin(top: .em(0.8), bottom: .zero) } - .blockquote { label in - label + .blockquote { configuration in + configuration.label .relativePadding(length: .rem(0.94118)) .frame(maxWidth: .infinity, alignment: .leading) .background { @@ -107,21 +107,22 @@ extension Theme { .clipShape(.container) .markdownMargin(top: .em(0.8), bottom: .zero) } - .image { label in - label + .image { configuration in + configuration.label .frame(maxWidth: .infinity) .markdownMargin(top: .em(1.6), bottom: .em(1.6)) } - .listItem { label in - label.markdownMargin(top: .em(0.8)) + .listItem { configuration in + configuration.label + .markdownMargin(top: .em(0.8)) } .taskListMarker { _ in // DocC renders task lists as bullet lists ListBullet.disc .relativeFrame(minWidth: .em(1.5), alignment: .trailing) } - .table { label in - label + .table { configuration in + configuration.label .markdownTableBorderStyle(.init(.horizontalBorders, color: .grid)) .markdownMargin(top: .em(1.6), bottom: .zero) } diff --git a/Sources/MarkdownUI/Theme/Theme+GitHub.swift b/Sources/MarkdownUI/Theme/Theme+GitHub.swift index 1a073f9c..9be9b978 100644 --- a/Sources/MarkdownUI/Theme/Theme+GitHub.swift +++ b/Sources/MarkdownUI/Theme/Theme+GitHub.swift @@ -31,9 +31,9 @@ extension Theme { .link { ForegroundColor(.link) } - .heading1 { label in + .heading1 { configuration in VStack(alignment: .leading, spacing: 0) { - label + configuration.label .relativePadding(.bottom, length: .em(0.3)) .relativeLineSpacing(.em(0.125)) .markdownMargin(top: 24, bottom: 16) @@ -44,9 +44,9 @@ extension Theme { Divider().overlay(Color.divider) } } - .heading2 { label in + .heading2 { configuration in VStack(alignment: .leading, spacing: 0) { - label + configuration.label .relativePadding(.bottom, length: .em(0.3)) .relativeLineSpacing(.em(0.125)) .markdownMargin(top: 24, bottom: 16) @@ -57,8 +57,8 @@ extension Theme { Divider().overlay(Color.divider) } } - .heading3 { label in - label + .heading3 { configuration in + configuration.label .relativeLineSpacing(.em(0.125)) .markdownMargin(top: 24, bottom: 16) .markdownTextStyle { @@ -66,16 +66,16 @@ extension Theme { FontSize(.em(1.25)) } } - .heading4 { label in - label + .heading4 { configuration in + configuration.label .relativeLineSpacing(.em(0.125)) .markdownMargin(top: 24, bottom: 16) .markdownTextStyle { FontWeight(.semibold) } } - .heading5 { label in - label + .heading5 { configuration in + configuration.label .relativeLineSpacing(.em(0.125)) .markdownMargin(top: 24, bottom: 16) .markdownTextStyle { @@ -83,8 +83,8 @@ extension Theme { FontSize(.em(0.875)) } } - .heading6 { label in - label + .heading6 { configuration in + configuration.label .relativeLineSpacing(.em(0.125)) .markdownMargin(top: 24, bottom: 16) .markdownTextStyle { @@ -93,17 +93,17 @@ extension Theme { ForegroundColor(.tertiaryText) } } - .paragraph { label in - label + .paragraph { configuration in + configuration.label .relativeLineSpacing(.em(0.25)) .markdownMargin(top: 0, bottom: 16) } - .blockquote { label in + .blockquote { configuration in HStack(spacing: 0) { RoundedRectangle(cornerRadius: 6) .fill(Color.border) .relativeFrame(width: .em(0.2)) - label + configuration.label .markdownTextStyle { ForegroundColor(.secondaryText) } .relativePadding(.horizontal, length: .em(1)) } @@ -123,8 +123,9 @@ extension Theme { .clipShape(RoundedRectangle(cornerRadius: 6)) .markdownMargin(top: 0, bottom: 16) } - .listItem { label in - label.markdownMargin(top: .em(0.25)) + .listItem { configuration in + configuration.label + .markdownMargin(top: .em(0.25)) } .taskListMarker { configuration in Image(systemName: configuration.isCompleted ? "checkmark.square.fill" : "square") @@ -133,8 +134,8 @@ extension Theme { .imageScale(.small) .relativeFrame(minWidth: .em(1.5), alignment: .trailing) } - .table { label in - label + .table { configuration in + configuration.label .markdownTableBorderStyle(.init(color: .border)) .markdownTableBackgroundStyle( .alternatingRows(Color.background, Color.secondaryBackground) diff --git a/Sources/MarkdownUI/Theme/Theme.swift b/Sources/MarkdownUI/Theme/Theme.swift index d00f927d..07c41a38 100644 --- a/Sources/MarkdownUI/Theme/Theme.swift +++ b/Sources/MarkdownUI/Theme/Theme.swift @@ -171,10 +171,10 @@ public struct Theme { public var image = BlockStyle { $0.label } /// The list style. - public var list = BlockStyle { $0.label } + public var list = BlockStyle { $0.label } /// The list item style. - public var listItem = BlockStyle { $0.label } + public var listItem = BlockStyle { $0.label } /// The task list marker style. public var taskListMarker = BlockStyle.checkmarkSquare @@ -186,7 +186,7 @@ public struct Theme { public var numberedListMarker = BlockStyle.decimal /// The table style. - public var table = BlockStyle { $0.label } + public var table = BlockStyle { $0.label } /// The table cell style. public var tableCell = BlockStyle { $0.label } diff --git a/Tests/MarkdownUITests/MarkdownTableTests.swift b/Tests/MarkdownUITests/MarkdownTableTests.swift index 80a08357..67dc616b 100644 --- a/Tests/MarkdownUITests/MarkdownTableTests.swift +++ b/Tests/MarkdownUITests/MarkdownTableTests.swift @@ -142,8 +142,8 @@ } .padding() .border(Color.accentColor) - .markdownBlockStyle(\.table) { label in - label + .markdownBlockStyle(\.table) { configuration in + configuration.label .markdownMargin(top: .zero, bottom: .em(1)) .markdownTableBackgroundStyle( .alternatingRows(Color.clear, Color(.secondarySystemBackground), header: .mint) @@ -172,8 +172,8 @@ } .padding() .border(Color.accentColor) - .markdownBlockStyle(\.table) { label in - label + .markdownBlockStyle(\.table) { configuration in + configuration.label .markdownMargin(top: .zero, bottom: .em(1)) .markdownTableBorderStyle( .init( diff --git a/Tests/MarkdownUITests/MarkdownTests.swift b/Tests/MarkdownUITests/MarkdownTests.swift index 9d982cd6..e2e7fd9c 100644 --- a/Tests/MarkdownUITests/MarkdownTests.swift +++ b/Tests/MarkdownUITests/MarkdownTests.swift @@ -166,8 +166,9 @@ } .border(Color.accentColor) .padding() - .markdownBlockStyle(\.paragraph) { label in - label.markdownMargin(bottom: .zero) + .markdownBlockStyle(\.paragraph) { configuration in + configuration.label + .markdownMargin(bottom: .zero) } assertSnapshot(matching: view, as: .image(layout: layout)) From 2ad2723e653eeb830bc34590939386888f43d04b Mon Sep 17 00:00:00 2001 From: Guille Gonzalez Date: Sun, 9 Apr 2023 17:17:46 +0200 Subject: [PATCH 6/6] Update documentation --- README.md | 9 +++++---- .../Documentation.docc/Articles/GettingStarted.md | 9 +++++---- Sources/MarkdownUI/Theme/Theme.swift | 9 +++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d9cc368f..5e1da356 100644 --- a/README.md +++ b/README.md @@ -226,13 +226,14 @@ extension Theme { ForegroundColor(.purple) } // More text styles... - .paragraph { label in - label + .paragraph { configuration in + configuration.label .relativeLineSpacing(.em(0.25)) .markdownMargin(top: 0, bottom: 16) } - .listItem { label in - label.markdownMargin(top: .em(0.25)) + .listItem { configuration in + configuration.label + .markdownMargin(top: .em(0.25)) } // More block styles... } diff --git a/Sources/MarkdownUI/Documentation.docc/Articles/GettingStarted.md b/Sources/MarkdownUI/Documentation.docc/Articles/GettingStarted.md index 35657e69..d50a5858 100644 --- a/Sources/MarkdownUI/Documentation.docc/Articles/GettingStarted.md +++ b/Sources/MarkdownUI/Documentation.docc/Articles/GettingStarted.md @@ -183,13 +183,14 @@ extension Theme { ForegroundColor(.purple) } // More text styles... - .paragraph { label in - label + .paragraph { configuration in + configuration.label .relativeLineSpacing(.em(0.25)) .markdownMargin(top: 0, bottom: 16) } - .listItem { label in - label.markdownMargin(top: .em(0.25)) + .listItem { configuration in + configuration.label + .markdownMargin(top: .em(0.25)) } // More block styles... } diff --git a/Sources/MarkdownUI/Theme/Theme.swift b/Sources/MarkdownUI/Theme/Theme.swift index 07c41a38..b5796066 100644 --- a/Sources/MarkdownUI/Theme/Theme.swift +++ b/Sources/MarkdownUI/Theme/Theme.swift @@ -88,13 +88,14 @@ import SwiftUI /// ForegroundColor(.purple) /// } /// // More text styles... -/// .paragraph { label in -/// label +/// .paragraph { configuration in +/// configuration.label /// .relativeLineSpacing(.em(0.25)) /// .markdownMargin(top: 0, bottom: 16) /// } -/// .listItem { label in -/// label.markdownMargin(top: .em(0.25)) +/// .listItem { configuration in +/// configuration.label +/// .markdownMargin(top: .em(0.25)) /// } /// // More block styles... /// ```