diff --git a/Knew Karma/KnewKarma/Handlers/ApiHandler.vb b/Knew Karma/KnewKarma/Handlers/ApiHandler.vb index 7d31590..1996b6a 100644 --- a/Knew Karma/KnewKarma/Handlers/ApiHandler.vb +++ b/Knew Karma/KnewKarma/Handlers/ApiHandler.vb @@ -68,7 +68,7 @@ Public Class ApiHandler ''' - ''' Asynchronously retrieves posts from a specified source. + ''' Asynchronously retrieves posts from a specified source with pagination. ''' ''' The criterion by which the posts should be sorted. ''' The limit on the number of posts to retrieve. @@ -81,28 +81,49 @@ Public Class ApiHandler ByVal postsType As String, Optional ByVal postsSource As String = Nothing ) As Task(Of JArray) - Dim postsTypeMap As New List(Of Tuple(Of String, String)) From { - Tuple.Create("user_posts", $"{BASE_ENDPOINT}/user/{postsSource}/submitted.json?sort={sortCriterion}&limit={postsLimit}"), - Tuple.Create("user_comments", $"{BASE_ENDPOINT}/user/{postsSource}/comments.json?sort={sortCriterion}&limit={postsLimit}"), - Tuple.Create("subreddit_posts", $"{BASE_ENDPOINT}/r/{postsSource}.json?sort={sortCriterion}&limit={postsLimit}"), - Tuple.Create("search_posts", $"{BASE_ENDPOINT}/search.json?q={postsSource}&sort={sortCriterion}&limit={postsLimit}"), - Tuple.Create("listing_posts", $"{BASE_ENDPOINT}/r/{postsSource}.json?sort={sortCriterion}&limit={postsLimit}"), - Tuple.Create("front_page_posts", $"{BASE_ENDPOINT}/.json?sort={sortCriterion}&limit={postsLimit}") + Dim postsTypeMap As New Dictionary(Of String, String) From { + {"user_posts", $"{BASE_ENDPOINT}/user/{postsSource}/submitted.json?sort={sortCriterion}&limit={postsLimit}"}, + {"user_comments", $"{BASE_ENDPOINT}/user/{postsSource}/comments.json?sort={sortCriterion}&limit={postsLimit}"}, + {"subreddit_posts", $"{BASE_ENDPOINT}/r/{postsSource}.json?sort={sortCriterion}&limit={postsLimit}"}, + {"search_posts", $"{BASE_ENDPOINT}/search.json?q={postsSource}&sort={sortCriterion}&limit={postsLimit}"}, + {"listing_posts", $"{BASE_ENDPOINT}/r/{postsSource}.json?sort={sortCriterion}&limit={postsLimit}"}, + {"front_page_posts", $"{BASE_ENDPOINT}/.json?sort={sortCriterion}&limit={postsLimit}"} } - Dim postsEndpoint As String = Nothing + If Not postsTypeMap.ContainsKey(postsType) Then + Throw New ArgumentException($"Invalid post type: {postsType}") + End If - For Each Type In postsTypeMap - If Type.Item1 = postsType Then - postsEndpoint = Type.Item2 - Exit For + Dim postsEndpoint As String = postsTypeMap(postsType) + Return Await PaginatedPosts(postsEndpoint, postsLimit) + End Function + + ''' + ''' Retrieves posts in a paginated manner until the specified limit is reached. + ''' + ''' The API endpoint for retrieving posts. + ''' The limit on the number of posts to retrieve. + ''' A Task(Of JArray) representing the asynchronous operation, which upon completion returns a JArray of posts. + Private Async Function PaginatedPosts(endpoint As String, limit As Integer) As Task(Of JArray) + Dim allPosts As New JArray() + Dim lastPostId As String = "" + Dim useAfter As Boolean = limit > 100 + + While allPosts.Count < limit + Dim endpointWithAfter As String = If(useAfter And Not String.IsNullOrEmpty(lastPostId), $"{endpoint}&after={lastPostId}", endpoint) + Dim postsData As JObject = Await AsyncGetData(endpoint:=endpointWithAfter) + Dim postsChildren As JArray = postsData("data")("children") + + If postsChildren.Count = 0 Then + Exit While End If - Next - Dim posts As JObject = Await AsyncGetData(endpoint:=postsEndpoint) + allPosts.Merge(postsChildren) - Return If(posts IsNot Nothing AndAlso posts?("data") IsNot Nothing, posts?("data")?("children"), New JArray()) + lastPostId = postsChildren.Last("data")("id").ToString() + End While + Return allPosts End Function diff --git a/Knew Karma/KnewKarma/KnewKarma.vbproj b/Knew Karma/KnewKarma/KnewKarma.vbproj index 3f31e55..5606f2b 100644 --- a/Knew Karma/KnewKarma/KnewKarma.vbproj +++ b/Knew Karma/KnewKarma/KnewKarma.vbproj @@ -12,11 +12,11 @@ https://github.com/bellingcat/knewkarma/wiki README.md https://github.com/bellingcat/knewkarma - 2.4.0.0 - 2.3.0.0 + 3.0.0.0 + 3.0.0.0 LICENSE True - 2.4.0 + 3.0.0 reddit;scraper;reddit-scraper;osint;reddit-data 6.0-recommended @@ -25,7 +25,7 @@ en Knew Karma Knew Karma - Reddit Data Analysis Toolkit. + A Reddit Data Analysis Toolkit. icon.png Resources\icon.ico diff --git a/Knew Karma/KnewKarma/Windows/MainWindow.Designer.vb b/Knew Karma/KnewKarma/Windows/MainWindow.Designer.vb index 0e32521..dc7a345 100644 --- a/Knew Karma/KnewKarma/Windows/MainWindow.Designer.vb +++ b/Knew Karma/KnewKarma/Windows/MainWindow.Designer.vb @@ -24,13 +24,13 @@ Partial Class MainWindow Private Sub InitializeComponent() components = New ComponentModel.Container() Dim resources As ComponentModel.ComponentResourceManager = New ComponentModel.ComponentResourceManager(GetType(MainWindow)) - Dim TreeNode8 As TreeNode = New TreeNode("Subreddit") - Dim TreeNode9 As TreeNode = New TreeNode("User") - Dim TreeNode10 As TreeNode = New TreeNode("Front Page") - Dim TreeNode11 As TreeNode = New TreeNode("Listings") - Dim TreeNode12 As TreeNode = New TreeNode("Search") - Dim TreeNode13 As TreeNode = New TreeNode("Posts", New TreeNode() {TreeNode10, TreeNode11, TreeNode12}) - Dim TreeNode14 As TreeNode = New TreeNode("Username", New TreeNode() {TreeNode8, TreeNode9, TreeNode13}) + Dim TreeNode1 As TreeNode = New TreeNode("Subreddit") + Dim TreeNode2 As TreeNode = New TreeNode("User") + Dim TreeNode3 As TreeNode = New TreeNode("Front Page") + Dim TreeNode4 As TreeNode = New TreeNode("Listings") + Dim TreeNode5 As TreeNode = New TreeNode("Search") + Dim TreeNode6 As TreeNode = New TreeNode("Posts", New TreeNode() {TreeNode3, TreeNode4, TreeNode5}) + Dim TreeNode7 As TreeNode = New TreeNode("Username", New TreeNode() {TreeNode1, TreeNode2, TreeNode6}) TextBoxQuery = New TextBox() ButtonSearch = New Button() ContextMenuStripRightClick = New ContextMenuStrip(components) @@ -494,12 +494,13 @@ Partial Class MainWindow ' NumericUpDownSearchResultLimit.Font = New Font("Segoe UI Variable Display Semib", 8.25F, FontStyle.Bold, GraphicsUnit.Point) NumericUpDownSearchResultLimit.Location = New Point(130, 41) + NumericUpDownSearchResultLimit.Maximum = New Decimal(New Integer() {10000, 0, 0, 0}) NumericUpDownSearchResultLimit.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) NumericUpDownSearchResultLimit.Name = "NumericUpDownSearchResultLimit" NumericUpDownSearchResultLimit.ReadOnly = True NumericUpDownSearchResultLimit.Size = New Size(79, 22) NumericUpDownSearchResultLimit.TabIndex = 17 - NumericUpDownSearchResultLimit.Value = New Decimal(New Integer() {10, 0, 0, 0}) + NumericUpDownSearchResultLimit.Value = New Decimal(New Integer() {100, 0, 0, 0}) ' ' GroupBoxFrontPageDataFiltering ' @@ -539,12 +540,13 @@ Partial Class MainWindow ' NumericUpDownFrontPageDataLimit.Font = New Font("Segoe UI Variable Text Semibold", 8.25F, FontStyle.Bold, GraphicsUnit.Point) NumericUpDownFrontPageDataLimit.Location = New Point(130, 41) + NumericUpDownFrontPageDataLimit.Maximum = New Decimal(New Integer() {10000, 0, 0, 0}) NumericUpDownFrontPageDataLimit.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) NumericUpDownFrontPageDataLimit.Name = "NumericUpDownFrontPageDataLimit" NumericUpDownFrontPageDataLimit.ReadOnly = True NumericUpDownFrontPageDataLimit.Size = New Size(79, 22) NumericUpDownFrontPageDataLimit.TabIndex = 17 - NumericUpDownFrontPageDataLimit.Value = New Decimal(New Integer() {10, 0, 0, 0}) + NumericUpDownFrontPageDataLimit.Value = New Decimal(New Integer() {100, 0, 0, 0}) ' ' ButtonFetchFrontPageData ' @@ -597,12 +599,13 @@ Partial Class MainWindow NumericUpDownSubredditPostsLimit.Enabled = False NumericUpDownSubredditPostsLimit.Font = New Font("Segoe UI Variable Display Semib", 8.25F, FontStyle.Bold, GraphicsUnit.Point) NumericUpDownSubredditPostsLimit.Location = New Point(130, 41) + NumericUpDownSubredditPostsLimit.Maximum = New Decimal(New Integer() {10000, 0, 0, 0}) NumericUpDownSubredditPostsLimit.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) NumericUpDownSubredditPostsLimit.Name = "NumericUpDownSubredditPostsLimit" NumericUpDownSubredditPostsLimit.ReadOnly = True NumericUpDownSubredditPostsLimit.Size = New Size(79, 22) NumericUpDownSubredditPostsLimit.TabIndex = 17 - NumericUpDownSubredditPostsLimit.Value = New Decimal(New Integer() {10, 0, 0, 0}) + NumericUpDownSubredditPostsLimit.Value = New Decimal(New Integer() {100, 0, 0, 0}) ' ' ButtonFetchSubredditData ' @@ -671,12 +674,13 @@ Partial Class MainWindow NumericUpDownUserDataLimit.Enabled = False NumericUpDownUserDataLimit.Font = New Font("Segoe UI Variable Display Semib", 8.25F, FontStyle.Bold, GraphicsUnit.Point) NumericUpDownUserDataLimit.Location = New Point(130, 41) + NumericUpDownUserDataLimit.Maximum = New Decimal(New Integer() {10000, 0, 0, 0}) NumericUpDownUserDataLimit.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) NumericUpDownUserDataLimit.Name = "NumericUpDownUserDataLimit" NumericUpDownUserDataLimit.ReadOnly = True NumericUpDownUserDataLimit.Size = New Size(79, 22) NumericUpDownUserDataLimit.TabIndex = 17 - NumericUpDownUserDataLimit.Value = New Decimal(New Integer() {10, 0, 0, 0}) + NumericUpDownUserDataLimit.Value = New Decimal(New Integer() {100, 0, 0, 0}) ' ' ButtonFetchUserData ' @@ -711,21 +715,21 @@ Partial Class MainWindow TreeView1.HotTracking = True TreeView1.Location = New Point(12, 12) TreeView1.Name = "TreeView1" - TreeNode8.Name = "childSubreddit" - TreeNode8.Text = "Subreddit" - TreeNode9.Name = "childUser" - TreeNode9.Text = "User" - TreeNode10.Name = "subchildFrontPage" - TreeNode10.Text = "Front Page" - TreeNode11.Name = "subchildListings" - TreeNode11.Text = "Listings" - TreeNode12.Name = "subchildSearch" - TreeNode12.Text = "Search" - TreeNode13.Name = "childPosts" - TreeNode13.Text = "Posts" - TreeNode14.Name = "MainRoot" - TreeNode14.Text = "Username" - TreeView1.Nodes.AddRange(New TreeNode() {TreeNode14}) + TreeNode1.Name = "childSubreddit" + TreeNode1.Text = "Subreddit" + TreeNode2.Name = "childUser" + TreeNode2.Text = "User" + TreeNode3.Name = "subchildFrontPage" + TreeNode3.Text = "Front Page" + TreeNode4.Name = "subchildListings" + TreeNode4.Text = "Listings" + TreeNode5.Name = "subchildSearch" + TreeNode5.Text = "Search" + TreeNode6.Name = "childPosts" + TreeNode6.Text = "Posts" + TreeNode7.Name = "MainRoot" + TreeNode7.Text = "Username" + TreeView1.Nodes.AddRange(New TreeNode() {TreeNode7}) TreeView1.ShowNodeToolTips = True TreeView1.Size = New Size(129, 186) TreeView1.TabIndex = 17 @@ -922,12 +926,13 @@ Partial Class MainWindow ' NumericUpDownPostListingsLimit.Font = New Font("Segoe UI Variable Display Semib", 8.25F, FontStyle.Bold, GraphicsUnit.Point) NumericUpDownPostListingsLimit.Location = New Point(130, 41) + NumericUpDownPostListingsLimit.Maximum = New Decimal(New Integer() {10000, 0, 0, 0}) NumericUpDownPostListingsLimit.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) NumericUpDownPostListingsLimit.Name = "NumericUpDownPostListingsLimit" NumericUpDownPostListingsLimit.ReadOnly = True NumericUpDownPostListingsLimit.Size = New Size(79, 22) NumericUpDownPostListingsLimit.TabIndex = 17 - NumericUpDownPostListingsLimit.Value = New Decimal(New Integer() {10, 0, 0, 0}) + NumericUpDownPostListingsLimit.Value = New Decimal(New Integer() {100, 0, 0, 0}) ' ' GroupBoxPostListings ' @@ -991,7 +996,7 @@ Partial Class MainWindow NotifyIcon1.Text = "Knew Karma" NotifyIcon1.Visible = True ' - ' Main + ' MainWindow ' AccessibleRole = AccessibleRole.Window AutoScaleDimensions = New SizeF(7F, 16F) @@ -1012,7 +1017,7 @@ Partial Class MainWindow Icon = CType(resources.GetObject("$this.Icon"), Icon) MaximizeBox = False MinimizeBox = False - Name = "Main" + Name = "MainWindow" StartPosition = FormStartPosition.CenterScreen ContextMenuStripRightClick.ResumeLayout(False) GroupBoxSearchResultsFiltering.ResumeLayout(False) diff --git a/Knew Karma/KnewKarma/Windows/MainWindow.resx b/Knew Karma/KnewKarma/Windows/MainWindow.resx index 7019336..a4c6ef9 100644 --- a/Knew Karma/KnewKarma/Windows/MainWindow.resx +++ b/Knew Karma/KnewKarma/Windows/MainWindow.resx @@ -404,825 +404,7 @@ REREREREREREREREZO8cjv8fYD2KizSgt1EAAAAASUVORK5CYII= - - - iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAEj9SURBVHhe7d0H - dFVlvvD/2HWUIjUEBRJCCoFACKRASEInQqgeQklCghqFEdBRetCjELDM6DAWxjvOe+fOfWfm/6IwKgJi - Q0dsELoBFKSl0pMAVsj+P3uf5yQnEFo4ZZfvd63fCneuC1ju7f59znNS/IjIvSl+ftcVDu4XWTio3/TC - wX1eLxrU57NDg/oePDSw74lDA/udE6McGuAy/fvXTD/HHOw7oGb6OGegcjBZTlLNHEgcVDO9nTNYOZAg - p5dzUpQDPVOU/c6JV+ceZX9c7dkXN0TZF+s6Q5XvnROjTqo2e53TY1j17NFmuGO6D1e+q54R1fNttDoj - a83u6FHK7m6jft3dbfQJ8XH/7qjR63Z1G/Xn3dGjJ38bPTpM/qslIiLSX4X39IkVC//lwpQ+R8RHpXBw - X8cM6qsIACgCAGLEwgcAFwOAy4xWdjknarQiQHBoZ7fRz+2KtnWW/7qJiIh8l/pqvzilb6pY/l+Jxa9U - DwBwKwB2Rd2rzU4xBVG29bu6jUmVl4CIiMi7FackRhUOSf5CLH9Fm1oAkMsfALgdAI6xKQVdbR8LDHSU - l4OIiMiz5UdH3yQW//NizopxLP8LAKAOAPAkAHZ21RDwk0DAbMXPfr28PERERO6vJLV/m6KhSV8XqYvf - OZwA+BIA2ohfr/02elwzeZmIiIjcV8mQxPCiocmHxCgAQF8AcMyYvTs6pbWXl4uIiOjaKxrap4t45X9c - W/5XBAB1AICXAaAUdBlTtL3z6CB52YiIiOrfwSEJQUWpSSUCAI7lzwmAngGgfNN1zN6CCJu/vHxERERX - X9nAgbeL5b9TjFj8AMAQABCzo8uYL/Ojc26Sl5GIiOjqKkpN/pu2/AGAoQDgmLQ/yMtIRER05RWn9hle - vfyvGgDqAAAfA6Bqe5QtSV5OIiKiy1doi7+tcFjSvvoDgBMAHQBAnW/3BKfcIi8rERHRpSscnji7aJjL - 8gcARgWA+N/SHpaXlYiI6OLtT06+tWhYYgkAMAcAxK8LOQUgIqLLVjQiKUcAQAEAZgFAmrK9c1q2vLxE - RER1VzQ88XMAYC4A7IhM+1ReXiIiogs7ODohSACg6toBoA4A0BEAqrZF2gLlZSYiIqpd0bDeDwkAiOUP - AEwGAHUmy8tMRERUO7H4/x8AMCsAxi6Xl5mIiKh2hcMT9wEA0wKgSF5mIiKimvakpNwilv9Z9wBALn8A - oCcAKNs7j79TXm4iIiJHJSMTw7XlDwBMC4CCLuNj5OUmIiJyVDQyKR4AmP4E4B55uYmIiByVjEgcCADM - DoC0CfJyExEROSoenpQKAMwOgLE58nITERE5AgAAgIiILBgAAABERGTBAAAAICIiCwYAAAAREVkwAAAA - iIjIggEAAEBERBYMAAAAIiKyYAAAABARkQUDAACAiIgsGAAAAEREZMEAAAAgIiILBgAAABERWTAAAACI - iMiCAQAAQEREFgwAAAAiIrJgAAAAEBEZrqMzQxscnR4ZenRa5+ijU6OS1I/HHu4cdvKRro3lP0KXyb0A - UAcAAADjtq7dI40/bTsl/LP2k6P/025ykvpxfeDk0HURU+6Q/wgReTvFZrvhyPTOicendnni2LTOa8WU - HJ0aqWjzcJea+a1zuh45OrnruqNTujx9bHJUfyUn+ib5W5FLnAAAAKtWEGG7eX3ggwM+D5y84PP2kz9Z - HzjlyGeBU5Sa+a02/2nnnIdLxKz9T+DD89cFTUlQ/OzXy9+KiDzR0d91CTk6vfOLx6Z3Ljk2PVI5Nq1m - LgMA5eiUmjkyueuxo5OjXj38YFQX+VuTCAAAAKv1ebspXdcHTfmzeGV/bH3QZKV6ai3/OgFQPZ+q03Zq - 8Sdtp73w6V3TOsjfmojc0YnpnSKPPRK5/Ngjnc+J5a84pv4AODpZRUCUcuShqCrxcU3Z5G5x8o+ydLwF - AACs0hftp/T8POjBtZ8HPaR87rr46w8A55z7pO3UN9bdPa2T/KOIqD6p798fezTipWOPdv5VLH9FG/cC - wDlVYv52+P7YlvKPtmScAAAAs7eh3RT/z9s/9HcxVWLE8nc7ABQBADHTfv2k3fQlHwTlNJJ/NBFdaWLx - xxx/tNP3xx7tpAgAOJa/5wCgHHlQnW5Hj+ZED5F/BcsFAACAmfsq8MEBX7R/sFRb/M7xHAAcc/e0g+va - TE+QfwUiulzHH+s0/fjvOv3qWP5eBYA6VUceiF6g+PldJ/86lom3AACAGVP/WxbLPk8s/yoxNcvfGwBo - o82vYqbKvw4R1ZX6H6pY/HYxijo+AoByJEfMA9H/Y7WvFuAEAACYrWV+thu+DH7wv9TF7xwfAEBZ12a6 - +Dh9iRVfWBBdNvU/jGOPdVzqXP4+B4BjllsJAZwAAAAzlR+dc9OX7XOWfxFcs/x9CQA5S0EAkUvqfxAn - Hot4+fhjEdXLXxcAeECd6Hf3TA2+Rf5VTR0nAADALGmv/Dvk/OvL4BxFZwAQM+0vdr5vANF5y1+fALAM - AgAAADBD6vL/qv0D/1SXvy4BcDcIIKpZ/o/L5a9fAChlFkAAbwEAAKN3/vLXLQDEfNTmERBA1qzW8jcA - AA7fb34EcAIAAIyc49j//n+4Ln89A+Djux8BAWS9tOU/I7xm+RsEAGZHAAAAAEatevl3eKDW8tc7AEAA - Warq5T+jY83yNxAANATcZ04E8BYAADBi6vL/usMD//crdfkbEAAggCxRreVvYAAcvk9FQHfTIYATAABg - tFyXv5EBoCHgrt+BADJnFyx/gwPg8H3dTYcAAAAAjJT2CX8h9/+vc/kbHQAf3/UoCCDzVb38Z7osfxMA - QEPAJPMggLcAAIBRqln+91cvf3MAAASQiXIu/xPq8jchAA5PMg8COAEAAEao9vI3IwBAAJkgbfnPUpd/ - uGJmAGgIyDI+AgAAANB72nv+IQ/8/esQ5/I3KwBAABk4bfnPDF8qACCWv/kBcDhbnR6G/NkBJSMTw4tH - Jj1RNDxpt/sAoA4A0BsAxBwQs6igy9goefkNk+OV/33/qy5/iwBA+ejux/jZAWSstOU/R7zyV5e/tQBg - mJOA0hHJ7UpGJE4vHt57ffGI3krxCLn4OQEwOwCqZ3vkuP3bIscv2dplnO5/Xr3jlf/9//N1yH3a8rcM - AMR8GMBJABmk6uU/Wy5/iwFAzwgoGdWzbclosfRHiaU/Uix9dbTlDwAsCgBle2fnjN2nVwwoYvnVLH8L - AqA1CCADpC3/2eFLteVvaQD0UEqz9PF2wPEJsQ1LRvd+oGR0wlfFoxIUsfwd43EAqAMAjAMAdcYr2xyz - bVun8dMKImxN5G3ks9Tlv7HW8rcoAMR80Pox3g4gfeZ45R/meOUPAOT47iSgxJYQLZb+a8WjE06JUbTx - KgA4ATAwABQBADHpP4lZti1iXOoym+0GeWt5LXX5bwjJ/tuGWsvfugD4sPVjyocBj3ESQPqqevnPCatZ - /gDAMRNjvIaAQlt8E7H4c0ptvbaV3NtLKblXLn4AAADqBYAJytaaKdoakf7MtsiMQHm7eTT1mfJ1aPaf - N4ROUgCACwBAAOkpbfnPDV+qLX8AUBcAlNLMWI++HVA6plefkjG9VpTYev0iRtEGAAAA9wJATLoiEHBO - zJotndKHqK/Q5S3o1rRX/qGT/o+2/AHABQD4wDG8HUC+zbH85St/AHBRAGiT6d6TgAJbxM2lafG2Elv8 - VyVjeioCAI7FrxsAqAMATAgAZUvN7BUQmL4tMuN2eVtec+ozZWPopKXVyx8AXAwAyocBMzgJIN+k/od6 - Ul3+c12WPwC4FADcgoBSW+/mxWN7zhJLv7AkTV38ztEbADgBsAAAxGSoU7G5Y8aS/IjMNvI2rVd1Ln8A - cFEAfBDwOAgg7+dc/mIUAHBVAJAISLlqBBSlxYSUjI1bUjI2/oy2+J0DAACA7wGgCACoc25LeObKLZ3S - e8rb9opTnykbQrNfFQCovfwBwCUBAALIq6n/oZbPC116cl6oAgDqBQClNOPKPyegdHx8TOm4uFWl4+Kr - SsfGKwIANctf1wBQBwBYDABiMp3zaX5oZh95G18yx3v+2X/ZGJqtAICrB4A677eawecEkGerfuWvLn8A - UG8AlGXEio+xlzwJOJwe06V0fNwybfGPi1e0MRQAOAGwOACUTeHqx4nrN4Vlpcrb+oLUZ0p+6KRXNoap - yx8A1BsA2nASQB5KW/65LssfAFwbAC6CgMPjYiO1xT8+rkqMY/EDAABgUABsCp+oTV0QqLX8AYA7AAAC - yP1VL/9cl+UPAK4dAOqkOxBwOFMs/nSx+CfIxe8cwwJAHQAAABwAcE5+xywNAo7ln1Wz/AGAuwCgvh0A - Asg9qf+hau/5q8sfAHgCAEppeuw+sfyrxPJXtDEFADgBAAB1ACA8S8kP0+Z79SMA8AgA+JwAuva0V/5P - hIhX/iGO5Q8APAUAMXL5mwYA6gAAAHBRAGgDADwGAOW9VjM5CaD6Vb3856vLHwAAgKsFACcAAAAA+BIA - a0EA1adayx8AAAAAAAAAgAEBMFMbEEBX3AXLHwAAgHoBQB0AAAAAgC9PAEAAXXGO5R/8sgBAzfIHAACg - XgDgBAAAAAC9AAAE0CXTlr9dXf4dFAAAAAAAAAAARgdAzfLXxh8EUB05l3/5k+ryBwAAwB0AUAcAAAAA - oJcTAA0A/rNAANWkKDXLHwAAAPcBgBMAAAAAdAkAEEBq5y9/AAAAAAAAAABmAYDL8j8fACDA2lUvf3vN - 8gcAAMB9AFAHAAAAAKDLEwDntJwNAqxWreUPAAAAJwAAAABYFQDKGhBgnbTl/5S6/IMdyx8AAAAAAAAA - gJUBAAKsUPXyf0pd/gAAADiXvzruBoA6AAAAAACDAAAEmLlayx8AAABOAAAAAAAAtQEgZi4IMFvVy/9p - ufwBAAAAAAAAAACACwAwBwSYKcfyD3IsfwAAAAAAAAAAFgGAy/K/CgCsVhHQHAQYPnX5VyxQl397x/IH - AADAawBQBwAAAABgtBMAFQCrW4AAQ+dc/hUL1OUPAACAtwHACQAAAABGBgAIMGiuyx8AAAAAAAAAgBUB - 4LL86wmA1S3mggAjpS3/vJrlDwAAgG8AoA4AAAAAwMgnACoA1FkFAvRf9fJfWLP8AQAA8A0AOAEAAADA - NAAAAfquZvkHKQAAAAAAAAAArA4Al+XvDgBoCJgHAvSWXP5LHcsfAAAAPQBAHQAAAACAaU4AHABQVjWb - t1Tx87tOrh/ydeULg54VAJDLHwAAAD0AgBMAAAAATAkAxyyW64d8mVj807XlDwAAAAAAAAAAAFQDwGX5 - ux8AyrvNc6fKNUS+qGJhYEzFoqBfAAAAAAAAAAAAAO8CYN6v77aY11OuI/JmJ+3tGlcsCjwoAOBY/gAA - AOgKAOoAAAAAAHwHAI++BaACQJ39H9w5q5FcS+StxPJ/SYwCAAAAJwAAAAAAAN8AIFfM/BflWiJvdCIv - MFIs/18BAAAAAAAAAAAA3wIg99d3msyPkOuJPF354qAVjuUPAAAAAAAAAAAA1AUAl+XvWQAo7zabv0yu - J/JklYuCQioWB54DAAAAAAAAAAAA9AGA3LMrm+d2kGuKPFXl4nYvCADI5Q8AAIBeAaAOAAAAAMB3APDa - WwAqANRTgOflmiJPpNj9rq9cHFQEAAAAAAAAAAAA6AsAucV8m2APduqZwMRKdfkDAACgewDI5Q8AAAAA - sAoAlJVN5sfLdUXu7tQz7Z4AAAAAAAAAAAAAdAmAprlz5Loid3dqUeD7AAAAAAAAAAAAgB4B8E6z3DVy - XZG7E8u/FAAAAAAAAAAAANAjAFY2yy2U64rc2RF7xB1i+VcBAAAAAAAAAAAAOgVA1dqWj98u1xa5q8pF - 7cLU5Q8AAAAAAAAAAABcHgAuy997AFD4fgAeqPzZoO4AAAAAAAAAAACAngHwdvP5UXJtkbuqfC6wNwAA - AAAAAAAAAKDvE4B5CXJtkbuqWBzUAwAAAAAAAAAAANA1AJrZu8m1Re7q1LNtwwEAAAAAAAAAAAA9A2BV - M3uIXFvkrk48E9QIAAAAAAAAAAAAuDIAnIcAb30OQLOZDeTaIncmlv8RAAAAAAAAAAAAQKcAKJHrityd - WP7rAAAAAAAAAAAAAH0CYN6Hcl2RuxMLfwEAAAAAAAAAAACgTwDkPinXFbm704uD+gMAAAAAAAAAAAB6 - BMA7zeYnyXVF7k6xJ98oAHAYAAAA/QNAHQAAAACAVQAgXv0fXudnv1GuK/JEFYvavQoAAAAAAAAAAADo - CQDvNs39k1xT5KlO5wVGCgBUAQAAoG8AyOUPAAAAAPARAFyWv+cBUPXunXM7yTVFnkwAYA0AAAAAAAAA - AACgBwCsbJa7Uq4n8nQVz7aLE8tfngIAAAAAAAAAAAAA5wPAa28BnHun6fwecj2RNxLL/28AAAAAAAAA - AACAjwHwulxL5K1O5wW2FAA4DAAAgD4BoA4AAAAAwOQAKFvtP6e5XEvkzSoWtxssAFAFAAAAJwAAAAAA - gNoAcFn+ngHAuZUtcgfKdUS+qGJR4AIAAAAAAAAAAADAmwAQy98u1xD5KkXxu658YdDrAAAAAAAAAAAA - QA0APPgWQLPc/1X8/K6Ta4h8mfYdAvOClgMAAKAfAKgDAAAAADAfAOYu5zv+6Sxlmd8NFQuC/gUAAIA+ - AMAJAAAAAL4FgMvydxsA5i7P98u5Sa4d0lM1CAAAAAAAAAAAYG0AuP0EgOWv9xwIaP8vAAAAeAsAAAAA - AOAmALD8jdL5CAAAAMD7AOAEAAAAAN8CwGX5XwMAWP4GzBUBAAAAAAAAAACsBoBrPwFg+Rs4JwIAAADw - PgDUAQAAAAAYFQCrWsxh+Rs9FQECAAIBAAAAeBMAnAAAAADgWwC4LP+rBADL30Q5ENDBgQAAAAAAAAAA - ABYAQP1OAFb5s/xNVzUCAAAAAAAAAAAAgLoAwPI3bxoC7BIBAAAAeBQA6gAAAAAADAMA/1ksf7NXjQAA - AAA4AQAAAAAAsPytVQ0CAAAAcA4AAAAAwJIAYPlbr1oIAAAAgLcAAAAAsB4AWP7WrRoBAAAAcAIAAACA - yQDgsvzrBgDL3+ppCHiyBgEAAAAAAAAAAMwAgEueALD8yZFiq0EAAAAA7gGAOgAAAAAAHQKA5U+1cyIA - AAAA9wCAEwAAAAB8CwCX5V8DAJY/1V0NAgAAAAAAAAAAGBsAtRHwvv9Mlj9dOgcCQv4FAADAtQFAHQAA - AACAHgDwfiuWP11hSk70TWLxLwcAAKD+APD6CcCR/YmDNoiPyw4kDPr9gcSUx/f3Hpx1MCEl9UD8wJ77 - eg0OPZA4MPBgwpA71SkbOPB2ebv7lUUOvN35vx/sMSRI/Wf3xg/puS9uaKpY+tn7YlMf3xub+vvv41KX - CQBsEMv/CAAAAEYBAMufrrpaCAAAAOCqAaCORwBQeCh54OqDyQOeEct+fGHvwZGuy9xbqWjYFzO0y/c9 - hk7Y233Ys2L5rxFTBAAAgJ4AwPKneleNAAAAAK4aAG45AfhRzHqx/J891GfAsNLeKc3lranb9kSlNN/T - PXX43pjhzwkArBfL/ycAAAB8AQCWP11zGgJyVQQAAADgcQBUFfbrv/lQvwGLDvUdmLgnJeUWeRsatj3B - Kbfs6TEy6dsewxeL5b9FTBUAAACeB8DjLH9yT7UQAAAAwBUBQJ0rAsCPh/r1W3FowICs/cnJ/vKWM207 - o0e1+q7b8Gyx9N8S8yMAAADuBwDLn9yc9tUBuWH/AgAAwA0nAD8V9u+38mD//pniVX5DeYtZrpLo1N/s - jh5pEwBYKQDwMwAAANcMgNYsf/JQ2knAvNDvAQAAqA8ADg7st0Us/ynilX5jeUuRbHvnIXeKZf+wWP7b - AAAAqBcAWs/4Pj+a5U8eqnxeaHex+KsAAAC4CgBUCgD816HB/XrI24gu07fdR8Tsjhr1F7H8TwEAAHAV - JwBVa1s9Fi1vIyL3dnJ+2LvVyx8AAIBLA6BUjP3gkIQ75e1DV9nuXsMa7I4ePX131OhDAAAAXAEA1HlH - 3j5E7qtifkiPk7kur/4BAACoEwB9NxemJE/Ij47mKNJNFUTYbhYLP2NXlG0rAAAAlwFA1futZnaXtw6R - e9Je/fNVAADg4gDYUTS4r03x87tO3jLkgXZGje4vlv8mAAAALgIA5X1/TgHIjZXPD4vWXv0DAABwHgDE - x51FKX0yFbv9enm7kIdTkbWr25jUXV1tWwEAALgAAK1mKB/6P8bn3JB7Ks8NWaUtfwAAAGoAUHLonuQs - Fr/vUmy2G8TCn1TQxVYKAACAKwA+CJixUt4mRPXP8eo/xPHqHwAAgKFJPxcPTVpyPMW6X7+vt7ZFZtwu - lr9dLP8fAQAAcH4r4DWcAtC1Vj5fffXPzwIAAEmKWPwrylITA+WtQTprR3RaewGAdwAAAFBnLZ8LQNfS - CXt4p5Pz1Vf/AMDKAChOTSoVv7bJ24J03jeRY1IFBIoAgMUB0Gpm1Wr/xzrK24Lo6jo5v8Nf+XHAlgZA - lQDA34tG9msqbwkySFu6jmgsFv9rYqoAgGUBoM5r8pYguvJOzQluXj4/5EcAYFkAHCpKTewrbwcyaDu6 - jhtQ0CWtCABYEQAaAn5YF/BYM3k7EF1ZYuk/qS1/AGBFALzJq37zpJ4GbI8c+08AYEkAqDNP3gpEl0+Z - GnyLePVfCgAsB4DKohFJOfI2IJP1TWRaplj8pwCAxQAQMLNkWYT9ZnkbEF26k0+ETKxe/gDAGgAYmfRN - 0ciEEHkLkEkTiz5MLP+dAMBCABDzXquZGfIWILp0AgBbAIClAPDW8ZRYvq7fIhVE2O74psu4ZQDA7ABw - LH8JgM3y8hNdvHJ7aF8BgJrlDwDMDICzxcMTZvH9+62Xes23RY6fLhb/LwDA/ABQ533/GUny8hPV3ckn - OqwAAJYAQEXxyKQB8rKTRdveOS1FLP9KAGB+AKz1n/WmvOxEF3Z6bmBLAYBfAIDpAVBcNKJnV3nZyeJt - 7zyhs1j+BwGA2QBwHgL8Z/68tuXjLeRlJ6pdub3DTAEABQCYGgDbiocn3i0vOZHW5qixAQIAmwCAqQGg - rGk163fykhPVrvzJDrsAgIkBMDLhwyO25Dvk5Saq1e7QSQ22dx63DgCYFwDv+c8qkJebqKYT9pAEAQCx - /AGAGQFQMrr3qkJb/G3ychPV2Z7glFsEAN4CAKYFgLKmxZx4ebmJHFU82eG/AYBJAXBv77f3pKTcIi81 - 0SUriLDdvK3zuDcAgDkBsLbVrNflpSby8ztuD25Ybu9wGgCYDwBFo3v9r2Kz3SAvNdEVtS45+cZtERP+ - AQCMDACX5e8CADGn1jW381YgOSq3h+Soyx8AmA4AyxXxIJeXmeiqWibgKBb//wcATAcAZW3L2ZPkZSar - J179fwUAzAWA4nt7rlRyom+Sl5ioXqlvB2yJmLAaAJgLAO+1mvW5vMRk5coXBLd3Ln8AYA4AFNt6fbQ/ - K/lWeYmJrqkv4m23CQB8DACMBoC6PwegeprPDpaXmKxauT1kLgAwEwB6buJL/cjdqV8iKACwFQCYBwBr - W86aLS8vWbVye4dtAMA0ACgqGhV7l7y0RG5tc+jYgK0RGYcAgDkAIIYfEGTlKheEhgoAVC9/AGBoAFQW - pSV0kZeWyCNtC8/oJBZ/OQAwBQCU95vP6CAvLVmtCnuHXABgCgD8WmzrxQ/2Ia+0ueOEFLH8zwIA4wNg - bcvZ8+RlJasllv8OAGACANh68v29yattjUifBQCMD4D3Ws7eJi8pWalKe0iYtvwBgMEB0GsFP8+fvJ16 - z23plL4MABgeAMq7rWaGy8tKVumkPdgOAAwPgF3HJ8Q2lJeUyKsVRNjuEMu/AAAYGwCrW8x6Ql5SckfK - a9E3Vf6hdciZP97d4/SLbfqferHNvaf+0MZW5zxX1wTWnsW1p/z8WXj+BNeep+oYe/C3AMDQAFA/6S9E - 3nJEPmlTp4xwAYDTAECPAHBZ/pcAwBr/2d+KsdWa5s6Zp827VzVP1EyTJ2xvX3aeumDeamK/962m9v7L - m9jjxK87rvb7k35/lsnpV9r5n17SOuP0H1v/t5idp/941y+nXrxb0eYFl/lDm5r5vZzn22pTqc5zzmmn - VD7rMs/IWRyoTYU6i5wTpFTkyVnonPZKxYKaKX9anWDHPCXHrg4AMCoASsf2zJK3H5FPEwB4AAAY9wRg - Ta2Zo6xWp4Vz5mqzyjnN51WPWPZich3TzDErtZlfM03nK+80faLWvN30SeXtJq5jV8SSV9660zlPafNv - 5zR+Wp2zYvauaPT0v1Y0euqB5Y0XtpW3n29S7H43nnopIO30koA1p5fcdVaMIhZ/9QAAufwBgAcA0GuZ - vA2JdNGWiPQVAMCgJwDGAIA2K6pnQdWKRgs+FR+zV3vzdEA93j/zp9YPnv7TXftO/6m1Il75ixFLHwAA - AO8AoPDg+IQ75e1IpIu+DstsujkiowgAcALgJQAoAgDaLG+0oGh544WPeBwCla8EJJx+qfV2MYq2/AEA - APAuAKrKxvXsK29HIl21JTx9gFj8VQCAEwAvA0DMQvHrhbvfaJTXT96O7kt91X/6lYDnxeKv0pY/AAAA - PgBA2di4/5K3JJEuE4v/rwCAEwBfAMA5bzZcuGSZn/1meUteW6f/2KLlmZcDvjj9coBj8QMAAOAbABTv - z0puLG9LIl1WEHFfE7H8SwGAHgDgsvwtBIDlDdXJ+3rZ7c/5y9uyfv241L+dWPzfCgAo6gAAAOArAJSM - jR8pb0siXScWfxoA0AMArHkCoALgzYZ56uxb1nBx/X7k8Y8vt2p75pWAwurlDwAAgI8AUDYufoW8LYkM - 0ZbwzJUAAAD4GADKmw3yCt9qsvBueVteWZWvBTT74ZWA3QIA2vIHAADAhwD4sSwjJlDemkSGaFNEerAA - wE8AwJcAcFn+VgWAYwr+0WjxlX3llGL3u/7MK63WasvfBQAaAgAAAPAyAMrG9Vwob00iQyUA8BwA8CUA - OAGomYWrFD/l8j8z5cyrreYKADiWPwAAAD4FQHzJEVvyHfLWJDJUXwVPaLg5fGIZAAAAvgdAnvq/PyJv - zbqrfC0gTADg57oAwFsAAMD7AIjj2/2SocsPz7wfAAAAPQBAzJlLfgvhH5b6fygAIBY/AAAAvgZA/Dfq - 21Hy1iQyZMv8bDds6jhxFwDwBQBclj8A0OaNRnl1f0L16T8HDNCWPwAAADoAQMm42NHy1iQydJvDs8YC - AACgBwCoI/7/cfLWrOmHpa3WAQAAoBMAbOfVP5klxc9+/aawzK0AAADoAQBvNshbLm9NR6dfvSvyzFK5 - /C8CAA0BAAAAeAEAZePiUuWtSWSKNoVljQIA3gYAnwNwkTm37M5n2shbU7z6fzXgeQAAAHQBgPS4zfK2 - JDJNip/fdQIA2wEAANABAJQ3Gy2aLW9NPz+x/AsvBwDeAgAA3gBAyfi4CfK2JDJV+WGZEwEAANAFABrm - bdFuylOvtArXlj8AAAA+BkDZhLgiJSf6Ju3GJDJZ+dE5N+WHTSwEAABABwCo+mcDezPx6t9/MgAAALo4 - AUiPnyGflUSmLD88axYAAAA6AIDyRuNFo/zO/LnlawAAAOgAAJUnbNGN5HOSyJRt6ZrVOD9s4ikAAAB8 - DYA3Gy58yu/0Uv9PAAAA8DUAytLjX5PPSCJTlx+a9ToAAAC+B0DeP9S3AA4AAADg8xOACT17yOcjkanb - FJ4VBwAAgK8BsLxh3hcqAE4AAADgYwBsk89GIksklv9WAAAAfAmANxvl7VAB8AsAAAA+BcCE2CnyuUhk - ifJDJ04DAADApwBomLdfBYBj+QMAAOATAMT8tD+ra2P5XCSyRF9E3NdEAOAXAAAAfAWANxrmFQMAAOBb - AEyIfUs+E4ksVX5o1ioAAAAAAACwLAAOp/Od/8ia5YdlTwQAAAAAAACrAuDH4xNiG8rnIZGl+ip4QkOx - +H8EAAAAAAAA6wEgPW6FfBYSWTKx+N8GAAAAAAAAywGgNDNmonwOElmyjeGT7gMAAAAAAACrAaDqaHp0 - K/kcJLJk+eE5rcTyrwIAAAAAAADLAKA0I4af+08kEst/OwAAAAAAAFgGAGWZcXny+Udk6cTifxYAAAAA - AAAsA4CSiT0S5fOPyNLlh07qAwAAAAAAABYBQMxPe6am3CKff0SWbk/w1FsEAH4CAAAAAAAA0wOgNCP2 - M/nsIyLRhrDsLwEAAAAAAMD0ADicGfOMfO4RkSg/LPt5AAAAAAAAMD0AyjLiUuVzj4hE+eFZIwAAAAAA - AMD0ACjN7t1cPveISPRVp/tbAgAAAAAAgNkBcEg+84jIpY2hWSUAAAAAAABgZgC8K593ROTShtDs9wAA - AAAAAMDEAIhdLJ93RORSfqj6iYAAAAAAAABgWgDEjJfPOyJyaWPIpEwAAAAAAAAwLQAOZ8ZGyucdEbmU - H57dDQAAAAAAAEwLgCO25Dvk846IXMoPymkEAAAAAAAAZgXAEfmsI6I6EgA4AQAAAAAAACYEQOzX8jlH - RHUkALAJAAAAAAAATAiAmP8nn3NEVEcbQ7KXAwAAAAAAgOkAcDgz5jn5nCOiOtoYNukPAAAAAAAAYD4A - ZPR4TD7niKiONoZmzwQAAAAAAADTAaA0o0eWfM4RUR1tDJ10HwAAAAAAAJgOAGKGyuccEdXRxtDs4QAA - AAAAAGA6ABzOjImXzzkiqqP8kEkJAAAAAAAAYDoAFKd3D5XPOSKqo00d7g8HAAAAAAAA0wGgaELsXfI5 - R0R1lB+R0wYAAAAAAABMB4CyjJ4t5HOOiOpoQ0SWPwAAAAAAAJgOACdyohvJ5xwR1dH2zpPvBAAAAAAA - ANMBoNAWf5t8zhFRHeVH5/wGAAAAAAAATAcAxWa7QT7niKiOlvnZbgAAAAAAAAAAQGSx1iXbbwQAAAAA - AADTAYC3AIgu3bbIjNsBAAAAAADAdADgkwCJLt0XEfc1AQAAAAAAANMBgC8DJLp0+eE5rQAAAAAAAMB0 - AOAbARFdui/DstoBAAAAAACA6QDAtwImunQbOj4QAQAAAAAAAKYDwOH0Hj3lc46I6mhj2P3JAAAAAAAA - YDoAlE2MGyafc0RURxtDs+8FAAAAAAAA0wGgdGJstnzOEVEd5YdOeggAAAAAAADMB4DMmBnyOUdEdZQf - el8uAAAAAAAAmBAAPZ6XzzkiqiOx8JcAAAAAAACA6QBweGLMMvmcI6I62hia/Q4AAAAAAACYDgBlGTEb - 5HOOiOpoY+ikHQAAAAAAAGA+AGTGHJHPOSKqIwGAUwAAAAAAAGBGAChHbMl3yGcdEbm0OTi7uQBA7eUP - AAAAAJADAAwPgMPpMV3k846IXPo6bFI8AAAAAAAAmBcAE3tMkM87InJpY1j2gwAAAAAAAGBeAGTGPCOf - d0Tk0sawrJcBAAAAAADAxACIXS2fd0TkkgDApwAAAAAAAGBaAIgpks87InJJLP8TAAAAAAAAYGYAKKXZ - vZvLZx4Rib4My2q3MTRbAQAAAAAAAFMDoCwzdrh87hGRaENodjoAAAAAAACYHgCH02Ofk889IhJtDM9a - CgAAAAAAAKYHQFlGzOfyuUdEoo1h2dsBAAAAAADACgD4aX9W8q3y2Udk6bZ0zWosAHAOAAAAAAAALACA - WKU0Iz5JPv+ILN2GsKxUAQCx/AEAAAAAAMACABCzSD7/iCzdhvDsVwEAAAAAAMA6AEiP3SKff0SWTiz/ - 7wEAAAAAAMA6AMiIrTo6tleAfAYSWTKx8EO15Q8AAAAAAAAWAoBSmh6bLZ+DRJZsY/ikRwAAAAAAAMBy - ABDzlnwOElkysfg/AQAAAAAAAAsCIOanE7boRvJZSGSpNkRk+YvFfxYAAAAAAACseAKgHM6IzZDPQyJL - lR86cVr18gcAAAAAAACrAaAsI26lfB4SWar8sKz1AAAAAAAAYF0ApMf+fHB8wp3ymUhkiTZ0yr5bAOAc - AAAAvgbArwAAAPgQAEppeszD8rlIZInyQ7NzBQBqlj8AAABeBoCYQyoAygEAAPAtAGK3y+cikelT/Pyu - yw/P2gsAAICPAVCgAuAQAAAAPgaAUjo+PkY+H4lM3cbwrAHq8gcAAMDHAPjK78yr/p8BAADgawCUpMf9 - RT4fiUydePW/DAAAAF8DYHnDRcsEAFq9DgAAgM9PANLjTu3PSm4sn5FEpiw/PL2VWPw/AwAA4GsAvNFw - 4QK/H5a2nAYAAIAOAKCUToibKZ+TRKYsv+PERc7lDwAAgC8B8GajvDF+p19tEQkAAIAeAFA2Ia6owBZx - s3xWEpmqbZEZt+eHZx0DAABABwCoevv2vJZ+iuJ3nVj+ZQAAAOjgBEApGc93BiRzJl79TxMAqF7+AAAA - +AwAjRbVfOXVmaX+L10OABoCAAAA8DQAJsRtVb9MSt6aRKZoXXLyjZvCJ+4HAABADwBY3nBRrrw1/fx+ - WOofAwAAgB4AoE7Z+Njh8tYkMkWbO2ZNEgBQAAAA0AEAqpY1WhAob01HZ14N+AoAAAA9AKB0fNw2xe53 - vbw1iQxdQYTtZvXVPwAAAPoAwMILf/7KmT8HDL8UAPgcAADgRQCo3xjIJm9NIkOXHz5xsrr8AYC3AeCy - /AFA9SxvsKiXvDVr0j4Z8NWALwEAANAFACbE7VRsthvk7UlkyNa1y7o1P2xiIQAAAPoAQB2v/p2dWRoQ - JQBwFgAAAN+fAKhfFhg/Sd6aRIZsU3jWDOfyBwDeBgBvAdSaRnk/LG+0OEjemnX3w1L/Z/kcAACgBwCI - X5cendSrgbw1iQzVV53GtRRLvwIAAABdAKBB3gx5a148xe5345lXW60HAADA5wBQZ2zcM/LWJDJU+eET - X3dd/gAAAPgQAKvtfvYr+8TqH/7U+i6x/A+5AoC3AACATwAwLv6nw2k928tbk8gQ5Yend9sUnnkOAPgS - AC7L39oA+PafDezN5K15ZZ16pVW4AMAxAAAAfAwAdd6RtyWR7lPEK63NHTPXCwDUWv4AwNsA4ARATMkF - X/N/pZ162T9CLP/CagQAAADgGwCIX/NlgWSMtoRnThEAEAsfAAAAnwLgwJsNFoXJ27J+/bjUv92Zl1rv - 4AQAAPgUAOPiSw+OT7hT3pZEumxrSGZrsfwrAIAeAOCy/K0HgC3LblvYWt6W15by3+1uFQBYAgAAgA8B - oJSMjX9d3pJEumxTx4n/Vpc/ANADACx7AvD3lQH238hb0n2d+VPrIadeav09AAAAvgBA6dj4quJxsQPk - 7Uikq8TCT3MufwCgBwC4LH9rAGDfigYLhsrb0TMpL9x12+mXAh4//aeAUgAAALwMAPUUoKhoZExTeTsS - 6aINnbLv3twx4wQA4ATABwA4+majvHkeedV/sdS3Bc4suev+M0tafyaWfxUAAABeAoBSkha/XN6GRD5P - +6z/iIxPBACqlz8A0AMAXJa/CQHw70YLNq9ouHDasub2O+St6Jt+fLFduzN/vOsBsfj/KT7uFR/PAgC5 - /AGABwDQUyke2+s+efsR+bQtHTPmOJY/ANAXAEx3AnByRaOn14hX/TPebPJ0hLz99Jdij7j51Ittwyv+ - eFfs6Rfb9D/1Ypt7xdK31TnP1TWBtWdx7Sk/fxaeP8G156k6xh78LQAwLgDEnCoZF39tX+JCdI1tCp8Q - tyUi4xcAYOgTgG1icuqeedq865xm58/8y847F4w9550mteffteZpx9z5dPq/G9tHvHXn073fvj2vpbzl - yB1VPBX8JAAwNADU+faELbqRvKREXm1Hp3EtxfIvFCOXPwDQFwCu7ATgPf/ZD8tLSlapckFoKAAwPACU - ElvPtxQ/v+vkZSXySuuSk2/cEpH+ibr8AYChAXDu/WYzA+RlJSsllv82AGBwAIzpqRSP6TlTXlIirySW - /wtitOUPAAwNgHXykpLVqrB3yAUAxgeAmLOlab1S5GUl8mibO2VkiOVfBQCMD4A1/rOnyMtKVqvSHhYC - AEwBADG9KotsPbvKS0vkkbaHj08Ui/8nx/IHAAYHwNkPW8zlk+usnADAFgBgCgAopbZexcVjE++Wl5bI - rW3vPC5sa0T6iZrlDwAMDYBWsz6Ql5asWvlTIXMAgDkAUGLTZuvRYb0ayMtL5JbUz/jf2il9nwCAy/IH - AEYGwNpWs3Pk5SWrVm4PCSq3d6gCAKYBgDrryzIG3i4vMdE1lR9ta7S104RNAgAKADANAH5d7T+nubzE - ZOXE4v8SAJgKAErJvb1WF9gibpaXmKheFUTY7hDL/0sxCgAwGgBclv95ABC/XiUvMVm98idCHgAApgOA - +JjwbyU5+UZ5mYmuqi/ibbeJxf+xY/kDADMBYE2rmaPkZSard3RmaAOx/E8BAJMB4N4EpXh0wj9AAF1t - 6vLfFjFhdc3yBwAmAsDhfL+cm+SlJtK+GuD/AABTAkCdd/ZnJd8qLzXRJdsWmXH7tk7jP9hWa/kDAOMB - oO7PAVjjP+t5eamJHFXOD+0FAEwLAKVodMLqQlv8bfJyE9XZlq5Zjbd1Hv+FAIACAMwJgNX+czrKy01U - kwDALgBgTgCoUzIyYR1fIkgXS/1Sv22R47cIAIjlDwBMCYBWsz6Xl5uoduVPdJgBAMwLgOJRAgGje28v - sSW0kZecSKsgIj14R6fx32nLHwCYFgBrW86eJC85Ue1Ozw1sKQDwCwAwLwCKR/VWSkb1LhHTTV52snjf - REzoJV79H93uXP4AwKwAOPV2s5mcANLFOzm/w3IAYG4AaDOyd2XpCH6AkNXb0WlsxvbO434WowAAswHA - Zfk75nV52Ynq7qQ9OBkAWAIA6pwtHpFoV+x+18vLTxZJ/Xn+27uMfUYs/irH8gcAZgfA+61n8MPC6PIJ - AGwGAJYAgFI8Qp3Ed/aPSG4sLz+ZvG+jxzX7JnLsh9sjnYsfAJgeAAEzP5aXn+jSiaWfCQCsBAAxwxN3 - lYxMDJe3AJk0sejjd0SOLRKjAACzA6AGAe8HzBwmbwGiS6fYI24Wi78EAFgIACMSlaLhiT8UDkucLm8D - MlGKn991OyLTpovF/7O6/AGApQDwnd3Pztt8dOWJZT8fAFgOANoUDk/6d9HIfk3lrUAGb0ensXfv6Jy2 - zrn4AYC1APC+/6zfyluB6Mo6NSe4uVj+PwAA6wFAm2GJRcXDkgbI24EM2o4uY9O+6ZJ2Qrz6r7X8AYBl - AHByXXP7HfJ2ILryxPL/CwCwLADEJClFqUnLSlKTm8lbggzSzuhRrcTif1OMog4AsCIA1G/9O+NZeUsQ - XV3H5wdHCABUAQBLA0CdsqKhiZnytiAdp77X/01kWuY3XcYcdy5/AGBZAPz6QcAsvusn1T8BgHcBgOUB - 4JihSSsLhyUHy1uDdNbOyLRuBV3GrBfLXyx9dQCAtQEw4x/y1iCqX+Xzw6IFAKoAAAAQABAfk38pHpq0 - 5Pv+/RvJW4R83K6YkU0Luty7pKDrmLMCAHL5AwCLA+DsB61m8mW9dO05TgEAAABQJ9kxQ5LLCu9Jvl+x - 2W6Qtwl5uf3JWbfu7GqbUdDVViFGEQBQAAAAkAD4p7xNiK4txylAqOMUAAAAAAcAlELH7Csa0icHCHiv - /Oicm3ZG3Zsplv8+x+J3DgAAANryP7e25eOd5O1CdO2dnB/mOAUAAACgNgCUwnv6qFNQNLivTf0kNHnL - kJtT/OzXF3S91yaW/56dUTZFAMBl+QMAAOAAAO/9k9srnxfaXTsFAAAAoG4AKIUp6vTdXjQ4eWKBzXaz - vHXoGiuIsN2xO2r0tF1Ro/eL5a84BgAAgDoBwHv/5JlO5oasBAAA4NIAcExRSt+ywsF97YWDBjWRtw9d - ZXsjR7bY1e1eu1j8x3eJpa8OAAAAlwLA2gBe/ZOH0k4B5rmcAgAAAHARAIjl75xThQP7vF6UkhwnbyO6 - ROox/87uIwfs7jZ62a5uo38WIxa/OgAAAFwWAOd49U8eS8mJvkks/u8BAAC4CgAohYP6KofUGdh3+8GB - /aZxKnBhe3sMv3t31Kjc3dGj9u3uNkoRAFC05Q8AAMAVA+Dxz+XtROTetOU/P2xF9fIHAADg6gEgpp86 - Zw8N6Lv+4IB+00uSrftthtWv3/+2+8jMb7uN+EAs/nOOxe8cAAAA6vM5AI8/I28vIvekLf/ckOV8FQAA - uHIAqHNRACiHBlTPT4f693+7sF+/+wr79m0tbznTtrv7sNDd3UY88l30yHXfRo88J0ZRRwDAZfkDAABQ - XwBo85S83YiurVrLHwAAAPecALgCQBEAqJl+/bcd7Dfg2QP9BvUpjI+/Td6Ghu37aFujPT2Gp34bPeKV - 77qP2CdGLHx1HIsfAAAAtwNA/UZAATOflrcgUf1yHPury5+fBQAAvAYAbQ72HaDOzwf7DvziUN8Bvz+U - PHDEvn79WspbU7ftihvRbk+PYRPE0n9lT/fh27/rPvycGEVd/M4BAADA4wDQfhbArAXytiS6uqqXPz8O - GADUCwDqXDMAHNPHOQOVg8kDSw4mDVx7KHHg8wcTB2UeSOwf5YufS7AnKqX5ntjUuL09hj6wN2bYS3t7 - DPtEzAmx/BWx/B2jLX7nAAAA4G0AqDNzobxlia6sWssfAACAegHALScAdQHAMUk1cyBxkDrHxWw60HvQ - mwd6D37hYO9BMw8kpEza33vQ8IMJgxMOxA0JP5gwJKgkObWZ+HhnQXLyHfJ299sTm9JQ/d/297jH/2CP - IUF7eqRG7OtxT+L3cUNG7Y+558F9canzvo8d+se9sUPf/r5H6vbvY1JPiVH2OkcsfecAAACgMwAo77Wa - lSdvdaJLpy3/J0JWVC9/AAAA6gUAdbwKAMf0ds5g5UCCnF7OSVEO9ExR9jsnXp17lP1xtWdf3BBlX6zr - DFUEABwTo06qNgAAABgBANoEzHhePuKJ6s6x/DusEACoWf4AAADUCwBePwEAAAAAAFwMAOr4gwC6SOry - L7ery7+DAgAAAAAAAADA6ABwWf4aAGYq7/nP/L185BM5ci7/8ifV5Q8AAIA7AKAOAAAAAEA/JwAqAGaB - AKpJea1m+QMAAOA+AHACAAAAgD4BoM0f5Aogq3b+8gcAAAAAAAAAYBYAuCz/CwEAAqxc9fK31yx/AAAA - 3AcAdQAAAAAAOj0B0GZNy9kvyJVAVqnW8gcAAIATAAAAACwJgPdazgYBVkpb/k+pyz/YsfwBAAAAAAAA - AFgZAOLjrBfliiCzVr38n1KXPwAAAM7lr467AaAOAAAAAMAIAHAiQPHzu06uCzJT2vJ/Wi5/AAAAOAEA - AAAAALgAQJ3V/nOXggCTVb38n5bLHwAAAAAAAAAAADgPAGtazlFWtZzzZxBgkhzLv71j+QMAAAAAAAAA - sAgAXJb/VQBgtYqAFiDA8NUs//aO5Q8AAIDXAKAOAAAAAMBoJwAqAFa3UGfuayDAoDmXf8UCdfkDAADg - bQBwAgAAAICxAQACDJnr8gcAAAAAAAAAYEUAuCz/+gNAzLz/AgEGSVv+C2uWPwAAAL4BgDoAAAAAAIOf - AGjzrkCA3c9+vVwzpMccyz9oRcXCmuUPAACAbwDACQAAAABmAcAqEKDvapZ/kAIAAAAAAAAAwOoAcFn+ - bgCANs3n/QUE6CzFnnxjZV7QcsfyBwAAQA8AUAcAAAAAYJYTAAkAZVWzeXyzIL2kKH7XlecF/bUiz7n8 - AQAA0AMAOAEAAADAlADQJneRXEHkyyoXtc/Tlj8AAAAAAAAAAABQDQCX5e92AMxTPydgilxD5Isq8tqm - VCwKqgIAAAAAAAAAAAC8CoDm835Z1XJ+rFxH5M1OP9fOv2JR4BEBAMfyBwAAQFcAUAcAAAAA4DsAePIt - AA0A6uxZ2/Lx2+VaIm8llv/fxSgAAABwAgAAAAAA8A0AcsXMz5NribxR5aL2vcTyrwIAAAAAAAAAAAB8 - C4Dcn95ubg+W64k8nVj87zuWPwAAAAAAAAAAAFAXAFyWv2cBoLzbdN5f5XoiT3b6mcAuFYudr/4BAAAA - AAAAAAAAHwOgWe4vbzWZd7dcU+SpKhcF/VkAQC5/AAAA9AoAdQAAAAAAvgOA194CUAGg/m+5ck2RJ1K/ - 3W/l4sBjAAAAAAAAAAAAgJ4A8G6z+bvkqiJPVP5s4AABAAUAAAD9A0AufwAAAACARQCQq6xsOidMrity - d2LxLwQAAAAAAAAAAAD0CIB3muU+KNcVuTux/D8BAAAAAAAAAAAA9AiAlc1y/69cV+TuxPI/CgAAAAAA - AAAAAOgUAJvluiJ3duKZoEbq8gcAAAAAAAAAAAB0CoBT/KhgD3Tq2bbhAAAAAAAAAAAAwJUBwGX5ew8A - yuom9oZybZG7qlgc1AMAAAAAAAAAAADQMwDebmYPkGuL3FXlc4G9AQAAAAAAAAAAAF2fALTIbS/XFrmr - 8meDugMAAAAAAAAAAAB6BsCq5nZ/ubbIXVUuahcGAAAAAAAAAAAA6BkAy5rb75Bri9zVEXvEHWL5VwEA - AAAAAAAAAACXB8B5CPAOAE7KlUXuTiz/EgAAAAAAAAAAAECnAPharityd6cWB64FAAAAAAAAAAAAdAmA - pvP+KtcVuTsBgPkAAAAAAAAAAACAHgHwbtN5E+W6IndXucjxpYAAAAAAAAAAAACA3gCwqvG8tnJdkbtT - 7H7XVy4OKgIAAED/AFAHAAAAAGAhAPD+v6erfCbwDwAAAAAAAAAAAICeALCqWe6jck2Rpypf3CZIAOAs - AAAA+gaAXP4AAAAAAB8BwGX5ex4Ap1c0mNNUrinyZJXPBL4BAAAAAAAAAAAA6AQAL8j1RJ7uVF77TmL5 - /woAAAAAAAAAAAD4+C2AyveazW0l1xN5I7H8lwAAAAAAAAAAAAA+BUCLeY/LtUTe6sQzQY0EAPYDAACg - TwCoAwAAAAAwOQA2LfOz3yzXEnmzioWBMQIAvwAAAMAJAAAAAACgNgBclr9nAHBqTbPcULmOyBdV5LWf - CgAAAAAAAAAAAHgRAOdWNs+9V64h8mWVC4MWAwAAAAAAAAAAADUA8NxbAO82m/eIXD/k6xTF7zoBgKUA - AADoBwDqAAAAAABMB4Bmc5+Uq4f0kkTAywAAAOgDAJwAAAAA4FsAuCx/dwGA5a/fahAAAAAAAAAAAMDa - AHD7CQDLX+9VIwAAAADeAgAAAAAAuAcALH+jpCFgQQ0CAAAA8D4AOAEAAADAtwBwWf7XAIA1LH/j5YoA - AAAAAAAAAABWA8C1nwCw/A2cEwEAAAB4HwDqAAAAAACMCoA1LWaz/I2eioCTT6kIAAAAwJsA4AQAAAAA - 3wLAZflfJQBY/ibKgYBgBwIAAAAAAAAAAFgAAPU7AWD5m7BqBAAAAAAAAAAAAAB1AYDlb95qIQAAAACP - AkAdAAAAAIBhAMDyN3/VCAAAAIATAAAAAAAAy99aaQiwqwgAAADAOQAAAAAASwKA5W+9aiEAAAAA3gIA - AADAcgBYy/K3btUIAAAAgBMAAAAATAYAl+VfBwDE/83yt3rnIwAAAAAAAAAAgBkAcPETAJY/Vaf41SAA - AAAA9wBAHQAAAACA3gDA8qcLciIAAAAA9wCAEwAAAAB8CwCX5S8BwPKni6Yh4AkVAQAAAAAAAAAAjA2A - C04AWP506RwICHkZAACAawOAOgAAAAAAXQCA5U9X2gUIAAAA4KoBwAkAAAAAvgUAy5/qWS0EAAAAAAAA - AAAwGADEsPypvlUjAAAAgKsGgDoAAAAAAJ8BgOVP15qKgPJ5oUsBgEcB8L0AQBUnAADAIgA4J2Y/APAc - ANYGzLTLRzjRtaWdBOSGvQwA3A+A0gmxy5Wc6JsOZ8ZGCgQsEwCoMgcA1AEAAKAWAM4JACzLD8kKy4/O - +U1+WPbHAMD9APjA/3Fe+ZN7q0YAAHAbAEozHMtf/ivWOjxOQGC8gMB4CQHDAoATAABQDYBzm8Mnaotf - 3uZaKgLE4q9BAAC4ZgCIX7P8yTNpCJjrggAAUG8A1LX8XauGwLj4KgAAAAwKgDoXv2u1EAAArgkALH/y - eNWfEwAA6g2Ayy1/10rG9uouFv9KDQKGAoA6AMCSAIjIPCs+/uNSi9+1bZEZt28My/oUANQfAGsDHuc9 - f/JO1ScBAOCqAVCaeeXL37Uj42M7lIyNWyIAcMYYAOAEwGoA2NQxo1J8XLIlLKudvG2vOO0kIDT7YwBQ - LwDwyp+8mxMBAODKAVDf5e/aCVt0o5K0+Oli+R8CAABAJwDYtzkifdaWrlmN5W1arxwImPQxALgqALD8 - yTepCBAAeBkAXB4A7lj+rhXYIm4uTYu3FY/p+SVvAQAAXwBga0RGvlj8meuSk2+Ut+U1VycCAMDFAMDy - J9/mQED4UgBwcQC4e/mfX6ktPkkA4E2x+H/WDwA4ATApAM6I5f8/mzqPj5a3n9tTPydgQ9ikTwHAJQBw - F+/5k07SEDBHngQAgFoA8PTyd+3g+IQ7S2wJOQIAWwEAAHAzAAq2dk6f9XVYZlN5u3m0WicBAKA2AAJ+ - xyt/0lfVCAAANcs/q4fXlv/5CQhEl4xOeE0s/koAAADqCYCT4hX/a1s7jo2St5VXq0YAAKgGwEcsf9Jr - GgJmhy8FAL5d/q4dsSXfIZb/JDGf8zkAAOAKAHBua+fx72+LGD92T3DKLfI28lna2wEh930KAH7HsT/p - P8dJQLjjJMCiANDL8j+/EltCm5LRidMFANaL5V/FCQAAcAFAgQDArM1RYwPk7aKb8gNyfiMW/8dWBgCv - /MkwVSPAmgDQ5fI/v9IRye1KRggMDBcYAADWBIBY+tsix9t3dEprL28L3eZAwKSPrAgAlj8ZLg0BM8OX - WgwAhlj+51cyOjmseGTSE2Lx73IfANQBAPoDQNoWMTN2Ro1vKy+/YVLfDvg69P5PLAYAjv3JmGkImBX+ - skUAYMjl71rx8KRUTgDMDYDtHvzyPW/kOAm4/yOLAIBX/mTsNATMUBFgYgCYYPmrAQAAYIScCDA3AB5h - +ZM5ciLAlAAwyfJXcy8A1AEAAMAzqQj4KtiJALMBgOVPJqsaAeYCgGmWvxonAADASNUgwEwAYPmTSbsA - AcYGgKmWvxoAAABGy4GAB6oRYGQArGP5k9mrhQDDAsB8y1+NtwAAgBFzRYBRAcDyJ8tUjQBDAsCcy1+N - EwAAYNScCDAiAFj+ZLk0BDwWUYMAQwDAvMtfDQAAACOnIuALFQEGAgDLnyxbLQToHgDmXv5qvAUAAIye - AwEP1kKAXgHA8ifLV40APQMgx/zLX40TAABghs5HgC4BcNc0lj+RWi0E6A0AFln+agAAAJglVwToDgAs - f6LaqQg49ljHpboCQE43yyx/Nd4CAABmSv3ZAQIAn+gLACx/ojpTESAWv10fAIj6m5WWvxonAADAbK0O - nnqLAMAbOgBA1Sdtp8+Qfy0iuljHHus0VQDgFx8B4NzhnG52FSPyr2OZOAEAAGZsXbL9RrH4l/oQAGfW - 3T09Tf51iOhyHXssosexRzrt9SoAHup25MgDUSnyr2C5OAEAAGZOLPvRAgAnvQyAgk/veriz/CsQ0ZV2 - YlZ0o6OPdH5RAOBXDwPgnADA66XZUc3lH23JAAAAMHufB/627RftJy/3AgB++KTN1CfWtcu6Vf7RRFSf - jj/aJUIgYJkAwFk3A6DqyENdVx6b0rWH/KMsHW8BAACr9GXQ5P5i+X/qAQD8tK7ttNc/EtCQfxQRuaMj - j0YEH38k8nkBgEPXBIApXcuOTIl6qeyhyE7ytyYRJwAAwGqtbzc57vOgKX8VS//kNQGg3dTv/tNu6lPr - 7344QP7WROSJFLvf9ccf6RwvEDD36LTINQIAhZcGQJdSsfQ/EPPk0clRSYrNdoP8rcglAAAArJr21QLt - Hhoklv+i9UEPfSoAcPQSADgnZr9Y/m9/1va3vxOv+qPkb0NEvqgkJ/o3h6d2an90WufoI1O6JGgfp3Xt - cHRSaAP5j9Bl4i0AAEA1fdZm8p3rAyeHftZ+cvT6oCkJ6sdP2z4cqGJB/iNEROaIEwAAQEREFgwAAAAi - IrJgAAAAEBGRBQMAAICIiCwYAAAARERkwQAAACAiIgsGAAAAERFZMAAAAIiIyIIBAABAREQWDAAAACIi - smAAAAAQEZEFAwAAgIiILBgAAABERGTBAAAAICIiCwYAAAAREVkwAAAAiIjIggEAAEBERBasZETiQABg - bgAURNk6ystNRETkqGhkUjwAMDcAdnQae7e83ERERI5KRiaGAwBzA2B36LAG8nITERE52pOScotY/mcB - gGkBUCYvNRERUe2Khvfe6x4AqAMA9AWAcZ/Ky0xERFS7ouFJ/wIAZgXA2OflZSYiIqpd0YikHABgTgBs - 7zz+HnmZiYiIalc6IrmdAEAVADAdAH4oiLDdIS8zERHRhRUOT/wPnwRoOgD8S15eIiKiuiseljgJAJgL - ANs7p6XIy0tERFR32pcDDkssAgCmAUCB4me/Xl5eIiKii1c0vPejAMAkAIhMGysvKxER0aUrsEXcLACw - GwAYHgAbePVPRERXVUlq4sD6A0AdAOBLABR0STu7MzKtm7ycREREV55Y/K/WDwCcAPgcAJFjnpSXkYiI - 6Oran5x8q1j+mwCA4QDw0TKb7QZ5GYmIiK6+Q8N6BQgA7AcAhgFAQUGErYm8fERERPWveFifUAGAsisH - gDoAwPsASDvAz/wnIiK3VpaaGCiW/3ecAOgWAAUsfyIi8kiHh/VrWZSa/DEA0BkAomzvbOk6orG8TERE - RO5PsdluKL4n+Umx/H+5OADUAQAeB0AX249ifqf4+V0nLw8REZFnK7qnX0jRkOT3OQHwEQC62D7cHj06 - TF4OIiIi73ZwcHJC4ZA+HwIA7wCgIMq2fle3ManyXz8REZFvK05JjDp0T58XBACKeQvA3QAYvV/M4oIu - oyPkv24iIiL9dTClX8dDg/r9tnBwv9cKB/b9RABgvwDACbH8zwKAiwLgV7H4T4iPe3d3u/ejndGjlwoA - 5OzsOrqD/NdKRG7Lz+//B9Il7ocd5R9bAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAHOWSURBVHhe7d0H - WFRnvsdxNr3ZOx1FiiiCo3QQAYEBsWbsLWrsih17xho10cQ0Y3bv7t7s3WZii8bEbtQkaowtdrogIF2K - scG5/zPzgqMxxjPMwJz3/L7P83/czd17n33Hee//wwAzVgghhCyrTVaaZ096jLU/0XZ0yHGXUcOPtx01 - +7jrmDUnXEf9lf7Z9mMuY44eazvmEk3ysbZvZh1zebNQnB/bvnnvR+exAptCcX5wHnfjhzbjkmmu/thm - 3I/ftxm382ibCf/7fesJa486TZj/Q+vxo460nhDxQ5uJzhc8NC+w/woIIYQQMlfHnIfUP+H2RsBPbm+M - O+H6xic/uY7aR0s+meYujaAbl9HC8YdmjG5o+bN5s3oIAFXLv3oIAAIt/+r5vs34B9NanAnC0QdTQXPt - qNPEw0ecJv7liOPE+O/ajA87bjOpCfuvjBBCCCEp/WCrefnndiODT7q9Me+k+8htJ91GptDir6QRdOMq - Dlv6hlO7ANCP00SBAGAwk8S5fthx0rc0Sw47To465jylPjsaQgghhKo66jqq3ul2w3udbDdy7c/uI36k - uUuLX6DFXz3Vy18eABBo+bOZLM79w45Tzn7nNPnjQ45TBh20ntmUHR0hhBBSVj91GNX6tPvw+FPthu/9 - 2X34bVr6guFwBgDdfCeOwxRxKmhOHnScsuqg/ZSIk6qxz7OHBSGEEOIrwcrqT6c9RgSeajdsPU0GLX6h - aggADy1/BQBAN4d0M1WcPJq/HrSdGg0MICQhQaN5tnhuh0Y5szyb35jeobU4BdM7euRN7aB66plQNZ2k - zRgjZoQ4vrrJkjKDjRhNkHHTW+p0U2XF/v6kP2kipUzkg+lmxAQ97cQ+PL6PnyTJ0/vx0+nxc+mpRvPE - uaga0OlgaOhz7LrUemfajfA43X6o9rTHsCQaWvhVAwAYAEA4ZK+fg/bxhQfsp31+yH56HDCAFJugtXqm - YEZ7u8LZ7YLzZ3sML5jpsbhgVvu/5s/02FEws/2PBdPbX6X/eSGNkD+9ajoI+dPYxFeNp5A/9cHkTWEz - ueODmVQ1XkLeRIOZ4CXkTvAWcscbzDhxOulnLJs3xVHp5sYYgxktTmf9jGLzhjhddJMz0mBG+OhnuMEM - 830wQ32FbN34CdlD2Aw2mEH+D2agv5AlzoCAB9O/agKFLI3BvC5OkHC9n8H0FSdYP33Y9K6aECGzl8H0 - FKerkBlnMD3ECdVPbKiQUTUx3fSjNphoccL0ExUmXBMnUpxw/XQ3mIiIBxOun/Sw7g+mW9VECumhbLo+ - mLSQqAcTXDXRQloQm8CqUQtpAWohtWr8xYkRUv0enhS/WCHF13B6CMlV4yNOnG6SqqZLz+pJ1E0v/XTu - JVytnt7Vc0UlTp+H5rKqr3C5k+H0Ey5Vjbc4r+vmon6uX+ikiWZXqtb6pf2gFmfbD40/7THk/GmPoYJ+ - hukGAPhDADwYu/jsg7bxq/bbTWnDHlqE+Ct/gYtNYUI7deEc9wRa+P8smONxrmB2uzs0gm5meTyYmWxo - 8VcNAEAjWwCw5Q8AmBoA/7rgoWnMrpjZE6y0z5zqMDiCFv+mM+2H3j1TvfgBgBoAQDcH7KZV0hw9YD99 - 7A+2019mDzlC8kvQhj5XPNdNVZTgHl841/1zmvTCBHdBN3PEoYUvTtXyBwAAAADgqQFw2fv1IvpnQ9l1 - M3uEjNfOth889Uz7Ick0gn6GCgCASQHwYGyn3ThgO33x4ZZTmrG/AoQsN/GHf4rme3gVznebVzjP7RDN - rzQCLf4HAwAAAABAjQFw0bvfrouqvq3Y1TNrupf5PQdrafkXnK1e/ACA2QGgQ8B0Yb/t9Ns0n+91mObO - /koQsoyytKpXihe4aooWuP6VJqtoPi18ccTFXzUAAAAAAJgKAPcvqfrOE7HNrqDZOtdhcGuav57tMPgO - jUAAoAEA6gAAVVOx33bG1r3WM7zZXxFCtV+q1vGlwgXOcUULXT+nKaHFL1QPAAAAAADmAkDuxc59urNr - aLZ+aT/Qjr7iX3+uw6DbBABBt/wBAEsAAM0McSr32czYAQigWkv8iqN4oWtY0cK2/1e0yKW0aKGLQMtf - PwAAAAAAmBUAlzr1/e6yd09rdh3N0mXvgdbnOg78UL/4Bwn6AQAsEAACAUCciv3WM/5Jf7qwv0KETFvZ - fKcWxYudE4oWuyTS4heqBwAAACQDQBwAQCIAKi936rPGnL/f/4O/5uVzHQYm/OI5qOScZ9XiBwBkAACa - meLc22szc+Mu/LAgMlUl2jYBxW+1/aJY2/Zu0eK2AgHgwfIHAAAAowCAVwAkAuC2uX/K/7znoLhfPAem - 0AjiAACyBIBAABD/LNxjPSthk4cWH1+MpCe+IU/hEue4Iq3zUVr+QtUAAAAAAFDrACi41KVPV3Y1Td6F - jgO9aeEfqVr8AID8AaAb61nCHuuZ5/fYzAhnf9UIPTnhA+cXby51nlisdU6mr/gF3QAAAAAAUFcAuJSo - 6m2Wd4QTX+7/xWug9nzHAXd/8Rzw0PIHAPgAQNXssZ61CZ9GiH43YaPq+aKlbYYXL6HFv8SZFr84AAAA - UDUAQB0A4MgVVZxZ/p/2Bc+BwRc6DrhMy18QBwDgHgA0swt2t5ozlj0FEKLFv8nq2aIlbUYUL6XFv5SW - vrj8AQAAAACoWwB07vMPc3wozGmv3g0vdOz/P+c79q+sWv4AgGIAoJu91rN37LKZY8ueEkip0eLvVrLM - +Uzx0jaCbvkDAAAAAFDnALjcqc+n4nvss2tqsi52GuBHX/Un0/KnpS8OAKBEAOxppfuz+FvrhMHsqYGU - VOGq1vY3l7X5nEYQBwAAAAAAiwHAalO/s5/4a4MXvPprae7TV/9s+QMAigYAzW7dn3M+P9hM+xp7qiCe - y9Jav1KyrPWqm8vb3K5a/gAAAFA3ABAHAHgIAKrei9hVNVmXPTVOF7w0R2kEAoAAAAAAhgDY3WqOOKn0 - zwPZUwbxWOlyp5Cby1tfphEIANXLHwAAAOoGAHgFwAAAlVdUfWawq2qyLnn2j6PFX6xf/gAAAPAoAHTL - v2rufdtyTgJ76iBeKn7bvlHx8tZ/vbmidaV++QMAAIAlAEAcAEAHAFXvKey6miRBo3n2Qqf+2otemooH - yx8AAAAeBcAjCGg5R/i21Zx/7W4x61X2VEJyrmS5U9zNla2zafkLugEAAACLAQBeARABcKVLz3nsupqk - Sz59mlz0fn3PRW+NQAAwWP4AAADwKAAMln8VAFom0Mw9u6v5bLO89wSqhYR1ti/fXOm0nqaSAKBf/gAA - AGBRABBH8QBYx66sSbri3acjLf90GgEAAAD+GACPeQVABwDdFO5uPsfsnzaJTFzpijbti992OkfLX9AP - AAAAWCIAFP4KgE/vD9mVNUm07Ltf8n69WL/8AQAAoMYAEOfet83njmdPMWTplaxsPaPkbac7N9+uWv4A - AABgqQAQR6EA8On9P6b8Vb/L3v1G0fK/S8OWPwAAADwNAAyW/+MBIHzbYq7wTYu567VmeF8KZKJytR6v - 3Vzt+B9a/oI4AAAAYPkAUOwrALtM9XG+IiIudXpde8m7nyAufwAAADDxKwBVABC+aZ7wxSbb6S+zpx6y - lG6+3ca5ZJXjORrd8gcAAAAAwGIBcD5ZpWnArm6NEn/S/5Kq7/9e6iQufwAAADAGAAbL/48AoJuEffgN - AQuqZE3rHiWrHYt1yx8AAABkBQBxFAWA60ldetmxq1ujxM8IuNyp3ybd8gcAAIDaeAWgeuad+NZW25g9 - FVFdVbrGaWzJaod7BAD98gcAAAC8AmCpALiV0rm3D7u6NSrRWf3i5U59txIA9MsfAAAAahcAwq6W807R - NGNPSVSbCYLVn26udtTqFn/VAAAAAABgqQCoSPLp1Ydd3xp11nPYq5c79dlHABAAAACg5gAwWP5SACBO - 83nnv206vxV7aqLaSPde/msctpasMVj+AAAAIEsAiMM/ABJ94uaz61ujLnhoXqDF/41++QMAAIApAGDk - KwB6AIhzZXvz+S3YUxSZs8JVrRuUvOPwPQFAAAAAAPkDQBGvAOw0xa/7id/zv6Lqt+PB8gcAAACLAADN - /LP4mQAzJ76ff8m79sf1yx8AAAAMBgCwVACki2/Ly66w0Yk/7X+lU59/X1YZLn8AAAAwBQAMlr/xABDn - 2Pamc+qxpywyZWXvO7UoXeN4jr76Z8sfAAAADEa2ABCHWwDcTvbp2ZldYaMTrLTPXFH1+V8aAQAAACz0 - FQDdfN1s/gG8T4CJu7XW2q70HcerpeLyBwAAALwCIA8AdOk5gV3hGnW1U9/V4vIHAAAAiwcAzc7m87/A - OwaaqLI1ji1L33W4Ii5/AAAAAADkAoDYf7ErXKMud+49umr5AwAAgBwAoJumC9ewpzAytqL3HBuWvmt/ - ika3/AEAAADfApAFADLTg2IbsWtsdJc79YmmpX8PAAAAzAsAg+VvKgA0W0CzcBJ7KiOpFXzgXL9krf0J - 3fIHAAAAvAIgFwBUJvnHRLNrbHSJXeI8rqh6FxsufwAAADAPAMzwCoAOAAvu72y6sCd7SqOnTdA6vlS6 - 1v4IjX75AwAAAAAgFwB8xK6x0SV6a5pd7dw7nQDw0PIHAAAAmQFAnJKdTRa6s6c2+qPEd/ijxf9/uuUP - AAAA3ANAHG4AkHwhVPMau8pGJf66Hy3/3TS08AEAAED2ABB2NltwZW+jBJN8+BX3la21X129/AEAAAAA - kAsAKlJ8YoPZNTa6q517rRGXPwAAAHAEAGFn00XbTPFmWFxX+p792NJ1dg+WPwAAAHAPALb85Q+Ad9g1 - Njpa+L1p8VcCAABA7QLAYPmbCwDNFor/ei57qqNHK3vPPoKW/z0AAAAAAGQGAL/Y9BzPyBp9Pvolnz4u - 9NV/SdXyBwAAAK5eASAA0Nzf1WRhGHvKo6p+XW9tT4s/V7f8AQAAQFEAEEfeAEj1ievNrrJRHQwNfY6W - /zGa6uUPAAAAHAJA2Nl0YeaWevNq/NbY3CT+xH/Je3Y/VS9/AAAAUBQAZP4KgE/sN+wqG12iqvdK/fIH - AAAA7gFAfy7awp76qOw9u/8pfc9g+QMAAAAAIBcA3ErvEtuaXWWjSlb1CUrs3Os+AAAA1B0ADJZ/bQCA - 5qtmC0ezK6Dcyt+3fVO3/AEAAAAAkCMAavQZ/8kqTYNEn15pBAC2/AEAAKAuAFDLrwDQ7Gi6sGx704Wu - 7Coor5IPrd3K3rctBwDY8gcAFAoAcWQJgJREtfpFdp2NKrFLr7/SCAAAAKBAAAg7mi3+UZEfGiRsVD1f - tt72OAFAv/wBAAAArwDICwD+MYPYdTaq5C49wmn5VwIAtQqAUprUY23HJhMAzv7oPO4kLf6ff3Aem6yf - cfkAQC0CoOki4asmiyayK6GcaPGvEpc/AMAGAAAA5AWAM+Jn9LPrLLksVdwriV16JumWPwBgSgDcpcV/ - 9pjL6H8cbztmwfG2owcfdx7lf8x5jO1Bx5EvsYf/iYl/r4ed32h2zGmC51HnCT1p+U892nrcR/TnIQJA - IZ8AMFj+tQwAmpu7Gmtt2cPPf6Xv2YbS4q8AANjyBwAAAJkBINkvNoJdZ6NK8um5hgCgX/4AQE0AcOO4 - 66gvTriOjj/hMrLLBQ/NC+whNlvfOUx2+t5pwtDvW4//mABwHgCoMQDE2c4eXr4TNlq/Uv6BbWLV8gcA - 2AAACgaAODICgK/6W3adjSpRFdcpqUvPewCAcQA46fbGmZOuoxaJC78mr8KYqu/aTLQ77DTxTYLANgLA - r/IEQN19C6BqdjZerGEPKb+Vrbd9h6Z6+QMAbAAAAEAeAKhI81d7s+ssOfG90Omr/yMEAFr8AIAEAGSd - cHvj3Z9dh3uyh9IiO+Y8pT4t/2E039LyrwAAnh4AO5osurbDWvsKeyj5q+w9Gy9a/vcAAAAAADCYquUv - DwBsZtfZqJK69BogLn8A4KkAcOdnt5H//slluHqTleZZ9hDKpoOO4x2POExaRos/GwB4KgAIOxovfos9 - fHwlaK2eK/vA5mfd8gcAAAAAQJYASPaJ6cyutOQy/DUvJ/n0SgMA/hAAd+jff36y/Yg27KGTdRc8tC8c - cZoy/IjD5F/wMwBPBsBXTRbf+rrhAgf20PETLf+ZZett9MsfAAAAAAAZAqBm3/tP9o1bXLX8AYDHAqD0 - lNuI9adcR1mzh4yrxG//HHKaEkeL/xQA8LsAEL5qvPhf7CHjo9INLZoTAIoBAAAAAJAvAFICjf+s/zRV - 31bJPnFlAMBjAXDnpPvwVcfdhiviA2J0v2ZoP3koAeA6vgXwGAA0WVz5VWOtH3u45F/pB9afEQBo8QMA - AAAAIFMAfMeus1El+fT4MMknrnr5AwAMAB7DD51pN8KDPUyKaneLWa8edJyqpeV/BwB4CADi7GMPk7yj - xd+R5j4AAAAAAL8HAHEsHQAx0exKSy6pSy87Wv63AYCHAJB9yn3EcPFlcfYwKbbDTvGe3znEHwUAHgKA - sL3p4m7sIZJvZR/ZHNAtfwAAAAAAZAqAmEs1WVTJPnGf6pY/ACBO5Wn3YR8dcx5Snz08iBKfXwcdpo4h - AJQAAGyaLj7CHh55VvaBdWTZh2z5AwAAAADwOwBgy99CAZASqJ7MrrTkUgJiHAgAdwAAHQBunm43jP83 - e6lBR2wmudDiP137ADBY/pYCAJodjbWR7KGRX6Uf2vwIAAAAAIB8AUBTmqyKaMCutORo+f+FRr/8lQ2A - Y6fdRjqyhwU9oR9sp798yH7aRgBgsbC9yVs/sodFXpV/YB2nW/4AAAAAAMj5FYBP2JWWXIpvzxa0/H9V - OAAqz7Qbsr423qOftw44TOtLy7+odgBggd8C0ANA2N5QG8IeEnkkCFZ/ooV/AgAAAACApwGAOJYJgGT/ - mA7sWkuOFv4KcfkrGAC36c/+7OFARrTPfkq7Q3bx6YoGQKO35PVBQeUfWveuXv4AAAAAAMgSAOkBxv/q - n/hxvyk+PfIVDIDSMx7DotjDgWrQYYdprWjpn1UsABprK7c0WejOHg7Lr/wj6+8BAAAAAJA3AFIDokey - Ky25JL/YKck+PXTLX4EAKDjrOYSfN3KxgI7YT2hEi/+IMgGgm43sobDsyj9u2aXsI+sHyx8AAAAAgD8A - AFv+lgWAW8b+8J/4Tm+09JMUCoCU0+6D27KHApmwHdZjXzlgO22neQBgsPwtEwC/7nptXjP2UFhu5R/Z - fAkAAAAAgMwBEBBj9PuRp/jGRSb7istfcQBIOdNxuA17GJAZOmilfY4AsE2BABC+aqydxR4Gy+zXD1s4 - lX9kfR8AAAAAAJkDIDA6hl1rydHy/0J5ABiae9ZzqCt7CJAZE39N8IDtjO+UBoDtjbWXBSvBct85suyj - VmsJAAIAAAAAALIGwA0hNPQ5dq0ldUUV15QW/22FAaCE/r2KPQSoFtrlPKX+Ptvpp00HAIv/GQDdbGu0 - 1OgP5DJrwgfOL9LyzxMBoEMAAAAAAABPCQBxLAcAqUHR69m1llyKT4/ZuuWvHADcOdN+iHzfrU3G7bGb - Y73fZnqqkgCwvZH2f9nxLatbH1sPqlr+AAAAAADIFwApATFGvfGI+H7uKb49rigIAJVn2g/C7/nXYbTs - XQgABYoBQGPtra0NtQ3Z8S0nAsABAAAAAABkD4ACY1/+T/WL8SUA6Je/AgBwpsOg1ezoqA47YDMtlpZ/ - pUIAIGxtvGQ0O7pldPsDuzblH1tXVi9/AAAAAAAkAIAtfwsAQGpglNEvMab4xKxVCgB+aT/4ON7e13I6 - YDNjrVIAsK2xdjc7tmVU/kmrZQSAB1/9AwAAAAAgSwCkB0Ub9Wl1+pf/Y9MUAoDC014D8cE+FtRJ1djn - CQDfGw8Ag+Vv+QC4t+U1bXN29Lqv7GPrqwAAAAAAyB4Aty8H9qzHrrWkkvzUgQQAQQEAqKTpzY6NLKjd - 1jPsaOnnKwAAwrZGS8axY9dt5RusvXXLHwAAAAAAWQOAvvr/ll1rySX7xryvBAD80n7Q++zIyAKjpf+6 - MgCgPcCOXLfd+qjlKgAAAAAA5A8AmhnsWksuxTfmmgIAcO2Ch+Y1dmRkoe21mfG1dADI6mcARADc31FP - 25Qdue4q/8Q66VEA6BAAAAAAAMBTAkAcCwBAcFQndq0lldQ5tr1++fMNgLOeg/qxIyMLbr/d7Da0/H/l - HADC1kZLBrEj1036l/9b6Zc/AAAAAAAyBkBUkaDRPMuutqRSfGJmcw+ADoMt6yev0RPbbz3jLd4BQPM5 - O27dVP5Jq/kAAAAAAMgfAOmB0dvYtZZcqm+P/ZwD4PaZjgNc2HGRDNrlPOVFAsBlngGwvZE2V2ulfYYd - ufYjABwBAAAAAED+AEgNVE9j11pSF0I1r9Hiv8M5ALTsuEhG7bedqeb8FQBhewNtZ3bc2q1wY6MG5Z9Y - 330cAPBDgAAAACAFAGz51yUAAmK82NWWVIpfbM8Hy59LABQm+g6pz46LZBYt/x+5BkDDpQvZUWu3W5+0 - 1JR/Ii5/AAAAAABkDoBSwciXElP8xHf/4xcA5zsMWsKOimTYPpsZPXgGwLaGS/eyo9ZutPz/DAAAAACA - /AGQGhR9mF1ryaX4xR7jGABlV1SD6v5XrVCN2mc78yS3AGi0pPSgldaoz+6oUbc+bnUJAAAAAAD5AyAt - OHodu9aSyvDXvEwAMPj+P3cAeIcdFcm4PTYzNBwDQPw2gDc7au1U8pFNE1r+lQAAAAAAcACAEPUQdrUl - JX5sMAHAYPlzBYDbl70HWrOjIhkn/qT8HuuZ57kFQKOlk9lRa6fyT63jdMsfAAAAAADZAyA1NNKNXW1J - pfrGzOUYAH9hx0QctK/VzLG8AoD+/Dc7Zu10a0OrtwEAAAAA4AIARv8AIAFgK68AuNBxsA87JuKgo03n - 1KPlX8onAJaksmPWTmUbWh0CAAAAAIALAPzArrXkUv1iUjkFwFl2RMRRtPj/wikAKrc21DZkxzRvgmD1 - p/JPWxU9CQA6BAAAAAAA8JQAEKduAJAeHPU3drUlleirrk8AqOQRAOc7DJzOjok4ak/L2V1/HwAGy19+ - ABC2NNIGsWOat183tHQs38CWPwAAAAAAsgZAakjkXHa1JZXupw4kAAgcAqDygofGnh0TcZT4w4AEgEwe - AbCt0dKJ7JjmrfwT654AAAAAAPABgLSQ6L7sakuKlv94TgFwlB0RcRgt//V8AkC7gR3RvNHSXwgAAAAA - AB8ASA+M8mBXW1KpfrGf8AiAX7wGzGZHRBy2z3pWBJ8AWFI7cC3bYP1fAAAAAAC4AEBFamjoS+xqSyrV - P2Y/jwC46DmgPTsi4rBNHtoXCAClvAFga6MleeyI5o2W/xkAAAAAALgAQBq71pIjACTzB4D+Gex4iOMI - AF9xCABhe9PV9dgRzVf5ButiAAAAAAB4AEC0US8bChrNs7T87/IGgAsdB3zOjog4bo/NrBm/BcAjCJAh - ALY1WtqBHdE8FX9i30i3/P8AAHgfAAAAAJACALb8axsAIVGb2NWWVHJQnL24/DkEwDh2RMRx39rO8eER - ANsbanuyI5qn8o3WnQAAAAAA4AMAqUFR77OrLSnxMwB4BMC5DhrzfgWFLKKTqrHP0/Iv5w0AWxsuiWdH - NE+3Pm3VFwAAAAAAPgCQHhSVwK62pFL81cM5BED5Jo3mWXZExHm0/H/kDgCNte+x45mnW5+0mgYAAAAA - AB8ASA2JHMGutqRS/WIT+APAwOPseEgB7bae8xl3AGi05F/seOaJFv8KAAAAAAD4AAD9++7saksqzTdm - DXcA8BrwZ3Y8pID2Ws+ewuG3APaw45mn8k9bbAQAAAAAgA8AXAvs3pldbUml+sb+D28AwBsAKavd1nO6 - c/gKwM/seOapfEPLLwEAAAAA4AMAKYHRruxqSyrVT72dNwBc8BqgYcdDCmiP7ey2HAIgnR3PPJVtaHkI - AAAAAAA+AHAtsLs1u9qSosX/PW8AOO81oAs7HlJA+ncEnF3BGQDK2fHMU/mnLc8DAAAAAMAHAHJDQ19j - V1tStPgv8gaAi6qhrdjxkELabT07mzMACH9z1Br11t5PVfmGlmkAAAAAAHABgArBSvsMu9qSosWfxhsA - LnhoXmDHQwppj83sX3gDwM4GbzdixzN9BIAsAAAAAAC4AMBNdq0ll+ofk8UTAOjPYnY0pKAIAId4A8D2 - V1e0YMczfQSAfAAAAAAAuABALrvWkkv1U+fz9QrAAKM/FAnJt73Ws7fyBoDNDZc7sOOZvlsbWpYAAAAA - AKBsAKT5xZbyBYD+V9jRkIIiAPyHu1cA6mud2fFMX/mGlncAAAAAAFA2AGjx3+EJAPTnOXY0pKBo6f8v - bwD4qvFSD3Y800cAqAAAAAAAgAsA3GDXWnK0+Ct4AsD5jppT7GhIQe2xnv1n7l4BaLjUmx3P9BEA7gIA - AAAAoHgA3OUKAF6as+xoSEHtsZ71d94AsKWRtj07nukr/6RlGQAAAAAAXAAgh11rydHiL+MKAB0HXGJH - Qwpqj/Wcf3MHgHpaF3Y801e+oWUBAAAAAABcACCPXWvJ0eIv4AkA9GcKOxpSUHtsZm3mDQBbG2od2fFM - HwEgGwAAAAAAHgAQeYtda8nR4s/mCQA0BexoSEHtsZ69nzcAbG66wnzvaEkASAcAAAAAgAcARAmCRvMs - u9qSosWfzhkAKjYZ+Vgg+bbbevZZ3gCwqb62MTue6SMAXAQAAAAAgA8AJPqq67OrLSla/Fc4A4BwylvT - jB0PKaQ91rMzeAPA7hbvvMqOZ/rKP2l5BAAAAAAAPgCQFhxl1MuFtPh/5A0Av7Qf5MmOhxTQJivNswSA - uzwBgP78lR3PPJV/2mIrAAAAAAB8ACAjNMqodw1L8Y/ZyRsALngO7MmOhxTQ/lYzHQgAuuXPCwC2NFqS - yY5nnmjh/wUAAAAAAD4AkBYc1YldbUml+qn/zt0rAJ4Dp7LjIQW0p+XsrrwBgOYMO555uvVpy1UAAAAA - AHACgMBINbvakkrxi1nLGwDOdxzwITseUkC0/Mdw+ArAAXY881T2actZAAAAAADwAYDUoKg32NWWVJqf - ej53rwB4DfiOHQ8poN3Wsz/g7xUA7X/Z8czTrQ0tBgIAAAAAwAkAgqPnsastqTT/2NEcvgJQyI6HFNBe - 69kHeAMA/fkRO555uvVJCz8AAAAAADgBQFDU++xqSyrZLzaCQwAIZz01TuyIiOO0VtpnaPkXcvgtgNns - iOap7ONmLQEAAAAA4AMA6cFR/2FXW1K03NvyCIALXgOGsCMijtvdYlZ73fLn7RWAxtrX2RHNkyBY/YmW - fzkAAAAAAFwAwKjve1/w0LxAy1/3kcCcAeATdkTEcXtsZo7nEQBbGyxVsSOaL1r++ncDfAIAdAgAAAAA - AOApASBOnQDgGrvWkkvzi8ngDQA059nxEMfttp71z98CwGD5yxQAW+qtbMKOaL7KN7TcDgAAAACA/AGQ - FhxVkeGveZldbUml+cUe4RAAwgWVxp4dEXGY/vv/s25wCIASdkTzVv5pq2UAAAAAAHABACE9MMqDXW1J - 0fL/K48AOO/V/012RMRh+23n+BAA9MufLwD8zI5o3m5taNkfAAAAAAA+AJAaHNWLXW1JpfrHTuMSAJ4D - trEjIg6j5b+USwA01v6NHdG8lWy0dgMAAAAAgA8ApIVEzmJXW1Lp/tHhXAKg44DbJ1WaBuyYiLP2Ws+6 - yCMAtjVeMp0d0bwJm6yeJQDcAgAAAABA/gBID4r8lF1tSV1RxTXlFADCLx0HDmPHRBy1x2a2FwGAFj+H - rwA0WBLOjmn+CAAnngQA/BogAAAASAEAW/518QpAcPRRdq0ll+ofk8UlADwHfMuOiDiKlv+a3wfAIwiQ - GQC2N1/Rgh3T/JVtaLUeAAAAAAAeABBVJlhpn2FXW1IEgN2cAqDitNdAR3ZMxEEnVWOf32s9O4dLADRc - ksOOWTvd+tR6AAAAAAAAXABASAmMdmVXW1JpfjHLOAWAcL7DwKXsmIiD9raa3U9c/py+AvAVO2btdGuD - rQ0AAAAAAHwAIDU4eiC72pJK9Y+J5hUAv3gOzE50Vr/Ijopk3l7rmQf4BcDSueyYtRct/3QAAAAAADgA - QEjUKnatJZXoq65PALjPKQDEHwYcxY6KZNzuVjNVVcufRwBsb7Q0kB219irb0OpfAAAAAADIHwDpwdG7 - 2bWWHAHgHK8AOOc58LxgZfUndlQk0/bYzPw3xwC4fdBR+xI7au1FC380AAAAAADyB0BacHSxoNE8y662 - pJL9YjbwCgBxznsO6seOimTYPpsZLnttZt7jGADfs6PWbuUbm7YiAFQCAAAAACB7AAgpwdGe7GpLKtmv - xxCeAUDzi7G/JYHqPlr+/6GpXv68AWB7I+1qdtTar/yTlmcfBwAdAgAAAAAAeEoAiFO3AEgLjJrMrrWk - kgIim9Pir+AYAMIvHQcNZcdFMkr3xj82Myt4BsBXDbRh7Li1361PWq4CAAAAAED+AEgNiv4vu9aSo8X/ - E9cA8ByYjbcHllfiz27st5l1SLf8+QVA6S6rD+ruN1V+/aRlVwAAAAAA5A+AtKDoLHatJUeLfynnABDO - dRy8jh0XyaC91jNG7ata/vwCYCs7bt0kaK2eIwDcAAAAAABA9gAQMvyjnNnVllSSf2wA9wDwHHT/gsdg - L3ZkZMEdsZ/biL76z+UfAEvGsSPXXQSATx8FAH4IEAAAAKQAgC3/OgZAarB6ArvWkhJ/g4CWfwHnABDO - dRj0PX4t0PLbZzPjU3H58w6AzQ2XO7Aj112lG1qEAQAAAAAgfwCkBal3sGstuRS/2L8rAADCWc9BY9iR - kQV2wHaWLwGgQjoADJa/PABwih25bhO0Vs/Q8s8CAAAAAEDuAIi+laWKe4VdbUnRwo9RAgBoSn9pP8Cd - HRtZUEebzqlHS/8yAUC3/HkGwNZG2jns2HUfLf2PAAAAAACQPQCEtEC1ml1rSZ1UqZ4nAOQrAADi/PKD - v+ZldnRkIe23nfFP/fJXAAAaLGvDjl333frI1hcAAAAAAC4A8CG71pJL8Yv9i0IAQDPkU3ZsZAEdsJs+ - kQDAlr8xAJDVzwAcY8e2nAgAZwEAAAAAkDsAolPYlZZcim9cpHIAMFg40x5vEGQJ7bON96Tlf0spAKCZ - wY5uOd36xHpKFQB0CAAAAAAA4CkBII7FAEBI81d7s2stqYOhoc8RALKVAoCzHQaXnPIY0o4dH9VB39pO - b7zfdvpVcfkrBAD3NzfW2rLjW05F7zk2pMVfDgAAAACAvAGQGmDcxwOL0bJfpSAA0AzKPOU+uO5/HUuB - /WA7/eUDNtOOEAB0y18hANjJjm953frI5nPd8gcAAAAAQAIA2PK3lFcAAqPTjP199/Qusa1p+VcqBwCD - hXPtB1+44KFpzB4CVAttstI8S4t/i375KwcAO5poe7OHwPIq/7BVZwAAAAAAZA8AIS0g2p9da8kl+8Yd - UBIAzrYXZ8jxs57DXmUPATJjIk4P2M74nwfL3xQAMFj+lguA7I1WG59nD4NlVvax9WEAAAAAAOQNgNSg - mPXsSkuOFv4gBQJAONN+yE7x5yDYw4DMFC38VQceWv4KAUAj7Ur2EFhu5R9Z9wIAAAAAQN4ASAtUZ4lv - 8cuutaRSQ0NfIgDkKRAAwlmPIdvwHgHmSfcJf+Lyt5smKBAAFVsbLLSc3/3/vQTB6k8EgIsAAAAAAMga - AEJaQFQsu9aSS/aNXaJEALD58bjb8CbsoUAmSPye/wH76Z/plr9ZAGDpPwOg3cIeCsuv/EOb8QAAAAAA - PC0AxLE8AKQGqLezKy25pIA+zQkAtxQKAJqhF856DrG8X9eSYbucp7xIS39z9fJXIAC2NdYGsIfD8hO0 - Hi+UfWSTCgAAAACAfAGQFqC+nxwUZ8+uteSSfHt8pmAACGc8hqad9Rzqyh4OZERH7Cc0OmgXf+Sh5a8w - AHzV+K3j7OGQT+Uf2IwDAAAAAOBpAMCWv+UBQEgNVC9mV1pyaX6x7rT8KxUMAOG0x7CCsx7D4thDgiT0 - ncMUb1r+V2keXv6KA8DifuwhkU/CRtXzpR/aJAMAAAAAIGMABKivGfvDgGK0/HcoGwC6qTzlMXTtSdVY - y/4VLgvqgF38xIP28b+Ky792AGCw/C0LAInizz+wh0VelX1o/QYAAAAAALIGAP1p/A8DJvnGqsRXARQO - ADbDfqL/vdbsoUGP6ajrnHoHHeL/Tctf0I3CAbCtiXY4e2jkl6C1eq7sI5vLAAAAAADIFwA0+9mVNqoU - n7htAIAOAOIUnvIY/jp7aJBBB2zjfQ/ZT02qXv61CgCL/BbAZdl+9V9V+Qc2sQAAAAAAPAkA4lg0AIQ0 - v6hO7EpLLtm/Vwda/hUAgA4Awql24gzfd7LDSDf2ECm6g47TGh5yjF9Py/8+zYPlr3AAbG+6aCB7iORd - 2QfW3wAAAAAA8HsAsPhXAIRUf/U/2XU2qmSfnl8AAIYAoPEYfuvndsO1Bx1HvsQeJkUlvrHPd/ZThh9y - iL9xyGGqIC5/AKAaAOe1Vtpn2EMl70rfa+VOALgLAAAAAIA8AZDmr76XEhBj9KfeJfr2akcAuA8AGACg - 3fCqSaRRs4dKEdFX/V7fOUw5eshhiqBb/gDAQwDY0WRxH/ZQ8VH5h9YfAAAAAAAgTwCk+osTs45dZ6NK - 8um5AQB4LACEn93FGXHqZLuRGmM/iVEOHXSc7HbYYcrntPzv09DitxQAGCz/ugZA08VHuXsOFL3n2JAA - kAUAAAAAgGwBUHJFFdeUXWnJJXqrm9HiLwIAfhcAujnpPuK0HgKcvARMHbGfqjrsOPnf3zlO1i3+qgEA - fgOA+18303qxh42vSj+weR0AAAAAANkCQEj1i1nNrrNRJfr0nAEAPBkA1RBoN/LSz24jxh51HVWPPXyy - Snzfg8MOk/sdcZx0gJa/IA4BoHr5WxYALONbANsbL/6MPXx8VrredgsAAAAAAIYAEEc2ALiV4d/Dhl1n - yV3w0LxAy/8KAPAUAHAfKZx0E2dE6UnXkX854fZGVzm8KnDEaUrHo06T1tDizznsOEm3+AGApwJA8ZYW - 2ubsYeSz8vccWhEACgEAAAAAYCMvAIiznl1no0ru3CsGAJACAP385PaGONcJAutPuIwIT3Se8iJ7SOs0 - ESWHncb7HHaauPSI08RLR5wmCeLolz8A8LQA+KrxwunsIeW78vW2YwAAAAAAYFO1/OUDgNs1+ZAgsaQu - cf8BAIwCgH5cxRlVdsL1ja9+cnlj+sm2b/jW1lsNiz+gdtR5ksfRNuPHHW094Z9HnSbm0eKnpV81cgSA - wfKvAwB81XTxT7J/0x8plb5vuxUAYMsfAAAA5AUAIc0vtkbfq0zx7dkisUtcAQBQIwAIJx6e8hMuo388 - 4TJq43GX0ZOPtR3T/Zj7uLbit13Ywy4pcSEdbT3W/gfnCV2POk8Y873T+PXft56wn5Z+IY1QPQ8tfwDA - CADc4/YH/36vknetm9LyzwIA2AAAAICMAEBzP8U32pNdZ6O62iVuJABgUgAIBACBlr/BjBGn4pjLmGwC - wfnjbd88dKzt2M3HXN7c9GPbMX//oe3YjT86v/mXY85jN4nzg/O4/T86jzvzQ5txGTR3v28zXqie1uIY - LH6uAFCH3wJotuhtdiWUVdn79t0JAJUAAFv+AIBCASCO7AAg/vsafUaAGC3+3QCA2QEg0PJn82b1/CiO - 89iHhgAg0OKvHgDA7AC4usl2+svsOiivsvft1gEAbPkDAHgFQE4AoEnz71Gjdyy77BPnRAC4CQAAAAoE - wP2dzRYFs6ugzISNqudp+R8GANgAAACAjACQ4h+bnBoaWqP3sk/s3HsYAAAA1C0ADJZ/bQGgyaJl7Aoo - u7I1ji0JANcBAHH5iwMAAAAyAYBfrJDs22Meu8pGl9S5578AAABAQa8A/HTSqnZ+a0MWlayzC6bFfxcA - EAcAUBYAxJEvAFJ8Y0uTVTX7tcBklabBlc690gAAAEABACj7uuk8F/bUR1WVrbOPBwDEAQCUBQB5vwJA - ABBSfWO/ZtfY6K526RlCALgPAAAAPAPg62aLRrKnPHq00rV2HwEAAAAAIC8AiJPs12MIu8ZGl6jqlQAA - AAC1DwCD5W9GAHzdbOH/sqc6elzCJqtny9bZfQUAAAAAgLwAQJOfFNCnRu9lLr7L3NUuvTcBAAAAbwDY - 0WzhKUX/yt/Tlre6aT1a+KcBAABAGQAQhwsA0D/r8U92jY3ugofmtauq3hcAAACg9gBg5m8BNF9Q8FWL - hU7sKY7+qFvrbG1K19lnAAAAAP8A4OYVAJoeQrJPXA92jY3ukk8fFwJAMQAAAHAAgIqdzedHsac2etpu - rrFtSwDIBgAAAABATgDokZvaJaYlu8ZGl9ilVxwB4D4AAADIGwAL49lTGkmt7B1bT1r+BQAAAIBvAcgE - ADRJvj2+Fb+fz66x0V3t1HssAAAAmB8ABsvflABoPv9T9lRGxnbzHVtfAkAJAAAA4BUAeQCAjUm+8rna - ufd7AAAAYF4AmOUVgJ2K+ohfc1b6jmNo2TsOZQAAAAAAyAQAPj1up/j06MiusNEJVtpnrnTusxkAAABk - A4AWC07ubjHrVfYURqao5F37IAJAMQAAAPAFAHG4BID4A4EXslRxr7ArbHTi/w1a/kcBAABABgC4ur35 - /BbsqYtMWfkah04EgDwAAADAKwCyAIA4/2LXt0Yl+qrrX+nc+ycAAACw4J8ByPim5VxH9pRF5qh0tYM7 - Lf/rAAAAAADIAgBCok/cdHZ9a1SqV++Gl1X9TgMAAIBpAWCKVwDm3djdZJ4be6oic3bzbVvnknccEgEA - AED+ABCHbwAk+cTdS/TrEcqub41K8uzTnBb/JQAAALAgABTtajbXmz1FUW10c51tY1r63wEAAIC8AcD/ - KwAEAHHyL/vEmeTd0C6oNPZXOvVNBAAAANMAwGD5SwdA/s6mc1XsqYlqM0Hr+NLN1Y7/BQAAAADA4gEg - JHXpeSLDX2OS90P/xbdnC1r+5wAAAKAOXwHI+ab5fE/2lER1kSBY/alkjePbBIBKAAAAAAAsGgBCYpde - X4q/2seub4061yG2ES3+YwAAAFDbAKDln76j2cK27KmI6rqS1U49afkXAwAAAABguQDQI6DnJ+za1rhk - laYBLf6jAAAAYDwADJb/UwEgIWVni7mt2VMQWUqEAFcCwAUAAAAAACwXADoEdI6bxq5tjTvrOexVAsAO - AAAAqIVXAE7sw+/5W24FWuf6JatabwUAAAB5AEAcBQKgS8+Kq51792PXtsYJGs2ztPg/AAAAADMCYNsO - a22N39gKmTnx5wJKVzlNKn7b6RYAAABYNgAU+gqAbnrduuLTK5hdW5N02UsTTwCoAAAAAFMCgJb/xoNW - 2ufY0wzJIfFNg2j5nwIAAAC8AmCRABCn7Eon0yLgUqfX+9LyLwcAAAATAOD+ty0S8JG+ck34wPnFm287 - riMAVAIAAABeAbA4AAiJnXsVJXXqbdLfpb7cqZ/nRe9+SQAAAPDHADBY/g8DIH938znd2VMKybmSlW0C - b65ocxEAAAAsCwDiKB4AwlVCQKIqrhO7riYp0XdI/YudNFsBAADgyQB47CsAp3a3mGWSN65CFpKwUfV8 - 8YrWCbT87wAAAIBlAACvADAA0PTMTewS58Guq0kSrKz+dLFj/wRa/BUAAADwNADY03LO55tsp5vkDauQ - BVa4wsmTlv+PAAAAgFcALAkAvYQrnXtlX/Hp05FdVZN1oZMmmpZ/DgAAADwBACV7Ws4eyZ4yiOfE3xQo - Xu6socWfDgAAAHUHALwCYAiAq517i1N0uXPfQHZVTVait6YZAWA7AAAAPAoA+vPEHtvZeGc/pZWltX7l - 5jJnbfGyNrcAAACg9gEgDgDwCADEKb/cqU80u6Ym7aL3gOEEgDIAAACgqaCv/Ndv8tC+wJ4eSIkVaR0d - i5a1+ZyW/30AAADAKwB1DgDhiqr3ncuqPhp2RU3aBW9NO1r+xwEARQPg6l7rhCD2lEDIyqp0WVv34mXO - /6HlXwEAAAAAQJ0CgKbP/auqPuPZ9TRp4ocSXfDSjKXFXwIAKAoA9/ZYz1m/u8WsV9lTAaGHK9Q6eRYv - abuFAFABAAAAAECdAUA/nfqsE9/ul11Pk3bJa6AjLf9vAQBFAODMnlZzOrO/eoSeXPEy5zZF2rbrCQDl - AAAAAADUEQBorqp6fyt++h+7mibvl479h57zHHAdAOASAMX0r6dvsjIPIhHnlWrbNC96y2UJLf88AAAA - MB0AxAEAngYA4lxW9Tt30buvA7uWJu+kKu4VWvpaml8BAC4AULHXZtbn+5rH4xP8UM0TtI4v3dS2HUzL - /wBNJQAAAOAVgNoEQF/hinffnEterwewK2mWfmk/0I6W/+c0lQCAXAEw69Aem9le7K8UIdN2c6F728LF - LquKF7lkAwAAAABQOwC43Ek3dy6r+sWL7/THrqNZOtehfwgB4DAAIB8A7LeZ+ct+21l92F8hQuZN0Fo9 - U7jAJahoket6QkAOAAAAAABmB4B+VP220UJuxK6i2TrTcVAQLf/vAAALBoDtjJR9tjPH4vv8qM4StKHP - 3VzsFkWL/880mQAAAAAAmBEAnfoJlzr1S7zQuZ83u4Jm7aznoDgCwM8AgEUBIPGAzYzhWPzI4ipa5NKx - eL57Ai39gzR3AQAAAAAwOQDE+fVSp9fHsWtn9sRXBM56Dt5BAKgEAOoMACcP0OI/aKV9jv21IGS55c1x - rVcw1y2yYL6btmiu+15a/qUAAAAAAJgEAMIlb/HP13deVPVtxa6c2TvtPrgtAWA9Lf5bAECtAKCCFv+O - fdbTI9hfAULyTPx2QfF8904FCW5vFs5t92HhbPeDBIBCAAAAAACMBID36+LkX+ykGcCuWa10wWNkyzMd - hswlACQCAGYBQNZB2/i399tNacMecoT4rGCOp23B7PaRhXM8xubPbvc2Lf5/0xyjyablXwEAsAEAAIDH - A0C4qJt+/7nk06cJu1a11rkOg1UEgI20+MsBAOMBcMguvuKg3dS9++3jNSdVY59nDy9Cyq5kpkvTvHhP - V1r+AYXTPeLypnUYkje9w1j9tJ9Jiz+BFv98+nNVfnzHhyZ3ymNmUtV4PzwT2Ix7dFT6efO3Q0v/kemi - n1GPmZGG46Of4b8zQ31WZevG78EMNpiBj5n+AY+f1x+doFW0+B+ZEP30ecz0enRCV12P+52JDV1Fy18/ - 6rDfTtRjprs4Eb+diN8OLf7HT+hvJzUk6vETxCagatQPj9/jJ9kvdlWyj+HEPXYSq6ZLr9+dq9XT58Go - fjuXVf1+f7zFeV03BAD9eGni62p5XPDQND7Tbui4Ux5D99Pyvw8APB0A6M/jBx3iZx60mWLLHkqEEEJI - nh13G96EIDD8tPuwHQSAewDAbwBw4aD9VO13tlPxmfwIIYT47KTLoKan2w3T0GwkAGQpFADlBIC939lP - jd/vNMlsb+2MEEIIWWTiRxKfbDfM92e34W/R7KflX8YpAO585zjp+8OOU1d/5zA57IKH9gX2ECCEEELo - YGjoc6dch3U+2W7E1JPub/yXln+aTAFw47DDpB30Vf/co60nBh10HPkSOyJCCCGEnqbTXiMb/txuZPAJ - 95ETCQCfEgB+IADkWwgASo60nvgzLfm/HWk9YcaR1lMijjnhk/cQQgghs3XMeUj9Y65jPAkDPU+4jo4/ - 0Xb0+8ddRv2LILCHAHCalv+1465jyo0EwG1a/Ndpzn3fZtwB+nPTD20mfni0zYTZ3ztNfP1o63Gdj7tN - qvVfsUQIIYTQU/aD7fSXj9hPaERLvPlPLqNai/OD29gOx9qMUf3gPN77J5cJ9M8mtD7sPraV+J876DHx - Nfa/ihBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ - QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ - QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ - QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ - QgghhExVwRTf+sUTOjQqmNjF7saoLq3FyRur6pQ3ppPqxijvjgb/rJX4n8sZ5vkq+19FCCGEkKV1I759 - i/xJnr65EzsOyJ/QMSF3fKePcyd4b84d730ob5z3+dxx3tm54zrdpRFyx7J5UxyVbm6MMZjR4nTWzyjd - /Hrjjc4ZN97ocoZmf87ILv/JeaPL+pw3Ok+/MdKnd+7ILl5FI70asv8qCCGEEDJ1eZO9rW9M7hiVP9lr - Tt7Ejv/Im9TxdN4kr/K8iV5C9UzwEmj5C7T8H8w4cWjhGwcAgQBA00U3BIAHM8JHP8N1U0RzLGeY72fZ - Q30mZw/z75o+OKgR+6+OEEIIoacpa6zqlbwpHbrmT/VckDfZ8+u8KZ55eZM7CtUzqWoMln/dAkA/w3wf - zFBfIXuY77Xsof5f0L+Ozx4S0EUIDX2OHREhhBBCqVrHlwqmtI/Mm9phLS394zR3aQRxaPnrR44A0I2f - kD2EzWC/suxBfgfpT23OkEA/QaN5lj0ECCGEkDIqnuXplDe9w9j86R025U/rcDM/voOgH/3i5xQAD2aQ - vzgFNJuyBgaMzdD427CHBiGEEOKromlejgUz28fnTW9/NH96e4GWv0DLXz/KBIB+BvoLWQP9K7IGBB7N - GuAff21goDV7yBBCCCF5VjTNzbFwpsfc/BkdThXMaC+Io1/+AMAjABCyBgRUzf0sjf/BrP6B47MGhTZl - D2WtdlKlej4zJnRcRmxoQob60QnTT1RYQvqj091wuj+YsMdMaNVEPZiQ35mgqlE/fgLUCakPTWxCqt8f - T3LV+IgT97uTqJte+lE9fi7rps9vx9twXk+4+MTpn3CxY/+E80+cgdVzrsPjZvAfzpmHZmjCGY/Hz6nq - Gf5g3H87J91H/v64ijM64fgfzpu6+dH592bcQ/O9OK0NZ8Jv5sij4/joTPrd+U4c+ynVc8h+8pzv7KeO - Feeg3ZSRB+ym9jpgPy3woONkt8MtpzTTWmmfYdcHIeUmaD1eKJzlEVcwq/2mgpke92l0ix8AMJgnA0DI - 6l81gXdoNl3vHxQhWFn9iT3EtVKmOtQ2Q93tWxqheqLDHkxUmHBNnEhxwvXT3WAiIh5MuH5o8T+YblUT - KaSHsun6YNJCoh5McNVEC2lBbAKrRi2kBagFWvz68RcnRkj1e3hS/GKFFF/D6SEkV42POHG6SaqaLj2r - J1E3vfTTuZdwtXp6V88VlTh9HprLqr7C5U6G00+4VDXe4ryuG1r+bDTCRS+NcOGh6S9c6NhfoOXPZkD1 - /OIpzsCH5pznIOFcB8MZLJytmvbiDBHOPDRDBVr2wumHZphuTrWrmuHV87O7OCMeGlr0wkm3B/OT2xsP - xlWcUcKJR8dltHD8oRmjm2Ntq+bN6vlRHOexD80PzuOEH9o8mO/bjH8wrcWZIBx9dJwmCkcemkm6OexY - NZOr5ztxHKZUzyHdTNWPvX4O2sc/GDvd5By0m3bigN20/xIOVu+3mzbhoO306P2tZjqwa4UQn+XOdm9b - MMtjDc0NGkE34vIHAGoCACFLUz1JWa8HzsvVhLZkD7nZE9GRGRM2npZ/KQAAAAAAfwgAgZb/w2M7Xdiv - n6L9tjO+O2A746MDtjPH7rGb3vmglRa/GYTkXWGCR1DB7HabCmbTV/uz2+kXPwBgDgAIBACaoDuZ/YI+ - z9CEdGB/BWYvPTaidaa62xEAAAAAAIwGAJsZutlno5uyfTYzD+yzmbV0v+1M9a7GU+qzK4eQ5SZorZ4p - THCLK5zT7seCObT0xcVfNQCAuQEgXO9XPUdp4mrj2wOCVvtMZlT4fFr+9wAAAAAAMAkAaGbqZq9+7u21 - nnV4X6tZ8/Zaz/Cu7W/7IfTEhLGq5wsS3N4sTHBPLZzjLhAABACgTgEgXO8rTvCp631DetbG/8PIUHfr - mhEdngUAAAAAgMkBIBAAqme39azsvdaz/2eP7eyYk1Zjn2dXEKHaTfyKv2BuO03BXPertPwF3QAAlgQA - /fQJPpvZJ0jD/trMVrY6uFlGdNhuAAAAAADMB4A9upmtn1azC/e0mvU5oSAOGEC1kvgVJS39AYVz210q - nEsLXxwAwJIBoJ9ewUczegeFsr9GsyS+k+G1qPClBIAKAAAAAADMDgDd7NbNnBu7rWe/8431HFd2HREy - bcVz3VSF89yO0ugXPwAgHwD0rpquO671DmvD/krNUkb3bjG0/G8CAAAAAFAbAJhjOJW7W845RH8OOeio - fYldSYSML2+Oq3XhfLeNtPgrdMsfAJAxAEKEzF4hd6/3CllfoPY1208YX4uMbE8ASAUAAAAAwNwAeAQB - LecI37ZMECd/d4uEZfuaz2/BriVCT5/4A360+OcVzXcrpT/1ix8A4AEAuiEEZNOfw9lft8nLDA9vQov/ - OwAAAAAA6gQAVXPn25ZzP6c/PdjVROjJFc1v61W0wPUkjUAAEAAA/gCgm566OZQZE+TC/upNWqJa/WJ6 - 9/B/AAAAAABgLgAYLP/HA0D4tsVc4ZsWcytptn3bPKEju54IPVzGdNuXCxe6rqLFf1+3/AEABQCgq5AZ - 1/VWRlxIgjk+klj8wdGMiLC3AAAAAAAwBwD+8BWAKgBUDUFg/qZdLee1Y1cUISur4oWuYUULXVNo9Isf - AFASAKrmRHavYLP8P4aMiIjJtPwrAAAAAAAwJQAMlv/TAYBmnrCrxbyKr5vP/cfuFgud2BVFSkz8Xn/R - Yhdt0UKXCt3yBwCUDAAhs0fXXzN6hMab402ECAGDCQB3AQAAAAAwFQAkvwJQBQBhV3Pd3Pm6xbz1uxpr - 8bbDSitf6+JGC//nokUutPjFAQAAAHFChYweXXenRQW3Yk8Vk5UeHt6Dlv8tAAAAAAAsAgA088XJ2tli - wdhNVqb/NiCywAoXtR1ftMi1XLf8AQAA4BEA6CY2NCcjJjSaPWVMVkZERCgB4CYAAAAAAHX2LYBHASB8 - rZ9j3zSf78muKuItQev4UtHitn8tWswWPwAAAPw+AISM2NBKmlXih/+wp5BJygwP908PiygBAAAAAKAm - ADDZKwBVABC+brbg3q5mC1fhzYQ4q1Db2r74LeefCAACAAAAPCUA9BMTuisjKqoxeyqZpPSIiCBa/mUA - AAAAAFgUAKomaVeThWHsuiI5d3Oxi7pY61JY/Ja4/AEAAEAqALqJk34tOrwLe0qZpGth3SMJAL8CAAAA - AGAMAAyWv+kBIOxstqByZ7NF7+HVABlXvMQ5gRZ/hbj8AQAAoAYAEDLU3cozorv1ZU8tk3StW0QULf/b - AAAAAABY1CsAIgBoFgo7my+6sKP5IryJkJwSNlk9S1/1f1ys1S9+AAAAMAEAxKnMiAnTsqeZSUrrFtGP - AHAfAAAAAAALBIA4TRfe2tFk0WRz/IowMnG5Wo/XirRtduqWPwAAAJgWAPqJDvuzEBr6HHvK1bj0sIgp - AAAAAABIAYDB8jc/ANgs2ob3DbDgCrTOtsVLnM8Ua531yx8AAADMAwD6M2xHTmTkq+ypV+OuhXV/FwAA - AACApwVArb4CoJsdull0dWcjbXt2bZGlVKR1c6Tln0RDix8AAACqlr84ZgCAfk6Y6jcExJcXafn/AwAA - AAAAiwaAOKVfNVvUn11dVNeVaF3cipc6Z+qWPwAAANQeAISMqLBT2ergZuypWKNSQ0NfIgAcBgAAAADA - ogEgTuWOJovexs8F1HEFS509ipa2ySIA6Jc/AAAAmB0A4lQDQJxLGWFhNuwpWaPEVxRo8ScBAAAAAPAk - ABgs/7oBgEAAEL5q+tZ/8auCddTN5U4+xUvbFOqWPwAAANTNKwDCNXEiwxKzIiLs2VOzRqWFRLjT8i8B - AAAAAMBiXwHQA6DJYnF+3NJC25xdX1QbFa5w8ry5zLmAAKBf/gAAAFC3AKCJSEyLijLJBwldC4kcQACo - BAAAAADA4gEgztXtzbTO7Poic1aysrXLzWVtsmlo8QMAAEBtA0CcxwEgXPzzl8zw8CbsqVqjCAHvAAAA - AAAgCwCIk7O9kRYfKGTOipc5t6HFf11c/gAAAFA3APi9VwBEAIQL6d3DT6fHBjViT1mjEzSaZ9NDor4F - AAAAAEAWABC2N9EWbmuyyJddYWTKxN/zv7m8TWrV8gcAAABLBMC17uKEHc2Ki3uFPXWNLjFY3YyW/3UA - AAAAAAwBYLD8LQoAbwnbG2uLtzXWBrArjExR3mrXejeXtz5NAKhe/gAAAFA3ABDnjwAQLmREhO8Qv4pn - T2GjSw+NiiAAVAAAAAAAUAUAS30FQASADgFl2xtqQ9gVRjVJfG9/Wv5f0QgAAAAgj1cAqqb7WvY0rlFp - IdHvAAAAAAAgFwDo5ubWJlofdoWRsd1c0fpj/fIHAAAAmQEgIkLIiIiYwp7KRndSpXo+PTjqOAAAAAAA - sgEAjbZoe8Ol3uwaI6mVrGwzhwDAlj8AAADIDwA099PDw3uwp7TRZYRGORMASgAAAAAAMFj+lg0A+mfa - 3C1Nlrmza4yetuIVTt1p+d8HAAAAywKAOJIAIE4pIaAde2obXWpI9DgAAAAAAGTzCoCwTZxG2vTtTbXW - 7BqjP6robUfHmyud8nXLHwAAACwKAJJfAdBNenjE5US1ukYfJyq+9zgBYC8AAAAAALICgLC1kfbnTc20 - r7GrjH4vYZ3tyzdXtv6ZRr/8AQAAgAMAXAvXzbaafoBIWkikEy3/MgAAAAAA5AMAcbY3WrLroJX2OXaV - 0eOir/z/TiMAAAAAhwAQ0rpFzmZPdaNLD46aAwAAAPgZAHkBYFujJYQA7UZ2jdGjFb/tOF6//AEAAMBS - ASCO8QBID+t+71p4VDB7yhuVEBr6HAHgZwAAAAAA5AUAcbY2WjKBXWVUVelqB/ebbzuVAwAAgGUDoGav - ABAAhPRu3a+lB8XW6O2CUwNivGj53wMAAADlAUCe3wIwAMCdLY2X+rOrjISNqudL3nY6QQBgyx8AAAA4 - BoB+NrGnv9HR8v8IAAAAAADZAUD8Mxu/GcCi5b+GRgAAAAAFAUBIC40cwq6AUYmvIhAA8gEAAAAAkBcA - dNNwyfcbrTY+z66zMit92yGMln8FAAAAyAMA4pgGAOnduhenhkY7sqtgVOkB6ikAAACgLAAYLH9ZA2Cp - sK3B0rfZVVZeWVrrV0pWOSaJyx8AAADkAQDTvQJAABBnf01+NVD8wKHUIPU5AAAAAADkBwCaii0NloWx - 66ysaPmvo9EtfwDArAC4fWNcp3Ra/qdodhMANtHy33TjTdVnN8Z03pgzpvNf6V9vujG605e5ozsfpH92 - jpb/dZr7AIDZAUATNZxdCaOi5R8GAAAAygEAL98C0AFAnIxN9bWN2XVWRjdXO/nQ8r8PAJgOALkTvPLz - JnjvvTHBe23ueK+RN8Z7BeaP72hj7FeYwljV8zdGdWmd84ZPGAFgQs5In09p+X9PUwYAmBIAkflJkZHN - 2cNuVGn+6l0AAAAAAMgSAPTvl/2HXWX+0/3U/2rHs7rlDwDUAAAds3Mnef09d0LHN/Inq9zYw2v2BG3o - c1nDfDrnDPeNJwRspeVfohwAiGNyAAjXukb+kz28RnUtMKYzLf9KAAAAAADkB4AtOgQsHcquM9/R8p9H - o1/+AIAkAORP7ngud1LHhblTOnrX9G1lTZX4SkH2SL/QnGF+624M880AAKQDID2UENAtIoo9pEZFy38r - AAAA8A8Ag+XPEQBo8re8pq3RK4EWX/lqO+uS1Q6lAIAkAFzPn9RxWf7EThb/sZKC1uqZGyP8AgkAGwkA - JfgWwNMDgOaS+Nn/7KGUXFJAbHsCQAUAAAAAALIEgLC1wbIavRJo8dHC/1/d8gcAngYAB/KnduglvuTO - Hj5ZlasJfS1nqN8YWv7nAICnAoCQHtI9nj18RkUA+DcAAADgWwDyBMCWhsvoP7M8jl1nvtL94N9qx0oA - 4IkAqKTFv6NgWgdu3ipS/FZF1hDfyKzBfnsAgD8AQNfIwqzQ0KbsoZNcSmC0KwHgPgAAAAAA8gTA1gbL - 0rn76GBBsPpTyTsOR6qXPwDwKAAqaPnvyJvevjN7yLgsZ4ivHwFgBwDwuwAQ0rpGfsweLqNK81d/AQAA - AACAPAGwpYE4nL1BUOkaxwElawyWPwDwAADxngcKpni0Yw+VIroxyLd79qCAKwDAbwFAcy8tJMLon/dI - DojuAgAAAACAnAGw7M6X9Ze1ZVda3gmbrJ4tWeNwEQD4DQCyafkPt5Sf5q/txN8eyBnsH08AKJUPAMQx - OwDEf12j3wsmABwGAAAAPgFgsPz5BYDwZYNlm9l1lne07EcQAAQAoBoAFQXTPTYWJqgasIdI0WUO8bUl - AHwBABgAoGtkZUpQVEf2EEkuxU8dBwAAAACAfAGwWffniu7sSssz3Zv+rHFIAgAYAGa2v5w3zbMTe3iQ - QVkDAvvS8i+wbACw5W9+AAhpIZFb2EMjOcFK+wwt/UsAAAAAAMgXAF82WH5aS3eZXWv5VfKO/Zv65Q8A - 0HyJr/qf3PWBIXYEgaMAgAiAqMprXaO7sIdGcqn+MeMAAACAPwAo4mcAdADY3GA5IWBFf3al5ZWgtXqu - 5F2HVADA41bB9Paj2cOC/iDxZwNo+b9LU6lwAAipIVHb2cMiuQuhoa/R4i8BAAAAAEC+AKC5sslq07Ps - Wsun0nccB5a8U7X8FQqAWR4XC2e5t2cPCZJQzgD/HgSAAiUDgKZC/N1+9pBILs0v9jMAAAAAAGQNAGFL - /eVD2JWWT2Xv2h9XMgDyZ3kcwkv+NetGv6DW2ZrARAUDQEgNid7IHg7JJfvEdAYAAAAAQN4AoLl60Eor - n3eEpa/+Q0vF5a9QABTO8tiWMd3/ZfZwoBqUqwltScv/tGUAQJzaBQDN7dTQmJbs4ZBcqp/6ZwAAAOAH - AAbLXzkAEL6sv0I+nxZY9q7DDsUCYKbH3+T6/v2WWmrv0IYEgMMKBYD4KoCWPRSSo+U/HgAAAAAAmQOg - 3vKzgpVg+e8ZU7LWxoWWf4UyAeCxjD0MyMRlaPxfJgBsU9q3AHQTHJWbqFa/yB4KSSX6qusTAH4FAAAA - AEDGAKi/XPiiwYpwdq0tt7J37deIy19xAJjjvpQ9BMhMCRrNswSALQoEgJAaEjmAPQySIwBsBgAAAPwM - gHwBsJkA8GX9FbvYlbbMBK3HC6Xv2t9QIACM/kEtJC3xlQBa+keUBgCafewhkFyKX0x/AAAAAABkDwDh - y0YrPNm1trxK19prCAC65a8UANBsx/f8a7dkTUQDWv5nFAaAyozQKGf2EEgqSxX3CgGgFAAAAAAAmQOg - /opP2LW2vGj571EWADwOpWodX2LHR7VYhsbfhgCQpiAACOnB0SvZ8SWX6tfjnwAAAAAAyB4AxTusta+w - a205Fb3n6EjLv0JBALhYmNAav+dfh2VrgtsRAEpqDwDi1B0A0oKjs4RQ415tSvHrEQcAAAAAgOwBIHxZ - b+UIdq0tp5K19vN0y18ZAPi1KMHD6E9rQ6Yrs19gfwUBQEgPiopgR5eU+FsEtPjLAAAAAACQNwA2119x - hF1ry4kW/2mlAKBgjjve29+Cut4v+DOlACAtKOozdmzJ0eLfBgAAAACAzF8BoNny2jJ3dq3rPt3v/q9l - y593AMxx/w87NrKQUkeGvnS9X8hp8wOALf86BUB04QUPzQvs6JJK9Y0dCwAAAACA/AGwud7yFexa132l - ax0WKQEABXPdrxZoneuzYyMLKqNfSFta/iUKAICQGhQVzY4tqWuBPa1p+VcCAAAAACBvANAks2td99Hy - P6cAANwvnu/eiR0ZWWC08EcrAQBpQeq/siNLLsU35iwAAADIFwAGy1/ZAKB/vqLu91HxGrs2uuXPOQAK - 5rqtZ0dGFppgZfUnAsB+/gEQnSe+KyI7tqRSfWNWAgAAAADAAQDqrVjFrnXdVbrWYZICAJCNX/mTRxk9 - Q51p+d/iHABCalCMLzuypJJ81GEAAAAAAMgfADQpdf4BQWXr7HdyD4AEt8HsuEgGZfUOXso7ANIDot9i - x5VUhr/mZQLAHQAAAAAAZA+Aun1rYOED5xdp8ZdyDYD5bt+JLy2zIyMZpPu8gN7B6aYHgDiWAYC0wOgf - 2XElRwD4AQAAAOQJgEcQoHAAbK63cg671rVf2Tq7yOrlzycAKgrmebRjx0UyKrNPyAjOAXA/KzSuKTuu - pJJ9YlcBAAAAACB/AHxRb+V+dq1rv5L37NbyDQD3/7KjIpklvmVuZu+QZI4BIKQGRA9kx5UUASAWAAAA - AAD5A4Dmzvamq+uxq127layz+4lnAODX/uRdVu+uY3kGQFpA9MfsqJJKVkU0IADcBwAAAABA9gAQvqi3 - vBe72rWXsNH6ldJ1dnc5BsAOdlQk006OVT1Piz/ddABgy99SABAYfYYdVXKpvj3OAwAAAAAgfwB8WX/l - h+xa116la226EQAeLH/uAOAayI6KZFxGz5B4jgFQIX41z44qqRTfuH8AAAAAAMADAJafYte69ipda7eA - VwAUzHOrux+sQCYtK071Ci3/G5wCQEj1j45iR5VUim/sTAAAAAAAeADAivu1/nMAJevsvuEVAPRn7X9P - BZmtzF7BK7gFQKB6CTumpGjJhwEAAAAAwAUAhC8arAhnV7t2ouWfxykArgva0OfYMREH5cSFOBEAKngE - AM037JiSSg+KbUTLvxIAAAAAAPkD4Mv6Kxezq23+ylfbWeuWP48AWOC+jB0TcVRmr+C9fAJAncmOKDla - /mkAAAAgLwAYLH8AoHq+qL/cqC8EjKr8PVs1rwDIX9jWnR0TcVRm7+CRnAJAMPoNgXzjdgIAAAAAwAMA - Vlxn19r8lay1T+AUAGfZERFnpfYObUgAuM0jAFKDokPZMSVFy/99AAAAAADkDwBxNr22shm72uatZJ39 - PzgFwEJ2RMRhtPx38AiA9IDoqeyIkkryi50CAAAAAAAfAPii4TKjvhCQHC3+M1wCYJGzNzsi4rDMXiHj - eARAWkD0n9kRJZXkHxMNAAAAAAAfANhcf8UUdrXNW9k6uzLeAFC8wDUbn/rHd9d7hdjVDADiWCAA/NUH - 2RElleTf0xkAAAAAAD4A8GW95Z+xq22+St9p07x6+XP1CoDL39kREccRAC5xB4AAdRo7nqQOhoY+l+wb - dxcAAAAAAB4AsOIAu9rm6+b7tr5cAmCh6xvsiIjjMuNCP+UQAPdPqlTPsyNKKsW3RzIAAADIBwCPIAAA - MJxUdq3NFy39gTwCoGSemws7IuI4WvrDOAQA/ecindgRJUXL/3sAAAAAALgAwL2DVlrzvoldyfsGvwLI - DwDy8P1/ZZQeG9SaSwAEqMPYESWV7Bu3GQAAAAAALgAgbG643IFdbfNU+r7dBv4A4LaXHQ9xngg9WvxF - 3AHAXz2KHVFSyb6xHwMAAAAAwAcAzP6rgKXv2W3mDgALXd5lx0MKiBb/Ed4AkOofPZcdT1LJvnGLAQAA - AADg5BWA+iuHsattnggAh7gDwHy3kex4SAFl9gzZwN0rAIHqd9jxJJXkGzsWAAAAAABeALB8Grva5okA - cJ43ABTOcw1kx0MKiJb+DO5eAQhQ/5UdT1KJvnG9AAAAAADgAwBf1F9u3g+zIwDk8AaA/AUuNux4SAFl - 9OjahzsA+Ku/YseTVHKXHuEAAAAAAPABAJpP2NU2fYJg9ScCwF3OAHBb0Fo9w46IFFBmTKiXcQBgy98y - XwH4gR1PUql+Mb4AAAAAAHADgP+yq2368lY3rUcAeLD8+QBAOjseUkg3eoa34A8AMZfY8SSV2CXOAwAA - AAAAXgCw0ny/0Vb6QctmHALgJDseUkhCaOhztPwrOXsFwKh3AUv16+0IAAAAAAA3rwB8z6626bu1ztaG - NwAULnTdzY6HFBQtf/17AfADgOvsaJJKDFY3AwAAAACADwBsrr/CfF/QFn/o4MThKwBfsOMhBUXLP40z - AOSzo0kqw1/zMgAAAAAAnLwC0GDFL+xqm76Sdx3dOATA/7HjIQVFy/8qZwAoYUeTVKJa/SIAAAAAAJwA - oP6KK+xqm76y9209OQSAUb8/jeQdLf9fOAPAHXY0SaWGhr4EAAAAAAA3ADDfJwKWr3Xw5g4AC1z/zI6H - FBQt/1OcAaCCHU1S+BYAAAAAcASAeisy2NU2fWXrbDvwBwCXv7HjIQV1Pa7rec4AcJsdTVJZqrhXAAAA - AADg5hWAFHa1TV/JWhsX3gBQvNDlX+x4SEHR8k/kDAA32dEkleMZ+SoAAAAAANwAwKj3A3mqit5zdOTv - ZwBcNrPjIQVFy/8aTwCgyWNHk9SFUM1rAAAAAABwAoB6y8+wq236yj+0s+bwZwAOsOMhBUXLv4yzVwAy - 2dEkdcmnTxMAAAAAALh5BeAEu9qmr+Rd66b8vQLgeo4dDykk8SffdcufLwAks+NJCu8ECAAAAPwAYHP9 - FUfY1TZ9wkbrVzgEgFHvoIbkW0aPMBsOAXCeHU9Syf4xHQAAAAAA4OUVgOVfs6ttnggAtzgDwH1hrOp5 - djykgDLjQv2MA4A4FguAQ+x4kkryjw0AAAAAAIAbAHzOrrZ5IgBkcAYAoXiuS2t2PKSArsd1HcQdAPxj - jPph1lSf2CgAAAAAAHgBwIp17Gqbp9L37E9zB4CFrmHseEgBZfbsOo83ANB8xo4nqWTfuH4AAAAAAHAC - gAYrFrCrbZ5K19nu4w0AhQtcJrLjIQVEi/9z/l4BiF7JjiepFL+4MQAAAAAA8AKAlRPY1TZPpe/Z/Yc3 - ABQvcN3AjocUUGbPrqc5fAVgJjuepJJ8YxcBAAAAAMALAJb3Y1fbPJWus13PGwCKFrh+z46HOE8IDX2O - Fv+vvAEgJSB6KDuipJL9emwAAAAAAIAbAHRmV9s8lb1nP41DAJQJ2tDn2BERx2X2DvWqXv4cASDdTx3I - jiipJN8e2wEAAAAA4AMAW+qtbMKutnkqec+uN4cAEL8NYF45IYsoI67rFB4BcC2wuzU7oqSS/XqcAAAA - AACACwCUsGttvsres/HiEQD0Zzw7IuK4zLjQ/3AIgF8FK+0z7IiSSvbtkQkAAAAAAAcAaLDS/O9qW7iq - dQMuATDfdSs7IuI0wcrqT9d7ds3mEABX2BEldTA09DkCwD0AAACQDwAMlj8A8NB8UX/Fdna1zVvpe3aF - 3AFggWuJoPV4gR0RcVhWXHCnzJ4Gy18yANjytzAApAeov2VHlFSSf09nAgAtfgAAAAAAZA+ABstXs6tt - 3krX2f/AIQDoX7uFsiMiDsvsFbKARwCkBqjfZ0eUFC3/GAAAAAAA+AAAjVG/CSS50nW2G7kEwHy3deyI - iMMy40KO8wiAtMCYMeyIkkr2jZ0GAAAAAAAnAGi0wpNdbfNW+p7dJD4B4JohaK2M+mEqZNnlxIU4ZfYM - qeQRANcCoruwY0qKAPAxAAAAAABcAODuJitt7XwLu2SdXTCXAKApnOdq1O9TI8suo1dIAgFA4BAAFTmR - ka+yY0qKlv9eAAAAAAA4AECDFb+wa23+it5zbEjLv5JLAMx3+5QdE3HU9V5dz/MIgNQA9VV2RMnR8r8G - AAAAAAAXrwD8g13r2qlknW0ajwAomu9Wkqv1eI0dE3HQ9Z7BgZm9xOXP4ysAxn0McKZPnya65Q8AAACy - AsAjCAAA9NNg+Xh2tWsnWv7/5RQAQsF8d6N+qApZZpm9Q/7OLwCiZ7NjSirVJzYKAAAAAAA+ALDp1aUd - 2NWunWjhT+UVAIXz3X4R3zSGHRXJuMy+oba0/G9zC4CAaH92VEml+MTOBwAAAACACwAUa418J1CjK3/X - XsUxAISCuW6R7KhIxtFX/+/rlj+fALidqFa/yI4qqVTfuM0AAAAAAHABgF3sWtdegtbqOQJAKa8AKJrn - tocdFcm0nD4BzWnxl3MMgCPsqJJL8e2RBgAAAAAABwBosGIBu9a1W+k62/28AqBwHiEgwT2EHRXJsOt9 - QlZVL3+TAEAcywFAemD02+yokrqiimtKANAvfwAAAAAAZA6A5XXzSbYEgMU8A6Bgntt+dlQks9Jjgxpd - 7x1yk2cApAWq1ey4kkr1jekFAAAAAAAXAMit9e//V3Vzna0PzwDQIQA/CyDLxK/+CQAPlj9/APg1SxX3 - CjuupJJ9Y98DAAAAAIAHACz/nF3r2k9821xa/Dc4B8BVYYqzUT9oheqmzD5BLtd7B9/mGQDpQdFGfQKg - WIpv7BkAAAAAAOQPgM31Vwxm17puKl1r90+eAaCbue5180MWyKho+e+nEUwPALb8LQIAUfHsuJLK8I9q - TACoAAAAAHkCwGD5AwD3/1VP25Rd7bqpbK39UAUA4FbxXJfW7MjIgsvqGzJYv/z5BkBKYLQrO7Kk0nx6 - 9CEACAAAAAAAyBsAX9RbWfc/o1b6QctmtPwrOAcATbuv2JGRhVag9q2f1Sc4SwEASGFHlhwt/vUAAAAA - AHAAgAYrx7FrXbeVrrM7yD8A3MX3BujLjowssKy+wZ9c71O1/DkGQHD0O+zIkqPlfwkAAAAAANkD4N6m - 11Y2Y9e6bitdazdBCQCgKSye5erEjo0sqOv9guJo+VcqAQDXAmOM+r3fJP+ezvrlDwAAAHIFwCMIUCwA - lu9m17ruY98GuKcAAIhvDnRc0Hq8wI6OLKAsTZD99b7BBbrlzz8Ako39nApa/LMAAAAAAJA/AL6ot8Ky - PrCOFv9eJQCgMEEcN6NfgkWm7eRY1fO0/H+g0S9/swJAnLoFQHpw9Ep2dMnR4j8CAAAAAIDMAdBgxa2t - DbUN2bW2jErW2r+pHAC4VxYltOvFjo7qsOv9gtbrlr9CAJAaEOPFji6pTJ8+TWjx3wcAAAAAQN4AoH// - V3atLaeb62wb0/L/VSEAEArnuBfkzXNzYcdHdVBWv+Ch1/sGVSoIAOfZ0SWX6hcz8sHyBwAAAABArgD4 - ot7yAHatLSta/v+nIADQtMsomNHejh0f1WKZrweH01f/twkA+uVfKwBgy7+OAJAarJ7Gji+5FL+YrwAA - AAAAkD0ALrArbXmVrrPtqjAACAVz2v1SPLdDI/YQoFoou29AF1r+pTS0+BUDgDuJwWqjfu1H9+l/frF3 - AAAAAACQPQCms2ttmZW+Y39RYQAQCma3+zFnluer7CFAZixD4+98/fWgHN3yVxYA/sUeAsml+cZMIgAY - LH8AAAAAAGQIgBKL++G/R6OlP1uBABAKZ7fbJmhDn2MPAzJDmX19bbP6BaZWL38lASAkMow9DJJL9VX/ - AAAAAACAvAHwRYMV77Irbbnp3hPgHYdflQYA3czx2JmlVRn1Ea3oyWX183fLej0wLet1g+WvHABcMfZ3 - /68FqNuk+sVUAgAAAB8AMFj+CgLAl/WX39vUaJU9u9aWHS3/zxQJAHFmehwvmelSt5/QxFnZAwK6ZGkC - cwkAQt0CQJzaB0BqSLTR7/lNy/8tGgEAAAAAAPkCYHP95f/HrrTlV7LayZUAUKFIAMzyEOdiYYKHPLRm - 4Yk/7U/Lv4SGlr8iAZCb4a95mT0ckhKstM/Q8k8CAAAAfgCgyG8BVH7ZcKk3u9byqOwdx68UDABxrhXM - 9GjHHg5kRFmaoGG0+O/qlr9FAIAt/1oEAH31r2UPh+TSfKNjxOUPAAAAAICcAbBiK7vS8ql0jWNXhQNA - /HZASeHMdkPYQ4KeskS1+sWs/gHrs/qzxa9cAPyaEh7egj0skkv1i/0aAAAAAABZA6CS/mcd2ZWWVyXv - 2h9XOAD0M6PDZxnT/Y16GVdpib/mR8v/ZxpB8QAIjvqEPSySYz/8VwEAAAAAgKwB8B92peXXzTWO0QCA - CID24lwsnOXZnj006DFlDfTvkzUgoEi//BUPgNtJIZFGv8skLfx3q5Y/AAAAAACyBMD9La8tc2dXWp7R - 8j8KAOgAIE5pwfT2o439lS5eSx8c1ChrYMBntPwF3QAA9NV/9Afs4ZGc+EODtPQLAAAAgD8AGCx//gFg - eR/6I7XSdxzCAIBqAAj50+nP6R6H8+I9XdlDpNhECGUP8B9OX/nnVC9/iwaAOLUCgF8zwnrYsIdJcqkB - sWMNlz8AAAAAALIDQMnmV1a0Ylda3hEADgAADwCgnw638qZ1WKrUtxDOGeLfIXuQ/+Hsgf4CAeDB8rdo - ANTOKwDXQrsb/Y5fgkbzbKp/zFUAAADgEwDK+BYATQK70vKvZJVDAAGgEgB4CABC/jTdZORP9RyhlLcR - zhzu0yR7UMBaWv53aQQA4DcAuJlt5If+iKUERA8lADy0/AEAAAAAkBMAlif/zUr7ErvSfHRzteO/AYDH - AkDIj+8gFMR3SM6L7/CmoPV4gT1kXJU6MrRh9mD/pdmD/Up0i79qAICHAJDWNXI2e8gkp3vjH3/1eQAA - AAAAZAyAhsv6sivNT7dWO9vS4i8DAB4PAP14CvlTPXPyp3RIyBrLx2cK5I7s0jJ7qJ82Z7BvES1/QTcA - wO8BIEl8DwT20EkuzT+6DwFAAAAAAABAngDY2mDZ1+w689fN1Y5aAOAPAaCfeM8b+ZM9l+dM9nRiD59s - ErRWz9wY7hdBi/+/2UP87tLoFz8A8EQAXOsW1Ys9hEaVGqA+AQAAAPghQNkCoGRb4+VG/+qvxZeltX6l - ZLVDBgDwFACgyZuim4q8yZ57c6d4jSya5mXRnwWdPcS3XfYw3yU5Q32Ts4f6CgQAQbf8AYCnAcBe9jAa - VUqQOo4AQMsfAAAAAAA5AmBro6WT2XXmt9JVTv0BAEkAEPImd6yaO3mTOu7Im9hxXNEkbwf2kNZZ4k+c - 3xjROTBnhM/ynOG+53KG+Qq60S1/HgEgjhkA0DXyTnq42ujPjdD95H+A+jwAAADwDwA+vwWwudHSY5us - Nj3LrjTflaxx/AoAMAoAAgGAjZdAELiUN9H70/xJ3sNujFW1YQ+v2UodGfrSjeE+/jdG+M7KGemzjf51 - Yc5wH0E3VcufawCY6RWArt2XsIfYqNL81aN0yx8AAAAAADkCoHxLE5m/45+UdD8QuMrxJgBQUwAYzAQv - IXeCd3HuBK8jeRO8N+SN7zT9xvhOfXLf9PK6Mca3xdP+mmHOMM9Xs0Z7O+SO7BR8Y1Tn4TdG+Whz3ujy - 35w3Ol/MGdHlXs7ILgJ9xa+fquUPABgPgLDIizX5wb/U0NCX0gPU1wAAAAAAkCkAGi0dz66zcipd7TAR - ADA5AITc8QYzTpxO+hmrmyKa5NyxquTcN1Wnb4xRnaQ5T5OcO1p17caYzrdujO4s0OLXzxvidNGNbvFX - DQBgKgBUpIdGBLErYVSpQdFz06qWPwAAAAAA8gJAg6W7BCtBeW8NL/6keMkqhyMAQK0CQMh9UxyVbmjx - P5jR4tDCBwBqDQBp3SI+ZtfBqDJ9wpukBaqLAAAAQDkAMFj+8gdA1qbXVhr9pl+yr3iNXRta/iUAAAAg - DwCIYzIAJCeq1fXZVTCq9ED1BgKAAAAAAACA7ABQsaXBku7sKiu3kpVOowEAAEAeADDZKwD30sLD/dkV - MKprgTGd0wKj7wMAAICyAMDHtwC2NFq2gF1lRMv/PwAAAKAUAKR1676IPfWNSnzL3/Sg6OMEAAEAAAAA - ANkB4Cst3WF2nVGR1rEhASAdAAAAFACAo+Lv7bOnvlGlBUZN1i9/AAAAAABkBoDErQ21Fv2GbnVS0QqH - brT87wMAAIDlAkCcGgGgMDU02pE95Y0qxTe8RVpQVBEAAAAoEwAGy19+ACjd1mhpB3aV0aMVv+2YAAAA - AJy+AlCR1q17DHuqG11acPT/pQVVLX8AAAAAAGQCgHv0Z43vP9cJgtWfSlY6bQIAAADeAJAR3n0xe5ob - XWpwVC/d8gcAAAB8C0BWANiuhPf5N0W5Wo/XCAAXAAAAgBcAZIRH7BC0Nfuhn8RgdbO0IHUOAAAAAACy - A8Aado3R01S62sGdln8JAAAAWBYAxJEMgKT0oNhG7KltdGnBUVvTgtnyBwAAAHwLQBYA2N5I+1/8xL8R - 3VzRRk0AuAcAAACWAwDJrwDczIiIqPEP/aQGR48kAAgAAAAAAMgKALt3WX1g9Od8KL6SFU5jAAAAQKYA - uJvevXs4eyobXUZYDxta/oUAAAAAAMjqWwBHd7d451V2jZGxFS9v8w4AAABYBgDEeSoAVKaHh49gT2Gj - E98vgBb/Qf3yBwAAAABAJgD4cXvT1fXYNUY1SfzNAALAvwAAAEAuAMiICHuLPX1rFC39FWkhVcsfAAAA - AADLB4D2xM4Gc2v8Mz/IIGGd7csly9scAAAAAEv/FkBGRPhGwcqqxh/vSQs/lpZ/BQAAAAAAhgAwWP4W - BwDt4V2NtTX6gC/0O2VprV+hxX8YAAAALBUA6RHh/1fTX/cTSw6KsKfFn69b/gAAAAAAyOAVAO2BTc20 - r7ErjMxR4arWDWj5nwQAAIC6AYA4vwuAbUJo6HPsqWp0iWr1i+ldI3+qXv4AAAAAAFg0ALY3Wbxll/MU - /LR/bVSidWl6c2mbCwAAAFD7APjdVwD2poaGvsSeojUqPaT7BgLAg+UPAAAAAIAFA+CtjzdZ1ezDvZDE - ylc4tCIEnAcAAIA6B0BU+LdZcXGvsKdmjUrvGvWmuPwBAAAAALB4AFRub7pYy64uqu2K37ZvRMv/GAAA - ANQeAMQxAEB02Fem+so/IzQqmhb/PQAAAAAAngQAg+VfdwC4vb3pooHs6qK6SvyZgKKlzkcBAACgDl4B - +NdJlep59lSsURnh0Z7poZElVcsfAAAAAACLfQUg8+smi3zZ1UV1Xc47nq8WL2m7DwAAAGoLANeiu31q - ip/2F6PF3upa18h0AkD18gcAAAAAwCIBcPjrZtqW7OoiS0nQerxQpHX+BwAAAJgZAJU0WlP8nr9Yhr// - y2ndIo/plj8AAAAAAE8BAIPlX4sA+Krpoo0nrcaa5BU/ZIbEdwwkBGgBAADATAC4k6nuNpw93WrcBY3m - BVr+36R3Y8sfAAAAAICnAECtvwJQ/FWzRf3ZtUWWXpG27UgCwF0AAAAwIQCKMmPDu7GnWI0T3+M/vVv3 - /9IIAAAAAABYLACObW+mdWbXFsml4iVtuxdrXQoBAADABABISleHt2NPrRonfvvgWrfuf9EvfwAAAAAA - pAHAYPmbDwD3aFbhJX8ZV6htbV+sbXsCAAAAjAdA6K702CCTfbCHuPzTwiI/SQ+rWv4AAAAAAFjYKwCJ - O5ov8mdXFsk5Qev4EgHgfwAAAEAiACoz1GGrTPWT/lWlh0es0S1/AAAAAAAsDQD3aN7eZDv9ZXZdES8V - L3IZSwC4AwAAAH8MgK43M3p07cOeOiZJ/Mr/oeUPAAAAAICRADBY/qYDwOmvmy7ozK4r4rGbi1y60OK/ - AgAAAE8AwLFr6rA27CljksRXEa6Fd//0WnjEg+UPAAAAAICRADDpKwDFO1ssmIb38ldIGdNtXy5a5Loe - AAAAHgHAvetxoatM9c5+VYk/7X+te/e/i8sfAAAAAACLAUDFN80XfL69+fwW7KoiJVW0sG1fAkA+AAAA - EADSsuJCg9hTw2SJv+d/LSJiM41u+QMAAAAAYAoAGCx/YwDQbN7Br5vN92LXFCm1Aq2zLSFgBwCgWABU - 0r/fUKD2rc+eEiYrr2dgPVr8e3XLHwAAAAAAEwLAyFcAms/7+esW83qwK4qQvsIFbnG0+DMBAEUBIDEz - LiSMPQVM2rXu3a2vRYT/XL38AQAAAACoSwBc+KblXI2p3r4bcViR1rFh4QKXjQSASgCAawDcvd4rdJWp - PsL30Wj5d77WPTyL5sHyBwAAAADAhAAwWP5PAMC3LRJO72oxd4DWyrS/yos4rniha1jRPLdzAACXANiX - Hhfowf6qTV5G97A+tPjLdcsfAAAAAAAzAeDJrwB802LO0d0tEuLwFT8yKkFr9UzRfPfhBfPcbgAAXAAg - ncZkH+LzuDIiI2ZfiwyvqF7+AAAAAADUJgDKaf76dYuEDuxKIlSzirReDQvnu64iANwBAGQJgDICgNZc - L/eLZcXFvUJf+X9Oy1/QDQAAAAAAtQaAb1vNOUUAmLi3UUIDdiURMm1Fc90cC+e220jL/z4AIAsA3Mns - HbIxrW9wK/ZXaJauR3dzvRYV9su1yDD98gcAAAAAoDYAkLvbes7Hu1vNVbGriJD5y5/T3p0A8Dkt//sA - gEUC4E5m35CNGRp/G/ZXZrauqcN7Z0SFFREAaPEDAAAAAGBmABTuaTXr893Ws+LwCX2oTitK8OhYkOC+ - mQBQAQBYBAB+zeoXvCFLE2TP/orMlvjmPhnR4eszosMEAoAAAAAAAIDZAHCVALB+b6uEqJMqLH1kYRXP - dWlNy389TRkAUAcA6BuUR3+uutYz0Jr9lZi1jB4hbWnxH9ctfwAAAAAATA2AYpod9NX+pP12s036eRwI - ma2SmS5NadkvouWfAwCYHwDZrwcnZvYLnpAVp3qF/RWYNfHXiTLV3cZmqLuVZkR30y9/AAAAAABqCoAs - mk37bGfGH2g1U4Xf10eyTtB6vFA4yyOuYFb7TbT87wMAJgXAHfrXm+gr/jjxA3bYQ272MnqE2dDi300j - 6KZq+QMAAAAA8LQAKKWFf4Lmz/tsp8fvt5kVts9mUhN2xRDir/zpHW0IAwm0/NMAADbGAeDy9f5BCdma - 4Gbsoa21MmK6DaYprF7+AAAAAAAYAuD+Ifv4G7T8L9IcOWg3bRsB4NP99tPn0p8DDtjG++5uM6s5u04I - KS/xTYUKZ3oE0eJfT5MNALB5MgDSafmvz9IEBdXVu3mJ7x2QHttN9ZuJlDKRD6abERP0tBP78Pg+fpIk - T+/HT6fHz6WnGo1x00GjOve7M9gk8/NDM0I/bqaaMapjTzttnnYmPDRHajL2VTP1sXPQcbLbEfvprb9z - mOxE/7lG4rCrghB6mgRt6HMF09tH5k1v/xcCQC4A8BAAUmnxr83W+PuwhwshhBDiL/GVgbyZHVS09BMI - AHvpz7sKA8C9nIH+R7MHByRkDfbFG3oghBBSZiWT3JoUxLcfkB/f8cOCqZ6nafnf5woAQ/1u5wz2O5o9 - yG919mDfmNr6CX6EEEJIVuXNca1XMKVjZN5UTy0BYBct/gwZAaAiZ6hPUvYQ383ZQ/1nXx/iF5ioVr/I - joYQQgghKd2c7tE4b7JXaO7kjlPyJnt+RgA4SIs/jeZ+HQHgdvZwnyu0/HfTfJAzzO9NGt+cYZ6vsv/K - CCGEEDJXwljV8zcmdGidP94zLHei10ha/HNvjPd+N3d8p78RAL6iP7/PHae6Qss/mSaLAFBIy1+cCrb8 - 79IUEgAKc0d3vkYASL4xSnXhxuguhwkBW3NHdv4LLf23b4zoMvPGyM7DckepgvKH+9vg87YRQsjSsrL6 - f1fcrVuuFBTEAAAAAElFTkSuQmCC - - - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAD61SURBVHhe7d0H @@ -1821,225 +1003,504 @@ gEezQ8aF8jl+wMxcXP4/QuwyiGpqHuMAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAADJPSURBVHhe7d0H - fNX1vf/xo7a1QwEFlSXOulBWmIoSkjACsgkyFO2y2l67b7XOKETR1rYuaPvv/3Hv7e2/vUWpWsX29nYv - e1scqCxRGWFYVxkJTvj9f+fkG3KCQUjIOOP5ejzeD+t93Co5+Z3H50lIIZFLReXHf3DLTScVbK04ceaW - uSdfvW3OSd/bOuekxVtuOvGvW246eXW817bcmNrOLeUnR1vKP1qzG+r2z+uTOyX653Vpuza5U2t2Tdqu - Pi16Lbmvpe2q0+t2ZdhXkzsjejW5f03bV3rW7cthXzpz9175Yu3Oil75Qtjna9creuVzdXv5irB/6V23 - z9auT/TyZ9J2eZ/opcv7Ri9dlrZPJ9evZpeGfSq5gtT+8cm0fSK5/jX7eNjHkhuQ2ouXpO3igTWbnbaL - BtXtwkHR5tQGR5tnhc1M24whdZs+JNqU3AVn121a7c6JNpWlbWpyQ6ONU9I2OblzazYpbGLtzos2TEjb - +OSGRRvGpe385AprNrYwqqzdmOE1K03b6KK6jSqK1ic3Mrnimo1IW0lJ3Yprtq5oRN2G125ktK4wbFjd - 1p43qm7n1m50tHZo2Dm1K43Wnl0arandkOTGRGsG198Lg8dGLwxK3/nR87UbmNy41J6r3YDxu7c6tQk1 - 6z8henb3Ju7eqoLkJtXbyoLJ0cp+6ZsSrahd3+SmprZ898qi5X3KomX1Ni1a1nta9MzuXbB7T/dKbnq9 - PdVrRvTUWembGS2t3ZnJzYqerLcLoyd7Xhg9UW8Xpfb4GbWbvXuPnZ7cxfW25PRLoiWn1e3vp32sbqcm - 9/Hob3vulE9E/1tvn0ztrx+t3ad279HkTr603v5y8qejv5xUtz+fdFndTkzu8uhPe+6Ez0R/rLfPpvaH - 42v3L7v3++SOu2L3fpfa52rWo2a/7fH5uh1bs98c+4X66/7F6Nf19qXUftWtdl9O7X9q1/Uru/fL1P61 - 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 - AAAAAAAAAAAAAAAAAAAAAABAg8e+oQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAITjDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAANHvuGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAEI4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAADR47BsaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA - OP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0OCx - b2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh+AMAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAg8e+oQEAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITjDwAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHvuGBgAAAAAAAAAAAAAA - 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 + f1fcrVuuFBTEAAAAAElFTkSuQmCC @@ -2574,6 +2035,545 @@ 16Zvy48/IjKnfzvQVhG7SBz/X4jj/6JYCwAINgDI4w8AAICaADgnDv++A4PKfqwf/H3RG/vIjzci6m72 8uH3N5fFjxHHfqW93FLVUm75jfjnPS1WyxHx6wlx/FvF2sTh/xwABAIA9AEAABBSAPhUHP+2g+HFdvFr vdjh2ojiP9RGlvzzwfCSHQcHlSwTy3rhgWL+Dv6gKCzs/wOibyMy/n52hwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAADJPSURBVHhe7d0H + fNX1vf/xo7a1QwEFlSXOulBWmIoSkjACsgkyFO2y2l67b7XOKETR1rYuaPvv/3Hv7e2/vUWpWsX29nYv + e1scqCxRGWFYVxkJTvj9f+fkG3KCQUjIOOP5ejzeD+t93Co5+Z3H50lIIZFLReXHf3DLTScVbK04ceaW + uSdfvW3OSd/bOuekxVtuOvGvW246eXW817bcmNrOLeUnR1vKP1qzG+r2z+uTOyX653Vpuza5U2t2Tdqu + Pi16Lbmvpe2q0+t2ZdhXkzsjejW5f03bV3rW7cthXzpz9175Yu3Oil75Qtjna9creuVzdXv5irB/6V23 + z9auT/TyZ9J2eZ/opcv7Ri9dlrZPJ9evZpeGfSq5gtT+8cm0fSK5/jX7eNjHkhuQ2ouXpO3igTWbnbaL + BtXtwkHR5tQGR5tnhc1M24whdZs+JNqU3AVn121a7c6JNpWlbWpyQ6ONU9I2OblzazYpbGLtzos2TEjb + +OSGRRvGpe385AprNrYwqqzdmOE1K03b6KK6jSqK1ic3Mrnimo1IW0lJ3Yprtq5oRN2G125ktK4wbFjd + 1p43qm7n1m50tHZo2Dm1K43Wnl0arandkOTGRGsG198Lg8dGLwxK3/nR87UbmNy41J6r3YDxu7c6tQk1 + 6z8henb3Ju7eqoLkJtXbyoLJ0cp+6ZsSrahd3+SmprZ898qi5X3KomX1Ni1a1nta9MzuXbB7T/dKbnq9 + PdVrRvTUWembGS2t3ZnJzYqerLcLoyd7Xhg9UW8Xpfb4GbWbvXuPnZ7cxfW25PRLoiWn1e3vp32sbqcm + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAADh+AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABAg8e+oQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAITjDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAANHvuGBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAEI4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAADR47BsaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA + OP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0OCx + b2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh+AMAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAg8e+oQEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITjDwAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHvuGBgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEI4/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADR47BsaAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAOP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0OCxb2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh+AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAg8e+oQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAITjDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkO8A2BIf//XxVsSHf0nt + 1g4bVbdza1e6ZO3QsHPSdnbpkvj4p23Mkvjo77GxS9YMSt/5S+LjX7OByY1P7bnaDRi/JD78K+K/ro// + ugUAAAAAAAAAAAAAmg6AFWuLRs5fN7xkdmXRqIHPl5S0T2RJzxeUtV/Vf+LA5/pPmB0f/wXxVgIAAAAA + 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 diff --git a/Knew Karma/KnewKarmaSetup/KnewKarmaSetup.vdproj b/Knew Karma/KnewKarmaSetup/KnewKarmaSetup.vdproj index 5a3c9e8..48c4c18 100644 --- a/Knew Karma/KnewKarmaSetup/KnewKarmaSetup.vdproj +++ b/Knew Karma/KnewKarmaSetup/KnewKarmaSetup.vdproj @@ -229,15 +229,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Knew Karma" - "ProductCode" = "8:{2F66B658-D24C-4C06-8DC0-A278C9E48992}" - "PackageCode" = "8:{7C9F1584-3E9F-40C8-BB8A-06DB81812911}" + "ProductCode" = "8:{29CB9712-39D1-49FD-AAA9-60812E068E52}" + "PackageCode" = "8:{54B3DA36-E5E3-45EC-AB0D-3CB2210F84F8}" "UpgradeCode" = "8:{9B03AD0F-0C14-4075-AB75-01CD38A594B4}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:2.4.0" + "ProductVersion" = "8:3.0.0" "Manufacturer" = "8:Richard Mwewa" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:https://github.com/bellingcat/knewkarma/wiki" @@ -777,7 +777,7 @@ { "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_6E15D9F422094BD9809550AF1BA1C161" { - "SourcePath" = "8:..\\KnewKarma\\obj\\Release\\net6.0-windows\\apphost.exe" + "SourcePath" = "8:..\\KnewKarma\\obj\\Debug\\net6.0-windows\\apphost.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_C0F76EDD899B4FFF80C2AC1B5526BC22" diff --git a/README.md b/README.md index e6cf90a..b6f78f2 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,134 @@ -![carbon](https://github.com/bellingcat/knewkarma/assets/74001397/a7165335-89d4-4632-b3af-2f3bb03082bb) +![carbon](https://github.com/bellingcat/knewkarma/assets/74001397/ccc5f890-6c0a-49a4-a6f7-afd398924e7a) A **Reddit** Data Analysis Toolkit. [![.Net](https://img.shields.io/badge/Visual%20Basic%20.NET-5C2D91?style=flat&logo=.net&logoColor=white)](https://github.com/search?q=repo%3Abellingcat%2Fknewkarma++language%3A%22Visual+Basic+.NET%22&type=code) [![Python](https://img.shields.io/badge/Python-3670A0?style=flat&logo=python&logoColor=ffdd54)](https://github.com/search?q=repo%3Abellingcat%2Fknewkarma++language%3APython&type=code) [![Docker](https://img.shields.io/badge/Dockefile-%230db7ed.svg?style=flat&logo=docker&logoColor=white)](https://github.com/search?q=repo%3Abellingcat%2Fknewkarma++language%3ADockerfile&type=code) [![PyPI - Version](https://img.shields.io/pypi/v/knewkarma?style=flat&logo=pypi&logoColor=ffdd54&label=PyPI&labelColor=3670A0&color=3670A0)](https://pypi.org/project/knewkarma) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=flat&logo=buy-me-a-coffee&logoColor=black)](https://buymeacoffee.com/_rly0nheart) +*** # Feature Overview -* **Knew Karma can get the following Reddit data from individual targets**: +## Knew Karma CLI/GUI + +- [x] **Knew Karma can get the following Reddit data from individual targets**: * **User**: *Profile*, *Posts*, *Comments* * **Subreddit**: *Profile*, *Posts* - * **Post**: *Data*, *Comments* (available only in the CLI) -* **It can also get posts from various sources, such as**: +- [x] **It can also get posts from various sources, such as**: * **Searching**: Allows getting posts that match the user-provided query from all over Reddit * **Reddit Front-Page**: Allows getting posts from the Reddit Front-Page * **Listing**: Allows getting posts from a user-specified Reddit Listing -* **Bonus Features** - * **CLI/GUI** +- [x] **Bonus Features** + * **Fully Async (both in the CLI and GUI)** * **Dark Mode** (*GUI Automatic/Manual*) * **Write data to files** (*JSON/CSV*) +## Knew Karma Python Library + +
+ Code Examples + +### Get User Data + +```python +import asyncio +import aiohttp +from knewkarma import RedditUser + + +# Define an asynchronous function to fetch User +async def async_user(username: str, data_limit: int, data_sort: str): + # Initialize a RedditUser object with the specified username, data limit, and sorting criteria + user = RedditUser(username=username, data_limit=data_limit, data_sort=data_sort) + + # Establish an asynchronous HTTP session + async with aiohttp.ClientSession() as session: + # Fetch user's profile + profile = await user.profile(session=session) + + # Fetch user's posts + posts = await user.posts(session=session) + + # Fetch user's comments + comments = await user.comments(session=session) + + print(profile) + print(posts) + print(comments) + + +# Run the asynchronous function with a specified username, data limit, and sorting parameter +asyncio.run(async_user(username="automoderator", data_limit=100, data_sort="all")) +``` + +### Get Subreddit Data + +````python +import asyncio +import aiohttp +from knewkarma import RedditSub + + +# Define an asynchronous function to fetch Subreddit data +async def async_subreddit(subreddit_name: str, data_limit: int, data_sort: str): + # Initialize a RedditSub object with the specified subreddit, data limit, and sorting criteria + subreddit = RedditSub( + subreddit=subreddit_name, data_limit=data_limit, data_sort=data_sort + ) + + # Create an asynchronous HTTP session + async with aiohttp.ClientSession() as session: + # Fetch subreddit's profile + profile = await subreddit.profile(session=session) + + # Fetch subreddit's posts + posts = await subreddit.posts(session=session) + + print(profile) + print(posts) + + +# Run the asynchronous function with specified subreddit name, data limit, and sorting criteria +asyncio.run( + async_subreddit(subreddit_name="MachineLearning", data_limit=100, data_sort="top") +) +```` + +### Get Posts + +```python +import asyncio +import aiohttp +from knewkarma import RedditPosts + + +# Define an asynchronous function to fetch Reddit posts +async def async_posts(limit: int, sort: str): + # Initialize RedditPosts with the specified limit and sorting criteria + posts = RedditPosts(limit=limit, sort=sort) + + # Create an asynchronous HTTP session + async with aiohttp.ClientSession() as session: + # Fetch front page posts + front_page_posts = await posts.front_page(session=session) + # Fetch posts from a specified listing ('best') + listing_posts = await posts.listing(listings_name="best", session=session) + # Fetch posts that match the specified search query 'covid-19' + search_results = await posts.search(query="covid-19", session=session) + + print(front_page_posts) + print(listing_posts) + print(search_results) + + +# Run the asynchronous function with a specified limit and sorting parameter +asyncio.run(async_posts(limit=100, sort="all")) +``` + +
+ # Documentation *[Refer to the Wiki](https://github.com/bellingcat/knewkarma/wiki) for Installation, Usage and Uninstallation instructions.* *** [![me](https://github.com/bellingcat/knewkarma/assets/74001397/efd19c7e-9840-4969-b33c-04087e73e4da)](https://about.me/rly0nheart) + diff --git a/knewkarma/__init__.py b/knewkarma/__init__.py index 680687e..ef5b0ca 100644 --- a/knewkarma/__init__.py +++ b/knewkarma/__init__.py @@ -1,147 +1,5 @@ -import os +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # -OPERATION_MODES: list = ["user", "subreddit", "post", "posts", "search", "quit"] -DATA_SORT_CRITERION: list = [ - "all", - "controversial", - "new", - "top", - "best", - "hot", - "rising", -] -POST_LISTINGS: list = ["all", "best", "controversial", "popular", "rising"] +from .base import RedditUser, RedditSub, RedditPosts -# Construct path to the program's directory -PROGRAM_DIRECTORY: str = os.path.expanduser(os.path.join("~", "knewkarma")) - -# Construct path to the current file's directory -CURRENT_FILE_DIRECTORY: str = os.path.dirname(os.path.abspath(__file__)) - -# Construct paths to directories of CSV and JSON files. -CSV_DIRECTORY: str = os.path.join(PROGRAM_DIRECTORY, "csv") -JSON_DIRECTORY: str = os.path.join(PROGRAM_DIRECTORY, "json") - -__author__: str = "Richard Mwewa" -__about__: str = "https://about.me/rly0nheart" -__version__: str = "2.4.2.0" -__pypi_project_endpoint__: str = "https://pypi.org/pypi/knewkarma/json" -__description__: str = """ -# Knew Karma -> A **Reddit** Data Analysis Toolkit.""" -__epilog__: str = f""" -> Call `knewkarma` without command-line arguments to invoke an interactive command-line interface. ->> Calling it with only the `-d/--debug` flag will invoke an interactive command-line interface in debug mode. - -# by [{__author__}]({__about__}) - -``` -MIT License - -Copyright © 2023 {__author__} - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` -""" - -__operations_description__: str = "# **{}** Operations" -__user_examples__: str = """ -# Examples -## Get User Profile -``` -knewkarma user USERNAME --profile -``` - -## Get User Comments (unsorted and unlimited) -``` -knewkarma user USERNAME --comments -``` - -## Get User Posts (unsorted and unlimited) -``` -knewkarma user USERNAME --posts -``` - -## Get User Posts/Comments (sorted and limited) -``` -knewkarma --sort top --limit 20 user USERNAME --comments/--posts -``` -""" - -__subreddit_examples__: str = """ -# Examples -## Get Subreddit Profile -``` -knewkarma subreddit SUBREDDIT_NAME --profile -``` - -## Get Subreddit Posts (unsorted and unlimited) -``` -knewkarma subreddit SUBREDDIT_NAME --posts -``` - -## Get Subreddit Posts (sorted and limited) -``` -knewkarma --sort new --limit 20 subreddit SUBREDDIT_NAME -``` - -""" - -__post_example__: str = """ -# Example -``` -knewkarma post POST_ID SUBREDDIT_NAME -``` -""" - -__posts_examples__: str = """ -# Examples -## Get Posts from Reddit Front-Page (unsorted and unlimited) -``` -knewkarma posts --front-page -``` - -## Get Posts from A Specified Listing (unsorted and unlimited) -``` -knewkarma posts --listing best -``` - -## Get Posts from Reddit Front-Page (sorted and limited) -``` -knewkarma --sort top --limit 20 posts --front-page -``` - -## Get Posts from A Specified Listing (sorted and limited) -``` -knewkarma --sort top --limit 20 posts --listing best -``` -""" - -__search_examples__: str = """ -# Examples -## Search for Posts (unsorted and unlimited) -``` -knewkarma search QUERY_STRING -``` - -## Search for Posts (sorted and limited) -``` -knewkarma --sort top --limit 20 search QUERY_STRING -``` -""" +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/knewkarma/_cli.py b/knewkarma/_cli.py new file mode 100644 index 0000000..1d10e17 --- /dev/null +++ b/knewkarma/_cli.py @@ -0,0 +1,126 @@ +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +import argparse +import asyncio +from datetime import datetime + +import aiohttp +import rich + +from ._coreutils import log, save_data, pathfinder +from ._parser import create_parser, version +from .api import get_updates +from .base import RedditUser, RedditSub, RedditPosts + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +async def setup_cli(arguments: argparse.Namespace): + """ + Sets up the command-line interface and executes the specified actions. + + :param arguments: Argparse namespace object containing parsed command-line arguments. + """ + data_limit: int = arguments.limit + data_sorting: str = arguments.limit + + user = RedditUser( + username=arguments.username if hasattr(arguments, "username") else None, + data_limit=data_limit, + data_sort=data_sorting, + ) + subreddit = RedditSub( + subreddit=arguments.subreddit if hasattr(arguments, "subreddit") else None, + data_limit=data_limit, + data_sort=data_sorting, + ) + posts = RedditPosts(limit=data_limit, sort=data_sorting) + + # Mapping of command-line commands to their respective functions + function_mapping: dict = { + "user": [ + ("profile", lambda session: user.profile(session=session)), + ("posts", lambda session: user.posts(session=session)), + ("comments", lambda session: user.comments(session=session)), + ], + "subreddit": [ + ("profile", lambda session: subreddit.profile(session=session)), + ("posts", lambda session: subreddit.posts(session=session)), + ], + "posts": [ + ("front_page", lambda session: posts.front_page(session=session)), + ( + "search", + lambda session: posts.search(query=arguments.search, session=session), + ), + ( + "listing", + lambda session: posts.listing( + listings_name=arguments.listing, session=session + ), + ), + ], + } + async with aiohttp.ClientSession() as request_session: + await get_updates(session=request_session) + + if arguments.mode in function_mapping: + mode_action = function_mapping.get(arguments.mode) + is_executed: bool = False + + for action, function in mode_action: + if getattr(arguments, action, False): + call_function = await function(session=request_session) + + rich.print(call_function) + is_executed = True + + pathfinder() + save_data( + data=call_function, + to_json=arguments.json, + to_csv=arguments.csv, + ) + + if not is_executed: + log.warning( + f"knewkarma {arguments.mode}: missing one or more expected argument(s)." + ) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +def execute_cli(): + """Main entrypoint for the Knew Karma command-line interface.""" + parser = create_parser() + arguments: argparse = parser.parse_args() + + start_time: datetime = datetime.now() + if arguments.mode: + print( + """ +┓┏┓ ┓┏┓ +┃┫ ┏┓┏┓┓┏┏ ┃┫ ┏┓┏┓┏┳┓┏┓ +┛┗┛┛┗┗ ┗┻┛ ┛┗┛┗┻┛ ┛┗┗┗┻""" + ) + + try: + start_time: datetime = datetime.now() + + log.info( + f"[bold]Knew Karma CLI[/] {version} started at " + f"{start_time.strftime('%a %b %d %Y, %I:%M:%S %p')}..." + ) + asyncio.run(setup_cli(arguments=arguments)) + except KeyboardInterrupt: + log.warning(f"User interruption detected ([yellow]Ctrl+C[/])") + finally: + log.info(f"Stopped in {datetime.now() - start_time} seconds.") + else: + # Display usage information if no mode is provided + parser.print_usage() + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/knewkarma/_coreutils.py b/knewkarma/_coreutils.py new file mode 100644 index 0000000..6ef572f --- /dev/null +++ b/knewkarma/_coreutils.py @@ -0,0 +1,114 @@ +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +import csv +import json +import logging +import os + +from ._parser import create_parser +from .metadata import ( + CSV_DIRECTORY, + JSON_DIRECTORY, +) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +def pathfinder(): + """ + Creates file directories in the user's home directory, if they don't already exist. + """ + directories: list = [ + CSV_DIRECTORY, + JSON_DIRECTORY, + ] + for directory in directories: + os.makedirs(directory, exist_ok=True) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +def save_data( + data, + to_json: bool = False, + to_csv: bool = False, +): + """ + Save the given data to JSON and/or CSV files based on the arguments. + + :param data: The data to be saved, which can be a dict or a list of dicts. + :param to_json: Used to get the True value and the filename for the created JSON file if specified. + :param to_csv: Used to get the True value and the filename for the created CSV file if specified. + """ + from .base import User, Subreddit + + if to_json or to_csv: + if isinstance(data, (User, Subreddit)): + function_data = data.__dict__ + elif isinstance(data, list): + function_data = [item.__dict__ for item in data] + else: + log.error( + f"Got an unexpected data type ({type(data)}), " + f"expected {dict} or {list} of {dict}." + ) + return + + if to_json: + json_path = os.path.join(JSON_DIRECTORY, f"{to_json}.json") + with open(json_path, "w", encoding="utf-8") as json_file: + json.dump(function_data, json_file, indent=4) + log.info( + f"{os.path.getsize(json_file.name)} bytes written to {json_file.name}" + ) + + if to_csv: + csv_path = os.path.join(CSV_DIRECTORY, f"{to_csv}.csv") + with open(csv_path, "w", newline="", encoding="utf-8") as csv_file: + writer = csv.writer(csv_file) + if isinstance(function_data, dict): + writer.writerow(function_data.keys()) + writer.writerow(function_data.values()) + elif isinstance(function_data, list): + if function_data: + writer.writerow( + function_data[0].keys() + ) # header from keys of the first item + for item in function_data: + writer.writerow(item.values()) + log.info( + f"{os.path.getsize(csv_file.name)} bytes written to {csv_file.name}" + ) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +def setup_logging(debug_mode: bool) -> logging.getLogger: + """ + Configure and return a logging object with the specified log level. + + :param debug_mode: A boolean value indicating whether log level should be set to DEBUG. + :return: A logging object configured with the specified log level. + """ + from rich.logging import RichHandler + + logging.basicConfig( + level="DEBUG" if debug_mode else "INFO", + format="%(message)s", + handlers=[ + RichHandler( + markup=True, log_time_format="[%I:%M:%S %p]", show_level=debug_mode + ) + ], + ) + return logging.getLogger("Knew Karma") + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +log: logging = setup_logging(debug_mode=create_parser().parse_args().debug) + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/knewkarma/_parser.py b/knewkarma/_parser.py new file mode 100644 index 0000000..864a5d0 --- /dev/null +++ b/knewkarma/_parser.py @@ -0,0 +1,178 @@ +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +import argparse + +from rich.markdown import Markdown +from rich_argparse import RichHelpFormatter + +from .metadata import ( + version, + description, + epilog, + posts_examples, + user_examples, + subreddit_examples, + operations_description, +) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +def create_parser() -> argparse.ArgumentParser: + """ + Creates and configures an argument parser for the command line arguments. + + :return: A configured argparse.ArgumentParser object ready to parse the command line arguments. + """ + # ---------------------------------------------------------- # + + parser = argparse.ArgumentParser( + description=Markdown(description, style="argparse.text"), + epilog=Markdown(epilog, style="argparse.text"), + formatter_class=RichHelpFormatter, + ) + subparsers = parser.add_subparsers( + dest="mode", help="operation mode", required=False + ) + parser.add_argument( + "-l", + "--limit", + type=int, + default=100, + help="(bulk) data output limit", + ) + + parser.add_argument( + "-s", + "--sort", + type=str, + default="all", + choices=[ + "all", + "best", + "controversial", + "hot", + "new", + "rising", + "top", + ], + help="(bulk) data sort criterion", + ) + + parser.add_argument( + "-j", + "--json", + help="write output to a specified json file", + ) + parser.add_argument( + "-c", + "--csv", + help="write output to a specified csv file", + ) + parser.add_argument( + "-d", + "--debug", + help="([bold][green]dev[/][/]) run knew karma in debug mode.", + action="store_true", + ) + parser.add_argument( + "-v", + "--version", + version=f"Knew Karma {version}", + action="version", + ) + + # ---------------------------------------------------------- # + + user_parser = subparsers.add_parser( + "user", + help="user operations", + description=Markdown( + operations_description.format("User"), style="argparse.text" + ), + epilog=Markdown(user_examples), + formatter_class=RichHelpFormatter, + ) + user_parser.add_argument("username", help="username") + user_parser.add_argument( + "-p", + "--profile", + action="store_true", + help="get profile from the specified username", + ) + user_parser.add_argument( + "-c", + "--comments", + action="store_true", + help="get comments from the specified username", + ) + user_parser.add_argument( + "-pp", + "--posts", + action="store_true", + help="get posts from the specified username", + ) + + # ---------------------------------------------------------- # + + subreddit_parser = subparsers.add_parser( + "subreddit", + help="subreddit operations", + description=Markdown( + operations_description.format("Subreddit"), style="argparse.text" + ), + epilog=Markdown(subreddit_examples), + formatter_class=RichHelpFormatter, + ) + subreddit_parser.add_argument( + "subreddit", + help="subreddit name", + ) + subreddit_parser.add_argument( + "-p", + "--profile", + action="store_true", + help="get profile from the specified subreddit", + ) + subreddit_parser.add_argument( + "-pp", + "--posts", + action="store_true", + help="get posts from the specified subreddit", + ) + + # ---------------------------------------------------------- # + + posts_parser = subparsers.add_parser( + "posts", + help="posts operations", + description=Markdown( + operations_description.format("Posts"), style="argparse.text" + ), + epilog=Markdown(posts_examples), + formatter_class=RichHelpFormatter, + ) + posts_parser.add_argument( + "-s", + "--search", + help="get posts that match a specified search query", + ) + posts_parser.add_argument( + "-f", + "--front-page", + help="get posts from the reddit front-page", + action="store_true", + ) + posts_parser.add_argument( + "-l", + "--listing", + default="all", + help="get posts from a specified listing", + choices=["best", "controversial", "popular", "rising"], + ) + + return parser + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/knewkarma/api.py b/knewkarma/api.py index 05b0dd5..c5199b1 100644 --- a/knewkarma/api.py +++ b/knewkarma/api.py @@ -1,281 +1,272 @@ +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + from typing import Union, Literal -import requests - -from . import __version__ -from .coreutils import log - - -class Api: - def __init__(self, base_reddit_endpoint: str): - """ - Initialise the API class with the base Reddit endpoint. - """ - self.base_reddit_endpoint = base_reddit_endpoint - - @staticmethod - def get_data(endpoint: str) -> Union[dict, list]: - """ - Fetches JSON data from a given API endpoint. - - :param endpoint: The API endpoint to fetch data from. - :return: Returns JSON data as a dictionary or list. Returns an empty dict if fetching fails. - """ - from sys import version as python_version - - try: - with requests.Session() as session: - with session.get( - url=endpoint, - headers={ - "User-Agent": f"Knew-Karma/{__version__} " - f"(Python {python_version}; +https://about.me/rly0nheart)" - }, - ) as response: - if response.status_code == 200: - return response.json() - else: - log.error(f"An API error occurred: {response.json()}") - return {} - except requests.exceptions.RequestException as error: - log.error(f"An HTTP error occurred: {error}") - return {} - except Exception as error: - log.critical(f"An unknown error occurred: {error}") - return {} - - @staticmethod - def validate_data( - data: Union[dict, list], valid_key: str = None - ) -> Union[dict, list]: - """ - Validates the input data. If it's a dictionary and a valid_key is provided, - checks for the presence of the key in the dictionary. If it's a list, it - ensures the list is not empty. - - :param data: The data to validate, which should be a dictionary, list or set. - :param valid_key: The key to check for in the data if it's a dictionary. - :return: The original data if valid, or an empty dictionary or list if invalid. - """ - if isinstance(data, dict): - if valid_key: - return data if valid_key in data else {} +import aiohttp + +from ._coreutils import log +from .metadata import ( + version, +) + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +BASE_REDDIT_ENDPOINT: str = "https://www.reddit.com" +PYPI_PROJECT_ENDPOINT: str = "https://pypi.org/pypi/knewkarma/json" + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +async def get_data(session: aiohttp.ClientSession, endpoint: str) -> Union[dict, list]: + """ + Fetches JSON data from a given API endpoint. + + :param session: aiohttp session to use for the request. + :param endpoint: The API endpoint to fetch data from. + :return: Returns JSON data as a dictionary or list. Returns an empty dict if fetching fails. + """ + from sys import version as python_version + + try: + async with session.get( + endpoint, + headers={ + "User-Agent": f"Knew-Karma/{version} " + f"(Python {python_version}; +https://about.me/rly0nheart)" + }, + ) as response: + if response.status == 200: + return await response.json() else: - return data # Explicitly return the dictionary if valid_key is not provided - elif isinstance(data, list): - return data if data else [] + error_message = await response.json() + log.error(f"An API error occurred: {error_message}") + return {} + + except aiohttp.ClientConnectionError as error: + log.error(f"An HTTP error occurred: {error}") + return {} + except Exception as error: + log.critical(f"An unknown error occurred: {error}") + return {} + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +def process_response( + response_data: Union[dict, list], valid_key: str = None +) -> Union[dict, list]: + """ + Processes and validates the API response data. + + If it's a dictionary and a valid_key is provided, + checks for the presence of the key in the response dictionary. + + If it's a list, it ensures the list is not empty. + + :param response_data: The API response data to validate, which should be a dictionary or list. + :param valid_key: The key to check for in the data if it's a dictionary. + :return: The original data if valid, or an empty dictionary or list if invalid. + """ + if isinstance(response_data, dict): + if valid_key: + return response_data if valid_key in response_data else {} else: - log.critical( - f"Unknown data type ({data}: {type(data).__name__}), expected a list or dict." + return response_data # Explicitly return the dictionary if valid_key is not provided + elif isinstance(response_data, list): + return response_data if response_data else [] + else: + log.critical( + f"Unknown data type ({response_data}: {type(response_data)}), expected a list or dict." + ) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +async def get_updates(session: aiohttp.ClientSession): + """ + Gets and compares the current program version with the remote version. + + Assumes version format: major.minor.patch.prefix + + :param session: aiohttp session to use for the request. + """ + + # Make a GET request to PyPI to get the project's latest release. + response: dict = await get_data(endpoint=PYPI_PROJECT_ENDPOINT, session=session) + release: dict = process_response(response_data=response.get("info", {})) + + if release: + remote_version: str = release.get("version") + # Splitting the version strings into components + remote_parts: list = remote_version.split(".") + local_parts: list = version.split(".") + + update_message: str = "" + + # Check for differences in version parts + if remote_parts[0] != local_parts[0]: + update_message = ( + f"MAJOR update ({remote_version}) available." + f" It might introduce significant changes." ) - def get_updates(self): - """ - Gets and compares the remote version with the local version. - Assumes version format: major.minor.patch.prefix - """ - import os - import sys - import warnings - - from plyer import notification - - from . import CURRENT_FILE_DIRECTORY, __pypi_project_endpoint__ - - # Make a GET request to PyPI to get the project's latest release. - response: dict = self.get_data(endpoint=__pypi_project_endpoint__) - release: dict = self.validate_data(data=response.get("info", {})) - - if release: - if release.get("name") != "knewkarma": - log.critical( - f"PyPI project endpoint was modified " - f"{__pypi_project_endpoint__}: knewkarma/__init__.py: Line 20" - ) - sys.exit() - - remote_version: str = release.get("version") - # Splitting the version strings into components - remote_parts: list = remote_version.split(".") - local_parts: list = __version__.split(".") - - update_message: str = "" - notification_timeout: int = 0 - icon_file: str = "icon.ico" if os.name == "nt" else "icon.png" - - # Check for differences in version parts - if remote_parts[0] != local_parts[0]: - update_message = ( - f"MAJOR update ({remote_version}) available." - f" It might introduce significant changes." - ) - notification_timeout = 60 - elif remote_parts[1] != local_parts[1]: - update_message = ( - f"MINOR update ({remote_version}) available." - f" Includes small feature changes/improvements." - ) - notification_timeout = 50 - elif remote_parts[2] != local_parts[2]: - update_message = ( - f"PATCH update ({remote_version}) available." - f" Generally for bug fixes and small tweaks." - ) - notification_timeout = 30 - elif ( - len(remote_parts) > 3 - and len(local_parts) > 3 - and remote_parts[3] != local_parts[3] - ): - update_message = ( - f"BUILD update ({remote_version}) available." - f" Might be for specific builds or special versions." - ) - notification_timeout = 15 - - if update_message: - try: - # Catch and ignore all warnings (specific warning is at: - # https://github.com/kivy/plyer/blob/ - # 8c0e11ff2e356ea677e96b0d7907d000c8f4bbd0/plyer/platforms/linux/notification.py#L99C8-L99C8) - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - - # Notify user about the new release. - notification.notify( - title="Knew Karma", - message=update_message, - app_icon=os.path.join( - CURRENT_FILE_DIRECTORY, "icons", icon_file - ), - timeout=notification_timeout, - ) - except ( - NotImplementedError - ): # Gets raised on systems that do not have a desktop environment - log.info(update_message) - - def get_profile( - self, - profile_source: str, - profile_type: str = Literal["user_profile", "subreddit_profile"], - ) -> dict: - """ - Retrieves profile data from a specified source. - - :param profile_type: Type of profile to retrieve. - :param profile_source: source from where the profile should be retrieved. - :return: A JSON object containing profile data. - """ - profile_type_map: list = [ - ( - "user_profile", - f"{self.base_reddit_endpoint}/user/{profile_source}/about.json", - ), - ( - "subreddit_profile", - f"{self.base_reddit_endpoint}/r/{profile_source}/about.json", - ), - ] - - profile_endpoint: str = "" - for type_name, type_endpoint in profile_type_map: - if type_name == profile_type: - profile_endpoint = type_endpoint - - profile: dict = self.get_data(endpoint=profile_endpoint) - return self.validate_data(data=profile.get("data", {}), valid_key="created_utc") - - def get_posts( - self, - posts_sort_criterion: str, - posts_limit: int, - posts_type: str = Literal[ - "user_posts", - "user_comments", - "subreddit_posts", - "search_posts", - "listing_posts", - "front_page_posts", - ], - posts_source: str = None, - ) -> list: - """ - Retrieves posts from a specified source. - - :param posts_type: Type of posts to retrieve. - :param posts_source: Source from where the posts should be retrieved. - :param posts_sort_criterion: Criterion by which the posts should be sorted. - :param posts_limit: Limit on the number of posts to retrieve. - :return: A list of posts. - """ - posts_type_map: list = [ - ( - "user_posts", - f"{self.base_reddit_endpoint}/user/{posts_source}/submitted.json" - f"?sort={posts_sort_criterion}&limit={posts_limit}", - ), - ( - "user_comments", - f"{self.base_reddit_endpoint}/user/{posts_source}/comments.json" - f"?sort={posts_sort_criterion}&limit={posts_limit}", - ), - ( - "subreddit_posts", - f"{self.base_reddit_endpoint}/r/{posts_source}.json" - f"?sort={posts_sort_criterion}&limit={posts_limit}", - ), - ( - "search_posts", - f"{self.base_reddit_endpoint}/search.json" - f"?q={posts_source}&sort={posts_sort_criterion}&limit={posts_limit}", - ), - ( - "listing_posts", - f"{self.base_reddit_endpoint}/r/{posts_source}.json" - f"?sort={posts_sort_criterion}&limit={posts_limit}", - ), - ( - "front_page_posts", - f"{self.base_reddit_endpoint}/.json" - f"?sort={posts_sort_criterion}&limit={posts_limit}", - ), - ] - posts_endpoint: str = "" - for type_name, type_endpoint in posts_type_map: - if type_name == posts_type: - posts_endpoint = type_endpoint - - posts: dict = self.get_data(endpoint=posts_endpoint) - - return self.validate_data(data=posts.get("data", {}).get("children", [])) - - def get_post_data( - self, - subreddit: str, - post_id: str, - comments_sort_criterion: str, - comments_limit: int, - ) -> tuple: - """ - Gets a post's data. - - :param subreddit: The subreddit in which the post was posted. - :param post_id: ID of the post. - :param comments_sort_criterion: Criterion by which the post's comments' will be sorted. - :param comments_limit: Maximum of comments to fetch. - :returns: A tuple of a post's data (raw_data, post_information, list_of_comments) if valid, - otherwise return a tuple containing an empty dict, dict and list. - """ - data: dict = self.get_data( - endpoint=f"{self.base_reddit_endpoint}/r/{subreddit}/comments/{post_id}.json" - f"?sort={comments_sort_criterion}&limit={comments_limit}" - ) - return ( - self.validate_data(data=data, valid_key="upvote_ratio"), - self.validate_data( - data=data[0].get("data", {}).get("children", [])[0].get("data", {}), - valid_key="upvote_ratio", - ), - self.validate_data(data=data[1].get("data", {}).get("children", [])), - ) + elif remote_parts[1] != local_parts[1]: + update_message = ( + f"MINOR update ({remote_version}) available." + f" Includes small feature changes/improvements." + ) + + elif remote_parts[2] != local_parts[2]: + update_message = ( + f"PATCH update ({remote_version}) available." + f" Generally for bug fixes and small tweaks." + ) + + elif ( + len(remote_parts) > 3 + and len(local_parts) > 3 + and remote_parts[3] != local_parts[3] + ): + update_message = ( + f"BUILD update ({remote_version}) available." + f" Might be for specific builds or special versions." + ) + + if update_message: + log.info(update_message) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +async def get_profile( + profile_source: str, + session: aiohttp.ClientSession, + profile_type: str = Literal["user_profile", "subreddit_profile"], +) -> dict: + """ + Gets profile data from the specified profile_type and profile_source. + + :param profile_source: Source to get profile data from. + :param session: aiohttp session to use for the request. + :param profile_type: The type of profile that is to be fetched. + """ + # Use a dictionary for direct mapping + source_map: dict = { + "user_profile": f"{BASE_REDDIT_ENDPOINT}/user/{profile_source}/about.json", + "subreddit_profile": f"{BASE_REDDIT_ENDPOINT}/r/{profile_source}/about.json", + } + + # Get the endpoint directly from the dictionary + endpoint: str = source_map.get(profile_type, "") + + if not endpoint: + raise ValueError(f"Invalid profile type in {source_map}: {profile_type}") + + profile_data = await get_data(endpoint=endpoint, session=session) + return process_response( + response_data=profile_data.get("data", {}), valid_key="created_utc" + ) + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +async def get_posts( + session: aiohttp.ClientSession, + limit: int, + sort: str = Literal[ + "all", + "controversial", + "new", + "top", + "best", + "hot", + "rising", + ], + posts_type: str = Literal[ + "user_posts", + "user_comments", + "subreddit_posts", + "search_posts", + "listing_posts", + "front_page_posts", + ], + posts_source: str = None, +) -> list: + """ + Gets a specified number of posts, with a specified sorting criterion, from the specified source. + + :param session: aiohttp session to use for the request. + :param limit: Maximum number of posts to get. + :param sort: Posts' sort criterion. + :param posts_type: Type of posts to be fetched + :param posts_source: Source from where posts will be fetched. + """ + source_map = { + "user_posts": f"{BASE_REDDIT_ENDPOINT}/user/{posts_source}/submitted.json?sort={sort}&limit={limit}", + "user_comments": f"{BASE_REDDIT_ENDPOINT}/user/{posts_source}/comments.json?sort={sort}&limit={limit}", + "subreddit_posts": f"{BASE_REDDIT_ENDPOINT}/r/{posts_source}.json?sort={sort}&limit={limit}", + "search_posts": f"{BASE_REDDIT_ENDPOINT}/search.json?q={posts_source}&sort={sort}&limit={limit}", + "listing_posts": f"{BASE_REDDIT_ENDPOINT}/r/{posts_source}.json?sort={sort}&limit={limit}", + "front_page_posts": f"{BASE_REDDIT_ENDPOINT}/.json?sort={sort}&limit={limit}", + } + + endpoint = source_map.get(posts_type, "") + + if not endpoint: + raise ValueError(f"Invalid profile type in {source_map}: {posts_type}") + + all_posts = await paginated_posts( + posts_endpoint=endpoint, limit=limit, session=session + ) + + return all_posts[:limit] + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +async def paginated_posts( + posts_endpoint: str, limit: int, session: aiohttp.ClientSession +) -> list: + """ + Paginates and retrieves posts until the specified limit is reached. + + :param posts_endpoint: API endpoint for retrieving posts. + :param limit: Limit of the number of posts to retrieve. + :param session: aiohttp session to use for the request. + :return: A list of all posts. + """ + all_posts: list = [] + last_post_id: str = "" + + # Determine whether to use the 'after' parameter + use_after: bool = limit > 100 + + while len(all_posts) < limit: + # Make the API request with the 'after' parameter if it's provided and the limit is more than 100 + if use_after and last_post_id: + endpoint_with_after: str = f"{posts_endpoint}&after={last_post_id}" + else: + endpoint_with_after: str = posts_endpoint + + posts_data: dict = await get_data(endpoint=endpoint_with_after, session=session) + posts_children: list = posts_data.get("data", {}).get("children", []) + + # If there are no more posts, break out of the loop + if not posts_children: + break + + all_posts.extend(process_response(response_data=posts_children)) + + # We use the id of the last post in the list to paginate to the next posts + last_post_id: str = all_posts[-1].get("data").get("id") + + return all_posts + + +# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/knewkarma/base.py b/knewkarma/base.py new file mode 100644 index 0000000..33c83d7 --- /dev/null +++ b/knewkarma/base.py @@ -0,0 +1,332 @@ +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +from dataclasses import dataclass +from typing import List + +import aiohttp + +from . import api + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +@dataclass +class User: + name: str + id: str + is_verified: bool + has_verified_email: bool + is_blocked: bool + is_gold: bool + is_mod: bool + is_employee: bool + hidden_from_bots: bool + accepts_followers: bool + comment_karma: int + link_karma: int + total_karma: int + created_at: int + subreddit: dict + raw_data: dict + + +@dataclass +class Subreddit: + name: str + id: str + description: str + submit_text: str + icon_img: str + subreddit_type: str + subscribers: int + active_users: int + is_nsfw: bool + language: str + header_title: str + header_size: list + header_img: str + raw_data: dict + + +@dataclass +class Post: + id: str + thumbnail: str + title: str + text: str + author: str + subreddit: str + subreddit_id: str + subreddit_type: str + upvotes: int + upvote_ratio: float + downvotes: int + gilded: int + is_nsfw: bool + is_shareable: bool + is_edited: bool + comments: int + hide_from_bots: bool + score: float + domain: str + permalink: str + is_locked: bool + is_archived: bool + created_at: int + raw_post: dict + + +@dataclass +class Comment: + id: str + text: str + author: str + upvotes: int + downvotes: int + is_nsfw: bool + is_edited: bool + score: float + hidden_score: bool + gilded: int + is_stickied: bool + is_locked: bool + is_archived: bool + create_at: int + subreddit: str + subreddit_type: str + post_id: str + post_title: str + author_is_premium: bool + raw_data: dict + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +class RedditUser: + # -------------------------------------------------------------- # + + def __init__(self, username: str, data_limit: int, data_sort: str): + self._username = username + self._data_limit = data_limit + self._data_sort = data_sort + + # -------------------------------------------------------------- # + + async def profile(self, session: aiohttp.ClientSession) -> User: + user_profile: dict = await api.get_profile( + profile_type="user_profile", profile_source=self._username, session=session + ) + return User( + name=user_profile.get("name"), + id=user_profile.get("id"), + is_verified=user_profile.get("verified"), + has_verified_email=user_profile.get("has_verified_email"), + is_gold=user_profile.get("is_gold"), + is_mod=user_profile.get("is_mod"), + is_employee=user_profile.get("is_employee"), + is_blocked=user_profile.get("is_blocked"), + hidden_from_bots=user_profile.get("hide_from_robots"), + accepts_followers=user_profile.get("accept_followers"), + comment_karma=user_profile.get("comment_karma"), + link_karma=user_profile.get("link_karma"), + total_karma=user_profile.get("total_karma"), + subreddit=user_profile.get("subreddit"), + created_at=user_profile.get("created"), + raw_data=user_profile, + ) + + # -------------------------------------------------------------- # + + async def posts(self, session: aiohttp.ClientSession) -> List[Post]: + user_posts: list = await api.get_posts( + posts_type="user_posts", + posts_source=self._username, + sort=self._data_sort, + limit=self._data_limit, + session=session, + ) + + return RedditPosts.process_posts(raw_posts=user_posts) + + # -------------------------------------------------------------- # + + async def comments(self, session: aiohttp.ClientSession) -> List[Comment]: + comments_list: list = [] + raw_comments: list = await api.get_posts( + posts_type="user_comments", + posts_source=self._username, + limit=self._data_limit, + sort=self._data_sort, + session=session, + ) + + for raw_comment in raw_comments: + comment_data: dict = raw_comment.get("data") + comment = Comment( + id=comment_data.get("id"), + text=comment_data.get("body"), + author=comment_data.get("author"), + author_is_premium=comment_data.get("author_premium"), + upvotes=comment_data.get("ups"), + downvotes=comment_data.get("downs"), + is_nsfw=comment_data.get("over_18"), + is_edited=comment_data.get("edited"), + score=comment_data.get("score"), + hidden_score=comment_data.get("score_hidden"), + gilded=comment_data.get("gilded"), + is_stickied=comment_data.get("stickied"), + is_locked=comment_data.get("locked"), + is_archived=comment_data.get("archived"), + create_at=comment_data.get("created"), + subreddit=comment_data.get("subreddit_name_prefixed"), + subreddit_type=comment_data.get("subreddit_type"), + post_id=comment_data.get("link_id"), + post_title=comment_data.get("link_title"), + raw_data=comment_data, + ) + comments_list.append(comment) + + return comments_list + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +class RedditSub: + # -------------------------------------------------------------- # + + def __init__(self, subreddit: str, data_limit: int, data_sort: str): + self._subreddit = subreddit + self._data_limit = data_limit + self._data_sort = data_sort + + # -------------------------------------------------------------- # + + async def profile(self, session: aiohttp.ClientSession) -> Subreddit: + subreddit_profile: dict = await api.get_profile( + profile_type="subreddit_profile", + profile_source=self._subreddit, + session=session, + ) + + return Subreddit( + name=subreddit_profile.get("display_name"), + id=subreddit_profile.get("id"), + description=subreddit_profile.get("public_description"), + submit_text=subreddit_profile.get("submit_text"), + icon_img=subreddit_profile.get("icon_img"), + subreddit_type=subreddit_profile.get("subreddit_type"), + subscribers=subreddit_profile.get("subscribers"), + active_users=subreddit_profile.get("accounts_active"), + is_nsfw=subreddit_profile.get("over18"), + language=subreddit_profile.get("lang"), + header_title=subreddit_profile.get("header_title"), + header_img=subreddit_profile.get("header_img"), + header_size=subreddit_profile.get("header_size"), + raw_data=subreddit_profile, + ) + + # -------------------------------------------------------------- # + + async def posts(self, session: aiohttp.ClientSession) -> List[Post]: + subreddit_posts: list = await api.get_posts( + posts_type="subreddit_posts", + posts_source=self._subreddit, + sort=self._data_sort, + limit=self._data_limit, + session=session, + ) + + return RedditPosts.process_posts(raw_posts=subreddit_posts) + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + + +class RedditPosts: + # -------------------------------------------------------------- # + + def __init__(self, limit: int, sort: str): + self._limit = limit + self._sort = sort + + # -------------------------------------------------------------- # + + @staticmethod + def process_posts(raw_posts: list) -> List[Post]: + posts_list: list = [] + for raw_post in raw_posts: + post_data = raw_post.get("data") + post = Post( + id=post_data.get("id"), + thumbnail=post_data.get("thumbnail"), + title=post_data.get("title"), + text=post_data.get("selftext"), + author=post_data.get("author"), + subreddit=post_data.get("subreddit"), + subreddit_id=post_data.get("subreddit_id"), + subreddit_type=post_data.get("subreddit_type"), + upvotes=post_data.get("ups"), + upvote_ratio=post_data.get("upvote_ratio"), + downvotes=post_data.get("downs"), + gilded=post_data.get("gilded"), + is_nsfw=post_data.get("over_18"), + is_shareable=post_data.get("is_reddit_media_domain"), + is_edited=post_data.get("edited"), + comments=post_data.get("num_comments"), + hide_from_bots=post_data.get("is_robot_indexable"), + score=post_data.get("score"), + domain=post_data.get("domain"), + permalink=post_data.get("permalink"), + is_locked=post_data.get("locked"), + is_archived=post_data.get("archived"), + created_at=post_data.get("created_utc"), + raw_post=post_data, + ) + posts_list.append(post) + return posts_list + + # -------------------------------------------------------------- # + + async def search(self, query: str, session: aiohttp.ClientSession) -> List[Post]: + search_posts: list = await api.get_posts( + posts_type="search_posts", + posts_source=query, + limit=self._limit, + sort=self._sort, + session=session, + ) + + return RedditPosts.process_posts(raw_posts=search_posts) + + # -------------------------------------------------------------- # + + async def listing( + self, listings_name: str, session: aiohttp.ClientSession + ) -> List[Post]: + listing_posts: list = await api.get_posts( + posts_type="listing_posts", + posts_source=listings_name, + limit=self._limit, + sort=self._sort, + session=session, + ) + + return RedditPosts.process_posts(raw_posts=listing_posts) + + # -------------------------------------------------------------- # + + async def front_page(self, session: aiohttp.ClientSession) -> List[Post]: + front_page_posts: list = await api.get_posts( + posts_type="front_page_posts", + limit=self._limit, + sort=self._sort, + session=session, + ) + + return RedditPosts.process_posts(raw_posts=front_page_posts) + + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/knewkarma/coreutils.py b/knewkarma/coreutils.py deleted file mode 100644 index fd1bdf9..0000000 --- a/knewkarma/coreutils.py +++ /dev/null @@ -1,297 +0,0 @@ -import argparse -import csv -import json -import logging -import os -from datetime import datetime -from typing import Union - -from rich.markdown import Markdown -from rich_argparse import RichHelpFormatter - -from . import CSV_DIRECTORY, JSON_DIRECTORY -from . import DATA_SORT_CRITERION, POST_LISTINGS - - -def create_parser() -> argparse.ArgumentParser: - """ - Creates and configures an argument parser for the command line arguments. - - :return: A configured argparse.ArgumentParser object ready to parse the command line arguments. - """ - from . import ( - __description__, - __epilog__, - __post_example__, - __posts_examples__, - __search_examples__, - __user_examples__, - __subreddit_examples__, - __operations_description__, - __version__, - ) - - parser = argparse.ArgumentParser( - description=Markdown(__description__, style="argparse.text"), - epilog=Markdown(__epilog__, style="argparse.text"), - formatter_class=RichHelpFormatter, - ) - - subparsers = parser.add_subparsers( - dest="mode", help="Operation mode", required=False - ) - - # User mode - user_parser = subparsers.add_parser( - "user", - help="User operations", - description=Markdown( - __operations_description__.format("User"), style="argparse.text" - ), - epilog=Markdown(__user_examples__), - formatter_class=RichHelpFormatter, - ) - user_parser.add_argument("username", help="Username to query") - user_parser.add_argument( - "-p", - "--profile", - action="store_true", - help="Get user profile ([italic][green]default execution[/][/])", - ) - user_parser.add_argument( - "-c", - "--comments", - action="store_true", - help="Get user comments", - ) - user_parser.add_argument( - "-pp", "--posts", action="store_true", help="Get user posts" - ) - - # Subreddit mode - subreddit_parser = subparsers.add_parser( - "subreddit", - help="Subreddit operations", - description=Markdown( - __operations_description__.format("Subreddit"), style="argparse.text" - ), - epilog=Markdown(__subreddit_examples__), - formatter_class=RichHelpFormatter, - ) - subreddit_parser.add_argument( - "subreddit", - help="Subreddit to query", - ) - subreddit_parser.add_argument( - "-p", - "--profile", - action="store_true", - help="Get subreddit profile ([italic][green]default execution[/][/])", - ) - subreddit_parser.add_argument( - "-pp", - "--posts", - action="store_true", - help="Get subreddit posts", - ) - - # Post mode - post_parser = subparsers.add_parser( - "post", - help="Post operations", - description=Markdown( - __operations_description__.format("Post"), style="argparse.text" - ), - epilog=Markdown(__post_example__), - formatter_class=RichHelpFormatter, - ) - post_parser.add_argument("post_id", help="Post ID") - post_parser.add_argument("post_subreddit", help="Source subreddit") - - # Posts mode - posts_parser = subparsers.add_parser( - "posts", - help="Posts operations", - description=Markdown( - __operations_description__.format("Posts"), style="argparse.text" - ), - epilog=Markdown(__posts_examples__), - formatter_class=RichHelpFormatter, - ) - posts_parser.add_argument( - "-f", - "--front-page", - help="Get posts from Reddit Front-Page ([italic][green]default execution[/][/])", - action="store_true", - ) - posts_parser.add_argument( - "-l", - "--listing", - help="Get posts from a specified listing", - choices=POST_LISTINGS, - ) - - # Search mode - search_parser = subparsers.add_parser( - "search", - help="Search posts", - description=Markdown( - __operations_description__.format("Search"), style="argparse.text" - ), - epilog=Markdown(__search_examples__), - formatter_class=RichHelpFormatter, - ) - search_parser.add_argument("query", help="Search query") - - # Global options - parser.add_argument( - "-s", - "--sort", - dest="sort_criterion", - choices=DATA_SORT_CRITERION, - help="Bulk data sort criterion", - ) - parser.add_argument( - "-l", - "--limit", - dest="data_limit", - type=int, - help="Bulk data output limit", - ) - parser.add_argument( - "-j", - "--json", - help="Write data to a JSON file.", - action="store_true", - ) - parser.add_argument( - "-c", - "--csv", - help="Write data to a CSV file.", - action="store_true", - ) - parser.add_argument( - "-d", - "--debug", - help="Run Knew Karma in debug mode.", - action="store_true", - ) - parser.add_argument( - "-v", - "--version", - version=__version__, - action="version", - ) - - return parser - - -def convert_timestamp_to_datetime(timestamp: float) -> str: - """ - Converts a Unix timestamp to a formatted datetime string. - - :param timestamp: The Unix timestamp to be converted. - :return: A formatted datetime string in the format "dd MMMM yyyy, hh:mm:ssAM/PM". - """ - utc_from_timestamp: datetime = datetime.fromtimestamp(timestamp) - datetime_object: utc_from_timestamp = utc_from_timestamp.strftime( - "%d %B %Y, %I:%M:%S%p" - ) - return datetime_object - - -def data_broker(api_data: dict, data_file: str) -> dict: - """ - Re-formats API data based on a key mapping from a JSON file. - - :param api_data: A JSON object containing raw data from the API. - :param data_file: Path to the JSON file that contains the key mapping. - - :returns: A re-formatted JSON object with human-readable keys. - """ - from . import CURRENT_FILE_DIRECTORY - - # Construct path to the mapping data file - mapping_data_file: str = os.path.join(CURRENT_FILE_DIRECTORY, "data", data_file) - - # Load the mapping from the specified file - with open(mapping_data_file, "r", encoding="utf-8") as file: - mapping_data: dict = json.load(file) - - # Initialize an empty dictionary to hold the formatted data - formatted_data = {} - - # Map API data to human-readable format using the mapping - for api_data_key, mapping_data_key in mapping_data.items(): - formatted_data[mapping_data_key]: dict = api_data.get(api_data_key, "N/A") - - return formatted_data - - -def path_finder(): - """ - Creates file directories if they don't already exist. - """ - file_directories: list = [CSV_DIRECTORY, JSON_DIRECTORY] - for directory in file_directories: - os.makedirs(directory, exist_ok=True) - - -def save_data( - data: Union[dict, list], - filename: str, - save_to_json: bool = False, - save_to_csv: bool = False, -): - """ - Save the given data to JSON and/or CSV files based on the arguments. - - :param data: The data to be saved, which is a list of dictionaries. - :param filename: The base filename to use when saving. - :param save_to_json: A boolean value to indicate whether to save data as a JSON file. - :param save_to_csv: A boolean value to indicate whether to save data as a CSV file. - """ - # Save to JSON if save_json is True - if save_to_json: - with open(os.path.join(JSON_DIRECTORY, f"{filename}.json"), "w") as json_file: - json.dump(data, json_file, indent=4) - log.info(f"JSON data saved to [link file://{json_file.name}]{json_file.name}") - - # Save to CSV if save_csv is True - if save_to_csv: - with open( - os.path.join(CSV_DIRECTORY, f"{filename}.csv"), "w", newline="" - ) as csv_file: - writer = csv.writer(csv_file) - # Write the header based on keys from the first dictionary - header = data.keys() - writer.writerow(header) - - # Write each row - writer.writerow(data.values()) - log.info(f"CSV data saved to [link file://{csv_file.name}]{csv_file.name}") - - -def setup_logging(debug_mode: bool) -> logging.getLogger: - """ - Configure and return a logging object with the specified log level. - - :param debug_mode: A boolean value indicating whether log level should be set to DEBUG. - :return: A logging object configured with the specified log level. - """ - from rich.logging import RichHandler - - logging.basicConfig( - level="NOTSET" if debug_mode else "INFO", - format="%(message)s", - handlers=[ - RichHandler( - markup=True, log_time_format="[%I:%M:%S %p]", show_level=debug_mode - ) - ], - ) - return logging.getLogger("Knew Karma") - - -arguments: argparse = create_parser().parse_args() -log: logging = setup_logging(debug_mode=arguments.debug) diff --git a/knewkarma/data/post/profile.json b/knewkarma/data/post/profile.json deleted file mode 100644 index 3796c34..0000000 --- a/knewkarma/data/post/profile.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "id": "🆔 ID", - "subreddit_name_prefixed": "🏢 Subreddit", - "subreddit_id": "🆔 Subreddit ID", - "subreddit_type": "🏢 Subreddit Type", - "ups": "⬆️ Upvotes", - "upvote_ratio": "📈 Upvote Ratio", - "downs": "⬇️ Downvotes", - "thumbnail": "🖼️ Thumbnail", - "gilded": "⭐ Gilded", - "over_18": "🔞 Is NSFW?", - "is_crosspostable": "↪️ Is Crosspostable?", - "edited": "📝 Is Edited?", - "is_robot_indexable": "🤖 Is Robot Indexable?", - "num_comments": "💬 Comments", - "score": "📊 Score", - "domain": "🌐 Domain", - "permalink": "🔗 Permalink", - "link_flair_text": "🎆 Flair", - "full_link": "🔗 Full URL", - "stickied": "❔ Stickied", - "locked": "🔒 Locked", - "is_original_content": "❔ Original Content", - "is_reddit_media_domain": "❔ Is Reddit Media Domain", - "total_awards_received": "🏆 Total Awards", - "archived": "📁 Archived", - "quarantine": "😷 Quarantined", - "created": "📅 Posted On" -} diff --git a/knewkarma/data/shared/comment.json b/knewkarma/data/shared/comment.json deleted file mode 100644 index 9267f66..0000000 --- a/knewkarma/data/shared/comment.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "author": "👤 Author", - "subreddit_name_prefixed": "🏢 Subreddit", - "subreddit_type": "🏢 Subreddit Type", - "author_flair_type": "🎆 Author Flair Type", - "author_premium": "💰 Author Is Premium", - "link_title": "🗒️ Title", - "link_id": "🆔 ID", - "link_permalink": "🔗 Permalink", - "ups": "⬆️ Upvotes", - "downs": "⬇️ Downvotes", - "score": "📊 Score", - "score_hidden": "📊 Hidden Score", - "total_awards_received": "🏆 Total Awards", - "gilded": "⭐ Gilded", - "over_18": "🔞 Is NSFW", - "edited": "📝 Edited", - "stickied": "❔ Stickied", - "locked": "🔒 Locked", - "archived": "📁 Archived", - "quarantined": "😷 Quarantined" -} \ No newline at end of file diff --git a/knewkarma/data/subreddit/allows.json b/knewkarma/data/subreddit/allows.json deleted file mode 100644 index 0f80e1d..0000000 --- a/knewkarma/data/subreddit/allows.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "allow_talks": "🗣️ Talks", - "allow_polls": "🗳️ Polls", - "allow_videogifs": "🎞️ Video Gifs", - "allow_videos": "🎬 Videos", - "allow_images": "🖼️ Images", - "allow_galleries": "📂 Galleries", - "allow_predictions": "🔮 Predictions", - "allow_predictions_tournament": "🔮 Predictions Tournament", - "allow_prediction_contributors": "🔮 Predictions Contributors", - "allow_chat_post_creation": "🗨️ Chat Posts", - "allow_discovery": "🔍 Discovery" -} diff --git a/knewkarma/data/subreddit/banner.json b/knewkarma/data/subreddit/banner.json deleted file mode 100644 index 44a5142..0000000 --- a/knewkarma/data/subreddit/banner.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "banner_img": "🖼️ Image", - "banner_background_color": "🎨 Background Color" -} diff --git a/knewkarma/data/subreddit/flairs.json b/knewkarma/data/subreddit/flairs.json deleted file mode 100644 index 9e11446..0000000 --- a/knewkarma/data/subreddit/flairs.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "link_flair_enabled": "🔗 Link Flair Enabled", - "can_assign_link_flair": "❔ Can Assign Link Flair", - "link_flair_position": "📏 Link Flair Position", - "user_flair_type": "👤 User Flair Type", - "user_flair_position": "📏 User Flair Position", - "user_flair_enabled_in_sr": "❔ User Flair Enabled In Sr", - "can_assign_user_flair": "❔ Can Assign User Flair", - "user_flair_richtext": "📃 User Flair Richtext" -} diff --git a/knewkarma/data/subreddit/header.json b/knewkarma/data/subreddit/header.json deleted file mode 100644 index ed16048..0000000 --- a/knewkarma/data/subreddit/header.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "header_size": "📐 Size", - "header_title": "📃 Title", - "header_img": "🖼️ Image" -} diff --git a/knewkarma/data/subreddit/profile.json b/knewkarma/data/subreddit/profile.json deleted file mode 100644 index 0f71b0f..0000000 --- a/knewkarma/data/subreddit/profile.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "id": "🆔 ID", - "subreddit_type": "🏢 Subreddit Type", - "accounts_active": "👥 Current Active Users", - "subscribers": "🔔 Subscribers", - "lang": "🌐 Language", - "free_form_reports": "❔ Free Form Reports", - "wiki_enabled": "❔ Wiki Enabled", - "over18": "🔞 Over 18", - "spoilers_enabled": "🤫 Spoilers", - "icon_img": "🖼️ Icon Image", - "icon_size": "📐 Icon Size", - "submit_link_label": "📃 Submit Link Label", - "public_traffic": "🚦 Public Traffic", - "whitelist_status": "⬜ Whitelist Status", - "show_media": "❔ Show Media", - "user_sr_theme_enabled": "❔ User Sr Theme Enabled", - "show_media_preview": "❔ Show Media Preview", - "comment_score_hide_mins": "⏳ Comment Score Hide Mins" -} diff --git a/knewkarma/data/user/karma.json b/knewkarma/data/user/karma.json deleted file mode 100644 index 0434267..0000000 --- a/knewkarma/data/user/karma.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "link_karma": "🔗 Link", - "comment_karma": "💬 Comment", - "awarder_karma": "🫴 Awarder", - "awardee_karma": "🏆 Awardee", - "total_karma": "📊 Total" -} \ No newline at end of file diff --git a/knewkarma/data/user/profile.json b/knewkarma/data/user/profile.json deleted file mode 100644 index 64e6118..0000000 --- a/knewkarma/data/user/profile.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "🆔 ID", - "hide_from_robots": "🤖 Is Hidden From Bots", - "is_gold": "⭐ Is Gold", - "is_mod": "👑 Is Mod", - "is_employee": "💼 Is Employee", - "is_blocked": "🚫 Is Blocked", - "accept_followers": "👥 Accept Followers", - "has_subscribed": "🔔 Has Subscribed" -} \ No newline at end of file diff --git a/knewkarma/data/user/snoovatar.json b/knewkarma/data/user/snoovatar.json deleted file mode 100644 index 1bd40fe..0000000 --- a/knewkarma/data/user/snoovatar.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "pref_show_snoovatar": "👁️ Show", - "snoovatar_img": "🔗 URI", - "snoovatar_size": "📐 Size" -} diff --git a/knewkarma/data/user/subreddit.json b/knewkarma/data/user/subreddit.json deleted file mode 100644 index 9a8f3e1..0000000 --- a/knewkarma/data/user/subreddit.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "accept_followers": "👥 Accept Followers", - "allowed_media_in_comments": "☑️ Allow Media in Comments", - "banner_img": "🖼️ Banner Image", - "default_set": "❔ Default Set", - "disable_contributor_requests": "⛔ Disable Contributor Requests", - "free_form_reports": "🗣️ Free-form Reports", - "icon_color": "🎨 Icon Color", - "icon_img": "🖼️ Icon Image", - "icon_size": "📐 Icon Size", - "is_default_banner": "❔ Is Default Banner", - "is_default_icon": "❔ Is Default Icon", - "key_color": "🎨 Key Color", - "link_flair_enabled": "🔗 Link Flair Enabled", - "link_flair_position": "🔗 Link Flair Position", - "over_18": "🔞 Is NSFW", - "previous_names": "📛 Previous Names", - "primary_color": "🎨 Primary Color", - "public_description": "📜 Description", - "quarantine": "😷 Quarantine", - "restrict_commenting": "💬 Restrict Commenting", - "restrict_posting": "📝 Restrict Posting", - "show_media": "👁️ Show Media", - "submit_link_label": "🔗 Submit Link Label", - "submit_text_label": "🔗 Submit Text Label", - "subreddit_type": "🏢 Subreddit Type", - "subscribers": "🔔 Subscribers", - "url": "🌐 URL" -} \ No newline at end of file diff --git a/knewkarma/data/user/verification.json b/knewkarma/data/user/verification.json deleted file mode 100644 index d8a20ee..0000000 --- a/knewkarma/data/user/verification.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "verified": "❔ Is Verified", - "has_verified_email": "✉️ Has Verified Email" -} \ No newline at end of file diff --git a/knewkarma/examples/posts.py b/knewkarma/examples/posts.py new file mode 100644 index 0000000..05936bd --- /dev/null +++ b/knewkarma/examples/posts.py @@ -0,0 +1,20 @@ +import asyncio + +import aiohttp + +from knewkarma import RedditPosts + + +async def async_posts(limit: int, sort: str): + posts = RedditPosts(limit=limit, sort=sort) + async with aiohttp.ClientSession() as session: + front_page_posts = await posts.front_page(session=session) + listing_posts = await posts.listing(listings_name="best", session=session) + search_results = await posts.search(query="covid-19", session=session) + + print(front_page_posts) + print(listing_posts) + print(search_results) + + +asyncio.run(async_posts(limit=100, sort="all")) diff --git a/knewkarma/examples/subreddit.py b/knewkarma/examples/subreddit.py new file mode 100644 index 0000000..dcea2dd --- /dev/null +++ b/knewkarma/examples/subreddit.py @@ -0,0 +1,30 @@ +import asyncio + +import aiohttp + +from knewkarma import RedditSub + + +# Define an asynchronous function to fetch Subreddit data +async def async_subreddit(subreddit_name: str, data_limit: int, data_sort: str): + # Initialize a RedditSub object with the specified subreddit, data limit, and sorting criteria + subreddit = RedditSub( + subreddit=subreddit_name, data_limit=data_limit, data_sort=data_sort + ) + + # Create an asynchronous HTTP session + async with aiohttp.ClientSession() as session: + # Fetch subreddit's profile + profile = await subreddit.profile(session=session) + + # Fetch subreddit's posts + posts = await subreddit.posts(session=session) + + print(profile) + print(posts) + + +# Run the asynchronous function with specified subreddit name, data limit, and sorting criteria +asyncio.run( + async_subreddit(subreddit_name="MachineLearning", data_limit=100, data_sort="top") +) diff --git a/knewkarma/examples/user.py b/knewkarma/examples/user.py new file mode 100644 index 0000000..da2ed10 --- /dev/null +++ b/knewkarma/examples/user.py @@ -0,0 +1,30 @@ +import asyncio + +import aiohttp + +from knewkarma import RedditUser + + +# Define an asynchronous function to fetch User +async def async_user(username: str, data_limit: int, data_sort: str): + # Initialize a RedditUser object with the specified username, data limit, and sorting criteria + user = RedditUser(username=username, data_limit=data_limit, data_sort=data_sort) + + # Establish an asynchronous HTTP session + async with aiohttp.ClientSession() as session: + # Fetch user's profile + profile = await user.profile(session=session) + + # Fetch user's posts + posts = await user.posts(session=session) + + # Fetch user's comments + comments = await user.comments(session=session) + + print(profile) + print(posts) + print(comments) + + +# Run the asynchronous function with a specified username, data limit, and sorting parameter +asyncio.run(async_user(username="automoderator", data_limit=100, data_sort="all")) diff --git a/knewkarma/executor.py b/knewkarma/executor.py deleted file mode 100644 index 1d65a0c..0000000 --- a/knewkarma/executor.py +++ /dev/null @@ -1,231 +0,0 @@ -import argparse - -from rich.prompt import Prompt, Confirm - -from . import OPERATION_MODES, DATA_SORT_CRITERION, POST_LISTINGS -from .masonry import Masonry - - -class Executor: - def __init__(self, arguments: argparse, tree_masonry: Masonry): - """ - Initializes the Executor class which is responsible for handling command-line arguments - and invoking the appropriate methods based on user input. - - :param arguments: An argparse object containing command-line arguments. - :param tree_masonry: An instance of the Masonry class, which provides functionalities - to process and display tree structures for various data types. - """ - self.tree_masonry = tree_masonry - self.arguments = arguments - self.handlers = self.Handlers(executor=self) - - def executor_cli(self): - """ - Determines the operation mode based on command-line arguments or interactive input, - and executes the corresponding handler function. - """ - operation_mode: str = self.arguments.mode or Prompt.ask( - "Select operation mode", - choices=OPERATION_MODES, - default="user", - ) - - # Call an appropriate handler based on the user-specified operation mode - if operation_mode == "user": - self.handlers.user_handler( - username=self.arguments.username - if hasattr(self.arguments, "username") - else Prompt.ask(f"({operation_mode}) Username", default="automoderator") - ) - - elif operation_mode == "subreddit": - self.handlers.subreddit_handler( - subreddit=self.arguments.subreddit - if hasattr(self.arguments, "subreddit") - else Prompt.ask(f"({operation_mode}) Subreddit", default="osint") - ) - - elif operation_mode == "search": - self.tree_masonry.posts_tree( - posts_type="search_posts", - posts_source=self.arguments.query - if hasattr(self.arguments, "query") - else Prompt.ask(f"({operation_mode}) Query", default="osint"), - show_author=True, - sort_criterion=self.arguments.sort_criterion or self.handlers.sort_criterion, - posts_limit=self.arguments.data_limit or self.handlers.data_limit, - save_to_json=self.arguments.json or self.handlers.save_to_json, - ) - - elif operation_mode == "post": - self.tree_masonry.post_data_tree( - post_id=self.arguments.post_id - if hasattr(self.arguments, "post_id") - else Prompt.ask(f"({operation_mode}) Post ID", default="12csg48"), - post_subreddit=self.arguments.post_subreddit - if hasattr(self.arguments, "post_subreddit") - else Prompt.ask( - f"({operation_mode}) Post source subreddit", default="osint" - ), - sort=self.arguments.sort_criterion or self.handlers.sort_criterion, - limit=self.arguments.data_limit or self.handlers.data_limit, - save_to_json=self.arguments.json or self.handlers.save_to_json, - ) - elif operation_mode == "posts": - self.handlers.posts_handler() - elif operation_mode == "quit": - import sys - - sys.exit() - - class Handlers: - def __init__(self, executor): - """ - Initializes the Handlers class, which contains functions to handle specific types of data requests. - - :param executor: The Caller instance that this Handlers class is a part of. - """ - - self.arguments: argparse = executor.arguments - self.tree_masonry: Masonry = executor.tree_masonry - self.sort_criterion: str = ( - self.arguments.sort_criterion or Prompt.ask("Set (bulk) data sort criterion", - choices=DATA_SORT_CRITERION, - default="all", - )) - self.data_limit: int = self.arguments.data_limit or Prompt.ask("Set (bulk) data output limit", - default="50") - self.save_to_json: bool = self.arguments.json or Confirm.ask( - "Would you like to save output to a JSON file?", default=False - ) - if not hasattr(self.arguments, "post_id"): - self.save_to_csv: bool = self.arguments.csv or Confirm.ask( - "Would you like to save output to a CSV file?", default=False - ) - - def get_action(self, actions_map: dict, default_action: str) -> str: - """ - Determines the action to perform based on the command-line arguments or interactive input. - - :param actions_map: A dictionary mapping action names to their corresponding functions. - :param default_action: The default action to choose if no command-line argument is provided. - :return: The chosen action name. - """ - # Determine action from CLI arguments, default to None if not found - action: str = next( - ( - action_name - for action_name in actions_map - if getattr(self.arguments, action_name, False) - ), - None, - ) - - # If no CLI argument for action, ask user interactively - return action or Prompt.ask( - "What type of data would you like to get?", - choices=list(actions_map.keys()), - default=default_action, - ) - - def user_handler(self, username: str): - """ - Handles data requests related to a Reddit user. - - :param username: Username of the Reddit user to request data for. - """ - # Map user-related actions to corresponding functions - user_actions_map: dict = { - "profile": lambda: self.tree_masonry.profile_tree( - profile_type="user_profile", - profile_source=username, - save_to_json=self.save_to_json, - save_to_csv=self.save_to_csv, - ), - "posts": lambda: self.tree_masonry.posts_tree( - posts_source=username, - posts_type="user_posts", - posts_limit=self.data_limit, - sort_criterion=self.sort_criterion, - save_to_json=self.save_to_json, - ), - "comments": lambda: self.tree_masonry.user_comments_tree( - username=username, - sort_criterion=self.sort_criterion, - comments_limit=self.data_limit, - save_to_json=self.save_to_json, - ), - } - - # Get and execute the chosen action - action: str = self.get_action( - actions_map=user_actions_map, default_action="profile" - ) - - user_actions_map.get(action)() - - def subreddit_handler(self, subreddit: str): - """ - Handles data requests related to a Subreddit. - - :param subreddit: Name of the subreddit to request data for. - """ - # Map subreddit-related actions to corresponding functions - subreddit_actions_map: dict = { - "profile": lambda: self.tree_masonry.profile_tree( - profile_type="subreddit_profile", - profile_source=subreddit, - save_to_json=self.save_to_json, - save_to_csv=self.save_to_csv, - ), - "posts": lambda: self.tree_masonry.posts_tree( - posts_source=subreddit, - posts_type="subreddit_posts", - posts_limit=self.data_limit, - sort_criterion=self.sort_criterion, - save_to_json=self.save_to_json, - show_author=True, - ), - } - - # Get and execute the chosen action - action: str = self.get_action( - actions_map=subreddit_actions_map, default_action="profile" - ) - subreddit_actions_map.get(action)() - - def posts_handler(self): - """ - Handles data requests related to Reddit posts. - """ - # Map subreddit-related actions to corresponding functions - posts_actions_map: dict = { - "front_page": lambda: self.tree_masonry.posts_tree( - posts_type="front_page_posts", - posts_limit=self.data_limit, - show_author=True, - sort_criterion=self.sort_criterion, - save_to_json=self.save_to_json, - ), - "listing": lambda: self.tree_masonry.posts_tree( - posts_type="listing_posts", - posts_source=self.arguments.listing - if hasattr(self.arguments, "listing") - else Prompt.ask( - "(posts) Select listing to get posts from", - choices=POST_LISTINGS, - default="all" - ), - posts_limit=self.data_limit, - show_author=True, - sort_criterion=self.sort_criterion, - save_to_json=self.save_to_json, - ), - } - - # Get and execute the chosen action - action: str = self.get_action( - actions_map=posts_actions_map, default_action="front_page" - ) - posts_actions_map.get(action)() diff --git a/knewkarma/icons/icon.ico b/knewkarma/icons/icon.ico deleted file mode 100644 index 3444786..0000000 Binary files a/knewkarma/icons/icon.ico and /dev/null differ diff --git a/knewkarma/icons/icon.png b/knewkarma/icons/icon.png deleted file mode 100644 index 892563c..0000000 Binary files a/knewkarma/icons/icon.png and /dev/null differ diff --git a/knewkarma/knewkarma.py b/knewkarma/knewkarma.py deleted file mode 100644 index aba452e..0000000 --- a/knewkarma/knewkarma.py +++ /dev/null @@ -1,30 +0,0 @@ -def on_call(): - from . import __version__ - from .executor import Executor - from .coreutils import datetime, log, path_finder, arguments - from .masonry import Masonry - - print( - """ -┓┏┓ ┓┏┓ -┃┫ ┏┓┏┓┓┏┏ ┃┫ ┏┓┏┓┏┳┓┏┓ -┛┗┛┛┗┗ ┗┻┛ ┛┗┛┗┻┛ ┛┗┗┗┻""" - ) - tree_masonry: Masonry = Masonry() - start_time: datetime = datetime.now() - - path_finder() - try: - if arguments.mode: - log.info( - f"[bold]Knew Karma[/] {__version__} started at " - f"{start_time.strftime('%a %b %d %Y, %I:%M:%S %p')}..." - ) - - tree_masonry.api.get_updates() - executor = Executor(arguments=arguments, tree_masonry=tree_masonry) - executor.executor_cli() - except KeyboardInterrupt: - log.warning(f"User interruption detected ([yellow]Ctrl+C[/])") - finally: - log.info(f"Stopped in {datetime.now() - start_time} seconds.") diff --git a/knewkarma/masonry.py b/knewkarma/masonry.py deleted file mode 100644 index 0ae374c..0000000 --- a/knewkarma/masonry.py +++ /dev/null @@ -1,386 +0,0 @@ -from datetime import datetime -from typing import Union - -from rich import print as xprint -from rich.text import Text -from rich.tree import Tree - -from .coreutils import convert_timestamp_to_datetime, data_broker, save_data - - -class Masonry: - def __init__(self): - """ - Initialises the Masonry class by creating an API object for data retrieval. - The API endpoint is set for Reddit. - """ - from .api import Api - - self.api: Api = Api(base_reddit_endpoint="https://www.reddit.com") - - # Tree/Branch styling - self.DIM = "dim" - self.BOLD = "bold" - self.ITALIC = "italic" - self.BOLD_BLUE = "bold blue" - self.BOLD_BRIGHT_BLUE = "bold bright_blue" - - def create_tree( - self, - tree_title: str, - tree_data: Union[dict, list] = None, - additional_text: str = None, - additional_data: [(str, Union[dict, list])] = None, - ) -> Tree: - """ - Creates a tree structure and populates it with the given data. - - :param tree_title: Title of the tree. - :param tree_data: Data to populate the tree with. - :param additional_text: Additional text to add at the end of the tree. - :param additional_data: A list of tuples containing additional data such that should be added to the tree. - Data format: ("title" [str], data [dict or list]) - :returns: A populated or emtpy tree structure. - """ - if not tree_data: - return Tree(tree_title, style=self.BOLD, guide_style=self.BOLD_BRIGHT_BLUE) - - tree: Tree = Tree( - tree_title, style=self.BOLD, guide_style=self.BOLD_BRIGHT_BLUE - ) - data_types: list = [dict, list] - if type(tree_data) in data_types: - if isinstance(tree_data, dict): - for data_key, data_value in tree_data.items(): - tree.add(f"{data_key}: {data_value}", style=self.DIM) - else: - for count, item in enumerate(tree_data, start=1): - tree.add(f"{count}: {item}", style=self.DIM) - - if additional_data: - for title, branch_data in additional_data: - if type(branch_data) in data_types: - if isinstance(branch_data, dict): - self.add_branch( - target_tree=tree, - branch_title=title, - branch_data=branch_data, - ) - else: - for item in branch_data: - self.add_branch( - target_tree=tree, - branch_title=title, - branch_data=item, - ) - - if additional_text: - tree.add(Text(additional_text), style=self.ITALIC) - - return tree - - def add_branch( - self, - target_tree: Tree, - branch_title: str, - branch_data: Union[dict, list], - additional_text: str = None, - ): - """ - Adds a branch to an existing tree. - - This is a utility method for adding detailed branches - to a tree created using the create_tree method. - - :param target_tree: The tree to which the branch will be added. - :param branch_title: Title of the branch. - :param branch_data: Data for the branch, either a dict or a list. - :param additional_text: Additional text to be appended at the end of the branch. - :returns: The updated tree with the new branch. - """ - data_types: list = [dict, list] - if type(branch_data) in data_types: - branch: Tree = target_tree.add(branch_title, guide_style=self.BOLD_BLUE) - if isinstance(branch_data, dict): - for data_key, data_value in branch_data.items(): - branch.add(f"{data_key}: {data_value}", style=self.DIM) - else: - for count, item in enumerate(branch_data, start=1): - branch.add(f"{count}. {item}") - - if additional_text: - branch.add(Text(additional_text), style=self.ITALIC) - - return target_tree - - def profile_tree( - self, - profile_source: str, - profile_type: str, - save_to_json: bool = False, - save_to_csv: bool = False, - ): - """ - Visualises a Reddit profile's data from a specified source into a tree structure. - - This method - can handle different types of profiles like user or subreddit profiles. - - :param profile_source: Source of the profile data. - :param profile_type: Type of the profile (e.g., 'user_profile', 'subreddit_profile'). - :param save_to_json: If True, saves the profile data to a JSON file. - :param save_to_csv: If True, saves the profile data to a CSV file. - """ - profile_data: dict = self.api.get_profile( - profile_type=profile_type, profile_source=profile_source - ) - - if profile_data: - if profile_type == "user_profile": - formatted_profile: dict = data_broker( - api_data=profile_data, data_file="user/profile.json" - ) - additional_data: list = [ - ( - profile_data.get("subreddit").get("display_name"), - data_broker(profile_data.get("subreddit"), data_file="user/subreddit.json"), - ), - ( - "Verification", - data_broker(profile_data, data_file="user/verification.json"), - ), - ( - "Snoovatar", - data_broker(profile_data, data_file="user/snoovatar.json"), - ), - ( - "Karma", - data_broker(profile_data, data_file="user/karma.json"), - ), - ] - else: - formatted_profile: dict = data_broker( - api_data=profile_data, data_file="subreddit/profile.json" - ) - - additional_data: list = [ - ( - "Allows", - data_broker( - api_data=profile_data, data_file="subreddit/allows.json" - ), - ), - ( - "Banner", - data_broker( - api_data=profile_data, data_file="subreddit/banner.json" - ), - ), - ( - "Header", - data_broker( - api_data=profile_data, data_file="subreddit/header.json" - ), - ), - ( - "Flairs", - data_broker( - api_data=profile_data, data_file="subreddit/flairs.json" - ), - ), - ] - - xprint( - self.create_tree( - tree_title=profile_data.get("public_description") - if profile_type == "subreddit_profile" - else profile_data.get("subreddit").get("title"), - tree_data=formatted_profile, - additional_data=additional_data, - additional_text=profile_data.get("submit_text") - if profile_type == "subreddit_profile" - else None, - ) - ) - - save_data( - data=profile_data, - save_to_csv=save_to_csv, - save_to_json=save_to_json, - filename=f"{profile_source}_{profile_type.upper()}", - ) - - def post_data_tree( - self, - post_id: str, - post_subreddit: str, - sort: str, - limit: int, - save_to_json: bool, - ): - """ - Visualises a specific Reddit post's data in a tree structure. - - This method includes options to sort, limit, and show comments, as well as to save the data. - - :param post_id: ID of the post to visualise. - :param post_subreddit: Subreddit of the post. - :param sort: Criterion to sort the post data. - :param limit: The maximum number of items (comments/awards) to retrieve. - :param save_to_json: If True, saves the post data to a JSON file. - """ - - (raw_data, post_data, comments_list) = self.api.get_post_data( - post_id=post_id, - subreddit=post_subreddit, - comments_sort_criterion=sort, - comments_limit=limit, - ) - - if post_data: - post_tree: Tree = self.create_tree( - tree_title=f"{post_data.get('title')} | by {post_data.get('author')}", - tree_data=data_broker( - api_data=post_data, data_file="post/profile.json" - ), - additional_text=post_data.get("selftext"), - ) - - if comments_list: - comments_branch: Tree = post_tree.add("Comments") - - # Remove last item from the list - # (because it does not contain any comment data... trust me, I know😂) - comments_list.pop() - for comment in comments_list: - comment_data: dict = comment.get("data") - self.add_branch( - target_tree=comments_branch, - branch_title=convert_timestamp_to_datetime( - timestamp=comment_data.get("created") - ), - branch_data=data_broker( - api_data=comment_data, - data_file="shared/comment.json", - ), - additional_text=comment_data.get("body"), - ) - - xprint(post_tree) - save_data( - data=raw_data, - save_to_json=save_to_json, - filename=f"{post_data.get('id')}_POST_DATA", - ) - - def posts_tree( - self, - sort_criterion: str, - posts_limit: int, - posts_type: str, - save_to_json: bool = False, - posts_source: str = None, - show_author: bool = False, - ): - """ - Visualises Reddit posts' data from a specified source into a tree structure. - - This method includes options to sort, limit, and save the number of posts visualised. - - :param sort_criterion: Criterion to sort the posts. - :param posts_limit: The maximum number of posts to visualise. - :param posts_type: Type of posts to visualise (e.g., 'hot', 'new'). - :param save_to_json: If True, saves the posts data to a JSON file. - :param posts_source: Source of the posts' data. - :param show_author: If True, includes the author's username in the visualisation. - """ - posts_list: list = self.api.get_posts( - posts_sort_criterion=sort_criterion, - posts_limit=posts_limit, - posts_type=posts_type, - posts_source=posts_source, - ) - - if posts_list: - posts_tree: Tree = self.create_tree( - tree_title=f"{posts_limit} {posts_type} - {datetime.now()}" - ) - - for post in posts_list: - # Set branch title to show the post author's username if the show_author is True. - if show_author: - branch_title: str = ( - f"{convert_timestamp_to_datetime(post.get('data').get('created'))} | by" - f" u/{post.get('data').get('author')}: {post.get('data').get('title')}" - ) - else: - # Otherwise, set the title of the branch to the title of the post. - branch_title: str = ( - f"{convert_timestamp_to_datetime(post.get('data').get('created'))}: " - f"{post.get('data').get('title')}" - ) - - self.add_branch( - branch_title=branch_title, - target_tree=posts_tree, - branch_data=data_broker( - api_data=post.get("data"), data_file="post/profile.json" - ), - additional_text=post.get("data").get("selftext"), - ) - - xprint(posts_tree) - save_data( - data=posts_list, - save_to_json=save_to_json, - filename=f"{posts_source}_{posts_type.upper()}", - ) - - def user_comments_tree( - self, - username: str, - sort_criterion: str, - comments_limit: int, - save_to_json: bool, - ): - """ - Visualises a Reddit user's comments in a tree structure. - - This method includes options to sort and limit the number of comments to visualise. - - :param username: Username whose comments are to be visualised. - :param sort_criterion: Criterion to sort the comments. - :param comments_limit: The maximum number of comments to visualise. - :param save_to_json: If True, saves the comments data to a JSON file. - """ - comments_list: list = self.api.get_posts( - posts_sort_criterion=sort_criterion, - posts_limit=comments_limit, - posts_type="user_comments", - posts_source=username, - ) - - if comments_list: - comments_tree: Tree = self.create_tree( - tree_title=f"{username}'s {sort_criterion} {comments_limit} comments" - ) - - for comment in comments_list: - raw_comment_data: dict = comment.get("data") - self.add_branch( - target_tree=comments_tree, - branch_title=convert_timestamp_to_datetime( - timestamp=raw_comment_data.get("created") - ), - branch_data=data_broker( - api_data=raw_comment_data, data_file="shared/comment.json" - ), - additional_text=raw_comment_data.get("body"), - ) - - xprint(comments_tree) - save_data( - data=comments_list, - save_to_json=save_to_json, - filename=f"{username}_COMMENTS", - ) diff --git a/knewkarma/metadata.py b/knewkarma/metadata.py new file mode 100644 index 0000000..213ea14 --- /dev/null +++ b/knewkarma/metadata.py @@ -0,0 +1,102 @@ +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +import os + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +author: str = "Richard Mwewa" +about: str = "https://about.me/rly0nheart" +version: str = "3.0.0.0" + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +description: str = f""" +# Knew Karma CLI {version} +> A **Reddit** Data Analysis Toolkit.""" +epilog: str = f""" +# by [{author}]({about}) +``` +MIT License + +Copyright © 2023 {author} + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` +""" + +operations_description: str = "# **{}** Operations" +user_examples: str = """ +# Examples +## Get User Profile +``` +knewkarma user automoderator --profile +``` + +## Get User Comments +``` +knewkarma user automoderator --comments +``` + +## Get User Posts +``` +knewkarma user automoderator --posts +``` +""" + +subreddit_examples: str = """ +# Examples +## Get Subreddit Profile +``` +knewkarma subreddit MachineLearning --profile +``` + +## Get Subreddit Posts +``` +knewkarma subreddit MachineLearning --posts +``` +""" + +posts_examples: str = """ +# Examples +## Get Posts from Reddit Front-Page +``` +knewkarma posts --front-page +``` + +## Search posts +``` +knewkarma posts --search "covid-19" +``` + +## Get Posts from A Specified Listing (unsorted and unlimited) +``` +knewkarma posts --listing best +``` +""" + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + +# Construct path to the program's directory +PROGRAM_DIRECTORY: str = os.path.expanduser(os.path.join("~", "knewkarma")) + +# Construct paths to directories of CSV and JSON files. +CSV_DIRECTORY: str = os.path.join(PROGRAM_DIRECTORY, "csv") +JSON_DIRECTORY: str = os.path.join(PROGRAM_DIRECTORY, "json") + +# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # diff --git a/pyproject.toml b/pyproject.toml index dbdb06b..61e4d22 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "knewkarma" -version = "2.4.2.0" +version = "3.0.0.0" description = "A Reddit Data Analysis Toolkit." authors = ["Richard Mwewa "] readme = "README.md" @@ -26,11 +26,9 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.10" - -plyer = "*" -requests = "*" +aiohttp = "*" rich = "*" rich-argparse = "*" [tool.poetry.scripts] -knewkarma = "knewkarma.knewkarma:on_call" +knewkarma = "knewkarma._cli:execute_cli"