├── nyt_haiku ├── __init__.py ├── data │ ├── sensitive_sections.txt │ ├── bad_abbreviations.txt │ ├── sensitive_terms.txt │ ├── sensitive_tags.txt │ └── syllable_counts.csv ├── errors.py ├── models.py ├── twitter.py ├── moderator.py ├── haiku.py └── nyt.py ├── README.md ├── .gitignore ├── setup.py ├── logconfig.ini ├── remove_syllapy_redundant.py ├── Pipfile ├── pyrightconfig.json ├── main.py ├── syllapy_check.py ├── publish.py ├── tests ├── test_nyt.py ├── test_moderator.py └── test_haiku.py ├── twitter_stats.py ├── templates └── index.html └── Pipfile.lock /nyt_haiku/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nyt_haiku/data/sensitive_sections.txt: -------------------------------------------------------------------------------- 1 | Opinion 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NYT Haiku Bot 2 | 3 | A new python implementation of an old classic. Still under early development! 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea 3 | *.log 4 | tmp/ 5 | logs/ 6 | 7 | *.py[cod] 8 | *.egg 9 | build 10 | htmlcov.env 11 | 12 | .env 13 | -------------------------------------------------------------------------------- /nyt_haiku/errors.py: -------------------------------------------------------------------------------- 1 | class Error(Exception): 2 | """Base class for exceptions in this module.""" 3 | pass 4 | 5 | 6 | class LineMismatchError(Error): 7 | pass 8 | 9 | 10 | class SyllableCountError(Error): 11 | pass 12 | -------------------------------------------------------------------------------- /nyt_haiku/data/bad_abbreviations.txt: -------------------------------------------------------------------------------- 1 | a.k.a. 2 | Apr. 3 | Aug. 4 | Bros. 5 | Calif. 6 | Cpl. 7 | Dec. 8 | Dr. 9 | Feb. 10 | Fla. 11 | Jan. 12 | Jul. 13 | Jun. 14 | Mar. 15 | Mont. 16 | Mr. 17 | Mrs. 18 | Ms. 19 | Mx. 20 | Nov. 21 | Oct. 22 | Okla. 23 | Pfc. 24 | Sep. 25 | Sept. 26 | Tex. 27 | Calif. 28 | Minn. 29 | Mont. 30 | Wyo. 31 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | 4 | import asyncio 5 | from dotenv import load_dotenv 6 | 7 | from nyt_haiku import models 8 | 9 | # settings.py 10 | load_dotenv() 11 | 12 | async def main(): 13 | db_path = os.getenv("DB_PATH") 14 | await models.init(db_path) 15 | await models.setup_db() 16 | await models.close_db() 17 | 18 | 19 | asyncio.run(main()) 20 | -------------------------------------------------------------------------------- /logconfig.ini: -------------------------------------------------------------------------------- 1 | [loggers] 2 | keys=root 3 | 4 | [handlers] 5 | keys=stream_handler 6 | 7 | [formatters] 8 | keys=formatter 9 | 10 | [logger_root] 11 | level=DEBUG 12 | handlers=stream_handler 13 | 14 | [handler_stream_handler] 15 | class=StreamHandler 16 | level=INFO 17 | formatter=formatter 18 | args=(sys.stderr,) 19 | 20 | [formatter_formatter] 21 | format=%(asctime)s %(levelname)-6s %(message)s 22 | -------------------------------------------------------------------------------- /remove_syllapy_redundant.py: -------------------------------------------------------------------------------- 1 | import os 2 | import csv 3 | import syllapy 4 | 5 | syllable_file_path = os.path.join(os.path.dirname(__file__), 'nyt_haiku', 'data', 'syllable_counts.csv') 6 | with open(syllable_file_path, newline='') as file: 7 | reader = csv.reader(file) 8 | for row in reader: 9 | if len(row) == 2: 10 | word = row[0].lower() 11 | count = int(row[1]) 12 | if count != syllapy.count(word): 13 | print(f"{word},{count}") 14 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | pytest = "*" 8 | pytest-cov = "*" 9 | pytest-mock = "*" 10 | flake8 = "*" 11 | pytest-asyncio = "*" 12 | pytest-aiohttp = "*" 13 | 14 | [packages] 15 | spacy = "*" 16 | syllapy = "*" 17 | beautifulsoup4 = "*" 18 | asyncio = "*" 19 | aiohttp = "*" 20 | cchardet = "*" 21 | python-dateutil = "*" 22 | aiodns = "*" 23 | python-dotenv = "*" 24 | peony-twitter = "*" 25 | aiofiles = "*" 26 | aiosqlite = "*" 27 | tortoise-orm = "== 0.16.21" 28 | num2words = "*" 29 | unidecode = "*" 30 | jinja2 = "*" 31 | -------------------------------------------------------------------------------- /pyrightconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "nyt_haiku" 4 | ], 5 | 6 | "exclude": [ 7 | "**/node_modules", 8 | "**/__pycache__" 9 | ], 10 | 11 | "ignore": [ 12 | "src/oldstuff" 13 | ], 14 | 15 | "stubPath": "nyt_haiku/stubs", 16 | "venvPath": "/Users/harrisj/.local/share/virtualenvs", 17 | 18 | "reportMissingImports": true, 19 | "reportMissingTypeStubs": false, 20 | 21 | "pythonVersion": "3.7", 22 | "pythonPlatform": "Linux", 23 | 24 | "executionEnvironments": [ 25 | { 26 | "root": "nyt_haiku", 27 | "pythonVersion": "3.7", 28 | "venv": "nyt-haiku-python-YGCPWoh4" 29 | }, 30 | { 31 | "root": "tests", 32 | "pythonVersion": "3.7", 33 | "venv": "nyt-haiku-python-YGCPWoh4" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | 4 | import asyncio 5 | import aiohttp 6 | import logging 7 | import logging.config 8 | from dotenv import load_dotenv 9 | from nyt_haiku import models, nyt, twitter 10 | from nyt_haiku.haiku import HaikuFinder 11 | 12 | load_dotenv() 13 | 14 | logger = logging.getLogger() 15 | logging.config.fileConfig('logconfig.ini') 16 | 17 | 18 | async def main(): 19 | logger.info("Starting run...") 20 | db_path = os.getenv("DB_PATH") 21 | haiku_finder = HaikuFinder() 22 | await models.init(db_path) 23 | 24 | connector = aiohttp.TCPConnector(limit_per_host=15) 25 | async with aiohttp.ClientSession(connector=connector) as session: 26 | await nyt.check_sections(session, logger) 27 | await nyt.fetch_articles(session, logger, haiku_finder) 28 | if os.getenv("DISABLE_TWITTER") != 'true': 29 | await twitter.tweet(session, logger) 30 | 31 | await models.close_db() 32 | logger.info("Ending run...") 33 | 34 | asyncio.run(main()) 35 | -------------------------------------------------------------------------------- /nyt_haiku/data/sensitive_terms.txt: -------------------------------------------------------------------------------- 1 | FEMA 2 | abort 3 | abortion 4 | abuse 5 | armed 6 | arms 7 | assault 8 | assaulted 9 | assaulting 10 | assaults 11 | attack 12 | attacked 13 | attacking 14 | attacks 15 | autopsy 16 | blast 17 | blasts 18 | bomb 19 | bombing 20 | bombs 21 | choked 22 | coronavirus 23 | covid 24 | covid-19 25 | crime 26 | dead 27 | deadly 28 | death penalty 29 | deaths 30 | drone 31 | dying 32 | emergency 33 | evacuate 34 | explode 35 | explodes 36 | exploding 37 | exploding 38 | explosion 39 | ground zero 40 | gun 41 | harrass 42 | hate crime 43 | hijack 44 | hostage 45 | hostages 46 | hurricane 47 | insurgent 48 | israel 49 | is survived by 50 | jury 51 | kidnap 52 | kidnapped 53 | kidnapping 54 | kidnaps 55 | kill 56 | killed 57 | killing 58 | kills 59 | massacre 60 | missile 61 | missing 62 | molest 63 | molested 64 | murder 65 | murdered 66 | murderer 67 | murdering 68 | murdering 69 | nuclear 70 | pro-choice 71 | pro-life 72 | prosecute 73 | qanon 74 | raid 75 | riot 76 | sentenced 77 | sentenced 78 | sexual 79 | sexually 80 | shoot 81 | shooting 82 | shooting 83 | shoots 84 | shot 85 | stabbed 86 | suicide 87 | suicides 88 | suspect 89 | suspects 90 | terror 91 | terrorist 92 | trial 93 | tropical storm 94 | tsunami 95 | victim 96 | violence 97 | violent 98 | warhead 99 | weapon 100 | -------------------------------------------------------------------------------- /syllapy_check.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import requests 3 | from nyt_haiku import nyt, haiku 4 | from nyt_haiku.moderator import ArticleModerator 5 | from nyt_haiku.haiku import HaikuFinder, clean_term 6 | from string import punctuation 7 | import logging 8 | words = {} 9 | 10 | logger = logging.getLogger(__name__) 11 | 12 | def fetch_article(url): 13 | headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} 14 | r = requests.get(url, headers=headers) 15 | assert r.status_code == 200, f"Received {r.status_code} for {url}" 16 | 17 | meta, body = nyt.parse_article(logger, url, r.text, True) 18 | return body 19 | 20 | if __name__ == "__main__": 21 | url = sys.argv[1] 22 | body = fetch_article(url) 23 | haiku = HaikuFinder() 24 | sentences = haiku.sentences_from_article(body) 25 | moderator = ArticleModerator() 26 | 27 | for sent in sentences: 28 | print(sent) 29 | 30 | terms = haiku.terms_from_sentence(sent) 31 | for (term, count) in terms: 32 | term = clean_term(term) 33 | words[term] = count 34 | 35 | haikus = haiku.find_haikus_in_article(body) 36 | 37 | print("\n\nTERMS") 38 | for word in sorted(words.keys()): 39 | print(f"{word}: {words[word]}") 40 | 41 | print("\n\nHAIKU") 42 | for haiku in haikus: 43 | if not moderator.is_awkward(haiku["sentence"]): 44 | print(f'{haiku["lines"][0]}\n{haiku["lines"][1]}\n{haiku["lines"][2]}\n') 45 | -------------------------------------------------------------------------------- /nyt_haiku/models.py: -------------------------------------------------------------------------------- 1 | from tortoise import Tortoise, run_async, fields 2 | from tortoise.models import Model 3 | 4 | 5 | class Article(Model): 6 | id = fields.IntField(pk=True) 7 | parsed = fields.BooleanField(null=False, default=False) 8 | url = fields.CharField(max_length=1024, unique=True, null=False) 9 | nyt_uri = fields.TextField(null=True) 10 | title = fields.TextField(null=True) 11 | published_at = fields.DatetimeField(null=True) 12 | description = fields.TextField(null=True) 13 | byline = fields.TextField(null=True) 14 | section = fields.CharField(max_length=32, null=True) 15 | keywords = fields.TextField(null=True) 16 | tags = fields.TextField(null=True) 17 | sensitive = fields.BooleanField(null=False, default=False) 18 | created_at = fields.DatetimeField(null=True, auto_now_add=True) 19 | 20 | 21 | class Haiku(Model): 22 | id = fields.IntField(pk=True) 23 | hash = fields.CharField(max_length=255, unique=True, null=False) 24 | article = fields.ForeignKeyField('models.Article', related_name='haiku') 25 | sentence = fields.TextField() 26 | line0 = fields.TextField() 27 | line1 = fields.TextField() 28 | line2 = fields.TextField() 29 | tweet = fields.TextField(null=True) 30 | tweet_id = fields.TextField(null=True) 31 | tweeted_at = fields.DatetimeField(null=True) 32 | retweet_count = fields.IntField(null=False, default=0) 33 | favorite_count = fields.IntField(null=False, default=0) 34 | created_at = fields.DatetimeField(null=True, auto_now_add=True) 35 | quote_count = fields.IntField(null=False, default=0) 36 | 37 | 38 | async def init(path): 39 | # Here we connect to a SQLite DB file. 40 | # also specify the app name of "models" 41 | # which contain models from "app.models" 42 | await Tortoise.init( 43 | db_url=f'sqlite://{path}', 44 | modules={'models': ['nyt_haiku.models']} 45 | ) 46 | 47 | 48 | async def setup_db(): 49 | await Tortoise.generate_schemas() 50 | 51 | 52 | async def close_db(): 53 | await Tortoise.close_connections() 54 | -------------------------------------------------------------------------------- /publish.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import os 3 | import json 4 | 5 | import asyncio 6 | import logging 7 | import logging.config 8 | from tortoise import Tortoise 9 | from jinja2 import Environment, FileSystemLoader 10 | 11 | from dotenv import load_dotenv 12 | from nyt_haiku import models 13 | 14 | load_dotenv() 15 | 16 | logger = logging.getLogger() 17 | logging.config.fileConfig('logconfig.ini') 18 | 19 | async def publish_csv(): 20 | logger.info("Publishing CSV...") 21 | headers = ['id', 'tweet_id', 'tweeted_at', 'line0', 'line1', 'line2', 'tweet_url', 'favorite_count', 'retweet_count', 'quote_count', 'nyt_url', 'nyt_title', 'byline', 'published_at', 'section', 'tags'] 22 | haikus = await models.Haiku.filter(tweet_id__not_isnull=True).order_by('id').all().prefetch_related("article") 23 | csv_path = os.getenv('CSV_OUTPUT_PATH') 24 | 25 | with open(csv_path, 'w', newline='') as csvfile: 26 | csvwriter = csv.writer(csvfile) 27 | csvwriter.writerow(headers) 28 | 29 | for h in haikus: 30 | csvwriter.writerow([h.id, h.tweet_id, h.tweeted_at, h.line0, h.line1, h.line2, f"https://twitter.com/nythaikus/status/{h.tweet_id}", 31 | h.favorite_count, h.retweet_count, h.quote_count, h.article.url, h.article.title, 32 | h.article.byline, h.article.published_at, h.article.section, h.article.tags]) 33 | 34 | async def publish_html(): 35 | logger.info("Publishing HTML...") 36 | 37 | html_path = os.getenv('HTML_OUTPUT_PATH') 38 | conn = Tortoise.get_connection("default") 39 | haikus = await conn.execute_query_dict("select h.tweet_id, h.line0, h.line1, h.line2, h.favorite_count, h.retweet_count, h.quote_count, a.url, a.title from haiku h join article a on a.id = h.article_id where h.tweet_id is NOT NULL AND favorite_count + retweet_count + quote_count > 0 order by favorite_count + retweet_count + quote_count DESC limit 50") 40 | 41 | env = Environment(loader=FileSystemLoader('templates')) 42 | template = env.get_template('index.html') 43 | output_from_parsed_template = template.render(haikus=haikus) 44 | 45 | # to save the results 46 | with open(html_path, "w") as fh: 47 | fh.write(output_from_parsed_template) 48 | 49 | 50 | async def main(): 51 | db_path = os.getenv("DB_PATH") 52 | await models.init(db_path) 53 | await publish_csv() 54 | await publish_html() 55 | await models.close_db() 56 | 57 | asyncio.run(main()) 58 | -------------------------------------------------------------------------------- /tests/test_nyt.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import pytest 4 | from dateutil import parser 5 | import logging 6 | 7 | from nyt_haiku import nyt, haiku 8 | 9 | logger = logging.getLogger(__name__) 10 | logger.setLevel(logging.NOTSET) 11 | 12 | 13 | def test_normalize_url(): 14 | assert nyt.normalize_url('http://www.foo.com/') == "http://www.foo.com/" 15 | assert nyt.normalize_url('http://www.foo.com/bar?baz=quux') == "http://www.foo.com/bar" 16 | 17 | 18 | def test_parse_article(): 19 | path = os.path.join(os.path.dirname(__file__), 'samples', 'article.html') 20 | html = '' 21 | 22 | with open(path) as file: 23 | html = file.read() 24 | 25 | meta, body = nyt.parse_article(logger, 'http://nytimes.com/', html) 26 | 27 | assert body is not None 28 | assert not meta['sensitive'] 29 | assert meta['parsed'] 30 | assert meta['title'] == "How to Negotiate With Your Landlord" 31 | assert meta['nyt_uri'] == 'nyt://article/41bdb446-cd51-57ad-9d24-a78f587d42e1' 32 | assert meta["published_at"] == parser.parse('2020-09-25T13:00:08.000Z') 33 | assert meta['byline'] == 'By Ronda Kaysen' 34 | assert meta['description'] == 'It’s a renter’s market. Here are some tips to help you take advantage of your power as a tenant.' 35 | assert meta['keywords'] == 'Real Estate, Housing,Rent,Landlord,Service Content,Shelter-in-Place (Lifestyle);Social Distancing,Brooklyn,Manhattan,Queens' 36 | assert meta['section'] == 'Real Estate' 37 | assert meta['tags'] == 'Real Estate and Housing (Residential);Renting and Leasing (Real Estate);Landlords;Content Type: Service;Quarantine (Life and Culture);Brooklyn (NYC);Manhattan (NYC);Queens (NYC)' 38 | 39 | 40 | 41 | def test_parse_blog(): 42 | path = os.path.join(os.path.dirname(__file__), 'samples', 'live_blog.html') 43 | html = '' 44 | 45 | with open(path) as file: 46 | html = file.read() 47 | 48 | meta, body = nyt.parse_article(logger, 'http://nytimes.com/', html) 49 | 50 | assert body is not None 51 | assert not meta['sensitive'] 52 | assert meta['parsed'] 53 | assert meta['title'] == 'Tech Stocks Lead Wall Street Higher: Live Business Briefing' 54 | assert meta['nyt_uri'] == 'nyt://legacycollection/19601213-5afe-5bb1-9b8d-4b0b416356be' 55 | assert meta['published_at'] == parser.parse('2020-09-25T10:28:45.000Z') 56 | assert meta['byline'] == 'By Kevin Granville and Mohammed Hadi' 57 | assert meta['description'] == '' 58 | assert meta['keywords'] == 'null' 59 | assert meta['section'] == 'Business' 60 | -------------------------------------------------------------------------------- /nyt_haiku/twitter.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from tortoise import Tortoise 4 | from peony import PeonyClient 5 | from dateutil import parser 6 | 7 | from nyt_haiku import models 8 | 9 | def tweet_from_haiku(haiku: models.Haiku): 10 | return f"{haiku.line0}\n{haiku.line1}\n{haiku.line2}\n\n{haiku.article.url}" 11 | 12 | 13 | def change_in_counts(haiku: models.Haiku, favorite_count: int, retweet_count: int) -> bool: 14 | return haiku.favorite_count is None or haiku.retweet_count is None or favorite_count > haiku.favorite_count or retweet_count > haiku.retweet_count 15 | 16 | 17 | async def tweet(session, logger): 18 | twitter_client = PeonyClient(consumer_key=os.getenv("TWITTER_CONSUMER_KEY"), 19 | consumer_secret=os.getenv("TWITTER_CONSUMER_SECRET"), 20 | access_token=os.getenv("TWITTER_ACCESS_TOKEN"), 21 | access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET"), 22 | session=session) 23 | 24 | # Need to do a manual connection to order by random 25 | conn = Tortoise.get_connection("default") 26 | haiku_rows = await conn.execute_query_dict("select id from haiku where tweet_id IS NULL AND article_id NOT IN (select article_id from haiku where tweet_id IS NOT NULL and tweeted_at > datetime('now','-2 hour')) ORDER BY RANDOM() limit 1") 27 | 28 | if len(haiku_rows) > 0: 29 | haiku = await models.Haiku.get(id=haiku_rows[0]["id"]) 30 | await haiku.fetch_related('article') 31 | haiku.tweet = tweet_from_haiku(haiku) 32 | 33 | response = await twitter_client.api.statuses.update.post(status=haiku.tweet, trim_user=True) 34 | haiku.tweet_id = response['id_str'] 35 | haiku.tweeted_at = parser.parse(response['created_at']) 36 | 37 | log_line = f"{haiku.line0} / {haiku.line1} / {haiku.line2}" 38 | logger.info(f"TWEET {haiku.tweet_id} {log_line}") 39 | 40 | await haiku.save() 41 | 42 | response = await twitter_client.api.statuses.user_timeline.get(count=200, screen_name=os.getenv("TWITTER_USERNAME"), trim_user=True) 43 | for t in response: 44 | haiku = await models.Haiku.filter(tweet_id=t['id_str']).first() 45 | if haiku: 46 | favorite_count = t['favorite_count'] 47 | retweet_count = t['retweet_count'] 48 | 49 | if change_in_counts(haiku, favorite_count, retweet_count): 50 | logger.info(f"TWEET {t['id_str']} FAVES: {haiku.favorite_count} -> {favorite_count} RT: {haiku.retweet_count} -> {retweet_count}") 51 | haiku.favorite_count = favorite_count 52 | haiku.retweet_count = retweet_count 53 | await haiku.save() 54 | 55 | logger.info("TWEET STATISTICS updated") 56 | -------------------------------------------------------------------------------- /tests/test_moderator.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from nyt_haiku.moderator import ArticleModerator 3 | 4 | a = ArticleModerator() 5 | 6 | @pytest.fixture(scope="module") 7 | def mod(): 8 | a = ArticleModerator() 9 | return a 10 | 11 | def test_sensitive_tags(mod): 12 | assert mod.is_sensitive_tag("Looting") 13 | assert not mod.is_sensitive_tag("Arts and Entertainment") 14 | 15 | 16 | def test_sensitive_terms(mod): 17 | assert mod.contains_sensitive_term("Area man murdered by angry goose") 18 | assert not mod.contains_sensitive_term("Area man given ice cream by friendly goose") 19 | 20 | 21 | @pytest.mark.parametrize('text', [ 22 | "My friend Dr. Watson", 23 | "Mr. Raffensperger responded quickly in a statement of his own.", 24 | "She retired to Boca Raton, Fla. last year.", 25 | "Arthur D. Lastname.", 26 | "Another day at I.B.M. for us.", 27 | "CAIRO - The sun?", 28 | "The nameless narrator in Yishai Sarid’s", 29 | "’s priorities the necessary step to", 30 | "— I hiked them one after the other on", 31 | "-aware this is the end", 32 | ", among other things", 33 | 'It is not over," she said.', 34 | "After four years, she said to me, ‘Calvin, ", 35 | "Are these qualities carried in our genes, or does the life we live —", 36 | "He already had a pair of Crocs, he said, “but these were Bad Bunny", 37 | "probably revenge for a joke Michael", 38 | "At his expense, he said", 39 | "“— and make sure that we invest in the people who in fact need the help.", 40 | "invest in the people who in fact need the help.“", 41 | "The end;", 42 | "The end-", 43 | "The end)", 44 | "By Jacob Harris", 45 | "From match.com", 46 | "And that is why I have only one answer to every question now:", 47 | "Michaela Coel] is such a good writer.", 48 | "Michaela Coel) is such a good writer.", 49 | "But (Michaela Coel is such a good writer.", 50 | "But [Michaela Coel is such a good writer.", 51 | "He gave way to a lefty, Tim Hill, with two outs in the second, and", 52 | "He gave way to a lefty, Tim Hill, with two outs in the second, or", 53 | "He gave way to a lefty, Tim Hill, with two outs in the second, but", 54 | "Jacob Harris for the New York Times?", 55 | "He contacted The Times for correction!", 56 | "Photograph by Jacob Harris.", 57 | "Illustration by Jacob Harris.", 58 | "Cost was $83 total.", 59 | "Down 86th Street we strolled.", 60 | "Stock of AT&T declined."]) 61 | def test_is_awkward_text(mod, text): 62 | assert mod.is_awkward(text) 63 | 64 | @pytest.mark.parametrize('text', [ 65 | "My friend Dr Watson.", 66 | "There are 43 lights.", 67 | "I won't do it!", 68 | "Her name is Rio and she dances on the sand!", 69 | "Her vocal authority and pop fame?", 70 | "Self-aware this is the end.", 71 | "Michaela Coel is such an [expletive] good writer!", 72 | "This is by us!", 73 | "How many hours of creative work do you think you do in a day?", 74 | "It didn’t matter how big the pool was, if there was a pool I’d jump in."]) 75 | def test_is_not_awkward(mod, text): 76 | assert not mod.is_awkward(text) 77 | -------------------------------------------------------------------------------- /twitter_stats.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import asyncio 4 | import logging 5 | import logging.config 6 | from peony import PeonyClient 7 | from dotenv import load_dotenv 8 | from nyt_haiku import models 9 | from nyt_haiku.models import Haiku 10 | 11 | load_dotenv() 12 | 13 | logger = logging.getLogger() 14 | logging.config.fileConfig('logconfig.ini') 15 | 16 | loop = asyncio.get_event_loop() 17 | 18 | twitter_client = PeonyClient(consumer_key=os.getenv("TWITTER_CONSUMER_KEY"), 19 | consumer_secret=os.getenv("TWITTER_CONSUMER_SECRET"), 20 | access_token=os.getenv("TWITTER_ACCESS_TOKEN"), 21 | access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET"), 22 | api_version="2", 23 | suffix="") 24 | 25 | async def count_records(): 26 | count = await Haiku.filter(tweet_id__not_isnull=True).count() 27 | logger.info(f"{count} records in DB...") 28 | return count 29 | 30 | 31 | async def fetch_records(offset, limit): 32 | return await Haiku.filter(tweet_id__not_isnull=True).order_by('id').offset(offset).limit(limit) 33 | 34 | 35 | def change_in_statistics(record, tweet): 36 | return record.retweet_count != tweet["public_metrics"]["retweet_count"] or record.favorite_count != tweet["public_metrics"]["like_count"] or record.quote_count != tweet["public_metrics"]["quote_count"] 37 | 38 | 39 | async def update_tweet_stats(records): 40 | records_by_id = {} 41 | for r in records: 42 | records_by_id[r.tweet_id] = r 43 | 44 | logger.debug(records_by_id) 45 | 46 | tweet_ids = [r.tweet_id for r in records] 47 | 48 | dotted_parameters = {"tweet.fields": "public_metrics"} 49 | response = await twitter_client.api.tweets.get( 50 | ids=','.join(tweet_ids), 51 | **dotted_parameters) 52 | 53 | logger.debug(response) 54 | 55 | for t in response['data']: 56 | record = records_by_id[t.get("id")] 57 | if change_in_statistics(record, t): 58 | tweet_stats = t["public_metrics"] 59 | logger.info(f"TWEET {t.id} FAVES: {record.favorite_count} -> {tweet_stats['like_count']} RT: {record.retweet_count} -> {tweet_stats['retweet_count']} QT: {record.quote_count} -> {tweet_stats['quote_count']}") 60 | 61 | record.favorite_count = tweet_stats['like_count'] 62 | record.retweet_count = tweet_stats['retweet_count'] 63 | record.quote_count = tweet_stats['quote_count'] 64 | await record.save() 65 | 66 | 67 | async def fetch_and_update(offset, limit): 68 | logger.info(f"OFFSET: {offset}") 69 | 70 | records = await fetch_records(offset, limit) 71 | logger.info(f"Fetched {len(records)} records") 72 | await update_tweet_stats(records) 73 | 74 | 75 | async def main(): 76 | logger.info("Starting run...") 77 | db_path = os.getenv("DB_PATH") 78 | await models.init(db_path) 79 | 80 | count = await count_records() 81 | offset = 0 82 | limit = 100 83 | 84 | while offset < count: 85 | await fetch_and_update(offset, limit) 86 | offset += limit 87 | 88 | await models.close_db() 89 | 90 | 91 | loop.run_until_complete(main()) 92 | -------------------------------------------------------------------------------- /tests/test_haiku.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import collections.abc 3 | import syllapy 4 | 5 | from nyt_haiku import haiku 6 | from nyt_haiku.haiku import HaikuFinder 7 | 8 | 9 | @pytest.fixture(scope="module") 10 | def haiku_finder(): 11 | return HaikuFinder() 12 | 13 | 14 | def test_sentences_from_article(haiku_finder): 15 | para = "It was the puzzle’s creator, an unassuming Hungarian architecture professor named Erno Rubik. When he invented the cube in 1974, he wasn’t sure it could ever be solved. Mathematicians later calculated that there are 43,252,003,274,489,856,000 ways to arrange the squares, but just one of those combinations is correct." 16 | 17 | sentences = haiku_finder.sentences_from_article(para) 18 | assert isinstance(sentences, collections.abc.Sequence) 19 | assert len(sentences) > 1 20 | 21 | sentences = haiku_finder.sentences_from_article("") 22 | assert isinstance(sentences, collections.abc.Sequence) 23 | assert len(sentences) == 0 24 | 25 | sentences = haiku_finder.sentences_from_article(None) 26 | assert isinstance(sentences, collections.abc.Sequence) 27 | assert len(sentences) == 0 28 | 29 | 30 | def test_terms_from_sentence(haiku_finder): 31 | sentence = "It was the puzzle’s creator — an unassuming architecture professor named Erno Rubik." 32 | terms = haiku_finder.terms_from_sentence(sentence) 33 | 34 | assert terms == [("It", 1), ("was", 1), ("the", 1), ("puzzle’s", 2), ("creator", 3), ("—", 0), 35 | ("an", 1), ("unassuming", 4), ("architecture", 4), 36 | ("professor", 3), ("named", 1), ("Erno", 2), ("Rubik.", 2)] 37 | 38 | 39 | def test_load_syllables_override(haiku_finder): 40 | sentence = "he debates all" 41 | terms = haiku_finder.terms_from_sentence(sentence) 42 | assert terms == [("he", 1), ("debates", 2), ("all", 1)] 43 | 44 | 45 | @pytest.mark.parametrize("ldelim, rdelim", [ 46 | (" ", "\n"), 47 | ("\t", "\r\n"), 48 | ("(", ")"), 49 | ("[", "]"), 50 | ('"', '"'), 51 | ('“', '”'), 52 | ("'", "'"), 53 | ("’", "’"), 54 | ("", ";") 55 | ]) 56 | def test_terms_from_sentence_strip(haiku_finder, ldelim, rdelim): 57 | sentence = f"{ldelim}Passersby were astonished by the amount of fudge{rdelim}" 58 | print(sentence) 59 | terms = haiku_finder.terms_from_sentence(sentence) 60 | assert len(terms) > 0 61 | assert terms[0] == ("Passersby", 3) 62 | assert terms[-1] == ("fudge", 1) 63 | 64 | 65 | @pytest.mark.parametrize("term,expected", [ 66 | ("apple", 2), 67 | ("scene's", 1), 68 | ("France's", 2), 69 | ("Disney+", 3), 70 | ("57", 4), 71 | ("1,235", 10), 72 | ("1952", 5), 73 | ("1920s", 4), 74 | ("buyer/seller", 4), 75 | ("old-fashioned", 3), 76 | ("2-year-old", 3), 77 | ("self-aware", 3), 78 | ("16-10", 4), 79 | ("-carry", 2)]) 80 | def test_syllables_for_term(haiku_finder, term, expected): 81 | assert haiku_finder.syllables_for_term(term) == expected 82 | 83 | 84 | @pytest.mark.parametrize("term,expected", [ 85 | ("weren’t", 1)]) 86 | def test_overrides_for_term(haiku_finder, term, expected): 87 | stripped_term = haiku.clean_term(term) 88 | assert stripped_term in syllapy.WORD_DICT 89 | assert haiku_finder.syllables_for_term(term) == expected 90 | -------------------------------------------------------------------------------- /nyt_haiku/moderator.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | 4 | class ArticleModerator: 5 | def __init__(self): 6 | self.init_sensitive_tags() 7 | self.init_sensitive_terms() 8 | self.init_sensitive_sections() 9 | self.init_awkward_abbreviations() 10 | 11 | def init_sensitive_tags(self): 12 | with open(os.path.join(os.path.dirname(__file__), 'data', 'sensitive_tags.txt')) as fp: 13 | self.sensitive_tags = set(line for line in (l.strip() for l in fp) if line) 14 | 15 | # print(f"SENSITIVE TAGS: {len(self.sensitive_tags)} loaded") 16 | 17 | def init_sensitive_terms(self): 18 | with open(os.path.join(os.path.dirname(__file__), 'data', 'sensitive_terms.txt')) as fp: 19 | self.sensitive_terms = set(line for line in (l.strip() for l in fp) if line) 20 | 21 | # print(f"SENSITIVE TERMS: {len(self.sensitive_terms)} loaded") 22 | 23 | sensitive_regex_string = '|'.join([f"({t})" for t in self.sensitive_terms]) 24 | self.sensitive_term_regex = re.compile(f"\b{sensitive_regex_string}\b", re.IGNORECASE) 25 | 26 | def init_awkward_abbreviations(self): 27 | with open(os.path.join(os.path.dirname(__file__), 'data', 'bad_abbreviations.txt')) as fp: 28 | self.awkward_abbreviations = set(line for line in (l.strip() for l in fp) if line) 29 | 30 | awkward_regex_string = '|'.join([f"({t})" for t in self.awkward_abbreviations]).replace(".", "\\.") 31 | self.awkward_abbreviation_regex = re.compile(awkward_regex_string) 32 | 33 | def init_sensitive_sections(self): 34 | with open(os.path.join(os.path.dirname(__file__), 'data', 'sensitive_sections.txt')) as fp: 35 | self.sensitive_sections = set(line for line in (l.strip() for l in fp) if line) 36 | 37 | def is_sensitive_tag(self, tag): 38 | return tag in self.sensitive_tags 39 | 40 | def is_sensitive_section(self, tag): 41 | return tag in self.sensitive_sections 42 | 43 | def contains_sensitive_term(self, text): 44 | return self.sensitive_term_regex.search(text) 45 | 46 | def is_awkward(self, text): 47 | if self.awkward_abbreviation_regex.search(text): 48 | return True 49 | 50 | # if not re.search(r'[.?!;]([‘“"\)])?$', text): 51 | # return True 52 | 53 | # Multi-character abbreviations 54 | if re.search('[A-Z]\\.[A-Z]\\.', text): 55 | return True 56 | 57 | # Single initials 58 | if re.search(r'\b[A-Z]\. ', text): 59 | return True 60 | 61 | # Multiple capitalized letters in a row (suggests a dateline) 62 | if re.search(r'[A-Z][A-Z]+', text): 63 | return True 64 | 65 | # Ordinals 66 | if re.search(r'[0-9]+(nd|st|th)', text): 67 | return True 68 | 69 | # Websites 70 | if re.search(r'([A-Za-z0-9]+)\.(com|org|net|ly|io)', text): 71 | return True 72 | 73 | # Bad starters 74 | if re.fullmatch(r"^[—\-\('’,;a-z].*", text): 75 | return True 76 | 77 | # No internal quotes 78 | if re.search(r' [‘“"][A-Za-z]', text) or re.search(r'[”"’] ', text): 79 | return True 80 | 81 | # Mismatched quotes 82 | if re.match(r'[‘“"\']', text) and re.search(r'[^‘“"\']$', text): 83 | return True 84 | 85 | if re.match(r'[^‘“"\']', text) and re.search(r'[‘“"\']$', text): 86 | return True 87 | 88 | # Mismatched parens 89 | if re.search(r'\([^\)]+$', text) or re.search(r'\[[^\]]+$', text): 90 | return True 91 | 92 | if re.match(r'[^\(]+\)', text) or re.match(r'[^\[]+\]', text): 93 | return True 94 | 95 | if re.search(r'\b(he|she) said', text): 96 | return True 97 | 98 | # Bad ends 99 | if re.fullmatch(r".+(([\-\);—:,])|(['’]s)|(\b(and|or|but)))", text): 100 | return True 101 | 102 | # Bad anywhere 103 | if re.search(r'[$@%#&\n\t]', text): 104 | return True 105 | 106 | # NYT Credits 107 | if re.search(r'(^By )|(photograph by)|(contributed reporting)|(the New York Times)|(The Times)|(illustration by)', text, flags=re.IGNORECASE): 108 | return True 109 | 110 | return False 111 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | NYT Haiku 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 40 | 41 | 42 | 49 |
50 |
51 |
52 |
53 |

NYT Haikus

54 |

These are the 50 most popular tweets from @nythaikus, a Twitter bot that scans the New York Times for haiku.

55 | 59 |
60 |
61 |
62 | {% for h in haikus %} 63 |
64 |
65 |

{{ h.line0 }}
{{ h.line1 }}
{{ h.line2 }}

66 | 71 |
72 |
73 | {% endfor %} 74 |
75 |
76 |
77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /nyt_haiku/haiku.py: -------------------------------------------------------------------------------- 1 | import re 2 | import os 3 | import csv 4 | import spacy 5 | import syllapy 6 | import hashlib 7 | from num2words import num2words 8 | from unidecode import unidecode 9 | from string import punctuation 10 | 11 | from functools import reduce 12 | import operator 13 | 14 | from nyt_haiku.errors import LineMismatchError, SyllableCountError 15 | 16 | SPECIAL_PUNCTUATION_BREAKS = ['-', '—'] 17 | 18 | 19 | def clean_term(term): 20 | return unidecode(term).strip().lower().strip(punctuation) 21 | 22 | 23 | def is_special_punctuation(term): 24 | return term in SPECIAL_PUNCTUATION_BREAKS 25 | 26 | 27 | def has_syllable_exception(term): 28 | return term in syllapy.WORD_DICT 29 | 30 | 31 | class HaikuFinder(): 32 | def __init__(self): 33 | self.nlp = spacy.load("en_core_web_sm") 34 | 35 | # Load additional syllable definitions beyond syllapy 36 | syllable_file_path = os.path.join(os.path.dirname(__file__), 'data', 'syllable_counts.csv') 37 | with open(syllable_file_path, newline='') as file: 38 | reader = csv.reader(file) 39 | for row in reader: 40 | if len(row) == 2: 41 | word = row[0].lower() 42 | count = int(row[1]) 43 | syllapy.WORD_DICT[word] = count 44 | 45 | def sentences_from_article(self, text): 46 | if not text: 47 | return [] 48 | 49 | doc = self.nlp(text) 50 | return [s.text.rstrip() for s in doc.sents] 51 | 52 | def syllables_for_term(self, term): 53 | if is_special_punctuation(term): 54 | return 0 55 | 56 | # Some things to do before stripping the term 57 | # Disney+, Apple+, etc. 58 | r = re.match('(.+)\+$', term) 59 | if r: 60 | return self.syllables_for_term(r.group(1)) + 1 61 | 62 | stripped_term = clean_term(term) 63 | try: 64 | if has_syllable_exception(stripped_term): 65 | return syllapy.count(stripped_term) 66 | 67 | r = re.match("(.+)'s$", stripped_term) 68 | if r: 69 | # Most possessive's don't add syllables 70 | return syllapy.count(r.group(1)) 71 | 72 | r = re.match('([0-9]{4})s?$', stripped_term) 73 | if r: 74 | terms = num2words(r.group(1), to='year').split() 75 | return reduce(operator.add, [self.syllables_for_term(term) for term in terms]) 76 | 77 | if re.match('[0-9,]+$', stripped_term): 78 | terms = num2words(int(stripped_term.replace(',', ''))).split() 79 | return reduce(operator.add, [self.syllables_for_term(term) for term in terms]) 80 | 81 | r = re.match('([0-9]+)-([0-9]+)$', stripped_term) 82 | if r: 83 | s1 = self.syllables_for_term(r.group(1)) 84 | s2 = self.syllables_for_term(r.group(2)) 85 | if s1 and s2: 86 | return s1 + s2 + 1 87 | else: 88 | return 0 89 | 90 | r = re.match('([^-]+)[-/](.+)$', stripped_term) 91 | if r: 92 | s1 = self.syllables_for_term(r.group(1)) 93 | s2 = self.syllables_for_term(r.group(2)) 94 | 95 | if s1 and s2: 96 | return s1 + s2 97 | else: 98 | return 0 99 | 100 | c = syllapy.count(stripped_term) 101 | return c 102 | 103 | except RuntimeError as err: 104 | raise SyllableCountError("Unable to count syllables for term") 105 | 106 | def terms_from_sentence(self, text): 107 | cleaned_text = text.strip("[ \r\n\t\"“”'’\\(\\)\\[\\];]") 108 | return [(t, self.syllables_for_term(t)) for t in cleaned_text.split()] 109 | 110 | def seek_line(self, lines, max_syllables, terms): 111 | '''These arguments are passed by reference and altered''' 112 | syllable_count = 0 113 | line = [] 114 | 115 | while syllable_count < max_syllables: 116 | if not terms: 117 | raise LineMismatchError("Line is too short") 118 | 119 | term, syllables = terms.pop(0) 120 | 121 | if syllables == 0 and not is_special_punctuation(term): 122 | raise LineMismatchError("Syllable count missing for term") 123 | 124 | syllable_count += syllables 125 | line.append(term) 126 | 127 | if syllable_count > max_syllables: 128 | raise LineMismatchError("Line is too long") 129 | 130 | lines.append(' '.join(line)) 131 | 132 | def seek_eol(self, terms): 133 | if terms: 134 | raise LineMismatchError("Line is too long") 135 | 136 | def find_haiku(self, sentence_text): 137 | try: 138 | terms = self.terms_from_sentence(sentence_text) 139 | except SyllableCountError: 140 | return None 141 | 142 | lines = [] 143 | 144 | try: 145 | self.seek_line(lines, 5, terms) 146 | self.seek_line(lines, 7, terms) 147 | self.seek_line(lines, 5, terms) 148 | self.seek_eol(terms) 149 | 150 | return {"lines": lines, "sentence": sentence_text, "hash": hashlib.md5(sentence_text.encode('utf-8')).hexdigest()} 151 | 152 | except LineMismatchError: 153 | return None 154 | 155 | def find_haikus_in_article(self, body_text): 156 | haikus = [] 157 | 158 | for sent in self.sentences_from_article(body_text): 159 | haiku = self.find_haiku(sent) 160 | if haiku: 161 | haikus.append(haiku) 162 | 163 | return haikus 164 | -------------------------------------------------------------------------------- /nyt_haiku/nyt.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sqlite3 3 | import tortoise 4 | import asyncio 5 | from urllib.parse import urljoin, urlparse 6 | 7 | from bs4 import BeautifulSoup, NavigableString, Comment 8 | from datetime import datetime 9 | from dateutil import parser 10 | import operator 11 | from functools import reduce 12 | 13 | from nyt_haiku.moderator import ArticleModerator 14 | from nyt_haiku.models import Article, Haiku 15 | 16 | ARTICLE_MODERATOR = ArticleModerator() 17 | 18 | NYT_SECTION_PATTERN = '^https?://www.nytimes.com/(interactive/)?202' 19 | 20 | NYT_SECTION_URLS = ['https://www.nytimes.com/', 21 | 'https://www.nytimes.com/pages/world/', 22 | 'https://www.nytimes.com/pages/national/', 23 | 'https://www.nytimes.com/pages/todayspaper/', 24 | 'https://www.nytimes.com/pages/politics/', 25 | 'https://www.nytimes.com/pages/nyregion/', 26 | 'https://www.nytimes.com/pages/business/', 27 | 'https://www.nytimes.com/pages/technology/', 28 | 'https://www.nytimes.com/pages/sports/', 29 | 'https://dealbook.nytimes.com/', 30 | 'https://www.nytimes.com/pages/science/', 31 | 'https://www.nytimes.com/pages/health/', 32 | 'https://www.nytimes.com/pages/arts/', 33 | 'https://www.nytimes.com/pages/style/', 34 | 'https://www.nytimes.com/pages/opinion/', 35 | 'https://www.nytimes.com/pages/automobiles/', 36 | 'https://www.nytimes.com/pages/books/', 37 | 'https://www.nytimes.com/crosswords/', 38 | 'https://www.nytimes.com/pages/dining/', 39 | 'https://www.nytimes.com/pages/education/', 40 | 'https://www.nytimes.com/pages/fashion/', 41 | 'https://www.nytimes.com/pages/garden/', 42 | 'https://www.nytimes.com/pages/magazine/', 43 | 'https://www.nytimes.com/pages/business/media/', 44 | 'https://www.nytimes.com/pages/movies/', 45 | 'https://www.nytimes.com/pages/arts/music/', 46 | 'https://www.nytimes.com/pages/obituaries/', 47 | # # 'http://www.nytimes.com/pages/realestate/', 48 | 'https://www.nytimes.com/pages/t-magazine/', 49 | 'https://www.nytimes.com/pages/arts/television/', 50 | 'https://www.nytimes.com/pages/theater/', 51 | 'https://www.nytimes.com/pages/travel/', 52 | 'https://www.nytimes.com/pages/fashion/weddings/', 53 | ] 54 | 55 | 56 | def normalize_url(url:str) -> str: 57 | return urljoin(url, urlparse(url).path) 58 | 59 | 60 | async def section_callback(session, logger, section_url: str): 61 | """Process a page and add links to the database""" 62 | logger.debug(f"START SECTION {section_url}") 63 | soup = None 64 | 65 | async with session.get(section_url) as response: 66 | soup = BeautifulSoup(await response.text(), 'html.parser') 67 | 68 | article_urls = [a.get('href') or '' for a in soup.find_all('a')] 69 | 70 | # if not http://, prepend domain name 71 | domain = '/'.join(section_url.split('/')[:3]) 72 | article_urls = [url if '://' in url else operator.concat(domain, url) for url in article_urls] 73 | article_urls = set([normalize_url(url) for url in article_urls if re.search(NYT_SECTION_PATTERN, url)]) 74 | 75 | for url in article_urls: 76 | try: 77 | exists = await Article.get_or_create(url=url) 78 | logger.debug(f"EXISTS {url}") 79 | if not exists: 80 | logger.debug(f"CREATE ARTICLE {url}") 81 | await Article.create(url=url) 82 | except (tortoise.exceptions.IntegrityError, sqlite3.IntegrityError): 83 | pass 84 | 85 | 86 | async def check_sections(session, logger): 87 | logger.info("SECTIONS start...") 88 | await asyncio.gather(*[asyncio.create_task(section_callback(session, logger, url)) for url in NYT_SECTION_URLS], return_exceptions=True) 89 | logger.info("SECTIONS done") 90 | 91 | 92 | def parse_article(logger, url: str, body_html:str, parse_sensitive:bool=False): 93 | '''Returns metadata plus body text''' 94 | 95 | meta = {} 96 | soup = BeautifulSoup(body_html, 'html.parser') 97 | 98 | # Get rid of comments 99 | for comment in soup.find_all(text=lambda text: isinstance(text, Comment)): 100 | comment.extract() 101 | 102 | meta['sensitive'] = False 103 | meta['parsed'] = True 104 | meta['nyt_uri'] = soup.find('meta', attrs={'name':'nyt_uri'}).get("content", None) 105 | meta['byline'] = soup.find('meta', attrs={'name':'byl'}).get("content", None) 106 | meta['description'] = soup.find('meta', attrs={'name':'description'}).get("content", None) 107 | meta['keywords'] = soup.find('meta', attrs={'name':'news_keywords'}).get("content", None) 108 | meta['section'] = soup.find('meta', property='article:section').get("content", None) 109 | 110 | if ARTICLE_MODERATOR.is_sensitive_section(meta['section']): 111 | logger.debug(f"SENSITIVE SECTION: {meta['section']} in {url}") 112 | meta['sensitive'] = True 113 | 114 | title_tag = soup.find('meta', property='twitter:title') 115 | if title_tag: 116 | meta['title'] = title_tag.get('content', None) 117 | else: 118 | meta['title'] = soup.title 119 | 120 | if ARTICLE_MODERATOR.contains_sensitive_term(meta['title']): 121 | logger.debug(f"SENSITIVE TITLE: {meta['title']} IN {url}") 122 | meta['sensitive'] = True 123 | 124 | published_tag = soup.find('meta', property='article:published') 125 | if published_tag: 126 | meta['published_at'] = parser.parse(published_tag.get("content", None)) 127 | else: 128 | meta['published_at'] = datetime.now() 129 | 130 | a_tags_meta = soup.find_all("meta", attrs={'property':'article:tag'}) 131 | a_tags = [a.get('content') for a in a_tags_meta] 132 | meta['tags'] = ';'.join(a_tags) 133 | 134 | for tag in a_tags: 135 | if ARTICLE_MODERATOR.is_sensitive_tag(tag): 136 | logger.debug(f"SENSITIVE TAG: {tag} IN {url}") 137 | meta['sensitive'] = True 138 | break 139 | 140 | if meta['sensitive'] and not parse_sensitive: 141 | return meta, None 142 | 143 | body_found = False 144 | try: 145 | p_tags = list(soup.find("article", {"id": "story"}).find_all('p')) 146 | body_found = True 147 | except AttributeError: 148 | pass 149 | 150 | if not body_found: 151 | try: 152 | p_tags = list(soup.find("article", {"id": "interactive"}).find_all('p')) 153 | body_found = True 154 | except AttributeError: 155 | pass 156 | 157 | if not body_found: 158 | try: 159 | p_tags = [] 160 | for post in list(soup.find_all("div", {"class": "live-blog-post"})): 161 | p_tags += post.find_all('p') 162 | body_found = True 163 | except AttributeError: 164 | pass 165 | 166 | if not body_found: 167 | logger.info(f"ERROR {url} NO PARAGRAPHS") 168 | return meta, None 169 | 170 | p_contents = reduce(operator.concat, [p.contents + [NavigableString('\n')] for p in p_tags], []) 171 | 172 | body_strings = [] 173 | for node in p_contents: 174 | if type(node) is NavigableString: 175 | body_strings.append(node) 176 | else: 177 | if node.name == 'br': 178 | body_strings.append(' \n ') 179 | else: 180 | try: 181 | body_strings.append(node.get_text()) 182 | except: 183 | body_strings.append(node) 184 | 185 | body = ''.join(body_strings) 186 | return meta, body 187 | 188 | 189 | async def save_haikus(logger, haiku_finder, article_id, url: str, body: str): 190 | haikus = haiku_finder.find_haikus_in_article(body) 191 | haiku_count = 0 192 | 193 | for haiku in haikus: 194 | sensitive = ARTICLE_MODERATOR.contains_sensitive_term(haiku["sentence"]) or ARTICLE_MODERATOR.is_awkward(haiku["sentence"]) 195 | exists = await Haiku.exists(hash=haiku["hash"]) 196 | if not exists and not sensitive: 197 | haiku_count += 1 198 | logger.info(f'HAIKU {haiku["hash"]} {url}: {haiku["lines"][0]} / {haiku["lines"][1]} / {haiku["lines"][2]}') 199 | 200 | try: 201 | await Haiku.create( 202 | hash=haiku["hash"], 203 | sentence=haiku["sentence"], 204 | line0=haiku["lines"][0], 205 | line1=haiku["lines"][1], 206 | line2=haiku["lines"][2], 207 | article_id=article_id 208 | ) 209 | except (tortoise.exceptions.IntegrityError, sqlite3.IntegrityError): 210 | # print(f'HASH COLLISION FOR {haiku["hash"]}') 211 | pass 212 | 213 | return haiku_count 214 | 215 | 216 | async def article_callback(session, logger, haiku_finder, article: Article): 217 | article.sensitive = False 218 | text = None 219 | headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} 220 | 221 | async with session.get(article.url, headers=headers) as response: 222 | text = await response.text() 223 | 224 | meta, body = parse_article(logger, article.url, text) 225 | 226 | if meta['sensitive']: 227 | logger.info(f"SKIP {article.url} SENSITIVE") 228 | else: 229 | haiku_count = await save_haikus(logger, haiku_finder, article.id, article.url, body) 230 | logger.info(f"FOUND {haiku_count} {article.url}") 231 | 232 | article.parsed = True 233 | article.sensitive = meta['sensitive'] 234 | article.title = meta['title'] 235 | article.nyt_uri = meta['nyt_uri'] 236 | article.published_at = meta['published_at'] 237 | article.byline = meta['byline'] 238 | article.description = meta['description'] 239 | article.keywords = meta['keywords'] 240 | article.tags = meta['tags'] 241 | article.section = meta['section'] 242 | 243 | await article.save() 244 | 245 | 246 | async def fetch_articles(session, logger, haiku_finder): 247 | logger.info("ARTICLES start...") 248 | unfetched_articles = await Article.filter(parsed=False).all() 249 | await asyncio.gather(*[asyncio.create_task(article_callback(session, logger, haiku_finder, article)) for article in unfetched_articles], return_exceptions=True) 250 | logger.info("ARTICLES done") 251 | -------------------------------------------------------------------------------- /nyt_haiku/data/sensitive_tags.txt: -------------------------------------------------------------------------------- 1 | Abortion 2 | Abstinence (Sexual) 3 | Abu Ghraib (Iraq) 4 | Abuse of the Disabled 5 | Academic Freedom 6 | Accidents and Safety 7 | Acne 8 | Acquired Immune Deficiency Syndrome 9 | Adoptions 10 | Adrenoleukodystrophy (ALD) 11 | Affordable Housing 12 | Afghanistan War (2001- ) 13 | Al Qaeda 14 | Al Qaeda in Mesopotamia 15 | Al Qaeda in the Arabian Peninsula 16 | Al Qaeda in the Islamic Maghreb 17 | Alcohol Abuse 18 | Aleve (Drug) 19 | Alopecia Areata 20 | Altitude Sickness 21 | Alzheimer's Disease 22 | Amber Alert 23 | Amblyopia (Lazy Eye) 24 | Americans With Disabilities Act 25 | Amphetamines 26 | Amputation 27 | Amyotrophic Lateral Sclerosis 28 | Anal Cancer 29 | Anesthesia and Anesthetics 30 | Aneurysms 31 | Angina 32 | Angioplasty 33 | Ansar Dine 34 | Anthrax 35 | Anti-Semitism 36 | Antidepressants 37 | Antifa Movement (US) 38 | Antihistamines 39 | Aorta 40 | Aphasia 41 | Apnea (Sleep Disorder) 42 | Appendicitis 43 | Arab-Israeli War (1948) 44 | Arab-Israeli War (1967) 45 | Arizona Immigration Law (SB 1070) 46 | Armor 47 | Arms Control and Limitation and Disarmament 48 | Arms Trade 49 | Arson 50 | Arteriosclerosis and Atherosclerosis 51 | Arthritis 52 | Artificial Insemination 53 | Asbestos 54 | Assad, Bashar al- 55 | Assassinations and Attempted Assassinations 56 | Assaults 57 | Asthma 58 | Ataxia-Telangiectasia (Genetic Disease) 59 | Athlete's Foot 60 | Attention Deficit Hyperactivity Disorder 61 | Aurora, Colo, Shooting (2012) 62 | Aurora, Colo, Shotting (2012) 63 | Autism 64 | Autoimmune Diseases 65 | Autopsies 66 | Avalanches 67 | Avandia (Drug) 68 | Avastin (Drug) 69 | Avian Influenza 70 | Aviation Accidents and Safety 71 | Babesiosis 72 | Bariatric Surgery 73 | Barrett's Syndrome 74 | Bed Sores 75 | Bedwetting 76 | Bell's Palsy 77 | Beriberi 78 | Beta Blockers 79 | Bextra (Drug) 80 | Bidil (Drug) 81 | Biological and Chemical Warfare 82 | Bipolar Disorder 83 | Birth Control and Family Planning 84 | Birth Defects 85 | Bisphenol A (BPA) 86 | Black Lung Disease 87 | Bladder 88 | Bladder Cancer 89 | Blake, Jacob (August 23, 2020 Shooting) 90 | Blood Clots 91 | Blood Pressure 92 | Body Dysmorphic Disorder 93 | Boko Haram 94 | Bombs and Explosives 95 | Bone Cancer 96 | Bone Marrow 97 | Botox (Drug) 98 | Botulism 99 | Brain Cancer 100 | Breast Cancer 101 | Bronchitis 102 | Brucellosis 103 | Bubonic Plague 104 | Bullies 105 | Burns 106 | Byetta (Drug) 107 | Cadavers 108 | Canavan Disease 109 | Cancer 110 | Canker Sores 111 | Capgras Syndrome 112 | Capital Punishment 113 | Cardiopulmonary Resuscitation (CPR) 114 | Carjacking 115 | Carotid Arteries 116 | Carpal Tunnel Syndrome 117 | Cat-Scratch Fever 118 | Cataracts 119 | Celebrex (Drug) 120 | Celexa (Drug) 121 | Cervical Cancer 122 | Cervix 123 | Charcot-Marie-Tooth Disease 124 | Cheating 125 | Chemotherapy 126 | Chicken Pox 127 | Child Abuse and Neglect 128 | Child Custody and Support 129 | Child Labor 130 | Child Pornography 131 | Child Soldiers 132 | Chlamydia 133 | Choking 134 | Cholera 135 | Cholesterol 136 | Chronic Fatigue Syndrome 137 | Chronic Granulomatous Disease 138 | Chronic Traumatic Encephalopathy 139 | Cialis (Drug) 140 | Circumcision 141 | Cirrhosis 142 | Civil War and Guerrilla Warfare 143 | Civilian Casualties 144 | Claritin (Drug) 145 | Clinical Trials 146 | Cluster Munitions 147 | Cocaine and Crack Cocaine 148 | Coccidioidomycosis (Valley Fever) 149 | Cochlear Implants 150 | Cockfighting 151 | Codeine 152 | Coffins 153 | Colic 154 | Colitis 155 | Colon and Colorectal Cancer 156 | Coma 157 | Computer Malware 158 | Computerized Axial Tomography (CAT Scans) 159 | Concussions 160 | Condoms 161 | Confessions 162 | Conjunctivitis 163 | Conscientious Objectors 164 | Conspiracy Theories 165 | Coronavirus (2019-nCoV) 166 | Corruption (Institutional) 167 | Coughs 168 | Courts-Martial 169 | Cox-2 Inhibitors (Drugs) 170 | Cremation 171 | Crestor (Drug) 172 | Creutzfeldt-Jakob Disease 173 | Crime and Criminals 174 | Cross Burning 175 | Croup (Children's Disease) 176 | Cruelty to Animals 177 | Cyberattacks and Hackers 178 | Cymbalta (Drug) 179 | Cystic Fibrosis 180 | Day Laborers 181 | Death and Dying 182 | Deaths (Fatalities) 183 | Deaths and Dying 184 | Defense Contracts 185 | Defibrillators 186 | Dehydration 187 | Dementia 188 | Demonstrations, Protests and Riots 189 | Dengue Fever 190 | Deportation 191 | Depression (Mental) 192 | Desertion 193 | Detainees 194 | Dialysis 195 | Diarrhea 196 | Dioxin 197 | Diphtheria 198 | Dirty Bombs and Radiological Weapons 199 | Disability Insurance 200 | Disaster and Emergencies 201 | Discrimination 202 | Diverticulosis 203 | Domestic Violence 204 | Doping (Sports) 205 | Draft and Recruitment (Military) 206 | Drownings 207 | Drug Abuse Resistance Education (DARE) 208 | Drug Abuse and Traffic 209 | Drug Cartels 210 | Drugs (Pharmaceuticals) 211 | Drunken and Reckless Driving 212 | Dupuytren's Contracture 213 | Duragesic (Drug) 214 | Dwarfism 215 | Dyslexia 216 | E Coli (Bacteria) 217 | Earthquakes 218 | Eating Disorders 219 | Ecstasy (Drug) 220 | Editorials 221 | Ehlers-Danlos Syndrome 222 | Ehrlichiosis 223 | Elder Abuse 224 | Electroshock Therapy 225 | Embezzlement 226 | Emergency Medical Treatment 227 | Enbrel (Drug) 228 | Encephalitis 229 | Endometriosis 230 | Epidemics 231 | Epidermolysis Bullosa 232 | Epilepsy 233 | Erbitux (Drug) 234 | Esophageal Cancer 235 | Essential Tremor (Disorder) 236 | Euthanasia and Assisted Suicide 237 | Evacuations and Evacuees 238 | Ex-Convicts 239 | Excommunication 240 | Extortion and Blackmail 241 | Extradition 242 | Extraordinary Rendition 243 | Exubera (Drug) 244 | Eylea (Drug) 245 | Falls 246 | False Arrests, Convictions and Imprisonments 247 | Fanconi Anemia 248 | Femara (Drug) 249 | Fen-Phen (Drug Combination) 250 | Fertility Drugs 251 | Fetal Alcohol Syndrome 252 | Fever 253 | Fibroids 254 | Fibromyalgia 255 | Fifth Disease 256 | Fires and Firefighters 257 | First Aid 258 | Fistulas 259 | Floods 260 | Food Stamps 261 | Forced Labor 262 | Foreign Workers 263 | Fosamax (Drug) 264 | Foster Care 265 | Frauds and Swindling 266 | Fringe Groups and Movements 267 | Funerals and Memorials 268 | Gabapentin (Drug) 269 | Gallbladder 270 | Gallstones 271 | Galveston Hurricane (1900) 272 | Gangrene 273 | Gangs 274 | Gastritis 275 | Gastroesophageal Reflux (Acid Reflux) 276 | Gaucher's Disease 277 | Geneva Conventions 278 | George Floyd Protests (2020) 279 | German Measles (Rubella) 280 | Giardiasis 281 | Gigantism 282 | Glaucoma 283 | Global Warming 284 | Gonorrhea 285 | Gout 286 | Green New Deal 287 | Group Homes 288 | Guantanamo Bay Naval Base (Cuba) 289 | Guillain-Barre Syndrome 290 | Guinea Worm Disease 291 | Habeas Corpus 292 | Hamas 293 | Haqqani Network 294 | Harris, Kamala D 295 | Hashish 296 | Hate Crimes 297 | Hazardous and Toxic Substances 298 | Head and Neck Cancer 299 | Heart, Artificial 300 | Heatstroke 301 | Heimlich Maneuver 302 | Hemochromatosis 303 | Hemophilia 304 | Heparin (Drug) 305 | Hepatitis 306 | Herceptin (Drug) 307 | Hernias 308 | Heroin 309 | Hezbollah 310 | Hijacking 311 | Hitler, Adolf 312 | Hives 313 | Hoarding 314 | Hodgkin's Lymphona 315 | Holocaust and the Nazi Era 316 | Home Health Care 317 | Honor Killings 318 | Hospice Care 319 | Hostages 320 | Human Rights and Human Rights Violations 321 | Human Trafficking 322 | Huntington's Disease 323 | Hurler's Syndrome 324 | Hurricane Gustav 325 | Hurricane Ike 326 | Hurricane Irene (2011) 327 | Hurricane Katrina 328 | Hurricane Sandy (2012) 329 | Hurricanes and Tropical Storms 330 | Hussein, Saddam 331 | Hydrocephalus 332 | Hypertension 333 | Hypnosis 334 | Hypochondria 335 | Hypodermic Needles and Syringes 336 | Hypoglycemia 337 | Hyponatremia (Disorder) 338 | Hypothermia 339 | Hypotonia (Disease) 340 | Hysterectomies 341 | Idiopathic Pulmonary Fibrosis 342 | Immigration Detention 343 | Immolation 344 | Impetigo 345 | Implantable Cardioverter Defibrillators (ICD) 346 | Implants 347 | Impotence 348 | Improvised Explosive Devices 349 | In Vitro Fertilization 350 | Incontinence 351 | Infant Mortality 352 | Infections 353 | Infertility 354 | Influenza 355 | Informers 356 | Interstitial Cystitis 357 | Intestinal Tract 358 | Iplex (Drug) 359 | Iraq War (2003-11) 360 | Irradiation of Food 361 | Irritable Bowel Syndrome 362 | Israeli Settlements 363 | Jaundice 364 | Juvenile Delinquency 365 | Kawasaki Disease 366 | Keratoconus 367 | Kidnapping 368 | Kidney Cancer 369 | Krabbe's Disease 370 | Kuru 371 | LASIK (Eye Surgery) 372 | LSD (Lysergic Acid Diethylamide) 373 | Lactic Acid 374 | Landslides and Mudslides 375 | Larynx 376 | Lashkar-e-Taiba 377 | Lead 378 | Legal Aid for the Poor (Civil) 379 | Legg-Perthes Disease 380 | Legionnaires' Disease 381 | Leprosy (Hansen's Disease) 382 | Leptospirosis 383 | Levaquin (Drug) 384 | Levitra (Drug) 385 | Lipitor (Drug) 386 | Liposuction 387 | Listeriosis 388 | Lithium (Drug) 389 | Liver Cancer 390 | Looting 391 | Lucentis (Drug) 392 | Lung Cancer 393 | Lyme Disease 394 | Lymphatic Filariasis 395 | Lymphatic System 396 | Lymphedema 397 | Lynching 398 | Macugen (Drug) 399 | Macular Degeneration 400 | Mad Cow Disease (Bovine Spongiform Encephalopathy) 401 | Malaria 402 | Malpractice 403 | Mammography 404 | Maritime Accidents and Safety 405 | Mastectomy 406 | Measles 407 | Medical Devices 408 | Melamine 409 | Meningitis 410 | Meningococcemia 411 | Mental Health and Disorders 412 | Mercenaries and Private Military Contractors 413 | Mercury (Metal) 414 | Methadone 415 | Methamphetamines 416 | Methicillin-Resistant Staphylococcus Aureus 417 | Middle East and North Africa Unrest (2010- ) 418 | Middle East and North Africa Unrest (2010-) 419 | Midodrine (Drug) 420 | Mifeprex (RU-486) 421 | Migraine Headaches 422 | Migrant Labor (Agriculture) 423 | Military Aircraft 424 | Military Bases and Installations 425 | Military Commissions Act 426 | Military Vehicles 427 | Milltown Dam (Montana) 428 | Mines, Explosive 429 | Missiles and Missile Defense Systems 430 | Missing Persons 431 | Missing in Action 432 | Mujao (Movement for Oneness and Jihad in West Africa) 433 | Multiple Personalities 434 | Multiple Sclerosis 435 | Mumps 436 | Munchausen's Syndrome 437 | Murders and Attempted Murders 438 | Murders, Attempted Murders and Homicides 439 | Muscular Dystrophy 440 | Nagorno-Karabakh 441 | Naloxone (Drug) 442 | Narcolepsy 443 | Necrotizing Fasciitis 444 | Nerves and Nervous System 445 | Neurofibromatosis (Elephant Man's Disease) 446 | Neurontin (Drug) 447 | Nevirapine (Drug) 448 | Newtown, Conn, Shooting (2012) 449 | Nicotine 450 | No-Fly Zones 451 | Non-Hodgkin's Lymphoma 452 | Norovirus 453 | Nuclear Weapons 454 | Oak Creek, Wis, Shooting (2012) 455 | Obesity 456 | Obsessive-Compulsive Disorder 457 | Oil Spills 458 | Onchocerciasis (Disease) 459 | Op-Ed 460 | Operation Condor 461 | Opinion 462 | Opium 463 | Organized Crime 464 | Orphans and Orphanages 465 | Osteogenesis Imperfecta 466 | Osteoporosis 467 | Otitis 468 | Ovarian Cancer 469 | Ovaries 470 | OxyContin (Drug) 471 | PBDE (Polybrominated Diphenyl Ether) 472 | Palestinians 473 | Pancreatic Cancer 474 | Paralympic Games 475 | Paralysis 476 | Paranoia 477 | Parasomnias (Sleep Disorders) 478 | Parkinson's Disease 479 | Paxil (Drug) 480 | Pelvic Inflammatory Disease 481 | Penile Cancer 482 | Peripheral Vascular Disease 483 | Peritonitis 484 | Perjury 485 | Persian Gulf War 486 | Phenylketonuria (PKU) 487 | Pickwickian Syndrome 488 | Piracy at Sea 489 | Placebos 490 | Plague 491 | Plan B (Contraceptive) 492 | Plastic Surgery 493 | Plavix (Drug) 494 | Pneumonia 495 | Poisoning and Poisons 496 | Police Brutality and Misconduct 497 | Poliomyelitis 498 | Political Prisoners 499 | Polycystic Ovary Syndrome 500 | Pondimin (Drug) 501 | Post-Traumatic Stress Disorder 502 | Posterior Uveitis 503 | Potassium Iodide 504 | Poverty 505 | Prader-Willi Syndrome 506 | Presidential Election of 2016 507 | Preventive Medicine 508 | Prison Escapes 509 | Prison and Prisoners 510 | Prisoners of War 511 | Prisons and Prisoners 512 | Probation and Parole 513 | Progeria 514 | Prostate Cancer 515 | Prostate Gland 516 | Prostheses 517 | Prostitution 518 | Proud Boys 519 | Prozac (Drug) 520 | Public Defenders and Court-Appointed Lawyers (Criminal) 521 | Public and Subsidized Housing 522 | Pulmonary Hypertension 523 | QAnon 524 | Qaddafi, Muammar el- 525 | Rabies 526 | Railroad Accidents and Safety 527 | Recalls and Bans of Products 528 | Refugees and Displaced Persons 529 | Relenza (Drug) 530 | Remicade (Drug) 531 | Remittances 532 | Reparations and Restitution 533 | Reproduction (Biological) 534 | Rescues 535 | Reserves (Military) 536 | Respiratory System 537 | Restless Leg Syndrome 538 | Rett's Syndrome 539 | Reye's Syndrome 540 | Rezulin (Drug) 541 | Rhabdomyolysis (Muscle Disease) 542 | Ricin (Poison) 543 | Rickets (Disease) 544 | Right-Wing Extremism and Alt-Right 545 | Ringworm 546 | Ritalin (Drug) 547 | Rittenhouse, Kyle 548 | Robberies and Thefts 549 | Rocky Mountain Spotted Fever 550 | Roe V Wade (Supreme Court Decision) 551 | Rogaine (Drug) 552 | Rosacea 553 | Runaway Children 554 | SARS (Severe Acute Respiratory Syndrome) 555 | Sabotage 556 | Salmonella (Bacteria) 557 | Salvia (Plant) 558 | Salvia Divinorum 559 | Sandy Hook Promise 560 | Scabies 561 | Schistosomiasis 562 | Schizophrenia 563 | School Shootings 564 | Sciatica 565 | Scoliosis 566 | Seasonal Affective Disorder (SAD) 567 | Sedatives 568 | Segregation 569 | Seizures (Medical) 570 | Sensory Integration Dysfunction 571 | Sentences (Criminal) 572 | Septic Shock 573 | Serial Murders 574 | Sex Crimes 575 | Sex Education 576 | Sexual Harassment 577 | Sexual Harrasment 578 | Sexually Transmitted Diseases 579 | Shabab 580 | Shigellosis 581 | Shingles (Disease) 582 | Shoplifting 583 | Sickle Cell Anemia 584 | Silicosis 585 | Sinusitis 586 | Skin Cancer 587 | Slavery 588 | Sleeping Sickness 589 | Sleepwalking 590 | Smallpox 591 | Smuggling 592 | Special Olympics 593 | Spinal Muscular Atrophy 594 | Spleen 595 | Sprains and Strains 596 | Stalking (Crime) 597 | State Children's Health Insurance Program (S-CHIP) 598 | Statins (Cholesterol-Lowering Drugs) 599 | Status of Forces Agreements 600 | Stem Cells 601 | Stents (Medical Devices) 602 | Sterilization (Biological) 603 | Steroids 604 | Stevens, J Christopher 605 | Stevens-Johnson Syndrome 606 | Still's Disease 607 | Stomach Cancer 608 | Stonewall Riots (1969) 609 | Strep Throat 610 | Stroke 611 | Suboxone (Drug) 612 | Subpoenas 613 | Sudden Infant Death Syndrome 614 | Suicides and Attempted Suicides 615 | Suicides and Suicide Attempts 616 | Superfund 617 | Surgery and Surgeons 618 | Surrogate Motherhood 619 | Syphilis 620 | Taliban 621 | Tamiflu (Drug) 622 | Tamoxifen (Drug) 623 | Tarceva (Drug) 624 | Targeted Killings 625 | Taxus (Drug) 626 | Tay-Sachs Disease 627 | Teenage Pregnancy 628 | Temporo-Mandibular Disorder (TMD) 629 | Tendinitis 630 | Tequin (Drug) 631 | Terrorism 632 | Terrorism Risk Insurance Act 633 | Testicles 634 | Testicular Cancer 635 | Testosterone 636 | Tests (Drug Use) 637 | Tests (Medical) 638 | Tests (Sobriety) 639 | Threats and Threatening Messages 640 | Thyroid Cancer 641 | Tidal Waves and Tsunamis 642 | Tissue (Human) 643 | Topamax (Drug) 644 | Torpedoes 645 | Torture 646 | Tourette's Syndrome 647 | Toxic Shock Syndrome (TSS) 648 | Toxoplasmosis 649 | Trachoma 650 | Traffic Accidents and Safety 651 | Transfusions 652 | Transgender and Transsexual 653 | Transplants 654 | Traumatic Brain Injury 655 | Tuberculosis 656 | Tucson Shooting (2011) 657 | Tularemia 658 | Turner's Syndrome 659 | Tylenol (Drug) 660 | Typhoid 661 | Typhoons 662 | Tysabri (Drug) 663 | USA PATRIOT Act 664 | Ulcers 665 | Unemployment 666 | Unemployment Insurance 667 | United States Defense and Military Forces 668 | Urinary Tract 669 | Uterine Cancer 670 | Vaginal and Vulvar Cancer 671 | Vandalism 672 | Varicose Veins 673 | Vasectomy 674 | Vasectomy 675 | Vasovagal Syncope (Fainting) 676 | Vertigo 677 | Veterans 678 | Viagra (Drug) 679 | Vigilantes 680 | Vioxx (Drug) 681 | Viruses 682 | Visas 683 | Vitiligo 684 | Vulvodynia 685 | Vytorin (Drug) 686 | War Crimes, Genocide and Crimes Against Humanity 687 | War and Revolution 688 | Weddings and Engagements 689 | Welfare (US) 690 | Whiplash 691 | Whooping Cough 692 | Williams Syndrome 693 | Wilson's Disease 694 | Witnesses 695 | Women's Health Initiative 696 | Wounds 697 | X-Rays 698 | Xanax (Drug) 699 | Xeroderma Pigmentosa (Skin Disease) 700 | Yeast Infections 701 | Yellow Fever 702 | Zetia (Drug) 703 | Zocor (Drug) 704 | Zoloft (Drug) 705 | Zyprexa (Drug) 706 | bin Laden, Osama 707 | internal-election-open 708 | -------------------------------------------------------------------------------- /nyt_haiku/data/syllable_counts.csv: -------------------------------------------------------------------------------- 1 | 18th,2 2 | 19th,2 3 | 20th,3 4 | 21st,3 5 | a.m,2 6 | abc,3 7 | abc,3 8 | abeyance,3 9 | abridged,2 10 | absentee,3 11 | absolves,2 12 | absorbed,2 13 | abused,2 14 | academia,5 15 | academie,4 16 | accessed,2 17 | acclaimed,2 18 | accomplished,3 19 | accurately,4 20 | accused,2 21 | ached,1 22 | aches,1 23 | achievements,3 24 | achieves,2 25 | acknowledged,3 26 | acne,2 27 | acquiesce,3 28 | acquire,3 29 | actively,3 30 | activism,4 31 | acutely,3 32 | added,2 33 | admire,3 34 | adorned,2 35 | adrianne,3 36 | adriene,3 37 | adrienne,3 38 | advancement,3 39 | advancements,3 40 | adventured,3 41 | adventures,3 42 | advertised,3 43 | advertisements,4 44 | advised,2 45 | advocates,3 46 | aerial,3 47 | affirmed,2 48 | affixed,2 49 | affluent,3 50 | aficionado,6 51 | aforementioned,4 52 | aggressively,4 53 | aggrieved,2 54 | agonized,3 55 | ahwahnee,3 56 | ai,2 57 | aides,1 58 | aimed,1 59 | airbnb,4 60 | aired,1 61 | airlines,2 62 | airwaves,2 63 | alarmed,2 64 | albanian,4 65 | albeit,3 66 | algorithm,4 67 | algorithms,4 68 | aliah,3 69 | alias,3 70 | alien,3 71 | aligned,2 72 | aliveness,3 73 | aliyah,3 74 | alleged,3 75 | alleviate,4 76 | altered,2 77 | alternatives,4 78 | amassed,2 79 | amazed,2 80 | amazonian,5 81 | ambiance,3 82 | ambient,3 83 | ambiguity,5 84 | ambushed,2 85 | amelia,4 86 | ammonia,4 87 | amped,1 88 | amplifying,4 89 | amused,2 90 | amusement,3 91 | analyzed,3 92 | anarchism,4 93 | anchored,2 94 | andrea,3 95 | angered,2 96 | animates,3 97 | annie,2 98 | announcements,3 99 | annoyance,3 100 | annoying,3 101 | annually,4 102 | answered,2 103 | antiques,2 104 | anxieties,4 105 | aphorism,4 106 | aphorisms,4 107 | api,3 108 | apnea,3 109 | apolemia,5 110 | apologized,4 111 | appalled,2 112 | apparently,4 113 | appealed,2 114 | appeared,2 115 | appreciably,5 116 | apprenticed,3 117 | approached,2 118 | approached,2 119 | approximately,5 120 | aquarium,4 121 | arabia,4 122 | archaea,3 123 | archaeologist,5 124 | archaeologists,5 125 | archaic,3 126 | archives,2 127 | areas,3 128 | aren't,1 129 | argentario,5 130 | arguably,4 131 | arguing,3 132 | ariana,4 133 | arias,3 134 | arranged,2 135 | arrangements,3 136 | artichokes,3 137 | ascertained,3 138 | ashamed,2 139 | asheville,2 140 | asiago,4 141 | assiduously,5 142 | assigned,2 143 | associated,5 144 | assured,2 145 | assured,2 146 | astonished,3 147 | astoria,4 148 | astrobiologist,6 149 | astrobiologists,6 150 | athletes,2 151 | atrium,3 152 | atriums,3 153 | attacked,2 154 | attendee,3 155 | attitudes,3 156 | attributes,3 157 | auctioned,2 158 | audiences,4 159 | augured,2 160 | aurelia,4 161 | aurelien,4 162 | auslese,3 163 | authored,2 164 | autoimmune,4 165 | automatically,5 166 | averaged,3 167 | averaging,3 168 | avian,3 169 | aviator,4 170 | aviatrix,4 171 | azienda,4 172 | backed,1 173 | backlogged,2 174 | bagatelle,3 175 | bailed,1 176 | baked,1 177 | balenciaga,5 178 | banged,1 179 | banned,1 180 | barbarism,4 181 | barbecue,3 182 | barefoot,2 183 | barraged,2 184 | barred,1 185 | barriers,3 186 | baseless,2 187 | baselessly,3 188 | baseline,2 189 | baselines,2 190 | bastardized,3 191 | bates,1 192 | bathed,1 193 | bathrobes,2 194 | battered,2 195 | bavaria,4 196 | bavarian,4 197 | bayous,2 198 | bbc,3 199 | beachgoer,3 200 | beachgoers,3 201 | beckoned,2 202 | becomes,2 203 | bedeviled,3 204 | begged,1 205 | beguiles,2 206 | behaved,2 207 | behavioral,4 208 | bejeweled,2 209 | beleaguered,3 210 | bellagio,4 211 | belonged,2 212 | beloved,2 213 | belying,3 214 | bemoaned,2 215 | bemused,2 216 | beneficiaries,6 217 | bernie,2 218 | bessie,2 219 | bestowed,2 220 | betrayal,3 221 | beyonce,3 222 | biases,3 223 | bibbed,1 224 | bigger,2 225 | biggest,2 226 | bikes,1 227 | billie,2 228 | billionaires,3 229 | binge-watching,3 230 | biochemist,4 231 | biographer,4 232 | biographers,4 233 | biologist,4 234 | biologists,4 235 | biopic,3 236 | blamed,1 237 | blasio,3 238 | blessed,1 239 | blocked,1 240 | bloodiest,3 241 | bloomed,1 242 | blossomed,2 243 | blossomed,2 244 | blurred,1 245 | bmw,4 246 | bobbed,1 247 | boil,2 248 | bolivia,4 249 | bolstered,2 250 | boned,1 251 | bones,1 252 | bonnie,2 253 | booers,2 254 | booing,2 255 | booked,1 256 | boomed,1 257 | bootstrapism,4 258 | bored,1 259 | boredom,2 260 | borrowed,2 261 | boseman,2 262 | bostonian,4 263 | bothered,2 264 | bottomed,2 265 | bouteille,2 266 | bouteilles,2 267 | boxed,1 268 | bozeman,2 269 | bracelet,2 270 | bracelets,2 271 | braggadocio,5 272 | brained,1 273 | branched,1 274 | brasserie,3 275 | braved,1 276 | braved,1 277 | breathes,1 278 | brene,2 279 | bribed,1 280 | bridesmaid,2 281 | bridesmaids,2 282 | broached,1 283 | broadsides,2 284 | bronzed,1 285 | brooked,1 286 | brutalized,3 287 | bucked,1 288 | bullying,3 289 | bumped,1 290 | burdened,2 291 | burgundian,4 292 | burial,3 293 | burned,1 294 | burned,1 295 | burrowed,2 296 | burying,3 297 | bushee,2 298 | busier,3 299 | businesspeople,4 300 | businessperson,4 301 | buyers,2 302 | buzzed,1 303 | bygones,2 304 | c.e.o,3 305 | cacciola,4 306 | cadre,2 307 | cafeteria,5 308 | caged,1 309 | cakes,1 310 | calcium,3 311 | calibre,3 312 | callused,2 313 | cameo,3 314 | cameos,3 315 | camille,2 316 | campaigned,2 317 | campsites,2 318 | canceled,2 319 | candidates,3 320 | canines,2 321 | canned,1 322 | capitalism,5 323 | capitulates,4 324 | capote,3 325 | capped,1 326 | captivates,3 327 | captures,2 328 | caravaggio,5 329 | caravaggios,5 330 | cardiologist,5 331 | cardplayers,3 332 | cared,1 333 | carefully,3 334 | caregiving,3 335 | careless,2 336 | cares,1 337 | caretaker,3 338 | caretakers,3 339 | caricatured,4 340 | carlile,3 341 | carnivores,3 342 | carrie,2 343 | cartier,3 344 | carved,1 345 | cascades,2 346 | caseback,2 347 | casebacks,2 348 | caseload,2 349 | caseloads,2 350 | casseroles,3 351 | cassettes,2 352 | casually,4 353 | cataloged,3 354 | catastrophe,4 355 | categorized,4 356 | causeway,2 357 | cautioned,2 358 | caveat,3 359 | caveats,3 360 | caved,1 361 | cbs,3 362 | cbs,3 363 | ceaseless,2 364 | celebrates,3 365 | celled,1 366 | cellphones,2 367 | censored,2 368 | centennial,4 369 | centered,2 370 | centralized,3 371 | cereal,3 372 | ceremonial,5 373 | cerulean,4 374 | chalked,1 375 | challenged,2 376 | chambered,2 377 | chameleon,4 378 | championing,4 379 | champions,3 380 | championships,4 381 | changing,2 382 | chaotic,3 383 | charles,2 384 | charlottesville,3 385 | charmed,1 386 | chartered,2 387 | chased,1 388 | cheered,1 389 | cherished,2 390 | cherished,2 391 | chianti,3 392 | chilean,3 393 | chilled,1 394 | chirped,1 395 | chives,1 396 | chloe,2 397 | chocolates,3 398 | chokehold,2 399 | chokeholds,2 400 | choreographer,5 401 | choreographers,5 402 | choreographies,5 403 | christened,2 404 | churned,1 405 | cinched,1 406 | civilized,3 407 | claimed,1 408 | clambered,2 409 | clamped,1 410 | clapped,1 411 | claremont,2 412 | clarifying,4 413 | classed,1 414 | classmates,2 415 | cleared,1 416 | clerked,1 417 | clicked,1 418 | clientele,3 419 | clients,2 420 | climbed,1 421 | clinched,1 422 | clocked,1 423 | clogged,1 424 | closely,2 425 | closest,2 426 | closures,2 427 | clothed,1 428 | cloying,2 429 | clustered,2 430 | coachella,4 431 | coarsened,2 432 | coates,1 433 | coaxial,4 434 | cocooned,2 435 | coen,2 436 | coercing,3 437 | coercive,3 438 | coexist,3 439 | coexistence,4 440 | coexists,3 441 | coffered,2 442 | coincided,4 443 | coincidence,4 444 | coined,1 445 | collapsed,2 446 | colleagues,2 447 | colloquial,4 448 | colloquialism,6 449 | colloquialisms,6 450 | colonialism,6 451 | colonized,3 452 | colored,2 453 | combined,2 454 | comeback,2 455 | comedian,4 456 | comedians,4 457 | comely,2 458 | commedia,4 459 | commencement,3 460 | commissioned,3 461 | communed,2 462 | communicates,4 463 | communism,4 464 | compares,2 465 | compelled,2 466 | complained,2 467 | completely,3 468 | compressed,2 469 | comprised,2 470 | compromised,3 471 | concealed,2 472 | conceived,2 473 | concierge,3 474 | concludes,2 475 | conclusively,4 476 | condemned,2 477 | condensed,2 478 | conditioned,3 479 | conduit,3 480 | configured,3 481 | configured,3 482 | confused,2 483 | congealed,2 484 | congenial,4 485 | congratulates,4 486 | conjoined,2 487 | conjured,2 488 | conquered,2 489 | consigned,2 490 | consistently,4 491 | consoled,2 492 | consoles,2 493 | conspicuous,4 494 | constituent,4 495 | constrained,2 496 | consumed,2 497 | continuing,4 498 | continuity,5 499 | contrarian,4 500 | controlee,3 501 | convened,2 502 | conveying,3 503 | cooked,1 504 | cooled,1 505 | cooped,1 506 | cooperating,5 507 | coordinated,5 508 | coordination,5 509 | cornered,2 510 | cornerstones,3 511 | correctly,3 512 | costumed,2 513 | costumes,2 514 | cottagecore,3 515 | coughed,1 516 | couldn't,2 517 | counseled,2 518 | countered,2 519 | couturier,4 520 | cracked,1 521 | crammed,1 522 | cramped,1 523 | cranes,1 524 | craved,1 525 | crazed,1 526 | craziest,3 527 | createurs,3 528 | creators,3 529 | creatures,2 530 | crewmates,2 531 | crimes,1 532 | crinolines,3 533 | cristiana,4 534 | cristie,2 535 | criterion,4 536 | criticism,4 537 | criticized,3 538 | critiqued,2 539 | critiques,2 540 | crossed,1 541 | crowned,1 542 | crushed,1 543 | crying,2 544 | cultured,2 545 | cultures,2 546 | curates,2 547 | cured,1 548 | cures,1 549 | curled,1 550 | cursed,1 551 | curtailed,2 552 | curves,1 553 | curvier,3 554 | custodian,4 555 | cynthia,3 556 | d'escalier,4 557 | d'origine,4 558 | damaged,2 559 | dames,1 560 | damned,1 561 | dancing,2 562 | danes,1 563 | danielle,2 564 | dario,3 565 | darned,1 566 | dashed,1 567 | dawned,1 568 | dazed,1 569 | deaccession,4 570 | deaccessioning,5 571 | debates,2 572 | debunked,2 573 | debuted,2 574 | decades,2 575 | deceased,2 576 | deceived,2 577 | decides,2 578 | declares,2 579 | declined,2 580 | declines,2 581 | decreased,2 582 | deemed,1 583 | deepened,2 584 | defender,3 585 | defiance,3 586 | defiant,3 587 | defines,2 588 | degrades,2 589 | delayed,2 590 | deliberately,5 591 | delicately,4 592 | deliriously,5 593 | delirium,4 594 | delivered,3 595 | delved,1 596 | delves,1 597 | demolished,3 598 | denotes,2 599 | denounced,2 600 | depending,3 601 | depreciation,5 602 | describes,2 603 | designates,3 604 | desire,3 605 | desired,3 606 | despaired,2 607 | desperately,4 608 | destabilized,4 609 | destined,2 610 | destroying,3 611 | detached,2 612 | detectives,3 613 | deteriorate,5 614 | determines,3 615 | deutsche,2 616 | devalue,3 617 | developmental,5 618 | deviate,3 619 | deviated,4 620 | deviates,3 621 | deviled,2 622 | devised,2 623 | devolved,2 624 | devotes,2 625 | diane,2 626 | diaries,3 627 | diced,1 628 | dictates,2 629 | didion,3 630 | didn't,2 631 | diereses,4 632 | differently,4 633 | digitized,3 634 | digressed,2 635 | diminished,3 636 | dining,2 637 | dioxide,3 638 | dipped,1 639 | dire,2 640 | disappeared,3 641 | discharged,2 642 | disclosed,2 643 | disclosures,3 644 | discombobulates,5 645 | discouraged,3 646 | disenfranchised,4 647 | disfavored,3 648 | disguised,2 649 | disliked,2 650 | dismantling,4 651 | dismissed,2 652 | dispatched,2 653 | dispensed,2 654 | dispersed,2 655 | displaced,2 656 | displaying,3 657 | dispossessed,3 658 | disputes,2 659 | dissolved,2 660 | distanced,2 661 | distilled,2 662 | distinguished,3 663 | distressed,2 664 | disturbed,2 665 | dived,1 666 | diverged,2 667 | divides,2 668 | divorced,2 669 | dizzyingly,4 670 | dna,3 671 | docked,1 672 | doesn't,2 673 | dolio,3 674 | dominates,3 675 | donahue,3 676 | donned,1 677 | doomed,1 678 | doored,1 679 | draconian,4 680 | dragged,1 681 | dramatically,5 682 | dreamed,1 683 | dredged,1 684 | dressed,1 685 | driest,2 686 | drilled,1 687 | drones,1 688 | droves,1 689 | drying,2 690 | dua,2 691 | dubbed,1 692 | dubious,3 693 | dumped,1 694 | dunes,1 695 | dunked,1 696 | duo,2 697 | duomo,3 698 | duped,1 699 | duterte,3 700 | dvd,3 701 | dwarfed,1 702 | dynamism,4 703 | dystopia,4 704 | dystopian,4 705 | dystopias,4 706 | e.g,2 707 | earlier,3 708 | earliest,3 709 | earthquakes,2 710 | eased,1 711 | easeful,2 712 | easygoing,4 713 | eavesdrop,2 714 | eavesdropped,2 715 | eavesdropping,3 716 | eclipsed,2 717 | ecological,5 718 | edged,1 719 | edifying,4 720 | edwardian,4 721 | eerie,2 722 | effectively,4 723 | eighty,3 724 | elapsed,2 725 | elegiac,4 726 | eliminates,4 727 | elites,2 728 | eloisa,4 729 | elysium,4 730 | emailed,2 731 | embalmed,2 732 | embarked,2 733 | embraced,2 734 | emerged,2 735 | emigrates,3 736 | emmaus,3 737 | emotionally,5 738 | emphasized,3 739 | empire,3 740 | empowered,3 741 | encased,2 742 | enclosed,2 743 | encompassed,3 744 | encountered,3 745 | encouragement,4 746 | encouraging,4 747 | encumbered,3 748 | endorsement,3 749 | endorsements,3 750 | endowed,2 751 | endured,2 752 | enforced,2 753 | engendered,3 754 | engineered,3 755 | engines,2 756 | engulfed,2 757 | enjoyable,4 758 | enjoying,3 759 | enlivened,3 760 | enraged,2 761 | enrolled,2 762 | enslaved,2 763 | ensuing,3 764 | ensured,2 765 | entered,2 766 | entertained,3 767 | enthralled,2 768 | enthusiasts,4 769 | enticement,3 770 | entire,3 771 | entirely,4 772 | entrenched,2 773 | envelopes,3 774 | environmental,5 775 | episodes,3 776 | epitome,4 777 | eritrean,4 778 | erroneous,4 779 | erstwhile,3 780 | escapades,3 781 | escaped,2 782 | escapement,3 783 | escapes,2 784 | escapism,4 785 | eschewed,2 786 | essentially,4 787 | estates,2 788 | esteemed,2 789 | estimated,4 790 | estimates,3 791 | estonia,4 792 | ethereal,4 793 | euphoria,4 794 | evacuating,5 795 | evaluated,5 796 | evaluating,5 797 | evoked,2 798 | evolved,2 799 | evolves,2 800 | exaggerates,4 801 | examined,3 802 | examines,3 803 | exchanged,2 804 | excruciating,5 805 | excused,2 806 | executes,3 807 | executives,4 808 | exercised,3 809 | exhaustively,4 810 | existing,3 811 | expatiate,4 812 | expected,3 813 | expedient,4 814 | expelled,2 815 | expensed,2 816 | experiencing,5 817 | explained,2 818 | explored,2 819 | explores,2 820 | exposed,2 821 | expressed,2 822 | extolled,2 823 | extremism,4 824 | extremismm,4 825 | extremophiles,4 826 | eyal,2 827 | eyeing,2 828 | facebook,2 829 | faced,1 830 | facelessness,3 831 | facetime,2 832 | facsimile,4 833 | factual,3 834 | failures,2 835 | faked,1 836 | fakes,1 837 | falsehood,2 838 | falsehoods,2 839 | falsely,2 840 | famed,1 841 | fanned,1 842 | fares,1 843 | farewell,2 844 | fascinates,3 845 | fascism,3 846 | fashioned,2 847 | faster,2 848 | fateful,2 849 | fates,1 850 | fathered,2 851 | fatigued,2 852 | favored,2 853 | favorites,3 854 | fazed,1 855 | fazio,3 856 | feared,1 857 | featureless,3 858 | features,2 859 | felines,2 860 | females,2 861 | feminism,4 862 | fenced,1 863 | festooned,2 864 | fetched,1 865 | fetishized,3 866 | fettuccine,4 867 | fiance,3 868 | fictionalized,4 869 | fides,1 870 | figured,2 871 | figurehead,3 872 | figureheads,3 873 | figures,2 874 | filmed,1 875 | filtered,2 876 | filthiest,3 877 | finalized,3 878 | financed,2 879 | finely,2 880 | fished,1 881 | fived,1 882 | flagged,1 883 | flamboyance,3 884 | flamboyant,3 885 | flames,1 886 | flanked,1 887 | flared,1 888 | flattened,2 889 | flavored,2 890 | flawed,1 891 | flecked,1 892 | fleeing,2 893 | flicked,1 894 | flocked,1 895 | floundered,2 896 | flourished,2 897 | flowed,1 898 | fluency,3 899 | flustered,2 900 | fogged,1 901 | foil,2 902 | foles,1 903 | followed,2 904 | forceful,2 905 | forebear,2 906 | forebears,2 907 | forecaster,3 908 | forecasters,3 909 | forecasts,2 910 | forefathers,3 911 | foreground,2 912 | foreheads,2 913 | forerunner,3 914 | forerunners,3 915 | foreshortening,4 916 | forged,1 917 | forgiveness,3 918 | forgoing,3 919 | formulaic,4 920 | fortunes,2 921 | fostered,2 922 | foundered,2 923 | franchised,2 924 | frantically,3 925 | frowned,1 926 | fueled,1 927 | fugitives,3 928 | fulfilled,2 929 | fumed,1 930 | fumes,1 931 | functioned,2 932 | funereal,4 933 | furious,3 934 | furloughed,2 935 | furred,1 936 | furriest,3 937 | furrowed,2 938 | furthered,2 939 | futures,2 940 | gabriel,3 941 | gained,1 942 | gaines,1 943 | galea,3 944 | galerie,3 945 | galvanized,3 946 | gambia,3 947 | gamecast,2 948 | gameplay,2 949 | garbageman,3 950 | garbagemen,3 951 | gardened,2 952 | gargantuan,4 953 | gasped,1 954 | gatefold,2 955 | gatekeeper,3 956 | gatekeepers,3 957 | gates,1 958 | gathered,2 959 | gazed,1 960 | geared,1 961 | gendered,2 962 | genealogy,5 963 | generalism,5 964 | generates,3 965 | genitalia,5 966 | genomes,2 967 | geocoded,4 968 | geolocation,5 969 | georgetown,2 970 | gestures,2 971 | getting,2 972 | giacomo,4 973 | giants,2 974 | gigabytes,3 975 | giovanni,4 976 | giulia,3 977 | giuliani,4 978 | giuseppe,3 979 | giving,2 980 | gladiator,4 981 | gladiatorial,6 982 | gladiators,4 983 | glanced,1 984 | glimmered,2 985 | glimpsed,1 986 | glitched,1 987 | gloriously,4 988 | gnomelike,2 989 | goliath,3 990 | gouged,1 991 | governed,2 992 | gps,3 993 | gpt,3 994 | graced,1 995 | gradual,3 996 | gradually,4 997 | graduate,3 998 | graduated,4 999 | graduating,4 1000 | graham,1 1001 | grandiose,3 1002 | granules,2 1003 | grasped,1 1004 | gratinee,3 1005 | graves,1 1006 | greased,1 1007 | greatest,2 1008 | greedier,3 1009 | greediest,3 1010 | gridlocked,2 1011 | grilled,1 1012 | grimaced,2 1013 | grinned,1 1014 | gripped,1 1015 | groaned,1 1016 | groomed,1 1017 | grooved,1 1018 | grouped,1 1019 | guessed,1 1020 | guidelines,2 1021 | gunned,1 1022 | habitual,4 1023 | hacienda,4 1024 | hacked,1 1025 | hadn't,2 1026 | hagia,3 1027 | hailed,1 1028 | haired,1 1029 | hallowed,2 1030 | halves,1 1031 | hammered,2 1032 | happier,3 1033 | harassed,2 1034 | harder,2 1035 | harmonized,3 1036 | harriet,3 1037 | harris's,3 1038 | hasn't,2 1039 | hates,1 1040 | having,2 1041 | hbo,3 1042 | headlines,2 1043 | healthier,3 1044 | heaped,1 1045 | heartiest,3 1046 | heightened,2 1047 | helmed,1 1048 | herbivores,3 1049 | herculean,4 1050 | here's,1 1051 | heroin,3 1052 | heroine,3 1053 | hesitates,3 1054 | hicks's,2 1055 | higher,2 1056 | highest,2 1057 | hijacked,2 1058 | hiked,1 1059 | hilarious,4 1060 | himalaya,4 1061 | himalayas,4 1062 | hinged,1 1063 | historians,4 1064 | hivemind,2 1065 | holmes,1 1066 | homebound,2 1067 | homecoming,3 1068 | homecomings,3 1069 | homegrown,2 1070 | homemade,2 1071 | hometown,2 1072 | homewares,2 1073 | homogeneous,5 1074 | homosexuality,7 1075 | honed,1 1076 | honored,2 1077 | hooked,1 1078 | hoped,1 1079 | hopeless,2 1080 | hopelessly,3 1081 | hopelessness,3 1082 | hopes,1 1083 | horsehair,2 1084 | hotelier,4 1085 | hotlines,2 1086 | hour,2 1087 | hourly,3 1088 | hours,2 1089 | housed,1 1090 | households,2 1091 | hugely,2 1092 | hugged,1 1093 | hughes,1 1094 | humiliations,5 1095 | hurled,1 1096 | hurricanes,3 1097 | hyena,3 1098 | hyenas,3 1099 | hyped,1 1100 | ian,2 1101 | iceberg,2 1102 | icebergs,2 1103 | iced,1 1104 | ideal,2 1105 | idealism,4 1106 | idiosyncratic,6 1107 | idiosyncratic,7 1108 | idiosyncratically,8 1109 | idiotic,4 1110 | ignored,2 1111 | illustrious,4 1112 | imagined,3 1113 | immanuel,4 1114 | immediacy,5 1115 | immensely,3 1116 | imperial,4 1117 | imperiled,3 1118 | impetuous,4 1119 | impingement,3 1120 | implying,3 1121 | imposed,2 1122 | impressed,2 1123 | impressively,4 1124 | improvements,3 1125 | improvised,3 1126 | imputes,2 1127 | incensed,2 1128 | incentives,3 1129 | incipient,4 1130 | inclined,2 1131 | inclines,2 1132 | includes,2 1133 | including,3 1134 | incorporates,4 1135 | increasingly,4 1136 | incurred,2 1137 | indexed,2 1138 | indianapolis,6 1139 | indicates,3 1140 | inebriated,5 1141 | influencer,4 1142 | infuriating,5 1143 | infused,2 1144 | ingenuity,5 1145 | ingredients,4 1146 | inhaled,2 1147 | initially,4 1148 | initiated,5 1149 | injured,2 1150 | insomnia,4 1151 | insomniac,4 1152 | instilled,2 1153 | institutes,3 1154 | instructional,4 1155 | intensely,3 1156 | interferes,3 1157 | interred,2 1158 | interrogates,4 1159 | interviewed,3 1160 | intestines,3 1161 | intrigued,2 1162 | intuition,4 1163 | intuitive,4 1164 | invented,3 1165 | invertebrates,4 1166 | investigates,4 1167 | invites,2 1168 | invoked,2 1169 | invokes,2 1170 | involvement,3 1171 | involves,2 1172 | iphones,2 1173 | irked,1 1174 | isaac,3 1175 | isn't,2 1176 | isotopes,3 1177 | it'd,2 1178 | italia,4 1179 | jailed,1 1180 | jawbones,2 1181 | jeered,1 1182 | jerked,1 1183 | jessie,2 1184 | jeweled,1 1185 | jodie,2 1186 | joked,1 1187 | joshua,3 1188 | journalism,4 1189 | jovial,3 1190 | jpmorgan,3 1191 | judged,1 1192 | julia,3 1193 | julio,3 1194 | julius,3 1195 | jumped,1 1196 | karlsruhe,3 1197 | kicked,1 1198 | kidnapped,2 1199 | kilobytes,3 1200 | kobe,2 1201 | kumbaya,3 1202 | kylie,2 1203 | l.p,2 1204 | labeled,2 1205 | laced,1 1206 | lacked,1 1207 | lafayette,3 1208 | landscaped,2 1209 | landscapes,2 1210 | lapierre,3 1211 | laramie,3 1212 | largemouth,2 1213 | larger,2 1214 | largest,2 1215 | lateness,2 1216 | laughed,1 1217 | launched,1 1218 | lavished,2 1219 | laying,2 1220 | league's,1 1221 | leaned,1 1222 | leanne,2 1223 | lectures,2 1224 | leered,1 1225 | legally,3 1226 | leia,2 1227 | leon,2 1228 | leonardo,4 1229 | leonhardt,3 1230 | leonine,3 1231 | leukemia,4 1232 | leveled,2 1233 | leveraged,3 1234 | libya,3 1235 | libyans,3 1236 | licensed,2 1237 | licensed,2 1238 | lifeless,2 1239 | lifeline,2 1240 | lifelines,2 1241 | lifelong,2 1242 | lifesaver,3 1243 | lifetimes,2 1244 | lightened,2 1245 | likened,2 1246 | likes,1 1247 | lineage,3 1248 | linebacker,3 1249 | linebackers,3 1250 | lined,1 1251 | linguine,3 1252 | lionel,3 1253 | listened,2 1254 | littered,2 1255 | livelihoods,3 1256 | lively,2 1257 | livestream,2 1258 | livestreaming,3 1259 | loaned,1 1260 | loathed,1 1261 | loaves,1 1262 | lobbying,3 1263 | locked,1 1264 | loneliness,3 1265 | longed,1 1266 | longer,2 1267 | loosed,1 1268 | loosely,2 1269 | loosened,2 1270 | lounged,1 1271 | loungewear,2 1272 | loved,1 1273 | lowered,2 1274 | lucia,3 1275 | luciano,4 1276 | luis,2 1277 | lurched,1 1278 | lured,1 1279 | luxuriate,4 1280 | luxurious,4 1281 | lyon,2 1282 | lyons,2 1283 | macabre,3 1284 | macenzie,3 1285 | machiavellian,6 1286 | machined,2 1287 | madeleines,3 1288 | mafia,3 1289 | magazines,3 1290 | mailed,1 1291 | majored,2 1292 | males,1 1293 | managing,3 1294 | mandates,2 1295 | manicured,3 1296 | manipulates,4 1297 | mannered,2 1298 | mannerism,4 1299 | mannerisms,4 1300 | manscaped,2 1301 | manually,4 1302 | manufacturing,5 1303 | mapped,1 1304 | marched,1 1305 | marginalized,4 1306 | mariachi,4 1307 | mariah,3 1308 | mariane,3 1309 | marines,2 1310 | marionette,4 1311 | marquee,2 1312 | marveled,2 1313 | mashed,1 1314 | matched,1 1315 | matriarch,3 1316 | matriarchal,4 1317 | mattered,2 1318 | matthias,3 1319 | matured,2 1320 | maya,2 1321 | mazelike,2 1322 | mccoy,2 1323 | mcfadden,3 1324 | mcintire,4 1325 | mckinsey,3 1326 | mealtimes,2 1327 | meander,3 1328 | meandering,4 1329 | meanders,3 1330 | measures,2 1331 | mechanism,4 1332 | mechanisms,4 1333 | mediocrity,5 1334 | megabytes,3 1335 | melania,4 1336 | mellowed,2 1337 | melted,2 1338 | memes,1 1339 | memorized,3 1340 | menaced,2 1341 | mentioned,2 1342 | mercier,3 1343 | mercurial,4 1344 | merged,1 1345 | messier,3 1346 | metastasized,4 1347 | microbes,2 1348 | microcosm,4 1349 | microwaves,3 1350 | migrates,2 1351 | milestone,2 1352 | milestones,2 1353 | militarized,4 1354 | millennial,4 1355 | millennials,4 1356 | millennium,4 1357 | minecraft,2 1358 | minimized,3 1359 | minutes,2 1360 | minutiae,4 1361 | mirrored,2 1362 | mismatched,2 1363 | missiles,2 1364 | misspelled,2 1365 | mistakes,2 1366 | miyake,3 1367 | mnuchin,3 1368 | moaned,1 1369 | mocked,1 1370 | modeled,2 1371 | modernism,4 1372 | moet,2 1373 | monetized,3 1374 | mongolia,4 1375 | mongolian,4 1376 | monologued,3 1377 | monologues,3 1378 | montepulciano,6 1379 | montepulcianos,6 1380 | moored,1 1381 | morehouse,2 1382 | mortgaged,2 1383 | mosques,1 1384 | mothballed,2 1385 | mountainsides,3 1386 | movements,2 1387 | moyers,2 1388 | muammar,3 1389 | multicolored,4 1390 | multiepisode,5 1391 | multiplayer,4 1392 | multitudes,3 1393 | murdered,2 1394 | musee,2 1395 | museo,3 1396 | museums,3 1397 | must've,2 1398 | mustered,2 1399 | muttered,2 1400 | mutually,4 1401 | myopia,4 1402 | mysteriously,5 1403 | mysticism,4 1404 | n.y.u,3 1405 | naive,2 1406 | namesake,2 1407 | namesakes,2 1408 | napoleon,4 1409 | narcissism,4 1410 | narrates,2 1411 | narratives,3 1412 | narrowed,2 1413 | natalia,4 1414 | navigates,3 1415 | nazism,3 1416 | nbc,3 1417 | neapolitan,5 1418 | neared,1 1419 | necked,1 1420 | negotiated,5 1421 | negotiations,5 1422 | neo,2 1423 | neon,2 1424 | netflix's,3 1425 | neuroscience,4 1426 | nicked,1 1427 | nihilism,4 1428 | nineteen,2 1429 | ninety,2 1430 | nonviolent,4 1431 | notarized,3 1432 | notifying,4 1433 | notoriety,5 1434 | notorious,4 1435 | notoriously,5 1436 | nuances,3 1437 | nudes,1 1438 | numbered,2 1439 | nurtured,2 1440 | nxivm,3 1441 | nythaikus,5 1442 | oasis,3 1443 | oblivion,4 1444 | obscured,2 1445 | obsidian,4 1446 | obtained,2 1447 | obviously,4 1448 | oceanic,4 1449 | oeuvre,2 1450 | offered,2 1451 | oil,2 1452 | old-fashioned,3 1453 | olives,2 1454 | olivier,4 1455 | olympian,4 1456 | omnivores,3 1457 | one's,1 1458 | one-on-one,3 1459 | oneself,2 1460 | openai,4 1461 | openly,3 1462 | operates,3 1463 | operatives,4 1464 | opium,3 1465 | oppressed,2 1466 | optimism,4 1467 | optimized,3 1468 | optioned,2 1469 | oreo,3 1470 | organism,4 1471 | organisms,4 1472 | orgasm,3 1473 | orgasms,3 1474 | orientalism,6 1475 | orientalist,5 1476 | othered,2 1477 | outlier,3 1478 | outlined,2 1479 | outscored,2 1480 | outstretched,2 1481 | outtakes,2 1482 | overdue,3 1483 | overexposed,4 1484 | overlooked,3 1485 | overpowered,4 1486 | overpriced,3 1487 | overstressed,3 1488 | overtimes,3 1489 | overturned,3 1490 | overwhelmed,3 1491 | p.m,2 1492 | packed,1 1493 | paged,1 1494 | paired,1 1495 | paleontologist,6 1496 | paleontologists,6 1497 | palettes,2 1498 | pancakes,2 1499 | panicked,2 1500 | panned,1 1501 | pantheon,3 1502 | parachutes,3 1503 | parades,2 1504 | paraphrased,3 1505 | parked,1 1506 | paroxysm,4 1507 | paroxysms,4 1508 | partakes,2 1509 | partially,3 1510 | particulates,4 1511 | pastimes,2 1512 | patagonia,5 1513 | patio,3 1514 | patrolled,2 1515 | patronized,3 1516 | patterned,2 1517 | paused,1 1518 | paved,1 1519 | pavement,2 1520 | peaked,1 1521 | pealed,1 1522 | pearled,1 1523 | pedaled,2 1524 | pedialyte,4 1525 | pediatrician,5 1526 | pediatrics,4 1527 | pedigree,3 1528 | peeled,1 1529 | perceives,2 1530 | perched,1 1531 | performed,2 1532 | periods,3 1533 | perpetual,4 1534 | perpetuate,4 1535 | perspectives,3 1536 | pessimism,4 1537 | pewdiepie,3 1538 | phoned,1 1539 | phonemes,2 1540 | photographed,3 1541 | photophores,3 1542 | photoshopped,3 1543 | phrased,1 1544 | physiologists,5 1545 | physiology,5 1546 | piazza,3 1547 | pictures,2 1548 | piled,1 1549 | pinged,1 1550 | pioneering,4 1551 | pitched,1 1552 | pixie,2 1553 | pizzeria,4 1554 | plagiarism,4 1555 | plagued,1 1556 | plaintively,3 1557 | plastered,2 1558 | playacting,3 1559 | players,2 1560 | pleasures,2 1561 | pledged,1 1562 | pleistocene's,3 1563 | plopped,1 1564 | plotlines,2 1565 | plumes,1 1566 | plunged,1 1567 | pneumonia,4 1568 | podium,3 1569 | poem,1 1570 | poetic,3 1571 | poised,1 1572 | poisoned,2 1573 | poitier,3 1574 | polarized,3 1575 | poles,1 1576 | politely,3 1577 | polyester,4 1578 | pondered,2 1579 | pooled,1 1580 | popes,1 1581 | popped,1 1582 | popularized,4 1583 | pored,1 1584 | pores,1 1585 | porsche,2 1586 | portrayal,3 1587 | portraying,3 1588 | posed,1 1589 | positives,3 1590 | postmodernism,5 1591 | postponed,2 1592 | practiced,2 1593 | precarious,4 1594 | precisely,3 1595 | precooked,2 1596 | predates,2 1597 | prejudiced,3 1598 | premiered,2 1599 | premised,2 1600 | premiums,3 1601 | preoccupations,5 1602 | preoccupied,4 1603 | preoccupy,4 1604 | prepares,2 1605 | preplanned,2 1606 | presaged,2 1607 | presbyterian,5 1608 | preserved,2 1609 | preserves,2 1610 | pressed,1 1611 | pressured,2 1612 | pressures,2 1613 | presumed,2 1614 | pretaped,2 1615 | previously,4 1616 | primed,1 1617 | primitives,3 1618 | printed,2 1619 | prioritizes,5 1620 | privately,3 1621 | privileged,3 1622 | priyanka,3 1623 | prized,1 1624 | procedures,3 1625 | processed,2 1626 | processing,3 1627 | proclaimed,2 1628 | programmed,2 1629 | prolonged,2 1630 | promiscuous,4 1631 | promised,2 1632 | pronounced,2 1633 | propelled,2 1634 | properly,3 1635 | propositioned,4 1636 | proprietary,5 1637 | proustian,3 1638 | proved,1 1639 | provides,2 1640 | provoked,2 1641 | prowled,1 1642 | pruned,1 1643 | prunes,1 1644 | psychiatric,4 1645 | psychoanalyst,5 1646 | published,2 1647 | pulled,1 1648 | pulsed,1 1649 | pumped,1 1650 | punctuating,4 1651 | punished,2 1652 | purifier,4 1653 | purposely,3 1654 | pursuing,3 1655 | pushed,1 1656 | putting,2 1657 | qanon,3 1658 | quadrennial,4 1659 | qualitatively,5 1660 | quarantined,3 1661 | questioned,2 1662 | questioned,2 1663 | quieted,3 1664 | quieter,3 1665 | quiets,2 1666 | quixote,3 1667 | r.v,2 1668 | r.v.s,2 1669 | racecar,2 1670 | racecars,2 1671 | raced,1 1672 | racism,3 1673 | radiant,3 1674 | radiating,4 1675 | radiology,5 1676 | rallying,3 1677 | randomized,3 1678 | ranged,1 1679 | ranked,1 1680 | ransacked,2 1681 | rapidly,3 1682 | ravaged,2 1683 | raved,1 1684 | reactions,3 1685 | reactor,3 1686 | reactors,3 1687 | readying,3 1688 | reaganism,4 1689 | real,1 1690 | realism,3 1691 | realistic,3 1692 | realize,2 1693 | realized,2 1694 | really,2 1695 | reaped,1 1696 | rearranging,4 1697 | reasoned,2 1698 | reassembled,4 1699 | reassured,3 1700 | reassuring,4 1701 | rebelled,2 1702 | rebellious,4 1703 | recalled,2 1704 | recapped,2 1705 | recently,3 1706 | rechristened,3 1707 | recipients,4 1708 | reclines,2 1709 | reconceived,3 1710 | reconfigured,4 1711 | recovered,3 1712 | recreational,5 1713 | redefined,3 1714 | referenced,3 1715 | refinanced,3 1716 | refined,2 1717 | reformed,2 1718 | reframed,2 1719 | refurbished,3 1720 | refutes,2 1721 | regained,2 1722 | regimes,2 1723 | reichl,2 1724 | reinterpreted,5 1725 | reinvention,4 1726 | reinventions,4 1727 | reissued,3 1728 | rejoined,2 1729 | relaxed,2 1730 | reliance,3 1731 | reliant,3 1732 | relished,2 1733 | remained,2 1734 | remaining,3 1735 | remembered,3 1736 | remixed,2 1737 | remotely,3 1738 | renamed,2 1739 | rendered,2 1740 | renewed,2 1741 | renounced,2 1742 | renowned,2 1743 | reopen,3 1744 | reopening,4 1745 | repealed,2 1746 | repeatedly,4 1747 | reporting,3 1748 | representatives,5 1749 | reproduced,3 1750 | repudiation,5 1751 | repurposed,3 1752 | requires,2 1753 | rescheduled,3 1754 | researcher,3 1755 | resigned,2 1756 | resilience,4 1757 | resilient,4 1758 | resolved,2 1759 | responsibilities,7 1760 | responsibility,7 1761 | retained,2 1762 | retched,1 1763 | retrieved,2 1764 | returned,2 1765 | reunion,3 1766 | reunions,3 1767 | reunited,4 1768 | revealed,2 1769 | revered,2 1770 | reverie,3 1771 | reversed,2 1772 | reviewed,2 1773 | reviled,2 1774 | revived,2 1775 | revolutionized,5 1776 | revolves,2 1777 | rhimes,1 1778 | rhodes,1 1779 | rhymed,1 1780 | rhythms,2 1781 | ribbed,1 1782 | ridged,1 1783 | ridgetop,2 1784 | ringed,1 1785 | rio,2 1786 | riots,2 1787 | ripped,1 1788 | risked,1 1789 | roared,1 1790 | robes,1 1791 | rocinante,4 1792 | rolled,1 1793 | romanced,2 1794 | romped,1 1795 | roofed,1 1796 | roommates,2 1797 | rosewood,2 1798 | roughly,2 1799 | routes,1 1800 | routines,2 1801 | rubio,3 1802 | ruing,2 1803 | ruled,1 1804 | rumored,2 1805 | rushed,1 1806 | rwanda,3 1807 | sacrificed,3 1808 | salesman,2 1809 | salesmen,2 1810 | salespeople,3 1811 | salesperson,3 1812 | sanctioned,2 1813 | sandwiched,2 1814 | sanitized,3 1815 | santiago,4 1816 | saves,1 1817 | savvier,3 1818 | scaled,1 1819 | scandalized,3 1820 | scandinavia,5 1821 | scandinavian,5 1822 | scandinavians,5 1823 | scanned,1 1824 | scatterbrained,3 1825 | scattered,2 1826 | scenarios,4 1827 | schemed,1 1828 | scoffed,1 1829 | scored,1 1830 | scratched,1 1831 | scrawled,1 1832 | screened,1 1833 | screwed,1 1834 | scrolled,1 1835 | scrubbed,1 1836 | searched,1 1837 | seasoned,2 1838 | sectarian,4 1839 | secures,2 1840 | seemingly,3 1841 | seethed,1 1842 | seizures,2 1843 | selected,3 1844 | selfie,2 1845 | sensed,1 1846 | senseless,2 1847 | sensual,3 1848 | sensuous,3 1849 | sensuously,4 1850 | sensuousness,4 1851 | sentenced,2 1852 | sentient,3 1853 | separates,3 1854 | sequestered,3 1855 | sequined,2 1856 | serviced,2 1857 | sewed,1 1858 | sexism,3 1859 | shades,1 1860 | shadowed,2 1861 | shakespeare,2 1862 | shaped,1 1863 | shapeless,2 1864 | sharpened,2 1865 | sharply,2 1866 | shattered,2 1867 | shelled,1 1868 | shellshocked,2 1869 | sheltered,2 1870 | sheltered,2 1871 | shiitake,3 1872 | shimmying,3 1873 | shined,1 1874 | shocked,1 1875 | shooting,2 1876 | shores,1 1877 | short-term,2 1878 | shortchanged,2 1879 | shouldered,2 1880 | shouldn't,2 1881 | shreveport,2 1882 | shuddered,2 1883 | shuttered,2 1884 | sicilian,4 1885 | sideline,2 1886 | sidelines,2 1887 | sidelining,3 1888 | sidestep,2 1889 | sideswiping,3 1890 | sidewalks,2 1891 | sideways,2 1892 | signaled,2 1893 | signatures,3 1894 | significantly,5 1895 | similarly,4 1896 | situated,4 1897 | skepticism,4 1898 | sketched,1 1899 | skewered,2 1900 | slaveholder,3 1901 | slaves,1 1902 | sledgehammer,3 1903 | sledgehammers,3 1904 | sliced,1 1905 | slowed,1 1906 | smaller,2 1907 | smallest,2 1908 | smashed,1 1909 | smelled,1 1910 | smiled,1 1911 | smirked,1 1912 | smithsonian,4 1913 | smoked,1 1914 | smoothed,1 1915 | smothered,2 1916 | smudged,1 1917 | snatched,1 1918 | sneaked,1 1919 | sneezed,1 1920 | snubbed,1 1921 | so-called,2 1922 | soaked,1 1923 | soared,1 1924 | sobriety,4 1925 | socialism,4 1926 | socialized,3 1927 | socially,3 1928 | sociologist,5 1929 | sociology,5 1930 | sockeye,2 1931 | sofia,3 1932 | solved,1 1933 | sophomore,2 1934 | souped,1 1935 | sourced,1 1936 | spaced,1 1937 | spaceship,2 1938 | spaceships,2 1939 | spanned,1 1940 | spared,1 1941 | sparked,1 1942 | sparsely,2 1943 | spawned,1 1944 | specialized,3 1945 | speculates,3 1946 | spelled,1 1947 | spendier,3 1948 | spending,2 1949 | spiced,1 1950 | spiked,1 1951 | spilled,1 1952 | spire,2 1953 | splashed,1 1954 | spokeswoman,3 1955 | sponsored,2 1956 | spontaneity,5 1957 | spontaneous,4 1958 | spoofed,1 1959 | spooked,1 1960 | spores,1 1961 | sprawled,1 1962 | spurned,1 1963 | spurred,1 1964 | sputtered,2 1965 | squarely,2 1966 | squirrel,1 1967 | squirreled,1 1968 | squirrels,1 1969 | stacked,1 1970 | staged,1 1971 | stained,1 1972 | stakeholder,3 1973 | stakeholders,3 1974 | stalemate,2 1975 | stalemates,2 1976 | standardized,3 1977 | starting,2 1978 | startling,3 1979 | statesman,2 1980 | statewide,2 1981 | statuary,4 1982 | steamed,1 1983 | steeped,1 1984 | stefania,4 1985 | stephanie,3 1986 | stiffed,1 1987 | stirred,1 1988 | stocked,1 1989 | stockpile,3 1990 | stonehenge,2 1991 | stonier,3 1992 | stormed,1 1993 | straying,2 1994 | strengthened,2 1995 | strenuously,4 1996 | stretched,1 1997 | stretched,1 1998 | striped,1 1999 | stripes,1 2000 | stroked,1 2001 | strokes,1 2002 | strontium,3 2003 | structured,2 2004 | studying,3 2005 | stuffed,1 2006 | stumped,1 2007 | stunned,1 2008 | stylized,2 2009 | subbed,1 2010 | submerged,2 2011 | subservient,4 2012 | subsidized,3 2013 | substantially,4 2014 | successfully,4 2015 | sucked,1 2016 | suddenly,3 2017 | suffered,2 2018 | summed,1 2019 | supersized,3 2020 | supplier,3 2021 | surfaced,2 2022 | surged,1 2023 | surprisingly,4 2024 | surrealism,4 2025 | surrounded,3 2026 | survived,2 2027 | sustained,2 2028 | swapped,1 2029 | swelled,1 2030 | swiped,1 2031 | swooped,1 2032 | tabbed,1 2033 | tacked,1 2034 | tagged,1 2035 | tailbones,2 2036 | tailed,1 2037 | tailored,2 2038 | tailpipes,2 2039 | talked,1 2040 | taped,1 2041 | tapes,1 2042 | taqueria,4 2043 | tares,1 2044 | tasked,1 2045 | tastemakers,3 2046 | taxed,1 2047 | taxpayers,3 2048 | teammates,2 2049 | teared,1 2050 | techniques,2 2051 | temperatures,4 2052 | tempered,2 2053 | tensed,1 2054 | tensely,2 2055 | terabytes,3 2056 | terrarium,4 2057 | terrier,3 2058 | terrifying,4 2059 | testing,2 2060 | textual,3 2061 | textured,2 2062 | that'll,2 2063 | thawed,1 2064 | theater,2 2065 | theatergoer,4 2066 | theorized,2 2067 | theory,2 2068 | there's,1 2069 | thickened,2 2070 | thoroughfares,3 2071 | threatened,2 2072 | thrilled,1 2073 | thumbed,1 2074 | tiberio,4 2075 | tiered,1 2076 | tightly,2 2077 | tiled,1 2078 | timed,1 2079 | timeline,2 2080 | timelines,2 2081 | timepiece,2 2082 | timepieces,3 2083 | timezone,2 2084 | timezones,2 2085 | tinged,1 2086 | tippecanoe,4 2087 | tipped,1 2088 | tire,2 2089 | toil,2 2090 | tokenized,3 2091 | tolerates,3 2092 | tolstoyan,3 2093 | topped,1 2094 | tortured,2 2095 | totaled,2 2096 | touched,1 2097 | toured,1 2098 | tourism,3 2099 | toyota,3 2100 | traditionally,5 2101 | trafficked,2 2102 | transformed,2 2103 | trapped,1 2104 | traumatized,3 2105 | traveled,2 2106 | traversed,2 2107 | treasured,2 2108 | treasures,2 2109 | treated,2 2110 | trendier,3 2111 | triggered,2 2112 | trilobites,3 2113 | trivia,3 2114 | trivial,3 2115 | tropes,1 2116 | trudged,1 2117 | tucked,1 2118 | tulle,1 2119 | tumultuous,4 2120 | tuned,1 2121 | twerked,1 2122 | typically,4 2123 | ukrainian,4 2124 | ultimately,4 2125 | unadorned,3 2126 | unanchored,3 2127 | unattached,3 2128 | unbothered,3 2129 | unchanged,2 2130 | unconstrained,3 2131 | unconvinced,3 2132 | uncovered,3 2133 | undeniable,5 2134 | undeniably,5 2135 | undermined,3 2136 | undermines,3 2137 | underscored,3 2138 | unearthed,2 2139 | unencumbered,4 2140 | unexplained,3 2141 | unfazed,2 2142 | unfettered,3 2143 | unfiltered,3 2144 | unfinished,3 2145 | unfocused,3 2146 | unfortunately,5 2147 | unfulfilled,3 2148 | uniquely,3 2149 | unites,2 2150 | unleashed,2 2151 | unlicensed,3 2152 | unmatched,2 2153 | unmoored,2 2154 | unnamed,2 2155 | unnerved,2 2156 | unpublished,3 2157 | unresolved,3 2158 | unroped,2 2159 | unsheltered,3 2160 | unsubsidized,4 2161 | untucked,2 2162 | unveiled,2 2163 | unwrapped,2 2164 | updates,2 2165 | uproarious,4 2166 | uproariously,5 2167 | urged,1 2168 | ushered,2 2169 | using,2 2170 | utopia,4 2171 | utopia,4 2172 | utopian,4 2173 | utopias,4 2174 | v.p,2 2175 | vaccines,2 2176 | vaguely,2 2177 | valerie,3 2178 | valeriya,4 2179 | valuable,3 2180 | valuation,4 2181 | valuations,4 2182 | vandalism,4 2183 | variously,4 2184 | varying,3 2185 | ventured,2 2186 | ventured,2 2187 | ventures,2 2188 | versioned,2 2189 | vertebrates,3 2190 | victorian,4 2191 | victorians,4 2192 | video's,3 2193 | videos,3 2194 | vienna,3 2195 | vignettes,2 2196 | vinaigrettes,3 2197 | vindicates,3 2198 | viola,3 2199 | violator,4 2200 | violators,4 2201 | violently,4 2202 | virus's,3 2203 | vivienne,3 2204 | voiced,1 2205 | volumes,2 2206 | voting,2 2207 | voyages,3 2208 | voyeuristic,4 2209 | w,3 2210 | waged,1 2211 | waived,1 2212 | walked,1 2213 | walleye,2 2214 | wandered,2 2215 | waned,1 2216 | wanes,1 2217 | wares,1 2218 | warmed,1 2219 | warned,1 2220 | warped,1 2221 | wasn't,2 2222 | watched,1 2223 | watered,2 2224 | waved,1 2225 | wavered,2 2226 | weakened,2 2227 | weakened,2 2228 | weathered,2 2229 | websites,2 2230 | wedged,1 2231 | weighed,1 2232 | welcomed,2 2233 | weren't,1 2234 | werewolf,2 2235 | werewolves,2 2236 | westphalia,4 2237 | wheeled,1 2238 | whites,1 2239 | wikipedia,5 2240 | wildfire,3 2241 | willingness,3 2242 | wiped,1 2243 | wished,1 2244 | witnessed,2 2245 | wondered,2 2246 | worrying,3 2247 | worsened,2 2248 | wouldn't,2 2249 | wrecked,1 2250 | wrongdoing,3 2251 | yanked,1 2252 | yoked,1 2253 | yosemite,4 2254 | zipped,1 2255 | zoe,2 2256 | zoology,4 2257 | zoomed,1 2258 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "0949c2f9a9e6b5bf0c739360550140f5311980e02c18e4ecc0371f572c4d1419" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": {}, 8 | "sources": [ 9 | { 10 | "name": "pypi", 11 | "url": "https://pypi.org/simple", 12 | "verify_ssl": true 13 | } 14 | ] 15 | }, 16 | "default": { 17 | "aiodns": { 18 | "hashes": [ 19 | "sha256:2b19bc5f97e5c936638d28e665923c093d8af2bf3aa88d35c43417fa25d136a2", 20 | "sha256:946bdfabe743fceeeb093c8a010f5d1645f708a241be849e17edfb0e49e08cd6" 21 | ], 22 | "index": "pypi", 23 | "version": "==3.0.0" 24 | }, 25 | "aiofiles": { 26 | "hashes": [ 27 | "sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937", 28 | "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59" 29 | ], 30 | "index": "pypi", 31 | "version": "==0.8.0" 32 | }, 33 | "aiohttp": { 34 | "hashes": [ 35 | "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3", 36 | "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782", 37 | "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75", 38 | "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf", 39 | "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7", 40 | "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675", 41 | "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1", 42 | "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785", 43 | "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4", 44 | "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf", 45 | "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5", 46 | "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15", 47 | "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca", 48 | "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8", 49 | "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac", 50 | "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8", 51 | "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef", 52 | "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516", 53 | "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700", 54 | "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2", 55 | "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8", 56 | "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0", 57 | "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676", 58 | "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad", 59 | "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155", 60 | "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db", 61 | "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd", 62 | "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091", 63 | "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602", 64 | "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411", 65 | "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93", 66 | "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd", 67 | "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec", 68 | "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51", 69 | "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7", 70 | "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17", 71 | "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d", 72 | "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00", 73 | "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923", 74 | "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440", 75 | "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32", 76 | "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e", 77 | "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1", 78 | "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724", 79 | "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a", 80 | "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8", 81 | "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2", 82 | "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33", 83 | "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b", 84 | "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2", 85 | "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632", 86 | "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b", 87 | "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2", 88 | "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316", 89 | "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74", 90 | "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96", 91 | "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866", 92 | "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44", 93 | "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950", 94 | "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa", 95 | "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c", 96 | "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a", 97 | "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd", 98 | "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd", 99 | "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9", 100 | "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421", 101 | "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2", 102 | "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922", 103 | "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4", 104 | "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237", 105 | "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642", 106 | "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578" 107 | ], 108 | "index": "pypi", 109 | "version": "==3.8.1" 110 | }, 111 | "aiosignal": { 112 | "hashes": [ 113 | "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a", 114 | "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2" 115 | ], 116 | "markers": "python_version >= '3.6'", 117 | "version": "==1.2.0" 118 | }, 119 | "aiosqlite": { 120 | "hashes": [ 121 | "sha256:1df802815bb1e08a26c06d5ea9df589bcb8eec56e5f3378103b0f9b223c6703c", 122 | "sha256:2e915463164efa65b60fd1901aceca829b6090082f03082618afca6fb9c8fdf7" 123 | ], 124 | "index": "pypi", 125 | "version": "==0.16.1" 126 | }, 127 | "async-timeout": { 128 | "hashes": [ 129 | "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15", 130 | "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c" 131 | ], 132 | "markers": "python_version >= '3.6'", 133 | "version": "==4.0.2" 134 | }, 135 | "asyncio": { 136 | "hashes": [ 137 | "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41", 138 | "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de", 139 | "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c", 140 | "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d" 141 | ], 142 | "index": "pypi", 143 | "version": "==3.4.3" 144 | }, 145 | "attrs": { 146 | "hashes": [ 147 | "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4", 148 | "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd" 149 | ], 150 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 151 | "version": "==21.4.0" 152 | }, 153 | "beautifulsoup4": { 154 | "hashes": [ 155 | "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30", 156 | "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" 157 | ], 158 | "index": "pypi", 159 | "version": "==4.11.1" 160 | }, 161 | "blis": { 162 | "hashes": [ 163 | "sha256:148f59a0a47a38ce82e3afc50c709494d5e5a494bef28ce1519c7a17346c645b", 164 | "sha256:1667db8439d9ca41c0c1f0ea954d87462be01b125436c4b264f73603c9fb4e82", 165 | "sha256:3e024f103522e72a27019cfcfe14569522a394f5d651565560a18040fdd69a6c", 166 | "sha256:4a48eeaa506f176bcac306378f5e8063697c93e26d2418fcbe053e8912019090", 167 | "sha256:5d4a81f9438db7a19ac8e64ad41331f65a659ea8f3bb1889a9c2088cfd9fe104", 168 | "sha256:64bef63b1abd5b41819ea53897bdbc03c631a59c1757a9393e6ae0828692f31c", 169 | "sha256:680480dfa16b354f2e4d584edb8d36f0505ed8df12939beee2d161aea7bb3609", 170 | "sha256:76d13dbcd648ca33dfc83569bb219d0696e4f6e5ad00b9f538332a3bdb28ff30", 171 | "sha256:7865e39cac4e10506afc49213938fb7e13bf73ca980c9c20ffad2de4ef858f43", 172 | "sha256:a0183760604b14e8eb671a431d06606594def03c36aaaa2a2e7b7f88382dac76", 173 | "sha256:b5e0acc760daf5c3b45bce44653943e3a04d81c21c5b92213ed51664525dc24e", 174 | "sha256:bead485e5d79d3eb62a8df55618743878fb3cba606aaf926153db5803270b185", 175 | "sha256:cfb7d730fef706f3ea4389196ce5f610f24cc83f828c498a275c12f05f0cf5c4", 176 | "sha256:d6055ced65d6581ab4f1da0d3f6ec14c60512474c5c9b3210c9f30dd7dd1447d", 177 | "sha256:e22145110864bcffb1d52cb57050b67b8a8ecd43c7c0a1ac0bcdb2c85c8bf416", 178 | "sha256:f4109cce38e644e81d923836b34024905d59e88c8fb48b89b420f4d7661cd89f" 179 | ], 180 | "version": "==0.7.7" 181 | }, 182 | "catalogue": { 183 | "hashes": [ 184 | "sha256:535d33ae79ebd21ca298551d85da186ae8b8e1df36b0fb0246da774163ec2d6b", 185 | "sha256:cab4feda641fe05da1e6a1a9d123b0869d5ca324dcd93d4a5c384408ab62e7fb" 186 | ], 187 | "markers": "python_version >= '3.6'", 188 | "version": "==2.0.7" 189 | }, 190 | "cchardet": { 191 | "hashes": [ 192 | "sha256:0b859069bbb9d27c78a2c9eb997e6f4b738db2d7039a03f8792b4058d61d1109", 193 | "sha256:228d2533987c450f39acf7548f474dd6814c446e9d6bd228e8f1d9a2d210f10b", 194 | "sha256:2309ff8fc652b0fc3c0cff5dbb172530c7abb92fe9ba2417c9c0bcf688463c1c", 195 | "sha256:24974b3e40fee9e7557bb352be625c39ec6f50bc2053f44a3d1191db70b51675", 196 | "sha256:273699c4e5cd75377776501b72a7b291a988c6eec259c29505094553ee505597", 197 | "sha256:27a9ba87c9f99e0618e1d3081189b1217a7d110e5c5597b0b7b7c3fedd1c340a", 198 | "sha256:302aa443ae2526755d412c9631136bdcd1374acd08e34f527447f06f3c2ddb98", 199 | "sha256:45456c59ec349b29628a3c6bfb86d818ec3a6fbb7eb72de4ff3bd4713681c0e3", 200 | "sha256:48ba829badef61441e08805cfa474ccd2774be2ff44b34898f5854168c596d4d", 201 | "sha256:50ad671e8d6c886496db62c3bd68b8d55060688c655873aa4ce25ca6105409a1", 202 | "sha256:54341e7e1ba9dc0add4c9d23b48d3a94e2733065c13920e85895f944596f6150", 203 | "sha256:54d0b26fd0cd4099f08fb9c167600f3e83619abefeaa68ad823cc8ac1f7bcc0c", 204 | "sha256:5a25f9577e9bebe1a085eec2d6fdd72b7a9dd680811bba652ea6090fb2ff472f", 205 | "sha256:6b6397d8a32b976a333bdae060febd39ad5479817fabf489e5596a588ad05133", 206 | "sha256:70eeae8aaf61192e9b247cf28969faef00578becd2602526ecd8ae7600d25e0e", 207 | "sha256:80e6faae75ecb9be04a7b258dc4750d459529debb6b8dee024745b7b5a949a34", 208 | "sha256:90086e5645f8a1801350f4cc6cb5d5bf12d3fa943811bb08667744ec1ecc9ccd", 209 | "sha256:a39526c1c526843965cec589a6f6b7c2ab07e3e56dc09a7f77a2be6a6afa4636", 210 | "sha256:b154effa12886e9c18555dfc41a110f601f08d69a71809c8d908be4b1ab7314f", 211 | "sha256:b59ddc615883835e03c26f81d5fc3671fab2d32035c87f50862de0da7d7db535", 212 | "sha256:bd7f262f41fd9caf5a5f09207a55861a67af6ad5c66612043ed0f81c58cdf376", 213 | "sha256:c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf", 214 | "sha256:c6f70139aaf47ffb94d89db603af849b82efdf756f187cdd3e566e30976c519f", 215 | "sha256:c96aee9ebd1147400e608a3eff97c44f49811f8904e5a43069d55603ac4d8c97", 216 | "sha256:ec3eb5a9c475208cf52423524dcaf713c394393e18902e861f983c38eeb77f18", 217 | "sha256:eee4f5403dc3a37a1ca9ab87db32b48dc7e190ef84601068f45397144427cc5e", 218 | "sha256:f16517f3697569822c6d09671217fdeab61dfebc7acb5068634d6b0728b86c0b", 219 | "sha256:f86e0566cb61dc4397297696a4a1b30f6391b50bc52b4f073507a48466b6255a", 220 | "sha256:fdac1e4366d0579fff056d1280b8dc6348be964fda8ebb627c0269e097ab37fa" 221 | ], 222 | "index": "pypi", 223 | "version": "==2.1.7" 224 | }, 225 | "certifi": { 226 | "hashes": [ 227 | "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", 228 | "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" 229 | ], 230 | "version": "==2021.10.8" 231 | }, 232 | "cffi": { 233 | "hashes": [ 234 | "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3", 235 | "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2", 236 | "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636", 237 | "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20", 238 | "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728", 239 | "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27", 240 | "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66", 241 | "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443", 242 | "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0", 243 | "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7", 244 | "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39", 245 | "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605", 246 | "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a", 247 | "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37", 248 | "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029", 249 | "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139", 250 | "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc", 251 | "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df", 252 | "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14", 253 | "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880", 254 | "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2", 255 | "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a", 256 | "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e", 257 | "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474", 258 | "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024", 259 | "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8", 260 | "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0", 261 | "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e", 262 | "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a", 263 | "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e", 264 | "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032", 265 | "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6", 266 | "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e", 267 | "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b", 268 | "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e", 269 | "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954", 270 | "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962", 271 | "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c", 272 | "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4", 273 | "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55", 274 | "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962", 275 | "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023", 276 | "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c", 277 | "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6", 278 | "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8", 279 | "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382", 280 | "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7", 281 | "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc", 282 | "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997", 283 | "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796" 284 | ], 285 | "version": "==1.15.0" 286 | }, 287 | "charset-normalizer": { 288 | "hashes": [ 289 | "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597", 290 | "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df" 291 | ], 292 | "markers": "python_version >= '3.5'", 293 | "version": "==2.0.12" 294 | }, 295 | "click": { 296 | "hashes": [ 297 | "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", 298 | "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" 299 | ], 300 | "markers": "python_version >= '3.7'", 301 | "version": "==8.1.3" 302 | }, 303 | "cymem": { 304 | "hashes": [ 305 | "sha256:04676d696596b0db3f3c5a3936bab12fb6f24278921a6622bb185e61765b2b4d", 306 | "sha256:169725b5816959d34de2545b33fee6a8021a6e08818794a426c5a4f981f17e5e", 307 | "sha256:2aa3fa467d906cd2c27fa0a2e2952dd7925f5fcc7973fab6d815ef6acb25aad8", 308 | "sha256:4749f220e4c06ec44eb10de13794ff0508cdc4f8eff656cf49cab2cdb3122c0c", 309 | "sha256:492084aef23ac2ff3da3729e9d36340bc91a96c2dc8c3a82a1926e384ab52412", 310 | "sha256:4f87fe087f2ae36c3e20e2b1a29d7f76a28c035372d0a97655f26223d975235a", 311 | "sha256:6b0d1a6b0a1296f31fa9e4b7ae5ea49394084ecc883b1ae6fec4844403c43468", 312 | "sha256:700540b68e96a7056d0691d467df2bbaaf0934a3e6fe2383669998cbee19580a", 313 | "sha256:971cf0a8437dfb4185c3049c086e463612fe849efadc0f5cc153fc81c501da7d", 314 | "sha256:a93fba62fe79dbf6fc4d5b6d804a6e114b44af3ff3d40a28833ee39f21bd336b", 315 | "sha256:af3c01e6b20f9e6c07c7d7cdb7f710e49889d3906c9a3e039546ee6636a34b9a", 316 | "sha256:b8e1c18bb00800425576710468299153caad20c64ddb6819d40a6a34e21ee21c", 317 | "sha256:c59293b232b53ebb47427f16cf648e937022f489cff36c11d1d8a1f0075b6609", 318 | "sha256:d7a59cef8f2fa25d12e2c30138f8623acbd43ad2715e730a709e49c5eef8e1b0", 319 | "sha256:dd52d8a81881804625df88453611175ab7e0099b34f52204da1f6940cf2e83c9", 320 | "sha256:ea535f74ab6024e7416f93de564e5c81fb7c0964b96280de66f60aeb05f0cf53" 321 | ], 322 | "version": "==2.0.6" 323 | }, 324 | "docopt": { 325 | "hashes": [ 326 | "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" 327 | ], 328 | "version": "==0.6.2" 329 | }, 330 | "frozenlist": { 331 | "hashes": [ 332 | "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e", 333 | "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08", 334 | "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b", 335 | "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486", 336 | "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78", 337 | "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468", 338 | "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1", 339 | "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953", 340 | "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3", 341 | "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d", 342 | "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a", 343 | "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141", 344 | "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08", 345 | "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07", 346 | "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa", 347 | "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa", 348 | "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868", 349 | "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f", 350 | "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b", 351 | "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b", 352 | "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1", 353 | "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f", 354 | "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478", 355 | "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58", 356 | "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01", 357 | "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8", 358 | "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d", 359 | "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676", 360 | "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274", 361 | "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab", 362 | "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8", 363 | "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24", 364 | "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a", 365 | "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2", 366 | "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f", 367 | "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f", 368 | "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93", 369 | "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1", 370 | "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51", 371 | "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846", 372 | "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5", 373 | "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d", 374 | "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c", 375 | "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e", 376 | "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae", 377 | "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02", 378 | "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0", 379 | "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b", 380 | "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3", 381 | "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b", 382 | "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa", 383 | "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a", 384 | "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d", 385 | "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed", 386 | "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148", 387 | "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9", 388 | "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c", 389 | "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2", 390 | "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951" 391 | ], 392 | "markers": "python_version >= '3.7'", 393 | "version": "==1.3.0" 394 | }, 395 | "idna": { 396 | "hashes": [ 397 | "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", 398 | "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" 399 | ], 400 | "markers": "python_version >= '3'", 401 | "version": "==3.3" 402 | }, 403 | "iso8601": { 404 | "hashes": [ 405 | "sha256:36532f77cc800594e8f16641edae7f1baf7932f05d8e508545b95fc53c6dc85b", 406 | "sha256:906714829fedbc89955d52806c903f2332e3948ed94e31e85037f9e0226b8376" 407 | ], 408 | "version": "==0.1.16" 409 | }, 410 | "jinja2": { 411 | "hashes": [ 412 | "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", 413 | "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" 414 | ], 415 | "index": "pypi", 416 | "version": "==3.1.2" 417 | }, 418 | "langcodes": { 419 | "hashes": [ 420 | "sha256:4d89fc9acb6e9c8fdef70bcdf376113a3db09b67285d9e1d534de6d8818e7e69", 421 | "sha256:794d07d5a28781231ac335a1561b8442f8648ca07cd518310aeb45d6f0807ef6" 422 | ], 423 | "markers": "python_version >= '3.6'", 424 | "version": "==3.3.0" 425 | }, 426 | "markupsafe": { 427 | "hashes": [ 428 | "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", 429 | "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88", 430 | "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5", 431 | "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7", 432 | "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a", 433 | "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603", 434 | "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1", 435 | "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135", 436 | "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247", 437 | "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6", 438 | "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601", 439 | "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77", 440 | "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02", 441 | "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e", 442 | "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63", 443 | "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f", 444 | "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980", 445 | "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b", 446 | "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812", 447 | "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff", 448 | "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96", 449 | "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1", 450 | "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925", 451 | "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a", 452 | "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6", 453 | "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e", 454 | "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f", 455 | "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4", 456 | "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f", 457 | "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3", 458 | "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c", 459 | "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a", 460 | "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417", 461 | "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a", 462 | "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a", 463 | "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37", 464 | "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452", 465 | "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933", 466 | "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a", 467 | "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7" 468 | ], 469 | "markers": "python_version >= '3.7'", 470 | "version": "==2.1.1" 471 | }, 472 | "multidict": { 473 | "hashes": [ 474 | "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60", 475 | "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c", 476 | "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672", 477 | "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51", 478 | "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032", 479 | "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2", 480 | "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b", 481 | "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80", 482 | "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88", 483 | "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a", 484 | "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d", 485 | "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389", 486 | "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c", 487 | "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9", 488 | "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c", 489 | "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516", 490 | "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b", 491 | "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43", 492 | "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee", 493 | "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227", 494 | "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d", 495 | "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae", 496 | "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7", 497 | "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4", 498 | "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9", 499 | "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f", 500 | "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013", 501 | "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9", 502 | "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e", 503 | "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693", 504 | "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a", 505 | "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15", 506 | "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb", 507 | "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96", 508 | "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87", 509 | "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376", 510 | "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658", 511 | "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0", 512 | "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071", 513 | "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360", 514 | "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc", 515 | "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3", 516 | "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba", 517 | "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8", 518 | "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9", 519 | "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2", 520 | "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3", 521 | "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68", 522 | "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8", 523 | "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d", 524 | "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49", 525 | "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608", 526 | "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57", 527 | "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86", 528 | "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20", 529 | "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293", 530 | "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849", 531 | "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937", 532 | "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d" 533 | ], 534 | "markers": "python_version >= '3.7'", 535 | "version": "==6.0.2" 536 | }, 537 | "murmurhash": { 538 | "hashes": [ 539 | "sha256:0b317021f38505d48a9ab89ce32e3a06d7f3f32b06b16ceda8bb93c82eb6aea8", 540 | "sha256:13723aeb2b0f5ebc96bbcf133410481b28bfc7341ce65ae86fc32f02b54a68c1", 541 | "sha256:2165e2d0e8fa806e5aacc7fd9e7e79c633618b23c11aa724192fad5dda6599ef", 542 | "sha256:2f0ef0c80b590b4ad5cd474771f0bed81ecdb1942c549319d6895fa985d96dc3", 543 | "sha256:3d2cc5e8ff2ee28b124bf32a944e31e5e164000233b772d72281f6b62568dc86", 544 | "sha256:400c6a0a96f4fee3a3a384091044acb54f509af8b582d339de329d82ac4585f6", 545 | "sha256:630a396ebd31ca44d89b4eca36fa74ea8aae724adf0afaa2de7680c350b2936f", 546 | "sha256:65d9c6c39bb4c71689963109a1a3519acfa074280a94501c64f5e8d2a0cc257a", 547 | "sha256:6b151ab593132cae6529575515ed664b618095590c08b41beda9f47689408623", 548 | "sha256:78adacef6767250cb7422e36d4e3f0d7359176f17f79fef9d1529656f8e73167", 549 | "sha256:7e0837d2e02186eeac5aacb1e7ce7a8cada0da6fa7b366100e70c7d6c119206f", 550 | "sha256:966d2efec6e01aa32c5774c44906724efca00da3507f06faa11acafb47ea1230", 551 | "sha256:dee39a6f4067cdfefb2156374de230f49405850bc3280eb787e8f6c8daefeb8d", 552 | "sha256:f53f16ef143f93127e9aa920a30cda11a799e172b28508c32fb538a82b487a0c", 553 | "sha256:f7da66418c84982eca3494528b54ded4185d10a6b3231d53e1a2c83751e701e6", 554 | "sha256:fe79b40470885c5accfa7e378a0405407ebf0d8b0cd06a726748dcfd2d8dfa50" 555 | ], 556 | "version": "==1.0.7" 557 | }, 558 | "num2words": { 559 | "hashes": [ 560 | "sha256:0b6e5f53f11d3005787e206d9c03382f459ef048a43c544e3db3b1e05a961548", 561 | "sha256:37cd4f60678f7e1045cdc3adf6acf93c8b41bf732da860f97d301f04e611cc57" 562 | ], 563 | "index": "pypi", 564 | "version": "==0.5.10" 565 | }, 566 | "numpy": { 567 | "hashes": [ 568 | "sha256:07a8c89a04997625236c5ecb7afe35a02af3896c8aa01890a849913a2309c676", 569 | "sha256:08d9b008d0156c70dc392bb3ab3abb6e7a711383c3247b410b39962263576cd4", 570 | "sha256:201b4d0552831f7250a08d3b38de0d989d6f6e4658b709a02a73c524ccc6ffce", 571 | "sha256:2c10a93606e0b4b95c9b04b77dc349b398fdfbda382d2a39ba5a822f669a0123", 572 | "sha256:3ca688e1b9b95d80250bca34b11a05e389b1420d00e87a0d12dc45f131f704a1", 573 | "sha256:48a3aecd3b997bf452a2dedb11f4e79bc5bfd21a1d4cc760e703c31d57c84b3e", 574 | "sha256:568dfd16224abddafb1cbcce2ff14f522abe037268514dd7e42c6776a1c3f8e5", 575 | "sha256:5bfb1bb598e8229c2d5d48db1860bcf4311337864ea3efdbe1171fb0c5da515d", 576 | "sha256:639b54cdf6aa4f82fe37ebf70401bbb74b8508fddcf4797f9fe59615b8c5813a", 577 | "sha256:8251ed96f38b47b4295b1ae51631de7ffa8260b5b087808ef09a39a9d66c97ab", 578 | "sha256:92bfa69cfbdf7dfc3040978ad09a48091143cffb778ec3b03fa170c494118d75", 579 | "sha256:97098b95aa4e418529099c26558eeb8486e66bd1e53a6b606d684d0c3616b168", 580 | "sha256:a3bae1a2ed00e90b3ba5f7bd0a7c7999b55d609e0c54ceb2b076a25e345fa9f4", 581 | "sha256:c34ea7e9d13a70bf2ab64a2532fe149a9aced424cd05a2c4ba662fd989e3e45f", 582 | "sha256:dbc7601a3b7472d559dc7b933b18b4b66f9aa7452c120e87dfb33d02008c8a18", 583 | "sha256:e7927a589df200c5e23c57970bafbd0cd322459aa7b1ff73b7c2e84d6e3eae62", 584 | "sha256:f8c1f39caad2c896bc0018f699882b345b2a63708008be29b1f355ebf6f933fe", 585 | "sha256:f950f8845b480cffe522913d35567e29dd381b0dc7e4ce6a4a9f9156417d2430", 586 | "sha256:fade0d4f4d292b6f39951b6836d7a3c7ef5b2347f3c420cd9820a1d90d794802", 587 | "sha256:fdf3c08bce27132395d3c3ba1503cac12e17282358cb4bddc25cc46b0aca07aa" 588 | ], 589 | "markers": "python_version >= '3.8'", 590 | "version": "==1.22.3" 591 | }, 592 | "packaging": { 593 | "hashes": [ 594 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", 595 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" 596 | ], 597 | "markers": "python_version >= '3.6'", 598 | "version": "==21.3" 599 | }, 600 | "pathy": { 601 | "hashes": [ 602 | "sha256:25fd04cec6393661113086730ce69c789d121bea83ab1aa18452e8fd42faf29a", 603 | "sha256:838624441f799a06b446a657e4ecc9ebc3fdd05234397e044a7c87e8f6e76b1c" 604 | ], 605 | "markers": "python_version >= '3.6'", 606 | "version": "==0.6.1" 607 | }, 608 | "peony-twitter": { 609 | "hashes": [ 610 | "sha256:0bcd8ed166107c40771d31a86b98fb36443ed262fb2fabd0cdc746d4b6aa36ca", 611 | "sha256:8a4b29919df070e387234ed71be3b0efa7068c9caf87fcc17e581320f6748453" 612 | ], 613 | "index": "pypi", 614 | "version": "==2.1.2" 615 | }, 616 | "preshed": { 617 | "hashes": [ 618 | "sha256:3af09f4cfcdaca085fd87dac8107617c4e2bb0ad1458f953841b71e9728287f5", 619 | "sha256:58661bea8d0d63a648588511407285e43d43627e27f836e30819801fb3c75d70", 620 | "sha256:5f99837e7353ce1fa81f0074d4b15f36e0af5af60a2a54d4d11e13cb09768a9e", 621 | "sha256:61b2ea656cb1c38d544cc774f1c2ad1cdab23167b46b35310a7e211d4ba9c6d0", 622 | "sha256:66a71ced487516cf81fd0431a3a843514262ae2f33e9a7688b87562258fa75d5", 623 | "sha256:6c98f725d8478f3ade4ab1ea00f50a92d2d9406d37276bc46fd8bab1d47452c4", 624 | "sha256:87e1add41b7f6236a3ccc34788f47ab8682bc28e8a2d369089062e274494c1a0", 625 | "sha256:8c60a400babfc5b25ba371fda7041be227f7c625e1fb7a43329c2c08fe00a53b", 626 | "sha256:92a8f49d17a63537a8beed48a049b62ef168ca07e0042a5b2bcdf178a1fb5d48", 627 | "sha256:a279c138ad1d5be02547b1545254929588414b01571fe637016367f6a1aa11de", 628 | "sha256:cfe1495fcfc7f479de840ddc4f426dbb55351e218ae5c8712c1269183a4d0060", 629 | "sha256:e03ae3eee961106a517fcd827b5a7c51f7317236b3e665c989054ab8dc381d28", 630 | "sha256:ea8aa9610837e907e8442e79300df0a861bfdb4dcaf026a5d9642a688ad04815", 631 | "sha256:eaffbc71fdb8625f9aac4fe7e19e20bf318d1421ea05903bebe3e6ffef27b587", 632 | "sha256:f92e752a868ea2690e1b38c4b775251a145e0fce36b9bdd972539e8271b7a23a", 633 | "sha256:fb3b7588a3a0f2f2f1bf3fe403361b2b031212b73a37025aea1df7215af3772a" 634 | ], 635 | "version": "==3.0.6" 636 | }, 637 | "pycares": { 638 | "hashes": [ 639 | "sha256:03490be0e7b51a0c8073f877bec347eff31003f64f57d9518d419d9369452837", 640 | "sha256:056330275dea42b7199494047a745e1d9785d39fb8c4cd469dca043532240b80", 641 | "sha256:0aa897543a786daba74ec5e19638bd38b2b432d179a0e248eac1e62de5756207", 642 | "sha256:112e1385c451069112d6b5ea1f9c378544f3c6b89882ff964e9a64be3336d7e4", 643 | "sha256:27a6f09dbfb69bb79609724c0f90dfaa7c215876a7cd9f12d585574d1f922112", 644 | "sha256:2b837315ed08c7df009b67725fe1f50489e99de9089f58ec1b243dc612f172aa", 645 | "sha256:2f5f84fe9f83eab9cd68544b165b74ba6e3412d029cc9ab20098d9c332869fc5", 646 | "sha256:40079ed58efa91747c50aac4edf8ecc7e570132ab57dc0a4030eb0d016a6cab8", 647 | "sha256:439799be4b7576e907139a7f9b3c8a01b90d3e38af4af9cd1fc6c1ee9a42b9e6", 648 | "sha256:4d5da840aa0d9b15fa51107f09270c563a348cb77b14ae9653d0bbdbe326fcc2", 649 | "sha256:4e190471a015f8225fa38069617192e06122771cce2b169ac7a60bfdbd3d4ab2", 650 | "sha256:5632f21d92cc0225ba5ff906e4e5dec415ef0b3df322c461d138190681cd5d89", 651 | "sha256:569eef8597b5e02b1bc4644b9f272160304d8c9985357d7ecfcd054da97c0771", 652 | "sha256:58a41a2baabcd95266db776c510d349d417919407f03510fc87ac7488730d913", 653 | "sha256:6831e963a910b0a8cbdd2750ffcdf5f2bb0edb3f53ca69ff18484de2cc3807c4", 654 | "sha256:71b99b9e041ae3356b859822c511f286f84c8889ec9ed1fbf6ac30fb4da13e4c", 655 | "sha256:8319afe4838e09df267c421ca93da408f770b945ec6217dda72f1f6a493e37e4", 656 | "sha256:8fd1ff17a26bb004f0f6bb902ba7dddd810059096ae0cc3b45e4f5be46315d19", 657 | "sha256:a810d01c9a426ee8b0f36969c2aef5fb966712be9d7e466920beb328cd9cefa3", 658 | "sha256:ad7b28e1b6bc68edd3d678373fa3af84e39d287090434f25055d21b4716b2fc6", 659 | "sha256:b0e50ddc78252f2e2b6b5f2c73e5b2449dfb6bea7a5a0e21dfd1e2bcc9e17382", 660 | "sha256:b266cec81dcea2c3efbbd3dda00af8d7eb0693ae9e47e8706518334b21f27d4a", 661 | "sha256:c000942f5fc64e6e046aa61aa53b629b576ba11607d108909727c3c8f211a157", 662 | "sha256:c6680f7fdc0f1163e8f6c2a11d11b9a0b524a61000d2a71f9ccd410f154fb171", 663 | "sha256:c7eba3c8354b730a54d23237d0b6445a2f68570fa68d0848887da23a3f3b71f3", 664 | "sha256:cbceaa9b2c416aa931627466d3240aecfc905c292c842252e3d77b8630072505", 665 | "sha256:dc942692fca0e27081b7bb414bb971d34609c80df5e953f6d0c62ecc8019acd9", 666 | "sha256:e1489aa25d14dbf7176110ead937c01176ed5a0ebefd3b092bbd6b202241814c", 667 | "sha256:e5a060f5fa90ae245aa99a4a8ad13ec39c2340400de037c7e8d27b081e1a3c64", 668 | "sha256:ec00f3594ee775665167b1a1630edceefb1b1283af9ac57480dba2fb6fd6c360", 669 | "sha256:ed71dc4290d9c3353945965604ef1f6a4de631733e9819a7ebc747220b27e641" 670 | ], 671 | "version": "==4.1.2" 672 | }, 673 | "pycparser": { 674 | "hashes": [ 675 | "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", 676 | "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" 677 | ], 678 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 679 | "version": "==2.21" 680 | }, 681 | "pydantic": { 682 | "hashes": [ 683 | "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd", 684 | "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739", 685 | "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f", 686 | "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840", 687 | "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23", 688 | "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287", 689 | "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62", 690 | "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b", 691 | "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb", 692 | "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820", 693 | "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3", 694 | "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b", 695 | "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e", 696 | "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3", 697 | "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316", 698 | "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b", 699 | "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4", 700 | "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20", 701 | "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e", 702 | "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505", 703 | "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1", 704 | "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833" 705 | ], 706 | "markers": "python_full_version >= '3.6.1'", 707 | "version": "==1.8.2" 708 | }, 709 | "pyparsing": { 710 | "hashes": [ 711 | "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", 712 | "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" 713 | ], 714 | "markers": "python_full_version >= '3.6.8'", 715 | "version": "==3.0.9" 716 | }, 717 | "pypika": { 718 | "hashes": [ 719 | "sha256:316839144d3ad7656405a10cdd26d2181f16bb8ff7e256d616ffb50335ca1fcb" 720 | ], 721 | "version": "==0.44.1" 722 | }, 723 | "python-dateutil": { 724 | "hashes": [ 725 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 726 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 727 | ], 728 | "index": "pypi", 729 | "version": "==2.8.2" 730 | }, 731 | "python-dotenv": { 732 | "hashes": [ 733 | "sha256:b7e3b04a59693c42c36f9ab1cc2acc46fa5df8c78e178fc33a8d4cd05c8d498f", 734 | "sha256:d92a187be61fe482e4fd675b6d52200e7be63a12b724abbf931a40ce4fa92938" 735 | ], 736 | "index": "pypi", 737 | "version": "==0.20.0" 738 | }, 739 | "pytz": { 740 | "hashes": [ 741 | "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4", 742 | "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5" 743 | ], 744 | "version": "==2020.5" 745 | }, 746 | "requests": { 747 | "hashes": [ 748 | "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61", 749 | "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d" 750 | ], 751 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 752 | "version": "==2.27.1" 753 | }, 754 | "setuptools": { 755 | "hashes": [ 756 | "sha256:5534570b9980fc650d45c62877ff603c7aaaf24893371708736cc016bd221c3c", 757 | "sha256:ca6ba73b7fd5f734ae70ece8c4c1f7062b07f3352f6428f6277e27c8f5c64237" 758 | ], 759 | "markers": "python_version >= '3.7'", 760 | "version": "==62.2.0" 761 | }, 762 | "six": { 763 | "hashes": [ 764 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 765 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 766 | ], 767 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 768 | "version": "==1.16.0" 769 | }, 770 | "smart-open": { 771 | "hashes": [ 772 | "sha256:71d14489da58b60ce12fc3ecb823facc59a8b23cd1b58edb97175640350d3a62", 773 | "sha256:75abf758717a92a8f53aa96953f0c245c8cedf8e1e4184903db3659b419d4c17" 774 | ], 775 | "markers": "python_version >= '3.6' and python_version < '4.0'", 776 | "version": "==5.2.1" 777 | }, 778 | "soupsieve": { 779 | "hashes": [ 780 | "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759", 781 | "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d" 782 | ], 783 | "markers": "python_version >= '3.6'", 784 | "version": "==2.3.2.post1" 785 | }, 786 | "spacy": { 787 | "hashes": [ 788 | "sha256:00e99c1c4c655283e1165fdb49a234034af09050d2c68b87fe1fb9d49fbb7aa4", 789 | "sha256:054f6596c0ac52fbdd1690ccdab37d8b286706bfa698abf6c7db3194f0c8dc59", 790 | "sha256:1f1c5b86daee2b1b4e60ce7c9f7a953ea60dbfe6c9c4acf3bc3c0b5a4332d475", 791 | "sha256:2070074032a1f008751cd298d32785fbcc07ec09916fa94e962f81c2a76e4976", 792 | "sha256:3639e0381b70e27841c0ce5e96bd83d7173c8356bcae69163598964b12db2646", 793 | "sha256:521df508803a924df0ea489f286e3a17d5e6eb58a22ea643ddaa544fe5a02226", 794 | "sha256:6ed92892c3d5829ed79fea188f134a9c99ff7bfa60354d023f64a77bacabd761", 795 | "sha256:7dd213224a9429cc190698294607fae0b9b94d06995e155f72c551fec66c39f4", 796 | "sha256:899c857cb6b193783a483fbc46c2ed39cc02f97252489ee6029944e6ca140046", 797 | "sha256:a2fb91e326c7f6682751a194447f6708b957fcad7589f97546986973c70774a7", 798 | "sha256:b3bdbafaf2f084cadffab95df70bc4c99441c13de9c3364078dbd99888736931", 799 | "sha256:c49d50fbe3715adc5741419367b39a468d2556648422f10b6fc4edf38eae2cb3", 800 | "sha256:cae5187f1fdb4f3478ebdb3f299d1f6c7c7f9c4b3cdd3ba9e74a7a3e566ecd7f", 801 | "sha256:df252e1b1d55068600eab4ef3e602eb32487f08704e44a85f82478e56aed9838", 802 | "sha256:ea9cabc081a7732e755dd44fbd818185ac829fcb431273a994af33d65e709281", 803 | "sha256:ebdb29392c7c6d9137127b2a4fee293c8b12e7e69277362bf744f20f3dba7a89" 804 | ], 805 | "index": "pypi", 806 | "version": "==3.3.0" 807 | }, 808 | "spacy-legacy": { 809 | "hashes": [ 810 | "sha256:4f7dcbc4e6c8e8cb4eadbb009f9c0a1a2a67442e0032c8d6776c9470c3759903", 811 | "sha256:dfd58b0cc65b3596cb06f7b95e7bf4fff34668297c59eb179eb050db07b199df" 812 | ], 813 | "markers": "python_version >= '3.6'", 814 | "version": "==3.0.9" 815 | }, 816 | "spacy-loggers": { 817 | "hashes": [ 818 | "sha256:d48c9313a577ad1818da961cf6db71a73fd1e556ae47e6e68d7e28b541d11e18", 819 | "sha256:e75d44f4cf99e6763d7132ca7c8c420e0a92790222a08bc8eb9e24ea2c13536e" 820 | ], 821 | "markers": "python_version >= '3.6'", 822 | "version": "==1.0.2" 823 | }, 824 | "srsly": { 825 | "hashes": [ 826 | "sha256:0d2b92c40f9aa9ba7cb0d8048bd7bfaa13d79d02e9ad6808ca7a8879ba5ed50b", 827 | "sha256:27b3f693296d8a24c306aacd5df38a565ec43214f2aeb51a38170af5dc8b48bc", 828 | "sha256:2d0236feafe3805b384532221596e6749a54d0ff10ba022b333dc1de7aa1b2f7", 829 | "sha256:61e31a72370238387a8ff2a4cebea402227215a1450648b852cad9e511a8b59e", 830 | "sha256:62630dbf20e240610fa64b6717545fcc28d9f18a6085ee93656be000678592a6", 831 | "sha256:82cbf1ec388ed0c16f8062fee30dc54ba8513bd51aae0602570143c6d9218e4c", 832 | "sha256:97a67c8f86ce3207e5e810b998a94ea49d439139adc21d9aadbd0bfab9faa64b", 833 | "sha256:a906c9b1f62c109ddcfaeaf242b19b2ebc5d2f865eb38ef4af35959027c5185b", 834 | "sha256:ab31586fd89e5e5fe6f38664209577b03e85fb834f238c928c15ed3c80ab9c73", 835 | "sha256:acbb14546da9bdf287dfefa0883e793ac563c7868eca32cd65504463980022fa", 836 | "sha256:cffec31143c6e1c783ead11245c08938cae859115d4cb0f4cf423e2895707b74", 837 | "sha256:d1d13dc2133d5a83d30774793adb2c3fd9be905da339e2d54e2c79d55248c1a5", 838 | "sha256:d3b93531f086c516a26f729beac9b052c2ad0528d72e80f9d193de26aa2202be", 839 | "sha256:dbe91f6dd4aea9e819493628356dc715bd9c606486297bb7ca5748e6e003841c", 840 | "sha256:f5ddcc5f36eb318d011c6f142e826c1ca15cb34bd5beab2f21fee62d4ae4d590", 841 | "sha256:fb08416fd6ef04c51fdeefd6d28592b64563b2853243c571a9b0d67403b5be7f" 842 | ], 843 | "markers": "python_version >= '3.6'", 844 | "version": "==2.4.3" 845 | }, 846 | "syllapy": { 847 | "hashes": [ 848 | "sha256:56eeac7f490905643a093d663ad0eec8c0f10344f80f96462414e8530c152cbb", 849 | "sha256:780e58448283e70ea7a0a4dc4db3c8045adbff14aea52c11c4cef7fd1df9e60c" 850 | ], 851 | "index": "pypi", 852 | "version": "==0.7.1" 853 | }, 854 | "thinc": { 855 | "hashes": [ 856 | "sha256:0368c0b279492c0ed0b5b1bc79614e8a335ae1ccc3b1617de46f04eb74dc9a43", 857 | "sha256:0557791e73865fa81f09623dd1f9b98b6d4ab80c63fca5f141530536516aac98", 858 | "sha256:2e315020da85c3791e191fbf37c4a2433f57cf322e27380da0cd4de99d96053b", 859 | "sha256:376b196da6c69c8efaaf26fb99f6997543d80ea4bc5f4ab8600e9d1d521a7dc9", 860 | "sha256:42641f021f4fdc47eaec4b9ff66246b153b9783ef24e2c266bf0f51eccd40db5", 861 | "sha256:489521ca3cca469d67432fc30f14c7c13c17320b179bf8e362319313feaafbb7", 862 | "sha256:5d98e6b3bf220c1068442d09d7c34dd8e52bbdfa43ea32f773747c5909a1c011", 863 | "sha256:70781a0802fbb62a27217ccb80e744e80a5b43f9107ac596c5cd2dc9878ae258", 864 | "sha256:72cec290eb1b54ba6144b05d96f3247ea34eb41c66842961b05b408b93f2ba9b", 865 | "sha256:8ddda1aa1432eef8bab5c83e4cf2020f1ed891771a6dd86729f1aa6078f25f2c", 866 | "sha256:a1f19dd9a7121d332d16446db39b4999abb4f040ce7c71bc86ea05664c86d361", 867 | "sha256:a4276b64a8cd91197f30382c0874f59fa6c94ef533150d845b2f30998aae87cc", 868 | "sha256:a4ee24a6505d63b6f0161f25d0f73f87ab569e0e1a9799a6baca97352788a91f", 869 | "sha256:bed92be72516b1511fecaf616ea31ff1c2e972a7ec4ad991c212f9b2f5c94183", 870 | "sha256:ecd8eab82598b079e901f16567818dc955481326c01d84b819c3c05801b97e07", 871 | "sha256:f9ba4e4dac98e166950e004c87a0f57b8f8796ecd0e3b6973beb6febc20257ff" 872 | ], 873 | "markers": "python_version >= '3.6'", 874 | "version": "==8.0.15" 875 | }, 876 | "tortoise-orm": { 877 | "hashes": [ 878 | "sha256:9729eac3eb58e59c32e2815d5ff1941a71e1eecd63834ae7199b6084c1a454b5", 879 | "sha256:f36aa16d07bab69b141e91f8791c0f878fbcc0acfffa3c671ea10a6ad73c54ed" 880 | ], 881 | "index": "pypi", 882 | "version": "== 0.16.21" 883 | }, 884 | "tqdm": { 885 | "hashes": [ 886 | "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d", 887 | "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6" 888 | ], 889 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 890 | "version": "==4.64.0" 891 | }, 892 | "typer": { 893 | "hashes": [ 894 | "sha256:5646aef0d936b2c761a10393f0384ee6b5c7fe0bb3e5cd710b17134ca1d99cff", 895 | "sha256:e8467f0ebac0c81366c2168d6ad9f888efdfb6d4e1d3d5b4a004f46fa444b5c3" 896 | ], 897 | "markers": "python_version >= '3.6'", 898 | "version": "==0.4.1" 899 | }, 900 | "typing-extensions": { 901 | "hashes": [ 902 | "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708", 903 | "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376" 904 | ], 905 | "markers": "python_version >= '3.7'", 906 | "version": "==4.2.0" 907 | }, 908 | "ujson": { 909 | "hashes": [ 910 | "sha256:f66073e5506e91d204ab0c614a148d5aa938bdbf104751be66f8ad7a222f5f86" 911 | ], 912 | "version": "==1.35" 913 | }, 914 | "unidecode": { 915 | "hashes": [ 916 | "sha256:8e4352fb93d5a735c788110d2e7ac8e8031eb06ccbfe8d324ab71735015f9342", 917 | "sha256:afa04efcdd818a93237574791be9b2817d7077c25a068b00f8cff7baa4e59257" 918 | ], 919 | "index": "pypi", 920 | "version": "==1.3.4" 921 | }, 922 | "urllib3": { 923 | "hashes": [ 924 | "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14", 925 | "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e" 926 | ], 927 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", 928 | "version": "==1.26.9" 929 | }, 930 | "wasabi": { 931 | "hashes": [ 932 | "sha256:217edcb2850993c7931399e7419afccde13539d589e333bc85f9053cf0bb1772", 933 | "sha256:ada6f13e9b70ef26bf95fad0febdfdebe2005e29a08ad58f4bbae383a97298cf" 934 | ], 935 | "version": "==0.9.1" 936 | }, 937 | "yarl": { 938 | "hashes": [ 939 | "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac", 940 | "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8", 941 | "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e", 942 | "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746", 943 | "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98", 944 | "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125", 945 | "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d", 946 | "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d", 947 | "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986", 948 | "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d", 949 | "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec", 950 | "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8", 951 | "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee", 952 | "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3", 953 | "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1", 954 | "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd", 955 | "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b", 956 | "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de", 957 | "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0", 958 | "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8", 959 | "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6", 960 | "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245", 961 | "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23", 962 | "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332", 963 | "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1", 964 | "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c", 965 | "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4", 966 | "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0", 967 | "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8", 968 | "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832", 969 | "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58", 970 | "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6", 971 | "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1", 972 | "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52", 973 | "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92", 974 | "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185", 975 | "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d", 976 | "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d", 977 | "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b", 978 | "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739", 979 | "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05", 980 | "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63", 981 | "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d", 982 | "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa", 983 | "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913", 984 | "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe", 985 | "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b", 986 | "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b", 987 | "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656", 988 | "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1", 989 | "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4", 990 | "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e", 991 | "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63", 992 | "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271", 993 | "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed", 994 | "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d", 995 | "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda", 996 | "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265", 997 | "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f", 998 | "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c", 999 | "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba", 1000 | "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c", 1001 | "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b", 1002 | "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523", 1003 | "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a", 1004 | "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef", 1005 | "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95", 1006 | "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72", 1007 | "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794", 1008 | "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41", 1009 | "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576", 1010 | "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59" 1011 | ], 1012 | "markers": "python_version >= '3.6'", 1013 | "version": "==1.7.2" 1014 | } 1015 | }, 1016 | "develop": { 1017 | "aiohttp": { 1018 | "hashes": [ 1019 | "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3", 1020 | "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782", 1021 | "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75", 1022 | "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf", 1023 | "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7", 1024 | "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675", 1025 | "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1", 1026 | "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785", 1027 | "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4", 1028 | "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf", 1029 | "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5", 1030 | "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15", 1031 | "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca", 1032 | "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8", 1033 | "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac", 1034 | "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8", 1035 | "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef", 1036 | "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516", 1037 | "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700", 1038 | "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2", 1039 | "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8", 1040 | "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0", 1041 | "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676", 1042 | "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad", 1043 | "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155", 1044 | "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db", 1045 | "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd", 1046 | "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091", 1047 | "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602", 1048 | "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411", 1049 | "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93", 1050 | "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd", 1051 | "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec", 1052 | "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51", 1053 | "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7", 1054 | "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17", 1055 | "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d", 1056 | "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00", 1057 | "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923", 1058 | "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440", 1059 | "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32", 1060 | "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e", 1061 | "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1", 1062 | "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724", 1063 | "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a", 1064 | "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8", 1065 | "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2", 1066 | "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33", 1067 | "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b", 1068 | "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2", 1069 | "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632", 1070 | "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b", 1071 | "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2", 1072 | "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316", 1073 | "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74", 1074 | "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96", 1075 | "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866", 1076 | "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44", 1077 | "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950", 1078 | "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa", 1079 | "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c", 1080 | "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a", 1081 | "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd", 1082 | "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd", 1083 | "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9", 1084 | "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421", 1085 | "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2", 1086 | "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922", 1087 | "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4", 1088 | "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237", 1089 | "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642", 1090 | "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578" 1091 | ], 1092 | "index": "pypi", 1093 | "version": "==3.8.1" 1094 | }, 1095 | "aiosignal": { 1096 | "hashes": [ 1097 | "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a", 1098 | "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2" 1099 | ], 1100 | "markers": "python_version >= '3.6'", 1101 | "version": "==1.2.0" 1102 | }, 1103 | "async-timeout": { 1104 | "hashes": [ 1105 | "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15", 1106 | "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c" 1107 | ], 1108 | "markers": "python_version >= '3.6'", 1109 | "version": "==4.0.2" 1110 | }, 1111 | "attrs": { 1112 | "hashes": [ 1113 | "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4", 1114 | "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd" 1115 | ], 1116 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 1117 | "version": "==21.4.0" 1118 | }, 1119 | "charset-normalizer": { 1120 | "hashes": [ 1121 | "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597", 1122 | "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df" 1123 | ], 1124 | "markers": "python_version >= '3.5'", 1125 | "version": "==2.0.12" 1126 | }, 1127 | "coverage": { 1128 | "extras": [ 1129 | "toml" 1130 | ], 1131 | "hashes": [ 1132 | "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9", 1133 | "sha256:07e6db90cd9686c767dcc593dff16c8c09f9814f5e9c51034066cad3373b914d", 1134 | "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf", 1135 | "sha256:1ebf730d2381158ecf3dfd4453fbca0613e16eaa547b4170e2450c9707665ce7", 1136 | "sha256:21b7745788866028adeb1e0eca3bf1101109e2dc58456cb49d2d9b99a8c516e6", 1137 | "sha256:26e2deacd414fc2f97dd9f7676ee3eaecd299ca751412d89f40bc01557a6b1b4", 1138 | "sha256:2c6dbb42f3ad25760010c45191e9757e7dce981cbfb90e42feef301d71540059", 1139 | "sha256:2fea046bfb455510e05be95e879f0e768d45c10c11509e20e06d8fcaa31d9e39", 1140 | "sha256:34626a7eee2a3da12af0507780bb51eb52dca0e1751fd1471d0810539cefb536", 1141 | "sha256:37d1141ad6b2466a7b53a22e08fe76994c2d35a5b6b469590424a9953155afac", 1142 | "sha256:46191097ebc381fbf89bdce207a6c107ac4ec0890d8d20f3360345ff5976155c", 1143 | "sha256:4dd8bafa458b5c7d061540f1ee9f18025a68e2d8471b3e858a9dad47c8d41903", 1144 | "sha256:4e21876082ed887baed0146fe222f861b5815455ada3b33b890f4105d806128d", 1145 | "sha256:58303469e9a272b4abdb9e302a780072c0633cdcc0165db7eec0f9e32f901e05", 1146 | "sha256:5ca5aeb4344b30d0bec47481536b8ba1181d50dbe783b0e4ad03c95dc1296684", 1147 | "sha256:68353fe7cdf91f109fc7d474461b46e7f1f14e533e911a2a2cbb8b0fc8613cf1", 1148 | "sha256:6f89d05e028d274ce4fa1a86887b071ae1755082ef94a6740238cd7a8178804f", 1149 | "sha256:7a15dc0a14008f1da3d1ebd44bdda3e357dbabdf5a0b5034d38fcde0b5c234b7", 1150 | "sha256:8bdde1177f2311ee552f47ae6e5aa7750c0e3291ca6b75f71f7ffe1f1dab3dca", 1151 | "sha256:8ce257cac556cb03be4a248d92ed36904a59a4a5ff55a994e92214cde15c5bad", 1152 | "sha256:8cf5cfcb1521dc3255d845d9dca3ff204b3229401994ef8d1984b32746bb45ca", 1153 | "sha256:8fbbdc8d55990eac1b0919ca69eb5a988a802b854488c34b8f37f3e2025fa90d", 1154 | "sha256:9548f10d8be799551eb3a9c74bbf2b4934ddb330e08a73320123c07f95cc2d92", 1155 | "sha256:96f8a1cb43ca1422f36492bebe63312d396491a9165ed3b9231e778d43a7fca4", 1156 | "sha256:9b27d894748475fa858f9597c0ee1d4829f44683f3813633aaf94b19cb5453cf", 1157 | "sha256:9baff2a45ae1f17c8078452e9e5962e518eab705e50a0aa8083733ea7d45f3a6", 1158 | "sha256:a2a8b8bcc399edb4347a5ca8b9b87e7524c0967b335fbb08a83c8421489ddee1", 1159 | "sha256:acf53bc2cf7282ab9b8ba346746afe703474004d9e566ad164c91a7a59f188a4", 1160 | "sha256:b0be84e5a6209858a1d3e8d1806c46214e867ce1b0fd32e4ea03f4bd8b2e3359", 1161 | "sha256:b31651d018b23ec463e95cf10070d0b2c548aa950a03d0b559eaa11c7e5a6fa3", 1162 | "sha256:b78e5afb39941572209f71866aa0b206c12f0109835aa0d601e41552f9b3e620", 1163 | "sha256:c76aeef1b95aff3905fb2ae2d96e319caca5b76fa41d3470b19d4e4a3a313512", 1164 | "sha256:dd035edafefee4d573140a76fdc785dc38829fe5a455c4bb12bac8c20cfc3d69", 1165 | "sha256:dd6fe30bd519694b356cbfcaca9bd5c1737cddd20778c6a581ae20dc8c04def2", 1166 | "sha256:e5f4e1edcf57ce94e5475fe09e5afa3e3145081318e5fd1a43a6b4539a97e518", 1167 | "sha256:ec6bc7fe73a938933d4178c9b23c4e0568e43e220aef9472c4f6044bfc6dd0f0", 1168 | "sha256:f1555ea6d6da108e1999b2463ea1003fe03f29213e459145e70edbaf3e004aaa", 1169 | "sha256:f5fa5803f47e095d7ad8443d28b01d48c0359484fec1b9d8606d0e3282084bc4", 1170 | "sha256:f7331dbf301b7289013175087636bbaf5b2405e57259dd2c42fdcc9fcc47325e", 1171 | "sha256:f9987b0354b06d4df0f4d3e0ec1ae76d7ce7cbca9a2f98c25041eb79eec766f1", 1172 | "sha256:fd9e830e9d8d89b20ab1e5af09b32d33e1a08ef4c4e14411e559556fd788e6b2" 1173 | ], 1174 | "markers": "python_version >= '3.7'", 1175 | "version": "==6.3.2" 1176 | }, 1177 | "flake8": { 1178 | "hashes": [ 1179 | "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d", 1180 | "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d" 1181 | ], 1182 | "index": "pypi", 1183 | "version": "==4.0.1" 1184 | }, 1185 | "frozenlist": { 1186 | "hashes": [ 1187 | "sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e", 1188 | "sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08", 1189 | "sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b", 1190 | "sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486", 1191 | "sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78", 1192 | "sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468", 1193 | "sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1", 1194 | "sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953", 1195 | "sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3", 1196 | "sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d", 1197 | "sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a", 1198 | "sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141", 1199 | "sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08", 1200 | "sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07", 1201 | "sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa", 1202 | "sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa", 1203 | "sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868", 1204 | "sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f", 1205 | "sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b", 1206 | "sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b", 1207 | "sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1", 1208 | "sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f", 1209 | "sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478", 1210 | "sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58", 1211 | "sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01", 1212 | "sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8", 1213 | "sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d", 1214 | "sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676", 1215 | "sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274", 1216 | "sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab", 1217 | "sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8", 1218 | "sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24", 1219 | "sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a", 1220 | "sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2", 1221 | "sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f", 1222 | "sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f", 1223 | "sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93", 1224 | "sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1", 1225 | "sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51", 1226 | "sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846", 1227 | "sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5", 1228 | "sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d", 1229 | "sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c", 1230 | "sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e", 1231 | "sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae", 1232 | "sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02", 1233 | "sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0", 1234 | "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b", 1235 | "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3", 1236 | "sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b", 1237 | "sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa", 1238 | "sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a", 1239 | "sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d", 1240 | "sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed", 1241 | "sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148", 1242 | "sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9", 1243 | "sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c", 1244 | "sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2", 1245 | "sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951" 1246 | ], 1247 | "markers": "python_version >= '3.7'", 1248 | "version": "==1.3.0" 1249 | }, 1250 | "idna": { 1251 | "hashes": [ 1252 | "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", 1253 | "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" 1254 | ], 1255 | "markers": "python_version >= '3'", 1256 | "version": "==3.3" 1257 | }, 1258 | "iniconfig": { 1259 | "hashes": [ 1260 | "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", 1261 | "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" 1262 | ], 1263 | "version": "==1.1.1" 1264 | }, 1265 | "mccabe": { 1266 | "hashes": [ 1267 | "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", 1268 | "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" 1269 | ], 1270 | "version": "==0.6.1" 1271 | }, 1272 | "multidict": { 1273 | "hashes": [ 1274 | "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60", 1275 | "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c", 1276 | "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672", 1277 | "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51", 1278 | "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032", 1279 | "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2", 1280 | "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b", 1281 | "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80", 1282 | "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88", 1283 | "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a", 1284 | "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d", 1285 | "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389", 1286 | "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c", 1287 | "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9", 1288 | "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c", 1289 | "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516", 1290 | "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b", 1291 | "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43", 1292 | "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee", 1293 | "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227", 1294 | "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d", 1295 | "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae", 1296 | "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7", 1297 | "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4", 1298 | "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9", 1299 | "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f", 1300 | "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013", 1301 | "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9", 1302 | "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e", 1303 | "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693", 1304 | "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a", 1305 | "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15", 1306 | "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb", 1307 | "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96", 1308 | "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87", 1309 | "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376", 1310 | "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658", 1311 | "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0", 1312 | "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071", 1313 | "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360", 1314 | "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc", 1315 | "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3", 1316 | "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba", 1317 | "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8", 1318 | "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9", 1319 | "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2", 1320 | "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3", 1321 | "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68", 1322 | "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8", 1323 | "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d", 1324 | "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49", 1325 | "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608", 1326 | "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57", 1327 | "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86", 1328 | "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20", 1329 | "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293", 1330 | "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849", 1331 | "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937", 1332 | "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d" 1333 | ], 1334 | "markers": "python_version >= '3.7'", 1335 | "version": "==6.0.2" 1336 | }, 1337 | "packaging": { 1338 | "hashes": [ 1339 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", 1340 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" 1341 | ], 1342 | "markers": "python_version >= '3.6'", 1343 | "version": "==21.3" 1344 | }, 1345 | "pluggy": { 1346 | "hashes": [ 1347 | "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", 1348 | "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" 1349 | ], 1350 | "markers": "python_version >= '3.6'", 1351 | "version": "==1.0.0" 1352 | }, 1353 | "py": { 1354 | "hashes": [ 1355 | "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", 1356 | "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" 1357 | ], 1358 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 1359 | "version": "==1.11.0" 1360 | }, 1361 | "pycodestyle": { 1362 | "hashes": [ 1363 | "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20", 1364 | "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" 1365 | ], 1366 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 1367 | "version": "==2.8.0" 1368 | }, 1369 | "pyflakes": { 1370 | "hashes": [ 1371 | "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c", 1372 | "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e" 1373 | ], 1374 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1375 | "version": "==2.4.0" 1376 | }, 1377 | "pyparsing": { 1378 | "hashes": [ 1379 | "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", 1380 | "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" 1381 | ], 1382 | "markers": "python_full_version >= '3.6.8'", 1383 | "version": "==3.0.9" 1384 | }, 1385 | "pytest": { 1386 | "hashes": [ 1387 | "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c", 1388 | "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45" 1389 | ], 1390 | "index": "pypi", 1391 | "version": "==7.1.2" 1392 | }, 1393 | "pytest-aiohttp": { 1394 | "hashes": [ 1395 | "sha256:1d2dc3a304c2be1fd496c0c2fb6b31ab60cd9fc33984f761f951f8ea1eb4ca95", 1396 | "sha256:39ff3a0d15484c01d1436cbedad575c6eafbf0f57cdf76fb94994c97b5b8c5a4" 1397 | ], 1398 | "index": "pypi", 1399 | "version": "==1.0.4" 1400 | }, 1401 | "pytest-asyncio": { 1402 | "hashes": [ 1403 | "sha256:16cf40bdf2b4fb7fc8e4b82bd05ce3fbcd454cbf7b92afc445fe299dabb88213", 1404 | "sha256:7659bdb0a9eb9c6e3ef992eef11a2b3e69697800ad02fb06374a210d85b29f91", 1405 | "sha256:8fafa6c52161addfd41ee7ab35f11836c5a16ec208f93ee388f752bea3493a84" 1406 | ], 1407 | "index": "pypi", 1408 | "version": "==0.18.3" 1409 | }, 1410 | "pytest-cov": { 1411 | "hashes": [ 1412 | "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6", 1413 | "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470" 1414 | ], 1415 | "index": "pypi", 1416 | "version": "==3.0.0" 1417 | }, 1418 | "pytest-mock": { 1419 | "hashes": [ 1420 | "sha256:5112bd92cc9f186ee96e1a92efc84969ea494939c3aead39c50f421c4cc69534", 1421 | "sha256:6cff27cec936bf81dc5ee87f07132b807bcda51106b5ec4b90a04331cba76231" 1422 | ], 1423 | "index": "pypi", 1424 | "version": "==3.7.0" 1425 | }, 1426 | "tomli": { 1427 | "hashes": [ 1428 | "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", 1429 | "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" 1430 | ], 1431 | "markers": "python_version >= '3.7'", 1432 | "version": "==2.0.1" 1433 | }, 1434 | "yarl": { 1435 | "hashes": [ 1436 | "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac", 1437 | "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8", 1438 | "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e", 1439 | "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746", 1440 | "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98", 1441 | "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125", 1442 | "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d", 1443 | "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d", 1444 | "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986", 1445 | "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d", 1446 | "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec", 1447 | "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8", 1448 | "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee", 1449 | "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3", 1450 | "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1", 1451 | "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd", 1452 | "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b", 1453 | "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de", 1454 | "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0", 1455 | "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8", 1456 | "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6", 1457 | "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245", 1458 | "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23", 1459 | "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332", 1460 | "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1", 1461 | "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c", 1462 | "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4", 1463 | "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0", 1464 | "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8", 1465 | "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832", 1466 | "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58", 1467 | "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6", 1468 | "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1", 1469 | "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52", 1470 | "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92", 1471 | "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185", 1472 | "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d", 1473 | "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d", 1474 | "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b", 1475 | "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739", 1476 | "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05", 1477 | "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63", 1478 | "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d", 1479 | "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa", 1480 | "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913", 1481 | "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe", 1482 | "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b", 1483 | "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b", 1484 | "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656", 1485 | "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1", 1486 | "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4", 1487 | "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e", 1488 | "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63", 1489 | "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271", 1490 | "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed", 1491 | "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d", 1492 | "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda", 1493 | "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265", 1494 | "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f", 1495 | "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c", 1496 | "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba", 1497 | "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c", 1498 | "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b", 1499 | "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523", 1500 | "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a", 1501 | "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef", 1502 | "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95", 1503 | "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72", 1504 | "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794", 1505 | "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41", 1506 | "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576", 1507 | "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59" 1508 | ], 1509 | "markers": "python_version >= '3.6'", 1510 | "version": "==1.7.2" 1511 | } 1512 | } 1513 | } 1514 | --------------------------------------------------------------------------------