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 @@
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
-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
- 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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
+ 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
@@ -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"