{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analyzing the Social Networks of over 2.7 Billion Reddit Comments" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "This notebook gives detailed information to help better understand our paper. In this notebook, we will demonstrate how to construct the subreddits' social networks created by more than 2.7 billion comments. Additionally, we will demonstrate how to calculate various statistics related to the subreddits. This code is licensed under a BSD license. See [license file]()." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 0. Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before we begin, make sure you have installed all the required Python packages. (The instructions below use pip. You can use easy_install, too.) Also, consider using virtualenv for a cleaner installation experience instead of sudo. We also recommend running the code via IPython Notebook.\n", "* sudo pip install --upgrade graphlab-create # We mainly used SFrame object, which is an open source package.\n", "* sudo pip install --upgrade praw\n", "* sudo pip install --upgrade seaborn\n", "* sudo pip install --upgrade networkx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Preparing the Dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we need to download the compressed Reddit dataset files from [pushshift.io website](http://files.pushshift.io/reddit/comments/). This dataset was created by [Jason Michael Baumgartner](https://twitter.com/jasonbaumgartne). Additional details about this dataset can be found at this [Link](https://www.reddit.com/r/datasets/comments/3bxlg7/i_have_every_publicly_available_reddit_comment/). Downloading this hundreds-of-GB dataset can take a considerable amount of time. To save time, you can download only one month’s, or several months’, worth of data. After we download the dataset, we notice that the dataset is organized in directories, where each directory contains the posts of a specific year. These directories contain posts that were published from December 2005 to the most recent month. For this tutorial, we utilized over 2.71 billion comments that were posted from December 2005 through October 2016. Let's create a single SFrame that contains all these posts. To achieve this, we first will convert each monthly zipped file into an SFrame object using the following code:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This non-commercial license of GraphLab Create for academic use is assigned .\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "[INFO] graphlab.cython.cy_server: GraphLab Create v1.10.1 started. Logging: /tmp/graphlab_server_1487345388.log\n" ] }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2009-09.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2009-09.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 1.59448 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 1.59448 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 88555 lines. Lines per second: 30815
" ], "text/plain": [ "Read 88555 lines. Lines per second: 30815" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 972023 lines. Lines per second: 112707
" ], "text/plain": [ "Read 972023 lines. Lines per second: 112707" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1590501 lines. Lines per second: 114090
" ], "text/plain": [ "Read 1590501 lines. Lines per second: 114090" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2009-09.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2009-09.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 2032276 lines in 17.5218 secs.
" ], "text/plain": [ "Parsing completed. Parsed 2032276 lines in 17.5218 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2007-07.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2007-07.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 0.198544 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 0.198544 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 94632 lines. Lines per second: 156665
" ], "text/plain": [ "Read 94632 lines. Lines per second: 156665" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2007-07.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2007-07.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 203319 lines in 1.03305 secs.
" ], "text/plain": [ "Parsing completed. Parsed 203319 lines in 1.03305 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2010-04.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2010-04.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 0.488607 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 0.488607 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 92878 lines. Lines per second: 110761
" ], "text/plain": [ "Read 92878 lines. Lines per second: 110761" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 987195 lines. Lines per second: 148575
" ], "text/plain": [ "Read 987195 lines. Lines per second: 148575" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1706306 lines. Lines per second: 140170
" ], "text/plain": [ "Read 1706306 lines. Lines per second: 140170" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 2334976 lines. Lines per second: 134364
" ], "text/plain": [ "Read 2334976 lines. Lines per second: 134364" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 2960967 lines. Lines per second: 128167
" ], "text/plain": [ "Read 2960967 lines. Lines per second: 128167" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2010-04.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2010-04.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 3209898 lines in 25.185 secs.
" ], "text/plain": [ "Parsing completed. Parsed 3209898 lines in 25.185 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2008-02.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2008-02.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 0.617535 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 0.617535 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 90266 lines. Lines per second: 136605
" ], "text/plain": [ "Read 90266 lines. Lines per second: 136605" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2008-02.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2008-02.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 441768 lines in 2.41619 secs.
" ], "text/plain": [ "Parsing completed. Parsed 441768 lines in 2.41619 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2013-11.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2013-11.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 0.398867 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 0.398867 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 93427 lines. Lines per second: 116655
" ], "text/plain": [ "Read 93427 lines. Lines per second: 116655" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1006340 lines. Lines per second: 164450
" ], "text/plain": [ "Read 1006340 lines. Lines per second: 164450" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1743658 lines. Lines per second: 150212
" ], "text/plain": [ "Read 1743658 lines. Lines per second: 150212" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 2391411 lines. Lines per second: 143870
" ], "text/plain": [ "Read 2391411 lines. Lines per second: 143870" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 3031451 lines. Lines per second: 137447
" ], "text/plain": [ "Read 3031451 lines. Lines per second: 137447" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 3594639 lines. Lines per second: 132832
" ], "text/plain": [ "Read 3594639 lines. Lines per second: 132832" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 4220255 lines. Lines per second: 128563
" ], "text/plain": [ "Read 4220255 lines. Lines per second: 128563" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 4753808 lines. Lines per second: 125179
" ], "text/plain": [ "Read 4753808 lines. Lines per second: 125179" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 5301805 lines. Lines per second: 123250
" ], "text/plain": [ "Read 5301805 lines. Lines per second: 123250" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 5931101 lines. Lines per second: 121575
" ], "text/plain": [ "Read 5931101 lines. Lines per second: 121575" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 6571219 lines. Lines per second: 120869
" ], "text/plain": [ "Read 6571219 lines. Lines per second: 120869" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 7197659 lines. Lines per second: 120042
" ], "text/plain": [ "Read 7197659 lines. Lines per second: 120042" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 7841761 lines. Lines per second: 119330
" ], "text/plain": [ "Read 7841761 lines. Lines per second: 119330" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 8375294 lines. Lines per second: 118202
" ], "text/plain": [ "Read 8375294 lines. Lines per second: 118202" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 9026227 lines. Lines per second: 117816
" ], "text/plain": [ "Read 9026227 lines. Lines per second: 117816" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 9566787 lines. Lines per second: 117109
" ], "text/plain": [ "Read 9566787 lines. Lines per second: 117109" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 10119730 lines. Lines per second: 116743
" ], "text/plain": [ "Read 10119730 lines. Lines per second: 116743" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 10671402 lines. Lines per second: 116438
" ], "text/plain": [ "Read 10671402 lines. Lines per second: 116438" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 11233997 lines. Lines per second: 115846
" ], "text/plain": [ "Read 11233997 lines. Lines per second: 115846" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 11787972 lines. Lines per second: 115434
" ], "text/plain": [ "Read 11787972 lines. Lines per second: 115434" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 12353489 lines. Lines per second: 114877
" ], "text/plain": [ "Read 12353489 lines. Lines per second: 114877" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 12897495 lines. Lines per second: 114329
" ], "text/plain": [ "Read 12897495 lines. Lines per second: 114329" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 13436392 lines. Lines per second: 113802
" ], "text/plain": [ "Read 13436392 lines. Lines per second: 113802" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 13988021 lines. Lines per second: 113458
" ], "text/plain": [ "Read 13988021 lines. Lines per second: 113458" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 14520339 lines. Lines per second: 113026
" ], "text/plain": [ "Read 14520339 lines. Lines per second: 113026" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 15069128 lines. Lines per second: 112649
" ], "text/plain": [ "Read 15069128 lines. Lines per second: 112649" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 15609421 lines. Lines per second: 112399
" ], "text/plain": [ "Read 15609421 lines. Lines per second: 112399" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 16151055 lines. Lines per second: 112068
" ], "text/plain": [ "Read 16151055 lines. Lines per second: 112068" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 16704318 lines. Lines per second: 111809
" ], "text/plain": [ "Read 16704318 lines. Lines per second: 111809" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 17241869 lines. Lines per second: 111615
" ], "text/plain": [ "Read 17241869 lines. Lines per second: 111615" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 17795142 lines. Lines per second: 111579
" ], "text/plain": [ "Read 17795142 lines. Lines per second: 111579" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 18424883 lines. Lines per second: 111525
" ], "text/plain": [ "Read 18424883 lines. Lines per second: 111525" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 18975285 lines. Lines per second: 111278
" ], "text/plain": [ "Read 18975285 lines. Lines per second: 111278" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 19526267 lines. Lines per second: 111087
" ], "text/plain": [ "Read 19526267 lines. Lines per second: 111087" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 20086301 lines. Lines per second: 110780
" ], "text/plain": [ "Read 20086301 lines. Lines per second: 110780" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 20639753 lines. Lines per second: 110619
" ], "text/plain": [ "Read 20639753 lines. Lines per second: 110619" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 21201167 lines. Lines per second: 110579
" ], "text/plain": [ "Read 21201167 lines. Lines per second: 110579" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 21749911 lines. Lines per second: 110421
" ], "text/plain": [ "Read 21749911 lines. Lines per second: 110421" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 22283649 lines. Lines per second: 110303
" ], "text/plain": [ "Read 22283649 lines. Lines per second: 110303" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 22838839 lines. Lines per second: 110248
" ], "text/plain": [ "Read 22838839 lines. Lines per second: 110248" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 23376937 lines. Lines per second: 110130
" ], "text/plain": [ "Read 23376937 lines. Lines per second: 110130" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 23917882 lines. Lines per second: 110048
" ], "text/plain": [ "Read 23917882 lines. Lines per second: 110048" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 24463955 lines. Lines per second: 109821
" ], "text/plain": [ "Read 24463955 lines. Lines per second: 109821" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 24997999 lines. Lines per second: 109753
" ], "text/plain": [ "Read 24997999 lines. Lines per second: 109753" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 25640106 lines. Lines per second: 109725
" ], "text/plain": [ "Read 25640106 lines. Lines per second: 109725" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 26176052 lines. Lines per second: 109663
" ], "text/plain": [ "Read 26176052 lines. Lines per second: 109663" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 26715229 lines. Lines per second: 109540
" ], "text/plain": [ "Read 26715229 lines. Lines per second: 109540" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 27268234 lines. Lines per second: 109548
" ], "text/plain": [ "Read 27268234 lines. Lines per second: 109548" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 27808660 lines. Lines per second: 109553
" ], "text/plain": [ "Read 27808660 lines. Lines per second: 109553" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 28459486 lines. Lines per second: 109741
" ], "text/plain": [ "Read 28459486 lines. Lines per second: 109741" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 29016107 lines. Lines per second: 109677
" ], "text/plain": [ "Read 29016107 lines. Lines per second: 109677" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 29572557 lines. Lines per second: 109601
" ], "text/plain": [ "Read 29572557 lines. Lines per second: 109601" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 30133329 lines. Lines per second: 109591
" ], "text/plain": [ "Read 30133329 lines. Lines per second: 109591" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 30692742 lines. Lines per second: 109533
" ], "text/plain": [ "Read 30692742 lines. Lines per second: 109533" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 31314738 lines. Lines per second: 109488
" ], "text/plain": [ "Read 31314738 lines. Lines per second: 109488" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 31866356 lines. Lines per second: 109523
" ], "text/plain": [ "Read 31866356 lines. Lines per second: 109523" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 32403692 lines. Lines per second: 109484
" ], "text/plain": [ "Read 32403692 lines. Lines per second: 109484" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 33039587 lines. Lines per second: 109576
" ], "text/plain": [ "Read 33039587 lines. Lines per second: 109576" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 33668152 lines. Lines per second: 109537
" ], "text/plain": [ "Read 33668152 lines. Lines per second: 109537" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 34306832 lines. Lines per second: 109546
" ], "text/plain": [ "Read 34306832 lines. Lines per second: 109546" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 34946529 lines. Lines per second: 109622
" ], "text/plain": [ "Read 34946529 lines. Lines per second: 109622" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 35511155 lines. Lines per second: 109566
" ], "text/plain": [ "Read 35511155 lines. Lines per second: 109566" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 36056678 lines. Lines per second: 109497
" ], "text/plain": [ "Read 36056678 lines. Lines per second: 109497" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 36612604 lines. Lines per second: 109412
" ], "text/plain": [ "Read 36612604 lines. Lines per second: 109412" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 37159827 lines. Lines per second: 109401
" ], "text/plain": [ "Read 37159827 lines. Lines per second: 109401" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2013-11.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2013-11.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 37396497 lines in 342.139 secs.
" ], "text/plain": [ "Parsing completed. Parsed 37396497 lines in 342.139 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2015-04.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2015-04.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 0.312336 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 0.312336 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 87621 lines. Lines per second: 111139
" ], "text/plain": [ "Read 87621 lines. Lines per second: 111139" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 958672 lines. Lines per second: 155552
" ], "text/plain": [ "Read 958672 lines. Lines per second: 155552" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1655795 lines. Lines per second: 146549
" ], "text/plain": [ "Read 1655795 lines. Lines per second: 146549" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 2362006 lines. Lines per second: 139593
" ], "text/plain": [ "Read 2362006 lines. Lines per second: 139593" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 2956617 lines. Lines per second: 133005
" ], "text/plain": [ "Read 2956617 lines. Lines per second: 133005" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 3554639 lines. Lines per second: 128341
" ], "text/plain": [ "Read 3554639 lines. Lines per second: 128341" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 4164682 lines. Lines per second: 124951
" ], "text/plain": [ "Read 4164682 lines. Lines per second: 124951" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 4760649 lines. Lines per second: 122688
" ], "text/plain": [ "Read 4760649 lines. Lines per second: 122688" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 5272966 lines. Lines per second: 120512
" ], "text/plain": [ "Read 5272966 lines. Lines per second: 120512" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 5877312 lines. Lines per second: 118935
" ], "text/plain": [ "Read 5877312 lines. Lines per second: 118935" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 6479044 lines. Lines per second: 117519
" ], "text/plain": [ "Read 6479044 lines. Lines per second: 117519" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 7005855 lines. Lines per second: 116693
" ], "text/plain": [ "Read 7005855 lines. Lines per second: 116693" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 7615144 lines. Lines per second: 115634
" ], "text/plain": [ "Read 7615144 lines. Lines per second: 115634" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 8136265 lines. Lines per second: 114780
" ], "text/plain": [ "Read 8136265 lines. Lines per second: 114780" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 8750335 lines. Lines per second: 114224
" ], "text/plain": [ "Read 8750335 lines. Lines per second: 114224" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 9348939 lines. Lines per second: 113612
" ], "text/plain": [ "Read 9348939 lines. Lines per second: 113612" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 9940693 lines. Lines per second: 113174
" ], "text/plain": [ "Read 9940693 lines. Lines per second: 113174" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 10544254 lines. Lines per second: 112865
" ], "text/plain": [ "Read 10544254 lines. Lines per second: 112865" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 11146698 lines. Lines per second: 112536
" ], "text/plain": [ "Read 11146698 lines. Lines per second: 112536" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 11650185 lines. Lines per second: 111939
" ], "text/plain": [ "Read 11650185 lines. Lines per second: 111939" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 12241374 lines. Lines per second: 111652
" ], "text/plain": [ "Read 12241374 lines. Lines per second: 111652" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 12852366 lines. Lines per second: 111443
" ], "text/plain": [ "Read 12852366 lines. Lines per second: 111443" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 13442713 lines. Lines per second: 111099
" ], "text/plain": [ "Read 13442713 lines. Lines per second: 111099" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 14030942 lines. Lines per second: 110842
" ], "text/plain": [ "Read 14030942 lines. Lines per second: 110842" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 14634795 lines. Lines per second: 110677
" ], "text/plain": [ "Read 14634795 lines. Lines per second: 110677" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 15234543 lines. Lines per second: 110483
" ], "text/plain": [ "Read 15234543 lines. Lines per second: 110483" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 15822769 lines. Lines per second: 110298
" ], "text/plain": [ "Read 15822769 lines. Lines per second: 110298" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 16418992 lines. Lines per second: 110243
" ], "text/plain": [ "Read 16418992 lines. Lines per second: 110243" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 16945480 lines. Lines per second: 110102
" ], "text/plain": [ "Read 16945480 lines. Lines per second: 110102" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 17537615 lines. Lines per second: 110040
" ], "text/plain": [ "Read 17537615 lines. Lines per second: 110040" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 18129754 lines. Lines per second: 109843
" ], "text/plain": [ "Read 18129754 lines. Lines per second: 109843" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 18743953 lines. Lines per second: 109789
" ], "text/plain": [ "Read 18743953 lines. Lines per second: 109789" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 19260565 lines. Lines per second: 109619
" ], "text/plain": [ "Read 19260565 lines. Lines per second: 109619" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 19781895 lines. Lines per second: 109426
" ], "text/plain": [ "Read 19781895 lines. Lines per second: 109426" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 20398697 lines. Lines per second: 109443
" ], "text/plain": [ "Read 20398697 lines. Lines per second: 109443" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 20999315 lines. Lines per second: 109332
" ], "text/plain": [ "Read 20999315 lines. Lines per second: 109332" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 21606085 lines. Lines per second: 109316
" ], "text/plain": [ "Read 21606085 lines. Lines per second: 109316" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 22125339 lines. Lines per second: 109170
" ], "text/plain": [ "Read 22125339 lines. Lines per second: 109170" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 22716579 lines. Lines per second: 109036
" ], "text/plain": [ "Read 22716579 lines. Lines per second: 109036" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 23226544 lines. Lines per second: 108870
" ], "text/plain": [ "Read 23226544 lines. Lines per second: 108870" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 23837468 lines. Lines per second: 108834
" ], "text/plain": [ "Read 23837468 lines. Lines per second: 108834" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 24430871 lines. Lines per second: 108780
" ], "text/plain": [ "Read 24430871 lines. Lines per second: 108780" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 25018270 lines. Lines per second: 108802
" ], "text/plain": [ "Read 25018270 lines. Lines per second: 108802" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 25620984 lines. Lines per second: 108784
" ], "text/plain": [ "Read 25620984 lines. Lines per second: 108784" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 26220328 lines. Lines per second: 108768
" ], "text/plain": [ "Read 26220328 lines. Lines per second: 108768" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 26812801 lines. Lines per second: 108660
" ], "text/plain": [ "Read 26812801 lines. Lines per second: 108660" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 27330111 lines. Lines per second: 108603
" ], "text/plain": [ "Read 27330111 lines. Lines per second: 108603" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 27946846 lines. Lines per second: 108643
" ], "text/plain": [ "Read 27946846 lines. Lines per second: 108643" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 28537022 lines. Lines per second: 108643
" ], "text/plain": [ "Read 28537022 lines. Lines per second: 108643" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 48187786 lines. Lines per second: 108075
" ], "text/plain": [ "Read 48187786 lines. Lines per second: 108075" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 48777631 lines. Lines per second: 108054
" ], "text/plain": [ "Read 48777631 lines. Lines per second: 108054" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 49387231 lines. Lines per second: 108075
" ], "text/plain": [ "Read 49387231 lines. Lines per second: 108075" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 49981695 lines. Lines per second: 108058
" ], "text/plain": [ "Read 49981695 lines. Lines per second: 108058" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 50569266 lines. Lines per second: 108036
" ], "text/plain": [ "Read 50569266 lines. Lines per second: 108036" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 51170286 lines. Lines per second: 108037
" ], "text/plain": [ "Read 51170286 lines. Lines per second: 108037" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 51773732 lines. Lines per second: 108010
" ], "text/plain": [ "Read 51773732 lines. Lines per second: 108010" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 52366223 lines. Lines per second: 107990
" ], "text/plain": [ "Read 52366223 lines. Lines per second: 107990" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 52959875 lines. Lines per second: 107970
" ], "text/plain": [ "Read 52959875 lines. Lines per second: 107970" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 53566480 lines. Lines per second: 108004
" ], "text/plain": [ "Read 53566480 lines. Lines per second: 108004" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 54156808 lines. Lines per second: 107969
" ], "text/plain": [ "Read 54156808 lines. Lines per second: 107969" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 54751484 lines. Lines per second: 107960
" ], "text/plain": [ "Read 54751484 lines. Lines per second: 107960" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2015-04.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2015-04.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 55005780 lines in 509.626 secs.
" ], "text/plain": [ "Parsing completed. Parsed 55005780 lines in 509.626 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Finished parsing file /data/tmp/RC_2016-03.bz2.decompressed
" ], "text/plain": [ "Finished parsing file /data/tmp/RC_2016-03.bz2.decompressed" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Parsing completed. Parsed 100 lines in 0.189317 secs.
" ], "text/plain": [ "Parsing completed. Parsed 100 lines in 0.189317 secs." ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------\n", "Inferred types from first 100 line(s) of file as \n", "column_type_hints=[dict]\n", "If parsing fails due to incorrect types, you can correct\n", "the inferred type list above and pass it to read_csv in\n", "the column_type_hints argument\n", "------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
Read 97333 lines. Lines per second: 168845
" ], "text/plain": [ "Read 97333 lines. Lines per second: 168845" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1080005 lines. Lines per second: 185888
" ], "text/plain": [ "Read 1080005 lines. Lines per second: 185888" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 1909710 lines. Lines per second: 172998
" ], "text/plain": [ "Read 1909710 lines. Lines per second: 172998" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 2701562 lines. Lines per second: 167108
" ], "text/plain": [ "Read 2701562 lines. Lines per second: 167108" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 3467923 lines. Lines per second: 161319
" ], "text/plain": [ "Read 3467923 lines. Lines per second: 161319" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 4231987 lines. Lines per second: 157580
" ], "text/plain": [ "Read 4231987 lines. Lines per second: 157580" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 5009290 lines. Lines per second: 154457
" ], "text/plain": [ "Read 5009290 lines. Lines per second: 154457" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 5769549 lines. Lines per second: 152490
" ], "text/plain": [ "Read 5769549 lines. Lines per second: 152490" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 6436298 lines. Lines per second: 150310
" ], "text/plain": [ "Read 6436298 lines. Lines per second: 150310" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 7130065 lines. Lines per second: 149038
" ], "text/plain": [ "Read 7130065 lines. Lines per second: 149038" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 7796357 lines. Lines per second: 147503
" ], "text/plain": [ "Read 7796357 lines. Lines per second: 147503" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 8559683 lines. Lines per second: 146542
" ], "text/plain": [ "Read 8559683 lines. Lines per second: 146542" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 9248375 lines. Lines per second: 145701
" ], "text/plain": [ "Read 9248375 lines. Lines per second: 145701" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 10032044 lines. Lines per second: 145228
" ], "text/plain": [ "Read 10032044 lines. Lines per second: 145228" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 10724434 lines. Lines per second: 144768
" ], "text/plain": [ "Read 10724434 lines. Lines per second: 144768" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 11490479 lines. Lines per second: 144395
" ], "text/plain": [ "Read 11490479 lines. Lines per second: 144395" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 12255591 lines. Lines per second: 144157
" ], "text/plain": [ "Read 12255591 lines. Lines per second: 144157" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 12931788 lines. Lines per second: 143855
" ], "text/plain": [ "Read 12931788 lines. Lines per second: 143855" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 13609217 lines. Lines per second: 142995
" ], "text/plain": [ "Read 13609217 lines. Lines per second: 142995" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 14358282 lines. Lines per second: 142437
" ], "text/plain": [ "Read 14358282 lines. Lines per second: 142437" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 15030833 lines. Lines per second: 142105
" ], "text/plain": [ "Read 15030833 lines. Lines per second: 142105" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 15747350 lines. Lines per second: 141460
" ], "text/plain": [ "Read 15747350 lines. Lines per second: 141460" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 16513033 lines. Lines per second: 141180
" ], "text/plain": [ "Read 16513033 lines. Lines per second: 141180" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 17207458 lines. Lines per second: 141005
" ], "text/plain": [ "Read 17207458 lines. Lines per second: 141005" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 17873719 lines. Lines per second: 140663
" ], "text/plain": [ "Read 17873719 lines. Lines per second: 140663" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 18637436 lines. Lines per second: 140448
" ], "text/plain": [ "Read 18637436 lines. Lines per second: 140448" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 19330691 lines. Lines per second: 140152
" ], "text/plain": [ "Read 19330691 lines. Lines per second: 140152" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 20003485 lines. Lines per second: 139969
" ], "text/plain": [ "Read 20003485 lines. Lines per second: 139969" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 20672721 lines. Lines per second: 139752
" ], "text/plain": [ "Read 20672721 lines. Lines per second: 139752" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 21357763 lines. Lines per second: 139617
" ], "text/plain": [ "Read 21357763 lines. Lines per second: 139617" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 22113463 lines. Lines per second: 139393
" ], "text/plain": [ "Read 22113463 lines. Lines per second: 139393" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 22782281 lines. Lines per second: 139120
" ], "text/plain": [ "Read 22782281 lines. Lines per second: 139120" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 23471168 lines. Lines per second: 139035
" ], "text/plain": [ "Read 23471168 lines. Lines per second: 139035" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 24149295 lines. Lines per second: 138944
" ], "text/plain": [ "Read 24149295 lines. Lines per second: 138944" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 24829936 lines. Lines per second: 138814
" ], "text/plain": [ "Read 24829936 lines. Lines per second: 138814" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 25518255 lines. Lines per second: 138621
" ], "text/plain": [ "Read 25518255 lines. Lines per second: 138621" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 26195300 lines. Lines per second: 138538
" ], "text/plain": [ "Read 26195300 lines. Lines per second: 138538" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 26981461 lines. Lines per second: 138597
" ], "text/plain": [ "Read 26981461 lines. Lines per second: 138597" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 27647834 lines. Lines per second: 138423
" ], "text/plain": [ "Read 27647834 lines. Lines per second: 138423" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 28401489 lines. Lines per second: 138375
" ], "text/plain": [ "Read 28401489 lines. Lines per second: 138375" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 29085040 lines. Lines per second: 138325
" ], "text/plain": [ "Read 29085040 lines. Lines per second: 138325" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 29755782 lines. Lines per second: 138260
" ], "text/plain": [ "Read 29755782 lines. Lines per second: 138260" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 30515156 lines. Lines per second: 138098
" ], "text/plain": [ "Read 30515156 lines. Lines per second: 138098" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 31211002 lines. Lines per second: 138088
" ], "text/plain": [ "Read 31211002 lines. Lines per second: 138088" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 31888427 lines. Lines per second: 137945
" ], "text/plain": [ "Read 31888427 lines. Lines per second: 137945" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 32642350 lines. Lines per second: 137896
" ], "text/plain": [ "Read 32642350 lines. Lines per second: 137896" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 33323279 lines. Lines per second: 137793
" ], "text/plain": [ "Read 33323279 lines. Lines per second: 137793" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 34078348 lines. Lines per second: 137736
" ], "text/plain": [ "Read 34078348 lines. Lines per second: 137736" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 34733999 lines. Lines per second: 137665
" ], "text/plain": [ "Read 34733999 lines. Lines per second: 137665" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 35516921 lines. Lines per second: 137676
" ], "text/plain": [ "Read 35516921 lines. Lines per second: 137676" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 36196952 lines. Lines per second: 137624
" ], "text/plain": [ "Read 36196952 lines. Lines per second: 137624" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 36862679 lines. Lines per second: 137525
" ], "text/plain": [ "Read 36862679 lines. Lines per second: 137525" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Read 37552211 lines. Lines per second: 137449
" ], "text/plain": [ "Read 37552211 lines. Lines per second: 137449" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import os\n", "import logging\n", "import bz2\n", "from datetime import datetime\n", "import graphlab as gl\n", "import graphlab.aggregate as agg\n", "import fnmatch\n", "\n", "gl.canvas.set_target('ipynb')\n", "gl.set_runtime_config('GRAPHLAB_CACHE_FILE_LOCATIONS', '/data/tmp')\n", "gl.set_runtime_config('GRAPHLAB_DEFAULT_NUM_GRAPH_LAMBDA_WORKERS', 128)\n", "gl.set_runtime_config('GRAPHLAB_DEFAULT_NUM_PYLAMBDA_WORKERS', 128)\n", "\n", "\n", "basedir = \"/data/reddit/raw\" # Replace this with the directory which you downloaded the file into\n", "sframes_dir = \"/data/reddit/sframes/\" # Replace this with the directory you want to save the SFrame to\n", "tmp_dir = \"/data/tmp\" # Replace this with the directory you want to save the SFrame to\n", "\n", "def get_month_from_path(path):\n", " m = os.path.basename(path)\n", " m = m.split(\".\")[0]\n", " return int(m.split(\"-\")[-1])\n", "\n", "def get_year_from_path(path):\n", " y = os.path.basename(path)\n", " y = y.split(\".\")[0]\n", " return int(y.lower().replace(\"rc_\",\"\").split(\"-\")[0])\n", "\n", "def json2sframe(path):\n", " \"\"\"\n", " Creates an SFrame object from the file in the input path\n", " :param path: path to a file that contains a list of JSON objects, each JSON is saved in a separate line.\n", " The file can also be compressed in bz2 format.\n", " :return: SFrame object created from the file in the input path. The SFrame also contains information regarding\n", " each post date & time\n", " :rtype: gl.SFrame\n", " \"\"\"\n", " if not path.endswith(\".bz2\"):\n", " sf = gl.SFrame.read_json(path, orient=\"lines\")\n", " else:\n", " dpath = decompress_bz2(path)\n", " sf = gl.SFrame.read_json(dpath, orient=\"lines\")\n", " #remove the decompressed file\n", " os.remove(dpath)\n", " #add datetime information\n", " sf['month'] = get_month_from_path(path)\n", " sf['year'] = get_year_from_path(path)\n", " sf['datetime']= sf[\"created_utc\"].apply(lambda utc: datetime.fromtimestamp(float(utc)))\n", "\n", " return sf\n", "\n", "def decompress_bz2(inpath, outpath=None):\n", " \"\"\"\n", " Decompress bz2 to the outpath, if the outpath is not provided then decompress the file to the inpath directory\n", " :param inpath: decompress bz2 file to the outpath\n", " :param outpath: output path for the decompress file\n", " :return: the output file path\n", " \"\"\"\n", " if outpath is None:\n", " outpath = tmp_dir + os.path.sep + os.path.basename(inpath) + \".decompressed\"\n", " out_file = file(outpath, 'wb')\n", " logging.info(\"Decompressing file %s to %s\" % (inpath,outpath))\n", " in_file = bz2.BZ2File(inpath, 'rb')\n", " for data in iter(lambda : in_file.read(100 * 1024), b''):\n", " out_file.write(data)\n", " out_file.close()\n", " in_file.close()\n", " return outpath\n", "\n", "def match_files_in_dir(basedir, ext):\n", " \"\"\"\n", " Find all files in the basedir with 'ext' as filename extension\n", " :param basedir: input basedir\n", " :param ext: filename extension\n", " :return: list of file paths with the input extension\n", " \"\"\"\n", " matches = []\n", " for root, dirnames, filenames in os.walk(basedir):\n", " for filename in fnmatch.filter(filenames, ext):\n", " matches.append(os.path.join(root, filename))\n", " return matches\n", "\n", "#Creating all SFrames\n", "for p in match_files_in_dir(basedir, \"*.bz2\"):\n", " logging.info(\"Analyzing of %s \" % p)\n", " outp = sframes_dir + os.path.sep + os.path.basename(p).replace(\".bz2\", \".sframe\")\n", " if os.path.isdir(outp): #if file already exists skip it\n", " logging.info(\"Skipping the analysis of %s file\" % p)\n", " continue\n", " sf = json2sframe(p)\n", " sf.save(outp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let’s join all the SFrame objects into a single object. Please notice that different posts contain different metadata information about each post. Therefore, we will create a single SFrame which contains all the various metadata information." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "join_sframe_path = sframes_dir + os.path.sep + \"join_all.sframe\" # Where to save the join large SFrame object\n", "def get_all_cols_names(sframes_dir):\n", " \"\"\"\n", " Return the column names of all SFrames in the input path\n", " :param sframes_dir: directory path which contains SFrames\n", " :return: list of all the column names in all the sframes in the input directory\n", " :rtype: set()\n", " \"\"\"\n", " sframes_paths = [sframes_dir + os.path.sep + s for s in os.listdir(sframes_dir)]\n", " column_names = set()\n", " for p in sframes_paths:\n", " if not p.endswith(\".sframe\"):\n", " continue\n", " print p\n", " sf = gl.load_sframe(p)\n", " column_names |= set(sf.column_names())\n", " return column_names\n", "\n", "def get_sframe_columns_type_dict(sf):\n", " \"\"\"\n", " Returns a dict with the sframe column names as keys and column types as values\n", " :param sf: input SFrame\n", " :return: dict with the sframe column names as keys and column types as values\n", " :rtype dict[str,str]\n", " \"\"\"\n", " n = sf.column_names()\n", " t = sf.column_types()\n", "\n", " return {n[i]: t[i]for i in range(len(n))}\n", "\n", "def update_sframe_columns_types(sf, col_types):\n", " \"\"\"\n", " Updates the input sframe column types according to the input types dict.\n", " :param sf: input SFrame object\n", " :param col_types: dict in which the keys are the column names and the values are the columns types\n", " :return: SFrame object with column types update to the col_types dict. If a column doesn't exist in the SFrame object\n", " then a new column is added with None values\n", " :rtype: gl.SFrame\n", " \"\"\"\n", " sf_cols_dict = get_sframe_columns_type_dict(sf)\n", "\n", " for k,v in col_types.iteritems():\n", " if k not in sf_cols_dict:\n", " sf[k] = None\n", " sf[k] = sf[k].astype(v)\n", " elif v != sf_cols_dict[k]:\n", " sf[k] = sf[k].astype(v)\n", " return sf\n", "\n", "def join_all_sframes(sframes_dir, col_types):\n", " \"\"\"\n", " Joins all SFrames in the input directory where the column types are according to col_types dict\n", " :param sframes_dir:\n", " :param col_types: dict with column names and their corresponding types\n", " :return: merged SFrame of all the SFrames in the input directory\n", " \"rtype: gl.SFrame\n", " \"\"\"\n", " sframes_paths = [sframes_dir + os.path.sep + s for s in os.listdir(sframes_dir) if s.endswith(\".sframe\")]\n", " sframes_paths.sort()\n", " sf = gl.load_sframe(sframes_paths[0])\n", " sf = update_sframe_columns_types(sf, col_types)\n", " for p in sframes_paths[1:]:\n", " if not p.endswith(\".sframe\"):\n", " continue\n", " print \"Joining %s\" % p\n", " sf2 = update_sframe_columns_types(gl.load_sframe(p), col_types)\n", " sf2.__materialize__()\n", " sf = sf.append(sf2)\n", " sf.__materialize__()\n", "\n", " return sf\n", "\n", "\n", "\n", "# use the inferred column type according to last month posts' SFrame. Set all other columns to be \n", "# as type str\n", "#col_names = get_all_cols_names(sframes_dir)\n", "sf = gl.load_sframe(sframes_dir + '/RC_2015-05.sframe')\n", "d = get_sframe_columns_type_dict(sf)\n", "for c in col_names:\n", " if c not in d:\n", " print \"Found new column %s\" %c\n", " d[c] = str\n", "\n", "#Create Single SFrame\n", "sf = join_all_sframes(sframes_dir, d)\n", "sf.save(join_sframe_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At the end of this process, we obtained an SFrame with 2,718,784,464 rows, which is about 444 GB in size. Let's use the show function to get a better understanding of the data.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "gl.canvas.set_target('ipynb')\n", "sf = gl.load_sframe(join_sframe_path)\n", "#sf.show() # running this can take considerable amount of time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's clean it by removing columns that aren't useful for creating the subreddit's social network. Namely, we remove the following columns: \"archived,\" \"downs,\" \"retrieved_on,\" \"banned_by,\" \"likes,\" \"user_reports,\" \"saved,\" \"report_reasons,\" \"approved_by,\" \"body_html,\" \"created,\" \"mod_reports,\" and \"num_reports.”\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sf = sf.remove_columns([\"archived\", \"downs\", \"retrieved_on\", \"banned_by\", \"likes\",\"user_reports\", \"saved\",\n", " \"report_reasons\", \"approved_by\", \"body_html\", \"created\", \"mod_reports\", \"num_reports\"])\n", "sf.__materialize__()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's also delete users' posts that are from users that are probably bots and from those who have posted too many messages." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+----------------------+-----------+\n", "| author | Count |\n", "+----------------------+-----------+\n", "| [deleted] | 302138049 |\n", "| AutoModerator | 10976942 |\n", "| conspirobot | 575576 |\n", "| ModerationLog | 562192 |\n", "| TweetPoster | 555976 |\n", "| MTGCardFetcher | 444411 |\n", "| RPBot | 436199 |\n", "| autowikibot | 422769 |\n", "| imgurtranscriber | 404441 |\n", "| PoliticBot | 388444 |\n", "| dogetipbot | 374536 |\n", "| ImagesOfNetwork | 355037 |\n", "| throwthrowawaytothee | 344583 |\n", "| Late_Night_Grumbler | 320383 |\n", "| qkme_transcriber | 301974 |\n", "| TweetsInCommentsBot | 282467 |\n", "| TotesMessenger | 222073 |\n", "| Franciscouzo | 202346 |\n", "| havoc_bot | 197761 |\n", "| morbiusgreen | 195312 |\n", "| User_Simulator | 194358 |\n", "| Lots42 | 192985 |\n", "| hit_bot | 182189 |\n", "| -rix | 173022 |\n", "| pixis-4950 | 171907 |\n", "| PornOverlord | 171623 |\n", "| BitcoinAllBot | 170096 |\n", "| UnluckyLuke | 169971 |\n", "| PriceZombie | 163710 |\n", "| amici_ursi | 163288 |\n", "| matts2 | 156381 |\n", "| gifv-bot | 155513 |\n", "| WritingPromptsRobot | 154295 |\n", "| atomicimploder | 148904 |\n", "| autotldr | 146046 |\n", "| TrollaBot | 145737 |\n", "| SnapshillBot | 143317 |\n", "| NoMoreNicksLeft | 135738 |\n", "| MovieGuide | 134567 |\n", "| raddit-bot | 133615 |\n", "| iam4real | 133262 |\n", "| youtubefactsbot | 132521 |\n", "| CaptionBot | 131743 |\n", "| hwsbot | 131402 |\n", "| G_Morgan | 129057 |\n", "| davidjl123 | 128481 |\n", "| noeatnosleep | 125357 |\n", "| samacharbot2 | 125226 |\n", "| backpackwayne | 116002 |\n", "| ttumblrbots | 114590 |\n", "+----------------------+-----------+\n", "[20299812 rows x 2 columns]\n", "\n" ] } ], "source": [ "#First let's find how many posts the most active users posted\n", "posts_count_sf = sf.groupby('author', gl.aggregate.COUNT())\n", "posts_count_sf.sort('Count',ascending=False).print_rows(50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To clean the dataset, we removed redditors who posted over 100,000 times and seemed to post automatic content. Additionally, we used the [praw Python package](https://praw.readthedocs.io/en/latest/) to parse the comments posted in the [BotWatchman subreddit](https://www.reddit.com/r/BotWatchman/) in order to identify bots and remove them. We use the following code to assemble a bots list:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Delete Users List (951 users):\n", " set(['Removedpixel', 'SoulFire6464', u'RealtechPostBot', u'serendipitybot', u'r2d8', u'arethemodsasleep', u'squis1000', u'The_Penis_Game_Bot', u'whooshbot', u'Zyra_test', u'hitlerbotv2', u'topredditbot', u'VerseBot', u'MusicB0t', u'Explains_FTFY', u'BaddieBot', u'autourbanbot', 'NinjaDiscoJesus', u'thier_2_their_bot', u'amProbablyPooping', u'Insane_Photo_Bot', u'Auto_Neckbeard_Bot', u'shadowbanbot', u'_Rita_', u'Profanity-bot', u'gracefulclaritybot', u'DataFire_bot', 'autowikibot', u'FTFY_Cat', u'yes_answers.', u'DollarSignDouche', u'ELIMINATE_GIFS', u'PlusOneBot', u'CutoutBot', u'visual_clarification', u'triggeredbot', u'haiku_finder_bot', u'Eats_Small_Text_Bot', u'GameDealsBot', u'Craigslist-Bot', u'STEALTHM0UNTAIN', u'LegoLinkBot', 'atomicimploder', u'Dickish_Bot_Bot', 'BitcoinAllBot', u'/u/codes_comments', u'CuteBot6969', u'LittleHelperRobot', u'Anti-Brigade-Bot3', u'autowikiabot', u'Anti-Brigade-Bot8', 'backpackwayne', u'UnobtaniumTipBot', u'YOGSbot', u'Innocence_bot2', u'PreserverBot', u'givesafuckbot', u'youreyoureiswrong', u'gabenizer-bot', u'crushe69', u'Canadian-Sorry-Bot', u'Comrade__Bot', u'GunnitBot', u'checks_for_checks', u'define_bot', u'Hikelsa_bot', u'ThanksObamaBiden', u'rusetipbot', 'pixis-4950', u'autotrope_bot', u'Feathersbumbled', u'NSLbot', u'kittehcointipbot', u'ModisDead', u'ItsSpelledPrincipal', u'demobile_bot', u'acini', u'rawlaying90', u'OneBleachinBot', u'giddyp93', u'NobodyDoesThis', u'image_linker_bot', u'ReddiTron1000', u'WWE_Network_Bot', u'iTunesLinks', u'TheWallGrows', u'PokemonFlairBot', u'StockTrendsBot', u'pikachu_hsu', u'PM_ME_YOUR_COCK_', 'CaptionBot', u'FucksWithTables', u'The_Dad_Bot', u'hearing-aid_bot', u'bee2kg', u'IPostAlotBot', u'stockinfo_bot', u'ASOT_Tracklister_bot', u'resavr_bot', u'chant89', u'StackBot', u'it-is-not-would-of', u'Converts2Useless', u'OnlyRepliesLMAO', u'WillPrismWordsBot', u'magic-8-bot', '-rix', u'DUCCI__BOT', u'Product_Helper_Bot', u'CationBot', u'Readdit_Bot', u'shiftace-', u'Comment_Codebreaker', u'ToBeFairBot', u'thank_mr_skeltal_bot', u'steam_bot', u'RFootballBot', u'ratsb1000', u'RedVanguardBot', u'AVR_Modbot', u'nulli1000', u'DidSomeoneSayBoobs', u'compilebot', u'Brigade_Bot', u'/u/TotesHuman', u'league_match_bot', u'_Sweetiebot', u'much-wow-doge', u'UselessAndBot', u'disapprovalbot', u'ButWhatDoIDoWithIt', u'ASCIICockBot', u'tabledresser', u'cruise_bot', 'G_Morgan', 'autotldr', 'PornOverlord', u'topcoin_tip', u'tagstr1000', u'heads_need_bodies', 'PoliticBot', u'bedoot', u'AAbot', u'gandhiwatchesbot', u'AladeenBot', u'iscuck_bot', u'nice_meme_bot', 'samacharbot2', u'dotaherobot', u'TreeFiddyBot', u'RedditAnalysisBot', u'b6d27f0x3', u'roger_bot', u'BotOfOriginality', u'TheTopCommentBot', u'annoying_yes_bot', u'isDegenerate', u'NightMirrorMoon', u'BOTFORSUBREDDITNAME', u'gandhi_spell_bot', u'Decronym', u'WikiBotEU', u'cartri69', u'ProfanityWatch', u'livid_taco', u'loser_detector_bot', u'IthkuilRobot', u'zalgoskeletor', u'PlayStoreLinks_Bot', u'ShillForMonsanto', u'BrokenArmsBot', u'qznc_bot', 'matts2', u'PonyTipBot', u'Twitch2YouTube', u'GabenCoinTipBot', u'gabentipbot', u'DogeLotteryModBot', u'DrivePower', u'alot-of-bot', u'The-Paranoid-Android', u'YouTube_Time', u'companymi69', u'NotApostolate', u'FFBot', u'wheres_the_karma_bot', u'Wolfram_Bot', u'ImageRehoster', u'highlightsbot', u'codex561', u'garu323', 'raddit-bot', u'YT_Timestamp_Bot', u'WeAppreciateYou', u'hhhehehe_BOT', u'skitchbot', 'Late_Night_Grumbler', u'MumeBot', u'not-cleverbot', u'Gestabot', 'NoMoreNicksLeft', u'TheSpellingAsshole', u'QuoteMe-Bot', u'Dad_Jokes_Inbound', u'lolpenisbot', u'you_thejoke', u'TerperBot', 'GoTradeBot', u'Nepene', u'greeter_bot', u'TitsOrGTFO_Bot', u'saskaai', u'ArmFixerBot', u'I_Love_You_Too_Bot', u'grreviews_bot', 'qkme_transcriber', u'ASOIAFSearchBot', u'Dad_Jokes_Incoming', u'Peteusse', 'SnapshillBot', u'Honey189', u'_AyyLmaoBot_', u'SoThereYouHaveIt', u'ferrarispider52', u'publicmodlogs', u'Joasdisle', u'ItWillGetBetterBot', u'thelinkfixerbot', u'CalvinBot', u'splin69', u'Anti-Brigade-Bot7', u'Rule_13_Bot', u'Shlak2k15', u'Handy_Related_Sub', u'BELITipBot', u'scraptip', u'Antiracism_Bot', u'auto-doge', u'PuushToImgurBot', '[deleted]', u'anusBot', u'Reddit2Trend', u'ToBeFairCounter', u'JotBot', u'WikipediaLinkFixer', u'NFLVideoBot', u'UrbanDicBot', u'maybemaybemaybe_bot', u'fieldpain6969', u'MaveTipBot', u'nsfw_gfys_bot2', u'CortanaBot', u'rumblep666', u'SmallTextReader', u'KSPortBot', u'Define_It', u'_TonyWonder_', u'wrapt6969', u'PnSProtectionService', 'throwthrowawaytothee', u'Control_F', u'XPostLinker', u'phrase_bot', u'TOP_COMMENT_OF_YORE', u'smile_today_', u'bitcointip', u'templatebot', u'Dictionary__Bot', u'Downtotes_Plz', u'Mr_Vladimir_Putin', u'gracefulcharitybot', u'A_random_gif', u'trpbot', u'MetricPleaseBot', u'redditShitBots', u'Anti-Brigade-Bot-35', u'MatchThreadder', u'GrammarianBot', u'SpellingB', u'Mobile_Version', u'Metric_System_Bot', u'FriendlyCamelCaseBot', u'I_Am_Genesis', 'TweetsInCommentsBot', u'AutoNiggaBot', u'DadBot3000', u'VideopokerBot', u'InformativeButFalse', u'mcservers-bot', u'sendto', u'classhole_bot', u'DNotesTip', u'TheAssBot', u'UselessArithmeticBot', u'GoogleTranslateBot', u'MAGNIFIER_BOT', u'DealWithItbot', u'NintendoVideoBot', u'CONFUSED_COPYCAT', u'Sandstorm_Bot', 'ttumblrbots', u'classybot', u'bitofnewsbot', u'MetatasticBot', u'post_only_cocks', u'Deviantart-Mirror', u'ImprovedGrammarBot', u'ShillHill666', u'EscapistVideoBot', u'AntiBrigadeBot', u'IRCR_Info_Bot', u'swiftwee88', u'ICouldntCareLessBot', u'X_BOT', u'clay_davis_bot', u'rumbl1000', u'My_Bot', u'panderingwhore', u'GeekWhackBot', u'TryShouldHaveInstead', u'SauceHunt', u'bust1nbot', u'valkyribot', u'WordCloudBot2', u'OnlyPostsJFC', u'wooshbot', u'infiltration_bot', 'PriceZombie', u'ContentForager', u'SatoshiTipBot', u'BoobBot3000', u'TheButtonStatsBot', u'MonsterMashBot', u'subtext-bot', u'shirley_bot', u'flower_bot', u'BensonTheBot', u'SwearWordPolice', u'Reddit_JS_Bot', u'corgicointip', u'SuchModBot', u'RAOM_Bot', u'haha_bot', u'WeatherReportBot', u'xkcd37bot', u'_chao_', u'NASCARThreadBot', u'/u/TARDIS-BOT', 'AutoModerator', u'ThePoliceBot', u'coinflipbot', u'spinnelein', u'meme_transcriber', 'rollme', u'TablesWillBeFlipped', u'anagrammm', u'rarchives', u'Anti-Brigade-Bot', u'pm_me_your_bw_pics', u'last_cakeday_bot', u'SRS_History_Bot', u'Nazeem_Bot', u'murde1', u'I_Say_No_', u'navigatorbot', u'Anti-Brigade-Bot-1', 'Lots42', u'ThePictureDescribot', u'VeteransResourcesBot', u'fact_check_bot', u'milestone_upvotes', u'goodnotesbot', u'hybrid377', u'BogdanGhita', u'RaceReporter', u'gives_you_boobies', u'Anti-Brigade-Bot-5', u'yes-bot.', u'SubredditMetadataBot', u'AutoInsult', u'mvinfo', u'coinyetipper', u'clothinf89', u'only_posts_chickens', u'Meta_Bot', 'WritingPromptsRobot', u'dgctipbot', u'Correct_Apostrophe_S', u'IAMARacistBot', u'_FallacyBot_', u'decidebot', u'HCE_Replacement_Bot', u'kitabi_vig', u'GrammarCorrectingBot', u'VideoLinkBot', u'scanr', u'GoogleForYouBot', u'Anti-brigade-bot-19', u'Team60sBot', u'Anything_At_All_', u'luckoftheshibe', u'forehead92', u'faketipbot', u'NotRedditEnough', u'FapFindr', u'WatchGroupBot', u'AbixBot', u'AyyLmao2DongerBot', u'thisbotsays', u'PhoenixBot', u'sentimentviewbot', u'AntiHateBrigadingBot', u'edward_r_servo', u'Le_xD_Bot', u'frontbot', u'bRMT_Bot', u'PunknRollBot', u'ConvertsToMetric', u'PCMasterRacebot', u'nba_gif_bot', u'yourebot', u'Could_Care_Corrector', u'GrammerNazi_', u'rubycointipbot', u'/u/hearingaid_bot', u'facts_sphere', 'TweetPoster', u'curly1232', u'AstrosBot', u'chromabot', u'LocationBot', u'webpage_down_bot', u'TheChosenBot', u'c5bot', u'subredditChecker', u'flips_title', u'ObamaRobot', u'ButtTipBot', 'User_Simulator', u'battery_bot', u'/r/bot_police', u'totes_alpha_bot', u'frytipbot', u'provides-id', u'RaGodOfTheSunisaCunt', u'TrendingBot', u'EDC_automod', u'Daily_Fail_Bot', u'lilliecute', u'slapbot', u'BASICALLY_LITERALLY', u'AntiBrigadeBot2', u'tmobaird', u'Link_Demobilizer', u'Spaghetti_Robotti', u'TalkieToasterBot', u'AllahuAkbarBot', u'LinkFixerBot1', u'LinkFixerBot2', u'LinkFixerBot3', 'hit_bot', u'math_or_math_joke', u'nbtip', u'howstat', u'Relevant_News_Bot', u'flip_text_bot', u'PresidentObama___', u'giftoslideshowdotcom', u'DownvotesMcGoats', u'malen-shutup-bot', u'Some_Bot', u'approve_unmoderated', u'leveretb89', u'Gukga-anjeon-bowibu', u'swearjar_bot', u'TheHandOfOmega', u'test_bot0x00', u'URLfixerBot', u'HowIsThisBestOf_Bot', u'RonaldTheRight', u'-faggotbot', u'colorcodebot', 'Franciscouzo', u'Somalia_Bot', 'youtubefactsbot', u'NSA_for_ELS', u'bosk_tino', u'reallygoodbot', u'no_context_bot', u'NoseyPantyBot', u'Shiny-Bot', u'RemindMeBotBro', u'inside_voices', u'penguingun', u'XboxDVRBot', u'GotCrypto', u'CAH_BLACK_BOT', u'ExpectedFactorialBot', u'vertcoinbot', u'NoSobStoryBot2', u'Smile_Bot', u'IFlipCoins', u'memedad-transcriber', u'I_Like_Spaghetti', u'PleaseRespectTables', u'xkcd_transcriber', u'CockBotHDEdition', u'golferbot', u'RemindMeBot', u'tyo-translate', u'GrasiaABot', u'JiffierBot', u'JumpToBot', u'new_eden_news_bot', u'CasualMetricBot', u'Unhandy_Related_Sub', u'tipmoonbot2', u'SwitcharooInventory', u'okc_rating_bot', u'RfreebandzBOT', u'BailyBot', u'MassdropBot', 'RPBot', u'Rad_Rad_Robot', u'pandatips', u'imgur_rehosting', u'YesManBot', u'CantHearYouBotEX', u'UselessConversionBot', u'MY_GLASSES_BITCH', u'Key_Points', u'AwkwardMod', u'JiffyBot', u'FunCatFacts', u'spursgifs_xposterbot', u'SRD_Notifier', 'noeatnosleep', u'isreactionary_bot', u'Sammy-SlimBot', u'PlaylisterBot', u'rotoreuters', u'Celeb_Username_Bot', u'digitipbot', u'reddtipbot', u'ImCongratulating', u'PM_UR_NUDES-PLEASE', u'PlayStoreLinks__Bot', u'HMF_Bot', u'DotaCastingBot', u'thankyoubot', u'A858DE45F56D9BC9', u'quack_bot', u'JennyCherry18', u'ShadowBannedBot', u'Mentioned_Videos', u'fedora_tip_bot', u'Captn_Hook', u'TDTMBot', u'/u/Wraptram', u'haikub0t', u'sunhatd1000', u'NewAustrian', u'Accountabili_bot', u'ExmoBot', u'isReactionaryBot', 'nikorasu_the_great', u'picsonlybot', u'shadowman735', u'jerkbot-3hunna', u'I_Dislike_Spaghetti', u'rss_feed', 'TotesMessenger', u'AutoCorrectionBot', u'LinkDemobilizerBot', u'MemeExDe', u'TicTacToeBot', u'SubredditLinkBot', u'the__meep', u'GoldFact', u'SERIAL_JOKE_KILLER', u'gender_bot', u'peekerbot', u'YTDLBot', u'CamptownRobot', u'_perly_bot', u'tagstra93', u'Barrack_Obama__', u'MuhOutrage_Bot', 'Sir_Willis_CMS', u'cake_day_bot', u'sports_gif_bot', u'StopSayingRIPinPBot', u'nyantip', u'Finnbot', u'Link_Correction_Bot', u'That_Attitude_Bot', u'AwkwardDev', 'dogetipbot', u'YouGotGlitched', u'MarkovBot', u'magic_8_bot', u'haiku_robot', u'AlaTull', u'DeltaBot', u'malo_the_bot', u'DEAL_WITH_IT_bot', 'eaturbrainz', u'Tereshang', u'OfficialCommentRater', u'WontRemindYou', u'BeHappyBot', u'lollygag1000', u'FTFYouBot', u'cahbot', u'CouldBeWorseBot', u'totes_meta_bot', u'autoleprabot', u'AsciBoobsBot', u'freeEBOOKS-Batman', u'WordcloudYou', 'davidjl123', u'English_Helper_Bot', u'I_BITCOIN_CATS', 'morbiusgreen', u'mirror__bot', u'asmccc4123', u'MontrealBot', u'metoobot', u'ac_502002', 'andrewsmith1986', u'citation-is-needed', u'SEO_Killer', u'vertcointipbot', u'VsauceBot', u'Mattyso', u'makeswordcloudsagain', u'The_Marco_Rubio', u'SWTOR_Helper_Bot', u'Virnibot', u'pi_day_bot', u'classhole_robot', u'Shrugfacebot', u'elMatadero_bot', u'Random-ComplimentBOT', u'GoneWildResearcher', u'AndMarquez', u'matthewrobo', u'EveryThingIsSoRaven', u'GreasyBacon', u'bajneeds', u'CantHearYouBot', u'stockbot2000', u'gfycat-bot-sucksdick', u'neutlime', u'let_me_nig_that_4_u', u'Polite_Users_Bot', u'captainhindsightbot', u'AgentKoenigLMD', u'Text_Reader_Bot', u'FedoraTipAutoBot', u'/u/BadSarcasmDetector', u'lmaoRobot', u'ban_pruner', u'elwh392', u'GandhiSpellingBot', u'TwitchToYoutubeBot', u'icehock6969', u'ddlbot', u'relevantxkcd-bot', u'RequirementsBot', u'h0b0_monkey', u'ImJimmieJohnsonBot', u'nrl_cfb', u'PaidBot', u'bitcoinpartybot', u'moderator-bot', u'baseball_gif_bot', u'DropBox_Bot', u'DownvotedComments', u'slickwom-bot', u'kuilinbot', u'Gatherer_bot', u'VideoPostBot', u'WPBot', u'DirectImageLinkerBot', u'user/no_context_bot.', u'jaysbot2', u'ShittyGandhiQuotes', u'stairs1000', u'Wiki_FirstPara_bot', u'Fixes_GrammerNazi_', u'HauntedHashbrown', u'FrownUpsideDownBot', u'Anti-Brigade-Bot-11', u'Anti-Brigade-Bot-12', u'kg2bee', u'RoundUp_bot', u'cmhocbot', u'imirror_bot', u'BHObamanator', u'JokingLikeaBot', u'InternetLyingPolice', u'Raptor_Reading', u'JeopardyQBot', u'PedanticIrishBot', u'domoarigatobtfcboto', u'BritishHaikuBot', u'SurviAvi', u'WikipediaPoster', 'ModerationLog', u'pandatipbot', u'foreigneducationbot', u'non_dm_mirror_bot', u'fedoratips', u'Anti-Reactionary-Bot', u'TheLazyLinker', u'CouldCareFewer', u'InceptionBwongBot', u'/u/trollmaster-5000', u'maaz7', u'allinonebot', u'LineBreakBot', u'WhoopThereItWas', u'u/alot-of-bot', u'AlbumHelperBot', u'NoSleepAutoMod', u'Your_Post_As_A_Movie', u'rSGSpolice', u'TipMoonBot', u'GivesSilverBot300', 'MovieGuide', 'TrollaBot', u'JakeandAmirBot', u'BlackjackBot', u'CHART_BOT', u'bandage1000', u'KarmaConspiracy_Bot', u'BigLebowskiBot', u'grumblehi88', u'BuildAPC4MeBot', u'BotAntagonist', u'clevercommen', u'unitconvert', u'dragoneno6969', u'CreepierSmileBot', u'CIRCLJERK_REPOST_BOT', u'Grumbler_bot', u'DetailsMaster', u'cageypro666', u'SakuraiBot', u'openseadragonizer', u'ImproperGrammarBot', 'imgurtranscriber', 'MasterT231', u'obamabot9000', u'zunjae', u'PoliteUsersBotBot', u'translatesit43times', u'Insigible_Bot', u'VoterBot', u'sara_son19', u'CarterDugSubLinkBot', u'Nidalee_Bot', u'ProductHelperBot', u'CantHearYouBot2', u'moanrigid90', u'changetip', u'redditbots', u'ApiContraption', 'smacksaw', u'RedditMarkovBot', u'edhrec', u'Ladonnalder', u'RepeatBOT', u'dirtymindrebel', u'YT_Bot', u'xkcd_number_bot', u'hitlerbot', u'Rangers_Bot', u'SexSellsStats', u'Forgotten_News_Bot', u'HFY_Tag_Bot', u'ARandomTipAppears', u'LinkedCommentBot', u'LEGO_not_LEGOS_', u'PopcornBot', u'FelineFacts', u'request_bot', u'ReadSmallTextBot', u'MirrorNinjaBot', u'CAH_TEST_BOT', u'delaybot', u'-ecksdee-', u'timewaitsforsome', u'grumpybot', 'MTGCardFetcher', u'BreakfastCerealBot', u'DailMail_Bot', u'tara1', u'SMCTipBot', u'gocougs_bot', u'ThenThanMistakeNoted', u'keysteal_bot', u'DJ_Khaled_Best', u'anon_bot', 'UnluckyLuke', u'beecointipbot', u'QuoteMeBot', u'videos_mod', u'Tumblr_In_Starbucks', u'ExplainsRemovals', u'ComplimentingBot', u'Videos_Mentioned', u'User_History_Bot', u'__bot__', u'Anti_Vladimir_Putin', u'connipti92', u'amazedbot', u'replieswithsmokeweed', u'CreepySmileBotFanBot', u'rule_bot', u'sunhatda666', u'StarboundBot', u'saysjokes', u'IQuoteYouBot', u'colombia_bot', u'zigzagh90', u'IAgreeBot', u'Codebreakerbreaker', u'auto_help_bot', u'PrettyMuchPrettyMuch', u'ADHDbot', u'so_doge_tip', u'ConvertsToText', u'PoliteBot', u'bocketybot', u'maddie_bot', 'ImagesOfNetwork', u'stats-bot', u'imgurerbot', u'potdealer', 'gifv-bot', u'f1bet', u'stormske91', u'notoverticalvideo', u'imgurHostBot', u'amumu_bot', u'Meta_Bot2', u'flappytip', u'Anti-Brigade-Bot-2', u'Anti-Brigade-Bot-3', u'ToMetric', u'Anti-Brigade-Bot-6', u'asmrspambot', u'recursion_bot', u'thewutbot', u'QUICHE-BOT', u'grammar_nazi_bot_13', u'GimliBot', u'AtheismModBot', u'Lionelttson', u'unsta666', u'friendlygame', u'testbotjen', u'sumthenews', u'calcolatore', u'CussWordPolice', u'FixYourGrammarBot', u'Reads_Small_Text_Bot', u'DRKTipBot', u'chawalbanda33', u'ProselytizerBot', u'MultiFunctionBot', u'historymodbot', u'Makes_Small_Text_Bot', u'untouchedURL', 'iam4real', u'LazyLinkerBot', u'tennis_gif_bot', u'Cakeday-Bot', u'IsItDownBot', u'NoGrasiaABot', u'WhenisHL3', u'Gynocologist_Bot', 'havoc_bot', u'archlinkbot', u'rbutrBot', u'DirectImageLinkBot', u'Birthdaytits', u'fa_mirror', u'New_Small_Text_Bot', u'Top_Comment_Repo_Man', 'conspirobot', u'cris9696', u'siteswap-bot', u'SketchNotSkit', u'Anti-Brigade-Bot1917', u'OriginalLinkBot', u'TitleLinkerBot', u'BensonTheSecond', u'godwin_finder', u'SmallSubBot', u'whispen', u'Shrug_Bot', u'raiseyourdongersbot', u'hearing_aids_bot', u'upmo', u'IS_IT_SOLVED', u'AltCodeBot', u'Wink-Bot', u'random-imgur', 'hwsbot', u'snapshot_bot', u'replies_randomly', 'TheNitromeFan', u'khalifa111', u'GoodGuyGold', u'FrontpageWatch', u'RelevantSummary', u'redditreviewbot', u'liver1000', u'Shakespeares_Ghost', u'gfy_bot', u'FirstThingsFirst_bot', u'Stop_Insulting_Mommy', u'a_lot_vs_alot_bot', 'amici_ursi', u'L-O-S-E_not_LOOSE', u'ComradeBot_', u'myrtipbot', u'expired_link_bot', u'Translates10Times', u'BeetusBot', u'ExplanationBot', u'HelperBot_', u'comment_copier_bot', u'Shinybot', u'Bronze-Bot', u'poonta93', u'Brybot', u'SmartphonePitchforks', u'ThatsWhatSheSaidAI', u'adverb_bot', u'RelatedBot', u'youtube_unblock_bot', u'CreepySmileBot', u'rightsbot', u'fsctipbot', u'ParenthesisBot', u'IM_DEFINITELY_A_BOT', u'Clickbait_ReplierBot'])\n" ] } ], "source": [ "import praw\n", "\n", "\n", "def get_bots_set():\n", " #Please insert your Reddit application's authentication information.\n", " #See more details at: https://github.com/reddit/reddit/wiki/OAuth2-Quick-Start-Example#first-steps\n", " secret =''\n", " client_id = ''\n", " user_agent = ''\n", " \n", " reddit = praw.Reddit(client_id=client_id,client_secret=secret, user_agent=user_agent)\n", " sr = reddit.subreddit('BotWatchman')\n", " bots_set = set()\n", " for p in sr.search(\"overview for\", limit=2000):\n", " bots_set.add(p.title.split(\" \")[2])\n", " return bots_set \n", "\n", "\n", "def get_remove_profiles_list(sf):\n", " # We get the bots set twice to reduce the variance of the results\n", " bots_set = get_bots_set()\n", " bots_set |= get_bots_set()\n", " posts_count_sf = sf.groupby('author', gl.aggregate.COUNT())\n", " delete_users = set(posts_count_sf[posts_count_sf['Count'] > 100000]['author'])\n", " delete_users |= bots_set\n", " return delete_users\n", "\n", "\n", "delete_users = get_remove_profiles_list(sf)\n", "print \"Delete Users List (%s users):\\n %s\" % (len(delete_users), delete_users)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we used the following code to filter out comments posted by bot redditors that appeared in the bots list.\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2389764512" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sf = sf[sf['author'].apply(lambda a: a not in delete_authors)]\n", "len(sf)\n", "sf.save(\"/data/reddit_data_no_txt_without_bots_and_deleted_authors.sframe\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are left with about 2.39 billion comments." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Analyzing Subreddits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to better understand the structure and evolution of subreddits. Let's calculate some interesting statistics on these subreddit communities. We will start by calculating the number of unique subreddits, and then we’ll create histograms of the number of posts on each subreddit." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The dataset contains 371833 unique subreddits.\n" ] } ], "source": [ "#For running this section please make sure you created 'reddit_data_no_txt_without_bots_and_deleted_authors.sframe' as explained\n", "# in the previous section\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import graphlab as gl\n", "import graphlab.aggregate as agg\n", "\n", "sns.set(color_codes=True)\n", "sns.set_style(\"darkgrid\")\n", "\n", "print \"The dataset contains %s unique subreddits.\" % len(sf['subreddit'].unique())\n", "g = sf.groupby('subreddit', {'posts_num': agg.COUNT()})" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.distplot(g['posts_num'],bins=20, axlabel=\"posts\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have 371,833 subreddits in the dataset. From the above histogram, we can see that the overwhelming majority of subreddits have very few posts. Let's look at the histogram of subreddits with at least a million posts." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "357 subreddits with at least a million posts\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nCGsAAAz3/wHrK+kYL4ZYRwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g_mil = g[g['posts_num'] >= 1000000]\n", "print \"%s subreddits with at least a million posts\" % len(g_mil)\n", "sns.distplot(g_mil['posts_num'], axlabel=\"posts\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We discover that only 357 subreddits, less 0.1% of all the subreddits, contain more than a million posts. Let's calculate how many posts these subreddits contain in total." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The most popular subreddits contain 1629867408 posts\n" ] } ], "source": [ "print \"The most popular subreddits contain %s posts\" % g_mil['posts_num'].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most popular subreddits contain over 1.62 billion posts. In other words, less than 0.1% of the subreddits contain 68.2% of the posts. This result reminds me of the fact that over 57% of the world's population lives in the ten most populous [countries](https://en.wikipedia.org/wiki/World_population).\n", "Let's map the users' activity in each subbreddit. Namely, we will find how many distinct user names there are in each subreddit, and what subreddits have the most unique users." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+----------------------+-------------------------+\n", "| subreddit | distinct_authors_number |\n", "+----------------------+-------------------------+\n", "| AskReddit | 5465755 |\n", "| funny | 3204002 |\n", "| pics | 3076198 |\n", "| IAmA | 2155718 |\n", "| gaming | 2059042 |\n", "| videos | 2021998 |\n", "| WTF | 1962940 |\n", "| todayilearned | 1902033 |\n", "| AdviceAnimals | 1679658 |\n", "| aww | 1525875 |\n", "| worldnews | 1503139 |\n", "| movies | 1341623 |\n", "| gifs | 1327207 |\n", "| Music | 1265940 |\n", "| news | 1120131 |\n", "| politics | 1078397 |\n", "| leagueoflegends | 909849 |\n", "| Showerthoughts | 903086 |\n", "| atheism | 900926 |\n", "| mildlyinteresting | 897297 |\n", "| technology | 874948 |\n", "| explainlikeimfive | 872558 |\n", "| reddit.com | 836257 |\n", "| trees | 791134 |\n", "| science | 699283 |\n", "| tifu | 627500 |\n", "| pcmasterrace | 601513 |\n", "| LifeProTips | 591906 |\n", "| books | 566367 |\n", "| gonewild | 552611 |\n", "| Fitness | 551939 |\n", "| food | 513428 |\n", "| relationships | 506711 |\n", "| television | 492369 |\n", "| fffffffuuuuuuuuuuuu | 475221 |\n", "| Jokes | 458080 |\n", "| sex | 452290 |\n", "| TwoXChromosomes | 451801 |\n", "| nottheonion | 447415 |\n", "| personalfinance | 435008 |\n", "| creepy | 433207 |\n", "| buildapc | 423400 |\n", "| pokemon | 417395 |\n", "| cringepics | 379199 |\n", "| OldSchoolCool | 378328 |\n", "| sports | 375538 |\n", "| DIY | 369555 |\n", "| GlobalOffensive | 356078 |\n", "| Overwatch | 353248 |\n", "| pokemongo | 348015 |\n", "| Minecraft | 346610 |\n", "| gameofthrones | 342183 |\n", "| woahdude | 342034 |\n", "| EarthPorn | 331829 |\n", "| Games | 327470 |\n", "| nfl | 323519 |\n", "| hearthstone | 318704 |\n", "| Android | 314916 |\n", "| askscience | 313791 |\n", "| DotA2 | 309898 |\n", "| bestof | 309743 |\n", "| soccer | 309067 |\n", "| wow | 305485 |\n", "| friendsafari | 298996 |\n", "| Futurology | 294915 |\n", "| dataisbeautiful | 289916 |\n", "| GetMotivated | 288994 |\n", "| nba | 285947 |\n", "| reactiongifs | 282759 |\n", "| malefashionadvice | 279534 |\n", "| 4chan | 274217 |\n", "| space | 272824 |\n", "| DestinyTheGame | 265169 |\n", "| millionairemakers | 263846 |\n", "| nosleep | 259567 |\n", "| interestingasfuck | 259040 |\n", "| ImGoingToHellForThis | 258763 |\n", "| Art | 251100 |\n", "| tipofmytongue | 250919 |\n", "| cringe | 248369 |\n", "| skyrim | 247361 |\n", "| circlejerk | 246957 |\n", "| techsupport | 242859 |\n", "| BlackPeopleTwitter | 241724 |\n", "| photoshopbattles | 235111 |\n", "| anime | 233713 |\n", "| StarWars | 233363 |\n", "| The_Donald | 232584 |\n", "| AskMen | 231575 |\n", "| promos | 227740 |\n", "| gadgets | 227630 |\n", "| Documentaries | 227155 |\n", "| hiphopheads | 224751 |\n", "| Frugal | 223954 |\n", "| nsfw | 218661 |\n", "| TumblrInAction | 217394 |\n", "| Fallout | 216836 |\n", "| programming | 215156 |\n", "| Steam | 214232 |\n", "| PS4 | 214131 |\n", "+----------------------+-------------------------+\n", "[371833 rows x 2 columns]\n", "\n" ] } ], "source": [ "g = sf.groupby('subreddit', {'distinct_authors_number':agg.COUNT_DISTINCT('author')})\n", "g = g.sort('distinct_authors_number', ascending=False)\n", "g.print_rows(100)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By calculating the elapsed time between users' first post and last post, we can also estimate how much time users have been active in each subreddit." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
authorsubredditstart_dateend_dateposts_numactivity_time
d4mini0nainbow13340380711427931191993893120
polinredditnews1325830586132583058610
goliveyourdreamsrelationships1337470570145150604527114035475
ssa111spreading1448388980145150094823111968
SugarBeetsmalelivingspace1356540644147408588220117545238
Wejurtcanucks142968352814300834788399950
themonthofmaerelationships14681654321468165480248
Puckhead7ColoradoAvalanche141958027814765906164357010338
throwitawaytrustmerelationships1448225775144822577510
spinstartshereLenovo1455307194145650396931196775
\n", "[170259623 rows x 6 columns]
Note: Only the head of the SFrame is printed.
You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.\n", "
" ], "text/plain": [ "Columns:\n", "\tauthor\tstr\n", "\tsubreddit\tstr\n", "\tstart_date\tint\n", "\tend_date\tint\n", "\tposts_num\tint\n", "\tactivity_time\tint\n", "\n", "Rows: 170259623\n", "\n", "Data:\n", "+--------------------+-------------------+------------+------------+-----------+\n", "| author | subreddit | start_date | end_date | posts_num |\n", "+--------------------+-------------------+------------+------------+-----------+\n", "| d4mini0n | ainbow | 1334038071 | 1427931191 | 9 |\n", "| polinreddit | news | 1325830586 | 1325830586 | 1 |\n", "| goliveyourdreams | relationships | 1337470570 | 1451506045 | 27 |\n", "| ssa111 | spreading | 1448388980 | 1451500948 | 2 |\n", "| SugarBeets | malelivingspace | 1356540644 | 1474085882 | 20 |\n", "| Wejurt | canucks | 1429683528 | 1430083478 | 8 |\n", "| themonthofmae | relationships | 1468165432 | 1468165480 | 2 |\n", "| Puckhead7 | ColoradoAvalanche | 1419580278 | 1476590616 | 43 |\n", "| throwitawaytrustme | relationships | 1448225775 | 1448225775 | 1 |\n", "| spinstartshere | Lenovo | 1455307194 | 1456503969 | 3 |\n", "+--------------------+-------------------+------------+------------+-----------+\n", "+---------------+\n", "| activity_time |\n", "+---------------+\n", "| 93893120 |\n", "| 0 |\n", "| 114035475 |\n", "| 3111968 |\n", "| 117545238 |\n", "| 399950 |\n", "| 48 |\n", "| 57010338 |\n", "| 0 |\n", "| 1196775 |\n", "+---------------+\n", "[170259623 rows x 6 columns]\n", "Note: Only the head of the SFrame is printed.\n", "You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns." ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Important: running the following code block may take considerable time\n", "sf['created_utc'] = sf['created_utc'].astype(int)\n", "subreddit_users = sf.groupby(['subreddit', 'author'], {'start_date':agg.MIN('created_utc'), 'end_date': agg.MAX('created_utc'), 'posts_num':agg.COUNT()} )\n", "subreddit_users['activity_time'] = subreddit_users.apply(lambda d: d['end_date'] - d['start_date'])\n", "subreddit_users" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's calculate the average time users have been active in each subreddit. To understand the activity time distribution across the subreddits, let's plot a histogram of average activity time." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAFmCAYAAABnbUMIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X9UXPWd//HXZZgACZAfMj8QK1Z2U90W8fRru7tWTb+S\nAAYRYqh42u12pWrds5tu3e3X81WbzW6Ipuo2umc9pye0cT3WVBpbjdtQ+0XHCq1fa7VKcJV8W2Pt\nJOAMkF8SAszA3O8fhDGTAHPDb/k8H+docofPh3w+b2Z4zefeO/datm3bAgAAC17KXA8AAADMDkIf\nAABDEPoAABiC0AcAwBCEPgAAhiD0AQAwhKPQb2lpUVlZmUpLS1VfXz9mmy1btqikpESVlZVqb29P\n2nffvn268cYbdd111+lv//Zv1dfXN8WpAACACdlJDA8P26tXr7YPHjxoRyIR+7rrrrPfeeedhDYv\nvviifcstt9i2bdutra32F77whaR9169fb7/66qu2bdv2T37yE/uhhx5KNhQAADAFSVf6bW1tys/P\nV15entxut8rLyxUIBBLaBAIBVVVVSZKKiorU29urnp6eCfu+9957uuyyyyRJl19+uZqamqb7/QwA\nADhF0tAPh8PKzc2Nb/t8PnV1dSW06erqkt/vj2/7/X6Fw+EJ+/7pn/5p/A3As88+q1AoNLWZAACA\nCc3IiXy2gyv73nPPPfrhD3+o9evX68SJE3K73TMxFAAAcFJqsgY+n0+dnZ3x7XA4LK/Xm9DG6/Um\nrNRDoZB8Pp+i0ei4fS+88ELt2LFD0siu/ubm5qSDtW1blmUlbQcAAM6UNPQLCwsVDAbV0dEhj8ej\nxsZGbdu2LaFNcXGxdu7cqbVr16q1tVXZ2dnKycnR8uXLx+17+PBhrVixQrFYTN/97nd14403Jh2s\nZVnq7u6d5FTN4fFkUSeHqJUz1Mk5auUMdXLG48ma1u+XNPRdLpc2btyo2tpa2bat6upqFRQUqKGh\nQZZlqaamRqtWrVJzc7PWrFmjjIwMbd26dcK+krRnzx7t3LlTlmWppKRE119//bRODAAAJLJsJwfg\n5xHeGSbHO2jnqJUz1Mk5auUMdXJmulf6XJEPAABDEPoAABiC0AcAwBCEPgAAhiD0AQAwBKEPAIAh\nCH0AAAxB6AMAYAhCHwAAQxD6AAAYgtAHAMAQhD4AAIYg9AEAMETSW+vio+dAR6c6O49Mun+qK0Xn\nf+y8aRwRAGA+IPQXoPZ3u3VsIG3S/SN9hwl9AFiA2L0PAIAhCH0AAAxB6AMAYAhCHwAAQxD6AAAY\ngtAHAMAQhD4AAIYg9AEAMAShDwCAIQh9AAAM4Sj0W1paVFZWptLSUtXX14/ZZsuWLSopKVFlZaXa\n29uT9t23b59qampUVVWl6upqvfnmm1OcCgAAmEjS0I/FYqqrq9OOHTu0Z88eNTY2av/+/Qltmpub\nFQwG1dTUpM2bN2vTpk1J+z7wwAPasGGDdu/erQ0bNuj++++fgekBAIBRSUO/ra1N+fn5ysvLk9vt\nVnl5uQKBQEKbQCCgqqoqSVJRUZF6e3vV09MzYV/LstTb2ytJ6u3tlc/nm+65AQCAUyS9y144HFZu\nbm582+fznbErvqurS36/P77t9/sVDocn7HvnnXfq5ptv1n333SfbttXQ0DDlyQAAgPHNyIl8tm0n\nbfPEE0/o7rvv1osvvqg777xTd91110wMBQAAnJR0pe/z+dTZ2RnfDofD8nq9CW28Xq9CoVB8OxQK\nyefzKRqNjtt39+7d+ta3viVJKisr09133+1owB5PlqN2RtsnZWWmT7p7xEo3qs4mzXUqqJNz1MoZ\n6jT7koZ+YWGhgsGgOjo65PF41NjYqG3btiW0KS4u1s6dO7V27Vq1trYqOztbOTk5Wr58+bh9fT6f\nfvOb3+izn/2sXn75ZV1wwQWOBtzd3Xv2szRQ7/GBSfeN9A0YU2ePJ8uYuU4FdXKOWjlDnZyZ7jdG\nSUPf5XJp48aNqq2tlW3bqq6uVkFBgRoaGmRZlmpqarRq1So1NzdrzZo1ysjI0NatWyfsK0l1dXXa\nsmWLYrGY0tLSVFdXN60TAwAAiSzbyQH4eYR3hsm9se9dHRtIm3T/SN9hlXyucBpHNH+x2nCGOjlH\nrZyhTs5M90qfK/IBAGAIQh8AAEMQ+gAAGILQBwDAEIQ+AACGIPQBADAEoQ8AgCEIfQAADEHoAwBg\nCEIfAABDEPoAABiC0AcAwBCEPgAAhiD0AQAwBKEPAIAhCH0AAAxB6AMAYAhCHwAAQxD6AAAYgtAH\nAMAQhD4AAIYg9AEAMAShDwCAIQh9AAAMQegDAGAIR6Hf0tKisrIylZaWqr6+fsw2W7ZsUUlJiSor\nK9Xe3p607+23365169Zp3bp1uvrqq7Vu3bopTgUAAEwkNVmDWCymuro6Pfroo/J6vaqurlZxcbEK\nCgribZqbmxUMBtXU1KS9e/dq06ZN2rVr14R9H3zwwXj/++67T1lZWTMzQwAAIMnBSr+trU35+fnK\ny8uT2+1WeXm5AoFAQptAIKCqqipJUlFRkXp7e9XT0+OoryQ9++yzuvbaa6dpSgAAYCxJQz8cDis3\nNze+7fP51NXVldCmq6tLfr8/vu33+xUOhx31fe2115STk6Pzzz9/0pMAAADJzciJfLZtO267Z88e\nVvkAAMyCpMf0fT6fOjs749vhcFherzehjdfrVSgUim+HQiH5fD5Fo9EJ+w4PD+u5557TU0895XjA\nHg/H/pPaJ2Vlpk+6e8RKN6rOJs11KqiTc9TKGeo0+5KGfmFhoYLBoDo6OuTxeNTY2Kht27YltCku\nLtbOnTu1du1atba2Kjs7Wzk5OVq+fPmEfV966SVdeOGF8vl8jgfc3d17FtMzV+/xgUn3jfQNGFNn\njyfLmLlOBXVyjlo5Q52cme43RklD3+VyaePGjaqtrZVt26qurlZBQYEaGhpkWZZqamq0atUqNTc3\na82aNcrIyNDWrVsn7DuKE/gAAJg9ln02B+DnAd4ZJvfGvnd1bCBt0v0jfYdV8rnCaRzR/MVqwxnq\n5By1coY6OTPdK32uyAcAgCEIfQAADEHoAwBgCEIfAABDEPoAABiC0AcAwBCEPgAAhiD0AQAwBKEP\nAIAhCH0AAAxB6AMAYAhCHwAAQxD6AAAYgtAHAMAQhD4AAIYg9AEAMAShDwCAIQh9AAAMQegDAGAI\nQh8AAEMQ+gAAGILQBwDAEIQ+AACGIPQBADAEoQ8AgCEIfQAADOEo9FtaWlRWVqbS0lLV19eP2WbL\nli0qKSlRZWWl2tvbHfX9wQ9+oGuuuUYVFRX6t3/7tylMAwAAJJOarEEsFlNdXZ0effRReb1eVVdX\nq7i4WAUFBfE2zc3NCgaDampq0t69e7Vp0ybt2rVrwr6vvPKKfvGLX+inP/2pUlNTdfjw4RmdKAAA\npku60m9ra1N+fr7y8vLkdrtVXl6uQCCQ0CYQCKiqqkqSVFRUpN7eXvX09EzY94knntAtt9yi1NSR\n9x0rVqyY7rkBAIBTJA39cDis3Nzc+LbP51NXV1dCm66uLvn9/vi23+9XOByesO97772n1157TTfc\ncIO+/OUv680335zyZAAAwPiS7t6fDNu2k7YZHh7WsWPHtGvXLrW1tekb3/jGGXsQxuLxZE3HEBe2\nfVJWZvqku0esdKPqbNJcp4I6OUetnKFOsy9p6Pt8PnV2dsa3w+GwvF5vQhuv16tQKBTfDoVC8vl8\nikaj4/b1+XwqKSmRJF1yySVKSUnRkSNHtHz58gnH093d62Ba6D0+MOm+kb4BY+rs8WQZM9epoE7O\nUStnqJMz0/3GKOnu/cLCQgWDQXV0dCgSiaixsVHFxcUJbYqLi7V7925JUmtrq7Kzs5WTkzNh39Wr\nV+vXv/61JOkPf/iDhoaGkgY+AACYvKQrfZfLpY0bN6q2tla2bau6uloFBQVqaGiQZVmqqanRqlWr\n1NzcrDVr1igjI0Nbt26dsK8krV+/XnfddZcqKirkdrt13333zexMAQAwnGU7OQA/j7A7KLk39r2r\nYwNpk+4f6Tusks8VTuOI5i92MTpDnZyjVs5QJ2dmffc+AABYGAh9AAAMQegDAGAIQh8AAEMQ+gAA\nGILQBwDAEIQ+AACGIPQBADAEoQ8AgCEIfQAADEHoAwBgCEIfAABDEPoAABiC0AcAwBCEPgAAhiD0\nAQAwBKEPAIAhCH0AAAxB6AMAYAhCHwAAQxD6AAAYgtAHAMAQhD4AAIYg9AEAMAShDwCAIRyFfktL\ni8rKylRaWqr6+vox22zZskUlJSWqrKxUe3t70r4PP/ywrrrqKq1bt07r1q1TS0vLFKcCAAAmkpqs\nQSwWU11dnR599FF5vV5VV1eruLhYBQUF8TbNzc0KBoNqamrS3r17tWnTJu3atStp35tuukk33XTT\nzM0OAADEJV3pt7W1KT8/X3l5eXK73SovL1cgEEhoEwgEVFVVJUkqKipSb2+venp6kva1bXuapwMA\nAMaTNPTD4bByc3Pj2z6fT11dXQlturq65Pf749t+v1/hcDhp38cff1yVlZW6++671dvbO6WJAACA\niSXdvT8ZTlbwX/ziF/V3f/d3sixLDz74oLZu3ap77703aT+PJ2s6hriw7ZOyMtMn3T1ipRtVZ5Pm\nOhXUyTlq5Qx1mn1JQ9/n86mzszO+HQ6H5fV6E9p4vV6FQqH4digUks/nUzQaHbfvihUr4o/fcMMN\nuu222xwNuLubPQJO9B4fmHTfSN+AMXX2eLKMmetUUCfnqJUz1MmZ6X5jlHT3fmFhoYLBoDo6OhSJ\nRNTY2Kji4uKENsXFxdq9e7ckqbW1VdnZ2crJyZmwb3d3d7z/c889p5UrV07nvAAAwGmSrvRdLpc2\nbtyo2tpa2bat6upqFRQUqKGhQZZlqaamRqtWrVJzc7PWrFmjjIwMbd26dcK+kvTAAw+ovb1dKSkp\nysvL0+bNm2d2pgAAGM6yP2Kn0LM7KLk39r2rYwNpk+4f6Tusks8VTuOI5i92MTpDnZyjVs5QJ2dm\nffc+AABYGAh9AAAMQegDAGAIQh8AAEMQ+gAAGILQBwDAEIQ+AACGIPQBADAEoQ8AgCEIfQAADEHo\nAwBgCEIfAABDEPoAABiC0AcAwBCEPgAAhiD0AQAwBKEPAIAhCH0AAAxB6AMAYAhCHwAAQxD6AAAY\ngtAHAMAQhD4AAIYg9AEAMAShDwCAIRyFfktLi8rKylRaWqr6+vox22zZskUlJSWqrKxUe3u7476P\nPPKILrroIh09enSSUwAAAE4kDf1YLKa6ujrt2LFDe/bsUWNjo/bv35/Qprm5WcFgUE1NTdq8ebM2\nbdrkqG8oFNJLL72kc889d5qnBQAATpc09Nva2pSfn6+8vDy53W6Vl5crEAgktAkEAqqqqpIkFRUV\nqbe3Vz09PUn73nvvvbrjjjumeUoAAGAsSUM/HA4rNzc3vu3z+dTV1ZXQpqurS36/P77t9/sVDocn\n7BsIBJSbm6tPfOITU54EAABILnUmvqlt2xN+fWBgQNu3b9cjjzziuM8ojydrSmMzwj4pKzN90t0j\nVrpRdTZprlNBnZyjVs5Qp9mXNPR9Pp86Ozvj2+FwWF6vN6GN1+tVKBSKb4dCIfl8PkWj0TH7BoNB\ndXR0qLKyUrZtKxwOa/369XryySd1zjnnTDie7u5ex5MzWe/xgUn3jfQNGFNnjyfLmLlOBXVyjlo5\nQ52cme43Rkl37xcWFsZDOhKJqLGxUcXFxQltiouLtXv3bklSa2ursrOzlZOTM27flStX6qWXXlIg\nENALL7wgn8+np59+OmngAwCAyUu60ne5XNq4caNqa2tl27aqq6tVUFCghoYGWZalmpoarVq1Ss3N\nzVqzZo0yMjK0devWCfuezrIsx7v3AQDA5Fj2Ryxt2R2U3Bv73tWxgbRJ94/0HVbJ5wqncUTzF7sY\nnaFOzlErZ6iTM7O+ex8AACwMhD4AAIYg9AEAMAShDwCAIQh9AAAMQegDAGAIQh8AAEMQ+gAAGILQ\nBwDAEIQ+AACGIPQBADAEoQ8AgCEIfQAADEHoAwBgCEIfAABDEPoAABiC0AcAwBCEPgAAhiD0AQAw\nBKEPAIAhCH0AAAxB6AMAYAhCHwAAQxD6AAAYgtAHAMAQjkK/paVFZWVlKi0tVX19/ZhttmzZopKS\nElVWVqq9vT1p33//93/Xddddp6qqKn31q19Vd3f3FKcCAAAmkjT0Y7GY6urqtGPHDu3Zs0eNjY3a\nv39/Qpvm5mYFg0E1NTVp8+bN2rRpU9K+N998s/7rv/5Lu3fv1uc//3k9/PDDMzA9AAAwKmnot7W1\nKT8/X3l5eXK73SovL1cgEEhoEwgEVFVVJUkqKipSb2+venp6Juy7ZMmSeP/+/n6lpHCkAQCAmZSa\nrEE4HFZubm582+fz6c0330xo09XVJb/fH9/2+/0Kh8NJ+z744IN65plnlJWVpccee2xKEwEAABOb\nkeW1bduO2t1+++168cUXVVFRoccff3wmhgIAAE5KutL3+Xzq7OyMb4fDYXm93oQ2Xq9XoVAovh0K\nheTz+RSNRpP2laSKigrdeuut2rBhQ9IBezxZSdsYb5+UlZk+6e4RK92oOps016mgTs5RK2eo0+xL\nGvqFhYUKBoPq6OiQx+NRY2Ojtm3bltCmuLhYO3fu1Nq1a9Xa2qrs7Gzl5ORo+fLl4/b94x//qPz8\nfEnS888/rwsvvNDRgLu7e892jkbqPT4w6b6RvgFj6uzxZBkz16mgTs5RK2eokzPT/cYoaei7XC5t\n3LhRtbW1sm1b1dXVKigoUENDgyzLUk1NjVatWqXm5matWbNGGRkZ2rp164R9Jek73/mO/vCHPygl\nJUXnnnuu/vVf/3VaJwYAABJZttMD8PME7wyTe2Pfuzo2kDbp/pG+wyr5XOE0jmj+YrXhDHVyjlo5\nQ52cme6VPp+TAwDAEIQ+AACGIPQBADAEoQ8AgCEIfQAADEHoAwBgCEIfAABDEPoAABiC0AcAwBCE\nPgAAhiD0AQAwBKEPAIAhCH0AAAxB6BukbyCqJ57/vd7t/GCuhwIAmAOEvkGOfDCo6FBM3Uf753oo\nAIA5QOgbpD8yLEkaOPknAMAshL5BBiNDkqSBwaE5HgkAYC4Q+gYZYKUPAEYj9A1C6AOA2Qh9g/Sf\n3K0/GB1WLGbP8WgAALON0DfIqSv8wSirfQAwDaFvkFNDn138AGAeQt8Qtm1rIPLhWfun/h0AYAZC\n3xCRoZjsUw7js9IHAPMQ+oYYPBnyi1JHfuSEPgCYx1Hot7S0qKysTKWlpaqvrx+zzZYtW1RSUqLK\nykq1t7cn7Xv//ffrmmuuUWVlpTZs2KDjx49PcSqYSP/J3flLM9MkEfoAYKKkoR+LxVRXV6cdO3Zo\nz549amxs1P79+xPaNDc3KxgMqqmpSZs3b9amTZuS9r3iiivU2NioZ555Rvn5+dq+ffsMTA+jBgZH\nQn5Z5iJJH16dDwBgjqSh39bWpvz8fOXl5cntdqu8vFyBQCChTSAQUFVVlSSpqKhIvb296unpmbDv\n5ZdfrpSUkX/+0ksvVSgUmu654RSjK/tlrPQBwFhJQz8cDis3Nze+7fP51NXVldCmq6tLfr8/vu33\n+xUOhx31laQf//jHuuqqqyY1ATgzEN+9v0iWpP5BQh8ATDMjJ/LZtvOrvX33u9+V2+1WRUXFTAwF\nJ42u7DPSXEpb5GL3PgAYKDVZA5/Pp87Ozvh2OByW1+tNaOP1ehN2z4dCIfl8PkWj0Qn7PvXUU2pu\nbtZjjz3meMAeT5bjtsbaJ2Vlpic8NHTysrvnLF+ixelu9fVHz2gzKmKlG1Vnk+Y6FdTJOWrlDHWa\nfUlDv7CwUMFgUB0dHfJ4PGpsbNS2bdsS2hQXF2vnzp1au3atWltblZ2drZycHC1fvnzcvi0tLdqx\nY4cef/xxLVq0yPGAu7t7z3KKZuo9PpCwfbwvIkkaigxpUWqKDkeHdfSDfrlSrDP6RvoGjKmzx5Nl\nzFyngjo5R62coU7OTPcbo6Sh73K5tHHjRtXW1sq2bVVXV6ugoEANDQ2yLEs1NTVatWqVmpubtWbN\nGmVkZGjr1q0T9pVGPuIXjUZVW1sraeQEwH/5l3+Z1snhQwORYaW5XUpJsZS+yCVp5LP7i9OTPgUA\nAAuEo9/4V1111Rkn2t14440J2//8z//suK8kNTU1OR0jpsFAZDge9qN/DkSGCH0AMAhX5DNALGZr\nMHpK6KeNBD0f2wMAsxD6Bhi9jW489N2jK31CHwBMQugbYDTcR1f46Wkf7t4HAJiD0DfAaLifcUyf\nC/QAgFEIfQOMhvuHoX/ymH6U0AcAkxD6Bojv3j8Z9h+u9Nm9DwAmIfQNcPrufXdqilIsTuQDANMQ\n+gY4faVvWZbSFqUS+gBgGELfAB+eve+KP5a+yMXZ+wBgGELfAAORIVmWtCj1wx93+iKXhoZtDQ3H\n5nBkAIDZROgbYDAaU5rbJcv68OY6GSc/s9/XH52rYQEAZhmhb4DoUEzu1MQftWfZyG11w0f652JI\nAIA5QOgbYGg4plRX4o/av2KxJCl06MRcDAkAMAcI/QXOtm0NjbHSz16ySBlpLoUOn5Bt23M0OgDA\nbCL0F7jhmC1bOmOlb1mWfCsWayAyrGN9kbkZHABgVhH6C1x0aOTs/NNX+tIpu/gPs4sfAExA6C9w\nox/JS3VZZ3xtNPTDHNcHACMQ+gtcfKXvOvNHnbXYrcXpqQod7ue4PgAYgNBf4KLD4+/etyxL/hWL\nNRgd1tHjHNcHgIWO0F/ghoZGVvCnn8g3io/uAYA5CP0FLn5Mf4yVvnTKcf0jhD4ALHSE/gI30TF9\nScpc7FZGWqq6j3JcHwAWOkJ/gZvomP4oz7J09Q8O68QAd90DgIWM0F/ghoZGP7I3/o86Z+nIdfh7\njg3MypgAAHOD0F/gPlzpn/k5/VE5SzMkSd1HufkOACxkjkK/paVFZWVlKi0tVX19/ZhttmzZopKS\nElVWVqq9vT1p35///Oe69tprdfHFF+utt96a4jQwHicr/XOWpssSK30AWOiShn4sFlNdXZ127Nih\nPXv2qLGxUfv3709o09zcrGAwqKamJm3evFmbNm1K2nflypV6+OGH9ZnPfGYGpoVRTo7pu1NTtDRz\nkQ4dG1Asxsl8ALBQJQ39trY25efnKy8vT263W+Xl5QoEAgltAoGAqqqqJElFRUXq7e1VT0/PhH0v\nvPBCXXDBBZwxPsOcrPQlKWdZhoZjto4cH5yNYQEA5kDS0A+Hw8rNzY1v+3w+dXV1JbTp6uqS3++P\nb/v9foXDYUd9MbOiwyNvqiZa6UsjZ/BLUs9RdvEDwEI1IyfysXqfP6JDMVmSXCnjn8gnfXgyX88x\nTuYDgIUqNVkDn8+nzs7O+HY4HJbX601o4/V6FQqF4tuhUEg+n0/RaDRp37Pl8WRNqb8R9klZmSMr\n95hty52aouysjAm7LFmSJndqig5/MKiszKVG1dmkuU4FdXKOWjlDnWZf0tAvLCxUMBhUR0eHPB6P\nGhsbtW3btoQ2xcXF2rlzp9auXavW1lZlZ2crJydHy5cvT9pXOrs9A93dvY7bmqz3+Mhu+kh0WKmu\nlPj2RM7JTlfo8AkdOnrCmDp7PFnGzHUqqJNz1MoZ6uTMdL8xShr6LpdLGzduVG1trWzbVnV1tQoK\nCtTQ0CDLslRTU6NVq1apublZa9asUUZGhrZu3TphX0l6/vnnVVdXpyNHjui2227TRRddpO9///vT\nOjmM7N5f5HY5apuzdCT0ez6IzvCoAABzwbI/YgfgeWeY3Bv73tWxgTRJ0g+f+52WLklT+eX5Sfv1\nHO3Xz34dVO7yRbrna1fM9DDnBVYbzlAn56iVM9TJmele6XNFvgUsZtsaGraVOsHV+E6VsyxDnmUZ\nev9IRB09fTM8OgDAbCP0F7DR2+qOd4e9sXzy48slSU2/Cc7ImAAAc4fQX8CGhkaO3KQm+Yz+qc7z\nZioz3aWX3wrpWF9kpoYGAJgDhP4CFh06+5V+imXpE3kZGhq29cJvD87U0AAAc4DQX8BGd+8nuwTv\n6T7uS9eS9FT94o0ODUaHZ2JoAIA5QOgvYPGV/lns3pekVJel//npPB3vj+r/vvn+TAwNADAHCP0F\nLL7SP8vQl6TiT5+nVJelplcPKPbR+lQnAGAchP4CFp3E2fujlmam6S/+zK/wkX7t/X3PdA8NADAH\nCP0F7MPd+84+p3+6ks9+TJL0f/j4HgAsCIT+AjbZE/lGnefJ1Kc+vkK/O3hM73Z+MJ1DAwDMAUJ/\nARua5Il8pyr78/MlSTuf+52GY7FpGRcAYG4Q+gtYdIorfUn6swtW6C/+zKc/vP+BGl/+43QNDQAw\nBwj9BSx68op8U1npS9KXSlZqeVaafvrSe3ovxG5+APioIvQXsKke0x+1JN2t2rUXazhm63s/fVsR\nLtgDAB9JqXM9AMycyVyGV5Js21Zvb+ItL8/PcevKQq9++WaXGp7fp3VXnD/h98jMzJRlTe5TAwCA\nmUHoL2CTvTjPwMAJBV7dr7T0jITHc7JdysxI1Yt7w7LtYXmXpY3Zf3CgX8WfKVBW1vTeBxoAMDWE\n/gIWHYopxbLkSjn7FXdaeoYyFmee8fiVRW79/JWgXvvdUVVccYEWpbqmY6gAgFnAMf0FbGg4ptRJ\nXphnPJ5lGSq88Bz1DQzpxTc61T84NK3fHwAwcwj9BSw6FJvUJXiTuaTgHOV5lih06IR++tJ7Oth1\nfNr/DQDA9CP0F7DocGzKH9cbS0qKpas/nafPXORVJBrTC6936L/fPTTt/w4AYHoR+gvY0JA95Y/r\njceyLF18wXKVX36+Fqen6vXf9ei3/69LNnfkA4B5i9BfoIZjtmK2PSMr/VMtz0pX2Z+fr+zFbr31\nhyNq2fu+ek9EZ/TfBABMDqG/QI1ed3+mVvqnysxwq+wvztc5S9P1x1Cvfv5al/7z5++oo5tj/QAw\nn/CRvQVq9Lr7M73SH5W+KFXX/MX5OhA+rr3vdKt1/xHtffc3uvKSc1V15ce1LHPsz/QDAGYPob/A\ndPT06cSrG6KfAAAMiUlEQVTgsIZOfpJuNlb6o1IsS/n+LHmypOXZS7Tn1x1q2dupX78V0pVF56rs\nsyN7AwAAc8NR6Le0tOjee++Vbdtav369br311jPabNmyRS0tLcrIyNC3v/1tXXzxxRP2PXbsmG6/\n/XZ1dHTovPPO00MPPcQV3KbBfTtf16JU6TMX+yXN3kr/dBfkpOp/3fBneqW9W02vva/Abw/qF290\naGVeli48N0sF52Yp37tkwvFxKV8AmF5JQz8Wi6murk6PPvqovF6vqqurVVxcrIKCgnib5uZmBYNB\nNTU1ae/evdq0aZN27do1Yd/6+nr95V/+pW655RbV19dr+/bt+uY3vzmjkzXBZRd59eIbHWrbP/IR\nOrdr9kNzcOCEWlqPKXvpMknS1ZfmKNjdr98dPK59Bz7QvgMjd+pLsaQVWYu0LNOtJempysxwaekS\ntxanuRQZHOBSvgAwzZKGfltbm/Lz85WXlydJKi8vVyAQSAj9QCCgqqoqSVJRUZF6e3vV09OjgwcP\njts3EAjo8ccflyStW7dOX/7ylwn9abB+1YV65a339f6hE5LO/rr70+X0y/henJmliz/uVf/gkLqO\n9KvrSL/CR07o0AeD6vkgktjX7dLyzFQNxA5q5fk5ylrslmVZSnVZyspYpOwli+ZsDwaAj56ByJCa\nXj2gJelurbr03Fk97DnfJA39cDis3Nzc+LbP59Obb76Z0Karq0t+vz++7ff7FQ6HJ+x76NAh5eTk\nSJI8Ho8OHz48tZlA0shtcD/3qRV6/vUeSWd/h72ZlpGWqnx/lvL9Iyv4yNCwPuiLqq8/qg9ORHT4\ng0EdOjag0JFBhV57X02vvT/m90l1WUp1pZz801JqSkrCY66Tf3eftp3QLyVFS7PTNDgwNNImxVJK\niiXLGjk/IcWytHhxulwpKbIsSymWJGvkGgWWTv5paeQ/nfx7wuMje1lSTn4hoV3C30e/38j/Rm+V\n8GG/U/bWTOY6CA4PkUzUajglRYeP9jtq6/ibJjRzOMZp3nE13YePLEtypbl19PjgxO3O5hs6aeb4\n+01rMw0N24oOxzQ8PHL1T3dqimxJkaGYokMxpbosLUp1KcWSBqLDGowMy5ViKW2RS640t0KHT+jE\nwJAsS1qclqq0RS6dGBhS74mIhmK2sjLcylq8SCcGojr0waBODES1NDNNK7LTNDA4rIPdx9V1pF85\nS9N1njdTQ8Mxtb7To7ffO6Kc7HRd+qc5crksPfmL/TrSO/IzaW7t0F+VfEIrP7bMadUWlBk5kW8y\nF2jh2O30+URuqvZmp6r7gyFp6IQGjw+fVX870q/BlMmfcDc4MCArxaX+E84+srfELS1xW/Jmp0n+\nNEnZ6u7u0eHeQUWVrqFhW7YtxWxpMBrT4JCtoWFbsZitYdvWYETqt4cUi0kx21bMnlw2AlgYUizp\nj6Fe/fZ33ZIkV4qlNf8jV8f7h/Ty29369s7X9b+/9Gkjgz9p6Pt8PnV2dsa3w+GwvF5vQhuv16tQ\nKBTfDoVC8vl8ikaj4/bNyclRT0+PcnJy1N3drRUrVjgasMfDMd5kyq7+c5VdPdejAADMN0n3/RYW\nFioYDKqjo0ORSESNjY0qLi5OaFNcXKzdu3dLklpbW5Wdna2cnJwJ+1599dV66qmnJElPP/30Gd8T\nAABML8t2sC++paVF99xzj2zbVnV1tW699VY1NDTIsizV1NRIkjZv3qxf/vKXysjI0NatW/XJT35y\n3L6SdPToUX3jG9/Q+++/r7y8PD300EPKzs6ewakCAGA2R6EPAAA++ubXqd0AAGDGEPoAABiC0AcA\nwBDzMvQffvhhXXXVVVq3bp3WrVunlpaW+Ne2b9+ukpISXXPNNfrVr34Vf/ytt95SRUWFSktLdc89\n98zFsOeFlpYWlZWVqbS0VPX19XM9nDl39dVX67rrrlNVVZWqq6sljdz3oba2VqWlpfrqV7+q3t7e\nePvxnl8L0V133aXLL79cFRUV8ccmU5uF/tobq078jjpTKBTSX//1X6u8vFwVFRV67LHHJPGcOt3p\ndfrBD34gaRafU/Y89B//8R/2I488csbj77zzjl1ZWWlHo1H7wIED9urVq+1YLGbbtm1XV1fbe/fu\ntW3btm+++Wa7paVlVsc8HwwPD9urV6+2Dx48aEciEfu6666z33nnnbke1py6+uqr7aNHjyY8dv/9\n99v19fW2bdv29u3b7QceeMC2bdv+/e9/P+7zayF69dVX7bffftu+9tpr449NpjYL/bU3Vp34HXWm\nrq4u++2337Zt27aPHz9ul5SU2O+88w7PqdOMV6fZek7Ny5W+NPZV/QKBgNauXavU1FSdd955ys/P\nV1tbm7q7u9XX16dLLrlEklRVVaXnn39+toc85069T4Lb7Y7f68Bktm0rFoslPBYIBLRu3TpJI/d9\nGH2uvPDCC2M+vxaqyy677IyPyZ5tbUx47Y1VJ4nfUafzeDzxu6suWbJEBQUFCofDPKdOM1adurq6\nJM3Oc2rehv7jjz+uyspK3X333fHdQWNdy3/0Gv+nXvt/9HHTjFWf0SeTqSzLUm1trdavX68nn3xS\n0vj3fRjv+WWSw4cPn1VtTH7t8TtqfAcPHtS+fftUVFR01q83k2o1WqfR4J6N59Schf5NN92kioqK\nM/574YUX9MUvflGBQEDPPPOMcnJy9O1vf3uuhomPuCeeeEJPP/20vve972nnzp167bXXzrjPA/d9\nGB+1GRu/o8bX19enr3/967rrrru0ZMkSXm/jOL1Os/WcmpEb7jjxn//5n47a3XDDDbrtttskjbyT\nef/9D++6NnqN/9MfD4fD8vl80zvgjwAn90kwzej8V6xYodWrV6utrU3nnHPOmPd9GO/5ZZKzrY2p\nr71T7xXC76gPDQ0N6etf/7oqKyu1evVqSTynxjJWnWbrOTUvd+93d3fH//7cc89p5cqVkkbOxP7Z\nz36mSCSiAwcOKBgM6pJLLpHH41FWVpba2tpk27Z2795t5LX8ndwnwST9/f3q6+uTJJ04cUK/+tWv\ntHLlynHv+zDe82shO/0Y4tnWxpTX3ul14nfU2O666y79yZ/8ib7yla/EH+M5daax6jRbz6l5eRne\nO+64Q+3t7UpJSVFeXp42b94cPya0fft2/fjHP1ZqaqruvvtuXXHFFZKk//7v/9add96pwcFBXXXV\nVfrWt741l1OYM+Pd68BEBw4c0N///d/LsiwNDw+roqJCt95664T3fRjv+bUQ/dM//ZNeeeUVHT16\nVDk5OdqwYYNWr16tf/iHfzir2iz0195YdXrllVf4HXWa3/72t/qrv/orrVy5UpZlybIs3X777brk\nkkvO+vW2kGs1Xp327NkzK8+peRn6AABg+s3L3fsAAGD6EfoAABiC0AcAwBCEPgAAhiD0AQAwBKEP\nAIAhCH0AkqSLLrpI/f39cz0MADOI0AcgiWuiAyaYs2vvA5hbTU1NevDBB5Wenq41a9bEH//mN7+p\n9957T5FIRPn5+br33nuVlZWlr33ta7r++utVWloa7/+jH/1IO3bs0MMPP6yf/exnSktLk2VZeuyx\nx5SZmTlXUwMwDq7IBxjo0KFDWrt2rXbt2qX8/Hx9//vf13e+8x29/vrrGhwc1LJlyyRJDz30kGKx\nmP7xH/9Rv/zlL/W9731Pjz32mCTpb/7mb/SVr3xFn/70p7V69Wq99NJLWrRokU6cOKH09HSlpLAj\nEZhveFUCBtq7d68+9alPKT8/X5JUU1MT/9rTTz+t66+/XhUVFWpsbFR7e7sk6corr1RPT4/effdd\n7d+/XwcOHNDnP/95ZWVlKT8/X3fccYeefPJJ9fX1EfjAPMXufQDxu8i99dZbamho0I9+9CMtW7ZM\ne/bs0a5du+LtvvSlL+mHP/yhpJE3CqM3DNm1a5def/11vfzyy7r++uu1Y8eO+F3CAMwfvB0HDHTp\npZfq7bffVjAYlCQ9+eSTkqTjx48rKytLS5cuVSQS0U9+8pOEflVVVXr++ef17LPP6gtf+IIkqa+v\nT4cOHdJll12mDRs2aOXKlfr9738/uxMC4AgrfcBAK1asUF1dnb72ta8pIyNDJSUlkqTPfvaz+tjH\nPqbS0lKtWLFCl112mdra2uL9lixZoiuvvFKDg4Navny5pJE3Chs2bNDg4KBisZg++clPJpwYCGD+\n4EQ+AI4NDQ2psrJS9913nz71qU/N9XAAnCV27wNw5IUXXlBJSYmuvPJKAh/4iGKlDwCAIVjpAwBg\nCEIfAABDEPoAABiC0AcAwBCEPgAAhiD0AQAwxP8HwvR10j/EJZgAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g = subreddit_users.groupby('subreddit', {'avg_active_time_in_seconds': agg.AVG('activity_time')})\n", "g['avg_active_time_in_days'] = g['avg_active_time_in_seconds'].apply(lambda sec: sec/(60.0*60.0*24))\n", "sns.distplot(g['avg_active_time_in_days'], axlabel=\"days\", bins=20 )" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\n", "+--------------------+---------------+----------+\n", "| item | value | is exact |\n", "+--------------------+---------------+----------+\n", "| Length | 371833 | Yes |\n", "| Min | 0.0 | Yes |\n", "| Max | 2208.85173611 | Yes |\n", "| Mean | 24.0121476349 | Yes |\n", "| Sum | 8928508.89152 | Yes |\n", "| Variance | 3906.78028205 | Yes |\n", "| Standard Deviation | 62.5042421124 | Yes |\n", "| # Missing Values | 0 | Yes |\n", "| # unique values | 201266 | No |\n", "+--------------------+---------------+----------+\n", "\n", "Most frequent items:\n", "+-------+--------+-------------------+-------------------+-------------------+\n", "| value | 0.0 | 2.31481481481e-05 | 6.94444444444e-05 | 1.15740740741e-05 |\n", "+-------+--------+-------------------+-------------------+-------------------+\n", "| count | 154663 | 383 | 381 | 372 |\n", "+-------+--------+-------------------+-------------------+-------------------+\n", "+-------------------+-------------------+-------------------+-------------------+\n", "| 3.47222222222e-05 | 4.62962962963e-05 | 5.78703703704e-05 | 8.10185185185e-05 |\n", "+-------------------+-------------------+-------------------+-------------------+\n", "| 350 | 250 | 235 | 182 |\n", "+-------------------+-------------------+-------------------+-------------------+\n", "+-------------------+-------------------+\n", "| 1.73611111111e-05 | 9.25925925926e-05 |\n", "+-------------------+-------------------+\n", "| 155 | 148 |\n", "+-------------------+-------------------+\n", "\n", "Quantiles: \n", "+-----+-----+-----+-----+-----------------+---------------+---------------+\n", "| 0% | 1% | 5% | 25% | 50% | 75% | 95% |\n", "+-----+-----+-----+-----+-----------------+---------------+---------------+\n", "| 0.0 | 0.0 | 0.0 | 0.0 | 0.0447029320988 | 18.2136749847 | 130.748425926 |\n", "+-----+-----+-----+-----+-----------------+---------------+---------------+\n", "+---------------+---------------+\n", "| 99% | 100% |\n", "+---------------+---------------+\n", "| 277.742471065 | 2208.85173611 |\n", "+---------------+---------------+" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g['avg_active_time_in_days'].sketch_summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see from the above results that most of the subreddits' users are active for a very limited time, with an average of less than a month and a median of less than a day." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Join-Rate Curves" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In our [study](http://dynamics.cs.washington.edu/publications.html), we focused on analyzing the various patterns in which users join each subreddit (also referred to as the Join-Rate-Curve). In this section, we present the code that was used to create these curves. To create the join-rate-curve of each subreddit, we first created a TimeSeries object with the subreddit information. Throughout this section, we will use the [_Science_ subreddit](https://www.reddit.com/r/science/) as an example.\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datetimeauthorauthor_flair_css_classauthor_flair_textbody
2006-10-18 16:36:27conrad_hexnullnullIt sort of sounds like
the caffeinated-baby ...
2006-10-18 16:56:54the_seanaldnullnullThe 10 year old inside me
chuckled at \"pinches off ...
2006-10-18 17:07:48Mr_SmartypantsnullnullOne would think a
journalist (or even a ...
2006-10-18 17:10:15tcervlnullnullalmost useful!\\r\\n\\r\\nFor
me, in computer science, ...
2006-10-18 17:18:07Lagged2DeathnullnullAn entertaining rant.
Definitely worth a ...
2006-10-18 18:37:48anonymgrlnullnull:)
2006-10-18 19:13:51SaintstacenullnullNo, but you just gave me
the idea to do so. ...
2006-10-18 19:30:02_jjsonpnullnullthat is fascinating. i
wonder how long before ...
2006-10-18 20:46:34dsandlernullnullOr, at least, bolder,
which is a trait that ...
2006-10-18 21:09:39NitsujTPUcompsciPhD | Computer ScienceMind Hacks is awesome.
The book is totally w ...
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
controversialitycreated_utcdistinguishededitedgildedidlink_idparent_idretrieved_onscore
01161189387nullfalse0cmqc1t3_mpuft3_mpuf14738025742
01161190614nullfalse0cmqf7t3_mp5wt3_mp5w14738025777
01161191268nullfalse0cmqhat3_mpuft3_mpuf14738025772
01161191415nullfalse0cmqhkt3_mppft3_mppf14738025773
01161191887nullfalse0cmqivt3_mpjmt3_mpjm14738025784
11161196668nullfalse0cmqywt3_mp5wt1_cmqf714738025872
01161198831nullfalse0cmr6ft3_mr3tt3_mr3t14738025913
01161199802nullfalse0cmrbot3_mp5wt3_mp5w14738025934
01161204394nullfalse0cmrsxt3_mpuft1_cmqc114738026031
01161205779nullfalse0cmrxxt3_mqcpt3_mqcp14738026050
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
stickiedsubredditsubreddit_idupsmonthyearbanned_byrepliesremoval_reasonlikesuser_reports
falsesciencet5_mouw2102006NoneNoneNoneNoneNone
falsesciencet5_mouw7102006NoneNoneNoneNoneNone
falsesciencet5_mouw2102006NoneNoneNoneNoneNone
falsesciencet5_mouw3102006NoneNoneNoneNoneNone
falsesciencet5_mouw4102006NoneNoneNoneNoneNone
falsesciencet5_mouw2102006NoneNoneNoneNoneNone
falsesciencet5_mouw3102006NoneNoneNoneNoneNone
falsesciencet5_mouw4102006NoneNoneNoneNoneNone
falsesciencet5_mouw1102006NoneNoneNoneNoneNone
falsesciencet5_mouw0102006NoneNoneNoneNoneNone
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
savedarchivedreport_reasonsapproved_bydownsbody_htmlscore_hiddennamecreatedmod_reports
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
num_reports
None
None
None
None
None
None
None
None
None
None
\n", "[4975855 rows x 37 columns]
Note: Only the head of the TimeSeries is printed.
You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.\n", "
" ], "text/plain": [ "Columns:\n", "\tdatetime\tdatetime (index column)\n", "\tauthor\tstr\n", "\tauthor_flair_css_class\tstr\n", "\tauthor_flair_text\tstr\n", "\tbody\tstr\n", "\tcontroversiality\tstr\n", "\tcreated_utc\tstr\n", "\tdistinguished\tstr\n", "\tedited\tstr\n", "\tgilded\tstr\n", "\tid\tstr\n", "\tlink_id\tstr\n", "\tparent_id\tstr\n", "\tretrieved_on\tstr\n", "\tscore\tstr\n", "\tstickied\tstr\n", "\tsubreddit\tstr\n", "\tsubreddit_id\tstr\n", "\tups\tstr\n", "\tmonth\tstr\n", "\tyear\tstr\n", "\tbanned_by\tstr\n", "\treplies\tstr\n", "\tremoval_reason\tstr\n", "\tlikes\tstr\n", "\tuser_reports\tstr\n", "\tsaved\tstr\n", "\tarchived\tstr\n", "\treport_reasons\tstr\n", "\tapproved_by\tstr\n", "\tdowns\tstr\n", "\tbody_html\tstr\n", "\tscore_hidden\tstr\n", "\tname\tstr\n", "\tcreated\tstr\n", "\tmod_reports\tstr\n", "\tnum_reports\tstr\n", "\n", "Rows: 4975855\n", "\n", "Data:\n", "+---------------------+----------------+------------------------+\n", "| datetime | author | author_flair_css_class |\n", "+---------------------+----------------+------------------------+\n", "| 2006-10-18 16:36:27 | conrad_hex | null |\n", "| 2006-10-18 16:56:54 | the_seanald | null |\n", "| 2006-10-18 17:07:48 | Mr_Smartypants | null |\n", "| 2006-10-18 17:10:15 | tcervl | null |\n", "| 2006-10-18 17:18:07 | Lagged2Death | null |\n", "| 2006-10-18 18:37:48 | anonymgrl | null |\n", "| 2006-10-18 19:13:51 | Saintstace | null |\n", "| 2006-10-18 19:30:02 | _jjsonp | null |\n", "| 2006-10-18 20:46:34 | dsandler | null |\n", "| 2006-10-18 21:09:39 | NitsujTPU | compsci |\n", "+---------------------+----------------+------------------------+\n", "+------------------------+-------------------------------+------------------+\n", "| author_flair_text | body | controversiality |\n", "+------------------------+-------------------------------+------------------+\n", "| null | It sort of sounds like the... | 0 |\n", "| null | The 10 year old inside me ... | 0 |\n", "| null | One would think a journali... | 0 |\n", "| null | almost useful!\\r\\n\\r\\nFor ... | 0 |\n", "| null | An entertaining rant. Defi... | 0 |\n", "| null | :) | 1 |\n", "| null | No, but you just gave me t... | 0 |\n", "| null | that is fascinating. i won... | 0 |\n", "| null | Or, at least, bolder, whic... | 0 |\n", "| PhD | Computer Science | Mind Hacks is awesome. Th... | 0 |\n", "+------------------------+-------------------------------+------------------+\n", "+-------------+---------------+--------+--------+-------+---------+-----------+\n", "| created_utc | distinguished | edited | gilded | id | link_id | parent_id |\n", "+-------------+---------------+--------+--------+-------+---------+-----------+\n", "| 1161189387 | null | false | 0 | cmqc1 | t3_mpuf | t3_mpuf |\n", "| 1161190614 | null | false | 0 | cmqf7 | t3_mp5w | t3_mp5w |\n", "| 1161191268 | null | false | 0 | cmqha | t3_mpuf | t3_mpuf |\n", "| 1161191415 | null | false | 0 | cmqhk | t3_mppf | t3_mppf |\n", "| 1161191887 | null | false | 0 | cmqiv | t3_mpjm | t3_mpjm |\n", "| 1161196668 | null | false | 0 | cmqyw | t3_mp5w | t1_cmqf7 |\n", "| 1161198831 | null | false | 0 | cmr6f | t3_mr3t | t3_mr3t |\n", "| 1161199802 | null | false | 0 | cmrbo | t3_mp5w | t3_mp5w |\n", "| 1161204394 | null | false | 0 | cmrsx | t3_mpuf | t1_cmqc1 |\n", "| 1161205779 | null | false | 0 | cmrxx | t3_mqcp | t3_mqcp |\n", "+-------------+---------------+--------+--------+-------+---------+-----------+\n", "+--------------+-------+----------+-----------+--------------+-----+-------+-----+\n", "| retrieved_on | score | stickied | subreddit | subreddit_id | ups | month | ... |\n", "+--------------+-------+----------+-----------+--------------+-----+-------+-----+\n", "| 1473802574 | 2 | false | science | t5_mouw | 2 | 10 | ... |\n", "| 1473802577 | 7 | false | science | t5_mouw | 7 | 10 | ... |\n", "| 1473802577 | 2 | false | science | t5_mouw | 2 | 10 | ... |\n", "| 1473802577 | 3 | false | science | t5_mouw | 3 | 10 | ... |\n", "| 1473802578 | 4 | false | science | t5_mouw | 4 | 10 | ... |\n", "| 1473802587 | 2 | false | science | t5_mouw | 2 | 10 | ... |\n", "| 1473802591 | 3 | false | science | t5_mouw | 3 | 10 | ... |\n", "| 1473802593 | 4 | false | science | t5_mouw | 4 | 10 | ... |\n", "| 1473802603 | 1 | false | science | t5_mouw | 1 | 10 | ... |\n", "| 1473802605 | 0 | false | science | t5_mouw | 0 | 10 | ... |\n", "+--------------+-------+----------+-----------+--------------+-----+-------+-----+\n", "[4975855 rows x 37 columns]\n", "Note: Only the head of the TimeSeries is printed.\n", "You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns." ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime, timedelta\n", "\n", "science_sf = sf[sf['subreddit'] =='science']\n", "science_sf['datetime'] = science_sf['created_utc'].apply(lambda utc:datetime.utcfromtimestamp(int(utc)))\n", "subreddit_ts = gl.TimeSeries(science_sf, index='datetime')\n", "subreddit_ts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use the following function to create the subreddit user arrival curve from the TimeSeries object." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calculating the user arrival curve between 2006-10-18 16:36:27 and 2006-11-15 16:36:27\n", "Calculating the user arrival curve between 2006-11-15 16:36:27 and 2006-12-13 16:36:27\n", "Calculating the user arrival curve between 2006-12-13 16:36:27 and 2007-01-10 16:36:27\n", "Calculating the user arrival curve between 2007-01-10 16:36:27 and 2007-02-07 16:36:27\n", "Calculating the user arrival curve between 2007-02-07 16:36:27 and 2007-03-07 16:36:27\n", "Calculating the user arrival curve between 2007-03-07 16:36:27 and 2007-04-04 16:36:27\n", "Calculating the user arrival curve between 2007-04-04 16:36:27 and 2007-05-02 16:36:27\n", "Calculating the user arrival curve between 2007-05-02 16:36:27 and 2007-05-30 16:36:27\n", "Calculating the user arrival curve between 2007-05-30 16:36:27 and 2007-06-27 16:36:27\n", "Calculating the user arrival curve between 2007-06-27 16:36:27 and 2007-07-25 16:36:27\n", "Calculating the user arrival curve between 2007-07-25 16:36:27 and 2007-08-22 16:36:27\n", "Calculating the user arrival curve between 2007-08-22 16:36:27 and 2007-09-19 16:36:27\n", "Calculating the user arrival curve between 2007-09-19 16:36:27 and 2007-10-17 16:36:27\n", "Calculating the user arrival curve between 2007-10-17 16:36:27 and 2007-11-14 16:36:27\n", "Calculating the user arrival curve between 2007-11-14 16:36:27 and 2007-12-12 16:36:27\n", "Calculating the user arrival curve between 2007-12-12 16:36:27 and 2008-01-09 16:36:27\n", "Calculating the user arrival curve between 2008-01-09 16:36:27 and 2008-02-06 16:36:27\n", "Calculating the user arrival curve between 2008-02-06 16:36:27 and 2008-03-05 16:36:27\n", "Calculating the user arrival curve between 2008-03-05 16:36:27 and 2008-04-02 16:36:27\n", "Calculating the user arrival curve between 2008-04-02 16:36:27 and 2008-04-30 16:36:27\n", "Calculating the user arrival curve between 2008-04-30 16:36:27 and 2008-05-28 16:36:27\n", "Calculating the user arrival curve between 2008-05-28 16:36:27 and 2008-06-25 16:36:27\n", "Calculating the user arrival curve between 2008-06-25 16:36:27 and 2008-07-23 16:36:27\n", "Calculating the user arrival curve between 2008-07-23 16:36:27 and 2008-08-20 16:36:27\n", "Calculating the user arrival curve between 2008-08-20 16:36:27 and 2008-09-17 16:36:27\n", "Calculating the user arrival curve between 2008-09-17 16:36:27 and 2008-10-15 16:36:27\n", "Calculating the user arrival curve between 2008-10-15 16:36:27 and 2008-11-12 16:36:27\n", "Calculating the user arrival curve between 2008-11-12 16:36:27 and 2008-12-10 16:36:27\n", "Calculating the user arrival curve between 2008-12-10 16:36:27 and 2009-01-07 16:36:27\n", "Calculating the user arrival curve between 2009-01-07 16:36:27 and 2009-02-04 16:36:27\n", "Calculating the user arrival curve between 2009-02-04 16:36:27 and 2009-03-04 16:36:27\n", "Calculating the user arrival curve between 2009-03-04 16:36:27 and 2009-04-01 16:36:27\n", "Calculating the user arrival curve between 2009-04-01 16:36:27 and 2009-04-29 16:36:27\n", "Calculating the user arrival curve between 2009-04-29 16:36:27 and 2009-05-27 16:36:27\n", "Calculating the user arrival curve between 2009-05-27 16:36:27 and 2009-06-24 16:36:27\n", "Calculating the user arrival curve between 2009-06-24 16:36:27 and 2009-07-22 16:36:27\n", "Calculating the user arrival curve between 2009-07-22 16:36:27 and 2009-08-19 16:36:27\n", "Calculating the user arrival curve between 2009-08-19 16:36:27 and 2009-09-16 16:36:27\n", "Calculating the user arrival curve between 2009-09-16 16:36:27 and 2009-10-14 16:36:27\n", "Calculating the user arrival curve between 2009-10-14 16:36:27 and 2009-11-11 16:36:27\n", "Calculating the user arrival curve between 2009-11-11 16:36:27 and 2009-12-09 16:36:27\n", "Calculating the user arrival curve between 2009-12-09 16:36:27 and 2010-01-06 16:36:27\n", "Calculating the user arrival curve between 2010-01-06 16:36:27 and 2010-02-03 16:36:27\n", "Calculating the user arrival curve between 2010-02-03 16:36:27 and 2010-03-03 16:36:27\n", "Calculating the user arrival curve between 2010-03-03 16:36:27 and 2010-03-31 16:36:27\n", "Calculating the user arrival curve between 2010-03-31 16:36:27 and 2010-04-28 16:36:27\n", "Calculating the user arrival curve between 2010-04-28 16:36:27 and 2010-05-26 16:36:27\n", "Calculating the user arrival curve between 2010-05-26 16:36:27 and 2010-06-23 16:36:27\n", "Calculating the user arrival curve between 2010-06-23 16:36:27 and 2010-07-21 16:36:27\n", "Calculating the user arrival curve between 2010-07-21 16:36:27 and 2010-08-18 16:36:27\n", "Calculating the user arrival curve between 2010-08-18 16:36:27 and 2010-09-15 16:36:27\n", "Calculating the user arrival curve between 2010-09-15 16:36:27 and 2010-10-13 16:36:27\n", "Calculating the user arrival curve between 2010-10-13 16:36:27 and 2010-11-10 16:36:27\n", "Calculating the user arrival curve between 2010-11-10 16:36:27 and 2010-12-08 16:36:27\n", "Calculating the user arrival curve between 2010-12-08 16:36:27 and 2011-01-05 16:36:27\n", "Calculating the user arrival curve between 2011-01-05 16:36:27 and 2011-02-02 16:36:27\n", "Calculating the user arrival curve between 2011-02-02 16:36:27 and 2011-03-02 16:36:27\n", "Calculating the user arrival curve between 2011-03-02 16:36:27 and 2011-03-30 16:36:27\n", "Calculating the user arrival curve between 2011-03-30 16:36:27 and 2011-04-27 16:36:27\n", "Calculating the user arrival curve between 2011-04-27 16:36:27 and 2011-05-25 16:36:27\n", "Calculating the user arrival curve between 2011-05-25 16:36:27 and 2011-06-22 16:36:27\n", "Calculating the user arrival curve between 2011-06-22 16:36:27 and 2011-07-20 16:36:27\n", "Calculating the user arrival curve between 2011-07-20 16:36:27 and 2011-08-17 16:36:27\n", "Calculating the user arrival curve between 2011-08-17 16:36:27 and 2011-09-14 16:36:27\n", "Calculating the user arrival curve between 2011-09-14 16:36:27 and 2011-10-12 16:36:27\n", "Calculating the user arrival curve between 2011-10-12 16:36:27 and 2011-11-09 16:36:27\n", "Calculating the user arrival curve between 2011-11-09 16:36:27 and 2011-12-07 16:36:27\n", "Calculating the user arrival curve between 2011-12-07 16:36:27 and 2012-01-04 16:36:27\n", "Calculating the user arrival curve between 2012-01-04 16:36:27 and 2012-02-01 16:36:27\n", "Calculating the user arrival curve between 2012-02-01 16:36:27 and 2012-02-29 16:36:27\n", "Calculating the user arrival curve between 2012-02-29 16:36:27 and 2012-03-28 16:36:27\n", "Calculating the user arrival curve between 2012-03-28 16:36:27 and 2012-04-25 16:36:27\n", "Calculating the user arrival curve between 2012-04-25 16:36:27 and 2012-05-23 16:36:27\n", "Calculating the user arrival curve between 2012-05-23 16:36:27 and 2012-06-20 16:36:27\n", "Calculating the user arrival curve between 2012-06-20 16:36:27 and 2012-07-18 16:36:27\n", "Calculating the user arrival curve between 2012-07-18 16:36:27 and 2012-08-15 16:36:27\n", "Calculating the user arrival curve between 2012-08-15 16:36:27 and 2012-09-12 16:36:27\n", "Calculating the user arrival curve between 2012-09-12 16:36:27 and 2012-10-10 16:36:27\n", "Calculating the user arrival curve between 2012-10-10 16:36:27 and 2012-11-07 16:36:27\n", "Calculating the user arrival curve between 2012-11-07 16:36:27 and 2012-12-05 16:36:27\n", "Calculating the user arrival curve between 2012-12-05 16:36:27 and 2013-01-02 16:36:27\n", "Calculating the user arrival curve between 2013-01-02 16:36:27 and 2013-01-30 16:36:27\n", "Calculating the user arrival curve between 2013-01-30 16:36:27 and 2013-02-27 16:36:27\n", "Calculating the user arrival curve between 2013-02-27 16:36:27 and 2013-03-27 16:36:27\n", "Calculating the user arrival curve between 2013-03-27 16:36:27 and 2013-04-24 16:36:27\n", "Calculating the user arrival curve between 2013-04-24 16:36:27 and 2013-05-22 16:36:27\n", "Calculating the user arrival curve between 2013-05-22 16:36:27 and 2013-06-19 16:36:27\n", "Calculating the user arrival curve between 2013-06-19 16:36:27 and 2013-07-17 16:36:27\n", "Calculating the user arrival curve between 2013-07-17 16:36:27 and 2013-08-14 16:36:27\n", "Calculating the user arrival curve between 2013-08-14 16:36:27 and 2013-09-11 16:36:27\n", "Calculating the user arrival curve between 2013-09-11 16:36:27 and 2013-10-09 16:36:27\n", "Calculating the user arrival curve between 2013-10-09 16:36:27 and 2013-11-06 16:36:27\n", "Calculating the user arrival curve between 2013-11-06 16:36:27 and 2013-12-04 16:36:27\n", "Calculating the user arrival curve between 2013-12-04 16:36:27 and 2014-01-01 16:36:27\n", "Calculating the user arrival curve between 2014-01-01 16:36:27 and 2014-01-29 16:36:27\n", "Calculating the user arrival curve between 2014-01-29 16:36:27 and 2014-02-26 16:36:27\n", "Calculating the user arrival curve between 2014-02-26 16:36:27 and 2014-03-26 16:36:27\n", "Calculating the user arrival curve between 2014-03-26 16:36:27 and 2014-04-23 16:36:27\n", "Calculating the user arrival curve between 2014-04-23 16:36:27 and 2014-05-21 16:36:27\n", "Calculating the user arrival curve between 2014-05-21 16:36:27 and 2014-06-18 16:36:27\n", "Calculating the user arrival curve between 2014-06-18 16:36:27 and 2014-07-16 16:36:27\n", "Calculating the user arrival curve between 2014-07-16 16:36:27 and 2014-08-13 16:36:27\n", "Calculating the user arrival curve between 2014-08-13 16:36:27 and 2014-09-10 16:36:27\n", "Calculating the user arrival curve between 2014-09-10 16:36:27 and 2014-10-08 16:36:27\n", "Calculating the user arrival curve between 2014-10-08 16:36:27 and 2014-11-05 16:36:27\n", "Calculating the user arrival curve between 2014-11-05 16:36:27 and 2014-12-03 16:36:27\n", "Calculating the user arrival curve between 2014-12-03 16:36:27 and 2014-12-31 16:36:27\n", "Calculating the user arrival curve between 2014-12-31 16:36:27 and 2015-01-28 16:36:27\n", "Calculating the user arrival curve between 2015-01-28 16:36:27 and 2015-02-25 16:36:27\n", "Calculating the user arrival curve between 2015-02-25 16:36:27 and 2015-03-25 16:36:27\n", "Calculating the user arrival curve between 2015-03-25 16:36:27 and 2015-04-22 16:36:27\n", "Calculating the user arrival curve between 2015-04-22 16:36:27 and 2015-05-20 16:36:27\n", "Calculating the user arrival curve between 2015-05-20 16:36:27 and 2015-06-17 16:36:27\n", "Calculating the user arrival curve between 2015-06-17 16:36:27 and 2015-07-15 16:36:27\n", "Calculating the user arrival curve between 2015-07-15 16:36:27 and 2015-08-12 16:36:27\n", "Calculating the user arrival curve between 2015-08-12 16:36:27 and 2015-09-09 16:36:27\n", "Calculating the user arrival curve between 2015-09-09 16:36:27 and 2015-10-07 16:36:27\n", "Calculating the user arrival curve between 2015-10-07 16:36:27 and 2015-11-04 16:36:27\n", "Calculating the user arrival curve between 2015-11-04 16:36:27 and 2015-12-02 16:36:27\n", "Calculating the user arrival curve between 2015-12-02 16:36:27 and 2015-12-30 16:36:27\n", "Calculating the user arrival curve between 2015-12-30 16:36:27 and 2016-01-27 16:36:27\n", "Calculating the user arrival curve between 2016-01-27 16:36:27 and 2016-02-24 16:36:27\n", "Calculating the user arrival curve between 2016-02-24 16:36:27 and 2016-03-23 16:36:27\n", "Calculating the user arrival curve between 2016-03-23 16:36:27 and 2016-04-20 16:36:27\n", "Calculating the user arrival curve between 2016-04-20 16:36:27 and 2016-05-18 16:36:27\n", "Calculating the user arrival curve between 2016-05-18 16:36:27 and 2016-06-15 16:36:27\n", "Calculating the user arrival curve between 2016-06-15 16:36:27 and 2016-07-13 16:36:27\n", "Calculating the user arrival curve between 2016-07-13 16:36:27 and 2016-08-10 16:36:27\n", "Calculating the user arrival curve between 2016-08-10 16:36:27 and 2016-09-07 16:36:27\n", "Calculating the user arrival curve between 2016-09-07 16:36:27 and 2016-10-05 16:36:27\n" ] } ], "source": [ "import math\n", "def get_subreddit_users_arrival_curve(subreddit_ts, weeks_number=4):\n", " \"\"\"\n", " Calculates the percent of authors that joined after X weeks from all authors that joined the subreddit\n", " between the date of the first comment and the date of the last comment\n", " :param subreddit_ts: TimeSeries with the subreddit posts information\n", " :param weeks_number: the number of weeks to set the time-interval between each two calculations\n", " :return: dict in which all the keys are the number of weeks since the first comment was posted and the\n", " corresponding percentage of authors that joined the subreddit up until this week\n", " :rtype: dict\n", " \"\"\"\n", " dt = subreddit_ts.min_time\n", " end_dt = subreddit_ts.max_time\n", " authors = set()\n", " d = {0: 0}\n", " td = timedelta(days=7 * weeks_number)\n", " count = 1\n", " total_authors_num = float(len(subreddit_ts['author'].unique())) \n", " while dt + td <= end_dt:\n", " ts = subreddit_ts.slice(dt, dt + td)\n", " authors |= set(ts['author'])\n", " print \"Calculating the user arrival curve between %s and %s\" % (dt, dt + td) \n", " dt += td\n", " d[count * weeks_number] = len(authors) / total_authors_num\n", " count += 1\n", " ts = subreddit_ts.slice(dt, subreddit_ts.max_time)\n", " authors |= set(ts['author'])\n", " subreddit_age = subreddit_ts.max_time - subreddit_ts.min_time\n", " d[math.ceil( subreddit_age.days/ 7.0)] = len(\n", " authors) / total_authors_num # round the number of weeks up mainly for drawing the graph\n", " return d\n", "d = get_subreddit_users_arrival_curve(subreddit_ts)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nC5+IiMgO/D+Qsjyel9nO5wAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "keys = d.keys()\n", "keys.sort()\n", "values = [d[k] for k in keys]\n", "plt.plot(keys, values)\n", "plt.xlabel('Weeks')\n", "plt.ylabel('Percentage')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Creating the Subreddit Social Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In our study, we constructed the subreddit social networks by creating links between users that replied to other users’ posts. In this section, we will present the code which was used to create the subreddits' underlying social networks. As an example, we will use the [Datasets subreddit's](https://www.reddit.com/r/datasets/) social network." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+---------------------+----------------+---------------------+\n", "| mindate | v_id | maxdate |\n", "+---------------------+----------------+---------------------+\n", "| 2010-04-05 08:18:54 | voltagex | 2015-09-27 04:06:28 |\n", "| 2010-04-05 08:50:31 | qwak | 2010-04-09 08:37:35 |\n", "| 2010-04-05 14:13:55 | brey | 2010-04-05 14:13:55 |\n", "| 2010-04-05 14:44:42 | actionscripted | 2013-12-01 06:50:26 |\n", "| 2010-04-05 15:00:51 | bcain | 2012-11-14 17:57:45 |\n", "| 2010-04-05 15:57:46 | reconbot | 2010-04-05 15:57:46 |\n", "| 2010-04-05 19:26:25 | jc4p | 2010-04-06 01:05:28 |\n", "| 2010-04-05 22:27:12 | Orborde | 2010-04-05 22:27:12 |\n", "| 2010-04-05 23:57:52 | dmwit | 2010-04-05 23:57:52 |\n", "| 2010-04-06 00:11:33 | alphabeat | 2011-09-15 02:22:17 |\n", "+---------------------+----------------+---------------------+\n", "[4047 rows x 3 columns]\n", "\n", "+---------------------+----------+----------+\n", "| datetime | src_id | dst_id |\n", "+---------------------+----------+----------+\n", "| 2010-04-05 15:00:51 | bcain | voltagex |\n", "| 2010-04-05 23:57:52 | dmwit | Orborde |\n", "| 2010-04-06 00:28:06 | voltagex | jc4p |\n", "| 2010-04-06 01:05:28 | jc4p | voltagex |\n", "| 2010-04-06 02:23:23 | voltagex | jc4p |\n", "| 2010-04-07 02:49:08 | voltagex | defrost |\n", "| 2010-04-07 03:44:49 | defrost | voltagex |\n", "| 2010-04-07 06:34:23 | voltagex | defrost |\n", "| 2010-04-08 21:59:55 | voltagex | Orborde |\n", "| 2010-04-09 00:40:58 | deserted | tibbon |\n", "+---------------------+----------+----------+\n", "[4811 rows x 3 columns]\n", "\n" ] } ], "source": [ "def get_subreddit_vertices_timeseries(subreddit_sf):\n", " \"\"\"\n", " Creates a vertices Timeseries object\n", " :return: TimeSeries with the join time of each user to each subreddit\n", " :rtype: gl.TimeSeries\n", " \"\"\"\n", " sf = subreddit_sf.groupby(\"author\", {'mindate': agg.MIN(\"created_utc\"),\n", " 'maxdate': agg.MAX(\"created_utc\")})\n", " sf['mindate'] = sf['mindate'].apply(lambda timestamp: datetime.fromtimestamp(timestamp))\n", " sf['maxdate'] = sf['maxdate'].apply(lambda timestamp: datetime.fromtimestamp(timestamp))\n", " sf.rename({\"author\": \"v_id\"})\n", " return gl.TimeSeries(sf, index='mindate')\n", "\n", "\n", "def get_subreddit_interactions_timeseries(subreddit_sf):\n", " \"\"\"\n", " Creates subreddits interactions TimeSeries. Interaction exists between two subreddit users if user A posted a comment\n", " and user B replied to A's comment\n", " :return: TimeSeries with the subreddit interactions\n", " :rtype: gl.TimeSeries\n", " \"\"\"\n", " subreddit_sf['parent_name'] = subreddit_sf[\"parent_id\"]\n", " subreddit_sf['parent_kind'] = subreddit_sf['parent_id'].apply(lambda i: i.split(\"_\")[0] if \"_\" in i and i.startswith(\"t\") else None)\n", " subreddit_sf['parent_id'] = subreddit_sf['parent_id'].apply(lambda i: i.split(\"_\")[1] if \"_\" in i and i.startswith(\"t\") else None)\n", "\n", " sf = subreddit_sf[subreddit_sf['parent_kind'] == 't1'] # only reply to comments counts\n", " sf = sf['author', \"created_utc\", \"id\", \"parent_id\", \"link_id\"]\n", " sf = sf.join(subreddit_sf, on={\"parent_id\": \"id\"})\n", " sf['datetime'] = sf['created_utc'].apply(lambda timestamp: datetime.fromtimestamp(timestamp))\n", " sf.rename({'author': 'src_id', 'author.1': 'dst_id'})\n", " sf = sf['src_id', 'dst_id', 'datetime']\n", " return gl.TimeSeries(sf, index='datetime')\n", "\n", "def create_sgraph(v_ts, i_ts):\n", " \"\"\"\n", " Creates an SGraph object from the vertices and interaction TimeSeries objects\n", " :param v_ts: vertices TimeSeries\n", " :param i_ts: interactions TimeSeries\n", " :return: SGraph with the input data\n", " \"\"\"\n", " edges = i_ts.to_sframe().groupby(['src_id', \"dst_id\"], operations={'weight': agg.COUNT(),\n", " 'mindate': agg.MIN('datetime'),\n", " 'maxdate': agg.MAX('datetime')})\n", "\n", " g = gl.SGraph(vertices=v_ts.to_sframe(), edges=edges, vid_field=\"v_id\", src_field=\"src_id\", dst_field=\"dst_id\")\n", " return g\n", "\n", "\n", "datasets_sf = sf[sf['subreddit'] =='datasets']\n", "datasets_sf.__materialize__()\n", "datasets_sf[\"created_utc\"] = datasets_sf[\"created_utc\"].astype(int)\n", "vertices = get_subreddit_vertices_timeseries(datasets_sf)\n", "interactions = get_subreddit_interactions_timeseries(datasets_sf)\n", "vertices.print_rows(10)\n", "interactions.print_rows(10)\n", "g = create_sgraph(vertices,interactions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We created an [SGraph object](https://turi.com/products/create/docs/generated/graphlab.SGraph.html) from the SFrame. Let's visualize the constructed social network." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'num_edges': 3935, 'num_vertices': 4047}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.summary()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This non-commercial license of GraphLab Create for academic use is assigned.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "[INFO] graphlab.cython.cy_server: GraphLab Create v1.10.1 started. Logging: /tmp/graphlab_server_1487650195.log\n" ] } ], "source": [ "import os\n", "import logging\n", "import bz2\n", "from datetime import datetime\n", "import graphlab as gl\n", "import graphlab.aggregate as agg\n", "import fnmatch\n", "\n", "#gl.canvas.set_target('ipynb')\n", "gl.set_runtime_config('GRAPHLAB_CACHE_FILE_LOCATIONS', '/data/tmp')\n", "gl.set_runtime_config('GRAPHLAB_DEFAULT_NUM_GRAPH_LAMBDA_WORKERS', 128)\n", "gl.set_runtime_config('GRAPHLAB_DEFAULT_NUM_PYLAMBDA_WORKERS', 128)\n", "\n", "\n", "basedir = \"/data/reddit/raw\" # Replace this with the directory which you downloaded the file into\n", "sframes_dir = \"/data/reddit/sframes/\" # Replace this with the directory you want to save the SFrame to\n", "tmp_dir = \"/data/tmp\" # Replace this with the directory you want to save the SFrame to\n", "join_sframe_path = sframes_dir + os.path.sep + \"join_all.sframe\" # Where to save the join large SFrame object\n", "sf = gl.load_sframe(\"/data/reddit_data_no_txt_without_bots_and_deleted_authors.sframe\")\n", "subreddit_users = gl.load_sframe(\"/data/subreddits_users.sframe\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use GraphLab's [analytics toolkit](https://turi.com/products/create/docs/graphlab.toolkits.graph_analytics.html) to calculate various topological properties, such as the degree distribution and the graph's number of triangles. We hope to elaborate on this in a future tutorial. For now, let's use [Networkx package](https://networkx.github.io/) to draw this subreddit's social network." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import networkx as nx\n", "def sgraph2nxgraph(sgraph):\n", " \"\"\" Converts a directed sgraph object into networkx object\n", " :param sgraph: GraphLab SGraph object\n", " :return: Networkx Directed Graph object\n", " \"\"\"\n", " nx_g = nx.DiGraph()\n", " vertices = list(sgraph.get_vertices()['__id'])\n", " edges = [(e['__src_id'], e['__dst_id']) for e in sgraph.get_edges()]\n", " nx_g.add_nodes_from(vertices)\n", " nx_g.add_edges_from(edges)\n", " return nx_g\n", "nx_g = sgraph2nxgraph(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's draw a subgraph of the subreddit " ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeIAAAFBCAYAAACrYazjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd0FFUbh9/d7GZ3Zza9kASSQOhNehMQhSBNQRBEEBGU\nIiKhioCAAqJ0VFCkifRPRJooRZAiIqACKoIoIh3pHVL3+f7YsGazm9AJ6H3O2XNg5s6dO7Ob+c17\n71sMAKJQKBQKhSJHMOb0ABQKhUKh+C+jhFihUCgUihxECbFCoVAoFDmIEmKFQqFQKHIQJcQKhUKh\nUOQgSogVCoVCochBlBArFAqFQpGDKCFWKBQKhSIHUUKsUCgUCkUOooRYoVAoFIocRAmxQqFQKBQ5\niBJihUKhUChyECXECoVCoVDkIEqIFQqFQqHIQZQQKxQKhUKRgyghVigUCoUiB1FCrFAoFApFDqKE\nWKFQKBSKHEQJsUKhUCgUOYgSYoVCoVAochAlxAqFQqFQ5CBKiBUKhUKhyEGUECsUCoVCkYMoIVYo\nFAqFIgdRQqxQKBQKRQ6ihFihUCgUihxECbFCoVAoFDmIEmKFQqFQKHIQJcQKhUKhUOQgSogVCoVC\nochBlBArFAqFQpGDKCFWKBQKhSIHUUKsUCgUCkUOooRYoVAoFIocRAmxQqFQKBQ5iBJihUKhUChy\nECXECoVCoVDkIEqIFQqFQqHIQZQQKxQKhUKRgyghVigUCoUiB1FCrFAoFApFDqKEWKFQKBSKHEQJ\nsUKhUCgUOYgSYoVCoVAochAlxAqFQqFQ5CBKiBUKhUKhyEGUECsUCoVCkYMoIVYoFAqFIgdRQqxQ\nKBQKRQ5iyukBKBQK7yQlJcmyZcvk1KlTUrt2bYmJicnpISkUijuAsogVinuQP//8U2Jji0rr1u9J\n165rpHDhMjJmzHte2yYmJsqWLVvk4sWLXvc7HA4ZPfod6dmzj5w6depODluhUNwEBoCcHoRCoXCn\nevV6snFjLXE4eqVvOSBWa1n59dctEhcX52oHSNmy1eX3349JWJhZdu/eJhaLxa2vGTNmSKdO70hy\nchF57DGjLFw466bH9ffff0udOk/KqVMnZf786VK5cuWb7kuhUDhRFrFCcRc4ePCgXL582WP7yZMn\n5b333pNvvvnGtS01NVU2blwlDkfnDC1jxGBoJMuXL3c7/vLly/LTT5vk8uXlcvTo33L48GGPc6Sm\npgqYBKySlpYmIiJffPGFfPjhh3LlyhVXu1OnTknlyvESE1NMNm7c6PU6pk+fLjt35pXDh1+Ufv3e\nvu7r37Nnjzz+eAvp3r2PpKSkXPdxCsV/ASXECsU12Ldvn3Ts2FXKlaslL73UXQ4cOHBDx/fp87oU\nLPiAREcXkiNHjrjtq1evmfTuvU7q1Gkiv/76q4iIGI1GsVh0ETnp1tZo/FsCAwPdtum6Ls2bPysi\nJSQl5YoMGfKWtGv3srzySl/56aefRESkdevW0qfPE/LCC3aZPPkd+eKLL+SppzpLjx6fSrt2Ca6+\nZs6cKdu3B8jBg52kV6/BXq+lXLlyYjZ/Jbr+gVSvXtG13eFwSMuW7SQwMFKGDx/jcVzbtgnyxRd5\nZNKkdTJ37tws79WZM2ekc+ce8uqrAyQxMTHLdgrFvwoUCkWW/PXXXwQERGAy9UVkJSZTb4KCojh4\n8OB19xEVVRiRjeh6PJ988kmmfQUR+QBdL8zq1atd29u2fRGRGogcQSQZkQloWhBPPvksmzZtcutj\nzJgxmM2tEfkUozEakYEYDE/g6xtEmzYdcTgcbu0nTpyIzfYIIgOoVq2ea/uaNWuw2cLQ9WL07NmP\nAwcOkDdvcfz9w1m1apWr3c8//8zatWvd+v3pp5/QtGhEtmM0mjzO2bBhC8zmJ9C0/CxevDjLe9W2\n7UuYzU9hsTzCsGEjruPuKhT3P0qIFQogKSmJ5cuXs3TpUi5fvuza3qFDQroI4/qYTN1JSOjltZ/J\nkz8iJCSGxo1bkZKSAsDw4WPw8fElT55CnDhxwq39unXrqFSpNq1btyNXrnxERubnl19+YdGiRYhY\nEPFFxITVGoLFEoLIMPz9w9362LVrFwaDhogVkaqIhCDSDJFaiGg880xrt/Znz56lVav2VK9en507\nd7rt2759OytWrCAtLY1hw4ZhMrVGZBLVqtUHwOFwsHLlSpYuXeomtmfOnCE4ODd2eznKlKnmcV/O\nnj3LW2+9zZw5c7h8+TJPP/08FSrUZPv27W7tOnRIwNe3IVZrVcaMGev1Hi9dupRhw4Zx8uRJr/sV\nivsNJcSKfyV//vknTZu2Jjw8P+XL12TZsmVZtt26dSvBwbnx96+Kv//D+PmFsXbtWgDKlq2JyEo3\nIRb5nAcfrMeff/7J6tWrSU1NdfVlt4cisgZdL8L69etd2y9evEhiYiJz5sxhxYoVHmN47rmOiAxA\npC/t27/M8OHDEZH0jx++vkH4+AQg0pmQkDxux65evRq7vSQiTyLSEpFLGca6C4MhF4sWLQJg5szZ\nmExWwsNjOXDggKuPtLQ0hgwZRrNmz/H7778DsGHDBmy2YDQtN8OGjQZgypSP0LQ4dL0II0aMcRvH\nsWPHWLFiBZcuXQJgy5YttG3biSVLlri1mzJlCjbbw4i8RYUKNd32nT9/nr59BzB06DCSk5M97tO3\n336LpkVhNjejWrW6bvuSk5M5e/ashzWuUNzrKCFW/Os4efIkwcG5MRoHIfIbIvOwWiP58ssvPdo6\nHA7y5CmMyJwM4vUVAQERJCUl0alTN0ymVzIJ8Ys0atQMTQtB14vTqlUHV3/Vq9dD18vj7x/OkSNH\n3M6VkNAbTauIpsWwYMECt32zZs3BZsuFzRbOJ5/M49lnn0XEiEheRFYj8gdGY3fs9lz8+OOPbseO\nHz8eX99nEAlF5HKmsYLIIooXrwxAyZLVEFmExdKCcePGufpYvHgxmlYcg6E3Zco85Nr+119/uVmt\n3bq9go9POwyG7rRq1R6AQ4cO0a3bK0yZ8pFLBNPS0vDzC0VkMFZrkJvof/XVV2haFDbbwzz99PMe\n30mXLq8QEBBJr179PfYtWbIEXS+JyFAKFy4PQGpqKr16vYamBWE26xQqVJY1a9awaNEiFixYwIUL\nFzz6USjuJZQQK/51jBw5Gqu1VSYxmo+uRzJhwgS36eGdO3ei63kRcbi1t9vLsXbtWvbv309QUBQi\nXRD5HJEXEbFRpUoVdL0GIp+RN29JV3+XL19m8eLFdOzYBX//XPj66jRs2IIjR47w6KNNEOmPr28j\nRozwXP/csWMHv/76KwBlypRBRENkW6Zp8cqMGjXK7bj58+djtRZDpLkXEQaRFAwGH1JSUhg+fAwW\nSzB2e6jbtLRTHPPh4/McVau6W5oZOXToEJUrx1OmzEP8+eefAFSuXBsfn3ZoWpzL2k9LS8NuD0Fk\niIcQA6xatYqpU6dy5coVt+1HjhzBbPZDZAcmk5XTp0+77U9LS6N37wHExz/Btm3bABg8+G00rRoi\n+xFJQ+QTRDTs9ur4+T2KroewevVqtm/fzvLly0lLS8vy+hSKnEAJseJfR61aDRAZk0mM9iCiIyKY\nTCYaNGjAzJkz2bFjBzZbLkRSMrR1YDLlpWLFh8mVK45JkyZRr14jRPwRMSMi+Pj4UKhQKQICwvns\nM3frtkOHBGy2Ooj8jsgJjMZe5M//ADt27KB8+UeoX78ZZ8+ezXL8qampmEym9Gnp5EzX0QmzWWfl\nypWu9leuXMFq9UekdhZCfBqTyeoSoH379nHmzBmP886YMZNXX32No0ePum3/4YcfKFq0IvHxT3gd\nd9myNTAYuqPrRVm6dKlr++bNm3nuuY4sWuR0zjp//jz79+/3OP7MmTMsW7aM06dPk5SURO7cBbDb\nKxIbW9S1zu5tmvoqYWF5Edme6ZpbIvJu+r9Xo+uhWK2h6HpxunZ9Ncu+FIqcQAmx4l9FUlISNlsA\nIlUQSc3wYB6abmFeXXe1ISIYjXaCg6MxGF5BJDFdkIchomO1VkDkM3LnLkJqair58+d3HR8SEoXV\nWhRNi2D58uWu81+6dAmLxR+RY27CbjQWom/fvi5hWbZsGd269XJZwBlZsGBB+viiEJmZoZ+LiMQi\nMhG7PZSLFy+6jpk/f376MX94CLHBMJTGjZ+56XtatWpdREZgtT7Ge++957H/zz//pFWr9owYMSbL\n9dm//vqLwMAILJYgBg5807U9JSWF2Nii2O0VyZ27IElJSZw+fZply5Zx9uxZrly5QrlyD2EwGHjl\nlQFe+7ZYAnB6l2e87h6IvOz6v9VaErO5GiLjqFgx/qbvhUJxJ1BCrLjvcDgczJ49mwkTJpCUlOS2\n76effsJuL4zTY7h6ulX0AiL2DCIsOL2RT+P0TJZ0a9mWLtb2dJHW0fUyNG7cCoAJEyZQo0YNihcv\nTrFilRAZjtnczG2a+dixY1gsQR5T3SKPIiLExcUxdOhQbLYQRHoRFhbjNv7ExER0PRSRzxDZjEgY\nzunwN9NFuC4ioOsNmTRpstux/foNwMcnD84p9FRETmMwvIW/fy6XA5Y3du/ezVdffeXmdJaRTp26\no+vlsNki3CzxzJw5c4aEhF707z/I43uZPn06mvYYIqvJl6+Ua/upU6cwmWyI7MBs9vOwxjds2ICu\nF0VkLxaL3et5w8LyI9Irw70+hkg4Ik+5XoR0PY4HHqhETEwxNmzY4Dp27969FC5cjtjY4vz888+u\n7e+++z7FilXhgw8mZnm9CsXtQgmx4r7jo48+QtOKYbVWJyHhFbd9TiEMROQkIrMR6YTI21gsuUhI\nSKBIkSLpwqvhDPPJaCV7fjp06OASlavW3ueff07hwoWJiytFlSq13dacHQ4HefOWSBfSq8JwAGdo\nUca+/RAZ6RGKNHfuXEymqhmOPYzI2+kW3quIxKdvn0jz5p6OTvPnz6dw4fIYjSZMJgsNG7Zg9+7d\nWd7LrVu3upzO2rXr4rVNSkoK8+fP59tvv832e3nuuRcxm5thtVb3CD06evQoUVH5MZksjBs3wW1f\nr179CQiIpEsX9+8SnGFPkZH5sdkiXS9EmSlYsBwi+RGphEgrnE5rTRFpgkgiRuPrFClSDofDwf79\n+xkyZIgrZrt7994YjZ0RGchTT7UB4MSJE5jNdkSWYjZr2S4jKBS3AyXEivuOoUPfwtf3cYzGzjRt\n2tpjf8OGT6dbxDtwrtM+SY0a/8TBbtu2je7duxMeHp6NCOsuy7ho0aIMGTKEPXv2AE6HoWLFirkl\nuQDYuHEjvXq9ytSpU7HbQ7FaW2AwdEoXXZ9M/RsQ0fD392fIkCEup6QBAwbiDGPytta7D5E86f8e\nzzPPtPd6f44fP07FijXJn7+0h4d1ZqZNm4amPYrITIoUqXTD30VGnMk4mmC1VmXs2Hc89qelpbnF\naF8vFy9eZOfOnVk6WfXpMyDda/wjRDoisgWRyoj4YDTaqFKltstZrECBUvj4PI/NFsru3buZN+9T\nNC0STYtl/HjnC8Lly5cJDIzAan2K4OAoD+teobjdKCFW5DgLFiykU6euXtdLvXH+/HlatHiBevWa\neXjjpqSkMGHChHThc043+/uHuUJY9uzZQ5kyD1G5cjwHDhxg3bp1dOzYkeDg4ExCWROnw5ef2/ZK\nlSrx7rvv8s477/Doo4+6znv27FlstkBEeqPrwRw8eJAPPviA4cOHs2zZMtq3b4/ZbM5S+P38/Hj1\n1VcZNmwYBsMTWQjxV4iURwT8/B5m7ty5Xu/PsGHDMJubI/I2tWo9ke29PHfuHFWq1CY8PF+2sdbX\nw9mzZ+nZsw+DB7+VrXNVZpKTk6+ZnCM1NZWuXV+levX6fP/99x7nLViwVPr3XQ2RQEQ0oqKi2Lt3\nr1vbkJBoRN5F06IZMWIEr7zSh/79+3u8VP35559MmDCBYcNGUr9+c1dcOcCnn35KmTI1iI4uTufO\n3Tl16tR1X6tC4Q0lxIoc5bfffsNmC0OkNxERcR77P//8cxo1esbNGxfgzTdH8OCDdT3WLFu16oDN\nVoyrzlgiQoUKFTLsb4/B0AMfn3Z06/bPVGhSUhKff/45LVq0wGKxpAtwIf5ZQ3b/GI1GLBYLgwYN\n4ty5c5w8eTLdSet9LBa7myPVVQ4ePEi3bt2w2Wxe+xSR9HNbEPk1kwinpFv54xGZR2hodJaW2pdf\nfonNFoGuF6Nv39dv5Ou465w4cYLIyPyYTBr9+w/Ost3ixYvR9VKIjKBQoXIe+3/88Ud8fSMQWYPB\nYGLp0qWsW7fOo90333xDzZqNXA5iIkPQ9YZERRXwWJ/+448/0n+b49D1IBwOBxMnTkHT8iOyEJEf\nMZvbU7Bg6Rt68VAoMqOEWJGj/Prrr+nhQ4MJC4vhxx9/pEuXnjz99AuMGjUaX18/RN7DYvHj3Llz\nwNV1zTyITPVYY82fvwwicxGp4BK3OnXquPaPGDEGXS+CpsUxZcpHXsd04cIFBg8eTN68ebOZunYX\nzyeffJJJkybRoMHTfPHFF9le8/Hjx3nttdcICAjIpl8/nGvDPyCyIN3Sq46vbzsCAiLYunVrtufY\nvHkzX3755T0fM7tgwQLs9hqIfE94uOeL2FU2bdqEpkXg6/sENWo08NjvcDioUKE6VmsYH3442UsP\n/zBt2jRsthpk9Ko3mbrSoYP7GvnBgwex2YIxGLoSGhqNw+FID5XanOEFyYGf34OuzGUKxc2ghFiR\n48yYMYsWLZ6nSZOn0bQ8GI2vIzIRTXsi3Trsg6YFuqzMv/76C00LwWxuRVxcSbe+liz5HH//SK7G\nDIsI8fHxLkcrh8PB0qVLs/X+vUpaWholS5akXbt2VK9ePYNImj0sZU3TXKkdr5ezZ8/y9ttvExYW\nloUY2xDxx8cnFKs1gDx5itK//xseltv9zPHjx4mMjMNs1unXb1C2bVeuXMmYMWM8knwAfPfdd4SH\nh3P48OFrnrNx41aITM404/ADsbElPdp+/fXX9O37Grt27SI1NRXn2n6q27G+vl0YNWoUPXv2Iza2\nJJMmTb3+G6BQoIRYcZfZv38/X331FWvXrqVv3/58/PF0HA4HM2fORNdLI3I20wPyLazWQDZs2EBS\nUhJLly7l448/Ztq0aYwYMYJDhw55nOP1119PF7HqiHTFZMrDM8+0yzYH8blz55gyZQqbN292275q\n1Sry589PUlIS+/fvp0CBMukP8c5uomk2m6lduzbTpk27YS/bS5cu8d5775EnT55sLe/69etf03P5\nfiQpKYnjx4/f9PEXLlygQIECzJ8//5ptHQ4HJUqUJmOMsfMz260SVUbGjZuAxeJHZGTB9Be8+RmO\nu4Ku52f27NnYbBGIfI2Pj9kjFEzlv1ZkhxJixV3h+PHjxMc3wmoNISCgJkZjOCK5sVpzs2zZMooX\nr4zIkkwPR+fHz696+lRuBP7+1bHbW6FpMZQt+5BXC6hIkbKI9MvQx0V0vYiHQ05GatRogM1WB5st\n1C2eFKBevXq8++67AHz88QwslkCs1kDatGlDTEwMIsKMGTP45JNPaNSoEf7+/jz55JN89tlnHikc\nsyMpKYkHHnjgmlPhNWrU4Jtvvrnufv/tdOzYkdatPb3nvTFu3LgMsw0TEfkbkc+x2aKYP38+58+f\n9zgmKCg3IhsRKZzh2G6IjMNmK0OVKg8zffp0/PxC0bQ6xMWVcAnvyZMnKViwNGazlY8/nnFbr1vx\n70EJseKOk5KSQuHCZTGbe/FPZaBURKYiojNp0iQ0LRiR416F2GhshdkchMiGDNtTMZlep2DB0h7r\noL6+AThjdzP28wa9emWd2jA6uigik9H1Uh5rvD///DPh4eGutJCHDx92efk6HA4ee+wx3njjDVf7\n06dPM3nyZB555BGCgoJo27ZttgkzMhIbG3tNIb4q/AqnM19sbKzHLMTkyR+RN+8D9Or1mps1+u23\n3xIUFJR+H+0YDDYKFy7PK6/0xtfXD10P5ocffnDrq0yZqohEkjEW3Gbz5+GH6xIQEImfXxX8/Opi\ntQbSrVt3Nw/wGTNmoGl1EVlBXFzpO3szFPctSogVd4QTJ07w8ccfM2vWLGbPno3dXgnPbFPg49OJ\nHj16ExtbApH1XoVYJAaDYZiX7Q7s9rIeVZV0PQKRdZnEvAVRUfkZNmyEVyv166+/5oEHqtGuXRev\ngvn888/z6qvehXznzp3kypXLa4zsoUOHGD16NOXKlSMiIoKuXbuyefNmr1OV586dcxNbo9HIZ599\nRuXKlT22t2nTJttsWf8FnOvLkW6hReBc2/fx8UVkFTZbhFtxix07dhAUFESJEiXw8/Nz7YuPb5K+\n5NCVAQMGutrPmTPH4yXI39+fbdu2Ubx4JQyGCRl+Z9+jaUEup0Jwel77+YVhs+Wme/e+d/iOKO5X\nlBArbjsLFy7CZgvCbm+G3d4Ik8kPkZeyENlvMBpDaNPmeWy22rgXXwCnh6ofIru8HHsRke706dPP\n7fwlSz6AMx3k9+ltPkAkGJG52GyPUa1anRteszt06BDBwcFeixYAlCtXjujo4uTLV4qePft4XSf+\n7bffeP311ylQoAD58+dnwIAB7Nq1y7X/u+++c3vgFylSBHBa3WvWrCE+Ph4RYcSIEbz++uuEhobS\nvHlztzKF/2ZSUlKYM2cOzZq1oUuXntSqVYtXXvHMxuVwOIiLK4Gm1cXPL8wV53v69GkKFCjA9OnT\nSUxMdLN8FyxYiK+vHbs9xHU/ly5dmqH4xlVL2MY333zD0aNHMZkCyOy45e9fh4ULFwLO1KEjR45k\n/fr1/Pzzz26/ud9++41vv/1WrR0rACXEitvMpUuX0PWQdBG8+oD6HJFcOEvUZRbTVYiUxmoNpmLF\nh9H1Koj8L906fhWnc4wfzjW6f6alnbmFAxAJRtdzuVnFTgvSmH6sDyIP8k91nhTs9sJu+Yavl9de\ne83rWuT48ROwWq/Glm7C1/dZSpasnGXokMPh4Pvvv6d79+5ERkZSpkwZRo0axYgRI9we+k2bNvU4\ndvPmzS6L/vz584wYMYKIiAgee+wxNm7ceMPXdL/gcDioX78pul4ZkQ8xGvtgMNhdZRczc+LECWbO\nnOkq1ZiamkrdunXp2rVrlue4cOGC22zJF198kR7X7fw+fHx8GDZsGJcuXWLZsmU4Pecvuv2e/fwq\ns2LFCpKSkggIyIXZ/Dx2e6hbTeT169djs4Wi63EMGDDEYxyrVq2iT59+bi9pin83SogVt5VVq1bh\n718Vd7F1pAvxT16EuCUiw/HxeYk33hjE7NmzqVatPkWKVE6PIZZ0UW2a4ZjhOD2i/07vezWaFurK\novRPPumrxR3cp8Q17XkmTZp0w9d27tw5cuXK5aqDC06BcDrzbHe7Xj+/sm5VmbIiNTWV1atX88IL\nL7g99EXEbd05O65cucIHH3xAbGwsjzzyCF999dW/ztJau3Ytul4YkaQM93k+RYtWvK7j+/TpwyOP\nPHJDiTd27txJUFAQmubMRx4UlBu7vSRFi5bH4XAQGhqLyHPpYpyKwfA+uXLlJTk5mQsXLmA2a4j8\nD19ff44dO+bqd+TIkZjNLRCZwIMPutd+3r9/vyt2OSws5l/3PSq8o4RYkS2JiYkMHjyU/v3fuK44\n2R9++AFdL5BJ/K6kW6e1cOZLBpEzOD2bC+CsgtSdBx4oRVJSEitXrqR8+UcwGHzSLVoNp6NMe5zF\n3wvjzCfsvtY8eLCzvJ57DmkddyevRDQtr0eaxOtl/Pjx1K5d2/X/y5cvp69Huou91dqB8ePH31Df\nDz/8sJsQly9fnv/973/XHZ+cnJzM9OnTKVKkCBUrVmTRokX3fEKP68UpXt0yvcSlYDAYrilW//vf\n/8ibN69bcY5rsW/fPqKjo5kxYwZbt25l2LBhWCzBiOzBaDQxdOhQ8uTJQ0REfkSsmM0BlChR2c2K\nnTVrDhUr1vaIKz569CjFi1ciLCzWY337999/T8/m9S66HqyE+D+CEmJFtgwePBSr9WEslrr06NHn\nmu3/+usv/PyiMBh6p1sKpxF5Nl1MfTEYbPj4hOMMAXkaZ3WhvYj44yywUAybLQpndqzE9OOHYTBo\nmEwaBoMlva/dbg9lg6E/r7zSF4fD4ZHTWdMiMRhGIzILTavK4483v+n7kZycTJ48eShb9iEKFapA\nly49iYkphsgXGcZzGU2LvWGxz1yEYtiwYTz66KMEBATQqlUrvvzyy+uy6NLS0pg/fz5ly5alRIkS\nzJ4921UH+X5l4cKF2O0PZnrh+ZbIyALZHrd9+3ZCQ0PdZjGukpqaysaNGz0SpPz9998ULFjQFbIG\nzpmPZ5/tgM0WSMWKD1GkSBEOHDiQZR9ZkZKSQvv2CVSsGO8Rs36VKVOm8dhjT3tN0an4d6KEWJEt\nAwYMwmKpi69vY15+uadre1JSEqNGjWbMmLFuOY9r1myIwfACRmMURqMvzixU7rmVixYtSqVKtbBa\nc2MwlE+3do38E6P5Pe6WD4i8S7VqdfH39ycgIByzuS3/rDkfxWyOYPPmzVy4cMHtXFarle+++44W\nLV7g0Uef5KOPProlUVqxYgW+vqE4PWy/xWx+ibCwPGhaGD4+ryHyPrpelmbNri+u9SrJyckkJCQQ\nHR2N3W7HYrG4vLf//vtv3nvvPSpXrkxYWBgvvfQSGzZsuKa163A4WL58OdWrVycuLo6JEyeSmJh4\n09eekyQnJ1OoUBl8fZ/H6cA3D03Ly7Rp07M85sSJE+TNm5f//e9/Xve3bNkOXS+An18Y+/btA5w1\nlUuVKuVaFrh8+TInT57E4XCQmprKiy++SLly5W46Aclnn32GrpdDZIzXnNmK/yZKiBXZcunSJXr0\n6MPLL/d0C8vo338QVutDWK3VGDRoKAsXLqRixVqYzcGIPI7ZnJ8ZM2Zw/Phx6tWr5xJGg8HAvHnz\nAPjll1+YMmUK+fLlyyCeRbyIsNND2mzW+P3339F1HZstFE0riJ9fIyyWQPz9Q5g6dSoHDhxwE+LI\nyMjbej9KlaqGe2Yl0PXHGTx4cHqO7Of59NNPb3pKOD4+nmXLlnlN4wjOqkBvvvkmRYsWJTY2lj59\n+ngkIPH0dIDaAAAgAElEQVTG+vXrqVu3Lrlz52bMmDFei1Lc65w+fZpu3XqTL18pKlWqzeLFi932\nX7x4kRkzZjBixAg2b95MzZo1sww5A8iVKz8iq9H1B1m4cCGXLl2iatWqJCQkkJiYSLt2XbBY/PH1\n9adQobLUrl2bGjVquP0dZMbhcHD06NEsX/Y2bdqEzZYLq7Ue8fH/VMa6ePEizZu3pVq1evz222+u\n7StWrGDgwNf566+/rvMuKe5HlBArboqEhF6YzU3x9W1MhQrV0x1p/ofIL4g8j69vMapVq0NycjKp\nqal069YNk8nEW2+9RVhYGB9++CFlyz6En18YU6ZMpWrVqvj5+WE218hCiB1YLIGcOHGCv/76C6vV\nSsmSJZk3bx4HDx5k9+7dREZGMnz4cDchLl68+G29bj+/8PTp9Ixje4vu3T3DaG6GXLlycfDgwWu2\nczgcbN++nd69exMdHU2JEiV46623rvnA/vHHH2natClhYWFudZDvd/bs2UNYWAx2+2OYzV0xmXIR\nHV0g2yQqU6ZMQ9MCqVixJqdPn6ZevXo8++yzpKWlkZDwCjZbA5xJZtIQmY3JZL/mFHSbNp0wm+3k\nz18yy5edNWvW8MEHH7gJ+rvvvovFUgeRftSq1Qi4WpksFKOxg0dOdcW/CyXEimty4cIFZs2a5WZ5\nnTlzhrZtX+LJJ5/BYgnBMytWCrpenWnTprmOufqmv2PHDsLCwjCbH0JkEXFxpbly5Qpr167FYgnE\nM980iKwnKqqQy3ll165d+Pr6ujlObd++ncDAQDchrlat2m29F9Wq1UNkUoZxpWG3V8ty+vNGOH78\nOAEBATfsoJOWlsb69et58cUXCQkJ4cEHH2T8+PFunrqZ2blzJ8899xzBwcG8+uqr/P3337c6/Byl\ndu0nMBozJn05g80Wk+U6bEZSU1Np3rw5DRs2JDk5GYfDkV5ber/bb9Budy5tZIevr47IAXS96A2F\nyC1YsABNy4fN9hAvvPAy4HR8dFYZG01oaMx196W4/1BCrLgm1arVRdMeQdNCPLI59es3MD11pTcr\ndgHly9f02ue3336L0ajj45OHtm1fcm1v2bIdNlsT/kmFCSIH0bRiTJ7s7n26bds2zGYzjRo5LQiH\nw8GLL77oJsQNGza8rffi+++/R9dDMZn6IjITTatLmTLVbks92jVr1lC1atVb6uNqYYyWLVvi7+9P\n3bp1mTlzptccyuB0rnvppZcICgri5ZdfzjJhyb2OUwBPuf3+jMZevPnmm9ked/U388gjj7hiiNPS\n0jAaTYhccOvPau3g5sB1lY0bNzJp0iTOnTtHu3ZdMJlsFCxY2s0iTktLo0WLFwgOzsOYMeO8jmXJ\nkiVMnjzZbR1/7Nhx1KvXzBUjfvjw4RvKX664P1BCrHCRmJjIiBEjGTVqtJsDlrMG6//Q9RIe5QNf\neKEzIu9mIcQ/IBJI8+ZtvVp5f/zxB/Xr16dUqVIcOHAAcMbENm3aGqs1BJvtKQyGmphMdgYNestr\nHxs3bsTHx4datWoRE1MMi6UAIo8hUgYRK2XKVLztISB79uyhS5de1K/fnPff/8BrasubYdy4cXTs\n2PG29AXOmYzZs2fToEED/P39ad68OYsXL3b7bq9y9OhRevfuTXBwMG3btnVbp7wfCA/Ph8jWTGv3\nzZg4cWK2x/Xr14/y5ct7vKjUrt0YH59BGfrbh9Uawp49e9zabd++HU0Lw2ary8MPPwY4ncQyT4k7\na2jHIrIFk8lyU9fYo0c/fH39yZUr7y1Vq1LceyghVrh47bU3sFiqY7FU4403/rEkliz5nPz5y9C6\n9YseD5gpU6ZgtzfMQoiHItIMiyXEleEoMw6Hg5EjRxIVFcV3333n2r53714+/vhjPvjgA0qWLMkL\nL7yQpdU5atQoROw4Q4gyhrf8jsVSil69+pGWlsayZcvo168/3bu/wrhx424orvRu0LFjR8aN824t\n3SonTpxgwoQJVK9eneDgYNq3b8+aNWs8nMpOnTrFoEGDCAsL46mnnvIa9nMvMmLEGDStHCI/I3IJ\ng2EcgYGR2ZakHDlyJEWKFPH6Ozhw4AAxMUXw86uE3d4UqzWIsWM9v5vPP/8cXS+FyARiY7P2Rzh1\n6hRBQZHY7RUoV+6ha17PxIlTaNr0OX788UfXttDQvIj8iN1enUWLFl2zD8X9gxJiBXC1cEFBnAk0\nbJQtW/W6plsvXrxIYGAkIp9mEuEdGAwBWK15iY4ufM3ptCVLlhAaGsrs2bM99l24cIEGDRoQHx/v\n8WB1OBzkz18akUVZvAwcx2TyJzQ0Bru9DCKvI/I2NlsrLJYAnnmm3T3jQVy1alWPBA93gv379zN8\n+HBKlSpF7ty56dmzJz/++KPbzMGFCxcYNWoUkZGR90UdZIfDwbBhowgOzoPRaKJq1Tr8+uuvWbaf\nMmUKsbGx2TrGpaSksHz5cmbOnOm13CY415fbt0+gdOmHrhn3e+TIEb788str/t62bduGpkUh8iYR\nEXGu7QMHvonJZCU6urArf7bi34ESYgWXLl0iJCQPBsM4nCkED2C1xtOtW9ahHxnZunUrISF58PN7\nBJH+aFpzbLZAPvpoGhs2bMhyfTIzP//8M3nz5qV///4ellpKSgqdO3emePHirphPcHoB63p+vOex\nvvp5AWdWrszVn05itbamVKkHb9v08s3icDgICAi461b6jh07eO2118iXLx+FCxdm0KBBbn4AV65c\nYcKECeTNm5caNWqwcuXK+z7b0/z584mMjGT37t05cv4DBw5QtuxDFCtWyesYfv31V2y2cAyGrsTE\nFHXbd/bsWa5cuULNmo/j4+PLa68Nvub5kpKSWLt27X3vkPdvRgmxgrlz5+LnVy+TSO3HZNKzFYZT\np07x2GNPU7NmQ/bs2cO8efMYNGgQEydO9AiL+fvvv6/rQXDs2DEefPBBnnzySQ/LweFwMHbsWKKi\nolxZqxYsWIC/f1ZT41c/ExDpkMU+B1Zrc7p1630Td+72cfDgQSIiInLs/A6Hg++++44uXboQHh5O\nhQoVGDt2LEeOHAGcL0IzZ86kWLFilC9fngULFtyX6TNXrlxJWFhYjk65d+v2CkZjRwyG3rRs+YLX\nNosXL6Z791e8lrrcsmULmpYfkT+ua7350Ucbo+vFCQiIUGJ8j6KEWMH777+PzfZ8JoG6goiRoKAg\nxo8f7zVBQb9+AzCZmmM0ds7ygQLw5ZdfYrUGYrUG8sUXX1xzPImJibRu3ZqyZcty8OBBHA4H27Zt\nY8WKFZw9e5aFCxcSGhrKokWLWLduHX5+Za8hxP0Q6ZPN/j3Y7aE5ahV/+eWXxMfH35a+9uzZQ5s2\nLxIaGktoaCxt23bycDLKjpSUFFasWMFzzz1HYGAgtWrVYurUqZw5c4a0tDQWLFhAuXLlKFasGDNn\nzrxv0mdu3LiR0NBQvvnmmxwdx4wZM9G0GHS9IKNHe3php6amZvuSc/bsWXLlyoumxREf3+ia57Pb\nQxH5Dl0vfleWPhQ3jhJiBXv27MFmC0XkYAZxGo2zYIIzDCgkJIqiRSu7VRSaOHESmlYUTatAv35v\nZNl/mzYvIvImIm/y3HMvXteYnGt+w4iMjKRw4XLoel78/R/GZgtk2rTpbNmyhaioKMaMGUNISAze\n02KSPtUehffKT/98/P1ruerI5gQjRoygW7dut9zP6tWr8fUNTH/5+A2R3/Dx6Y+fX/hN1S2+fPky\nn376KY0bN8bf35/GjRszf/58Ll26xIoVK6hRowb58uXjww8/vKfDan7++WfCw8PdymXmJOvWrfNa\nJWvdunXYbAEEBGT/fZ09e5YlS5bQsGELEhJecXnCb9myhccff5oiRSrRuXN3jh49ynvvfYDdHsqj\njzb26jGvyHmUEP8HmTPnf5QoUZUhQ4a7tg0bNhqTyQ9nucJYnPmfJcMnFyIfExj4T8pIh8PBvHnz\nmD59erZW0caNG9G0QDQt8IadfqpWrZ2+xnt1DXgnNlsIe/fu5a+//qJYsWI88kg8mlaQfyo7ZbTq\nmyPy5DUsZtC0dtcMdbmTtG7dmilTptxSH87Y7EBEpni5ximUKnVryU3OnDnD1KlTqVWrFoGBgbRp\n04aVK1eydu1a6tevT1RUFKNGjXKrvXsv8Oeff5I7d27mzp2b00O5Jk2aPIvIGET60K1br2zbxsc/\ngdHYFZutGpMmTWLDhg1oWhgi4xD5BrM5gYiIOM6cOXOXRq+4WZQQ/8dITU3FbLYisgirNcxtDcpq\nDUBkBb6+MbRv3x5d/8ciFrHh4/M4RYqUv6nzJicn31TSC4vFjrPu8D+i4uvbkdGjRwNOcYiPj6do\n0RJYLAFo2jOIjMJgSMBZ0akR7slBvH/8/Joxa9asm7q220HZsmXZtGnTTR+fmJiIn18YIqGIpHi5\nxmSs1jA3R7db4fDhw4wdO5YKFSqQK1cuEhISmDFjBs2aNSMsLIxBgwZlmT7T4XCwfv16WrVqz0MP\nPU6TJs+yaNGiOzLFffjwYeLi4pgwYcJt7/tOMHfuJ1itQdhsQaxatSrbts2aPYevb0M0rTAzZ84k\nLq4UItPcvnebrTnvvOM5/a24t1BC/B/D4XAQFVUAq/UpdD2EkydPuvaVKVMdXa+B3R7KkSNHOHLk\nCG3atKFAgQIsXrzYVf1n0qRJ2ebwvZ3oejCZUw3abG147733XG2Sk5N5/vnnKVmyJIMHD6FChaoE\nB0ciUoqsk41k/JzDag1yOSbdbVJTU9E07bq9y73xySefoGkV0q85q+n3B9i6dettHLmT33//nUGD\nBlGoUCHi4uLo1KkTjRs3Jjg4mN69e7vlZz569CgPPFAFXS+MwTAKkYWITMDPrzIREXHXVcDiejl1\n6pQrB/e9zqZNmxgwYCC//PILBw4c8PpbPHPmDKNGjWLp0qUAnDt3jv79B9CkSRNCQkJwxtL/nul7\nH0fbtp3u9uUobhAlxP8hzp07x549ezh48CDvv/++R5zluXPn+OSTTzwce656LzscDjZs2EDVqlUp\nVaoUa9asueNjfvHFblitTXHWNgaRNWhasEfyfYfDwdChQ4mJiaFly5ZER5dEZBQiBa5pERuNb9Og\nwVOkpKS4HJLuJr///jv58uW7pT7efvttjMauiAQicsTLdR7Gag28JbG/Fg6Hgx9++IEePXoQFRVF\nsWLFePDBBwkICKBz587s2LGDvHmLYzINxDOUDERmERAQedOVhubMmUPp0g+RN+8DJCT0pEKFCvTq\n1eueD7c6deoUmhaEwdAVf//wLGcGatVqhK/vE2habj799FN69OiRadZKR2RshvvpQNfr8uabb/Ld\nd9/dtyUw/wsoIf6PcODAAQIDI7BaQ+nV6zWP/ampqUyfPp25c+d6fXDNmfM/IiLyYzSaiYgoQNeu\n3YiNjaVJkyZZZs26HVy+fJnGjZ/BYglE1+MICYl2cxjzHOccLBYLhQqVTl9ra4RIbTLnDc748Dca\ndZo0aYHVGoDZ7EdgYCQDBw6+Lfmjr4cFCxbw+OOP31Ifs2bNwm6vj0hXRBrjdFK7eo2JGAx1efHF\nW3cGu15SU1P5+uuvadeuHYGBgURHR2M2++Lj0yALEXZ+fHwG8OyzHW74fKNHv4umFUVkCSKbMRia\nERwcfddmbm6FI0eOYLEEIDIJi8WepWCWLPkgIkPQ9bIUK1YMdx8OQcSEiC8i3RGZg9XaAKs1HJst\nAn//0vj7h/P555/f5atTXA9KiP8jzJ07F12vjcg35MlT1GP/wIFD0LTyaFoJxo//wG3f2rVr0bTc\niHyT/hBdj80WyapVqxgyZAjBwcH06dPnjlpbx44dY+fOnde1jli5cmV0XcdoDEUkApH8iATgDGHa\nhNODeg4+PuUJCYlGxIbTIexQuiDswGarS/36Te+KNTVo0CD69u17S31cunQpPUxlFSJNEcmT/kDu\nhkgoxYtXyDGLKDExkUWLnD4JIuuvsUxw9IYt99TUVPz9cyHyq5s1aLc/wNdff30Hr+z2MWPGLOLj\nm7imnb3x008/8cgjDXnppe688MILmUTYjshLmEzhNGz4JHXqNKNkyUr4+LTjH5+B77DZglQs8T2I\nEuL/CCdPniQ2tig+Pmbeffd9j/2tW3fEaOyIydSC3r37ue1r2LAFzqQY7mtPhQuX5ezZsxw6dIhn\nn32WyMhIpk6dSs+e/Shb9mGPAhF3iypVqtC8eUtEHkIkMX28G3F6fhdBJA6jMZiRI0cyZsxYrNaG\nXqy0RHS9wA2VsrtZmjVr5jW1542yYsUKNC0UX9/uiLyPSBPM5giqVYvP8Vjf5ORkDAYfss+AdnUt\nu8QNhVqdO3cOk0nz+A41rS2TJ0++g1d1dzl16hSDBw8mPDycJ554gri4OESEiIgIgoJiEOmN2Zyb\nefPmkZaWhslkJXNFKk17hokTJ5KWlkbfvq9Tp86T/PTTTzl9af95lBD/R/j0088IDIyiSpXaXsNL\nDh06RO3ajXn88afdHLgAKleug2cu5wWI+FOjRg1Xu02bNlGsWDGMxtyIfERISPSdviyvFC5cmLi4\n0oh8nWnM4/HxyUXevCVcHsqlS9dA5EuvgmAwvMlLL9356dyiRYvetofhvn376NmzD5UqPUr9+k+x\nePHieyIDVmpqaroQe/PozuzBXoRffvkly36++OILxo4dy7vvvsv69etJS0sjd+7CiKzI0M9FNC33\nTcVO32scPHiQHj16EBQURNu2bdm5cyfgzM8+ceJEFi9ejNUagI9PcXx8amCzhTB16jR8fCyInMwk\nxC2ZOHFierGKEogMpkiRCjl8hQolxP9STpw4wS+//OKaWo2NLYHIQnT9Ia9F7Pfu3csnn3zitVrN\n2LHvoGl1MzxEUxB5EBGhX79+btO3u3fvTk8oUY/AwDzs37+fNWvWUKJEFXx8fMmX7wHmz//szl04\nEBYWRvHiVRBZmklYh1O/fhO38RYpUil9yt2bKLx33QlIbpbExESsVut/wpGmePHKiCy+hhDvRsTG\niy++yMaNG13flcPhYMyY9wgJicHPrzK+vglYLJ2x24sSG1ucvn37oWlh+Pj0R2Qcuv4ArVq1z+Er\nvjV27drF888/T1BQEN27d3eVCs1ISkoKwcF5EFmb4R7+isFgIzg4NybTC4gkp2//FpstiGPHjqXH\nHEdhMjWnatU6OXB1iowoIf4X8scff+DnF4bNFkWPHs5p5latOqDrxdD1EHbt2uXW/vjx4/j5haHr\nj1CiRCWP/hITE6levS66XjT9DzsaEY38+fNTvHhxKlWq5JYlaPPmzYwePZpevXrh7++P2RyIszrT\nZUS+QtNyXzNG8mZxOByYTCYmTpyIrpdB5HD6Q+gXNC23q8D6Vbp1642vbw+vomC3P3zHk0D89NNP\nFC3quWb/b2TGjBnoetVsrWKDoTUiZkQETdOIjo6md+/eNG7cAk0ri8iPmY5xILIKTYuld+9+JCT0\nomXLdixcuPCemAm4GbZs2UKTJk1c8di///47S5Ys8VpxaceOHdjtBT3uo64/yMKFC6levS4WSzh2\n+wP4++dyW4NevHgxQ4cOVbWN7wGUEP8LmTFjRroFu4K4uNLAP16s3kJD/ilavhpfX81rnw6Hg3Xr\n1jF+/HiWL1/OkCFDWL16NWlpacyZM4eCBQvy8MMPe6yptmzZBoNhYKYHxTRq1bp2jtyb4fz582ia\nhsPh4NVXB2KzBWK3x+HnF86kSVM92u/fvx+7PQyRzzKsMabg4zOU6OjCdzwl4OzZs3nqqafu6Dlu\nlAsXLrBjxw727dvHpUuXblu/ycnJVKv2KFZrc0TOZPpNXMFk6ktMjLM+cJs2bfDx8UFECAwMxGDI\nj8i5bCzpfWhaJFu2bLlt472bOBwOVq5cSc2aNYmOjubdd9/l4sWLJCUlERmZH7u9GrlzF/Tw5D96\n9CgWSxD/hPeBSCq6Huta7tizZ4/rbzc7ZzBFzqGE+F/IyZMnKVCgFCaThY8+mp5lu9OnT/PVV1+x\na9cuOnToSp48RZkyZdpNnTMlJYWpU6cSGxtLvXr1+OGHHwCIj2+MM83k44h0RmQXIusoWrTyTZ3n\nWuzfv588efK4/n/hwgV2796d7dTvpk2byJOnMHZ7Mfz9G6NpeShb9iGvU4G3m759+zJ48LVL2d0N\nHA4HHTq8jI+PPyIWRPwxGKzYbLnIk6cw/foN5NixY7d0jsuXL9Oy5QtYLIFYrW0ReROzuQtWaxjV\nq9fz6L979+6I+OEMS8p+bdloHEnTpq1vaXx3m9TUVObNm0fZss6QpOnTp7uJ7bFjxzCb7Yhsw2TS\nPPw3wOlMabU+hTPxzd/4+naifPmH3dq0bNkOm60WmhbjJsa7du0iIaEnS5YsuXMXqbgmSoj/ZZw9\ne9ZlxTgcDvbt28fChQs9HLTeeWc8VmsgAQE1sNkiqVWr4W2xfhITExk/fjxRUVE0atSI4OBonLG8\nCxB5A5FQzOb6vPpq/1s+lze2bdtGyZIlb/g4h8PBt99+y/z587N0FLoTPP744yxYsOCunS87Bg0a\njDMMZhAix9MF7jQiIxEJxmxuSFhYLPv377/lcx09epR33nmH3r37MmzYMK/l/gB+++239NC51Ayi\newyR1jhD0qIQGZC+DnoSX197jteWvh4SExOZNGkSBQoUoEqVKixZsiTLqfRevfoTEhJDnz6ve91/\n6dIlOnRIQNOCMBqtREUV9nD+q1atHiIDsdkeccupnjt3QUR6YLOF8ttvv92261PcGEqI/0V8+ul8\nfH3t6How27Zt4++//8bfPxy7vSrlytVwtdu6dSs2WwQie9MfbMmYTE3o2LHLbRvLpUuXaNasGSLV\ncQ8r+RCbLeKOJaL/+uuv3Ty573Xy5s2bpQjdTRwOB76+oWTOVfzPZwkieTEaB1GvXtO7Nq7Vq1cT\nEPBwhnGkIVIWZ3z00fQZlkcRSUi3ip1haVnlub5b/PHHH7Ro8TxxcWVo2LCFy3v73LlzjBgxgsjI\nSOrXr8/69etdvhVjxrxHfHxj1q9ff1PnfOedd7Ba4zEaE3jsseZu+3799VeqVavHM8+0d3tRCQ2N\nQWQoNlvEXX0BVbijhPhfRK1ajRGZgsGQwMCBr7N582Z0PT8ia7Ba/V3tevfuh9HYL9ODdgciOs88\n8wwbNmy4LYksOnZMwJndKuN5/iI4+M6FNc2fP58nnnjijvV/Ozl//jw2m+2eyP703XffYTDkJvs4\n3/KIzMPX18+rd/2d4Ntvv8Xfv0KGMaxDpGSml7vjOAt8XMBk8qNBgwb4+/vTsGFD5syZ40rRerc4\ncOAAAQERGI1DEPkeg2EsmhZCu3btCAkJoWXLlh5hVdu2bUu3/McRFBR1U+edNWsWmlYUi6U2bdu+\ndM32f/zxB7Nnz6ZZs+f46KOPb+qcituDSRT3NYmJiXL+/HkJDw+Xjh1byjfftBWz2VeeeGKVlCpV\nSho3riVffdVOhgwZ6zrGbDaJ0XhFHI6MPSWLiMjs2fNl9uz5UqxYfnn55ZelVatW4ufnd1NjK126\nmOj6l3LpUvcMW9dKkSLFbqq/6+HMmTMSHBx8x/q/nezcuVOKFi0qPj4+OT0U2bp1q/j41JHUVGM2\nrR4Vkd1iNgfJmTNnJCAg4I6Pq1SpUpKaukdEDohIjIgcFZH8ImLI0CpURHxFZLmEhUXK559/Lhcu\nXJBFixbJzJkzpVOnTlK3bl1p0aKF1K1bVywWyx0d89ix78vlyy3F4egvIiJQXi5fTpQ1a+bIli1b\nJC4uzuMYPz8/gUQxGn8Sf//Amzpvy5YtRUTkxIkT0qFDh2zbrlq1Sho2fFpELDJs2GvStu1zN3VO\nxW0ip98EFDfP4cOHCQ2Nxmy2M3jwMMBZoeVaFsCuXbuw2cIQ2ZpuUZxLn0I2IRKPM1exLyJCmzZt\nbnp8Fy5cICamCL6+7RBZicEwBk0Lu6PZqoYPH07Pnj3vWP+3kylTptC69b3hXDR58mQ07dlrOER1\nRaQ3uh5yV+OeO3TogsnUM30MR3AWtjiYYVyfI1IEk+lR/P39adCggdtv7MSJE3z44YfUqFGDoKAg\n2rRpw4oVK+5YtrH4+CaIzMt079ZTrFiVbI/7+uuveeONQTdd9OIqJ0+eZOrUqezYsSPLNgMGDMRo\n7IjIWOrUcS41nD9/nu3bt98TMzT/NZQQ38fMnj0bXa+LyHqio4tn2W7v3r1ERxfG3z+ctWvXAs4i\nDn5+4djthTGZ/ND1MESMiJRBpBpXYzn79OlzS05cJ0+epHfv1yhd+mGaNm19R8rwZaRPnz4MHTr0\njp7jdtGtWzdGjhyZ08MAnBm5rNZg3MNgMn6SEcmNxVKDHj363NWxHTp0iODg3BgMH6WPZSzOdKVd\nEWmDSCg+Ps9QqFAZTp48yYQJE8iXLx/Vq1dn2bJlbssshw4dYsyYMVSsWJHw8HBeeuklV3au28WQ\nIW9htbZyu38mUy86dky4befIjuLFK2Kz1UfXQzh06JDXNnv37iUmpihBQVFs2LCBs2fPEhERh6bF\n3FUfAIUTJcT3MUePHiU8PBazWePtt0dl2e6NNwZhNHZAZDzx8Y1d2xMTE/npp584fvw4aWlpLF26\nlOLFS6YLspA3b17q1atHSEgI3bp1uy+8Kjt06HDfFIGPj49n2bJlOT0MFw0aPIXF0tHLOrEDkV4Y\njcHUq/fkHY+t9sbOnTvJlSsfdnsdnNm51uIs4tEKTStDsWIV3IoZpKSkMHv2bEqUKEGZMmX45JNP\nPCy9PXv2MHToUEqWLEmePHno2bMnP/zwwy37R5w+fZqYmCLYbE8jMgOLpT0hIdF3JRwOQNOCEFmA\npuXl+++/v65jNm3ahK4XRGQvJpP1Do9QkRklxPcxu3btYvr06ezbt89t+8WLF9m+fbtr6m3NmjXY\nbMHYbJG88874a/Z74MABBgwYwKxZswDn23OfPn0IDw+nZs2afPrpp3etROCN0qxZM68pPO9FIiIi\nOKi1inAAACAASURBVHjwYE4Pw8XZs2cpXboqdntVROYisg2RBZjN1QkKypNt+cm7weXLl5k+fTol\nS1bFzy8cf/8Iqlaty+LFi7OcTk1LS2PJkiVUqVKFggULMnnyZK/T6jt27OC1114jf/78FCxYkAED\nBnjU674Rzpw5w/DhI2nYsCUDBw6+5fjrG2HevPkUKlSBrl1fdXupSEtLY8OGDV5fCJKSkqhWrQ4G\ngzHLMCnFnUMJ8X3K/v370fUQNK2mW/D+pUuXiI4ujKbFUKNGfdf2vXv38vPPP9/SORMTE5kzZw7V\nq1cnMjKSAQMG3FNCAlCrVq0cq/p0I5w4cYKAgIB7rmh9cnIyn3zyCQ8+WJfY2JJUrBjPjBkzuHLl\nSk4P7ZZwOBysXbuWOnXqkDt3bkaPHu21+InD4WDLli306NGD3Llz88ADD/DWW2/d0Zrbt8off/zB\nyy/3oFy5WtSr1yzLmOTnn++MrhdC10M8ZrcOHTrE2LFjvVrQ69atY/r06ff9b+BeRgnxfco333yD\nrhdCZCH+/rlc23/++WdstjyI/I3BYLhjjhe//PILnTt3JigoiEaNGrF8+fJrrrOlpKSwaNEiunTp\nQceOCXz44cTbXsO4bNmy1z0dl5OsWbOGqlWr5vQw/pP8+OOPNGvWjLCwMN544w2vOZzBaUGuW7eO\nTp06ERYWRqVKlXjnnXc4fPjwXR6xJ4cPHyYhoReBgdGI+GEwlEVkEiJT0PUHeOKJlh5/+7GxJRFZ\ngq4/4pFDPTa2KL6+LdC0YA4dOsTOnTt59tkOhIbGYTAEYTLF0ajR/9k77/iazj+Of+7IHefe7Egi\nMRJbghB7b7VrK0KtWtVSo6r8aO2irVEjdm1qtGLVqBGpoEGsiC1IiAiJ7Nx7P78/EiELkXEvzvv1\nOi+vnGd9n+ue+z3P83xHj4Kc4keFqIjfU/R6PQcMGE5XVw9u3bot7X5ycjKbNm1PiUTCr74am67N\n77+v42ef9U8LP5kXPH/+nN7e3qxcuTJLlizJ2bNn8/Hjx5nqHThwgHZ2xWhuXpvALAK/UKPpTLXa\nmtOnz86zlaGLi4tJr15esHDhQg4ePNjYYnzUXL16NS270ahRo7I1bCJTdgr279/Pzz//nFZWVmzc\nOCVCVVYhJ/ObW7du0cbGmWZmIwhcIHCNwAwCdql+1vHUaGpz5cr0sdU3bdpCCwt7VqvWKO0F2GAw\nMCAggAqFOYH1VKsLc9WqVRQEO8pkU1L7/5eAF+VyK4aFhRX4fD8GREX8nqDT6Th58jT27j0o3Xbw\n06dP2aZNN9as2YzBwcFp9zOuTi9fvky12oHAVNrZ5X1ADYPBwJMnT7JPnz60tLSkl5cX/fz8aDAY\neOjQIQqCPYHDWVjj3qEgVOL//pc38ZYtLS2NHlXpbRg8eDAXLlxobDFEmJLvd+TIkbS2tubAgQPf\nGOksPj6eO3bsYLdu3WhhYcHWrVtz7dq1eb67kx0tW3amVDo9i2dpF4GyqcZ1e+ju/np3KT8/PxYr\n5kattjQFwYMSiQ3Llq3CQoVcCOzL1L9MNpo9ew4okDl+bIiK+D0hJWqOJ6XSoWzSpH3a/VmzZtHM\nrCOBMWzatH22K8vg4OBU3+GxdHQska+yRkREcO7cuSxVqhQrVapEa+siBPa8xj81jCqVda7Pm3U6\nHWUy2XuR/q5u3bo8cuSIscUQeYXHjx9z0qRJtLOzY/fu3Xnu3Lk3tomOjuaGDRvYtm1bWlhYsHPn\nzty2bVu+xbuOjo6mQqFl1pmoDKmK+DSBO7S2LpJtP1evXk11WdzBl1HKntPMrB2l0tJMH7nsZYxv\npVJrsoaa7zOvC6MjYkKkRANKgFQaBZXqZWQgFxcXkCcALMLRo0dQtGh5HDp0KFP7MmXKYNOm5fjy\ny2QcPuyTr7La2tpi9OjRCA4OhpeXF6KjlQBavaaFI8ge+Omnn7F582Zs374dUVFROR732bNnsLCw\ngFRq2l9rkrh06RIqVKhgbFFEXsHOzg4//vgjbt26hWrVqqFNmzZo3bo1fH19s21jbm6Onj17wsfH\nB7dv30bLli2xZMkSODk5oU+fPti7dy+Sk5PzTMbo6GjIZFoAFlmUSpASfSwSQABcXUtl28/06b8g\nIWE4gI54GaVMi+Tk3jAYiiN95LIX2IOUIDY2NldzEMkCY78JiLwdBoOBixcv5Zgx49Odwc6aNZdK\nZc3USEMGAnupUFjS39/fiNK+ZNasWZTLx7xmNfzi2k2JxJbm5p1obt6KKpUVp037KUdnx9euXWPJ\nkiXzcTZ5w7179+jo6GhsMUTeQHx8PL29vVmyZEnWq1ePe/bseevvY1hYGBcsWMDatWvTzs6OgwYN\n4pEjR3JtPJmcnExLS0cCl7N4hp4TsCZwhRpNpde68Tk4lCRwJYs+rhKwJZCYRdlZ2toWfS92nN43\nREX8HpCUlMRLly5l6f/o7FyOwKkMD8xAAhKWLVuWw4YN47Zt27K1DM1vZsyYQZns27dQxHsJNH3l\n77sUBDcuW7bircc6deoUq1Wrlo+zyRv27dvHZs2aGVsMkbckOTmZmzZtYqVKlejh4cFNmzblSKHe\nvn2bs2bNYuXKlenk5MSRI0fS39//nQ0UJ0+eRkFoxPRR0HQE+hOoSkEozkGDvk7r/9GjR1y6dGm6\n1IhOTmX5MsRtxqsMpdIxr2xP/0VgEFUqT86YMfudZBZ5PaIiNnEMBgOrV29EtdqJ5cpVzXQ+Y23t\nTOB6hgfpe76IjvXqZW/vxL179xao/Pv27aO5uWc2Z06vXt8QGJfhnh8LFy711m/g+/btY4sWLfJ5\nRrln9uzZHDlypLHFEMkhBoOBu3fvZt26dVmyZEl6e3vnOOZ2UFAQJ0+ezDJlytDV1ZXjx4/nhQsX\ncqSUdTode/UaSLXagWZmX1EqHUszs2K0sirO3r2/4KlTp9LVL1OmClWqDulCXn7zzTgqFF9l8RzG\nUqVyYIkSFWluXiX1ubQgMJlmZhZMTk5mUlISz507lyf5y0VSEBWxifPs2TNKpWYEnlKhsOKtW7fY\nq9cXLFTIlYsXL2O/fkNpZjbkFUUXnrq1hAyXFYEBLFu2aoHKr9fraW/vypSQhNkp4chUmW9muG+g\nSmXHoKAgTpkynY0afcovvxzFW7duZTnWxo0b2b179yzLTIk+ffpwxYq3X+mLmB7Hjx9nq1at6OTk\nxLlz5+bYYtpgMPDs2bP89ttvWaxYMbq5uXHq1Km8fv36W/cRFBTEWbNmccqUKfz333+zVeaCYEXg\nDwpC0bRY76GhobS1LUqpdBpfGn4FURCasWvXPtTr9dy3bx8HDRpCudyCwFRaWNhTr9ezZs0mFITi\ndHV1F4N85BGiIn4P6NlzIAGwdeuuqTmGSxA4TqVSyydPntDdvQa12opUqztTLrekk5MLZTJZBkXs\nQGASJRJzNm/enLNmzeKZM2cKJNPKn3/+SbW6MIGALJTwYwKVCYzOoiyeMpnAIkXKUqXqTWAb5fLv\naG5uzytXrmQa57fffuPQoUPzfT65xdPT02TO8EVyx7lz59i9e3fa2dlx0qRJ7+RXrNfr6efnx+HD\nh9PBwYFVq1bl3Llz8yw29fbtO+juXofjxk1KU9bx8fHcunUrmzZtR4XCnILgRHNze06Y8EOmrFTb\nt+9gnz6Defr0acbHx1MikRIIp0pl/0ZXL5G3Q1TE7wkvHo7w8HBaWjpQq63NqlUb8siRI/z77795\n5MgRrl+/Pi2FWlRUFHfv3s1vvvmGFStWJCBjyZIVeeLEidToVl/Rzc2N1tbW7NixIxcuXMgrV67k\nW8jFrVv/oEZjS622NVMiAK2hSvUFlUorKpU2BE5moYiX08zMghJJ23T3JZKf2KmTV6Yxpk6dyu+/\n/z5f5M8rdDodBUF4Z5/T06dP08vrC9au3ZL9+w9Ld+4nYjyuXbvGgQMH0tramiNHjnxnV7zk5GQe\nPHiQAwYMoI2NDevXr89FixYxPDw8Xb1Hjx7lKo1j9eqNqNGUp6NjCT548IAhISFv7ZY0aNAISiRS\ntmrVRTTcyiNERWzCHDt2jGPGjMv0YxsSEsK//vqLS5Z4UxBcqNGU5q+/LnhtX48ePcoyclBoaCg3\nbNjA/v37s3jx4nRycqKXlxdXr16d59liYmNjuWrVKnbt2pcdOnhx6tQZDAsL46ZNm6lWOzElh2sS\nU6w/F1KjKcQmTdoTWJFBQQdmmfbxm2++4dy52WehMgWuXbtGV1fXd2r7ww/TKQjOlEimERhFoDZl\nMkuOGjX2zY1FCoT79+9z1KhRtLa25oABA9IF2ckpCQkJ3LVrF3v06EFLS0u2aNGCq1ev5tOnT9mx\nY0cWKlSIw4YNo6+vb44UYnJyMiUSCYGbVKud0vIWP3z4kNu3b0+3qjcYDJw27Sd26dInXXxqU4uR\n/r4jKmITJTw8nGq1FYGxNDe347NnzzJ9+b/+ejSl0iGUSEbTy+uLXI9pMBh448YNent7s3v37ixU\nqBBLlSrFwYMHc+vWrVmGrszI8+fPefny5SwD6r+O/fv3s3Ll+pRK5ZTJzNi8eUeeP3+eM2b8RJWq\nTwZFvICtW3fN1Mfnn3/OVatW5WjcgmbHjh1s165djtudPHmSglCEKeEGXQl8QmABgUkE7Nimjbg6\nMSUiIiI4efJk2tnZsWvXrrnOwx0TE8PNmzezQ4cONDc3p1Sa3hizaNGiHDNmzFuncfzuu8lUKrXs\n2LEX9Xo94+LiWKhQMWq1jVikSJm0I6vdu3dToylP4DtWqpQ+NrpOp+ORI0cyZX8TyTmiIjZR7t+/\nT6XSikAvAhrK5WoWLlya27fvSKsTEhJCT8+GrFixTo6MPN4WvV7PwMBA/vLLL2zTpg0tLCxYuXJl\njh49mnv27MmkbKdPn0212prm5mWpVltxypRZOR4zMTEx3ZZbREQE7e1dUuPqHqFUOpuCYMeAgIBM\nbdu3b8+dO3fmfKIFyJQpUzh+/Pgct+vRoz8lkp8IVCKwKMOLSQzl8uqcP18MmWlqPH/+nD///DOd\nnZ35ySef8NixY7leTS5evDgLY8yX14s0jlnZUWTHvXv3qFBYEjhNmUyZdnTyzz//UBCKUybry1q1\nmqdr07PnQGo0btRobMWz4lwiKmITZuzYbymTvTByMhA4QrncJi1PcEZepHDbtGlTviQ+SEpKop+f\nH6dOncpGjRpRq9Wybt26nDRpEmfMmEFBKEPgDl/4AWs0ZfNEMYaGhvKrr0azYsV67Natb7bpHOvV\nq8djx47lerz8pGvXrtywYUOO21Wv3ozAXALlmbUrmC+dncvmg8QieUFCQgKXL1/OUqVKsU6dOvTx\n8XlnhTxv3jxaWlq+Vhm/uCpVqsSZM2dm62nwKmPGTKSDQ0lOnfpTuvsbNmzgd99NYGhoaLr7RYqU\nZ0o2p3r8448/3mkuIimIitiEadCgLYF1GX5wZ7JOnSacOPFH9us3NO3hiI2NZd26LajRlKS5eReq\nVHYcPnx0vp7lxMbG8sCBAxw3bhwtLJwIrM4g6+9s1qxjvo2fEXd391znXM5vypcv/04GVr17D6JE\n0pEpQRuycgHTUSKRiGd3Jo5Op+PmzZvp4eHBihUrcsOGDe9kdJWQkMA///yTn332GQVBeCulXKtW\nLc6bNy+TQn0dt2/fzjYY0KZNW2hlVZh1637CmJiYHM9B5CWiIjZhKlasR+BgJuUml2splVamRNKf\nFSvWpq+vL0eMGE2lsgtTIuyQwFNqNOUKLIBHo0btCWzMIOsW1q/fpkDGJ8nChQu/NpWdsUlISKBK\npcpxEAiS/O+//6hQWBOok40ivkIrq8L5ILVIfmAwGLh3717Wr1+fJUqU4JIlS97ZJzcmJoabNm1i\n+/btaWZm9hZKWcWiRUty0aJFr3W3mjNnHpVKG2o0tmkGXa9y/vx5zpw5k0FBQe8kt8hLREVsgly5\ncoWTJ//AQYOGUqXq8IpyTSDgwY4dO1KhcKdU2pnFipVnzZo1KZFYEvDP8OP8C/v0KZict2vXrqVG\nU40vgwNEUxCqc/Xq1QUyPkmqVCqTjvYTGBjI8uXLv3P7WbPmEhCYOZ2kgUplD44da9quWyJZc+LE\nCbZp04aFCxfm7Nmzc5VOMTIykitXrmTz5s0zGXSlXGoCPQjUJADK5XK2adOG69atyzRu5coNCWyn\nUtmL8+fPT1cWFRVFjcaGcvkgWlraixmZcomoiE0MnU5HKytHSiTDqVZbs2rV+tRq3ahU9qdSWZTl\nynkyMTGR8+cv5LhxE9K2jdzcahPYn+4HWiqdzOHDRxWI3Hq9nv37f0mVyoaWli2oUtmyb9+hBWbJ\nGxcXR6VSadJbsxs2bGC3bt1y1cfy5cspl1sS+JYpFtS7KAgtWbFirRxbqouYFufPn+dnn31GOzs7\nTpw48a28FF7Hw4cP+dtvv7Fu3brpVsNASwLumZS0SqVily5duHHjRs6bN4+VKtWiRKKgrW0R3r17\nN1PfCoUFgfU0MxPErelcIipiEyMpKYkKhYbACqpU1gwJCeHRo0e5dOlSnjp1KltFs3z5CgpC5VeM\npf6lINgXeMCHO3fucO/evWmBRQqKBw8emHxGo/Hjx3PKlCm57ufatWscPPhrlilTnZ6ejbl0qXe+\n5b8VKXiuX7/OQYMG0dramiNGjMgTf/67d+9yzpw59PDwYEoceslrtq4FAg0IrKdUOp5qtS1PnjyZ\nqc8VK1azTp1W3LJla67l+9gRFbEJsmfPHjZp0oGrVq3Jtk5ISAhr1mzGGjWa8M6dOzQYDPzyy5Gp\nW0/2BARu3LixAKU2LhcvXqSbm5uxxXgt7dq1444dO95cUUSEKS+Xo0ePprW1Nfv165cuoEZuCA4O\n5o8//shy5cplo4grENCns0upUaNppn4WL15GW9ti7Natb4GEyv2QERWxCREaGspVq1a9lavB0KEj\nKJUOoVQ6jN269abBYGBcXBydnUtRrS7BypXrmvQ2bV5z/Phx1q1b980VjYiLi4vobymSY548ecIf\nf/yRhQoVYufOnfnff//lSb8Gg4Hnz5/nd999RxcXl1cU8ZQMNgiPKQjWmdqr1ZYEfKnRlMpyxSzy\n9kghYhLo9Xp4etbF8OF/oUqV2oiJiQEAkMTMmXPRvHkn+Pv7p9UvVcoVEsleGAw+2LlzN4oVK4/z\n588jKOgsDh9ej5MnD0EikRhrOgVOZGQkbGxsCnRMkggPD8fTp0/fWPf58+d49OgRSpQoUQCSiXxI\n2NjYYNKkSbh9+zbq1auHDh064JNPPsHRo0dBEnfu3MGUKVMQGRmZo371ej0WLVqFAwf8sW7dOpw8\neRLNmzeHRHIgQ00/uLqWBQA8efIER48eRUJCAjw8qkOjGQW5/Ln4vc4tRn4REEklNjaWcrmSwEEq\nlVZp50J+fn4UBFcCP9PRsWRa/R49+lMub0RgCIEmBNxpZmbJc+fOGWsKRmX16tXs06dPgY3n7b2c\nTk6lqFBYUaEwZ9Wqjejn55dtfX9/f3p6ehaYfCIfLomJiVy5ciXLlCnDWrVqsXXr1gRArVbLMWPG\nvLWf8K5du6jRVCbwG11dK5FMMXp0cXGnmVl/AscJrKAgOHLv3r2MiopKDYNZkdWrN2JsbCx3796d\nluDi2bNnPHLkiGg0+A6IitiEWLTImyVLeqYLDXnp0iWq1YUok33O8uWrk0wx6JLL1QSqE2hB4E8C\nvgTGUKm04pEjR4w0A+Px888/c+TIkfk+TnBwMEuX9ky1PnVOPY//H4HfKQh22SrjFStWFOiLgsiH\nj06n47Jly1ITOLw841UoFBw0aBBv3Ljx2vYBAQFUqwtRrW7Fxo1fxj+PiIjg6NHfsVy5mmzRohOP\nHz9Okrxw4QIFoSiBIEqlsnQeEQkJCSxatCy12kosU6aKGPc8h4iK2ERITk7m+fPns3QDOHDgAKdO\nnZoWrCIhIYGAMtUfMGO4w4O0sirMxMTEgp6CUZk4cSJ//PHHfB0jJCSElpaFCcwmEJv6eQcTaMqU\niFdrWa1a4yzbjhw5krNnz85X+UQ+PiZOnJit9bNUKuVnn332Ws8JX19fLl26lFFRUW8cS6/Xs3Pn\n3tRobPjDDzPSlb2MVX2DMpmCz549y/XcPiZERWwiNGzYmoJQjMWKlXuroBRyuQWBoAxK+MVVgWq1\nmtWqVaOXlxenTZvGP//8swBmYTyGDRvGhQvzN+nBkCEjKJONzuLzjiHgQCCQZmZaPn36NFPbZs2a\ncd++ffkqn8jHR1RUFH/66Sc6ODi8xh0JbNOmDU+cOPFOYxw7dowjR47JMtHKCwwGA/v3/5KCYM0R\nI8a963Q+WkRFbALodLrU7aWHVKuL8OLFi6+tbzAYUv0A9dko4q6ZHkRTd+3JLT169Mg2GUZeUaiQ\nC4HL2XzmwwnMolJplSmJO0k6Ojq+c7J4EZE3ERcXx8WLF2ewfs581a9fn/v27cvSoyI5OZm+vr58\n+PBh2r2IiIjUdKzfUau1zTKC1qNHj9i+fQ927Oj12pCZItkjWk2bADKZDMOHj4FEUhhVqpTHlClz\nMWXKTBgMhizrSyQSODmVBuCfRSmzvP/gwQP06NEDP/74IzZv3ozz588jLi4uT+dhTArCalqv1wNQ\nZlOqBBCMwoWLwM7OLl1JREQE4uPj4ezsnK/yiXy8qNVqDB06FNevX8f69etRoUKFLOv5+vqiVatW\nqFq1KrZu3Zr6nU6hS5fP0bLlQJQt64HQ0FAAgE6ng8FAAI7Q6ZKy/E2aNGk69uxRwMdHj+nTZ+fL\n/D50REVsIixYMBs6nQ46nQHbttnip582Y+fOndDpdFnWHzNmGARhHICMynQRJJLM7jSdOnVCmzZt\nkJycjG3btsHLywu2trZwcXFBy5YtMWLECCxZsgRHjhxBWFgYSOZI/nPnzmHs2PH49tvvceHChRy1\nzQuePn2a74q4RYtmkEq3ZlGiA/AHlMq/MWvW/zK5jV26dAkVKlT4qNzJRIyDXC5Hr169EBgYiL/+\n+gu1atXKst65c+fQvXt3lC9fHitWrEBiYiKOHTuK2NgV0OudcOnSJQCAg4MDNmxYhQ4d/sPu3Tuh\nVGZ+EXV2doRCcQUKxVU4OTnm6/w+VCTM6S+uSL7SuHE7nDhhDTMzP2g0iXj69DGWLl2KgQP7paun\n1+vRq9dA+PgcRUJCPxgMdtBqd0MQguDr+ze0Wi2uXr2Kq1evIjg4GO3atUOzZs0y9XHnzp20ei/q\nXr16FYmJiShbtizKlSuX7ipZsmSmh3HxYm+MGfMDEhMHQCIhFIqVWLhwJgYMSC9zflK6dGns2bMH\nZcqUybcxrly5gurVGyIubhmADgAkAJ4BGAyZ7AAWLZqDwYMHZmr322+/4dKlS1i6dGm+ySYikhUk\ncezYMcycORMHDmT0D36Js7Mzatasg/37D6Nq1Zo4cGAHVCpVlnXXrFmLc+cuYPTor1GsWDHodDqs\nXbsWMpkMXl5ekMlk+TWdDxZREZsY4eHh+PXXBXj8+CE2bnyI+PgRKFlyHG7cOJupLkmcOXMG69Zt\nwbNnMWjWrA66desGtVqdazmePHmSppRf/Hv16lXcvXsXRYsWTVPMxYsXx5gxE5CYGACgVGrrKxCE\n+ggPD4FGo8m1LG+DnZ0drl69mmlbOK/x8/NDr16D8eRJAqRSZ8THn0edOnWxffs62NraZtlmyJAh\nqFChAoYPH56vsomIvI6AgADMmjUL27dvz3bHy8bGBl26dEFkZDwiI5+jc+cWGDCgf9rL9/Hjx9Gq\nVR8kJLSCh8dlnD17HADw11+7MGeON7y8OmDIkC8KbE4fDMY7nhYhU1wC/P390xlIkOSNGzdobl6I\nKlUhfv99/rrl5ITExEQGBQVx586dnDlzJlu2bEmZrEIm4yULi8o8ffp0gcik1+spk8neKcH6u2Aw\nGHju3DkePnw40/9bVtStW/ej9O0WMU2CgoLYr18/yuXybIy6zAn8RGAzBaEZGzRolWbcdejQIWo0\npSiRjKW7ey2SKUZeCoVAYC1VKhveuXPHmNN7LxEVsZHx8hpEjaYkLSzsM32Bnz59yh9+mMo6dVpx\n507TdD+6ffs2VSo7AvHp3HlUKhs+ePAgX8c2GAw8ePAgu3fvS7ncikuWLDW5qD4Gg4GWlpa5Tmkn\nIpLXhISEcMSIEVSr1a8oYS2Bfa88y8nUaivw8OHDJFO+z/PmLaSX1xdpcdP1ej1tbZ0pkw2iIFiL\n3/V3QFTERsbBoSSBf6jR1OHOnTvTld25c4cqlQ2BdVQoBJNNvt2uXXeqVO0JnCXwH9XqVuza9fN8\nHTMpKYktWnSgVutO4GcCq6nRdKCdXdE8y1KTF9y7d8/k0zOKfNyEh4dz4sSJtLS0TFXG6d0iFYqR\nnDt37mv7uH79OmfMmMEzZ84UkNQfFqLVtJGZOvV7qFQdUL68IpMxlUajgVQKyOXHYW5ubbJGEFu3\nrsHIkR4oXLg7nJx6YsyYWli/flm+jjljxmz4+iYiJuYsgFEA+iI2diciIsajYsW6qFixHqZOnYHw\n8PB8leNNvLCYFhExVQoVKoSpU6ciJCQElpbOAI6/UmqAQnEc7u7uAIC4uDhMmjQF06fPQlJSUlot\nlUqFbdv2o0+fYQgKCirYCXwAiMZaJoS/vz/++ecffPbZZ2nZTAICArBnzx50794dZcuWNbKEpgFJ\n2NoWxdOnewFUylBqAFAGwNdQqS5ALv8Lu3dvQ8OGDQteUABz5sxBaGgofv31V6OMLyKSE7Zu3YZ+\n/UYiLu4HAEWhUi2Dm9tjnDlzFFKpFCNHjsPSpRchkcTgf/9rg++/HwcAGDt2PH755QkMBjt06xaG\nLVtWG3Ue7xviithECAsLQ9OmbTBp0m3UqdM0zarx2LF/MWXKDDRp0uaNq7vo6Oh0b6kfKomJiYiK\nCkdmJQykfKVrALBBQsIKxMRsRtu2XfHo0aOCFTIVcUUs8j4QERGBZcuWoVy5Mti9ex1atvwbu14x\ndQAAIABJREFUlSvPxIQJ1XD8+D5IpSmqIjExCQaDAFJAcnJyWntPTw+oVPshCNtQvbqHsabx3iI3\ntgAiKcTExMBgkEGvr4OoqC1p9+fPXwa9/gCiombh4MGD6NWrV5btvb1X4KuvRsDc3AoBAX5wcXEp\nIMkLHqVSCUGwREzMdQClM5QSwGUArgB+AdAMOl0HeHuvwKRJEwpMxuDgYBw4cAD//PMP2rdvX2Dj\nioi8Cw0btsHt246QSL7H1avnsG/fH1nWmzXrB0ilP0KlUmLs2FFp93v0+AwWFuaQSqVo2bJlQYn9\n4WDcI2oRg8HAhIQEkuSCBYvZoEHbdMkBJk6cSqXSitbWhdNyFGeFu3sdAj5Uqbpz8eLF+S63sfnm\nm3GUybpmEW97W6r7RRsCXxIoTKA3y5evVSByJSYmslMnL6rV9lSpviDQiyqVHXv1Glhg7lUiIjlF\nq7UjsIWC4JKt2+GRI0c4e/ZshoWFZSqbOvUnmplpWKhQsSzLRV6PqIiNyLNnz1i6tAelUjmnT5+T\nqfzcuXPcs2cP79y5k2V6xFeZN+83KhTmtLCwf2Me0g+BmJgYqtUOBOoR2ERgP4GhqUp4xCuKOYKA\nA52dyxaIXEOGjKRa3Y5A3CsyPKcgNOPYsRMLRIYPGb1ez4MHD3LhwoVcunSpSVnIv8/s3Pkn3dxq\nc8yYCVkmhLh8+TLVajuamfVgxYq1M5UXKeJGwJcazSfcuHFjQYj8QSEqYiOya9cuarV1CJylrW2x\ndGXHjx+nWl2IGk1Ffvnl6Lfq79GjR2+VQvFDoXr1ZgS+ImBHoA6BSQTkBJ5nWCV/SQ+P6vkuT1RU\nFFUqKwJhWWRnukmNxpZxcXH5Lsf7TFxcHM+fP8+zZ88yKiqKiYmJ9PPz4+HDh7lkiTcdHUtSo/Gg\nVDqAwGcELOnsXI6XL182tugfNMePH6dGU5LAQjo4lMhULq6Ic4d4RmxEatSoAaUyBDrdJ+jSJf3Z\n74ULF0DWRGxsS5w+vfOt+rO3t88PMU2WPn064PLlw4iLGwbgCoAfAKwAEALA7ZWawfj001b5Lk9Q\nUBAUipJISMgq8H0JSKV2uHXrVporiMhLHj9+jClTZmH16t8hlTpCIpEjLu4mADOoVIWh0+mRkBAJ\nYCeAOkiJ8w0AiXjwYCmqVKmDwEB/lCtXzmhz+FDR6/WoUaMGRo3qi6NH92PGjN8z1fnyyy/w7FkE\nSpRwhYODgxGkfM8x9pvAx87z5895/fr1TNtBT58+Zb16LVm8uDuPHTvGtm27U6HQcPz4H0im5DDe\nvn07P/mkC2vV+oTfffc/3r9/3xhTMBrPnz9n8eLlCQwjUINANwIjCdQmEJS6PfwrVSobRkdH57s8\nQUFBFIQiWZxbk0ASVSo7MSdxFqQEPSlBM7OhBG698pmFEZhAwDH1yOFaFp/ri2s+HR3LZLmtKvLu\nXLlyhZaWDlQoNPTx8cm2XocOvWhm1pWC4MbNmzcXoIQfBqIiNjIGg4GzZv3Mpk070NfXN8s6gYGB\nFISiBG5SIpEyPj6ejRq1pkZTncAqAnuoVA6nVluIx48fL+AZGJdHjx7R3NyBZmZayuW2BNSUSCwJ\nCASkLF3ak1euXCkQWQwGA0uXrkLgjywUxWpWqdKgQOR4X9DpdJw6dSZlMpvUY4XslOxqAoWyecF5\ncSUSsObw4d8Ye1r5jsFg4IkTJzhp0mQuXryYkZGR+TbWjz/+SKn0SwIr2bjxp9nWa968I6XSYVSr\na3LVqlX5Js+HiqiIjczp06cpCMUIzKedXbEs60RHR9PR0ZUaTVnWrt2MM2b8RLW6JYHkDD9G+2lj\n42yyoTDzC0dHRwYHB/PGjRt8+vQp7969y7CwMOr1+gKXxc/Pj4JgR4lkDoEHBO5RKp1BrbYQ//vv\nvwKXx5Tp1u1zqlTVU1e8Sa9RsgYCHgT2vqYOCQykQqFlfHy8saf2Wh48eMBZs2Zz2LCRXLJkKaOi\nonLUfuDA4dRoSlAiGU9B6EFLS0deunQpX2Q9deoUBcGaSqUVV6/+nWSKoeSmTZu4fPnytF24kJAQ\n9uw5gN99N4mXL19+q2QoIi8RFbGRuXr1KtVqO8pkfVm6dGWSKdlMJkz4kf36DWVoaCjJFAvrf//9\nl4mJiSxcuDSBU1n+GJmb1+Nff/1lzCkVKAaDgWZmZib143vhwgU2adKWEomaWq0du3Xry6CgIGOL\nZVKcPXs2dZdnIoHRb1CwJLCQQP831BlBpdKZ/v7+xp5etixdupwqlTWVyi8IzKVG05nm5oV49OjR\nt2qfohiLE4hOnfMjAr1ZooQbfX1983RrftWqVZw+fTrnzZvHhQsXcseOHVy0aBG12kIUhE8oCL2o\nUllz2bKVaW3mzJlHtdqegmDDgICAPJPlQ0c01jIyZcuWxe7dW3Dy5En06TMFALBmzRr88ss+JCW5\n4/Hjb+DjsxmWlpaoXbs2AODx4xAAWUdrSk6uiJCQkIIS3+jExsbCzMws2yTmxqBixYro3/8z2NkJ\n2LJly5sbfIT88ccOJCR4AYgDkJVxW0bsAUS/oc5pSCSAQqHItXz5wZkzZ/DNN/9DQsJpvMjdHRsL\nAIfRpk0XhIQEw8bG5rV9/PPPP0hK6gzADMAQAFsANMOtW1XQuHEfqFTxaNGiDlxcXKBWq9/5+uOP\nbRg48GsYDDoACa9IoAUwH0D/1L+v4+uva+DTT9vC3t4eW7fuRnz8PJiZ7cfRo0fh6emZlx/hB4uo\niE2AJk2aoEmTJml/KxQKSCTxkEqjoVKpM9UvXLgE7t07C6BepjIzswCULNkuP8U1KSIjI2Fra2ts\nMTJx8eJFVKxY0dhimCxxcQkwGGwA2AC4/hYtgpGijLMjAMAdmJsrUalSVqFPjc+cOYuQmDgaL5Tw\nS5oiNrYOHBwccfjwITRo0CDbPpycnKBU+kGn644UZXwLgDUAQKcjYmJ2YPfugRg2rC+USiViY2MR\nERGB+Pj4HF06nQrADAB3AfyKlBjuAKAD8PkrEpWGmVljHDp0CD179sSECV+hW7eesLV1QJcuU/Pi\nY/s4MPaS/GPn6tWrdHOrySpV6qdFztLr9Zw/fyHHjZvAyMhIPnnyhBUr1qJWa8utW7fx11/nUxAa\nMn0OYBL4gw4OrtTpdEaeVcFx7tw5enh4GFuMTLRp0yZTWkuRl/j4+FCrrU4ghID1K1utWV16pkRI\na5nNWfIdAq40M7Ph5s1bjD21bClTpjqBk9nMcTEBFXv06MF58+bxwIEDfPToUaY+YmJiqNHYECiR\naqCWVV+L2KRJ+1zJevDgQUqlSgJKIi1XMQgoCDxJN56FRW36+PiknXXr9XrRej2HiIrYyPTsOYDA\nt5RKB3PkyLFZ1lm1ahUFoRWBHSxduhp1Oh0//fQzajTlCPxCYD0FoRctLR0/OoOgQ4cOsXHjxsYW\nIxPFihX7KCKcvSs6nY5lylShXP49gd4EemZhfPjCUGs0gQqUSEoScKJEMpfAvwT+IfAFATVtbYua\nvG1EgwZtCGzIRnl+RUBGJycnWlhYUC6Xpyk/hUJBa2trurq6skaNGtRq7Qn8+poXl1iqVNZZKvKc\nMG/ePA4ZMoR9+/Zl9+7d2b59ezo6lqBE0pbAQwLxlEp/ooODK21ti9DMTODChUvy6NP6uBC3po1M\n1aqV8OefCwEkwdNzeqby0NBQ/P33EcTFHQVwFgkJdjhz5gx27tyIo0ePYtWqTbh//x8olXqULdsD\ner2+oKdgVCIjI994rlbQREdHIyIiAq6ursYWxWSRyWQ4fnwfOnbsjXPnLiApyQwGQ00AkwC0RkoW\nrWNQKudAoQhE7dq10aBBdVSuXBFr1mzFxYtboVAo0LhxTfTr9y88PDwgkUheP6iRGT78cwQEzEJs\nbCcAr9o0hAJYDYVChvv376fNw2Aw4N69ewgMDMTVq1dx48YNhISEICHhJtIHrMmIAIPBFjNnzoSn\npyccHR3TLltb27RMSm9ixIgRAIADBw5g2rQF6NjxE2zevBnDh4/Fhg2loNMlo3btxmjd+gtMnfof\nkpO9MH36GFhZadG6dWuTey5NGTEfsZEhicOHD0OhUKBBgwa4d+8e6tVrgYiIh1i8eB7GjPkfnj3r\nAp3uUwCxAO5AEKZg40ZvfPrpp9i/fz86d/aCTtcTycmWUKvX4Ntvh2Ly5O+NPbUCwdvbG2fPnoW3\nt7exRUnj5MmT+Prrr3HmzBlji/JecPXqVVy4cAEXL17Ezp2HERR0GiRQvLgbxo4dir59P4cgCMYW\nM9cYDAZ06uSFQ4duIDb2WwBlAZyEIMzEd98NxogRw2BhYfHGfooWLYf790cBGJRNjUTI5Q4YMOAz\nxMTE4OHDhwgLC8PDhw/x/Plz2Nvbp1POLy4HBwdIpVIULlwYHh4e0Gg0AACt1gaxsXOgVk9Ev36d\nsGvXLjg4OMDe3h7Ozs5QKpVYvnwtkpJ0MDOrA6XSAnr9UWzduhZt27bNq4/vg0ZUxCbG3Llz8f33\nF5Gc3AQ2NlPx7FkvGAw/Zqh1ElZWnfHw4W24uLjj4UNvAE1Tyx5CpXLDjRsX4ezsXMDSFzwzZ85E\ndHQ0Zs6caWxR0li2bBn8/f2xatUqY4vyXmIwGEASMpnM2KLkOQaDAVu2bMG8easQFhaG8uXLYty4\nL9MZa76JLVu2oH//WYiLC0DWKeXXo0aNNTh16lCmksTERISHh+Phw4fpFPTRo8fw77+BSE42wGBI\nQIodrxQKhQJ6fQz0+s6Qy/9C+fIuuHjxYhZjCgA2A3hhKOoPrbYdwsNDoFZnNjgVSc/b7VGI5Dsk\nYTAY0KBBA8jlu6FWj8ezZ6EwGL7OonZtREXZwN3dHeHhkQBefYgdYWbWCH5+fgUkuXF58uSJyW2B\nXbp0CRUqZO1eJvJmpFLpB6mEgZS59ejRA6dOHURIyCX8/ff2HClhAOjSpQvKltVCqRwOIClD6b8Q\nhNH4+ecfsmyrVCpRtGhRVK9eHe3atcOgQYNga2uPU6dCkJj4FwyGpQDMAXwP4AiSklZBJqsBG5tj\nGDy4D+Li4rKRSgvg1dVvLUilpXHy5Mkcze1jRVTEJsD9+/dRpEhpqFRa3Lt3H9euBeLYsb+QcpST\ntZIhC+PmzZswGOIAPHq1BGQQihYtWgCSGx9TPCMWXZdE8hOZTIZ//vFB3br3oVYXh1w+AsBkmJs3\ngaVlZ2zdugr16mV2bcyKxMREjB8/GXFxfwGohBTf5AMAvgNQBUBbJCX9g/j4yihatDgsLS2z6SkO\n6V8KCL3+MaysrN55nh8TorGWCbB9+3Y8eVITyckdMGPGbwgI+AfOzs6wty+C0NB/AdTN0CIBgP8r\nf7cDsASAJYApkEqjcOHCBRQvXhxOTk4FNAvjYGp+xCRx8eJFcUX8gRAeHo6IiAgUL1487czUFLCy\nssL+/dsxZcpUrF27BQqFHJ991gn/+9/+HAU08ff3h0TighTjr98BNATgkaGWFPHx4/HbbwMQHPwf\nHj16lLal/eJasWITHj78EuTPAMwgk81E8eLWqFKlSh7N+APHeAbbIi9ISepgQ5XKnjNnzk27v3jx\nUgpCFQKPX3FN0KWG+hNe8e2TEtCm3nvp9zd8+HAjzqpgqF+/Po8dO2ZsMdJ4+PAhbWxsRD/K95zr\n16+zQYPWVCqtaG5elmq1NYcMGWlSoVRbtepMQWhMYAeB5RSEYunCTb7K8+fP08mu1+v5+PFj7t27\nlxYW9VJ/W35i9uFGH1MQbLLtu3LlOpRKLSmTqSiXq9m4cTs+ePAgX+b9ISIqYhMhPDycwcHB6e4Z\nDAYOGzaCEokVJRJXyuWfU6NxZblyVTlt2jR27tyZWq02g8P9y6tbt248ceKEUQN85Ldzv5ubGy9e\nvJhv/eeUgwcPsmHDhsYWQyQXhIaG0sbGmVLpHKak0iSB+1QqO7JJk3Ym8ZL133//pcacfjWoxzla\nWzule95v3rzJWrWaUS5XU6HQsFu3vpw8eSptbIpQqbSmmZmGMpmGwF0CPkxJIZqVIt7J8uVrslq1\nxqxSpT5v3ryZNsb27dup0dQjcIiOjiUZGxtrjI/kvUY8IzYRChUqBCsrK5QuXRmCYIUdO3ZCIpGg\nUCEbyGQtQHZB2bJB+PTThggJeYIZM37FpEmTEBERgb///hvDhw9HsWLF0voTBAGurq4YNmwYHB0d\n0bdvX2zfvh3Pnz8vkPmcP38eVas2glxuBmtrJ8yYMQfMBwN9UzsjFg213n9++WUhoqPbwWAYA+CF\nxa8zEhO3wNf3PE6dOmVM8QCkfM8kkvoAXt2Grozo6OdYu3Ytbt68CZ1Oh4YNW+H06ebQ6Z4iKSkE\n27bFYepUb0RG+iAxMRLJySGp/tutAZRDir3JugyjPYFGMxHFitnh7NmyOH++KqZOnZNW6unpCak0\nGBrNYLRo0eyDcDUrcIz9JiDykiVLllCl6kjgD1aoUJckuWHDBgpCCQpCFY4fP5lubrUJbKVa3Y7e\n3t7p2hsMBgYGBnLatGmcMGFC2v07d+5w4cKFbNGiBc3NzdmiRQsuXLiQd+7cyZd5PH78mBYW9gRW\npL6xX6YgVOUvv8zP03EMBgMVCoVJbRf279+fS5cuNbYYIrmgaFF3ZpfdDBjP7t17GltEBgQEpK6I\nE16R7SxVKhu2bduWRYsWpSAIlMncMsgfRcCCwNNX7ukpldaiXG5OrbYSAXMC9Qj8QjOzMVSr7Tl6\n9Hh6ey+nIJSgRlOG8+YtTCdPWFgY/f39jZJ69ENAVMQmxIuzYkEowvHjfyCZomz27t3LLVu2UKfT\ncefOP6nV2tHdvQYfP35Mkjx+/Dj37NnzVltm0dHR3LZtGz///HPa2dmxUqVKnDBhQp4+RAsWLKBa\n3TvDD8BpFi5cOk/6f0FMTAwFQcjTPnNLjRo1eOLECWOLIZILrKyKEfgvG0U8mS4u5Y0tIkmyTZuu\nqTHn/yCwlIJQjCtWrE4rX716NQWheQb59QRsmZIr+9X7AXR0LM1jx47xyJEjXLlyJQcP/poTJkzi\n1atXSab8Fh08eJD79u1L91sTHBzMNWvWpP0eieQcURGbGA8ePOC5c+fe+hxq69atFISi1GjKc8qU\nmTkaS6fT8cSJExw3bhzd3Nzo4ODAAQMG8M8//2RMTMxb96PX63nt2jX+8ccfnDBhAkuXLkNgXIYH\nPYyCYJ0j+d7E3bt3WaRIkTztMzfo9XpqNBo+e/bM2KKI5IJy5TwJjMxCCesIlKWTU96+UL4rSUlJ\nXLJkKevVa822bT/j4cOH05VHRkZSrbYicPGVOawmUIUpMbxfnVsw7exccixDeHg4tVo7CkJrlipl\neslX3hfEM2ITY9GiFahVqz4+/bTnW8WNvnDhEhITGyM2tjMCArKKeJM9MpkMdevWxaxZs3D58mX4\n+fmhYsWKWLBgAQoXLow2bdpg6dKluH//flqb2NhY+Pv7Y+nSpRg6dCjq1KkDS0tLNG/eHOvWrYNM\nJkPfvp9Drd4M4FlaO6l0KZo1+yRH8r0JUzsfvnPnDmxsbF7jaynyPtC2bXMAqwGsQkraPwB4CuAL\nAGZwc3M3lmjpMDMzw5Ahg+Hruwc+PpsyBQaxtrbGihVLoFLVh1bbFWp1EwDDAawAkD4ut1S6Hc2a\nNX6rcc+fP49169YhJiYGjx49gsGgRFzcV7h7Nzhf7EA+Coz9JiDyEr1eT4lESuAGBaEoAwMDM9X5\n5ZcFbNq0A48ePUoy5WymVq1mdHOrycuXL+eZLJGRkVy0aBEbNmxItVpNKysr2tjYUKlU0tPTk/36\n9eP8+fN59OhRRkZGpmubYu09ioLgTKVyGM3Nm7NQoeLcvXt3nq4WDx8+bFKZl/766y+2atXK2GKI\n5JLQ0FAqFBYEPJmSfrEmASsCPSkIpbhv3z5ji5gjHj16xN9//51//PEHPTxqU6H46hVrcAOB/RQE\nu3TeB1euXOGqVasYERGRrq8rV65QrbalIDRho0ZtaTAYOGbMBJYq5cm1a9cX9NQ+GMRY0yZG7drN\ncPHiA2i1ibh+PRDm5uZpZYGBgahduzXi47+HldU0PH0alidjJiUl4cqVKwgMDERgYCDOnz+PwMBA\nyOVyeHh4oFKlSlCpVLh//z7+/fdfxMbGom3btmjfvj2aNGmSbSzZc+fOYcaMmTh48DiSk1WQy62Q\nlHQHHTt2xrx5M2Fv/7pE729m27Zt2Lx5M7Zt25arfvKK6dOnIzo6Gj/99JOxRRHJJevXb8SgQSOQ\nlNQZen0pAPHQaFajf//OmD9/tslnesqOyMhIdO/eHydO+EGhqAUyBIIQg40bl6etqENDQ1GmTCUY\nDDXh6voYly+fTmu/b98+dO06HrGxo+HkNA0PHgQbayofFGJkLRPj6NE9CAgIgJubG3bt2o2TJ8/g\nm2++RMmSJVOVciJksnOwtHzzluzIkd9h3bqNGDr0C0yb9j8AQERERCaFe+3aNbi6uqJy5crw8PDA\nt99+i8qVK8PR0THLfoODg+Hj44PZs2ejR48eaNy4Mdq1a4e2bduma/P775uxb991xMbuBFALKdth\n4fjjj9k4frwezp49kStlbGpxpi9duoTWrVsbWwyRPMDLqydq1KiGBQu8ce7cPyhWrDC+/HLtW4eO\nNFVsbGxw8OCfuHXrFi5evAhbW1vUqVMnXWrEsLAwkFrExw/G7dt90rVv3rw5OnX6C6dOLcCCBQsK\nWvwPFnFFbKKcOXMGjRp1RHx8F5Qu7Yvg4AAAwNGjR+Hr64tu3bohJiYmnUL18fFJS6N27949lCzp\njuRkX0gk1dGsWSNcuXIFz58/h4eHR9pVuXJluLu7v3OGlMjISOzbtw8+Pj74+++/UaZMGbRr1w6l\nS5dGv36jEB9/EVnFyzYzG4FevZKwevWSd/6MZs6ciaioKMyaNeud+8hLKlSogPXr16Ny5crGFkVE\n5J0hiVGjvsfevYcwZcq36N69a7ryxMRE3L59G6VKlYJcLq7l8gJREZsYiYmJ+PXX+fD23oi7dx+A\nrI1ixW5i+fJf0xTui0ThKcZcAoB4AEp8881QxMbGIjAwEBcvXkRiohRAaWi1D7Fy5UJ4enrCxcUl\n37bVkpKS4OvrCx8fH6xcuQExMV8C+CGb2g+gVlfA48f33zmG79ixY2Fvb4+xY8e+q8h5RlJSEiwt\nLfH06VOoVKo3NxARMRJ3797F2LGT4eJSFDNmTM6RMk1MTETFirVw795DVK9eGceO7X1vt+lNCfF1\nxsT49NOeOH48DvHxvwCIBjAaISH38Mkn2VkcmwG4CcAJ//77L7y8vODl5YVKlSohOTkZ/v7+qFu3\nLqytrfNddoVCgaZNm6Jp06Y4cuQcLlxo+JrazpDLC+H+/fsoW7bsO40XGRmJcuXKvZuwecy1a9dQ\nvHhxUQmLmDz9+3+No0ddoFQehJtbSfTt2zfbusnJyZg9+2dERT3HxInj8PDhQ9y7F4qEhGCcOGGL\nxMRE8TufB4iK2IS4ePEifH1PIz7+FlIULJCSiqwcgORsWiUDqAxADXd3dwwfPjxdadu2bbNsld9o\ntQJSXD6yw4DY2HAkJCS88ximdEYspj4UKShCQkKwePFy3Lx5Dy1b1oeXlxeUSuVbtzc310ImewCJ\n5Fk6Y9CsWLx4CaZN84HB4IAnT77HsmXzUbt2DRw5YoPevQeJSjiPEBWxCXHt2jXI5VXxUgkDQHGk\nxLvNqLA0kEqBatXcUalSJTRv3hy1a9cuMFnfRJ8+HREYuBaxsZ2yqfE3DAY9PvnkE/z++++vWfFn\njyn5EYsxpkUKggsXLqBeveZITOyJpKR62Lt3E7y918PP7wDMzMze3AGANWsWYf78hShevC06dUp5\nPkkiPj4+U5zolOMvOUgz6PX6tFzISUlJCAsLQ0REBOzs7PJ6mh8fxvOcEsnIzZs3qVLZpcaDfZlR\nBVDT09OTAwYM4IIFC/jVV19RoehKYCVr1GiWb/LcunWLX3wxnA4OpWhrW5xublXZtm03Llu2/I2R\nt54/f047u6IEfs8iQtF9Ak7pMkUNHz48x1lb3N3dTSbzUrt27bh9+3ZjiyHygdOkSXsCC9OFrNRq\n63Lz5s3v3KdOp2P9+i0pkUjZs+eAdGWJiYmcMOEHDh8+Kl28gCVLllGlsqEg2PDMmTPvPLZICqIi\nNjEGDx5BjaYigaWUSH6iSlWYXl596e5eh/Pm/UaSPHnyJAXBloLgwokTp6RrHx4ezoCAgFzHjT53\n7hzNze0pl48ncInABQKjCNhQEBrTzq4og4KCXtvH5cuXWahQcWq1rQhsILCbZmajKJGYE5ClU8QA\nWK5cOZ49e/atZSxcuLDJ5Dx1dXXNlMZSRCSvsbQsTCAkw4vtT+zTZ8Abw+ImJSXRz8+PZ8+ezRQr\nWqWyJ/CMgOStkqjUq9eGwFrKZIM4ffr0XM/rY0dUxCaGwWDgjh072KlTb/bpM5iHDh2imZlAwIcK\nhTkfPXpEkrxx4wb9/f3TPVB37tyhhYU9BcGF/ft/mSs5KlSonRqXNuNq9jcCzSiRLKeLi/sbH/64\nuDiuWbOGzZp1ZJ06rThy5LcMCgri//73P0ql0nSKWCqV0s/P763ke5F5KS4uLlfzzAueP39OtVpt\n1LzPIh8HHh71CWxP90zKZG1obm7BokWLsnfv3ly5ciVv3LiR9mw+evSI9erVoyDYUqOpSI2mFEuV\n8uDt27dJpqx6y5WrSqXSjo0bt0033uXLl7l169ZMz9muXbuoUAi0tXXm9evXC2TuHzKiIjZxEhMT\naWvrTJWqOy0s7F+7fZuSoLs+geN0dCz1zmNev36danVhAslZKOIEAjYE7lOrrZAWavNd8PPzY4kS\nJdIp46+++uqt2sbExFCtVr/z2HmJv78/PT09jS2GyEfAvn37qFY7ElhL4D/K5aPp6FiCz549Y3Bw\nML29vdmjRw8WLlyYRYoUoZeXFwcOHEhARWBPWlhLqXQWq1Spn9ZvYmIir1+/nu5l8uqQ/NC/AAAg\nAElEQVTVq6nKuy6bN++YSZbk5GQx7WEeISZ9MHEUCgX+++8EfvmlIQIC/CAIAu7evYsBA77Ezz/P\nTxdkvXnz5ihVygCFoiV++GHcO4/55MkTKBTOyNqWTwnAAcBTGAw1cO3atXcep06dOjh//jwGDBiA\nqlWrYuXKlfD29oaLiwvu3r372raRkZGwtbV957HzEtFQS6SgaNmyJfbs2YgGDbbAxaU/+vZNQECA\nLywtLVGmTBkMGjQIGzduxIMHD/DPP/+gQYMG2Lt3L4AyAF5EfZPAYBiNK1cuIzQ0FEDK70ypUqUg\nk8nSxrpx4wYkkmKIjf0aFy9mTigjl8vTReQSyQXGfhMQeTsePnzI6OhokmTNms0olQ6nRlOeu3bt\nyrbNqVOnWLNmcw4d+k2Otk0jIyOpUlkReJzFivgeAWsCMTQ3r8M9e/bkem4k01b6jx8/ZoUKFSiT\nyfjrr79mW//8+fOsVKlSnoydW0aMGME5c+YYWwwRkSwpXrw4AfcMz3EilUprhoWFZdsuKSmJXbt+\nzuLFK3DXLp8ClPjjQ3ydeQ9YtmwlihUrAycnV1y6dAkymRRAIkhdujfYjPTuPQynTrXE2rVH4ePj\n89bjWVtbo1u37lCpvsbLNHAAkATgKwB9AfhBoQhBixYt3mlOGXnhNmFnZ4eLFy9i0qRJGD16NKpX\nr47o6OhM9U3Jh1hcEYuYMtu2bYMgPASwFSknQHpIpdNgbW2HZs06w8dnd5btzMzMsGXLarRo0QQ9\nevTFyJHfFaTYHxWiIn4PWLlyC5KSliEx8VPs378fW7euwrBh5pg7dzRatWqVbbsiRZyhUh2BwRAK\nJyenHI25ZMkvqFUrGoJQBsBYAKMBlADwDHK5ARqNF7ZvX59vsWYnTZqEK1eu4MGDB3BwcMD27dvT\nlYs+xCIib0e1atVw/PjfcHKaCK22DAShGEqW/AtRUXpcvvwVevf+Itu2YWFh+P33NYiNPYlFi+bj\n6dPXBekReVfEWNPvARs3bkbfvgOg0Vjg9OnjKF269Fu1i4qKwvr161G+fPl0ScNHjvwOa9duwJAh\nAzFjxuRs25PEmTNn4OPjg8uXL+PmzYcwGGRo2rQ2Ro4cBhcXl9xO7Y0YDAYMGDAAv//+O9q3b49t\n27ZBLpdj2bJl+O+//7Bs2bJ8l+F1PH78GGXKlEFkZKQYc1fEpDEYDLh8+TJUKhXMzMzg7l4NZG2U\nLh2JwEC/LNskJSWhVKlKePpUDVvbJJQoURJarQZr1iwymRfhDwFREb8HGAwGREREwNra+q2j52RH\naGgoXF3LIynJF3J5TTx+HAYrK6s8kjT/OHr0KNq3bw+5XI6///4bhw8fxrNnz4yeeenIkSOYNGkS\nfH19jSqHiMjreP78OdatW4fSpUujefPmAIDz58/jzJkz6NSp02sNH6OiohAQEIAlS9Zgx//bu++w\npq43DuBvEpLckbCHCCjKEBS3ghMrUvdqK2q1bqu2P/eeuGfRqtW6B1atomgd1Tpbt1Zx7z1woOAC\nREby/f0RTAkhEBRNtefzPDwt955777kIee894z0brEkme0KDB/vRhAljP1T1P3msafpfLjExkfz8\nKpKrqzuFh0802JeSkmIwahoAHTlyhK5fv27yfA4ODuTg4EgqVQ8qXNgzz1yz/xafffYZPX78mCpW\nrEhBQUG0bt26f8UTOcsx/e/y6NEjGjNmAvn7VyFPzzJUq1Zj2rBhA2VkZOR98CesdesuNGDAVmre\nvIP+obFcuXL07bff5jn7wMbGhkJCQsjHpzhx3HGSy89R0aIeH6La/x0WHCjGmGHnzp1QqSqC6BLU\namf99m+/7Q2JRIrAwNpIS0sDAAwfPhaiWBw874DDhw8bnCc1NRWzZs3CvHnzEBcXh61bt+LZs2cf\n9F4KSmRkJKRSKRwcHHD79m2L1uXbb7/F3LlzLVoHRmflytXgeTtwXDcQ/Qmi0yD6BWp1dXh7l0Vs\nbKylq2gxpUtXA9EUCEJgnukwb968iREjRmH79u0G29PT0xEZGYmoqKg8E/kw+cMC8b9cQkICXF2L\nQ6m0R5cuPQEAGo0GEokERE8gCEVx6tQpAEBgYCiIFkOhCMPMmTMNzjN48EhwXDB4vjLCw8fop0J9\nrBo2bIgiRYrkOc3pfatatSr27dtnseszOjt37sxMdHEuhyl3WlhZjUexYgFmpW/8FMXExKBatXro\n2rWX/sHdlOLFS0Mq7Q6ed8ozjS1TMFgg/gi8evUKt27dMngKbdCgBTjOCcWLB+jn4O7evRv29u4o\nVSoIjx49MjhH1649IZN9A6JGkMlUUCrVaNeu20f7wRQcHIy//voLY8aMgVQqReXKlfHixQukpqZ+\nsMCo1WqhVquRkJDwQa7HmOblVR5E63MIwv8EY5Xqc0RGRlq6qu/N7Nk/IyCgOhYsWGyyzP79+7F6\n9epcg7GzsyeIfoAguOPEiRPvo6pMNiwQf6Q0Gg2uXbuG169fm1X++vXrsLKyA1G9zOTuCeD5Zvju\nu37vuabvR6lSpXD27FkAwMWLF+Hq6gqO4/Dll1/qU2W+7zzUt2/fRuHChd/rNZi8HTlyJDPtak4p\nWbN+bUKZMjUsXd18W758BVq27JjrKkePHz+GXK4C0SbI5QJevHhhVGbXrl0QBFcIQpC+dS0nR48e\nRaNGrfSLzADAvXv39H9vTMFjgfgjFRsbC2/vsrCxccGuXbvyLL906VKIYgujLFkcZ/1R9ve4uroa\n9PlpNBo0aNDAIG+1v78/YmJikJaWhqioKHz1VXvUrdsCPXv2L5DlE7ds2YJ69eq983mYd6PLpVw7\njyAMEN2HtXUhS1c3Xy5cuACedwHRRDg4uJssl5ycDGtrZ3Dc17Czc0VqaqpRmZ9//hkcVw9EU1C1\nal2z63D8+HEIgj14vjAmTJj2VvfB5I6Nmv5I/frrr3TnTgC9eDGRwsMjci2bmJhI+/bto5QUPtse\nG0pPNxx5/TEAYJTQQ6vVGuW9vnTpEgUGBpKtrSt17jyXoqOr086dYTRvnkiBgfWoXr0vKSkp6a3r\nwRJ5/DtcunSLiFLNKJlMCoXyfVenQOkS5miI6GmudRcEgWJiDlFERHWKiTlECoXCqEy7du0oNNSW\nypTZQnPmTDbYd/DgQRo0aCidPn3a6LgDBw5QRkZ9SkmZSps27XzXW2JyYuknAebtrFmzBjKZGhKJ\nE0qVqozZs2fj8uXL+v1Pnz7F8uXL0aRJE6jVatSqVQtyuQ2Iruv7zGSyUahX78t3qsf27dvRuHFr\nhIZ+gZUrV36Q1ViSk5NzXHnp4MGDKFasWLZ1jvksq85kz7XbEVWq1EF6evpb1aNt27ZYtmzZO94N\n8646duwOIhWIHuT6RiyTTUTbtl0tXd1827x5M3r16o+LFy+afcyxY8cwYsRInD59Os+y8fHx4Hlb\nEA2GWu1o1H8cGxuLokVLQhBsCyy3PGOIBeKP0PXr16FWO0Mi6Q+i5SAaByIebdu2xcKFC1GvXj2o\n1Wo0a9YMK1as0E9TmjdvITjOFipVE4hiaXh6lnynKR0RETMhil4gWgSilRDFirn2PRWUu3fvws3N\nLcd9L1++RKdOnTKDsAjd+smmPpwzIIqVsHHjxreqR5kyZdhgln+Bo0ePQiZzANF3ufxbx0EQCiMm\nJsbS1X3vnj9/DkGwA1E/qFQOeY4jefjwIZRKGxD9BI5Tmz3uhCk4LBB/hLp16wWZbES2D5ohIFKi\nbt268PQsjerV6+Hx48dGx8bFxSEoqDakUiXKl6+R51QGU5KTkyEI9lnesAGiF+A4B/2C4+/L6dOn\nUbp06VzLzJs3LzMQJ+fRb/hLvvrL3khLSwPHcbmuD818GFqtFm3adIJEYgeiPiB6mu3fOAaCUApD\nh4ZbuqofxJMnT6BUWoNoIRQKFZKSkvI8Zu3aKDRs2BKdO3fFjBk/vvXnAvN2WB/xR+jMmSuk0VTP\ntrUWEXGUmmpFt283oWPHHGjOnJ+NjrWzs6Njx/4krTaOLl26QdeuXcv1WgMGjCBRtKcOHXoY9CXf\nvXuXpFJ7IvLKUtqalMpAOn/+/FvfmznMWYvYw8OD1OrqRCTkcbbadPGi8Vqrebl27Rp5eHjoV41i\nLEcikdDKlUtozpwJpFavJyI3kkgakELRntTqIHJwaE4//NCLJk8u+JSMjx8/poiI6dSnz0Datm0b\nabXaAr9Gfjk6OtLy5Yuobt0dtH79ahJFMc9jWrYMI39/L1q16hYNHx5FP/446wPUlHmDBeKPUI0a\nFUih+D3b1t+ofHk/CgjwJUHYQgrFISpZ0s/oWLlcTk2btia53IN8fIqSt7e3yeskJyfTzJk/0KtX\nf9Patevozp07RET0/Plz2rBhAyUn3yeiO1mPoNTUE1SyZMl3v8lcmLPyklQqJanUnEFoGW+1uDkb\nqPXvIpFI6Pvvv6eXL2MpLu42/fLLNzRnTk1av348xcXdou+/717g1zx37hz5+JShUaMu0OzZ9tSy\n5RAKC2tfoIMfY2JiyMPDj0qUqKj/+zNH69YtaceO9dSkSROzj0lMTCaNxom0WntKTEx+m+oyb8vS\nr+RM/j169AjOzp5QKruAaDUUis5wciqKhw8fQqPRYOPGjdizZ4/J4zUaDU6ePJnjFIfs5fz9K0Gl\nKgM3Nx9cuHABvXr1gp2dHdq2bYsePXpBFP1AtBJE0RDFah9kMMyCBQvQtWvu13n06BE4zhZEz/Jo\nmp6DkiUr57sOo0aNQnj4f6Opk8lZ9er1QTQ3y+9SCkSxBPbu3Vtg12jS5GsQTYJU2g3Dho3Iteyi\nRUvh7u6Pbt36mD0l8fLly9izZw80Gg0SEhLQqdN36NGjLxITEwui+oyZWCD+SD1+/BijR49H/fot\nER4+Lsf+YAA5/kG2aNEecrkKJUtWznNgRmJiIn788Uc0bNgQjo6OGDp0qMEArw0bNqB27aaoWrUe\nFi5chIyMjHe7MTNMnjwZgwcPzrNc06atIZWOzyUIvwKRO4gI3bt3z/PBJKvmzZsjKirqXW6D+cgp\nlSqj/miJZBjGjh1bYNeYMWM2BKEoeN4FmzdvzrWsQiGAaA8EoQhOnjxpsC85ORnR0dG4du2aftvx\n48fB8w4QRX/8738DCqzOTP6xQPyJyB5EMjIyUK/el5BKZejVa5B++z95qhMgCEVMTm9ITU3FihUr\nUL58efj6+uLnn382a9DHhzBo0CBMnTo1z3I3b96Era0rJJJ5IMrIFoTjQVQTRJx+qlPNmjURFxdn\nVh28vb3zNZ2E+fS4u/uD6IDB75WVVV1EREQU6HWOHDmCM2fO5FkuICAIolgbarWT0YN5cHBDiGI1\niOI/C6UsXLgQPN8QRMs+yoxjnxIWiD9yGo0GoaHNQCTB11930W/XZeRxBdFDEEkMRkG2bt0ZVlY8\nSpeugsTERIPUdfHx8Zg4cSIKFy6MOnXqYOvWrR9kbnB+dOnSBYsWLTKr7NWrV1GyZCAEwRNS6VAQ\nTQXPt4Ncbg0rK1W2OccET0/PPB84kpKSwPP8W88/Zj4NixcvhSD4gGgXiG5CKh0FQXCEnZ0dRo0a\n9cGbd58/f461a9fi5s2bRvtsbQuDaAtEsZS+2+rZs2cIDAyBs3Mx7Ny584PWlTHEBmt95G7fvk0H\nDhwkome0Zs1yfaaoYsWKkZOTDQlCVapWLZTkcjk9e/aMFi1aRIGBAbRt2yZq1aoxlShRgurUqUNn\nzpyhHj16kLe3N12/fp22b99Ou3fvpkaNGpFEIqHRoydSlSp1affu3Za9YSJKSEgwey1iHx8funDh\nGP31VxQNGyan3r0f05QplejBgxt08uRhKlasmEH5unXr5jnK9NKlS+Tr65uZ9Yj5r+rSpRPNnx9O\nPj5Dyda2BjVvfosuXYqh06dP0/Xr18nPz4+WL1/+ViOpX758SVu3bqW4uDizj7GxsaGWLVtSsWLF\n6PXr19S79yCytnYmQbClUqX8yNW1PzVuHEjBwcFERGRra0vHju2huLib9Pnnn+e7jkwBsvSTAPNu\n0tLS4OdXERxXCNWqfW7QJ5yUlKTPtXz06FGo1U7g+RaQyTpnZiKS6t8EeZ7HiBEjjFZtAnRZegSh\nKIgWw9bW1WRdxo2bAplMgerV677XpADBwcH4888/C+RcT548Qe3atUFEcHV1hUQiwU8//ZTrMcuW\nLcM333xTINdnPl2HDx9GUFAQKlasiP3795t9nFarha9veahUVeHg4G7yzToqah3ateuW42IQYWEd\nwHFfgOgGiB5AoeiOSpVqfZR55f8LWCD+BKSmpuLSpUsmm0q1Wi2KFy8DorVZ+rNuZekf5SGRBKBJ\nk9Y5Hn/jxg3wvAMUilbw86tosh66NHkXIIql3utShAEBAQW6EkxaWhqmTJmCpKQkjB8/HhKJBG3b\ntjVZvn///pgyZUqBXZ/5dGm1WqxatQoeHh746quvcOPGjTyPSU1NhVQqA9EpcJwzrl69alTmxo0b\n4DgHEI2HjY2LQYDVJfSwBdHLLH/vGshkrvDyKmMwLuTly5f5GqTIvB+safoToFAoyM/Pz2RT6ZMn\nT+j+/XtE1CLLVk8iqpH5/14EjKSTJ40TvhMRFS9enPbs2UJTpgTRn39uNVmPOnXqkSA0Ip5/SaVK\nlXqbW8nV8+fP6dGjR/lqmjaHXC6nIUOGkCiKNHLkSNq+fTutW7eOSpcuTa9evTIqz+YQM+aSSCTU\npk0bunz5MpUrV44qV65MQ4YMoRcvXpg8RqFQ0PjxU8jevim1a9c6x7n+EomEJBIiojSjefDx8fEk\nl9sTkTrLVilpNEXoxo3y1LfvKDp79iyVKFGR7O1dyMbGib7/vj+lpaUVyD0zb8HSTwLM+5ecnJyZ\n8u5xtqkWJdCpUyfUrfsF3Nz8sHnzlne6TkZGBmJiYvS5rQvapEmT9E3pKpUKEyZMeC/XAYA7d+7A\nyckJNjY2RqOjXV1dcefOnfd2bebTdf/+fXTq1AkuLi6YP38+0tPTodVqER0dne+0kps2bcK33/bE\nqVOnDLanp6fDwcEDRH9l+Xu/ktkC5gs/v7JQqZxAtAC6NZwfgOcboE+fvKcEMu8HC8SfsLS0NNSt\n+wUEwQ6VK9cCzzfKbJJ+Dql0ODw9S+U67/fu3buIiIjAsWPHPmCtTRs4cKDBCOfJkyebLKvRaDBx\n4jTY27tDJlPgs88a48qVK/m6XmpqKqpUqQIrKyusXbsWgG5UubX1x7mGM/PvERMTg+DgYJQsWRKj\nRo0CEcHPzw+///474uLicPbs2XdqMt6+fTsEwQEc1xly+f/A844YOHAw5s+fj7CwMEgk2ddvvgOe\nt2G/1xbCAvEnbP/+/RBFfxAdhyDYoU+fwRBFe8hkCjRo0CLPlZeKFPGHXN4OgmCPe/fu5evaixcv\ng62tK+rW/aLABm517tzZIBAvXLjQZNnx46dAEAJBdBZELyGRRMDBwf2t5kL37NkTEokE/fv3x19/\n/YVq1aq9y20wDABg9+7dkMtVIFJk+b3mIZWKEEVfqNXOWLNmrb78pUuX4OVVFj4+5XPsN87u/v37\nmDlzJqZOnWqQyGPOnDmQydobJbeRSq3YlDwLYYH4E/b48WPY2blCFP3x+efN9duzPvXeu3cPoaHN\n0bTp10hISDA4XhBsQRQJnnfFuXPn8nVtOzs3EO2BSlUOO3bseLcbydS8efMsH1gStGr1tcnBL3Z2\nhUF03uDDRqVqgsjIyLe69i+//AKZTAYvL68802syjDm+/roLiKaBaGxmMLYCUTCIXmT+zp4Azzvq\n1xnv2LEHiAZDIumH7t17v/V1r1+/DrncFkR39H8bUuk0BAc3LKhbY/KJDdb6hDk5OdGVK2do+/YF\ntHXrWv12iW6UBxERDR06lvbudaVt27QUETHT4Pj161dTUNAqCg8fkO/BSVWrViNR7EcSyX3y9/c3\n2AeATp48SQ8ePMjXORMSEohIRkQ2RDSQoqPtKSAgkLZs2WJU9sWLx0RkOEc4NdWTHj9+nK9rvvHN\nN9/Q6dOn6e7duxQVFZXvujNMdh06hJFSOYFksqlElEZEHBHNIiLrzBIVKT29A61c+SsREVWvXpkE\n4Vfi+SiqVq3yW1/Xy8uLpkwZSxxXnkSxLanVn5Gz83xatuynd7wj5q1Z+kmAsayRI8dCEAIhCKUw\nb94C/XatVotr16699Xq7qamp2L17d45N2v36DYMgFIEoOuDChQtmn7NEiRKZA07uZXnT3QdHxyJG\nfd1VqoSC6Mcs5RLA84WNBrbkV1BQEDw8PKBUKnNdWINhzPHs2TM8f/4cp06dynxLvWDQiiOVDsPQ\nof8s9nDkyBGjMRsZGRk4fPgwHjx4kOf1Hjx4gO3btyM5ORl3797FkiVLsGnTJjaFycJYIP6P+P33\n39GtWy+jZPDp6elYvnw51qxZY9Bk3bbtt+A4J7i6FsfTp08Njrl69SqioqLeOoWfr29lEP0GQWiE\nJUuWmH2cnZ0diKpl69sCBMED169f15d78OABfHx8oFTaQhSbw8qqLwTBDX37Dnmr+r6h1WphY2OD\nuLi4zAEvEvTu3Rt16jSDg0NR1KjRAIcPH36nazCfppSUFCxfvjzXxB69ew+EXN4CRGmZv9s3wfOF\n8nx4bNeuO0TRB2q1U67zlOPj42Fr6wqVqhIqV/7sre+FKXgsEP8H3L17FxxnB6JRsLFxNmtkpCja\ng+gqRLGMwbJu9+7dg0rlCFEMRmBgyFvVZ+3adeB5G/j7V0J8fLxZx2i1WsjlchC5gEiTJRDHg+Ns\n8Pz5cwC6hR68vLwwfvx4vHjxAkuXLsWUKVOMHkDext27d1GoUCH998OGDQMRD6I5mRmMlkEQnBAT\nE/PO12L+3U6dOoUVK1aY/TDasmVHCEIweN7FZDBOSkpCSEgTCEJhWFvXAsfZYubMOXme29XVF0Q7\nIIo1EB0dbbLc8ePHIQjFQPQ35HLOrHozHwYLxP8Bt2/fBsfZg2gyVCp7sxZxGDp0NCQSGUqVCjRo\nnj5w4ABE0RdEv0OtdiqQ+mk0Gpw4cQInTpwwWbekpKTMQVoiiL4G0VUQnQTP10GXLj0BAOfPn4e7\nu3ueKSrf1rZt2xAaGqr/vlu33pBKR2R7Q5+O0NBm7+X6zL/DxYsXIQgOEIQQfPZZY7OOKVu2Boim\nQxCCsXz58hzLaLVajBw5DhUr1sKPP/5o1BJlyrJlKyCK9qhcuXauDwYajQatWnWCnZ0bZsx4P38j\nzNthgfg/Yv36aLRp0xVHjhzJs+yZM2f0/UjZ354zMjLQvn0PeHiUxKpVv75zvXTB0xcqlR9UKj+4\nu/vi/PnzRuXmzp2bZcS0AhKJCBcXL4wePR7p6en4+++/4eLigl9++eWd62TKtGnT0LdvX/33n33W\nDETrswXiPZBK7fJcO5b5eG3btg2iWBZEK1C4sK9Zx/z9998oU6Y6qlcPQUREBH777TejBB5//fUX\nRNEHRLPMPm9WWq0Wkyb9gKZNvzZr2UTm34MFYsbAwYMHIQhOEMWAfC0WnpKSgnr1vkShQt7YuPE3\ns47RaDTw8PAD0RIQaTO/lsDdvYT+zVij0WDkyJFwdXU1mEMcEBCgP8/evXvh6OiITZs25e9m86ld\nu3YGfdqTJ08Fz7fMrPebQNwRRFaQSCSYOHEitFot0tLScOfOHTx8+JAlTPgEpKeno3377vD1rYQ/\n/vjDrGOOHj0KR0cPqNXVoVT2hFodDHt7Nxw8eFBf5ty5c+B5J8jlrVG2bPV812v37t2ZgXwsvL3L\n5ft4xnJYIGYMzJ07FxzXGETzULFibaP9EREzERLSDH/99ZfB9ujoaIhiVRCtg7u7v1nXOnXqFFQq\nn2yBTAuVyhcnT55EYmIimjdvjurVqyM6OtogENeooVvIfNOmTXB0dDTox35fypcvbzBi9cWLF3Bz\n84VEUgtEs0BUD0SCQT1LlCgFa2sXCIIblEp7eHuXx8qVK997XRnLSE1NxbRpEZgyZZo+kc3jx4+h\nVjuDaHO21pNtUKmcDEY779mzB9OmTctxFbS8HD16FIJQGDJZR5QvX7PA7ol5/1ggZgw8e/YM1avX\ng4eHv9GgklOnTkEQ3EA012g5xEuXLkEQHCCKFfDFF4ZLBEZFrUNwcGOsWGEYgE6fPg1R9DIKxKLo\nha1bt6J06dLo0qULXr9+jXXr1hkEODs7OyxatAguLi74+++/388PI4v09HTwPG+QmSs9PR3+/v74\n/vv/oUuX7xEW1hJSqTRLPQUQNQXRRbxZAYfoDwhCSQwePPKd6hMbG4tu3XqhRIlANGnSGidOnHjX\nW/zgEhMTP7lpM2PHTgTHBUOprI3hw0cDACZMmAyO62w02p8I4LjuCA8fZ9a5U1NTsXHjxlyT62zY\nsAEjR4bj/v37BXE7zAfCAjEDAHj16hVevnyZa5nr16+D5x0gk3WGp2cpo/1XrlzB1q1bDT5cExMT\noVCIIIqEQqHGkydP9PueP38OQXACUQSI7mcGqjkoVMgLLi4umDVrlr4pt0uXLiBSZ84jFkFEUCqV\n7zwv2FyXL19G8eLFDbbNnTsXISEhBs3Ne/bsgb29PYhkIGqS7SHjzdcTCILbWwfP+Ph4ODkVgZXV\nQBAdgkQyG4Lg+K/JCZ6XCxcuoEKFYFhZ8VAq1ejated7Xb/6jaSkJHz++Rfw8PDHzp0738s1Bg0a\nDoWiGeTyr9C790AAQJ06X4AoKsdATPQbatb8Z8BXWloaZs6chRkzfjR6SGnRoj1EsTJ43sFgKUPm\n48cCMZM5rcEOSqUaW7bkvgLTn3/+ifHjx+P27dtmnfv169ewtnaCVPodRNFeP6rzwoUL8Pb2hqen\nf2ZwVYHIBkQcRFE0+KD89dc1kMs9QLQbRA9A9EPmtCFCx44dzapHUlISGjVqCT+/yjh69KhZx2S1\nfv16NG3aVP/906dP4ezsnOOgmCtXrkAqVSF7ik3DRA2T0aZNl3zXAwCmTJkGjoMTyKQAACAASURB\nVOuQ7ZwLEBraPO+DLezVq1dwcHCHRPIzdPNlH4Hnm6J79z7v/dorV66EINQC0TL4+lYy+7jjx4+j\nWLHSCAwMwePHj3Mt+/LlS3Tv3gddu/bUT6lr2bIjiH4y8bswH82atdEfP27cJHBcdXBcTYwaZfim\nXLx4ORBFQhSrY82aNQb7Vq9eg9DQL9/7OAnm/WCBmMGgQUNBNAhEc9GoUWuzj0tLS8O4cZPQt+/g\nXJc+PH/+PMaPH69/io+KioKjoyNCQhqA55uCKCHzzTEKRBysrKxw4MAB/fG+vpVAtCPbB1gLCIJo\n9lvlokWLwPOhIJqJ8uVrmX2Pr169wujRoxEWFoYePXrok+L369cP3bp1y/GY+/fvg+ddTAZh3dff\n8PKqYHY9smrVqjN0S9hlPd85uLn55ftce/fuRd26X6J06RoIDx+XZ6vIu4qKioJaXTdb3R9AqVS/\n9wUHTp48CZ7XdZ+0aWN+vvDatZuCaBrk8laYOnVqvq+7Y8cOiGIpEL3Odt+pEMWy2Lp1q77sgAFD\nIZd/Cbk8TP9GnfU8RYqUQsOGYXj16pV+++PHjzOXOV0EhUL11tnwGMthgZjJHOSheyM2d8QzoFvF\nheerQi4PQ7t2xkHpypUraNy4FWxsCoPjnDF16lQMGDAAnp6eiImJAc/bgOhutg+n+rC2tjbIUGVj\n44qsCep1X5PQrl1ns+u6f/9+8LwzBCEI7dv3MPu4mJgYg75pPz8/XL58GY6OjoiNjUVkZCQCA0Ph\n5VUBX3/dGSdPnkR8fDwUCmsQZeQSiPeiZMmqZtcjqzlz5kIQmho0e0skU/DFF23zdZ5169Zn9vkv\nAdFucFwrlC5dBenp6Vi6dDnc3ErAykqJSpVq4/jx429V1+wWLVoEQfgm28/iNWQypUFweV/OnTuH\nzZs352vt3+HDx0AU/cHzLjmOko6Pj0e1anVRvHjZHH9OWq0WjRu3zHwb3w+iRBAdhCDUQb16XxjM\nnX/+/Dk6dvwOHTr0MHtdb10Xjx2I+kKtdvwgzfxMwWKBmAGga1IzN4FAeno60tPT8dNPP4HjqkMu\nb4W2bb81KBMXFwdbW1dIJJOhyzq1AUR2CAgIQHx8PLRaLWQyOYheGnwoSyTtMWbMGINzNW3aGroV\nav754FYoSubZjJ7dkSNHsHbt2nx9CEdGRhoE4qZNm6Jx48aYPHkyatVqCEGoCqJ5INoHqXQKBMEF\nK1euhr9/IIxHyWYdpNMF48ZNzFf930hMTIS3d1lw3FcgWgW5vD+srV1w6dKlfJ2nSJFSINqbpV5a\nqFSBGDx4MATBC0QHQZQEomVQqZzyvRRmTv7J8nYzy7/5TAQF1Xnnc78vWq0WO3bsMNn6EhERkZma\n8gfUqpVzgo/09HT8+OMsODt7gUgOIluEhjbI1+9ibv7++2+MHDmKzR/+SLFAzOTLgQMHwPM2EEV7\nHD58GGPGTEDPngOMgvjkyVPBcV2yBaB1UKkK6z986tf/CjLZyCz7b4DjHIzy5V6/fh1SKQeioiDy\nB5EDgoJqm8zCpdFo8Mcff6BVq06oX78lpk//0ey3i+wGDhxoEIhbt24Nb29vTJw4GTJZMej6tT0y\n/9sFRAfB87ZYunQpBMEXRI9yCMS7YGWlxp07d96qToDuwWn48JFQKh0xYMDQfJ9Lq9VCIpHgn7zG\nui8rqwFwcfEB0VaD7QpFT4webd7o3rzMmTMPHGcHUfwaVlZBUKmcceXKlQI5d0FLTk7OczGFHTt2\ngOddIIqlMHDgiFzLTp8+HQpFKxDNR9Wq9QqyqsxHjAViJl90a6hOBdFodOvWy2S5Ll3+B6KZ2QLQ\nZXCco74JMjY2FsWKBUCtLg+1uhk4zhZz5843OtfgwaMgkfiAaB2IfgNRGTRuHJbjddPS0lC3bnOo\nVKVBNBtEqyAIX8POrjDOnj2b7/utX7++QSB2d3fH+vXroVA4QJe840HmvcWB6DsQlQfPt8CCBQsQ\nHj4ePF8IMtk4EB0G0S7wfGeoVE4IDg5GrVq1zG6FyMnJkydRpkwZ3LhxA4MGDUerVp2xatUqs/ta\nfXwqZHtrT4dKVRp2dkWQfRUgohno0uV/b13X7GJjY7F06VJMmDABXl5eZqVd/dDu3bsHe/vCUCis\nMXp07q0Xf//9N37//fc87+PRo0coVSoITk5F8eeffxZgbZmPGQvETL789tsmcJwtOM4WO3bsMFlu\n2bJlUCqDDPpJJZLRaNGivUE5jUaDPXv2YM2aNRgzZgK8vMpj6tQZ+v3Pnj0Dx9mA6GGWoPASSqVd\njm+B/foNgEzmBaKa0M3hjcqswy8GGbvM5ebmZhCIAwMDsWbNGhCVg/HUJC2IPgdRE33z+unTp9G+\nfXeUKBGI0qVrYMKEyYiLi0NGRgb69esHf39/3Lp1K191emPXrl2oUKECRNERcvlAEM2DKFbF5583\nM+s+d+zYAUFwhlQ6GUSrwfO1UbNmfbRv3w1WVv0NugJEsTw2btz4VvXMjVarRaVKlSw22vfKlStY\nsmQJ4uLijPatXLkSotgARPtQpEhADkebJzU19Z0euCIiZqFcuVoFklKW+XdigZjJtwcPHuSZ+adW\nrYaQSl1AVAZEEeD5drC3dzO5TNvTp08hlwsg2g25XKWfb3z69GlYWwcYNe9aW3+GXbt2GZxj8+bN\n0M0xHpbZ9/kLiCqDqBmIUqFSlclXBq6nT58aBGEiwokTJ9C0aRsQLcqhyRkgWgWZrAjWrl1r1jVm\nzZoFV1fXXJfHM2XNmjWwtfXIvM8310+DShVg9jzZU6dOoUOHHnBw8ESPHt/h9evXePjwYWb+73og\nGgCFwgtNmrQyWvO5oKxevRq1atUq0HOeOHECQ4YMy3VudXx8PFQqRwhCE3h6ljRKP/ro0SMUKlQM\nVlYcIiJmAdD19ebnYS42NhaOjh6QywX9OUxZsWIlOM4aZcpU1U99unPnDpRKexBFw8qK++QSoDA6\nLBAz74WDQxEQrYNS6YHGjb/E9OkzkJCQYLJ8amoqHBzcIQjNYG9fGCkpKQB0faE8bwei21mCTTyU\nSluDvrvExEQIgj2IjmULjGkgqg2iORDFjli8eLHZ97B//36DIGxvbw8AaNCgZbbgl/UrGlZWjmZ9\nYCYmJqJVq06wsuJBJIefXyXcvHnT7PrNnTsXEokCulG4WecoD8X48ePNPg+gW9Ix6yC5lJQUrFq1\nCmFhYahRo8Z7zZGdlpYGDw8Ps6aivXz5Ms/R1a9evcpcxnMgBMHO5JSsS5cugecLgWg7rKyUOQbY\n9PR0/fFbtmyBQiHC3r4wrl69asad6VqGdCPc96B48dzzPxctGgCiPyCKIVi9ejUA3cOgKDpAqWwL\nJyePf2UTPvPupMQw78G8eTPI3T2cmjWrQxs3rqX+/fuRvb29QZlBg0aSvb07DRw4ghQKBZ0+fYTm\nzGlGp08fJY7jiIhIrVZTePgIEsU6RLSAiJaSKH5G337bmVxcXPTnio6OJqm0BhEFZquJnIhGEtES\nkkrPUdGiRc2+h/Pnzxt8HxwcTEREzZuHkihGmThqOfXp05EUCkWe52/fvgf99ls6ZWTEEtFLuny5\nOVWoUJM0Go1Z9UtISCC12omIThhsF4Tj5OXlZdY53ihXrhydPn1a/z3HcdSmTRuaMWMGXbp0iQDk\n63z5IZfLqXfv3jRjxoxcy23dupUcHQuTo6MbnThxwmQ5jUZDGRnpRFScNJoMSk9Pz7FciRIlqG/f\nHuTjM4qWLFlMUqnxx6GVlRWp1WoiIvrhhwWUljaXXrxoQlFRpv79DdWpU4c47gTJ5c2oW7d2uZat\nXz+UBKEHSSRnqXLlykREZGdnR8eO7aNp0wLp+PEDOdaR+QRY+kmA+TRMm/YjChXyRt++Q816e3ry\n5AmsrAQQnYVcLuaZsWj79u1o1qwtGjVqhQ4dukImU8DDo4S+CXvixImQSoeYeEt9CCJ7FCpU3KB5\n9fDhw6hevQEGDRqZ45tGcHCwwRvxxIm6ATtJSUlwdfWCTDYJRKn6N2+JZDocHYvomxVz8+zZs8wk\nDNmnb/miZcuWZr359O3bF23atIUgFIVuIFsM5PLv4elZMt9zSa9cuQJPT88c9xUtWhRz587FH3/8\n8dajz/Py/Plz2NnZ4e7duybLNGrUGkRzQTQIgwYNzfV8W7ZsQcOGrRAdvaHA6jh//iJwnD0Ewc4o\nv3lsbCwaN26Ntm2/NXoDT0lJyfP3G9D1lx8/fhwPHz4ssDozHwcWiJl3lpKSkjkn+CiUSgezmlfT\n0tIy+yGrwM3NJ1/zKd3d/UF0EKL4OX79VTeARZexKcREIN4EqdT4w7NIkZIgmglRNM49HB8fDysr\nqyyBWEThwn769Zzv3LmDoKA64HkX2NiEgOddUbFiLZN94NnFxsaC4xyhy6/9T13V6vrw9/dHWFiY\nvnnelHbt2mHZsmXYvHkzihUrA1F0RY8efcz60M8uIyMDoigaBNonT56gefM2kMlEcFwt2NiEgONs\n0anT9+8le1Pfvn0xaNAgk/s3bNgIpVINnrc1K01pRkYGFi9ejIULF5ocSX716lWj/Oi5uX37tkG+\n9DdateoEqbQ7FIomGD/+7eaHM/9dLBAz70yj0cDTsyRE8TPY27vp80nn5enTp4iMjER4eLhBSsu8\nDBkSDqXSHnZ2rvokE69fv4adXWEYJ9F4Drm8JObMmWN0nsDAECgULSAIzkaLR/Ts2TPbQK2aIJpp\ntDTktWvXsHPnznzPg9VqtfD2LgeilVnqeg48b4uHDx+idevWqFatWo4f+m80bNgQmzdvBqCbn9qv\nX7981SG7qlWrYt++fQB0b6jFipWCXN4fRM9AdAW66Vm+ICqMwoW98pxfm1+3bt2Cvb19rmk2nz59\nanYazqlTI8DzFcHzQRg71jg4Xr58OXPFsIoG+Z6z02q1aNv2W3CcNfr0GZJjmT59BoPjgiEIpbFw\n4cJc63Xnzh14eZWBg4N7vn7vmU8XC8RMgUhISMD69evzvfyal1cZWFm1B88bJ/LIza1bt4wC/tGj\nRzPX/v0aREsglY6DIHjg22975dhc/uTJE0yfPh179uzRbzt27BjKlq0B3UIU6iyBWA1RrITOnQtu\nLu3JkydhY1MIRNWgUrUAx9nqp6hoNBoMGTIEPj4+uH79eo7HBwUF4dChQwCA0aNHIzw8HIAucJw7\ndw4nTpzI8606qx49emDWLN3I3vDwcVAq22Y+IBwAkROIwkF0GkSHQNQGtraFCzwYh4WFYebMmQbb\nkpKScPr06Xznou7ffwisrFrDyqodevQwXlRi48aNEMUgEK2Hm1sJk+e5efMmlEoHEN2EVCrP8UHz\n9evXmDNnDiIjI5GRkYHly5djypSpOZYdN24cZLLOIJqN0NAv8nVPzKeJBWLGIu7fv4/ExETY2rqC\naD4EwQMxMTH5Pk9ycjKuXr2qD7RPnz7FjBkz8dVXHfDdd30Ncv++ePEi1/7rq1evQhQdQbQUuoxY\nG/TB2M/PD+vXr8+zCf358+dm9RG/sWLFClSoUAHLly/PcS7r/PnzUahQIX2TeFbe3t64fPkyAKB/\n//6IiIjA5s2bUbiwL0SxOKyty0ClcsLYsZPN6refP38+OnXqBABwcPDIDLoaEPnk0NIAEA1Ay5Yd\ncj1nRkYGWrXqBCenYli8eJnRfo1Ggx49+sHHpyKiozfgyJEj8PT01PflJyUlwd3dF4JQBCEhTXK9\nllarNRhRnZCQgLCwDvjii29ybK5PSUlB/fpfoVAhb2zYYHqOdEpKCtzdfSGKpVCyZOU8f5arV6+G\nIPhDoWiU4+ISe/bsAc87QBDcERExM4czMP81LBAzH9yUKdOhUNjA2toZK1euRI0aDTFp0g9G5R49\nepRrsouEhAQUKlQMHOeMdu2653rNli07QiqVo2rVUJNvVt9/3w9WViOyBZv5IBLRpUveSxbu2bMH\nHGcDjrM2muNsSufOnTF79uxcy/z+++9wdHREdHS0wXY7Ozt903XXrl3Rp0+fzOk4f4BoH4h2gugE\nBKEyhg0bnWddjh49ivLlyyMtLQ0SiRS6BCWHQFQKptZVVihUuQ4MO3jwIETRF0R7IIr2RvsPHToE\nUfQGUTSsrV0AANWqVcO6desA6OY5C0IRED2ARCI1GQSTkpLg718JEokMw4aNybFMfmi1WoNrvXjx\nAvv37zerb/znn38Gx9WCVNoL9eu3yLHM1atX33o9aubTwwIx88GVKBEIou3g+a9M9qcdOnQIPG8H\njrM3eJO6evUqwsI6YNy4ydi5cydUqnIgugyVytHk9VJSUkAkAdELcJyL/i0yu/r1w7L12QK61XKs\n8eOPP+Z5X507fw+iCSCanONqVNlptVq4ubmZ1b8cExMDNzc3fT0yMjIgk8n0b46tWrWCh0dJEPUB\nUWEQVQDRZyCyBVF3KJU2eb6pJycng+d5vH79GgqFAKLHINoIoiYmBsEBSqUd4uPjTZ7zwYMHUKud\nIIpBqFr1c6P9d+7cgSg6QBDqonz5mgB0az9XrVoVSUlJOHXqFD77rBEkEonJ/lkA2L17N1Sq8nn+\nLgDAmTNnUK/eVxg8eFSOo9OvXLkCZ+eiEEW7HNNQPn78GFOnTjWZWe7169f43/8GoHnztu+UT5z5\n72CBmPng5s9fBCsrDk5ORUyu6BMePhoSSU8QLURo6Jf67RUq1IJEMgiiGIBff/0VpUoFQiKRYfjw\nsbleMzS0GRQKO5QsWdnkCNmffpoDQWiQbSRzBxBZYffu3Xne1759+8DzujfivDJ4vXr1Cps3b0bR\nokXNTpZx+/ZtlCxZEr1790ZcXBzs7Oz0+z7//HNIpQoQuYPoeJb6PwJRHcjlXmatVuXn54czZ85k\njgKeDKKrIHKG8Vq6ANFZ2NoWzjPj1u3bt7F582aTb5Pnz59HZGSkfsT2vXv3YGNjA2tra3h7eyMj\nI8MoYMbFxeHMmTP6n52udaQ4OM4pz2UuS5YMAtE4iGLpHFNrjhw5KvN3bw7q1zfOaV65cm3I5a0g\nCC5v1Z3CMNmxQMxYRFJSUq6Dby5dugR7+8JQKlUGa8DWrNkAVlbtIAjFsHPnTmi1WoOm0djYWHTv\n3hszZswyCHAajQa3bt3KtY/36dOncHIqBpmsYuabbU0QCSCiPFN6Zr2vpKQkfV02bdpkNMo3KSkJ\nRYv6w8rKEe7upgcJ5eTZs2eoVq0agoODUbx4cf32KlWqgMgaRJtyCJgJIBKwcuXKPM/fqlUrrFix\nAufPn4cgOILoLxA1BNHAbM3TyeD52jmORn4XiYmJUKlUyDpiPXuO6ytXrkClcgTPu6Ffv2H67cnJ\nybh+/XqeDzY1azaAXN4SguCW46jlP//8EzxvD45zwoIFxpnYihYtBaIIiKKf2alEGSY3LBAz/1pa\nrdbobevRo0cYNmwkfvnllxyPqVWrEWSybhCEUkZ9qnmZOXMmlMrPIJHUAZFSHwicnJwMyj179gw/\n/fSTfqpPThISEmBrWwgqVTWUKVPVYN/JkychCJ4gepRrv+cb9+/fh59fJTg6FsG+fftQp04dfd3s\n7HTNpyVKlIBunduMHAIxQFQTq1atyvH88+cvglzOo0yZqhg9ejT69+8PQNfcq2tWDgWRN4gCQDQe\nRAPAcYURFtbe4GEqOTkZTZq0hp9fIA4fPpzrPeWmY8eOyDpa3c7OA9u2bdPvj4yMzGy52A4vr/Jm\nn/fatWuYPn06Dhw4gMmTJ+e60MTdu3dNdhkcO3YMn33WBMOHj3mvqT+Z/w4WiJlPii4Qf/tWgVi3\nhnAZWFnVh276ki4Y1K5tOHe4Ro364Lgm4Hkno/nHb/wzyOgIZDKFwQd2WloaqlSpAyIJunbtCUDX\n79izZ39MmRJh9PAxdepUyOXfgGguatZshAoVKhi8Mfbo0QNElJl3+pWJvtzqJpumXV19QLQPolgT\nI0aMQEhIiH5fcnIylixZgjZtuqJOnQZo3LgZhg0bgdOnT5v4+YWAaDbKlKlh3g8dwNq161C6dA2M\nGTMJgK4PV/fzDwDRryBaDI4rhhkzdIPa4uPj4etbHnI5jxUr8n7LB3Q/czs7VygUHaFSOZici6zV\nas2eB88wBYUFYuaTcv/+ffTo0ceoaRrQDfTavn27wVtcTEwMQkKaYfDgUUhPT8eiRYtQp06oQaDr\n1ctw3WVd0+RPEMXSBm9qWWk0GnTo8B2cnIph9uyfjfbv2LEDVav+86bcpEnrzCb3CoiMjDQo+9df\nf4HnHSEInhg7djLc3d1hmGzkzZcKOa8KdQOCYK9vMs+uS5eeEISisLZ2xvHjx2Fvb4/ExESzm+Pf\nOHjwIHjeGYJQxWDaTlpaGho3bgV7e3ejKUwajSZzYNgG8HwhXLx4EdeuXYNUaguipCz3cBUqlaPB\nvOj8vI0mJSVlru4VBYXCOsd7S0tLQ1BQCKRSqzxH4TNMQWKBmPmkbNu2DRUq1MaoUeMNPqgvXLiQ\nmUWpLFq37qzf7uNTAUSTIYoB2Lp1KwCgRYsWBgFuwYIFuHz5Ml68eAFAF3ACA0PRs+dAaDQavHz5\n0mSQy+7+/fsYNmwYwsLCMGrUKP12XSBuD0GoiOXLlxsdd/nyZRw5cgSrV/+a+bZYD0RBIOKzBWMB\nRMuhy4GtBdEBCEIJTJs2w+icb2g0Gpw8eRK7du1C06ZNM6cuKVCqVGmjKTbh4RNRtGhp/PjjTzme\n6+jRo1izZo3BgLi9e/dCFANAtBc2NoUMymu1WhQp4geOC4MoOuDRo0fYuHFjZtOz4QOFSlUM165d\nAwBMmDANZcrURFTUurx/6Jl++WUVKlWqg3nzch6pf+7cOfC8G3SZxCjfCUQY5m2xQMx8UtRqJxCt\ngCAUMQgia9euhSjWBFEUPD1L67dXr14PcnkYBMEVR48ezQwMRQyCW/PmrcFxLrC3dzPKJLVt2zZ9\n/mNz+kXHjh2rPy/P8xg2TDfYKC4uDt9/3xeTJk0zOQr56dOn4DhbEJ3NEqCWZb4JZw3GDtCty2wN\nV1cfLF68VH+OZ8+eYeHChUYBNiUlBaGhTTIDe3sQTQfREPB8ERQpUgJjxozB7t27oVTagugvyGRK\ns5twY2NjM/uay6NOnWZG+x88eIC5c+fi7NmzAHQtFxznDKLkLPd5HaLogFevXuHKlSuZ+6Mhl/P6\nEdXx8fG4cOGC0Zvy/fv30bFjD4SHj891hHdKSgp8fctDqXRA/fpfmXVvDFMQWCBmPim6D9KW4Hl7\n3L59W789OTkZtWs3gYtLcfz22z+DdJ48eYKpU6di27ZtyMjIQKNGYSByA1EvEFUCkQB7ew8QHYdK\nVR2//fabwfW+/LIdiGaCaDh69x6Qa92GDx8DmcweRN1AVBdEHL777juT5V+/fo1t27bp7yM6Ohpq\ndfY3RU1m0M3+VlwVVlYqfPllW8yfv0A/dahy5drg+YYQBAf9YKSMjAyEhDQGx30FohdZzn0fRH4g\nqgKi9uC4QlAo7MDzDeDqWtxkUNNqtdi6dStWr16tL3P37l388ccf+hHuaWlpOHr0qMnVnL7+ujNE\nsRqI1oNoOUTRB1On6t7qHz9+nLlGbyu4uflAq9Xixo0bsLZ2Bs+7om9fw5WZ6tb9MnMAX6UcWxuy\nSk1Nxc2bN9m6v8wHxQIx80l5+PAhZs2aZbTSkjmio6PB8+VAlJIlGHVHYGAtSKUy+PqWN0qK8fvv\nvxu9EWs0GvTqNQjly9fSzye+ePEieN4ZuiQZb849F/7+lU3Wp169LyGKFaBSOeLOnTvYtWsX1OrK\n2QLxbRBZwbi/mAdRCxD9DJ6vDz+/ikhMTISTkyeIIiGKfvq6rV+/HqJYCURp2c7dHkRDs3z/DDzv\niVGjRuH27dvYv38/nj59alTvVatWQRC8IAgVMWTIKKP9ABAS0gSi6ANn56I5BuM3KydVq1YfRYoE\noGhRf4NpbGfPnsWcOXMQGxsLAFi5ciVEsS6I9qJo0dIG59I1+38NQQjA6tWrTf68GcZSWCBmmEwd\nO/bIfLvNGozOwNXVF2lpaSYHBz1//tygmXb37t0QRX8QLYKrqzcAYPbs2eC4b7OdOxUSicxkX6Tu\nTfwPqFTlsGPHDqSnp8PNzQdS6TToEmzsgy4XduPMN3g7WFs7Qjf1qm+W62jB880wc+Ys/PHHHwgI\nqIb//W+A/q2vcuUQEK026pPVLfRw12CbRDICw4aNQFBQCESxJFxcPI1GII8bNx5yeRgkkoFo3rxt\njvcml/MgugRR9MaxY8dM/pvs27cvM0VmJBwcPEyWS0hIgLd3WchkCixatNRgX3x8PAYPHo6ffprL\n3nSZfyUWiBkm0/Dh4VAo+mULRpvNnopz48YNLFiwALt27YIgOILjmiAwUDcVaM2aNVCp6mY7t67f\nM/ugMmdnT9jZFcaYMePg6FgUjRq11A9+unHjBoKC6sDKiocugcf8LOeLh0LhmLnO8dFs11qBxo2/\nzrHeSqUKRM9zCMQljM6jUHTEDz9EZA7ougJB8MDZs2eRnJysf6BISEhA/fotULVqXZMrR40ZMwkK\nhYDQ0Gb6JCurVq1Gv36DDNJCXrt2DYLgAI5rjAoVgvP8N2CBlvkYsUDMMJlu3bqVufrSyszm6SMQ\nBC9ERUXleWxycjJsbQuB51vAwUGXsennn3/WN92+evUKzs5FIZVOBdFLEG2CTFYEzZsbLgrQq1d/\nEA0C0SS0bNnR5PWePn0KiURm1JysUHSFv385EM3Jtr0fBg0anuO5dNN6XuYQiGeDqCKILoMoHUS/\ngOft8ejRI4waNR48b4Pmzdtg8eJlkMt5ODq6G/TLv5GYmIgVK1bkOPf4jUOHDkEQPCCVdkfZstUN\n9p04cQLz589HQkKCyeMZ5mPGAjHDZHH48GGULVsDUqkVXF19sGTJMrOOi4uLg0KhBtE2WFnx+qlO\nWV2/fh0hIU0hk8khkahANBQ874zz58/ry2zZsgU87wCed0ZkZM7ZwwDdEt0VhwAABAJJREFUgCiV\nyhFE1wyCp1odikmTJkEQnEC0BEQXIZFMhbW1C+7evZvjuQICqiLn1JhaEE2BLte0FSQSmxwXOihd\nugaINoHjvsacOXOM9gcHN4QghEAQHEwuuLF3714IgheIhsHPr5LJ+2aYTxELxAxTQKZPnwU/vyD8\n/POCPMu6unqBaAR43sUgEAO65thLly4ZHdO//3DwvC3atesGrVaL8PDxEISq0E1nSoBUOgGFChXH\n69evcejQIdSq1Riurr5o1qxNjud7Y8WKFRDFWjBc7MIwIEsk4/DFFzn3986YMRsKhQ3UaqccA22h\nQl4gWglRLGMw4CorrVaLGTNmo3Xrzrh48WJuPzqG+eRIAIAYhvmgzp49SzNnzqfQ0GBq06Z1nuWT\nk5PJ2tqWtNrLpFQG0uXLMVSkSBGaNOkHmjlzLiUmJlDt2g1o/vwI8vT0zFdd0tLSKCgohC5dKkOp\nqbOJyCpbiTWkVvehmJiD5OPjk+M5Hjx4QGq1mtRqtdG+7du3U9++4VSlSiVaunQOyWSyfNWPYT51\nLBAzzEdAq9VSQEAQ3buXSjY2r+n69bPEcVyBnf/FixfUvHlb+vvv05Sa2oU0mhJElEBq9S+kUj2l\n7dujqWzZsgV2PYZh/sECMcN8JF69ekXHjx+ncuXKkY2NzXu5xtmzZ2nRoki6efM+2dqqqU2b5lS/\nfn32Fssw7xELxAzDMAxjQVJLV4BhGIZh/stYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEY\nxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEY\nhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEY\nhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYY\nhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZ\nhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVi\nhmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KB\nmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJY\nIGYYhmEYC2KBmGEYhmEsiAVihmEYhrEgFogZhmEYxoJYIGYYhmEYC2KBmGEYhmEs6P/+f/9VpnJU\ndAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import networkx as nx\n", "import random\n", "def draw_graph(g,layout_func=nx.spring_layout):\n", " pos = layout_func(g)\n", " d = nx.degree(g)\n", " n_sizes = [v * 25 +5 for v in d.values()]\n", " nx.draw(g, nodelist=d.keys(), node_size=n_sizes, node_color='blue')\n", "\n", "# Selecting only sample of vertices with degree greater than 0\n", "d = nx.degree(nx_g) \n", "v_list = [v for v in d.keys() if d[v] >0]\n", "h = nx_g.subgraph(v_list[:500])\n", "draw_graph(h)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## 5. Where to Go from Here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The social network dataset created as a result of our study opens the door for new and exciting research opportunities. This dataset can help not only to better understand the social structure of the Reddit community in particular, but also to understand how social networks and online communities evolve over time. Moreover, this corpus can be used as a ground-truth dataset for many studies in the field of social networks. Some examples of what can be done with this corpus are:\n", "* Understanding topological factors that may help a post to go viral.\n", "* Helping to better understand diffusion models and also assisting in validating diffusion models using real-world data.\n", "* Using this dataset as an excellent ground-truth dataset for evaluating entity-matching algorithms, based on our observation that many redditors are members in several subreddits.\n", "* Helping understand the connection between content and social networks; for instance, this dataset can provide insight on what type of content makes users more likely to interact with each other.\n", "\n", "We would love to hear other ideas on what possible work can be done with our provided datasets." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Further Reading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Further reading material:\n", "* [I have every publicly available Reddit comment for research ~ 1.7 billion comments @ 250 GB compressed. Any interest in this?](https://www.reddit.com/r/datasets/comments/3bxlg7/i_have_every_publicly_available_reddit_comment/)\n", "* [Navigating the massive world of Reddit: using backbone networks to map user interests in social media](https://peerj.com/articles/cs-4/)\n", "* [Don't feed the troll: Shutting down debate about community expectations on Reddit.com](http://firstmonday.org/ojs/index.php/fm/article/viewArticle/3498/3029)\n", "* [GraphLab Create User Guide](https://turi.com/learn/userguide/)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 0 }