├── .gitignore ├── LICENSE ├── README.md ├── backend ├── Dockerfile ├── poetry.lock ├── pyproject.toml ├── server │ ├── __init__.py │ ├── app.py │ ├── setup.py │ └── templates │ │ └── index.html └── tests │ ├── __init__.py │ └── test_backend.py ├── docker-compose.yml ├── frontend ├── .dockerignore ├── .gitignore ├── Dockerfile ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt └── src │ ├── App.css │ ├── App.js │ ├── App.test.js │ ├── components │ ├── CommunityDetection.js │ └── PageRank.js │ ├── index.css │ ├── index.js │ ├── logo.svg │ ├── reportWebVitals.js │ └── setupTests.js ├── img ├── karate-club-graph.png ├── karate-club-matplotlib.png ├── memgraph-tutorial-community-detection-stream.gif ├── memgraph-tutorial-pagerank-stream.gif ├── stream-processing-arc-01-01.png └── twitter-dataset-01.png ├── memgraph ├── Dockerfile ├── procedures │ ├── link_prediction.py │ └── publisher.py ├── requirements.txt └── transformations │ └── twitter.py ├── run_kafka.sh ├── run_pulsar.sh └── stream ├── Dockerfile ├── data ├── scraped_tweets.csv └── scraped_tweets_old.csv ├── produce.py └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # dependencies 114 | /node_modules 115 | /.pnp 116 | .pnp.js 117 | 118 | # Spyder project settings 119 | .spyderproject 120 | .spyproject 121 | 122 | # Rope project settings 123 | .ropeproject 124 | 125 | # mkdocs documentation 126 | /site 127 | 128 | # mypy 129 | .mypy_cache/ 130 | .dmypy.json 131 | dmypy.json 132 | 133 | # Pyre type checker 134 | .pyre/ 135 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 g-despot 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 🔍 Twitter Network Analytics Demo 🔍 3 |

4 | 5 |

6 | 7 | license 8 | 9 | 10 | build 11 | 12 |

13 | 14 |

15 | 16 | Follow @memgraphdb 17 | 18 | 19 | Discord 20 | 21 |

22 | 23 | A web application with backend in Flask and frontend in React and D3.js that 24 | uses Memgraph to ingest real-time data scraped from Twitter. Data is streamed 25 | via [Apache Kafka](https://kafka.apache.org/) or [Apache 26 | Pulsar](https://pulsar.apache.org/), and stream processing is performed with 27 | Memgraph. 28 | 29 | ## App architecture 30 | 31 |

32 | memgraph-tutorial-twitter-app-architecture 33 |

34 | 35 | ## Data model 36 | 37 |

38 | memgraph-tutorial-twitter-pagerank-graph-schema 39 |

40 | 41 | ## Prerequisites 42 | 43 | You will need: 44 | 45 | - [Docker](https://docs.docker.com/get-docker/) 46 | - [Docker Compose](https://docs.docker.com/compose/install/) (included with 47 | Docker Desktop on Windows and macOS) 48 | 49 | ## Running the app 50 | 51 | ### With a bash script 52 | 53 | You can start everything but the frontend client by **running the bash script**: 54 | 55 | ``` 56 | bash run_kafka.sh 57 | ``` 58 | 59 | If you want to run the app with Apache Pulsar, use the script `bash 60 | run_pulsar.sh`. After that, in another window, run the frontend app with: 61 | 62 | ``` 63 | docker-compose up frontend-app 64 | ``` 65 | 66 | The React application will be running on `http://localhost:3000`. 67 | 68 | ### Manually using Docker Compose 69 | 70 | If you want to start the app **without using the bash script**, then: 71 | 72 | **1.** Remove possibly running containers: 73 | 74 | ``` 75 | docker-compose rm -fs 76 | ``` 77 | 78 | **2.** Build all the needed images: 79 | 80 | ``` 81 | docker-compose build 82 | ``` 83 | 84 | **3.** Start the **Apache Kafka** and **Memgraph MAGE** services: 85 | 86 | ``` 87 | docker-compose up -d kafka 88 | docker-compose up -d memgraph-mage-kafka 89 | ``` 90 | 91 | **4.** Start the data stream: 92 | 93 | ``` 94 | docker-compose up -d stream-kafka 95 | ``` 96 | 97 | **5.** Start the backend application: 98 | 99 | ``` 100 | docker-compose up backend-kafka 101 | ``` 102 | 103 | **6.** Start the frontend application in a new terminal window: 104 | 105 | ``` 106 | docker-compose up frontend-app 107 | ``` 108 | 109 | The React application will be running on `http://localhost:3000`. 110 | 111 | ## The visualization 112 | 113 | **Dynamic Community detection**: 114 | 115 |

116 | 117 |

118 | 119 | ![memgraph-tutorial-community-detection](https://raw.githubusercontent.com/memgraph/twitter-network-analysis/main/img/memgraph-tutorial-community-detection-stream.gif) 120 | 121 | **Dynamic PageRank**: 122 | 123 | ![memgraph-tutorial-pagerank-stream](https://raw.githubusercontent.com/memgraph/twitter-network-analysis/main/img/memgraph-tutorial-pagerank-stream.gif) 124 | -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9 2 | 3 | # Keeps Python from generating .pyc files in the container 4 | ENV PYTHONDONTWRITEBYTECODE 1 5 | 6 | # Turns off buffering for easier container logging 7 | ENV PYTHONUNBUFFERED 1 8 | 9 | # Install CMake for gqlalchemy 10 | RUN apt-get update && \ 11 | apt-get --yes install cmake && \ 12 | rm -rf /var/lib/apt/lists/* 13 | 14 | # Install poetry 15 | RUN pip install -U pip \ 16 | && curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python 17 | ENV PATH="${PATH}:/root/.poetry/bin" 18 | 19 | WORKDIR /app 20 | COPY . . 21 | RUN poetry config virtualenvs.create false && \ 22 | poetry install --no-interaction --no-ansi 23 | 24 | ENV FLASK_ENV=development 25 | ENV LC_ALL=C.UTF-8 26 | ENV LANG=C.UTF-8 27 | -------------------------------------------------------------------------------- /backend/poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "atomicwrites" 3 | version = "1.4.0" 4 | description = "Atomic file writes." 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 8 | 9 | [[package]] 10 | name = "attrs" 11 | version = "21.2.0" 12 | description = "Classes Without Boilerplate" 13 | category = "dev" 14 | optional = false 15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 16 | 17 | [package.extras] 18 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] 19 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 20 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 21 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 22 | 23 | [[package]] 24 | name = "certifi" 25 | version = "2021.10.8" 26 | description = "Python package for providing Mozilla's CA Bundle." 27 | category = "main" 28 | optional = false 29 | python-versions = "*" 30 | 31 | [[package]] 32 | name = "click" 33 | version = "8.0.1" 34 | description = "Composable command line interface toolkit" 35 | category = "main" 36 | optional = false 37 | python-versions = ">=3.6" 38 | 39 | [package.dependencies] 40 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 41 | 42 | [[package]] 43 | name = "colorama" 44 | version = "0.4.4" 45 | description = "Cross-platform colored terminal text." 46 | category = "main" 47 | optional = false 48 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 49 | 50 | [[package]] 51 | name = "dnspython" 52 | version = "1.16.0" 53 | description = "DNS toolkit" 54 | category = "main" 55 | optional = false 56 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 57 | 58 | [package.extras] 59 | DNSSEC = ["pycryptodome", "ecdsa (>=0.13)"] 60 | IDNA = ["idna (>=2.1)"] 61 | 62 | [[package]] 63 | name = "eventlet" 64 | version = "0.30.2" 65 | description = "Highly concurrent networking library" 66 | category = "main" 67 | optional = false 68 | python-versions = "*" 69 | 70 | [package.dependencies] 71 | dnspython = ">=1.15.0,<2.0.0" 72 | greenlet = ">=0.3" 73 | six = ">=1.10.0" 74 | 75 | [[package]] 76 | name = "flask" 77 | version = "2.0.1" 78 | description = "A simple framework for building complex web applications." 79 | category = "main" 80 | optional = false 81 | python-versions = ">=3.6" 82 | 83 | [package.dependencies] 84 | click = ">=7.1.2" 85 | itsdangerous = ">=2.0" 86 | Jinja2 = ">=3.0" 87 | Werkzeug = ">=2.0" 88 | 89 | [package.extras] 90 | async = ["asgiref (>=3.2)"] 91 | dotenv = ["python-dotenv"] 92 | 93 | [[package]] 94 | name = "flask-cors" 95 | version = "3.0.10" 96 | description = "A Flask extension adding a decorator for CORS support" 97 | category = "main" 98 | optional = false 99 | python-versions = "*" 100 | 101 | [package.dependencies] 102 | Flask = ">=0.9" 103 | Six = "*" 104 | 105 | [[package]] 106 | name = "flask-socketio" 107 | version = "4.3.1" 108 | description = "Socket.IO integration for Flask applications" 109 | category = "main" 110 | optional = false 111 | python-versions = "*" 112 | 113 | [package.dependencies] 114 | Flask = ">=0.9" 115 | python-socketio = ">=4.3.0" 116 | 117 | [[package]] 118 | name = "gqlalchemy" 119 | version = "1.1.5" 120 | description = "GQLAlchemy is library developed with purpose of assisting writing and running queries on Memgraph." 121 | category = "main" 122 | optional = false 123 | python-versions = ">=3.7,<4.0" 124 | 125 | [package.dependencies] 126 | networkx = ">=2.5.1,<3.0.0" 127 | pydantic = ">=1.8.2,<2.0.0" 128 | pymgclient = "1.2.0" 129 | 130 | [[package]] 131 | name = "greenlet" 132 | version = "1.1.1" 133 | description = "Lightweight in-process concurrent programming" 134 | category = "main" 135 | optional = false 136 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" 137 | 138 | [package.extras] 139 | docs = ["sphinx"] 140 | 141 | [[package]] 142 | name = "gunicorn" 143 | version = "20.1.0" 144 | description = "WSGI HTTP Server for UNIX" 145 | category = "main" 146 | optional = false 147 | python-versions = ">=3.5" 148 | 149 | [package.extras] 150 | eventlet = ["eventlet (>=0.24.1)"] 151 | gevent = ["gevent (>=1.4.0)"] 152 | setproctitle = ["setproctitle"] 153 | tornado = ["tornado (>=0.2)"] 154 | 155 | [[package]] 156 | name = "itsdangerous" 157 | version = "2.0.1" 158 | description = "Safely pass data to untrusted environments and back." 159 | category = "main" 160 | optional = false 161 | python-versions = ">=3.6" 162 | 163 | [[package]] 164 | name = "jinja2" 165 | version = "3.0.1" 166 | description = "A very fast and expressive template engine." 167 | category = "main" 168 | optional = false 169 | python-versions = ">=3.6" 170 | 171 | [package.dependencies] 172 | MarkupSafe = ">=2.0" 173 | 174 | [package.extras] 175 | i18n = ["Babel (>=2.7)"] 176 | 177 | [[package]] 178 | name = "kafka-python" 179 | version = "2.0.2" 180 | description = "Pure Python client for Apache Kafka" 181 | category = "main" 182 | optional = false 183 | python-versions = "*" 184 | 185 | [package.extras] 186 | crc32c = ["crc32c"] 187 | 188 | [[package]] 189 | name = "markupsafe" 190 | version = "2.0.1" 191 | description = "Safely add untrusted strings to HTML/XML markup." 192 | category = "main" 193 | optional = false 194 | python-versions = ">=3.6" 195 | 196 | [[package]] 197 | name = "more-itertools" 198 | version = "8.9.0" 199 | description = "More routines for operating on iterables, beyond itertools" 200 | category = "dev" 201 | optional = false 202 | python-versions = ">=3.5" 203 | 204 | [[package]] 205 | name = "networkx" 206 | version = "2.6.2" 207 | description = "Python package for creating and manipulating graphs and networks" 208 | category = "main" 209 | optional = false 210 | python-versions = ">=3.7" 211 | 212 | [package.extras] 213 | default = ["numpy (>=1.19)", "scipy (>=1.5,!=1.6.1)", "matplotlib (>=3.3)", "pandas (>=1.1)"] 214 | developer = ["black (==21.5b1)", "pre-commit (>=2.12)"] 215 | doc = ["sphinx (>=4.0,<5.0)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx-gallery (>=0.9,<1.0)", "numpydoc (>=1.1)", "pillow (>=8.2)", "nb2plots (>=0.6)", "texext (>=0.6.6)"] 216 | extra = ["lxml (>=4.5)", "pygraphviz (>=1.7)", "pydot (>=1.4.1)"] 217 | test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"] 218 | 219 | [[package]] 220 | name = "packaging" 221 | version = "21.0" 222 | description = "Core utilities for Python packages" 223 | category = "dev" 224 | optional = false 225 | python-versions = ">=3.6" 226 | 227 | [package.dependencies] 228 | pyparsing = ">=2.0.2" 229 | 230 | [[package]] 231 | name = "pluggy" 232 | version = "0.13.1" 233 | description = "plugin and hook calling mechanisms for python" 234 | category = "dev" 235 | optional = false 236 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 237 | 238 | [package.extras] 239 | dev = ["pre-commit", "tox"] 240 | 241 | [[package]] 242 | name = "pulsar-client" 243 | version = "2.10.0" 244 | description = "Apache Pulsar Python client library" 245 | category = "main" 246 | optional = false 247 | python-versions = "*" 248 | 249 | [package.dependencies] 250 | certifi = "*" 251 | six = "*" 252 | 253 | [package.extras] 254 | all = ["apache-bookkeeper-client (>=4.9.2)", "fastavro (==0.24.0)", "grpcio (>=1.8.2,<1.28)", "prometheus-client", "protobuf (>=3.6.1)", "ratelimit"] 255 | avro = ["fastavro (==0.24.0)"] 256 | functions = ["apache-bookkeeper-client (>=4.9.2)", "grpcio (>=1.8.2,<1.28)", "prometheus-client", "protobuf (>=3.6.1)", "ratelimit"] 257 | 258 | [[package]] 259 | name = "py" 260 | version = "1.10.0" 261 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 262 | category = "dev" 263 | optional = false 264 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 265 | 266 | [[package]] 267 | name = "pydantic" 268 | version = "1.9.0" 269 | description = "Data validation and settings management using python 3.6 type hinting" 270 | category = "main" 271 | optional = false 272 | python-versions = ">=3.6.1" 273 | 274 | [package.dependencies] 275 | typing-extensions = ">=3.7.4.3" 276 | 277 | [package.extras] 278 | dotenv = ["python-dotenv (>=0.10.4)"] 279 | email = ["email-validator (>=1.0.3)"] 280 | 281 | [[package]] 282 | name = "pymgclient" 283 | version = "1.2.0" 284 | description = "Memgraph database adapter for Python language" 285 | category = "main" 286 | optional = false 287 | python-versions = ">=3.6" 288 | 289 | [[package]] 290 | name = "pyparsing" 291 | version = "2.4.7" 292 | description = "Python parsing module" 293 | category = "dev" 294 | optional = false 295 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 296 | 297 | [[package]] 298 | name = "pytest" 299 | version = "5.4.3" 300 | description = "pytest: simple powerful testing with Python" 301 | category = "dev" 302 | optional = false 303 | python-versions = ">=3.5" 304 | 305 | [package.dependencies] 306 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 307 | attrs = ">=17.4.0" 308 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 309 | more-itertools = ">=4.0.0" 310 | packaging = "*" 311 | pluggy = ">=0.12,<1.0" 312 | py = ">=1.5.0" 313 | wcwidth = "*" 314 | 315 | [package.extras] 316 | checkqa-mypy = ["mypy (==v0.761)"] 317 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 318 | 319 | [[package]] 320 | name = "python-engineio" 321 | version = "3.13.2" 322 | description = "Engine.IO server" 323 | category = "main" 324 | optional = false 325 | python-versions = "*" 326 | 327 | [package.dependencies] 328 | six = ">=1.9.0" 329 | 330 | [package.extras] 331 | asyncio_client = ["aiohttp (>=3.4)"] 332 | client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] 333 | 334 | [[package]] 335 | name = "python-socketio" 336 | version = "4.6.0" 337 | description = "Socket.IO server" 338 | category = "main" 339 | optional = false 340 | python-versions = "*" 341 | 342 | [package.dependencies] 343 | python-engineio = ">=3.13.0" 344 | six = ">=1.9.0" 345 | 346 | [package.extras] 347 | asyncio_client = ["aiohttp (>=3.4)", "websockets (>=7.0)"] 348 | client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] 349 | 350 | [[package]] 351 | name = "six" 352 | version = "1.16.0" 353 | description = "Python 2 and 3 compatibility utilities" 354 | category = "main" 355 | optional = false 356 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 357 | 358 | [[package]] 359 | name = "typing-extensions" 360 | version = "4.1.1" 361 | description = "Backported and Experimental Type Hints for Python 3.6+" 362 | category = "main" 363 | optional = false 364 | python-versions = ">=3.6" 365 | 366 | [[package]] 367 | name = "wcwidth" 368 | version = "0.2.5" 369 | description = "Measures the displayed width of unicode strings in a terminal" 370 | category = "dev" 371 | optional = false 372 | python-versions = "*" 373 | 374 | [[package]] 375 | name = "werkzeug" 376 | version = "2.0.1" 377 | description = "The comprehensive WSGI web application library." 378 | category = "main" 379 | optional = false 380 | python-versions = ">=3.6" 381 | 382 | [package.extras] 383 | watchdog = ["watchdog"] 384 | 385 | [metadata] 386 | lock-version = "1.1" 387 | python-versions = "^3.9" 388 | content-hash = "1a6e0c3d332eeb9c12e2af3460fe15d401d4b3e6b42093dd1c390688338de72d" 389 | 390 | [metadata.files] 391 | atomicwrites = [ 392 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 393 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 394 | ] 395 | attrs = [ 396 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 397 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 398 | ] 399 | certifi = [ 400 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, 401 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, 402 | ] 403 | click = [ 404 | {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, 405 | {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, 406 | ] 407 | colorama = [ 408 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 409 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 410 | ] 411 | dnspython = [ 412 | {file = "dnspython-1.16.0-py2.py3-none-any.whl", hash = "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"}, 413 | {file = "dnspython-1.16.0.zip", hash = "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01"}, 414 | ] 415 | eventlet = [ 416 | {file = "eventlet-0.30.2-py2.py3-none-any.whl", hash = "sha256:89cc6dbfef47c4629cefead5fde21c5f2b33464d57f7df5fc5148f8b4de3fbb5"}, 417 | {file = "eventlet-0.30.2.tar.gz", hash = "sha256:1811b122d9a45eb5bafba092d36911bca825f835cb648a862bbf984030acff9d"}, 418 | ] 419 | flask = [ 420 | {file = "Flask-2.0.1-py3-none-any.whl", hash = "sha256:a6209ca15eb63fc9385f38e452704113d679511d9574d09b2cf9183ae7d20dc9"}, 421 | {file = "Flask-2.0.1.tar.gz", hash = "sha256:1c4c257b1892aec1398784c63791cbaa43062f1f7aeb555c4da961b20ee68f55"}, 422 | ] 423 | flask-cors = [ 424 | {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, 425 | {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, 426 | ] 427 | flask-socketio = [ 428 | {file = "Flask-SocketIO-4.3.1.tar.gz", hash = "sha256:36c1d5765010d1f4e4f05b4cc9c20c289d9dc70698c88d1addd0afcfedc5b062"}, 429 | {file = "Flask_SocketIO-4.3.1-py2.py3-none-any.whl", hash = "sha256:3668675bf7763c5b5f56689d439f07356e89c0a52e0c9e9cd3cc08563c07b252"}, 430 | ] 431 | gqlalchemy = [ 432 | {file = "GQLAlchemy-1.1.5-py3-none-any.whl", hash = "sha256:ede033e33eeb358981136660467d45099b1530015224d3f5a891aac369e158cc"}, 433 | {file = "GQLAlchemy-1.1.5.tar.gz", hash = "sha256:9f301b55873df696c2c99e2fdaf88db3056548d8b1efbc089bc7514d5b8f3af8"}, 434 | ] 435 | greenlet = [ 436 | {file = "greenlet-1.1.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:476ba9435afaead4382fbab8f1882f75e3fb2285c35c9285abb3dd30237f9142"}, 437 | {file = "greenlet-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:44556302c0ab376e37939fd0058e1f0db2e769580d340fb03b01678d1ff25f68"}, 438 | {file = "greenlet-1.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40abb7fec4f6294225d2b5464bb6d9552050ded14a7516588d6f010e7e366dcc"}, 439 | {file = "greenlet-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:a11b6199a0b9dc868990456a2667167d0ba096c5224f6258e452bfbe5a9742c5"}, 440 | {file = "greenlet-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e22a82d2b416d9227a500c6860cf13e74060cf10e7daf6695cbf4e6a94e0eee4"}, 441 | {file = "greenlet-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bad269e442f1b7ffa3fa8820b3c3aa66f02a9f9455b5ba2db5a6f9eea96f56de"}, 442 | {file = "greenlet-1.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ddb38fb6ad96c2ef7468ff73ba5c6876b63b664eebb2c919c224261ae5e8378"}, 443 | {file = "greenlet-1.1.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:84782c80a433d87530ae3f4b9ed58d4a57317d9918dfcc6a59115fa2d8731f2c"}, 444 | {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac991947ca6533ada4ce7095f0e28fe25d5b2f3266ad5b983ed4201e61596acf"}, 445 | {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5317701c7ce167205c0569c10abc4bd01c7f4cf93f642c39f2ce975fa9b78a3c"}, 446 | {file = "greenlet-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4870b018ca685ff573edd56b93f00a122f279640732bb52ce3a62b73ee5c4a92"}, 447 | {file = "greenlet-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:990e0f5e64bcbc6bdbd03774ecb72496224d13b664aa03afd1f9b171a3269272"}, 448 | {file = "greenlet-1.1.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:a414f8e14aa7bacfe1578f17c11d977e637d25383b6210587c29210af995ef04"}, 449 | {file = "greenlet-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:e02780da03f84a671bb4205c5968c120f18df081236d7b5462b380fd4f0b497b"}, 450 | {file = "greenlet-1.1.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:dfcb5a4056e161307d103bc013478892cfd919f1262c2bb8703220adcb986362"}, 451 | {file = "greenlet-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:655ab836324a473d4cd8cf231a2d6f283ed71ed77037679da554e38e606a7117"}, 452 | {file = "greenlet-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:6ce9d0784c3c79f3e5c5c9c9517bbb6c7e8aa12372a5ea95197b8a99402aa0e6"}, 453 | {file = "greenlet-1.1.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3fc6a447735749d651d8919da49aab03c434a300e9f0af1c886d560405840fd1"}, 454 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8039f5fe8030c43cd1732d9a234fdcbf4916fcc32e21745ca62e75023e4d4649"}, 455 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fddfb31aa2ac550b938d952bca8a87f1db0f8dc930ffa14ce05b5c08d27e7fd1"}, 456 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97a807437b81f90f85022a9dcfd527deea38368a3979ccb49d93c9198b2c722"}, 457 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf31e894dabb077a35bbe6963285d4515a387ff657bd25b0530c7168e48f167f"}, 458 | {file = "greenlet-1.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eae94de9924bbb4d24960185363e614b1b62ff797c23dc3c8a7c75bbb8d187e"}, 459 | {file = "greenlet-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:c1862f9f1031b1dee3ff00f1027fcd098ffc82120f43041fe67804b464bbd8a7"}, 460 | {file = "greenlet-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:9b02e6039eafd75e029d8c58b7b1f3e450ca563ef1fe21c7e3e40b9936c8d03e"}, 461 | {file = "greenlet-1.1.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:84488516639c3c5e5c0e52f311fff94ebc45b56788c2a3bfe9cf8e75670f4de3"}, 462 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3f8fc59bc5d64fa41f58b0029794f474223693fd00016b29f4e176b3ee2cfd9f"}, 463 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3e594015a2349ec6dcceda9aca29da8dc89e85b56825b7d1f138a3f6bb79dd4c"}, 464 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e41f72f225192d5d4df81dad2974a8943b0f2d664a2a5cfccdf5a01506f5523c"}, 465 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ff270fd05125dce3303e9216ccddc541a9e072d4fc764a9276d44dee87242b"}, 466 | {file = "greenlet-1.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cde7ee190196cbdc078511f4df0be367af85636b84d8be32230f4871b960687"}, 467 | {file = "greenlet-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:f253dad38605486a4590f9368ecbace95865fea0f2b66615d121ac91fd1a1563"}, 468 | {file = "greenlet-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a91ee268f059583176c2c8b012a9fce7e49ca6b333a12bbc2dd01fc1a9783885"}, 469 | {file = "greenlet-1.1.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:34e6675167a238bede724ee60fe0550709e95adaff6a36bcc97006c365290384"}, 470 | {file = "greenlet-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf3725d79b1ceb19e83fb1aed44095518c0fcff88fba06a76c0891cfd1f36837"}, 471 | {file = "greenlet-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5c3b735ccf8fc8048664ee415f8af5a3a018cc92010a0d7195395059b4b39b7d"}, 472 | {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2002a59453858c7f3404690ae80f10c924a39f45f6095f18a985a1234c37334"}, 473 | {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e1849c88aa56584d4a0a6e36af5ec7cc37993fdc1fda72b56aa1394a92ded3"}, 474 | {file = "greenlet-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8d4ed48eed7414ccb2aaaecbc733ed2a84c299714eae3f0f48db085342d5629"}, 475 | {file = "greenlet-1.1.1-cp38-cp38-win32.whl", hash = "sha256:2f89d74b4f423e756a018832cd7a0a571e0a31b9ca59323b77ce5f15a437629b"}, 476 | {file = "greenlet-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:d15cb6f8706678dc47fb4e4f8b339937b04eda48a0af1cca95f180db552e7663"}, 477 | {file = "greenlet-1.1.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b050dbb96216db273b56f0e5960959c2b4cb679fe1e58a0c3906fa0a60c00662"}, 478 | {file = "greenlet-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e0696525500bc8aa12eae654095d2260db4dc95d5c35af2b486eae1bf914ccd"}, 479 | {file = "greenlet-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:07e6d88242e09b399682b39f8dfa1e7e6eca66b305de1ff74ed9eb1a7d8e539c"}, 480 | {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98b491976ed656be9445b79bc57ed21decf08a01aaaf5fdabf07c98c108111f6"}, 481 | {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e72db813c28906cdc59bd0da7c325d9b82aa0b0543014059c34c8c4ad20e16"}, 482 | {file = "greenlet-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:090126004c8ab9cd0787e2acf63d79e80ab41a18f57d6448225bbfcba475034f"}, 483 | {file = "greenlet-1.1.1-cp39-cp39-win32.whl", hash = "sha256:1796f2c283faab2b71c67e9b9aefb3f201fdfbee5cb55001f5ffce9125f63a45"}, 484 | {file = "greenlet-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4adaf53ace289ced90797d92d767d37e7cdc29f13bd3830c3f0a561277a4ae83"}, 485 | {file = "greenlet-1.1.1.tar.gz", hash = "sha256:c0f22774cd8294078bdf7392ac73cf00bfa1e5e0ed644bd064fdabc5f2a2f481"}, 486 | ] 487 | gunicorn = [ 488 | {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, 489 | {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, 490 | ] 491 | itsdangerous = [ 492 | {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, 493 | {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, 494 | ] 495 | jinja2 = [ 496 | {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, 497 | {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, 498 | ] 499 | kafka-python = [ 500 | {file = "kafka-python-2.0.2.tar.gz", hash = "sha256:04dfe7fea2b63726cd6f3e79a2d86e709d608d74406638c5da33a01d45a9d7e3"}, 501 | {file = "kafka_python-2.0.2-py2.py3-none-any.whl", hash = "sha256:2d92418c7cb1c298fa6c7f0fb3519b520d0d7526ac6cb7ae2a4fc65a51a94b6e"}, 502 | ] 503 | markupsafe = [ 504 | {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, 505 | {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, 506 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, 507 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, 508 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, 509 | {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, 510 | {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, 511 | {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, 512 | {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, 513 | {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, 514 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 515 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 516 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 517 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 518 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 519 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 520 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, 521 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, 522 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, 523 | {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, 524 | {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, 525 | {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, 526 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 527 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 528 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 529 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 530 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 531 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 532 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 533 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 534 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, 535 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, 536 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, 537 | {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, 538 | {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, 539 | {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, 540 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 541 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 542 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, 543 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 544 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 545 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 546 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 547 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 548 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 549 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, 550 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, 551 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, 552 | {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, 553 | {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, 554 | {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, 555 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 556 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 557 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 558 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 559 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 560 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 561 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 562 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 563 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 564 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, 565 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, 566 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, 567 | {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, 568 | {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, 569 | {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, 570 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 571 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 572 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 573 | ] 574 | more-itertools = [ 575 | {file = "more-itertools-8.9.0.tar.gz", hash = "sha256:8c746e0d09871661520da4f1241ba6b908dc903839733c8203b552cffaf173bd"}, 576 | {file = "more_itertools-8.9.0-py3-none-any.whl", hash = "sha256:70401259e46e216056367a0a6034ee3d3f95e0bf59d3aa6a4eb77837171ed996"}, 577 | ] 578 | networkx = [ 579 | {file = "networkx-2.6.2-py3-none-any.whl", hash = "sha256:5fcb7004be69e8fbdf07dcb502efa5c77cadcaad6982164134eeb9721f826c2e"}, 580 | {file = "networkx-2.6.2.tar.gz", hash = "sha256:2306f1950ce772c5a59a57f5486d59bb9cab98497c45fc49cbc45ac0dec119bb"}, 581 | ] 582 | packaging = [ 583 | {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, 584 | {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, 585 | ] 586 | pluggy = [ 587 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 588 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 589 | ] 590 | pulsar-client = [ 591 | {file = "pulsar_client-2.10.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:87cbdd3bd2da9a034d4444faf2ab2623cdae14fb7f43628efd2a4b5a9b278376"}, 592 | {file = "pulsar_client-2.10.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6eb23368799fc13928136431d7dabdf2464bc7a99ee2435434d727eb84fec63d"}, 593 | {file = "pulsar_client-2.10.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:36c2ca2ec1219379a75fe863cacf7e456a12580cb406c529dc4e4af4ea98efbb"}, 594 | {file = "pulsar_client-2.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72651266114f41d05085c4ceb3bfbd6ed9c83a304d8994354b0878beb9350dc3"}, 595 | {file = "pulsar_client-2.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfd63716b937d95ee3e0f305b1ab6aca2806b2f93a1529d08c48e6fb21d98681"}, 596 | {file = "pulsar_client-2.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6ff07f494793fb0471ad94bf52201403e7a4dcf526c070daa0fb452a8ce7dc2c"}, 597 | {file = "pulsar_client-2.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:80c514405d4393e87c58b9332a10d34ee03e3120c11c0f5a54505eab0f29fde7"}, 598 | {file = "pulsar_client-2.10.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:3889c8260320bbeb74f59aa4f592cab956570c66f9d82741225135a742a8c8b5"}, 599 | {file = "pulsar_client-2.10.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:44246085c2bc183f2ec44df717e4d414b46b1eadcb117f521323b34d7daa820c"}, 600 | {file = "pulsar_client-2.10.0-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:f76a307ac65cd1ea9070b0ae14804f8084371ea3bb14cb30aa82dfc1dd199a67"}, 601 | {file = "pulsar_client-2.10.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c18d3333015941588d066b423dca0e8d825318e14561edc66a3cfc0b20855a8f"}, 602 | {file = "pulsar_client-2.10.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54d67e2bc11842949a35fd656180129aa979a712cebd0dac28b23a2f87aa5a89"}, 603 | {file = "pulsar_client-2.10.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4a54c550ab91a7610d066e5070a4cbd5be9c2421b3569a324d25029dabb338b3"}, 604 | {file = "pulsar_client-2.10.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ae2928d1080afe1eb9d20677b856e2a72232c2c4c167926280ae9f12578ddf0"}, 605 | {file = "pulsar_client-2.10.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:52ba4a1c609626d14a71297db3406c82a337b0f6dc111b84a396fe1aae002845"}, 606 | {file = "pulsar_client-2.10.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f6ffba8cc1a7a597787635db293a927f47192914eea3db07b8d33efd25f6ddf8"}, 607 | {file = "pulsar_client-2.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02775ffe3d5a0afab2c949f89778d6b31d080625f3cc5968db67515c0294e085"}, 608 | {file = "pulsar_client-2.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:26c5ebca7196d3f4eb88aedd329678106ac46a4abd7775c534278e827ccc086b"}, 609 | {file = "pulsar_client-2.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57e092fa0da9e7c31e0c563a2ddb6fe3fe3ca0cc4d99c11daafb1a62878931ad"}, 610 | {file = "pulsar_client-2.10.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:1bd16a4ffd2cdef02774cd7e1f5b815eaef2ec10ea8ef8c01afaf54ccc1bdc59"}, 611 | {file = "pulsar_client-2.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b62e57f79e74fea85660269315456ec61ab1cd33e506a0d67fd2535a29da15f"}, 612 | {file = "pulsar_client-2.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7a5480b5e665a3898f4ba6e91efa0e2f4702d8c094a78023449e528693a688b"}, 613 | {file = "pulsar_client-2.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:40d3215d115d6cd3925bd9352e7f839d785333807c735e4cefdf9189694f6ba1"}, 614 | {file = "pulsar_client-2.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7b3e6363d216ac1ffe9fd3447b211d577b325d2e0acb76a6523e4d0087de1cf5"}, 615 | ] 616 | py = [ 617 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, 618 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, 619 | ] 620 | pydantic = [ 621 | {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, 622 | {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, 623 | {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, 624 | {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, 625 | {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, 626 | {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, 627 | {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, 628 | {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, 629 | {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, 630 | {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, 631 | {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, 632 | {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, 633 | {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, 634 | {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, 635 | {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, 636 | {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, 637 | {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, 638 | {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, 639 | {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, 640 | {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, 641 | {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, 642 | {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, 643 | {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, 644 | {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, 645 | {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, 646 | {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, 647 | {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, 648 | {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, 649 | {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, 650 | {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, 651 | {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, 652 | {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, 653 | {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, 654 | {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, 655 | {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, 656 | ] 657 | pymgclient = [ 658 | {file = "pymgclient-1.2.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:908b039188c31b0fc6117aacc040c0ed33067a9e09cb14c934eecf73e429f961"}, 659 | {file = "pymgclient-1.2.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a78a48c84ff77733fde72c29c2fbbafa3fb81150171ef336976c18e17a655b18"}, 660 | {file = "pymgclient-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a123eeda47d8c2cb90ea8fe765041f0324dd36b9db60664dad62969a5a581bd0"}, 661 | {file = "pymgclient-1.2.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c6e66f519d17995812be06ca3d4cf8c476e8b3740226abd1655bbd8817c572bd"}, 662 | {file = "pymgclient-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:88d8809b0048a0cfc61636290d57f7230b34d28bbc8be429f8b4e7e84e697804"}, 663 | {file = "pymgclient-1.2.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:660806bdb256ca3eb0220dea36f4bca5b7d2ce867295113b88c0ffacedcd011a"}, 664 | {file = "pymgclient-1.2.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:f3197e71aa32df6069cef5bb8da74248bc4a3f260a9ccde5efc939f0ffce21a2"}, 665 | {file = "pymgclient-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:2c6cb017e7e41ae47c1c23d5503ee2fc2dfee7166c08742dd7c83b1d4942517c"}, 666 | {file = "pymgclient-1.2.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b77941967bc7d24009a125d0dbf6bd4fa04dd5ba102d30360408fd609a397025"}, 667 | {file = "pymgclient-1.2.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d3855b32d6c011dcf85b6d0533e1546ba8cefd2cd936824156c313465a2f5c23"}, 668 | {file = "pymgclient-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:49c47e9dc6d228607589494cafecf402e76c4d22c864951392495069c6ff95ec"}, 669 | {file = "pymgclient-1.2.0.tar.gz", hash = "sha256:50143bd138880dd32218d17dada37ade12f7a7b35d7903605e76a1149fd8bb3e"}, 670 | ] 671 | pyparsing = [ 672 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 673 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 674 | ] 675 | pytest = [ 676 | {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, 677 | {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, 678 | ] 679 | python-engineio = [ 680 | {file = "python-engineio-3.13.2.tar.gz", hash = "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b"}, 681 | {file = "python_engineio-3.13.2-py2.py3-none-any.whl", hash = "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6"}, 682 | ] 683 | python-socketio = [ 684 | {file = "python-socketio-4.6.0.tar.gz", hash = "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a"}, 685 | {file = "python_socketio-4.6.0-py2.py3-none-any.whl", hash = "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522"}, 686 | ] 687 | six = [ 688 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 689 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 690 | ] 691 | typing-extensions = [ 692 | {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, 693 | {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, 694 | ] 695 | wcwidth = [ 696 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 697 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 698 | ] 699 | werkzeug = [ 700 | {file = "Werkzeug-2.0.1-py3-none-any.whl", hash = "sha256:6c1ec500dcdba0baa27600f6a22f6333d8b662d22027ff9f6202e3367413caa8"}, 701 | {file = "Werkzeug-2.0.1.tar.gz", hash = "sha256:1de1db30d010ff1af14a009224ec49ab2329ad2cde454c8a708130642d579c42"}, 702 | ] 703 | -------------------------------------------------------------------------------- /backend/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "server" 3 | version = "0.1.0" 4 | description = "" 5 | authors = [] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.9" 9 | Flask = "^2.0.1" 10 | Flask-SocketIO = "4.3.1" 11 | python-engineio = "3.13.2" 12 | python-socketio = "4.6.0" 13 | gqlalchemy = "^1.0.5" 14 | kafka-python = "^2.0.2" 15 | Flask-Cors = "^3.0.10" 16 | gunicorn = "^20.1.0" 17 | eventlet = "0.30.2" 18 | pulsar-client = "^2.9.1" 19 | 20 | [tool.poetry.dev-dependencies] 21 | pytest = "^5.2" 22 | 23 | [build-system] 24 | requires = ["poetry-core>=1.0.0"] 25 | build-backend = "poetry.core.masonry.api" 26 | -------------------------------------------------------------------------------- /backend/server/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.1.0' 2 | -------------------------------------------------------------------------------- /backend/server/app.py: -------------------------------------------------------------------------------- 1 | from argparse import ArgumentParser 2 | from eventlet import greenthread 3 | from flask import Flask, Response 4 | from flask_cors import CORS, cross_origin 5 | from flask_socketio import SocketIO, emit 6 | from functools import wraps 7 | from kafka import KafkaConsumer 8 | import pulsar 9 | import eventlet 10 | import json 11 | import logging 12 | import os 13 | import server.setup as setup 14 | import time 15 | 16 | eventlet.monkey_patch() 17 | 18 | KAFKA_IP = os.getenv("KAFKA_IP", "kafka") 19 | KAFKA_PORT = os.getenv("KAFKA_PORT", "9092") 20 | KAFKA_TOPIC = os.getenv("KAFKA_TOPIC", "created_objects") 21 | 22 | PULSAR_IP = os.getenv("PULSAR_IP", "pulsar") 23 | PULSAR_PORT = os.getenv("PULSAR_PORT", "6650") 24 | PULSAR_TOPIC = os.getenv("PULSAR_TOPIC", "created_objects") 25 | 26 | MEMGRAPH_IP = os.getenv("MEMGRAPH_IP", "memgraph-mage") 27 | MEMGRAPH_PORT = os.getenv("MEMGRAPH_PORT", "7687") 28 | 29 | BROKER = os.getenv("BROKER", "kafka") 30 | 31 | logging.getLogger("server").setLevel(logging.ERROR) 32 | log = logging.getLogger("server") 33 | 34 | 35 | def init_log(): 36 | logging.basicConfig(level=logging.DEBUG) 37 | log.info("Logging is enabled") 38 | logging.getLogger("werkzeug").setLevel(logging.WARNING) 39 | 40 | 41 | def log_time(func): 42 | @wraps(func) 43 | def wrapper(*args, **kwargs): 44 | start_time = time.time() 45 | result = func(*args, **kwargs) 46 | duration = time.time() - start_time 47 | log.info(f"Time for {func.__name__} is {duration}") 48 | return result 49 | 50 | return wrapper 51 | 52 | 53 | app = Flask(__name__) 54 | socketio = SocketIO(app, cors_allowed_origins="*", async_mode="eventlet") 55 | cors = CORS(app) 56 | memgraph = None 57 | 58 | 59 | def set_up_memgraph_and_broker(): 60 | global memgraph 61 | memgraph = setup.connect_to_memgraph(MEMGRAPH_IP, MEMGRAPH_PORT) 62 | setup.run(memgraph) 63 | 64 | 65 | @app.route("/health", methods=["GET"]) 66 | @cross_origin() 67 | def get_health(): 68 | return Response(json.dumps("Health OK"), status=200) 69 | 70 | 71 | def kafkaconsumer(): 72 | consumer = KafkaConsumer(KAFKA_TOPIC, bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT) 73 | try: 74 | while True: 75 | msg_pack = consumer.poll() 76 | if not msg_pack: 77 | greenthread.sleep(1) 78 | continue 79 | for _, messages in msg_pack.items(): 80 | for message in messages: 81 | message = json.loads(message.value.decode("utf8")) 82 | log.info("Message: " + str(message)) 83 | try: 84 | socketio.emit("consumer", {"data": message}) 85 | except Exception as error: 86 | log.info(f"`{message}`, {repr(error)}") 87 | continue 88 | except KeyboardInterrupt: 89 | pass 90 | 91 | 92 | def pulsarconsumer(): 93 | client = pulsar.Client("pulsar://" + PULSAR_IP + ":" + PULSAR_PORT) 94 | consumer = client.subscribe( 95 | PULSAR_TOPIC, "backend-subscription", consumer_type=pulsar.ConsumerType.Shared 96 | ) 97 | while True: 98 | msg = consumer.receive() 99 | message = json.loads(msg.data().decode("utf8")) 100 | log.info(message) 101 | try: 102 | consumer.acknowledge(msg) 103 | socketio.emit("consumer", {"data": message}) 104 | except Exception as error: 105 | log.info(f"`{message}`, {repr(error)}") 106 | consumer.negative_acknowledge(msg) 107 | client.close() 108 | greenthread.sleep(0.2) 109 | 110 | 111 | @app.before_first_request 112 | def execute_this(): 113 | init_log() 114 | greenthread.spawn(set_up_memgraph_and_broker()) 115 | if BROKER == 'kafka': 116 | greenthread.spawn(kafkaconsumer) 117 | else: 118 | greenthread.spawn(pulsarconsumer) 119 | -------------------------------------------------------------------------------- /backend/server/setup.py: -------------------------------------------------------------------------------- 1 | from gqlalchemy import ( 2 | Memgraph, 3 | MemgraphKafkaStream, 4 | MemgraphPulsarStream, 5 | MemgraphTrigger, 6 | ) 7 | from gqlalchemy.models import ( 8 | TriggerEventType, 9 | TriggerEventObject, 10 | TriggerExecutionPhase, 11 | ) 12 | from time import sleep 13 | import logging 14 | import os 15 | 16 | BROKER = os.getenv("BROKER", "kafka") 17 | 18 | log = logging.getLogger("server") 19 | 20 | 21 | def connect_to_memgraph(memgraph_ip, memgraph_port): 22 | memgraph = Memgraph(host=memgraph_ip, port=int(memgraph_port)) 23 | while True: 24 | try: 25 | if memgraph._get_cached_connection().is_active(): 26 | return memgraph 27 | except: 28 | log.info("Memgraph probably isn't running.") 29 | sleep(1) 30 | 31 | 32 | def run(memgraph): 33 | try: 34 | memgraph.drop_database() 35 | 36 | log.info("Setting up PageRank") 37 | memgraph.execute("CALL pagerank_online.set(100, 0.2) YIELD *") 38 | memgraph.execute( 39 | """CREATE TRIGGER pagerank_trigger 40 | BEFORE COMMIT 41 | EXECUTE CALL pagerank_online.update(createdVertices, createdEdges, deletedVertices, deletedEdges) YIELD * 42 | SET node.rank = rank 43 | CALL publisher.update_rank(node, rank);""" 44 | ) 45 | 46 | log.info("Setting up community detection") 47 | memgraph.execute( 48 | "CALL community_detection_online.set(False, False, 0.7, 4.0, 0.1, 'weight', 1.0, 100, 5) YIELD *;" 49 | ) 50 | memgraph.execute( 51 | """CREATE TRIGGER labelrankt_trigger 52 | BEFORE COMMIT 53 | EXECUTE CALL community_detection_online.update(createdVertices, createdEdges, updatedVertices, updatedEdges, deletedVertices, deletedEdges) 54 | YIELD node, community_id 55 | SET node.cluster=community_id 56 | CALL publisher.update_cluster(node, community_id);""" 57 | ) 58 | 59 | log.info("Creating stream connections on Memgraph") 60 | stream = None 61 | if BROKER == "kafka": 62 | stream = MemgraphKafkaStream( 63 | name="retweets", 64 | topics=["retweets"], 65 | transform="twitter.tweet", 66 | bootstrap_servers="'kafka:9092'", 67 | ) 68 | else: 69 | stream = MemgraphPulsarStream( 70 | name="retweets", 71 | topics=["retweets"], 72 | transform="twitter.tweet", 73 | service_url="'pulsar://pulsar:6650'", 74 | ) 75 | memgraph.create_stream(stream) 76 | memgraph.start_stream(stream) 77 | 78 | log.info("Creating triggers on Memgraph") 79 | trigger = MemgraphTrigger( 80 | name="created_trigger", 81 | event_type=TriggerEventType.CREATE, 82 | event_object=TriggerEventObject.ALL, 83 | execution_phase=TriggerExecutionPhase.AFTER, 84 | statement="CALL publisher.create(createdObjects)", 85 | ) 86 | memgraph.create_trigger(trigger) 87 | 88 | except Exception as e: 89 | log.info(f"Error on stream and trigger creation: {e}") 90 | pass 91 | -------------------------------------------------------------------------------- /backend/server/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 24 | 25 | 26 | 27 |
28 | 29 |
30 |

Logs

31 |
32 |

Consumer

33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /backend/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/backend/tests/__init__.py -------------------------------------------------------------------------------- /backend/tests/test_backend.py: -------------------------------------------------------------------------------- 1 | from backend import __version__ 2 | 3 | 4 | def test_version(): 5 | assert __version__ == '0.1.0' 6 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | networks: 4 | app-tier: 5 | driver: bridge 6 | 7 | services: 8 | memgraph-mage-kafka: 9 | build: ./memgraph 10 | ports: 11 | - "7687:7687" 12 | - "7444:7444" 13 | environment: 14 | KAFKA_IP: kafka 15 | KAFKA_PORT: "9092" 16 | BROKER: "kafka" 17 | entrypoint: 18 | [ 19 | "/usr/lib/memgraph/memgraph", 20 | "--telemetry-enabled=false", 21 | "--query-modules-directory=/procedures,/transformations,/usr/lib/memgraph/query_modules", 22 | "--log-level=TRACE", 23 | ] 24 | networks: 25 | - app-tier 26 | 27 | memgraph-mage-pulsar: 28 | build: ./memgraph 29 | ports: 30 | - "7687:7687" 31 | - "7444:7444" 32 | environment: 33 | PULSAR_IP: pulsar 34 | PULSAR_PORT: "6650" 35 | BROKER: "pulsar" 36 | entrypoint: 37 | [ 38 | "/usr/lib/memgraph/memgraph", 39 | "--telemetry-enabled=false", 40 | "--query-modules-directory=/procedures,/transformations,/usr/lib/memgraph/query_modules", 41 | "--log-level=TRACE", 42 | ] 43 | networks: 44 | - app-tier 45 | 46 | zookeeper: 47 | image: "bitnami/zookeeper:3.7" 48 | ports: 49 | - "2181:2181" 50 | environment: 51 | - ALLOW_ANONYMOUS_LOGIN=yes 52 | networks: 53 | - app-tier 54 | logging: 55 | driver: none 56 | 57 | kafka: 58 | image: "bitnami/kafka:2" 59 | logging: 60 | driver: none 61 | ports: 62 | - "9092:9092" 63 | - "9093:9093" 64 | environment: 65 | - KAFKA_BROKER_ID=1 66 | - ALLOW_PLAINTEXT_LISTENER=yes 67 | - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 68 | - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT 69 | - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093 70 | - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093 71 | - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT 72 | depends_on: 73 | - zookeeper 74 | networks: 75 | - app-tier 76 | 77 | pulsar: 78 | image: apachepulsar/pulsar:2.10.0 79 | ports: 80 | - 8080:8080 81 | - 6650:6650 82 | environment: 83 | PULSAR_MEM: " -Xms512m -Xmx512m -XX:MaxDirectMemorySize=1g" 84 | command: bin/pulsar standalone 85 | networks: 86 | - app-tier 87 | 88 | stream-kafka: 89 | build: 90 | context: ./ 91 | dockerfile: ./stream/Dockerfile 92 | entrypoint: ["python3", "produce.py", "--stream-delay", "2.0", "--broker", "kafka"] 93 | environment: 94 | KAFKA_IP: kafka 95 | KAFKA_PORT: 9092 96 | KAFKA_TOPIC: "retweets" 97 | networks: 98 | - app-tier 99 | 100 | stream-pulsar: 101 | build: 102 | context: ./ 103 | dockerfile: ./stream/Dockerfile 104 | entrypoint: ["python3", "produce.py", "--stream-delay", "2.0", "--broker", "pulsar"] 105 | environment: 106 | PULSAR_IP: pulsar 107 | PULSAR_PORT: 6650 108 | PULSAR_TOPIC: "retweets" 109 | networks: 110 | - app-tier 111 | 112 | backend-pulsar: 113 | build: ./backend 114 | entrypoint: ["gunicorn", "--worker-class", "eventlet", "-w", "1", "-b", "0.0.0.0:5000", "--preload", "server.app:app"] 115 | volumes: 116 | - ./backend:/app 117 | ports: 118 | - "5000:5000" 119 | environment: 120 | PULSAR_IP: pulsar 121 | PULSAR_PORT: 6650 122 | PULSAR_TOPIC: "created_objects" 123 | MEMGRAPH_IP: memgraph-mage-pulsar 124 | MEMGRAPH_PORT: "7687" 125 | BROKER: "pulsar" 126 | depends_on: 127 | - pulsar 128 | networks: 129 | - app-tier 130 | 131 | backend-kafka: 132 | build: ./backend 133 | entrypoint: ["gunicorn", "--worker-class", "eventlet", "-w", "1", "-b", "0.0.0.0:5000", "--preload", "server.app:app"] 134 | volumes: 135 | - ./backend:/app 136 | ports: 137 | - "5000:5000" 138 | environment: 139 | KAFKA_IP: kafka 140 | KAFKA_PORT: 9092 141 | KAFKA_TOPIC: "created_objects" 142 | MEMGRAPH_IP: memgraph-mage-kafka 143 | MEMGRAPH_PORT: "7687" 144 | BROKER: "kafka" 145 | depends_on: 146 | - kafka 147 | networks: 148 | - app-tier 149 | 150 | frontend-app: 151 | build: ./frontend 152 | volumes: 153 | - ./frontend:/app 154 | - /app/node_modules 155 | ports: 156 | - "3000:3000" 157 | networks: 158 | - app-tier 159 | -------------------------------------------------------------------------------- /frontend/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | .dockerignore 4 | Dockerfile -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | # pull official base image 2 | FROM node:14.17.5-alpine 3 | 4 | # set working directory 5 | WORKDIR /app 6 | 7 | # add `/app/node_modules/.bin` to $PATH 8 | ENV PATH /app/node_modules/.bin:$PATH 9 | 10 | # install app dependencies 11 | COPY package.json ./ 12 | COPY package-lock.json ./ 13 | RUN npm install --silent 14 | RUN npm install react-scripts@3.4.1 -g --silent 15 | 16 | # add app 17 | COPY . ./ 18 | 19 | # start app 20 | CMD ["npm", "start"] -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.16.1", 7 | "@testing-library/react": "^12.1.2", 8 | "@testing-library/user-event": "^13.5.0", 9 | "d3": "^7.2.0", 10 | "react": "^17.0.2", 11 | "react-dom": "^17.0.2", 12 | "react-scripts": "5.0.0", 13 | "socket.io-client": "^2.3.1", 14 | "web-vitals": "^2.1.2" 15 | }, 16 | "scripts": { 17 | "start": "react-scripts start", 18 | "build": "react-scripts build", 19 | "test": "react-scripts test", 20 | "eject": "react-scripts eject" 21 | }, 22 | "eslintConfig": { 23 | "extends": [ 24 | "react-app", 25 | "react-app/jest" 26 | ] 27 | }, 28 | "browserslist": { 29 | "production": [ 30 | ">0.2%", 31 | "not dead", 32 | "not op_mini all" 33 | ], 34 | "development": [ 35 | "last 1 chrome version", 36 | "last 1 firefox version", 37 | "last 1 safari version" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/frontend/public/logo192.png -------------------------------------------------------------------------------- /frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/frontend/public/logo512.png -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /frontend/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /frontend/src/App.js: -------------------------------------------------------------------------------- 1 | //import { useState } from 'react'; 2 | import './App.css'; 3 | import CommunityDetection from './components/CommunityDetection'; 4 | import PageRank from './components/PageRank'; 5 | import React from 'react'; 6 | import io from "socket.io-client" 7 | 8 | 9 | 10 | export default class App extends React.Component { 11 | render() { 12 | const socket = io("http://localhost:5000/", { transports: ["websocket"] }) 13 | return ( 14 |
15 | 16 | 17 |
18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /frontend/src/components/CommunityDetection.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import * as d3 from "d3"; 3 | 4 | var node; 5 | var link; 6 | var simulation; 7 | var forceLink; 8 | var width = 1000; 9 | var height = 700; 10 | var tooltip; 11 | var clusterColors = {}; 12 | 13 | /** 14 | * Component that draws nodes and edges as a part of different communities in real-time. 15 | */ 16 | export default class CommunityDetection extends React.Component { 17 | 18 | constructor(props) { 19 | super(props); 20 | this.myReference = React.createRef(); 21 | this.state = { 22 | nodes: [], 23 | links: [] 24 | } 25 | this.socket = this.props.socket 26 | } 27 | 28 | 29 | async firstRequest() { 30 | let response = await fetch("http://localhost:5000/health") 31 | 32 | if (!response.ok) { 33 | throw new Error(`HTTP error! status: ${response.status}`); 34 | } 35 | else 36 | console.log(response) 37 | } 38 | 39 | transformData(data) { 40 | var nodes = data.vertices.map((vertex) => { 41 | return { 42 | id: vertex.id, 43 | type: vertex.labels[0], 44 | username: vertex.username, 45 | cluster: vertex.cluster, 46 | }; 47 | }); 48 | var links = data.edges.map((edge) => { 49 | return { 50 | id: edge.id, 51 | source: edge.source, 52 | target: edge.target, 53 | type: edge.type, 54 | }; 55 | }); 56 | 57 | return { nodes, links }; 58 | } 59 | 60 | isRankUpdated(msg) { 61 | let nodes = msg.data.vertices 62 | if (nodes.length !== 1) 63 | return false 64 | return !("cluster" in nodes["0"]) 65 | } 66 | 67 | componentDidMount() { 68 | this.initializeGraph() 69 | this.firstRequest(); 70 | 71 | this.socket.on("connect", () => { 72 | //this.socket.emit('consumer') 73 | console.log("Connected to socket ", this.socket.id) 74 | }); 75 | 76 | this.socket.on("connect_error", (err) => { console.log(err) }); 77 | this.socket.on("disconnect", () => { 78 | console.log("Disconnected from socket.") 79 | }); 80 | 81 | this.socket.on("consumer", (msg) => { 82 | 83 | console.log('Received a message from the WebSocket service: ', msg.data); 84 | 85 | var oldNodes = this.state.nodes 86 | var oldLinks = this.state.links 87 | var updatedNodes = [] 88 | 89 | var myData = this.transformData(msg.data) 90 | var newNodes = myData.nodes 91 | var newLinks = myData.links 92 | var newNode = newNodes["0"] 93 | 94 | // ignore rank updates 95 | if (this.isRankUpdated(msg)) { 96 | return 97 | } 98 | 99 | // if cluster update or simple msg 100 | var value = oldNodes.find((node) => node.id === newNode.id) 101 | if (typeof value === 'undefined') { 102 | updatedNodes = oldNodes.concat(newNodes) 103 | } 104 | else { 105 | value.cluster = newNode.cluster 106 | updatedNodes = oldNodes 107 | } 108 | 109 | // filter new edges to have only the ones that have source and target node 110 | var filteredLinks = newLinks.filter((link) => { 111 | return ( 112 | updatedNodes.find((node) => node.id === link.source) && 113 | updatedNodes.find((node) => node.id === link.target) 114 | ); 115 | }) 116 | 117 | var updatedLinks = oldLinks.concat(filteredLinks) 118 | 119 | this.setState({ nodes: updatedNodes, links: updatedLinks }) 120 | }); 121 | 122 | } 123 | 124 | componentDidUpdate() { 125 | this.updateGraph() 126 | } 127 | 128 | componentWillUnmount() { 129 | this.socket.emit('disconnect'); 130 | this.socket.disconnect(); 131 | } 132 | 133 | drag() { 134 | function dragstarted(event) { 135 | if (!event.active) simulation.alphaTarget(0.3).restart(); 136 | tooltip.style("visibility", "hidden") 137 | event.subject.fx = event.subject.x; 138 | event.subject.fy = event.subject.y; 139 | } 140 | 141 | function dragged(event) { 142 | tooltip.style("visibility", "hidden") 143 | event.subject.fx = event.x; 144 | event.subject.fy = event.y; 145 | 146 | } 147 | 148 | function dragended(event) { 149 | tooltip.style("visibility", "hidden") 150 | if (!event.active) simulation.alphaTarget(0); 151 | event.subject.fx = null; 152 | event.subject.fy = null; 153 | } 154 | 155 | return d3 156 | .drag() 157 | .on("start", dragstarted) 158 | .on("drag", dragged) 159 | .on("end", dragended); 160 | } 161 | 162 | handleZoom(e) { 163 | d3.selectAll(".CommunityDetectionSvg g") 164 | .attr("transform", e.transform) 165 | } 166 | 167 | initZoom(zoom) { 168 | d3.select('.CommunityDetectionSvg') 169 | .call(zoom); 170 | } 171 | 172 | createTooltip() { 173 | return (d3.select(".CommunityDetectionDiv") 174 | .append("div") 175 | .attr("class", "tooltip-cd") 176 | .style("position", "absolute") 177 | .style("z-index", "10") 178 | .style("visibility", "hidden")); 179 | } 180 | 181 | /** 182 | * Method that initializes everything that will be drawn. 183 | */ 184 | initializeGraph(nodes, links) { 185 | var svg = d3.select(this.myReference.current); 186 | svg.selectAll("*").remove(); 187 | 188 | var zoom = d3.zoom() 189 | .on("zoom", this.handleZoom) 190 | this.initZoom(zoom) 191 | d3.select(".CommunityDetectionSvg") 192 | .call(zoom) 193 | 194 | tooltip = this.createTooltip() 195 | forceLink = d3.forceLink(this.state.links).id(function (n) { return n.id; }) 196 | 197 | // set up simulation, link and node 198 | simulation = d3 199 | .forceSimulation(nodes) 200 | .force('link', forceLink) 201 | .force( 202 | 'collide', 203 | d3 204 | .forceCollide() 205 | .radius(function (d) { 206 | return 20; 207 | }) 208 | ) 209 | .force("center", d3.forceCenter(width / 2, height / 2)) 210 | .force( 211 | "x", 212 | d3.forceX().strength(0.05) 213 | ) 214 | .force( 215 | "y", 216 | d3.forceY().strength(0.05) 217 | ); 218 | 219 | 220 | simulation.on("tick", () => { 221 | node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); 222 | link 223 | .attr('x1', (d) => d.source.x) 224 | .attr('y1', (d) => d.source.y) 225 | .attr('x2', (d) => d.target.x) 226 | .attr('y2', (d) => d.target.y); 227 | }); 228 | 229 | link = svg.append("g") 230 | .attr('stroke', 'black') 231 | .attr('stroke-opacity', 0.8) 232 | .selectAll('line') 233 | .data(this.state.links) 234 | .join('line') 235 | .attr('id', (d) => d.source.id + '-' + d.target.id) 236 | .attr('stroke-width', 1.5); 237 | 238 | 239 | node = svg.append("g") 240 | .selectAll("circle") 241 | .data(this.state.nodes) 242 | .join("circle") 243 | .attr("r", function (d) { 244 | return 7; 245 | }) 246 | .attr("class", "node") 247 | .attr('fill', function (d) { 248 | let cluster = d.cluster 249 | let key = cluster.toString() 250 | if (!(key in clusterColors)) { 251 | clusterColors[key] = "#" + Math.floor(Math.random() * 16777215).toString(16) 252 | } 253 | return clusterColors[key] 254 | }) 255 | .on("mouseover", function (d) { 256 | tooltip.text(d.srcElement["__data__"]["username"]) 257 | tooltip.style("visibility", "visible") 258 | }) 259 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 10) + "px").style("left", (event.x + 10) + "px"); }) 260 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); }) 261 | .call(this.drag(simulation)); 262 | 263 | 264 | } 265 | 266 | /** 267 | * Method that is called on every new node/edge and draws updated graph. 268 | */ 269 | updateGraph() { 270 | 271 | // Remove old nodes 272 | node.exit().remove(); 273 | 274 | // Give attributes to all nodes that enter -> new ones + merge - update the existing DOM elements 275 | node = node.data(this.state.nodes, (d) => d.id); 276 | node = node 277 | .enter() 278 | .append('circle') 279 | .merge(node) 280 | .attr("r", function (d) { 281 | return 7; 282 | }) 283 | .attr('fill', function (d) { 284 | let cluster = d.cluster 285 | let key = cluster.toString() 286 | if (!(key in clusterColors)) { 287 | clusterColors[key] = "#" + Math.floor(Math.random() * 16777215).toString(16) 288 | } 289 | return clusterColors[key] 290 | }) 291 | .on("mouseover", function (d) { 292 | tooltip.text(d.srcElement["__data__"]["username"]) 293 | tooltip.style("visibility", "visible") 294 | }) 295 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 10) + "px").style("left", (event.x + 10) + "px"); }) 296 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); }) 297 | .call(this.drag()); 298 | 299 | link.exit().remove(); 300 | link = link.data(this.state.links, (d) => { 301 | return d.source.id + '-' + d.target.id; 302 | }); 303 | link = link 304 | .enter() 305 | .append('line') 306 | .merge(link) 307 | .attr('id', (d) => d.source.id + '-' + d.target.id) 308 | .attr('stroke', 'black') 309 | .attr('stroke-opacity', 0.8) 310 | .attr('stroke-width', 1.5); 311 | 312 | // Set up simulation on new nodes and links 313 | try { 314 | simulation 315 | .nodes(this.state.nodes) 316 | forceLink.links(this.state.links) 317 | } catch (err) { 318 | console.log('err', err); 319 | } 320 | 321 | simulation.alphaTarget(0.1).restart(); 322 | } 323 | 324 | render() { 325 | return (
326 |

Community Detection

327 |
335 | ); 336 | } 337 | 338 | } -------------------------------------------------------------------------------- /frontend/src/components/PageRank.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import * as d3 from "d3"; 3 | 4 | 5 | var node; 6 | var link; 7 | var forceCollide; 8 | var forceLink; 9 | var simulation; 10 | var width = 1000; 11 | var height = 700; 12 | var tooltip; 13 | 14 | /** 15 | * Component that draws nodes and edges in real-time. 16 | * Size of each node is proportional to the value of its rank property. 17 | */ 18 | export default class PageRank extends React.Component { 19 | 20 | constructor(props) { 21 | super(props); 22 | this.myReference = React.createRef(); 23 | this.state = { 24 | nodes: [], 25 | links: [] 26 | } 27 | this.socket = this.props.socket 28 | } 29 | 30 | async firstRequest() { 31 | let response = await fetch("http://localhost:5000/health") 32 | 33 | if (!response.ok){ 34 | throw new Error(`HTTP error! status: ${response.status}`); 35 | } 36 | else 37 | console.log(response) 38 | } 39 | 40 | transformData(data) { 41 | var nodes = data.vertices.map((vertex) => { 42 | return { 43 | id: vertex.id, 44 | type: vertex.labels[0], 45 | username: vertex.username, 46 | rank: vertex.rank, 47 | }; 48 | }); 49 | var links = data.edges.map((edge) => { 50 | return { 51 | id: edge.id, 52 | source: edge.source, 53 | target: edge.target, 54 | type: edge.type, 55 | }; 56 | }); 57 | 58 | return { nodes, links }; 59 | } 60 | 61 | isClusterUpdated(msg) { 62 | let nodes = msg.data.vertices 63 | if(nodes.length !== 1) 64 | return false 65 | return !("rank" in nodes["0"]) 66 | } 67 | 68 | 69 | componentDidMount() { 70 | this.initializeGraph() 71 | this.firstRequest() 72 | 73 | this.socket.on("connect", () => { 74 | //this.socket.emit('consumer') 75 | console.log("Connected to socket ", this.socket.id) 76 | }); 77 | 78 | this.socket.on("connect_error", (err) => { console.log(err) }); 79 | this.socket.on("disconnect", () => { 80 | console.log("Disconnected from socket.") 81 | }); 82 | 83 | this.socket.on("consumer", (msg) => { 84 | console.log('Received a message from the WebSocket service: ', msg.data); 85 | 86 | var oldNodes = this.state.nodes 87 | var oldLinks = this.state.links 88 | var updatedNodes = [] 89 | 90 | var myData = this.transformData(msg.data) 91 | var newNodes = myData.nodes 92 | var newLinks = myData.links 93 | var newNode = newNodes["0"] 94 | 95 | // ignore cluster updates 96 | if(this.isClusterUpdated(msg)) 97 | return 98 | 99 | // if rank update or simple msg 100 | var value = oldNodes.find((node) => node.id === newNode.id) 101 | if(typeof value === 'undefined'){ 102 | updatedNodes = oldNodes.concat(newNodes) 103 | } 104 | else { 105 | value.rank = newNode.rank 106 | updatedNodes = oldNodes 107 | } 108 | 109 | // filter new edges to have only the ones that have source and target node 110 | var filteredLinks = newLinks.filter((link) => { 111 | return ( 112 | updatedNodes.find((node) => node.id === link.source) && 113 | updatedNodes.find((node) => node.id === link.target) 114 | ); 115 | }) 116 | 117 | var updatedLinks = oldLinks.concat(filteredLinks) 118 | 119 | this.setState({ nodes: updatedNodes, links: updatedLinks }) 120 | }); 121 | 122 | } 123 | 124 | componentDidUpdate() { 125 | this.updateGraph() 126 | } 127 | 128 | componentWillUnmount() { 129 | this.socket.emit('disconnect'); 130 | this.socket.disconnect(); 131 | } 132 | 133 | drag() { 134 | function dragstarted(event) { 135 | if (!event.active) simulation.alphaTarget(0.3).restart(); 136 | tooltip.style("visibility", "hidden") 137 | event.subject.fx = event.subject.x; 138 | event.subject.fy = event.subject.y; 139 | } 140 | 141 | function dragged(event) { 142 | tooltip.style("visibility", "hidden") 143 | event.subject.fx = event.x; 144 | event.subject.fy = event.y; 145 | 146 | } 147 | 148 | function dragended(event) { 149 | tooltip.style("visibility", "hidden") 150 | if (!event.active) simulation.alphaTarget(0); 151 | event.subject.fx = null; 152 | event.subject.fy = null; 153 | } 154 | 155 | return d3 156 | .drag() 157 | .on("start", dragstarted) 158 | .on("drag", dragged) 159 | .on("end", dragended); 160 | } 161 | 162 | handleZoom(e) { 163 | d3.selectAll(".PageRankSvg g") 164 | .attr("transform", e.transform) 165 | } 166 | 167 | initZoom(zoom) { 168 | d3.select('.PageRankSvg') 169 | .call(zoom); 170 | } 171 | 172 | defineGradient(svg) { 173 | // Memgraph brand colors 174 | const colors = ["#FFC500", "#FB6E00", "#DD2222", "#FF0092", "#720096"] 175 | // Define the gradient 176 | const gradient = svg.append("svg:defs") 177 | .append("svg:linearGradient") 178 | .attr("id", "gradient") 179 | .attr("x1", "0%") 180 | .attr("y1", "0%") 181 | .attr("x2", "100%") 182 | .attr("y2", "100%") 183 | .attr("spreadMethod", "pad"); 184 | 185 | gradient.selectAll("stop") 186 | .data(colors) 187 | .enter() 188 | .append("svg:stop") 189 | .style("stop-color", function (d) { return d; }) 190 | .attr("offset", function (d, i) { return 100 * (i / (colors.length - 1)) + "%"; }) 191 | .attr("stop-opacity", function (d, i) { return 1.0; }); 192 | } 193 | 194 | createTooltip() { 195 | return (d3.select(".PageRankDiv") 196 | .append("div") 197 | .attr("class", "tooltip-cd") 198 | .style("position", "absolute") 199 | .style("z-index", "10") 200 | .style("visibility", "hidden")); 201 | } 202 | 203 | /** 204 | * Method that initializes everything that will be drawn. 205 | */ 206 | initializeGraph() { 207 | var svg = d3.select(this.myReference.current); 208 | 209 | svg.selectAll("*").remove(); 210 | 211 | var zoom = d3.zoom() 212 | .on("zoom", this.handleZoom) 213 | this.initZoom(zoom) 214 | d3.select(".PageRankSvg") 215 | .call(zoom) 216 | 217 | tooltip = this.createTooltip() 218 | 219 | this.defineGradient(svg) 220 | 221 | forceCollide = d3.forceCollide().strength(1).radius(function (d) { 222 | return d.rank * 1500; 223 | }) 224 | 225 | forceLink = d3.forceLink(this.state.links).id(function (n) { return n.id; }) 226 | 227 | simulation = d3 228 | .forceSimulation(this.state.nodes) 229 | .force('link', forceLink) 230 | .force('collide', forceCollide) 231 | .force("center", d3.forceCenter(width / 2, height / 2)) 232 | .force( 233 | "x", 234 | d3.forceX().strength(0.05) 235 | ) 236 | .force( 237 | "y", 238 | d3.forceY().strength(0.05) 239 | ); 240 | 241 | simulation.on("tick", () => { 242 | node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); 243 | link 244 | .attr('x1', (d) => d.source.x) 245 | .attr('y1', (d) => d.source.y) 246 | .attr('x2', (d) => d.target.x) 247 | .attr('y2', (d) => d.target.y); 248 | }); 249 | 250 | link = svg.append("g") 251 | .attr("class", "links") 252 | .selectAll('line') 253 | .data(this.state.links) 254 | .join('line') 255 | .attr('stroke', 'black') 256 | .attr('id', (d) => d.source.id + '-' + d.target.id) 257 | .attr('stroke-width', 1.2); 258 | 259 | node = svg.append("g") 260 | .attr("class", "nodes") 261 | .selectAll("circle") 262 | .data(this.state.nodes) 263 | .join("circle") 264 | .attr("r", function (d) { 265 | return d.rank * 700; 266 | }) 267 | .attr('fill', 'url(#gradient)') 268 | .on("mouseover", function (d) { 269 | tooltip.text(d.srcElement["__data__"]["username"]) 270 | tooltip.style("visibility", "visible") 271 | }) 272 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 15) + "px").style("left", (event.x + 15) + "px"); }) 273 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); }) 274 | .call(this.drag(simulation)); 275 | 276 | } 277 | 278 | /** 279 | * Method that is called on every new incoming msg and draws updated graph. 280 | */ 281 | updateGraph() { 282 | 283 | // Remove anything that was removed from nodes array 284 | node.exit().remove(); 285 | 286 | // Give attributes to all nodes that enter -> new ones + merge - update the existing DOM elements 287 | node = node.data(this.state.nodes, (d) => d.id); 288 | node = node 289 | .enter() 290 | .append('circle') 291 | .merge(node) //returns a brand new selection that contains both enter and update selection 292 | .attr("r", function (d) { 293 | return d.rank * 700; 294 | }) 295 | .attr('fill', 'url(#gradient)') 296 | .on("mouseover", function (d) { 297 | tooltip.text(d.srcElement["__data__"]["username"]) 298 | tooltip.style("visibility", "visible") 299 | }) 300 | .on("mousemove", function (event, d) { return tooltip.style("top", (event.y - 15) + "px").style("left", (event.x + 15) + "px"); }) 301 | .on("mouseout", function (event, d) { return tooltip.style("visibility", "hidden"); }) 302 | .call(this.drag()); 303 | 304 | 305 | link.exit().remove(); 306 | link = link.data(this.state.links, (d) => { 307 | return d.source.id + '-' + d.target.id; 308 | }); 309 | link = link 310 | .enter() 311 | .append('line') 312 | .merge(link) 313 | .attr('id', (d) => d.source.id + '-' + d.target.id) 314 | .attr('stroke', 'black') 315 | .attr('stroke-width', 1.2); 316 | 317 | // Update simulation 318 | try { 319 | simulation 320 | .nodes(this.state.nodes) 321 | .force('collide', forceCollide) 322 | forceLink.links(this.state.links) 323 | } catch (err) { 324 | console.log('err', err); 325 | } 326 | 327 | simulation.alphaTarget(0.1).restart(); 328 | } 329 | 330 | render() { 331 | return (
332 |

Number of users that retweeted so far: {this.state.nodes.length}

333 |

PageRank

334 |
342 | ); 343 | 344 | } 345 | 346 | } -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /frontend/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /frontend/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /img/karate-club-graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/karate-club-graph.png -------------------------------------------------------------------------------- /img/karate-club-matplotlib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/karate-club-matplotlib.png -------------------------------------------------------------------------------- /img/memgraph-tutorial-community-detection-stream.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/memgraph-tutorial-community-detection-stream.gif -------------------------------------------------------------------------------- /img/memgraph-tutorial-pagerank-stream.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/memgraph-tutorial-pagerank-stream.gif -------------------------------------------------------------------------------- /img/stream-processing-arc-01-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/stream-processing-arc-01-01.png -------------------------------------------------------------------------------- /img/twitter-dataset-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/memgraph/twitter-network-analysis/a81f588d7d02fd99d445d57828ef8367fdf409b7/img/twitter-dataset-01.png -------------------------------------------------------------------------------- /memgraph/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM memgraph/memgraph-mage:1.1.1 2 | 3 | USER root 4 | 5 | # Install Python 6 | RUN apt-get update && apt-get install -y \ 7 | python3-pip \ 8 | python3-setuptools \ 9 | python3-dev \ 10 | && pip3 install -U pip 11 | 12 | # Install pip packages 13 | COPY requirements.txt ./ 14 | RUN pip3 install -r requirements.txt 15 | 16 | # Copy the local query modules 17 | COPY transformations/ /transformations 18 | COPY procedures/ /procedures 19 | 20 | USER memgraph 21 | -------------------------------------------------------------------------------- /memgraph/procedures/link_prediction.py: -------------------------------------------------------------------------------- 1 | import gc 2 | import itertools 3 | import numpy as np 4 | from typing import Dict, List, Tuple 5 | import mgp 6 | 7 | TOP_K_PREDICTIONS = 8 8 | 9 | 10 | def calculate_adjacency_matrix(embeddings: Dict[int, List[float]], threshold=0.0) -> Dict[Tuple[int, int], float]: 11 | def get_edge_weight(i, j) -> float: 12 | if embeddings[i] is None or embeddings[j] is None: 13 | return -1 14 | return np.dot(embeddings[i], embeddings[j]) 15 | 16 | nodes = list(embeddings.keys()) 17 | nodes = sorted(nodes) 18 | adj_mtx_r = {} 19 | cnt = 0 20 | for pair in itertools.combinations(nodes, 2): 21 | 22 | if cnt % 1000000 == 0: 23 | adj_mtx_r = {k: v for k, v in sorted(adj_mtx_r.items(), key=lambda item: -1 * item[1])} 24 | adj_mtx_r = {k: adj_mtx_r[k] for k in list(adj_mtx_r)[:TOP_K_PREDICTIONS]} 25 | gc.collect() 26 | 27 | weight = get_edge_weight(pair[0], pair[1]) 28 | if weight <= threshold: 29 | continue 30 | cnt += 1 31 | adj_mtx_r[(pair[0], pair[1])] = get_edge_weight(pair[0], pair[1]) 32 | 33 | return adj_mtx_r 34 | 35 | 36 | @mgp.read_proc 37 | def predict(ctx: mgp.ProcCtx) -> mgp.Record(edges=mgp.List[mgp.List[mgp.Vertex]]): 38 | embeddings: Dict[int, List[float]] = {} 39 | 40 | for vertex in ctx.graph.vertices: 41 | embedding = vertex.properties.get("embedding", None) 42 | if embedding is None: 43 | continue 44 | embeddings[int(vertex.id)] = embedding 45 | 46 | adj_matrix = calculate_adjacency_matrix(embeddings) 47 | sorted_predicted_edges = {k: v for k, v in sorted(adj_matrix.items(), key=lambda item: -1 * item[1])} 48 | 49 | edges: List[mgp.List[mgp.Vertex]] = [] 50 | 51 | for edge, similarity in sorted_predicted_edges.items(): 52 | vertex_from = ctx.graph.get_vertex_by_id(edge[0]) 53 | vertex_to = ctx.graph.get_vertex_by_id(edge[1]) 54 | 55 | edges.append([vertex_from, vertex_to]) 56 | 57 | return mgp.Record(edges=edges) 58 | -------------------------------------------------------------------------------- /memgraph/procedures/publisher.py: -------------------------------------------------------------------------------- 1 | import json 2 | import mgp 3 | import os 4 | import pulsar 5 | from kafka import KafkaProducer 6 | 7 | KAFKA_IP = os.getenv("KAFKA_IP", "kafka") 8 | KAFKA_PORT = os.getenv("KAFKA_PORT", "9092") 9 | 10 | PULSAR_IP = os.getenv("PULSAR_IP", "localhost") 11 | PULSAR_PORT = os.getenv("PULSAR_PORT", "6650") 12 | 13 | BROKER = os.getenv("BROKER", "kafka") 14 | 15 | 16 | @mgp.read_proc 17 | def create(created_objects: mgp.Any) -> mgp.Record(): 18 | created_objects_info = {"vertices": [], "edges": []} 19 | 20 | for obj in created_objects: 21 | if obj["event_type"] == "created_vertex": 22 | created_object = { 23 | "id": obj["vertex"].id, 24 | "labels": [label.name for label in obj["vertex"].labels], 25 | "username": obj["vertex"].properties["username"], 26 | "rank": obj["vertex"].properties["rank"], 27 | "cluster": obj["vertex"].properties["cluster"], 28 | } 29 | created_objects_info["vertices"].append(created_object) 30 | else: 31 | created_objects_info["edges"].append( 32 | { 33 | "id": obj["edge"].id, 34 | "type": obj["edge"].type.name, 35 | "source": obj["edge"].from_vertex.id, 36 | "target": obj["edge"].to_vertex.id, 37 | } 38 | ) 39 | 40 | if BROKER == "kafka": 41 | kafka_producer = KafkaProducer(bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT) 42 | kafka_producer.send( 43 | "created_objects", json.dumps(created_objects_info).encode("utf8") 44 | ) 45 | else: 46 | pulsar_producer = pulsar.Client( 47 | "pulsar://" + PULSAR_IP + ":" + PULSAR_PORT 48 | ).create_producer("created_objects") 49 | pulsar_producer.send(json.dumps(created_objects_info).encode("utf8")) 50 | 51 | return mgp.Record() 52 | 53 | 54 | @mgp.read_proc 55 | def update_rank(node: mgp.Vertex, rank: float) -> mgp.Record(): 56 | updated_objects_info = {"vertices": [], "edges": []} 57 | 58 | updated_object = { 59 | "id": node.id, 60 | "labels": [label.name for label in node.labels], 61 | "username": node.properties["username"], 62 | "rank": rank, 63 | } 64 | updated_objects_info["vertices"].append(updated_object) 65 | 66 | if BROKER == "kafka": 67 | kafka_producer = KafkaProducer(bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT) 68 | kafka_producer.send( 69 | "created_objects", json.dumps(updated_objects_info).encode("utf8") 70 | ) 71 | else: 72 | pulsar_producer = pulsar.Client( 73 | "pulsar://" + PULSAR_IP + ":" + PULSAR_PORT 74 | ).create_producer("created_objects") 75 | pulsar_producer.send(json.dumps(updated_objects_info).encode("utf8")) 76 | 77 | return mgp.Record() 78 | 79 | 80 | @mgp.read_proc 81 | def update_cluster(node: mgp.Vertex, community_id: int) -> mgp.Record(): 82 | updated_objects_info = {"vertices": [], "edges": []} 83 | 84 | updated_object = { 85 | "id": node.id, 86 | "labels": [label.name for label in node.labels], 87 | "username": node.properties["username"], 88 | "cluster": community_id, 89 | } 90 | updated_objects_info["vertices"].append(updated_object) 91 | 92 | if BROKER == "kafka": 93 | kafka_producer = KafkaProducer(bootstrap_servers=KAFKA_IP + ":" + KAFKA_PORT) 94 | kafka_producer.send( 95 | "created_objects", json.dumps(updated_objects_info).encode("utf8") 96 | ) 97 | else: 98 | pulsar_producer = pulsar.Client( 99 | "pulsar://" + PULSAR_IP + ":" + PULSAR_PORT 100 | ).create_producer("created_objects") 101 | pulsar_producer.send(json.dumps(updated_objects_info).encode("utf8")) 102 | 103 | return mgp.Record() 104 | -------------------------------------------------------------------------------- /memgraph/requirements.txt: -------------------------------------------------------------------------------- 1 | kafka-python==2.0.2 2 | pulsar-client==2.10.0 3 | -------------------------------------------------------------------------------- /memgraph/transformations/twitter.py: -------------------------------------------------------------------------------- 1 | import mgp 2 | import json 3 | 4 | 5 | @mgp.transformation 6 | def tweet( 7 | messages: mgp.Messages, 8 | ) -> mgp.Record(query=str, parameters=mgp.Nullable[mgp.Map]): 9 | result_queries = [] 10 | 11 | for i in range(messages.total_messages()): 12 | message = messages.message_at(i) 13 | tweet_dict = json.loads(message.payload().decode("utf8")) 14 | if tweet_dict["target_username"]: 15 | result_queries.append( 16 | mgp.Record( 17 | query=( 18 | "MERGE (u1:User {username: $source_username}) " 19 | "MERGE (u2:User {username: $target_username}) " 20 | "MERGE (u1)-[:RETWEETED]->(u2)" 21 | ), 22 | parameters={ 23 | "source_username": tweet_dict["source_username"], 24 | "target_username": tweet_dict["target_username"], 25 | }, 26 | ) 27 | ) 28 | else: 29 | result_queries.append( 30 | mgp.Record( 31 | query=("MERGE (:User {username: $source_username})"), 32 | parameters={"source_username": tweet_dict["source_username"]}, 33 | ) 34 | ) 35 | return result_queries 36 | -------------------------------------------------------------------------------- /run_kafka.sh: -------------------------------------------------------------------------------- 1 | echo Killing old Docker processes 2 | docker-compose rm -fs 3 | 4 | echo Building Docker images 5 | docker-compose build kafka 6 | docker-compose build memgraph-mage-kafka 7 | docker-compose build stream-kafka 8 | docker-compose build backend-kafka 9 | 10 | echo Starting Docker containers 11 | docker-compose up -d kafka 12 | docker-compose up -d memgraph-mage-kafka 13 | sleep 1 14 | docker-compose up -d stream-kafka 15 | docker-compose up backend-kafka 16 | -------------------------------------------------------------------------------- /run_pulsar.sh: -------------------------------------------------------------------------------- 1 | echo Killing old Docker processes 2 | docker-compose rm -fs 3 | 4 | echo Building Docker images 5 | docker-compose build pulsar 6 | docker-compose build memgraph-mage-pulsar 7 | docker-compose build stream-pulsar 8 | docker-compose build backend-pulsar 9 | 10 | echo Starting Docker containers 11 | docker-compose up -d pulsar 12 | docker-compose up -d memgraph-mage-pulsar 13 | sleep 1 14 | docker-compose up -d stream-pulsar 15 | docker-compose up backend-pulsar 16 | -------------------------------------------------------------------------------- /stream/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8 2 | 3 | COPY /stream /app/ 4 | WORKDIR /app 5 | 6 | # Install packages 7 | RUN pip3 install -r requirements.txt 8 | -------------------------------------------------------------------------------- /stream/data/scraped_tweets.csv: -------------------------------------------------------------------------------- 1 | source_username,target_username 2 | CapeCodGiftShop,RetroCEO 3 | CodeAttBot,LeeHillerLondon 4 | BattlegroundHs,getwhalinvest 5 | botpokemongofr1,TrevorAllenPKMN 6 | AnyaSha13331181,WORLDMUSICAWARD 7 | WCD7G2JNS6LWe1R,HuobiGlobal 8 | a_artindia,HuobiGlobal 9 | granvillestudio,Mommaparker2 10 | stannesrcp,Mommaparker2 11 | Saurabh17549421,HuobiGlobal 12 | ShebbearHead,HuobiGlobal 13 | VirtualJobs,LincsConnect 14 | hmmmi7,WORLDMUSICAWARD 15 | SkyRTRblxBot,wikioccult 16 | thomasoflondon1,greengagedesign 17 | a_artindia,greengagedesign 18 | NicoleVTae,WORLDMUSICAWARD 19 | kth7sins,WORLDMUSICAWARD 20 | jgmacleodauthor,DerekRKing2 21 | yougotgift,DerekRKing2 22 | VirtualJobs,LincsConnect 23 | janemanuelabras,MarcoMariani_IT 24 | CapeCodGiftShop,birdhousebooks 25 | FranckPontais,birdhousebooks 26 | Iunra,bmstores 27 | SuzieTullett,mandybaggot 28 | superteamml,CartersCollecta 29 | sea36984675,WORLDMUSICAWARD 30 | FriedPiperTK,WORLDMUSICAWARD 31 | TrevorAllenPKMN,WORLDMUSICAWARD 32 | Jilliemary,PenelopeRuzy 33 | HeartToHeartPri,kblacey 34 | _typo_queen,WORLDMUSICAWARD 35 | Teignbridge,RecycleDevon 36 | clasfras1,mikestokoe 37 | mnbm_bbytk,WORLDMUSICAWARD 38 | CeeDeeNo1,Amandalavan1 39 | tae_Anne_v,WORLDMUSICAWARD 40 | CathrynPearce,PenwithLP 41 | OST__king__V,WORLDMUSICAWARD 42 | KoothEngagement,WORLDMUSICAWARD 43 | LeslieWPGarland,AuthorJRose 44 | allin4675,WORLDMUSICAWARD 45 | tata04_10,WORLDMUSICAWARD 46 | kamera_one,WORLDMUSICAWARD 47 | thomasoflondon1,CartersCollecta 48 | conor_kostick,NLIreland 49 | beeley52,bmstores 50 | noonavnim,WORLDMUSICAWARD 51 | tistabene,WORLDMUSICAWARD 52 | sautterlas65,WORLDMUSICAWARD 53 | AshGrover2,workstatusapp 54 | falmouthjen,thelaceylondon 55 | CoralSherriffs,beautys_legacy 56 | msfowling,beautys_legacy 57 | GrahamR82067146,PetMunchies 58 | GreetPrimary,PetMunchies 59 | YinOhh,WORLDMUSICAWARD 60 | HarkwellLabels,WORLDMUSICAWARD 61 | LizanneLloyd,LynnsWPics 62 | NIAROBI__,NoniDiba 63 | MariaOD05737730,servicerotties 64 | deweyjaci76,AnneGWoodhead1 65 | CoralSherriffs,beautys_legacy 66 | SubirDa87742949,beautys_legacy 67 | fantasymsinfo,beautys_legacy 68 | inverclyde,totbcreditunion 69 | Pakbrewog,totbcreditunion 70 | granvillestudio,MugsofFunGifts 71 | GovanoNathan,Kuri_Nyann 72 | rido_kate,letterland 73 | taehyungsnoona7,WORLDMUSICAWARD 74 | BobbyDazzlers5,shrewsmorris 75 | FizzFozz,HuobiGlobal 76 | Alince6,WORLDMUSICAWARD 77 | OctanormUK,WORLDMUSICAWARD 78 | THEHugoDrax1979,russty_russ 79 | rozvnuit,WORLDMUSICAWARD 80 | Rezkiansyah_14,WhiteDogeToken 81 | ff_joanna,shrewsmorris 82 | granvillestudio,MugsofFunGifts 83 | craftginclub,MechelleRoweJ 84 | EwaMariaDerrick,AnnaCampbelloz 85 | FreshTomatoesMP,AnnaCampbelloz 86 | SubirDa87742949,MEXC_Global 87 | Grand_Theatre,bpoolsocialclub 88 | EXPO2020Croatia,bpoolsocialclub 89 | Masoud74115192,HuobiGlobal 90 | inbusiness4good,HuobiGlobal 91 | OxfordshireCF,oxhomelessmvt 92 | EwaMariaDerrick,LRL8 93 | EwaMariaDerrick,LRL8 94 | TRFT_Charity,LRL8 95 | mandybaggot,The__SadieRyan 96 | NatKleinman,mandybaggot 97 | blackcatbutton,TwystedRoots 98 | AramarSolutions,TwystedRoots 99 | GrowURStream,RoverDov123 100 | LachimolalaMnl,RoverDov123 101 | SarahDaisyBlue,CosimacraftsSue 102 | GHC97050895,HuobiGlobal 103 | MrsMinaF,RDCSolicitors 104 | Lariyu26,JosieRiki 105 | GriefProbate,JosieRiki 106 | WaterToGo_,JosieRiki 107 | ADG_IQ,JosieRiki 108 | MyWatering,JosieRiki 109 | Lariyu26,JosieRiki 110 | SDFpodcast,jangles 111 | Liran_idk,ilan_profile 112 | broadwaypublish,ilan_profile 113 | carolioncats,getdexterhome 114 | AlleynCourtFrst,getdexterhome 115 | privkth95,WORLDMUSICAWARD 116 | loobyjaynegames,HamleysOfficial 117 | cindy_griffen,HamleysOfficial 118 | matthewrw1978,BloomsburyEd 119 | eggsypony,TheHugsFoundat1 120 | mikay2999,WORLDMUSICAWARD 121 | NorthmeadSquare,WORLDMUSICAWARD 122 | TopBananaMall,WORLDMUSICAWARD 123 | CornwallClld,WORLDMUSICAWARD 124 | OdooJobss,Serpent_CS 125 | nicotatsuta,Dreamer_Lennon 126 | kirana_dns,WORLDMUSICAWARD 127 | jolenehunter,WORLDMUSICAWARD 128 | nalafer,SzamerM 129 | ComnectTech,SzamerM 130 | granvillestudio,The_Bottle_Bin 131 | beyoutifulni,The_Bottle_Bin 132 | JKThv_vk,WORLDMUSICAWARD 133 | mellors_karen,getdexterhome 134 | bloggeray23,ChloeLe39602964 135 | segura_quesada,AnteriosGame 136 | ElectronNest,PenelopeRuzy 137 | thegaudidragon,Rachael57354278 138 | gosquad22,paramsatwadhar 139 | Radio247UK,paramsatwadhar 140 | haowen80878155,HuobiGlobal 141 | Sue71319850,mandybaggot 142 | PurplehandsomeV,WORLDMUSICAWARD 143 | elxxxfndr,WORLDMUSICAWARD 144 | lje0407,WORLDMUSICAWARD 145 | WaterWorxUK,VisitLancashire 146 | LoriDeSalvo32,christmas_clock 147 | sashal_distaun,WORLDMUSICAWARD 148 | Ariell1524,ameensajwani 149 | SheilaM74102879,WORLDMUSICAWARD 150 | AutomaticEarth,OnlyBlueHat 151 | annefutch,Montydogge 152 | Emmatrevillion1,a1clutches 153 | paramsatwadhar,a1clutches 154 | cazajuguetes,a1clutches 155 | Outmodedpoem,Thi4go_Luz 156 | GreenPinkTeam,Thi4go_Luz 157 | vkkthcore,WORLDMUSICAWARD 158 | SpecialBoee,Austeiin 159 | BennyMeadows,Austeiin 160 | otamaNRC,WORLDMUSICAWARD 161 | EpicDeerToken,WORLDMUSICAWARD 162 | KTHLUUH,WORLDMUSICAWARD 163 | ECC_malta,WORLDMUSICAWARD 164 | thomasoflondon1,Ness_SeaGlass 165 | MAB_Bingley,Ness_SeaGlass 166 | FusicMilm,Serpent_CS 167 | Olhahoneynight,WORLDMUSICAWARD 168 | IzzyJon67069546,KarenBa10864733 169 | anitabellibooks,emmarobinsonuk 170 | DianeK40697479,Cooper_Lechat 171 | MadhumantiMukh5,WORLDMUSICAWARD 172 | CounterspellCo,BriallenJones 173 | kkr9912,WORLDMUSICAWARD 174 | Sinders21,tyhafan 175 | superteamml,IBaubliene 176 | HrochPavel,IBaubliene 177 | KTHpraiser,WORLDMUSICAWARD 178 | WaterWorxUK,SocialMedia4i 179 | taki7x,rojiurastreet 180 | GlenisKellet,MainChannel_ 181 | ladiesthatlift2,SheweeWC 182 | Owsou1xrBFk4fJ9,WORLDMUSICAWARD 183 | memysamoor,WORLDMUSICAWARD 184 | inbusiness4good,WORLDMUSICAWARD 185 | IBaubliene,WORLDMUSICAWARD 186 | dani198800,WORLDMUSICAWARD 187 | SPMVOAK,WORLDMUSICAWARD 188 | savvysykoolober,denijedi 189 | bunnytaekv,WORLDMUSICAWARD 190 | AriesTanjuan,Shan3593 191 | your_harrogate,PeteEgerton 192 | WaterWorxUK,ParkSquareWF5 193 | RABJr3030,christmas_clock 194 | jangles,christmas_clock 195 | harmony_kent,christmas_clock 196 | iKVA_ai,christmas_clock 197 | BlithehaleThe,christmas_clock 198 | mytete3,WORLDMUSICAWARD 199 | VxK901230,WORLDMUSICAWARD 200 | najme99x,HuobiGlobal 201 | PeteEgerton,HuobiGlobal 202 | i_use_joycons,SzamerM 203 | Davood16747173,MEXC_Global 204 | IUmusic_forALL,ChloeLe39602964 205 | thegiftbox_irl,ChloeLe39602964 206 | DadJokesNow,ChloeLe39602964 207 | potato9_sweet,WORLDMUSICAWARD 208 | VapourCloud_,WORLDMUSICAWARD 209 | amini54art,sofiartmedia 210 | GoldCareHomes,sofiartmedia 211 | mist1121,WORLDMUSICAWARD 212 | IamFayeAmanda,tiktok_best_of 213 | HodderShal,ataxiascot 214 | TheresaAlison1,HamleysOfficial 215 | bbh_rubix,HamleysOfficial 216 | WaterWorxUK,ShoutExpo 217 | EmmaFieldhouse,ShoutExpo 218 | Sana61361735,WORLDMUSICAWARD 219 | Sneekyhen2,LucyLogical 220 | donthideBhind7,WORLDMUSICAWARD 221 | Davood16747173,WORLDMUSICAWARD 222 | whitegablesgwy,WORLDMUSICAWARD 223 | chibichi24,WORLDMUSICAWARD 224 | wolfbunny09,WORLDMUSICAWARD 225 | whitegablesgwy,JohnFromPBurg 226 | EnergyRA,JohnFromPBurg 227 | Elva_Eco_Dragon,R_Tsakalidis 228 | whitegablesgwy,R_Tsakalidis 229 | HollikMiklos,PetMunchies 230 | VTaehyungbear,WORLDMUSICAWARD 231 | dawnhalliday,WORLDMUSICAWARD 232 | OneChippenham,youlovegifts 233 | purdyme123,youlovegifts 234 | MaxMust63302429,allianceonline 235 | afterbuzztv,allianceonline 236 | uxbookreviews,uxlinks 237 | HeuwRonald,HuobiGlobal 238 | R_Tsakalidis,HuobiGlobal 239 | ClearChannelNI,HuobiGlobal 240 | peasandpeonies,FLChefNicole 241 | non01,uxlinks 242 | sothye,WORLDMUSICAWARD 243 | blackcatbutton,Ness_SeaGlass 244 | _Floutchi_,getwhalinvest 245 | Taestan_Only,WORLDMUSICAWARD 246 | ShaunAshmore2,WORLDMUSICAWARD 247 | Davood16747173,WORLDMUSICAWARD 248 | MKTheatre,My_MiltonKeynes 249 | dani198800,My_MiltonKeynes 250 | Fafou_breeh,getwhalinvest 251 | HollikMiklos,pbshop_store 252 | SaubKhare,SaurabhKhare009 253 | PierreLecheval1,getwhalinvest 254 | Parveen50063828,SaurabhKhare009 255 | bokohalal,KhaledAjib 256 | ___bored_af,WORLDMUSICAWARD 257 | lavidaholoka,WORLDMUSICAWARD 258 | taebrownSuga,WORLDMUSICAWARD 259 | Eastgatecare,WORLDMUSICAWARD 260 | Radio247UK,WORLDMUSICAWARD 261 | ChristnResource,WORLDMUSICAWARD 262 | Ksnproductions1,WORLDMUSICAWARD 263 | B17sallyb,beanies_masato 264 | ADG_IQ,beanies_masato 265 | taeRivetted,WORLDMUSICAWARD 266 | Ali_Leith,WORLDMUSICAWARD 267 | miki_ki15,WORLDMUSICAWARD 268 | blackcatbutton,BadgerCrafty 269 | cragga1982,EV2Sportswear 270 | MrsP_A,ChloeLe39602964 271 | stannesrcp,ChloeLe39602964 272 | apextraxs,ChloeLe39602964 273 | apextraxs,ChloeLe39602964 274 | SaurabhRashtra1,SaurabhKhare009 275 | apextraxs,SaurabhKhare009 276 | F4Pinfo,SaurabhKhare009 277 | RibbleValleysue,frome_maude 278 | apextraxs,frome_maude 279 | Sylvia_FineArt,cjsrustictouch 280 | inbusiness4good,cjsrustictouch 281 | LinnBHalton,cjsrustictouch 282 | RibbleValleysue,frome_maude 283 | SSadyand,getwhalinvest 284 | works_mettle,getwhalinvest 285 | Dajong0606,PeggyNg05 286 | NFIU_Latvia,PeggyNg05 287 | alluringTAEbae,WORLDMUSICAWARD 288 | sengelchen1976,bmstores 289 | kthhaebaragi,WORLDMUSICAWARD 290 | Quantum_Dragon,WORLDMUSICAWARD 291 | RibbleValleysue,frome_maude 292 | ECOLOGIA1000,beincrypto 293 | CapeCodGiftShop,Robinsontb21 294 | bts_1365244_v,WORLDMUSICAWARD 295 | ChooseLife_CC,WORLDMUSICAWARD 296 | PoplarNurseries,WORLDMUSICAWARD 297 | School_RdSafety,WORLDMUSICAWARD 298 | HamdiBadat,Phemex_official 299 | taehapppppy1230,WORLDMUSICAWARD 300 | DennisKoch10,WORLDMUSICAWARD 301 | ellezeta23,christmas_clock 302 | LingaWine,christmas_clock 303 | PauletteC_V,WORLDMUSICAWARD 304 | littlefabshop,CartersCollecta 305 | Arnie_Boyle,CartersCollecta 306 | followyouswap,CartersCollecta 307 | followyouswap,pbshop_store 308 | blackcatbutton,GlassCrafty 309 | HowellsSchool,GlassCrafty 310 | ergo_STORE,GlassCrafty 311 | Scieducation1,BloomsburyEd 312 | gabbryden,WORLDMUSICAWARD 313 | multifandom_art,CadenReigns 314 | wivk1077,CadenReigns 315 | Bae43_Ls,toon_app 316 | __Ladynash,Alfonzowords2 317 | PenwithLP,Alfonzowords2 318 | 7q4hNFJ7mAf2iiT,WORLDMUSICAWARD 319 | GeorReader,aswayners 320 | Fati66257665,WORLDMUSICAWARD 321 | comrie4ever,GroupKaczmarek 322 | littlefabshop,elliestreasures 323 | babul08598468,MEXC_Global 324 | Minarasaei,ranamansourvar 325 | canelo_co,ranamansourvar 326 | blackcatbutton,GlassCrafty 327 | Julien74744980,getwhalinvest 328 | inbusiness4good,getwhalinvest 329 | JoanneJ96366976,nico_gaia 330 | Gata_Lechucera,Cooper_Lechat 331 | Jalal87910984,YM110011 332 | Nisah77024888,WORLDMUSICAWARD 333 | CentralHairAcad,WORLDMUSICAWARD 334 | dimplegowda013,WORLDMUSICAWARD 335 | letterland,WORLDMUSICAWARD 336 | NKPRODUCTION13,Cooper_Lechat 337 | BenchOriginal,Cooper_Lechat 338 | blueberry0022,HamleysOfficial 339 | dani198800,HamleysOfficial 340 | Kelvinl13127827,Tripcandyio 341 | Riki04,aswayners 342 | AHPrimary,aswayners 343 | KingsLynnLive,cranesheds 344 | SaurabhKhare009,cranesheds 345 | MHHSBD,CartersCollecta 346 | jkyle2184,RobuxCity 347 | Naya30121995,WORLDMUSICAWARD 348 | kartikahiro,WORLDMUSICAWARD 349 | scholasticuk,newscothill 350 | LlandoughSchool,newscothill 351 | PushpaP68626550,WORLDMUSICAWARD 352 | offeroasis,WORLDMUSICAWARD 353 | MHHSBD,youth_tree 354 | littlefabshop,TheGingerMint 355 | 25yrsMusssa,WVSouthSudan 356 | laescandella,WVSouthSudan 357 | TTabbyshack,WorksUncommon 358 | peasandpeonies,trendymomreview 359 | UPSCPractice,trendymomreview 360 | KONKSTYLE,trendymomreview 361 | Rockringlady,trendymomreview 362 | Tedd_Heating,trendymomreview 363 | SundrySupplies,trendymomreview 364 | fbeonline,trendymomreview 365 | CartersCollecta,trendymomreview 366 | littlefabshop,cjsrustictouch 367 | V_1twt,WORLDMUSICAWARD 368 | BalancedHut,WORLDMUSICAWARD 369 | DonnaPh79122599,getdexterhome 370 | bpoolsocialclub,getdexterhome 371 | origato,mikestokoe 372 | verger_st,mikestokoe 373 | _PocketMemories,mikestokoe 374 | CoburgBanks,mikestokoe 375 | totbcreditunion,mikestokoe 376 | anitadagg,bmstores 377 | risestudios,bmstores 378 | Naylorwintersg,bmstores 379 | InfansyS,bmstores 380 | MHHSBD,littlefabshop 381 | DCLAReadingRoom,NLIreland 382 | billboardsa,NLIreland 383 | KuroShamu,KayzinArts 384 | BSOPBedford,KayzinArts 385 | RAINYDAYTRUST,KayzinArts 386 | FRONTIERFM,KayzinArts 387 | Rediscova1,KayzinArts 388 | rocks_infinity,KayzinArts 389 | MHHSBD,TheCraftyNoo 390 | essentialcuisin,TheCraftyNoo 391 | MicrosoftUK,TheCraftyNoo 392 | RHolmesSW19,TheCraftyNoo 393 | PolDep_Cohesion,TheCraftyNoo 394 | FulcrumKitchens,TheCraftyNoo 395 | littlecogs,TheCraftyNoo 396 | TYDE_Plumbing,TheCraftyNoo 397 | FlyfreEllie,DAFTrucksUK 398 | AngelAdvanceUk,DAFTrucksUK 399 | SonnerToys,DAFTrucksUK 400 | BaristaBrews,DAFTrucksUK 401 | easyGuide_UK,DAFTrucksUK 402 | ChrishaModis,DAFTrucksUK 403 | PorcupinePR,DAFTrucksUK 404 | Business_Micros,DAFTrucksUK 405 | Ozdealsonline1,DAFTrucksUK 406 | StylistMagazine,DAFTrucksUK 407 | bnb952,EV2Sportswear 408 | cult_edge,AdamManning 409 | SteveK157DFC,ThePLSA 410 | Anand78551928,HuobiGlobal 411 | theorldn,mediashotz 412 | Sky360org,shadowsmagazine 413 | AxieElSanchos,getwhalinvest 414 | Cavime,getwhalinvest 415 | EWebDigital1,getwhalinvest 416 | mihomiho0035,WORLDMUSICAWARD 417 | taekook_oonly,WORLDMUSICAWARD 418 | Bam19960,WhiteDogeToken 419 | GardnerAntiques,WhiteDogeToken 420 | MHHSBD,CartersCollecta 421 | KokoArmy10,WORLDMUSICAWARD 422 | RobertsO10,ZatuHome 423 | Browsholme,VisitLancashire 424 | NoonaTae__,WORLDMUSICAWARD 425 | nargis__sheikh_,WORLDMUSICAWARD 426 | yudhapati88,maysaa_ajami 427 | MillieMoonlight,bmstores 428 | savvysykoolober,IrynaLopushans3 429 | pediox,EastTNSoldier 430 | thek7777,WORLDMUSICAWARD 431 | yudhapati88,KhaledAjib 432 | MindUndisputed,wealthsmith_ltd 433 | MHHSBD,CartersCollecta 434 | pamskylar,WORLDMUSICAWARD 435 | WaFa40991717,WORLDMUSICAWARD 436 | boraVpurpleV,WORLDMUSICAWARD 437 | Radio247UK,WORLDMUSICAWARD 438 | NesilCrypto,MEXC_Global 439 | Cecilia_CruzM,WORLDMUSICAWARD 440 | Devina080,WORLDMUSICAWARD 441 | COP27_Egypt,inbusiness4good 442 | emacorona10,Landycool_37 443 | lovefaehyung,WORLDMUSICAWARD 444 | cutetaetae25,WORLDMUSICAWARD 445 | DeEva21759005,ScribblesWorth1 446 | CatholicShareC,ScribblesWorth1 447 | mr_garyfish1980,DAFTrucksUK 448 | msstraighty180,DAFTrucksUK 449 | LeedsNews,DAFTrucksUK 450 | GloriatibiTri,MarcoMariani_IT 451 | DsPhamVanHung,MarcoMariani_IT 452 | PodNationPods,podlyirregular 453 | v_kx2mama,WORLDMUSICAWARD 454 | littlefabshop,Canarylittle 455 | BoleynLoyalist,WORLDMUSICAWARD 456 | nzl829,WORLDMUSICAWARD 457 | NyssaWest,WORLDMUSICAWARD 458 | pilinyan,mikestokoe 459 | CheemsInu_Army,mikestokoe 460 | silvernemesis,HamleysOfficial 461 | VANT3TA3,WORLDMUSICAWARD 462 | DLStrokeSupGrp,HealthPromoLUH 463 | yudhapati88,nur_chaaban 464 | EmmaHughesEvan1,KittyWilson23 465 | FluxRotherham,CliftonParkMus 466 | CZ05032126,steemit 467 | Antonia_Author,KatieMettner 468 | GerryNeill2021,KatieMettner 469 | stillovebritain,LucyLogical 470 | Lctaehyung1,WORLDMUSICAWARD 471 | Cazcham,bmstores 472 | yourkpopsoul,WORLDMUSICAWARD 473 | IKhoroshaeva,DebsDesignsUK 474 | Agris2,DebsDesignsUK 475 | mobizcorp,DebsDesignsUK 476 | Calis_tae,WORLDMUSICAWARD 477 | jane__eden,ChloeLe39602964 478 | MaisonDieuDover,ChloeLe39602964 479 | deacon_adrian,ChloeLe39602964 480 | Bananatie_,Dreamer_Lennon 481 | gab_lemonade,AxieFreedom 482 | tobygoldsmith,EV2Sportswear 483 | LindaHuber19,The__SadieRyan 484 | Xientifica,The__SadieRyan 485 | Antonia_Author,DebbieViggiano 486 | judetheconfused,mikestokoe 487 | yudhapati88,AbirachedNaji 488 | Firegoddess_8,pbshop_store 489 | uxlinks,pbshop_store 490 | vcr_i7,WORLDMUSICAWARD 491 | MendozaSheh,WORLDMUSICAWARD 492 | AdamManning,WORLDMUSICAWARD 493 | LaxmiNiraula9,Sharon98422405 494 | dr_hick,agnesjuliet 495 | littlefabshop,kblacey 496 | indiedailynews,pixmain 497 | ReGamertron,May48067575 498 | blackcatbutton,ArgyllSeaGlass 499 | RobKeeleyAuthor,ArgyllSeaGlass 500 | EwaMariaDerrick,cleanse29 501 | PopCafe_,cleanse29 502 | JordyMevissen,cleanse29 503 | ShireBrokers,PDSA_HQ 504 | vam237,confundustria 505 | MyBodyIsMeBooks,Autismstoke 506 | Suttonvegan,Autismstoke 507 | TopBananaMall,Autismstoke 508 | Quickbadge,Autismstoke 509 | Londoncryptoex,Autismstoke 510 | FlexiHex,s_cellars 511 | TheBTCMaker,LQS_Media 512 | pozhilovai,WORLDMUSICAWARD 513 | recordsetterTAE,WORLDMUSICAWARD 514 | sugarbooseokjin,Min_Genius1994 515 | TaesMoMajie,WORLDMUSICAWARD 516 | EraseAllKittens,WORLDMUSICAWARD 517 | bbeetleko,LoveEnmu 518 | joshuatreekids,LoveEnmu 519 | peasandpeonies,HipMamasPlace 520 | cmsturk_,Phemex_official 521 | cheerrymate,Phemex_official 522 | superteamml,howarths63 523 | steemit,howarths63 524 | MaxMust63302429,AullorNothing 525 | ItalianKidProbs,YLDFRA 526 | GreetPrimary,YLDFRA 527 | Ermaerv82143308,WORLDMUSICAWARD 528 | TATIJewelry,howarths63 529 | star100x,BaskersBoutique 530 | BejoLesmana,BaskersBoutique 531 | blackcatbutton,GermanderCC 532 | TaeBearAlways,WORLDMUSICAWARD 533 | lor_gill,ChloeLe39602964 534 | Lenijayn_btsV,WORLDMUSICAWARD 535 | makewebbetter,WORLDMUSICAWARD 536 | socentie,buysocialie 537 | El_Gatito89,GeneralCattis 538 | armyleecious97,WORLDMUSICAWARD 539 | mookie0613,WORLDMUSICAWARD 540 | SAMPAuk_,getdexterhome 541 | Yevhen43278272,HuobiGlobal 542 | SPMVOAK,HuobiGlobal 543 | harmony_kent,BetteAStevens 544 | pixmain,BetteAStevens 545 | majestictete,WORLDMUSICAWARD 546 | 32_Alpha_Press,LucyLogical 547 | jjfizz,pbshop_store 548 | My_winTaebear,WORLDMUSICAWARD 549 | soonshim3,WORLDMUSICAWARD 550 | 4Tchat,SDWorx 551 | EwaMariaDerrick,MaryLSchmidt 552 | 5140481bittu,HuobiGlobal 553 | FashionKair,HuobiGlobal 554 | itselliekim,WORLDMUSICAWARD 555 | IKhoroshaeva,RegaResearch 556 | EwaMariaDerrick,dani_haviland 557 | MarilynShimmie1,b_bella_doxies 558 | peasandpeonies,MySweetZepol 559 | EwaMariaDerrick,KatieMettner 560 | Taebaee3,WORLDMUSICAWARD 561 | MarlaWeezie,TheStourbridge 562 | SeanGaret,Guide4Nutrition 563 | redroxyxxx,CocoDeMerUK 564 | sarcellec,aj_pritchett 565 | HarlesdenNews,Chana_Chemist 566 | Sospan75,Chana_Chemist 567 | LekAung,WORLDMUSICAWARD 568 | jjfizz,HamleysOfficial 569 | DrDWaterhouse,Eastenglanduk 570 | Yordanka,Eastenglanduk 571 | SarahofScrubs,SSStrays 572 | georginascull,MckinlayCaron 573 | Largobaycomber,KittyWilson23 574 | Kriptoaslani,ChintaiNetwork 575 | buysocialie,ChintaiNetwork 576 | WestLancsFLF,WLancsCollege 577 | WhyMehrab,WLancsCollege 578 | MrSidC64,bitmap_books 579 | assalnajian,Sepidart8 580 | EffinSeaGull,BeepDoctors 581 | junub_bot,Atekertv 582 | thescarface99,Cooper_Lechat 583 | Radio247UK,Cooper_Lechat 584 | Grandkathy,PussycatNaughty 585 | ClaudiaGMorell,LauraG_RM 586 | DVachirawit,WORLDMUSICAWARD 587 | authorkatyrose,WORLDMUSICAWARD 588 | Atekertv,WORLDMUSICAWARD 589 | MarcoMariani_IT,WORLDMUSICAWARD 590 | sanya25S,WORLDMUSICAWARD 591 | vvtaetae97,WORLDMUSICAWARD 592 | LeinadDOP80,HamleysOfficial 593 | LluisLis_GK,Eric_HODL 594 | GouravY68884863,Serpent_CS 595 | drumpfbot2016,THAIHOMESHOP 596 | Antonia_Author,KatieMettner 597 | izmarktuan,WORLDMUSICAWARD 598 | ShowersOfLightx,WORLDMUSICAWARD 599 | blackcatbutton,TheCraftyNoo 600 | OneCreativeCat1,GermanderCC 601 | KieranGaming94,Pixel_Pumpkin_ 602 | blackcatbutton,littlefabshop 603 | BriallenJones,littlefabshop 604 | tavwp,yns_gh 605 | myHansungTae,WORLDMUSICAWARD 606 | IKhoroshaeva,samylovesbags 607 | moha1530,RobuxCity 608 | IKhoroshaeva,ArgyllSeaGlass 609 | lemoned1230,WORLDMUSICAWARD 610 | AndreasK1848,GERonAsia 611 | THAIHOMESHOP,GERonAsia 612 | naghma_atlasia,ChristiesDirect 613 | GoelBook,ChristiesDirect 614 | bookmarkmccree,OrkneyLibrary 615 | YANINA015625464,WORLDMUSICAWARD 616 | khriste5,ChloeLe39602964 617 | heevminwoo,WORLDMUSICAWARD 618 | ronmillington2,WORLDMUSICAWARD 619 | PrincessPKaur,WORLDMUSICAWARD 620 | Supermom25,HuobiGlobal 621 | KarlKavanagh69,crontoncoll 622 | GANDEEVASAN,crontoncoll 623 | i_am_secretcat,Canarylittle 624 | blackcatbutton,youth_tree 625 | PoshJocks,youth_tree 626 | FSatriaN,CubemanArt 627 | MartechScroll,CubemanArt 628 | jasonorz1003,MEXC_Global 629 | Londonbeachspa,MEXC_Global 630 | MarieMartinx,MEXC_Global 631 | Somy29jk2,WORLDMUSICAWARD 632 | SGK74,WORLDMUSICAWARD 633 | bnb952,getwhalinvest 634 | TammyDevoll,dineshswami1 635 | BarnCardington,dineshswami1 636 | cbd_hour,dotty4paws 637 | taevely6,WORLDMUSICAWARD 638 | SkyRTRblxBot,wikioccult 639 | Mediawatcher36,shawarmatizing 640 | DinaFerrer5,WORLDMUSICAWARD 641 | BotOfDogecoin,msam74511 642 | glanoer,msam74511 643 | CHAMANS62708039,MRSTEVESCORNER1 644 | the_news_21,MRSTEVESCORNER1 645 | barmanmridu3,WORLDMUSICAWARD 646 | IKhoroshaeva,Canarylittle 647 | BuckarooCrypto,Mayra_9797 648 | IKhoroshaeva,MegMusicManiac 649 | wntrbr_blsd,WORLDMUSICAWARD 650 | michael15071997,christmas_clock 651 | SparklyCooper,ACGoatham 652 | ScribnScratch54,PaulWatkins14 653 | michael15071997,christmas_clock 654 | don_pelf,CabanaGrills 655 | Get_Optimal,CabanaGrills 656 | gosquad22,bored_wine 657 | JohnDanielShop,bored_wine 658 | Welshman211,bored_wine 659 | MindTrainCIC,WLancsCollege 660 | BrackenLanePA,WLancsCollege 661 | blueparrot_10,WORLDMUSICAWARD 662 | Yolk_Recruit,WORLDMUSICAWARD 663 | johnrhueston,WORLDMUSICAWARD 664 | KatP1812,HamleysOfficial 665 | JacyBrean,pawpaw_ray 666 | yu100_kun,ReinaLove88 667 | hugsforTaehyung,WORLDMUSICAWARD 668 | Comedypodcastde,podlyirregular 669 | LSHeadHarrowHK,Harrow_HK 670 | TATIJewelry,leo_tyrell3 671 | TaeBear_3191,WORLDMUSICAWARD 672 | TheRealFs0c1eTy,Whichwaygameso1 673 | theDomainBot,bored_wine 674 | FaultsCog,bored_wine 675 | txrxdata,getwhalinvest 676 | Maharaja_bhog,getwhalinvest 677 | bored_wine,getwhalinvest 678 | lconlin,ChloeLe39602964 679 | COPYTRACK,ChloeLe39602964 680 | VBoxysmile,WORLDMUSICAWARD 681 | MyWatering,WORLDMUSICAWARD 682 | humna_naseer,WORLDMUSICAWARD 683 | ennomnom,e_eglobalpress 684 | RuddyPluck,ChloeLe39602964 685 | Ness_SeaGlass,cjsrustictouch 686 | LauraG_RM,cjsrustictouch 687 | jhay012341,thinkofthefun 688 | Celine_shia,WORLDMUSICAWARD 689 | BeauchampPC,HarboroughDC 690 | Camper_UK,BottleGlassPub 691 | niall_flynn,NLIreland 692 | BTSV_PAK,WORLDMUSICAWARD 693 | cooksgalleyltd,WORLDMUSICAWARD 694 | MIMICHA19951230,WORLDMUSICAWARD 695 | paulandkateloy1,EV2Sportswear 696 | KelleniDr,EV2Sportswear 697 | JaklynnSmith,Thi4go_Luz 698 | Grandkathy,adriannarenee09 699 | superteamml,ClothesForCat 700 | kookv8874,WORLDMUSICAWARD 701 | KatP1812,pbshop_store 702 | taechwita1230,WORLDMUSICAWARD 703 | IKhoroshaeva,ClothesForCat 704 | RobinBoiO7,CiervoKing 705 | RobertsO10,BaskersBoutique 706 | HertsPolice,roadsafetyherts 707 | msam74511,roadsafetyherts 708 | MillieLm888,BaskersBoutique 709 | LGmFv8jDLLriLv9,WORLDMUSICAWARD 710 | st_kurniawan,farghaly76 711 | ChristmasCo2021,farghaly76 712 | KerryWaite7,quickbydesign 713 | FSBSussex,FSBSurrey 714 | mattgraveling,HelenHampton 715 | oxfam_harpenden,HelenHampton 716 | yudhapati88,farghaly76 717 | 6Colne,bmstores 718 | CuteForeveerrr,WORLDMUSICAWARD 719 | PatKennyNT,WORLDMUSICAWARD 720 | Masp48275454,HuobiGlobal 721 | VbaritoneLegend,WORLDMUSICAWARD 722 | Emmatrevillion1,HamleysOfficial 723 | londonbel0w,NZBatman 724 | e_eglobalpress,NZBatman 725 | class5aWLP,NZBatman 726 | peyrugue,b_bella_doxies 727 | 1230THVKIM,WORLDMUSICAWARD 728 | garysouter,EV2Sportswear 729 | MissSummer_Rain,Wahlbonkers 730 | judetheconfused,wickedleeksmag 731 | Wacomi31,getwhalinvest 732 | YasilAdd,2021Gingerbread 733 | Taehyugism_123,WORLDMUSICAWARD 734 | Lostlain1,HelenHampton 735 | DjYayaOzawa,HelenHampton 736 | stephi_glasgow,bmstores 737 | shijianjiulehu1,DoodlePoodleNFT 738 | KeantoAlfha,ApazaradoSparky 739 | irishgerontsoc,ApazaradoSparky 740 | sergimagugliani,GoogleExpertUK 741 | celestiaallewin,LQS_Media 742 | aDoddle_UK,LQS_Media 743 | JudyNagy8,ToyLockerUK 744 | GerardBrowne16,TheStourbridge 745 | MoonDragonAsha,TheStourbridge 746 | viyomjain,Nagarro 747 | b3vantae,WORLDMUSICAWARD 748 | ReevesDesign,WORLDMUSICAWARD 749 | VallelyClare,PhillysDiner 750 | _Tina_7_5,WORLDMUSICAWARD 751 | OInterreg,WORLDMUSICAWARD 752 | campdenonline,WORLDMUSICAWARD 753 | CabanaGrills,WORLDMUSICAWARD 754 | nikkiyowo,WORLDMUSICAWARD 755 | ppjk_twtpp,WORLDMUSICAWARD 756 | brighterbunnies,WORLDMUSICAWARD 757 | alina_janelle,WORLDMUSICAWARD 758 | yamahdi31351,WORLDMUSICAWARD 759 | Thazin90762499,WORLDMUSICAWARD 760 | andyetc,ChloeLe39602964 761 | DarkKnight_888,Top3_betsofday 762 | thvspace,WORLDMUSICAWARD 763 | SerdarDrmz,HuobiGlobal 764 | Radio247UK,HuobiGlobal 765 | PS_taetae,WORLDMUSICAWARD 766 | thvinions,WORLDMUSICAWARD 767 | SnowFairy29,ChloeLe39602964 768 | hyung90219,WORLDMUSICAWARD 769 | Lymestoneales,WORLDMUSICAWARD 770 | hamzah_bayati,EastTNSoldier 771 | youth_tree,EastTNSoldier 772 | ggong_710,WORLDMUSICAWARD 773 | Hasarp2,marcuslemonis 774 | Almighty_B_Doge,HuobiGlobal 775 | radiocartoonist,mikestokoe 776 | AngelaV59500207,WORLDMUSICAWARD 777 | SDaNessuno,Roofero3 778 | FeelBetter2day,A_ZPoint 779 | PandAlmighty,HuobiGlobal 780 | walk1961,gamerstudioltd 781 | ITWalford,ChloeLe39602964 782 | lUwIb024pmEWwg4,WORLDMUSICAWARD 783 | Carriecakes80,HamleysOfficial 784 | RobertsO10,SnuggHomes 785 | Eden_Shopping,SnuggHomes 786 | C70WNW0R7D,Cooper_Lechat 787 | TopBananaMall,Cooper_Lechat 788 | taehyunglowkey,WORLDMUSICAWARD 789 | VeritatisetLum1,WORLDMUSICAWARD 790 | masato_jones,beanies_masato 791 | Dolaus71,getwhalinvest 792 | Ness_SeaGlass,beezyandco 793 | masato_jones,beanies_masato 794 | BrendenMoore29,beanies_masato 795 | PhoenixYork,beanies_masato 796 | pray4kenny_,JoshRoomsburg 797 | maturetrade,JoshRoomsburg 798 | _KrisAngels,JoshRoomsburg 799 | roadsafetyherts,JoshRoomsburg 800 | BarryLibrary,pplscollection 801 | LaunchburyClai1,frogmomblog 802 | annamac48498443,SSStrays 803 | masum0112,MEXC_Global 804 | COLA_Trust,Galleywall_CoLA 805 | HagTeenzcoolit,Kidzcoolit 806 | walk1961,BloomsburyEd 807 | LBBeautySpa,TenterdenDeals 808 | FSTL90,TenterdenDeals 809 | HagTeenzcoolit,Kidzcoolit 810 | Ness_SeaGlass,atKilaKitu 811 | PraptiDas17,WORLDMUSICAWARD 812 | ReGamertron,ccstellarsweets 813 | RajiPriyonoNFT,CubemanArt 814 | ToyLockerUK,CubemanArt 815 | HagTeenzcoolit,Kidzcoolit 816 | Ness_SeaGlass,MiambaBoutique 817 | TrotecUK,MimakiEurope 818 | HagTeenzcoolit,Kidzcoolit 819 | Jojangles55,AvonBooksUK 820 | PurpleMic_0901,WORLDMUSICAWARD 821 | Lavande85164944,WORLDMUSICAWARD 822 | khoodeelaar,Cooper_Lechat 823 | HagTeenzcoolit,Kidzcoolit 824 | Srvvnz,Kidzcoolit 825 | v_luv_12,WORLDMUSICAWARD 826 | HagTeenzcoolit,Kidzcoolit 827 | rubysamyoungz,JoanneDewberry 828 | HagTeenzcoolit,Kidzcoolit 829 | hearteaj,LQS_Media 830 | HagTeenzcoolit,Kidzcoolit 831 | HargroveFire,divinemotherCtr 832 | antant_ariari,divinemotherCtr 833 | Ness_SeaGlass,BagsofFavours 834 | voxantweets,_Islamicat 835 | HagTeenzcoolit,Kidzcoolit 836 | ladycatlover,TheStourbridge 837 | x_jupiterhart,TheStourbridge 838 | HEDTKD,walk4alzheimers 839 | Rashbhari_,DailySeoTips1 840 | samm_designs,MiambaBoutique 841 | HagTeenzcoolit,Kidzcoolit 842 | TATIJewelry,ClothesForCat 843 | retweetbossman,Yordanka 844 | TheLondonBeach,TenterdenDeals 845 | HagTeenzcoolit,Kidzcoolit 846 | BarrieHargrove,AgeUKLS 847 | chrisderrick1,KatieMettner 848 | HagTeenzcoolit,Kidzcoolit 849 | nagangsta,0mega001 850 | HagTeenzcoolit,Kidzcoolit 851 | LeeHillerLondon,Kidzcoolit 852 | mucho_mawi,BobbiesBrownies 853 | vtae_25,WORLDMUSICAWARD 854 | Kdg25fbjr1GKLsR,WORLDMUSICAWARD 855 | HagTeenzcoolit,Kidzcoolit 856 | HagTeenzcoolit,Kidzcoolit 857 | chrisderrick1,dani_haviland 858 | vhappytae,WORLDMUSICAWARD 859 | TATIJewelry,ClothesForCat 860 | HagTeenzcoolit,Kidzcoolit 861 | Man_Of_IKEA,Kidzcoolit 862 | kamasys,_Islamicat 863 | Max_Rebates,_Islamicat 864 | independntlife,_Islamicat 865 | khoodeelaar,TheStourbridge 866 | MaxMust63302429,TheWiganRunner 867 | HagTeenzcoolit,Kidzcoolit 868 | HagTeenzcoolit,Kidzcoolit 869 | samm_designs,candykissesltd 870 | MsRyanSCMJ,candykissesltd 871 | strandnixe99,ChloeLe39602964 872 | chrisderrick1,MaryLSchmidt 873 | HagTeenzcoolit,Kidzcoolit 874 | morganfahey,ChloeLe39602964 875 | HagTeenzcoolit,Kidzcoolit 876 | J_Swallow_LD,ThoseGuys_TRS 877 | candmclub,ThoseGuys_TRS 878 | superteamml,coolbargainhunt 879 | kokozidou,WORLDMUSICAWARD 880 | superteamml,coolbargainhunt 881 | VictoriaVets_,coolbargainhunt 882 | 27bstrok6,getdexterhome 883 | Only_V_tae,WORLDMUSICAWARD 884 | Qiwawa_BtsArmy,WORLDMUSICAWARD 885 | HagTeenzcoolit,Kidzcoolit 886 | BuckarooCrypto,Mayra_9797 887 | TenterdenDeals,Mayra_9797 888 | coolbargainhunt,Mayra_9797 889 | MyBestFriendV,WORLDMUSICAWARD 890 | KibworthKiT,HarboroughDC 891 | Sheffieldis,NapsSheffield 892 | Grasshopper2407,madeleinefwhite 893 | cpggtp,ProtestNews_EN 894 | KatyaBertrand,_Islamicat 895 | anAlienMaybe,WORLDMUSICAWARD 896 | MelAndTheWhale,palace_exile 897 | EwpVitality,palace_exile 898 | HagTeenzcoolit,Kidzcoolit 899 | clair_sherwood,PetMunchies 900 | MyboyVshi,WORLDMUSICAWARD 901 | HagTeenzcoolit,Kidzcoolit 902 | coolbargainhunt,Kidzcoolit 903 | formone37676146,Phemex_official 904 | coolbargainhunt,cuthbert_church 905 | coolbargainhunt,cuthbert_church 906 | welshregan,cuthbert_church 907 | andysmanclubuk,GiantsCT 908 | coolbargainhunt,GiantsCT 909 | ism08,TheStourbridge 910 | HagTeenzcoolit,Kidzcoolit 911 | TATIJewelry,ClothesForCat 912 | chelstae,WORLDMUSICAWARD 913 | coolbargainhunt,WORLDMUSICAWARD 914 | HagTeenzcoolit,Kidzcoolit 915 | HagTeenzcoolit,Kidzcoolit 916 | Cartmannnnnnnn,Rachael57354278 917 | HagTeenzcoolit,Kidzcoolit 918 | mdmremodeling,Kidzcoolit 919 | MrLindo78367288,WORLDMUSICAWARD 920 | BelvoirBolton,WORLDMUSICAWARD 921 | Priyaavni1,WORLDMUSICAWARD 922 | ravinder_del,b_bella_doxies 923 | trulyirishcf,b_bella_doxies 924 | Jekeeey2,WORLDMUSICAWARD 925 | katfan4eva,TheStourbridge 926 | DinkyWorld,TheStourbridge 927 | CashHippyAU,TheStourbridge 928 | nattylara,allianceonline 929 | HagTeenzcoolit,Kidzcoolit 930 | Purple_Bear66,WORLDMUSICAWARD 931 | SparkBestSeller,RealFloydKelly1 932 | HagTeenzcoolit,Kidzcoolit 933 | capt_dildo,Kidzcoolit 934 | armyb5529,WORLDMUSICAWARD 935 | HagTeenzcoolit,Kidzcoolit 936 | Rob_rolla,Kidzcoolit 937 | Eatmyguitar1,HamleysOfficial 938 | KelleniDr,HamleysOfficial 939 | HagTeenzcoolit,Kidzcoolit 940 | AskChefDennis,FLChefNicole 941 | Radio247UK,FLChefNicole 942 | TopBananaMall,FLChefNicole 943 | PeggyMountPod,FLChefNicole 944 | TopBananaMall,FLChefNicole 945 | Wishes_Quotes,FLChefNicole 946 | HagTeenzcoolit,Kidzcoolit 947 | WindaVanessa2,WORLDMUSICAWARD 948 | LilliannyM,WORLDMUSICAWARD 949 | Aria_Fiction,mandybaggot 950 | DexterCavalier,b_bella_doxies 951 | HagTeenzcoolit,Kidzcoolit 952 | AgeFriendlyDCC,NLIreland 953 | HagTeenzcoolit,Kidzcoolit 954 | HECParisMasters,HECParis 955 | HagTeenzcoolit,Kidzcoolit 956 | HagTeenzcoolit,Kidzcoolit 957 | HagTeenzcoolit,Kidzcoolit 958 | aus_shine,WORLDMUSICAWARD 959 | HagTeenzcoolit,Kidzcoolit 960 | cameyrick1,AnnaCampbelloz 961 | HagTeenzcoolit,Kidzcoolit 962 | HagTeenzcoolit,Kidzcoolit 963 | noha26096186,WORLDMUSICAWARD 964 | fireworksdhp,WORLDMUSICAWARD 965 | forestwines,WORLDMUSICAWARD 966 | Yordanka,WORLDMUSICAWARD 967 | Elphyblue21,bmstores 968 | HagTeenzcoolit,Kidzcoolit 969 | hcogyam,joojeeworld 970 | kucingdotexe,TheStourbridge 971 | HagTeenzcoolit,Kidzcoolit 972 | dobbyliciousy,WORLDMUSICAWARD 973 | dhumpachika,TitaniumGeek 974 | HarrowHKMusic,Harrow_HK 975 | HagTeenzcoolit,Kidzcoolit 976 | IOPTeaching,MarshallPhysics 977 | NingenNoSeDa,TheStourbridge 978 | HagTeenzcoolit,Kidzcoolit 979 | StCuthbertsRC1,Kidzcoolit 980 | Antenna_UK,bottletopdesign 981 | bevjoneswriting,KittyWilson23 982 | SharpNEC_UK,SaharaAV 983 | MoiraSwan,IMBottleShop 984 | nadiaippo,WORLDMUSICAWARD 985 | HagTeenzcoolit,Kidzcoolit 986 | CllrPhilKing,HarboroughDC 987 | SpDas18,269Justice 988 | samm_designs,littlefabshop 989 | armyhanataebts,WORLDMUSICAWARD 990 | HagTeenzcoolit,Kidzcoolit 991 | ExeterCathedral,Kidzcoolit 992 | jeonkimm7,WORLDMUSICAWARD 993 | kevin_feltham,HarboroughDC 994 | HagTeenzcoolit,Kidzcoolit 995 | Chandan61265758,DeFiWarriorGame 996 | olivia20130613,WORLDMUSICAWARD 997 | HagTeenzcoolit,Kidzcoolit 998 | KATODAI04900594,Dreame_tech 999 | georgiawrites,ChloeLe39602964 1000 | allsaintscsch,ChloeLe39602964 1001 | HagTeenzcoolit,Kidzcoolit 1002 | Lindsay04076821,bmstores 1003 | HagTeenzcoolit,Kidzcoolit 1004 | carlachrisellis,Find_Kemo 1005 | Works4Uorg,Find_Kemo 1006 | HagTeenzcoolit,Kidzcoolit 1007 | howltaev,WORLDMUSICAWARD 1008 | HagTeenzcoolit,Kidzcoolit 1009 | OneHaleyStar,Amandalavan1 1010 | rayment_max,SwanstonRobert 1011 | HagTeenzcoolit,Kidzcoolit 1012 | IHEARTVEGAN,ChloeLe39602964 1013 | HagTeenzcoolit,Kidzcoolit 1014 | FazilBetting,Phemex_official 1015 | Nice26923195,JacobLi63329419 1016 | vanteplum7,WORLDMUSICAWARD 1017 | HagTeenzcoolit,Kidzcoolit 1018 | HagTeenzcoolit,Kidzcoolit 1019 | Mehakgul02,Phemex_official 1020 | Jess_P95,SnuggHomes 1021 | FilmMusicTracks,trulymusicalark 1022 | Pantrade_SG,trulymusicalark 1023 | USP_college,trulymusicalark 1024 | StMartinDublin,trulymusicalark 1025 | thegrainteam,trulymusicalark 1026 | HagTeenzcoolit,Kidzcoolit 1027 | leicestermuseum,Kidzcoolit 1028 | HagTeenzcoolit,Kidzcoolit 1029 | LesleyClerk,HarboroughDC 1030 | AnNa99263591,WORLDMUSICAWARD 1031 | TheHugsFoundat1,WORLDMUSICAWARD 1032 | R72Rachel,Mersey_Care 1033 | HagTeenzcoolit,Kidzcoolit 1034 | DublinTraveller,Kidzcoolit 1035 | amini54art,littlefabshop 1036 | HagTeenzcoolit,Kidzcoolit 1037 | nguyenl04081327,Kidzcoolit 1038 | CCardanos,Kidzcoolit 1039 | tae_asie,WORLDMUSICAWARD 1040 | HagTeenzcoolit,Kidzcoolit 1041 | Antolepoulet,getwhalinvest 1042 | donnalburnell,ChloeLe39602964 1043 | MerseyRDC,LRecycles 1044 | HagTeenzcoolit,Kidzcoolit 1045 | TaeV1030,WORLDMUSICAWARD 1046 | HagTeenzcoolit,Kidzcoolit 1047 | HagTeenzcoolit,Kidzcoolit 1048 | HagTeenzcoolit,Kidzcoolit 1049 | KingOfTheCoven,WORLDMUSICAWARD 1050 | HagTeenzcoolit,Kidzcoolit 1051 | WelcommComms,Kidzcoolit 1052 | CarlosZarateV,christmas_clock 1053 | thesupermomlife,yeahlifestyle 1054 | HagTeenzcoolit,Kidzcoolit 1055 | vzonkful,WORLDMUSICAWARD 1056 | purpleV9512,WORLDMUSICAWARD 1057 | kookiekrim,_Islamicat 1058 | sergiosanch94,beincrypto 1059 | gosquad22,gectouch 1060 | Spi_des_ign,gectouch 1061 | EmmaCale1,allianceonline 1062 | nguyennhi2501,WORLDMUSICAWARD 1063 | HagTeenzcoolit,Kidzcoolit 1064 | HagTeenzcoolit,Kidzcoolit 1065 | HagTeenzcoolit,Kidzcoolit 1066 | AuntieK18,Kidzcoolit 1067 | Jazario2x,DoodlePoodleNFT 1068 | BuckarooCrypto,OpeoluwaFalodun 1069 | kazzyhow,bmstores 1070 | ljfly10,torix_nft 1071 | PhillysDiner,torix_nft 1072 | regz_KTH,WORLDMUSICAWARD 1073 | HagTeenzcoolit,Kidzcoolit 1074 | HagTeenzcoolit,Kidzcoolit 1075 | chyperskies,WORLDMUSICAWARD 1076 | MillieMoonlight,BaskersBoutique 1077 | RidgmontStation,BaskersBoutique 1078 | HagTeenzcoolit,Kidzcoolit 1079 | Circle2Success,TheNelsonTrust 1080 | Sasakim41929992,WORLDMUSICAWARD 1081 | NewHopeHQ,WORLDMUSICAWARD 1082 | IBT_BuildTimber,RAINYDAYTRUST 1083 | 27260014k,WORLDMUSICAWARD 1084 | lavenderdreamf1,scribbled_hand 1085 | HagTeenzcoolit,Kidzcoolit 1086 | NatalieKTH,WORLDMUSICAWARD 1087 | TPositiveTC,WORLDMUSICAWARD 1088 | HagTeenzcoolit,Kidzcoolit 1089 | englishprepa8,Kidzcoolit 1090 | kalai_designer,gectouch 1091 | HagTeenzcoolit,Kidzcoolit 1092 | TopBananaMall,Kidzcoolit 1093 | stephmrainey,NKPrimary 1094 | DanielPoss,EV2Sportswear 1095 | SwanstonRobert,EV2Sportswear 1096 | LiljinxB,WORLDMUSICAWARD 1097 | HagTeenzcoolit,Kidzcoolit 1098 | BuckarooCrypto,OpeoluwaFalodun 1099 | cbj42813606,torix_nft 1100 | Ximena29Ps,WORLDMUSICAWARD 1101 | CountessofW,WORLDMUSICAWARD 1102 | HagTeenzcoolit,Kidzcoolit 1103 | HagTeenzcoolit,Kidzcoolit 1104 | SahShaah,Kidzcoolit 1105 | HagTeenzcoolit,Kidzcoolit 1106 | NondyeboJojo,Alfonzowords2 1107 | jessica9x_,RobuxCity 1108 | ruby_redsky,RobuxCity 1109 | HagTeenzcoolit,Kidzcoolit 1110 | ParallelLTrust,_SuttonHouse_ 1111 | safeplaceforV,WORLDMUSICAWARD 1112 | theonettey,WORLDMUSICAWARD 1113 | HagTeenzcoolit,Kidzcoolit 1114 | ParallelLTrust,_SuttonHouse_ 1115 | chrismarriott6,Camerados_org 1116 | MimieNorsya,ChloeLe39602964 1117 | ParallelLTrust,_SuttonHouse_ 1118 | HelenHampton,_SuttonHouse_ 1119 | psbaidoo,UmodziGin 1120 | wickedleeksmag,UmodziGin 1121 | HagTeenzcoolit,Kidzcoolit 1122 | sarojrao74,CryptoM216 1123 | NorCalWineLady,junedarville 1124 | Be7Tomov,WORLDMUSICAWARD 1125 | HagTeenzcoolit,Kidzcoolit 1126 | KerryLibrary,NLIreland 1127 | BuckarooCrypto,OpeoluwaFalodun 1128 | HAN07040223,WORLDMUSICAWARD 1129 | HagTeenzcoolit,Kidzcoolit 1130 | UrLocal_Cat,RobuxCity 1131 | JohnDanielShop,drstephencarver 1132 | CYBCards,bloom_jewellery 1133 | HagTeenzcoolit,Kidzcoolit 1134 | mikeiron65,BaskersBoutique 1135 | HagTeenzcoolit,Kidzcoolit 1136 | LuciFortoon,pbshop_store 1137 | LuciFortoon,PetMunchies 1138 | booly_supply,manwhitevanhire 1139 | JudyNagy8,believeinbubu 1140 | HagTeenzcoolit,Kidzcoolit 1141 | dareadeyy,Austeiin 1142 | taedelweis,WORLDMUSICAWARD 1143 | HagTeenzcoolit,Kidzcoolit 1144 | Henshalls,Kidzcoolit 1145 | protocolpills,Kidzcoolit 1146 | BuckarooCrypto,OpeoluwaFalodun 1147 | Iain13955,ChloeLe39602964 1148 | TasteKnutsford,KnutsfordTown 1149 | 3DRecruitEd,KnutsfordTown 1150 | misun580,WORLDMUSICAWARD 1151 | agnesjuliet,WORLDMUSICAWARD 1152 | Yldrmmhmt23,Phemex_official 1153 | keremgullee,Phemex_official 1154 | christmas_clock,Phemex_official 1155 | ShunShu14127262,WORLDMUSICAWARD 1156 | mylove_9290,WORLDMUSICAWARD 1157 | Epiliolaser,WORLDMUSICAWARD 1158 | jungshe_02,WORLDMUSICAWARD 1159 | Taeyeontannie1,WORLDMUSICAWARD 1160 | lauracranetrust,WeAreNorthlight 1161 | ashayeria,HuobiGlobal 1162 | Nayelis13213949,WORLDMUSICAWARD 1163 | knutsmarket,KnutsfordTown 1164 | HagTeenzcoolit,Kidzcoolit 1165 | Desitan18,WORLDMUSICAWARD 1166 | RailMags,manwhitevanhire 1167 | JudyNagy8,SnuggHomes 1168 | nattylara,bmstores 1169 | TaegramV,WORLDMUSICAWARD 1170 | uCloudify,elitees_NI 1171 | hot3Dviews,the_AI_gang 1172 | sassytaehy,WORLDMUSICAWARD 1173 | elitees_NI,WORLDMUSICAWARD 1174 | dijaminmasih,WORLDMUSICAWARD 1175 | IvaP36604823,WORLDMUSICAWARD 1176 | SLHertfordshire,WORLDMUSICAWARD 1177 | feltnyarn,BadgerCrafty 1178 | Giovanna84F,pintofscienceNO 1179 | Rel3ound,gamerstudioltd 1180 | staafme,AlyTheKitten 1181 | RogueStitchery,greengagedesign 1182 | ymcaamy,YMCALincs 1183 | ashayeria,HuobiGlobal 1184 | AsyalataeZ,WORLDMUSICAWARD 1185 | LukeRoper,WORLDMUSICAWARD 1186 | DonGiooo,ogcrystals 1187 | PowysArchives,pplscollection 1188 | le_jerriais,bunscoill 1189 | HagTeenzcoolit,YouthGottit 1190 | CatFanatic9,Cooper_Lechat 1191 | ianhallk9,HelmsleyWines 1192 | FAhankar,ranamansourvar 1193 | aquestingvole,ranamansourvar 1194 | LesleyClerk,HarboroughDC 1195 | ArascaMedical,HarboroughDC 1196 | lugones1980,HarboroughDC 1197 | rcn_rccg,HarboroughDC 1198 | janj2301,PetMunchies 1199 | ymcaamy,YMCALincs 1200 | TDainton,YMCALincs 1201 | AltreGunn,RobuxCity 1202 | RobuxRetweeter,RedNinjaNotMuch 1203 | TotalBath,RedNinjaNotMuch 1204 | kieborg1,northern_elves 1205 | HenryKimbell,GallopingToGive 1206 | freebirdsfly,lucindahawksley 1207 | NoOne345679,b_bella_doxies 1208 | Faizanh43347943,WORLDMUSICAWARD 1209 | BuckarooCrypto,OpeoluwaFalodun 1210 | blueberry0022,ZatuHome 1211 | RedNinjaNotMuch,ZatuHome 1212 | NBGLLP,RAINYDAYTRUST 1213 | ymcaamy,YMCALincs 1214 | BabyKoo53961584,WORLDMUSICAWARD 1215 | HenleySwim,WORLDMUSICAWARD 1216 | DraycotChurches,WORLDMUSICAWARD 1217 | JudyNagy8,pbshop_store 1218 | janj2301,pbshop_store 1219 | sudesna_ghosh,DebbieViggiano 1220 | Andy__Bullock,Sue_Woodward 1221 | whycantitouchit,HubLewisham 1222 | AmorKimTae,WORLDMUSICAWARD 1223 | CultureVannin,bunscoill 1224 | Cruzgopi1,HuobiGlobal 1225 | MiambaBoutique,SueCanSew1 1226 | Radio247UK,SueCanSew1 1227 | Vsguarde,WORLDMUSICAWARD 1228 | tim_hi2,RobuxCity 1229 | Bryers12,EV2Sportswear 1230 | JudyNagy8,poppyscupcakes 1231 | kusanagi391,hiroizumi1 1232 | RedNinjaNotMuch,hiroizumi1 1233 | iammichiewill,hiroizumi1 1234 | schnoddelbotz,Italia 1235 | allaboutnewport,ChloeLe39602964 1236 | FreemanTech,ChloeLe39602964 1237 | KnutsfordX,KnutsfordTown 1238 | ymcaamy,YMCALincs 1239 | lisdapm,WORLDMUSICAWARD 1240 | gungdekarart,Shiruht1 1241 | winterbear_0930,WORLDMUSICAWARD 1242 | NLIreland,WORLDMUSICAWARD 1243 | BuckarooCrypto,OpeoluwaFalodun 1244 | kusanagi391,hiroizumi1 1245 | MischievousBri1,WORLDMUSICAWARD 1246 | Deborah39946479,WORLDMUSICAWARD 1247 | ErikacarolinaGS,WORLDMUSICAWARD 1248 | Mason1Lorraine,ItuEastbourne 1249 | fairway_lady,ItuEastbourne 1250 | FightMeHoe8,WORLDMUSICAWARD 1251 | sweetboy951230,WORLDMUSICAWARD 1252 | AccessoriesbyC_,Austeiin 1253 | RuthCrane_MPC,TeresaYarnold 1254 | SelanikliTrk,HuobiGlobal 1255 | Robinho21086025,HamleysOfficial 1256 | WeCleanWeGreen,HamleysOfficial 1257 | entr_academy,HamleysOfficial 1258 | GrungeGetAway,bmstores 1259 | TOYin3D,the_AI_gang 1260 | JudyOlo,b_bella_doxies 1261 | walk1961,pbshop_store 1262 | manwhitevanhire,pbshop_store 1263 | FuturumG,The_ACG 1264 | BtS_PsK,WORLDMUSICAWARD 1265 | amberscenery,WORLDMUSICAWARD 1266 | ktyu114,WORLDMUSICAWARD 1267 | HelloHappy0402,mrjoewalker 1268 | ShadesOfSofiya,Austeiin 1269 | NCHC_CF,Austeiin 1270 | pubrooms,Austeiin 1271 | NJ_fresh,Austeiin 1272 | tatatkm1,WORLDMUSICAWARD 1273 | f_cryp1,northern_elves 1274 | holdfastnetwork,1607WestEgg 1275 | MamaTazzy13,RoseVioletDeb 1276 | damuax,WORLDMUSICAWARD 1277 | BuckarooCrypto,OpeoluwaFalodun 1278 | frecklejam1,OpeoluwaFalodun 1279 | mick859,OpeoluwaFalodun 1280 | ExeXmasMarket,OpeoluwaFalodun 1281 | JudyNagy8,PetMunchies 1282 | SynStarIT,PetMunchies 1283 | MaddockLucie,TASCharity 1284 | MerseyRoyalGFC,EV2Sportswear 1285 | erfan35969995,HuobiGlobal 1286 | yujulia999,WORLDMUSICAWARD 1287 | JiaoLily1,WORLDMUSICAWARD 1288 | SDWorx,WORLDMUSICAWARD 1289 | AnimatorsPal,RealFloydKelly1 1290 | moncarbone,RealFloydKelly1 1291 | ChrimboPunks,RealFloydKelly1 1292 | TrustVictorious,VTrustWellbeing 1293 | Riawan08997503,DeFiWarriorGame 1294 | bel_avocat,DeFiWarriorGame 1295 | ymcaamy,YMCALincs 1296 | newsoneplace,YMCALincs 1297 | BuckarooCrypto,OpeoluwaFalodun 1298 | worthingcats,OpeoluwaFalodun 1299 | missBangwanLSA,OpeoluwaFalodun 1300 | taehyung_v_1004,WORLDMUSICAWARD 1301 | sweetnight555,WORLDMUSICAWARD 1302 | MentalHRetweet,SparkScotland 1303 | lucindahawksley,SparkScotland 1304 | JagJoyu,dailybannerapp 1305 | uranylchloride,WORLDMUSICAWARD 1306 | JoanneDewberry,WORLDMUSICAWARD 1307 | UncleBeard1978,ChloeLe39602964 1308 | ent_con,Kidzcoolit 1309 | taetaetata199,WORLDMUSICAWARD 1310 | Matty2kRoyal,EV2Sportswear 1311 | natrellabot,SpsWirral 1312 | Amiraqa80,HuobiGlobal 1313 | Hope7Theingi,WORLDMUSICAWARD 1314 | ent_con,Kidzcoolit 1315 | ent_con,Kidzcoolit 1316 | gamesleyschool,VTrustWellbeing 1317 | ent_con,Kidzcoolit 1318 | trulymusicalark,Kidzcoolit 1319 | zippydjh,Hypnogoria 1320 | london2024,mattjlondon 1321 | JonsCrazyTweets,mattjlondon 1322 | ent_con,Kidzcoolit 1323 | gabriell9a,WORLDMUSICAWARD 1324 | CraftyGenes,littlefabshop 1325 | ent_con,Kidzcoolit 1326 | Inspire_Ashton,VTrustWellbeing 1327 | MonicaOP,TheStourbridge 1328 | ent_con,Kidzcoolit 1329 | Jeaniewah1,Amandalavan1 1330 | jluvtannies,WORLDMUSICAWARD 1331 | ent_con,Kidzcoolit 1332 | 2005fuchsia,womensart1 1333 | CraftyGenes,MiambaBoutique 1334 | ShorelineStudi3,WorksUncommon 1335 | hybesucks,WORLDMUSICAWARD 1336 | MumTazA00841940,WORLDMUSICAWARD 1337 | ent_con,Kidzcoolit 1338 | TCSInterview,Kidzcoolit 1339 | UPSCPractice,Kidzcoolit 1340 | vuongvinhvien,GenshinFloki 1341 | RealFloydKelly1,GenshinFloki 1342 | svacomps,bmstores 1343 | ent_con,Kidzcoolit 1344 | MentalHealthBo5,SparkScotland 1345 | Gennaliz_17,WORLDMUSICAWARD 1346 | ChapelGuards,TheGuardsChapel 1347 | ent_con,Kidzcoolit 1348 | atkcryb,WORLDMUSICAWARD 1349 | YewTreePrimSch,VTrustWellbeing 1350 | LOOK_UK,VTrustWellbeing 1351 | jokertoons,VTrustWellbeing 1352 | econrsa,VTrustWellbeing 1353 | JewelsGiftBox,VTrustWellbeing 1354 | jiei_yushi,adriannarenee09 1355 | sceneryforkthTR,WORLDMUSICAWARD 1356 | SparkScotland,WORLDMUSICAWARD 1357 | mmcatsdesign,darlingscatcafe 1358 | ent_con,Kidzcoolit 1359 | MyWatering,Kidzcoolit 1360 | MyWatering,Kidzcoolit 1361 | nscgroup,Kidzcoolit 1362 | BesaCare,Kidzcoolit 1363 | taetae_taebear,WORLDMUSICAWARD 1364 | woodentek,WORLDMUSICAWARD 1365 | RotolokGroup,WORLDMUSICAWARD 1366 | Madonna86049046,NewMadonna1 1367 | EncourageLove2,NewMadonna1 1368 | ent_con,Kidzcoolit 1369 | leicestermuseum,Kidzcoolit 1370 | TopBananaMall,Kidzcoolit 1371 | BuckarooCrypto,OpeoluwaFalodun 1372 | My_MiltonKeynes,OpeoluwaFalodun 1373 | ent_con,Kidzcoolit 1374 | manwhitevanhire,Kidzcoolit 1375 | ent_con,Kidzcoolit 1376 | Cryptookk,northern_elves 1377 | ent_con,Kidzcoolit 1378 | JanetHinton01,ChloeLe39602964 1379 | suseaslowknitta,Dorotheacalm 1380 | BTS_Bangtan07_,WORLDMUSICAWARD 1381 | PoplarStreetHT,VTrustWellbeing 1382 | ClydesdaleASN,VTrustWellbeing 1383 | ent_con,Kidzcoolit 1384 | MBrouazin,northern_elves 1385 | Grandkathy,TheStourbridge 1386 | ColleenMacLean5,TheStourbridge 1387 | moon_tae_v,WORLDMUSICAWARD 1388 | bluetaepeony,WORLDMUSICAWARD 1389 | ent_con,Kidzcoolit 1390 | Weetons,Kidzcoolit 1391 | MovementUnit,Kidzcoolit 1392 | johnnyrico93,getwhalinvest 1393 | ent_con,Kidzcoolit 1394 | diriririe2,LQS_Media 1395 | ent_con,Kidzcoolit 1396 | Vyplummy,RobuxCity 1397 | DongRa61,WORLDMUSICAWARD 1398 | ent_con,Kidzcoolit 1399 | moulanapanji,PussycatNaughty 1400 | ent_con,Kidzcoolit 1401 | asvcprb117,WORLDMUSICAWARD 1402 | BetMessenger1,christmas_clock 1403 | Vantaeinscenery,WORLDMUSICAWARD 1404 | MrGulaks13,Phemex_official 1405 | ent_con,Kidzcoolit 1406 | oenfownfofnfi,RobuxCity 1407 | happy_tete7,WORLDMUSICAWARD 1408 | ent_con,Kidzcoolit 1409 | wild_bank,VTrustWellbeing 1410 | Rupali76512507,WORLDMUSICAWARD 1411 | ent_con,Kidzcoolit 1412 | ent_con,Kidzcoolit 1413 | PEWmag,Kidzcoolit 1414 | ravinder_del,PussycatNaughty 1415 | keal_linda,HamleysOfficial 1416 | ent_con,Kidzcoolit 1417 | NewMadonna1,Kidzcoolit 1418 | coopersarmsSW3,Kidzcoolit 1419 | HelpCen56447707,dailybannerapp 1420 | ccpscotland,CapabilityScot 1421 | nofearnopause,nico_gaia 1422 | ent_con,Kidzcoolit 1423 | noribaka_,WORLDMUSICAWARD 1424 | ent_con,Kidzcoolit 1425 | BuckarooCrypto,OpeoluwaFalodun 1426 | ent_con,Kidzcoolit 1427 | OjitosVerdeAzul,WORLDMUSICAWARD 1428 | IreneAReid,dementiacentre 1429 | JudyNagy8,HamleysOfficial 1430 | mafia_squirrel,ChloeLe39602964 1431 | dillinger4010,ChloeLe39602964 1432 | ent_con,Kidzcoolit 1433 | BarninghamCEVCP,Kidzcoolit 1434 | WonderfulChoc,Kidzcoolit 1435 | ABFEastAnglia,Kidzcoolit 1436 | ent_con,Kidzcoolit 1437 | MolleCollection,littlefabshop 1438 | ok32650586,allfeltnofilter 1439 | ent_con,Kidzcoolit 1440 | SuesArt,littlefabshop 1441 | ent_con,Kidzcoolit 1442 | Ladyroni,Kidzcoolit 1443 | NatKleinman,The__SadieRyan 1444 | ivylieve1230,WORLDMUSICAWARD 1445 | ent_con,Kidzcoolit 1446 | IngeBonneux,drpeachy 1447 | LAG_Hagley,drpeachy 1448 | ent_con,Kidzcoolit 1449 | ent_con,Kidzcoolit 1450 | fizzykv,WORLDMUSICAWARD 1451 | ent_con,Kidzcoolit 1452 | KoobalCrypto,getwhalinvest 1453 | kthlovevoi,WORLDMUSICAWARD 1454 | tasteofbandon,WORLDMUSICAWARD 1455 | kaya_pain,buwuchi 1456 | walk1961,PetMunchies 1457 | Dreamer_Lennon,PetMunchies 1458 | ent_con,Kidzcoolit 1459 | MineCartMayhem,Kidzcoolit 1460 | TheBroadwayBrad,visitBradford 1461 | ent_con,Kidzcoolit 1462 | ent_con,Kidzcoolit 1463 | CraftyL96082557,getdexterhome 1464 | ent_con,Kidzcoolit 1465 | VoIPon,YealinkNews 1466 | ent_con,Kidzcoolit 1467 | BuckarooCrypto,OpeoluwaFalodun 1468 | fieldpast,TheStourbridge 1469 | kth1waiting,WORLDMUSICAWARD 1470 | PikuSubhu,WORLDMUSICAWARD 1471 | GrineHoney,WORLDMUSICAWARD 1472 | Andrea6Mitchell,ChloeLe39602964 1473 | EliteLuxury3,ChloeLe39602964 1474 | kevinpendry,JoshSabarra 1475 | ent_con,Kidzcoolit 1476 | TATIJewelry,pinkhenstudio 1477 | janemanuelabras,pRUSZKIEWICZ 1478 | Xsquaretec,dailybannerapp 1479 | RedHouseSchool,dailybannerapp 1480 | ActorsWhoGarden,SarahLidsActor 1481 | suntae24986210,WORLDMUSICAWARD 1482 | ent_con,Kidzcoolit 1483 | j________gar__,WORLDMUSICAWARD 1484 | Firegoddess_8,PetMunchies 1485 | ent_con,Kidzcoolit 1486 | XveltM,HuobiGlobal 1487 | ent_con,Kidzcoolit 1488 | Taethebest30,WORLDMUSICAWARD 1489 | ent_con,Kidzcoolit 1490 | ent_con,Kidzcoolit 1491 | adimontefalco__,AudreyNesbitt11 1492 | NoMoreDream_V,WORLDMUSICAWARD 1493 | VabyVear,WORLDMUSICAWARD 1494 | ent_con,Kidzcoolit 1495 | EleCCgan,WORLDMUSICAWARD 1496 | SpDas18,CHAM02313921 1497 | ent_con,Kidzcoolit 1498 | Kim79430780,WORLDMUSICAWARD 1499 | KadenzeOfficial,WORLDMUSICAWARD 1500 | MarthaMcnair36,OKMagazine 1501 | makotaev,WORLDMUSICAWARD 1502 | ent_con,Kidzcoolit 1503 | 7aibon7,WORLDMUSICAWARD 1504 | ggukthgi,WORLDMUSICAWARD 1505 | ent_con,Kidzcoolit 1506 | NidhinJ09287560,HuobiGlobal 1507 | CeriseHiver,visitportugal 1508 | ent_con,Kidzcoolit 1509 | ent_con,Kidzcoolit 1510 | JohnnyMilkovich,JpRepublic 1511 | tastytae95,WORLDMUSICAWARD 1512 | TaanviD,DailySeoTips1 1513 | ent_con,Kidzcoolit 1514 | ZarateCreations,Kidzcoolit 1515 | LymmTruckWash,DAFTrucksUK 1516 | cypiao,HuobiGlobal 1517 | ent_con,Kidzcoolit 1518 | AvetissianMaya,WFPArmenia 1519 | Melanie_PTD,WORLDMUSICAWARD 1520 | AliceBlack2020,ilan_profile 1521 | ent_con,Kidzcoolit 1522 | ffm2019,WORLDMUSICAWARD 1523 | ent_con,Kidzcoolit 1524 | NaturalCement,Kidzcoolit 1525 | h_craggs,AuthorJRose 1526 | greencatbooks,AuthorJRose 1527 | 23_Gee_23,WORLDMUSICAWARD 1528 | torridgedc,RecycleDevon 1529 | MiambaBoutique,RecycleDevon 1530 | ent_con,Kidzcoolit 1531 | BuckarooCrypto,OpeoluwaFalodun 1532 | lamdongnd,MEXC_Global 1533 | ent_con,Kidzcoolit 1534 | Mellowianaaa,RobuxCity 1535 | ent_con,Kidzcoolit 1536 | CohimeMalo,womensart1 1537 | MelTBessent,BookSuperhero2 1538 | TitaniumGeek,BookSuperhero2 1539 | ent_con,Kidzcoolit 1540 | Niamh_Ni_A,Kidzcoolit 1541 | TOMRACollection,Kidzcoolit 1542 | ent_con,Kidzcoolit 1543 | jvstjax,RobuxCity 1544 | ent_con,Kidzcoolit 1545 | KentHandmade,littlefabshop 1546 | Heyry17,WORLDMUSICAWARD 1547 | ent_con,Kidzcoolit 1548 | Missnoname03,pbshop_store 1549 | dinaapratiwi85,Min_Genius1994 1550 | ent_con,Kidzcoolit 1551 | MalvarAngela,WORLDMUSICAWARD 1552 | polisded,Cooper_Lechat 1553 | Taestreams,WORLDMUSICAWARD 1554 | TheGuardsChapel,WORLDMUSICAWARD 1555 | ym04022800,WORLDMUSICAWARD 1556 | vgukktae,WORLDMUSICAWARD 1557 | AnMinggg,RobuxCity 1558 | RajAgra0124221,aristavault 1559 | boracosmos,WORLDMUSICAWARD 1560 | ent_con,Kidzcoolit 1561 | FansFair,Kidzcoolit 1562 | romarmy1,WORLDMUSICAWARD 1563 | ent_con,Kidzcoolit 1564 | prakashmodel41,WORLDMUSICAWARD 1565 | ent_con,Kidzcoolit 1566 | ameensajwani,Kidzcoolit 1567 | cosmicboy79,Kidzcoolit 1568 | vantearchives_,WORLDMUSICAWARD 1569 | hmvMansfield,WORLDMUSICAWARD 1570 | iMotivateAfrica,NoniDiba 1571 | VortalV,WORLDMUSICAWARD 1572 | StevenGNorman,Sue_Woodward 1573 | QuotesBot1,Whichwaygameso1 1574 | Milina88195397,WORLDMUSICAWARD 1575 | taeflowerily,WORLDMUSICAWARD 1576 | Missnoname03,PetMunchies 1577 | ent_con,Kidzcoolit 1578 | ent_con,Kidzcoolit 1579 | SY95038469,WORLDMUSICAWARD 1580 | ent_con,Kidzcoolit 1581 | QuotesBot1,Meet_The_Pods 1582 | OTV118,WORLDMUSICAWARD 1583 | BennyHall17,bmstores 1584 | YanaAxar,bmstores 1585 | ent_con,Kidzcoolit 1586 | thisaintjimbeam,HecticGifts 1587 | empowerdigi,ShelterBox 1588 | navigatexo,KoreanTravel 1589 | QuotesBot1,lucoinshirt 1590 | ent_con,Kidzcoolit 1591 | sueatkilmeedy,lizaadamczewski 1592 | DMSMaster2,dailybannerapp 1593 | ent_con,Kidzcoolit 1594 | BTSxARMY1210,WORLDMUSICAWARD 1595 | lowpoly_tweeter,Figoyg1 1596 | ent_con,Kidzcoolit 1597 | Oop2Alley,Iza_2021 1598 | Byeol_Noona,WORLDMUSICAWARD 1599 | YogiSap35883978,HuobiGlobal 1600 | ent_con,Kidzcoolit 1601 | UKMumstv,Kidzcoolit 1602 | Radio247UK,Kidzcoolit 1603 | ent_con,Kidzcoolit 1604 | wnterchld,WORLDMUSICAWARD 1605 | Arabella_KTH,WORLDMUSICAWARD 1606 | TaanviD,DailySeoTips1 1607 | QuotesBot1,stuffedofficial 1608 | LikaNandy2601,WORLDMUSICAWARD 1609 | Figoyg1,WORLDMUSICAWARD 1610 | ent_con,Kidzcoolit 1611 | Hobbycraft_EPP,Hobbycraft_TTN 1612 | vtaehyungv19,WORLDMUSICAWARD 1613 | ent_con,Kidzcoolit 1614 | cpj1971,EV2Sportswear 1615 | YvonneShaw4,NewbyLeisureLtd 1616 | ent_con,Kidzcoolit 1617 | YealinkNews,Kidzcoolit 1618 | taeaddi,WORLDMUSICAWARD 1619 | bethanjohn16,beautys_legacy 1620 | FengShuiPyramid,BySvoon 1621 | bangtannice7,WORLDMUSICAWARD 1622 | Shahxyb,HuobiGlobal 1623 | HecticGifts,HuobiGlobal 1624 | ent_con,Kidzcoolit 1625 | inbusiness4good,Kidzcoolit 1626 | davozinni,Austeiin 1627 | ent_con,Kidzcoolit 1628 | Missnoname03,HamleysOfficial 1629 | ent_con,Kidzcoolit 1630 | MrsMummaGarner,HamleysOfficial 1631 | dukhjoy,nestrocklimited 1632 | tete_angelkv,WORLDMUSICAWARD 1633 | SSSSnowflower,WORLDMUSICAWARD 1634 | ent_con,Kidzcoolit 1635 | Yoselin17905717,WORLDMUSICAWARD 1636 | Hobbycraft_STK,WORLDMUSICAWARD 1637 | cloudtamers,MBIpublishers 1638 | ent_con,Kidzcoolit 1639 | BASICS_HQ,BeepDoctors 1640 | Craftville,rosesworkshop 1641 | BlackettMusic,RecklessVelvet 1642 | forster_mr,Dorotheacalm 1643 | FengShuiPyramid,Wild_Lotus_Fun 1644 | ent_con,Kidzcoolit 1645 | Vwinterbear5,WORLDMUSICAWARD 1646 | scotsbint,HamleysOfficial 1647 | railwaybear,allianceonline 1648 | SpsWirral,allianceonline 1649 | yesssAce,WORLDMUSICAWARD 1650 | ent_con,Kidzcoolit 1651 | NatalieFR10,ESPPlayNatalie 1652 | BlackettPromo,RecklessVelvet 1653 | blinkkittylove,RecklessVelvet 1654 | ConnieD16845594,ChloeLe39602964 1655 | AndyPennefather,pamlecky 1656 | Wizard_707,SzamerM 1657 | MrRajput2212,SzamerM 1658 | shirochanUwU,WORLDMUSICAWARD 1659 | YourSanctum,WORLDMUSICAWARD 1660 | Whichwaygameso1,WORLDMUSICAWARD 1661 | DogDuckLark,WORLDMUSICAWARD 1662 | AnsoChan,WORLDMUSICAWARD 1663 | eatodtouenoon,WORLDMUSICAWARD 1664 | ent_con,Kidzcoolit 1665 | jollydollie2019,pbshop_store 1666 | treatnorwich,pbshop_store 1667 | lyyynda8,bslcourses 1668 | AnthonySmithPhD,shrewsmorris 1669 | DanETee80,shrewsmorris 1670 | ngocanh111111,WORLDMUSICAWARD 1671 | san_in_marino,WORLDMUSICAWARD 1672 | crystal_vluv,WORLDMUSICAWARD 1673 | Littlelambtales,WORLDMUSICAWARD 1674 | TomRattray22,ladybirdandleaf 1675 | westieorourke58,getdexterhome 1676 | MoneyWeedPuzzy,getdexterhome 1677 | JGjerdrum,getdexterhome 1678 | FosterCareToday,IntellectBusin1 1679 | DiavloKTH,WORLDMUSICAWARD 1680 | kth_idolofidols,WORLDMUSICAWARD 1681 | anya_kth,WORLDMUSICAWARD 1682 | ScottishHistSoc,WORLDMUSICAWARD 1683 | Vante_bear_,WORLDMUSICAWARD 1684 | bishbishbishbij,WORLDMUSICAWARD 1685 | Taeblackbrown,WORLDMUSICAWARD 1686 | rosesworkshop,WORLDMUSICAWARD 1687 | taeberry_kth,WORLDMUSICAWARD 1688 | SkSazia,WORLDMUSICAWARD 1689 | snowttaee,WORLDMUSICAWARD 1690 | KVTaehyung1230,WORLDMUSICAWARD 1691 | designmyholida,WORLDMUSICAWARD 1692 | MoneyWeedPuzzy,WORLDMUSICAWARD 1693 | matthewrw1978,StDuthusFC 1694 | SammieMcIntyr14,Wahlbonkers 1695 | todaykth,WORLDMUSICAWARD 1696 | taeloveofmylife,WORLDMUSICAWARD 1697 | VTeamBase,WORLDMUSICAWARD 1698 | ent_con,YouthGottit 1699 | izzah_shaf,ChloeLe39602964 1700 | Spongebob23497,ChloeLe39602964 1701 | LogshaIsHot,b_bella_doxies 1702 | AlresfordCofC,tngwine 1703 | EconomicsinTen,tngwine 1704 | EconomicsinTen,tngwine 1705 | DeepikaMehta93,tngwine 1706 | hsbsnsc,WORLDMUSICAWARD 1707 | hmvIpswich,WORLDMUSICAWARD 1708 | DrNeilHoare,tweetingdexter 1709 | lillywhite1980,DT_Darlington 1710 | BTSV_Malaysia,WORLDMUSICAWARD 1711 | HowellsSchool,WORLDMUSICAWARD 1712 | MrRajput2212,fevicreate 1713 | paletwo2019,BigCatRescue 1714 | Dharapa62909461,WORLDMUSICAWARD 1715 | littlefabshop,WORLDMUSICAWARD 1716 | Cutepie003,269Justice 1717 | DeepikaMehta93,fevicreate 1718 | Cerry05055815,WORLDMUSICAWARD 1719 | Hypnogoria,WORLDMUSICAWARD 1720 | penguinclass5,WORLDMUSICAWARD 1721 | visitportugal,WORLDMUSICAWARD 1722 | canjulied,HuobiGlobal 1723 | Anilabibi11,WORLDMUSICAWARD 1724 | IndepenCottages,WORLDMUSICAWARD 1725 | burgonandball,WORLDMUSICAWARD 1726 | TelfordCentre,WORLDMUSICAWARD 1727 | Adri_Supr_Emo,Cooper_Lechat 1728 | adorevngel,WORLDMUSICAWARD 1729 | SebWrites,WORLDMUSICAWARD 1730 | 2getaticket,WORLDMUSICAWARD 1731 | thejanuarymedia,WORLDMUSICAWARD 1732 | mygiftmarketgb,FawaShah 1733 | PGSweeps,FawaShah 1734 | Wahlbonkers,FawaShah 1735 | pintofscienceNO,FawaShah 1736 | IntellectBusin1,FawaShah 1737 | LondonForXmas,FawaShah 1738 | LondonForXmas,FawaShah 1739 | WBialystok,PremierRP_en 1740 | ali7_bts,WORLDMUSICAWARD 1741 | meldridge13,45Petworth 1742 | TashmiAmadi,WORLDMUSICAWARD 1743 | eclipse1473,ChloeLe39602964 1744 | RosheleTantin,WORLDMUSICAWARD 1745 | NickGM,Kidzcoolit 1746 | GuillArchi,godless_mom 1747 | FRomeoAlphaY,godless_mom 1748 | arpita_sana,WORLDMUSICAWARD 1749 | LawrenceC1983,TheMOSnetwork 1750 | NickGM,Kidzcoolit 1751 | GoddardBooks,mikestokoe 1752 | Gabe55Gabe,DorsetMuseum 1753 | NickGM,Kidzcoolit 1754 | RobertN58520057,SSStrays 1755 | allsaintscsch,SSStrays 1756 | NickGM,Kidzcoolit 1757 | yvonneqqm,oxhomelessmvt 1758 | Meysamtajik1994,HuobiGlobal 1759 | janice__mesa,WORLDMUSICAWARD 1760 | NickGM,Kidzcoolit 1761 | t___a___e,WORLDMUSICAWARD 1762 | proelectrician,WORLDMUSICAWARD 1763 | NickGM,Kidzcoolit 1764 | dnahomeimprove,Kidzcoolit 1765 | PISALESUK,Kidzcoolit 1766 | NickGM,Kidzcoolit 1767 | BL_Girlie,WORLDMUSICAWARD 1768 | VaritoneLegend,WORLDMUSICAWARD 1769 | inbusiness4good,WORLDMUSICAWARD 1770 | NickGM,Kidzcoolit 1771 | alaa_express,Kidzcoolit 1772 | NickGM,Kidzcoolit 1773 | TinaAslan,Vixie_Cat_Kig 1774 | Vyplummy,RobuxCity 1775 | BlackCatVideos1,Cooper_Lechat 1776 | TheCraftyNoo,Cooper_Lechat 1777 | CraftyL96082557,beautys_legacy 1778 | uniquelove76,WORLDMUSICAWARD 1779 | Yolo60409794,getwhalinvest 1780 | NickGM,Kidzcoolit 1781 | NickGM,Kidzcoolit 1782 | DianaelleTv,WORLDMUSICAWARD 1783 | LysaTran19,WORLDMUSICAWARD 1784 | RetweetDc,Kidzcoolit 1785 | NickGM,Kidzcoolit 1786 | Adamylotaeloto,WORLDMUSICAWARD 1787 | RolandStautZ_,RolandStautz 1788 | Armyfor64738561,WORLDMUSICAWARD 1789 | NickGM,Kidzcoolit 1790 | WilderCoe,Kidzcoolit 1791 | NickGM,Kidzcoolit 1792 | NickGM,Kidzcoolit 1793 | NickGM,Kidzcoolit 1794 | Corstorphnchiro,Kidzcoolit 1795 | Oojoodeboo,Dorotheacalm 1796 | NickGM,Kidzcoolit 1797 | freywilleglobal,Kidzcoolit 1798 | SoSoGifted1,Kidzcoolit 1799 | amycema_333,WORLDMUSICAWARD 1800 | NickGM,Kidzcoolit 1801 | DianeHargo,frogmomblog 1802 | ksjndoll,WORLDMUSICAWARD 1803 | HomeInstead10,WORLDMUSICAWARD 1804 | NickGM,Kidzcoolit 1805 | NickGM,Kidzcoolit 1806 | ThomasOrthmann,ChloeLe39602964 1807 | Rebecca53565736,FlashLC 1808 | Meet_The_Pods,FlashLC 1809 | gkhn1762,HuobiGlobal 1810 | postcardcentury,HuobiGlobal 1811 | kthvaya,WORLDMUSICAWARD 1812 | scheerenberger,GarageItalian 1813 | NickGM,Kidzcoolit 1814 | thecopperfruit,Kidzcoolit 1815 | KavyaaGuptaa,WORLDMUSICAWARD 1816 | djutewfh1lhyd,WORLDMUSICAWARD 1817 | onielolies_,WORLDMUSICAWARD 1818 | NickGM,Kidzcoolit 1819 | AryaAbi5,WORLDMUSICAWARD 1820 | rebecca_lipkin,WORLDMUSICAWARD 1821 | NickGM,Kidzcoolit 1822 | andoffices,Kidzcoolit 1823 | AlinurKurbanova,HuobiGlobal 1824 | ViosecSystems,HuobiGlobal 1825 | mSunloVe99127,WORLDMUSICAWARD 1826 | elda_dc,wellwildcom 1827 | TrendyBendy3,ShelfEdge 1828 | ZiaBiaEvents,ShelfEdge 1829 | ange1230v,WORLDMUSICAWARD 1830 | NickGM,Kidzcoolit 1831 | loupurplechoc,AberhondduWi 1832 | NickGM,Kidzcoolit 1833 | BowkerIT,Kidzcoolit 1834 | rose01756733,WORLDMUSICAWARD 1835 | SwapAirfield,WoodlandTrust 1836 | NickGM,Kidzcoolit 1837 | emmamonkman,i_love_dolly 1838 | AmrutaChopkar22,fevicreate 1839 | NickGM,Kidzcoolit 1840 | jujutaesu,WORLDMUSICAWARD 1841 | headspacegroup,WORLDMUSICAWARD 1842 | ShelfEdge,WORLDMUSICAWARD 1843 | KamkamDC,getwhalinvest 1844 | Always4V,WORLDMUSICAWARD 1845 | NickGM,Kidzcoolit 1846 | DaysofKate,PetMunchies 1847 | NickGM,Kidzcoolit 1848 | NickGM,Kidzcoolit 1849 | Vholic_,WORLDMUSICAWARD 1850 | NickGM,Kidzcoolit 1851 | inbusiness4good,Kidzcoolit 1852 | ChristineMinch1,Cooper_Lechat 1853 | lucoinshirt,Cooper_Lechat 1854 | bluejan32,bmstores 1855 | NickGM,Kidzcoolit 1856 | tae_babe1,WORLDMUSICAWARD 1857 | mathgril,getwhalinvest 1858 | mathgril,youbiquity_uk 1859 | NickGM,Kidzcoolit 1860 | Singularity1905,WORLDMUSICAWARD 1861 | BEoffices,WORLDMUSICAWARD 1862 | WendyClarke99,The__SadieRyan 1863 | NickGM,Kidzcoolit 1864 | lucy_bunnies,TheStourbridge 1865 | rebornblessing,KahayangKopi 1866 | NickGM,Kidzcoolit 1867 | jaycotts,Kidzcoolit 1868 | ginsterman,SparklingDirect 1869 | TopBananaMall,SparklingDirect 1870 | annemariebrear,SparklingDirect 1871 | DoMoreRed,SparklingDirect 1872 | NickGM,Kidzcoolit 1873 | VarietyDotShow,Kidzcoolit 1874 | NickGM,Kidzcoolit 1875 | Coffeelink,Kidzcoolit 1876 | Dijawcem,_Islamicat 1877 | NickGM,Kidzcoolit 1878 | tataaland,WORLDMUSICAWARD 1879 | NickGM,Kidzcoolit 1880 | NickGM,Kidzcoolit 1881 | ArmyErlinda,WORLDMUSICAWARD 1882 | KnitClaire,CartersCollecta 1883 | NickGM,Kidzcoolit 1884 | 6f7000d1e4f2402,ReinaLove88 1885 | _BCT_,NZBatman 1886 | ItzCharlie69,Austeiin 1887 | NickGM,Kidzcoolit 1888 | AntonioDelSur1,Molliebloom8 1889 | NickGM,Kidzcoolit 1890 | LazarovMartin7,jenkers_en 1891 | NickGM,Kidzcoolit 1892 | NickGM,Kidzcoolit 1893 | madeleinefwhite,Kidzcoolit 1894 | KnitClaire,GermanderCC 1895 | whaliev13_,WORLDMUSICAWARD 1896 | MySoulfulthv,WORLDMUSICAWARD 1897 | NickGM,Kidzcoolit 1898 | zziru67,WORLDMUSICAWARD 1899 | Execell1,buwuchi 1900 | altrinchamtoday,ConClubAlty 1901 | escza,SzamerM 1902 | HhXapa,_ahsanR 1903 | NickGM,Kidzcoolit 1904 | maketimecountuk,Kidzcoolit 1905 | o_taemiko,WORLDMUSICAWARD 1906 | jini1531,WORLDMUSICAWARD 1907 | NickGM,Kidzcoolit 1908 | arukasvoo,WORLDMUSICAWARD 1909 | d1Gb4IFUU9rpVcm,nico_gaia 1910 | Yoongikessiah,WORLDMUSICAWARD 1911 | genghisgirl,KarenBa10864733 1912 | NickGM,Kidzcoolit 1913 | reydanoel,DoodlePoodleNFT 1914 | JBD_10,DeFiWarriorGame 1915 | BorahaeLala,WORLDMUSICAWARD 1916 | NickGM,Kidzcoolit 1917 | William56068718,LilMonkiNFT 1918 | Francois_thblt,getwhalinvest 1919 | Sagartron,getwhalinvest 1920 | NickGM,Kidzcoolit 1921 | bignic16,PeterHenshaw9 1922 | max_camp1,PeterHenshaw9 1923 | NickGM,Kidzcoolit 1924 | NickGM,Kidzcoolit 1925 | inbusiness4good,Kidzcoolit 1926 | NickGM,Kidzcoolit 1927 | 5FBwICBer77dGrs,WORLDMUSICAWARD 1928 | stuffedofficial,WORLDMUSICAWARD 1929 | AngelsUnitedFC,EV2Sportswear 1930 | NickGM,Kidzcoolit 1931 | itsumademoV,WORLDMUSICAWARD 1932 | TaeTae49911119,WORLDMUSICAWARD 1933 | NickGM,Kidzcoolit 1934 | NickGM,Kidzcoolit 1935 | YMhWs9LywcQfq7r,WORLDMUSICAWARD 1936 | FawaShah,sewmorethanbags 1937 | NickGM,Kidzcoolit 1938 | NickGM,Kidzcoolit 1939 | babyjiminie_16_,WORLDMUSICAWARD 1940 | TheCXMagazine,WORLDMUSICAWARD 1941 | form_bot,yeahlifestyle 1942 | zee_row_ex,2021Gingerbread 1943 | NickGM,Kidzcoolit 1944 | NickGM,Kidzcoolit 1945 | miashortfilm,TheSusanGeorge 1946 | frentae,WORLDMUSICAWARD 1947 | TopBananaMall,WORLDMUSICAWARD 1948 | ragtseedsuk,WORLDMUSICAWARD 1949 | pamlecky,WORLDMUSICAWARD 1950 | oxhomelessmvt,WORLDMUSICAWARD 1951 | Clare02238187,HamleysOfficial 1952 | ZzimiH,buwuchi 1953 | TraceyLindon,HamleysOfficial 1954 | NickGM,Kidzcoolit 1955 | NickGM,Kidzcoolit 1956 | nosicknosick,WORLDMUSICAWARD 1957 | hamiltonsmotel,WORLDMUSICAWARD 1958 | michaelberry,WORLDMUSICAWARD 1959 | malcolmlum75,7NewsGoldCoast 1960 | NickGM,Kidzcoolit 1961 | Taekook_Cosmos,WORLDMUSICAWARD 1962 | applotzdigital,WORLDMUSICAWARD 1963 | NickGM,Kidzcoolit 1964 | NickGM,Kidzcoolit 1965 | astronomicca,Vinkelmule 1966 | NickGM,Kidzcoolit 1967 | bitbit83723117,northern_elves 1968 | golwgymor,AlisonGeorge10 1969 | -------------------------------------------------------------------------------- /stream/data/scraped_tweets_old.csv: -------------------------------------------------------------------------------- 1 | source_username,target_username 2 | MHHSBD,LovesVintage43 3 | eclary84,eclary84 4 | inbusiness4good,eclary84 5 | itsasherz,eclary84 6 | BenteHemmingsen,BeaGee3 7 | Squidygame,BeaGee3 8 | TaraReid,BeaGee3 9 | david_demaine,manxscenes 10 | LeoOfMontreal,manxscenes 11 | Nigeblue,govisitdonegal 12 | Dusty_Coog20,gracelynhunt 13 | Chris5anne,Whitproduce 14 | AmandaBergloff,ForgottenBeauty 15 | waitari1,ForgottenBeauty 16 | RebaIsbell,runoutofaname 17 | lousfeey,Elyonblackstars 18 | MyOutSpace,MyOutSpace 19 | Deserttrvlr,StellaMoris1 20 | petbond_ireland,petbond_ireland 21 | stefano2114,StellaMoris1 22 | bridie4,RacecarBox 23 | FBSteaching,RacecarBox 24 | DiscoverWyre,RacecarBox 25 | pnp_aim,RacecarBox 26 | AlexButterfly01,AlexButterfly01 27 | SteveAikenUUP,ForcesNews 28 | GinnGamer,ForcesNews 29 | lynne_mckenzie,MissingPetsGB 30 | LauraPearse2,Cliffdickenson 31 | katyfederman,Cliffdickenson 32 | elainecchao,Cliffdickenson 33 | MHHSBD,LovesVintage43 34 | sineadlarry,mcd_productions 35 | JestressBooks,mcd_productions 36 | q_choa,GameIdentityV 37 | mt_essex,GameIdentityV 38 | shib_Ind,GameIdentityV 39 | JammyNotSpammy,storywhispers 40 | miniaussiejax,guccidog2020 41 | YannMottazPhoto,SantaInu_BSC 42 | FNBNPodcast,SantaInu_BSC 43 | Mishanja_S,PokerListings 44 | DontzSenpai,vas_90s 45 | Sweetnene28,RacecarBox 46 | DogsofTooting,MissingPetsGB 47 | loootex,SAMPAuk_ 48 | St_Martins_Care,SAMPAuk_ 49 | odiebev69,RubesCartoons 50 | KatieCorr54,RDCSolicitors 51 | OrtegaResult20,Forever1GoChi 52 | TwosApp,Forever1GoChi 53 | Sreejit40765940,Forever1GoChi 54 | DeeCeeByTheSea,BCTG_Group 55 | MHHSBD,LovesVintage43 56 | lunalcht,HwanniePromotes 57 | ALPsTrust1,thegrangesch 58 | InsightDIY,thegrangesch 59 | stream_caster,Keira_Burns1 60 | Plan9Alehouse,Keira_Burns1 61 | MHHSBD,CartersCollecta 62 | deemcki,MissingPetsGB 63 | shib_Ind,MissingPetsGB 64 | SabaChay,StellaMoris1 65 | Keira_Burns1,StellaMoris1 66 | USMEagle98,LDYPrefers2Save 67 | BotBama,MagalyRo5a5 68 | tera_culverwell,412Tickets 69 | DCentifolia,BestRecipesUK 70 | arnold_loz,StellaMoris1 71 | Muhamma79255820,StellaMoris1 72 | Max_Pow20,StellaMoris1 73 | HinduNotorious,KreatelyMedia 74 | MagalyRo5a5,KreatelyMedia 75 | Route66RoadFest,KreatelyMedia 76 | psycholineman,PetMunchies 77 | _McOatt,BasiliKitChen 78 | networktweets,BasiliKitChen 79 | drocktrot,kemrichardson7 80 | shib_Ind,kemrichardson7 81 | MHHSBD,CartersCollecta 82 | clark74_matt,TurfaceC 83 | DeniseCop1,HamleysOfficial 84 | CloutEtc,SAMPAuk_ 85 | CardinalFangBot,DDCrochetDesign 86 | purdyme123,DDCrochetDesign 87 | fpcomms,DDCrochetDesign 88 | UnfreezYourMind,afbranco 89 | DeeCeeByTheSea,afbranco 90 | MWardplus3,simmademoiselle 91 | lyconpolis,simmademoiselle 92 | PEwiger,ProtestNews_EN 93 | techvai,ProtestNews_EN 94 | qu1ncey,MissingPetsGB 95 | beavan_lesley,MissingPetsGB 96 | RaphaelFinal,MissingPetsGB 97 | MaeveMeabhkerr,netzfrauen 98 | susie_retro,storywhispers 99 | NordbergValerie,annamoor1995 100 | PainFreeLove,annamoor1995 101 | RibbleValleysue,Fabstainedglass 102 | moviecriticbot,beavan_lesley 103 | ChadmanPJ,TheWiganRunner 104 | StormoftheSouth,ABeaumontWriter 105 | artyny59,AnnaCampbelloz 106 | MHHSBD,CartersCollecta 107 | inbusiness4good,CartersCollecta 108 | blue21sky,KreatelyMedia 109 | CreatorsAngel,KreatelyMedia 110 | MHHSBD,CraftyGenes 111 | GHS_Librarian_,CraftyGenes 112 | RathboneKim,_Aloominati_ 113 | mis_tykl,mick859 114 | LittleStarrBear,mick859 115 | moreHarrogate,Commercial_St 116 | BeithKatie,feelaliveuk 117 | MHHSBD,BombsandBubbles 118 | RossBrookeDent,MocoDentalAccts 119 | addict_slash,MocoDentalAccts 120 | GatelyElizabeth,TheStourbridge 121 | DeeCeeByTheSea,TheWiganRunner 122 | shib_Ind,TheWiganRunner 123 | megrawc,PetMunchies 124 | inbusiness4good,PetMunchies 125 | MihaelaPopova7,WWFCEE 126 | beavan_lesley,WWFCEE 127 | DuoInspirations,WWFCEE 128 | gaelic4parents,WWFCEE 129 | ThriveTrafford,KarenWroeArtist 130 | RHBoydCo,KarenWroeArtist 131 | abimbol56049358,Solarful 132 | southcitymedic,Solarful 133 | StaffsMummy,storywhispers 134 | bnb952,TurfaceC 135 | MHHSBD,CartersCollecta 136 | DDCrochetDesign,CartersCollecta 137 | RAM_Toys,CartersCollecta 138 | Its_a_Mister_B,kuhne_uk 139 | shib_Ind,kuhne_uk 140 | arundohle,StellaMoris1 141 | Justis4u3,StellaMoris1 142 | halkerstone,storywhispers 143 | funEbone2u,afbranco 144 | OnTheClockLLC,afbranco 145 | inn_norway,afbranco 146 | forrest_sheila,rivesci 147 | shib_Ind,rivesci 148 | NikOfLaa,rivesci 149 | SmallTxTown,SmallTxTown 150 | idkflowers1,find_charlotte 151 | Greg_A_Salyer,TurfaceC 152 | vegan_v_vegan,vegan_v_vegan 153 | angeldaisy2002,BrokerDirectPlc 154 | AlanAlan5240751,_Aloominati_ 155 | ShazShazchy,MissingPetsGB 156 | pockwy,zepeto_official 157 | beth_ballew,DogDeskAction 158 | LCGangOfficial,pancakecali_ 159 | hilltopgina,_Aloominati_ 160 | Shetudeary,Solarful 161 | MHHSBD,CartersCollecta 162 | radiohead_bot_,find_charlotte 163 | kaboomsf,find_charlotte 164 | realslobo,FirstUnitedDTES 165 | IandFDesign,FirstUnitedDTES 166 | dalischone,MissingPetsGB 167 | NinaLewis16,hilltopgina 168 | Angie_RejoinEU,Angie_RejoinEU 169 | ThecLEMont,ANZZUART 170 | Miss_Mathsgeek,DrEmsLord 171 | WWFCEE,DrEmsLord 172 | shib_Ind,DrEmsLord 173 | TrendingBot2,beavan_lesley 174 | fairytaleflash,EnchantedEzine 175 | WDStoryTime,culture_debate 176 | chandra013,KreatelyMedia 177 | MurdochJem,sjlhollister 178 | beavan_lesley,sjlhollister 179 | ShaneDoty1,TurfaceC 180 | shib_Ind,TurfaceC 181 | FeeGrammer,storywhispers 182 | AnnabelleAsylum,pancakecali_ 183 | thehindu121,KreatelyMedia 184 | find_charlotte,KreatelyMedia 185 | LizzieBiff15,MissingPetsGB 186 | BBCDevon,MissingPetsGB 187 | SmithNeil82,TheWiganRunner 188 | AnneThompson10,storywhispers 189 | Thiru_Nithiin,Nithin65161400 190 | HMC_School,Garbett_HMCS 191 | YiewsleyMatters,Garbett_HMCS 192 | Forever1GoChi,Garbett_HMCS 193 | LydiaHopeTaylor,bandbtractors 194 | LucymwH,rhlonghurst 195 | itsjaidenmarie,Kartzmark 196 | Anita11578064,Saavik_Tits420 197 | charlottequay1,Saavik_Tits420 198 | MeeshNoo7,MissingPetsGB 199 | LightOrgan,MissingPetsGB 200 | MomsWhoSave,MissingPetsGB 201 | EnchantedEzine,MissingPetsGB 202 | KatieMettner,PrettyHotPink6 203 | tuuchytoons,GameIdentityV 204 | LaikaTwat,MissingPetsGB 205 | AOLMahuaDS,siljanvibeke 206 | QuestarVideo,TVandFilmNews 207 | shib_Ind,TVandFilmNews 208 | LARideShareGuy,teamdreamhunter 209 | TimoKuba,IstariVision 210 | find_charlotte,IstariVision 211 | UPSCPractice,IstariVision 212 | hey_jude_67,MyVoucherCodes 213 | efa_duffy,MyVoucherCodes 214 | PuzzleVehicles,MyVoucherCodes 215 | shib_Ind,MyVoucherCodes 216 | glossopcreates,newsinglossop 217 | Sotera_Legacy,Sotera_Legacy 218 | techvai,Sotera_Legacy 219 | ShaliniAustin,Sotera_Legacy 220 | pancakecali_,Sotera_Legacy 221 | JanLever,Rosieartwork 222 | TammyTokley,TheWiganRunner 223 | asianenews,TheWiganRunner 224 | brumnordie,TheWiganRunner 225 | kuhne_uk,TheWiganRunner 226 | Moomettes,TheWiganRunner 227 | EvieThats,BooksAtBluebird 228 | NinaLewis16,hilltopgina 229 | teamdreamhunter,hilltopgina 230 | Attwaters,hilltopgina 231 | spinningdove,storywhispers 232 | MyWatering,storywhispers 233 | jakeurcityxx,funky_punks 234 | sTheDreamHunter,funky_punks 235 | AlphasEverAfter,AlphasEverAfter 236 | NiFTGnomes,Jim_Dippin_ 237 | GoodVetPetGuide,Jim_Dippin_ 238 | AMindOnFire,Jim_Dippin_ 239 | silversandscorp,Jim_Dippin_ 240 | skitguys,Jim_Dippin_ 241 | steviebarto1,Chinese_Wellb 242 | Ella__Guthrie,LeukaemiaCareUK 243 | HumbleAttitude1,PCMCamisetas 244 | Best_of_PT,PortugalCNFDTL 245 | annamagique,VisitGermanyUK 246 | musicaudiostory,StorytimewithAC 247 | booly_tier1,ushomenc 248 | TJsaucier209,gabnft_official 249 | PaddyBoyceTrave,ashcmtb 250 | Antonii616,taneysha3 251 | mOQIl,PatriotSubtle 252 | kevingeerhart,sladeforlife 253 | WatersidePA,potterandford 254 | soanesy180,potterandford 255 | shib_Ind,potterandford 256 | KirkTanaka62,HallowsHaunts 257 | AquiferPartners,HallowsHaunts 258 | WDStoryTime,YNFMoviePod 259 | DebbieOppermann,FlaneurPhotos 260 | NeneFestival,_NeneValley 261 | _VINGLISH,AvallenSpirits 262 | donnyfarmshop,Keane_Creative 263 | AccentPress,JennyKaneAuthor 264 | PatriotSubtle,JennyKaneAuthor 265 | rbr_dux,JennyKaneAuthor 266 | Nettymanning,mcd_productions 267 | snoopysue71,littlefabshop 268 | ark_flower,littlefabshop 269 | junjia961,DrHananAshrawi 270 | uttoxetercc,CleanHitCricket 271 | JeromeMazandar1,CleanHitCricket 272 | DoSafeCrypto,zadabsc 273 | ProjectFreeroam,zadabsc 274 | StephanieisLive,zadabsc 275 | apextraxs,zadabsc 276 | apextraxs,zadabsc 277 | apextraxs,zadabsc 278 | apextraxs,zadabsc 279 | PTwister,SquatBunnie 280 | MagalyRo5a5,SquatBunnie 281 | EMO_harra,ZendingMachine1 282 | jude_pragasam,humster3d 283 | SPOFarrell3,Anthony_OBrien_ 284 | karlosleeos,Intrinsic_Paper 285 | junjia961,PalMissionUK 286 | Louthchat,kcs_irl 287 | pdeblassieiii,JulieKusma 288 | EMO_harra,Yeaceelovesdogs 289 | RinKagamine2222,JJArt25 290 | dailyfishingBot,ShadyPawsInc 291 | MtotheZ81,IstariVision 292 | MrCrackMorris,IstariVision 293 | NickHow13764609,IstariVision 294 | Joriginals1,Tonyharrisonart 295 | LindaPinpoint,womeninvisionuk 296 | ToisutaChiquira,womeninvisionuk 297 | shib_Ind,womeninvisionuk 298 | the_sugar_cove,womeninvisionuk 299 | FCCVictory,womeninvisionuk 300 | newsbluntmedia,womeninvisionuk 301 | moonlightbae6ix,TWlSTIE 302 | barfires,Rustmomentcom 303 | Weimadogxxx,MissingPetsGB 304 | gracelynhunt,MissingPetsGB 305 | KBMArtWriting,MissingPetsGB 306 | Yeaceelovesdogs,MissingPetsGB 307 | opiumdot,MissingPetsGB 308 | habourque,StellaMoris1 309 | ch_foto,StellaMoris1 310 | Lawyers4Life,articleeighteen 311 | LadyRebecca_AM,412Tickets 312 | shib_Ind,412Tickets 313 | WDStoryTime,talkin_shiz 314 | KatyMParkinson,LexonikST 315 | thakur_anupam01,KreatelyMedia 316 | jragmusic,KreatelyMedia 317 | treveraeon,jason32796 318 | KolbeSteven,OverbeckRandy 319 | melodeeaaron,elusive_6788 320 | JenandGoo,elusive_6788 321 | TaniaCrosse,fkleitch 322 | JohnnieGoodwin,LoDoDistrict 323 | shib_Ind,LoDoDistrict 324 | ShorelineStudi3,PaperKinsCrafts 325 | xoliaopied,GameIdentityV 326 | marysuzanneaita,colleengrott 327 | annamagique,VodkaWardrobe 328 | TaniaCrosse,annemariebrear 329 | spookyfigures,annemariebrear 330 | Shammu1516,UrbanAsian 331 | jason32796,UrbanAsian 332 | Pepe_joju,Rustmomentcom 333 | ScoutsAndinos,ContraApostasia 334 | mugsfunnyeu,ContraApostasia 335 | BrittanySoFly86,ContraApostasia 336 | L0nELyR0sE85,HwanniePromotes 337 | carrie_clarke,HwanniePromotes 338 | Deborah00411691,RRR_LUF 339 | M30PRJ,alt_cardiff 340 | navya_moghe,KreatelyMedia 341 | Benjamminhere,KeithMcilwain 342 | xBelinx,storywhispers 343 | KBMArtWriting,KBMArtWriting 344 | otaku_lottie,storywhispers 345 | ToytownKe,storywhispers 346 | ushomenc,storywhispers 347 | KBMArtWriting,KBMArtWriting 348 | gwleckythompson,KBMArtWriting 349 | Spencersretford,worksopcollege 350 | mugs_funny,worksopcollege 351 | MrDoombastic,SomeCrypt0Guy 352 | katie0147c,storywhispers 353 | Rishigautam009,KreatelyMedia 354 | wallE_bear,FTroote 355 | RGIS_Intl,FTroote 356 | AndrewONielsen,FTroote 357 | GoughCharley,FTroote 358 | beavan_lesley,FTroote 359 | rk70534,PlaceKaths 360 | VickyMi99564413,MissingPetsGB 361 | HotelNews_ie,lougheskecastle 362 | PlaceKaths,lougheskecastle 363 | VintageSoviet,LovesVintage43 364 | GabrielConstans,JulieKusma 365 | DorlingGini,HamleysOfficial 366 | srheasbot,ShadowDogDesign 367 | hiseulvir,HwanniePromotes 368 | fazfilmmedia,StellaMoris1 369 | shib_Ind,StellaMoris1 370 | maureen_ward,kcs_irl 371 | AashuMi44,KreatelyMedia 372 | kloubear88,holland_barrett 373 | LynRadioDeeside,holland_barrett 374 | CarverLiddy,holland_barrett 375 | HDYogiz,holland_barrett 376 | TanagerScarlett,VictorBadass 377 | ZPWLC,LeukaemiaCareUK 378 | theaquadolls,MoshTimes 379 | VRiffault,MoshTimes 380 | SandboxGrrl,NataniaBarron 381 | Enemy_Is_Great,Enemy_Is_Great 382 | mariocarlosmami,Enemy_Is_Great 383 | VintageSoviet,BCsBargainBin 384 | shib_Ind,BCsBargainBin 385 | gunswordfist,gunswordfist 386 | birdythurs,NataniaBarron 387 | NMBAbakery,NataniaBarron 388 | FaithCompassion,KBMArtWriting 389 | Spcbll_1,412Tickets 390 | FruitfulForever,412Tickets 391 | HivTinker,412Tickets 392 | mapsofantiquity,412Tickets 393 | mis_tykl,JennyKaneAuthor 394 | MissingPetsGB,JennyKaneAuthor 395 | VucuSC,IstariVision 396 | AhernJoanne,mcd_productions 397 | mis_tykl,bridportbooks 398 | AevansMarvelDC,storywhispers 399 | bornelsewhere,HullImages 400 | EWarynick,HullImages 401 | bellescharms,_RaeRadford 402 | FaithCompassion,KBMArtWriting 403 | TaniaCrosse,JennyKaneAuthor 404 | MTB_Cycler,Cliffdickenson 405 | JonWrong9,pert_brian 406 | MassimoSongs,MusicmanSinger 407 | Jones45Maxwell,MusicmanSinger 408 | Mowood2,RDCSolicitors 409 | VintageSoviet,NutmegCottage2 410 | DogeKnightRises,saint_sols 411 | TeboulMichele,RGE_Art 412 | CollectiveWors1,MissionalGen 413 | _ThinkBot,brainbubbles_de 414 | TrophyPetFoods,TrophyPet 415 | LeukaemiaCareUK,TrophyPet 416 | JewelsGiftBox,TrophyPet 417 | TyDye_Tweets,TrophyPet 418 | Topazrat,storywhispers 419 | AevansMarvelDC,Timberwise 420 | ProHomeOne,Timberwise 421 | magnetamerica,Timberwise 422 | Good_healthshop,AbsoluteAromas 423 | KBMArtWriting,AbsoluteAromas 424 | andy_reds,StellaMoris1 425 | MorganCactus,StellaMoris1 426 | kanediking,SurfMoonToken 427 | dazmu2,mcd_productions 428 | _LiyahThreadz,QueenFendij 429 | COPYWRITE614,steaminkettlepr 430 | mis_tykl,LucyColemanauth 431 | leimthart,mcd_productions 432 | cjshepp,PetMunchies 433 | TrophyPet,PetMunchies 434 | britchford9,GillianMcKeith 435 | SMGSimon,getwhalinvest 436 | xsunsetari,manueldesigner_ 437 | bhartiymanus,KreatelyMedia 438 | LucyCK,KreatelyMedia 439 | VisiblyVincent,KreatelyMedia 440 | DpsJadoun,KreatelyMedia 441 | StorytimewithAC,musicaudiostory 442 | AHumbleHobbit,Timberwise 443 | MellysHandmade,Timberwise 444 | winsforfelicity,SantaBeazzz 445 | Its_Rachael_XX,storywhispers 446 | ZombieRocker86,RDCSolicitors 447 | deafangel1080,RDCSolicitors 448 | BestRecipesUK,BestRecipesUK 449 | JEANMIC36258403,Plaza_Athenee 450 | shxxnsa,HwanniePromotes 451 | StorySpirit4U,morgankwyatt 452 | designerluv1,morgankwyatt 453 | mrdavidhopper,morgankwyatt 454 | VisitYork,barconventyork 455 | brainbubbles_de,barconventyork 456 | Amourfoxx,hilltopgina 457 | BertieSaved,KateBeinder 458 | TaniaCrosse,carol_thomas2 459 | leviteking,carol_thomas2 460 | Gus_802,TheStourbridge 461 | militarymemos,SSAFA 462 | Detail_DMC,SSAFA 463 | BramleyBaptist,SSAFA 464 | AHumbleHobbit,storywhispers 465 | maola_varalli,SAMPAuk_ 466 | TopBananaMall,SAMPAuk_ 467 | KBMArtWriting,SAMPAuk_ 468 | designerundies,designerundies 469 | Johnny24450,shib_Ind 470 | ioan_humphreys,FridgeSwansea 471 | Jbriggsy_14,FridgeSwansea 472 | beth_ballew,DogDeskAction 473 | IamHinduatheart,missionkaali 474 | HolySepulchreUK,missionkaali 475 | olivetnazarene,missionkaali 476 | bozzo1931,gsrescueelite 477 | SMARTeducation6,gsrescueelite 478 | MyWatering,gsrescueelite 479 | elvisbulldoguk1,guccidog2020 480 | sixhdhcityx,HwanniePromotes 481 | Demcia97,kwkresin 482 | babbles82,412Tickets 483 | KenarryIdeas,412Tickets 484 | JoanneCangal,ruthmkb 485 | TaniaCrosse,mick859 486 | SkyRTRblxBot,scenefren 487 | inbusiness4good,scenefren 488 | TheReinvention1,ViewOchil 489 | HeardThatNoise,isle7crossing 490 | beinglight_,missionkaali 491 | FaithCompassion,KBMArtWriting 492 | OutdoorImagesNW,Mandsby 493 | TheCarlyBrown,xuetingni 494 | StorytimewithAC,xuetingni 495 | winterlysnow,FOXYGIVES 496 | kakenzie101,storywhispers 497 | GordonsSch,storywhispers 498 | tobyhora2012,holland_barrett 499 | Johnny24450,shib_Ind 500 | KBMArtWriting,KBMArtWriting 501 | MegalsMerch,KBMArtWriting 502 | SFRestoration,KBMArtWriting 503 | FaithCompassion,KBMArtWriting 504 | donnas92,KBMArtWriting 505 | jaimiephoenixea,EAToday 506 | Isynze1,ArtistByron 507 | ZebraMingo,kblacey 508 | cocklewoman,FridgeSwansea 509 | ravenhcrafted,NaturaEmporium 510 | DaveGordonArt,eclectorium 511 | suedelacour,CI_Coop 512 | GlenroydHouse,CI_Coop 513 | LydiaHopeTaylor,storywhispers 514 | CReutcke,barconventyork 515 | Trazlersgal,VodkaWardrobe 516 | GoodVintageArt1,KBMArtWriting 517 | free_pradeep,KreatelyMedia 518 | OuiSuzette,LadyTeapots 519 | danikhamptons,holland_barrett 520 | Multigamer,ArtsyMystic 521 | Team_English1,ec_publishing2 522 | lauramarsh70,ec_publishing2 523 | wind323lu,ec_publishing2 524 | NYartwarp,ec_publishing2 525 | Sbharden15,TurfaceC 526 | So_Lippy,TurfaceC 527 | FaithCompassion,KBMArtWriting 528 | HashyNFTs,Superman_2106 529 | spencer_helen,storywhispers 530 | SianD91_,storywhispers 531 | rotiendolita,storywhispers 532 | ItsukaKasuga,MyoZin_ 533 | clubfoody1,MyoZin_ 534 | PlaceKaths,PlaceKaths 535 | rotiendolita,PlaceKaths 536 | FaithCompassion,KBMArtWriting 537 | LrFerrier,BettinaSRoss1 538 | HorneyMedia,HobeckBooks 539 | markscattergoo2,ViktorsPaws 540 | the_ksphoto,ViktorsPaws 541 | Pharhan360,ViktorsPaws 542 | mcroberts_jesse,saint_sols 543 | hodder_neil,CitronHygiene 544 | ByJayClemons,CitronHygiene 545 | RBXRetweetBot,wikioccult 546 | thornbridgefay,wikioccult 547 | coldharbourroad,Beautologyuk 548 | HivTinker,Beautologyuk 549 | SkyRTRblxBot,wikioccult 550 | redbeardgamez,wikioccult 551 | FaithCompassion,KBMArtWriting 552 | PlaceKaths,KBMArtWriting 553 | mythical_rosie,KBMArtWriting 554 | ParsonRex,storywhispers 555 | snoopysue71,HalonMenswear 556 | stuntnuts,CrackersNFT 557 | ZeroELVS,Tsikiiyo 558 | Evelyn_0805,Loveisblind2021 559 | RBXRetweetBot,wikioccult 560 | CJ41002028,StellaMoris1 561 | AmordeMujer0308,Roofero3 562 | Tanyawarren,BagsofFavours 563 | barbea88,Timberwise 564 | PRCPadova,StellaMoris1 565 | inbusiness4good,StellaMoris1 566 | TopBananaMall,StellaMoris1 567 | Caluvsdogs,StellaMoris1 568 | StanleyJames05,StellaMoris1 569 | theindustryfash,StellaMoris1 570 | StMatthewsLuton,ActiveStMatts 571 | EAFocusInc,TurningPointMac 572 | SteelCityAdy,HMSLedbury 573 | IndieBrag,HMSLedbury 574 | PonyMalarkey,taneysha3 575 | SkyRTRblxBot,wikioccult 576 | marilynflower27,wikioccult 577 | TopBananaMall,wikioccult 578 | kush_tracey,wikioccult 579 | Tanyawarren,MugsofFunGifts 580 | real_canuck,MugsofFunGifts 581 | Zachfarris6,TurfaceC 582 | NYisBLUE,agreatbigcity 583 | taniaxmichele,agreatbigcity 584 | hayley_loves_xx,SheHairUK 585 | PalmBeachLCA,LarnakaRegion 586 | Kingcooper74,storywhispers 587 | SmestowSchool,storywhispers 588 | DaveGordonArt,BCsBargainBin 589 | Jeanettel1979,storywhispers 590 | xoxlululaurence,aussomemiko 591 | owenchrisjones,SheHairUK 592 | author_barr,m_morganauthor 593 | Lordoftheboard3,m_morganauthor 594 | deaninwaukesha,BrownDogGadgets 595 | leszektojatak,1streetart 596 | comicbookrpt,FiguresToyCo 597 | Sloths7777,Sloths7777 598 | KBMArtWriting,KBMArtWriting 599 | PCMCamisetas,IvankaKolchakov 600 | DaveGordonArt,lisainsocali 601 | Island_Pearls,lisainsocali 602 | Fluf2021,IstariVision 603 | natisthecure3,_Aloominati_ 604 | GilljazzCook,JazzHullabaloo 605 | Perina4,pbshop_store 606 | Annecdotist,storywhispers 607 | PCMCamisetas,PawsInProfile 608 | kcs_irl,PawsInProfile 609 | CodeAttBot,LeeHillerDesign 610 | KBMArtWriting,KBMArtWriting 611 | DeniseCoughlan1,mcd_productions 612 | discovery_remax,discovery_remax 613 | crypt0bish,SomeCrypt0Guy 614 | ruby__mew,chubbydpp 615 | kojowithdamojo,OcaRockaRina 616 | xobrree_,OcaRockaRina 617 | dollydolly14,StellaMoris1 618 | KBMArtWriting,KBMArtWriting 619 | LynRadioDeeside,KBMArtWriting 620 | NalaNannie,depot_pets 621 | IzzyJon67069546,DementiaUK 622 | mrs_meep,storywhispers 623 | JasperManUtd,_Aloominati_ 624 | maharrison_21,TurfaceC 625 | KBMArtWriting,KBMArtWriting 626 | NEW40608072,GameIdentityV 627 | Tanyawarren,KrasnayaDolls 628 | joelivany,edmontonopera 629 | promotenorthsol,MellSquare_UK 630 | alexis_1108,MellSquare_UK 631 | affordantq,MellSquare_UK 632 | Angie_RejoinEU,MellSquare_UK 633 | erangatennakoon,MellSquare_UK 634 | cjbahr,AuthorKathrynH 635 | Goldmatters_,AuthorKathrynH 636 | Vamplified,AuthorKathrynH 637 | paigerpenland,FI_Conservation 638 | DrShankar26,missionkaali 639 | JKperfumer,ArtistByron 640 | swedbo,KuglerElisabeth 641 | bronwenhyde,KuglerElisabeth 642 | PopescuCo,Plaza_Athenee 643 | TaniaCrosse,ImogenMartin9 644 | BPolimer,TurfaceC 645 | jennifercgrant,TurfaceC 646 | JohnWilkinspsyc,Rokewood 647 | junperjack,WORLDMUSICAWARD 648 | realmikedwc,Calcify_ 649 | TiaLudwick,412Tickets 650 | Raj07687541,KreatelyMedia 651 | OiShinyThings,Fabstainedglass 652 | GrammaChris1,Elidanza 653 | Cricketsongsale,Elidanza 654 | DonitaJose,Elidanza 655 | Shoguun1,JulieKusma 656 | boneham1989,storywhispers 657 | DawnParry,storywhispers 658 | HarryStote4,TruckyLuckyApp 659 | Tanyawarren,Betsysbowbouti1 660 | AndreaCoventry,TheTipToeFairy 661 | ukwondering,_Aloominati_ 662 | EmmaMerrygold,storywhispers 663 | SerpentXael,QueeenLolli 664 | mis_tykl,JulieKusma 665 | Signaduk,MYSTLiverpool 666 | WeAreWaterlooUK,MYSTLiverpool 667 | indiax2050,missionkaali 668 | lindgrensmith,missionkaali 669 | EnigmediaM,pinklizardpromo 670 | JaneJago1,JulieKusma 671 | FCCVictory,JulieKusma 672 | cjbahr,AuthorKathrynH 673 | JJmac300015,__KISH 674 | therealdaxlee,TurfaceC 675 | vaayumitra,KreatelyMedia 676 | KarelRoman10,SantaInu_BSC 677 | Imskooo,littlebabydoge1 678 | ambered_haze,taneysha3 679 | _NeneValley,taneysha3 680 | chriskavanagh5,mcd_productions 681 | XelDBL,itsuroki 682 | mohamadsamurai3,C_Shangchi 683 | G_MXSHANA,C_Shangchi 684 | Plaza_Athenee,C_Shangchi 685 | ProphetsReal,IUICOfficial 686 | TaniaCrosse,birdhousebooks 687 | donk48,storywhispers 688 | LenVeigaZ,JellybeanReds 689 | StigandrBushcra,JellybeanReds 690 | mis_tykl,Lizones1 691 | LiaBeltrami,Lizones1 692 | UnircornWrap,412Tickets 693 | Fabstainedglass,412Tickets 694 | mis_tykl,BrionyMaySmith 695 | HDYogiz,BrionyMaySmith 696 | castelcivita48,DrHananAshrawi 697 | LinnBHalton,DrHananAshrawi 698 | MainSouth1,DrHananAshrawi 699 | HedgieDesigns,DrHananAshrawi 700 | lodge662,VictorBadass 701 | TwystedRoots,BeeHappyUK 702 | ToshioK,BeeHappyUK 703 | MyWatering,BeeHappyUK 704 | jc_cannon13,DementiaUK 705 | BarbaraBettis,OverbeckRandy 706 | YugoBrit,OverbeckRandy 707 | castelcivita48,StellaMoris1 708 | SkillsNetworkUK,StellaMoris1 709 | temi,wendy_seun 710 | Timewalkproject,weR500Together 711 | explosionmurdex,AlyTheKitten 712 | birdwriter7,birdwriter7 713 | sj_mccormack,kimhornsby 714 | DainesP,BrokerDirectPlc 715 | mis_tykl,carol_thomas2 716 | ArcEng9154644,carol_thomas2 717 | HumbleS97599245,carol_thomas2 718 | mis_tykl,birdhousebooks 719 | ThingsYouNeed2K,irishdailytimes 720 | Pikapupvee,GodlyeoA 721 | SuperSoftKnits,vintagobsession 722 | geethsaraonline,vintagobsession 723 | LupineAssassin,Michael_Racer1 724 | dear_noly,Michael_Racer1 725 | VanessaLYbarra,Michael_Racer1 726 | ajnamdeplume,Michael_Racer1 727 | jgmacleodauthor,JulieKusma 728 | Matthew70700968,BaggaleyLiz 729 | jragmusic,BaggaleyLiz 730 | NRJuniors,BaggaleyLiz 731 | JuliaViolinista,brandsintheair 732 | RyanKrolAuthor,AuthorJDumas 733 | Convenzis_Group,10to8ltd 734 | ReArtistron,mattwnelson 735 | twbgd,thechequeredsk1 736 | myfizzypop,myfizzypop 737 | RMannanDesigns,myfizzypop 738 | jgmacleodauthor,JulieKusma 739 | Kimmikimm91,JulieKusma 740 | Calcify_,JulieKusma 741 | ObjectiveTravel,JulieKusma 742 | Carole71024753,StellaMoris1 743 | ECC_malta,StellaMoris1 744 | selfishgenie,StellaMoris1 745 | MellSquare_UK,StellaMoris1 746 | TheEcoStuff,StellaMoris1 747 | belleearth_soap,StellaMoris1 748 | CarolinaTulsi,StellaMoris1 749 | TheExtremeMusi1,TheExtremeMusi1 750 | lulu82824,blinverted 751 | Bekah23198223,storywhispers 752 | YamahaWH,storywhispers 753 | SuperSoftKnits,mlnostalgia 754 | JamiePickles14,simoncotton69 755 | ravipartap_1,KreatelyMedia 756 | pnp_aim,KreatelyMedia 757 | un_lucky_clover,BeautyKitchen 758 | JohnSchreiber8,StellaMoris1 759 | SuperSoftKnits,eclectorium 760 | teatroparaguas,eclectorium 761 | WestCorkDistill,eclectorium 762 | jgmacleodauthor,JulieKusma 763 | TopBananaMall,JulieKusma 764 | SJTheaters,BroadwaySanJose 765 | JEANMIC36258403,LeMeurice 766 | SuperSoftKnits,birdhousebooks 767 | tweetjoyarora,birdhousebooks 768 | face_b0rn,FelizAnn_nft 769 | rsimmon19,FelizAnn_nft 770 | LeclercVicky,hilltopgina 771 | joerivera82,hilltopgina 772 | FridgeSwansea,hilltopgina 773 | Sharifebarnes1W,hilltopgina 774 | MBeddis,mcd_productions 775 | Windsphere1,GameIdentityV 776 | Michael80979900,aussomemiko 777 | furkannn_ko,Rustmomentcom 778 | DJ_Corinna,Rustmomentcom 779 | MfanwyEvans,aussomemiko 780 | pixlpudding,aussomemiko 781 | jgmacleodauthor,JulieKusma 782 | herecomesrufus_,JulieKusma 783 | LoveThe1970s,JulieKusma 784 | NuttlyR,KBMArtWriting 785 | bsc_shills,KBMArtWriting 786 | serena_oceana,KBMArtWriting 787 | 3_sebz,CameronCortina1 788 | rsimmon19,CameronCortina1 789 | Autismmomof7,412Tickets 790 | ms_b17,feelaliveuk 791 | KMB73,ChrstmsCntdwn 792 | SuperSoftKnits,RetroCEO 793 | KurokonekoKamen,JulieKusma 794 | SyncSunMoon,StellaMoris1 795 | HpoolLife,StellaMoris1 796 | ShadyPawsInc,StellaMoris1 797 | ArtistByron,StellaMoris1 798 | selikopiti,StellaMoris1 799 | demossoft,StellaMoris1 800 | anna_jayne_blog,storywhispers 801 | ElenskyRuslan,drying_equip 802 | ForgottenAstro2,JulieKusma 803 | colingarrow,alicerauthor 804 | Tony_Cghn,irishdailytimes 805 | TIHWbot,HorrorPack 806 | spruett123,412Tickets 807 | ForgottenAstro2,JulieKusma 808 | SuperSoftKnits,Lizones1 809 | drying_equip,Lizones1 810 | Shoguun1,JulieKusma 811 | SuperSoftKnits,Lizones1 812 | LeilaO2014,ViktorsPaws 813 | AJoiousOccasion,GerryGreek 814 | MCufflinks,MugsofFunGifts 815 | ruby_redsky,MugsofFunGifts 816 | KBMArtWriting,MugsofFunGifts 817 | kokoiruwa,hiroizumi1 818 | Jocanlose,storywhispers 819 | jgmacleodauthor,JulieKusma 820 | ScrappyDaDog14,TheMiloDog 821 | magical_mooni,taneysha3 822 | Anthony_OBrien_,taneysha3 823 | MalawiTravel,RIPPLEAfrica 824 | SledgerLedger,LexonikST 825 | USAPLUMBINGSVCS,LexonikST 826 | mcampbelfast,the_rivermill 827 | OldSkullGames,the_rivermill 828 | bmurphypointman,the_rivermill 829 | LemonadeGianna,LunpiStore 830 | MindfulMoody,LunpiStore 831 | MarilynHatlady,ZaverDesigns 832 | PCMCamisetas,MuzaDotco 833 | Mandy96936981,412Tickets 834 | KBMArtWriting,412Tickets 835 | felixbelix,storywhispers 836 | SuperSoftKnits,mlnostalgia 837 | jholmie89,StellaMoris1 838 | Winston6079ws,MrPeepsSays 839 | SuperSoftKnits,texastwins2004 840 | blossomactor,SkylarkArtist 841 | WSC2000,SkylarkArtist 842 | JayDeMoir,SkylarkArtist 843 | thedualworks,CoffinWorks 844 | DalmataDamien,desmaan 845 | PCMCamisetas,MuzaDotco 846 | iambilljeffery,MuzaDotco 847 | AnjaOlaf,LStewart_books 848 | supershadio,HelpDiYutesJa 849 | khristaki,JimJatras 850 | BotBama,toet_st 851 | Seller9991,AllOldStuffbyS1 852 | Bromattcbd,AllOldStuffbyS1 853 | Hazeleyes_0,412Tickets 854 | LoriRennie,412Tickets 855 | heychica,Elidanza 856 | IaconaRiccardo,StellaMoris1 857 | cfahullstreet,StellaMoris1 858 | YellowSalmon,Elidanza 859 | hey_jude_67,storywhispers 860 | KBMArtWriting,storywhispers 861 | MummytoFrank1,BeautyKitchen 862 | sonicsstevie,BrokerDirectPlc 863 | toet_st,BrokerDirectPlc 864 | CasaDoradaCabo,BrokerDirectPlc 865 | nwrxj9,RHDR 866 | PCMCamisetas,KrappyThings 867 | Lunathenaked,KrappyThings 868 | PieMakers,KrappyThings 869 | hammered2019,Timberwise 870 | KimMerville,reviewwales 871 | EmilyAmazon,ShadowDogDesign 872 | Shoguun1,joanne_paulson 873 | Ono78725903,Keircc1 874 | myvetsocial,Keircc1 875 | jeollyi,HwanniePromotes 876 | manuinverafic,BlueCornerCreas 877 | Okami_mxsamurai,C_Shangchi 878 | MoneyQuote,C_Shangchi 879 | lewis_herbert,FoodCambridge 880 | PChrisDavid,NathanSquire3 881 | valbaldi,ARofuoo 882 | themixbristol,ARofuoo 883 | jestersdreamIE,mcd_productions 884 | manobanlalisa__,CaledonianKitty 885 | mis_tykl,wenfancyart 886 | WEIRDCHRISTMAS,tonypaulway 887 | heychica,kblacey 888 | mis_tykl,fkleitch 889 | Temprell1,fkleitch 890 | UPSCPractice,fkleitch 891 | Mealzo_uk,fkleitch 892 | DebzHolland,storywhispers 893 | Asset_Alliance,storywhispers 894 | GipsonBusiness,storywhispers 895 | kurapikxs_hoe,GameIdentityV 896 | lepetluxe,GameIdentityV 897 | CadmiumLemon,SalfordChoral 898 | LetsGoOut_BH,SalfordChoral 899 | arcofmanning,SalfordChoral 900 | JockeyClubRooms,SalfordChoral 901 | Leopardprintsxx,RacecarBox 902 | CWSellors,RacecarBox 903 | JuraWatches,RacecarBox 904 | glassoflemonaid,ANZZUART 905 | rtItBot,HouseOfSeb 906 | DooNorthTexas,HouseOfSeb 907 | QueeenLolli,HouseOfSeb 908 | williamlstuart,HouseOfSeb 909 | WhisperAmber,icsfblog 910 | Susan10124954,Cliffdickenson 911 | CartersCollecta,Cliffdickenson 912 | Yatesmark001,BringOnTheSpice 913 | DMGSLLC,BringOnTheSpice 914 | RubyPerry11,BringOnTheSpice 915 | KryptoGodsNFTs,BringOnTheSpice 916 | NutmegDiaries,BringOnTheSpice 917 | AFdosChapeus,BringOnTheSpice 918 | dian_simplethin,donnas92 919 | CadmiumLemon,CongletonCS 920 | drumpfbot2016,Rediscova1 921 | ONSIGHT_UK,Rediscova1 922 | Citizenccltd,Rediscova1 923 | theDomainBot,SavageDomains 924 | thisisgoradio,SavageDomains 925 | DetroitRadioAdv,SavageDomains 926 | Rediscova1,SavageDomains 927 | mmcatsdesign,lmgilson5927 928 | VivlioTekka,Tsikiiyo 929 | Lorranstz,Rustmomentcom 930 | Shoguun1,JulieKusma 931 | BeBeautiful_In,JulieKusma 932 | Ruy_Jorge_yuR,JulieKusma 933 | Stratus_health,JulieKusma 934 | BeautySkinYourN,JulieKusma 935 | LeeHillerDesign,JulieKusma 936 | RecordMoney_,JulieKusma 937 | fancydresstown,JulieKusma 938 | LicensedProduct,JulieKusma 939 | BirkdaleHome,JulieKusma 940 | SavageDomains,JulieKusma 941 | roylmurry425,JulieKusma 942 | CarolineRach_,JulieKusma 943 | albedopasta,GameIdentityV 944 | LeMeurice,GameIdentityV 945 | birdwriter7,katey_sewell 946 | EatingOur,katey_sewell 947 | maltachristmas,katey_sewell 948 | SuzyYoung24,gordo_dog 949 | RoarLoudTravel,DemiCassiani 950 | nunningtoncow,PetMunchies 951 | VictorBadass,PetMunchies 952 | yvensew,SueCanSew1 953 | SarahMRomance,HarperCollinsUK 954 | biscuitttown,StellaMoris1 955 | vicky_whedbee,drusillacarr5 956 | DoffuMC,ImRespawning 957 | FightyWoman,netzfrauen 958 | KBMArtWriting,netzfrauen 959 | SuperSoftKnits,YouAreTheExpert 960 | Vinayak687,hilltopgina 961 | BeBartletts,hilltopgina 962 | TaehongChowa,ferozwala 963 | jorgeft5180,IstariVision 964 | kmljjj,DementiaUK 965 | AnthonyFlintPC,DementiaUK 966 | yelbuggs,DementiaUK 967 | TwolvesU,ClubBrockport 968 | HouseOfSeb,ClubBrockport 969 | rebeccacoleman,ClubBrockport 970 | Aubade85Emilie,jojo_marsh 971 | FlyerWhitstable,Whitproduce 972 | KBMArtWriting,Whitproduce 973 | yinsguys,WacoRunningCo 974 | SadiraStone,WacoRunningCo 975 | SuperSoftKnits,cerolana 976 | LindaNord9,StellaMoris1 977 | lamaletademaggi,bakeitwithlove 978 | yakwaxlips,SquaredSeven 979 | MrsOsborne123,Tonyharrisonart 980 | GholamiNoble,C_Shangchi 981 | SuperSoftKnits,TheStrandline 982 | yvensew,Amorejewellery 983 | MaryEllenGallac,storywhispers 984 | gahan_marty,NCBI_sightloss 985 | EmilyAmazon,BlueCornerCreas 986 | FalHolidayHomes,BlueCornerCreas 987 | Yeoldetripnott,WelbeckAbbeyBry 988 | PCMCamisetas,WelbeckAbbeyBry 989 | keithclaire95,ClubBrockport 990 | LukeHarrohcafc,mcd_productions 991 | SuperSoftKnits,GrannyFireside 992 | berlin_samurai2,C_Shangchi 993 | mis_tykl,annemariebrear 994 | iuicsacramento,annemariebrear 995 | RubyPerry11,annemariebrear 996 | _Aware_Citizen,KreatelyMedia 997 | DellOlioMario,JulieKusma 998 | newsoneplace,JulieKusma 999 | liveurlifenotme,patmarsh 1000 | mediocremeee,AdamTurcotte6 1001 | SteveStevens47,DementiaUK 1002 | -------------------------------------------------------------------------------- /stream/produce.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import csv 3 | import os 4 | import json 5 | import pulsar 6 | from kafka import KafkaProducer 7 | from kafka.admin import KafkaAdminClient, NewTopic 8 | from kafka.errors import TopicAlreadyExistsError, NoBrokersAvailable 9 | from time import sleep 10 | 11 | KAFKA_IP = os.getenv("KAFKA_IP", "kafka") 12 | KAFKA_PORT = os.getenv("KAFKA_PORT", "9092") 13 | KAFKA_TOPIC = os.getenv("KAFKA_TOPIC", "retweets") 14 | 15 | PULSAR_IP = os.getenv("PULSAR_IP", "pulsar") 16 | PULSAR_PORT = os.getenv("PULSAR_PORT", "6650") 17 | PULSAR_TOPIC = os.getenv("PULSAR_TOPIC", "retweets") 18 | 19 | TWITTER_DATA = "data/scraped_tweets.csv" 20 | 21 | 22 | def restricted_float(x): 23 | try: 24 | x = float(x) 25 | except ValueError: 26 | raise argparse.ArgumentTypeError("%r not a floating-point literal" % (x,)) 27 | if x < 0.0 or x > 3.0: 28 | raise argparse.ArgumentTypeError("%r not in range [0.0, 3.0]" % (x,)) 29 | return x 30 | 31 | 32 | def parse_arguments(): 33 | parser = argparse.ArgumentParser() 34 | parser.add_argument( 35 | "--stream-delay", 36 | type=restricted_float, 37 | default=2.0, 38 | help="Seconds to wait before producing a new message (MIN=0.0, MAX=3.0)", 39 | ) 40 | parser.add_argument("--broker", choices=["kafka", "pulsar"]) 41 | return parser.parse_args() 42 | 43 | 44 | def generate_tweets(): 45 | while True: 46 | with open(TWITTER_DATA) as file: 47 | csvReader = csv.DictReader(file) 48 | for rows in csvReader: 49 | data = { 50 | "source_username": rows["source_username"], 51 | "target_username": rows["target_username"], 52 | } 53 | yield data 54 | 55 | 56 | def get_admin_client(ip, port): 57 | retries = 30 58 | while True: 59 | try: 60 | admin_client = KafkaAdminClient( 61 | bootstrap_servers=ip + ":" + port, client_id="test" 62 | ) 63 | return admin_client 64 | except NoBrokersAvailable: 65 | retries -= 1 66 | if not retries: 67 | raise 68 | sleep(1) 69 | 70 | 71 | def create_topic(ip, port, topic): 72 | admin_client = get_admin_client(ip, port) 73 | my_topic = [NewTopic(name=topic, num_partitions=1, replication_factor=1)] 74 | try: 75 | admin_client.create_topics(new_topics=my_topic, validate_only=False) 76 | except TopicAlreadyExistsError: 77 | pass 78 | print("All topics:") 79 | print(admin_client.list_topics()) 80 | 81 | 82 | def create_kafka_producer(ip, port): 83 | retries = 30 84 | while True: 85 | try: 86 | producer = KafkaProducer(bootstrap_servers=ip + ":" + port) 87 | return producer 88 | except NoBrokersAvailable: 89 | retries -= 1 90 | if not retries: 91 | raise 92 | print("Failed to connect to Kafka") 93 | sleep(1) 94 | 95 | 96 | def kafka_producer(ip, port, topic, generate, stream_delay): 97 | producer = create_kafka_producer(ip, port) 98 | message = generate() 99 | while True: 100 | try: 101 | producer.send(topic, json.dumps(next(message)).encode("utf8")) 102 | print("Produce: ", message) 103 | producer.flush() 104 | sleep(stream_delay) 105 | except Exception as e: 106 | print(f"Error: {e}") 107 | 108 | 109 | def pulsar_producer(ip, port, topic, generate, stream_delay): 110 | client = pulsar.Client("pulsar://" + ip + ":" + port) 111 | producer = client.create_producer(topic) 112 | message = generate() 113 | while True: 114 | try: 115 | msg = json.dumps(next(message)) 116 | producer.send(msg.encode("utf8")) 117 | print("Produce: ", msg) 118 | producer.flush() 119 | sleep(stream_delay) 120 | except Exception as e: 121 | print(f"Error: {e}") 122 | 123 | 124 | def main(): 125 | args = parse_arguments() 126 | sleep(15) 127 | if args.broker == "kafka": 128 | create_topic(KAFKA_IP, KAFKA_PORT, KAFKA_TOPIC) 129 | kafka_producer( 130 | KAFKA_IP, KAFKA_PORT, KAFKA_TOPIC, generate_tweets, args.stream_delay 131 | ) 132 | else: 133 | pulsar_producer( 134 | PULSAR_IP, PULSAR_PORT, PULSAR_TOPIC, generate_tweets, args.stream_delay 135 | ) 136 | 137 | 138 | if __name__ == "__main__": 139 | main() 140 | -------------------------------------------------------------------------------- /stream/requirements.txt: -------------------------------------------------------------------------------- 1 | kafka-python==2.0.2 2 | pulsar-client==2.10.0 3 | --------------------------------------------------------------------------------