diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4f92a46 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Tab indentation +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true + +# The indent size used in the `package.json` file cannot be changed +# https://github.com/npm/npm/pull/3180#issuecomment-16336516 +[{.travis.yml,npm-shrinkwrap.json,package.json}] +indent_style = space +indent_size = 4 diff --git a/.gitignore b/.gitignore index 13d7973..9716fa4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +data .idea/ *.pyc *.swp @@ -11,4 +12,7 @@ *.jpg *.xlsx .ipynb_checkpoints -lv/__pycache__/ +__pycache__ +cache +*.zip +scrapy_fs/responses diff --git a/README.md b/README.md index edbdafa..f87818a 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,13 @@ -FarmSubsidy.org Scrapers -======================== +# FarmSubsidy.org Scrapers -[FarmSubsidy](http://farmsubsidy.openspending.org/) is a website that collects the payment data of the Common Agriculture Policy (CAP) which represents about a third of the EU budget. It was run by a group of journalists and activists for the past years. In 2013 the [OpenSpending project](http://openspending.org/) of the [Open Knowledge Foundation](http://okfn.org/) took over responsibility of the website. +[FarmSubsidy](https://farmsubsidy.org) is a platform that collects payment data related to the EU’s Common Agricultural Policy (CAP), which accounts for approximately one-third of the EU budget. This repository focuses on the initial data collection phase, often using web scraping. However, many EU member states now offer bulk data downloads, reducing the need for scraping. -The FarmSubsidy data is mostly scraped from member state websites. The old scrapers were working well, but were running in costly and proprietary software. This year we need Free and Open Source scrapers and this repository will collect these scrapers and coordinate the effort. +## Related Farm Subsidy repositories -Please have a look at the [member state scraper issues](https://github.com/openspending/farmsubsidy-scrapers/issues?labels=memberstate&page=1&state=open). If you can help provide a scraper that would be awesome. +- Backend & cleaning: +- Website: +## Resources -Developer Documentation ------------------------ - -Developer documentation for both website and scrapers can be found at http://farmsubsidy.readthedocs.org. - -[Member states data sites](http://ec.europa.eu/agriculture/cap-funding/beneficiaries/shared/index_en.htm) - - -[Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm) +- **[Member States Data Sites](https://agriculture.ec.europa.eu/common-agricultural-policy/financing-cap/beneficiaries_en):** Links to member states’ CAP payment data portals. +- **[Financial Reports](http://ec.europa.eu/agriculture/cap-funding/financial-reports/index_en.htm):** Summary reports on CAP funding and expenditures. diff --git a/bg/README.md b/bg/README.md deleted file mode 100644 index 1c329c8..0000000 --- a/bg/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Scraper for Bulgaria -========================= - - - -Scraper notebook available. diff --git a/bg/bg_scraper.ipynb b/bg/bg_scraper.ipynb deleted file mode 100644 index 7e0e6f8..0000000 --- a/bg/bg_scraper.ipynb +++ /dev/null @@ -1,448 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import glob\n", - "import math\n", - "from collections import defaultdict\n", - "\n", - "import requests\n", - "from lxml import html\n", - "from tqdm import tqdm\n", - "\n", - "import pandas as pd\n", - "from slugify import slugify" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "YEARS = [2015, 2016]" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "BASE_URL = 'http://iacs-online.dfz.bg/apex/f'\n", - "\n", - "def download_year(year):\n", - "# import pdb; pdb.set_trace()\n", - " print('Initial %d' % year)\n", - " session = requests.Session()\n", - " response = session.get(BASE_URL, params={'p': '100:1:2519959547410070'}) # initial instance\n", - " instance_id = response.url.split(':')[-1]\n", - " print(instance_id)\n", - " rows_per_page = 10000\n", - "\n", - " # 10000000 is max count\n", - " data = '''p_flow_id:100\n", - " p_flow_step_id:1\n", - " p_instance:{instance_id}\n", - " p_page_submission_id:440674281878682\n", - " p_request:APPLY_SEARCH\n", - " p_arg_names:13020010139748916\n", - " p_t01:\n", - " p_arg_names:13024311094768143\n", - " p_t02:\n", - " p_arg_names:13025631311783482\n", - " p_t03:GT\n", - " p_arg_names:13027400751793490\n", - " p_t04:\n", - " p_arg_names:13031001171749357\n", - " p_t05:TOTAL\n", - " p_arg_names:13043117504858129\n", - " p_t06:{rows_per_page}\n", - " p_arg_names:67245119208950917\n", - " p_t07:{year}\n", - " p_md5_checksum:'''.format(instance_id=instance_id, year=year, rows_per_page=rows_per_page).splitlines()\n", - " data = [[k.strip() for k in x.split(':')] for x in data]\n", - " post_data = defaultdict(list)\n", - " for k, v in data:\n", - " post_data[k].append(v)\n", - "# import pdb; pdb.set_trace()\n", - " print('Searching...')\n", - " response = session.post('http://iacs-online.dfz.bg/apex/wwv_flow.accept', data=post_data)\n", - " \n", - " root = html.fromstring(response.content)\n", - " count = root.xpath('//span[@class=\"fielddata\"]/text()')[0]\n", - " result_rows = int(count.split()[-1])\n", - " max_pages = math.ceil(result_rows / rows_per_page)\n", - " print(result_rows, max_pages)\n", - " # http://iacs-online.dfz.bg/apex/f?p=100:1:897845325062580::NO:::\n", - " # http://iacs-online.dfz.bg/apex/f?p=100:1:897845325062580:FLOW_EXCEL_OUTPUT_R7009528473046037_bg\n", - "\n", - " # args = response.url.split('=')[-1]\n", - " # args = args.replace('::NO:::', '')\n", - " # args += ':FLOW_EXCEL_OUTPUT_R7009528473046037_bg'\n", - " # url = '?p=' + args\n", - " print('Downloading...')\n", - " \n", - " page = 1\n", - " for page in tqdm(range(1, max_pages + 1)):\n", - " page_data = {\n", - " 'p': '100:1:{instance_id}:pg_R_7009528473046037:NO'.format(instance_id=instance_id),\n", - " 'pg_min_row': str((page - 1) * rows_per_page + 1),\n", - " 'pg_max_rows': str(rows_per_page),\n", - " 'pg_rows_fetched': str(rows_per_page),\n", - " }\n", - " response = session.get(BASE_URL, params=page_data)\n", - " yield get_rows(response, year)\n", - "\n", - "\n", - "def get_rows(response, year):\n", - " root = html.fromstring(response.content)\n", - " table = root.xpath('//table[@class=\"t3standard\"]')[0]\n", - " rows = table.xpath('./tr')[1:-1]\n", - " mapping = 'recipient_name\tdistrict\tmunicipality\tEAGF DP\tEAGF\tEAFRD - ND\tPublic storage\tTotal\tMeasure\tDescription'.split('\\t')\n", - " for row in rows:\n", - " cells = row.xpath('.//td/text()')\n", - " row = dict(zip(mapping, cells))\n", - " base_info = {\n", - " 'recipient_id': slugify('BG-%s-%s-%s' % (row['recipient_name'], row['municipality'], row['district'])),\n", - " 'recipient_name': row['recipient_name'],\n", - " 'recipient_location': '%s, %s' % (row['municipality'], row['district']),\n", - " 'recipient_postcode': None,\n", - " 'recipient_address': None,\n", - " 'country': 'BG',\n", - " }\n", - " for key in ('EAGF DP', 'EAGF', 'EAFRD - ND'):\n", - " amount = float(row[key].replace(',', ''))\n", - " if amount == 0.0:\n", - " continue\n", - " d = {\n", - " 'amount': amount,\n", - " 'year': year,\n", - " 'currency': 'BGN',\n", - " 'scheme': '%s - %s - %s' % (key, row['Measure'].strip(), row['Description'].strip())\n", - " }\n", - " d.update(base_info)\n", - " yield d\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "!mkdir -p data" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "YEAR = 2017\n", - "\n", - "def get_year(year):\n", - " page_generator = download_year(year)\n", - " for i, row_generator in enumerate(page_generator):\n", - " df = pd.DataFrame(row_generator)\n", - " df.to_csv('data/BG_{}_{}.csv.gz'.format(year, i), index=False, compression='gzip')" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial 2017\n", - "3391091644796414\n", - "Searching...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "\n", - " 0%| | 0/37 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
amountcountrycurrencyrecipient_addressrecipient_idrecipient_locationrecipient_namerecipient_postcodeschemeyear
0356.49BGBGNNaNbg-mekhmed-ademov-omurtag-trgovishcheОмуртаг, ТърговищеМЕХМЕД АДЕМОВNaNEAGF DP - СПП - Схема за преразпределително пл...2017
1507.53BGBGNNaNbg-mekhmed-ademov-omurtag-trgovishcheОмуртаг, ТърговищеМЕХМЕД АДЕМОВNaNEAGF DP - ДПЖ - Схема за обвързано подпомагане...2017
2305.33BGBGNNaNbg-mekhmed-ademov-omurtag-trgovishcheОмуртаг, ТърговищеМЕХМЕД АДЕМОВNaNEAGF DP - Схема за плащане за селскостопански ...2017
31370.33BGBGNNaNbg-mekhmed-adil-alfatar-silistraАлфатар, СилистраМЕХМЕД АДИЛNaNEAGF DP - ДПЖ - Схема за обвързано подпомагане...2017
4162.00BGBGNNaNbg-mekhmed-adil-alfatar-silistraАлфатар, СилистраМЕХМЕД АДИЛNaNEAFRD - ND - Държавна помощ de minimis, съглас...2017
\n", - "" - ], - "text/plain": [ - " amount country currency recipient_address \\\n", - "0 356.49 BG BGN NaN \n", - "1 507.53 BG BGN NaN \n", - "2 305.33 BG BGN NaN \n", - "3 1370.33 BG BGN NaN \n", - "4 162.00 BG BGN NaN \n", - "\n", - " recipient_id recipient_location recipient_name \\\n", - "0 bg-mekhmed-ademov-omurtag-trgovishche Омуртаг, Търговище МЕХМЕД АДЕМОВ \n", - "1 bg-mekhmed-ademov-omurtag-trgovishche Омуртаг, Търговище МЕХМЕД АДЕМОВ \n", - "2 bg-mekhmed-ademov-omurtag-trgovishche Омуртаг, Търговище МЕХМЕД АДЕМОВ \n", - "3 bg-mekhmed-adil-alfatar-silistra Алфатар, Силистра МЕХМЕД АДИЛ \n", - "4 bg-mekhmed-adil-alfatar-silistra Алфатар, Силистра МЕХМЕД АДИЛ \n", - "\n", - " recipient_postcode scheme year \n", - "0 NaN EAGF DP - СПП - Схема за преразпределително пл... 2017 \n", - "1 NaN EAGF DP - ДПЖ - Схема за обвързано подпомагане... 2017 \n", - "2 NaN EAGF DP - Схема за плащане за селскостопански ... 2017 \n", - "3 NaN EAGF DP - ДПЖ - Схема за обвързано подпомагане... 2017 \n", - "4 NaN EAFRD - ND - Държавна помощ de minimis, съглас... 2017 " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.concat([pd.read_csv(fn, compression='gzip') for fn in glob.glob('data/BG_{}_*.csv.gz'.format(YEAR))])\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_csv('bg_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cli.py b/cli.py new file mode 100644 index 0000000..b5285bb --- /dev/null +++ b/cli.py @@ -0,0 +1,36 @@ +""" +CLI commands +""" + +import importlib +import pathlib + +import click + +DEFAULT_YEAR = 2022 +DATA_DIR = "data" + + +@click.command() +@click.argument("country") +@click.argument("year") +def cli(country=None, year=DEFAULT_YEAR): + """Download farm subsidy data for specified country and year.""" + print(f"Downloading data for {country} in {year}") + + try: + # Dynamically import the country module + country_module = importlib.import_module(f"countries.{country}.run") + options = {"data_dir": pathlib.Path(DATA_DIR)} + + return country_module.run(year, **options) + except ImportError: + print(f"Error: Country module '{country}' not found") + return 1 + except Exception as e: + print(f"Error downloading data: {e}") + return 1 + + +if __name__ == "__main__": + cli() diff --git a/it/captcha/__init__.py b/countries/__init__.py similarity index 100% rename from it/captcha/__init__.py rename to countries/__init__.py diff --git a/at/README.md b/countries/at/README.md similarity index 100% rename from at/README.md rename to countries/at/README.md diff --git a/it/captcha/agea_captcha/__init__.py b/countries/at/__init__.py similarity index 100% rename from it/captcha/agea_captcha/__init__.py rename to countries/at/__init__.py diff --git a/countries/at/run.py b/countries/at/run.py new file mode 100644 index 0000000..9bf4eda --- /dev/null +++ b/countries/at/run.py @@ -0,0 +1,90 @@ +""" +Austria +""" + +import csv +import gzip +import json +import os +from pathlib import Path + +from tqdm import tqdm + +from utils.download import download_file + +BASE_URL = "https://www.transparenz.at/export/Export_%s.zip" +DATA_FILE = "Daten.json" +SCHEMA_FILE = "Massnahmen.json" + +mappings = { + "hhj": "year", + "laufnr": "recipient_id", + "zahlungsempfaenger": "recipient_name", + "postleitzahl": "recipient_postcode", + "gemeinde": "recipient_location", +} + +payment_mappings = { + "bezeichnung": "scheme_name", + "textcode": "scheme_code", + "beschreibung": "scheme_description", +} + + +def run(year, data_dir): + """ + Austria data download + """ + url = BASE_URL % year + dl_dir = os.path.join(data_dir, "raw", "at", year) + done_dir = os.path.join(data_dir, "done", "at", year) + download_file(url, dl_dir) + + # prepare schema dict + schema_raw = json.loads( + (Path(dl_dir) / "extracted" / SCHEMA_FILE).read_text(encoding="UTF-8"), + ) + schema = {} + for row in schema_raw: + row_fixed = row.copy() + del row_fixed["textid"] + # apply payment_mappings + for k, v in payment_mappings.items(): + row_fixed[v] = row_fixed[k] + del row_fixed[k] + + schema[row["textid"]] = row_fixed + + raw_data = json.loads( + (Path(dl_dir) / "extracted" / DATA_FILE).read_text(encoding="UTF-8"), + ) + + base_row_data = {"year": year, "country": "AT", "currency": "EUR"} + + Path(done_dir).mkdir(parents=True, exist_ok=True) + with gzip.open(Path(done_dir) / "data.csv.gz", "wt") as f: + fns = ( + list(mappings.values()) + + list(base_row_data.keys()) + + list(payment_mappings.values()) + + ["amount"] + ) + + writer = csv.DictWriter(f, fieldnames=fns) + writer.writeheader() + + for row in tqdm(raw_data, desc="Processing data"): + row_base_done = base_row_data.copy() + for k, v in mappings.items(): + row_base_done[v] = row[k] + + for payment in row["zahlungen"]: + row_done = row_base_done.copy() + row_done["amount"] = ( + payment["betragEgfl"] + + payment["betragEler"] + + payment["betragKofinanzierung"] + ) + row_done.update(schema[payment["textid"]]) + + writer.writerow(row_done) diff --git a/be/README.md b/countries/be/README.md similarity index 72% rename from be/README.md rename to countries/be/README.md index d11ece7..7152ded 100644 --- a/be/README.md +++ b/countries/be/README.md @@ -8,4 +8,6 @@ Scraper for Belgium [Scheme Documentation](http://www.belpa.be/pub/PDF/73_2009_EN.pdf) -Scraper notebook available. +Scraper notebook available: use `./be_scraper.ipynb` (works 2023) + +The scraper run might break from time to time due to IP rate limiting and/or too many requests. \ No newline at end of file diff --git a/be/be_scraper.ipynb b/countries/be/be_scraper.ipynb similarity index 53% rename from be/be_scraper.ipynb rename to countries/be/be_scraper.ipynb index 857e95a..a502d9b 100644 --- a/be/be_scraper.ipynb +++ b/countries/be/be_scraper.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 19, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -16,18 +16,25 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2018\n", + "YEAR = 2021\n", "LIMIT = 1000\n", - "BASE_URL = 'https://www.belpa.be/wsExportDataTable?limit={limit}&offset={offset}&lg=fr&budget_year=54&sort=none&&sortType=ASC&'" + "# From select dropdown value\n", + "BUDGET_YEARS = {\n", + " 2018: 54,\n", + " 2019: 289,\n", + " 2020: 291,\n", + " 2021: 292,\n", + "}\n", + "BASE_URL = 'https://www.belpa.be/wsExportDataTable?limit={limit}&offset={offset}&lg=fr&budget_year=' + str(BUDGET_YEARS[YEAR]) + '&sort=none&&sortType=ASC&'" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -36,21 +43,51 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "0\n", + "1000\n", + "2000\n", + "3000\n", + "4000\n", + "5000\n", + "6000\n", + "7000\n", + "8000\n", + "9000\n", + "10000\n", + "11000\n", + "12000\n", + "13000\n", + "14000\n", + "15000\n", + "16000\n", + "17000\n", + "18000\n", + "19000\n", + "20000\n", + "21000\n", + "22000\n", + "23000\n", + "24000\n", + "25000\n", + "26000\n", + "27000\n", + "28000\n", + "29000\n", + "30000\n", "31000\n", "32000\n", "33000\n", "34000\n", "35000\n", "36000\n", - "37000\n", - "38000\n" + "37000\n" ] } ], @@ -76,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -100,109 +137,107 @@ " \n", " \n", " \n", - " amount\n", - " country\n", - " currency\n", - " recipient_id\n", - " recipient_location\n", " recipient_name\n", " recipient_postcode\n", - " scheme\n", + " recipient_location\n", " year\n", + " scheme\n", + " amount\n", + " currency\n", + " country\n", + " recipient_id\n", " \n", " \n", " \n", " \n", " 0\n", - " -2505.23\n", - " BE\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii1\n", + " 1880.73\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " ELIARD ETIENNE - COULON SABINE EP.\n", - " 5140\n", - " feader\n", - " 2018\n", + " BE\n", + " BE-2021-7996\n", " \n", " \n", " 1\n", - " -2505.23\n", - " BE\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii3\n", + " 3364.43\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " ELIARD ETIENNE - COULON SABINE EP.\n", - " 5140\n", - " vb1_6\n", - " 2018\n", + " BE\n", + " BE-2021-7996\n", " \n", " \n", " 2\n", - " 5840.87\n", - " BE\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii4\n", + " 1741.11\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " LOSSON MICHEL\n", - " 5140\n", - " ii1\n", - " 2018\n", + " BE\n", + " BE-2021-7996\n", " \n", " \n", " 3\n", - " 241.41\n", - " BE\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii7\n", + " 3079.15\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " LOSSON MICHEL\n", - " 5140\n", - " ii10\n", - " 2018\n", + " BE\n", + " BE-2021-7996\n", " \n", " \n", " 4\n", - " 3623.39\n", - " BE\n", + " BLAISE FERNAND\n", + " BE-4800\n", + " Verviers\n", + " 2021\n", + " ii10\n", + " 121.15\n", " EUR\n", - " BE-2018-8045\n", - " Sombreffe\n", - " LOSSON MICHEL\n", - " 5140\n", - " ii3\n", - " 2018\n", + " BE\n", + " BE-2021-7996\n", " \n", " \n", "\n", "" ], "text/plain": [ - " amount country currency recipient_id recipient_location \\\n", - "0 -2505.23 BE EUR BE-2018-8045 Sombreffe \n", - "1 -2505.23 BE EUR BE-2018-8045 Sombreffe \n", - "2 5840.87 BE EUR BE-2018-8045 Sombreffe \n", - "3 241.41 BE EUR BE-2018-8045 Sombreffe \n", - "4 3623.39 BE EUR BE-2018-8045 Sombreffe \n", + " recipient_name recipient_postcode recipient_location year scheme amount \\\n", + "0 BLAISE FERNAND BE-4800 Verviers 2021 ii1 1880.73 \n", + "1 BLAISE FERNAND BE-4800 Verviers 2021 ii3 3364.43 \n", + "2 BLAISE FERNAND BE-4800 Verviers 2021 ii4 1741.11 \n", + "3 BLAISE FERNAND BE-4800 Verviers 2021 ii7 3079.15 \n", + "4 BLAISE FERNAND BE-4800 Verviers 2021 ii10 121.15 \n", "\n", - " recipient_name recipient_postcode scheme year \n", - "0 ELIARD ETIENNE - COULON SABINE EP. 5140 feader 2018 \n", - "1 ELIARD ETIENNE - COULON SABINE EP. 5140 vb1_6 2018 \n", - "2 LOSSON MICHEL 5140 ii1 2018 \n", - "3 LOSSON MICHEL 5140 ii10 2018 \n", - "4 LOSSON MICHEL 5140 ii3 2018 " + " currency country recipient_id \n", + "0 EUR BE BE-2021-7996 \n", + "1 EUR BE BE-2021-7996 \n", + "2 EUR BE BE-2021-7996 \n", + "3 EUR BE BE-2021-7996 \n", + "4 EUR BE BE-2021-7996 " ] }, - "execution_count": 29, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "\n", - "\n", "def parse_data(data):\n", " for amount_key in data['amount'].keys():\n", - " if amount_key.endswith(('_total', '_feaga')):\n", + " if amount_key.endswith(('_total', '_feaga', '_feader')):\n", " # ignore total and total of feaga (sub feaga amounts are present)\n", " continue\n", " scheme = amount_key.replace('field_mnt_', '')\n", @@ -224,13 +259,69 @@ " for x in json.load(f):\n", " yield from parse_data(x)\n", " \n", - "df = pd.DataFrame(get_data(2018))\n", + "df = pd.DataFrame(get_data(YEAR))\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ii4 33446\n", + "ii1 33438\n", + "ii10 28732\n", + "ii3 13186\n", + "iva15 11530\n", + "ii7 9050\n", + "iva18 5366\n", + "iva17 2998\n", + "iva16 2177\n", + "ii6 1820\n", + "iva4 1781\n", + "iii3 1252\n", + "i1 1050\n", + "iva6 438\n", + "vb1_6 340\n", + "iva24 187\n", + "iva9 121\n", + "vb1_2 91\n", + "iva7 87\n", + "iva21 82\n", + "iva1 30\n", + "iva12 25\n", + "vb2_4 20\n", + "iva25 20\n", + "iva2 16\n", + "iva10 11\n", + "iii4 9\n", + "i4 6\n", + "iii2 5\n", + "iii7 4\n", + "iva14 4\n", + "vb3_1 4\n", + "iii10 3\n", + "i7 2\n", + "via_1 1\n", + "iva8 1\n", + "Name: scheme, dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['scheme'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -240,7 +331,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -254,9 +345,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.10.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/be/be_scraper_2017.ipynb b/countries/be/be_scraper_2017.ipynb similarity index 97% rename from be/be_scraper_2017.ipynb rename to countries/be/be_scraper_2017.ipynb index e66ea3b..1cc7c61 100644 --- a/be/be_scraper_2017.ipynb +++ b/countries/be/be_scraper_2017.ipynb @@ -74,11 +74,21 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (101655267.py, line 2)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m Input \u001b[0;32mIn [1]\u001b[0;36m\u001b[0m\n\u001b[0;31m import slugify import slugify\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], "source": [ - "import pandas as pd" + "import pandas as pd\n", + "from slugify import slugify" ] }, { @@ -784,7 +794,7 @@ "df['country'] = 'BE'\n", "\n", "def generate_id(row):\n", - " return u'BE-%s-%s' % (row['recipient_postcode'], row['recipient_name'])\n", + " return u'BE-%s' % slugify(row['recipient_name'], row['recipient_postcode'], row['recipient_name'])\n", "\n", "df['recipient_id'] = df.apply(generate_id, 1)\n", "df.head()" @@ -824,7 +834,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -838,9 +848,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.10.4" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/countries/bg/README.md b/countries/bg/README.md new file mode 100644 index 0000000..df4ef57 --- /dev/null +++ b/countries/bg/README.md @@ -0,0 +1,9 @@ +# Bulgaria + +## How to get the data + +1. Use Chrome to auto translate to English. +2. Visit +3. Select year +4. Go to 'action' -> 'download file' -> 'download csv' +5. Place the resulting file into `data/raw/bg/$year`. diff --git a/cy/README.md b/countries/cy/README.md similarity index 100% rename from cy/README.md rename to countries/cy/README.md diff --git a/countries/cy/cy_scraper.ipynb b/countries/cy/cy_scraper.ipynb new file mode 100644 index 0000000..921fab1 --- /dev/null +++ b/countries/cy/cy_scraper.ipynb @@ -0,0 +1,832 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Download XLS\n", + "\n", + "Go here and download latest XLS:\n", + "\n", + "http://www.capo.gov.cy/capo/capo.nsf/All/1DD288DE04712755C2257E5B001E3F7C?OpenDocument" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# !wget -nc -O cy_2016_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx'\n", + "#!wget -nc -O cy_2017_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/ad063b69ce4d0d06c2258131002aa09f/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202017.xlsx'\n", + "#!wget -nc -O cy_2018_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/E8D55487034C5E1BC2257FC4003E8A41/$file/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY%202018.002.xlsx'" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-09 12:34:12-- https://www.capo.gov.cy/CAPO/CAPO.nsf/0/d58f9e5a29b59458c225813100443d5d/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%B4%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY2022.xlsx\n", + "Auflösen des Hostnamens www.capo.gov.cy (www.capo.gov.cy) … 212.31.118.152\n", + "Verbindungsaufbau zu www.capo.gov.cy (www.capo.gov.cy)|212.31.118.152|:443 … verbunden.\n", + "WARNUNG: Das Zertifikat von www.capo.gov.cy kann nicht geprüft werden, ausgestellt von ‘CN=GeoTrust TLS RSA CA G1,OU=www.digicert.com,O=DigiCert Inc,C=US’:.\n", + " Die Autorität des Zertifikatausstellers kann lokal nicht geprüft werden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 11217119 (11M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", + "Wird in ‘cy_2022_raw.xlsx’ gespeichert.\n", + "\n", + "cy_2022_raw.xlsx 100%[===================>] 10,70M 2,72MB/s in 3,9s \n", + "\n", + "2023-11-09 12:34:16 (2,72 MB/s) - ‘cy_2022_raw.xlsx’ gespeichert [11217119/11217119]\n", + "\n" + ] + } + ], + "source": [ + "!wget --no-check-certificat -O cy_2022_raw.xlsx 'https://www.capo.gov.cy/CAPO/CAPO.nsf/0/d58f9e5a29b59458c225813100443d5d/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%B4%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY2022.xlsx'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "YEAR = 2022" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Πληρωμές - Payments FY2022',\n", + " 'Κωδικοί και Περιγραφή',\n", + " 'Περιγραφή Μέτρων',\n", + " 'Codes and Description',\n", + " 'Description of Measures']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "excel = pd.ExcelFile('cy_%s_raw.xlsx' % YEAR)\n", + "excel.sheet_names" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "SHEET_NAME = 'Πληρωμές δικαιούχων FY {}'.format(YEAR) # means 'Beneficiary Payments'\n", + "#SHEET_NAME = 'Πληρωμές_Δικαιούχων_FY_2018'\n", + "SHEET_NAME = 'Πληρωμές - Payments FY2022'" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Όνομα Δικαιούχου\\nή Αριθμός Αναφοράς Δικαιούχου\\n\\nBeneficiary Name Or Beneficiary Reference NumberΚωδικός Μέτρου\\n\\nMeasure CodeΕυρωπαϊκό Γεωργικό Ταμείο\\n\\nEuropean Agricultural Fund\\n\\n(ΕΓΤΕ = EAGF; \\nΕΓΤΑΑ = EAFRD)Σύντομος Κωδικός Μέτρου\\n\\nShort Measure CodeΕπιδότηση ΕΓΤΕ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAGF\\n(European Contribution)\\n\\n€Επιδότηση ΕΓΤΑΑ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(European Contribution)\\n \\n€Επιδότηση ΕΓΤΑΑ\\n(Εθνική Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(National Contribution)\\n \\n€Σύνολο Επιδότησης ΕΓΤΕ ή ΕΓΤΑΑ\\n\\nTotal subsidy EAGF or EAFRD\\n\\n€Καθαρό Σύνολο ανά Δικαιούχο (Επιδότηση ΕΓΤΕ:\\nΕυρωπαϊκή Συνεισφορά +\\nΕπιδότηση ΕΓΤΑΑ:\\nΕυρωπαϊκή + Εθνική Συνεισφορά)\\n\\nNet Amount per Beneficiary (Subsidy by EAGF:\\nEuropean Contribution +\\nSubsidy by EAFRD:\\nEuropean + National Contribution)\\n\\n€Ταχυδρομικός Κώδικας\\n\\nPostal CodeΔήμος ή\\nΕπαρχία ή\\nΚοινότητα\\n \\n Municipality or\\nDistrict or\\nCommunityΠεριγραφή ΜέτρουDescription of Measure
000000000018280205050000013ΕΓΤΕII.4101.870.00.0101.87NaN4747ΜΟΝΙΑΤΗΣΕνίσχυση για γεωργικές πρακτικές επωφελείς για...Payment for agricultural practices beneficial ...
100000000018280205020010042ΕΓΤΕII.2209.530.00.0209.53NaN4747ΜΟΝΙΑΤΗΣΚαθεστώς ενιαίας ενίσχυσης με βάση την έκταση ...Single area payment scheme - without financial...
200000000018280301025343100ΕΓΤΑΑIV/180.0098.732.9131.60443.04747ΜΟΝΙΑΤΗΣΑγροτική Ανάπτυξη - Μέτρο 13 - 2021 - 75%: Ενι...Rural Development - Measure 13 - 2021 - 75%: P...
3ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ80205020010042ΕΓΤΕII.22000.000.00.02000.00NaN5515ΑΥΓΟΡΟΥΚαθεστώς ενιαίας ενίσχυσης με βάση την έκταση ...Single area payment scheme - without financial...
4ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ80205020010043ΕΓΤΕII.25229.590.00.05229.59NaN5515ΑΥΓΟΡΟΥΚαθεστώς ενιαίας ενίσχυσης με βάση την έκταση ...Single area payment scheme - with financial di...
\n", + "
" + ], + "text/plain": [ + " Όνομα Δικαιούχου\\nή Αριθμός Αναφοράς Δικαιούχου\\n\\nBeneficiary Name Or Beneficiary Reference Number \\\n", + "0 000000000182 \n", + "1 000000000182 \n", + "2 000000000182 \n", + "3 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ \n", + "4 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ \n", + "\n", + " Κωδικός Μέτρου\\n\\nMeasure Code \\\n", + "0 80205050000013 \n", + "1 80205020010042 \n", + "2 80301025343100 \n", + "3 80205020010042 \n", + "4 80205020010043 \n", + "\n", + " Ευρωπαϊκό Γεωργικό Ταμείο\\n\\nEuropean Agricultural Fund\\n\\n(ΕΓΤΕ = EAGF; \\nΕΓΤΑΑ = EAFRD) \\\n", + "0 ΕΓΤΕ \n", + "1 ΕΓΤΕ \n", + "2 ΕΓΤΑΑ \n", + "3 ΕΓΤΕ \n", + "4 ΕΓΤΕ \n", + "\n", + " Σύντομος Κωδικός Μέτρου\\n\\nShort Measure Code \\\n", + "0 II.4 \n", + "1 II.2 \n", + "2 IV/18 \n", + "3 II.2 \n", + "4 II.2 \n", + "\n", + " Επιδότηση ΕΓΤΕ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAGF\\n(European Contribution)\\n\\n€ \\\n", + "0 101.87 \n", + "1 209.53 \n", + "2 0.00 \n", + "3 2000.00 \n", + "4 5229.59 \n", + "\n", + " Επιδότηση ΕΓΤΑΑ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(European Contribution)\\n \\n€ \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 98.7 \n", + "3 0.0 \n", + "4 0.0 \n", + "\n", + " Επιδότηση ΕΓΤΑΑ\\n(Εθνική Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(National Contribution)\\n \\n€ \\\n", + "0 0.0 \n", + "1 0.0 \n", + "2 32.9 \n", + "3 0.0 \n", + "4 0.0 \n", + "\n", + " Σύνολο Επιδότησης ΕΓΤΕ ή ΕΓΤΑΑ\\n\\nTotal subsidy EAGF or EAFRD\\n\\n€ \\\n", + "0 101.87 \n", + "1 209.53 \n", + "2 131.60 \n", + "3 2000.00 \n", + "4 5229.59 \n", + "\n", + " Καθαρό Σύνολο ανά Δικαιούχο (Επιδότηση ΕΓΤΕ:\\nΕυρωπαϊκή Συνεισφορά +\\nΕπιδότηση ΕΓΤΑΑ:\\nΕυρωπαϊκή + Εθνική Συνεισφορά)\\n\\nNet Amount per Beneficiary (Subsidy by EAGF:\\nEuropean Contribution +\\nSubsidy by EAFRD:\\nEuropean + National Contribution)\\n\\n€ \\\n", + "0 NaN \n", + "1 NaN \n", + "2 443.0 \n", + "3 NaN \n", + "4 NaN \n", + "\n", + " Ταχυδρομικός Κώδικας\\n\\nPostal Code \\\n", + "0 4747 \n", + "1 4747 \n", + "2 4747 \n", + "3 5515 \n", + "4 5515 \n", + "\n", + " Δήμος ή\\nΕπαρχία ή\\nΚοινότητα\\n \\n Municipality or\\nDistrict or\\nCommunity \\\n", + "0 ΜΟΝΙΑΤΗΣ \n", + "1 ΜΟΝΙΑΤΗΣ \n", + "2 ΜΟΝΙΑΤΗΣ \n", + "3 ΑΥΓΟΡΟΥ \n", + "4 ΑΥΓΟΡΟΥ \n", + "\n", + " Περιγραφή Μέτρου \\\n", + "0 Ενίσχυση για γεωργικές πρακτικές επωφελείς για... \n", + "1 Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ... \n", + "2 Αγροτική Ανάπτυξη - Μέτρο 13 - 2021 - 75%: Ενι... \n", + "3 Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ... \n", + "4 Καθεστώς ενιαίας ενίσχυσης με βάση την έκταση ... \n", + "\n", + " Description of Measure \n", + "0 Payment for agricultural practices beneficial ... \n", + "1 Single area payment scheme - without financial... \n", + "2 Rural Development - Measure 13 - 2021 - 75%: P... \n", + "3 Single area payment scheme - without financial... \n", + "4 Single area payment scheme - with financial di... " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_excel('cy_%s_raw.xlsx' % YEAR, sheet_name=SHEET_NAME, skiprows=1)\n", + "original_columns = list(df.columns)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Όνομα Δικαιούχου\\nή Αριθμός Αναφοράς Δικαιούχου\\n\\nBeneficiary Name Or Beneficiary Reference Number',\n", + " 'Κωδικός Μέτρου\\n\\nMeasure Code',\n", + " 'Ευρωπαϊκό Γεωργικό Ταμείο\\n\\nEuropean Agricultural Fund\\n\\n(ΕΓΤΕ = EAGF; \\nΕΓΤΑΑ = EAFRD)',\n", + " 'Σύντομος Κωδικός Μέτρου\\n\\nShort Measure Code',\n", + " 'Επιδότηση ΕΓΤΕ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAGF\\n(European Contribution)\\n\\n€',\n", + " 'Επιδότηση ΕΓΤΑΑ\\n(Ευρωπαϊκή Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(European Contribution)\\n \\n€',\n", + " 'Επιδότηση ΕΓΤΑΑ\\n(Εθνική Συνεισφορά)\\n\\nSubsidy by EAFRD\\n(National Contribution)\\n \\n€',\n", + " 'Σύνολο Επιδότησης ΕΓΤΕ ή ΕΓΤΑΑ\\n\\nTotal subsidy EAGF or EAFRD\\n\\n€',\n", + " 'Καθαρό Σύνολο ανά Δικαιούχο (Επιδότηση ΕΓΤΕ:\\nΕυρωπαϊκή Συνεισφορά +\\nΕπιδότηση ΕΓΤΑΑ:\\nΕυρωπαϊκή + Εθνική Συνεισφορά)\\n\\nNet Amount per Beneficiary (Subsidy by EAGF:\\nEuropean Contribution +\\nSubsidy by EAFRD:\\nEuropean + National Contribution)\\n\\n€',\n", + " 'Ταχυδρομικός Κώδικας\\n\\nPostal Code',\n", + " 'Δήμος ή\\nΕπαρχία ή\\nΚοινότητα\\n \\n Municipality or\\nDistrict or\\nCommunity',\n", + " 'Περιγραφή Μέτρου',\n", + " 'Description of Measure']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "original_columns" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "translations = [\n", + " 'recipient_name',\n", + " 'application_code',\n", + " 'programme_type',\n", + " 'scheme_code_short',\n", + " 'EAGF',\n", + " 'EAFRD',\n", + " 'EAFRD national',\n", + " 'total',\n", + " 'total + national',\n", + " 'recipient_postcode',\n", + " 'recipient_location',\n", + " 'scheme_code',\n", + " 'scheme_description',\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_nameapplication_codeprogramme_typescheme_code_shortEAGFEAFRDEAFRD nationaltotaltotal + nationalrecipient_postcoderecipient_locationscheme_descriptionyearscheme
000000000018280205050000013ΕΓΤΕII.4101.870.00.0101.87NaN4747ΜΟΝΙΑΤΗΣPayment for agricultural practices beneficial ...2022II.4 - Payment for agricultural practices bene...
100000000018280205020010042ΕΓΤΕII.2209.530.00.0209.53NaN4747ΜΟΝΙΑΤΗΣSingle area payment scheme - without financial...2022II.2 - Single area payment scheme - without fi...
200000000018280301025343100ΕΓΤΑΑIV/180.0098.732.9131.60443.04747ΜΟΝΙΑΤΗΣRural Development - Measure 13 - 2021 - 75%: P...2022IV/18 - Rural Development - Measure 13 - 2021 ...
3ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ80205020010042ΕΓΤΕII.22000.000.00.02000.00NaN5515ΑΥΓΟΡΟΥSingle area payment scheme - without financial...2022II.2 - Single area payment scheme - without fi...
4ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ80205020010043ΕΓΤΕII.25229.590.00.05229.59NaN5515ΑΥΓΟΡΟΥSingle area payment scheme - with financial di...2022II.2 - Single area payment scheme - with finan...
\n", + "
" + ], + "text/plain": [ + " recipient_name application_code programme_type scheme_code_short \\\n", + "0 000000000182 80205050000013 ΕΓΤΕ II.4 \n", + "1 000000000182 80205020010042 ΕΓΤΕ II.2 \n", + "2 000000000182 80301025343100 ΕΓΤΑΑ IV/18 \n", + "3 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ 80205020010042 ΕΓΤΕ II.2 \n", + "4 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ 80205020010043 ΕΓΤΕ II.2 \n", + "\n", + " EAGF EAFRD EAFRD national total total + national \\\n", + "0 101.87 0.0 0.0 101.87 NaN \n", + "1 209.53 0.0 0.0 209.53 NaN \n", + "2 0.00 98.7 32.9 131.60 443.0 \n", + "3 2000.00 0.0 0.0 2000.00 NaN \n", + "4 5229.59 0.0 0.0 5229.59 NaN \n", + "\n", + " recipient_postcode recipient_location \\\n", + "0 4747 ΜΟΝΙΑΤΗΣ \n", + "1 4747 ΜΟΝΙΑΤΗΣ \n", + "2 4747 ΜΟΝΙΑΤΗΣ \n", + "3 5515 ΑΥΓΟΡΟΥ \n", + "4 5515 ΑΥΓΟΡΟΥ \n", + "\n", + " scheme_description year \\\n", + "0 Payment for agricultural practices beneficial ... 2022 \n", + "1 Single area payment scheme - without financial... 2022 \n", + "2 Rural Development - Measure 13 - 2021 - 75%: P... 2022 \n", + "3 Single area payment scheme - without financial... 2022 \n", + "4 Single area payment scheme - with financial di... 2022 \n", + "\n", + " scheme \n", + "0 II.4 - Payment for agricultural practices bene... \n", + "1 II.2 - Single area payment scheme - without fi... \n", + "2 IV/18 - Rural Development - Measure 13 - 2021 ... \n", + "3 II.2 - Single area payment scheme - without fi... \n", + "4 II.2 - Single area payment scheme - with finan... " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df.rename(columns=dict(zip(original_columns, translations)))\n", + "df['year'] = YEAR\n", + "df = df.drop(columns=['scheme_code'])\n", + "df['scheme'] = df.apply(lambda x: '%s - %s' % (x['scheme_code_short'], x['scheme_description']), 1)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# df_2014 = pd.read_excel('BENEFICIARIES_2014_FINAL_v3.xlsx')\n", + "# original_columns = list(df_2014.columns)\n", + "# translations = ('CODE MEASURE (ABB CODE)',\n", + "# 'CODE EPEXIGISIS MEASURE',\n", + "# 'MEASURE', 'CODE APPLICANT', 'NAME / TRADE NAME', 'EAGF', 'EAFRD', 'POSTAL CODE', 'COMMUNITY / DISTRICT')\n", + "# df_2014 = df_2014.rename(columns=dict(zip(original_columns, translations)))\n", + "# df_2014 = df_2014.rename(columns={\n", + "# 'COMMUNITY / DISTRICT': 'recipient_location',\n", + "# 'POSTAL CODE': 'recipient_postcode',\n", + "# 'NAME / TRADE NAME': 'recipient_name',\n", + "# 'CODE EPEXIGISIS MEASURE': 'scheme'\n", + "# }).drop(['CODE MEASURE (ABB CODE)', 'MEASURE'], 1)\n", + "# df_2014['year'] = 2014\n", + "# df_2014.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# There only ever is one value filled EAGF or EAFRD\n", + "((df[['EAGF', 'EAFRD']].fillna(0.0) == 0.0).sum(1) > 1).any()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_nameprogramme_typescheme_code_shorttotalrecipient_postcoderecipient_locationscheme_descriptionyearschemecountrycurrencyrecipient_idamount
0000000000182ΕΓΤΕII.4101.874747ΜΟΝΙΑΤΗΣPayment for agricultural practices beneficial ...2022II.4 - Payment for agricultural practices bene...CYEURCY-80205050000013101.87
1000000000182ΕΓΤΕII.2209.534747ΜΟΝΙΑΤΗΣSingle area payment scheme - without financial...2022II.2 - Single area payment scheme - without fi...CYEURCY-80205020010042209.53
2000000000182ΕΓΤΑΑIV/18131.604747ΜΟΝΙΑΤΗΣRural Development - Measure 13 - 2021 - 75%: P...2022IV/18 - Rural Development - Measure 13 - 2021 ...CYEURCY-8030102534310098.70
3ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥΕΓΤΕII.22000.005515ΑΥΓΟΡΟΥSingle area payment scheme - without financial...2022II.2 - Single area payment scheme - without fi...CYEURCY-802050200100422000.00
4ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥΕΓΤΕII.25229.595515ΑΥΓΟΡΟΥSingle area payment scheme - with financial di...2022II.2 - Single area payment scheme - with finan...CYEURCY-802050200100435229.59
\n", + "
" + ], + "text/plain": [ + " recipient_name programme_type scheme_code_short total \\\n", + "0 000000000182 ΕΓΤΕ II.4 101.87 \n", + "1 000000000182 ΕΓΤΕ II.2 209.53 \n", + "2 000000000182 ΕΓΤΑΑ IV/18 131.60 \n", + "3 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ ΕΓΤΕ II.2 2000.00 \n", + "4 ΠΑΡΑΣΚΕΥΗ ΓΕΩΡΓΙΟΥ ΕΓΤΕ II.2 5229.59 \n", + "\n", + " recipient_postcode recipient_location \\\n", + "0 4747 ΜΟΝΙΑΤΗΣ \n", + "1 4747 ΜΟΝΙΑΤΗΣ \n", + "2 4747 ΜΟΝΙΑΤΗΣ \n", + "3 5515 ΑΥΓΟΡΟΥ \n", + "4 5515 ΑΥΓΟΡΟΥ \n", + "\n", + " scheme_description year \\\n", + "0 Payment for agricultural practices beneficial ... 2022 \n", + "1 Single area payment scheme - without financial... 2022 \n", + "2 Rural Development - Measure 13 - 2021 - 75%: P... 2022 \n", + "3 Single area payment scheme - without financial... 2022 \n", + "4 Single area payment scheme - with financial di... 2022 \n", + "\n", + " scheme country currency \\\n", + "0 II.4 - Payment for agricultural practices bene... CY EUR \n", + "1 II.2 - Single area payment scheme - without fi... CY EUR \n", + "2 IV/18 - Rural Development - Measure 13 - 2021 ... CY EUR \n", + "3 II.2 - Single area payment scheme - without fi... CY EUR \n", + "4 II.2 - Single area payment scheme - with finan... CY EUR \n", + "\n", + " recipient_id amount \n", + "0 CY-80205050000013 101.87 \n", + "1 CY-80205020010042 209.53 \n", + "2 CY-80301025343100 98.70 \n", + "3 CY-80205020010042 2000.00 \n", + "4 CY-80205020010043 5229.59 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from slugify import slugify\n", + "\n", + "df['country'] = 'CY'\n", + "df['currency'] = 'EUR'\n", + "\n", + "df['recipient_id'] = df.apply(lambda x: 'CY-%s' % x['application_code'] if pd.notnull(x['application_code']) else\n", + " 'CY-%s-%s' % (x['recipient_postcode'], slugify(\n", + " '' if pd.isnull(x['recipient_name']) else x['recipient_name'])), 1)\n", + "\n", + "df['amount'] = df.apply(lambda x: x[['EAGF', 'EAFRD']].sum(), 1)\n", + "df = df.drop(['application_code', 'EAFRD', 'EAGF', 'EAFRD national', 'total + national', ], axis=1)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv('cy_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/cy/cyprus-scraper.ipynb b/countries/cy/cyprus-scraper_old.ipynb similarity index 74% rename from cy/cyprus-scraper.ipynb rename to countries/cy/cyprus-scraper_old.ipynb index d133115..b8f8250 100644 --- a/cy/cyprus-scraper.ipynb +++ b/countries/cy/cyprus-scraper_old.ipynb @@ -13,9 +13,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 07:39:21-- http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx\n", + "Auflösen des Hostnamens www.capo.gov.cy (www.capo.gov.cy) … 212.31.118.152\n", + "Verbindungsaufbau zu www.capo.gov.cy (www.capo.gov.cy)|212.31.118.152|:80 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 302 Found\n", + "Platz: https://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx [folgend]\n", + "--2023-11-03 07:39:21-- https://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx\n", + "Verbindungsaufbau zu www.capo.gov.cy (www.capo.gov.cy)|212.31.118.152|:443 … verbunden.\n", + "FEHLER: Das Zertifikat von www.capo.gov.cy kann nicht geprüft werden, ausgestellt von ‘CN=GeoTrust TLS RSA CA G1,OU=www.digicert.com,O=DigiCert Inc,C=US’:.\n", + " Die Autorität des Zertifikatausstellers kann lokal nicht geprüft werden.\n", + "Verwenden Sie »--no-check-certificate«, um zu dem Server www.capo.gov.cy eine nicht gesicherte Verbindung aufzubauen.\n" + ] + } + ], "source": [ "!wget -nc -O cy_2016_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx'" ] @@ -174,7 +191,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -188,9 +205,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/cz/README.md b/countries/cz/README.md similarity index 100% rename from cz/README.md rename to countries/cz/README.md diff --git a/de/README.md b/countries/de/README.md similarity index 100% rename from de/README.md rename to countries/de/README.md diff --git a/de/convert.py b/countries/de/convert.py similarity index 100% rename from de/convert.py rename to countries/de/convert.py diff --git a/de/de_scraper.py b/countries/de/de_scraper.py similarity index 100% rename from de/de_scraper.py rename to countries/de/de_scraper.py diff --git a/countries/dk/README.md b/countries/dk/README.md new file mode 100644 index 0000000..3f2e79e --- /dev/null +++ b/countries/dk/README.md @@ -0,0 +1,9 @@ +# Denmark + +## How to get the data + +1. Go to https://stoetteoplysninger.naturerhverv.dk/ords/capp/f?p=101:2:14473151364280::::: +2. Select the right year +3. Hit 'search' +4. Download via 'export data to spreadsheet' +5. Import diff --git a/dk/dk_scraper.ipynb b/countries/dk/dk_scraper.ipynb similarity index 100% rename from dk/dk_scraper.ipynb rename to countries/dk/dk_scraper.ipynb diff --git a/ee/README.md b/countries/ee/README.md similarity index 100% rename from ee/README.md rename to countries/ee/README.md diff --git a/ee/estonia-scraper.ipynb b/countries/ee/estonia-scraper.ipynb similarity index 100% rename from ee/estonia-scraper.ipynb rename to countries/ee/estonia-scraper.ipynb diff --git a/es/.gitignore b/countries/es/.gitignore similarity index 100% rename from es/.gitignore rename to countries/es/.gitignore diff --git a/es/README.md b/countries/es/README.md similarity index 100% rename from es/README.md rename to countries/es/README.md diff --git a/es/scraper_es.ipynb b/countries/es/scraper_es.ipynb similarity index 64% rename from es/scraper_es.ipynb rename to countries/es/scraper_es.ipynb index 3be3b2a..d9d62ca 100644 --- a/es/scraper_es.ipynb +++ b/countries/es/scraper_es.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -123,7 +123,36 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 13:34:38-- https://www.fega.gob.es/sites/default/files/files/document/Beneficiarios_comarca_ejercicio_financiero_2022_0.zip\n", + "Auflösen des Hostnamens www.fega.gob.es (www.fega.gob.es) … 93.188.52.193\n", + "Verbindungsaufbau zu www.fega.gob.es (www.fega.gob.es)|93.188.52.193|:443 … verbunden.\n", + "WARNUNG: Das Zertifikat von www.fega.gob.es kann nicht geprüft werden, ausgestellt von ‘CN=AC Firmaprofesional - Secure Web 2022,OU=Security Services,organizationIdentifier=VATES-A62634068,O=Firmaprofesional S.A.,C=ES’:.\n", + " Die Autorität des Zertifikatausstellers kann lokal nicht geprüft werden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 30158332 (29M) [application/zip]\n", + "Wird in ‘downloads/es_2022.zip’ gespeichert.\n", + "\n", + "downloads/es_2022.z 100%[===================>] 28,76M 385KB/s in 42s \n", + "\n", + "2023-11-03 13:35:21 (696 KB/s) - ‘downloads/es_2022.zip’ gespeichert [30158332/30158332]\n", + "\n" + ] + } + ], + "source": [ + "!wget --no-check-certificate -O downloads/es_2022.zip \"https://www.fega.gob.es/sites/default/files/files/document/Beneficiarios_comarca_ejercicio_financiero_2022_0.zip\"" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -132,16 +161,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2018" + "YEAR = 2022" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -169,7 +198,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " \n", " \n", @@ -179,45 +208,45 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", " \n", " \n", " 1\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", " \n", " \n", " 2\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", " \n", " \n", " 3\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", " \n", " \n", "\n", @@ -229,17 +258,17 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 " + " MEDIDA IMPORTE year \n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 " ] }, - "execution_count": 11, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -253,16 +282,16 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1910099" + "2734536" ] }, - "execution_count": 12, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -273,22 +302,22 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BENEFICIARIO object\n", - "PROVINCIA object\n", - "MUNICIPIO object\n", - "MEDIDA object\n", - "IMPORTE_EUROS float64\n", - "year int64\n", + "BENEFICIARIO object\n", + "PROVINCIA object\n", + "MUNICIPIO object\n", + "MEDIDA object\n", + "IMPORTE object\n", + "year int64\n", "dtype: object" ] }, - "execution_count": 13, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -327,7 +356,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " \n", " \n", @@ -337,45 +366,45 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", " \n", " \n", " 1\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", " \n", " \n", " 2\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", " \n", " \n", " 3\n", " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", " \n", " \n", "\n", @@ -387,17 +416,17 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 " + " MEDIDA IMPORTE year \n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 " ] }, - "execution_count": 14, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -411,16 +440,16 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1910099" + "2734536" ] }, - "execution_count": 15, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -431,16 +460,16 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ - "df['amount'] = pd.to_numeric(df['IMPORTE_EUROS'])" + "df['amount'] = pd.to_numeric(df['IMPORTE'].str.replace(',','.'))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -468,7 +497,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " amount\n", " recipient_postcode\n", @@ -480,10 +509,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", - " 9861.19\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", + " 10575.45\n", " 1502\n", " \n", " \n", @@ -491,10 +520,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", - " 10810.00\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", + " 2653.20\n", " 1502\n", " \n", " \n", @@ -502,10 +531,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", - " 4775.80\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", + " 5525.06\n", " 1502\n", " \n", " \n", @@ -513,22 +542,22 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", - " 326.75\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", + " 607.66\n", " 1502\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", - " 2799.68\n", - " 2705\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", + " 11994.60\n", + " 1502\n", " \n", " \n", "\n", @@ -540,24 +569,24 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \\\n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 \n", + " MEDIDA IMPORTE year \\\n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 \n", "\n", " amount recipient_postcode \n", - "0 9861.19 1502 \n", - "1 10810.00 1502 \n", - "2 4775.80 1502 \n", - "3 326.75 1502 \n", - "4 2799.68 2705 " + "0 10575.45 1502 \n", + "1 2653.20 1502 \n", + "2 5525.06 1502 \n", + "3 607.66 1502 \n", + "4 11994.60 1502 " ] }, - "execution_count": 18, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -569,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -597,7 +626,7 @@ " PROVINCIA\n", " MUNICIPIO\n", " MEDIDA\n", - " IMPORTE_EUROS\n", + " IMPORTE\n", " year\n", " amount\n", " recipient_postcode\n", @@ -610,10 +639,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.1 Régimen de pago básico\n", - " 9861.19\n", - " 2018\n", - " 9861.19\n", + " II.1 Régimen de pago básico\n", + " 10575,45\n", + " 2022\n", + " 10575.45\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", @@ -622,10 +651,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.7 Ayuda asociada voluntaria\n", - " 10810.00\n", - " 2018\n", - " 10810.00\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2653,2\n", + " 2022\n", + " 2653.20\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", @@ -634,10 +663,10 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 4775.80\n", - " 2018\n", - " 4775.80\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 5525,06\n", + " 2022\n", + " 5525.06\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", @@ -646,24 +675,24 @@ " A BOUCIÑA S.C.\n", " A Coruña\n", " 1502 - OCCIDENTAL\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 326.75\n", - " 2018\n", - " 326.75\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 607,66\n", + " 2022\n", + " 607.66\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " \n", " \n", " 4\n", - " A CABADA SC\n", - " Lugo\n", - " 2705 - SUR\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2799.68\n", - " 2018\n", - " 2799.68\n", - " 2705\n", - " SUR, Lugo\n", + " A BOUCIÑA S.C.\n", + " A Coruña\n", + " 1502 - OCCIDENTAL\n", + " II.7 Ayuda asociada voluntaria\n", + " 11994,6\n", + " 2022\n", + " 11994.60\n", + " 1502\n", + " OCCIDENTAL, A Coruña\n", " \n", " \n", "\n", @@ -675,24 +704,24 @@ "1 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "2 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "3 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", - "4 A CABADA SC Lugo 2705 - SUR \n", + "4 A BOUCIÑA S.C. A Coruña 1502 - OCCIDENTAL \n", "\n", - " MEDIDA IMPORTE_EUROS year \\\n", - "0 II.1 Régimen de pago básico 9861.19 2018 \n", - "1 II.7 Ayuda asociada voluntaria 10810.00 2018 \n", - "2 II.4 Pago para prácticas agrícolas beneficio... 4775.80 2018 \n", - "3 II.10 Reembolso de créditos prorrogados del ... 326.75 2018 \n", - "4 II.4 Pago para prácticas agrícolas beneficio... 2799.68 2018 \n", + " MEDIDA IMPORTE year \\\n", + "0 II.1 Régimen de pago básico 10575,45 2022 \n", + "1 IV/A.18 Ayuda a zonas con limitaciones natura... 2653,2 2022 \n", + "2 II.4 Pago para prácticas agrícolas beneficios... 5525,06 2022 \n", + "3 II.10 Reembolso de créditos prorrogados del e... 607,66 2022 \n", + "4 II.7 Ayuda asociada voluntaria 11994,6 2022 \n", "\n", " amount recipient_postcode recipient_location \n", - "0 9861.19 1502 OCCIDENTAL, A Coruña \n", - "1 10810.00 1502 OCCIDENTAL, A Coruña \n", - "2 4775.80 1502 OCCIDENTAL, A Coruña \n", - "3 326.75 1502 OCCIDENTAL, A Coruña \n", - "4 2799.68 2705 SUR, Lugo " + "0 10575.45 1502 OCCIDENTAL, A Coruña \n", + "1 2653.20 1502 OCCIDENTAL, A Coruña \n", + "2 5525.06 1502 OCCIDENTAL, A Coruña \n", + "3 607.66 1502 OCCIDENTAL, A Coruña \n", + "4 11994.60 1502 OCCIDENTAL, A Coruña " ] }, - "execution_count": 19, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -704,7 +733,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 59, "metadata": {}, "outputs": [ { @@ -743,9 +772,9 @@ " \n", " 0\n", " A BOUCIÑA S.C.\n", - " II.1 Régimen de pago básico\n", - " 2018\n", - " 9861.19\n", + " II.1 Régimen de pago básico\n", + " 2022\n", + " 10575.45\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -755,9 +784,9 @@ " \n", " 1\n", " A BOUCIÑA S.C.\n", - " II.7 Ayuda asociada voluntaria\n", - " 2018\n", - " 10810.00\n", + " IV/A.18 Ayuda a zonas con limitaciones natura...\n", + " 2022\n", + " 2653.20\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -767,9 +796,9 @@ " \n", " 2\n", " A BOUCIÑA S.C.\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2018\n", - " 4775.80\n", + " II.4 Pago para prácticas agrícolas beneficios...\n", + " 2022\n", + " 5525.06\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -779,9 +808,9 @@ " \n", " 3\n", " A BOUCIÑA S.C.\n", - " II.10 Reembolso de créditos prorrogados del ...\n", - " 2018\n", - " 326.75\n", + " II.10 Reembolso de créditos prorrogados del e...\n", + " 2022\n", + " 607.66\n", " 1502\n", " OCCIDENTAL, A Coruña\n", " ES\n", @@ -790,15 +819,15 @@ " \n", " \n", " 4\n", - " A CABADA SC\n", - " II.4 Pago para prácticas agrícolas beneficio...\n", - " 2018\n", - " 2799.68\n", - " 2705\n", - " SUR, Lugo\n", + " A BOUCIÑA S.C.\n", + " II.7 Ayuda asociada voluntaria\n", + " 2022\n", + " 11994.60\n", + " 1502\n", + " OCCIDENTAL, A Coruña\n", " ES\n", " EUR\n", - " ES-2705-a-cabada-sc\n", + " ES-1502-a-boucina-s-c\n", " \n", " \n", "\n", @@ -806,28 +835,28 @@ ], "text/plain": [ " recipient_name scheme year \\\n", - "0 A BOUCIÑA S.C. II.1 Régimen de pago básico 2018 \n", - "1 A BOUCIÑA S.C. II.7 Ayuda asociada voluntaria 2018 \n", - "2 A BOUCIÑA S.C. II.4 Pago para prácticas agrícolas beneficio... 2018 \n", - "3 A BOUCIÑA S.C. II.10 Reembolso de créditos prorrogados del ... 2018 \n", - "4 A CABADA SC II.4 Pago para prácticas agrícolas beneficio... 2018 \n", + "0 A BOUCIÑA S.C. II.1 Régimen de pago básico 2022 \n", + "1 A BOUCIÑA S.C. IV/A.18 Ayuda a zonas con limitaciones natura... 2022 \n", + "2 A BOUCIÑA S.C. II.4 Pago para prácticas agrícolas beneficios... 2022 \n", + "3 A BOUCIÑA S.C. II.10 Reembolso de créditos prorrogados del e... 2022 \n", + "4 A BOUCIÑA S.C. II.7 Ayuda asociada voluntaria 2022 \n", "\n", " amount recipient_postcode recipient_location country currency \\\n", - "0 9861.19 1502 OCCIDENTAL, A Coruña ES EUR \n", - "1 10810.00 1502 OCCIDENTAL, A Coruña ES EUR \n", - "2 4775.80 1502 OCCIDENTAL, A Coruña ES EUR \n", - "3 326.75 1502 OCCIDENTAL, A Coruña ES EUR \n", - "4 2799.68 2705 SUR, Lugo ES EUR \n", + "0 10575.45 1502 OCCIDENTAL, A Coruña ES EUR \n", + "1 2653.20 1502 OCCIDENTAL, A Coruña ES EUR \n", + "2 5525.06 1502 OCCIDENTAL, A Coruña ES EUR \n", + "3 607.66 1502 OCCIDENTAL, A Coruña ES EUR \n", + "4 11994.60 1502 OCCIDENTAL, A Coruña ES EUR \n", "\n", " recipient_id \n", "0 ES-1502-a-boucina-s-c \n", "1 ES-1502-a-boucina-s-c \n", "2 ES-1502-a-boucina-s-c \n", "3 ES-1502-a-boucina-s-c \n", - "4 ES-2705-a-cabada-sc " + "4 ES-1502-a-boucina-s-c " ] }, - "execution_count": 20, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -839,7 +868,7 @@ " 'BENEFICIARIO': 'recipient_name',\n", " 'MEDIDA': 'scheme',\n", "})\n", - "df = df.drop(['PROVINCIA', 'MUNICIPIO', 'IMPORTE_EUROS'], 1)\n", + "df = df.drop(['PROVINCIA', 'MUNICIPIO', 'IMPORTE'], axis=1)\n", "df['country'] = 'ES'\n", "df['currency'] = 'EUR'\n", "df['recipient_id'] = df.apply(lambda x: 'ES-%s-%s' % (x['recipient_postcode'], slugify(x['recipient_name'])), 1)\n", @@ -848,17 +877,24 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "df.to_csv('es_{YEAR}.csv.gz'.format(YEAR=YEAR), index=False, encoding='utf-8', compression='gzip')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -872,9 +908,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/countries/fi/README.md b/countries/fi/README.md new file mode 100644 index 0000000..12344c7 --- /dev/null +++ b/countries/fi/README.md @@ -0,0 +1,7 @@ +# Finland + +## How to get the data + +1. Visit +2. In the sheet, click 'in English' +3. Click 'download csv' diff --git a/fr/README.md b/countries/fr/README.md similarity index 100% rename from fr/README.md rename to countries/fr/README.md diff --git a/fr/fr_scraper.ipynb b/countries/fr/fr_scraper.ipynb similarity index 63% rename from fr/fr_scraper.ipynb rename to countries/fr/fr_scraper.ipynb index 9d3feb4..005eb9b 100644 --- a/fr/fr_scraper.ipynb +++ b/countries/fr/fr_scraper.ipynb @@ -6,12 +6,14 @@ "source": [ "## Download\n", "\n", - "[Download from here](https://www2.telepac.agriculture.gouv.fr/telepac/tbp/accueil/accueil.action)" + "Download data from [here](https://www2.telepac.agriculture.gouv.fr/telepac/tbp/accueil/accueil.action)\n", + "\n", + "Link to 2022 data: https://www2.telepac.agriculture.gouv.fr/telepac/tbp/feader/afficher.action" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -20,16 +22,16 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "YEAR = 2017" + "YEAR = 2022" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -66,40 +68,40 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594,16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733,67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647,00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5,48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2,21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452,93\n", " \n", " \n", "\n", @@ -113,27 +115,27 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " Libellé rubrique Montant rubrique \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000,00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733,67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000,00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000,00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000,00 " + " Libellé rubrique Montant rubrique \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594,16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647,00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5,48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2,21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452,93 " ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_csv('fr_{YEAR}_raw.csv.gz'.format(YEAR=YEAR), delimiter=';', encoding='latin1')\n", + "df = pd.read_csv('fr_{YEAR}.csv'.format(YEAR=YEAR), delimiter=';', encoding='latin1')\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -146,7 +148,7 @@ " ' Montant rubrique']" ] }, - "execution_count": 7, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -157,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -195,45 +197,45 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594,16\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733,67\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647,00\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5,48\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2,21\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452,93\n", + " 452.93\n", " \n", " \n", "\n", @@ -247,15 +249,15 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " Libellé rubrique Montant rubrique amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733,67 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 " + " Libellé rubrique Montant rubrique amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594,16 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647,00 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5,48 -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2,21 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452,93 452.93 " ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -348,78 +350,28 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Nom / Raison sociale\n", - "SAS SUCRIERE DE LA REUNION 31479350.88\n", - "XXX 24993731.92\n", - "LACTALIS INGREDIENTS 21447502.24\n", - "SUCRERIE DE BOIS ROUGE 13249000.00\n", - "SA GARDEL SA 12539167.92\n", - "URCOOPA 12360193.14\n", - "LAITA 8785021.83\n", - "CERAFEL (AOP) 8334606.22\n", - "ARIBEV 6757203.13\n", - "COOPERATIVE MARAICHERE DE L'OUEST 6158949.54\n", - "SCA OCEANE 6058097.15\n", - "CENTRE NAT INTERPRO ECONOMIE LAITIERE 5547466.69\n", - "AMIV 5429241.74\n", - "CONSEIL INTERPROF DU VIN DE BORDEAUX 5274083.26\n", - "LES VERGERS DE BLUE WHALE 4879567.44\n", - "UNION DES DISTILLERIES DE LA MEDITERRANEE 4633637.23\n", - "AGRIAL 4394980.55\n", - "CHAMBRE DEPT D AGRICULTURE CHAMBRE D AGR 4336316.72\n", - "GMA 4283299.01\n", - "SA BOIS DEBOUT 4244025.32\n", - "PETIT MORNE SARL 4170492.76\n", - "G H MUMM ET CIE 4000674.74\n", - "CAFEIERE SAS 3961039.48\n", - "ARIV 3583792.86\n", - "UNION DES COOPERATIVES VINICOLES D'AQUITAINE UCVA 3417573.74\n", - "SOC DISTILLERIES VINICOLES BLAYAIS 3116204.84\n", - "GAEC DU MOULIN 2798234.49\n", - "GAEC DE LA FONTAINE 2761443.64\n", - "EARL DU MOULIN 2651521.15\n", - "SAS AGRISUD 2574301.30\n", - " ... \n", - "CHASSAGNE MARYSE 1250.98\n", - "EARL GROS CHASSIBOUD 1250.95\n", - "COURTOIS DANIEL 1250.93\n", - "GUIZE CLOTILDE 1250.93\n", - "DUCELLIER MARIE-JOSE 1250.89\n", - "EARL MICHEL HEYBERGER 1250.88\n", - "REQUIS AIME 1250.82\n", - "VERNIER BERNADETTE 1250.79\n", - "FORTIER GERARD 1250.79\n", - "CABOT EVELINE 1250.69\n", - "LEGUAY MARCEL 1250.64\n", - "FONTAINE MARIE-COLETTE 1250.60\n", - "GUICHOU JEAN-CLAUDE 1250.58\n", - "SOULIE LILIANE 1250.55\n", - "BARBOTIN ODILE 1250.55\n", - "DAL CORTIVO BENOIT 1250.55\n", - "LARRE ANDRE 1250.54\n", - "ANGLEZAN PIERRE 1250.41\n", - "BORTOLUSSI FRANCIS 1250.39\n", - "BOUYER THOMAS 1250.38\n", - "AUGRY JOEL 1250.29\n", - "GAEC XOTILDEIA 1250.28\n", - "BELLET JEAN-YVES 1250.26\n", - "DELABIE BERNARD JACQUES MICH 1250.26\n", - "MANCEL GERARD 1250.26\n", - "DUPONT FAUSTIN EUGENE 1250.25\n", - "AULONG STEPHANIE 1250.22\n", - "BLANCHET CHRISTIAN 1250.19\n", - "MARTINOT MADELEINE 1250.12\n", - "LEROY MARGARET 1250.10\n", - "Name: amount, Length: 295135, dtype: float64" + "SAS SUCRERIE DU GOL 31644000.00\n", + "XXX 17006619.42\n", + "SANDERS BRETAGNE 14395334.07\n", + "COOPERATIVE EUREDEN 14039416.65\n", + "SAS SUCRERIE DE BOIS ROUGE 13944286.60\n", + " ... \n", + "GAEC DU VALLON D ANDIGNAC 1250.18\n", + "LASSEE CLAUDE 1250.14\n", + "LESTRADE SANDRINE 1250.08\n", + "LOUBATIERES CHRISTOPHE 1250.06\n", + "PILLAULT PASCAL 1250.04\n", + "Name: amount, Length: 281011, dtype: float64" ] }, - "execution_count": 10, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -430,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -468,45 +420,45 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594,16\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733,67\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647,00\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5,48\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2,21\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000,00\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452,93\n", + " 452.93\n", " \n", " \n", "\n", @@ -520,15 +472,15 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " Libellé rubrique Montant rubrique amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733,67 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000,00 1000.00 " + " Libellé rubrique Montant rubrique amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594,16 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647,00 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5,48 -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2,21 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452,93 452.93 " ] }, - "execution_count": 11, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -539,7 +491,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -576,40 +528,40 @@ " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " XXX\n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", " \n", " \n", "\n", @@ -623,15 +575,15 @@ "3 XXX XXX 01XXX \n", "4 XXX XXX 01XXX \n", "\n", - " scheme amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 " + " scheme amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 " ] }, - "execution_count": 12, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -643,13 +595,13 @@ " ' Code postal': 'recipient_postcode',\n", " u' Libellé rubrique': 'scheme'\n", "})\n", - "df = df.drop(' Montant rubrique', 1)\n", + "df = df.drop(' Montant rubrique', axis=1)\n", "df.head()" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -686,40 +638,40 @@ " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", " \n", " \n", " 1\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", " \n", " \n", " 2\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", " \n", " \n", " 3\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", " \n", " \n", " 4\n", " XXX\n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", " \n", " \n", "\n", @@ -733,15 +685,15 @@ "3 XXX 01XXX \n", "4 XXX 01XXX \n", "\n", - " scheme amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 " + " scheme amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 " ] }, - "execution_count": 13, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -753,7 +705,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -790,40 +742,40 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", " \n", " \n", " 1\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", " \n", " \n", " 2\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", " \n", " \n", " 3\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", " \n", " \n", " 4\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", " \n", " \n", "\n", @@ -837,15 +789,15 @@ "3 01XXX \n", "4 01XXX \n", "\n", - " scheme amount \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 " + " scheme amount \n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 " ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -857,7 +809,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -896,50 +848,50 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-0\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", + " 2022\n", + " FR-01XXX-2022-0\n", " \n", " \n", " 1\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", - " 2017\n", - " FR-01XXX-2017-1\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", + " 2022\n", + " FR-01XXX-2022-1\n", " \n", " \n", " 2\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-2\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", + " 2022\n", + " FR-01XXX-2022-2\n", " \n", " \n", " 3\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-3\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", + " 2022\n", + " FR-01XXX-2022-3\n", " \n", " \n", " 4\n", " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-4\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", + " 2022\n", + " FR-01XXX-2022-4\n", " \n", " \n", "\n", @@ -953,15 +905,22 @@ "3 01XXX \n", "4 01XXX \n", "\n", - " scheme amount year recipient_id \n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-0 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 2017 FR-01XXX-2017-1 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-2 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-3 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 FR-01XXX-2017-4 " + " scheme amount year \\\n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 2022 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 2022 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 2022 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 2022 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 2022 \n", + "\n", + " recipient_id \n", + "0 FR-01XXX-2022-0 \n", + "1 FR-01XXX-2022-1 \n", + "2 FR-01XXX-2022-2 \n", + "3 FR-01XXX-2022-3 \n", + "4 FR-01XXX-2022-4 " ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -977,16 +936,16 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "473540" + "417225" ] }, - "execution_count": 16, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -997,7 +956,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -1038,10 +997,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-0\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 594.16\n", + " 2022\n", + " FR-01XXX-2022-0\n", " EUR\n", " FR\n", " \n", @@ -1050,10 +1009,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 733.67\n", - " 2017\n", - " FR-01XXX-2017-1\n", + " III.7 - Aide dans le secteur de l'apiculture\n", + " 647.00\n", + " 2022\n", + " FR-01XXX-2022-1\n", " EUR\n", " FR\n", " \n", @@ -1062,10 +1021,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-2\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " -5.48\n", + " 2022\n", + " FR-01XXX-2022-2\n", " EUR\n", " FR\n", " \n", @@ -1074,10 +1033,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-3\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 2.21\n", + " 2022\n", + " FR-01XXX-2022-3\n", " EUR\n", " FR\n", " \n", @@ -1086,10 +1045,10 @@ " \n", " \n", " 01XXX\n", - " III.10 - Aide pour le secteur du ver à soie\n", - " 1000.00\n", - " 2017\n", - " FR-01XXX-2017-4\n", + " II.1 - Aide de base découplée à la surface (DPB)\n", + " 452.93\n", + " 2022\n", + " FR-01XXX-2022-4\n", " EUR\n", " FR\n", " \n", @@ -1105,22 +1064,22 @@ "3 01XXX \n", "4 01XXX \n", "\n", - " scheme amount year \\\n", - "0 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", - "1 III.10 - Aide pour le secteur du ver à soie 733.67 2017 \n", - "2 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", - "3 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", - "4 III.10 - Aide pour le secteur du ver à soie 1000.00 2017 \n", + " scheme amount year \\\n", + "0 III.7 - Aide dans le secteur de l'apiculture 594.16 2022 \n", + "1 III.7 - Aide dans le secteur de l'apiculture 647.00 2022 \n", + "2 II.1 - Aide de base découplée à la surface (DPB) -5.48 2022 \n", + "3 II.1 - Aide de base découplée à la surface (DPB) 2.21 2022 \n", + "4 II.1 - Aide de base découplée à la surface (DPB) 452.93 2022 \n", "\n", " recipient_id currency country \n", - "0 FR-01XXX-2017-0 EUR FR \n", - "1 FR-01XXX-2017-1 EUR FR \n", - "2 FR-01XXX-2017-2 EUR FR \n", - "3 FR-01XXX-2017-3 EUR FR \n", - "4 FR-01XXX-2017-4 EUR FR " + "0 FR-01XXX-2022-0 EUR FR \n", + "1 FR-01XXX-2022-1 EUR FR \n", + "2 FR-01XXX-2022-2 EUR FR \n", + "3 FR-01XXX-2022-3 EUR FR \n", + "4 FR-01XXX-2022-4 EUR FR " ] }, - "execution_count": 17, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1133,17 +1092,24 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "df.to_csv('fr_{YEAR}.csv.gz'.format(YEAR=YEAR), index=False, encoding='utf-8', compression='gzip')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1157,9 +1123,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.9.18" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/gb/README.md b/countries/gb/README.md similarity index 53% rename from gb/README.md rename to countries/gb/README.md index 40a66fc..1ca79b0 100644 --- a/gb/README.md +++ b/countries/gb/README.md @@ -3,4 +3,4 @@ Scraper for Great Britain -Scraper build using Scrapy, see ''scrapy_fs/scrapy_fs/spiders/gb_spider.py``. +Scraper in Notebook. diff --git a/countries/gb/greatbritain-scraper.ipynb b/countries/gb/greatbritain-scraper.ipynb new file mode 100644 index 0000000..9cbb540 --- /dev/null +++ b/countries/gb/greatbritain-scraper.ipynb @@ -0,0 +1,759 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 14:53:23-- http://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls\n", + "Auflösen des Hostnamens cap-payments.defra.gov.uk (cap-payments.defra.gov.uk) … 40.127.153.231\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:80 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 307 Temporary Redirect\n", + "Platz: https://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls [folgend]\n", + "--2023-11-03 14:53:23-- https://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:443 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 33646592 (32M) [application/vnd.ms-excel]\n", + "Wird in ‘2014_All_CAP_Search_Results_Data_P14.xls’ gespeichert.\n", + "\n", + "2014_All_CAP_Search 100%[===================>] 32,09M 884KB/s in 47s \n", + "\n", + "2023-11-03 14:54:10 (699 KB/s) - ‘2014_All_CAP_Search_Results_Data_P14.xls’ gespeichert [33646592/33646592]\n", + "\n" + ] + } + ], + "source": [ + "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls\"" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2016-06-02 12:01:45-- http://cap-payments.defra.gov.uk/Download/2015_All_CAP_Search_Results_Data_P14.xls\n", + "Resolving cap-payments.defra.gov.uk... 194.1.210.50\n", + "Connecting to cap-payments.defra.gov.uk|194.1.210.50|:80... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 33282560 (32M) [application/vnd.ms-excel]\n", + "Saving to: '2015_All_CAP_Search_Results_Data_P14.xls'\n", + "\n", + "2015_All_CAP_Search 100%[===================>] 31.74M 1.91MB/s in 12s \n", + "\n", + "2016-06-02 12:01:57 (2.72 MB/s) - '2015_All_CAP_Search_Results_Data_P14.xls' saved [33282560/33282560]\n", + "\n" + ] + } + ], + "source": [ + "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2015_All_CAP_Search_Results_Data_P14.xls\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2018-02-05 11:36:33-- http://cap-payments.defra.gov.uk/Download/2016_All_CAP_Search_Results_Data_P14.xlsx\n", + "Resolving cap-payments.defra.gov.uk... 194.1.210.50\n", + "Connecting to cap-payments.defra.gov.uk|194.1.210.50|:80... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 15767150 (15M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", + "Saving to: ‘2016_All_CAP_Search_Results_Data_P14.xlsx’\n", + "\n", + "2016_All_CAP_Search 100%[===================>] 15.04M 2.35MB/s in 7.7s \n", + "\n", + "2018-02-05 11:36:41 (1.96 MB/s) - ‘2016_All_CAP_Search_Results_Data_P14.xlsx’ saved [15767150/15767150]\n", + "\n" + ] + } + ], + "source": [ + "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2016_All_CAP_Search_Results_Data_P14.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2023-11-03 14:54:12-- http://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx\n", + "Auflösen des Hostnamens cap-payments.defra.gov.uk (cap-payments.defra.gov.uk) … 40.127.153.231\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:80 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 307 Temporary Redirect\n", + "Platz: https://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx [folgend]\n", + "--2023-11-03 14:54:12-- https://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx\n", + "Verbindungsaufbau zu cap-payments.defra.gov.uk (cap-payments.defra.gov.uk)|40.127.153.231|:443 … verbunden.\n", + "HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK\n", + "Länge: 11031657 (11M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", + "Wird in ‘2022_All_CAP_Search_Results_Data_P14.xlsx’ gespeichert.\n", + "\n", + "2022_All_CAP_Search 100%[===================>] 10,52M 1,27MB/s in 9,0s \n", + "\n", + "2023-11-03 14:54:21 (1,17 MB/s) - ‘2022_All_CAP_Search_Results_Data_P14.xlsx’ gespeichert [11031657/11031657]\n", + "\n" + ] + } + ], + "source": [ + "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2022_All_CAP_Search_Results_Data_P14.xlsx\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "YEAR = 2022" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting openpyxl\n", + " Downloading openpyxl-3.1.2-py2.py3-none-any.whl (249 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m250.0/250.0 kB\u001b[0m \u001b[31m195.8 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m[36m0:00:01\u001b[0m[36m0:00:01\u001b[0m:01\u001b[0m\n", + "\u001b[?25hCollecting et-xmlfile (from openpyxl)\n", + " Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)\n", + "Installing collected packages: et-xmlfile, openpyxl\n", + "Successfully installed et-xmlfile-1.1.0 openpyxl-3.1.2\n" + ] + } + ], + "source": [ + "!pip install openpyxl" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['DAERA', 'SGRPID', 'WG', 'RPA', 'RPA 2']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "excel_file = pd.ExcelFile('%s_All_CAP_Search_Results_Data_P14.xlsx' % YEAR)\n", + "excel_file.sheet_names" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
YearBeneficiaryCodeBeneficiaryName_F201PostcodePrefix_F202BTownCity_F202CPayingAgencyLinkschemeamount
10582022NaNBRITISH TRUST FOR ORNITHOLOGYIP24ENGLANDDAERATechnical assist91631.32
13002022NaNCOUNTRYSIDE SERVICES LIMITEDBT71CO TYRONEDAERATechnical assist225512.40
13982022NaNDARD FARM POLICY BRANCHBT4BELFAST CO DOWNDAERATechnical assist2904812.46
1956522022NaNAGHYARAN GAA CLUBBT81CO.TYRONEDAERASupport for Leader local development30725.22
1957692022NaNANTRIM & NEWTOWNABBEY BOROUGH COUNCILBT36CO.ANTRIMDAERASupport for Leader local development188992.88
\n", + "
" + ], + "text/plain": [ + " Year BeneficiaryCode BeneficiaryName_F201 \\\n", + "1058 2022 NaN BRITISH TRUST FOR ORNITHOLOGY \n", + "1300 2022 NaN COUNTRYSIDE SERVICES LIMITED \n", + "1398 2022 NaN DARD FARM POLICY BRANCH \n", + "195652 2022 NaN AGHYARAN GAA CLUB \n", + "195769 2022 NaN ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL \n", + "\n", + " PostcodePrefix_F202B TownCity_F202C PayingAgencyLink \\\n", + "1058 IP24 ENGLAND DAERA \n", + "1300 BT71 CO TYRONE DAERA \n", + "1398 BT4 BELFAST CO DOWN DAERA \n", + "195652 BT81 CO.TYRONE DAERA \n", + "195769 BT36 CO.ANTRIM DAERA \n", + "\n", + " scheme amount \n", + "1058 Technical assist 91631.32 \n", + "1300 Technical assist 225512.40 \n", + "1398 Technical assist 2904812.46 \n", + "195652 Support for Leader local development 30725.22 \n", + "195769 Support for Leader local development 188992.88 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id_vars = ['Year', 'BeneficiaryCode', 'BeneficiaryName_F201',\n", + " 'PostcodePrefix_F202B', 'TownCity_F202C',\n", + "# 'OtherEAGFTotal', 'DirectEAGFTotal', 'RuralDevelopmentTotal', 'Total',\n", + " 'PayingAgencyLink']\n", + "\n", + "\n", + "def get_melted_df(excel_file, sheet_name):\n", + " df_raw = excel_file.parse(sheet_name)\n", + " df_raw = df_raw[df_raw['Year'].notnull()]\n", + " all_columns = list(df_raw.columns)\n", + " value_vars = list(set(all_columns) - set(id_vars))\n", + " df_raw = df_raw.rename(columns={x: x.strip() for x in value_vars})\n", + " value_vars = [v.strip() for v in value_vars]\n", + " df = pd.melt(df_raw, id_vars=id_vars, value_vars=value_vars, var_name='scheme', value_name='amount')\n", + " df = df[df['amount'].notnull()]\n", + " return df\n", + "\n", + "df = pd.concat([get_melted_df(excel_file, sheet) for sheet in excel_file.sheet_names])\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearrecipient_idrecipient_namerecipient_postcoderecipient_locationagencyschemeamountcountrycurrency
10582022NaNBRITISH TRUST FOR ORNITHOLOGYIP24ENGLANDDAERATechnical assist91631.32GBGBP
13002022NaNCOUNTRYSIDE SERVICES LIMITEDBT71CO TYRONEDAERATechnical assist225512.40GBGBP
13982022NaNDARD FARM POLICY BRANCHBT4BELFAST CO DOWNDAERATechnical assist2904812.46GBGBP
1956522022NaNAGHYARAN GAA CLUBBT81CO.TYRONEDAERASupport for Leader local development30725.22GBGBP
1957692022NaNANTRIM & NEWTOWNABBEY BOROUGH COUNCILBT36CO.ANTRIMDAERASupport for Leader local development188992.88GBGBP
\n", + "
" + ], + "text/plain": [ + " year recipient_id recipient_name \\\n", + "1058 2022 NaN BRITISH TRUST FOR ORNITHOLOGY \n", + "1300 2022 NaN COUNTRYSIDE SERVICES LIMITED \n", + "1398 2022 NaN DARD FARM POLICY BRANCH \n", + "195652 2022 NaN AGHYARAN GAA CLUB \n", + "195769 2022 NaN ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL \n", + "\n", + " recipient_postcode recipient_location agency \\\n", + "1058 IP24 ENGLAND DAERA \n", + "1300 BT71 CO TYRONE DAERA \n", + "1398 BT4 BELFAST CO DOWN DAERA \n", + "195652 BT81 CO.TYRONE DAERA \n", + "195769 BT36 CO.ANTRIM DAERA \n", + "\n", + " scheme amount country currency \n", + "1058 Technical assist 91631.32 GB GBP \n", + "1300 Technical assist 225512.40 GB GBP \n", + "1398 Technical assist 2904812.46 GB GBP \n", + "195652 Support for Leader local development 30725.22 GB GBP \n", + "195769 Support for Leader local development 188992.88 GB GBP " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df.rename(columns={\n", + " 'Year': 'year',\n", + " 'BeneficiaryCode': 'recipient_id',\n", + " 'BeneficiaryName_F201': 'recipient_name',\n", + " 'PostcodePrefix_F202B': 'recipient_postcode',\n", + " 'TownCity_F202C': 'recipient_location',\n", + " 'PayingAgencyLink': 'agency',\n", + "})\n", + "df['country'] = 'GB'\n", + "df['currency'] = 'GBP'\n", + "df['year'] = df['year'].astype('int')\n", + "df['recipient_name'] = df['recipient_name'].str.strip()\n", + "df['recipient_postcode'] = df['recipient_postcode'].str.strip()\n", + "df['recipient_location'] = df['recipient_location'].str.strip()\n", + "df.loc[df['recipient_id'].notnull(), 'recipient_name'] = None\n", + "#df.set_value(df['recipient_id'].notnull(), 'recipient_name', None)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearrecipient_idrecipient_namerecipient_postcoderecipient_locationagencyschemeamountcountrycurrency
10582022GB-IP24-BRITISH TRUST FOR ORNITHOLOGYBRITISH TRUST FOR ORNITHOLOGYIP24ENGLANDDAERATechnical assist91631.32GBGBP
13002022GB-BT71-COUNTRYSIDE SERVICES LIMITEDCOUNTRYSIDE SERVICES LIMITEDBT71CO TYRONEDAERATechnical assist225512.40GBGBP
13982022GB-BT4-DARD FARM POLICY BRANCHDARD FARM POLICY BRANCHBT4BELFAST CO DOWNDAERATechnical assist2904812.46GBGBP
1956522022GB-BT81-AGHYARAN GAA CLUBAGHYARAN GAA CLUBBT81CO.TYRONEDAERASupport for Leader local development30725.22GBGBP
1957692022GB-BT36-ANTRIM & NEWTOWNABBEY BOROUGH COUNCILANTRIM & NEWTOWNABBEY BOROUGH COUNCILBT36CO.ANTRIMDAERASupport for Leader local development188992.88GBGBP
\n", + "
" + ], + "text/plain": [ + " year recipient_id \\\n", + "1058 2022 GB-IP24-BRITISH TRUST FOR ORNITHOLOGY \n", + "1300 2022 GB-BT71-COUNTRYSIDE SERVICES LIMITED \n", + "1398 2022 GB-BT4-DARD FARM POLICY BRANCH \n", + "195652 2022 GB-BT81-AGHYARAN GAA CLUB \n", + "195769 2022 GB-BT36-ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL \n", + "\n", + " recipient_name recipient_postcode \\\n", + "1058 BRITISH TRUST FOR ORNITHOLOGY IP24 \n", + "1300 COUNTRYSIDE SERVICES LIMITED BT71 \n", + "1398 DARD FARM POLICY BRANCH BT4 \n", + "195652 AGHYARAN GAA CLUB BT81 \n", + "195769 ANTRIM & NEWTOWNABBEY BOROUGH COUNCIL BT36 \n", + "\n", + " recipient_location agency scheme \\\n", + "1058 ENGLAND DAERA Technical assist \n", + "1300 CO TYRONE DAERA Technical assist \n", + "1398 BELFAST CO DOWN DAERA Technical assist \n", + "195652 CO.TYRONE DAERA Support for Leader local development \n", + "195769 CO.ANTRIM DAERA Support for Leader local development \n", + "\n", + " amount country currency \n", + "1058 91631.32 GB GBP \n", + "1300 225512.40 GB GBP \n", + "1398 2904812.46 GB GBP \n", + "195652 30725.22 GB GBP \n", + "195769 188992.88 GB GBP " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def set_recipient_id(row):\n", + " if pd.isnull(row['recipient_id']):\n", + " row['recipient_id'] = 'GB-%s-%s' % (row['recipient_postcode'], row['recipient_name'])\n", + " else:\n", + " row['recipient_id'] = 'GB-%s' % int(row['recipient_id'])\n", + " return row\n", + "\n", + "df = df.apply(set_recipient_id, axis=1)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "846114" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "scheme\n", + "Basic payment scheme - UK funded 143841\n", + "Agri-environment-climate 26305\n", + "Greening - UK payments - UK funded 18848\n", + "Redistributive payment - UK funded 16313\n", + "Payments to areas facing natural constraints - UK funded 10713\n", + "Other direct aids - UK funded 7293\n", + "Investment in forest area development and viability 6306\n", + "Investments in physical assets 4751\n", + "Young farmers - UK funded 4277\n", + "Investments in physical assets - UK funded 3518\n", + "Organic farming 1740\n", + "Refunds for pigmeat 1528\n", + "Forest environmental, climate and conservation - UK funded 806\n", + "Investment in forest area development and viability - UK funded 474\n", + "Payments to areas facing natural and other specific constraints 341\n", + "Support for Leader local development 317\n", + "Reimbursement of financial discipline 308\n", + "School Milk scheme – Regulation 657/2008 246\n", + "Farm and business development 208\n", + "Cooperation 179\n", + "Basic services and village renewal in rural areas 165\n", + "Forest environmental, climate and conservation 157\n", + "Skills acquisition, animation and implementation of local development strategies 99\n", + "Farm and business development - UK funded 67\n", + "Aid in fruit and vegetables sector - UK funded 34\n", + "Knowledge transfer and information actions 11\n", + "Advisory services, farm management and farm relief services 7\n", + "Technical assist 5\n", + "School milk scheme - UK funded 5\n", + "Knowledge transfer and information actions - UK funded 3\n", + "Cooperation - UK funded 3\n", + "Single payment scheme - UK funded 3\n", + "Agri-environment-climate - UK funded 2\n", + "Advisory, farm mangement and farm relief services - UK funded 2\n", + "Aid for public storage - UK funded 2\n", + "Redistributive payment 2\n", + "Basic services and village renewal in rural areas - UK funded 1\n", + "Beekeeping - UK funded 1\n", + "Single payment scheme 1\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df[~df['scheme'].isin([x for x in df['scheme'].value_counts().index if x.endswith('Total')])]\n", + "df['scheme'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv('gb_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/gr/README.md b/countries/gr/README.md similarity index 100% rename from gr/README.md rename to countries/gr/README.md diff --git a/gr/convert_gr.ipynb b/countries/gr/convert_gr.ipynb similarity index 100% rename from gr/convert_gr.ipynb rename to countries/gr/convert_gr.ipynb diff --git a/gr/scraper.py b/countries/gr/scraper.py similarity index 100% rename from gr/scraper.py rename to countries/gr/scraper.py diff --git a/hr/README.md b/countries/hr/README.md similarity index 100% rename from hr/README.md rename to countries/hr/README.md diff --git a/countries/hu/README.md b/countries/hu/README.md new file mode 100644 index 0000000..c331061 --- /dev/null +++ b/countries/hu/README.md @@ -0,0 +1,10 @@ +Scraper for Hungary +========================= + + + +Writing a scraper is painful (ASP viewstate). + +Manually downloading CSV file via "Full list - abc order" and convert in `hu_converter_2023.ipynb` + + diff --git a/hu/hu_converter.ipynb b/countries/hu/hu_converter.ipynb similarity index 100% rename from hu/hu_converter.ipynb rename to countries/hu/hu_converter.ipynb diff --git a/countries/hu/hu_converter_2023.ipynb b/countries/hu/hu_converter_2023.ipynb new file mode 100644 index 0000000..dd80767 --- /dev/null +++ b/countries/hu/hu_converter_2023.ipynb @@ -0,0 +1,1036 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from glob import glob\n", + "import os\n", + "\n", + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_115982/980775472.py:1: DtypeWarning: Columns (3) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " df = pd.read_csv(\"./tamkereso_1000081/export.csv\", encoding='latin-1', delimiter=';', converters={'Postal code': str})\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Name of beneficiaryPostal codeMunicipalityAddressMeasureFUNDResourceAmount of support (Ft)Overall amount of support (Ft)year
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU648282672031402022
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National72031472031402022
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/AReimbursement of financial disciplineEAGFEU9379647993222022
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/APayments for agricultural practises beneficial...EAGFEU167143647993222022
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/ASingle area payment scheme (SAPS)EAGFEU303409047993222022
5\" Túri Csemege \" Kereskedelmi Kft.5400MezõtúrBajcsy-Zsilinszky utca 55Temporary state aid measure - pigeonNationalNational292500029250002022
6,, Zirc Kultúrájáért '' Közhasznú Alapítvány8420ZircMárcius 15. tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU8731159701282022
7,, Zirc Kultúrájáért '' Közhasznú Alapítvány8420ZircMárcius 15. tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National970139701282022
8A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.19.4.1 LEADER - Support for operational and an...EMVA 2014EU17236254229553772022
9A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.19.4.1 LEADER - Support for operational and an...EMVA 2014National1915140229553772022
10A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.RDP-M19.3.1-LEADER cooperationEMVA 2014EU3423584229553772022
11A Bakonyért Vidékfejlesztési Akciócsoport Egy...8420ZircVak Bottyán utca 1.RDP-M19.3.1-LEADER cooperationEMVA 2014National380399229553772022
12A Gyermekekért és az Ifjúságért Vincze Imre A...2898KocsSzabadság tér 6.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National41104241104232022
13A Gyermekekért és az Ifjúságért Vincze Imre A...2898KocsSzabadság tér 6.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU369938141104232022
14A JÁSZAPÁTI TEMPLOMÉRT Alapítvány5130JászapátiOrgona út 2.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU179993119999232022
15A JÁSZAPÁTI TEMPLOMÉRT Alapítvány5130JászapátiOrgona út 2.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National19999219999232022
16A Jövõ Borsodnádasdjáért Egyesület3672Borsodnádasd-LemezgyárPetõfi tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National855638556252022
17A Jövõ Borsodnádasdjáért Egyesület3672Borsodnádasd-LemezgyárPetõfi tér 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU7700628556252022
18A Kéki Rosszcsontokért Alapítvány4515KékRákóczi utca 2RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU111023712335972022
19A Kéki Rosszcsontokért Alapítvány4515KékRákóczi utca 2RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National12336012335972022
\n", + "
" + ], + "text/plain": [ + " Name of beneficiary Postal code \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "5 \" Túri Csemege \" Kereskedelmi Kft. 5400 \n", + "6 ,, Zirc Kultúrájáért '' Közhasznú Alapítvány 8420 \n", + "7 ,, Zirc Kultúrájáért '' Közhasznú Alapítvány 8420 \n", + "8 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "9 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "10 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "11 A Bakonyért Vidékfejlesztési Akciócsoport Egy... 8420 \n", + "12 A Gyermekekért és az Ifjúságért Vincze Imre A... 2898 \n", + "13 A Gyermekekért és az Ifjúságért Vincze Imre A... 2898 \n", + "14 A JÁSZAPÁTI TEMPLOMÉRT Alapítvány 5130 \n", + "15 A JÁSZAPÁTI TEMPLOMÉRT Alapítvány 5130 \n", + "16 A Jövõ Borsodnádasdjáért Egyesület 3672 \n", + "17 A Jövõ Borsodnádasdjáért Egyesület 3672 \n", + "18 A Kéki Rosszcsontokért Alapítvány 4515 \n", + "19 A Kéki Rosszcsontokért Alapítvány 4515 \n", + "\n", + " Municipality Address \\\n", + "0 Csurgó Poldini Ede utca 1. \n", + "1 Csurgó Poldini Ede utca 1. \n", + "2 Gérce Kossuth Lajos utca 15/A \n", + "3 Gérce Kossuth Lajos utca 15/A \n", + "4 Gérce Kossuth Lajos utca 15/A \n", + "5 Mezõtúr Bajcsy-Zsilinszky utca 55 \n", + "6 Zirc Március 15. tér 1. \n", + "7 Zirc Március 15. tér 1. \n", + "8 Zirc Vak Bottyán utca 1. \n", + "9 Zirc Vak Bottyán utca 1. \n", + "10 Zirc Vak Bottyán utca 1. \n", + "11 Zirc Vak Bottyán utca 1. \n", + "12 Kocs Szabadság tér 6. \n", + "13 Kocs Szabadság tér 6. \n", + "14 Jászapáti Orgona út 2. \n", + "15 Jászapáti Orgona út 2. \n", + "16 Borsodnádasd-Lemezgyár Petõfi tér 1. \n", + "17 Borsodnádasd-Lemezgyár Petõfi tér 1. \n", + "18 Kék Rákóczi utca 2 \n", + "19 Kék Rákóczi utca 2 \n", + "\n", + " Measure FUND Resource \\\n", + "0 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "2 Reimbursement of financial discipline EAGF EU \n", + "3 Payments for agricultural practises beneficial... EAGF EU \n", + "4 Single area payment scheme (SAPS) EAGF EU \n", + "5 Temporary state aid measure - pigeon National National \n", + "6 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "7 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "8 19.4.1 LEADER - Support for operational and an... EMVA 2014 EU \n", + "9 19.4.1 LEADER - Support for operational and an... EMVA 2014 National \n", + "10 RDP-M19.3.1-LEADER cooperation EMVA 2014 EU \n", + "11 RDP-M19.3.1-LEADER cooperation EMVA 2014 National \n", + "12 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "13 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "14 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "15 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "16 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "17 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "18 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "19 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "\n", + " Amount of support (Ft) Overall amount of support (Ft) year \n", + "0 6482826 7203140 2022 \n", + "1 720314 7203140 2022 \n", + "2 93796 4799322 2022 \n", + "3 1671436 4799322 2022 \n", + "4 3034090 4799322 2022 \n", + "5 2925000 2925000 2022 \n", + "6 873115 970128 2022 \n", + "7 97013 970128 2022 \n", + "8 17236254 22955377 2022 \n", + "9 1915140 22955377 2022 \n", + "10 3423584 22955377 2022 \n", + "11 380399 22955377 2022 \n", + "12 411042 4110423 2022 \n", + "13 3699381 4110423 2022 \n", + "14 1799931 1999923 2022 \n", + "15 199992 1999923 2022 \n", + "16 85563 855625 2022 \n", + "17 770062 855625 2022 \n", + "18 1110237 1233597 2022 \n", + "19 123360 1233597 2022 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv(\"./tamkereso_1000081/export.csv\", encoding='latin-1', delimiter=';', converters={'Postal code': str})\n", + "df[\"year\"] = 2022\n", + "df.head(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Name of beneficiary', 'Postal code', 'Municipality', 'Address',\n", + " 'Measure', 'FUND', 'Resource', 'Amount of support (Ft)',\n", + " 'Overall amount of support (Ft)', 'year'],\n", + " dtype='object')" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_postcoderecipient_locationrecipient_addressscheme_detailFUNDResourceamountOverall amount of support (Ft)yearscheme
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014EU648282672031402022RDP-M19.2.1 - Implementation of LDSs strategie...
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.RDP-M19.2.1 - Implementation of LDSs strategiesEMVA 2014National72031472031402022RDP-M19.2.1 - Implementation of LDSs strategie...
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/AReimbursement of financial disciplineEAGFEU9379647993222022Reimbursement of financial discipline (EAGF, EU)
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/APayments for agricultural practises beneficial...EAGFEU167143647993222022Payments for agricultural practises beneficial...
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/ASingle area payment scheme (SAPS)EAGFEU303409047993222022Single area payment scheme (SAPS) (EAGF, EU)
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_postcode \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "\n", + " recipient_location recipient_address \\\n", + "0 Csurgó Poldini Ede utca 1. \n", + "1 Csurgó Poldini Ede utca 1. \n", + "2 Gérce Kossuth Lajos utca 15/A \n", + "3 Gérce Kossuth Lajos utca 15/A \n", + "4 Gérce Kossuth Lajos utca 15/A \n", + "\n", + " scheme_detail FUND Resource \\\n", + "0 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 EU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategies EMVA 2014 National \n", + "2 Reimbursement of financial discipline EAGF EU \n", + "3 Payments for agricultural practises beneficial... EAGF EU \n", + "4 Single area payment scheme (SAPS) EAGF EU \n", + "\n", + " amount Overall amount of support (Ft) year \\\n", + "0 6482826 7203140 2022 \n", + "1 720314 7203140 2022 \n", + "2 93796 4799322 2022 \n", + "3 1671436 4799322 2022 \n", + "4 3034090 4799322 2022 \n", + "\n", + " scheme \n", + "0 RDP-M19.2.1 - Implementation of LDSs strategie... \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategie... \n", + "2 Reimbursement of financial discipline (EAGF, EU) \n", + "3 Payments for agricultural practises beneficial... \n", + "4 Single area payment scheme (SAPS) (EAGF, EU) " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df.rename(columns={\n", + " 'Amount of support (Ft)': 'amount',\n", + " 'Name of beneficiary': 'recipient_name',\n", + " 'Postal code': 'recipient_postcode',\n", + " 'Address': 'recipient_address',\n", + " 'Municipality': 'recipient_location',\n", + " 'Measure': 'scheme_detail'\n", + " })\n", + "df['recipient_name'] = df['recipient_name'].apply(lambda x: np.nan if x == 'magánszemély' else x)\n", + "df['scheme'] = df.apply(lambda x: '%s (%s, %s)' % (x['scheme_detail'], x['FUND'], x['Resource']), 1)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_postcoderecipient_locationrecipient_addressamountOverall amount of support (Ft)yearschemecurrencycountry
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.648282672031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.72031472031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A9379647993222022Reimbursement of financial discipline (EAGF, EU)HUFHU
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A167143647993222022Payments for agricultural practises beneficial...HUFHU
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A303409047993222022Single area payment scheme (SAPS) (EAGF, EU)HUFHU
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_postcode \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "\n", + " recipient_location recipient_address amount \\\n", + "0 Csurgó Poldini Ede utca 1. 6482826 \n", + "1 Csurgó Poldini Ede utca 1. 720314 \n", + "2 Gérce Kossuth Lajos utca 15/A 93796 \n", + "3 Gérce Kossuth Lajos utca 15/A 1671436 \n", + "4 Gérce Kossuth Lajos utca 15/A 3034090 \n", + "\n", + " Overall amount of support (Ft) year \\\n", + "0 7203140 2022 \n", + "1 7203140 2022 \n", + "2 4799322 2022 \n", + "3 4799322 2022 \n", + "4 4799322 2022 \n", + "\n", + " scheme currency country \n", + "0 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "2 Reimbursement of financial discipline (EAGF, EU) HUF HU \n", + "3 Payments for agricultural practises beneficial... HUF HU \n", + "4 Single area payment scheme (SAPS) (EAGF, EU) HUF HU " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['currency'] = 'HUF'\n", + "df['country'] = 'HU'\n", + "del df[\"FUND\"]\n", + "del df[\"Resource\"]\n", + "del df[\"scheme_detail\"]\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "639786" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df[df['recipient_name'].notnull()])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "639786" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "415" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(df['scheme'].value_counts())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_postcoderecipient_locationrecipient_addressamountOverall amount of support (Ft)yearschemecurrencycountry
0\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.648282672031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
1\" BALOGH \" Vendéglátóipari és Kereskedelmi Kft.8840CsurgóPoldini Ede utca 1.72031472031402022RDP-M19.2.1 - Implementation of LDSs strategie...HUFHU
2\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A9379647993222022Reimbursement of financial discipline (EAGF, EU)HUFHU
3\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A167143647993222022Payments for agricultural practises beneficial...HUFHU
4\" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi...9672GérceKossuth Lajos utca 15/A303409047993222022Single area payment scheme (SAPS) (EAGF, EU)HUFHU
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_postcode \\\n", + "0 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "1 \" BALOGH \" Vendéglátóipari és Kereskedelmi Kft. 8840 \n", + "2 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "3 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "4 \" Jobbikszer\" 2001 Mezõgazdasági, Kereskedelmi... 9672 \n", + "\n", + " recipient_location recipient_address amount \\\n", + "0 Csurgó Poldini Ede utca 1. 6482826 \n", + "1 Csurgó Poldini Ede utca 1. 720314 \n", + "2 Gérce Kossuth Lajos utca 15/A 93796 \n", + "3 Gérce Kossuth Lajos utca 15/A 1671436 \n", + "4 Gérce Kossuth Lajos utca 15/A 3034090 \n", + "\n", + " Overall amount of support (Ft) year \\\n", + "0 7203140 2022 \n", + "1 7203140 2022 \n", + "2 4799322 2022 \n", + "3 4799322 2022 \n", + "4 4799322 2022 \n", + "\n", + " scheme currency country \n", + "0 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "1 RDP-M19.2.1 - Implementation of LDSs strategie... HUF HU \n", + "2 Reimbursement of financial discipline (EAGF, EU) HUF HU \n", + "3 Payments for agricultural practises beneficial... HUF HU \n", + "4 Single area payment scheme (SAPS) (EAGF, EU) HUF HU " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "df.to_csv('hu_2022.csv', encoding='utf-8', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/ie/README.md b/countries/ie/README.md similarity index 100% rename from ie/README.md rename to countries/ie/README.md diff --git a/ie/convert.py b/countries/ie/convert.py similarity index 100% rename from ie/convert.py rename to countries/ie/convert.py diff --git a/ie/ie_scraper.ipynb b/countries/ie/ie_scraper.ipynb similarity index 100% rename from ie/ie_scraper.ipynb rename to countries/ie/ie_scraper.ipynb diff --git a/ie/ie_scraper.py b/countries/ie/ie_scraper.py similarity index 100% rename from ie/ie_scraper.py rename to countries/ie/ie_scraper.py diff --git a/it/README.md b/countries/it/README.md similarity index 100% rename from it/README.md rename to countries/it/README.md diff --git a/countries/it/captcha/__init__.py b/countries/it/captcha/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/countries/it/captcha/agea_captcha/__init__.py b/countries/it/captcha/agea_captcha/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/it/captcha/agea_captcha/captcha.py b/countries/it/captcha/agea_captcha/captcha.py similarity index 100% rename from it/captcha/agea_captcha/captcha.py rename to countries/it/captcha/agea_captcha/captcha.py diff --git a/it/captcha/captcha_trainer.ipynb b/countries/it/captcha/captcha_trainer.ipynb similarity index 100% rename from it/captcha/captcha_trainer.ipynb rename to countries/it/captcha/captcha_trainer.ipynb diff --git a/it/captcha/solve_captchas.py b/countries/it/captcha/solve_captchas.py similarity index 100% rename from it/captcha/solve_captchas.py rename to countries/it/captcha/solve_captchas.py diff --git a/it/it_converter.ipynb b/countries/it/it_converter.ipynb similarity index 100% rename from it/it_converter.ipynb rename to countries/it/it_converter.ipynb diff --git a/it/it_scraper.ipynb b/countries/it/it_scraper.ipynb similarity index 100% rename from it/it_scraper.ipynb rename to countries/it/it_scraper.ipynb diff --git a/lt/README.md b/countries/lt/README.md similarity index 100% rename from lt/README.md rename to countries/lt/README.md diff --git a/countries/lt/lt_scraper.ipynb b/countries/lt/lt_scraper.ipynb new file mode 100644 index 0000000..18183b0 --- /dev/null +++ b/countries/lt/lt_scraper.ipynb @@ -0,0 +1,8571 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "from lxml import html\n", + "\n", + "import pandas as pd\n", + "\n", + "from slugify import slugify\n", + "\n", + "from IPython.core.display import display, HTML\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "YEAR = 2020" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_URL = 'https://portal.nma.lt/nma-portal/pages/fas_search'\n", + "PROGRAM = 'KP13'\n", + "\n", + "QUERY = {\n", + " 'pa': 'pl',\n", + " 'pTipas': 'p',\n", + " 'psl_nr': '1',\n", + " 'programos_kodas': PROGRAM,\n", + " 'fin_metai': str(YEAR),\n", + " 'pareiskejas': '',\n", + " 'apskritis': '',\n", + " 'savivaldybe': '',\n", + " 'priemone': '',\n", + " 't_suma': '',\n", + " 'k_suma': '',\n", + " 'v_suma': '',\n", + " 'b_suma': '',\n", + " 'action': 'Ieškoti',\n", + "}\n", + "\n", + "def get_page(session, year=YEAR, page=1):\n", + " query = dict(QUERY)\n", + " query.update({\n", + " 'psl_nr': str(page),\n", + " 'fin_metai': str(year)\n", + " })\n", + " response = session.post(BASE_URL, data=query, headers={\n", + " 'Content-Type': 'application/x-www-form-urlencoded',\n", + " 'Referer': 'https://portal.nma.lt/nma-portal/pages/fas_search',\n", + " })\n", + " return response\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class EndOfPagination(Exception):\n", + " pass\n", + "\n", + "SUBSIDY_TYPES = {\n", + " 0: 'EAGF',\n", + " 1: 'EAGF - other',\n", + " 2: 'EAFRD',\n", + "}\n", + "\n", + "def extract_subsidies(text, year):\n", + " root = html.fromstring(text)\n", + " table = root.xpath('//table[1]')\n", + " if not table:\n", + " raise EndOfPagination\n", + " table = table[0]\n", + " trs = table.xpath('.//tr')\n", + " base = None\n", + " for tr in trs:\n", + " tds = tr.xpath('./td')\n", + " if tr.attrib.get('id'):\n", + " base = {\n", + " 'year': year,\n", + " 'country': 'LT',\n", + " 'currency': 'EUR',\n", + "# 'recipient_id': tr.attrib.get('id'), # bad not id\n", + " 'recipient_name': tds[0].text_content(),\n", + " 'recipient_location': '%s, %s' % (\n", + " tds[2].text_content().replace('rajonas', '').strip(),\n", + " tds[1].text_content().replace('apskritis', '').strip(),\n", + " )\n", + " }\n", + " else:\n", + " subsidy_name = tds[3].text_content()\n", + " for i in range(3):\n", + " amount = float(tds[4 + i].text_content().replace(',', '.'))\n", + " if amount > 0:\n", + " subsidy = dict(base)\n", + " subsidy.update({\n", + " 'scheme': '%s (%s)' % (subsidy_name, SUBSIDY_TYPES[i]),\n", + " 'amount': amount\n", + " })\n", + " yield subsidy\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def get_subsidies(year):\n", + " session = requests.Session()\n", + " response = session.get(BASE_URL)\n", + " # display(HTML(response.text))\n", + " response = session.post(BASE_URL, data={'pa': 'sf', 'programos_kodas': PROGRAM}, headers={\n", + " 'Content-Type': 'application/x-www-form-urlencoded',\n", + " 'Referer': 'https://portal.nma.lt/nma-portal/pages/fas_search'\n", + " })\n", + " # print(response.request.headers)\n", + " # display(HTML(response.text))\n", + " page = 1\n", + " while True:\n", + " r = get_page(session, year=year, page=page)\n", + " yield extract_subsidies(r.text, year)\n", + " page += 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "496\n", + "970\n", + "1466\n", + "2027\n", + "2528\n", + "3090\n", + "3633\n", + "4193\n", + "4698\n", + "5200\n", + "5716\n", + "6205\n", + "6741\n", + "7283\n", + "7829\n", + "8321\n", + "8799\n", + "9286\n", + "9788\n", + "10247\n", + "10731\n", + "11300\n", + "11834\n", + "12342\n", + "12846\n", + "13390\n", + "13934\n", + "14445\n", + "14970\n", + "15510\n", + "16055\n", + "16587\n", + "17109\n", + "17630\n", + "18162\n", + "18751\n", + "19340\n", + "19907\n", + "20453\n", + "21004\n", + "21550\n", + "22138\n", + "22661\n", + "23187\n", + "23687\n", + "24224\n", + "24747\n", + "25328\n", + "25912\n", + "26498\n", + "27055\n", + "27618\n", + "28174\n", + "28682\n", + "29300\n", + "29919\n", + "30540\n", + "31126\n", + "31781\n", + "32282\n", + "32736\n", + "33241\n", + "33710\n", + "34276\n", + "34794\n", + "35324\n", + "35805\n", + "36357\n", + "36875\n", + "37415\n", + "37959\n", + "38535\n", + "39087\n", + "39656\n", + "40160\n", + "40693\n", + "41249\n", + "41745\n", + "42271\n", + "42859\n", + "43466\n", + "44071\n", + "44639\n", + "45273\n", + "45864\n", + "46478\n", + "47080\n", + "47634\n", + "48209\n", + "48775\n", + "49335\n", + "49880\n", + "50471\n", + "51027\n", + "51326\n", + "51861\n", + "52372\n", + "52945\n", + "53492\n", + "54070\n", + "54637\n", + "55138\n", + "55699\n", + "56246\n", + "56837\n", + "57425\n", + "57969\n", + "58527\n", + "59036\n", + "59541\n", + "60003\n", + "60517\n", + "61026\n", + "61556\n", + "62078\n", + "62539\n", + "63065\n", + "63564\n", + "64054\n", + "64559\n", + "65070\n", + "65595\n", + "66121\n", + "66616\n", + "67166\n", + "67718\n", + "68302\n", + "68904\n", + "69425\n", + "69986\n", + "70557\n", + "71112\n", + "71660\n", + "72177\n", + "72740\n", + "73329\n", + "73871\n", + "74432\n", + "74994\n", + "75512\n", + "76050\n", + "76576\n", + "77116\n", + "77610\n", + "78129\n", + "78642\n", + "79122\n", + "79592\n", + "80119\n", + "80666\n", + "81248\n", + "81843\n", + "82461\n", + "83031\n", + "83635\n", + "84256\n", + "84818\n", + "85407\n", + "85988\n", + "86488\n", + "87036\n", + "87683\n", + "88275\n", + "88883\n", + "89393\n", + "89941\n", + "90470\n", + "90984\n", + "91567\n", + "92136\n", + "92652\n", + "93215\n", + "93741\n", + "94296\n", + "94923\n", + "95479\n", + "96044\n", + "96588\n", + "97196\n", + "97678\n", + "98139\n", + "98652\n", + "99128\n", + "99672\n", + "100171\n", + "100629\n", + "101158\n", + "101692\n", + "102226\n", + "102768\n", + "103353\n", + "103918\n", + "104509\n", + "105040\n", + "105551\n", + "106079\n", + "106645\n", + "107217\n", + "107780\n", + "108349\n", + "108867\n", + "109372\n", + "109858\n", + "110354\n", + "110850\n", + "111407\n", + "111988\n", + "112572\n", + "113116\n", + "113653\n", + "114239\n", + "114807\n", + "115379\n", + "115977\n", + "116550\n", + "117096\n", + "117641\n", + "118191\n", + "118726\n", + "119302\n", + "119900\n", + "120423\n", + "120918\n", + "121482\n", + "122026\n", + "122576\n", + "123126\n", + "123694\n", + "124200\n", + "124725\n", + "125277\n", + "125853\n", + "126398\n", + "126977\n", + "127501\n", + "128001\n", + "128482\n", + "129011\n", + "129533\n", + "130020\n", + "130551\n", + "131051\n", + "131561\n", + "132104\n", + "132651\n", + "133201\n", + "133682\n", + "134123\n", + "134633\n", + "135164\n", + "135654\n", + "136133\n", + "136638\n", + "137096\n", + "137545\n", + "138022\n", + "138530\n", + "139036\n", + "139552\n", + "140086\n", + "140651\n", + "141173\n", + "141703\n", + "142230\n", + "142792\n", + "143357\n", + "143860\n", + "144409\n", + "144978\n", + "145519\n", + "146036\n", + "146595\n", + "147150\n", + "147672\n", + "148218\n", + "148749\n", + "149243\n", + "149796\n", + "150322\n", + "150854\n", + "151375\n", + "151849\n", + "152413\n", + "152938\n", + "153457\n", + "154011\n", + "154583\n", + "155077\n", + "155606\n", + "156141\n", + "156699\n", + "157252\n", + "157778\n", + "158342\n", + "158893\n", + "159420\n", + "159956\n", + "160522\n", + "161035\n", + "161593\n", + "162191\n", + "162779\n", + "163317\n", + "163881\n", + "164457\n", + "164916\n", + "165372\n", + "165999\n", + "166452\n", + "166962\n", + "167513\n", + "168058\n", + "168562\n", + "169100\n", + "169705\n", + "170276\n", + "170817\n", + "171363\n", + "171969\n", + "172523\n", + "173074\n", + "173647\n", + "174114\n", + "174649\n", + "175182\n", + "175720\n", + "176282\n", + "176810\n", + "177323\n", + "177865\n", + "178445\n", + "179001\n", + "179579\n", + "180128\n", + "180597\n", + "181090\n", + "181658\n", + "182255\n", + "182784\n", + "183292\n", + "183773\n", + "184295\n", + "184846\n", + "185418\n", + "185980\n", + "186545\n", + "187109\n", + "187695\n", + "188245\n", + "188734\n", + "189292\n", + "189819\n", + "190376\n", + "190927\n", + "191508\n", + "192143\n", + "192754\n", + "193305\n", + "193787\n", + "194268\n", + "194713\n", + "195186\n", + "195726\n", + "196236\n", + "196752\n", + "197375\n", + "197969\n", + "198579\n", + "199174\n", + "199675\n", + "199792\n", + "199911\n", + "200028\n", + "200509\n", + "200979\n", + "201492\n", + "202092\n", + "202668\n", + "203286\n", + "203915\n", + "204495\n", + "205111\n", + "205642\n", + "206202\n", + "206756\n", + "207226\n", + "207756\n", + "208332\n", + "208920\n", + "209471\n", + "209962\n", + "210443\n", + "210961\n", + "211480\n", + "212031\n", + "212572\n", + "213058\n", + "213532\n", + "214049\n", + "214523\n", + "215034\n", + "215496\n", + "215998\n", + "216465\n", + "217019\n", + "217482\n", + "218046\n", + "218633\n", + "219249\n", + "219837\n", + "220358\n", + "220928\n", + "221442\n", + "221985\n", + "222546\n", + "223118\n", + "223640\n", + "224132\n", + "224650\n", + "225206\n", + "225754\n", + "226289\n", + "226805\n", + "227338\n", + "227809\n", + "228278\n", + "228869\n", + "229448\n", + "230026\n", + "230624\n", + "231167\n", + "231731\n", + "232344\n", + "232897\n", + "233403\n", + "233906\n", + "234447\n", + "234995\n", + "235561\n", + "236107\n", + "236678\n", + "237206\n", + "237735\n", + "238269\n", + "238795\n", + "239314\n", + "239860\n", + "240452\n", + "241040\n", + "241623\n", + "242146\n", + "242683\n", + "243229\n", + "243815\n", + "244373\n", + "244891\n", + "245431\n", + "245968\n", + "246529\n", + "247085\n", + "247633\n", + "248153\n", + "248690\n", + "249266\n", + "249836\n", + "250430\n", + "250990\n", + "251506\n", + "252071\n", + "252621\n", + "253168\n", + "253712\n", + "254246\n", + "254868\n", + "255401\n", + "255981\n", + "256562\n", + "257109\n", + "257670\n", + "258245\n", + "258752\n", + "259287\n", + "259839\n", + "260383\n", + "260929\n", + "261477\n", + "262083\n", + "262602\n", + "263126\n", + "263663\n", + "264156\n", + "264698\n", + "265277\n", + "265869\n", + "266442\n", + "267005\n", + "267582\n", + "268126\n", + "268699\n", + "269247\n", + "269808\n", + "270337\n", + "270941\n", + "271479\n", + "272021\n", + "272579\n", + "273125\n", + "273631\n", + "274157\n", + "274704\n", + "275178\n", + "275644\n", + "276146\n", + "276662\n", + "277212\n", + "277741\n", + "278247\n", + "278712\n", + "279198\n", + "279754\n", + "280353\n", + "280866\n", + "281431\n", + "281973\n", + "282503\n", + "283001\n", + "283442\n", + "284007\n", + "284538\n", + "285094\n", + "285613\n", + "286144\n", + "286763\n", + "287358\n", + "287861\n", + "288396\n", + "288857\n", + "289440\n", + "290065\n", + "290695\n", + "291320\n", + "291928\n", + "292309\n", + "292603\n", + "292918\n", + "293233\n", + "293518\n", + "293853\n", + "294250\n", + "294705\n", + "295259\n", + "295792\n", + "296320\n", + "296884\n", + "297438\n", + "297999\n", + "298591\n", + "299208\n", + "299774\n", + "300367\n", + "300955\n", + "301507\n", + "302086\n", + "302633\n", + "303133\n", + "303711\n", + "304225\n", + "304740\n", + "305206\n", + "305736\n", + "306251\n", + "306735\n", + "307215\n", + "307715\n", + "308223\n", + "308729\n", + "309224\n", + "309754\n", + "310311\n", + "310870\n", + "311413\n", + "311944\n", + "312560\n", + "313147\n", + "313683\n", + "314212\n", + "314664\n", + "315215\n", + "315749\n", + "316301\n", + "316885\n", + "317456\n", + "318016\n", + "318554\n", + "319116\n", + "319653\n", + "320206\n", + "320751\n", + "321259\n", + "321842\n", + "322362\n", + "322884\n", + "323455\n", + "324014\n", + "324563\n", + "325104\n", + "325625\n", + "326208\n", + "326766\n", + "327342\n", + "327926\n", + "328372\n", + "328902\n", + "329374\n", + "329931\n", + "330453\n", + "331006\n", + "331530\n", + "332120\n", + "332701\n", + "333249\n", + "333791\n", + "334300\n", + "334862\n", + "335416\n", + "335926\n", + "336449\n", + "337037\n", + "337585\n", + "338149\n", + "338714\n", + "339268\n", + "339807\n", + "340328\n", + "340882\n", + "341445\n", + "341928\n", + "342304\n", + "342804\n", + "343339\n", + "343876\n", + "344441\n", + "344995\n", + "345485\n", + "346039\n", + "346564\n", + "347065\n", + "347570\n", + "348052\n", + "348553\n", + "349161\n", + "349724\n", + "350297\n", + "350887\n", + "351447\n", + "352105\n", + "352335\n", + "352664\n", + "353003\n", + "353332\n", + "353660\n", + "353996\n", + "354338\n", + "354681\n", + "355011\n", + "355347\n", + "355674\n", + "356011\n", + "356346\n", + "356689\n", + "357033\n", + "357377\n", + "357728\n", + "358063\n", + "358412\n", + "358773\n", + "359114\n", + "359446\n", + "359796\n", + "360146\n", + "360500\n", + "360843\n", + "361199\n", + "361546\n", + "361898\n", + "362242\n", + "362561\n", + "362817\n", + "363083\n", + "363338\n", + "363627\n", + "363910\n", + "364154\n", + "364435\n", + "364705\n", + "364981\n", + "365269\n", + "365534\n", + "374815\n", + "375155\n", + "375515\n", + "375853\n", + "376210\n", + "376577\n", + "376939\n", + "377286\n", + "377634\n", + "377976\n", + "378326\n", + "378676\n", + "379023\n", + "379377\n", + "379723\n", + "380081\n", + "380435\n", + "380794\n", + "381161\n", + "381517\n", + "381890\n", + "382249\n", + "382617\n", + "382970\n", + "383305\n", + "383657\n", + "384026\n", + "384380\n", + "384749\n", + "385103\n", + "385453\n", + "385799\n", + "386161\n", + "386529\n", + "386868\n", + "387225\n", + "387580\n", + "387918\n", + "388270\n", + "388624\n", + "388981\n", + "389332\n", + "389676\n", + "390028\n", + "390399\n", + "390742\n", + "391104\n", + "391460\n", + "391804\n", + "392161\n", + "392515\n", + "392875\n", + "393236\n", + "393604\n", + "393963\n", + "394316\n", + "394669\n", + "395037\n", + "395386\n", + "395742\n", + "396091\n", + "396466\n", + "396814\n", + "397167\n", + "397521\n", + "397867\n", + "398220\n", + "398568\n", + "398921\n", + "399274\n", + "399636\n", + "399988\n", + "400334\n", + "400685\n", + "401039\n", + "401381\n", + "401729\n", + "402075\n", + "402424\n", + "402773\n", + "403125\n", + "403478\n", + "403815\n", + "404169\n", + "404522\n", + "404872\n", + "405235\n", + "405591\n", + "405943\n", + "406295\n", + "406635\n", + "406985\n", + "407336\n", + "407686\n", + "408032\n", + "408378\n", + "408735\n", + "409079\n", + "409430\n", + "409789\n", + "410144\n", + "410501\n", + "410851\n", + "411192\n", + "411547\n", + "411917\n", + "412282\n", + "412617\n", + "412980\n", + "413318\n", + "413658\n", + "413989\n", + "414320\n", + "414652\n", + "414988\n", + "415316\n", + "415653\n", + "415973\n", + "416307\n", + "416637\n", + "416977\n", + "417306\n", + "417634\n", + "417968\n", + "418308\n", + "418658\n", + "418983\n", + "419327\n", + "419660\n", + "419999\n", + "420328\n", + "420661\n", + "421003\n", + "421345\n", + "421671\n", + "422019\n", + "422366\n", + "422711\n", + "423037\n", + "423383\n", + "423713\n", + "424067\n", + "424420\n", + "424766\n", + "425109\n", + "425443\n", + "425783\n", + "426126\n", + "426469\n", + "426826\n", + "427155\n", + "427488\n", + "427823\n", + "428163\n", + "428518\n", + "428855\n", + "429201\n", + "429543\n", + "429877\n", + "430214\n", + "430569\n", + "430915\n", + "431256\n", + "431608\n", + "431930\n", + "432178\n", + "432409\n", + "432654\n", + "432901\n", + "433144\n", + "433383\n", + "433647\n", + "433907\n", + "434160\n", + "434421\n", + "434662\n", + "434905\n", + "435148\n", + "435391\n", + "435622\n", + "435864\n", + "436123\n", + "436401\n", + "436619\n", + "436887\n", + "437113\n", + "437330\n", + "437588\n", + "437845\n", + "438118\n", + "438364\n", + "438623\n", + "438884\n", + "439132\n", + "439403\n", + "439657\n", + "439904\n", + "440138\n", + "440364\n", + "440621\n", + "440852\n", + "441079\n", + "441320\n", + "441566\n", + "441799\n", + "442056\n", + "442302\n", + "442521\n", + "442771\n", + "443011\n", + "443283\n", + "443598\n", + "443896\n", + "444184\n", + "444481\n", + "444792\n", + "445087\n", + "445390\n", + "445703\n", + "446029\n", + "446355\n", + "446709\n", + "447063\n", + "447407\n", + "447745\n", + "448093\n", + "448429\n", + "448785\n", + "449134\n", + "449468\n", + "449809\n", + "450149\n", + "450517\n", + "450863\n", + "451213\n", + "451575\n", + "451926\n", + "452279\n", + "452629\n", + "452967\n", + "453327\n", + "453670\n", + "454020\n", + "454365\n", + "454718\n", + "455053\n", + "455403\n", + "455752\n", + "456116\n", + "456457\n", + "456804\n", + "457168\n", + "457527\n", + "457872\n", + "458218\n", + "458567\n", + "458922\n", + "459282\n", + "459648\n", + "459993\n", + "460353\n", + "460694\n", + "461040\n", + "461394\n", + "461741\n", + "462099\n", + "462453\n", + "462806\n", + "463176\n", + "463521\n", + "463875\n", + "464232\n", + "464585\n", + "464940\n", + "465284\n", + "465626\n", + "465978\n", + "466324\n", + "466683\n", + "467057\n", + "467422\n", + "467767\n", + "468125\n", + "468466\n", + "468827\n", + "469174\n", + "469527\n", + "469878\n", + "470229\n", + "470587\n", + "470941\n", + "471304\n", + "471662\n", + "472009\n", + "472361\n", + "472733\n", + "473072\n", + "473428\n", + "473793\n", + "474153\n", + "474514\n", + "474867\n", + "475220\n", + "475573\n", + "475931\n", + "476286\n", + "476646\n", + "477010\n", + "477372\n", + "477732\n", + "478078\n", + "478442\n", + "478794\n", + "479162\n", + "479503\n", + "479862\n", + "480223\n", + "480576\n", + "480924\n", + "481272\n", + "481635\n", + "481945\n", + "482302\n", + "482634\n", + "482962\n", + "483275\n", + "483599\n", + "483947\n", + "484231\n", + "484573\n", + "484894\n", + "485234\n", + "485554\n", + "485905\n", + "486210\n", + "486576\n", + "486881\n", + "487220\n", + "487540\n", + "487889\n", + "488224\n", + "488535\n", + "488843\n", + "489200\n", + "489572\n", + "489890\n", + "490234\n", + "490559\n", + "490890\n", + "491213\n", + "491548\n", + "491862\n", + "492215\n", + "492567\n", + "492889\n", + "493230\n", + "493548\n", + "493916\n", + "494199\n", + "494563\n", + "494881\n", + "495245\n", + "495552\n", + "495889\n", + "496213\n", + "496549\n", + "496895\n", + "497211\n", + "497557\n", + "497895\n", + "498258\n", + "498569\n", + "498928\n", + "499243\n", + "499574\n", + "499866\n", + "500204\n", + "500527\n", + "500880\n", + "501188\n", + "501483\n", + "501848\n", + "502124\n", + "502476\n", + "502771\n", + "503118\n", + "503433\n", + "503777\n", + "504103\n", + "504453\n", + "504822\n", + "505074\n", + "505430\n", + "505795\n", + "506132\n", + "506314\n", + "506640\n", + "506990\n", + "507318\n", + "507602\n", + "507949\n", + "508315\n", + "508529\n", + "508801\n", + "509149\n", + "509509\n", + "509754\n", + "510117\n", + "510484\n", + "510773\n", + "510999\n", + "511364\n", + "511745\n", + "512037\n", + "512325\n", + "512676\n", + "513031\n", + "513248\n", + "513534\n", + "513883\n", + "514248\n", + "514533\n", + "514832\n", + "515179\n", + "515517\n", + "515676\n", + "515959\n", + "516305\n", + "516674\n", + "516942\n", + "517302\n", + "517673\n", + "517971\n", + "518206\n", + "518556\n", + "518938\n", + "519190\n", + "519534\n", + "519905\n", + "520218\n", + "520436\n", + "520799\n", + "521193\n", + "521486\n", + "521785\n", + "522127\n", + "522491\n", + "522731\n", + "523001\n", + "523372\n", + "523715\n", + "524070\n", + "524431\n", + "524758\n", + "525101\n", + "525465\n", + "525803\n", + "526152\n", + "526514\n", + "526837\n", + "527228\n", + "527561\n", + "527912\n", + "528272\n", + "528593\n", + "528940\n", + "529308\n", + "529670\n", + "530039\n", + "530381\n", + "530710\n", + "531069\n", + "531396\n", + "531741\n", + "532112\n", + "532433\n", + "532779\n", + "533160\n", + "533491\n", + "533867\n", + "534202\n", + "534526\n", + "534898\n", + "535252\n", + "535605\n", + "535963\n", + "536269\n", + "536610\n", + "536960\n", + "537300\n", + "537661\n", + "538026\n", + "538354\n", + "538713\n", + "539040\n", + "539392\n", + "539733\n", + "540081\n", + "540441\n", + "540769\n", + "541098\n", + "541447\n", + "541808\n", + "542149\n", + "542478\n", + "542795\n", + "543144\n", + "543490\n", + "543849\n", + "544232\n", + "544604\n", + "544960\n", + "545278\n", + "545610\n", + "545913\n", + "546253\n", + "546603\n", + "546942\n", + "547254\n", + "547628\n", + "548005\n", + "548367\n", + "548690\n", + "549007\n", + "549339\n", + "549669\n", + "550019\n", + "550373\n", + "550740\n", + "551093\n", + "551424\n", + "551784\n", + "552085\n", + "552438\n", + "552778\n", + "553110\n", + "553444\n", + "553817\n", + "554176\n", + "554529\n", + "554865\n", + "555195\n", + "555536\n", + "555861\n", + "556227\n", + "564128\n", + "564471\n", + "564826\n", + "565155\n", + "565496\n", + "565916\n", + "566262\n", + "566586\n", + "566890\n", + "567242\n", + "567593\n", + "567924\n", + "568257\n", + "568622\n", + "568988\n", + "569322\n", + "569682\n", + "570024\n", + "570346\n", + "570694\n", + "571031\n", + "571368\n", + "571739\n", + "572140\n", + "572465\n", + "572781\n", + "573106\n", + "573456\n", + "573795\n", + "574133\n", + "574483\n", + "574879\n", + "575244\n", + "575584\n", + "575926\n", + "576214\n", + "576562\n", + "576901\n", + "577240\n", + "577599\n", + "577988\n", + "578396\n", + "578736\n", + "579061\n", + "579378\n", + "579736\n", + "580072\n", + "580398\n", + "580740\n", + "581109\n", + "581474\n", + "581805\n", + "582151\n", + "582454\n", + "582801\n", + "583148\n", + "583490\n", + "583832\n", + "584201\n", + "584568\n", + "584901\n", + "585238\n", + "585588\n", + "585940\n", + "586277\n", + "586622\n", + "587011\n", + "587386\n", + "587755\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n", + "587842\n" + ] + } + ], + "source": [ + "df = pd.DataFrame()\n", + "for page_gen in get_subsidies(YEAR):\n", + " try:\n", + " df = pd.concat([df, pd.DataFrame(page_gen)])\n", + " except EndOfPagination:\n", + " pass\n", + " df.to_csv('lt_%s.csv.gz' % YEAR, compression='gzip', index=False)\n", + " print(len(df))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "132659" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"recipient_name\"].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "df['recipient_id'] = df.apply(lambda x: \"LT-{}-{}\".format(slugify(x['recipient_name']), slugify(x['recipient_location'])), 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearcountrycurrencyrecipient_idrecipient_namerecipient_locationschemeamount
02020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsŽalinimo išmoka (EAGF)1373.08
12020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsFinansų disciplinos kompensavimo išmoka (EAGF)37.54
22020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsSusietoji parama už baltyminius augalus (EAGF)87.10
32020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsTiesioginės išmokos už pasėlius (EAGF)1690.05
42020LTEURLT-a-vaiciukynienes-individuali-imone-jurbarko...A. Vaičiukynienės individuali įmonėJurbarko, TauragėsIšmoka už pirmuosius hektarus (EAGF)1591.48
\n", + "
" + ], + "text/plain": [ + " year country currency recipient_id \\\n", + "0 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "1 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "2 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "3 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "4 2020 LT EUR LT-a-vaiciukynienes-individuali-imone-jurbarko... \n", + "\n", + " recipient_name recipient_location \\\n", + "0 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "1 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "2 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "3 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "4 A. Vaičiukynienės individuali įmonė Jurbarko, Tauragės \n", + "\n", + " scheme amount \n", + "0 Žalinimo išmoka (EAGF) 1373.08 \n", + "1 Finansų disciplinos kompensavimo išmoka (EAGF) 37.54 \n", + "2 Susietoji parama už baltyminius augalus (EAGF) 87.10 \n", + "3 Tiesioginės išmokos už pasėlius (EAGF) 1690.05 \n", + "4 Išmoka už pirmuosius hektarus (EAGF) 1591.48 " + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv('lt_%s.csv.gz' % YEAR, compression='gzip', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/countries/lt/lt_scraper.py b/countries/lt/lt_scraper.py new file mode 100644 index 0000000..17e7239 --- /dev/null +++ b/countries/lt/lt_scraper.py @@ -0,0 +1,158 @@ +import asyncio +import csv +import time +import os + +import lxml.html +from playwright.async_api import async_playwright +import httpx +from tqdm import tqdm +import pandas as pd + + +YEAR = 2021 +BASE_URL = 'https://portal.nma.lt/nma-portal/pages/fas_search' +PROGRAM_NAME = 'KP13' + + + +async def get_session(): + + headers = None + + async def find_data_request(request): + nonlocal headers + + if request.method == 'GET' and request.url == BASE_URL: + print("Found request") + headers = await request.all_headers() + headers = headers.copy() + + + async with async_playwright() as p: + print("Launch browser") + browser = await p.firefox.launch(headless=False) + page = await browser.new_page() + page.set_default_navigation_timeout(120_000) + + await page.goto(BASE_URL) + # page.on("response", lambda response: print("<<", response.status, response.url)) + await page.wait_for_load_state(state="networkidle") + await page.locator(f"a[href=\"javascript:submitForm('{PROGRAM_NAME}');\"]").click() + await page.wait_for_load_state(state="networkidle") + + page.on("request", lambda request: print(">>", request.method, request.url)) + page.on("request", find_data_request) + await page.goto(BASE_URL) + + headers.pop("content-length", None) + return headers + + +class EndOfPagination(Exception): + pass + + +SUBSIDY_TYPES = { + 0: 'EAGF', + 1: 'EAGF - other', + 2: 'EAFRD', +} + +def get_data_items(root): + table = root.xpath('//table[1]') + if not table: + raise EndOfPagination + table = table[0] + trs = table.xpath('.//tr') + base = None + for tr in trs: + tds = tr.xpath('./td') + if tr.attrib.get('id'): + base = { + 'year': YEAR, + 'country': 'LT', + 'currency': 'EUR', + 'recipient_id': tr.attrib.get('id'), + 'recipient_name': tds[0].text_content(), + 'recipient_location': '%s, %s' % ( + tds[2].text_content().replace('rajonas', '').strip(), + tds[1].text_content().replace('apskritis', '').strip(), + ) + } + else: + subsidy_name = tds[3].text_content() + for i in range(3): + amount = float(tds[4 + i].text_content().replace(',', '.')) + if amount > 0: + subsidy = dict(base) + subsidy.update({ + 'scheme': '%s (%s)' % (subsidy_name, SUBSIDY_TYPES[i]), + 'amount': amount + }) + yield subsidy + + +def download_offset(page_num, headers): + post_data = { + "pa": "pl", + "pTipas": "p", + "psl_nr": str(page_num), + "programos_kodas": PROGRAM_NAME, + "fin_metai": str(YEAR), + "pareiskejas": "", + "apskritis": "", + "savivaldybe": "", + "priemone": "", + "t_suma": "", + "k_suma": "", + "v_suma": "", + "b_suma": "", + "action": "Ieškoti", + } + response = httpx.post(BASE_URL, headers=headers.copy(), data=post_data, timeout=120) + with open("page.html", "w") as f: + f.write(response.text) + root = lxml.html.fromstring(response.text) + yield from get_data_items(root) + +OFFSET_FILE = 'lt_offset.txt' + +def update_offset(offset): + with open(OFFSET_FILE, 'w') as f: + f.write(str(offset)) + + +def read_offset(): + if not os.path.exists(OFFSET_FILE): + return 1 + with open(OFFSET_FILE, 'r') as f: + return int(f.read()) + +def main(): + headers = asyncio.run(get_session()) + print("Headers:", headers) + output_filename = f'lt_{YEAR}.csv.gz' + if os.path.exists(output_filename): + df = pd.read_csv(output_filename) + else: + df = pd.DataFrame() + page_num = read_offset() + while True: + print("Downloading page", page_num) + try: + df = pd.concat([df, pd.DataFrame(list(download_offset(page_num, headers)))]) + df.to_csv(output_filename, index=False, compression='gzip') + page_num += 1 + update_offset(page_num) + except EndOfPagination: + print("End of pagination") + break + except Exception as e: + print(e) + time.sleep(30) + headers = asyncio.run(get_session()) + + +if __name__ == '__main__': + main() diff --git a/lt/scraper_lt.ipynb b/countries/lt/scraper_lt.ipynb similarity index 100% rename from lt/scraper_lt.ipynb rename to countries/lt/scraper_lt.ipynb diff --git a/lu/README.md b/countries/lu/README.md similarity index 100% rename from lu/README.md rename to countries/lu/README.md diff --git a/lu/lu_scraper.ipynb b/countries/lu/lu_scraper.ipynb similarity index 100% rename from lu/lu_scraper.ipynb rename to countries/lu/lu_scraper.ipynb diff --git a/lu/lu_scraper.py b/countries/lu/lu_scraper.py similarity index 100% rename from lu/lu_scraper.py rename to countries/lu/lu_scraper.py diff --git a/lv/README.md b/countries/lv/README.md similarity index 100% rename from lv/README.md rename to countries/lv/README.md diff --git a/lv/lv_scraper.ipynb b/countries/lv/lv_scraper.ipynb similarity index 100% rename from lv/lv_scraper.ipynb rename to countries/lv/lv_scraper.ipynb diff --git a/mt/README.md b/countries/mt/README.md similarity index 100% rename from mt/README.md rename to countries/mt/README.md diff --git a/countries/mt/scraper_mt-bad.ipynb b/countries/mt/scraper_mt-bad.ipynb new file mode 100644 index 0000000..d087c4d --- /dev/null +++ b/countries/mt/scraper_mt-bad.ipynb @@ -0,0 +1,250 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Scraper MT\n", + "\n", + "This is an unfinished debug scraper to fix the scrapy scraper." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "from lxml import html\n", + "\n", + "from multidict import MultiDict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "YEAR = 2019\n", + "BASE_URL = 'https://agrikoltura.gov.mt/en/arpa/Pages/PaymentSearch/EAGFPayments.aspx'\n", + "\n", + "HEADERS = {\n", + " 'Connection': 'keep-alive',\n", + " 'Pragma': 'no-cache',\n", + " 'Cache-Control': 'no-cache',\n", + " 'Origin': 'https://msdec.gov.mt',\n", + " 'Upgrade-Insecure-Requests': '1',\n", + " 'DNT': '1',\n", + " 'Content-Type': 'application/x-www-form-urlencoded',\n", + " 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n", + " 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',\n", + " 'Referer': 'https://msdec.gov.mt/en/arpa/Pages/Payments.aspx',\n", + " 'Accept-Encoding': 'gzip, deflate, br',\n", + " 'Accept-Language': 'en-US,en;q=0.9,de;q=0.8',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_form_data_from_form(form):\n", + " form_data = MultiDict()\n", + " for el in form.xpath('.//input[@name]|.//select[@name]|.//textarea[@name]|.//button[@name]'):\n", + " data = {}\n", + " if el.tag == 'input':\n", + " if el.attrib.get('type') == 'radio' or el.attrib.get('type') == 'checkbox':\n", + " if el.attrib.get('checked', None):\n", + " data[el.attrib['name']] = el.attrib.get('value', '')\n", + " else:\n", + " data[el.attrib['name']] = el.attrib.get('value', '')\n", + " elif el.tag == 'select':\n", + " options = el.xpath('./option[@selected]')\n", + " if options:\n", + " data[el.attrib['name']] = options[0].attrib.get('value', '')\n", + " else:\n", + " data[el.attrib['name']] = ''\n", + " elif el.tag == 'textarea':\n", + " data[el.sttrib['name']] = el.text or ''\n", + " elif el.tag == 'button':\n", + " if el.attrib.get('type', None) == 'submit':\n", + " data[el.attrib['name']] = el.attrib.get('value', '')\n", + " form_data.extend(data)\n", + " return form_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "session = requests.Session()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "get_response = session.get(BASE_URL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "root = html.fromstring(get_response.content)\n", + "form_data = get_form_data_from_form(root.xpath('//form')[0])\n", + "\n", + "form_data.update({\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo5': str(YEAR),\n", + " '__SCROLLPOSITIONX': '0',\n", + " '__SCROLLPOSITIONY': '0',\n", + " '__LASTFOCUS': '',\n", + " 'search': '0',\n", + " '__EVENTARGUMENT': '',\n", + " 'hiddenInputToUpdateATBuffer_CommonToolkitScripts': '1',\n", + " '__EVENTTARGET': '',\n", + " 'InputKeywords': 'Search',\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "response = session.post(BASE_URL, data=form_data, headers=HEADERS)\n", + "response" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "cookies = {\n", + " 'ISAWPLB{57C3C324-9678-4645-92E4-C5C8021907F0}': '{0522A075-2DF2-4AC9-BC79-4095D0BF864C}',\n", + " '__utma': '164950819.2137698559.1542035923.1542035923.1542035923.1',\n", + " '__utmb': '164950819',\n", + " '__utmc': '164950819',\n", + " '__utmz': '164950819.1542035923.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)',\n", + "}\n", + "\n", + "\n", + "\n", + "data = {\n", + " '_wpcmWpid': '',\n", + " 'wpcmVal': '',\n", + " 'MSOWebPartPage_PostbackSource': '',\n", + " 'MSOTlPn_SelectedWpId': '',\n", + " 'MSOTlPn_View': '0',\n", + " 'MSOTlPn_ShowSettings': 'False',\n", + " 'MSOGallery_SelectedLibrary': '',\n", + " 'MSOGallery_FilterString': '',\n", + " 'MSOTlPn_Button': 'none',\n", + " '__EVENTTARGET': '',\n", + " '__EVENTARGUMENT': '',\n", + " '__REQUESTDIGEST': '0x25E0A6F64E459775F08145410EB827793E5715E82EE7E96E7CD7AC139DEA803E9A7556D9AF6C3D0EAAD7DC7B96D59C122338C25375B118C42A4F88BDCD2A189A,12 Nov 2018 15:18:53 -0000',\n", + " 'MSOSPWebPartManager_DisplayModeName': 'Browse',\n", + " 'MSOSPWebPartManager_ExitingDesignMode': 'false',\n", + " 'MSOWebPartPage_Shared': '',\n", + " 'MSOLayout_LayoutChanges': '',\n", + " 'MSOLayout_InDesignMode': '',\n", + " '_wpSelected': '',\n", + " '_wzSelected': '',\n", + " 'MSOSPWebPartManager_OldDisplayModeName': 'Browse',\n", + " 'MSOSPWebPartManager_StartWebPartEditingName': 'false',\n", + " 'MSOSPWebPartManager_EndWebPartEditing': 'false',\n", + " '_maintainWorkspaceScrollPosition': '0',\n", + " '__LASTFOCUS': '',\n", + " '__VIEWSTATE': '/wEPDwUBMA9kFgJmD2QWAgIBD2QWBAIBD2QWAgILD2QWAmYPZBYCAgEPFgIeE1ByZXZpb3VzQ29udHJvbE1vZGULKYgBTWljcm9zb2Z0LlNoYXJlUG9pbnQuV2ViQ29udHJvbHMuU1BDb250cm9sTW9kZSwgTWljcm9zb2Z0LlNoYXJlUG9pbnQsIFZlcnNpb249MTUuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49NzFlOWJjZTExMWU5NDI5YwFkAgMPZBYIAgMPZBYIBSZnX2M3ODUyYTI4Xzg2NzdfNDdkZV9iZjUxXzEwMmU1YWZlMmFlOA8PFgQeCENzc0NsYXNzBQRBRUxTHgRfIVNCAgJkFgYCCg8QDxYCHgtfIURhdGFCb3VuZGdkEBVIAAtBVFRBUkQgKE1MKQlBVVNUUkFMSUELQkFMWkFOIChNTCkKQklSR1UgKE1MKQ9CSVJLSVJLQVJBIChNTCkQQklSWkVCQlVHSUEgKE1MKQtCT1JNTEEgKE1MKQ1CUlVTU0VMUyAoQkUpC0RJTkdMSSAoTUwpCkZHVVJBIChNTCkNRkxPUklBTkEgKE1MKQxGT05UQU5BIChHWikQR0hBSk5TSUVMRU0gKEdaKQpHSEFSQiAoR1opDUdIQVJHSFVSIChNTCkLR0hBU1JJIChHWikLR0hBWEFRIChNTCkKR1VESkEgKE1MKQpHWklSQSAoTUwpC0hBTVJVTiAoTUwpCklLTElOIChNTCkJSVNMQSAoTUwpDEtBTEtBUkEgKE1MKQtLRVJDRU0gKEdaKQtLSVJLT1AgKE1MKQlMSUpBIChNTCkJTFVRQSAoTUwpDE1BTlRPVkEgKElUKQpNQVJTQSAoTUwpD01BUlNBU0NBTEEgKE1MKQ9NQVJTQVhMT0tLIChNTCkKTURJTkEgKE1MKQ1NRUxMSUVIQSAoTUwpCk1HQVJSIChNTCkKTU9TVEEgKE1MKQtNUUFCQkEgKE1MKQpNU0lEQSAoTUwpC01UQVJGQSAoTUwpC01VTlhBUiAoR1opCk5BRFVSIChHWikLTkFYWEFSIChNTCkKUEFPTEEgKE1MKQ1QRU1CUk9LRSAoTUwpClBJRVRBIChNTCkJUUFMQSAoR1opClFPUk1JIChNTCkLUVJFTkRJIChNTCkSUkFCQVQgKE1hbHRhKSAoTUwpFVJBQkFUIChWaWN0b3JpYSkgKEdaKQlTQUZJIChNTCkPU0FOIEdJTEpBTiAoTUwpDlNBTiBHV0FOTiAoTUwpEFNBTiBMQVdSRU5aIChHWikWU0FOIFBBV0wgSUwtQkFIQVIgKE1MKQtTQU5OQVQgKEdaKRFTQU5UQSBMVUNJSkEgKE1MKRFTQU5UQSBWRU5FUkEgKE1MKQ1TSUdHSUVXSSAoTUwpC1NMSUVNQSAoTUwpC1NXSUVRSSAoTUwpD1RBJyAgWEJJRVggKE1MKQxUQVJYSUVOIChNTCkNVkFMTEVUVEEgKE1MKQtYQUdIUkEgKEdaKQxYRVdLSUpBIChHWikMWEdIQUpSQSAoTUwpC1pBQkJBUiAoTUwpFVpFQkJVRyAoR2hhd2RleCkgKEdaKRNaRUJCVUcgKE1hbHRhKSAoTUwpC1pFSlRVTiAoTUwpDFpVUlJJRVEgKE1MKRVIAAtBVFRBUkQgKE1MKQlBVVNUUkFMSUELQkFMWkFOIChNTCkKQklSR1UgKE1MKQ9CSVJLSVJLQVJBIChNTCkQQklSWkVCQlVHSUEgKE1MKQtCT1JNTEEgKE1MKQ1CUlVTU0VMUyAoQkUpC0RJTkdMSSAoTUwpCkZHVVJBIChNTCkNRkxPUklBTkEgKE1MKQxGT05UQU5BIChHWikQR0hBSk5TSUVMRU0gKEdaKQpHSEFSQiAoR1opDUdIQVJHSFVSIChNTCkLR0hBU1JJIChHWikLR0hBWEFRIChNTCkKR1VESkEgKE1MKQpHWklSQSAoTUwpC0hBTVJVTiAoTUwpCklLTElOIChNTCkJSVNMQSAoTUwpDEtBTEtBUkEgKE1MKQtLRVJDRU0gKEdaKQtLSVJLT1AgKE1MKQlMSUpBIChNTCkJTFVRQSAoTUwpDE1BTlRPVkEgKElUKQpNQVJTQSAoTUwpD01BUlNBU0NBTEEgKE1MKQ9NQVJTQVhMT0tLIChNTCkKTURJTkEgKE1MKQ1NRUxMSUVIQSAoTUwpCk1HQVJSIChNTCkKTU9TVEEgKE1MKQtNUUFCQkEgKE1MKQpNU0lEQSAoTUwpC01UQVJGQSAoTUwpC01VTlhBUiAoR1opCk5BRFVSIChHWikLTkFYWEFSIChNTCkKUEFPTEEgKE1MKQ1QRU1CUk9LRSAoTUwpClBJRVRBIChNTCkJUUFMQSAoR1opClFPUk1JIChNTCkLUVJFTkRJIChNTCkSUkFCQVQgKE1hbHRhKSAoTUwpFVJBQkFUIChWaWN0b3JpYSkgKEdaKQlTQUZJIChNTCkPU0FOIEdJTEpBTiAoTUwpDlNBTiBHV0FOTiAoTUwpEFNBTiBMQVdSRU5aIChHWikWU0FOIFBBV0wgSUwtQkFIQVIgKE1MKQtTQU5OQVQgKEdaKRFTQU5UQSBMVUNJSkEgKE1MKRFTQU5UQSBWRU5FUkEgKE1MKQ1TSUdHSUVXSSAoTUwpC1NMSUVNQSAoTUwpC1NXSUVRSSAoTUwpD1RBJyAgWEJJRVggKE1MKQxUQVJYSUVOIChNTCkNVkFMTEVUVEEgKE1MKQtYQUdIUkEgKEdaKQxYRVdLSUpBIChHWikMWEdIQUpSQSAoTUwpC1pBQkJBUiAoTUwpFVpFQkJVRyAoR2hhd2RleCkgKEdaKRNaRUJCVUcgKE1hbHRhKSAoTUwpC1pFSlRVTiAoTUwpDFpVUlJJRVEgKE1MKRQrA0hnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkZAIPDxAPFgIfA2dkEBWdJAABLwU0NjEwMAQ1MDQ0B0FURDExMTMHQVREMTE3MAdBVEQxMjM0B0FURDE0MDYHQVREMTQxMQdBVEQxNDI4B0FURDE0MzEHQVREMTQzOAdBVEQxNTAyB0FURDE1MDMHQVREMTUwNAdBVEQxNTIxB0FURDE1MzEHQVREMTYyNAdBVEQxNjMxB0FURDE3NDEHQVREMTc2MwdBVEQxODIxB0FURDE4NzAHQVREMTkwNwdBVEQxOTIwB0FURDE5NjAHQVREMTk3MAdBVEQyMDI0B0FURDIwMjcHQVREMjAyOQdBVEQyMDY5B0FURDIwODMHQVREMjIxNAdBVEQyMjczB0FURDIzMzYHQVREMjMzOAdBVEQyMzQzB0FURDIzNjQHQVREMjM3MQdBVEQyMzgwB0FURDI0NTAHQVREMjQ1MwdBVEQyNTExB0FURDI1MzAHQVREMjYwNQdBVEQyNjEwB0FURDI3MDYHQVREMjcwNwdBVEQyNzMyB0FURDI3MzMHQVREMjc1MgdBVEQyNzYwB0FURDI3NzIHQVREMjc3NwdBVEQyNzgwB0FURDI3ODEHQVREMjg0MwdBVEQyODUwB0FURDI5MDEHQVREMjk2MAdBVEQzMDE3B0FURDMwMzIHQVREMzA1MAdBVEQzMDYwB0FURDMwODAHQVREMzExMQdBVEQzMTE3B0FURDQwMDAHQVRENDA5NQdBVEQ0ODkwB0FURDkwMzYHQVREOTAzNwdBVEQ5MDQxB0FURDkwNDIHQVREOTA1NgdBVFQyNTExB0JCRzEwMTQHQkJHMTA1MAdCQkcxMDYwB0JCRzExMDQHQkJHMTIzMAdCQkcxMjQzB0JCRzEyNDUHQkJHMTI1MwdCQkcxMjcwB0JCRzEyNzMHQkJHMTMzNAdCQkcxMzM1B0JCRzE0NzIHQkJHMTYzMwdCQkcxNjY1B0JCRzE2ODQHQkJHMTY4NgdCQkcxNjg3B0JCRzE2OTEHQkJHMTcwMQdCQkcxNzEzB0JCRzE3NTIHQkJHMTc1OAdCQkcxNzcyB0JCRzE4MDEHQkJHMTgwMwdCQkcxODM1B0JCRzE4NDUHQkJHMTg0NgdCQkcxODUyB0JCRzE4NjAHQkJHMTkwMgdCQkcxOTA2B0JCRzE5MDkHQkJHMTkxNAdCQkcxOTIxB0JCRzE5MjIHQkJHMTkyOAdCQkcxOTMzB0JCRzE5NDMHQkJHMTk1MgdCQkcxOTUzB0JCRzE5NjAHQkJHMjAxMAdCQkcyMDIxB0JCRzIwMjYHQkJHMjAyOAdCQkcyMDI5B0JCRzIwNjEHQkJHMjEwMgdCQkcyMTA0B0JCRzIxMDkHQkJHMjExMAdCQkcyMTIyB0JCRzIxNDAHQkJHMjE3MAdCQkcyMTczB0JCRzIyNDAHQkJHMjI1MQdCQkcyMjUyB0JCRzIyNTMHQkJHMjI2MAdCQkcyMjYxB0JCRzIyNzEHQkJHMjI4MwdCQkcyMjkyB0JCRzIyOTUHQkJHMjMwMQdCQkcyMzA0B0JCRzIzNDAHQkJHMjM0NAdCQkcyMzQ2B0JCRzIzNDcHQkJHMjQwMAdCQkcyNDEwB0JCRzI0MTQHQkJHMjQyNAdCQkcyNDMwB0JCRzI0NTEHQkJHMjUwNAdCQkcyNTA1B0JCRzI1NDEHQkJHMjU1MQdCQkcyNTYxB0JCRzI1NzYHQkJHMjYwMAdCQkcyNjAzB0JCRzI2MDgHQkJHMjYzMwdCQkcyNjQwB0JCRzI2NDcHQkJHMjY1MQdCQkcyNzIxB0JCRzI3NDAHQkJHMjc3MQdCQkcyNzczB0JCRzI3NzUHQkJHMjc3NgdCQkcyNzgwB0JCRzI3ODIHQkJHMzA0NAdCQkczMDcxB0JCRzMwNzMHQkJHMzA3NQdCQkczMTIxB0JCRzMxNDEHQkJHMzIxMQdCQkc5MDE0B0JCRzkwMzQHQktSMTAzMgdCS1IxMTExB0JLUjExMzUHQktSMTE1MgdCS1IxMTU0B0JLUjExNTcHQktSMTIxNAdCS1IxMjE3B0JLUjEyMTgHQktSMTI2MAdCS1IxMjcwB0JLUjEyNzcHQktSMTU2MAdCS1IxNzUzB0JLUjE3NzAHQktSMTc4MAdCS1IxODAyB0JLUjE4MDcHQktSMTg1MQdCS1IxODcxB0JLUjE4NzMHQktSMTk1MAdCS1IxOTczB0JLUjIwMTIHQktSMjA4MAdCS1IyMTAzB0JLUjIxNTQHQktSMjI4NgdCS1IyMzI2B0JLUjI0MzEHQktSMjQ3MAdCS1IyNDczB0JLUjI1MjUHQktSMjU1MgdCS1IyNjkxB0JLUjI2OTQHQktSMjY5OAdCS1IyODA4B0JLUjI4NTMHQktSMjg5MAdCS1IyOTAxB0JLUjQwMTMHQktSNDAyMwdCS1I0MDQwB0JLUjQwNjIHQktSNDExMAdCS1I0MjE0B0JLUjQzNjMHQktSNDQ0MwdCS1I0NTE4B0JLUjQ1MjIHQktSNDUyMwdCS1I0NTMzB0JLUjQ1MzQHQktSNDUzNgdCS1I0NjAxB0JLUjQ4NTAHQktSOTAxMAdCS1I5MDEzB0JLUjkwMzgHQktSOTA2NQdCS1I5MDcyB0JLUjkwNzcHQk1MMTkxOAdCTUwyMjMyB0JNTDkwODAHQlJHOTAyMQdCUksxOTEwB0JaTjEwNDAHQlpOMTEyMAdCWk4xMTUzB0JaTjExNjIHQlpOMTMwMgdCWk4xNDIxB0JaTjE0MjcHQlpOMTUwNQdCWk4xNTEwB0JaTjE1MTEHQlpOMTUyMwdCWk4xNTM1B0RHTDAzMjQHREdMMDQzOAdER0wxMDExB0RHTDEwNDEHREdMMTA2MAdER0wxMDYxB0RHTDEwNzIHREdMMTEwMAdER0wxMTEwB0RHTDExMTEHREdMMTExMgdER0wxMTEzB0RHTDExMTYHREdMMTExOAdER0wxMTE5B0RHTDExMzAHREdMMTEzNgdER0wxMTUzB0RHTDExNzUHREdMMTIyMgdER0wxMjMxB0RHTDEyMzMHREdMMTIzNAdER0wxMjgwB0RHTDEyODEHREdMMTMwMQdER0wxMzAzB0RHTDEzMDcHREdMMTMxMwdER0wxMzMwB0RHTDEzNDIHREdMMTM0NAdER0wxMzU0B0RHTDEzNjIHREdMMTM2NQdER0wxMzgwB0RHTDEzODQHREdMMTM4OAdER0wxMzkxB0RHTDE1MDAHREdMMTUxMgdER0wxNTI0B0RHTDE1MzMHREdMMTU1NAdER0wxNTc2B0RHTDE1NzcHREdMMTU5MAdER0wxNTkyB0RHTDE1OTQHREdMMTU5NQdER0wxNzE3B0RHTDE3MTkHREdMMTczMQdER0wxNzMyB0RHTDE3MzQHREdMMTc0MQdER0wxNzQzB0RHTDE3NTAHREdMMTc1MQdER0wxNzU1B0RHTDE3NTYHREdMMTc1NwdER0wxODAyB0RHTDE4MjAHREdMMTgzMQdER0wxODM0B0RHTDE4MzUHREdMMTgzNgdER0wxODUwB0RHTDE4NzEHREdMMTg4MAdER0wxODgxB0RHTDE4OTAHREdMMTg5NAdER0wxOTAwB0RHTDE5MDMHREdMMTkwNQdER0wxOTIxB0RHTDE5NDAHREdMMjAyNQdER0wyMDMwB0RHTDIxMDEHREdMMjEwMgdER0wyMTA0B0RHTDIxMTAHREdMMjExMQdER0wyMTMwB0RHTDIxNDEHREdMMjE2MAdER0wyMTcxB0RHTDI0MTEHREdMMjcwMQdER0wyNzA5B0RHTDM1MDAHREdMMzUwMQdER0wzNTAyB0RHTDM1MDcHREdMMzUwOAdER0wzNTA5B0RHTDkwMTUHREdMOTAxNwdER0w5MDE4B0RORzEzMDUHRkdSMTAyOQdGR1IxMDM0B0ZHUjEwMzYHRkdSMTA0MgdGR1IxMDcxB0ZHUjExMzcHRkdSMTI0MwdGR1IxMjQ4B0ZHUjEyNjEHRkdSMTI3MQdGR1IxNDEwB0ZHUjE0MjEHRkdSMTQzMQdGR1IxNDQwB0ZHUjE0NDQHRkdSMTQ2MAdGR1IxNDYzB0ZHUjE0NzAHRkdSMTQ3MgdGR1IxNDgwB0ZHUjE2MTQHRkdSMTYxOAdGR1IxNjE5B0ZHUjE2NjEHRkdSMTY5MgdGR1IxNzAyB0ZHUjE4MzYHRkdSMTg1MQdGR1IxODUzB0ZHUjE4NTQHRkdSMTkzMAdGR1IxOTMzB0ZHUjE5NDUHRkdSMTk1MQdGR1IxOTcyB0ZHUjIwMTEHRkdSMjAxMgdGR1IyMDE4B0ZHUjIwMjEHRkdSMjA0MAdGR1IyMDUxB0ZHUjIwNjEHRkdSMjEwMwdGR1IyMTA1B0ZHUjIxMDgHRkdSMjE1NQdGR1IyMTcyB0ZHUjkwMzIHRkdSOTAzOAdGTlQxMDEzB0ZOVDEwMzAHRk5UMTAzMQdGTlQxMDQxB0ZOVDExMDAHRk5UMTExMQdGTlQxMTEyB0ZOVDExMTMHRk5UMTEyMQdGTlQxNDAxB0ZOVDE0MTEHRk5UMTQyMgdGTlQ5MDEzB0ZOVDkwMjMHRk5UOTAyNwdGTlQ5MDI4B0ZSTjEwNDAHRlJOMTcwMAdHREowMzE1B0dESjEwMTEHR0RKMTAxNAdHREoxMDIxB0dESjEwNDEHR0RKMTA0MgdHREoxMDYxB0dESjEwNjQHR0RKMTA2NQdHREoxMTAxB0dESjExMTEHR0RKMTExMgdHREoxMTUwB0dESjExNTIHR0RKMTE1MwdHREoxMTU0B0dESjEyMDYHR0RKMTIwOQdHREoxMjQwB0dESjEyNTEHR0RKMTI2MQdHREoxMjgwB0dESjEyODEHR0RKMTMwMAdHREoxMzA0B0dESjEzMTQHR0RKMTMyMQdHREoxMzMwB0dESjEzNDEHR0RKMTM1MQdHREoxNDExB0dESjE0MTIHR0RKMTQyMAdHREoxNDQ1B0dESjE0NTAHR0RKMTQ1MQdHREoxNDUyB0dESjE0NjEHR0RKMTY1MQdHREoxNjYwB0dESjE3MDAHR0RKMTcwMgdHREoxNzAzB0dESjE3MDUHR0RKMTcwNgdHREoxNzA4B0dESjE3MTEHR0RKMTcxMwdHREoxNzYxB0dESjE4MDEHR0RKMTgwMgdHREoxODExB0dESjE4MTIHR0RKMTgxMwdHREoxODUwB0dESjE4NTIHR0RKMTkxMAdHREoxOTIwB0dESjE5MjEHR0RKMTkzMAdHREoxOTQwB0dESjE5NDEHR0RKMjAxNwdHREoyMDIwB0dESjIwMjEHR0hSMTAxMgdHSFIxMDE0B0dIUjEwMjQHR0hSMTA1MwdHSFIxMTAzB0dIUjExMjEHR0hSMTE2MgdHSFIxMjEwB0dIUjEyMjEHR0hSMTIzMwdHSFIxMjY0B0dIUjEyNjcHR0hSMTMwMAdHSFIxMzAxB0dIUjEzMDIHR0hSMTMwNQdHSFIxMzUzB0dIUjE0MDAHR0hSMTQwNQdHSFIxNDYwB0dIUjE1MDEHR0hSMTUxMgdHSFIxNTE0B0dIUjE1MTUHR0hSMTUyMAdHSFIxNTIxB0dIUjE1MzEHR0hSMTUzNQdHSFIxNjA2B0dIUjE2MjIHR0hSMTYzMQdHSFIxNjYyB0dIUjE2NjQHR0hSMTcwMQdHSFIxODA0B0dIUjE4MDcHR0hSMTgxMAdHSFIyMDcwB0dIUjIxMDAHR1JCMTAxMAdHUkIxMDE0B0dSQjEwMTUHR1JCMTAyMwdHUkIxMDQwB0dSQjEwNDMHR1JCMTA0NAdHUkIxMDQ2B0dSQjEwNTAHR1JCMTA1MwdHUkIxMDU1B0dSQjEwNjUHR1JCMTA3MAdHUkIxMDcxB0dSQjEwNzIHR1JCMTA4MAdHUkIxMDgxB0dSQjEwODIHR1JCMTA4MwdHUkIxMTAxB0dSQjExMDIHR1JCMTEwMwdHUkIxMTIwB0dSQjExNDEHR1JCMTE2MQdHUkIxMjAwB0dSQjEyMDIHR1JCMTIxMAdHUkIxMjMxB0dSQjEyNjAHR1JCMTI3MAdHUkIxMzAwB0dSQjEzMjQHR1JCMTM0MAdHUkIxNDA0B0dSQjE0MDUHR1JCMTQzNgdHUkIxNDM3B0dSQjE1MDUHR1JCMTUyMQdHUkIxNTQxB0dSQjI0MzQHR1NNMTAyMAdHU00xMDQwB0dTTTEwNDEHR1NNMTEzMAdHU00xMTMxB0dTTTExODAHR1NNMTE4MwdHU00xMjAwB0dTTTEyMDEHR1NNMTIzMQdHU00xMjMzB0dTTTEyNDAHR1NNMTI0MQdHU00xMjQyB0dTTTEyNDMHR1NNMTI4MgdHU00xMzIzB0dTTTEzMjgHR1NNMTQxMQdHU00xNDEzB0dTTTE0NTEHR1NNMTUzMgdHU00xNTMzB0dTTTE1NTAHR1NNMTU1MgdHU00xNTcxB0dTTTE2MDAHR1NNMTYyMQdHU00xNjIyB0dTTTE2MjMHR1NNMTYzMQdHU00xNjQxB0dTTTE2NDMHR1NNMTgwMAdHU00xODAxB0dTTTE4MDMHR1NNMTgwNAdHU00xODA1B0dTTTE4MDcHR1NNMTkxMwdHU00xOTUxB0dTTTE5ODAHR1NNMTk5MAdHU00yMDExB0dTTTIwMTIHR1NNMjAxNAdHU00yMDE2B0dTTTIwMTgHR1NNMjAyMQdHU00yMDUwB0dTTTkwMTAHR1NNOTAxMgdHU005MDEzB0dTTTkwMTQHR1NNOTAxNQdHU005MDE5B0dTTTkwMjIHR1NNOTAyNwdHU005MDMzB0dTUjEwMjAHR1NSMTAyMQdHU1IxMDIzB0dTUjEwNDAHR1NSMTA2MAdHU1IxMTAwB0dTUjExMDEHR1NSMTEwMgdHU1IxMTAzB0dTUjExMDQHR1NSMTE1MAdHU1IxMTU0B0dTUjEyMDAHR1NSMTIwMQdHU1IxMjAzB0dTUjEyMDYHR1NSMTIwNwdHU1IxMzAwB0dTUjEzMDEHR1NSMTMwMgdHU1IxMzEyB0dTUjEzMTMHR1NSMTMyMQdHU1IxMzQwB0dTUjEzNTAHR1hRMTAxNwdHWFExMDQwB0dYUTEwNjMHR1hRMTA3MwdHWFExMDc1B0dYUTExMTEHR1hRMTE0MAdHWFExMTQyB0dYUTExNzAHR1hRMTE4NgdHWFExMjAzB0dYUTEyMDQHR1hRMTIwNQdHWFExMjEwB0dYUTEyMzMHR1hRMTI1MAdHWFExMjUyB0dYUTEzMDAHR1hRMTMwMQdHWFExMzEzB0dYUTEzMTQHR1hRMTQwMgdHWFExNTU0B0dYUTE2MTMHR1hRMTYzMgdHWFExNzAwB0dYUTE3MDEHR1hRMTcxNAdHWFExNzE2B0dYUTE3MTcHR1hRMTcxOAdHWFExODAwB0dYUTE4MDEHR1hRMTgwMgdHWFExODIyB0dYUTE4NDEHR1hRMTkwMQdHWFExOTcwB0dYUTE5NzMHR1hRMjAyMwdHWFEyMDMyB0dYUTIwMzMHR1hRMjA1MAdHWFEyMDUyB0dYUTIxMDAHR1hRMjEwMQdHWFEyMTYwB0dYUTIxNzAHR1hRMjE3MQdHWFEyMTczB0dYUTIxNzQHR1hRMjE3NwdHWFEyMTgxB0dYUTIxODQHR1hRMjIwMAdHWFEyMjAyB0dYUTIyMTEHR1hRMjIyMQdHWFEyMjIyB0dYUTIyNDYHR1hRMjI1MwdHWFEyMzAxB0dYUTIzMjEHR1hRMjMzMAdHWFEyMzcxB0dYUTI5MDEHR1hRMjkwMgdHWFE5MDEwB0dYUTkwMTIHR1hROTAxMwdHWFE5MDE0B0dYUTkwMTgHR1hROTA0NAdHWlIxMDI2B0daUjExMzkHR1pSMTE1NAdHWlIxMTYzB0daUjEyMTAHR1pSMTMzNgdHWlIxNTAwB0daUjE1MDYHSE1SMTAxNAdITVIxMTAwB0hNUjEyMDEHSE1SMTIwMwdITVIxMzIyB0hNUjE0NTEHSE1SMTUzMAdITVIxNjEzB0hNUjE2MjEHSE1SMTg1NAdITVIxOTUyB0hNUjIwMTUHSE1SMjAzMAdITVIyMjc0B0haQjIwMTMHSUtMMTAyMQdJS0wxMDIzB0lLTDEwNDEHSUtMMTIwMAdJS0wxMzEwB0lLTDE0MTEHSUtMMTQzMQdJS0wxNDUwB0lLTDE4MTMHSUtMMTkwMAdJS0w5MDE1B0lLTDkwMzIHSVNMMTQ1MwdLQ00xMDEwB0tDTTEwMTMHS0NNMTA1MwdLQ00xMDcwB0tDTTEwODEHS0NNMTEwMAdLQ00xMTEwB0tDTTExMTEHS0NNMTExMgdLQ00xMTEzB0tDTTExMTQHS0NNMTExNQdLQ00xMTIwB0tDTTExMjEHS0NNMTEyMwdLQ00xMTMwB0tDTTExMzEHS0NNMTE0MQdLQ00xMTU0B0tDTTExNTYHS0NNMTE2MAdLQ00xMTYyB0tDTTExNjMHS0NNMTE4MAdLQ00xMTgxB0tDTTExOTIHS0NNMTIwMgdLQ00xMjMxB0tDTTEyMzMHS0NNMTI0MAdLQ00xMjYwB0tDTTEyNjIHS0NNMTI2NAdLQ00xMjY1B0tDTTEzMDAHS0NNMTMwMgdLQ00xMzExB0tDTTEzMTMHS0NNMTMyMQdLQ00xMzIzB0tDTTEzNDMHS0NNMTM1MAdLQ00xMzUyB0tDTTEzNjAHS0NNMTQwMQdLQ00xNDEwB0tDTTE0MTEHS0NNMTQxMgdLQ00xNDIxB0tDTTE0MjMHS0NNMTQyNQdLQ00xNDMwB0tDTTE3MDAHS0NNMTcwMQdLQ00xNzAyB0tDTTE3MjEHS0NNMzAxMQdLQ00zMDEyB0tDTTMwMTMHS0NNMzAxNAdLQ00zMDE2B0tDTTMwMTcHS0NNMzAyMAdLQ00zMDIxB0tDTTMwNDAHS0NNMzA0MQdLQ00zMDQyB0tDTTMwNjAHS0NNMzA2MgdLQ00zMTAwB0tDTTMxMDEHS0NNMzExMAdLQ00zMTIxB0tDTTMxNTEHS0NNMzIwMgdLQ00zMzAzB0tDTTkwMTAHS0tQMTAxMAdLS1AxMDMxB0tLUDEwNjAHS0tQMTA4MQdLS1AxMTAwB0tLUDExMDEHS0tQMTExMAdLS1AxMTExB0tLUDExMzIHS0tQMTIxMAdLS1AxMjE2B0tLUDEyMjAHS0tQMTIyMQdLS1AxMjQyB0tLUDEyNDcHS0tQMTI0OAdLS1AxMjQ5B0tLUDEyNTAHS0tQMTI2MQdLS1AxMjcwB0tLUDEzNjEHS0tQMTM3MAdLS1AxNTA3B0tLUDE1MDgHS0tQMTUwOQdLS1AxNTExB0tLUDE1MjEHS0tQMTUyOAdLS1AxNTI5B0tLUDE1MzAHS0tQMTUzMgdLS1AxNTQxB0tLUDE3MjUHS0tQMTcyNwdLS1AxNzQwB0tLUDE3NDIHS0tQMTc3MQdLS1AxODEwB0tLUDE4MTEHS0tQMTgxMgdLS1AxODEzB0tLUDE4MTUHS0tQMTkwMQdLS1IxMDM0B0tLUjEwNzIHS0tSMTEwNwdLS1IxMTIwB0tLUjExNTMHS0tSMTE4NgdLS1IxNjEyB0tLUjE2MTkHS0tSMTc2MwdLS1IxODEwB0tLUjkwMzMHS0tSOTA2MgdLUlAxMjEwB0xKQTEwMjEHTEpBMTExMwdMSkExMTQ0B0xKQTExNzYHTEpBMTE5MwdMSkExMjA1B0xKQTEyNjEHTEpBMTI3MAdMSkExMjcxB0xKQTEyNzQHTEpBMTQzMQdMSkExNDQxB0xKQTE0NjAHTEpBMTUwNAdMSkExNjEyB0xKQTE2MTMHTEpBMTcwMAdMSkExNzIyB0xKQTE3MzAHTEpBMTc1MQdMSkExODA2B0xKQTE5MTEHTEpBMTkxNQdMSkExOTE2B0xKQTE5MzEHTFFBMTAxMQdMUUExMDIzB0xRQTEwMjQHTFFBMTAyNQdMUUExMDMwB0xRQTEwOTEHTFFBMTEwMgdMUUExMTEwB0xRQTExMjAHTFFBMTEyMQdMUUExMTMxB0xRQTExNTEHTFFBMTE1NwdMUUExMjAwB0xRQTEyMjAHTFFBMTIyMQdMUUExMjUzB0xRQTEzMTMHTFFBMTMxNAdMUUExMzE1B0xRQTEzMTcHTFFBMTMxOQdMUUExMzMwB0xRQTEzNjAHTFFBMTM3MQdMUUExMzcyB0xRQTEzNzMHTFFBMTM4NAdMUUExMzg1B0xRQTE0MTAHTFFBMTQzMAdMUUExNDYwB0xRQTE0NjMHTFFBMTQ5MAdMUUExNDkyB0xRQTE1MDAHTFFBMTUxMAdMUUExNTEzB0xRQTE1MTYHTFFBMTUzMgdMUUExNTM0B0xRQTE1NDAHTFFBMTU1MwdMUUExNTYxB0xRQTE1ODMHTFFBMTYwMwdMUUExNjEwB0xRQTE2MTIHTFFBMTYzMAdMUUExNjMyB0xRQTE2MzUHTFFBMTY2MQdMUUExNjczB0xRQTE2NzQHTFFBMTcxMAdMUUExNzIyB0xRQTE3MjMHTFFBMTcyNQdMUUExNzYwB0xRQTE3NjEHTFFBMTgwMwdMUUExODA0B0xRQTE4MTEHTFFBMTgxMwdMUUExODE0B0xRQTE4NzAHTFFBMTg3MwdMUUExODgwB0xRQTE4OTMHTFFBMjAyMQdMUUEyMDIyB0xRQTIwMjQHTFFBMzAxMAdMUUEzMDQyB0xRQTMwNzgHTFFBMzExMQdMUUEzMTYwB0xRQTMxNjQHTFFBNzYwMAdMUUE5MDIxB0xRQTkwMzMHTFFBOTA0MAdMUUE5MDQzB01ETjEwNTAHTUROMTA4MAdNRE4xMTgxB01ETjY5NzAHTUROOTAyMAdNRk4xMTI0B01GTjExMjcHTUZOMTMxMgdNRk4xNDEwB01GTjE0NDMHTUZOMTQ1MQdNRk4xNDUzB01GTjE1MTQHTUZOOTAxNAdNR1IxMDEwB01HUjEwMjAHTUdSMTAzMAdNR1IxMDMzB01HUjEwNTAHTUdSMTA2MAdNR1IxMTEwB01HUjExMTIHTUdSMTExMwdNR1IxMTE2B01HUjExMTcHTUdSMTEyMQdNR1IxMTUwB01HUjExNjAHTUdSMTIwMwdNR1IxMjEwB01HUjEyMTEHTUdSMTIxMgdNR1IxMjEzB01HUjEyMTYHTUdSMTI1MQdNR1IxMzAxB01HUjEzMTAHTUdSMTMxMQdNR1IxMzEyB01HUjEzMTMHTUdSMTMxNAdNR1IxMzE1B01HUjEzMTcHTUdSMTM0MAdNR1IxMzQzB01HUjEzNjEHTUdSMTM2MgdNR1IxMzYzB01HUjEzNjQHTUdSMTM3MQdNR1IxMzc2B01HUjEzNzgHTUdSMTQwMQdNR1IxNDA1B01HUjE0MTAHTUdSMTQyNAdNR1IxNDMwB01HUjE0NDEHTUdSMTUwMQdNR1IxNTAyB01HUjE1MDMHTUdSMTUwNAdNR1IxNTA1B01HUjE1MDYHTUdSMTUwNwdNR1IxNTA4B01HUjE1MDkHTUdSMTUxMAdNR1IxNTIxB01HUjE1MjIHTUdSMTUyMwdNR1IxNTI0B01HUjE1MjUHTUdSMTUyOAdNR1IxNTI5B01HUjE1NDAHTUdSMTU0MQdNR1IxNTQ0B01HUjE1NDUHTUdSMTU0NwdNR1IxNTQ4B01HUjE3MDIHTUdSMTcxMQdNR1IxNzQwB01HUjE3NDMHTUdSMTc0NAdNR1IxNzQ1B01HUjE3NTAHTUdSMTc1MwdNR1IxNzYyB01HUjE4MTAHTUdSMTk1MAdNR1IxOTcwB01HUjIwMTAHTUdSMjAxNAdNR1IyMDIxB01HUjIwNDAHTUdSMjA1MQdNR1IyMDUzB01HUjIwNTYHTUdSMjA1NwdNR1IyMTEwB01HUjIxMjEHTUdSMjEyNQdNR1IyMTMyB01HUjIxNDEHTUdSMjE0MgdNR1IyMTQzB01HUjIyMDAHTUdSMjI0MQdNR1IyMjUwB01HUjIyNTMHTUdSMjI1NQdNR1IyMzAwB01HUjIzMjAHTUdSMjMyMQdNR1IyMzMxB01HUjIzNTEHTUdSMjM1MwdNR1IyMzU0B01HUjIzNjEHTUdSMjM3MAdNR1IyNDAxB01HUjI0MDMHTUdSMjQxMAdNR1IyNDIwB01HUjI0MjEHTUdSMjQ0MgdNR1IyNDUwB01HUjI0NjEHTUdSMjQ2MgdNR1IyNDYzB01HUjI0NzMHTUdSMjYwMAdNR1IyNjAxB01HUjI2MDMHTUdSMjYwNAdNR1IyNjA1B01HUjI4NTAHTUdSMjkwMAdNR1IyOTAzB01HUjI5MTAHTUdSOTAyMAdNR1I5MDIyB01HUjkwMjMHTUdSOTAyNQdNR1I5MDMwB01HUjkwMzIHTUdSOTAzNAdNR1I5MDM2B01HUjkwNDEHTUdSOTA1MgdNR1I5MDUzB01HUjkwNTUHTUdSOTA1NwdNR1I5MDU5B01HUjkwOTAHTUxIMDAxMwdNTEgxMDE1B01MSDEwNDAHTUxIMTA0MgdNTEgxMDQ2B01MSDEwNDgHTUxIMTA0OQdNTEgxMDU1B01MSDEwNjIHTUxIMTA2NwdNTEgxMDY4B01MSDEwNjkHTUxIMTA3MgdNTEgxMTA1B01MSDExMDYHTUxIMTExMAdNTEgxMTIwB01MSDExMjEHTUxIMTEyNwdNTEgxMTcyB01MSDExOTIHTUxIMTIwMAdNTEgxMjAxB01MSDEyMTAHTUxIMTI0NQdNTEgxMjYxB01MSDEzMDEHTUxIMTMwMwdNTEgxMzA0B01MSDEzMDkHTUxIMTMxMgdNTEgxMzM0B01MSDEzNDQHTUxIMTM0NgdNTEgxMzU0B01MSDEzNjAHTUxIMTM4MgdNTEgxNDMxB01MSDE0MzMHTUxIMTQzNAdNTEgxNDQwB01MSDE0NTQHTUxIMTQ1NgdNTEgxNDcxB01MSDE0NzIHTUxIMTQ4MAdNTEgxNDgzB01MSDE0OTAHTUxIMTQ5MQdNTEgxNTA1B01MSDE1MTIHTUxIMTUxMwdNTEgxNTE3B01MSDE1MTgHTUxIMTUxOQdNTEgxNTIyB01MSDE1MzIHTUxIMTU2MQdNTEgxNTYyB01MSDE2MTAHTUxIMTYxMQdNTEgxNjMyB01MSDE2MzUHTUxIMTYzNgdNTEgxNjM3B01MSDE2NDEHTUxIMTY1MAdNTEgxNjUxB01MSDE2NTIHTUxIMTY1NQdNTEgxNjgwB01MSDE3MDAHTUxIMTcwMgdNTEgxNzAzB01MSDE3MDUHTUxIMTcwNgdNTEgxNzA5B01MSDE3MjAHTUxIMTcyMQdNTEgxNzIzB01MSDE3MjcHTUxIMTc2MAdNTEgxNzYyB01MSDE3NzAHTUxIMTgwNgdNTEgxODA3B01MSDE4MTEHTUxIMTgyNQdNTEgxODQzB01MSDE5MDIHTUxIMTkwMwdNTEgxOTA0B01MSDE5MDgHTUxIMTkxMAdNTEgxOTEyB01MSDE5MTYHTUxIMTk5MQdNTEgyMDIwB01MSDIwMjMHTUxIMjA0MgdNTEgyMDY0B01MSDIwNjUHTUxIMjA2NwdNTEgyMDcxB01MSDIxMDQHTUxIMjEwOQdNTEgyMTEwB01MSDIxMzcHTUxIMjE2MgdNTEgyMTY2B01MSDIxNjcHTUxIMjE3MgdNTEgyMjAwB01MSDIyMDQHTUxIMjIwNgdNTEgyMjA3B01MSDIyMjgHTUxIMjIyOQdNTEgyMjQ1B01MSDIyNDkHTUxIMjI2MQdNTEgyMjY2B01MSDIyODMHTUxIMjMwNQdNTEgyMzE0B01MSDIzMTUHTUxIMjMxNgdNTEgyMzE3B01MSDIzMjIHTUxIMjMyNQdNTEgyMzI4B01MSDIzMzAHTUxIMjQyMAdNTEgyNDQ4B01MSDI0NTIHTUxIMjQ3MAdNTEgyNDcxB01MSDI0NzIHTUxIMjQ3MwdNTEgyNDkzB01MSDI1NDMHTUxIMjU0NQdNTEgyNTcwB01MSDI1NzIHTUxIMjU3MwdNTEgyNjEzB01MSDI2MzIHTUxIMjY0MAdNTEgyNzAxB01MSDI3MDIHTUxIMjcwMwdNTEg0MTUxB01MSDQyNjUHTUxINDgyMAdNTEg1MDEzB01MSDUwMTQHTUxINTAyMQdNTEg1MDIzB01MSDUwMjUHTUxINTAzMQdNTEg1MDUwB01MSDUwNTEHTUxINTA1MgdNTEg1MDUzB01MSDUwNjAHTUxINTA3MAdNTEg1MTIwB01MSDUxMjMHTUxINTEzMgdNTEg1MTM0B01MSDUxMzUHTUxINTE0MAdNTEg1MTQxB01MSDUyMDAHTUxINTIxMAdNTEg1MjgwB01MSDUzMDMHTUxINTMxMAdNTEg1MzgwB01MSDUzOTAHTUxINTUxMAdNTEg1NzAwB01MSDU5MzAHTUxINTk0MAdNTEg1OTkwB01MSDU5OTEHTUxINzQwMQdNTEg4MjU0B01MSDkwNDAHTUxIOTA2MQdNTEg5MDYzB01MSDkwNjQHTUxIOTA2OAdNTEg5MDgwB01MSDkxNTQHTVFCMTAxMAdNUUIxMDEyB01RQjEwMzkHTVFCMTA1MgdNUUIxMDUzB01RQjEwODEHTVFCMTA5NQdNUUIxMTIwB01RQjExMjIHTVFCMTEyNAdNUUIxMTMwB01RQjExNDEHTVFCMTE1MQdNUUIxMjAwB01RQjEyMDIHTVFCMTIwNAdNUUIxMjQwB01RQjEyNjAHTVFCMTMwMwdNUUIxMzA0B01RQjEzMTAHTVFCMTMyMAdNUUIxMzMwB01RQjEzNTAHTVFCMTQ2MAdNUUIxNDYxB01RQjE0ODAHTVFCMTQ4MQdNUUIxNTEwB01RQjE1MTIHTVFCMTUxNAdNUUIxNTE1B01RQjE1MTYHTVFCMTUxOQdNUUIxNTIxB01RQjE1OTIHTVFCMTYxNwdNUUIxNjMwB01RQjE2ODAHTVFCMTgwMAdNUUIxODEyB01RQjE4MTMHTVFCMTgxNAdNUUIxODQwB01RQjE4NTAHTVFCMTg1MQdNUUIxODcyB01RQjE5MDAHTVFCMTkwMQdNUUIxOTEzB01RQjE5MjIHTVFCMTkyMwdNUUIxOTQ0B01RQjE5NTAHTVFCMTk2MQdNUUIyMDEzB01RQjIzMTkHTVFCMzAwMAdNUUI5MDEyB01RQjkwMTQHTVFCOTAyMQdNUUI5MDI2B01RQjkwNDEHTVJTMTA0MgdNUlMxMDQ0B01SUzEzMDkHTVJTMTYyMAdNUlMxOTE3B01SUzIyNTgHTVJTMzAwMAdNUlMzMzAzB01SUzkwNDUHTVNEMTA5MgdNU0QxMTAzB01TRDExNjIHTVNEMTYyNAdNU0QxODMwB01TRDE4MzkHTVNEMTkxMAdNU0QyMjI2B01TRDIyNDMHTVNEOTAyMAdNU0sxMDE1B01TSzEwODAHTVNLMTA4MwdNU0sxMjAyB01TSzEyMjIHTVNLMTIyNQdNU0sxMjQxB01TSzEyNDMHTVNLMTQ4MQdNU0sxNTE4B01TSzE1MjEHTVNLMTU3MAdNU0sxNjEyB01TSzE2MTUHTVNLMTYxNgdNU0sxNjE3B01TSzIxMzYHTVNLMjIwNwdNU0syMjUyB01TSzIyNTQHTVNLMjI3MAdNU0syMjcxB01TSzIyNzIHTVNLMjI3NAdNU0syNTAwB01TSzI1MDEHTVNLMjUwMwdNU0syNzcyB01TSzMwMjEHTVNLMzAzMAdNU0szMTA3B01TSzMxMTEHTVNLMzE0MQdNU0szMzE0B01TSzMzMTcHTVNLMzQwMQdNU0szNDI0B01TSzM1MjIHTVNLMzY0OQdNU0szNjYxB01TSzM3MTEHTVNLMzcyNwdNU0szNzMzB01TSzM4MjMHTVNLNDAyMAdNU0s0MDI2B01TSzQwMjcHTVNLNDAyOAdNU0s0MDQwB01TSzQwNDUHTVNLNDA2NQdNU0s0MDczB01TSzQ2MDAHTVNLNDYxMwdNU0s1MzUzB01TSzkwMjcHTVNLOTA1NwdNU1QxMDEwB01TVDEwMTIHTVNUMTAxMwdNU1QxMDE0B01TVDEwMTUHTVNUMTAxNgdNU1QxMDE3B01TVDEwMTgHTVNUMTAxOQdNU1QxMDIxB01TVDEwNjEHTVNUMTA4MQdNU1QxMDgyB01TVDExMDEHTVNUMTEwMwdNU1QxMTExB01TVDExMzAHTVNUMTEzNAdNU1QxMTQzB01TVDExNDQHTVNUMTE2MgdNU1QxMTY1B01TVDExNzIHTVNUMTE4MAdNU1QxMjA5B01TVDEyMjMHTVNUMTI2MgdNU1QxMzAzB01TVDEzMDQHTVNUMTMwNQdNU1QxMzA2B01TVDEzMDcHTVNUMTMwOQdNU1QxMzMxB01TVDEzNDEHTVNUMTM0MgdNU1QxMzUwB01TVDEzNTIHTVNUMTM2MAdNU1QxMzcwB01TVDE0NDAHTVNUMTQ0MQdNU1QxNDcyB01TVDE0OTIHTVNUMTQ5NQdNU1QxNTAxB01TVDE1NzIHTVNUMTYwMAdNU1QxNjEzB01TVDE2MjMHTVNUMTYyNQdNU1QxNjI3B01TVDE2MzMHTVNUMTYzNgdNU1QxNjcwB01TVDE2NzMHTVNUMTY4MAdNU1QxNjgzB01TVDE2OTAHTVNUMTcwMAdNU1QxNzUxB01TVDE4NDIHTVNUMTg1MgdNU1QxODU0B01TVDE4NjIHTVNUMjAxNAdNU1QyMDIxB01TVDIwMjUHTVNUMjA2MQdNU1QyMDY0B01TVDIwNzEHTVNUMjA3MgdNU1QyMDc1B01TVDIwNzcHTVNUMjExMAdNU1QyMTMwB01TVDIxMzEHTVNUMjEzMwdNU1QyMTM1B01TVDIxNDMHTVNUMjE0NQdNU1QyMTcxB01TVDIxNzMHTVNUMjE3NwdNU1QyMTgwB01TVDIxODEHTVNUMjE4MgdNU1QyMjUxB01TVDIyNTUHTVNUMjI3MAdNU1QyMzI3B01TVDIzMzEHTVNUMjM0MQdNU1QyMzcwB01TVDIzOTAHTVNUMjM5MQdNU1QyNDAwB01TVDI0MTAHTVNUMjQxMwdNU1QyNDMwB01TVDI0MzIHTVNUMjQzMwdNU1QyNDQwB01TVDI0NjQHTVNUMjQ2OAdNU1QyNDgwB01TVDI0ODMHTVNUMjUwMwdNU1QyNTE0B01TVDI1MTcHTVNUMjUyMAdNU1QyNTIzB01TVDI1MzIHTVNUMjU0MAdNU1QyNTQzB01TVDI1NjEHTVNUMjYxMQdNU1QyNjIwB01TVDI2MjIHTVNUMjYyMwdNU1QyNjMwB01TVDI2MzIHTVNUMjY0MQdNU1QyNjUxB01TVDI2NTMHTVNUMjY2MwdNU1QyNzAxB01TVDI3MjMHTVNUMjcyNAdNU1QyNzI3B01TVDI3MzIHTVNUMjc0MAdNU1QyNzYwB01TVDI3NjQHTVNUMjc4MAdNU1QyOTExB01TVDMwMTAHTVNUMzA2MAdNU1QzMDYyB01TVDMwNjcHTVNUMzA2OAdNU1QzMDY5B01TVDMwNzMHTVNUMzA5MAdNU1QzMTAxB01TVDMxMDIHTVNUMzEwNgdNU1QzMTA3B01TVDMxMjAHTVNUMzE1MAdNU1QzMTU1B01TVDMxNzIHTVNUMzIwMAdNU1QzMjAxB01TVDMyMDQHTVNUMzIzMwdNU1QzMjQyB01TVDMyNjEHTVNUMzMxNwdNU1QzMzQwB01TVDMzNDEHTVNUMzM1MwdNU1QzNDAwB01TVDM0MDUHTVNUMzQxMAdNU1QzNTAyB01TVDM1MDMHTVNUMzUwNAdNU1QzNTA1B01TVDM1MDYHTVNUMzUwNwdNU1QzNTA4B01TVDM1MDkHTVNUMzU4MgdNU1QzNTgzB01TVDM1ODQHTVNUMzU4NQdNU1QzNjAyB01TVDM2MjAHTVNUMzY2MAdNU1QzNjcyB01TVDM3MDIHTVNUMzcwNQdNU1QzNzA2B01TVDM3MTEHTVNUMzc2MAdNU1QzNzYyB01TVDM3ODAHTVNUMzc4MQdNU1QzNzgyB01TVDM3ODMHTVNUMzc4NAdNU1QzNzg1B01TVDM4MDQHTVNUMzgzMAdNU1QzODMxB01TVDM4NDAHTVNUMzg1MAdNU1QzODUxB01TVDM4NTIHTVNUMzg1NQdNU1QzODc1B01TVDQwMTcHTVNUNDAyNgdNU1Q0MDMxB01TVDQwMzQHTVNUNDA0MAdNU1Q0MDQ1B01TVDQwODIHTVNUNDEwMgdNU1Q0MTA0B01TVDQxMDYHTVNUNDEwOAdNU1Q0MTEyB01TVDQxMTYHTVNUNDEyMAdNU1Q0MTIzB01TVDQxMjYHTVNUNDEyNwdNU1Q0MTMyB01TVDQxMzQHTVNUNDE0MwdNU1Q0MTYwB01TVDQxNjEHTVNUNDE4MAdNU1Q0MTgxB01TVDQyMDAHTVNUNDIwMQdNU1Q0MjAyB01TVDQyMDMHTVNUNDIwNAdNU1Q0MjA3B01TVDQyMzMHTVNUNDI1MAdNU1Q0MjYzB01TVDQyNzAHTVNUNDI4MAdNU1Q0MzAzB01TVDQzMTIHTVNUNDMxNgdNU1Q0MzE4B01TVDQzMjEHTVNUNDMyMgdNU1Q0MzQzB01TVDQzNTQHTVNUNDM1NgdNU1Q0MzU4B01TVDQzNjMHTVNUNDM4MQdNU1Q0MzgzB01TVDQ0MDQHTVNUNDQwNQdNU1Q0NDIyB01TVDQ0NjQHTVNUNDQ2NwdNU1Q0NDcwB01TVDQ1MDIHTVNUNDUwMwdNU1Q0NTA0B01TVDQ1MTAHTVNUNDUxMQdNU1Q0NTEyB01TVDQ1MTQHTVNUNDUzNQdNU1Q0NTQyB01TVDQ1OTIHTVNUNDU5MwdNU1Q0NjAxB01TVDQ2MDMHTVNUNDYxMQdNU1Q0NjIwB01TVDQ2MjEHTVNUNDYyMgdNU1Q0NjIzB01TVDQ2MzMHTVNUNDk0MwdNU1Q0OTQ1B01TVDQ5NjAHTVNUNTAxMAdNU1Q1MDE0B01TVDUwNTAHTVNUNTA1MQdNU1Q1MDUzB01TVDUwNTQHTVNUNTA1NQdNU1Q1MDczB01TVDUwNzUHTVNUNTA4MAdNU1Q1MDgxB01TVDUxMDEHTVNUNTEwMgdNU1Q1MTEzB01TVDU1NDAHTVNUNTU3MAdNU1Q5MDIyB01TVDkwMjQHTVNUOTAyNQdNU1Q5MDI5B01TVDkwMzQHTVNUOTA1MAdNU1Q5MDU0B01TVDkwNTUHTVNUOTA1NgdNU1Q5MDU5B01TVDkwNzIHTVNUOTA4MAdNU1Q5MDk0B01URjEwMTcHTVRGMTAyMAdNVEYxMDUxB01URjEwNzEHTVRGMTA4MQdNVEYxMTAwB01URjExMTAHTVRGMTEyMAdNVEYxMTIyB01URjExMzAHTVRGMTEzMQdNVEYxMTMyB01URjExNDMHTVRGMTE2MAdNVEYxMjAyB01URjEyMDQHTVRGMTIxMAdNVEYxMjIxB01URjEyMzAHTVRGMTIzMQdNVEYxMjM0B01URjEyNDAHTVRGMTI0MQdNVEYxMjYwB01URjEyNjEHTVRGMTI3MAdNVEYxMzAwB01URjEzMTAHTVRGMTM4MQdNVEYxNDAzB01URjE0MDUHTVRGMTQ0MAdNVEYxNDQxB01URjE0NzIHTVRGMTQ5MAdNVEYxNTAwB01URjE1NDAHTVRGMTU0MgdNVEYxNTYwB01URjE2MDAHTVRGMTc5MAdNWEsxMDM0B01YSzEwNTEHTVhLMTA4NgdNWEsxMTAwB01YSzExNTMHTVhLMTE2MAdNWEsxMTgxB01YSzEyNDcHTVhLMTMwNAdNWGsxNDA0B01YSzE0MDUHTVhLMTQxMgdNWEsxNDcyB01YSzE0NzMHTVhLMTUxMgdNWEsxNTM3B01YSzE1MzgHTVhLMTcwMAdNWEsxNzIyB01YSzE3NDEHTVhLMTc2MgdNWEsxODYxB01YSzQwODIHTVhLNDA4NAdNWEs5MDI2B01YSzkwMjcHTVhLOTA0MgdNWEs5MDQzB01YSzkwNDcHTVhLOTA2MwdNWFIxMDEyB01YUjEwNjAHTVhSMTA2MQdNWFIxMTAwB01YUjExMDEHTVhSMTEwMgdNWFIxMTAzB01YUjExMDQHTVhSMTEwNQdNWFIxMTIwB01YUjExMjEHTVhSMTMwMAdNWFIxMzAxB01YUjEzMTEHTVhSMTMyMQdNWFIxMzMxB01YUjEzNDAHTVhSMTM1MAdNWFIxMzYxB01YUjEzNjMHTVhSMTQxMAdNWFIxNDIwB01YUjE0NTIHTVhSMTQ2MQdNWFIxNDgwB01YUjE0ODEHTVhSMTUwMAdNWFIxNTAxB01YUjkwMTAHTVhSOTAzMAdORFIwMTAyB05EUjEwMjAHTkRSMTAyMQdORFIxMDM0B05EUjEwNDAHTkRSMTA3MAdORFIxMDcxB05EUjEwODAHTkRSMTE0MAdORFIxMjEyB05EUjEyMjEHTkRSMTIyMgdORFIxMjMwB05EUjEyMzQHTkRSMTIzOQdORFIxMjQzB05EUjEyNTAHTkRSMTMxMgdORFIxMzMyB05EUjEzNDEHTkRSMTM0MwdORFIxMzUwB05EUjEzNTQHTkRSMTM1NwdORFIxMzYwB05EUjEzNjEHTkRSMTM3MAdORFIxMzk2B05EUjE0MDAHTkRSMTQwNAdORFIxNDA1B05EUjE0MTEHTkRSMTQzNgdORFIxNDUwB05EUjE0NjEHTkRSMTQ2OAdORFIxNDY5B05EUjE2MDAHTkRSMTYwMQdORFIxNjAyB05EUjE2MDMHTkRSMTYwNwdORFIxNjExB05EUjE2MTMHTkRSMTY0MgdORFIxNjYwB05EUjE2NjEHTkRSMTY2MwdORFIxNjY2B05EUjE4MDAHTkRSMTg0MwdORFIxODQ0B05EUjE4NDUHTkRSMTg1MAdORFIxODUxB05EUjE5MDAHTkRSMTkzMAdORFIxOTQxB05EUjE5NjAHTkRSMTk3MQdORFIyMDEwB05EUjIwMzQHTkRSMjExMQdORFIyMTM5B05EUjIxNTAHTkRSMjE1MwdORFIyMTczB05EUjIxNzcHTkRSMjE4MAdORFIyMjIwB05EUjIyMjIHTkRSMjIzMgdORFIyMjQxB05EUjIyNDQHTkRSMjI0NQdORFIyMjUxB05EUjIzMDAHTkRSMjMwMQdORFIyMzAyB05EUjIzMDQHTkRSMjMwNQdORFIyMzA2B05EUjIzMDcHTkRSMjMyMAdORFIyMzIxB05EUjIzMzAHTkRSMjM0MAdORFIyMzUwB05EUjIzNjAHTkRSMjM2MQdORFIyMzgyB05EUjkwMTAHTkRSOTAxMQdORFI5MDE0B05EUjkwMTYHTkRSOTAzMAdORFI5MDMxB05EUjkwMzQHTkRSOTAzNgdORFI5MDQwB05EUjkwNDkHTkRSOTA1MAdORFI5MDUxB05EUjkwNjIHTkRSOTA3MAdORFI5MDcxB05EUjkwNzMHTkRSOTA3NwdORFI5MDgxB05EUjkwODgHTlhSMDU0NwdOWFIwNTk5B05YUjEwMTMHTlhSMTAxNgdOWFIxMDE3B05YUjEwMTgHTlhSMTAyMAdOWFIxMDU1B05YUjEwOTAHTlhSMTEwMgdOWFIxMTIyB05YUjExMzMHTlhSMTIwMwdOWFIxMjA1B05YUjEzNzEHTlhSMTQwNAdOWFIxNDA4B05YUjE0MjAHTlhSMTQyMQdOWFIxNTA4B05YUjE1MDkHTlhSMTU5MQdOWFIxNjIwB05YUjE5MDcHTlhSMTkyMwdOWFIxOTMyB05YUjE5NDMHTlhSMTk3MQdOWFIyMDYzB05YUjIwNjYHTlhSMjA2OAdOWFIyMTM0B05YUjIxNDIHTlhSMjM1MQdOWFIyNDA2B05YUjI0MDcHTlhSMjUwNgdOWFIyNTI1B05YUjI1MzIHTlhSMjUzMwdOWFIyNTQxB05YUjI1NDMHTlhSMjU0NQdOWFIyNTU4B05YUjI1NTkHTlhSMjYwMgdOWFIyNjAzB05YUjI2MDQHTlhSMjYwNgdOWFIyNjA3B05YUjI2MDgHTlhSMjYwOQdOWFIyNjIwB05YUjI2MjYHTlhSMjYyOAdOWFIyNjMwB05YUjI2NDEHTlhSMjY1NQdOWFIyNjYwB05YUjMwMjEHTlhSMzAyNQdOWFIzMTUwB05YUjMxNjIHTlhSMzIwNQdOWFIzMjMwB05YUjMyMzIHTlhSMzI0MQdOWFIzMjU0B05YUjMzMTIHTlhSMzM1OQdOWFIzMzcxB05YUjMzNzMHTlhSMzQxMwdOWFIzNDIwB05YUjM0MjMHTlhSMzQzNgdOWFIzNDgyB05YUjM1MTIHTlhSMzUzMQdOWFIzNTUwB05YUjM1NzgHTlhSMzYwMAdOWFIzNjIzB05YUjM2MjQHTlhSMzY0MQdOWFIzNjQzB05YUjM2NTAHTlhSMzY2MQdOWFIzNjcwB05YUjM2ODAHTlhSNDAxMAdOWFI0MDE1B05YUjQwMTkHTlhSNDAzMAdOWFI0MDM2B05YUjQwNTIHTlhSNDA4MQdOWFI0MTEzB05YUjQxMjAHTlhSNDIyMQdOWFI0MjUwB05YUjQ0MjMHTlhSNTAyMQdOWFI1MTQwB05YUjUyMDgHTlhSNTIxMgdOWFI2MDMyB05YUjYwNTAHTlhSNjA1MQdOWFI2MDUyB05YUjYzMzcHTlhSNjM0NQdOWFI2MzUzB05YUjYzODIHTlhSNjQwMAdOWFI2NDAzB05YUjY0MDQHTlhSNjQ0MAdOWFI2NDQxB05YUjY0NTMHTlhSNjQ3NgdOWFI2NDc3B05YUjY1MDMHTlhSNjUxNAdOWFI2NTE2B05YUjY1MTcHTlhSNjUzMQdOWFI2NTQwB05YUjY1NDEHTlhSNjYxNgdOWFI2NjQwB05YUjkwMjIHTlhSOTAyNwdQQksxNDQwB1BCSzE0NjEHUEJLMTUwNQdQQksxODIwBlBMQTAwMAdQTEExMDE3B1BMQTEwMjEHUExBMTA0MgdQTEExMTA0B1BMQTExMzIHUExBMTE2MAdQTEExMzAzB1BMQTEzMTAHUExBMTMxNQdQTEExMzIzB1BMQTE0MTUHUExBMTQxNwdQTEExNDU0B1BMQTE1MTUHUExBMTU3NQdQTEExNTc5B1BMQTE2MTUHUExBMTY4MQdQTEExOTA1B1BMQTIyMzQHUExBOTAxMAdQTEE5MDMyB1BMQTkwNTQHUFRBMTIyNwdQVEExNTAyB1BUQTkwNDMHUFRBOTA0NAdRTEExMDI4B1FMQTEwNDAHUUxBMTA1MgdRTEExMDUzB1FMQTEwNjMHUUxBMTA5MAdRTEExMTEzB1FMQTExNDEHUUxBMTE4MAdRTEExMTgxB1FMQTExODIHUUxBMTIwMAdRTEExMjA5B1FMQTEyNDEHUUxBMTI0MgdRTEExMzExB1FMQTEzMjAHUUxBMTMyMQdRTEExMzM0B1FMQTE0MDIHUUxBMTYxMAdRTEExNjEzB1FMQTE2MzIHUUxBMTY3MAdRTEExNzAyB1FMQTE3MDkHUUxBMTc2MAdRTEExODExB1FMQTE5MTAHUUxBMTkxMwdRTEExOTE3B1FMQTE5MzMHUUxBMjAxMAdRTEEyMDE0B1FMQTIwMTUHUUxBMjAxOQdRTEEyMDI1B1FMQTIxMzEHUUxBOTAxMwdRTEE5MDE4B1FMQTkwMTkHUUxBOTAyMgdRTEE5MDQyB1FORDE3MTEHUU5EMTc2NAdRUkQxMDIwB1FSRDEwNzAHUVJEMTEwMgdRUkQxMTAzB1FSRDExMjQHUVJEMTEyNQdRUkQxMTI3B1FSRDExMjgHUVJEMTE2MQdRUkQxMTgxB1FSRDEyMDMHUVJEMTIxMgdRUkQxMjE0B1FSRDEyMTUHUVJEMTI1MgdRUkQxMjUzB1FSRDEyNTQHUVJEMTI1NwdRUkQxMjYwB1FSRDEzMDEHUVJEMTMwMwdRUkQxMzEzB1FSRDEzNTcHUVJEMTM4MAdRUkQxMzgxB1FSRDE0MDEHUVJEMTQxMAdRUkQxNDQzB1FSRDE0NDUHUVJEMTQ2MQdRUkQxNDkxB1FSRDE0OTMHUVJEMTUwMwdRUkQxNTIyB1FSRDE1MzAHUVJEMTUzMgdRUkQxNTM1B1FSRDE2MTAHUVJEMTYxMQdRUkQxNjMwB1FSRDE2MzIHUVJEMTYzMwdRUkQxNjUxB1FSRDE2NTIHUVJEMTY3MAdRUkQxNzAxB1FSRDE3MTEHUVJEMTc0MgdRUkQxNzQ2B1FSRDE3NDcHUVJEMTc3MgdRUkQxODAwB1FSRDE4MTIHUVJEMTgxNQdRUkQxODMwB1FSRDE4MzEHUVJEMTgzMwdRUkQxOTAyB1FSRDE5MTAHUVJEMTkyMQdRUkQxOTQxB1FSRDE5NDMHUVJEMjAyMAdRUkQyMDIxB1FSRDIwMjMHUVJEMjExMwdRUkQyMTQxB1FSRDI0MDAHUVJEMjQwMgdRUkQyNDA0B1FSRDI0MDUHUVJEMjQwOAdRUkQyNTAxB1FSRDI1MDQHUVJEMjUzMQdRUkQyNTMzB1FSRDI1MzUHUVJEMzEwMgdRUk0xMDI1B1FSTTEwODAHUVJNMTA5MAdRUk0xMTA0B1FSTTExMDcHUVJNMTEwOQdRUk0xMTgyB1FSTTEyMDQHUVJNMTIwOAdRUk0xMjg0B1FSTTE0MDYHUVJNMTQ4NAdRUk0xNTA0B1FSTTE1MDUHUVJNMTUwOQdRUk0xNTE4B1FSTTE1NjMHUVJNMTU4MAdRUk0xNjA1B1FSTTE2NTEHUVJNMTcxMAdRUk0xNzE1B1FSTTE4MDEHUVJNMTgwNgdRUk0xODM4B1FSTTE4NTAHUVJNMTkwMQdRUk0xOTExB1FSTTE5NDAHUVJNMTk0MgdRUk0xOTUwB1FSTTE5NTEHUVJNMjAyMwdRUk0yMDM1B1FSTTIxMDEHUVJNMjEwMwdRUk0yMTI0B1FSTTIxMzIHUVJNMjEzMwdRUk0yMTM3B1FSTTIxNzAHUVJNMjE4MwdRUk0yMTg2B1FSTTIyMDIHUVJNMjIwMwdRUk0yMjA4B1FSTTIyMDkHUVJNMjMxNAdRUk0yMzE1B1FSTTIzNzEHUVJNMjM3OQdRUk0yMzgwB1FSTTI0MTYHUVJNMjQyMAdRUk0yNDUyB1FSTTI0NjMHUVJNMjQ3MQdRUk0yNTAwB1FSTTI1MDIHUVJNMjUwMwdRUk0yNTA1B1FSTTI1MDcHUVJNMjU4MgdRUk0yNjEyB1FSTTI2MzIHUVJNMjYzMwdRUk0yNjM0B1FSTTI2NTEHUVJNMjY4MQdRUk0yNjg2B1FSTTI3MDAHUVJNMjcwNAdRUk0yNzM3B1FSTTI3MzgHUVJNMjgwMAdRUk0yODAxB1FSTTI4MDMHUVJNMjgxMQdRUk0yODQzB1FSTTI4NDQHUVJNMjg0NQdRUk0yOTAyB1FSTTI5MDMHUVJNMjkxMgdRUk0yOTM4B1FSTTI5NDMHUVJNMjk0NQdRUk0yOTQ2B1FSTTI5NjEHUVJNMzAwMAdRUk0zMDExB1FSTTMwMzMHUVJNMzEwMAdRUk0zMjAxB1FSTTMyMzIHUVJNMzI1NAdRUk0zNjEwB1FSTTM2MTEHUVJNMzYxMgdRUk0zNjEzB1FSTTM2MTYHUVJNMzYxNwdRUk0zNjkxB1FSTTM5MDQHUVJNMzkwNQdRUk0zOTUwB1FSTTQwMDEHUVJNNDAwNwdRUk00MDUxB1FSTTQ1MTMHUVJNNDUxNQdRUk00NTMyB1FSTTQ1MzMHUVJNNDUzNAdRUk00NTM2B1FSTTQ1NTAHUVJNNDU1MgdRUk00NjAwB1FSTTQ2MjAHUVJNNDY2MQdRUk00ODAwB1FSTTUwMTkHUVJNNTEyNgdRUk01MTQwB1FSTTUxNDMHUVJNNTE1MAdRUk01MjAyB1FSTTUyMTEHUVJNNTIyMAdRUk01MjMxB1FSTTkwMTIHUVJNOTAxNgdRUk05MDE4B1FSTTkwMTkHUVJNOTA1MwdRUk05MDcyB1FSTTkwNzUHUkJUMDAxNAdSQlQwMDQ0B1JCVDEwNDMHUkJUMTA2MwdSQlQxMDgxB1JCVDEwODIHUkJUMTExMgdSQlQxMTIwB1JCVDExMzYHUkJUMTI1MAdSQlQxMjUxB1JCVDEyNzEHUkJUMTI5MQdSQlQxMzAwB1JCVDEzMzEHUkJUMTMzNAdSQlQxMzYzB1JCVDE0MDUHUkJUMTQwNwdSQlQxNDA4B1JCVDE0MTAHUkJUMTQ0MAdSQlQxNDcxB1JCVDE0NzcHUkJUMTUwMwdSQlQxNTIxB1JCVDE1MjIHUkJUMTUyNgdSQlQxNTQwB1JCVDE1NDIHUkJUMTU1MgdSQlQxNTYwB1JCVDE1ODQHUkJUMTU4NQdSQlQxNjAwB1JCVDE2MDMHUkJUMTYwNQdSQlQxNjA4B1JCVDE2MzEHUkJUMTY2MAdSQlQxNjYxB1JCVDE2NjMHUkJUMTY3MgdSQlQxNjg2B1JCVDE2ODgHUkJUMTcwMQdSQlQxNzAyB1JCVDE3MDUHUkJUMTcxMAdSQlQxNzMyB1JCVDE3NjIHUkJUMTc2MwdSQlQxNzY2B1JCVDE3NjcHUkJUMTgwMQdSQlQxODMxB1JCVDE4MzQHUkJUMTgzNQdSQlQxODM3B1JCVDE4NDEHUkJUMTg0MwdSQlQxODQ0B1JCVDE4NDgHUkJUMTg0OQdSQlQxODUwB1JCVDE4NTIHUkJUMTg2MgdSQlQxODY0B1JCVDE4NjUHUkJUMTg3MQdSQlQxOTAxB1JCVDE5MDcHUkJUMTk1MAdSQlQxOTUxB1JCVDE5NTIHUkJUMTk2MQdSQlQxOTcwB1JCVDE5NzUHUkJUMTk4MAdSQlQxOTgxB1JCVDE5ODIHUkJUMjAxMAdSQlQyMDIwB1JCVDIwMzAHUkJUMjAzMgdSQlQyMDM0B1JCVDIwMzYHUkJUMjA3MAdSQlQyMDczB1JCVDIxMDEHUkJUMjE0NAdSQlQyMTQ1B1JCVDIxNDYHUkJUMjE0NwdSQlQyMTUyB1JCVDIxNjEHUkJUMjE2MgdSQlQyMTkxB1JCVDIyMjIHUkJUMjIyMwdSQlQyMjI0B1JCVDIyMzIHUkJUMjIzNAdSQlQyMjM1B1JCVDIyMzcHUkJUMjI0MgdSQlQyMjQzB1JCVDIyNDUHUkJUMjI1MgdSQlQyMjUzB1JCVDIyNjAHUkJUMjI3MAdSQlQyMjgyB1JCVDIyODMHUkJUMjMwMwdSQlQyMzA3B1JCVDIzMjAHUkJUMjMyMQdSQlQyNDExB1JCVDI0MTMHUkJUMjQxNAdSQlQyNDMxB1JCVDI0MzUHUkJUMjQ0MwdSQlQyNDYyB1JCVDI0ODUHUkJUMjQ4NgdSQlQyNDg3B1JCVDI1MDAHUkJUMjUyMgdSQlQyNjA0B1JCVDI2MTAHUkJUMjYxNgdSQlQyNjQ2B1JCVDI2NTMHUkJUMjY3MQdSQlQyNjcyB1JCVDI3MDIHUkJUMjcwOQdSQlQyNzEwB1JCVDI3MzEHUkJUMjczMwdSQlQyNzQwB1JCVDMwMjQHUkJUMzAyNgdSQlQzMDMwB1JCVDMwNDUHUkJUMzA0NwdSQlQzMTAwB1JCVDMxMTIHUkJUMzExMwdSQlQzMTIxB1JCVDMxMzAHUkJUMzEzMQdSQlQzMTMyB1JCVDMxNDAHUkJUMzE0MQdSQlQzMTQyB1JCVDMyMTEHUkJUMzIxMgdSQlQzMjE3B1JCVDMyNDAHUkJUMzQzMAdSQlQzNTAwB1JCVDM1MDIHUkJUMzUwMwdSQlQzNTA0B1JCVDQwMTAHUkJUNDAxMQdSQlQ0MDEyB1JCVDQwMTYHUkJUNDAxNwdSQlQ0MDI0B1JCVDQwMjkHUkJUNDAzMAdSQlQ0MDM0B1JCVDQwMzcHUkJUNDA1MAdSQlQ0MDcwB1JCVDQxMDAHUkJUNDEwMQdSQlQ0MTAzB1JCVDQxMDQHUkJUNDEwNQdSQlQ0MTA3B1JCVDQxMTAHUkJUNDExMgdSQlQ0MTEzB1JCVDQyMDAHUkJUNDIwMgdSQlQ0MjEwB1JCVDQyMTQHUkJUNDIyMAdSQlQ0MjI0B1JCVDQyMjUHUkJUNDIyNgdSQlQ0MjI3B1JCVDQyNDIHUkJUNDI1MAdSQlQ0MjgwB1JCVDQyOTAHUkJUNDMwNAdSQlQ0MzMwB1JCVDQzMzEHUkJUNDMzMgdSQlQ0MzQwB1JCVDQzNDIHUkJUNDM0NAdSQlQ0NDAwB1JCVDQ0MTAHUkJUNDQyMAdSQlQ0NjAzB1JCVDQ2MDgHUkJUNDYxOAdSQlQ0NjIwB1JCVDQ2MzMHUkJUNDYzOAdSQlQ0NzAwB1JCVDQ3MDEHUkJUNDcxMQdSQlQ0NzIyB1JCVDUwMTAHUkJUNTEwMAdSQlQ1MzEwB1JCVDUzMjAHUkJUNTk5MAdSQlQ2MDExB1JCVDYwMTMHUkJUNjAxNwdSQlQ2MDIyB1JCVDYwMzMHUkJUNjAzNQdSQlQ2MDQxB1JCVDYwNTcHUkJUNjA4MAdSQlQ2MTIxB1JCVDYxMzAHUkJUNjE0MQdSQlQ2MjEwB1JCVDYzMDAHUkJUNjMwMgdSQlQ2MzAzB1JCVDY0MDMHUkJUNjQwNQdSQlQ2NDA3B1JCVDY0MTEHUkJUNjQxMwdSQlQ2NDIwB1JCVDY0NDEHUkJUNjQ0MgdSQlQ2NDQzB1JCVDY0NzAHUkJUNjUwMAdSQlQ2NTAzB1JCVDY1MTMHUkJUNjUyMAdSQlQ2NTI4B1JCVDY1NTAHUkJUNjYwMAdSQlQ2NjAzB1JCVDY2MDQHUkJUNjYwNQdSQlQ2NjA2B1JCVDY2MDcHUkJUNjcwMAdSQlQ2NzAxB1JCVDY3MDIHUkJUNjcwMwdSQlQ2NzA2B1JCVDY4MDAHUkJUNjgwMgdSQlQ2OTAwB1JCVDY5MDEHUkJUNjkwMwdSQlQ2OTMwB1JCVDY5NTAHUkJUOTAyMQdSQlQ5MDIyB1JCVDkwMjMHUkJUOTAyNgdSQlQ5MDI3B1JCVDkwMzAHUkJUOTAzOAdSQlQ5MDM5B1JCVDkwNDgHU0ZJMDE2MQdTRkkxMDMxB1NGSTEwNDAHU0ZJMTA0MQdTRkkxMDQzB1NGSTEwNDYHU0ZJMTA0NwdTRkkxMTEwB1NGSTExMTIHU0ZJMTExMwdTRkkxMTIwB1NGSTExMjEHU0ZJMTEyMgdTRkkxMTIzB1NGSTExMjQHU0ZJMTEyNQdTRkkxMTI3B1NGSTExNDEHU0ZJMTE1MgdTRkkxMTYxB1NGSTExNzEHU0ZJMTE4NAdTRkkxMjEyB1NGSTEyNTAHU0ZJMTI2MQdTRkkxMjcwB1NGSTEyOTMHU0ZJMTMwMAdTRkkxMzcwB1NGSTE0MDEHU0ZJMTQwMgdTRkkxNDAzB1NGSTE0MDQHU0ZJMTQwNQdTRkkxNDA3B1NGSTE0MTEHU0ZJMTQxMgdTRkkxNDEzB1NGSTE0MTQHU0ZJMTQxNQdTRkkxNDIxB1NGSTE0MjIHU0ZJMTQyMwdTRkkxNDMwB1NGSTE0MzIHU0ZJMTQzNAdTRkkxNDUyB1NGSTE1MDMHU0ZJMTUwNQdTRkkxNTExB1NGSTE1MTIHU0ZJMTUxMwdTRkkxNTE0B1NGSTE1MjEHU0ZJMTU0MAdTRkkxNTQxB1NGSTE1NDMHU0ZJMTYxMQdTRkkxNjEzB1NGSTE2MTUHU0ZJMTYxNwdTRkkxNjIwB1NGSTE2MjEHU0ZJMTYzNAdTRkkxNjQwB1NGSTI2MjAHU0ZJNjA3MQdTRkk3MDgwB1NGSTkwMTAHU0ZJOTAxNAdTR04wMDE2B1NHTjEwMzQHU0dOMTA3MAdTR04xMDcxB1NHTjExMDAHU0dOMTMwNAdTR04xMzA1B1NHTjEzMjEHU0dOMTM0NQdTR04xNDIxB1NHTjE1NDAHU0dOMTYwMAdTR04xNjMwB1NHTjE2NzYHU0dOMTcxMAdTR04xNzQxB1NHTjE3NjYHU0dOMTg2MgdTR04xOTA1B1NHTjE5MTQHU0dOMTkyNwdTR04yMDIwB1NHTjIwMjEHU0dOMjEwMQdTR04yMTA0B1NHTjIyMDMHU0dOMjI1MQdTR04yMzAzB1NHTjI0MTUHU0dOMjgwMQdTR04yODAzB1NHTjI5MzUHU0dOMzAwMAdTR04zMDc0B1NHTjMxMDMHU0dOMzIzMQdTR040MTkwB1NHTjQxOTMHU0dONDE5NwdTR040MzAzB1NHTjQ0MTUHU0dOOTAxNAdTR045MDMwB1NHTjkwMzIHU0dXMDAwMAdTR1cxMDEwB1NHVzEwMTEHU0dXMTAxMgdTR1cxMDE0B1NHVzEwMTUHU0dXMTAxNwdTR1cxMDE4B1NHVzEwMTkHU0dXMTAyMAdTR1cxMDQwB1NHVzEwNDIHU0dXMTA0MwdTR1cxMDQ3B1NHVzEwNTAHU0dXMTA3MAdTR1cxMDcyB1NHVzEwNzMHU0dXMTA4MQdTR1cxMDkxB1NHVzExMDQHU0dXMTExMAdTR1cxMTExB1NHVzExMTIHU0dXMTExNQdTR1cxMTE3B1NHVzExMTgHU0dXMTExOQdTR1cxMTIwB1NHVzExNTAHU0dXMTE2MQdTR1cxMTY3B1NHVzEyMDUHU0dXMTIwNwdTR1cxMjIxB1NHVzEyMzAHU0dXMTI1MAdTR1cxMjcxB1NHVzEzMDAHU0dXMTMwMQdTR1cxMzAyB1NHVzEzMDMHU0dXMTMwNAdTR1cxMzA1B1NHVzEzMDYHU0dXMTMwOQdTR1cxMzIwB1NHVzEzMjEHU0dXMTM1MQdTR1cxMzUyB1NHVzEzNjAHU0dXMTM2MgdTR1cxMzY1B1NHVzE0MDQHU0dXMTQwOAdTR1cxNDA5B1NHVzE0MjEHU0dXMTQ0MAdTR1cxNDUxB1NHVzE0NTIHU0dXMTQ1NAdTR1cxNDcwB1NHVzE0OTEHU0dXMTUwMAdTR1cxNTAyB1NHVzE1MDMHU0dXMTUzNgdTR1cxNTUwB1NHVzE2MDEHU0dXMTYwMgdTR1cxNjAzB1NHVzE2MDQHU0dXMTYwNQdTR1cxNjA5B1NHVzE2MTAHU0dXMTYxMQdTR1cxNjMwB1NHVzE2NDEHU0dXMTY2MAdTR1cxNjcxB1NHVzE2NzUHU0dXMTcwMAdTR1cxNzAyB1NHVzE3MDMHU0dXMTc1MwdTR1cxNzYwB1NHVzE3NjEHU0dXMTc3MAdTR1cxNzgzB1NHVzE4MDEHU0dXMTgwMgdTR1cxODAzB1NHVzE4MDQHU0dXMTgyMAdTR1cxODIxB1NHVzE4MjIHU0dXMTgyMwdTR1cxODI1B1NHVzE4MjYHU0dXMTgyNwdTR1cxODMwB1NHVzE4MzEHU0dXMTg0MAdTR1cxODQxB1NHVzE4NDMHU0dXMTg0NAdTR1cxODUzB1NHVzE4NTUHU0dXMTg1OQdTR1cxODYxB1NHVzE4NzEHU0dXMTkwMAdTR1cxOTEwB1NHVzE5MTEHU0dXMTkyMAdTR1cxOTIyB1NHVzE5NDEHU0dXMTk1MgdTR1cxOTYzB1NHVzE5NjQHU0dXMTk2NQdTR1cxOTY2B1NHVzE5NjgHU0dXMjAxMAdTR1cyMDExB1NHVzIwMTIHU0dXMjAxNAdTR1cyMDE2B1NHVzIwMTgHU0dXMjA0MAdTR1cyMDQyB1NHVzIwNDUHU0dXMjA1MAdTR1cyMDYwB1NHVzIwNjMHU0dXMjA3MQdTR1cyMDgwB1NHVzIwOTMHU0dXMjA5NAdTR1cyMDk1B1NHVzIwOTcHU0dXMjEwMgdTR1cyMTEwB1NHVzIxMTMHU0dXMjExNAdTR1cyMTQwB1NHVzIxNTAHU0dXMjE1MQdTR1cyMTYxB1NHVzIxNjMHU0dXMjE4MAdTR1cyMTgyB1NHVzIyMDAHU0dXMjIwOQdTR1cyNTExB1NHVzI1MTIHU0dXMjUxMwdTR1cyNTIwB1NHVzI1MjEHU0dXMjUzMAdTR1cyNTMyB1NHVzI1MzMHU0dXMjU5MAdTR1cyNTkxB1NHVzI2MDAHU0dXMjYwMQdTR1cyNjAzB1NHVzI2MTEHU0dXMjYzMgdTR1cyNjUxB1NHVzI3MjQHU0dXMjgxMwdTR1cyODIwB1NHVzI4MjQHU0dXMjgyNQdTR1cyODI4B1NHVzI4MzAHU0dXMjg2MAdTR1cyODgwB1NHVzMwMTEHU0dXMzAxMwdTR1czMDE0B1NHVzMwMTUHU0dXMzAxNgdTR1czMDE3B1NHVzMwMTkHU0dXMzAyMAdTR1czMDIxB1NHVzMwMzAHU0dXMzAzMwdTR1czMDQxB1NHVzMwNTAHU0dXMzA1MgdTR1czMDYwB1NHVzMwNzAHU0dXMzA3MQdTR1czMDcyB1NHVzMwNzQHU0dXMzA3NgdTR1czMDc4B1NHVzMwNzkHU0dXMzA4MAdTR1czMDgyB1NHVzMyMDQHU0dXMzIwNgdTR1czMjExB1NHVzMyMTIHU0dXMzIzMwdTR1czMjM1B1NHVzMyMzYHU0dXMzI1NwdTR1czMjYwB1NHVzMyNjIHU0dXMzI2MwdTR1czMjcwB1NHVzMyNzIHU0dXMzI3MwdTR1czMzAxB1NHVzMzMDMHU0dXMzMxMQdTR1czMzEyB1NHVzMzMzAHU0dXMzMzMQdTR1czMzMzB1NHVzMzMzQHU0dXMzMzNgdTR1czNDAxB1NHVzM0MDIHU0dXMzQwMwdTR1czNDA0B1NHVzM0MTIHU0dXMzQxMwdTR1czNDIzB1NHVzM1MDcHU0dXMzUwOQdTR1czOTA5B1NHVzQwNzAHU0dXNDA5MAdTR1c0NjAwB1NHVzQ4MDAHU0dXNTAxMAdTTEMxMzAyB1NMQzE2MjAHU0xDMTY0MAdTTEMxODIxB1NMQzE4MzIHU0xDMTg0MQdTTE0xMDIyB1NMTTEyMDEHU0xNMTMyMwdTTE0xMzc5B1NMTTE1NDkHU0xNMTYwNAdTTE0xNzA2B1NMTTE3MTMHU0xNMTc2NQdTTE0xNzc1B1NMTTE5MDEHU0xNMTkyMAdTTE0xOTgyB1NMTTIwNTAHU0xNMjEyMwdTTE0yMTYwB1NMTTIyMzQHU0xNMzA2MAdTTE0zMTI0B1NMWjEwMTAHU0xaMTAxMQdTTFoxMDQ1B1NMWjExMDIHU0xaMTEyMAdTTFoxMjAxB1NMWjEyMjEHU0xaMTIzMAdTTFoxMjMyB1NMWjEyMzMHU0xaMTI0MAdTTFoxMjQxB1NMWjEyNjAHU0xaMTI2MQdTTFoxMjcwB1NMWjEzMDAHU0xaMTMwMQdTTFoxMzAzB1NMWjEzMjAHU0xaMTMyMQdTTFoxMzIzB1NOVDExMDAHU05UMTEwMwdTTlQxMTExB1NOVDExMTMHU05UMTEyMAdTTlQxMTIxB1NOVDExMzAHU05UMTEzMQdTTlQxMTMyB1NOVDEyNjAHU05UMTMwMAdTTlQxMzAyB1NOVDEzMDYHU05UMTMyMAdTTlQxMzIyB1NOVDEzNDEHU05UMTM1MwdTTlQxMzYwB1NOVDE0MDEHU05UMTQwNgdTTlQxNDA3B1NOVDE0MjAHU05UMTQ2MwdTTlQxNTEwB1NOVDE1MTEHU05UMTUxMgdTTlQxNTEzB1NOVDE1MTQHU05UMTUxNQdTTlQxNTE2B1NOVDE1MTcHU05UMTUyMgdTTlQxNTUwB1NOVDE1ODEHU05UMTU4MgdTTlQxNTgzB1NOVDE5MTAHU05UNDEyMAdTTlQ5MDIwB1NOVDkwMjMHU05UOTAzMgdTTlQ5MDQwB1NOVDkwNDEHU05UOTA0NQdTTlQ5MDQ2B1NOVDkwNDcHU1BCMDAwMwdTUEIxMDEwB1NQQjEwMTEHU1BCMTAxMgdTUEIxMDEzB1NQQjEwMjQHU1BCMTAyOAdTUEIxMTA0B1NQQjExMDYHU1BCMTExMAdTUEIxMTExB1NQQjExMTMHU1BCMTEyMAdTUEIxMTIzB1NQQjExMjUHU1BCMTE0MwdTUEIxMTUzB1NQQjExNjIHU1BCMTE3MAdTUEIxMTkxB1NQQjEyMjEHU1BCMTI1NAdTUEIxMjgxB1NQQjEyODkHU1BCMTMwNQdTUEIxMzExB1NQQjEzMzQHU1BCMTQ0MgdTUEIxNTEwB1NQQjE1NjQHU1BCMTYyMgdTUEIxNzAzB1NQQjE3NTAHU1BCMTc1MQdTUEIxOTA0B1NQQjE5MDgHU1BCMTk0MQdTUEIyNDQ1B1NQQjI0NzEHU1BCMjUyOQdTUEIyNTc0B1NQQjI2NTIHU1BCMjY4MAdTUEIyNzUzB1NQQjI3NjAHU1BCMzAzNQdTUEIzMDQ0B1NQQjMwNjEHU1BCMzA2NAdTUEIzMDY2B1NQQjMwNzIHU1BCMzA4MwdTUEIzMTEyB1NQQjMxMTQHU1BCMzEzNgdTUEIzMTY4B1NQQjMxNzAHU1BCMzE4MgdTUEIzMjMwB1NQQjMyMzUHU1BCMzI2MAdTUEIzMzEzB1NQQjM0MTQHU1BCMzQxNwdTUEIzNDE4B1NQQjM0MTkHU1BCMzQzMQdTUEIzNDM1B1NQQjM0NTEHU1BCMzQ3MgdTUEIzNDc0B1NQQjM0NzgHU1BCMzUwNgdTUEIzNjUzB1NQQjM2NTUHU1BCMzkyMgdTUEI0MDE0B1NQQjQwNDEHU1BCNDExNAdTUEI0MjAwB1NQQjQyMjMHU1BCNDIzNQdTUEI0MjYwB1NQQjUxMjAHU1BCNjAxMAdTUEI2MDExB1NQQjYwMTIHU1BCNjAxMwdTUEI2MDIwB1NQQjYwMjQHU1BCNjA0MAdTUEI2MDQxB1NQQjYwNDMHU1BCNjA1MwdTUEI2MDU1B1NQQjYwNTcHU1BCNjA3MgdTUEI2MDgwB1NQQjYwODEHU1BCNjA5MwdTUEI2MDk1B1NQQjYxMDIHU1BCNjEzMQdTUEI2MTMzB1NQQjYxNTEHU1BCNjE2MQdTUEI2MTY4B1NQQjYzMDAHU1BCNjMwMwdTUEI2MzQxB1NQQjY1MDIHU1BCNjUxMQdTUEI2NTEyB1NQQjY1MTMHU1BCNjUzMgdTUEI2NTM1B1NQQjY1NDAHU1BCNjYwMAdTUEI2NjAyB1NQQjY2NDAHU1BCNjY0MgdTUEI2NzA2B1NQQjY3MzAHU1BCNjgxMAdTUEI2OTMxB1NQQjkwMjMHU1BCOTAyOAdTUEI5MDYyB1NQQjkwNjQHU1BCOTA2NQdTUEI5MDY2B1NQQjkwNjcHU1BCOTA2OAdTUEI5MDY5B1NQQjkwOTIHU1BCOTA5MwdTVEoxMTEwB1NUSjEyNjAHU1RKMTM1MwdTVEoxNDQwB1NUSjE1ODIHU1RKMTcxMAdTVEoxODUxB1NUSjE4NjEHU1RKMTk2MAdTVEozMDE0B1NUSjMxNzMHU1RKNDAxNAdTVlIwMDAwB1NWUjEwMTcHU1ZSMTAyMAdTVlIxMTA3B1NWUjEyNjMHU1ZSMTMwMQdTVlIxMzM2B1NWUjE0MDYHU1ZSMTY5NAdTVlIxNzUyB1NWUjE3NTMHU1ZSMTc1NAdTVlIxODMxB1NWUjE4NTIHU1dHMTA5MQdTV1ExMDE0B1NXUTEwMTYHU1dRMTEwNAdTV1ExMTA5B1NXUTExNjMHU1dRMTIxMwdTV1ExMjU0B1NXUTIwMzcHU1dRMjAzOAdTV1EyMzM3B1NXUTI0NDMHU1dRMjYxMQdTV1EyNjQ4B1NXUTI4MDIHU1dRMzAxNQdTV1EzMDM5B1NXUTMxNTkHU1dRMzMyMQdTV1EzNDE4B1NXUTM1MzQHU1dRMzUzNQdTV1E4MDEwB1NXUTkwMjYEVFAwMQdUWE4xMTMzB1RYTjExMzgHVFhOMTE3MwdUWE4xMjgwB1RYTjEyODIHVFhOMTMwMwdUWE4xMzE3B1RYTjEzNTYHVFhOMTQ0MwdUWE4xNDUwB1RYTjE0NjAHVFhOMTQ2MgdUWE4xNTM0B1RYTjE1NDMHVFhOMTYwNAdUWE4xNjEyB1RYTjE2MjEHVFhOMTgwMgdUWE4xOTUxB1RYTjIxNDMHVFhOMjE0NQdUWE4yMTQ2B1RYTjIyMDAHVFhOMjIxMAdUWE4yMjYxB1RYTjIzMTEHVFhOMjMzMwdUWE4yMzUyB1RYTjIzNTUHVFhOMjQwNwdUWE4yNDA5B1RYTjI0MjIHVFhOMjQ3MAdUWE4yNTExB1RYTjI1NDEHVFhOMjU1MAdUWE4yNTcxB1RYTjI2MTAHVFhOOTAxMAdUWE45MDIwB1RYTjkwMzIHVFhOOTAzNwdUWE45MDM4B1ZDVDEwMjAHVkNUMTAzMgdWQ1QxMDM0B1ZDVDEwNzEHVkNUMTEwMQdWQ1QxMTcyB1ZDVDEyNTEHVkNUMTMwNAdWQ1QxMzE0B1ZDVDEzMTYHVkNUMTMxOAdWQ1QxMzM1B1ZDVDE1MDQHVkNUMTUwNQdWQ1QxNTE5B1ZDVDE1MzAHVkNUMTYyMQdWQ1QxNjYwB1ZDVDE2NzEHVkNUMTY3NAdWQ1QxNjc1B1ZDVDE2NzYHVkNUMTY3NwdWQ1QxNzExB1ZDVDE3NjIHVkNUMTg0MAdWQ1QxOTA3B1ZDVDIwNDQHVkNUMjA1MQdWQ1QyMDU1B1ZDVDIwNjcHVkNUMjA3MgdWQ1QyMDczB1ZDVDIwNzQHVkNUMjA4MAdWQ1QyMTAzB1ZDVDIxMDQHVkNUMjEwNQdWQ1QyMTA5B1ZDVDIxMTYHVkNUMjEyNAdWQ1QyMTM2B1ZDVDIxNjIHVkNUMjIwMQdWQ1QyMjAzB1ZDVDIyMTEHVkNUMjIyNAdWQ1QyMjMzB1ZDVDIyNTMHVkNUMjI4MQdWQ1QyNTAxB1ZDVDI1MDIHVkNUMjUwMwdWQ1QyNTA4B1ZDVDI1MzAHVkNUMjUzMQdWQ1QyNTMyB1ZDVDI1NTIHVkNUMjU3OQdWQ1QyNjQwB1ZDVDI2NDQHVkNUMjY2MAdWQ1QyNjYzB1ZDVDI2NjUHVkNUMjY5MgdWQ1QyNzA3B1ZDVDI3MzMHVkNUMjczNQdWQ1QyNzUxB1ZDVDI3NTIHVkNUMjc1MwdWQ1QyNzYxB1ZDVDI3NzIHVkNUMjc4NgdWQ1QyNzg4B1ZDVDI4MDAHVkNUMjgwMwdWQ1QyODEwB1ZDVDI4MzIHVkNUMjgzMwdWQ1QyODQzB1ZDVDI4NTEHVkNUMjg1MwdWQ1QyOTAzB1ZDVDI5MDcHVkNUMjkwOQdWQ1QyOTYwB1ZDVDI5NjMHVkNUMjk4NwdWQ1Q5MDIxB1ZDVDkwMjIHVkNUOTAyMwdWQ1Q5MDI4B1ZDVDkwMzEHVkNUOTAzMgdWQ1Q5MDM1B1ZDVDkwNDAHVkNUOTA0NQdWQ1Q5MDQ2B1ZDVDkwNDgHVkNUOTA1MgdWQ1Q5MDUzB1ZDVDkwNTYHVkNUOTA1OQdWQ1Q5MDYxB1ZDVDkwNjYHVkNUOTA4MgdWQ1Q5MDgzB1ZDVDkwODQHVkNUOTA4NgdWTFQxMDQwB1ZMVDExNTAHVkxUMTIzNwdWTFQxMjUxB1ZMVDE0NTcHVkxUMTUyMQdWTFQxNjQ1B1ZMVDIwMDAHWEJYMTA4NAdYQlgxMDg2B1hCWDEyMDIHWEpSMTAyNAdYSlIxMDYwB1hKUjEwNzEHWEpSMTExMgdYSlIxMzQxB1hKUjE4NjUHWExOMTA4MgdYTE4xMDgzB1hMTjEzMjAHWExOMTMyMQdYTE4xNDMxB1hMTjkwNDAHWFJBMTAzMwdYUkExMDM1B1hSQTExMTEHWFJBMTExMgdYUkExMTE0B1hSQTExMTUHWFJBMTExNwdYUkExMTE4B1hSQTExNDEHWFJBMTE2MAdYUkExMTYyB1hSQTExNjMHWFJBMTIwMQdYUkExMjAyB1hSQTEyMDMHWFJBMTIwNgdYUkExMjMwB1hSQTEyMzUHWFJBMTIzNwdYUkExMjM5B1hSQTEzMzAHWFJBMTM0NgdYUkExMzQ3B1hSQTEzNDgHWFJBMTM0OQdYUkExNDAwB1hSQTE0MDMHWFJBMTQwNgdYUkExNTIxB1hSQTE1MjIHWFJBMTUyNAdYUkExNTI1B1hSQTE1MjcHWFJBMTYwMgdYUkExNjA0B1hSQTE2MTAHWFJBMTYxMQdYUkExNjEyB1hSQTE2NjAHWFJBMTcwMgdYUkExNzAzB1hSQTE3MDYHWFJBMTcwNwdYUkExNzExB1hSQTE3MTMHWFJBMTgwNwdYUkExODA4B1hSQTE4MTYHWFJBMTgyMAdYUkExODIyB1hSQTE4MjMHWFJBMTgyNQdYUkEyMDExB1hSQTIwMTMHWFJBMjAxNAdYUkEyMDE4B1hSQTIwODAHWFJBMjA4MQdYUkEyMDg0B1hSQTIxMDIHWFJBMjEwMwdYUkEyMTEwB1hSQTIxMzEHWFJBMjEzMgdYUkEyMTQ0B1hSQTIxNTEHWFJBMjE1NQdYUkEyMTYyB1hSQTIxNzIHWFJBMjE3NQdYUkEyMTkwB1hSQTIyMDAHWFJBMjIwMQdYUkEyMjAyB1hSQTIyMDQHWFJBMjIwNgdYUkEyMjMwB1hSQTIyMzEHWFJBMjIzMwdYUkEyMjM1B1hSQTIyMzYHWFJBMjI0MgdYUkEyMjQ0B1hSQTIyNjAHWFJBMjI2MQdYUkEyMjY0B1hSQTIyNjYHWFJBMjQwMAdYUkEyNDAzB1hSQTI0MDQHWFJBMjQwNQdYUkEyNDA2B1hSQTI0MzEHWFJBMjQzMwdYUkEyNDM0B1hSQTI0MzcHWFJBMjQ3MQdYUkEyNDczB1hSQTI1MDEHWFJBMjUwMwdYUkEyNTA1B1hSQTI1MDYHWFJBMjUwNwdYUkEyNTMwB1hSQTI1MzIHWFJBMjU1MAdYUkEyNTUyB1hSQTI2MDMHWFJBMjYzMgdYUkEyNjUyB1hSQTI2NTMHWFJBMjY5MAdYUkEyNzA1B1hSQTI3MDYHWFJBMjcwNwdYUkEyNzA4B1hSQTI3MDkHWFJBMjc3MAdYUkE5MDExB1hSQTkwMjEHWFJBOTAyMgdYUkE5MDIzB1hSQTkwMjUHWFJBOTAyNgdYUkE5MDMxB1hXSzEwMTEHWFdLMTAxMgdYV0sxMDIxB1hXSzEwMjMHWFdLMTAyNAdYV0sxMDI1B1hXSzExMDUHWFdLMTExMgdYV0sxMTE0B1hXSzExMTUHWFdLMTExNgdYV0sxMTE4B1hXSzExMTkHWFdLMTEzNQdYV0sxMTQyB1hXSzExNDQHWFdLMTIxMQdYV0sxMjIxB1hXSzEyMzAHWFdLMTIzMgdYV0sxMjMzB1hXSzEyMzQHWFdLMTI0MQdYV0sxMjUwB1hXSzEzMTEHWFdLMTMzMgdYV0sxMzM0B1hXSzE3MDAHWFdLMTcwMQdYV0sxNzAzB1hXSzE3MDQHWFdLMTcwNgdYV0sxNzE1B1hXSzE4MjIHWFdLMTgyMwdYV0sxODMxB1hXSzE4NDAHWFdLMTg0MgdYV0sxODUzB1hXSzE4NjIHWFdLMTg3MwdYV0sxODc0B1hXSzE4NzUHWFdLMjAxMQdYV0syMDE0B1hXSzIwMTcHWFdLMjAyMAdYV0syMDMyB1hXSzIwMzMHWFdLMjAzNAdYV0syMDM1B1hXSzIxMDEHWFdLMjEyMQdYV0syMTUzB1hXSzIyMzAHWFdLMjIzMQdYV0syMjMyB1hXSzIyMzUHWFdLMjI0MAdYV0syMjQyB1hXSzIyNTMHWFdLMjI3MAdYV0syMjcxB1hXSzIyNzMHWFdLMjI3NAdYV0syMzMyB1hXSzIzMzMHWFdLMjM2MwdYV0syMzY1B1hXSzIzNjkHWFdLMjQwMgdYV0syNDAzB1hXSzI0MDQHWFdLMjQwNgdYV0syNDA3B1hXSzI0MjEHWFdLMjQzNAdYV0syNDQwB1hXSzI0NDEHWFdLMjQ0MwdYV0syNDcwB1hXSzI0NzEHWFdLMjQ3MgdYV0syNDczB1hXSzI0NzUHWFdLMjQ3NwdYV0syNTAzB1hXSzI1MDQHWFdLMjUwNQdYV0syNTIwB1hXSzI1MzYHWFdLMjU1MQdYV0syNTU2B1hXSzI1NTcHWFdLMjU3MAdYV0syNTczB1hXSzI1ODAHWFdLMjU4MwdYV0syNTg1B1hXSzI2MDEHWFdLMjYxMAdYV0syNjExB1hXSzI2MTMHWFdLMjYxNAdYV0syNjIwB1hXSzI2MzAHWFdLMjYzMwdYV0syOTAxB1hXSzI5MTEHWFdLMjkyNQdYV0syOTI2B1hXSzMwMDAHWFdLOTAxMgdYV0s5MDE1B1hXSzkwMTYHWFdLOTAxNwdYV0s5MDMxB1hXSzkwMzIHWFdLOTAzNQdYV0s5MDM3B1hXSzkwMzkHWFdLOTA3MwdaQkIxMDI0B1pCQjEwNTAHWkJCMTA1MQdaQkIxMDkzB1pCQjExNDMHWkJCMTE2MAdaQkIxMTYyB1pCQjExNjMHWkJCMTE2NAdaQkIxMjAwB1pCQjEyMDEHWkJCMTIxMgdaQkIxMjEzB1pCQjEyNDAHWkJCMTI0MgdaQkIxMzAyB1pCQjEzMDYHWkJCMTMwNwdaQkIxMzA5B1pCQjEzMjAHWkJCMTMyMQdaQkIxMzIyB1pCQjEzMjMHWkJCMTMyNAdaQkIxMzI1B1pCQjEzMjcHWkJCMTMyOAdaQkIxMzQxB1pCQjEzNjIHWkJCMTM3MQdaQkIxNDIxB1pCQjE0MzEHWkJCMTQ1MAdaQkIxNDUxB1pCQjE1MDAHWkJCMTUwMQdaQkIxNTAyB1pCQjE1MDMHWkJCMTUwNQdaQkIxNTA2B1pCQjE1MDcHWkJCMTUwOAdaQkIxNTA5B1pCQjE1NTAHWkJCOTAzMAdaQkcwMDAwB1pCRzEwMTEHWkJHMTA0MAdaQkcxMDQxB1pCRzEwNTEHWkJHMTA1MgdaQkcxMDUzB1pCRzEwNTQHWkJHMTA1NwdaQkcxMDU4B1pCRzEwOTQHWkJHMTEwMQdaQkcxMTExB1pCRzExMTMHWkJHMTEyMAdaQkcxMTIxB1pCRzExMzAHWkJHMTEzMQdaQkcxMTMyB1pCRzExMzMHWkJHMTE0MQdaQkcxMTUyB1pCRzExNjAHWkJHMTE2MwdaQkcxMTY1B1pCRzExNjgHWkJHMTE3MAdaQkcxMTgyB1pCRzExODQHWkJHMTIwMAdaQkcxMjAzB1pCRzEyMTIHWkJHMTIxMwdaQkcxMjIwB1pCRzEyMzEHWkJHMTI0NQdaQkcxMjQ3B1pCRzEyNTAHWkJHMTI2MAdaQkcxMjYxB1pCRzEyODEHWkJHMTI5NQdaQkcxMzAwB1pCRzEzMDEHWkJHMTMwMgdaQkcxMzAzB1pCRzEzMDUHWkJHMTMwNgdaQkcxMzA3B1pCRzEzMDgHWkJHMTMwOQdaQkcxMzIxB1pCRzEzMjIHWkJHMTM0MAdaQkcxMzkxB1pCRzE0MDAHWkJHMTQwMQdaQkcxNDA5B1pCRzE0MTEHWkJHMTQyMAdaQkcxNDIxB1pCRzE0MjIHWkJHMTQyMwdaQkcxNDMxB1pCRzE0NDIHWkJHMTQ0MwdaQkcxNDQ1B1pCRzE0NTQHWkJHMTQ4MgdaQkcxNDkxB1pCRzE0OTIHWkJHMTUwMAdaQkcxNTAyB1pCRzE1MTEHWkJHMTUxMgdaQkcxNTEzB1pCRzE1MjIHWkJHMTU2MAdaQkcxNTYzB1pCRzE2MDQHWkJHMTYwNQdaQkcxNjA4B1pCRzE2MTEHWkJHMTYxOAdaQkcxNjQxB1pCRzE2NTEHWkJHMTY1MgdaQkcxNjUzB1pCRzE2NzAHWkJHMTY3NQdaQkcxNzQyB1pCRzE3NTAHWkJHMTc1MwdaQkcxNzU1B1pCRzE3NjIHWkJHMTc4MQdaQkcxODAyB1pCRzE4MDMHWkJHMTgwNAdaQkcxODA3B1pCRzE4MDkHWkJHMTgxMAdaQkcxODMxB1pCRzE4MzIHWkJHMTgzMwdaQkcxODUwB1pCRzE5MDcHWkJHMTkyMAdaQkcxOTIxB1pCRzE5MzEHWkJHMTkzOQdaQkcyMDEwB1pCRzIwMTMHWkJHMjAyNQdaQkcyMDMzB1pCRzIwMzYHWkJHMjA0MQdaQkcyMDQ1B1pCRzIwNjEHWkJHMjA2MwdaQkcyMDczB1pCRzIwNzQHWkJHMjA3NwdaQkcyMDc5B1pCRzIxMTIHWkJHMjE1MwdaQkcyMjUxB1pCRzIyNzMHWkJHMjI4MAdaQkcyMjkzB1pCRzIzMDYHWkJHMjMwNwdaQkcyMzA4B1pCRzIzNDAHWkJHMjM5MAdaQkcyMzkyB1pCRzI0MTEHWkJHMjQxMgdaQkcyNDE1B1pCRzI0MTgHWkJHMjQ0MAdaQkcyNDQzB1pCRzI0NjAHWkJHMjQ2MQdaQkcyNDYzB1pCRzI0OTAHWkJHMjQ5MQdaQkcyNDkzB1pCRzI0OTQHWkJHMjQ5NQdaQkcyNDk2B1pCRzI1MDEHWkJHMjUwMgdaQkcyNTAzB1pCRzI1MDQHWkJHMjUwNwdaQkcyNTEwB1pCRzI1MjAHWkJHMjUyMgdaQkcyNTIzB1pCRzI1NDgHWkJHMjU1MgdaQkcyNTYxB1pCRzI1OTAHWkJHMjYyMAdaQkcyNjIxB1pCRzI2NDEHWkJHMjY3MgdaQkcyNjgyB1pCRzI3MzEHWkJHMjc2MwdaQkcyODAxB1pCRzI4MzMHWkJHMjg0MwdaQkcyODUxB1pCRzMwMTAHWkJHMzAyMAdaQkczMDIxB1pCRzMwMjIHWkJHMzAyMwdaQkczMDI0B1pCRzMwMjUHWkJHMzAzNwdaQkczMDQzB1pCRzMwNDQHWkJHMzA0NwdaQkczMDUxB1pCRzMwNjIHWkJHMzA2MwdaQkczMDY0B1pCRzMwNjkHWkJHMzA5MAdaQkczMDkxB1pCRzMwOTIHWkJHMzEwNgdaQkczMTA4B1pCRzMxMDkHWkJHMzE0MAdaQkczMTQyB1pCRzMyMDYHWkJHMzIwNwdaQkczMjMxB1pCRzMyNDEHWkJHMzI0NAdaQkczMjUwB1pCRzMyNTEHWkJHMzI2MAdaQkczMzEwB1pCRzM0MDAHWkJHMzQwMgdaQkczNDEwB1pCRzM0NTAHWkJHMzQ1MgdaQkczNTAyB1pCRzM1MDMHWkJHMzUyNgdaQkczNTY4B1pCRzM1NzEHWkJHMzYwMQdaQkczNjAyB1pCRzM2MDMHWkJHMzYwNAdaQkczNjA2B1pCRzM2MDcHWkJHMzYwOAdaQkczNjQxB1pCRzM2NDMHWkJHMzY1NAdaQkczNjU2B1pCRzM2NTgHWkJHMzY2MAdaQkczNjYxB1pCRzM2ODEHWkJHMzY4MgdaQkczNzExB1pCRzM3MTIHWkJHMzc0MAdaQkczOTAxB1pCRzM5NTEHWkJHNDAyMgdaQkc0MTAxB1pCRzQxMDMHWkJHNDIwMgdaQkc0MzAzB1pCRzUwMjIHWkJHOTAxMQdaQkc5MDE1B1pCUjEwMTYHWkJSMTAxOQdaQlIxMTkwB1pCUjEyOTEHWkJSMTMwMQdaQlIxMzExB1pCUjEzNDMHWkJSMTM3MwdaQlIxNDAyB1pCUjE0MTMHWkJSMTQyOQdaQlIxNDMxB1pCUjE0NTYHWkJSMTQ4MAdaQlIxNDkyB1pCUjE1MjAHWkJSMTUzMQdaQlIxNTQyB1pCUjE1NjEHWkJSMTU3MQdaQlIxNTcyB1pCUjE1ODEHWkJSMTU5MQdaQlIxNjAyB1pCUjE3MTAHWkJSMTcxMgdaQlIxNzEzB1pCUjE3MTYHWkJSMTcxOAdaQlIxNzMxB1pCUjE3MzMHWkJSMTc2MgdaQlIxNzgzB1pCUjE4MDAHWkJSMTgwMQdaQlIxODA2B1pCUjE4MzQHWkJSMTgzNgdaQlIxODM3B1pCUjE4NTEHWkJSMTkwMAdaQlIxOTUwB1pCUjE5ODIHWkJSMjA2MQdaQlIyMDc0B1pCUjIxMzMHWkJSMjE0MAdaQlIyMzA1B1pCUjI1MTgHWkJSMjU0MgdaQlIyNTUxB1pCUjI1NjMHWkJSMjU4MAdaQlIyNTgxB1pCUjI2MDAHWkJSMjYwMQdaQlIyNjA3B1pCUjI2NzIHWkJSMjcwMgdaQlIyNzAzB1pCUjI3MDQHWkJSMjcwNQdaQlIyNzIyB1pCUjI3MjcHWkJSMjcyOAdaQlIyNzkzB1pCUjI3OTQHWkJSMjgwNAdaQlIyODA3B1pCUjI4MDgHWkJSMjgwOQdaQlIyODUwB1pCUjI4NTIHWkJSMjkxMwdaQlIyOTIxB1pCUjI5MjMHWkJSMjkyNQdaQlIyOTI2B1pCUjI5MzAHWkJSMjkzMQdaQlIyOTQwB1pCUjI5NDEHWkJSMjk1MAdaQlIyOTUyB1pCUjMwMTEHWkJSMzAxMgdaQlIzMDEzB1pCUjMyMTMHWkJSMzI0MQdaQlIzMjUxB1pCUjMyNjEHWkJSMzI3MQdaQlIzMjcyB1pCUjMzMDMHWkJSMzMwNAdaQlIzMzA1B1pCUjMzMDkHWkJSMzMxMQdaQlIzMzIyB1pCUjMzMjMHWkJSMzMyNAdaQlIzMzI1B1pCUjMzMjcHWkJSMzM5MgdaQlIzMzk0B1pCUjMzOTUHWkJSMzQzMgdaQlIzNDQzB1pCUjM0NTcHWkJSMzQ2MQdaQlIzNDcxB1pCUjM0NzYHWkJSMzQ5MQdaQlIzNTAwB1pCUjM1MTAHWkJSMzU0MAdaQlIzNTUwB1pCUjM1NTIHWkJSMzU3MAdaQlIzNjEwB1pCUjM2MTQHWkJSMzY0MQdaQlIzNjQ5B1pCUjM3MDMHWkJSMzcyMAdaQlIzNzMwB1pCUjM4NTAHWkJSMzkwMAdaQlI0MTczB1pCUjQyMjQHWkJSNDIzMAdaQlI0MjUxB1pCUjQzMjAHWkJSNDMyMQdaQlI0MzUyB1pCUjQzNjAHWkJSNDQyNQdaQlI0NDI3B1pCUjUwMTAHWkJSNTAxMQdaQlI5MDMzB1pCUjkwMzkHWkJSOTA0MgdaUlEwMDI2B1pSUTEwMTIHWlJRMTA3NAdaUlExMDgwB1pSUTEwODcHWlJRMTEwMQdaUlExMTA0B1pSUTExMTEHWlJRMTEyMQdaUlExMTMyB1pSUTExMzQHWlJRMTE0MAdaUlExMTUzB1pSUTExNTQHWlJRMTE1NgdaUlExMTczB1pSUTExODAHWlJRMTE4MQdaUlExMTgyB1pSUTExODUHWlJRMTIxNAdaUlExMjIyB1pSUTEzMTAHWlJRMTMxMQdaUlExMzE3B1pSUTEzMjEHWlJRMTM2MAdaUlExMzYyB1pSUTEzNjMHWlJRMTM2NQdaUlExNDEwB1pSUTE0MTEHWlJRMTQxMwdaUlExNDIyB1pSUTE1MDEHWlJRMTUwMgdaUlExNTMyB1pSUTE1NTIHWlJRMTU2MQdaUlExNTcwB1pSUTE2MDIHWlJRMTYxNwdaUlExNjIwB1pSUTE2MzEHWlJRMTYzMgdaUlExNjM1B1pSUTE2MzYHWlJRMTYzNwdaUlExNjUxB1pSUTE2NTMHWlJRMTY3MgdaUlExNzEyB1pSUTE3MTUHWlJRMTcyMgdaUlExNzMwB1pSUTE3MzEHWlJRMTc0MwdaUlExNzYwB1pSUTE3NjEHWlJRMTgxMAdaUlExODUwB1pSUTE4NTEHWlJRMTkxMAdaUlExOTE2B1pSUTE5MTgHWlJRMTkxOQdaUlEyMDEwB1pSUTIwMTIHWlJRMjAxMwdaUlEyMDE0B1pSUTIwMTUHWlJRMjAxNgdaUlEyMDE4B1pSUTIwMTkHWlJRMjAyMgdaUlEyMDI0B1pSUTIwMjUHWlJRMjA1MQdaUlEyMDc1B1pSUTIwNzYHWlJRMjEwNgdaUlEyMTIxB1pSUTIxNjAHWlJRMjIwMgdaUlEyMjAzB1pSUTIyMDQHWlJRMjIwNgdaUlEyMjA3B1pSUTIyMjIHWlJRMjI0MQdaUlEyMjYwB1pSUTIyNjMHWlJRMjI2NQdaUlEyMjY4B1pSUTIzMDQHWlJRMjMwOQdaUlEyMzEwB1pSUTIzMjMHWlJRMjMzMgdaUlEyMzMzB1pSUTIzMzcHWlJRMjMzOAdaUlEyMzM5B1pSUTIzNTAHWlJRMjM1MQdaUlEyMzUyB1pSUTIzNjAHWlJRMjM2NwdaUlEyMzY4B1pSUTIzNjkHWlJRMjM3NAdaUlEyMzc1B1pSUTI0MDQHWlJRMjQwNQdaUlEyNDA2B1pSUTI0MjEHWlJRMjQyNAdaUlEyNDQxB1pSUTI1MDIHWlJRMjUwMwdaUlEyNTA1B1pSUTI1MjIHWlJRMjUzMQdaUlEyNTQwB1pSUTI1NTAHWlJRMjU1MQdaUlEyNTcwB1pSUTI1NzEHWlJRMjU3NQdaUlEyNjAwB1pSUTI2MDQHWlJRMjYwNQdaUlEyNjA5B1pSUTI2NjEHWlJRMjY4MAdaUlEyNzMwB1pSUTI3NjQHWlJRMjc3MQdaUlEyNzkxB1pSUTI4MDAHWlJRMjgwMQdaUlEyODA2B1pSUTI4MzEHWlJRMjg0MQdaUlEyODUzB1pSUTI4NTUHWlJRMjg2MQdaUlEyODcwB1pSUTI4ODEHWlJRMjg4NAdaUlEyODg1B1pSUTI5MDIHWlJRMjkyMgdaUlEyOTYyB1pSUTI5NjUHWlJRMzAxMAdaUlEzMDcwB1pSUTMwNzMHWlJRMzEwMAdaUlEzMTAxB1pSUTMxMjMHWlJRMzEzNAdaUlEzMTYxB1pSUTMxNzIHWlJRMzE3NQdaUlEzMTc5B1pSUTMzMDEHWlJRMzMyMAdaUlEzMzIxB1pSUTMzNDAHWlJRMzM1MAdaUlEzNDAxB1pSUTM0MDYHWlJRMzQwNwdaUlEzNDMxB1pSUTM0MzMHWlJRMzQ0MgdaUlEzNDQzB1pSUTM0NDUHWlJRMzQ2NQdaUlEzNTQwB1pSUTM1NDEHWlJRMzU0MwdaUlEzNTYxB1pSUTM1NzEHWlJRMzYwMAdaUlEzNjAyB1pSUTM2MTEHWlJRNDAxMwdaUlE0MDE1B1pSUTQwMTcHWlJRNDAxOQdaUlE0MDIwB1pSUTQwMzEHWlJRNDA3NAdaUlE0MDc2B1pSUTQwOTQHWlJRNDA5NwdaUlE0MTAxB1pSUTQxMjAHWlJRNDEyMgdaUlE0MTQzB1pSUTQxNDUHWlJRNDE2MgdaUlE5MDEwB1pSUTkwMTEHWlJROTAzMQdaVE4xMDEyB1pUTjEwMTgHWlROMTAzMAdaVE4xMDM1B1pUTjEwMzgHWlROMTAzOQdaVE4xMDUxB1pUTjEwODMHWlROMTEwMQdaVE4xMTAyB1pUTjExMTIHWlROMTEyNAdaVE4xMTMzB1pUTjExNDYHWlROMTE1MAdaVE4xMTY0B1pUTjExNjcHWlROMTIwNAdaVE4xMjM0B1pUTjEzMzUHWlROMTM2MAdaVE4xMzYxB1pUTjEzNjUHWlROMTM2OQdaVE4xNDEwB1pUTjE0MTIHWlROMTQxNAdaVE4xNDIwB1pUTjE0NDMHWlROMTQ4MQdaVE4xNDg3B1pUTjE0OTIHWlROMTUwNwdaVE4xNTA5B1pUTjE1MTkHWlROMTU1MAdaVE4xNTg1B1pUTjE1OTAHWlROMTU5MQdaVE4xNTk3B1pUTjE2MDIHWlROMTY0MAdaVE4xNjUxB1pUTjE2NTMHWlROMTY5MQdaVE4xNzUwB1pUTjE3OTAHWlROMTgxMgdaVE4xODE2B1pUTjE4MjIHWlROMTg1MwdaVE4xODU0B1pUTjE5MDUHWlROMTkwNgdaVE4xOTA3B1pUTjIwNTQHWlROMjA3MAdaVE4yMDc2B1pUTjIwODEHWlROMjE0MAdaVE4yMTQxB1pUTjIyMDMHWlROMjIwNQdaVE4yMjA3B1pUTjIyMDkHWlROMjIyMAdaVE4yMjI0B1pUTjIyNzIHWlROMjI4MAdaVE4yMzAyB1pUTjIzNjUHWlROMjM4MAdaVE4yMzgxB1pUTjIzODIHWlROMjM4MwdaVE4yNDA2B1pUTjI0MDcHWlROMjQwOAdaVE4yNDA5B1pUTjI0MTEHWlROMjQ1MAdaVE4yNDUxB1pUTjI0NjIHWlROMjQ3MgdaVE4yNDc1B1pUTjI1MDMHWlROMjUwNAdaVE4yNTEwB1pUTjI1NDIHWlROMjU0NwdaVE4yNTczB1pUTjI2MDgHWlROMjYwOQdaVE4yNjQwB1pUTjI2NDIHWlROMjY3NQdaVE4yNzAwB1pUTjI3MTQHWlROMjcxNwdaVE4yNzE4B1pUTjI3NDUHWlROMjc3MwdaVE4yNzg2B1pUTjI4MTMHWlROMjgzMAdaVE4yODMyB1pUTjI4MzgHWlROMjg4MQdaVE4yODgyB1pUTjI4ODMHWlROMjkwMQdaVE4yOTA2B1pUTjI5MDcHWlROMjkxMwdaVE4yOTYwB1pUTjMyMDEHWlROMzIxMgdaVE4zMjE1B1pUTjMyMTcHWlROMzIyNAdaVE4zMjUxB1pUTjMyNzEHWlROMzI3MwdaVE4zMzA1B1pUTjMzMTAHWlROMzMxMQdaVE4zMzI0B1pUTjMzMzEHWlROMzMzMgdaVE4zMzQwB1pUTjMzNTEHWlROMzM1MwdaVE4zMzYwB1pUTjMzNjIHWlROMzM4MAdaVE4zMzg0B1pUTjM0MDAHWlROMzQwNgdaVE4zNDMwB1pUTjM0MzIHWlROMzQzNQdaVE4zNDM2B1pUTjM0NDMHWlROMzQ1MAdaVE4zNDYwB1pUTjM1MDMHWlROMzUwNAdaVE4zNTA1B1pUTjM1MDcHWlROMzUwOAdaVE4zNTA5B1pUTjM1NzIHWlROMzU5MAdaVE4zNjAyB1pUTjM2MjYHWlROMzcwOAdaVE4zNzMxB1pUTjM3NTAHWlROMzc1MgdaVE4zNzgzB1pUTjM4MDEHWlROMzgwMwdaVE40MDEwB1pUTjQwMjIHWlRONDAyMwdaVE40MDI0B1pUTjQwMjYHWlRONDAyOQdaVE40MDUwB1pUTjQwODIHWlRONDEwMQdaVE40MTIxB1pUTjQxNjYHWlRONDI5MAdaVE40MjkxB1pUTjQyOTMHWlRONDI5NwdaVE40MzAxB1pUTjQzMDQHWlRONDM0MAdaVE40MzQxB1pUTjQzNDUHWlRONDM1MQdaVE40MzYxB1pUTjQzNzAHWlRONDQwMAdaVE40NDAxB1pUTjQ0MDIHWlRONDQwNQdaVE40NDA3B1pUTjQ0MzAHWlRONDQ1MQdaVE40NDUyB1pUTjQ0NjIHWlRONDQ2MwdaVE40NDY0B1pUTjQ0NjcHWlRONDUxMQdaVE40NzAyB1pUTjQ3MDQHWlRONDkwMwdaVE40OTIyB1pUTjkwMjMHWlROOTAyNRWdJAABLwU0NjEwMAQ1MDQ0B0FURDExMTMHQVREMTE3MAdBVEQxMjM0B0FURDE0MDYHQVREMTQxMQdBVEQxNDI4B0FURDE0MzEHQVREMTQzOAdBVEQxNTAyB0FURDE1MDMHQVREMTUwNAdBVEQxNTIxB0FURDE1MzEHQVREMTYyNAdBVEQxNjMxB0FURDE3NDEHQVREMTc2MwdBVEQxODIxB0FURDE4NzAHQVREMTkwNwdBVEQxOTIwB0FURDE5NjAHQVREMTk3MAdBVEQyMDI0B0FURDIwMjcHQVREMjAyOQdBVEQyMDY5B0FURDIwODMHQVREMjIxNAdBVEQyMjczB0FURDIzMzYHQVREMjMzOAdBVEQyMzQzB0FURDIzNjQHQVREMjM3MQdBVEQyMzgwB0FURDI0NTAHQVREMjQ1MwdBVEQyNTExB0FURDI1MzAHQVREMjYwNQdBVEQyNjEwB0FURDI3MDYHQVREMjcwNwdBVEQyNzMyB0FURDI3MzMHQVREMjc1MgdBVEQyNzYwB0FURDI3NzIHQVREMjc3NwdBVEQyNzgwB0FURDI3ODEHQVREMjg0MwdBVEQyODUwB0FURDI5MDEHQVREMjk2MAdBVEQzMDE3B0FURDMwMzIHQVREMzA1MAdBVEQzMDYwB0FURDMwODAHQVREMzExMQdBVEQzMTE3B0FURDQwMDAHQVRENDA5NQdBVEQ0ODkwB0FURDkwMzYHQVREOTAzNwdBVEQ5MDQxB0FURDkwNDIHQVREOTA1NgdBVFQyNTExB0JCRzEwMTQHQkJHMTA1MAdCQkcxMDYwB0JCRzExMDQHQkJHMTIzMAdCQkcxMjQzB0JCRzEyNDUHQkJHMTI1MwdCQkcxMjcwB0JCRzEyNzMHQkJHMTMzNAdCQkcxMzM1B0JCRzE0NzIHQkJHMTYzMwdCQkcxNjY1B0JCRzE2ODQHQkJHMTY4NgdCQkcxNjg3B0JCRzE2OTEHQkJHMTcwMQdCQkcxNzEzB0JCRzE3NTIHQkJHMTc1OAdCQkcxNzcyB0JCRzE4MDEHQkJHMTgwMwdCQkcxODM1B0JCRzE4NDUHQkJHMTg0NgdCQkcxODUyB0JCRzE4NjAHQkJHMTkwMgdCQkcxOTA2B0JCRzE5MDkHQkJHMTkxNAdCQkcxOTIxB0JCRzE5MjIHQkJHMTkyOAdCQkcxOTMzB0JCRzE5NDMHQkJHMTk1MgdCQkcxOTUzB0JCRzE5NjAHQkJHMjAxMAdCQkcyMDIxB0JCRzIwMjYHQkJHMjAyOAdCQkcyMDI5B0JCRzIwNjEHQkJHMjEwMgdCQkcyMTA0B0JCRzIxMDkHQkJHMjExMAdCQkcyMTIyB0JCRzIxNDAHQkJHMjE3MAdCQkcyMTczB0JCRzIyNDAHQkJHMjI1MQdCQkcyMjUyB0JCRzIyNTMHQkJHMjI2MAdCQkcyMjYxB0JCRzIyNzEHQkJHMjI4MwdCQkcyMjkyB0JCRzIyOTUHQkJHMjMwMQdCQkcyMzA0B0JCRzIzNDAHQkJHMjM0NAdCQkcyMzQ2B0JCRzIzNDcHQkJHMjQwMAdCQkcyNDEwB0JCRzI0MTQHQkJHMjQyNAdCQkcyNDMwB0JCRzI0NTEHQkJHMjUwNAdCQkcyNTA1B0JCRzI1NDEHQkJHMjU1MQdCQkcyNTYxB0JCRzI1NzYHQkJHMjYwMAdCQkcyNjAzB0JCRzI2MDgHQkJHMjYzMwdCQkcyNjQwB0JCRzI2NDcHQkJHMjY1MQdCQkcyNzIxB0JCRzI3NDAHQkJHMjc3MQdCQkcyNzczB0JCRzI3NzUHQkJHMjc3NgdCQkcyNzgwB0JCRzI3ODIHQkJHMzA0NAdCQkczMDcxB0JCRzMwNzMHQkJHMzA3NQdCQkczMTIxB0JCRzMxNDEHQkJHMzIxMQdCQkc5MDE0B0JCRzkwMzQHQktSMTAzMgdCS1IxMTExB0JLUjExMzUHQktSMTE1MgdCS1IxMTU0B0JLUjExNTcHQktSMTIxNAdCS1IxMjE3B0JLUjEyMTgHQktSMTI2MAdCS1IxMjcwB0JLUjEyNzcHQktSMTU2MAdCS1IxNzUzB0JLUjE3NzAHQktSMTc4MAdCS1IxODAyB0JLUjE4MDcHQktSMTg1MQdCS1IxODcxB0JLUjE4NzMHQktSMTk1MAdCS1IxOTczB0JLUjIwMTIHQktSMjA4MAdCS1IyMTAzB0JLUjIxNTQHQktSMjI4NgdCS1IyMzI2B0JLUjI0MzEHQktSMjQ3MAdCS1IyNDczB0JLUjI1MjUHQktSMjU1MgdCS1IyNjkxB0JLUjI2OTQHQktSMjY5OAdCS1IyODA4B0JLUjI4NTMHQktSMjg5MAdCS1IyOTAxB0JLUjQwMTMHQktSNDAyMwdCS1I0MDQwB0JLUjQwNjIHQktSNDExMAdCS1I0MjE0B0JLUjQzNjMHQktSNDQ0MwdCS1I0NTE4B0JLUjQ1MjIHQktSNDUyMwdCS1I0NTMzB0JLUjQ1MzQHQktSNDUzNgdCS1I0NjAxB0JLUjQ4NTAHQktSOTAxMAdCS1I5MDEzB0JLUjkwMzgHQktSOTA2NQdCS1I5MDcyB0JLUjkwNzcHQk1MMTkxOAdCTUwyMjMyB0JNTDkwODAHQlJHOTAyMQdCUksxOTEwB0JaTjEwNDAHQlpOMTEyMAdCWk4xMTUzB0JaTjExNjIHQlpOMTMwMgdCWk4xNDIxB0JaTjE0MjcHQlpOMTUwNQdCWk4xNTEwB0JaTjE1MTEHQlpOMTUyMwdCWk4xNTM1B0RHTDAzMjQHREdMMDQzOAdER0wxMDExB0RHTDEwNDEHREdMMTA2MAdER0wxMDYxB0RHTDEwNzIHREdMMTEwMAdER0wxMTEwB0RHTDExMTEHREdMMTExMgdER0wxMTEzB0RHTDExMTYHREdMMTExOAdER0wxMTE5B0RHTDExMzAHREdMMTEzNgdER0wxMTUzB0RHTDExNzUHREdMMTIyMgdER0wxMjMxB0RHTDEyMzMHREdMMTIzNAdER0wxMjgwB0RHTDEyODEHREdMMTMwMQdER0wxMzAzB0RHTDEzMDcHREdMMTMxMwdER0wxMzMwB0RHTDEzNDIHREdMMTM0NAdER0wxMzU0B0RHTDEzNjIHREdMMTM2NQdER0wxMzgwB0RHTDEzODQHREdMMTM4OAdER0wxMzkxB0RHTDE1MDAHREdMMTUxMgdER0wxNTI0B0RHTDE1MzMHREdMMTU1NAdER0wxNTc2B0RHTDE1NzcHREdMMTU5MAdER0wxNTkyB0RHTDE1OTQHREdMMTU5NQdER0wxNzE3B0RHTDE3MTkHREdMMTczMQdER0wxNzMyB0RHTDE3MzQHREdMMTc0MQdER0wxNzQzB0RHTDE3NTAHREdMMTc1MQdER0wxNzU1B0RHTDE3NTYHREdMMTc1NwdER0wxODAyB0RHTDE4MjAHREdMMTgzMQdER0wxODM0B0RHTDE4MzUHREdMMTgzNgdER0wxODUwB0RHTDE4NzEHREdMMTg4MAdER0wxODgxB0RHTDE4OTAHREdMMTg5NAdER0wxOTAwB0RHTDE5MDMHREdMMTkwNQdER0wxOTIxB0RHTDE5NDAHREdMMjAyNQdER0wyMDMwB0RHTDIxMDEHREdMMjEwMgdER0wyMTA0B0RHTDIxMTAHREdMMjExMQdER0wyMTMwB0RHTDIxNDEHREdMMjE2MAdER0wyMTcxB0RHTDI0MTEHREdMMjcwMQdER0wyNzA5B0RHTDM1MDAHREdMMzUwMQdER0wzNTAyB0RHTDM1MDcHREdMMzUwOAdER0wzNTA5B0RHTDkwMTUHREdMOTAxNwdER0w5MDE4B0RORzEzMDUHRkdSMTAyOQdGR1IxMDM0B0ZHUjEwMzYHRkdSMTA0MgdGR1IxMDcxB0ZHUjExMzcHRkdSMTI0MwdGR1IxMjQ4B0ZHUjEyNjEHRkdSMTI3MQdGR1IxNDEwB0ZHUjE0MjEHRkdSMTQzMQdGR1IxNDQwB0ZHUjE0NDQHRkdSMTQ2MAdGR1IxNDYzB0ZHUjE0NzAHRkdSMTQ3MgdGR1IxNDgwB0ZHUjE2MTQHRkdSMTYxOAdGR1IxNjE5B0ZHUjE2NjEHRkdSMTY5MgdGR1IxNzAyB0ZHUjE4MzYHRkdSMTg1MQdGR1IxODUzB0ZHUjE4NTQHRkdSMTkzMAdGR1IxOTMzB0ZHUjE5NDUHRkdSMTk1MQdGR1IxOTcyB0ZHUjIwMTEHRkdSMjAxMgdGR1IyMDE4B0ZHUjIwMjEHRkdSMjA0MAdGR1IyMDUxB0ZHUjIwNjEHRkdSMjEwMwdGR1IyMTA1B0ZHUjIxMDgHRkdSMjE1NQdGR1IyMTcyB0ZHUjkwMzIHRkdSOTAzOAdGTlQxMDEzB0ZOVDEwMzAHRk5UMTAzMQdGTlQxMDQxB0ZOVDExMDAHRk5UMTExMQdGTlQxMTEyB0ZOVDExMTMHRk5UMTEyMQdGTlQxNDAxB0ZOVDE0MTEHRk5UMTQyMgdGTlQ5MDEzB0ZOVDkwMjMHRk5UOTAyNwdGTlQ5MDI4B0ZSTjEwNDAHRlJOMTcwMAdHREowMzE1B0dESjEwMTEHR0RKMTAxNAdHREoxMDIxB0dESjEwNDEHR0RKMTA0MgdHREoxMDYxB0dESjEwNjQHR0RKMTA2NQdHREoxMTAxB0dESjExMTEHR0RKMTExMgdHREoxMTUwB0dESjExNTIHR0RKMTE1MwdHREoxMTU0B0dESjEyMDYHR0RKMTIwOQdHREoxMjQwB0dESjEyNTEHR0RKMTI2MQdHREoxMjgwB0dESjEyODEHR0RKMTMwMAdHREoxMzA0B0dESjEzMTQHR0RKMTMyMQdHREoxMzMwB0dESjEzNDEHR0RKMTM1MQdHREoxNDExB0dESjE0MTIHR0RKMTQyMAdHREoxNDQ1B0dESjE0NTAHR0RKMTQ1MQdHREoxNDUyB0dESjE0NjEHR0RKMTY1MQdHREoxNjYwB0dESjE3MDAHR0RKMTcwMgdHREoxNzAzB0dESjE3MDUHR0RKMTcwNgdHREoxNzA4B0dESjE3MTEHR0RKMTcxMwdHREoxNzYxB0dESjE4MDEHR0RKMTgwMgdHREoxODExB0dESjE4MTIHR0RKMTgxMwdHREoxODUwB0dESjE4NTIHR0RKMTkxMAdHREoxOTIwB0dESjE5MjEHR0RKMTkzMAdHREoxOTQwB0dESjE5NDEHR0RKMjAxNwdHREoyMDIwB0dESjIwMjEHR0hSMTAxMgdHSFIxMDE0B0dIUjEwMjQHR0hSMTA1MwdHSFIxMTAzB0dIUjExMjEHR0hSMTE2MgdHSFIxMjEwB0dIUjEyMjEHR0hSMTIzMwdHSFIxMjY0B0dIUjEyNjcHR0hSMTMwMAdHSFIxMzAxB0dIUjEzMDIHR0hSMTMwNQdHSFIxMzUzB0dIUjE0MDAHR0hSMTQwNQdHSFIxNDYwB0dIUjE1MDEHR0hSMTUxMgdHSFIxNTE0B0dIUjE1MTUHR0hSMTUyMAdHSFIxNTIxB0dIUjE1MzEHR0hSMTUzNQdHSFIxNjA2B0dIUjE2MjIHR0hSMTYzMQdHSFIxNjYyB0dIUjE2NjQHR0hSMTcwMQdHSFIxODA0B0dIUjE4MDcHR0hSMTgxMAdHSFIyMDcwB0dIUjIxMDAHR1JCMTAxMAdHUkIxMDE0B0dSQjEwMTUHR1JCMTAyMwdHUkIxMDQwB0dSQjEwNDMHR1JCMTA0NAdHUkIxMDQ2B0dSQjEwNTAHR1JCMTA1MwdHUkIxMDU1B0dSQjEwNjUHR1JCMTA3MAdHUkIxMDcxB0dSQjEwNzIHR1JCMTA4MAdHUkIxMDgxB0dSQjEwODIHR1JCMTA4MwdHUkIxMTAxB0dSQjExMDIHR1JCMTEwMwdHUkIxMTIwB0dSQjExNDEHR1JCMTE2MQdHUkIxMjAwB0dSQjEyMDIHR1JCMTIxMAdHUkIxMjMxB0dSQjEyNjAHR1JCMTI3MAdHUkIxMzAwB0dSQjEzMjQHR1JCMTM0MAdHUkIxNDA0B0dSQjE0MDUHR1JCMTQzNgdHUkIxNDM3B0dSQjE1MDUHR1JCMTUyMQdHUkIxNTQxB0dSQjI0MzQHR1NNMTAyMAdHU00xMDQwB0dTTTEwNDEHR1NNMTEzMAdHU00xMTMxB0dTTTExODAHR1NNMTE4MwdHU00xMjAwB0dTTTEyMDEHR1NNMTIzMQdHU00xMjMzB0dTTTEyNDAHR1NNMTI0MQdHU00xMjQyB0dTTTEyNDMHR1NNMTI4MgdHU00xMzIzB0dTTTEzMjgHR1NNMTQxMQdHU00xNDEzB0dTTTE0NTEHR1NNMTUzMgdHU00xNTMzB0dTTTE1NTAHR1NNMTU1MgdHU00xNTcxB0dTTTE2MDAHR1NNMTYyMQdHU00xNjIyB0dTTTE2MjMHR1NNMTYzMQdHU00xNjQxB0dTTTE2NDMHR1NNMTgwMAdHU00xODAxB0dTTTE4MDMHR1NNMTgwNAdHU00xODA1B0dTTTE4MDcHR1NNMTkxMwdHU00xOTUxB0dTTTE5ODAHR1NNMTk5MAdHU00yMDExB0dTTTIwMTIHR1NNMjAxNAdHU00yMDE2B0dTTTIwMTgHR1NNMjAyMQdHU00yMDUwB0dTTTkwMTAHR1NNOTAxMgdHU005MDEzB0dTTTkwMTQHR1NNOTAxNQdHU005MDE5B0dTTTkwMjIHR1NNOTAyNwdHU005MDMzB0dTUjEwMjAHR1NSMTAyMQdHU1IxMDIzB0dTUjEwNDAHR1NSMTA2MAdHU1IxMTAwB0dTUjExMDEHR1NSMTEwMgdHU1IxMTAzB0dTUjExMDQHR1NSMTE1MAdHU1IxMTU0B0dTUjEyMDAHR1NSMTIwMQdHU1IxMjAzB0dTUjEyMDYHR1NSMTIwNwdHU1IxMzAwB0dTUjEzMDEHR1NSMTMwMgdHU1IxMzEyB0dTUjEzMTMHR1NSMTMyMQdHU1IxMzQwB0dTUjEzNTAHR1hRMTAxNwdHWFExMDQwB0dYUTEwNjMHR1hRMTA3MwdHWFExMDc1B0dYUTExMTEHR1hRMTE0MAdHWFExMTQyB0dYUTExNzAHR1hRMTE4NgdHWFExMjAzB0dYUTEyMDQHR1hRMTIwNQdHWFExMjEwB0dYUTEyMzMHR1hRMTI1MAdHWFExMjUyB0dYUTEzMDAHR1hRMTMwMQdHWFExMzEzB0dYUTEzMTQHR1hRMTQwMgdHWFExNTU0B0dYUTE2MTMHR1hRMTYzMgdHWFExNzAwB0dYUTE3MDEHR1hRMTcxNAdHWFExNzE2B0dYUTE3MTcHR1hRMTcxOAdHWFExODAwB0dYUTE4MDEHR1hRMTgwMgdHWFExODIyB0dYUTE4NDEHR1hRMTkwMQdHWFExOTcwB0dYUTE5NzMHR1hRMjAyMwdHWFEyMDMyB0dYUTIwMzMHR1hRMjA1MAdHWFEyMDUyB0dYUTIxMDAHR1hRMjEwMQdHWFEyMTYwB0dYUTIxNzAHR1hRMjE3MQdHWFEyMTczB0dYUTIxNzQHR1hRMjE3NwdHWFEyMTgxB0dYUTIxODQHR1hRMjIwMAdHWFEyMjAyB0dYUTIyMTEHR1hRMjIyMQdHWFEyMjIyB0dYUTIyNDYHR1hRMjI1MwdHWFEyMzAxB0dYUTIzMjEHR1hRMjMzMAdHWFEyMzcxB0dYUTI5MDEHR1hRMjkwMgdHWFE5MDEwB0dYUTkwMTIHR1hROTAxMwdHWFE5MDE0B0dYUTkwMTgHR1hROTA0NAdHWlIxMDI2B0daUjExMzkHR1pSMTE1NAdHWlIxMTYzB0daUjEyMTAHR1pSMTMzNgdHWlIxNTAwB0daUjE1MDYHSE1SMTAxNAdITVIxMTAwB0hNUjEyMDEHSE1SMTIwMwdITVIxMzIyB0hNUjE0NTEHSE1SMTUzMAdITVIxNjEzB0hNUjE2MjEHSE1SMTg1NAdITVIxOTUyB0hNUjIwMTUHSE1SMjAzMAdITVIyMjc0B0haQjIwMTMHSUtMMTAyMQdJS0wxMDIzB0lLTDEwNDEHSUtMMTIwMAdJS0wxMzEwB0lLTDE0MTEHSUtMMTQzMQdJS0wxNDUwB0lLTDE4MTMHSUtMMTkwMAdJS0w5MDE1B0lLTDkwMzIHSVNMMTQ1MwdLQ00xMDEwB0tDTTEwMTMHS0NNMTA1MwdLQ00xMDcwB0tDTTEwODEHS0NNMTEwMAdLQ00xMTEwB0tDTTExMTEHS0NNMTExMgdLQ00xMTEzB0tDTTExMTQHS0NNMTExNQdLQ00xMTIwB0tDTTExMjEHS0NNMTEyMwdLQ00xMTMwB0tDTTExMzEHS0NNMTE0MQdLQ00xMTU0B0tDTTExNTYHS0NNMTE2MAdLQ00xMTYyB0tDTTExNjMHS0NNMTE4MAdLQ00xMTgxB0tDTTExOTIHS0NNMTIwMgdLQ00xMjMxB0tDTTEyMzMHS0NNMTI0MAdLQ00xMjYwB0tDTTEyNjIHS0NNMTI2NAdLQ00xMjY1B0tDTTEzMDAHS0NNMTMwMgdLQ00xMzExB0tDTTEzMTMHS0NNMTMyMQdLQ00xMzIzB0tDTTEzNDMHS0NNMTM1MAdLQ00xMzUyB0tDTTEzNjAHS0NNMTQwMQdLQ00xNDEwB0tDTTE0MTEHS0NNMTQxMgdLQ00xNDIxB0tDTTE0MjMHS0NNMTQyNQdLQ00xNDMwB0tDTTE3MDAHS0NNMTcwMQdLQ00xNzAyB0tDTTE3MjEHS0NNMzAxMQdLQ00zMDEyB0tDTTMwMTMHS0NNMzAxNAdLQ00zMDE2B0tDTTMwMTcHS0NNMzAyMAdLQ00zMDIxB0tDTTMwNDAHS0NNMzA0MQdLQ00zMDQyB0tDTTMwNjAHS0NNMzA2MgdLQ00zMTAwB0tDTTMxMDEHS0NNMzExMAdLQ00zMTIxB0tDTTMxNTEHS0NNMzIwMgdLQ00zMzAzB0tDTTkwMTAHS0tQMTAxMAdLS1AxMDMxB0tLUDEwNjAHS0tQMTA4MQdLS1AxMTAwB0tLUDExMDEHS0tQMTExMAdLS1AxMTExB0tLUDExMzIHS0tQMTIxMAdLS1AxMjE2B0tLUDEyMjAHS0tQMTIyMQdLS1AxMjQyB0tLUDEyNDcHS0tQMTI0OAdLS1AxMjQ5B0tLUDEyNTAHS0tQMTI2MQdLS1AxMjcwB0tLUDEzNjEHS0tQMTM3MAdLS1AxNTA3B0tLUDE1MDgHS0tQMTUwOQdLS1AxNTExB0tLUDE1MjEHS0tQMTUyOAdLS1AxNTI5B0tLUDE1MzAHS0tQMTUzMgdLS1AxNTQxB0tLUDE3MjUHS0tQMTcyNwdLS1AxNzQwB0tLUDE3NDIHS0tQMTc3MQdLS1AxODEwB0tLUDE4MTEHS0tQMTgxMgdLS1AxODEzB0tLUDE4MTUHS0tQMTkwMQdLS1IxMDM0B0tLUjEwNzIHS0tSMTEwNwdLS1IxMTIwB0tLUjExNTMHS0tSMTE4NgdLS1IxNjEyB0tLUjE2MTkHS0tSMTc2MwdLS1IxODEwB0tLUjkwMzMHS0tSOTA2MgdLUlAxMjEwB0xKQTEwMjEHTEpBMTExMwdMSkExMTQ0B0xKQTExNzYHTEpBMTE5MwdMSkExMjA1B0xKQTEyNjEHTEpBMTI3MAdMSkExMjcxB0xKQTEyNzQHTEpBMTQzMQdMSkExNDQxB0xKQTE0NjAHTEpBMTUwNAdMSkExNjEyB0xKQTE2MTMHTEpBMTcwMAdMSkExNzIyB0xKQTE3MzAHTEpBMTc1MQdMSkExODA2B0xKQTE5MTEHTEpBMTkxNQdMSkExOTE2B0xKQTE5MzEHTFFBMTAxMQdMUUExMDIzB0xRQTEwMjQHTFFBMTAyNQdMUUExMDMwB0xRQTEwOTEHTFFBMTEwMgdMUUExMTEwB0xRQTExMjAHTFFBMTEyMQdMUUExMTMxB0xRQTExNTEHTFFBMTE1NwdMUUExMjAwB0xRQTEyMjAHTFFBMTIyMQdMUUExMjUzB0xRQTEzMTMHTFFBMTMxNAdMUUExMzE1B0xRQTEzMTcHTFFBMTMxOQdMUUExMzMwB0xRQTEzNjAHTFFBMTM3MQdMUUExMzcyB0xRQTEzNzMHTFFBMTM4NAdMUUExMzg1B0xRQTE0MTAHTFFBMTQzMAdMUUExNDYwB0xRQTE0NjMHTFFBMTQ5MAdMUUExNDkyB0xRQTE1MDAHTFFBMTUxMAdMUUExNTEzB0xRQTE1MTYHTFFBMTUzMgdMUUExNTM0B0xRQTE1NDAHTFFBMTU1MwdMUUExNTYxB0xRQTE1ODMHTFFBMTYwMwdMUUExNjEwB0xRQTE2MTIHTFFBMTYzMAdMUUExNjMyB0xRQTE2MzUHTFFBMTY2MQdMUUExNjczB0xRQTE2NzQHTFFBMTcxMAdMUUExNzIyB0xRQTE3MjMHTFFBMTcyNQdMUUExNzYwB0xRQTE3NjEHTFFBMTgwMwdMUUExODA0B0xRQTE4MTEHTFFBMTgxMwdMUUExODE0B0xRQTE4NzAHTFFBMTg3MwdMUUExODgwB0xRQTE4OTMHTFFBMjAyMQdMUUEyMDIyB0xRQTIwMjQHTFFBMzAxMAdMUUEzMDQyB0xRQTMwNzgHTFFBMzExMQdMUUEzMTYwB0xRQTMxNjQHTFFBNzYwMAdMUUE5MDIxB0xRQTkwMzMHTFFBOTA0MAdMUUE5MDQzB01ETjEwNTAHTUROMTA4MAdNRE4xMTgxB01ETjY5NzAHTUROOTAyMAdNRk4xMTI0B01GTjExMjcHTUZOMTMxMgdNRk4xNDEwB01GTjE0NDMHTUZOMTQ1MQdNRk4xNDUzB01GTjE1MTQHTUZOOTAxNAdNR1IxMDEwB01HUjEwMjAHTUdSMTAzMAdNR1IxMDMzB01HUjEwNTAHTUdSMTA2MAdNR1IxMTEwB01HUjExMTIHTUdSMTExMwdNR1IxMTE2B01HUjExMTcHTUdSMTEyMQdNR1IxMTUwB01HUjExNjAHTUdSMTIwMwdNR1IxMjEwB01HUjEyMTEHTUdSMTIxMgdNR1IxMjEzB01HUjEyMTYHTUdSMTI1MQdNR1IxMzAxB01HUjEzMTAHTUdSMTMxMQdNR1IxMzEyB01HUjEzMTMHTUdSMTMxNAdNR1IxMzE1B01HUjEzMTcHTUdSMTM0MAdNR1IxMzQzB01HUjEzNjEHTUdSMTM2MgdNR1IxMzYzB01HUjEzNjQHTUdSMTM3MQdNR1IxMzc2B01HUjEzNzgHTUdSMTQwMQdNR1IxNDA1B01HUjE0MTAHTUdSMTQyNAdNR1IxNDMwB01HUjE0NDEHTUdSMTUwMQdNR1IxNTAyB01HUjE1MDMHTUdSMTUwNAdNR1IxNTA1B01HUjE1MDYHTUdSMTUwNwdNR1IxNTA4B01HUjE1MDkHTUdSMTUxMAdNR1IxNTIxB01HUjE1MjIHTUdSMTUyMwdNR1IxNTI0B01HUjE1MjUHTUdSMTUyOAdNR1IxNTI5B01HUjE1NDAHTUdSMTU0MQdNR1IxNTQ0B01HUjE1NDUHTUdSMTU0NwdNR1IxNTQ4B01HUjE3MDIHTUdSMTcxMQdNR1IxNzQwB01HUjE3NDMHTUdSMTc0NAdNR1IxNzQ1B01HUjE3NTAHTUdSMTc1MwdNR1IxNzYyB01HUjE4MTAHTUdSMTk1MAdNR1IxOTcwB01HUjIwMTAHTUdSMjAxNAdNR1IyMDIxB01HUjIwNDAHTUdSMjA1MQdNR1IyMDUzB01HUjIwNTYHTUdSMjA1NwdNR1IyMTEwB01HUjIxMjEHTUdSMjEyNQdNR1IyMTMyB01HUjIxNDEHTUdSMjE0MgdNR1IyMTQzB01HUjIyMDAHTUdSMjI0MQdNR1IyMjUwB01HUjIyNTMHTUdSMjI1NQdNR1IyMzAwB01HUjIzMjAHTUdSMjMyMQdNR1IyMzMxB01HUjIzNTEHTUdSMjM1MwdNR1IyMzU0B01HUjIzNjEHTUdSMjM3MAdNR1IyNDAxB01HUjI0MDMHTUdSMjQxMAdNR1IyNDIwB01HUjI0MjEHTUdSMjQ0MgdNR1IyNDUwB01HUjI0NjEHTUdSMjQ2MgdNR1IyNDYzB01HUjI0NzMHTUdSMjYwMAdNR1IyNjAxB01HUjI2MDMHTUdSMjYwNAdNR1IyNjA1B01HUjI4NTAHTUdSMjkwMAdNR1IyOTAzB01HUjI5MTAHTUdSOTAyMAdNR1I5MDIyB01HUjkwMjMHTUdSOTAyNQdNR1I5MDMwB01HUjkwMzIHTUdSOTAzNAdNR1I5MDM2B01HUjkwNDEHTUdSOTA1MgdNR1I5MDUzB01HUjkwNTUHTUdSOTA1NwdNR1I5MDU5B01HUjkwOTAHTUxIMDAxMwdNTEgxMDE1B01MSDEwNDAHTUxIMTA0MgdNTEgxMDQ2B01MSDEwNDgHTUxIMTA0OQdNTEgxMDU1B01MSDEwNjIHTUxIMTA2NwdNTEgxMDY4B01MSDEwNjkHTUxIMTA3MgdNTEgxMTA1B01MSDExMDYHTUxIMTExMAdNTEgxMTIwB01MSDExMjEHTUxIMTEyNwdNTEgxMTcyB01MSDExOTIHTUxIMTIwMAdNTEgxMjAxB01MSDEyMTAHTUxIMTI0NQdNTEgxMjYxB01MSDEzMDEHTUxIMTMwMwdNTEgxMzA0B01MSDEzMDkHTUxIMTMxMgdNTEgxMzM0B01MSDEzNDQHTUxIMTM0NgdNTEgxMzU0B01MSDEzNjAHTUxIMTM4MgdNTEgxNDMxB01MSDE0MzMHTUxIMTQzNAdNTEgxNDQwB01MSDE0NTQHTUxIMTQ1NgdNTEgxNDcxB01MSDE0NzIHTUxIMTQ4MAdNTEgxNDgzB01MSDE0OTAHTUxIMTQ5MQdNTEgxNTA1B01MSDE1MTIHTUxIMTUxMwdNTEgxNTE3B01MSDE1MTgHTUxIMTUxOQdNTEgxNTIyB01MSDE1MzIHTUxIMTU2MQdNTEgxNTYyB01MSDE2MTAHTUxIMTYxMQdNTEgxNjMyB01MSDE2MzUHTUxIMTYzNgdNTEgxNjM3B01MSDE2NDEHTUxIMTY1MAdNTEgxNjUxB01MSDE2NTIHTUxIMTY1NQdNTEgxNjgwB01MSDE3MDAHTUxIMTcwMgdNTEgxNzAzB01MSDE3MDUHTUxIMTcwNgdNTEgxNzA5B01MSDE3MjAHTUxIMTcyMQdNTEgxNzIzB01MSDE3MjcHTUxIMTc2MAdNTEgxNzYyB01MSDE3NzAHTUxIMTgwNgdNTEgxODA3B01MSDE4MTEHTUxIMTgyNQdNTEgxODQzB01MSDE5MDIHTUxIMTkwMwdNTEgxOTA0B01MSDE5MDgHTUxIMTkxMAdNTEgxOTEyB01MSDE5MTYHTUxIMTk5MQdNTEgyMDIwB01MSDIwMjMHTUxIMjA0MgdNTEgyMDY0B01MSDIwNjUHTUxIMjA2NwdNTEgyMDcxB01MSDIxMDQHTUxIMjEwOQdNTEgyMTEwB01MSDIxMzcHTUxIMjE2MgdNTEgyMTY2B01MSDIxNjcHTUxIMjE3MgdNTEgyMjAwB01MSDIyMDQHTUxIMjIwNgdNTEgyMjA3B01MSDIyMjgHTUxIMjIyOQdNTEgyMjQ1B01MSDIyNDkHTUxIMjI2MQdNTEgyMjY2B01MSDIyODMHTUxIMjMwNQdNTEgyMzE0B01MSDIzMTUHTUxIMjMxNgdNTEgyMzE3B01MSDIzMjIHTUxIMjMyNQdNTEgyMzI4B01MSDIzMzAHTUxIMjQyMAdNTEgyNDQ4B01MSDI0NTIHTUxIMjQ3MAdNTEgyNDcxB01MSDI0NzIHTUxIMjQ3MwdNTEgyNDkzB01MSDI1NDMHTUxIMjU0NQdNTEgyNTcwB01MSDI1NzIHTUxIMjU3MwdNTEgyNjEzB01MSDI2MzIHTUxIMjY0MAdNTEgyNzAxB01MSDI3MDIHTUxIMjcwMwdNTEg0MTUxB01MSDQyNjUHTUxINDgyMAdNTEg1MDEzB01MSDUwMTQHTUxINTAyMQdNTEg1MDIzB01MSDUwMjUHTUxINTAzMQdNTEg1MDUwB01MSDUwNTEHTUxINTA1MgdNTEg1MDUzB01MSDUwNjAHTUxINTA3MAdNTEg1MTIwB01MSDUxMjMHTUxINTEzMgdNTEg1MTM0B01MSDUxMzUHTUxINTE0MAdNTEg1MTQxB01MSDUyMDAHTUxINTIxMAdNTEg1MjgwB01MSDUzMDMHTUxINTMxMAdNTEg1MzgwB01MSDUzOTAHTUxINTUxMAdNTEg1NzAwB01MSDU5MzAHTUxINTk0MAdNTEg1OTkwB01MSDU5OTEHTUxINzQwMQdNTEg4MjU0B01MSDkwNDAHTUxIOTA2MQdNTEg5MDYzB01MSDkwNjQHTUxIOTA2OAdNTEg5MDgwB01MSDkxNTQHTVFCMTAxMAdNUUIxMDEyB01RQjEwMzkHTVFCMTA1MgdNUUIxMDUzB01RQjEwODEHTVFCMTA5NQdNUUIxMTIwB01RQjExMjIHTVFCMTEyNAdNUUIxMTMwB01RQjExNDEHTVFCMTE1MQdNUUIxMjAwB01RQjEyMDIHTVFCMTIwNAdNUUIxMjQwB01RQjEyNjAHTVFCMTMwMwdNUUIxMzA0B01RQjEzMTAHTVFCMTMyMAdNUUIxMzMwB01RQjEzNTAHTVFCMTQ2MAdNUUIxNDYxB01RQjE0ODAHTVFCMTQ4MQdNUUIxNTEwB01RQjE1MTIHTVFCMTUxNAdNUUIxNTE1B01RQjE1MTYHTVFCMTUxOQdNUUIxNTIxB01RQjE1OTIHTVFCMTYxNwdNUUIxNjMwB01RQjE2ODAHTVFCMTgwMAdNUUIxODEyB01RQjE4MTMHTVFCMTgxNAdNUUIxODQwB01RQjE4NTAHTVFCMTg1MQdNUUIxODcyB01RQjE5MDAHTVFCMTkwMQdNUUIxOTEzB01RQjE5MjIHTVFCMTkyMwdNUUIxOTQ0B01RQjE5NTAHTVFCMTk2MQdNUUIyMDEzB01RQjIzMTkHTVFCMzAwMAdNUUI5MDEyB01RQjkwMTQHTVFCOTAyMQdNUUI5MDI2B01RQjkwNDEHTVJTMTA0MgdNUlMxMDQ0B01SUzEzMDkHTVJTMTYyMAdNUlMxOTE3B01SUzIyNTgHTVJTMzAwMAdNUlMzMzAzB01SUzkwNDUHTVNEMTA5MgdNU0QxMTAzB01TRDExNjIHTVNEMTYyNAdNU0QxODMwB01TRDE4MzkHTVNEMTkxMAdNU0QyMjI2B01TRDIyNDMHTVNEOTAyMAdNU0sxMDE1B01TSzEwODAHTVNLMTA4MwdNU0sxMjAyB01TSzEyMjIHTVNLMTIyNQdNU0sxMjQxB01TSzEyNDMHTVNLMTQ4MQdNU0sxNTE4B01TSzE1MjEHTVNLMTU3MAdNU0sxNjEyB01TSzE2MTUHTVNLMTYxNgdNU0sxNjE3B01TSzIxMzYHTVNLMjIwNwdNU0syMjUyB01TSzIyNTQHTVNLMjI3MAdNU0syMjcxB01TSzIyNzIHTVNLMjI3NAdNU0syNTAwB01TSzI1MDEHTVNLMjUwMwdNU0syNzcyB01TSzMwMjEHTVNLMzAzMAdNU0szMTA3B01TSzMxMTEHTVNLMzE0MQdNU0szMzE0B01TSzMzMTcHTVNLMzQwMQdNU0szNDI0B01TSzM1MjIHTVNLMzY0OQdNU0szNjYxB01TSzM3MTEHTVNLMzcyNwdNU0szNzMzB01TSzM4MjMHTVNLNDAyMAdNU0s0MDI2B01TSzQwMjcHTVNLNDAyOAdNU0s0MDQwB01TSzQwNDUHTVNLNDA2NQdNU0s0MDczB01TSzQ2MDAHTVNLNDYxMwdNU0s1MzUzB01TSzkwMjcHTVNLOTA1NwdNU1QxMDEwB01TVDEwMTIHTVNUMTAxMwdNU1QxMDE0B01TVDEwMTUHTVNUMTAxNgdNU1QxMDE3B01TVDEwMTgHTVNUMTAxOQdNU1QxMDIxB01TVDEwNjEHTVNUMTA4MQdNU1QxMDgyB01TVDExMDEHTVNUMTEwMwdNU1QxMTExB01TVDExMzAHTVNUMTEzNAdNU1QxMTQzB01TVDExNDQHTVNUMTE2MgdNU1QxMTY1B01TVDExNzIHTVNUMTE4MAdNU1QxMjA5B01TVDEyMjMHTVNUMTI2MgdNU1QxMzAzB01TVDEzMDQHTVNUMTMwNQdNU1QxMzA2B01TVDEzMDcHTVNUMTMwOQdNU1QxMzMxB01TVDEzNDEHTVNUMTM0MgdNU1QxMzUwB01TVDEzNTIHTVNUMTM2MAdNU1QxMzcwB01TVDE0NDAHTVNUMTQ0MQdNU1QxNDcyB01TVDE0OTIHTVNUMTQ5NQdNU1QxNTAxB01TVDE1NzIHTVNUMTYwMAdNU1QxNjEzB01TVDE2MjMHTVNUMTYyNQdNU1QxNjI3B01TVDE2MzMHTVNUMTYzNgdNU1QxNjcwB01TVDE2NzMHTVNUMTY4MAdNU1QxNjgzB01TVDE2OTAHTVNUMTcwMAdNU1QxNzUxB01TVDE4NDIHTVNUMTg1MgdNU1QxODU0B01TVDE4NjIHTVNUMjAxNAdNU1QyMDIxB01TVDIwMjUHTVNUMjA2MQdNU1QyMDY0B01TVDIwNzEHTVNUMjA3MgdNU1QyMDc1B01TVDIwNzcHTVNUMjExMAdNU1QyMTMwB01TVDIxMzEHTVNUMjEzMwdNU1QyMTM1B01TVDIxNDMHTVNUMjE0NQdNU1QyMTcxB01TVDIxNzMHTVNUMjE3NwdNU1QyMTgwB01TVDIxODEHTVNUMjE4MgdNU1QyMjUxB01TVDIyNTUHTVNUMjI3MAdNU1QyMzI3B01TVDIzMzEHTVNUMjM0MQdNU1QyMzcwB01TVDIzOTAHTVNUMjM5MQdNU1QyNDAwB01TVDI0MTAHTVNUMjQxMwdNU1QyNDMwB01TVDI0MzIHTVNUMjQzMwdNU1QyNDQwB01TVDI0NjQHTVNUMjQ2OAdNU1QyNDgwB01TVDI0ODMHTVNUMjUwMwdNU1QyNTE0B01TVDI1MTcHTVNUMjUyMAdNU1QyNTIzB01TVDI1MzIHTVNUMjU0MAdNU1QyNTQzB01TVDI1NjEHTVNUMjYxMQdNU1QyNjIwB01TVDI2MjIHTVNUMjYyMwdNU1QyNjMwB01TVDI2MzIHTVNUMjY0MQdNU1QyNjUxB01TVDI2NTMHTVNUMjY2MwdNU1QyNzAxB01TVDI3MjMHTVNUMjcyNAdNU1QyNzI3B01TVDI3MzIHTVNUMjc0MAdNU1QyNzYwB01TVDI3NjQHTVNUMjc4MAdNU1QyOTExB01TVDMwMTAHTVNUMzA2MAdNU1QzMDYyB01TVDMwNjcHTVNUMzA2OAdNU1QzMDY5B01TVDMwNzMHTVNUMzA5MAdNU1QzMTAxB01TVDMxMDIHTVNUMzEwNgdNU1QzMTA3B01TVDMxMjAHTVNUMzE1MAdNU1QzMTU1B01TVDMxNzIHTVNUMzIwMAdNU1QzMjAxB01TVDMyMDQHTVNUMzIzMwdNU1QzMjQyB01TVDMyNjEHTVNUMzMxNwdNU1QzMzQwB01TVDMzNDEHTVNUMzM1MwdNU1QzNDAwB01TVDM0MDUHTVNUMzQxMAdNU1QzNTAyB01TVDM1MDMHTVNUMzUwNAdNU1QzNTA1B01TVDM1MDYHTVNUMzUwNwdNU1QzNTA4B01TVDM1MDkHTVNUMzU4MgdNU1QzNTgzB01TVDM1ODQHTVNUMzU4NQdNU1QzNjAyB01TVDM2MjAHTVNUMzY2MAdNU1QzNjcyB01TVDM3MDIHTVNUMzcwNQdNU1QzNzA2B01TVDM3MTEHTVNUMzc2MAdNU1QzNzYyB01TVDM3ODAHTVNUMzc4MQdNU1QzNzgyB01TVDM3ODMHTVNUMzc4NAdNU1QzNzg1B01TVDM4MDQHTVNUMzgzMAdNU1QzODMxB01TVDM4NDAHTVNUMzg1MAdNU1QzODUxB01TVDM4NTIHTVNUMzg1NQdNU1QzODc1B01TVDQwMTcHTVNUNDAyNgdNU1Q0MDMxB01TVDQwMzQHTVNUNDA0MAdNU1Q0MDQ1B01TVDQwODIHTVNUNDEwMgdNU1Q0MTA0B01TVDQxMDYHTVNUNDEwOAdNU1Q0MTEyB01TVDQxMTYHTVNUNDEyMAdNU1Q0MTIzB01TVDQxMjYHTVNUNDEyNwdNU1Q0MTMyB01TVDQxMzQHTVNUNDE0MwdNU1Q0MTYwB01TVDQxNjEHTVNUNDE4MAdNU1Q0MTgxB01TVDQyMDAHTVNUNDIwMQdNU1Q0MjAyB01TVDQyMDMHTVNUNDIwNAdNU1Q0MjA3B01TVDQyMzMHTVNUNDI1MAdNU1Q0MjYzB01TVDQyNzAHTVNUNDI4MAdNU1Q0MzAzB01TVDQzMTIHTVNUNDMxNgdNU1Q0MzE4B01TVDQzMjEHTVNUNDMyMgdNU1Q0MzQzB01TVDQzNTQHTVNUNDM1NgdNU1Q0MzU4B01TVDQzNjMHTVNUNDM4MQdNU1Q0MzgzB01TVDQ0MDQHTVNUNDQwNQdNU1Q0NDIyB01TVDQ0NjQHTVNUNDQ2NwdNU1Q0NDcwB01TVDQ1MDIHTVNUNDUwMwdNU1Q0NTA0B01TVDQ1MTAHTVNUNDUxMQdNU1Q0NTEyB01TVDQ1MTQHTVNUNDUzNQdNU1Q0NTQyB01TVDQ1OTIHTVNUNDU5MwdNU1Q0NjAxB01TVDQ2MDMHTVNUNDYxMQdNU1Q0NjIwB01TVDQ2MjEHTVNUNDYyMgdNU1Q0NjIzB01TVDQ2MzMHTVNUNDk0MwdNU1Q0OTQ1B01TVDQ5NjAHTVNUNTAxMAdNU1Q1MDE0B01TVDUwNTAHTVNUNTA1MQdNU1Q1MDUzB01TVDUwNTQHTVNUNTA1NQdNU1Q1MDczB01TVDUwNzUHTVNUNTA4MAdNU1Q1MDgxB01TVDUxMDEHTVNUNTEwMgdNU1Q1MTEzB01TVDU1NDAHTVNUNTU3MAdNU1Q5MDIyB01TVDkwMjQHTVNUOTAyNQdNU1Q5MDI5B01TVDkwMzQHTVNUOTA1MAdNU1Q5MDU0B01TVDkwNTUHTVNUOTA1NgdNU1Q5MDU5B01TVDkwNzIHTVNUOTA4MAdNU1Q5MDk0B01URjEwMTcHTVRGMTAyMAdNVEYxMDUxB01URjEwNzEHTVRGMTA4MQdNVEYxMTAwB01URjExMTAHTVRGMTEyMAdNVEYxMTIyB01URjExMzAHTVRGMTEzMQdNVEYxMTMyB01URjExNDMHTVRGMTE2MAdNVEYxMjAyB01URjEyMDQHTVRGMTIxMAdNVEYxMjIxB01URjEyMzAHTVRGMTIzMQdNVEYxMjM0B01URjEyNDAHTVRGMTI0MQdNVEYxMjYwB01URjEyNjEHTVRGMTI3MAdNVEYxMzAwB01URjEzMTAHTVRGMTM4MQdNVEYxNDAzB01URjE0MDUHTVRGMTQ0MAdNVEYxNDQxB01URjE0NzIHTVRGMTQ5MAdNVEYxNTAwB01URjE1NDAHTVRGMTU0MgdNVEYxNTYwB01URjE2MDAHTVRGMTc5MAdNWEsxMDM0B01YSzEwNTEHTVhLMTA4NgdNWEsxMTAwB01YSzExNTMHTVhLMTE2MAdNWEsxMTgxB01YSzEyNDcHTVhLMTMwNAdNWGsxNDA0B01YSzE0MDUHTVhLMTQxMgdNWEsxNDcyB01YSzE0NzMHTVhLMTUxMgdNWEsxNTM3B01YSzE1MzgHTVhLMTcwMAdNWEsxNzIyB01YSzE3NDEHTVhLMTc2MgdNWEsxODYxB01YSzQwODIHTVhLNDA4NAdNWEs5MDI2B01YSzkwMjcHTVhLOTA0MgdNWEs5MDQzB01YSzkwNDcHTVhLOTA2MwdNWFIxMDEyB01YUjEwNjAHTVhSMTA2MQdNWFIxMTAwB01YUjExMDEHTVhSMTEwMgdNWFIxMTAzB01YUjExMDQHTVhSMTEwNQdNWFIxMTIwB01YUjExMjEHTVhSMTMwMAdNWFIxMzAxB01YUjEzMTEHTVhSMTMyMQdNWFIxMzMxB01YUjEzNDAHTVhSMTM1MAdNWFIxMzYxB01YUjEzNjMHTVhSMTQxMAdNWFIxNDIwB01YUjE0NTIHTVhSMTQ2MQdNWFIxNDgwB01YUjE0ODEHTVhSMTUwMAdNWFIxNTAxB01YUjkwMTAHTVhSOTAzMAdORFIwMTAyB05EUjEwMjAHTkRSMTAyMQdORFIxMDM0B05EUjEwNDAHTkRSMTA3MAdORFIxMDcxB05EUjEwODAHTkRSMTE0MAdORFIxMjEyB05EUjEyMjEHTkRSMTIyMgdORFIxMjMwB05EUjEyMzQHTkRSMTIzOQdORFIxMjQzB05EUjEyNTAHTkRSMTMxMgdORFIxMzMyB05EUjEzNDEHTkRSMTM0MwdORFIxMzUwB05EUjEzNTQHTkRSMTM1NwdORFIxMzYwB05EUjEzNjEHTkRSMTM3MAdORFIxMzk2B05EUjE0MDAHTkRSMTQwNAdORFIxNDA1B05EUjE0MTEHTkRSMTQzNgdORFIxNDUwB05EUjE0NjEHTkRSMTQ2OAdORFIxNDY5B05EUjE2MDAHTkRSMTYwMQdORFIxNjAyB05EUjE2MDMHTkRSMTYwNwdORFIxNjExB05EUjE2MTMHTkRSMTY0MgdORFIxNjYwB05EUjE2NjEHTkRSMTY2MwdORFIxNjY2B05EUjE4MDAHTkRSMTg0MwdORFIxODQ0B05EUjE4NDUHTkRSMTg1MAdORFIxODUxB05EUjE5MDAHTkRSMTkzMAdORFIxOTQxB05EUjE5NjAHTkRSMTk3MQdORFIyMDEwB05EUjIwMzQHTkRSMjExMQdORFIyMTM5B05EUjIxNTAHTkRSMjE1MwdORFIyMTczB05EUjIxNzcHTkRSMjE4MAdORFIyMjIwB05EUjIyMjIHTkRSMjIzMgdORFIyMjQxB05EUjIyNDQHTkRSMjI0NQdORFIyMjUxB05EUjIzMDAHTkRSMjMwMQdORFIyMzAyB05EUjIzMDQHTkRSMjMwNQdORFIyMzA2B05EUjIzMDcHTkRSMjMyMAdORFIyMzIxB05EUjIzMzAHTkRSMjM0MAdORFIyMzUwB05EUjIzNjAHTkRSMjM2MQdORFIyMzgyB05EUjkwMTAHTkRSOTAxMQdORFI5MDE0B05EUjkwMTYHTkRSOTAzMAdORFI5MDMxB05EUjkwMzQHTkRSOTAzNgdORFI5MDQwB05EUjkwNDkHTkRSOTA1MAdORFI5MDUxB05EUjkwNjIHTkRSOTA3MAdORFI5MDcxB05EUjkwNzMHTkRSOTA3NwdORFI5MDgxB05EUjkwODgHTlhSMDU0NwdOWFIwNTk5B05YUjEwMTMHTlhSMTAxNgdOWFIxMDE3B05YUjEwMTgHTlhSMTAyMAdOWFIxMDU1B05YUjEwOTAHTlhSMTEwMgdOWFIxMTIyB05YUjExMzMHTlhSMTIwMwdOWFIxMjA1B05YUjEzNzEHTlhSMTQwNAdOWFIxNDA4B05YUjE0MjAHTlhSMTQyMQdOWFIxNTA4B05YUjE1MDkHTlhSMTU5MQdOWFIxNjIwB05YUjE5MDcHTlhSMTkyMwdOWFIxOTMyB05YUjE5NDMHTlhSMTk3MQdOWFIyMDYzB05YUjIwNjYHTlhSMjA2OAdOWFIyMTM0B05YUjIxNDIHTlhSMjM1MQdOWFIyNDA2B05YUjI0MDcHTlhSMjUwNgdOWFIyNTI1B05YUjI1MzIHTlhSMjUzMwdOWFIyNTQxB05YUjI1NDMHTlhSMjU0NQdOWFIyNTU4B05YUjI1NTkHTlhSMjYwMgdOWFIyNjAzB05YUjI2MDQHTlhSMjYwNgdOWFIyNjA3B05YUjI2MDgHTlhSMjYwOQdOWFIyNjIwB05YUjI2MjYHTlhSMjYyOAdOWFIyNjMwB05YUjI2NDEHTlhSMjY1NQdOWFIyNjYwB05YUjMwMjEHTlhSMzAyNQdOWFIzMTUwB05YUjMxNjIHTlhSMzIwNQdOWFIzMjMwB05YUjMyMzIHTlhSMzI0MQdOWFIzMjU0B05YUjMzMTIHTlhSMzM1OQdOWFIzMzcxB05YUjMzNzMHTlhSMzQxMwdOWFIzNDIwB05YUjM0MjMHTlhSMzQzNgdOWFIzNDgyB05YUjM1MTIHTlhSMzUzMQdOWFIzNTUwB05YUjM1NzgHTlhSMzYwMAdOWFIzNjIzB05YUjM2MjQHTlhSMzY0MQdOWFIzNjQzB05YUjM2NTAHTlhSMzY2MQdOWFIzNjcwB05YUjM2ODAHTlhSNDAxMAdOWFI0MDE1B05YUjQwMTkHTlhSNDAzMAdOWFI0MDM2B05YUjQwNTIHTlhSNDA4MQdOWFI0MTEzB05YUjQxMjAHTlhSNDIyMQdOWFI0MjUwB05YUjQ0MjMHTlhSNTAyMQdOWFI1MTQwB05YUjUyMDgHTlhSNTIxMgdOWFI2MDMyB05YUjYwNTAHTlhSNjA1MQdOWFI2MDUyB05YUjYzMzcHTlhSNjM0NQdOWFI2MzUzB05YUjYzODIHTlhSNjQwMAdOWFI2NDAzB05YUjY0MDQHTlhSNjQ0MAdOWFI2NDQxB05YUjY0NTMHTlhSNjQ3NgdOWFI2NDc3B05YUjY1MDMHTlhSNjUxNAdOWFI2NTE2B05YUjY1MTcHTlhSNjUzMQdOWFI2NTQwB05YUjY1NDEHTlhSNjYxNgdOWFI2NjQwB05YUjkwMjIHTlhSOTAyNwdQQksxNDQwB1BCSzE0NjEHUEJLMTUwNQdQQksxODIwBlBMQTAwMAdQTEExMDE3B1BMQTEwMjEHUExBMTA0MgdQTEExMTA0B1BMQTExMzIHUExBMTE2MAdQTEExMzAzB1BMQTEzMTAHUExBMTMxNQdQTEExMzIzB1BMQTE0MTUHUExBMTQxNwdQTEExNDU0B1BMQTE1MTUHUExBMTU3NQdQTEExNTc5B1BMQTE2MTUHUExBMTY4MQdQTEExOTA1B1BMQTIyMzQHUExBOTAxMAdQTEE5MDMyB1BMQTkwNTQHUFRBMTIyNwdQVEExNTAyB1BUQTkwNDMHUFRBOTA0NAdRTEExMDI4B1FMQTEwNDAHUUxBMTA1MgdRTEExMDUzB1FMQTEwNjMHUUxBMTA5MAdRTEExMTEzB1FMQTExNDEHUUxBMTE4MAdRTEExMTgxB1FMQTExODIHUUxBMTIwMAdRTEExMjA5B1FMQTEyNDEHUUxBMTI0MgdRTEExMzExB1FMQTEzMjAHUUxBMTMyMQdRTEExMzM0B1FMQTE0MDIHUUxBMTYxMAdRTEExNjEzB1FMQTE2MzIHUUxBMTY3MAdRTEExNzAyB1FMQTE3MDkHUUxBMTc2MAdRTEExODExB1FMQTE5MTAHUUxBMTkxMwdRTEExOTE3B1FMQTE5MzMHUUxBMjAxMAdRTEEyMDE0B1FMQTIwMTUHUUxBMjAxOQdRTEEyMDI1B1FMQTIxMzEHUUxBOTAxMwdRTEE5MDE4B1FMQTkwMTkHUUxBOTAyMgdRTEE5MDQyB1FORDE3MTEHUU5EMTc2NAdRUkQxMDIwB1FSRDEwNzAHUVJEMTEwMgdRUkQxMTAzB1FSRDExMjQHUVJEMTEyNQdRUkQxMTI3B1FSRDExMjgHUVJEMTE2MQdRUkQxMTgxB1FSRDEyMDMHUVJEMTIxMgdRUkQxMjE0B1FSRDEyMTUHUVJEMTI1MgdRUkQxMjUzB1FSRDEyNTQHUVJEMTI1NwdRUkQxMjYwB1FSRDEzMDEHUVJEMTMwMwdRUkQxMzEzB1FSRDEzNTcHUVJEMTM4MAdRUkQxMzgxB1FSRDE0MDEHUVJEMTQxMAdRUkQxNDQzB1FSRDE0NDUHUVJEMTQ2MQdRUkQxNDkxB1FSRDE0OTMHUVJEMTUwMwdRUkQxNTIyB1FSRDE1MzAHUVJEMTUzMgdRUkQxNTM1B1FSRDE2MTAHUVJEMTYxMQdRUkQxNjMwB1FSRDE2MzIHUVJEMTYzMwdRUkQxNjUxB1FSRDE2NTIHUVJEMTY3MAdRUkQxNzAxB1FSRDE3MTEHUVJEMTc0MgdRUkQxNzQ2B1FSRDE3NDcHUVJEMTc3MgdRUkQxODAwB1FSRDE4MTIHUVJEMTgxNQdRUkQxODMwB1FSRDE4MzEHUVJEMTgzMwdRUkQxOTAyB1FSRDE5MTAHUVJEMTkyMQdRUkQxOTQxB1FSRDE5NDMHUVJEMjAyMAdRUkQyMDIxB1FSRDIwMjMHUVJEMjExMwdRUkQyMTQxB1FSRDI0MDAHUVJEMjQwMgdRUkQyNDA0B1FSRDI0MDUHUVJEMjQwOAdRUkQyNTAxB1FSRDI1MDQHUVJEMjUzMQdRUkQyNTMzB1FSRDI1MzUHUVJEMzEwMgdRUk0xMDI1B1FSTTEwODAHUVJNMTA5MAdRUk0xMTA0B1FSTTExMDcHUVJNMTEwOQdRUk0xMTgyB1FSTTEyMDQHUVJNMTIwOAdRUk0xMjg0B1FSTTE0MDYHUVJNMTQ4NAdRUk0xNTA0B1FSTTE1MDUHUVJNMTUwOQdRUk0xNTE4B1FSTTE1NjMHUVJNMTU4MAdRUk0xNjA1B1FSTTE2NTEHUVJNMTcxMAdRUk0xNzE1B1FSTTE4MDEHUVJNMTgwNgdRUk0xODM4B1FSTTE4NTAHUVJNMTkwMQdRUk0xOTExB1FSTTE5NDAHUVJNMTk0MgdRUk0xOTUwB1FSTTE5NTEHUVJNMjAyMwdRUk0yMDM1B1FSTTIxMDEHUVJNMjEwMwdRUk0yMTI0B1FSTTIxMzIHUVJNMjEzMwdRUk0yMTM3B1FSTTIxNzAHUVJNMjE4MwdRUk0yMTg2B1FSTTIyMDIHUVJNMjIwMwdRUk0yMjA4B1FSTTIyMDkHUVJNMjMxNAdRUk0yMzE1B1FSTTIzNzEHUVJNMjM3OQdRUk0yMzgwB1FSTTI0MTYHUVJNMjQyMAdRUk0yNDUyB1FSTTI0NjMHUVJNMjQ3MQdRUk0yNTAwB1FSTTI1MDIHUVJNMjUwMwdRUk0yNTA1B1FSTTI1MDcHUVJNMjU4MgdRUk0yNjEyB1FSTTI2MzIHUVJNMjYzMwdRUk0yNjM0B1FSTTI2NTEHUVJNMjY4MQdRUk0yNjg2B1FSTTI3MDAHUVJNMjcwNAdRUk0yNzM3B1FSTTI3MzgHUVJNMjgwMAdRUk0yODAxB1FSTTI4MDMHUVJNMjgxMQdRUk0yODQzB1FSTTI4NDQHUVJNMjg0NQdRUk0yOTAyB1FSTTI5MDMHUVJNMjkxMgdRUk0yOTM4B1FSTTI5NDMHUVJNMjk0NQdRUk0yOTQ2B1FSTTI5NjEHUVJNMzAwMAdRUk0zMDExB1FSTTMwMzMHUVJNMzEwMAdRUk0zMjAxB1FSTTMyMzIHUVJNMzI1NAdRUk0zNjEwB1FSTTM2MTEHUVJNMzYxMgdRUk0zNjEzB1FSTTM2MTYHUVJNMzYxNwdRUk0zNjkxB1FSTTM5MDQHUVJNMzkwNQdRUk0zOTUwB1FSTTQwMDEHUVJNNDAwNwdRUk00MDUxB1FSTTQ1MTMHUVJNNDUxNQdRUk00NTMyB1FSTTQ1MzMHUVJNNDUzNAdRUk00NTM2B1FSTTQ1NTAHUVJNNDU1MgdRUk00NjAwB1FSTTQ2MjAHUVJNNDY2MQdRUk00ODAwB1FSTTUwMTkHUVJNNTEyNgdRUk01MTQwB1FSTTUxNDMHUVJNNTE1MAdRUk01MjAyB1FSTTUyMTEHUVJNNTIyMAdRUk01MjMxB1FSTTkwMTIHUVJNOTAxNgdRUk05MDE4B1FSTTkwMTkHUVJNOTA1MwdRUk05MDcyB1FSTTkwNzUHUkJUMDAxNAdSQlQwMDQ0B1JCVDEwNDMHUkJUMTA2MwdSQlQxMDgxB1JCVDEwODIHUkJUMTExMgdSQlQxMTIwB1JCVDExMzYHUkJUMTI1MAdSQlQxMjUxB1JCVDEyNzEHUkJUMTI5MQdSQlQxMzAwB1JCVDEzMzEHUkJUMTMzNAdSQlQxMzYzB1JCVDE0MDUHUkJUMTQwNwdSQlQxNDA4B1JCVDE0MTAHUkJUMTQ0MAdSQlQxNDcxB1JCVDE0NzcHUkJUMTUwMwdSQlQxNTIxB1JCVDE1MjIHUkJUMTUyNgdSQlQxNTQwB1JCVDE1NDIHUkJUMTU1MgdSQlQxNTYwB1JCVDE1ODQHUkJUMTU4NQdSQlQxNjAwB1JCVDE2MDMHUkJUMTYwNQdSQlQxNjA4B1JCVDE2MzEHUkJUMTY2MAdSQlQxNjYxB1JCVDE2NjMHUkJUMTY3MgdSQlQxNjg2B1JCVDE2ODgHUkJUMTcwMQdSQlQxNzAyB1JCVDE3MDUHUkJUMTcxMAdSQlQxNzMyB1JCVDE3NjIHUkJUMTc2MwdSQlQxNzY2B1JCVDE3NjcHUkJUMTgwMQdSQlQxODMxB1JCVDE4MzQHUkJUMTgzNQdSQlQxODM3B1JCVDE4NDEHUkJUMTg0MwdSQlQxODQ0B1JCVDE4NDgHUkJUMTg0OQdSQlQxODUwB1JCVDE4NTIHUkJUMTg2MgdSQlQxODY0B1JCVDE4NjUHUkJUMTg3MQdSQlQxOTAxB1JCVDE5MDcHUkJUMTk1MAdSQlQxOTUxB1JCVDE5NTIHUkJUMTk2MQdSQlQxOTcwB1JCVDE5NzUHUkJUMTk4MAdSQlQxOTgxB1JCVDE5ODIHUkJUMjAxMAdSQlQyMDIwB1JCVDIwMzAHUkJUMjAzMgdSQlQyMDM0B1JCVDIwMzYHUkJUMjA3MAdSQlQyMDczB1JCVDIxMDEHUkJUMjE0NAdSQlQyMTQ1B1JCVDIxNDYHUkJUMjE0NwdSQlQyMTUyB1JCVDIxNjEHUkJUMjE2MgdSQlQyMTkxB1JCVDIyMjIHUkJUMjIyMwdSQlQyMjI0B1JCVDIyMzIHUkJUMjIzNAdSQlQyMjM1B1JCVDIyMzcHUkJUMjI0MgdSQlQyMjQzB1JCVDIyNDUHUkJUMjI1MgdSQlQyMjUzB1JCVDIyNjAHUkJUMjI3MAdSQlQyMjgyB1JCVDIyODMHUkJUMjMwMwdSQlQyMzA3B1JCVDIzMjAHUkJUMjMyMQdSQlQyNDExB1JCVDI0MTMHUkJUMjQxNAdSQlQyNDMxB1JCVDI0MzUHUkJUMjQ0MwdSQlQyNDYyB1JCVDI0ODUHUkJUMjQ4NgdSQlQyNDg3B1JCVDI1MDAHUkJUMjUyMgdSQlQyNjA0B1JCVDI2MTAHUkJUMjYxNgdSQlQyNjQ2B1JCVDI2NTMHUkJUMjY3MQdSQlQyNjcyB1JCVDI3MDIHUkJUMjcwOQdSQlQyNzEwB1JCVDI3MzEHUkJUMjczMwdSQlQyNzQwB1JCVDMwMjQHUkJUMzAyNgdSQlQzMDMwB1JCVDMwNDUHUkJUMzA0NwdSQlQzMTAwB1JCVDMxMTIHUkJUMzExMwdSQlQzMTIxB1JCVDMxMzAHUkJUMzEzMQdSQlQzMTMyB1JCVDMxNDAHUkJUMzE0MQdSQlQzMTQyB1JCVDMyMTEHUkJUMzIxMgdSQlQzMjE3B1JCVDMyNDAHUkJUMzQzMAdSQlQzNTAwB1JCVDM1MDIHUkJUMzUwMwdSQlQzNTA0B1JCVDQwMTAHUkJUNDAxMQdSQlQ0MDEyB1JCVDQwMTYHUkJUNDAxNwdSQlQ0MDI0B1JCVDQwMjkHUkJUNDAzMAdSQlQ0MDM0B1JCVDQwMzcHUkJUNDA1MAdSQlQ0MDcwB1JCVDQxMDAHUkJUNDEwMQdSQlQ0MTAzB1JCVDQxMDQHUkJUNDEwNQdSQlQ0MTA3B1JCVDQxMTAHUkJUNDExMgdSQlQ0MTEzB1JCVDQyMDAHUkJUNDIwMgdSQlQ0MjEwB1JCVDQyMTQHUkJUNDIyMAdSQlQ0MjI0B1JCVDQyMjUHUkJUNDIyNgdSQlQ0MjI3B1JCVDQyNDIHUkJUNDI1MAdSQlQ0MjgwB1JCVDQyOTAHUkJUNDMwNAdSQlQ0MzMwB1JCVDQzMzEHUkJUNDMzMgdSQlQ0MzQwB1JCVDQzNDIHUkJUNDM0NAdSQlQ0NDAwB1JCVDQ0MTAHUkJUNDQyMAdSQlQ0NjAzB1JCVDQ2MDgHUkJUNDYxOAdSQlQ0NjIwB1JCVDQ2MzMHUkJUNDYzOAdSQlQ0NzAwB1JCVDQ3MDEHUkJUNDcxMQdSQlQ0NzIyB1JCVDUwMTAHUkJUNTEwMAdSQlQ1MzEwB1JCVDUzMjAHUkJUNTk5MAdSQlQ2MDExB1JCVDYwMTMHUkJUNjAxNwdSQlQ2MDIyB1JCVDYwMzMHUkJUNjAzNQdSQlQ2MDQxB1JCVDYwNTcHUkJUNjA4MAdSQlQ2MTIxB1JCVDYxMzAHUkJUNjE0MQdSQlQ2MjEwB1JCVDYzMDAHUkJUNjMwMgdSQlQ2MzAzB1JCVDY0MDMHUkJUNjQwNQdSQlQ2NDA3B1JCVDY0MTEHUkJUNjQxMwdSQlQ2NDIwB1JCVDY0NDEHUkJUNjQ0MgdSQlQ2NDQzB1JCVDY0NzAHUkJUNjUwMAdSQlQ2NTAzB1JCVDY1MTMHUkJUNjUyMAdSQlQ2NTI4B1JCVDY1NTAHUkJUNjYwMAdSQlQ2NjAzB1JCVDY2MDQHUkJUNjYwNQdSQlQ2NjA2B1JCVDY2MDcHUkJUNjcwMAdSQlQ2NzAxB1JCVDY3MDIHUkJUNjcwMwdSQlQ2NzA2B1JCVDY4MDAHUkJUNjgwMgdSQlQ2OTAwB1JCVDY5MDEHUkJUNjkwMwdSQlQ2OTMwB1JCVDY5NTAHUkJUOTAyMQdSQlQ5MDIyB1JCVDkwMjMHUkJUOTAyNgdSQlQ5MDI3B1JCVDkwMzAHUkJUOTAzOAdSQlQ5MDM5B1JCVDkwNDgHU0ZJMDE2MQdTRkkxMDMxB1NGSTEwNDAHU0ZJMTA0MQdTRkkxMDQzB1NGSTEwNDYHU0ZJMTA0NwdTRkkxMTEwB1NGSTExMTIHU0ZJMTExMwdTRkkxMTIwB1NGSTExMjEHU0ZJMTEyMgdTRkkxMTIzB1NGSTExMjQHU0ZJMTEyNQdTRkkxMTI3B1NGSTExNDEHU0ZJMTE1MgdTRkkxMTYxB1NGSTExNzEHU0ZJMTE4NAdTRkkxMjEyB1NGSTEyNTAHU0ZJMTI2MQdTRkkxMjcwB1NGSTEyOTMHU0ZJMTMwMAdTRkkxMzcwB1NGSTE0MDEHU0ZJMTQwMgdTRkkxNDAzB1NGSTE0MDQHU0ZJMTQwNQdTRkkxNDA3B1NGSTE0MTEHU0ZJMTQxMgdTRkkxNDEzB1NGSTE0MTQHU0ZJMTQxNQdTRkkxNDIxB1NGSTE0MjIHU0ZJMTQyMwdTRkkxNDMwB1NGSTE0MzIHU0ZJMTQzNAdTRkkxNDUyB1NGSTE1MDMHU0ZJMTUwNQdTRkkxNTExB1NGSTE1MTIHU0ZJMTUxMwdTRkkxNTE0B1NGSTE1MjEHU0ZJMTU0MAdTRkkxNTQxB1NGSTE1NDMHU0ZJMTYxMQdTRkkxNjEzB1NGSTE2MTUHU0ZJMTYxNwdTRkkxNjIwB1NGSTE2MjEHU0ZJMTYzNAdTRkkxNjQwB1NGSTI2MjAHU0ZJNjA3MQdTRkk3MDgwB1NGSTkwMTAHU0ZJOTAxNAdTR04wMDE2B1NHTjEwMzQHU0dOMTA3MAdTR04xMDcxB1NHTjExMDAHU0dOMTMwNAdTR04xMzA1B1NHTjEzMjEHU0dOMTM0NQdTR04xNDIxB1NHTjE1NDAHU0dOMTYwMAdTR04xNjMwB1NHTjE2NzYHU0dOMTcxMAdTR04xNzQxB1NHTjE3NjYHU0dOMTg2MgdTR04xOTA1B1NHTjE5MTQHU0dOMTkyNwdTR04yMDIwB1NHTjIwMjEHU0dOMjEwMQdTR04yMTA0B1NHTjIyMDMHU0dOMjI1MQdTR04yMzAzB1NHTjI0MTUHU0dOMjgwMQdTR04yODAzB1NHTjI5MzUHU0dOMzAwMAdTR04zMDc0B1NHTjMxMDMHU0dOMzIzMQdTR040MTkwB1NHTjQxOTMHU0dONDE5NwdTR040MzAzB1NHTjQ0MTUHU0dOOTAxNAdTR045MDMwB1NHTjkwMzIHU0dXMDAwMAdTR1cxMDEwB1NHVzEwMTEHU0dXMTAxMgdTR1cxMDE0B1NHVzEwMTUHU0dXMTAxNwdTR1cxMDE4B1NHVzEwMTkHU0dXMTAyMAdTR1cxMDQwB1NHVzEwNDIHU0dXMTA0MwdTR1cxMDQ3B1NHVzEwNTAHU0dXMTA3MAdTR1cxMDcyB1NHVzEwNzMHU0dXMTA4MQdTR1cxMDkxB1NHVzExMDQHU0dXMTExMAdTR1cxMTExB1NHVzExMTIHU0dXMTExNQdTR1cxMTE3B1NHVzExMTgHU0dXMTExOQdTR1cxMTIwB1NHVzExNTAHU0dXMTE2MQdTR1cxMTY3B1NHVzEyMDUHU0dXMTIwNwdTR1cxMjIxB1NHVzEyMzAHU0dXMTI1MAdTR1cxMjcxB1NHVzEzMDAHU0dXMTMwMQdTR1cxMzAyB1NHVzEzMDMHU0dXMTMwNAdTR1cxMzA1B1NHVzEzMDYHU0dXMTMwOQdTR1cxMzIwB1NHVzEzMjEHU0dXMTM1MQdTR1cxMzUyB1NHVzEzNjAHU0dXMTM2MgdTR1cxMzY1B1NHVzE0MDQHU0dXMTQwOAdTR1cxNDA5B1NHVzE0MjEHU0dXMTQ0MAdTR1cxNDUxB1NHVzE0NTIHU0dXMTQ1NAdTR1cxNDcwB1NHVzE0OTEHU0dXMTUwMAdTR1cxNTAyB1NHVzE1MDMHU0dXMTUzNgdTR1cxNTUwB1NHVzE2MDEHU0dXMTYwMgdTR1cxNjAzB1NHVzE2MDQHU0dXMTYwNQdTR1cxNjA5B1NHVzE2MTAHU0dXMTYxMQdTR1cxNjMwB1NHVzE2NDEHU0dXMTY2MAdTR1cxNjcxB1NHVzE2NzUHU0dXMTcwMAdTR1cxNzAyB1NHVzE3MDMHU0dXMTc1MwdTR1cxNzYwB1NHVzE3NjEHU0dXMTc3MAdTR1cxNzgzB1NHVzE4MDEHU0dXMTgwMgdTR1cxODAzB1NHVzE4MDQHU0dXMTgyMAdTR1cxODIxB1NHVzE4MjIHU0dXMTgyMwdTR1cxODI1B1NHVzE4MjYHU0dXMTgyNwdTR1cxODMwB1NHVzE4MzEHU0dXMTg0MAdTR1cxODQxB1NHVzE4NDMHU0dXMTg0NAdTR1cxODUzB1NHVzE4NTUHU0dXMTg1OQdTR1cxODYxB1NHVzE4NzEHU0dXMTkwMAdTR1cxOTEwB1NHVzE5MTEHU0dXMTkyMAdTR1cxOTIyB1NHVzE5NDEHU0dXMTk1MgdTR1cxOTYzB1NHVzE5NjQHU0dXMTk2NQdTR1cxOTY2B1NHVzE5NjgHU0dXMjAxMAdTR1cyMDExB1NHVzIwMTIHU0dXMjAxNAdTR1cyMDE2B1NHVzIwMTgHU0dXMjA0MAdTR1cyMDQyB1NHVzIwNDUHU0dXMjA1MAdTR1cyMDYwB1NHVzIwNjMHU0dXMjA3MQdTR1cyMDgwB1NHVzIwOTMHU0dXMjA5NAdTR1cyMDk1B1NHVzIwOTcHU0dXMjEwMgdTR1cyMTEwB1NHVzIxMTMHU0dXMjExNAdTR1cyMTQwB1NHVzIxNTAHU0dXMjE1MQdTR1cyMTYxB1NHVzIxNjMHU0dXMjE4MAdTR1cyMTgyB1NHVzIyMDAHU0dXMjIwOQdTR1cyNTExB1NHVzI1MTIHU0dXMjUxMwdTR1cyNTIwB1NHVzI1MjEHU0dXMjUzMAdTR1cyNTMyB1NHVzI1MzMHU0dXMjU5MAdTR1cyNTkxB1NHVzI2MDAHU0dXMjYwMQdTR1cyNjAzB1NHVzI2MTEHU0dXMjYzMgdTR1cyNjUxB1NHVzI3MjQHU0dXMjgxMwdTR1cyODIwB1NHVzI4MjQHU0dXMjgyNQdTR1cyODI4B1NHVzI4MzAHU0dXMjg2MAdTR1cyODgwB1NHVzMwMTEHU0dXMzAxMwdTR1czMDE0B1NHVzMwMTUHU0dXMzAxNgdTR1czMDE3B1NHVzMwMTkHU0dXMzAyMAdTR1czMDIxB1NHVzMwMzAHU0dXMzAzMwdTR1czMDQxB1NHVzMwNTAHU0dXMzA1MgdTR1czMDYwB1NHVzMwNzAHU0dXMzA3MQdTR1czMDcyB1NHVzMwNzQHU0dXMzA3NgdTR1czMDc4B1NHVzMwNzkHU0dXMzA4MAdTR1czMDgyB1NHVzMyMDQHU0dXMzIwNgdTR1czMjExB1NHVzMyMTIHU0dXMzIzMwdTR1czMjM1B1NHVzMyMzYHU0dXMzI1NwdTR1czMjYwB1NHVzMyNjIHU0dXMzI2MwdTR1czMjcwB1NHVzMyNzIHU0dXMzI3MwdTR1czMzAxB1NHVzMzMDMHU0dXMzMxMQdTR1czMzEyB1NHVzMzMzAHU0dXMzMzMQdTR1czMzMzB1NHVzMzMzQHU0dXMzMzNgdTR1czNDAxB1NHVzM0MDIHU0dXMzQwMwdTR1czNDA0B1NHVzM0MTIHU0dXMzQxMwdTR1czNDIzB1NHVzM1MDcHU0dXMzUwOQdTR1czOTA5B1NHVzQwNzAHU0dXNDA5MAdTR1c0NjAwB1NHVzQ4MDAHU0dXNTAxMAdTTEMxMzAyB1NMQzE2MjAHU0xDMTY0MAdTTEMxODIxB1NMQzE4MzIHU0xDMTg0MQdTTE0xMDIyB1NMTTEyMDEHU0xNMTMyMwdTTE0xMzc5B1NMTTE1NDkHU0xNMTYwNAdTTE0xNzA2B1NMTTE3MTMHU0xNMTc2NQdTTE0xNzc1B1NMTTE5MDEHU0xNMTkyMAdTTE0xOTgyB1NMTTIwNTAHU0xNMjEyMwdTTE0yMTYwB1NMTTIyMzQHU0xNMzA2MAdTTE0zMTI0B1NMWjEwMTAHU0xaMTAxMQdTTFoxMDQ1B1NMWjExMDIHU0xaMTEyMAdTTFoxMjAxB1NMWjEyMjEHU0xaMTIzMAdTTFoxMjMyB1NMWjEyMzMHU0xaMTI0MAdTTFoxMjQxB1NMWjEyNjAHU0xaMTI2MQdTTFoxMjcwB1NMWjEzMDAHU0xaMTMwMQdTTFoxMzAzB1NMWjEzMjAHU0xaMTMyMQdTTFoxMzIzB1NOVDExMDAHU05UMTEwMwdTTlQxMTExB1NOVDExMTMHU05UMTEyMAdTTlQxMTIxB1NOVDExMzAHU05UMTEzMQdTTlQxMTMyB1NOVDEyNjAHU05UMTMwMAdTTlQxMzAyB1NOVDEzMDYHU05UMTMyMAdTTlQxMzIyB1NOVDEzNDEHU05UMTM1MwdTTlQxMzYwB1NOVDE0MDEHU05UMTQwNgdTTlQxNDA3B1NOVDE0MjAHU05UMTQ2MwdTTlQxNTEwB1NOVDE1MTEHU05UMTUxMgdTTlQxNTEzB1NOVDE1MTQHU05UMTUxNQdTTlQxNTE2B1NOVDE1MTcHU05UMTUyMgdTTlQxNTUwB1NOVDE1ODEHU05UMTU4MgdTTlQxNTgzB1NOVDE5MTAHU05UNDEyMAdTTlQ5MDIwB1NOVDkwMjMHU05UOTAzMgdTTlQ5MDQwB1NOVDkwNDEHU05UOTA0NQdTTlQ5MDQ2B1NOVDkwNDcHU1BCMDAwMwdTUEIxMDEwB1NQQjEwMTEHU1BCMTAxMgdTUEIxMDEzB1NQQjEwMjQHU1BCMTAyOAdTUEIxMTA0B1NQQjExMDYHU1BCMTExMAdTUEIxMTExB1NQQjExMTMHU1BCMTEyMAdTUEIxMTIzB1NQQjExMjUHU1BCMTE0MwdTUEIxMTUzB1NQQjExNjIHU1BCMTE3MAdTUEIxMTkxB1NQQjEyMjEHU1BCMTI1NAdTUEIxMjgxB1NQQjEyODkHU1BCMTMwNQdTUEIxMzExB1NQQjEzMzQHU1BCMTQ0MgdTUEIxNTEwB1NQQjE1NjQHU1BCMTYyMgdTUEIxNzAzB1NQQjE3NTAHU1BCMTc1MQdTUEIxOTA0B1NQQjE5MDgHU1BCMTk0MQdTUEIyNDQ1B1NQQjI0NzEHU1BCMjUyOQdTUEIyNTc0B1NQQjI2NTIHU1BCMjY4MAdTUEIyNzUzB1NQQjI3NjAHU1BCMzAzNQdTUEIzMDQ0B1NQQjMwNjEHU1BCMzA2NAdTUEIzMDY2B1NQQjMwNzIHU1BCMzA4MwdTUEIzMTEyB1NQQjMxMTQHU1BCMzEzNgdTUEIzMTY4B1NQQjMxNzAHU1BCMzE4MgdTUEIzMjMwB1NQQjMyMzUHU1BCMzI2MAdTUEIzMzEzB1NQQjM0MTQHU1BCMzQxNwdTUEIzNDE4B1NQQjM0MTkHU1BCMzQzMQdTUEIzNDM1B1NQQjM0NTEHU1BCMzQ3MgdTUEIzNDc0B1NQQjM0NzgHU1BCMzUwNgdTUEIzNjUzB1NQQjM2NTUHU1BCMzkyMgdTUEI0MDE0B1NQQjQwNDEHU1BCNDExNAdTUEI0MjAwB1NQQjQyMjMHU1BCNDIzNQdTUEI0MjYwB1NQQjUxMjAHU1BCNjAxMAdTUEI2MDExB1NQQjYwMTIHU1BCNjAxMwdTUEI2MDIwB1NQQjYwMjQHU1BCNjA0MAdTUEI2MDQxB1NQQjYwNDMHU1BCNjA1MwdTUEI2MDU1B1NQQjYwNTcHU1BCNjA3MgdTUEI2MDgwB1NQQjYwODEHU1BCNjA5MwdTUEI2MDk1B1NQQjYxMDIHU1BCNjEzMQdTUEI2MTMzB1NQQjYxNTEHU1BCNjE2MQdTUEI2MTY4B1NQQjYzMDAHU1BCNjMwMwdTUEI2MzQxB1NQQjY1MDIHU1BCNjUxMQdTUEI2NTEyB1NQQjY1MTMHU1BCNjUzMgdTUEI2NTM1B1NQQjY1NDAHU1BCNjYwMAdTUEI2NjAyB1NQQjY2NDAHU1BCNjY0MgdTUEI2NzA2B1NQQjY3MzAHU1BCNjgxMAdTUEI2OTMxB1NQQjkwMjMHU1BCOTAyOAdTUEI5MDYyB1NQQjkwNjQHU1BCOTA2NQdTUEI5MDY2B1NQQjkwNjcHU1BCOTA2OAdTUEI5MDY5B1NQQjkwOTIHU1BCOTA5MwdTVEoxMTEwB1NUSjEyNjAHU1RKMTM1MwdTVEoxNDQwB1NUSjE1ODIHU1RKMTcxMAdTVEoxODUxB1NUSjE4NjEHU1RKMTk2MAdTVEozMDE0B1NUSjMxNzMHU1RKNDAxNAdTVlIwMDAwB1NWUjEwMTcHU1ZSMTAyMAdTVlIxMTA3B1NWUjEyNjMHU1ZSMTMwMQdTVlIxMzM2B1NWUjE0MDYHU1ZSMTY5NAdTVlIxNzUyB1NWUjE3NTMHU1ZSMTc1NAdTVlIxODMxB1NWUjE4NTIHU1dHMTA5MQdTV1ExMDE0B1NXUTEwMTYHU1dRMTEwNAdTV1ExMTA5B1NXUTExNjMHU1dRMTIxMwdTV1ExMjU0B1NXUTIwMzcHU1dRMjAzOAdTV1EyMzM3B1NXUTI0NDMHU1dRMjYxMQdTV1EyNjQ4B1NXUTI4MDIHU1dRMzAxNQdTV1EzMDM5B1NXUTMxNTkHU1dRMzMyMQdTV1EzNDE4B1NXUTM1MzQHU1dRMzUzNQdTV1E4MDEwB1NXUTkwMjYEVFAwMQdUWE4xMTMzB1RYTjExMzgHVFhOMTE3MwdUWE4xMjgwB1RYTjEyODIHVFhOMTMwMwdUWE4xMzE3B1RYTjEzNTYHVFhOMTQ0MwdUWE4xNDUwB1RYTjE0NjAHVFhOMTQ2MgdUWE4xNTM0B1RYTjE1NDMHVFhOMTYwNAdUWE4xNjEyB1RYTjE2MjEHVFhOMTgwMgdUWE4xOTUxB1RYTjIxNDMHVFhOMjE0NQdUWE4yMTQ2B1RYTjIyMDAHVFhOMjIxMAdUWE4yMjYxB1RYTjIzMTEHVFhOMjMzMwdUWE4yMzUyB1RYTjIzNTUHVFhOMjQwNwdUWE4yNDA5B1RYTjI0MjIHVFhOMjQ3MAdUWE4yNTExB1RYTjI1NDEHVFhOMjU1MAdUWE4yNTcxB1RYTjI2MTAHVFhOOTAxMAdUWE45MDIwB1RYTjkwMzIHVFhOOTAzNwdUWE45MDM4B1ZDVDEwMjAHVkNUMTAzMgdWQ1QxMDM0B1ZDVDEwNzEHVkNUMTEwMQdWQ1QxMTcyB1ZDVDEyNTEHVkNUMTMwNAdWQ1QxMzE0B1ZDVDEzMTYHVkNUMTMxOAdWQ1QxMzM1B1ZDVDE1MDQHVkNUMTUwNQdWQ1QxNTE5B1ZDVDE1MzAHVkNUMTYyMQdWQ1QxNjYwB1ZDVDE2NzEHVkNUMTY3NAdWQ1QxNjc1B1ZDVDE2NzYHVkNUMTY3NwdWQ1QxNzExB1ZDVDE3NjIHVkNUMTg0MAdWQ1QxOTA3B1ZDVDIwNDQHVkNUMjA1MQdWQ1QyMDU1B1ZDVDIwNjcHVkNUMjA3MgdWQ1QyMDczB1ZDVDIwNzQHVkNUMjA4MAdWQ1QyMTAzB1ZDVDIxMDQHVkNUMjEwNQdWQ1QyMTA5B1ZDVDIxMTYHVkNUMjEyNAdWQ1QyMTM2B1ZDVDIxNjIHVkNUMjIwMQdWQ1QyMjAzB1ZDVDIyMTEHVkNUMjIyNAdWQ1QyMjMzB1ZDVDIyNTMHVkNUMjI4MQdWQ1QyNTAxB1ZDVDI1MDIHVkNUMjUwMwdWQ1QyNTA4B1ZDVDI1MzAHVkNUMjUzMQdWQ1QyNTMyB1ZDVDI1NTIHVkNUMjU3OQdWQ1QyNjQwB1ZDVDI2NDQHVkNUMjY2MAdWQ1QyNjYzB1ZDVDI2NjUHVkNUMjY5MgdWQ1QyNzA3B1ZDVDI3MzMHVkNUMjczNQdWQ1QyNzUxB1ZDVDI3NTIHVkNUMjc1MwdWQ1QyNzYxB1ZDVDI3NzIHVkNUMjc4NgdWQ1QyNzg4B1ZDVDI4MDAHVkNUMjgwMwdWQ1QyODEwB1ZDVDI4MzIHVkNUMjgzMwdWQ1QyODQzB1ZDVDI4NTEHVkNUMjg1MwdWQ1QyOTAzB1ZDVDI5MDcHVkNUMjkwOQdWQ1QyOTYwB1ZDVDI5NjMHVkNUMjk4NwdWQ1Q5MDIxB1ZDVDkwMjIHVkNUOTAyMwdWQ1Q5MDI4B1ZDVDkwMzEHVkNUOTAzMgdWQ1Q5MDM1B1ZDVDkwNDAHVkNUOTA0NQdWQ1Q5MDQ2B1ZDVDkwNDgHVkNUOTA1MgdWQ1Q5MDUzB1ZDVDkwNTYHVkNUOTA1OQdWQ1Q5MDYxB1ZDVDkwNjYHVkNUOTA4MgdWQ1Q5MDgzB1ZDVDkwODQHVkNUOTA4NgdWTFQxMDQwB1ZMVDExNTAHVkxUMTIzNwdWTFQxMjUxB1ZMVDE0NTcHVkxUMTUyMQdWTFQxNjQ1B1ZMVDIwMDAHWEJYMTA4NAdYQlgxMDg2B1hCWDEyMDIHWEpSMTAyNAdYSlIxMDYwB1hKUjEwNzEHWEpSMTExMgdYSlIxMzQxB1hKUjE4NjUHWExOMTA4MgdYTE4xMDgzB1hMTjEzMjAHWExOMTMyMQdYTE4xNDMxB1hMTjkwNDAHWFJBMTAzMwdYUkExMDM1B1hSQTExMTEHWFJBMTExMgdYUkExMTE0B1hSQTExMTUHWFJBMTExNwdYUkExMTE4B1hSQTExNDEHWFJBMTE2MAdYUkExMTYyB1hSQTExNjMHWFJBMTIwMQdYUkExMjAyB1hSQTEyMDMHWFJBMTIwNgdYUkExMjMwB1hSQTEyMzUHWFJBMTIzNwdYUkExMjM5B1hSQTEzMzAHWFJBMTM0NgdYUkExMzQ3B1hSQTEzNDgHWFJBMTM0OQdYUkExNDAwB1hSQTE0MDMHWFJBMTQwNgdYUkExNTIxB1hSQTE1MjIHWFJBMTUyNAdYUkExNTI1B1hSQTE1MjcHWFJBMTYwMgdYUkExNjA0B1hSQTE2MTAHWFJBMTYxMQdYUkExNjEyB1hSQTE2NjAHWFJBMTcwMgdYUkExNzAzB1hSQTE3MDYHWFJBMTcwNwdYUkExNzExB1hSQTE3MTMHWFJBMTgwNwdYUkExODA4B1hSQTE4MTYHWFJBMTgyMAdYUkExODIyB1hSQTE4MjMHWFJBMTgyNQdYUkEyMDExB1hSQTIwMTMHWFJBMjAxNAdYUkEyMDE4B1hSQTIwODAHWFJBMjA4MQdYUkEyMDg0B1hSQTIxMDIHWFJBMjEwMwdYUkEyMTEwB1hSQTIxMzEHWFJBMjEzMgdYUkEyMTQ0B1hSQTIxNTEHWFJBMjE1NQdYUkEyMTYyB1hSQTIxNzIHWFJBMjE3NQdYUkEyMTkwB1hSQTIyMDAHWFJBMjIwMQdYUkEyMjAyB1hSQTIyMDQHWFJBMjIwNgdYUkEyMjMwB1hSQTIyMzEHWFJBMjIzMwdYUkEyMjM1B1hSQTIyMzYHWFJBMjI0MgdYUkEyMjQ0B1hSQTIyNjAHWFJBMjI2MQdYUkEyMjY0B1hSQTIyNjYHWFJBMjQwMAdYUkEyNDAzB1hSQTI0MDQHWFJBMjQwNQdYUkEyNDA2B1hSQTI0MzEHWFJBMjQzMwdYUkEyNDM0B1hSQTI0MzcHWFJBMjQ3MQdYUkEyNDczB1hSQTI1MDEHWFJBMjUwMwdYUkEyNTA1B1hSQTI1MDYHWFJBMjUwNwdYUkEyNTMwB1hSQTI1MzIHWFJBMjU1MAdYUkEyNTUyB1hSQTI2MDMHWFJBMjYzMgdYUkEyNjUyB1hSQTI2NTMHWFJBMjY5MAdYUkEyNzA1B1hSQTI3MDYHWFJBMjcwNwdYUkEyNzA4B1hSQTI3MDkHWFJBMjc3MAdYUkE5MDExB1hSQTkwMjEHWFJBOTAyMgdYUkE5MDIzB1hSQTkwMjUHWFJBOTAyNgdYUkE5MDMxB1hXSzEwMTEHWFdLMTAxMgdYV0sxMDIxB1hXSzEwMjMHWFdLMTAyNAdYV0sxMDI1B1hXSzExMDUHWFdLMTExMgdYV0sxMTE0B1hXSzExMTUHWFdLMTExNgdYV0sxMTE4B1hXSzExMTkHWFdLMTEzNQdYV0sxMTQyB1hXSzExNDQHWFdLMTIxMQdYV0sxMjIxB1hXSzEyMzAHWFdLMTIzMgdYV0sxMjMzB1hXSzEyMzQHWFdLMTI0MQdYV0sxMjUwB1hXSzEzMTEHWFdLMTMzMgdYV0sxMzM0B1hXSzE3MDAHWFdLMTcwMQdYV0sxNzAzB1hXSzE3MDQHWFdLMTcwNgdYV0sxNzE1B1hXSzE4MjIHWFdLMTgyMwdYV0sxODMxB1hXSzE4NDAHWFdLMTg0MgdYV0sxODUzB1hXSzE4NjIHWFdLMTg3MwdYV0sxODc0B1hXSzE4NzUHWFdLMjAxMQdYV0syMDE0B1hXSzIwMTcHWFdLMjAyMAdYV0syMDMyB1hXSzIwMzMHWFdLMjAzNAdYV0syMDM1B1hXSzIxMDEHWFdLMjEyMQdYV0syMTUzB1hXSzIyMzAHWFdLMjIzMQdYV0syMjMyB1hXSzIyMzUHWFdLMjI0MAdYV0syMjQyB1hXSzIyNTMHWFdLMjI3MAdYV0syMjcxB1hXSzIyNzMHWFdLMjI3NAdYV0syMzMyB1hXSzIzMzMHWFdLMjM2MwdYV0syMzY1B1hXSzIzNjkHWFdLMjQwMgdYV0syNDAzB1hXSzI0MDQHWFdLMjQwNgdYV0syNDA3B1hXSzI0MjEHWFdLMjQzNAdYV0syNDQwB1hXSzI0NDEHWFdLMjQ0MwdYV0syNDcwB1hXSzI0NzEHWFdLMjQ3MgdYV0syNDczB1hXSzI0NzUHWFdLMjQ3NwdYV0syNTAzB1hXSzI1MDQHWFdLMjUwNQdYV0syNTIwB1hXSzI1MzYHWFdLMjU1MQdYV0syNTU2B1hXSzI1NTcHWFdLMjU3MAdYV0syNTczB1hXSzI1ODAHWFdLMjU4MwdYV0syNTg1B1hXSzI2MDEHWFdLMjYxMAdYV0syNjExB1hXSzI2MTMHWFdLMjYxNAdYV0syNjIwB1hXSzI2MzAHWFdLMjYzMwdYV0syOTAxB1hXSzI5MTEHWFdLMjkyNQdYV0syOTI2B1hXSzMwMDAHWFdLOTAxMgdYV0s5MDE1B1hXSzkwMTYHWFdLOTAxNwdYV0s5MDMxB1hXSzkwMzIHWFdLOTAzNQdYV0s5MDM3B1hXSzkwMzkHWFdLOTA3MwdaQkIxMDI0B1pCQjEwNTAHWkJCMTA1MQdaQkIxMDkzB1pCQjExNDMHWkJCMTE2MAdaQkIxMTYyB1pCQjExNjMHWkJCMTE2NAdaQkIxMjAwB1pCQjEyMDEHWkJCMTIxMgdaQkIxMjEzB1pCQjEyNDAHWkJCMTI0MgdaQkIxMzAyB1pCQjEzMDYHWkJCMTMwNwdaQkIxMzA5B1pCQjEzMjAHWkJCMTMyMQdaQkIxMzIyB1pCQjEzMjMHWkJCMTMyNAdaQkIxMzI1B1pCQjEzMjcHWkJCMTMyOAdaQkIxMzQxB1pCQjEzNjIHWkJCMTM3MQdaQkIxNDIxB1pCQjE0MzEHWkJCMTQ1MAdaQkIxNDUxB1pCQjE1MDAHWkJCMTUwMQdaQkIxNTAyB1pCQjE1MDMHWkJCMTUwNQdaQkIxNTA2B1pCQjE1MDcHWkJCMTUwOAdaQkIxNTA5B1pCQjE1NTAHWkJCOTAzMAdaQkcwMDAwB1pCRzEwMTEHWkJHMTA0MAdaQkcxMDQxB1pCRzEwNTEHWkJHMTA1MgdaQkcxMDUzB1pCRzEwNTQHWkJHMTA1NwdaQkcxMDU4B1pCRzEwOTQHWkJHMTEwMQdaQkcxMTExB1pCRzExMTMHWkJHMTEyMAdaQkcxMTIxB1pCRzExMzAHWkJHMTEzMQdaQkcxMTMyB1pCRzExMzMHWkJHMTE0MQdaQkcxMTUyB1pCRzExNjAHWkJHMTE2MwdaQkcxMTY1B1pCRzExNjgHWkJHMTE3MAdaQkcxMTgyB1pCRzExODQHWkJHMTIwMAdaQkcxMjAzB1pCRzEyMTIHWkJHMTIxMwdaQkcxMjIwB1pCRzEyMzEHWkJHMTI0NQdaQkcxMjQ3B1pCRzEyNTAHWkJHMTI2MAdaQkcxMjYxB1pCRzEyODEHWkJHMTI5NQdaQkcxMzAwB1pCRzEzMDEHWkJHMTMwMgdaQkcxMzAzB1pCRzEzMDUHWkJHMTMwNgdaQkcxMzA3B1pCRzEzMDgHWkJHMTMwOQdaQkcxMzIxB1pCRzEzMjIHWkJHMTM0MAdaQkcxMzkxB1pCRzE0MDAHWkJHMTQwMQdaQkcxNDA5B1pCRzE0MTEHWkJHMTQyMAdaQkcxNDIxB1pCRzE0MjIHWkJHMTQyMwdaQkcxNDMxB1pCRzE0NDIHWkJHMTQ0MwdaQkcxNDQ1B1pCRzE0NTQHWkJHMTQ4MgdaQkcxNDkxB1pCRzE0OTIHWkJHMTUwMAdaQkcxNTAyB1pCRzE1MTEHWkJHMTUxMgdaQkcxNTEzB1pCRzE1MjIHWkJHMTU2MAdaQkcxNTYzB1pCRzE2MDQHWkJHMTYwNQdaQkcxNjA4B1pCRzE2MTEHWkJHMTYxOAdaQkcxNjQxB1pCRzE2NTEHWkJHMTY1MgdaQkcxNjUzB1pCRzE2NzAHWkJHMTY3NQdaQkcxNzQyB1pCRzE3NTAHWkJHMTc1MwdaQkcxNzU1B1pCRzE3NjIHWkJHMTc4MQdaQkcxODAyB1pCRzE4MDMHWkJHMTgwNAdaQkcxODA3B1pCRzE4MDkHWkJHMTgxMAdaQkcxODMxB1pCRzE4MzIHWkJHMTgzMwdaQkcxODUwB1pCRzE5MDcHWkJHMTkyMAdaQkcxOTIxB1pCRzE5MzEHWkJHMTkzOQdaQkcyMDEwB1pCRzIwMTMHWkJHMjAyNQdaQkcyMDMzB1pCRzIwMzYHWkJHMjA0MQdaQkcyMDQ1B1pCRzIwNjEHWkJHMjA2MwdaQkcyMDczB1pCRzIwNzQHWkJHMjA3NwdaQkcyMDc5B1pCRzIxMTIHWkJHMjE1MwdaQkcyMjUxB1pCRzIyNzMHWkJHMjI4MAdaQkcyMjkzB1pCRzIzMDYHWkJHMjMwNwdaQkcyMzA4B1pCRzIzNDAHWkJHMjM5MAdaQkcyMzkyB1pCRzI0MTEHWkJHMjQxMgdaQkcyNDE1B1pCRzI0MTgHWkJHMjQ0MAdaQkcyNDQzB1pCRzI0NjAHWkJHMjQ2MQdaQkcyNDYzB1pCRzI0OTAHWkJHMjQ5MQdaQkcyNDkzB1pCRzI0OTQHWkJHMjQ5NQdaQkcyNDk2B1pCRzI1MDEHWkJHMjUwMgdaQkcyNTAzB1pCRzI1MDQHWkJHMjUwNwdaQkcyNTEwB1pCRzI1MjAHWkJHMjUyMgdaQkcyNTIzB1pCRzI1NDgHWkJHMjU1MgdaQkcyNTYxB1pCRzI1OTAHWkJHMjYyMAdaQkcyNjIxB1pCRzI2NDEHWkJHMjY3MgdaQkcyNjgyB1pCRzI3MzEHWkJHMjc2MwdaQkcyODAxB1pCRzI4MzMHWkJHMjg0MwdaQkcyODUxB1pCRzMwMTAHWkJHMzAyMAdaQkczMDIxB1pCRzMwMjIHWkJHMzAyMwdaQkczMDI0B1pCRzMwMjUHWkJHMzAzNwdaQkczMDQzB1pCRzMwNDQHWkJHMzA0NwdaQkczMDUxB1pCRzMwNjIHWkJHMzA2MwdaQkczMDY0B1pCRzMwNjkHWkJHMzA5MAdaQkczMDkxB1pCRzMwOTIHWkJHMzEwNgdaQkczMTA4B1pCRzMxMDkHWkJHMzE0MAdaQkczMTQyB1pCRzMyMDYHWkJHMzIwNwdaQkczMjMxB1pCRzMyNDEHWkJHMzI0NAdaQkczMjUwB1pCRzMyNTEHWkJHMzI2MAdaQkczMzEwB1pCRzM0MDAHWkJHMzQwMgdaQkczNDEwB1pCRzM0NTAHWkJHMzQ1MgdaQkczNTAyB1pCRzM1MDMHWkJHMzUyNgdaQkczNTY4B1pCRzM1NzEHWkJHMzYwMQdaQkczNjAyB1pCRzM2MDMHWkJHMzYwNAdaQkczNjA2B1pCRzM2MDcHWkJHMzYwOAdaQkczNjQxB1pCRzM2NDMHWkJHMzY1NAdaQkczNjU2B1pCRzM2NTgHWkJHMzY2MAdaQkczNjYxB1pCRzM2ODEHWkJHMzY4MgdaQkczNzExB1pCRzM3MTIHWkJHMzc0MAdaQkczOTAxB1pCRzM5NTEHWkJHNDAyMgdaQkc0MTAxB1pCRzQxMDMHWkJHNDIwMgdaQkc0MzAzB1pCRzUwMjIHWkJHOTAxMQdaQkc5MDE1B1pCUjEwMTYHWkJSMTAxOQdaQlIxMTkwB1pCUjEyOTEHWkJSMTMwMQdaQlIxMzExB1pCUjEzNDMHWkJSMTM3MwdaQlIxNDAyB1pCUjE0MTMHWkJSMTQyOQdaQlIxNDMxB1pCUjE0NTYHWkJSMTQ4MAdaQlIxNDkyB1pCUjE1MjAHWkJSMTUzMQdaQlIxNTQyB1pCUjE1NjEHWkJSMTU3MQdaQlIxNTcyB1pCUjE1ODEHWkJSMTU5MQdaQlIxNjAyB1pCUjE3MTAHWkJSMTcxMgdaQlIxNzEzB1pCUjE3MTYHWkJSMTcxOAdaQlIxNzMxB1pCUjE3MzMHWkJSMTc2MgdaQlIxNzgzB1pCUjE4MDAHWkJSMTgwMQdaQlIxODA2B1pCUjE4MzQHWkJSMTgzNgdaQlIxODM3B1pCUjE4NTEHWkJSMTkwMAdaQlIxOTUwB1pCUjE5ODIHWkJSMjA2MQdaQlIyMDc0B1pCUjIxMzMHWkJSMjE0MAdaQlIyMzA1B1pCUjI1MTgHWkJSMjU0MgdaQlIyNTUxB1pCUjI1NjMHWkJSMjU4MAdaQlIyNTgxB1pCUjI2MDAHWkJSMjYwMQdaQlIyNjA3B1pCUjI2NzIHWkJSMjcwMgdaQlIyNzAzB1pCUjI3MDQHWkJSMjcwNQdaQlIyNzIyB1pCUjI3MjcHWkJSMjcyOAdaQlIyNzkzB1pCUjI3OTQHWkJSMjgwNAdaQlIyODA3B1pCUjI4MDgHWkJSMjgwOQdaQlIyODUwB1pCUjI4NTIHWkJSMjkxMwdaQlIyOTIxB1pCUjI5MjMHWkJSMjkyNQdaQlIyOTI2B1pCUjI5MzAHWkJSMjkzMQdaQlIyOTQwB1pCUjI5NDEHWkJSMjk1MAdaQlIyOTUyB1pCUjMwMTEHWkJSMzAxMgdaQlIzMDEzB1pCUjMyMTMHWkJSMzI0MQdaQlIzMjUxB1pCUjMyNjEHWkJSMzI3MQdaQlIzMjcyB1pCUjMzMDMHWkJSMzMwNAdaQlIzMzA1B1pCUjMzMDkHWkJSMzMxMQdaQlIzMzIyB1pCUjMzMjMHWkJSMzMyNAdaQlIzMzI1B1pCUjMzMjcHWkJSMzM5MgdaQlIzMzk0B1pCUjMzOTUHWkJSMzQzMgdaQlIzNDQzB1pCUjM0NTcHWkJSMzQ2MQdaQlIzNDcxB1pCUjM0NzYHWkJSMzQ5MQdaQlIzNTAwB1pCUjM1MTAHWkJSMzU0MAdaQlIzNTUwB1pCUjM1NTIHWkJSMzU3MAdaQlIzNjEwB1pCUjM2MTQHWkJSMzY0MQdaQlIzNjQ5B1pCUjM3MDMHWkJSMzcyMAdaQlIzNzMwB1pCUjM4NTAHWkJSMzkwMAdaQlI0MTczB1pCUjQyMjQHWkJSNDIzMAdaQlI0MjUxB1pCUjQzMjAHWkJSNDMyMQdaQlI0MzUyB1pCUjQzNjAHWkJSNDQyNQdaQlI0NDI3B1pCUjUwMTAHWkJSNTAxMQdaQlI5MDMzB1pCUjkwMzkHWkJSOTA0MgdaUlEwMDI2B1pSUTEwMTIHWlJRMTA3NAdaUlExMDgwB1pSUTEwODcHWlJRMTEwMQdaUlExMTA0B1pSUTExMTEHWlJRMTEyMQdaUlExMTMyB1pSUTExMzQHWlJRMTE0MAdaUlExMTUzB1pSUTExNTQHWlJRMTE1NgdaUlExMTczB1pSUTExODAHWlJRMTE4MQdaUlExMTgyB1pSUTExODUHWlJRMTIxNAdaUlExMjIyB1pSUTEzMTAHWlJRMTMxMQdaUlExMzE3B1pSUTEzMjEHWlJRMTM2MAdaUlExMzYyB1pSUTEzNjMHWlJRMTM2NQdaUlExNDEwB1pSUTE0MTEHWlJRMTQxMwdaUlExNDIyB1pSUTE1MDEHWlJRMTUwMgdaUlExNTMyB1pSUTE1NTIHWlJRMTU2MQdaUlExNTcwB1pSUTE2MDIHWlJRMTYxNwdaUlExNjIwB1pSUTE2MzEHWlJRMTYzMgdaUlExNjM1B1pSUTE2MzYHWlJRMTYzNwdaUlExNjUxB1pSUTE2NTMHWlJRMTY3MgdaUlExNzEyB1pSUTE3MTUHWlJRMTcyMgdaUlExNzMwB1pSUTE3MzEHWlJRMTc0MwdaUlExNzYwB1pSUTE3NjEHWlJRMTgxMAdaUlExODUwB1pSUTE4NTEHWlJRMTkxMAdaUlExOTE2B1pSUTE5MTgHWlJRMTkxOQdaUlEyMDEwB1pSUTIwMTIHWlJRMjAxMwdaUlEyMDE0B1pSUTIwMTUHWlJRMjAxNgdaUlEyMDE4B1pSUTIwMTkHWlJRMjAyMgdaUlEyMDI0B1pSUTIwMjUHWlJRMjA1MQdaUlEyMDc1B1pSUTIwNzYHWlJRMjEwNgdaUlEyMTIxB1pSUTIxNjAHWlJRMjIwMgdaUlEyMjAzB1pSUTIyMDQHWlJRMjIwNgdaUlEyMjA3B1pSUTIyMjIHWlJRMjI0MQdaUlEyMjYwB1pSUTIyNjMHWlJRMjI2NQdaUlEyMjY4B1pSUTIzMDQHWlJRMjMwOQdaUlEyMzEwB1pSUTIzMjMHWlJRMjMzMgdaUlEyMzMzB1pSUTIzMzcHWlJRMjMzOAdaUlEyMzM5B1pSUTIzNTAHWlJRMjM1MQdaUlEyMzUyB1pSUTIzNjAHWlJRMjM2NwdaUlEyMzY4B1pSUTIzNjkHWlJRMjM3NAdaUlEyMzc1B1pSUTI0MDQHWlJRMjQwNQdaUlEyNDA2B1pSUTI0MjEHWlJRMjQyNAdaUlEyNDQxB1pSUTI1MDIHWlJRMjUwMwdaUlEyNTA1B1pSUTI1MjIHWlJRMjUzMQdaUlEyNTQwB1pSUTI1NTAHWlJRMjU1MQdaUlEyNTcwB1pSUTI1NzEHWlJRMjU3NQdaUlEyNjAwB1pSUTI2MDQHWlJRMjYwNQdaUlEyNjA5B1pSUTI2NjEHWlJRMjY4MAdaUlEyNzMwB1pSUTI3NjQHWlJRMjc3MQdaUlEyNzkxB1pSUTI4MDAHWlJRMjgwMQdaUlEyODA2B1pSUTI4MzEHWlJRMjg0MQdaUlEyODUzB1pSUTI4NTUHWlJRMjg2MQdaUlEyODcwB1pSUTI4ODEHWlJRMjg4NAdaUlEyODg1B1pSUTI5MDIHWlJRMjkyMgdaUlEyOTYyB1pSUTI5NjUHWlJRMzAxMAdaUlEzMDcwB1pSUTMwNzMHWlJRMzEwMAdaUlEzMTAxB1pSUTMxMjMHWlJRMzEzNAdaUlEzMTYxB1pSUTMxNzIHWlJRMzE3NQdaUlEzMTc5B1pSUTMzMDEHWlJRMzMyMAdaUlEzMzIxB1pSUTMzNDAHWlJRMzM1MAdaUlEzNDAxB1pSUTM0MDYHWlJRMzQwNwdaUlEzNDMxB1pSUTM0MzMHWlJRMzQ0MgdaUlEzNDQzB1pSUTM0NDUHWlJRMzQ2NQdaUlEzNTQwB1pSUTM1NDEHWlJRMzU0MwdaUlEzNTYxB1pSUTM1NzEHWlJRMzYwMAdaUlEzNjAyB1pSUTM2MTEHWlJRNDAxMwdaUlE0MDE1B1pSUTQwMTcHWlJRNDAxOQdaUlE0MDIwB1pSUTQwMzEHWlJRNDA3NAdaUlE0MDc2B1pSUTQwOTQHWlJRNDA5NwdaUlE0MTAxB1pSUTQxMjAHWlJRNDEyMgdaUlE0MTQzB1pSUTQxNDUHWlJRNDE2MgdaUlE5MDEwB1pSUTkwMTEHWlJROTAzMQdaVE4xMDEyB1pUTjEwMTgHWlROMTAzMAdaVE4xMDM1B1pUTjEwMzgHWlROMTAzOQdaVE4xMDUxB1pUTjEwODMHWlROMTEwMQdaVE4xMTAyB1pUTjExMTIHWlROMTEyNAdaVE4xMTMzB1pUTjExNDYHWlROMTE1MAdaVE4xMTY0B1pUTjExNjcHWlROMTIwNAdaVE4xMjM0B1pUTjEzMzUHWlROMTM2MAdaVE4xMzYxB1pUTjEzNjUHWlROMTM2OQdaVE4xNDEwB1pUTjE0MTIHWlROMTQxNAdaVE4xNDIwB1pUTjE0NDMHWlROMTQ4MQdaVE4xNDg3B1pUTjE0OTIHWlROMTUwNwdaVE4xNTA5B1pUTjE1MTkHWlROMTU1MAdaVE4xNTg1B1pUTjE1OTAHWlROMTU5MQdaVE4xNTk3B1pUTjE2MDIHWlROMTY0MAdaVE4xNjUxB1pUTjE2NTMHWlROMTY5MQdaVE4xNzUwB1pUTjE3OTAHWlROMTgxMgdaVE4xODE2B1pUTjE4MjIHWlROMTg1MwdaVE4xODU0B1pUTjE5MDUHWlROMTkwNgdaVE4xOTA3B1pUTjIwNTQHWlROMjA3MAdaVE4yMDc2B1pUTjIwODEHWlROMjE0MAdaVE4yMTQxB1pUTjIyMDMHWlROMjIwNQdaVE4yMjA3B1pUTjIyMDkHWlROMjIyMAdaVE4yMjI0B1pUTjIyNzIHWlROMjI4MAdaVE4yMzAyB1pUTjIzNjUHWlROMjM4MAdaVE4yMzgxB1pUTjIzODIHWlROMjM4MwdaVE4yNDA2B1pUTjI0MDcHWlROMjQwOAdaVE4yNDA5B1pUTjI0MTEHWlROMjQ1MAdaVE4yNDUxB1pUTjI0NjIHWlROMjQ3MgdaVE4yNDc1B1pUTjI1MDMHWlROMjUwNAdaVE4yNTEwB1pUTjI1NDIHWlROMjU0NwdaVE4yNTczB1pUTjI2MDgHWlROMjYwOQdaVE4yNjQwB1pUTjI2NDIHWlROMjY3NQdaVE4yNzAwB1pUTjI3MTQHWlROMjcxNwdaVE4yNzE4B1pUTjI3NDUHWlROMjc3MwdaVE4yNzg2B1pUTjI4MTMHWlROMjgzMAdaVE4yODMyB1pUTjI4MzgHWlROMjg4MQdaVE4yODgyB1pUTjI4ODMHWlROMjkwMQdaVE4yOTA2B1pUTjI5MDcHWlROMjkxMwdaVE4yOTYwB1pUTjMyMDEHWlROMzIxMgdaVE4zMjE1B1pUTjMyMTcHWlROMzIyNAdaVE4zMjUxB1pUTjMyNzEHWlROMzI3MwdaVE4zMzA1B1pUTjMzMTAHWlROMzMxMQdaVE4zMzI0B1pUTjMzMzEHWlROMzMzMgdaVE4zMzQwB1pUTjMzNTEHWlROMzM1MwdaVE4zMzYwB1pUTjMzNjIHWlROMzM4MAdaVE4zMzg0B1pUTjM0MDAHWlROMzQwNgdaVE4zNDMwB1pUTjM0MzIHWlROMzQzNQdaVE4zNDM2B1pUTjM0NDMHWlROMzQ1MAdaVE4zNDYwB1pUTjM1MDMHWlROMzUwNAdaVE4zNTA1B1pUTjM1MDcHWlROMzUwOAdaVE4zNTA5B1pUTjM1NzIHWlROMzU5MAdaVE4zNjAyB1pUTjM2MjYHWlROMzcwOAdaVE4zNzMxB1pUTjM3NTAHWlROMzc1MgdaVE4zNzgzB1pUTjM4MDEHWlROMzgwMwdaVE40MDEwB1pUTjQwMjIHWlRONDAyMwdaVE40MDI0B1pUTjQwMjYHWlRONDAyOQdaVE40MDUwB1pUTjQwODIHWlRONDEwMQdaVE40MTIxB1pUTjQxNjYHWlRONDI5MAdaVE40MjkxB1pUTjQyOTMHWlRONDI5NwdaVE40MzAxB1pUTjQzMDQHWlRONDM0MAdaVE40MzQxB1pUTjQzNDUHWlRONDM1MQdaVE40MzYxB1pUTjQzNzAHWlRONDQwMAdaVE40NDAxB1pUTjQ0MDIHWlRONDQwNQdaVE40NDA3B1pUTjQ0MzAHWlRONDQ1MQdaVE40NDUyB1pUTjQ0NjIHWlRONDQ2MwdaVE40NDY0B1pUTjQ0NjcHWlRONDUxMQdaVE40NzAyB1pUTjQ3MDQHWlRONDkwMwdaVE40OTIyB1pUTjkwMjMHWlROOTAyNRQrA50kZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dkZAIeDxAPFgIfA2dkEBUDAAQyMDE2BDIwMTcVAwAEMjAxNgQyMDE3FCsDA2dnZ2RkBSZnX2QzMTg1MDY5XzVkYzZfNGUwN19hZWNhX2NlNDk1NjUzMTgzNA9kFgRmDxYCHgdWaXNpYmxlaGQCAQ8WAh8EaGQFJmdfZDgyNjA2YjZfMDA4NV80NmVjXzk5NTJfOTM2YmU3NTc5NWMwD2QWBGYPFgIfBGhkAgEPFgIfBGhkBSZnX2IyMzIyNDg0XzM2Y2ZfNDkxYl9iZWJhX2E5OGEwODU3YWZhNQ9kFgRmDxYCHwRoZAIBDxYCHwRoZAIHD2QWBGYPZBYEAgEPFgIfBGgWAmYPZBYEAgIPZBYGAgEPFgIfBGhkAgMPFggeDEhpZGRlblNjcmlwdAVrRW5zdXJlU2NyaXB0RnVuYygnb2ZmbGluZS5qcycsICdUYWtlT2ZmbGluZURpc2FibGVkJywgZnVuY3Rpb24gKCkgeyBUYWtlT2ZmbGluZURpc2FibGVkKDEsIDUzLCAtMSwgLTEpOyB9KTseE0NsaWVudE9uQ2xpY2tTY3JpcHQFuAFFbnN1cmVTY3JpcHRGdW5jKCdvZmZsaW5lLmpzJywgJ1Rha2VPZmZsaW5lVG9DbGllbnRSZWFsJywgZnVuY3Rpb24gKCkgeyBUYWtlT2ZmbGluZVRvQ2xpZW50UmVhbCgxLCA1MywgJ2h0dHBzOlx1MDAyZlx1MDAyZm1zZGVjLmdvdi5tdFx1MDAyZmVuXHUwMDJmYXJwYScsIC0xLCAtMSwgJycpO30pOyByZXR1cm4gZmFsc2U7HhhDbGllbnRPbkNsaWNrTmF2aWdhdGVVcmxkHihDbGllbnRPbkNsaWNrU2NyaXB0Q29udGFpbmluZ1ByZWZpeGVkVXJsZGQCBQ8WAh8EaGQCAw8PFgoeCUFjY2Vzc0tleQUBLx4PQXJyb3dJbWFnZVdpZHRoAgUeEEFycm93SW1hZ2VIZWlnaHQCAx4RQXJyb3dJbWFnZU9mZnNldFhmHhFBcnJvd0ltYWdlT2Zmc2V0WQLrA2RkAgMPZBYCAgEPZBYCAgMPZBYCAgEPPCsABQEADxYCHg9TaXRlTWFwUHJvdmlkZXIFEVNQU2l0ZU1hcFByb3ZpZGVyZGQCAQ9kFgQCBQ9kFgICAQ8QFgIfBGhkFCsBAGQCBw9kFgJmD2QWAmYPPCsABgBkAg0PZBYIAgYPZBYCZg9kFgRmD2QWBAICDxYCHgRUZXh0BQdFbmdsaXNoZAIGDxYCHwRoZAICDxYCHwRoZAIKD2QWBgIBD2QWBAIBDw8WBB8PBQZTaWduVXAeC05hdmlnYXRlVXJsBTxodHRwczovL215Z292Lm10L1BPUlRBTC93ZWJmb3Jtcy9ob3dkb2lnZXRhY2Nlc3N0b215Z292LmFzcHhkZAIDD2QWAmYPFgIfDwUHU2lnbiBJbmQCAw8PFgIfBGhkZAIFD2QWBAIBDw8WAh8EaGQWAgIBDw8WBB8QBTdodHRwczovL21zZGVjLmdvdi5tdC9lbi9hcnBhL19sYXlvdXRzL2F1dGhlbnRpY2F0ZS5hc3B4Hw8FB1NpZ24gSW5kZAIDDw8WAh8EaGRkAhAPZBYCAgEPZBYCZg9kFgJmDw9kFgYeBWNsYXNzBSJtcy1zYnRhYmxlIG1zLXNidGFibGUtZXggczQtc2VhcmNoHgtjZWxscGFkZGluZwUBMB4LY2VsbHNwYWNpbmcFATAWAmYPZBYCAgEPZBYCAgEPFgIfEQUWc3JjaC1BdXRvQ29tcENvbnRhaW5lchYCZg8WAh8RBRRzcmNoLUF1dG9Db21wRHJvcEltZ2QCEg9kFggCAg9kFgZmDxYCHwRoZAICDxYCHwRoZAIEDw8WAh8EaGRkAgMPFgIfDwX8KTxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+VEhFIE1JTklTVFJZDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2NhcmV0Jz48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9J2Ryb3Bkb3duLW1lbnUnPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2VuL1BhZ2VzL1RoZS1NaW5pc3Rlci5hc3B4Jz5UaGUgTWluaXN0ZXI8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vYWdyaWN1bHR1cmVjbXMuZ292Lm10L2VuL1BhZ2VzL1BhcmxpYW1lbnRhcnktU2VjcmV0YXJpYXQuYXNweCc+UGFybGlhbWVudGFyeSBTZWNyZXRhcnk8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9jb250YWN0ZGV0YWlscy5hc3B4Jz5Db250YWN0IERldGFpbHM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9Qb3J0Zm9saW8uYXNweCc+UG9ydGZvbGlvPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvRnJlZWRvbSUyMG9mJTIwSW5mb3JtYXRpb24vRnJlZWRvbS1vZi1JbmZvcm1hdGlvbi5hc3B4Jz5GcmVlZG9tIG9mIEluZm9ybWF0aW9uPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvTGlua3MuYXNweCc+TGlua3M8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+REVQQVJUTUVOVFMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nY2FyZXQnPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0nZHJvcGRvd24tbWVudSc+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vYWdyaWN1bHR1cmUuZ292Lm10Jz5BZ3JpY3VsdHVyZTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9hZ3JpY3VsdHVyZS5nb3YubXQvZW4vdnByZC9QYWdlcy9ob21lLmFzcHgnPlZldGVyaW5hcnkgYW5kIFBoeXRvc2FuaXRhcnkgUmVndWxhdGlvbiBEaXZpc2lvbjwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cDovL2FycGEuZ292Lm10Jz5BZ3JpY3VsdHVyZSBhbmQgUnVyYWwgUGF5bWVudHMgQWdlbmN5IChBUlBBKTwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nL2VuL2RlY2MvUGFnZXMvZGVjYy5hc3B4Jz5FbnZpcm9ubWVudCBhbmQgQ2xpbWF0ZSBDaGFuZ2U8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9zdXN0YWluYWJsZWRldmVsb3BtZW50L1BhZ2VzL3N1c3RhaW5hYmxlZGV2ZWxvcG1lbnQuYXNweCc+U3VzdGFpbmFibGUgRGV2ZWxvcG1lbnQ8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2h0dHBzOi8vYWdyaWN1bHR1cmVjbXMuZ292Lm10L2VuL2FncmljL1BhZ2VzL0RDRC9kY2QuYXNweCc+RGl2ZXJzaWZpY2F0aW9uIGFuZCBDb21wZXRpdGl2ZW5lc3M8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9QQVJLUy9QQVJLUy5hc3B4Jz5QLkEuUi5LLlM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9XQlJVL1dpbGQtQmlyZHMtUmVndWxhdGlvbi1Vbml0LmFzcHgnPldpbGQgQmlyZHMgUmVndWxhdGlvbiBVbml0PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwczovL2FncmljdWx0dXJlY21zLmdvdi5tdC9lbi9maXNoZXJpZXMvUGFnZXMvaG9tZS5hc3B4Jz5GaXNoZXJpZXM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+TmV3cyBhbmQgUHJlc3MgUmVsZWFzZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nY2FyZXQnPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0nZHJvcGRvd24tbWVudSc+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vR292ZXJubWVudC9wcmVzcyUyMHJlbGVhc2VzL1BhZ2VzL1ByZXNzLVJlbGVhc2VzLmFzcHgnPk5ld3MgYW5kIFByZXNzIFJlbGVhc2VzPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvUHVibGlzaGVkLVJlc3VsdHMuYXNweCc+UHVibGlzaGVkIFJlc3VsdHM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+VGVuZGVycyBhbmQgUXVvdGF0aW9ucw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjYXJldCc+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSdkcm9wZG93bi1tZW51Jz48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9UZW5kZXJzJTIwYW5kJTIwUXVvdGF0aW9ucy9QYWdlcy9leHByZXNzaW9uT2ZJbnRlcmVzdDIwMTcuYXNweCc+RXhwcmVzc2lvbiBvZiBJbnRlcmVzdCAyMDE3PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vVGVuZGVycyUyMGFuZCUyMFF1b3RhdGlvbnMvUGFnZXMvdGVuZGVyczIwMTcuYXNweCc+VGVuZGVycyAyMDE3PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vVGVuZGVycyUyMGFuZCUyMFF1b3RhdGlvbnMvUGFnZXMvcXVvdGF0aW9uczIwMTcuYXNweCc+UXVvdGF0aW9ucyAyMDE3PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vUGFnZXMvdGVuZGVyc0FuZFF1b3RhdGlvbnMvY29uY2Vzc2lvbnMyMDE3LmFzcHgnPkNvbmNlc3Npb25zIDIwMTc8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9UZW5kZXJzJTIwYW5kJTIwUXVvdGF0aW9ucy9QYWdlcy9FeHByZXNzaW9uLW9mLUludGVyZXN0LTIwMTguYXNweCc+RXhwcmVzc2lvbiBvZiBJbnRlcmVzdCAyMDE4PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvZW4vVGVuZGVycyUyMGFuZCUyMFF1b3RhdGlvbnMvUGFnZXMvQ29uY2Vzc2lvbnMtMjAxOC5hc3B4Jz5Db25jZXNzaW9ucyAyMDE4PC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+PC91bD4NCiAgICAgICAgICAgICAgICAgICAgPC9saT48bGkgY2xhc3M9J2Ryb3Bkb3duJz48YSBocmVmPScjJyBjbGFzcz0nZHJvcGRvd24tdG9nZ2xlJyBkYXRhLXRvZ2dsZT0nZHJvcGRvd24nPkRvd25sb2Fkcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjYXJldCc+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSdkcm9wZG93bi1tZW51Jz48L3VsPg0KICAgICAgICAgICAgICAgICAgICA8L2xpPjxsaSBjbGFzcz0nZHJvcGRvd24nPjxhIGhyZWY9JyMnIGNsYXNzPSdkcm9wZG93bi10b2dnbGUnIGRhdGEtdG9nZ2xlPSdkcm9wZG93bic+Q29udGFjdCBVcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjYXJldCc+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSdkcm9wZG93bi1tZW51Jz48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9Db250YWN0LVVzLmFzcHgnPkNvbnRhY3QgVXM8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT48bGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy9lbi9QYWdlcy9GZWVkYmFjay5hc3B4Jz5GZWVkYmFjazwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPjwvdWw+DQogICAgICAgICAgICAgICAgICAgIDwvbGk+ZAIED2QWAmYPEGQPFgFmFgEQBQdFbmdsaXNoBQUvYXJwYWcWAWZkAgYPZBYGZg8WAh8EaGQCAg8WAh8EaGQCBA8PFgIfBGdkFgICAQ9kFgJmDxYCHw8FB1NpZ24gSW5kAhEPZBYCAgEPZBYCZg9kFgICAw9kFgICBQ8PFgQeBkhlaWdodBsAAAAAAAB5QAEAAAAfAgKAAWQWAgIBDzwrAAkBAA8WBB4NUGF0aFNlcGFyYXRvcgQIHg1OZXZlckV4cGFuZGVkZ2RkZF7fUomcxRsPajUfyB9MvM+rgC5uaT00TdB3rmZIAAZR',\n", + " '__VIEWSTATEGENERATOR': 'BAB98CB3',\n", + " '__SCROLLPOSITIONX': '0',\n", + " '__SCROLLPOSITIONY': '0',\n", + " '__EVENTVALIDATION': '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',\n", + " 'ctl00$PlaceHolderSearchArea$ctl01$SBScopesDDL': 'https://msdec.gov.mt/en/Search/Pages/results.aspx',\n", + " 'InputKeywords': 'Search',\n", + " 'ctl00$PlaceHolderSearchArea$ctl01$ctl06': '0',\n", + " 'search': '0',\n", + " 'ctl00$ctl42$variationsLabelMobileControl$ddlVariationlabels': '/arpa',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$ctl01': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo1': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo2': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$ctl05': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$ctl07': '',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo5': '2017',\n", + " 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$FilterButton': ' Search ',\n", + " '__spDummyText1': '',\n", + " '__spDummyText2': '',\n", + " 'hiddenInputToUpdateATBuffer_CommonToolkitScripts': '1'\n", + "}\n", + "\n", + "response = requests.post('https://msdec.gov.mt/en/arpa/Pages/Payments.aspx', headers=headers, cookies=cookies, data=data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "form_data.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for k in data:\n", + " if k not in form_data:\n", + " print(k)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# display(HTML(response.text))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/nl/README.md b/countries/nl/README.md similarity index 100% rename from nl/README.md rename to countries/nl/README.md diff --git a/nl/nl_scraper.py b/countries/nl/nl_scraper.py similarity index 100% rename from nl/nl_scraper.py rename to countries/nl/nl_scraper.py diff --git a/pl/README.md b/countries/pl/README.md similarity index 100% rename from pl/README.md rename to countries/pl/README.md diff --git a/countries/pl/pl_scraper.ipynb b/countries/pl/pl_scraper.ipynb new file mode 100644 index 0000000..6c3cc84 --- /dev/null +++ b/countries/pl/pl_scraper.ipynb @@ -0,0 +1,637 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'tqdm.notebook.tqdm'; 'tqdm.notebook' is not a package", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[22], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtqdm\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mnotebook\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtqdm\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tqdm\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mslugify\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m slugify\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'tqdm.notebook.tqdm'; 'tqdm.notebook' is not a package" + ] + } + ], + "source": [ + "import requests\n", + "import os\n", + "import gzip\n", + "import glob\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from tqdm.notebook import tqdm\n", + "\n", + "from slugify import slugify" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "314" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "YEAR = 2023\n", + "START_AMOUNT = 420000 # PLN, roughly 100k EUR\n", + "MAX_DIV = 300\n", + "# Both ranges are non-inclusive!\n", + "RANGES = [START_AMOUNT // i for i in range(1, MAX_DIV)] + [i for i in range(START_AMOUNT // MAX_DIV, 0, -100)] + [0]\n", + "len(RANGES)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# These break the export, probably because of non-windows-1250 characters\n", + "# The downloader queries around these sums and so these recipients are missing from the years\n", + "SPECIALS = {\n", + " 2015: [\n", + " 21016.97, # http://beneficjenciwpr.minrol.gov.pl/outrecords/view/12485559\n", + " 51755.63, # http://beneficjenciwpr.minrol.gov.pl/outrecords/view/13334673\n", + " ],\n", + " 2016: [\n", + " 18805.66, # http://beneficjenciwpr.minrol.gov.pl/outrecords/view/16350294\n", + " ],\n", + " 2017: [\n", + " \n", + " ]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_URL = 'http://beneficjenciwpr.minrol.gov.pl/search/export/csv/'" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "params = {'year': YEAR, 'totalfrom': 420000, 'totalto': None}\n", + "\n", + "def get_url(params):\n", + " return BASE_URL + '/'.join('{k}:{v}'.format(k=k, v=str(v).replace(\".\", \",\"))\n", + " for k, v in params.items() if v is not None) + '/sort:total/direction:asc'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def download(year, amount, total_to):\n", + " url = get_url({'year': year, 'totalfrom': amount, 'totalto': total_to})\n", + " filename = 'data/{year}_{amount}_{total_to}.csv.gz'.format(year=year, amount=amount, total_to=total_to)\n", + " if os.path.exists(filename):\n", + " return\n", + " print(filename, url)\n", + " response = requests.get(url, stream=True)\n", + " with gzip.open(filename, 'wb') as f:\n", + " for chunk in response.iter_content(chunk_size=1024): \n", + " if chunk:\n", + " f.write(chunk)\n", + "\n", + " \n", + "def start(year):\n", + " specials = SPECIALS.get(year, [])\n", + " total_to = None\n", + " for amount in RANGES:\n", + " print(amount, total_to)\n", + " specs = []\n", + " if total_to is not None:\n", + " specs = [s for s in specials if amount < s < total_to]\n", + " if specs:\n", + " download(year, amount, specs[0])\n", + " download(year, specs[0], total_to)\n", + " else:\n", + " download(year, amount, total_to)\n", + " total_to = amount+0.001" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data/2023_0_1000.csv.gz http://beneficjenciwpr.minrol.gov.pl/search/export/csv/year:2023/totalfrom:0/totalto:1000/sort:total/direction:asc\n" + ] + } + ], + "source": [ + "download(2023, 0, 1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "def get_year(year):\n", + " for filename in (glob.glob('data/{}_*.csv.gz'.format(year))):\n", + " print(filename)\n", + " yield pd.read_csv(filename, compression='gzip', encoding='windows-1250', sep=';')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# with gzip.open('data/2016_11666_12000.001.csv.gz') as f:\n", + "# print(f.read()[:10400].decode('windows-1250'))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def apply_fixes(df):\n", + " df = df.rename(columns={\n", + " 'Imię': 'recipient_firstname',\n", + " 'Nazwisko': 'recipient_lastname',\n", + " 'Nazwa': 'recipient_name',\n", + " 'Gmina': 'recipient_location',\n", + " 'Kod pocztowy': 'recipient_postcode',\n", + " 'Rok': 'year'\n", + " })\n", + " df = df.drop(columns=['Suma'])\n", + " df['recipient_firstname'] = df['recipient_firstname'].fillna('').apply(str)\n", + " df['recipient_lastname'] = df['recipient_lastname'].fillna('').apply(str)\n", + " df['recipient_name'] = df['recipient_name'].where(df['recipient_name'].notnull(),\n", + " df['recipient_firstname'] + ' ' + df['recipient_lastname'])\n", + "\n", + " anonymous = 'Małe gospodarstwo'\n", + " df['recipient_name'] = df['recipient_name'].str.replace(anonymous, '').str.strip()\n", + " df = df.drop(columns=['recipient_firstname', 'recipient_lastname'])\n", + " df['recipient_id'] = df.apply(lambda x: '%s-%s-%s' % (slugify(x['recipient_name']), x['recipient_postcode'], x['year']), 1)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_year(2023)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data/2023_0_1000.csv.gz\n" + ] + }, + { + "ename": "ParserError", + "evalue": "Error tokenizing data. C error: Expected 1 fields in line 7, saw 2\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mParserError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[38], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mget_year\u001b[49m\u001b[43m(\u001b[49m\u001b[43mYEAR\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m df \u001b[38;5;241m=\u001b[39m apply_fixes(df)\n\u001b[1;32m 3\u001b[0m df\u001b[38;5;241m.\u001b[39mhead()\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/core/reshape/concat.py:382\u001b[0m, in \u001b[0;36mconcat\u001b[0;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m copy \u001b[38;5;129;01mand\u001b[39;00m using_copy_on_write():\n\u001b[1;32m 380\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 382\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_Concatenator\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 386\u001b[0m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 387\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 388\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevels\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevels\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 389\u001b[0m \u001b[43m \u001b[49m\u001b[43mnames\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnames\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 390\u001b[0m \u001b[43m \u001b[49m\u001b[43mverify_integrity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverify_integrity\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 391\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 392\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 393\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 395\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result()\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/core/reshape/concat.py:445\u001b[0m, in \u001b[0;36m_Concatenator.__init__\u001b[0;34m(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)\u001b[0m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mverify_integrity \u001b[38;5;241m=\u001b[39m verify_integrity\n\u001b[1;32m 443\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy \u001b[38;5;241m=\u001b[39m copy\n\u001b[0;32m--> 445\u001b[0m objs, keys \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_clean_keys_and_objs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;66;03m# figure out what our result ndim is going to be\u001b[39;00m\n\u001b[1;32m 448\u001b[0m ndims \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_ndims(objs)\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/core/reshape/concat.py:504\u001b[0m, in \u001b[0;36m_Concatenator._clean_keys_and_objs\u001b[0;34m(self, objs, keys)\u001b[0m\n\u001b[1;32m 502\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m [objs[k] \u001b[38;5;28;01mfor\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m keys]\n\u001b[1;32m 503\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 504\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(objs_list) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo objects to concatenate\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[0;32mIn[32], line 4\u001b[0m, in \u001b[0;36mget_year\u001b[0;34m(year)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m filename \u001b[38;5;129;01min\u001b[39;00m (glob\u001b[38;5;241m.\u001b[39mglob(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata/\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m_*.csv.gz\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mformat(year))):\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(filename)\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilename\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mgzip\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mwindows-1250\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m;\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1026\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[1;32m 1013\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 1014\u001b[0m dialect,\n\u001b[1;32m 1015\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1022\u001b[0m dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[1;32m 1023\u001b[0m )\n\u001b[1;32m 1024\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m-> 1026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/readers.py:626\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 623\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n\u001b[1;32m 625\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m parser:\n\u001b[0;32m--> 626\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mparser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnrows\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1923\u001b[0m, in \u001b[0;36mTextFileReader.read\u001b[0;34m(self, nrows)\u001b[0m\n\u001b[1;32m 1916\u001b[0m nrows \u001b[38;5;241m=\u001b[39m validate_integer(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnrows\u001b[39m\u001b[38;5;124m\"\u001b[39m, nrows)\n\u001b[1;32m 1917\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1918\u001b[0m \u001b[38;5;66;03m# error: \"ParserBase\" has no attribute \"read\"\u001b[39;00m\n\u001b[1;32m 1919\u001b[0m (\n\u001b[1;32m 1920\u001b[0m index,\n\u001b[1;32m 1921\u001b[0m columns,\n\u001b[1;32m 1922\u001b[0m col_dict,\n\u001b[0;32m-> 1923\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[attr-defined]\u001b[39;49;00m\n\u001b[1;32m 1924\u001b[0m \u001b[43m \u001b[49m\u001b[43mnrows\u001b[49m\n\u001b[1;32m 1925\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1926\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 1927\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclose()\n", + "File \u001b[0;32m~/code/farmsubsidy-scrapers/env/lib/python3.10/site-packages/pandas/io/parsers/c_parser_wrapper.py:234\u001b[0m, in \u001b[0;36mCParserWrapper.read\u001b[0;34m(self, nrows)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlow_memory:\n\u001b[0;32m--> 234\u001b[0m chunks \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_reader\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_low_memory\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnrows\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;66;03m# destructive to chunks\u001b[39;00m\n\u001b[1;32m 236\u001b[0m data \u001b[38;5;241m=\u001b[39m _concatenate_chunks(chunks)\n", + "File \u001b[0;32mparsers.pyx:838\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader.read_low_memory\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:905\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._read_rows\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:874\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._tokenize_rows\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:891\u001b[0m, in \u001b[0;36mpandas._libs.parsers.TextReader._check_tokenize_status\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mparsers.pyx:2061\u001b[0m, in \u001b[0;36mpandas._libs.parsers.raise_parser_error\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mParserError\u001b[0m: Error tokenizing data. C error: Expected 1 fields in line 7, saw 2\n" + ] + } + ], + "source": [ + "df = pd.concat(get_year(YEAR))\n", + "df = apply_fixes(df)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'df' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[39], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mlen\u001b[39m(\u001b[43mdf\u001b[49m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'df' is not defined" + ] + } + ], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "cols = 'recipient_name|recipient_location|recipient_id|recipient_postcode|year'.split('|')\n", + "scheme_cols = list(set(df.columns) - set(cols))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "102" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(scheme_cols)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# df['Suma'] = pd.to_numeric(df['Suma'].str.replace(',', '.'))\n", + "for c in scheme_cols:\n", + " df[c] = pd.to_numeric(df[c].str.replace(',', '.'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# mismatch = np.isclose(df[scheme_cols].sum(1), df['Suma'] , atol=1)\n", + "# len(df) - mismatch.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_locationrecipient_idrecipient_postcodeyearschemeamount
0KOŁO ŁOWIECKIE PUSZCZA W BIAŁOWIEŻYBIAŁOWIEŻAkolo-lowieckie-puszcza-w-bialowiezy-17-230-201717-2302017III.4 Program dla sektora owocow i warzyw0.0
1\"PRZEDSIĘBIORSTWO PRODUKCYJNO-HANDLOWO-USŁUGOW...BUKprzedsiebiorstwo-produkcyjno-handlowo-uslugowe...64-3202017III.4 Program dla sektora owocow i warzyw0.0
2ROBERT NOWOROLNIK - GOSPODARSTWO ROLNEJODŁOWNIKrobert-noworolnik-gospodarstwo-rolne-34-620-201734-6202017III.4 Program dla sektora owocow i warzyw0.0
3JUSTYNA ROZMIAREK GOSPODARSTWO ROLNEKÓRNIKjustyna-rozmiarek-gospodarstwo-rolne-62-035-201762-0352017III.4 Program dla sektora owocow i warzyw0.0
4ROLNICZO WYTWÓRCZY KOMBINAT SPÓŁDZIELCZY IM, A...LEŻAJSKrolniczo-wytworczy-kombinat-spoldzielczy-im-an...37-3052017III.4 Program dla sektora owocow i warzyw0.0
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_location \\\n", + "0 KOŁO ŁOWIECKIE PUSZCZA W BIAŁOWIEŻY BIAŁOWIEŻA \n", + "1 \"PRZEDSIĘBIORSTWO PRODUKCYJNO-HANDLOWO-USŁUGOW... BUK \n", + "2 ROBERT NOWOROLNIK - GOSPODARSTWO ROLNE JODŁOWNIK \n", + "3 JUSTYNA ROZMIAREK GOSPODARSTWO ROLNE KÓRNIK \n", + "4 ROLNICZO WYTWÓRCZY KOMBINAT SPÓŁDZIELCZY IM, A... LEŻAJSK \n", + "\n", + " recipient_id recipient_postcode year \\\n", + "0 kolo-lowieckie-puszcza-w-bialowiezy-17-230-2017 17-230 2017 \n", + "1 przedsiebiorstwo-produkcyjno-handlowo-uslugowe... 64-320 2017 \n", + "2 robert-noworolnik-gospodarstwo-rolne-34-620-2017 34-620 2017 \n", + "3 justyna-rozmiarek-gospodarstwo-rolne-62-035-2017 62-035 2017 \n", + "4 rolniczo-wytworczy-kombinat-spoldzielczy-im-an... 37-305 2017 \n", + "\n", + " scheme amount \n", + "0 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "1 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "2 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "3 III.4 Program dla sektora owocow i warzyw 0.0 \n", + "4 III.4 Program dla sektora owocow i warzyw 0.0 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final = pd.melt(df, id_vars=cols, var_name='scheme', value_name='amount', value_vars=scheme_cols)\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recipient_namerecipient_locationrecipient_idrecipient_postcodeyearschemeamountcountrycurrency
48336PRZEDSZKOLE NR 1 W NOWEJ DĘBIENOWA DĘBAprzedszkole-nr-1-w-nowej-debie-39-460-201739-4602017III.4 Program dla sektora owocow i warzyw1893.11PLPLN
50864PRZEDSZKOLE MIEJSKIE Z ODDZIAŁEM SPECJALNYM I ...MIŃSK MAZOWIECKIprzedszkole-miejskie-z-oddzialem-specjalnym-i-...05-3002017III.4 Program dla sektora owocow i warzyw1405.63PLPLN
52683PRZEDSZKOLE NR 3PŁOŃSKprzedszkole-nr-3-09-100-201709-1002017III.4 Program dla sektora owocow i warzyw3675.68PLPLN
81305\"PRZEDSZKOLE NR 9 IM, \"\"JASIA I MAŁGOSI\"\"\"WOŁOMINprzedszkole-nr-9-im-jasia-i-malgosi-05-200-201705-2002017III.4 Program dla sektora owocow i warzyw3445.94PLPLN
87817ZESPÓŁ SZKÓŁ LEŚNYCH IM, UNII EUROPEJSKIEJ W ...RUCIANE-NIDAzespol-szkol-lesnych-im-unii-europejskiej-w-ru...12-2202017III.4 Program dla sektora owocow i warzyw6034.09PLPLN
\n", + "
" + ], + "text/plain": [ + " recipient_name recipient_location \\\n", + "48336 PRZEDSZKOLE NR 1 W NOWEJ DĘBIE NOWA DĘBA \n", + "50864 PRZEDSZKOLE MIEJSKIE Z ODDZIAŁEM SPECJALNYM I ... MIŃSK MAZOWIECKI \n", + "52683 PRZEDSZKOLE NR 3 PŁOŃSK \n", + "81305 \"PRZEDSZKOLE NR 9 IM, \"\"JASIA I MAŁGOSI\"\"\" WOŁOMIN \n", + "87817 ZESPÓŁ SZKÓŁ LEŚNYCH IM, UNII EUROPEJSKIEJ W ... RUCIANE-NIDA \n", + "\n", + " recipient_id recipient_postcode \\\n", + "48336 przedszkole-nr-1-w-nowej-debie-39-460-2017 39-460 \n", + "50864 przedszkole-miejskie-z-oddzialem-specjalnym-i-... 05-300 \n", + "52683 przedszkole-nr-3-09-100-2017 09-100 \n", + "81305 przedszkole-nr-9-im-jasia-i-malgosi-05-200-2017 05-200 \n", + "87817 zespol-szkol-lesnych-im-unii-europejskiej-w-ru... 12-220 \n", + "\n", + " year scheme amount country \\\n", + "48336 2017 III.4 Program dla sektora owocow i warzyw 1893.11 PL \n", + "50864 2017 III.4 Program dla sektora owocow i warzyw 1405.63 PL \n", + "52683 2017 III.4 Program dla sektora owocow i warzyw 3675.68 PL \n", + "81305 2017 III.4 Program dla sektora owocow i warzyw 3445.94 PL \n", + "87817 2017 III.4 Program dla sektora owocow i warzyw 6034.09 PL \n", + "\n", + " currency \n", + "48336 PLN \n", + "50864 PLN \n", + "52683 PLN \n", + "81305 PLN \n", + "87817 PLN " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final = df_final[(df_final['amount'] != 0.0) & df_final['amount'].notnull()]\n", + "df_final['country'] = 'PL'\n", + "df_final['currency'] = 'PLN'\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "df_final.to_csv('pl_{}.csv.gz'.format(YEAR), compression='gzip', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pl/pl_scraper.ipynb b/countries/pl/pl_scraper_2.ipynb similarity index 99% rename from pl/pl_scraper.ipynb rename to countries/pl/pl_scraper_2.ipynb index c13f94f..4d1845d 100644 --- a/pl/pl_scraper.ipynb +++ b/countries/pl/pl_scraper_2.ipynb @@ -852,7 +852,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -866,9 +866,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.10.14" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/countries/pl/pl_scraper_3.ipynb b/countries/pl/pl_scraper_3.ipynb new file mode 100644 index 0000000..ba0f04d --- /dev/null +++ b/countries/pl/pl_scraper_3.ipynb @@ -0,0 +1,675 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import gzip\n", + "import glob\n", + "import time\n", + "\n", + "import requests\n", + "import backoff\n", + "from requests.exceptions import ConnectionError\n", + "\n", + "from joblib import Parallel, delayed\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "from tqdm.notebook import tqdm\n", + "\n", + "from slugify import slugify" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "YEAR = 2022\n", + "ANON_NEEDLE = \"MAŁE GOSPODARSTWO\"\n", + "# All amounts in PLN\n", + "AMOUNT_CUTOFF = [999_999_999, 10_000_000, 150_000, 125_000, 120_000, 67000, 62000, 50_000, 32_000, 31_000, 16_900, 10750, 3000, 0, -1_0000, -10_000, -9_999_999]\n", + "AMOUNT_STEPS = [None , 20_000_000, 5_000, 1_000, 1_000, 1_000, 100, 100, 10, 10, 10, 10, 10, 1, 10, 100, 100_000]\n", + "\n", + "def get_ranges():\n", + " last_top = None\n", + " for top, step in zip(AMOUNT_CUTOFF, AMOUNT_STEPS):\n", + " if last_top is not None:\n", + " yield from reversed(range(top, last_top, step))\n", + " last_top = top" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "RANGES = []\n", + "for x in get_ranges():\n", + " if x != 0:\n", + " RANGES.append(x)\n", + " else:\n", + " # 0 is not working so make sure to make a range around it\n", + " RANGES.append(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[4, 3, 2, 1, -1, -10, -20, -30, -40, -50, -60, -70, -80, -90]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[r for r in RANGES if -100 < r < 5]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11073" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(RANGES)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "SPECIALS = {\n", + " # Lots of people got these values, so do these with postcode search\n", + " 2020: [\n", + " 120_000,\n", + " 64_000,\n", + " 48_000,\n", + " 20_000,\n", + " 12_000,\n", + " ],\n", + " 2021: [\n", + " 125_000,\n", + " 120_000,\n", + " 68_000,\n", + " 67_000,\n", + " 66_000,\n", + " 64_000,\n", + " 48_000,\n", + " 31_434,\n", + " 20_000,\n", + " 12_000,\n", + " 5_682,\n", + " 5_680,\n", + " 2_225,\n", + " 2_010,\n", + " 2000,\n", + " 1990,\n", + " 1970,\n", + " 1736,\n", + " 1243,\n", + " 1154,\n", + " 1114,\n", + " ], \n", + " 2022: [\n", + " 120_000,\n", + " 47_990,\n", + " 11_990,\n", + " 5_770,\n", + " ] + [48000, 1629, 12000, 1083, 1043, 1222]\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "BASE_URL = 'https://beneficjenciwpr.minrol.gov.pl/search/export/csv/'\n", + "BAD_SENTINEL = b'2}'.format(postal))\n", + "\n", + " \n", + "def start(year, extra_specials=None):\n", + " extra_specials = extra_specials or []\n", + " specials = SPECIALS.get(year, [])\n", + " specials.extend(extra_specials)\n", + " total_to = None\n", + " tasks = []\n", + " for amount in RANGES:\n", + " if total_to is None:\n", + " total_to = amount \n", + " continue\n", + " specs = [s for s in specials if amount <= s < total_to]\n", + " # if a range is special, then iterate over post codes as well\n", + " if specs:\n", + " tasks.append(delayed(download_with_postal)(year, amount, total_to))\n", + " else:\n", + " tasks.append(delayed(download)(year, amount, total_to))\n", + " \n", + " total_to = amount\n", + " Parallel(n_jobs=2, verbose=10, batch_size=5)(tasks)\n", + "\n", + "extra_specials = []\n", + "while True:\n", + " try:\n", + " start(YEAR, extra_specials=extra_specials)\n", + " break\n", + " except ConnectionError as e:\n", + " print(e)\n", + " time.sleep(10)\n", + " except TooMuchException as e:\n", + " print(\"too much at\", e.amount)\n", + " if e.amount in extra_specials:\n", + " print(\"we give up\")\n", + " print(e.url)\n", + " break\n", + " else:\n", + " extra_specials.append(e.amount)\n", + " print(\"retrying!\")\n", + " time.sleep(1)\n", + "print(extra_specials)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def get_year(year):\n", + " for i, filename in enumerate(tqdm(sorted(glob.glob('data/{}_*.csv.gz'.format(year))))):\n", + " if os.stat(filename).st_size <= 50:\n", + " continue\n", + " if i % 1000 == 0:\n", + " print(filename)\n", + " print(filename)\n", + " df = pd.read_csv(filename, compression='gzip', encoding='utf-8-sig', sep=';', engine=\"python\", on_bad_lines=\"warn\")\n", + " df['fn'] = filename\n", + " yield df\n", + "# yield pd.DataFrame(poor_csv_parser(filename))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.concat(get_year(YEAR))\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dupes = df.duplicated(subset=df.columns.tolist()[:-1], keep=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[dupes].head(50)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[dupes].sort_values('Imię')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df['Suma'] = df['Suma'].replace(',', '.', regex=True).astype('float')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_pos = df[df['Suma'] > 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_pos.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df['Suma'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_pos['Suma'].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Suma'] == 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Nazwisko'] == \"1\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Nazwisko'] == \"141098\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Nazwisko'] == \"497873\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Suma'] < -1].count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[df['Suma'] < -1].sort_values('Suma', ascending=False).iloc[101]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "list(df.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def apply_fixes(df):\n", + " df = df.rename(columns={\n", + " 'Imię': 'recipient_firstname',\n", + " 'Nazwisko': 'recipient_lastname',\n", + " 'Nazwa': 'recipient_name',\n", + " 'Gmina': 'recipient_location',\n", + " 'Kod pocztowy': 'recipient_postcode',\n", + " '\\ufeff\\ufeff\\ufeffRok': 'year'\n", + " })\n", + " df = df.drop(columns=['Suma'])\n", + " df['recipient_firstname'] = df['recipient_firstname'].fillna('').apply(str)\n", + " df['recipient_lastname'] = df['recipient_lastname'].fillna('').apply(str)\n", + " df['recipient_name'] = df['recipient_name'].where(df['recipient_name'].notnull(),\n", + " df['recipient_firstname'] + ' ' + df['recipient_lastname'])\n", + "\n", + " anonymous = 'Małe gospodarstwo'\n", + " df['recipient_name'] = df['recipient_name'].str.replace(anonymous, '').str.strip()\n", + " df = df.drop(columns=['recipient_firstname', 'recipient_lastname'])\n", + " df['recipient_id'] = df.apply(lambda x: 'PL-%s-%s' % (x['recipient_postcode'], slugify(x['recipient_name'])), 1)\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = apply_fixes(df)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cols = 'recipient_name|recipient_location|recipient_id|recipient_postcode|year'.split('|')\n", + "scheme_cols = list(set(df.columns) - set(cols))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(scheme_cols)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scheme_cols" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# df['Suma'] = pd.to_numeric(df['Suma'].str.replace(',', '.'))\n", + "# for c in scheme_cols:\n", + "# df[c] = pd.to_numeric(df[c].str.replace(',', '.'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# mismatch = np.isclose(df[scheme_cols].sum(1), df['Suma'] , atol=1)\n", + "# len(df) - mismatch.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = pd.melt(df, id_vars=cols, var_name='scheme', value_name='amount', value_vars=scheme_cols)\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_final = df_final[(df_final['amount'] != 0.0) & df_final['amount'].notnull()]\n", + "df_final['country'] = 'PL'\n", + "df_final['currency'] = 'PLN'\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_final.to_csv('pl_{}.csv.gz'.format(YEAR), compression='gzip', index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pt/README.md b/countries/pt/README.md similarity index 100% rename from pt/README.md rename to countries/pt/README.md diff --git a/pt/pt_scraper.ipynb b/countries/pt/pt_scraper.ipynb similarity index 100% rename from pt/pt_scraper.ipynb rename to countries/pt/pt_scraper.ipynb diff --git a/countries/ro/README.md b/countries/ro/README.md new file mode 100644 index 0000000..0b23a87 --- /dev/null +++ b/countries/ro/README.md @@ -0,0 +1 @@ +# Romania diff --git a/se/README.md b/countries/se/README.md similarity index 100% rename from se/README.md rename to countries/se/README.md diff --git a/se/combine_se.ipynb b/countries/se/combine_se.ipynb similarity index 100% rename from se/combine_se.ipynb rename to countries/se/combine_se.ipynb diff --git a/se/scraper_se.ipynb b/countries/se/scraper_se.ipynb similarity index 100% rename from se/scraper_se.ipynb rename to countries/se/scraper_se.ipynb diff --git a/si/README.md b/countries/si/README.md similarity index 100% rename from si/README.md rename to countries/si/README.md diff --git a/sk/README.md b/countries/sk/README.md similarity index 100% rename from sk/README.md rename to countries/sk/README.md diff --git a/cy/cy_scraper.ipynb b/cy/cy_scraper.ipynb deleted file mode 100644 index 6f498c0..0000000 --- a/cy/cy_scraper.ipynb +++ /dev/null @@ -1,769 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Download XLS\n", - "\n", - "Go here and download latest XLS:\n", - "\n", - "http://www.capo.gov.cy/capo/capo.nsf/All/1DD288DE04712755C2257E5B001E3F7C?OpenDocument" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File ‘cy_2017_raw.xlsx’ already there; not retrieving.\n", - "--2019-11-10 13:14:52-- http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/E8D55487034C5E1BC2257FC4003E8A41/$file/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY%202018.002.xlsx\n", - "Resolving www.capo.gov.cy (www.capo.gov.cy)... 212.31.118.26\n", - "Connecting to www.capo.gov.cy (www.capo.gov.cy)|212.31.118.26|:80... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 10246058 (9.8M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", - "Saving to: ‘cy_2018_raw.xlsx’\n", - "\n", - "cy_2018_raw.xlsx 100%[===================>] 9.77M 1.11MB/s in 9.2s \n", - "\n", - "2019-11-10 13:15:02 (1.06 MB/s) - ‘cy_2018_raw.xlsx’ saved [10246058/10246058]\n", - "\n" - ] - } - ], - "source": [ - "# !wget -nc -O cy_2016_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/AD063B69CE4D0D06C2258131002AA09F/$file/FINAL%20%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202016-%2031.5.17.xlsx'\n", - "!wget -nc -O cy_2017_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/ad063b69ce4d0d06c2258131002aa09f/$FILE/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%202017.xlsx'\n", - "!wget -nc -O cy_2018_raw.xlsx 'http://www.capo.gov.cy/capo/capo.nsf/05082a1738ff5899c225776f002ea4a8/E8D55487034C5E1BC2257FC4003E8A41/$file/%CE%A0%CE%BB%CE%B7%CF%81%CF%89%CE%BC%CE%AD%CF%82%20%CE%94%CE%B9%CE%BA%CE%B1%CE%B9%CE%BF%CF%8D%CF%87%CF%89%CE%BD%20FY%202018.002.xlsx'" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "YEAR = 2018" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['Πληρωμές_Δικαιούχων_FY_2018',\n", - " 'Περιγραφή_Μέτρων__Ελληνικά',\n", - " 'Description_of_Mesaures__EN',\n", - " 'Μέτρα']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "excel = pd.ExcelFile('cy_%s_raw.xlsx' % YEAR)\n", - "excel.sheet_names" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "SHEET_NAME = 'Πληρωμές δικαιούχων FY {}'.format(YEAR) # means 'Beneficiary Payments'\n", - "SHEET_NAME = 'Πληρωμές_Δικαιούχων_FY_2018'" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
ONOMA ΔΙΚΑΟΥΧΟΥ /ΝΑΜΕ OF BENEFICIARYΑΡΙΘΜΟΣ ΑΝΑΦΟΡΑΣ/\n", - "REFERENCE NUMBERΕΠΙΔΟΤΗΣH ΕΓΤΕ/\n", - "SUBSIDY BY EAGF \n", - "€ΕΠΙΔΟΤΗΣΗ ΕΓΤΑΑ/\n", - "SUBSIDY BY EAFRD\n", - " €ΣΥΝΟΛΟ ΕΠΙΔΟΤΗΣΗΣ ΕΓΤΕ ΚΑΙ ΕΓΤΑΑ/\n", - "TOTAL SUBSIDY EAGF AND EAFRD \n", - "€ΕΥΡΩΠΑΪΚΟ ΓΕΩΡΓΙΚΟ ΤΑΜΕΙΟ/ ΕUROPEAN AGRICULTURAL FUNDΚΩΔΙΚΟΣ ΜΕΤΡΟΥ/\n", - "MEASURE CODEΣΥΝΤΟΜΟΣ ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ /\n", - " SHORT MEASURE CODEΠΕΡΙΓΡΑΦΗ ΜΕΤΡΟΥ/ DESCRIPTION OF MEASUREΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ\n", - "/POSTAL CODEΔΗΜΟΣ/ΕΠΑΡΧΙΑ/ΚΟΙΝΟΤΗΤΑ /\n", - " MUNICIPALITY/\n", - "DISTRICT/COMMUNITY
0NaN51956209.45NaN209.45EAGF50301020010026ΙΙ.2Single area payment scheme - without financial...4747ΜΟΝΙΑΤΗΣ
1NaN51956103.14NaN103.14EAGF50301110000005ΙΙ.4Payment for agricultural practices beneficial ...4747ΜΟΝΙΑΤΗΣ
2NaN51956NaN131.6131.60EAFRD50460011341100IV/A.18RD - Measure 134747ΜΟΝΙΑΤΗΣ
3NaN10335089.13NaN89.13EAGF50301020010026ΙΙ.2Single area payment scheme - without financial...6017ΛΑΡΝΑΚΑ
4NaN10335043.89NaN43.89EAGF50301110000005ΙΙ.4Payment for agricultural practices beneficial ...6017ΛΑΡΝΑΚΑ
\n", - "
" - ], - "text/plain": [ - " ONOMA ΔΙΚΑΟΥΧΟΥ /ΝΑΜΕ OF BENEFICIARY ΑΡΙΘΜΟΣ ΑΝΑΦΟΡΑΣ/\\nREFERENCE NUMBER \\\n", - "0 NaN 51956 \n", - "1 NaN 51956 \n", - "2 NaN 51956 \n", - "3 NaN 103350 \n", - "4 NaN 103350 \n", - "\n", - " ΕΠΙΔΟΤΗΣH ΕΓΤΕ/\\nSUBSIDY BY EAGF \\n€ \\\n", - "0 209.45 \n", - "1 103.14 \n", - "2 NaN \n", - "3 89.13 \n", - "4 43.89 \n", - "\n", - " ΕΠΙΔΟΤΗΣΗ ΕΓΤΑΑ/\\nSUBSIDY BY EAFRD\\n € \\\n", - "0 NaN \n", - "1 NaN \n", - "2 131.6 \n", - "3 NaN \n", - "4 NaN \n", - "\n", - " ΣΥΝΟΛΟ ΕΠΙΔΟΤΗΣΗΣ ΕΓΤΕ ΚΑΙ ΕΓΤΑΑ/\\nTOTAL SUBSIDY EAGF AND EAFRD \\n€ \\\n", - "0 209.45 \n", - "1 103.14 \n", - "2 131.60 \n", - "3 89.13 \n", - "4 43.89 \n", - "\n", - " ΕΥΡΩΠΑΪΚΟ ΓΕΩΡΓΙΚΟ ΤΑΜΕΙΟ/ ΕUROPEAN AGRICULTURAL FUND \\\n", - "0 EAGF \n", - "1 EAGF \n", - "2 EAFRD \n", - "3 EAGF \n", - "4 EAGF \n", - "\n", - " ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ/\\nMEASURE CODE \\\n", - "0 50301020010026 \n", - "1 50301110000005 \n", - "2 50460011341100 \n", - "3 50301020010026 \n", - "4 50301110000005 \n", - "\n", - " ΣΥΝΤΟΜΟΣ ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ /\\n SHORT MEASURE CODE \\\n", - "0 ΙΙ.2 \n", - "1 ΙΙ.4 \n", - "2 IV/A.18 \n", - "3 ΙΙ.2 \n", - "4 ΙΙ.4 \n", - "\n", - " ΠΕΡΙΓΡΑΦΗ ΜΕΤΡΟΥ/ DESCRIPTION OF MEASURE \\\n", - "0 Single area payment scheme - without financial... \n", - "1 Payment for agricultural practices beneficial ... \n", - "2 RD - Measure 13 \n", - "3 Single area payment scheme - without financial... \n", - "4 Payment for agricultural practices beneficial ... \n", - "\n", - " ΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ\\n/POSTAL CODE \\\n", - "0 4747 \n", - "1 4747 \n", - "2 4747 \n", - "3 6017 \n", - "4 6017 \n", - "\n", - " ΔΗΜΟΣ/ΕΠΑΡΧΙΑ/ΚΟΙΝΟΤΗΤΑ /\\n MUNICIPALITY/\\nDISTRICT/COMMUNITY \n", - "0 ΜΟΝΙΑΤΗΣ \n", - "1 ΜΟΝΙΑΤΗΣ \n", - "2 ΜΟΝΙΑΤΗΣ \n", - "3 ΛΑΡΝΑΚΑ \n", - "4 ΛΑΡΝΑΚΑ " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = pd.read_excel('cy_%s_raw.xlsx' % YEAR, sheetname=SHEET_NAME)\n", - "original_columns = list(df.columns)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['ONOMA ΔΙΚΑΟΥΧΟΥ /ΝΑΜΕ OF BENEFICIARY',\n", - " 'ΑΡΙΘΜΟΣ ΑΝΑΦΟΡΑΣ/\\nREFERENCE NUMBER',\n", - " 'ΕΠΙΔΟΤΗΣH ΕΓΤΕ/\\nSUBSIDY BY EAGF \\n€',\n", - " 'ΕΠΙΔΟΤΗΣΗ ΕΓΤΑΑ/\\nSUBSIDY BY EAFRD\\n €',\n", - " 'ΣΥΝΟΛΟ ΕΠΙΔΟΤΗΣΗΣ ΕΓΤΕ ΚΑΙ ΕΓΤΑΑ/\\nTOTAL SUBSIDY EAGF AND EAFRD \\n€',\n", - " 'ΕΥΡΩΠΑΪΚΟ ΓΕΩΡΓΙΚΟ ΤΑΜΕΙΟ/ ΕUROPEAN AGRICULTURAL FUND',\n", - " 'ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ/\\nMEASURE CODE',\n", - " 'ΣΥΝΤΟΜΟΣ ΚΩΔΙΚΟΣ ΜΕΤΡΟΥ /\\n SHORT MEASURE CODE',\n", - " 'ΠΕΡΙΓΡΑΦΗ ΜΕΤΡΟΥ/ DESCRIPTION OF MEASURE',\n", - " 'ΤΑΧΥΔΡΟΜΙΚΟΣ ΚΩΔΙΚΑΣ\\n/POSTAL CODE',\n", - " 'ΔΗΜΟΣ/ΕΠΑΡΧΙΑ/ΚΟΙΝΟΤΗΤΑ /\\n MUNICIPALITY/\\nDISTRICT/COMMUNITY']" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "original_columns" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "translations = [\n", - " 'recipient_name',\n", - " 'application_code',\n", - " 'EAGF',\n", - " 'EAFRD',\n", - " 'total',\n", - " 'scheme_name',\n", - " 'scheme_code',\n", - " 'scheme_code_short',\n", - " 'scheme_description',\n", - " 'recipient_postcode',\n", - " 'recipient_location'\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
recipient_nameapplication_codeEAGFEAFRDtotalscheme_namescheme_code_shortscheme_descriptionrecipient_postcoderecipient_locationyearscheme
0NaN51956209.45NaN209.45EAGFΙΙ.2Single area payment scheme - without financial...4747ΜΟΝΙΑΤΗΣ2018ΙΙ.2 - Single area payment scheme - without fi...
1NaN51956103.14NaN103.14EAGFΙΙ.4Payment for agricultural practices beneficial ...4747ΜΟΝΙΑΤΗΣ2018ΙΙ.4 - Payment for agricultural practices bene...
2NaN51956NaN131.6131.60EAFRDIV/A.18RD - Measure 134747ΜΟΝΙΑΤΗΣ2018IV/A.18 - RD - Measure 13
3NaN10335089.13NaN89.13EAGFΙΙ.2Single area payment scheme - without financial...6017ΛΑΡΝΑΚΑ2018ΙΙ.2 - Single area payment scheme - without fi...
4NaN10335043.89NaN43.89EAGFΙΙ.4Payment for agricultural practices beneficial ...6017ΛΑΡΝΑΚΑ2018ΙΙ.4 - Payment for agricultural practices bene...
\n", - "
" - ], - "text/plain": [ - " recipient_name application_code EAGF EAFRD total scheme_name \\\n", - "0 NaN 51956 209.45 NaN 209.45 EAGF \n", - "1 NaN 51956 103.14 NaN 103.14 EAGF \n", - "2 NaN 51956 NaN 131.6 131.60 EAFRD \n", - "3 NaN 103350 89.13 NaN 89.13 EAGF \n", - "4 NaN 103350 43.89 NaN 43.89 EAGF \n", - "\n", - " scheme_code_short scheme_description \\\n", - "0 ΙΙ.2 Single area payment scheme - without financial... \n", - "1 ΙΙ.4 Payment for agricultural practices beneficial ... \n", - "2 IV/A.18 RD - Measure 13 \n", - "3 ΙΙ.2 Single area payment scheme - without financial... \n", - "4 ΙΙ.4 Payment for agricultural practices beneficial ... \n", - "\n", - " recipient_postcode recipient_location year \\\n", - "0 4747 ΜΟΝΙΑΤΗΣ 2018 \n", - "1 4747 ΜΟΝΙΑΤΗΣ 2018 \n", - "2 4747 ΜΟΝΙΑΤΗΣ 2018 \n", - "3 6017 ΛΑΡΝΑΚΑ 2018 \n", - "4 6017 ΛΑΡΝΑΚΑ 2018 \n", - "\n", - " scheme \n", - "0 ΙΙ.2 - Single area payment scheme - without fi... \n", - "1 ΙΙ.4 - Payment for agricultural practices bene... \n", - "2 IV/A.18 - RD - Measure 13 \n", - "3 ΙΙ.2 - Single area payment scheme - without fi... \n", - "4 ΙΙ.4 - Payment for agricultural practices bene... " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df.rename(columns=dict(zip(original_columns, translations)))\n", - "df['year'] = YEAR\n", - "df = df.drop(columns=['scheme_code'])\n", - "df['scheme'] = df.apply(lambda x: '%s - %s' % (x['scheme_code_short'], x['scheme_description']), 1)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# df_2014 = pd.read_excel('BENEFICIARIES_2014_FINAL_v3.xlsx')\n", - "# original_columns = list(df_2014.columns)\n", - "# translations = ('CODE MEASURE (ABB CODE)',\n", - "# 'CODE EPEXIGISIS MEASURE',\n", - "# 'MEASURE', 'CODE APPLICANT', 'NAME / TRADE NAME', 'EAGF', 'EAFRD', 'POSTAL CODE', 'COMMUNITY / DISTRICT')\n", - "# df_2014 = df_2014.rename(columns=dict(zip(original_columns, translations)))\n", - "# df_2014 = df_2014.rename(columns={\n", - "# 'COMMUNITY / DISTRICT': 'recipient_location',\n", - "# 'POSTAL CODE': 'recipient_postcode',\n", - "# 'NAME / TRADE NAME': 'recipient_name',\n", - "# 'CODE EPEXIGISIS MEASURE': 'scheme'\n", - "# }).drop(['CODE MEASURE (ABB CODE)', 'MEASURE'], 1)\n", - "# df_2014['year'] = 2014\n", - "# df_2014.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# There only ever is one value filled EAGF or EAFRD\n", - "((df[['EAGF', 'EAFRD']].fillna(0.0) == 0.0).sum(1) > 1).any()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
recipient_nametotalscheme_namescheme_code_shortscheme_descriptionrecipient_postcoderecipient_locationyearschemecountrycurrencyrecipient_idamount
0NaN209.45EAGFΙΙ.2Single area payment scheme - without financial...4747ΜΟΝΙΑΤΗΣ2018ΙΙ.2 - Single area payment scheme - without fi...CYEURCY-51956209.45
1NaN103.14EAGFΙΙ.4Payment for agricultural practices beneficial ...4747ΜΟΝΙΑΤΗΣ2018ΙΙ.4 - Payment for agricultural practices bene...CYEURCY-51956103.14
2NaN131.60EAFRDIV/A.18RD - Measure 134747ΜΟΝΙΑΤΗΣ2018IV/A.18 - RD - Measure 13CYEURCY-51956131.60
3NaN89.13EAGFΙΙ.2Single area payment scheme - without financial...6017ΛΑΡΝΑΚΑ2018ΙΙ.2 - Single area payment scheme - without fi...CYEURCY-10335089.13
4NaN43.89EAGFΙΙ.4Payment for agricultural practices beneficial ...6017ΛΑΡΝΑΚΑ2018ΙΙ.4 - Payment for agricultural practices bene...CYEURCY-10335043.89
\n", - "
" - ], - "text/plain": [ - " recipient_name total scheme_name scheme_code_short \\\n", - "0 NaN 209.45 EAGF ΙΙ.2 \n", - "1 NaN 103.14 EAGF ΙΙ.4 \n", - "2 NaN 131.60 EAFRD IV/A.18 \n", - "3 NaN 89.13 EAGF ΙΙ.2 \n", - "4 NaN 43.89 EAGF ΙΙ.4 \n", - "\n", - " scheme_description recipient_postcode \\\n", - "0 Single area payment scheme - without financial... 4747 \n", - "1 Payment for agricultural practices beneficial ... 4747 \n", - "2 RD - Measure 13 4747 \n", - "3 Single area payment scheme - without financial... 6017 \n", - "4 Payment for agricultural practices beneficial ... 6017 \n", - "\n", - " recipient_location year scheme \\\n", - "0 ΜΟΝΙΑΤΗΣ 2018 ΙΙ.2 - Single area payment scheme - without fi... \n", - "1 ΜΟΝΙΑΤΗΣ 2018 ΙΙ.4 - Payment for agricultural practices bene... \n", - "2 ΜΟΝΙΑΤΗΣ 2018 IV/A.18 - RD - Measure 13 \n", - "3 ΛΑΡΝΑΚΑ 2018 ΙΙ.2 - Single area payment scheme - without fi... \n", - "4 ΛΑΡΝΑΚΑ 2018 ΙΙ.4 - Payment for agricultural practices bene... \n", - "\n", - " country currency recipient_id amount \n", - "0 CY EUR CY-51956 209.45 \n", - "1 CY EUR CY-51956 103.14 \n", - "2 CY EUR CY-51956 131.60 \n", - "3 CY EUR CY-103350 89.13 \n", - "4 CY EUR CY-103350 43.89 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from slugify import slugify\n", - "\n", - "df['country'] = 'CY'\n", - "df['currency'] = 'EUR'\n", - "\n", - "df['recipient_id'] = df.apply(lambda x: 'CY-%s' % x['application_code'] if pd.notnull(x['application_code']) else\n", - " 'CY-%s-%s' % (x['recipient_postcode'], slugify(\n", - " '' if pd.isnull(x['recipient_name']) else x['recipient_name'])), 1)\n", - "\n", - "df['amount'] = df.apply(lambda x: x[['EAGF', 'EAFRD']].sum(), 1)\n", - "df = df.drop(['application_code', 'EAFRD', 'EAGF'], 1)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_csv('cy_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/dk/README.md b/dk/README.md deleted file mode 100644 index cfe1b1a..0000000 --- a/dk/README.md +++ /dev/null @@ -1,8 +0,0 @@ -Scraper for Denmark -========================= - - - -Download works. - -See scraper/cleaning notebook. diff --git a/fi/README.md b/fi/README.md deleted file mode 100644 index 0788248..0000000 --- a/fi/README.md +++ /dev/null @@ -1,8 +0,0 @@ -Scraper for Finland -========================= - - - -Anything but in-browser scraper seems to be quite difficult. - -FOIA request send on 5th of May to tiedonluovutus@mavi.fi diff --git a/gb/greatbritain-scraper.ipynb b/gb/greatbritain-scraper.ipynb deleted file mode 100644 index 135db29..0000000 --- a/gb/greatbritain-scraper.ipynb +++ /dev/null @@ -1,700 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File '2014_All_CAP_Search_Results_Data_P14.xls' already there; not retrieving.\r\n", - "\r\n" - ] - } - ], - "source": [ - "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2014_All_CAP_Search_Results_Data_P14.xls\"" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2016-06-02 12:01:45-- http://cap-payments.defra.gov.uk/Download/2015_All_CAP_Search_Results_Data_P14.xls\n", - "Resolving cap-payments.defra.gov.uk... 194.1.210.50\n", - "Connecting to cap-payments.defra.gov.uk|194.1.210.50|:80... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 33282560 (32M) [application/vnd.ms-excel]\n", - "Saving to: '2015_All_CAP_Search_Results_Data_P14.xls'\n", - "\n", - "2015_All_CAP_Search 100%[===================>] 31.74M 1.91MB/s in 12s \n", - "\n", - "2016-06-02 12:01:57 (2.72 MB/s) - '2015_All_CAP_Search_Results_Data_P14.xls' saved [33282560/33282560]\n", - "\n" - ] - } - ], - "source": [ - "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2015_All_CAP_Search_Results_Data_P14.xls\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--2018-02-05 11:36:33-- http://cap-payments.defra.gov.uk/Download/2016_All_CAP_Search_Results_Data_P14.xlsx\n", - "Resolving cap-payments.defra.gov.uk... 194.1.210.50\n", - "Connecting to cap-payments.defra.gov.uk|194.1.210.50|:80... connected.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 15767150 (15M) [application/vnd.openxmlformats-officedocument.spreadsheetml.sheet]\n", - "Saving to: ‘2016_All_CAP_Search_Results_Data_P14.xlsx’\n", - "\n", - "2016_All_CAP_Search 100%[===================>] 15.04M 2.35MB/s in 7.7s \n", - "\n", - "2018-02-05 11:36:41 (1.96 MB/s) - ‘2016_All_CAP_Search_Results_Data_P14.xlsx’ saved [15767150/15767150]\n", - "\n" - ] - } - ], - "source": [ - "!wget -nc \"http://cap-payments.defra.gov.uk/Download/2016_All_CAP_Search_Results_Data_P14.xlsx\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "YEAR = 2016" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['DAERA', 'SGRPID', 'WG', 'RPA', 'RPA2']" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "excel_file = pd.ExcelFile('%s_All_CAP_Search_Results_Data_P14.xlsx' % YEAR)\n", - "excel_file.sheet_names" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
YearBeneficiaryCodeBeneficiaryName_F201PostcodePrefix_F202BTownCity_F202CPayingAgencyLinkschemeamount
2614220161341095.0*******BT78OMAGHDAERAPayments to areas facing natural and other spe...209.50
2616220161352021.0*******BT75FIVEMILETOWNDAERAPayments to areas facing natural and other spe...374.40
2619320161162663.0*******BT31CASTLEWELLANDAERAPayments to areas facing natural and other spe...221.93
2621520161004277.0*******BT34NEWRYDAERAPayments to areas facing natural and other spe...176.75
2622920161108471.0*******BT74ENNISKILLENDAERAPayments to areas facing natural and other spe...256.37
\n", - "
" - ], - "text/plain": [ - " Year BeneficiaryCode BeneficiaryName_F201 PostcodePrefix_F202B \\\n", - "26142 2016 1341095.0 ******* BT78 \n", - "26162 2016 1352021.0 ******* BT75 \n", - "26193 2016 1162663.0 ******* BT31 \n", - "26215 2016 1004277.0 ******* BT34 \n", - "26229 2016 1108471.0 ******* BT74 \n", - "\n", - " TownCity_F202C PayingAgencyLink \\\n", - "26142 OMAGH DAERA \n", - "26162 FIVEMILETOWN DAERA \n", - "26193 CASTLEWELLAN DAERA \n", - "26215 NEWRY DAERA \n", - "26229 ENNISKILLEN DAERA \n", - "\n", - " scheme amount \n", - "26142 Payments to areas facing natural and other spe... 209.50 \n", - "26162 Payments to areas facing natural and other spe... 374.40 \n", - "26193 Payments to areas facing natural and other spe... 221.93 \n", - "26215 Payments to areas facing natural and other spe... 176.75 \n", - "26229 Payments to areas facing natural and other spe... 256.37 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "id_vars = ['Year', 'BeneficiaryCode', 'BeneficiaryName_F201',\n", - " 'PostcodePrefix_F202B', 'TownCity_F202C',\n", - "# 'OtherEAGFTotal', 'DirectEAGFTotal', 'RuralDevelopmentTotal', 'Total',\n", - " 'PayingAgencyLink']\n", - "\n", - "\n", - "def get_melted_df(excel_file, sheet_name):\n", - " df_raw = excel_file.parse(sheet_name)\n", - " df_raw = df_raw[df_raw['Year'].notnull()]\n", - " all_columns = list(df_raw.columns)\n", - " value_vars = list(set(all_columns) - set(id_vars))\n", - " df_raw = df_raw.rename(columns={x: x.strip() for x in value_vars})\n", - " value_vars = [v.strip() for v in value_vars]\n", - " df = pd.melt(df_raw, id_vars=id_vars, value_vars=value_vars, var_name='scheme', value_name='amount')\n", - " df = df[df['amount'].notnull()]\n", - " return df\n", - "\n", - "df = pd.concat([get_melted_df(excel_file, sheet) for sheet in excel_file.sheet_names])\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/sw/.virtualenvs/notebook36/lib/python3.6/site-packages/ipykernel_launcher.py:15: FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead\n", - " from ipykernel import kernelapp as app\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
yearrecipient_idrecipient_namerecipient_postcoderecipient_locationagencyschemeamountcountrycurrency
2614220161341095.0NoneBT78OMAGHDAERAPayments to areas facing natural and other spe...209.50GBGBP
2616220161352021.0NoneBT75FIVEMILETOWNDAERAPayments to areas facing natural and other spe...374.40GBGBP
2619320161162663.0NoneBT31CASTLEWELLANDAERAPayments to areas facing natural and other spe...221.93GBGBP
2621520161004277.0NoneBT34NEWRYDAERAPayments to areas facing natural and other spe...176.75GBGBP
2622920161108471.0NoneBT74ENNISKILLENDAERAPayments to areas facing natural and other spe...256.37GBGBP
\n", - "
" - ], - "text/plain": [ - " year recipient_id recipient_name recipient_postcode \\\n", - "26142 2016 1341095.0 None BT78 \n", - "26162 2016 1352021.0 None BT75 \n", - "26193 2016 1162663.0 None BT31 \n", - "26215 2016 1004277.0 None BT34 \n", - "26229 2016 1108471.0 None BT74 \n", - "\n", - " recipient_location agency \\\n", - "26142 OMAGH DAERA \n", - "26162 FIVEMILETOWN DAERA \n", - "26193 CASTLEWELLAN DAERA \n", - "26215 NEWRY DAERA \n", - "26229 ENNISKILLEN DAERA \n", - "\n", - " scheme amount country \\\n", - "26142 Payments to areas facing natural and other spe... 209.50 GB \n", - "26162 Payments to areas facing natural and other spe... 374.40 GB \n", - "26193 Payments to areas facing natural and other spe... 221.93 GB \n", - "26215 Payments to areas facing natural and other spe... 176.75 GB \n", - "26229 Payments to areas facing natural and other spe... 256.37 GB \n", - "\n", - " currency \n", - "26142 GBP \n", - "26162 GBP \n", - "26193 GBP \n", - "26215 GBP \n", - "26229 GBP " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df.rename(columns={\n", - " 'Year': 'year',\n", - " 'BeneficiaryCode': 'recipient_id',\n", - " 'BeneficiaryName_F201': 'recipient_name',\n", - " 'PostcodePrefix_F202B': 'recipient_postcode',\n", - " 'TownCity_F202C': 'recipient_location',\n", - " 'PayingAgencyLink': 'agency',\n", - "})\n", - "df['country'] = 'GB'\n", - "df['currency'] = 'GBP'\n", - "df['year'] = df['year'].astype('int')\n", - "df['recipient_name'] = df['recipient_name'].str.strip()\n", - "df['recipient_postcode'] = df['recipient_postcode'].str.strip()\n", - "df['recipient_location'] = df['recipient_location'].str.strip()\n", - "df.set_value(df['recipient_id'].notnull(), 'recipient_name', None)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
yearrecipient_idrecipient_namerecipient_postcoderecipient_locationagencyschemeamountcountrycurrency
261422016GB-1341095NoneBT78OMAGHDAERAPayments to areas facing natural and other spe...209.50GBGBP
261622016GB-1352021NoneBT75FIVEMILETOWNDAERAPayments to areas facing natural and other spe...374.40GBGBP
261932016GB-1162663NoneBT31CASTLEWELLANDAERAPayments to areas facing natural and other spe...221.93GBGBP
262152016GB-1004277NoneBT34NEWRYDAERAPayments to areas facing natural and other spe...176.75GBGBP
262292016GB-1108471NoneBT74ENNISKILLENDAERAPayments to areas facing natural and other spe...256.37GBGBP
\n", - "
" - ], - "text/plain": [ - " year recipient_id recipient_name recipient_postcode recipient_location \\\n", - "26142 2016 GB-1341095 None BT78 OMAGH \n", - "26162 2016 GB-1352021 None BT75 FIVEMILETOWN \n", - "26193 2016 GB-1162663 None BT31 CASTLEWELLAN \n", - "26215 2016 GB-1004277 None BT34 NEWRY \n", - "26229 2016 GB-1108471 None BT74 ENNISKILLEN \n", - "\n", - " agency scheme amount \\\n", - "26142 DAERA Payments to areas facing natural and other spe... 209.50 \n", - "26162 DAERA Payments to areas facing natural and other spe... 374.40 \n", - "26193 DAERA Payments to areas facing natural and other spe... 221.93 \n", - "26215 DAERA Payments to areas facing natural and other spe... 176.75 \n", - "26229 DAERA Payments to areas facing natural and other spe... 256.37 \n", - "\n", - " country currency \n", - "26142 GB GBP \n", - "26162 GB GBP \n", - "26193 GB GBP \n", - "26215 GB GBP \n", - "26229 GB GBP " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def set_recipient_id(row):\n", - " if pd.isnull(row['recipient_id']):\n", - " row['recipient_id'] = 'GB-%s-%s' % (row['recipient_postcode'], row['recipient_name'])\n", - " else:\n", - " row['recipient_id'] = 'GB-%s' % int(row['recipient_id'])\n", - " return row\n", - "\n", - "df = df.apply(set_recipient_id, axis=1)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1135352" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(df)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Greening: practices beneficial for climate and environment 144673\n", - "Basic payment scheme 144317\n", - "Reimbursement of financial discipline 110149\n", - "Agri-environment-climate 59572\n", - "Redistributive payment 15684\n", - "Payments to areas facing natural and other specific constraints 9074\n", - "Investment in forest area development and improvement of the viability of forests 8974\n", - "Other direct aids 7949\n", - "Investments in physical assets 5311\n", - "Payment for young farmers 4961\n", - "Agri-environment payments 1154\n", - "Animal welfare 1117\n", - "Forest environmental and climate services and forest conservation 728\n", - "Organic farming 604\n", - "Single payment scheme (payments made in 2016) 444\n", - "Restoring agricultural production potential destroyed by natural disaster 360\n", - "Non-productive investments 307\n", - "School milk scheme 249\n", - "Farm and business development 134\n", - "Support for Leader local development 98\n", - "First afforestation of agricultural land 63\n", - "Modernisation of agricultural holdings 61\n", - "Quality schemes for agricultural products and foodstuffs 56\n", - "Aid in fruit and vegetables sector 33\n", - "Infrastructure related to the development and adaptation of agriculture and forestry 32\n", - "Knowledge transfer and information actions 27\n", - "Implementing local development strategies. Quality of life/diversification 27\n", - "Technical assist 20\n", - "Cooperation 20\n", - "Additional amounts of aid 20\n", - "Running the local action group, acquiring skills and animating the territory 16\n", - "First afforestation of non-agricultural land 14\n", - "Basic services and village renewal in rural areas 14\n", - "Technical Assistance 13\n", - "Development of new products, processes and technologies 11\n", - "Improvement of the economic value of forests 10\n", - "Encouragement of tourism activities 10\n", - "Aid for private storage 10\n", - "Adding value to agricultural and forestry products 8\n", - "Implementing local development strategies. Competitiveness 7\n", - "Vocational training and information actions 7\n", - "Basic services for the economy and rural population 7\n", - "Promotion measures 7\n", - "Aid for public storage 6\n", - "Advisory services, farm management and farm relief services 6\n", - "Skills acquisition, animation and implementation of local development strategies 6\n", - "Aid in the apiculture sector 2\n", - "Implementing cooperation projects 2\n", - "Payments to farmers in areas with handicaps, other than mountain areas 1\n", - "Training and information 1\n", - "Name: scheme, dtype: int64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = df[~df['scheme'].isin([x for x in df['scheme'].value_counts().index if x.endswith('Total')])]\n", - "df['scheme'].value_counts()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "df.to_csv('gb_%s.csv.gz' % YEAR, index=False, encoding='utf-8', compression='gzip')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/hu/README.md b/hu/README.md deleted file mode 100644 index 98e5a16..0000000 --- a/hu/README.md +++ /dev/null @@ -1,10 +0,0 @@ -Scraper for Hungary -========================= - - - -Writing a scraper is painful (ASP viewstate). - -Manually downloading CSV files from search by "Alap" and "Forrás" works though. -The individual files are stored in `data/` with the format `$ALAP-$FORRAS-$YEAR.csv`. -The provided Jupyter notebook combines these files and exports them into the necessary CSV. diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..20050a1 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3172 @@ +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "3.0.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "automat" +version = "24.8.1" +description = "Self-service finite-state machines for the programmer on the go." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Automat-24.8.1-py3-none-any.whl", hash = "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a"}, + {file = "automat-24.8.1.tar.gz", hash = "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88"}, +] + +[package.extras] +visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] + +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "24.10.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +files = [ + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "bleach" +version = "6.2.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.9" +files = [ + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, +] + +[package.dependencies] +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.5)"] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "clean-text" +version = "0.6.0" +description = "Functions to preprocess and normalize text." +optional = false +python-versions = ">=3.7" +files = [ + {file = "clean-text-0.6.0.tar.gz", hash = "sha256:8374b385fc2a26e06383f62aed076fa6be115e5832239e2a7fd8b344fa8d2ab2"}, + {file = "clean_text-0.6.0-py3-none-any.whl", hash = "sha256:4fedb156042f192cdef9ed5324b281465f1116aba96791e9289384a2e6bec4da"}, +] + +[package.dependencies] +emoji = ">=1.0.0,<2.0.0" +ftfy = ">=6.0,<7.0" + +[package.extras] +gpl = ["unidecode (>=1.1.1,<2.0.0)"] +sklearn = ["pandas (>=1.0.0,<2.0.0)", "scikit-learn (>=1.0.0,<2.0.0)"] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "constantly" +version = "23.10.4" +description = "Symbolic constants in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9"}, + {file = "constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"}, +] + +[[package]] +name = "cryptography" +version = "44.0.0" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +files = [ + {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, + {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, + {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, + {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, + {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, + {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, + {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + +[[package]] +name = "debugpy" +version = "1.8.9" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, + {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, + {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, + {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, + {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, + {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, + {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, + {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, + {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, + {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, + {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, + {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, + {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, + {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, + {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, + {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, + {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, + {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, + {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, + {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, + {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, + {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, + {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, + {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, + {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, + {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "emoji" +version = "1.7.0" +description = "Emoji for Python" +optional = false +python-versions = "*" +files = [ + {file = "emoji-1.7.0.tar.gz", hash = "sha256:65c54533ea3c78f30d0729288998715f418d7467de89ec258a31c0ce8660a1d1"}, +] + +[package.extras] +dev = ["coverage", "coveralls", "pytest"] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.1.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.16.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "ftfy" +version = "6.3.1" +description = "Fixes mojibake and other problems with Unicode, after the fact" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083"}, + {file = "ftfy-6.3.1.tar.gz", hash = "sha256:9b3c3d90f84fb267fe64d375a07b7f8912d817cf86009ae134aa03e1819506ec"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "hyperlink" +version = "21.0.0" +description = "A featureful, immutable, and correct URL for Python." +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, + {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, +] + +[package.dependencies] +idna = ">=2.5" + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "incremental" +version = "24.7.2" +description = "A small library that versions your Python projects." +optional = false +python-versions = ">=3.8" +files = [ + {file = "incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe"}, + {file = "incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9"}, +] + +[package.dependencies] +setuptools = ">=61.0" +tomli = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +scripts = ["click (>=6.0)"] + +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.30.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, + {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "itemadapter" +version = "0.9.0" +description = "Common interface for data container classes" +optional = false +python-versions = ">=3.8" +files = [ + {file = "itemadapter-0.9.0-py3-none-any.whl", hash = "sha256:cfd108c9d5205d056fcac402ec8f8e9d799ce9066911eec1cd521ea442f87af1"}, + {file = "itemadapter-0.9.0.tar.gz", hash = "sha256:e4f958a6b6b6f5831fa207373010031a0bd7ed0429ddd09b51979c011475cafd"}, +] + +[[package]] +name = "itemloaders" +version = "1.3.2" +description = "Base library for scrapy's ItemLoader" +optional = false +python-versions = ">=3.8" +files = [ + {file = "itemloaders-1.3.2-py3-none-any.whl", hash = "sha256:6a91465f721c7bad8b07e1fbb0560cf99f4845156ed9f7bf2ca424336c6a677c"}, + {file = "itemloaders-1.3.2.tar.gz", hash = "sha256:4faf5b3abe83bf014476e3fd9ccf66867282971d9f1d4e96d9a61b60c3786770"}, +] + +[package.dependencies] +itemadapter = ">=0.1.0" +jmespath = ">=0.9.5" +parsel = ">=1.5.0" + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "json5" +version = "0.10.0" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, + {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, +] + +[package.extras] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.3" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[package.dependencies] +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.14.2" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = ">=5.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.3.3" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.3.3-py3-none-any.whl", hash = "sha256:32a8fd30677e734ffcc3916a4758b9dab21b02015b668c60eb36f84357b7d4b1"}, + {file = "jupyterlab-4.3.3.tar.gz", hash = "sha256:76fa39e548fdac94dc1204af5956c556f54c785f70ee26aa47ea08eda4d5bbcd"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=40.8.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.6.9)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.1.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.4.1)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.2.post3)", "matplotlib (==3.9.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.14.1)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "lxml" +version = "5.3.0" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, + {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, + {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, + {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, + {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, + {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, + {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, + {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, + {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, + {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, + {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, + {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, + {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, + {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, + {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.11)"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nbclient" +version = "0.10.1" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, + {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.16.4" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "numpy" +version = "2.2.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa"}, + {file = "numpy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219"}, + {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e"}, + {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9"}, + {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3"}, + {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83"}, + {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a"}, + {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31"}, + {file = "numpy-2.2.0-cp310-cp310-win32.whl", hash = "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661"}, + {file = "numpy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608"}, + {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da"}, + {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74"}, + {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e"}, + {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b"}, + {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d"}, + {file = "numpy-2.2.0-cp311-cp311-win32.whl", hash = "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410"}, + {file = "numpy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67"}, + {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e"}, + {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038"}, + {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03"}, + {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a"}, + {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef"}, + {file = "numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1"}, + {file = "numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69"}, + {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13"}, + {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671"}, + {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571"}, + {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d"}, + {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742"}, + {file = "numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e"}, + {file = "numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca"}, + {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d"}, + {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529"}, + {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3"}, + {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab"}, + {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72"}, + {file = "numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066"}, + {file = "numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7"}, + {file = "numpy-2.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221"}, + {file = "numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0"}, +] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pandas" +version = "2.2.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parsel" +version = "1.9.1" +description = "Parsel is a library to extract data from HTML and XML using XPath and CSS selectors" +optional = false +python-versions = ">=3.8" +files = [ + {file = "parsel-1.9.1-py2.py3-none-any.whl", hash = "sha256:c4a777ee6c3ff5e39652b58e351c5cf02c12ff420d05b07a7966aebb68ab1700"}, + {file = "parsel-1.9.1.tar.gz", hash = "sha256:14e00dc07731c9030db620c195fcae884b5b4848e9f9c523c6119f708ccfa9ac"}, +] + +[package.dependencies] +cssselect = ">=1.2.0" +jmespath = "*" +lxml = "*" +packaging = "*" +w3lib = ">=1.19.0" + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "platformdirs" +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] + +[[package]] +name = "pluggy" +version = "1.6.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, + {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protego" +version = "0.3.1" +description = "Pure-Python robots.txt parser with support for modern conventions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Protego-0.3.1-py2.py3-none-any.whl", hash = "sha256:2fbe8e9b7a7dbc5016a932b14c98d236aad4c29290bbe457b8d2779666ef7a41"}, + {file = "Protego-0.3.1.tar.gz", hash = "sha256:e94430d0d25cbbf239bc849d86c5e544fbde531fcccfa059953c7da344a1712c"}, +] + +[[package]] +name = "psutil" +version = "6.1.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, +] + +[package.extras] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pyasn1" +version = "0.6.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.1" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydispatcher" +version = "2.0.7" +description = "Multi-producer multi-consumer in-memory signal dispatch system" +optional = false +python-versions = "*" +files = [ + {file = "PyDispatcher-2.0.7-py3-none-any.whl", hash = "sha256:96543bea04115ffde08f851e1d45cacbfd1ee866ac42127d9b476dc5aefa7de0"}, + {file = "PyDispatcher-2.0.7.tar.gz", hash = "sha256:b777c6ad080dc1bad74a4c29d6a46914fa6701ac70f94b0d66fbcfde62f5be31"}, +] + +[package.extras] +dev = ["tox"] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyopenssl" +version = "24.3.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyOpenSSL-24.3.0-py3-none-any.whl", hash = "sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a"}, + {file = "pyopenssl-24.3.0.tar.gz", hash = "sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36"}, +] + +[package.dependencies] +cryptography = ">=41.0.5,<45" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx_rtd_theme"] +test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] + +[[package]] +name = "pypydispatcher" +version = "2.1.2" +description = "Multi-producer-multi-consumer signal dispatching mechanism" +optional = false +python-versions = "*" +files = [ + {file = "PyPyDispatcher-2.1.2.tar.gz", hash = "sha256:b6bec5dfcff9d2535bca2b23c80eae367b1ac250a645106948d315fcfa9130f2"}, +] + +[[package]] +name = "pytest" +version = "8.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"}, + {file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1" +packaging = ">=20" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pytz" +version = "2024.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, +] + +[[package]] +name = "pywin32" +version = "308" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.14" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, + {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, + {file = "pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737"}, + {file = "pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819"}, + {file = "pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd"}, + {file = "pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "queuelib" +version = "1.7.0" +description = "Collection of persistent (disk-based) and non-persistent (memory-based) queues" +optional = false +python-versions = ">=3.8" +files = [ + {file = "queuelib-1.7.0-py2.py3-none-any.whl", hash = "sha256:b07aaa2410caac3a0021ee4f4026acdac992b0fb9a2cbeb34a918617df3c12a7"}, + {file = "queuelib-1.7.0.tar.gz", hash = "sha256:2855162096cf0230510890b354379ea1c0ff19d105d3147d349d2433bb222b08"}, +] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-file" +version = "2.1.0" +description = "File transport adapter for Requests" +optional = false +python-versions = "*" +files = [ + {file = "requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c"}, + {file = "requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658"}, +] + +[package.dependencies] +requests = ">=1.0.0" + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, +] + +[[package]] +name = "scrapy" +version = "2.12.0" +description = "A high-level Web Crawling and Web Scraping framework" +optional = false +python-versions = ">=3.9" +files = [ + {file = "Scrapy-2.12.0-py2.py3-none-any.whl", hash = "sha256:c33e2dc7da42e727390bacb32dd9938a54ac210fa71972b5c392754f478669cd"}, + {file = "scrapy-2.12.0.tar.gz", hash = "sha256:d66d6e76009b12447604196875a463b61d10721140032a8084a0a52df7f4788f"}, +] + +[package.dependencies] +cryptography = ">=37.0.0" +cssselect = ">=0.9.1" +defusedxml = ">=0.7.1" +itemadapter = ">=0.1.0" +itemloaders = ">=1.0.1" +lxml = ">=4.6.0" +packaging = "*" +parsel = ">=1.5.0" +protego = ">=0.1.15" +PyDispatcher = {version = ">=2.0.5", markers = "platform_python_implementation == \"CPython\""} +pyOpenSSL = ">=22.0.0" +PyPyDispatcher = {version = ">=2.1.0", markers = "platform_python_implementation == \"PyPy\""} +queuelib = ">=1.4.2" +service-identity = ">=18.1.0" +tldextract = "*" +Twisted = ">=21.7.0" +w3lib = ">=1.17.0" +"zope.interface" = ">=5.1.0" + +[[package]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "service-identity" +version = "24.2.0" +description = "Service identity verification for pyOpenSSL & cryptography." +optional = false +python-versions = ">=3.8" +files = [ + {file = "service_identity-24.2.0-py3-none-any.whl", hash = "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85"}, + {file = "service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09"}, +] + +[package.dependencies] +attrs = ">=19.1.0" +cryptography = "*" +pyasn1 = "*" +pyasn1-modules = "*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "idna", "mypy", "pyopenssl", "pytest", "types-pyopenssl"] +docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"] +idna = ["idna"] +mypy = ["idna", "mypy", "types-pyopenssl"] +tests = ["coverage[toml] (>=5.0.2)", "pytest"] + +[[package]] +name = "setuptools" +version = "75.6.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + +[[package]] +name = "tldextract" +version = "5.1.3" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +optional = false +python-versions = ">=3.9" +files = [ + {file = "tldextract-5.1.3-py3-none-any.whl", hash = "sha256:78de310cc2ca018692de5ddf320f9d6bd7c5cf857d0fd4f2175f0cdf4440ea75"}, + {file = "tldextract-5.1.3.tar.gz", hash = "sha256:d43c7284c23f5dc8a42fd0fee2abede2ff74cc622674e4cb07f514ab3330c338"}, +] + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" + +[package.extras] +release = ["build", "twine"] +testing = ["mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "syrupy", "tox", "tox-uv", "types-filelock", "types-requests"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "tornado" +version = "6.4.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "twisted" +version = "24.10.0" +description = "An asynchronous networking framework written in Python" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "twisted-24.10.0-py3-none-any.whl", hash = "sha256:67aa7c8aa94387385302acf44ade12967c747858c8bcce0f11d38077a11c5326"}, + {file = "twisted-24.10.0.tar.gz", hash = "sha256:02951299672595fea0f70fa2d5f7b5e3d56836157eda68859a6ad6492d36756e"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +automat = ">=24.8.0" +constantly = ">=15.1" +hyperlink = ">=17.1.1" +incremental = ">=24.7.0" +typing-extensions = ">=4.2.0" +zope-interface = ">=5" + +[package.extras] +all-non-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +conch = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)"] +dev = ["coverage (>=7.5,<8.0)", "cython-test-exception-raiser (>=1.0.2,<2)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "python-subunit (>=1.4,<2.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)"] +dev-release = ["pydoctor (>=23.9.0,<23.10.0)", "pydoctor (>=23.9.0,<23.10.0)", "sphinx (>=6,<7)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "towncrier (>=23.6,<24.0)"] +gtk-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pygobject", "pygobject", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +http2 = ["h2 (>=3.2,<5.0)", "priority (>=1.1.0,<2.0)"] +macos-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +mypy = ["appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "coverage (>=7.5,<8.0)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "idna (>=2.4)", "mypy (==1.10.1)", "mypy-zope (==1.0.6)", "priority (>=1.1.0,<2.0)", "pydoctor (>=23.9.0,<23.10.0)", "pyflakes (>=2.2,<3.0)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "python-subunit (>=1.4,<2.0)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "sphinx (>=6,<7)", "sphinx-rtd-theme (>=1.3,<2.0)", "towncrier (>=23.6,<24.0)", "twistedchecker (>=0.7,<1.0)", "types-pyopenssl", "types-setuptools"] +osx-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyobjc-core", "pyobjc-core", "pyobjc-framework-cfnetwork", "pyobjc-framework-cfnetwork", "pyobjc-framework-cocoa", "pyobjc-framework-cocoa", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)"] +serial = ["pyserial (>=3.0)", "pywin32 (!=226)"] +test = ["cython-test-exception-raiser (>=1.0.2,<2)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "pyhamcrest (>=2)"] +tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"] +windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241206" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "w3lib" +version = "2.2.1" +description = "Library of web-related functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "w3lib-2.2.1-py3-none-any.whl", hash = "sha256:e56d81c6a6bf507d7039e0c95745ab80abd24b465eb0f248af81e3eaa46eb510"}, + {file = "w3lib-2.2.1.tar.gz", hash = "sha256:756ff2d94c64e41c8d7c0c59fea12a5d0bc55e33a531c7988b4a163deb9b07dd"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.9" +files = [ + {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, + {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "zope-interface" +version = "7.2" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zope.interface-7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce290e62229964715f1011c3dbeab7a4a1e4971fd6f31324c4519464473ef9f2"}, + {file = "zope.interface-7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05b910a5afe03256b58ab2ba6288960a2892dfeef01336dc4be6f1b9ed02ab0a"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550f1c6588ecc368c9ce13c44a49b8d6b6f3ca7588873c679bd8fd88a1b557b6"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ef9e2f865721553c6f22a9ff97da0f0216c074bd02b25cf0d3af60ea4d6931d"}, + {file = "zope.interface-7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27f926f0dcb058211a3bb3e0e501c69759613b17a553788b2caeb991bed3b61d"}, + {file = "zope.interface-7.2-cp310-cp310-win_amd64.whl", hash = "sha256:144964649eba4c5e4410bb0ee290d338e78f179cdbfd15813de1a664e7649b3b"}, + {file = "zope.interface-7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1909f52a00c8c3dcab6c4fad5d13de2285a4b3c7be063b239b8dc15ddfb73bd2"}, + {file = "zope.interface-7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ecf2451596f19fd607bb09953f426588fc1e79e93f5968ecf3367550396b22"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033b3923b63474800b04cba480b70f6e6243a62208071fc148354f3f89cc01b7"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a102424e28c6b47c67923a1f337ede4a4c2bba3965b01cf707978a801fc7442c"}, + {file = "zope.interface-7.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25e6a61dcb184453bb00eafa733169ab6d903e46f5c2ace4ad275386f9ab327a"}, + {file = "zope.interface-7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3f6771d1647b1fc543d37640b45c06b34832a943c80d1db214a37c31161a93f1"}, + {file = "zope.interface-7.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:086ee2f51eaef1e4a52bd7d3111a0404081dadae87f84c0ad4ce2649d4f708b7"}, + {file = "zope.interface-7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21328fcc9d5b80768bf051faa35ab98fb979080c18e6f84ab3f27ce703bce465"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd02ec01f4468da0f234da9d9c8545c5412fef80bc590cc51d8dd084138a89"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e7da17f53e25d1a3bde5da4601e026adc9e8071f9f6f936d0fe3fe84ace6d54"}, + {file = "zope.interface-7.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cab15ff4832580aa440dc9790b8a6128abd0b88b7ee4dd56abacbc52f212209d"}, + {file = "zope.interface-7.2-cp312-cp312-win_amd64.whl", hash = "sha256:29caad142a2355ce7cfea48725aa8bcf0067e2b5cc63fcf5cd9f97ad12d6afb5"}, + {file = "zope.interface-7.2-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:3e0350b51e88658d5ad126c6a57502b19d5f559f6cb0a628e3dc90442b53dd98"}, + {file = "zope.interface-7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15398c000c094b8855d7d74f4fdc9e73aa02d4d0d5c775acdef98cdb1119768d"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:802176a9f99bd8cc276dcd3b8512808716492f6f557c11196d42e26c01a69a4c"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb23f58a446a7f09db85eda09521a498e109f137b85fb278edb2e34841055398"}, + {file = "zope.interface-7.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71a5b541078d0ebe373a81a3b7e71432c61d12e660f1d67896ca62d9628045b"}, + {file = "zope.interface-7.2-cp313-cp313-win_amd64.whl", hash = "sha256:4893395d5dd2ba655c38ceb13014fd65667740f09fa5bb01caa1e6284e48c0cd"}, + {file = "zope.interface-7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3a8ffec2a50d8ec470143ea3d15c0c52d73df882eef92de7537e8ce13475e8a"}, + {file = "zope.interface-7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d06db13a30303c08d61d5fb32154be51dfcbdb8438d2374ae27b4e069aac40"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e204937f67b28d2dca73ca936d3039a144a081fc47a07598d44854ea2a106239"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:224b7b0314f919e751f2bca17d15aad00ddbb1eadf1cb0190fa8175edb7ede62"}, + {file = "zope.interface-7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf95683cde5bc7d0e12d8e7588a3eb754d7c4fa714548adcd96bdf90169f021"}, + {file = "zope.interface-7.2-cp38-cp38-win_amd64.whl", hash = "sha256:7dc5016e0133c1a1ec212fc87a4f7e7e562054549a99c73c8896fa3a9e80cbc7"}, + {file = "zope.interface-7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bd449c306ba006c65799ea7912adbbfed071089461a19091a228998b82b1fdb"}, + {file = "zope.interface-7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a19a6cc9c6ce4b1e7e3d319a473cf0ee989cbbe2b39201d7c19e214d2dfb80c7"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cd1790b48c16db85d51fbbd12d20949d7339ad84fd971427cf00d990c1f137"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52e446f9955195440e787596dccd1411f543743c359eeb26e9b2c02b077b0519"}, + {file = "zope.interface-7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad9913fd858274db8dd867012ebe544ef18d218f6f7d1e3c3e6d98000f14b75"}, + {file = "zope.interface-7.2-cp39-cp39-win_amd64.whl", hash = "sha256:1090c60116b3da3bfdd0c03406e2f14a1ff53e5771aebe33fec1edc0a350175d"}, + {file = "zope.interface-7.2.tar.gz", hash = "sha256:8b49f1a3d1ee4cdaf5b32d2e738362c7f5e40ac8b46dd7d1a65e82a4872728fe"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "furo", "repoze.sphinx.autointerface"] +test = ["coverage[toml]", "zope.event", "zope.testing"] +testing = ["coverage[toml]", "zope.event", "zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "ddbdc88a544ec488e37b958f6bdbf5e08c8f4a920e27d705515275ebd5be5a0a" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d57f528 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[tool.poetry] +authors = ["Your Name "] +description = "" +name = "farmsubsidy-scrapers" +readme = "README.md" +version = "0.1.0" + +[tool.poetry.dependencies] +click = "^8.1.7" +joblib = "^1.4.2" +python = "^3.10" +requests = "^2.32.3" +scrapy = "^2.12.0" +tqdm = "^4.67.1" +pandas = "^2.2.3" +python-slugify = "^8.0.4" +pytest = "^8.4.0" +clean-text = "^0.6.0" + +[tool.poetry.group.dev.dependencies] +black = "^24.10.0" +jupyterlab = "^4.3.3" + +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core"] + +[tool.poetry.scripts] +run = "cli:cli" diff --git a/ro/README.md b/ro/README.md deleted file mode 100644 index f5ddabb..0000000 --- a/ro/README.md +++ /dev/null @@ -1,10 +0,0 @@ -Scraper for Romania -========================= - -Possibly somewhere here: - - - - - -No scraper available yet. diff --git a/ro/scraper.py b/ro/scraper.py deleted file mode 100644 index 0aaddb5..0000000 --- a/ro/scraper.py +++ /dev/null @@ -1,122 +0,0 @@ -from datetime import datetime -import csv -import os -import asyncio - -import aiohttp -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import Select -from selenium.webdriver.support import expected_conditions as EC - -import scrapa -from scrapa.selenium import SeleniumMixin - - -class ROScraper(SeleniumMixin, scrapa.Scraper): - BASE_URL = 'http://plati.afir.info/ListePlatiFegaFeadr.aspx' - CONSUMER_COUNT = 1 - - async def start(self): - await self.schedule_many(self.download_year, [2014, 2015]) - - async def get_first_page(self, year): - already_page = 0 - while True: - already_page += 1 - has_page = await self.has_result('%s-%s' % (year, already_page), 'page_data') - if not has_page: - break - return already_page - - @scrapa.store - async def download_year(self, year): - def wait_for_load(session): - WebDriverWait(session.driver, 90).until( - EC.presence_of_element_located((By.XPATH, './/body[not(@class)]'))) - print('Running with', year) - - first_page = await self.get_first_page(year) - ready = True - - if first_page != 1: - ready = False - - with self.selenium(driver_name='phantomjs') as session: - # session.driver.set_window_size(1132, 800) - await session.get(self.BASE_URL) - print('Selecting year', year) - select = Select(session.driver.find_element_by_id("FILTER_AN_FINANCIAR")) - select.select_by_visible_text(str(year)) - session.driver.find_element_by_id('FILTER_BUTTON').click() - await asyncio.sleep(1) - wait_for_load(session) - select = Select(session.driver.find_element_by_id("FILTER_AN_FINANCIAR")) - print('Selected year is', select.first_selected_option.text) - print('Setting order') - order_heading = session.find_elements_by_xpath('.//table[@id="GridView1"]//th')[1] - print(order_heading.text) - order_heading.el.click() - await asyncio.sleep(2) - wait_for_load(session) - print('Starting on page 1') - page_no = 1 - while True: - try: - dom = session.dom() - if not ready: - # Find correct page link site - links = session.driver.find_elements_by_xpath('.//a[contains(@href, "Page$%s")]' % first_page) - if not links: - print('Could not find', first_page, 'advancing...') - # Fail, advance as to next pagination section - session.driver.find_elements_by_xpath('.//a[contains(@href, "Page$")]')[-1].click() - else: - # Success, we are ready to scrape, go to first page - print('Found', first_page, 'start scraping...') - ready = True - links[0].click() - page_no = first_page - - wait_for_load(session) - continue - - print('Saving table %s' % page_no) - await self.save_table(year, dom) - page_no += 1 - links = session.driver.find_elements_by_xpath('.//a[contains(@href, "Page$%s")]' % page_no) - if not links: - print('Found no more pagination links at', page_no) - break - print('Going to page %s' % page_no) - links[0].click() - wait_for_load(session) - except Exception as e: - print(e) - await asyncio.sleep(2) - - async def save_table(self, year, dom): - # 'Denumire beneficiar Cod unic Localitate Fond Masura Cuantum'.split() - COL_NAMES = ('recipient_name', 'recipient_id', 'recipient_location', 'scheme_1', 'scheme_2', 'amount') - table = dom.xpath('//table[@id="GridView1"]')[0] - rows = table.xpath('./tbody/tr') - page_no = int(rows[-1].xpath('.//td/span/text()')[0]) - data = [] - for row in rows[1:-1]: - texts = row.xpath('./td/text()') - d = dict(zip(COL_NAMES, texts)) - d['year'] = year - d['currency'] = 'EUR' - d['country'] = 'RO' - data.append(d) - key = '%s-%s' % (year, page_no) - await self.store_result(key, 'page_data', data) - - -def main(): - scraper = ROScraper() - scraper.run_from_cli() - - -if __name__ == '__main__': - main() diff --git a/scrapy_fs/README.md b/scrapy_fs/README.md index 3e9b132..94f6432 100644 --- a/scrapy_fs/README.md +++ b/scrapy_fs/README.md @@ -1,3 +1,7 @@ +## Scrapy + ## Run scrapers like this - scrapy crawl PL -o pl_2014.csv -t csv +``` +scrapy crawl -a year=2022 -o ro_2022.csv RO +``` diff --git a/scrapy_fs/requirements.txt b/scrapy_fs/requirements.txt index 183d40c..11b51e4 100644 --- a/scrapy_fs/requirements.txt +++ b/scrapy_fs/requirements.txt @@ -1,66 +1,140 @@ -appdirs==1.4.0 -appnope==0.1.0 -attrs==16.3.0 -Automat==0.5.0 -bleach==1.5.0 -cffi==1.9.1 -constantly==15.1.0 -cryptography==1.7.2 -cssselect==1.0.1 -decorator==4.0.11 -entrypoints==0.2.2 -html5lib==0.9999999 -idna==2.2 -incremental==16.10.1 -ipykernel==4.5.2 -ipython==5.2.2 -ipython-genutils==0.1.0 -ipywidgets==5.2.2 -Jinja2==2.9.5 -jsonschema==2.6.0 +anyio==4.0.0 +appdirs==1.4.4 +appnope==0.1.3 +argon2-cffi==23.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +asttokens==2.4.1 +async-lru==2.0.4 +attrs==23.1.0 +Automat==22.10.0 +Babel==2.13.1 +beautifulsoup4==4.12.2 +bleach==6.1.0 +certifi==2023.7.22 +cffi==1.16.0 +charset-normalizer==3.3.2 +comm==0.1.4 +constantly==23.10.4 +cryptography==41.0.5 +cssselect==1.2.0 +debugpy==1.8.0 +decorator==5.1.1 +defusedxml==0.7.1 +entrypoints==0.4 +exceptiongroup==1.1.3 +executing==2.0.1 +fastjsonschema==2.18.1 +filelock==3.13.1 +fqdn==1.5.1 +html5lib==1.1 +hyperlink==21.0.0 +idna==3.4 +importlib-metadata==6.8.0 +incremental==22.10.0 +ipykernel==6.26.0 +ipython==8.17.2 +ipython-genutils==0.2.0 +ipywidgets==8.1.1 +isoduration==20.11.0 +itemadapter==0.8.0 +itemloaders==1.1.0 +jedi==0.19.1 +Jinja2==3.1.2 +jmespath==1.0.1 +json5==0.9.14 +jsonpointer==2.4 +jsonschema==4.19.2 +jsonschema-specifications==2023.7.1 jupyter==1.0.0 -jupyter-client==4.4.0 -jupyter-console==5.1.0 -jupyter-core==4.3.0 -lxml==3.7.2 -MarkupSafe==0.23 -mistune==0.7.3 -nbconvert==5.1.1 -nbformat==4.2.0 -notebook==4.4.1 -numpy==1.12.0 -packaging==16.8 -pandas==0.19.2 -pandocfilters==1.4.1 -parsel==1.1.0 -pexpect==4.2.1 -pickleshare==0.7.4 -prompt-toolkit==1.0.13 -ptyprocess==0.5.1 -pyasn1==0.2.2 -pyasn1-modules==0.0.8 -pycparser==2.17 -PyDispatcher==2.0.5 -Pygments==2.2.0 -pyOpenSSL==16.2.0 -pyparsing==2.1.10 -python-dateutil==2.6.0 -python-slugify==1.2.1 -pytz==2016.10 -pyzmq==16.0.2 -qtconsole==4.2.1 -queuelib==1.4.2 -Scrapy==1.3.2 -service-identity==16.0.0 +jupyter-console==6.6.3 +jupyter-events==0.8.0 +jupyter-lsp==2.2.0 +jupyter_client==8.5.0 +jupyter_core==5.5.0 +jupyter_server==2.9.1 +jupyter_server_terminals==0.4.4 +jupyterlab==4.0.7 +jupyterlab-pygments==0.2.2 +jupyterlab-widgets==3.0.9 +jupyterlab_server==2.25.0 +lxml==5.3.0 +MarkupSafe==2.1.3 +matplotlib-inline==0.1.6 +mistune==3.0.2 +nbclient==0.8.0 +nbconvert==7.10.0 +nbformat==5.9.2 +nest-asyncio==1.5.8 +notebook==7.0.6 +notebook_shim==0.2.3 +numpy==1.26.1 +overrides==7.4.0 +packaging==23.2 +pandas==2.1.2 +pandocfilters==1.5.0 +parsel==1.8.1 +parso==0.8.3 +pexpect==4.8.0 +pickleshare==0.7.5 +platformdirs==3.11.0 +prometheus-client==0.18.0 +prompt-toolkit==3.0.39 +Protego==0.3.0 +psutil==5.9.6 +ptyprocess==0.7.0 +pure-eval==0.2.2 +pyasn1==0.5.0 +pyasn1-modules==0.3.0 +pycparser==2.21 +PyDispatcher==2.0.7 +Pygments==2.16.1 +pyOpenSSL==23.3.0 +pyparsing==3.1.1 +python-dateutil==2.8.2 +python-json-logger==2.0.7 +python-slugify==8.0.1 +pytz==2023.3.post1 +PyYAML==6.0.1 +pyzmq==25.1.1 +qtconsole==5.4.4 +QtPy==2.4.1 +queuelib==1.6.2 +referencing==0.30.2 +requests==2.31.0 +requests-file==1.5.1 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rpds-py==0.10.6 +Scrapy==2.11.0 +Send2Trash==1.8.2 +service-identity==23.1.0 simplegeneric==0.8.1 -six==1.10.0 -terminado==0.6 -testpath==0.3 -tornado==4.4.2 -traitlets==4.3.1 -Twisted==17.1.0 -Unidecode==0.4.20 -w3lib==1.17.0 -wcwidth==0.1.7 -widgetsnbextension==1.2.6 -zope.interface==4.3.3 +six==1.16.0 +sniffio==1.3.0 +soupsieve==2.5 +stack-data==0.6.3 +terminado==0.17.1 +testpath==0.6.0 +text-unidecode==1.3 +tinycss2==1.2.1 +tldextract==5.0.1 +tomli==2.0.1 +tornado==6.3.3 +tqdm==4.66.1 +traitlets==5.13.0 +Twisted==22.10.0 +types-python-dateutil==2.8.19.14 +typing_extensions==4.8.0 +tzdata==2023.3 +Unidecode==1.3.7 +uri-template==1.3.0 +urllib3==2.0.7 +w3lib==2.1.2 +wcwidth==0.2.9 +webcolors==1.13 +webencodings==0.5.1 +websocket-client==1.6.4 +widgetsnbextension==4.0.9 +zipp==3.17.0 +zope.interface==6.1 diff --git a/scrapy_fs/scrapy_fs/items.py b/scrapy_fs/scrapy_fs/items.py index 680bcba..0720f67 100644 --- a/scrapy_fs/scrapy_fs/items.py +++ b/scrapy_fs/scrapy_fs/items.py @@ -1,23 +1,25 @@ -""" Item and Loader classes. """ +"""Item and Loader classes.""" # Farm subsidy data format: # http://farmsubsidy.readthedocs.org/en/latest/scraper.html#scraper-data-format -from scrapy import Item, Field +from itemloaders.processors import Join, MapCompose, TakeFirst +from scrapy import Field, Item from scrapy.loader import ItemLoader -from scrapy.loader.processors import TakeFirst, MapCompose, Join - -from scrapy_fs.scrubbers import (filter_euro_amount, - filter_croatian_recipient_id, - select_after_semicolon, - filter_croatian_postcode, - strip_line_breaks, - make_comma_proof, - filter_lithuanian_recipient_id, - filter_lithuanian_location) +from scrapy_fs.scrubbers import ( + filter_croatian_postcode, + filter_croatian_recipient_id, + filter_euro_amount, + filter_lithuanian_location, + filter_lithuanian_recipient_id, + make_comma_proof, + select_after_semicolon, + strip_line_breaks, +) class FarmSubsidyItem(Item): + id = Field() # Only to identify duplicates with scrapy year = Field() country = Field() # Two letters ISO 3166 recipient_id = Field() @@ -27,7 +29,9 @@ class FarmSubsidyItem(Item): recipient_location = Field() recipient_url = Field() agency = Field() - scheme = Field() + scheme_code = Field() + scheme_name = Field() + scheme_description = Field() amount = Field() currency = Field() @@ -52,4 +56,4 @@ class LithuanianLoader(ItemLoader): recipient_id_in = MapCompose(filter_lithuanian_recipient_id, str) recipient_location_in = MapCompose(filter_lithuanian_location) - recipient_location_out = Join(separator=', ') + recipient_location_out = Join(separator=", ") diff --git a/scrapy_fs/scrapy_fs/pipelines.py b/scrapy_fs/scrapy_fs/pipelines.py index f29f707..0fc263d 100644 --- a/scrapy_fs/scrapy_fs/pipelines.py +++ b/scrapy_fs/scrapy_fs/pipelines.py @@ -1,24 +1,40 @@ -""" A bunch of pipelines. """ +"""A bunch of pipelines.""" +from itemadapter import ItemAdapter from scrapy.exceptions import DropItem class DropSubsidyFilter(object): - """ Drop unwanted subsidy items. """ + """Drop unwanted subsidy items.""" @staticmethod def process_item(item, spider): - args = (spider.name, item['scheme'], item['recipient_name']) + args = (spider.name, item["scheme"], item["recipient_name"]) - if spider.name == 'croatia': - if 'nacionalna' in item['agency'].lower(): + if spider.name == "croatia": + if "nacionalna" in item["agency"].lower(): raise DropItem('%s dropped national subsidy item "%s" for %s' % args) else: return item - if spider.name == 'lithuania': - if not item['amount']: + if spider.name == "lithuania": + if not item["amount"]: raise DropItem('%s dropped empty subsidy item "%s" for %s' % args) else: return item return item + + +class DuplicatesPipeline: + def __init__(self): + self.ids_seen = set() + + def process_item(self, item, spider): + adapter = ItemAdapter(item) + if adapter["id"] in self.ids_seen: + raise DropItem(f"Item ID already seen: {adapter['id']}") + else: + self.ids_seen.add(adapter["id"]) + # Remove 'id' before returning the item + del adapter["id"] + return item diff --git a/scrapy_fs/scrapy_fs/settings.py b/scrapy_fs/scrapy_fs/settings.py index e228c79..469f095 100644 --- a/scrapy_fs/scrapy_fs/settings.py +++ b/scrapy_fs/scrapy_fs/settings.py @@ -6,10 +6,10 @@ # http://doc.scrapy.org/en/latest/topics/settings.html # -BOT_NAME = 'scrapy_fs' +BOT_NAME = "scrapy_fs" -SPIDER_MODULES = ['scrapy_fs.spiders'] -NEWSPIDER_MODULE = 'scrapy_fs.spiders' +SPIDER_MODULES = ["scrapy_fs.spiders"] +NEWSPIDER_MODULE = "scrapy_fs.spiders" # AUTOTHROTTLE_ENABLED = True @@ -17,7 +17,24 @@ # 'scrapy_fs.pipelines.DropSubsidyFilter': 100, # } -USER_AGENT = 'Farm subsidy scraper bot (http://farmsubsidy.openspending.org/)' +USER_AGENT = "Farm subsidy scraper bot (https://farmsubsidy.org)" + +RETRY_TIMES = 5 # For EE -URLLENGTH_LIMIT=6000 +URLLENGTH_LIMIT = 6000 + +# Enable HTTP caching +HTTPCACHE_ENABLED = True + +# Cache storage location +HTTPCACHE_DIR = "cache" + +# Cache expiration time (in seconds) - default 0 = never expire +HTTPCACHE_EXPIRATION_SECS = 0 + +# Cache storage backend +# HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage" + +# Optional: Ignore these HTTP codes for caching +HTTPCACHE_IGNORE_HTTP_CODES = [500, 502, 503, 504, 408] diff --git a/scrapy_fs/scrapy_fs/spiders/at_spider.py b/scrapy_fs/scrapy_fs/spiders/at_spider.py deleted file mode 100644 index 440b948..0000000 --- a/scrapy_fs/scrapy_fs/spiders/at_spider.py +++ /dev/null @@ -1,64 +0,0 @@ -import json - -import scrapy -from scrapy.spiders import Spider -# from scrapy.shell import inspect_response - -from ..items import FarmSubsidyItem - - -class ATSpider(Spider): - name = "AT" - YEAR = 2017 - START_URL = 'https://www.transparenzdatenbank.at/suche' - DETAIL_URL = 'https://www.transparenzdatenbank.at/suche/details/{id}/{year}' - DEFAULT_SEARCH = u'{"name":"","betrag_von":"","betrag_bis":"","gemeinde":"","massnahme":null,"jahr":%s,"sort":"name"}' % YEAR - - def __init__(self, year=YEAR): - self.year = int(year) - - def start_requests(self): - # import ipdb; ipdb.set_trace() - yield scrapy.Request(self.START_URL, - method='POST', - headers={ - 'Content-Type': 'application/json;charset=UTF-8', - 'Accept': 'application/json, text/plain, */*', - 'PAGINATION_CURRENT': 1, - 'PAGINATION_PER_PAGE': 2000000, - 'Referer': 'https://www.transparenzdatenbank.at/', - 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' - }, - body=self.DEFAULT_SEARCH, - callback=self.get_results) - - def get_results(self, response): - """ - The lines below is a spider contract. For more info see: - http://doc.scrapy.org/en/latest/topics/contracts.html - @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/ - @scrapes name - """ - all_items = json.loads(response.body) - for item in all_items: - item_data = dict( - country='AT', currency='EUR', - year=item['jahr'], - recipient_name=item['name'], - recipient_id='AT-%s' % item['id'], - recipient_location=item['gemeinde'], - recipient_postcode=str(item['plz']), - amount=item['betrag'], - ) - yield scrapy.Request(self.DETAIL_URL.format(id=item['id'], year=item['jahr']), - callback=self.get_detail, meta={'item_data': item_data}) - - def get_detail(self, response): - item_data = response.meta['item_data'] - all_payments = json.loads(response.body) - for payment in all_payments: - new_item = dict(item_data) - new_item['amount'] = payment['betrag'] - new_item['scheme'] = u'{bezeichnung} ({id})'.format(**payment) - - yield FarmSubsidyItem(**new_item) diff --git a/scrapy_fs/scrapy_fs/spiders/ee_spider.py b/scrapy_fs/scrapy_fs/spiders/ee_spider.py index ff2c747..6051cab 100644 --- a/scrapy_fs/scrapy_fs/spiders/ee_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/ee_spider.py @@ -12,8 +12,9 @@ class EESpider(Spider): START_URL = "https://www.pria.ee/toetused/toetusesaajad?type=payed&year={year}&name=&county=&township=&indeks=&mp%5B352%5D=352&mp%5B350%5D=350&mp%5B348%5D=348&mp%5B342%5D=342&mp%5B340%5D=340&mp%5B607%5D=607&mp%5B606%5D=606&mp%5B320%5D=320&mp%5B597%5D=597&mp%5B331%5D=331&mp%5B333%5D=333&mp%5B336%5D=336&mp%5B328%5D=328&mp%5B379%5D=379&mp%5B329%5D=329&mp%5B330%5D=330&mp%5B343%5D=343&mp%5B321%5D=321&mp%5B332%5D=332&mp%5B1253%5D=1253&mp%5B335%5D=335&mp%5B353%5D=353&mp%5B355%5D=355&mp%5B1254%5D=1254&mp%5B334%5D=334&mp%5B354%5D=354&mp%5B375%5D=375&mp%5B338%5D=338&mp%5B1724%5D=1724&mp%5B370%5D=370&mp%5B367%5D=367&mp%5B322%5D=322&mp%5B351%5D=351&mp%5B341%5D=341&mp%5B349%5D=349&mp%5B357%5D=357&mp%5B344%5D=344&mp%5B327%5D=327&mp%5B339%5D=339&mp%5B376%5D=376&mp%5B345%5D=345&mp%5B356%5D=356&mp%5B230%5D=230&mp%5B1723%5D=1723&mp%5B390%5D=390&mp%5B1255%5D=1255&mp%5B1727%5D=1727&mp%5B1256%5D=1256&mp%5B256%5D=256&mp%5B311%5D=311&mp%5B306%5D=306&mp%5B285%5D=285&mp%5B603%5D=603&mp%5B1257%5D=1257&mp%5B309%5D=309&mp%5B307%5D=307&mp%5B1258%5D=1258&mp%5B1725%5D=1725&mp%5B315%5D=315&mp%5B1726%5D=1726&mp%5B599%5D=599&mp%5B310%5D=310&mp%5B366%5D=366&mp%5B263%5D=263&mp%5B246%5D=246&mp%5B293%5D=293&mp%5B365%5D=365&mp%5B364%5D=364&mp%5B1259%5D=1259&mp%5B373%5D=373&mp%5B595%5D=595&mp%5B266%5D=266&mp%5B267%5D=267&mp%5B1260%5D=1260&mp%5B299%5D=299&mp%5B359%5D=359&mp%5B282%5D=282&mp%5B1261%5D=1261&mp%5B600%5D=600&mp%5B270%5D=270&mp%5B284%5D=284&mp%5B308%5D=308&mp%5B323%5D=323&mp%5B347%5D=347&mp%5B358%5D=358&mp%5B289%5D=289&mp%5B598%5D=598&mp%5B593%5D=593&mp%5B337%5D=337&mp%5B601%5D=601&mp%5B605%5D=605&mp%5B231%5D=231&mp%5B276%5D=276&mp%5B227%5D=227&mp%5B298%5D=298&mp%5B362%5D=362&mp%5B290%5D=290&mp%5B260%5D=260&mp%5B592%5D=592&mp%5B240%5D=240&mp%5B243%5D=243&mp%5B324%5D=324&mp%5B346%5D=346&mp%5B233%5D=233&ma%5B1504%5D=1504&ma%5B1505%5D=1505&ma%5B1508%5D=1508&ma%5B1626%5D=1626&ma%5B1510%5D=1510&ma%5B1511%5D=1511&ma%5B1561%5D=1561&ma%5B1693%5D=1693&ma%5B1631%5D=1631&ma%5B1707%5D=1707&ma%5B1571%5D=1571&ma%5B1695%5D=1695&ma%5B1557%5D=1557&ma%5B1684%5D=1684&ma%5B1559%5D=1559&ma%5B1701%5D=1701&ma%5B1608%5D=1608&ma%5B1708%5D=1708&ma%5B1580%5D=1580&ma%5B1687%5D=1687&ma%5B1581%5D=1581&ma%5B1689%5D=1689&ma%5B1583%5D=1583&ma%5B1688%5D=1688&ma%5B1585%5D=1585&ma%5B1690%5D=1690&ma%5B1587%5D=1587&ma%5B1691%5D=1691&ma%5B1629%5D=1629&ma%5B1692%5D=1692&ma%5B1593%5D=1593&ma%5B1686%5D=1686&ma%5B1567%5D=1567&ma%5B1685%5D=1685&ma%5B1573%5D=1573&ma%5B1705%5D=1705&ma%5B1575%5D=1575&ma%5B1712%5D=1712&ma%5B1563%5D=1563&ma%5B1703%5D=1703&ma%5B1660%5D=1660&ma%5B1636%5D=1636&ma%5B1667%5D=1667&ma%5B1639%5D=1639&ma%5B1628%5D=1628&ma%5B1661%5D=1661&ma%5B1640%5D=1640&ma%5B1730%5D=1730&ma%5B1720%5D=1720&ma%5B1493%5D=1493&ma%5B1494%5D=1494&ma%5B1721%5D=1721&ma%5B1495%5D=1495&ma%5B1642%5D=1642&ma%5B1664%5D=1664&ma%5B1740%5D=1740&ma%5B1632%5D=1632&ma%5B1633%5D=1633&ma%5B1719%5D=1719&ma%5B1496%5D=1496&ma%5B1715%5D=1715&ma%5B1733%5D=1733&ma%5B1498%5D=1498&ma%5B1659%5D=1659&ma%5B1732%5D=1732&ma%5B1668%5D=1668&ma%5B1681%5D=1681&ma%5B1500%5D=1500&ma%5B1519%5D=1519&ma%5B1702%5D=1702&ma%5B1502%5D=1502&ma%5B1704%5D=1704&ma%5B1509%5D=1509&ma%5B1663%5D=1663&ma%5B1514%5D=1514&ma%5B1515%5D=1515&ma%5B1722%5D=1722&ma%5B1517%5D=1517&ma%5B1741%5D=1741&ma%5B1569%5D=1569&ma%5B1706%5D=1706&ma%5B1540%5D=1540&ma%5B1666%5D=1666&ma%5B1716%5D=1716&ma%5B1736%5D=1736&ma%5B1717%5D=1717&ma%5B1737%5D=1737&ma%5B1656%5D=1656&ma%5B1651%5D=1651&ma%5B1652%5D=1652&ma%5B1653%5D=1653&ma%5B1654%5D=1654&ma%5B1655%5D=1655&ma%5B1657%5D=1657&ma%5B1658%5D=1658&ma%5B1521%5D=1521&ma%5B1522%5D=1522&ma%5B1671%5D=1671&ma%5B1523%5D=1523&ma%5B1524%5D=1524&ma%5B1644%5D=1644&ma%5B1634%5D=1634&ma%5B1641%5D=1641&ma%5B1545%5D=1545&ma%5B1546%5D=1546&ma%5B1710%5D=1710&ma%5B1526%5D=1526&ma%5B1734%5D=1734&ma%5B1645%5D=1645&ma%5B1547%5D=1547&ma%5B1550%5D=1550&ma%5B1650%5D=1650&ma%5B1729%5D=1729&ma%5B1527%5D=1527&ma%5B1699%5D=1699&ma%5B1713%5D=1713&ma%5B1665%5D=1665&ma%5B1728%5D=1728&ma%5B1553%5D=1553&ma%5B1554%5D=1554&ma%5B1680%5D=1680&ma%5B1731%5D=1731&ma%5B1555%5D=1555&ma%5B1627%5D=1627&ma%5B1533%5D=1533&ma%5B1534%5D=1534&ma%5B1535%5D=1535&ma%5B1683%5D=1683&ma%5B1538%5D=1538&ma%5B1700%5D=1700&ma%5B1738%5D=1738&ma%5B1739%5D=1739&ma%5B1742%5D=1742&ma%5B1743%5D=1743&ma%5B1606%5D=1606&ma%5B1638%5D=1638&ma%5B1649%5D=1649&ma%5B1682%5D=1682&ma%5B1604%5D=1604&ma%5B1675%5D=1675&ma%5B1610%5D=1610&ma%5B1662%5D=1662&ma%5B1735%5D=1735&ma%5B1647%5D=1647&ma%5B1670%5D=1670&ma%5B1577%5D=1577&ma%5B1672%5D=1672&ma%5B1589%5D=1589&ma%5B1598%5D=1598&ma%5B1674%5D=1674&ma%5B1625%5D=1625&ma%5B1677%5D=1677&ma%5B1595%5D=1595&ma%5B1596%5D=1596&ma%5B1711%5D=1711&ma%5B1600%5D=1600&ma%5B1714%5D=1714&ma%5B1542%5D=1542&ma%5B1543%5D=1543&ma%5B1544%5D=1544&ma%5B1709%5D=1709&ma%5B1591%5D=1591&ma%5B1678%5D=1678&ma%5B1669%5D=1669&ma%5B1612%5D=1612&ma%5B1613%5D=1613&ma%5B1718%5D=1718&ma%5B1622%5D=1622&ma%5B1673%5D=1673&ma%5B1676%5D=1676&ma%5B1616%5D=1616&ma%5B1565%5D=1565&ma%5B1620%5D=1620&ma%5B1679%5D=1679&ma%5B1618%5D=1618&eafrd%5Bfrom%5D=&eafrd%5Bto%5D=&nat_support%5Bfrom%5D=&nat_support%5Bto%5D=&emkf%5Bfrom%5D=&emkf%5Bto%5D=&eagf%5Bfrom%5D=&eagf%5Bto%5D=&eagf_other%5Bfrom%5D=&eagf_other%5Bto%5D=&support%5Bfrom%5D=&support%5Bto%5D=&sum%5Bfrom%5D=&sum%5Bto%5D=&page={page}" def __init__(self, year=None): - # self.year = int(year) self.year = "all" + if year: + self.year = int(year) def start_requests(self): # Use high page number to get max page count diff --git a/scrapy_fs/scrapy_fs/spiders/it_spider.py b/scrapy_fs/scrapy_fs/spiders/it_spider.py new file mode 100644 index 0000000..7308275 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/it_spider.py @@ -0,0 +1,77 @@ +""" +Get data from all the HTML files scraped via Playwright in the `it` directory. + +It is not possible to say whether the data is complete. +We had to narrow down the selection for each request to not overwhelm the server. +This was done by iterating through locations & measures. +But in the results, there were a lot of duplicated payments. +Maybe the search with the comune was too broad. +""" + +import os + +import scrapy +from scrapy.spiders import Spider +from tqdm import tqdm + +from ..items import FarmSubsidyItem + + +class ITSpider(Spider): + name = "IT" + year = 2022 + # Use absolute path based on this file's location + data_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../special-scrapers/data/it") + ) + + custom_settings = { + "ITEM_PIPELINES": { + "scrapy_fs.pipelines.DuplicatesPipeline": 100, + }, + "LOG_LEVEL": "ERROR", + "AUTOTHROTTLE_ENABLED": False, + "CONCURRENT_REQUESTS": 2, + "CONCURRENT_REQUESTS_PER_DOMAIN": 2, + } + + def start_requests(self): + for file in tqdm(os.listdir(self.data_dir)): + if file.endswith(".html"): + file_path = os.path.join(self.data_dir, file) + url = "file:///" + file_path + yield scrapy.Request(url=url, callback=self.parse) + + def parse(self, response): + # Loop through each table row that contains elements + for row in response.xpath("//tr[td]"): + # Extract text from each in the row + cells = row.xpath("./td//text()").getall() + # Clean up whitespace and join multi-line cell text + cells = [cell.strip() for cell in cells if cell.strip()] + if cells and cells[0] == "Beneficiary": + continue + + offset = 0 + if cells and len(cells) < 5: + offset = -2 + + # create id from all cells since there are duplicate payments + duplicate_id = "-".join(cells) + recipient_id = "-".join([c for c in cells[:4]]).lower() + recipient_id = "".join( + [ch for ch in recipient_id if ch.isalnum() or ch == "-"] + ) + # Create an item for each row + item = FarmSubsidyItem() + item["id"] = duplicate_id + item["recipient_id"] = recipient_id + item["recipient_name"] = cells[0] + item["recipient_address"] = cells[1] if offset == 0 else "" + item["recipient_postcode"] = cells[2] if offset == 0 else "" + item["recipient_location"] = cells[3 + offset] + item["amount"] = cells[4 + offset].replace(".", "").replace(",", ".") + item["year"] = self.year + item["country"] = "IT" + item["currency"] = "EUR" + yield item diff --git a/scrapy_fs/scrapy_fs/spiders/lu_spider.py b/scrapy_fs/scrapy_fs/spiders/lu_spider.py new file mode 100644 index 0000000..5a4a6c6 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/lu_spider.py @@ -0,0 +1,60 @@ +import scrapy +from scrapy.spiders import Spider + +from slugify import slugify + +from ..items import FarmSubsidyItem + + +class LUSpider(Spider): + name = "LU" + + BASE_URL = "https://agriculture.public.lu" + START_URL = "https://agriculture.public.lu/de/beihilfen/beguenstigte-der-agrarbeihilfen.html?annee={year}&mesure=&municipalite=&nom=&montantbas=&montanthaut=&numeroPage={page}" + + def __init__(self, year=None): + self.year = int(year) + + def start_requests(self): + url = self.START_URL.format(year=self.year, page=1) + yield scrapy.Request(url) + + def parse(self, response): + next_url = response.css(".pagination-next a.icon-right::attr(href)").get() + if next_url: + yield scrapy.Request(self.BASE_URL + next_url) + + yield from self.parse_page(response) + + def parse_page(self, response): + rows = response.css('.accordion-gestion details') + for row in rows: + # also read next row + name = row.css("summary .gestion-name::text").get().strip() + location = row.css("summary .gestion-city::text").get().strip() + if name.endswith('_Anonymisiert'): + recipient_id = "{}-{}-{}".format( + self.name, self.year, name.split("_")[0] + ) + name = "" + else: + recipient_id = "{}-{}-{}".format( + self.name, slugify(name), slugify(location) + ) + + scheme_rows = row.css("table tr")[1:] + for scheme_row in scheme_rows: + cols = scheme_row.xpath("./td") + scheme = cols[0].css("b::text").get() + if scheme is None: + scheme = "" + amount = float(cols[1].xpath("./text()").get().replace('€', '').strip()) + yield FarmSubsidyItem( + year=self.year, + scheme=scheme.strip(), + amount=amount, + recipient_id=recipient_id, + recipient_name=name, + recipient_location=location, + country=self.name, currency='EUR', + ) diff --git a/scrapy_fs/scrapy_fs/spiders/lv_spider.py b/scrapy_fs/scrapy_fs/spiders/lv_spider.py new file mode 100644 index 0000000..3b92ee0 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/lv_spider.py @@ -0,0 +1,61 @@ +import scrapy +from scrapy.spiders import Spider + +from slugify import slugify + +from ..items import FarmSubsidyItem + + +class LVSpider(Spider): + name = "LV" + + START_URL = "https://eps.lad.gov.lv/payment_recipients?utf8=%E2%9C%93&eps_payment%5Bdisplay_name%5D=&eps_payment%5Btax_payer_number%5D=&eps_payment%5Bdistrict%5D=&eps_payment%5Bfund%5D=elf&eps_payment%5Bschema%5D=&eps_payment%5Bsum_from%5D=&eps_payment%5Bsum_to%5D=&eps_payment%5Byear_type%5D=F&eps_payment%5Byear%5D={year}&commit=Mekl%C4%93t&page={page}" + + def __init__(self, year=None): + self.year = int(year) + + def start_requests(self): + url = self.START_URL.format(year=self.year, page=1) + yield scrapy.Request(url) + + def parse(self, response): + page_count = response.xpath('//div[@id="paginate"]/a/text()')[-2].get() + page_count = int(page_count) + yield from self.parse_page(response) + + for i in range(2, page_count + 1): + url = self.START_URL.format(year=self.year, page=i) + yield scrapy.Request(url, callback=self.parse_page) + + def parse_page(self, response): + rows = response.xpath('//div[@id="pmt_rec_list"]/table/tr') + value_rows = iter(rows[1:]) + for row in value_rows: + # also read next row + detail_row = next(value_rows) + values = row.xpath("./td/text()") + name = values[0].get().strip() + location = values[1].get().strip() + if name.isdigit(): + recipient_id = "{}-{}".format( + self.name, name + ) + name = "" + else: + recipient_id = "{}-{}-{}".format( + self.name, slugify(name), slugify(location) + ) + scheme_rows = detail_row.xpath(".//tr")[1:] + for scheme_row in scheme_rows: + cols = scheme_row.xpath("./td") + scheme = cols[0].css("::text").get().strip() + amount = float(cols[1].css("::text").get()) + yield FarmSubsidyItem( + year=self.year, + scheme=scheme.strip(), + amount=amount, + recipient_id=recipient_id, + recipient_name=name, + recipient_location=location, + country=self.name, currency='EUR', + ) diff --git a/scrapy_fs/scrapy_fs/spiders/mt_spider.py b/scrapy_fs/scrapy_fs/spiders/mt_spider.py deleted file mode 100644 index 47eb7ce..0000000 --- a/scrapy_fs/scrapy_fs/spiders/mt_spider.py +++ /dev/null @@ -1,115 +0,0 @@ -import re - -import scrapy -from scrapy.spiders import Spider - -from slugify import slugify - -from ..items import FarmSubsidyItem - - -YEAR = 2017 - - -class MTSpider(Spider): - name = "MT" - - NUM_ONLY_RE = re.compile('^[\s\d]+$') - - start_urls = [ - 'https://msdec.gov.mt/en/arpa/Pages/Payments.aspx' - ] - - def __init__(self, year=YEAR): - self.year = int(year) - - def parse(self, response): - return scrapy.FormRequest.from_response( - response, - formdata={ - 'ctl00$ctl28$g_c7852a28_8677_47de_bf51_102e5afe2ae8$AELSg_c7852a28_8677_47de_bf51_102e5afe2ae8combo5': str(self.year), - '__SCROLLPOSITIONX': '0', - '__SCROLLPOSITIONY': '0', - '__LASTFOCUS': '', - 'search': '0', - '__EVENTARGUMENT': '', - 'hiddenInputToUpdateATBuffer_CommonToolkitScripts': '1', - '__EVENTTARGET': '', - 'InputKeywords': 'Search', - }, - callback=self.search) - - def search(self, response): - current_page = response.xpath('//tr[@class="AELSpager"]//table//td[span]') - if current_page: - print('Page %s' % current_page[0].extract()) - else: - print('No current page!') - trs = response.xpath('.//table[starts-with(@class, "AELStable")]//tr') - keys = None - for i, tr in enumerate(trs): - if i == 0: - keys = [x.extract().strip() for x in tr.xpath('./th//text()')] - continue - if tr.xpath('self::*[@class = "AELSpager"]'): - ''' -3 - function __doPostBack(eventTarget, eventArgument) { - if (!theForm.onsubmit || (theForm.onsubmit() != false)) { - theForm.__EVENTTARGET.value = eventTarget; - theForm.__EVENTARGUMENT.value = eventArgument; - theForm.submit(); - } -} - ''' - # Find next link - next_link = response.xpath('//tr[@class="AELSpager"]//table//td[span]/following-sibling::td/a/@href') - if not next_link: - continue - next_link = next_link[0].extract() - next_link = next_link.replace("javascript:__doPostBack('", '') - next_link = next_link.split("','") - event_target = next_link[0] - event_arg = next_link[1].replace("')", '') - - yield scrapy.FormRequest.from_response(response, - callback=self.search, - dont_click=True, - formdata={ - '__EVENTTARGET': event_target, - '__EVENTARGUMENT': event_arg - }) - return - tds = [x.extract().strip() for x in tr.xpath('./td//text()')] - if len(tds) != len(keys): - return - data = dict(zip(keys, tds)) - recipient_name = data.pop('Name') - recipient_location = data.pop('Locality') - recipient_postcode = data.pop('Postcode') - year = data.pop('Financial Year', None) - if year is None: - return - data.pop('Grand_Total') - if self.NUM_ONLY_RE.match(recipient_name): - recipient_id = 'MT-%s-%s' % (year, recipient_name) - recipient_name = '' - else: - recipient_id = 'MT-%s-%s' % (recipient_postcode, slugify(recipient_name)) - - for scheme, amount in data.items(): - if not amount: - continue - amount = float(amount.replace(',', '')) - if not amount: - continue - yield FarmSubsidyItem( - year=int(year), - scheme=scheme, - amount=amount, - recipient_id=recipient_id, - recipient_name=recipient_name, - recipient_location=recipient_location, - recipient_postcode=recipient_postcode, - country='MT', currency='EUR', - ) diff --git a/scrapy_fs/scrapy_fs/spiders/nl_spider.py b/scrapy_fs/scrapy_fs/spiders/nl_spider.py new file mode 100644 index 0000000..a1bea07 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/nl_spider.py @@ -0,0 +1,122 @@ +""" """ + +import os + +import scrapy +from scrapy.spiders import Spider +from tqdm import tqdm + +from ..items import FarmSubsidyItem + + +class NLSpider(Spider): + name = "NL" + year = 2022 + # Use absolute path based on this file's location + data_dir = os.path.abspath( + os.path.join(os.path.dirname(__file__), "../../../special-scrapers/data/nl") + ) + + custom_settings = { + # "ITEM_PIPELINES": { + # "scrapy_fs.pipelines.DuplicatesPipeline": 100, + # }, + "LOG_LEVEL": "INFO", + "AUTOTHROTTLE_ENABLED": False, + "CONCURRENT_REQUESTS": 2, + "CONCURRENT_REQUESTS_PER_DOMAIN": 2, + } + + def start_requests(self): + for file in tqdm(os.listdir(self.data_dir)): + if file.endswith(".html"): + file_path = os.path.join(self.data_dir, file) + url = "file:///" + file_path + yield scrapy.Request(url=url, callback=self.parse) + + def parse(self, response): + # Extract table rows from the HTML + rows = response.css( + "tbody#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:glbTable_data tr" + ) + + for row in rows: + # Extract recipient name and location from the first column + name_cell = row.css("td:first-child ul li::text").getall() + if len(name_cell) >= 2: + recipient_name = name_cell[0].strip() + recipient_location = name_cell[1].strip() + + # Extract postcode and city from location + location_parts = recipient_location.split(" ", 1) + postcode = location_parts[0] if location_parts else "" + city = location_parts[1] if len(location_parts) > 1 else "" + else: + recipient_name = "" + recipient_location = "" + postcode = "" + city = "" + + # Extract scheme name from second column + # The HTML structure is: RegelingSCHEME_CODE. SCHEME_DESCRIPTION + scheme_cell = row.css("td:nth-child(2)") + if scheme_cell: + # Get all text content from the cell + all_text = scheme_cell.css("::text").getall() + # Filter out the "Regeling" span text and join the rest + scheme_full = "".join( + [text for text in all_text if text.strip() != "Regeling"] + ).strip() + + # Split scheme into code and description + # Look for pattern like "II.04. " or "IV.22. " + if ". " in scheme_full: + parts = scheme_full.split(". ", 1) + scheme_code = parts[0] + "." + scheme_name = " ".join(parts[1].split()) if len(parts) > 1 else "" + else: + scheme_code = "" + scheme_name = " ".join(scheme_full.split()) + else: + scheme_full = "" + scheme_code = "" + scheme_name = "" + + # Extract amount from third column + amount_text = row.css("td:nth-child(3) span.amount::text").getall() + if amount_text: + # Join the amount parts and clean up + amount_str = "".join(amount_text).strip() + # Remove € symbol and convert comma to dot for decimal + amount_str = ( + amount_str.replace("€", "") + .replace(".", "") + .replace(",", ".") + .strip() + ) + try: + amount = float(amount_str) + except ValueError: + amount = 0.0 + else: + amount = 0.0 + + if amount == 0.0: + # Skip rows with zero amount + raise ValueError( + f"Skipping row with zero amount: {recipient_name}, {scheme_name}" + ) + + # Create and yield the item + item = FarmSubsidyItem() + item["year"] = self.year + item["country"] = "NL" + item["recipient_name"] = recipient_name + item["recipient_location"] = city + item["recipient_postcode"] = postcode + item["scheme_name"] = scheme_name + item["scheme_code"] = scheme_code + item["amount"] = amount + item["currency"] = "EUR" + + yield item diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scheme.json b/scrapy_fs/scrapy_fs/spiders/pl_scheme.json new file mode 100644 index 0000000..12b38ad --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/pl_scheme.json @@ -0,0 +1,771 @@ +[ + { + "Code": null, + "Name": "Operations in the form of types of intervention for direct payments as provided for in Article 16 of Regulation (EU) 2021/2115", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.1", + "Name": "Basic income support for sustainability", + "Purpose": "The basic income support is an area payment decoupled from production. The aim is to support viable farm income and resilience across the Union to enhance food security.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.2", + "Name": "Complementary redistributive income support for sustainability", + "Purpose": "The complementary redistributive income support for sustainability is an area payment decoupled from production. The aim is to improve the distribution of direct payments by redistributing support from larger to smaller or medium-sized farms.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.3", + "Name": "Complementary income support for young farmers", + "Purpose": "The complementary income support for young farmers is a payment decoupled from production providing enhanced income support to young farmers who are setting up for the first time. The aim is to modernise the agricultural sector by attracting young people and improving their business development.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.4", + "Name": "Schemes for the climate and the environment", + "Purpose": "Eco-schemes are a payment decoupled from production. The aim is to target income support to agricultural practices beneficial for the environment, climate and animal welfare.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.5", + "Name": "Small farmer's payments (Article 28)", + "Purpose": "The small farmer's payments are decoupled from production and replace all other direct payments for the concerned beneficiaries. The purpose of the payments for small farmers is to promote a more balanced distribution of support and to reduce administrative burden for both beneficiaries of small amounts and managing authorities.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.6", + "Name": "Coupled income support", + "Purpose": "Coupled income support covers payments per hectare or head linked to specific productions. The aim is to improve competitiveness, sustainability, and/or quality in certain sectors and products that are particularly important for social, economic or environmental reasons and encounter certain difficulties.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "I.7", + "Name": "Crop-specific payment for cotton", + "Purpose": "The crop-specific payment for cotton is a coupled payment granted per hectare of eligible area of cotton. It is a mandatory scheme for cotton producer's Member States to support the cotton production in regions where it is important for the agricultural economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 04 06"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Measures set out in Annex I to Regulation (EU) No 1307/2013", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.1", + "Name": "Basic payment scheme (Title III, Chapter 1, Sections 1, 2, 3 and 5)", + "Purpose": "The basic payment scheme is an area payment decoupled from production operated on the basis of payment entitlements allocated to farmers. The aim is to support the income of farmers which is, on average, significantly below the average income in the rest of the economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.2", + "Name": "Single area payment scheme (Article 36)", + "Purpose": "The single area payment scheme is an area payment decoupled from production paid for eligible hectares declared by a farmer. The aim is to support the income of farmers which is, on average, significantly below the average income in the rest of the economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.3", + "Name": "Redistributive payment (Title III, Chapter 2)", + "Purpose": "The redistributive payment is a decoupled area payment. The aim is to support smaller farms by providing them an additional support on their first hectares declared under the basic payment.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.4", + "Name": "Payment for agricultural practices beneficial for the climate and the environment (Title III, Chapter 3)", + "Purpose": "Greening is a decoupled area payment per hectare paid. The aim is to observe three agricultural practices in favour of the climate and the environment: crop diversification, maintenance of permanent grassland and having ecological focus area on the agricultural area", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.5", + "Name": "Payment for areas with natural constraints (Title III, Chapter 4)", + "Purpose": "The payment to areas with natural constraints is an area based decoupled payment, provided on top of the basic payment to farmers. The aim is to give support to farmers who are situated in areas with natural constraints.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 06"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.6", + "Name": "Payment for young farmers (Title III, Chapter 5)", + "Purpose": "Payment for young farmers is a payment decoupled from production providing enhanced income support to young farmers who are newly set up for the first time. The aim is to promote the creation and development of new economic activities in the agricultural sector, which is essential for the competitiveness of the agricultural sector in the Union.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 07"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.7", + "Name": "Voluntary coupled support (Title IV, Chapter 1)", + "Purpose": "The voluntary coupled support covers payments per hectare or head linked to specific productions. The aim is to improve the competitiveness and sustainability of sectors that are particularly important for economic, social or environmental reasons and undergo certain difficulties.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 09"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.8", + "Name": "Crop-specific payment for cotton (Title IV, Chapter 2)", + "Purpose": "The crop-specific payment for cotton is a coupled payment granted per hectare of eligible area of cotton. It is a mandatory scheme for Member States producing cotton so as to support its production in regions where it is important for the agricultural economy.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 08"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.9", + "Name": "Small farmers scheme (Title V)", + "Purpose": "The small farmers' scheme is decoupled from production and replaces all other direct payments for the concerned beneficiaries. The aim is to promote a more balanced distribution of support and to reduce administrative burden for both beneficiaries of small amounts and managing authorities.", + "Nomenclature": { + "Chapter_08_02": ["08 02 05 10"], + "Chapter_08_03": [] + } + }, + { + "Code": "II.10", + "Name": "Measures set out in Annex I to Council Regulation (EC) No 73/2009²", + "Purpose": "The aim of these direct payments is to decouple support from the production of crops and livestock in order to improve the income support of the farmers.", + "Nomenclature": { + "Chapter_08_02": ["08 02 99 01"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Operations in the form of sectoral interventions as provided for in Article 42 of Regulation (EU) 2021/2115", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.1", + "Name": "In the fruit and vegetables sector (Articles 49 to 53)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the fruit and vegetables sector. It is done through producer organisations (PO) or their associations (APO) recognised under Regulation (EU) No 1308/2013 and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs and APOs. Programmes have a duration of between 3 and 7 years and are managed on a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.2", + "Name": "In the apiculture products sector (Articles 54, 55 and 56)", + "Purpose": "The aim is to support beekeepers, quality and market for apiculture products", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 02"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.3", + "Name": "In the wine sector (Articles 57 to 60)", + "Purpose": "The aim is to support competitiveness and sustainability of the wine sector. Programmes are run by Member States at national level as part of their Strategic Plan and are managed in a financial year basis. Beneficiaries are winegrowers as well as wine-making and wine-trading operators or their associations/organisations. Operations to be approved by Member States can be annual or multiannual.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.4", + "Name": "In the hops sector (Articles 61 and 62)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the hops sector through producer organisations (PO) or their associations (APO) recognised under Regulation (EU) No 1308/2013 and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs or APOs. Programmes have a duration of between 3 and 7 years and are managed on a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.5", + "Name": "In the olive oil and table olives sector (Articles 63, 64 and 65)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the olive oil and table olives sector through producer organisations (PO) and their associations (APO) recognised under Regulation (EU) No 1308/2013 and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs or APOs. Programmes have a duration of between 3 and 7 years and are managed in a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "III.6", + "Name": "In other sectors referred to in Article 1(2), points (a) to (h), (k), (m), (o) to (t) and (w), of Regulation (EU) No 1308/2013 and sectors covering products listed in Annex XIII to Regulation (EU) 2021/2115. (Articles 66, 67 and 68)", + "Purpose": "The aim is to support concentration of supply, competitiveness and sustainability of the related sectors through producer organisations (PO), their associations (APO) recognised under Regulation (EU) No 1308/2013, as well as Producers Groups (PG) temporarily approved by Member States and running operational programmes in accordance with Regulation (EU) 2021/2115. Beneficiaries are POs, APOs or PGs. Programmes have a duration of between 3 and 7 years and are managed in a financial year basis. Member States have to approve every single programme.", + "Nomenclature": { + "Chapter_08_02": ["08 02 02 06"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Measures set out in Regulation (EU) No 1308/2013", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": ["08 02 03"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.1", + "Name": "Public intervention (Chapter I, Section 2)", + "Purpose": "When market prices for certain agricultural products fall below a pre-determined level, the public authorities of the Member States may intervene to stabilise the market by purchasing surplus supplies, which may then be stored until the market price increases. The entities that must be published are the ones which benefit from the aid, in other words the entities from which the product has been bought.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 10"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.2", + "Name": "Aid for private storage (Chapter I, Section 3)", + "Purpose": "The aim of the aid granted is to temporarily support producers of certain products regarding the cost of private storage.", + "Nomenclature": { + "Chapter_08_02": [ + "08 02 03 10 0001 005", + "08 02 03 10 0001 007", + "08 02 03 10 0001 008", + "08 02 03 10 0006 015", + "08 02 03 10 0007 010", + "08 02 03 10 0008 002", + "08 02 03 10 0009 002" + ], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.3", + "Name": "The EU school scheme, school fruit and school milk schemes (Chapter II, Section 1)", + "Purpose": "The aim of the aid provided is to support the distribution of agricultural products to children in nursery, primary and secondary schools with the objective to increase their fruit, vegetables and milk consumption and improve their eating habits.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 04"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.4", + "Name": "Exceptional measures (Chapter I, Sections 1, 2 and 3)", + "Purpose": "The aim of the exceptional measures granted under Article 219(1), Article 220(1) and Article 221(1) and (2) of Regulation (EU) No 1308/2013 is to support agricultural markets in accordance with Article 5(2), point (a), of Regulation (EU) 2021/2116.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 11"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.5", + "Name": "Aid in the fruit and vegetables sector (Chapter II, Section 3)", + "Purpose": "Growers are encouraged to join producer organisations (POs). These receive aid for implementing operational programmes, based on a national strategy. The aim of the aid granted is also to mitigate income fluctuation from crises. Aid is offered for crisis prevention and crisis management measures under operational programmes, i.e.: product withdrawal, green harvesting/non-harvesting, promotion and communication tools, training, harvest insurance, help to secure bank loans and cover administrative costs of setting up mutual funds (farmer-owned stabilisation funds).", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 06"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.6", + "Name": "Support in the wine sector (Chapter II, Section 4)", + "Purpose": "The aim of the various aids granted is to ensure market balance and increase the competitiveness of Union wine: support for promotion of wine on third country markets and information on responsible consumption of wine and the Union system of Protected Designation of Origin (PDO) and Protected Geographical Indication (PGI); co-financing of costs for restructuring and conversion of vineyards, for investments in wineries and in marketing facilities as well as for innovation; support for green harvesting, mutual funds, harvest insurance and by-product distillation.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 07"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.7", + "Name": "Support in the olive oil and tables olives sector (Chapter II, Section 2)", + "Purpose": "Support granted to the three-year work programmes to be drawn up by producer organisations, associations of producer organisations or inter-branch organisations in one or more of the following areas: market follow-up and management in the olive oil and table olives sector; the improvement of the environmental impact of olive cultivation; the improvement of the competitiveness of olive cultivation through modernisation; the improvement of the production quality of olive oil and table olives; the traceability system, the certification and protection of the quality of olive oil and table olives; the dissemination of information on measures carried out by producer organisations, associations of producer organisations or interbranch organisations to improve the quality of olive oil and table olives.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 05"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.8", + "Name": "Aid in the apiculture sector (Chapter II, Section 5)", + "Purpose": "The aim of the aid granted is to support this sector through apiculture programmes in order to improve the production and marketing of apiculture products.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 08"], + "Chapter_08_03": [] + } + }, + { + "Code": "IV.9", + "Name": "Aid in the hops sector (Chapter II, Section 6)", + "Purpose": "Aid granted to support hops producer organisations.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 09"], + "Chapter_08_03": [] + } + }, + { + "Code": null, + "Name": "Operation in the form of types of intervention for rural development as provided for in Article 69 of Regulation (EU) 2021/2115", + "Purpose": null, + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01"] + } + }, + { + "Code": "V.1", + "Name": "Environmental, climate and other management commitments", + "Purpose": "The aim of the aid granted is to compensate farmers, forest holders and other land managers for the additional costs and income foregone related to voluntary environment, climate and other management commitments undertaken which go beyond mandatory standards and which contribute to the specific objectives of the CAP, notably in the area of environment, climate and animal welfare.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0001"] + } + }, + { + "Code": "V.2", + "Name": "Natural or other area-specific constraints", + "Purpose": "The aim of the aid granted is to compensate farmers for all or part of the additional costs and income foregone related to the natural or other area-specific constraints in the area concerned, such as mountainous areas.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0002"] + } + }, + { + "Code": "V.3", + "Name": "Area-specific disadvantages resulting from certain mandatory requirements", + "Purpose": "The aim of the aid granted is to compensate farmers, forest holders and other land managers for all or part of the additional costs and income foregone related to certain area-specific disadvantages in the area concerned which are imposed by requirements resulting from the implementation of the Natura 2000 Directives (Council Directive 92/43/EEC³ and Directive 2009/147/EC of the European Parliament and of the Council⁴) or, for agricultural areas, the Water Framework Directive (Directive 2000/60/EC of the European Parliament and of the Council).", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0003"] + } + }, + { + "Code": "V.4", + "Name": "Investments, including investments in irrigation", + "Purpose": "The aim of the aid granted is to support investments in tangible or intangible assets, including investments in irrigation, that contribute to achieving one or more of the specific objectives of the CAP.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0004"] + } + }, + { + "Code": "V.5", + "Name": "Setting-up of young farmers, new farmers and rural business start-up", + "Purpose": "The aim of the aid granted is to support the setting-up of young farmers, new farmers and, under certain conditions, rural business start-up with the view of contributing to the achievement of one or more of the specific objectives of the CAP.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0005"] + } + }, + { + "Code": "V.6", + "Name": "Risk management tools", + "Purpose": "The aim of the aid granted is to promote risk management tools, which help farmers manage production and income risks related to their agricultural activity which are outside their control.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0006"] + } + }, + { + "Code": "V.7", + "Name": "Cooperation", + "Purpose": "The aim of the aid granted is to support cooperation with the view of contributing to the achievement of one or more of the specific objectives of the CAP. This includes cooperation support to:\n(a) prepare and implement Operational Group operations of the European Innovation Partnership for agricultural productivity and sustainability;\n(b) prepare and implement LEADER\n(c) promote and support Union and national recognised quality schemes and their use by farmers;\n(d) support producer groups, producer organisations or inter-branch organisations;\n(e) prepare and implement Smart Villages strategies;\n(f) support other forms of cooperation.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0007"] + } + }, + { + "Code": "V.8", + "Name": "Knowledge exchange and dissemination of information", + "Purpose": "The aim of the aid granted is to support knowledge exchange and information actions that contribute to one or more of the specific objectives of the CAP, specifically targeting the protection of nature, environment and climate, including environmental education and awareness actions and the development of rural businesses and communities. Such actions may include actions to promote innovation, training and advice as well as exchange and dissemination of knowledge and information.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08030101 0008"] + } + }, + { + "Code": "VI.1", + "Name": "Knowledge transfer and information actions (Article 14)", + "Purpose": "This measure concerns training and other types of activities such as workshops, coaching, demonstration activities, information actions, short-term farm and forest exchange and visit schemes in order. The aim is to enhance the human potential of persons engaged in the agricultural, food and forestry sectors, land managers and small and medium-sized enterprises (SMEs) operating in rural areas.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 01", "08 03 01 03 01"] + } + }, + { + "Code": "VI.2", + "Name": "Advisory services, farm management and farm relief services (Article 15)", + "Purpose": "This measure, through the use of advisory services as well as the setting up of advisory, farm management and farm relief services, aims to improve the sustainable management and the economic and environmental performance of farm and forest holdings and SMEs operating in rural areas. It also promotes the training of advisors.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 02", "08 03 01 03 02"] + } + }, + { + "Code": "VI.3", + "Name": "Quality schemes for agricultural products and foodstuffs (Article 16)", + "Purpose": "The aim of this measure is to support all new entrants to the Union, national and voluntary quality schemes. Support may also cover costs arising from information and promotion activities in order to improve consumers' awareness of the existence and specifications of products produced under these Union and national quality schemes.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 03", "08 03 01 03 03"] + } + }, + { + "Code": "VI.4", + "Name": "Investments in physical assets (Article 17)", + "Purpose": "The aim of this measure is to improve the economic and environmental performance of agricultural holdings and rural enterprises, improve the efficiency of the agricultural products marketing and processing sectors, provide infrastructure needed for the development of agriculture and forestry and support non-remunerative investments necessary to achieve environmental aims.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 04", "08 03 01 03 04"] + } + }, + { + "Code": "VI.5", + "Name": "Restoring agricultural production potential damage by natural disasters and introduction of appropriate prevention actions (Article 18)", + "Purpose": "The aim of this measure is to help farmers prevent natural disasters and catastrophic events or restore agricultural potential, which has been damaged, after its formal recognition by the competent public authorities of Member States, in order to help farm viability and competitiveness in the face of such events.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 05", "08 03 01 03 05"] + } + }, + { + "Code": "VI.6", + "Name": "Farm and business development (Article 19)", + "Purpose": "The aim of this measure is to support the creation and development of new viable economic activities such as new holdings run by young farmers, new businesses in rural areas, or the development of small farms. Support is also given to new or existing enterprises for investments and development of non-agricultural activities which are essential for the development and competitiveness of rural areas and of all farmers diversifying their agricultural activities. The measure provides payments for farmers eligible for the small farmers scheme who permanently transfer their holding to another farmer.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 06", "08 03 01 03 06"] + } + }, + { + "Code": "VI.7", + "Name": "Basic services and village renewal in rural areas (Article 20)", + "Purpose": "The aim of this measure is to support the interventions stimulating growth and promoting environmental and socio-economic sustainability of rural areas, in particular through the development of local infrastructure (including broadband, renewable energy and social infrastructure) and local basic services, as well as through the renewal of villages and activities aimed at the restoration and upgrading of the cultural and natural heritage. The measure also supports the relocation of activities and conversion of facilities with a view to improving the quality of life or increasing the environmental performance of the settlement.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 07", "08 03 01 03 07"] + } + }, + { + "Code": "VI.8", + "Name": "Investments in forest area development and improvement of the viability of forests (Article 21, Articles 22 to 26)", + "Purpose": "The aim of this measure is to promote investments in development of woodlands, in forest protection, in innovation in forestry, in forestry technologies and forest products, in order to contribute to the growth potential of rural areas.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 08", + "08 03 01 02 37", + "08 03 01 02 47", + "08 03 01 02 57", + "08 03 01 03 08", + "08 03 01 03 37", + "08 03 01 03 47", + "08 03 01 03 57" + ] + } + }, + { + "Code": "VI.9", + "Name": "Afforestation and creation of woodland (Article 22)", + "Purpose": "The aim of this sub-measure is to provide support for operations of afforestation and creation of woodland on agricultural and non-agricultural land.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.10", + "Name": "Establishment, regeneration or renovation of agroforestry systems (Article 23)", + "Purpose": "The aim of this sub-measure is to support the establishment of agroforestry systems and practices where woody perennials are deliberately integrated with crops and/or animals on the same land unit.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.11", + "Name": "Prevention and restoration of damage to forests from forest fires, natural disasters and catastrophic events (Article 24)", + "Purpose": "This sub-measure aims at preventing and restoring (clearing and replanting) forestry potential after the occurrence of forest fires, other natural disasters including pest and disease outbreaks, as well as climate change related threats.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.12", + "Name": "Investments improving the resilience and environmental value of forest ecosystems (Article 25)", + "Purpose": "The aim of this sub-measure is to support actions that enhance the environmental value of the forest, facilitate the adaptation and mitigation of forests to climate change, provide ecosystem services and enhance the public amenity value of forest. The increase of the environmental value of the forest should be ensured.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.13", + "Name": "Investments in forest technologies, processing, mobilising and marketing of forest products (Article 26)", + "Purpose": "This sub-measure aims at providing support for investment in machinery and/or equipment related to harvesting, cutting, mobilising, processing the wood prior to industrial sawing of wood. The main goal of this sub-measure is to improve the economic value of forests.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["See VI.8"] + } + }, + { + "Code": "VI.14", + "Name": "Setting up of producer groups and organisations (Article 27)", + "Purpose": "The aim of this measure is to support the setting up of producer groups and organisations, especially in the early years, when additional costs are incurred so as to face jointly market challenges and strengthening bargain power in relation to production and marketing, including in local markets.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 09", "08 03 01 03 09"] + } + }, + { + "Code": "VI.15", + "Name": "Agri-environment-climate (Article 28)", + "Purpose": "The aim of this measure is to encourage land managers to apply farming practices contributing to the protection of the environment, landscape, natural resources and climate mitigation and adaptation. It may concern not only environmentally beneficial improvements to farming practice but also the maintenance of existing beneficial practices.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 10", + "08 03 01 02 30", + "08 03 01 02 40", + "08 03 01 02 50", + "08 03 01 02 60", + "08 03 01 03 10", + "08 03 01 03 30", + "08 03 01 03 40", + "08 03 01 03 50", + "08 03 01 03 60" + ] + } + }, + { + "Code": "VI.16", + "Name": "Organic farming (Article 29)", + "Purpose": "The aim of this measure is to focus on supporting the conversion to and/or the maintenance of organic farming practices and methods, with a view to encourage farmers to participate in such schemes, thus answering to society's demand for the use of environmentally friendly farm practices.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 11", + "08 03 01 02 31", + "08 03 01 02 41", + "08 03 01 02 51", + "08 03 01 02 61", + "08 03 01 03 11", + "08 03 01 03 31", + "08 03 01 03 41", + "08 03 01 03 51", + "08 03 01 03 61" + ] + } + }, + { + "Code": "VI.17", + "Name": "Natura 2000 and Water Framework Directive payments (Article 30)", + "Purpose": "The aim of this measure is to give compensatory support to beneficiaries who suffer from particular disadvantages due to specific mandatory requirements in the areas concerned resulting from the implementation of Directives 92/43/EEC, 2009/147/EC and 2000/60/EC when compared to the situation of farmers and foresters in other areas not concerned by these disadvantages.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 12", + "08 03 01 02 32", + "08 03 01 02 42", + "08 03 01 02 52", + "08 03 01 02 62", + "08 03 01 03 12", + "08 03 01 03 32", + "08 03 01 03 42", + "08 03 01 03 52", + "08 03 01 03 62" + ] + } + }, + { + "Code": "VI.18", + "Name": "Payments to areas facing natural or other specific constraints (Article 31)", + "Purpose": "The aim of this measure is to give support to beneficiaries who suffer from particular constraints due to their location in mountain areas or other areas facing significant natural constraints or specific constraints.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 13", + "08 03 01 02 33", + "08 03 01 02 43", + "08 02 01 02 53", + "08 03 01 02 63", + "08 03 01 03 13", + "08 03 01 03 33", + "08 03 01 03 43", + "08 02 01 03 53", + "08 03 01 03 63" + ] + } + }, + { + "Code": "VI.19", + "Name": "Animal welfare (Article 33)", + "Purpose": "The aim of this measure is to provide payments to farmers who undertake, on a voluntary basis, to carry out operations of one or more animal welfare commitments.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 14", + "08 03 01 02 34", + "08 03 01 02 44", + "08 03 01 02 54", + "08 03 01 02 64", + "08 03 01 03 14", + "08 03 01 03 34", + "08 03 01 03 44", + "08 03 01 03 54", + "08 03 01 03 64" + ] + } + }, + { + "Code": "VI.20", + "Name": "Forest-environmental and climate services and forest conservation (Article 34)", + "Purpose": "The aim of this measure is to respond to the needs of promoting the sustainable management and improvement of forests and woodland, including the maintenance and improvement of biodiversity, water and soil resources and combating climate change and also to the need to conserve the forest genetic resources, including activities such as development of different varieties of forest species in order to adapt to specific local conditions.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 15", + "08 03 01 02 35", + "08 03 01 02 45", + "08 03 01 02 55", + "08 03 01 02 65", + "08 03 01 03 15", + "08 03 01 03 35", + "08 03 01 03 45", + "08 03 01 03 55", + "08 03 01 03 65" + ] + } + }, + { + "Code": "VI.21", + "Name": "Cooperation (Article 35)", + "Purpose": "The aim of this measure is to promote forms of co-operation involving at least two entities and aiming to develop, among others: pilot projects; new products, practices, processes and technologies in the agriculture, food and forestry sectors; tourism services; short supply chains and local markets; joint projects / practices concerning the environment / climate change; projects for the sustainable provision of biomass; non-LEADER local development strategies; forest management plans; and diversification into \"social farming\" activities.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 16", "08 03 01 03 16"] + } + }, + { + "Code": "VI.22", + "Name": "Risk management (Article 36)", + "Purpose": "This measure represents a new risk management toolkit and takes forward the possibilities that currently exist to support insurances and mutual funds via Member States' national direct payment envelopes to help farmers exposed to increasing economic and environmental risks. The measure also introduces an income stabilisation tool to provide compensation to farmers suffering a severe drop in their income.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 17", "08 03 01 03 17"] + } + }, + { + "Code": "VI.22a", + "Name": "Exceptional temporary support to farmers and SMEs particularly affected by the COVID-19 crisis (Article 39b)", + "Purpose": "The aim of this measure offers is to offer to farmers and to small and medium-sized enterprises (SMEs) temporary support due to the Covid-19 crisis.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 21"] + } + }, + { + "Code": "VI.22b", + "Name": "Exceptional temporary support to farmers and SMEs particularly affected by the Russia's invasion of Ukraine (Article 39c)", + "Purpose": "The aim of this measure is to offer to farmers and to small and medium-sized enterprises (SMEs) temporary support due to Russia's invasion of Ukraine.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 22"] + } + }, + { + "Code": "VI.23", + "Name": "Financing of complementary national direct payments for Croatia (Article 40)", + "Purpose": "The aim of this measure is to offer to the farmers eligible for complementary national direct payments in Croatia a top-up payment under the EAFRD.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 18"] + } + }, + { + "Code": "VI.24", + "Name": "Support for LEADER local development (community-led local development) (Article 35 of Regulation (EU) No 1303/2013 of the European Parliament and of the Council⁶)", + "Purpose": "The aim of this measure is to maintain LEADER as an integrated territorial development tool on sub-regional ('local') level which will directly contribute to the balanced territorial development of rural areas, which is one of the overall objectives of the rural development policy.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": [ + "08 03 01 02 19", + "08 03 01 02 39", + "08 03 01 02 49", + "08 03 01 02 59", + "08 03 01 02 69", + "08 03 01 03 19", + "08 03 01 03 39", + "08 03 01 03 49", + "08 03 01 03 59", + "08 03 01 03 69" + ] + } + }, + { + "Code": "VI.25", + "Name": "Technical assistance (Articles 51 to 54)", + "Purpose": "The aim of this measure is to give to Member States the ability to provide a technical assistance to support actions that support administrative capacity linked to the management of European Structural and Investment (ESI) Funds. These actions may be addressed to the preparation, management, monitoring, evaluation, information and communication, networking, complaint resolution and control and audit of the Rural Development Programmes.", + "Nomenclature": { + "Chapter_08_02": [], + "Chapter_08_03": ["08 03 01 02 20", "08 03 01 03 20"] + } + }, + { + "Code": "VII.1", + "Name": "Measures provided for in Regulation (EU) No 228/2013", + "Purpose": "POSEI measures are specific agricultural schemes aiming at taking into account the constraints of the Outermost Regions as required by Article 349 of the Treaty. It consists of two main elements: the specific supply arrangements and the measures to support local production. The former aims at mitigating additional costs for supplying essential products resulting from the remoteness of these regions (through aid for products from the Union and exemption from import duties for products from third countries) and the latter at assisting the development of the local agriculture sector (direct payments and market measures). POSEI also allow the financing of plant-health programmes.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 01", "08 02 05 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "VIII.1", + "Name": "Measures provided for in Regulation (EU) No 229/2013", + "Purpose": "The regime for the smaller Aegean Islands is similar to POSEI but does not have the same legal basis in the Treaty and operates on a smaller scale than POSEI. It includes both the specific supply arrangements (limited however to aid for products from the Union) and the measures to support the local agricultural activities consisting in top-up payments for specifically defined local products.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 01", "08 02 05 01"], + "Chapter_08_03": [] + } + }, + { + "Code": "IX.1", + "Name": "Information and promotion measures provided for in Regulation (EU) No 1144/2014", + "Purpose": "Information provision and promotion measures concerning agricultural products and certain food products based on agricultural products implemented in the internal market or in third countries as listed in Regulation (EU) No 1144/2014 may be fully or partly financed by the Union budget, subject to the conditions laid down in this Regulation. These measures shall take the form of information and promotion programmes.", + "Nomenclature": { + "Chapter_08_02": ["08 02 03 02"], + "Chapter_08_03": [] + } + } +] diff --git a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py index 501e012..ea21b5c 100644 --- a/scrapy_fs/scrapy_fs/spiders/pl_scraper.py +++ b/scrapy_fs/scrapy_fs/spiders/pl_scraper.py @@ -1,6 +1,64 @@ -# -*- encoding: utf-8 -*- -import re +""" + +source data required columns + + country + year + recipient_name + amount + currency + + +additional columns that are taken if present + + recipient_id (helps for deduping if source supplies an identifier) + recipient_address + recipient_street + recipient_street1 + recipient_street2 + recipient_postcode + recipient_country + recipient_url (source url to original data platform?) + scheme (EU measurement) + scheme_name + scheme_code + scheme_code_short + scheme_description + scheme_1 + scheme_2 + amount_original + currency_original + + # print(response.json()) + # https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page=10000&size=50&sort=¤cy.equals=pln&year.equals=2022 + + # item + + { + "id" : 14139415, + "identyfikator" : null, + "year" : 2022, + "firstname" : "ANDRZEJ", + "surname" : "NOWOTNIK", + "name" : null, + "taxnumber" : "8111007587", + "idnumber" : "71113001378", + "otherdocument" : null, + "regon" : null, + "state" : "KAZANÓW", + "postal" : "26-713", + "payment" : 0.0, + "efrg" : 0.0, + "prow" : 0.0, + "total" : 28384.98, + "substate" : "ZWOLEŃSKI", + "substate_postal" : "26-713" + }, { +""" + +import json import math +import os import scrapy from scrapy.spiders import Spider @@ -10,71 +68,157 @@ class PLSpider(Spider): name = "PL" - YEAR = 2014 - LIMIT = 50 - NUM_ONLY_RE = re.compile('^[\s\d]+$') - SEARCH_URL = 'http://beneficjenciwpr.minrol.gov.pl/search/index/page:{page}/year:{year}/limit:{limit}' + custom_settings = { + "AUTOTHROTTLE_ENABLED": False, + "LOG_LEVEL": "INFO", + # "CONCURRENT_REQUESTS": 20, + # "CONCURRENT_REQUESTS_PER_DOMAIN": 20, + } + + def __init__(self, year=None, raw=None, *args, **kwargs): + super().__init__(*args, **kwargs) + self.year = int(year) + self.raw = raw + self.page_size = 50 + self.expected_total_count = None + self.item_count = 0 + + # Load scheme mapping with normalized keys + scheme_path = os.path.join(os.path.dirname(__file__), "pl_scheme.json") + try: + with open(scheme_path, encoding="utf-8") as f: + scheme_data = json.load(f) + + # Normalize: "IV.9" -> "iv_9" + def normalize(code): + if not code: + return None + return code.lower().replace(".", "_") + + self.scheme_map = { + normalize(entry["Code"]): entry + for entry in scheme_data + if entry.get("Code") + } + except Exception as e: + self.scheme_map = {} + print(f"Could not load pl_scheme.json: {e}") + + def start_requests(self): - start_urls = [ - SEARCH_URL.format(page=1, year=YEAR, limit=LIMIT) - ] + url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page=0&size={self.page_size}&sort=¤cy.equals=pln&year.equals={self.year}" + yield scrapy.Request(url, callback=self.parse_total_count) + + def parse_total_count(self, response): + total_count = response.headers.get("X-Total-Count", None) + if not total_count: + raise ValueError( + f"X-Total-Count header not found in the response for year {self.year}" + ) + self.expected_total_count = int(total_count) + self.item_count = 0 + max_page = math.ceil(self.expected_total_count / self.page_size) + print(f"Total pages: {max_page}") + for x in range(0, max_page + 1): + url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary?first=0&page={x}&size={self.page_size}&sort=¤cy.equals=pln&year.equals={self.year}" + yield scrapy.Request(url, callback=self.parse) + + # GET https://beneficjenciwpr.minrol.gov.pl/api/beneficiary/13139415 def parse(self, response): + if self.raw: + yield {"url": response.url, "raw": json.dumps(response.json())} + + for item in response.json(): + # Prepare partial data + name = "" + first_name = item.get("firstname", "") + if first_name: + name = first_name + " " + if item.get("name", ""): + name += item.get("name", "") + locality = item.get("state", "") + recipient_postcode = item.get("postal", "") + substate = item.get("substate", "") + if substate and substate != item.get("state", ""): + if locality: + locality += ", " + locality += substate + else: + locality = substate + substate_postal = item.get("substate_postal", "") + + if substate_postal and substate_postal != recipient_postcode: + if locality: + locality += ", " + locality += substate_postal + else: + locality = substate_postal + + # amount = item.get("total", 0.0) + identifier = f"{item.get('id', '')}-{item.get('taxnumber', '')}-{item.get('idnumber', '')}" + + # Prepare meta for detail request + meta = { + "country": "PL", + "currency": "PLN", + "year": self.year, + "recipient_name": name, + "recipient_location": locality, + "recipient_postcode": recipient_postcode, + # "amount": amount, + "recipient_id": identifier, + } + detail_url = f"https://beneficjenciwpr.minrol.gov.pl/api/beneficiary/{item.get('id')}" + yield scrapy.Request(detail_url, callback=self.parse_detail, meta=meta) - if '/outrecords/privateacc' in response.url: - # accept terms - yield scrapy.FormRequest.from_response(response, - formxpath='.//div[@class="privacy"]//form', - formdata={ - 'data[Outrecord][accept]': '1' - }, callback=self.parse) + def parse_detail(self, response): + meta = response.meta + detail_data = response.json() + + if self.raw: + yield {"url": response.url, "raw": json.dumps(detail_data)} return - max_items = int(response.css('.search_quotes').re('znaleziono: (\d+) beneficjent')[0]) - max_pages = int(math.ceil(max_items / float(self.LIMIT))) - for x in self.search(response): - yield x - for page in range(2, max_pages + 1): - yield scrapy.Request(self.SEARCH_URL.format(page=page, - year=self.YEAR, limit=self.LIMIT), callback=self.search) - - def search(self, response): - url = response.xpath('//table[@class="search_res"]//tr/td/a/@href')[0].extract() - url = response.urljoin(url) - yield scrapy.Request(url, callback=self.detail) - - def detail(self, response): - recipient_url = response.url - url_id = recipient_url.rsplit('/')[-1] - - keys = [x.extract().strip() for x in response.xpath('//div[@class="outrecord_label"]//text()')] - values = [x for x in response.xpath('//div[@class="outrecord_data"]')] - values = [v.xpath('.//text()')[0].extract() if v.xpath('.//text()') else '' for v in values] - data = dict(zip(keys, values)) - year = int(data[u'Rok budżetowy']) - recipient_name = [ - data[u'Imię beneficjenta'], data[u'Nazwisko beneficjenta'], - data[u'Nazwa beneficjenta'] - ] - recipient_name = ' '.join(x.strip() for x in recipient_name if x.strip()) - recipient_postcode = data[u'Kod pocztowy'] - recipient_location = data[u'Nazwa gminy'] - recipient_id = 'PL-%s-%s' % (year, url_id) - - for line in response.xpath('.//div[@class="outrecord_left_green"]/div'): - amount = line.xpath('.//div[@class="outrecord_data_green"]//text()')[0].extract() - amount = float(amount.replace(' ', '').replace(',', '.')) - if not amount: - continue - scheme = line.xpath('.//div[@class="outrecord_label_green"]//text()')[0].extract() - yield FarmSubsidyItem( - year=year, - scheme=scheme, - amount=amount, - recipient_id=recipient_id, - recipient_name=recipient_name, - recipient_location=recipient_location, - recipient_url=recipient_url, - recipient_postcode=recipient_postcode, - country='PL', currency='PLN', + + allowed_fields = { + "country", + "currency", + "year", + "recipient_name", + "recipient_location", + "recipient_postcode", + "recipient_id", + } + filtered_meta = {k: v for k, v in meta.items() if k in allowed_fields} + + for key, value in detail_data.items(): + if isinstance(value, (int, float)) and value != 0: + if key in ["year"]: + continue + scheme_code = key + # Normalize for lookup + norm_code = scheme_code.lower().replace(".", "_") + scheme_info = self.scheme_map.get(norm_code, {}) + scheme_name = scheme_info.get("Name", "") + scheme_description = scheme_info.get("Purpose", "") + + yield FarmSubsidyItem( + **filtered_meta, + scheme_code=scheme_code, + scheme_name=scheme_name, + scheme_description=scheme_description, + amount=value, + ) + + self.item_count += 1 + + def closed(self, reason): + + # For 2022, 50 are missing. Unclear why. + if not self.raw and hasattr(self, "expected_total_count"): + print( + f"Expected items: {self.expected_total_count}, Scraped items: {self.item_count}, Difference: {self.item_count - self.expected_total_count}" ) + if self.item_count != self.expected_total_count: + print("WARNING: Scraped item count does not match expected total!") diff --git a/scrapy_fs/scrapy_fs/spiders/ro_spider.py b/scrapy_fs/scrapy_fs/spiders/ro_spider.py new file mode 100644 index 0000000..e7a3803 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/ro_spider.py @@ -0,0 +1,201 @@ +import re + +import scrapy +from scrapy.spiders import Spider + +from ..items import FarmSubsidyItem + +# Acutally faster to scrape sequentially and not in parallel +SEQUENTIAL = True + + +def parse_float(value): + """ + Parse a string to a float, removing any non-numeric characters except for the decimal point. + """ + if not value: + return None + # Remove all characters except digits and decimal point + cleaned_value = re.sub(r"[^\d,]", "", value) + try: + return float(cleaned_value.replace(",", ".")) + except ValueError: + return None + + +class ROSpider(Spider): + """ + Spider for Romanias's CAP payments + """ + + name = "RO" + + custom_settings = {"AUTOTHROTTLE_ENABLED": not SEQUENTIAL, "LOG_LEVEL": "INFO"} + + # AMOUNT_RE = re.compile('[^\d\.]') + # BAD_NAME = u'ID not available' + + def __init__(self, year=None): + self.year = int(year) + # self.start_urls = [ + # f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber={x}&anFinanciar={self.year}" + # for x in range(1, 1000) + # ] + + def start_requests(self): + url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber=1&anFinanciar={self.year}" + if SEQUENTIAL: + yield scrapy.Request(url, callback=self.parse) + else: + yield scrapy.Request(url, callback=self.parse_total_pages) + + def parse_total_pages(self, response): + total_pages_url = response.css("a#btn-last-page::attr(href)").get() + + if total_pages_url: + page_pattern = re.compile(r"pageNumber=(\d+)") + match = page_pattern.search(total_pages_url) + + if match: + total_pages = int(match.group(1)) + for x in range(1, total_pages + 1): + url = f"https://plati.afir.info/Plati/AfisareListaPlatiEN?pageNumber={x}&anFinanciar={self.year}" + yield scrapy.Request(url, callback=self.parse) + + def parse(self, response): + # Loop through each table row + rows = response.css("#content tr") + + for row in rows: + # print(row) + # print(row.get()) + + # Extract data fields + beneficiary_name = row.xpath( + ".//td[contains(., 'BENEFICIARY NAME')]/div[@class='fw-bold-content']/text()" + ).get() + beneficiary_last_name = row.xpath( + """.//td[contains(., "BENEFICIARY'S LAST NAME")]/div[@class='fw-bold-content']/text()""" + ).get() + beneficiary_parent_company = row.xpath( + ".//td[contains(., 'PARENT COMPANY NAME AND TAX REGISTRATION CODE')]/div[@class='fw-bold-content']/text()" + ).get() + locality = row.xpath( + ".//td[contains(., 'LOCALITY')]/div[@class='fw-bold-content']/text()" + ).get() + measure_code = row.xpath( + ".//td[normalize-space(.//div[@class='fw-bold'])='MEASURE/INTERVENTION TYPE CODE']/div[@class='fw-bold-content']/text()" + ).get() + + objective = row.xpath( + ".//td[contains(., 'OBJECTIVE')]/div[@class='fw-bold-content']/text()" + ).get() + + fega_operation_amount = row.xpath( + ".//td[contains(., 'FEGA OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + + feadr_operation_amount = row.xpath( + ".//td[contains(., 'FEADR OPERATION AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + total_feadr_amount = row.xpath( + ".//td[contains(., 'TOTAL FEADR AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + + total_fega_amount = row.xpath( + ".//td[contains(., 'TOTAL FEGA AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + + operation_related_amount = row.xpath( + ".//td[contains(., 'OPERATION-RELATED AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + total_bene_cof_amount = row.xpath( + ".//td[contains(., 'TOTAL BENEFICIARY COFINANCING AMOUNT')]/div[@class='fw-bold-content']/text()" + ).get() + total_eu_amount = row.xpath( + ".//td[contains(., 'TOTAL EU AMOUNT FOR BENEFICIARY')]/div[@class='fw-bold-content']/text()" + ).get() + + schema = ( + measure_code + if measure_code + else "" + (" - " + objective if objective else "") + ) + name = "" + + if beneficiary_name: + name = beneficiary_name.strip() + + if beneficiary_last_name: + name += " " + beneficiary_last_name.strip() + + if beneficiary_parent_company: + name += ", " + beneficiary_parent_company.strip() + + if not name: + continue + print(row.get()) + print("No name available in row") + continue # Skip if no name is available + + total_feadr_amount = parse_float(total_feadr_amount) + total_fega_amount = parse_float(total_fega_amount) + total_eu_amount = parse_float(total_eu_amount) + + # if total_eu_amount: + # print(row.get()) + # raise ValueError("Total EU amount is there, which is unexpected.") + + if total_feadr_amount and total_fega_amount: + print(row.get()) + print(total_feadr_amount, total_fega_amount) + raise ValueError( + "Both total FEADR and total FEGA amounts are present, which is unexpected." + ) + amount = 0 + if total_feadr_amount: + schema = "FEADR: " + schema + amount = total_feadr_amount + + if total_fega_amount: + schema = "FEGA: " + schema + amount = total_fega_amount + + if amount and total_eu_amount and amount != total_eu_amount: + print(row.get()) + print( + f"Amount {amount} does not match total EU amount {total_eu_amount}, which is unexpected." + ) + raise ValueError( + f"Amount {amount} does not match total EU amount {total_eu_amount}, which is unexpected." + ) + + if not amount and total_eu_amount: + schema = "EU: " + schema + amount = total_eu_amount + + if not amount: + continue + # print("no amount") + print(row.get()) + print("No amount available in row") + raise ValueError("No amount available in row, which is unexpected.") + + yield FarmSubsidyItem( + country="RO", + currency="EUR", # It's displayed on the website in Euro and not RON! + year=self.year, + recipient_name=name, + recipient_location=locality, + scheme_name=schema, + amount=amount, + ) + + if SEQUENTIAL: + # Find the link to the next page + next_page = response.css("a#btn-next-page::attr(href)").get() + + # If there's a next page, yield a new request + if next_page: + next_page_url = response.urljoin(next_page) # Make the URL absolute + yield scrapy.Request(url=next_page_url, callback=self.parse) diff --git a/scrapy_fs/scrapy_fs/spiders/se_spider.py b/scrapy_fs/scrapy_fs/spiders/se_spider.py new file mode 100644 index 0000000..9747658 --- /dev/null +++ b/scrapy_fs/scrapy_fs/spiders/se_spider.py @@ -0,0 +1,279 @@ +""" +1. Open the website https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp +2. Select the year (e.g., 2023) from the dropdown menu +3. Select English as the language +4. Click the "Search" button +5. Change the page size to 100 +6. Open the web console, open a details view for a row and find the `ViewState` in a POST request body and the `JSESSIONID` cookie. +7. Copy the `ViewState` and `JSESSIONID` values into the code below +8. Run the spider with `scrapy crawl SE -a year=2023` +9. The results will be saved in the `responses` directory as HTML files named `{year}_{page_number}_{offset}.html` +10. Run the spider multile times since the website is flaky. + +You can increase `CONCURRENT_REQUESTS` but then you also have to run the spider again with only one thread. +This is because the details view requires that the current page is opened before being able to make requests for the detail view. +If you use multiple threads, the requests for the detail view might be made before the current page is opened, resulting in an HTML page that has no data (but has a 200 status). +""" + +import html +from pathlib import Path + +import scrapy +from scrapy.spiders import Spider + +from ..items import FarmSubsidyItem + +viewstate = "qLxOAX8P3CUJ2HoBKQ58ry6yueRR51e4gDGybvBgIv6IkDC9DdCFG7vwCpTi510VKfC44Znrou2hoTYsN2oEwS7nO5hTLV4ySkv8DEcF4HwPVKpf2g/vrQhUWbZ3B5xhtxjHyQNQVyitkbas" +cookie = "E87990DE319CDA5A80685A97BFF8EDFA" + +page_size = 100 +num_receivers = 62000 # in doubt, check it on the website +num_concurrent_requests = 1 # number of concurrent requests to make + + +class SESpider(Spider): + """ + Sweden's CAP payments + """ + + name = "SE" + + custom_settings = { + "AUTOTHROTTLE_ENABLED": False, + "LOG_LEVEL": "INFO", + "HTTPCACHE_ENABLED": False, + "CONCURRENT_REQUESTS": num_concurrent_requests, + "CONCURRENT_REQUESTS_PER_DOMAIN": num_concurrent_requests, + } + + def __init__(self, year=None): + super().__init__() + self.year = int(year) + + def start_requests(self): + for x in range(1, num_receivers // page_size + 2): + page_start = (x - 1) * page_size + page_end = page_start + page_size - 1 + + # It is ESSENTIAL to open the current page before being able to make requests for the detail view. + yield scrapy.FormRequest( + url="https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", + formdata={ + "AJAXREQUEST": "j_id0", + "searchResultsForm_SUBMIT": "1", + "javax.faces.ViewState": viewstate, + "searchResultsForm:j_id_jsp_121545192_121": str(x), + "ajaxSingle": "searchResultsForm:j_id_jsp_121545192_121", + "AJAX:EVENTS_COUNT": "1", + }, + cookies={ + "BIGipServerpool_epublik_http_8106": "2185762220.43551.0000", + "JSESSIONID": cookie, + }, + callback=self.parse, + ) + + for y in range(page_start, page_end + 1): + key = ( + "searchResultsForm:foundStodmottagare:" + + str(y) + + ":j_id_jsp_121545192_98" + ) + # check if file already exists + file_path = f"responses/{self.year}_{x}_{y}.html" + if Path(file_path).exists(): + text = Path(file_path).read_text(encoding="utf-8") + if 'class="stodmottagare selected"' in text: + # print( + # f"File {file_path} already exists and contains .selected, skipping request" + # ) + absolute_file_path = Path(file_path).resolve() + url = "file:///" + str(absolute_file_path) + # print(f"Using cached file: {url}") + yield scrapy.Request( + url=url, + callback=self.parse_response, + encoding="utf-8", + headers={ + "encoding": "utf-8", + }, + meta={"fn": absolute_file_path}, + ) + continue + else: + print( + f"File {file_path} exists but does not contain .selected, making request" + ) + # write to log file & skip request + # with open("log.txt", "a") as log_file: + # log_file.write( + # f"File {file_path} exists but does not contain .selected, making request\n" + # ) + # continue + + print(key) + yield scrapy.FormRequest( + dont_filter=True, + method="POST", + url="https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", + formdata={ + "AJAXREQUEST": "j_id0", + "searchResultsForm_SUBMIT": "1", + "javax.faces.ViewState": viewstate, + key: key, + }, + cookies={ + "BIGipServerpool_epublik_http_8106": "2185762220.43551.0000", + "JSESSIONID": cookie, + }, + headers={ + "Host": "etjanst.sjv.se", + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:139.0) Gecko/20100101 Firefox/139.0", + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.7,de-DE;q=0.3", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + # "Content-Length": "358", + "Origin": "https://etjanst.sjv.se", + "DNT": "1", + "Sec-GPC": "1", + # "Connection": "keep-alive", + "Referer": "https://etjanst.sjv.se/asken/faces/jbstod/searchJbstod.jsp", + }, + callback=self.parse2, + meta={ + "page_number": x, + "offset": y, + "fn": file_path, # Save the file path in meta for later use + }, + ) + + def parse2(self, response): + # get page number and offset from request meta + page_number = response.meta.get("page_number", None) + offset = response.meta.get("offset", None) + file_path = f"responses/{self.year}_{page_number}_{offset}.html" + + with open(file_path, "wb") as f: + f.write(response.body) + + return self.parse_response(response) + + def parse_response(self, response): + # print(response.encoding) + # Read again since the encoding is broken + body_text = Path(response.meta["fn"]).read_text(encoding="utf-8") + + # Handle XML declaration and namespace issues + # Remove XML declaration and convert to regular HTML for easier parsing + if body_text.startswith("") + if xml_end != -1: + body_text = body_text[xml_end + 2 :].strip() + + # Remove XHTML namespace to make CSS selectors work better + body_text = body_text.replace('xmlns="http://www.w3.org/1999/xhtml"', "") + + # print(body_text) # Print first 1000 characters for debugging + + # Create a new response object with cleaned HTML + from scrapy.http import TextResponse + + clean_response = TextResponse( + url=response.url, + body=body_text, + encoding=response.encoding, # Pass the original response's encoding + ) + + # Select div.selected and extract farm subsidy data + selected_div = clean_response.css("div.selected") + + if selected_div: + # Extract recipient information from the main columns + name = selected_div.css("div.stodmottagareColumn.namn::text").get() + county = selected_div.css("div.stodmottagareColumn.lan::text").get() + + municipality = selected_div.css( + "div.stodmottagareColumn.kommun::text" + ).get() + postal_address = selected_div.css( + "div.stodmottagareColumn.postadress::text" + ).get() + + # Get total amount + total_amount_text = selected_div.css( + "div.stodmottagareColumn.belopp::text" + ).get() + + if name and total_amount_text: + # Decode HTML entities and clean up amount + total_amount_text = html.unescape(total_amount_text).strip() + # Clean up the recipient name + name_clean = name.strip() + # total_amount = total_amount_text.replace("\u00a0", "").replace(" ", "") + + # Construct location string + location_parts = [] + if municipality: + municipality_clean = municipality.strip() + location_parts.append(municipality_clean) + if county: + county_clean = county.strip() + location_parts.append(county_clean) + if postal_address: + postal_address_clean = postal_address.strip() + location_parts.append(postal_address_clean) + + location = ", ".join(location_parts) if location_parts else "" + + # Extract individual subsidy details from stodRow elements + subsidy_rows = selected_div.css("div.stodRow") + + for row in subsidy_rows: + fund_type = row.css("div.stodItem.fondtyp::text").get() + category = row.css("div.stodItem.kategori::text").get() + specific_goal = row.css("div.stodItem.specifiktmal::text").get() + amount_text = row.css("div.stodItem.belopp::text").get() + + if amount_text: + # Clean up the individual amount + amount_text = html.unescape(amount_text).strip() + amount = amount_text.replace("\u00a0", "").replace(" ", "") + + scheme_description = "" + if fund_type: + scheme_description = fund_type.strip() + + scheme_name = "" + scheme_code = "" + + if category: + category_clean = category.strip() + # Extract scheme code from category (e.g., "II.1" from "II.1, Basic payment scheme...") + if "," in category_clean: + scheme_code = category_clean.split(",")[0].strip() + scheme_name = category_clean.split(",", 1)[1].strip() + else: + scheme_code = category_clean + scheme_name = category_clean + + if specific_goal and specific_goal.strip() != "-": + scheme_description += ( + f" | Specific Goal: {specific_goal.strip()}" + ) + + yield FarmSubsidyItem( + country="SE", + currency="SEK", + year=self.year, + recipient_name=name_clean, + recipient_location=location, + amount=amount, + scheme_name=scheme_name, + scheme_code=scheme_code, + scheme_description=scheme_description.strip(), + ) + + def parse(self, _response): + return diff --git a/scrapy_fs/scrapy_fs/spiders/sk_spider.py b/scrapy_fs/scrapy_fs/spiders/sk_spider.py index 1b537b6..00c1c26 100644 --- a/scrapy_fs/scrapy_fs/spiders/sk_spider.py +++ b/scrapy_fs/scrapy_fs/spiders/sk_spider.py @@ -11,13 +11,14 @@ class SKSpider(Spider): name = "SK" NUM_ONLY_RE = re.compile('^[\s\d]+$') + SEARCH_URL = 'https://www.apa.sk/index.php?offset={offset}&navID=511&euod=&eudo=&kod_opatrenia=&obec=&rok={year}&meno=&submit=H%C4%BEadaj' def __init__(self, year=None): self.year = int(year) def start_requests(self): - self.SEARCH_URL = 'http://www.apa.sk/index.php?offset=%s&navID=511&euod=&eudo=&order=&rok=' + str(self.year) - url = self.SEARCH_URL % '1' + offset = 0 + url = self.SEARCH_URL.format(year=self.year, offset=offset) yield scrapy.Request(url) def parse(self, response): @@ -28,8 +29,8 @@ def parse(self, response): for x in self.search_page(response): yield x - for i in range(2, max_page + 1): - yield scrapy.Request(self.SEARCH_URL % i) + for i in range(1, max_page - 1): + yield scrapy.Request(self.SEARCH_URL.format(year=self.year, offset=i), callback=self.search_page) def search_page(self, response): trs = response.xpath('.//table//tr') @@ -37,13 +38,14 @@ def search_page(self, response): if i == 0: continue tds = [x.xpath('.//text()').extract() for x in tr.xpath('./td')] + tds = [td[0] if len(td) else "" for td in tds] scheme = tds[3].strip() year = int(tds[5].strip()) amount = float(tds[4]) recipient_postcode = tds[1].strip() recipient_location = tds[2].strip() - recipient_name = tds[0] - if recipient_name.startswith('B20'): + recipient_name = tds[0].strip() + if recipient_name.isdigit(): recipient_id = u'SK-%s' % recipient_name recipient_name = '' else: diff --git a/special-scrapers/.gitignore b/special-scrapers/.gitignore new file mode 100644 index 0000000..5c1f1e5 --- /dev/null +++ b/special-scrapers/.gitignore @@ -0,0 +1,10 @@ +# Playwright +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ + +failed.txt +uploads3.sh +it_captcha/*.h5 diff --git a/special-scrapers/avg_new_files_per_minute.sh b/special-scrapers/avg_new_files_per_minute.sh new file mode 100755 index 0000000..1dd1f3b --- /dev/null +++ b/special-scrapers/avg_new_files_per_minute.sh @@ -0,0 +1,20 @@ +#!/bin/bash +DIR="data/it" # <-- set this to your target folder + +# Get current time and 1 hour ago, in seconds since epoch +now=$(date +%s) +start=$((now - 300)) + +# List all files, get their mtime in seconds since epoch +find "$DIR" -type f -exec stat -f "%m" {} \; | \ +awk -v start="$start" -v now="$now" ' + $1 >= start && $1 <= now { + minute = int(($1 - start) / 60); + count[minute]++; + } + END { + for (i in count) { total += count[i]; mins++ } + if (mins > 0) print "Average files per minute (last 5 min):", total/mins; + else print 0 + } +' diff --git a/special-scrapers/it.js b/special-scrapers/it.js new file mode 100644 index 0000000..619b4d7 --- /dev/null +++ b/special-scrapers/it.js @@ -0,0 +1,396 @@ +const playwright = require("playwright"); +const fs = require("fs"); +const { default: PQueue } = require("p-queue"); +const { get } = require("http"); +const fetch = (...args) => + import("node-fetch").then((mod) => mod.default(...args)); +const FormData = require("form-data"); +const csv = require("csv-parser"); + +const CONCURRENCY = 10; +const TIMEOUT = 30000; +const MAX_RETRIES = 20; + +const dump = + "/Users/user/SynologyDrive/Beruf/Projekte/farmsubsidies/dumps/it_2023/Trasparenza2023_Ita.csv"; + +async function readCsv(dump) { + return new Promise((resolve, reject) => { + const results = []; + fs.createReadStream(dump) + .pipe(csv({ separator: ";" })) + .on("data", (data) => results.push(data)) + .on("end", () => resolve(results)) + .on("error", reject); + }); +} + +const scrapeTable = async (page, code, location) => { + const table = await page.locator("table#results"); + const tableHtml = await table.innerHTML(); + if (tableHtml.length > 1) { + fs.writeFileSync(`data/it/${location}-${code}.html`, tableHtml); + console.log(`Page ${code} ${location} saved to file.`); + return true; + } + return false; +}; + +// // generate strings from 01 to 99 +// const generateAllCodes = () => { +// const codes = []; +// for (let i = 10; i <= 99; i++) { +// const code = i.toString().padStart(2, "0"); +// codes.push(code); +// } +// return codes; +// }; + +const solveCaptcha = async (page) => { + // Find the captcha image and get its src + const captchaImg = await page.locator("img[src*='Captcha.jpg']"); + const imgSrc = await captchaImg.getAttribute("src"); + // console.log("Captcha image source:", imgSrc); + + // Take a screenshot of the captcha image as a buffer + const captchaBuffer = await captchaImg.screenshot(); + + // Use Node.js FormData + const formData = new FormData(); + formData.append("file", captchaBuffer, { + filename: "captcha.jpg", + contentType: "image/jpeg", + }); + + // Send the image to the server for processing + const response = await fetch("http://127.0.0.1:5001/predict", { + method: "POST", + body: formData, + headers: formData.getHeaders(), + }); + + const result = await response.json(); + console.log("Captcha result:", result); + + return result.result; // or handle error/result as needed +}; + +const getResult = async (page, location, code) => { + // enter location, input with name 'ricercaComuneResidenza' + await page.locator("input[name='ricercaComuneResidenza']").fill(location); + await page.waitForTimeout(1000); + + if (code.includes("-")) { + // split code by '-' + const codeParts = code.split("-"); + // enter code, input with name 'ricercaMacroMisura' + await page + .locator("select[name='ricercaMacroMisura']") + .selectOption(codeParts[0]); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + + // get all options from select with name 'ricercaMisura' + const options = await page + .locator("select[name='ricercaMisura'] option") + .all(); + const idx = parseInt(codeParts[1]); + if (!options[idx]) { + throw new Error( + `Option index ${idx} not found in 'ricercaMisura' select` + ); + } + const val = await options[idx].getAttribute("value"); + await page.locator("select[name='ricercaMisura']").selectOption(val); + + if (codeParts.length > 2) { + await page + .locator("select[name='ricercaImportoPagamenti']") + .selectOption(codeParts[2]); + } + } else { + await page.locator("select[name='ricercaMacroMisura']").selectOption(code); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + } + + const captchaResult = await solveCaptcha(page); + + await page.locator("input[name='caratteriImmagine']").fill(captchaResult); + + // click on the button with the text "Find" + await page.locator("input:has-text('Find')").first().click(); + + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + + // The characters you type do not match those in the image. + + const errorMessage = await page + .locator("img:has-text('do not match')") + .isVisible(); + + if (errorMessage) { + console.log("Captcha error, retrying..."); + return getResult(page, location, code); + } + + // No beneficiary found for the chosen criteria. + const noResults = await page + .locator("text=No beneficiary found for the chosen criteria.") + .isVisible(); + + if (noResults) { + fs.writeFileSync(`data/it/${location}-${code}.html`, "No results"); + console.log("No results found for code", code, location); + return; + } + + const isSuccess = await scrapeTable(page, code, location); + + if (isSuccess) { + console.log("Success! Found results for code", code, location); + } + + if (!isSuccess) { + console.log("No results found for code", code, location); + throw new Error("No results found"); + } + return; +}; + +const oneRun = async (browser, location, code) => { + let tryCount = 0; + while (tryCount < MAX_RETRIES) { + try { + console.log( + `Starting run for code ${location} ${code}, try ${tryCount + 1}` + ); + // skip if html file exists + if (fs.existsSync(`data/it/${location}-${code}.html`)) { + console.log(`Code ${code} already exists, skipping.`); + return; + } + if (CONCURRENCY > 1) { + const randomWait = Math.floor(Math.random() * TIMEOUT); + await new Promise((resolve) => setTimeout(resolve, randomWait)); + } + const context = await browser.newContext({ ignoreHTTPSErrors: true }); // Bypass SSL errors + context.setDefaultTimeout( + tryCount > MAX_RETRIES / 2 ? TIMEOUT * 2 : TIMEOUT + ); + const page = await context.newPage(); + + await page.goto( + "https://www.agea.gov.it/portale-agea/servizi/pubblicazione-dei-beneficiari" + ); + await page.waitForLoadState("networkidle"); + // await page.waitForTimeout(1000); + + // click on first button with the text "Vai al servizio" + await page + .locator("button span:has-text('Vai al servizio')") + .first() + .click(); + + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(2000); + + // close old tab + const pages = context.pages(); + // console.log("Pages length:", pages.length); + if (pages.length > 1) { + // focus on new tab + await pages[1].bringToFront(); + // console.log("Focused on new tab"); + // close old tab + await pages[0].close(); + // console.log("Closed old tab"); + } + + const newPage = context.pages()[0]; + + // click on the link with the title "English" + await newPage.waitForTimeout(5000); + await newPage.locator("img[title='English']").first().click(); + await newPage.waitForLoadState("networkidle"); + await newPage.waitForTimeout(5000); + // click on the link with the text "Search for beneficiaries" + + await newPage.locator("a:has-text('BENEFICIARIES')").first().click(); + await newPage.waitForLoadState("networkidle"); + // await newPage.waitForTimeout(2000); + + await getResult(newPage, location, code); + + console.log(`Finished ${code}.`); + await newPage.close(); + break; // Success, exit retry loop + } catch (error) { + tryCount++; + console.error(`Error in code ${code} (try ${tryCount}):`, error); + if (tryCount >= MAX_RETRIES) { + console.error( + `Failed after ${MAX_RETRIES} attempts for code ${code}, location ${location}` + ); + // append location and code to a file + fs.appendFileSync("failed.txt", `${location}-${code}\n`); + } else { + console.log( + `Retrying code ${code}, location ${location} (attempt ${ + tryCount + 1 + })...` + ); + } + } + } +}; + +(async () => { + const launchOptions = { + headless: true, + }; + + const browser = await playwright.chromium.launch(launchOptions); + + const queue = new PQueue({ concurrency: CONCURRENCY }); + // const allCodes = generateAllCodes(); + let allCodes = [ + "1", + "2-1", + "2-2", + "2-3", + "2-4", + "2-5", + "2-6-1", + "2-6-2", + "2-6-3", + "2-6-4", + "2-6-5", + "2-6-6", + "2-7-1", + "2-7-2", + "2-7-3", + "2-7-4", + "2-7-5", + "2-7-6", + "2-8-1", + "2-8-2", + "2-8-3", + "2-8-4", + "2-8-5", + "2-8-6", + "2-9", + "2-10", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ]; + + for (let j = 1; j < 7; j++) { + for (let i = 1; i < 25; i++) { + allCodes.push("4-" + i + "-" + j); + } + // for (let i = 1; i < 25; i++) { + allCodes.push("2-" + "5" + "-" + j); + allCodes.push("2-" + "9" + "-" + j); + allCodes.push("2-" + "10" + "-" + j); + // } + } + // allCodes = [...allCodes, ...allCodes, ...allCodes]; + // allCodes = [...allCodes, ...allCodes, ...allCodes]; + + const results = await readCsv(dump); + const allLocation = results.map((row) => row["Comune"]); + + // get counts of all locations + const locationCounts = {}; + allLocation.forEach((location) => { + if (locationCounts[location]) { + locationCounts[location]++; + } else { + locationCounts[location] = 1; + } + }); + // sort locations by count + const sortedLocations = Object.entries(locationCounts).sort( + (a, b) => b[1] - a[1] + ); + console.log("Sorted locations:", sortedLocations.slice(0, 10)); + + // displat locations with onle one entry + const singleEntryLocations = Object.entries(locationCounts).filter( + (entry) => entry[1] == 1 + ); + // console.log("Locations with only one entry:", singleEntryLocations); + + // only keep locations with more than 10 entries + const filteredLocations = Object.entries(locationCounts) + .filter((entry) => entry[1] > 1) + .filter((entry) => entry[0] != "ROMA") + .filter((entry) => entry[0] != "SISSA TRECASALI") + .filter((entry) => entry[0] != "BADIA .ABTEI.") + .filter((entry) => entry[0] != "APPIANO SULLA STRADA DEL VIN") + .filter((entry) => entry[0] != "MONTEBELLO JONICO") + .filter((entry) => entry[0] != "RENON .RITTEN.") // buggy location + .sort((a, b) => b[1] - a[1]); + // console.log("Locations with more than 10 entries:", filteredLocations); + + const uniqueLocations = filteredLocations.map((entry) => entry[0]); + // const uniqueLocations = [...new Set(allLocation)]; + + console.log("Unique locations:", uniqueLocations.length); + + const allPromises = []; + + const unfinished = allCodes + .filter((code) => { + return ( + !fs.existsSync(`data/it/${""}-${code}.html`) && + code.split("-").length == 3 + ); + }) + .map((code) => { + // if (code[0] == "2" && "678".includes(code.split("-")[1])) return code; + if (code[0] == "2") return code[0] + "-" + code.split("-")[1]; + + return code.split("-")[0]; + }); + + const setUnfinished = new Set(unfinished); + const unfinishedArray = [...setUnfinished]; + + for (const location of uniqueLocations) { + if (!location) continue; + // for (const location of uniqueLocations) { + // for (const code of allCodes) { + // if (code.split("-").length == 3) { + // allPromises.push(queue.add(() => oneRun(browser, location, code))); + // } + // } + for (const code of unfinishedArray) { + if (["NOCI", "DELICETO"].includes(location) && code.startsWith("2-7")) { + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-1"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-2"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-3"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-4"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-5"))); + allPromises.push(queue.add(() => oneRun(browser, location, "2-7-6"))); + } else { + allPromises.push(queue.add(() => oneRun(browser, location, code))); + } + } + } + + // const allPromises = allCodes.map((code) => { + // return queue.add(() => oneRun(browser, "Roma", code)); + // }); + await Promise.all(allPromises); + console.log("All pages scraped."); + + await browser.close(); +})(); diff --git a/special-scrapers/it_captcha/captcha.py b/special-scrapers/it_captcha/captcha.py new file mode 100644 index 0000000..d6beed5 --- /dev/null +++ b/special-scrapers/it_captcha/captcha.py @@ -0,0 +1,396 @@ +""" +# /// script +# dependencies = [ +# "keras==3.9.2", +# "numpy==2.1.3", +# "pillow==11.2.1", +# "requests==2.32.3", +# "tensorflow==2.19.0", +# ] +# /// +""" + +import base64 +import io +import os + +import numpy as np +from keras.layers import ( + Activation, + BatchNormalization, + Conv2D, + Dense, + Dropout, + Flatten, + MaxPooling2D, +) +from keras.models import Sequential +from keras.preprocessing.image import img_to_array +from tensorflow import keras + +Adam = keras.optimizers.Adam + +from PIL import Image +from flask import Flask, request, jsonify + +NOISE_BACKGROUND = (255, 255, None) +BACKGROUND = (255, 255, 255) +TEXT_NOISE = (0, 5, 255) +TEXT = (0, 0, 0) +NOISE = (0, 0, 0) +THRESHOLD = 140 + +CLASSES = [ + "3", + "4", + "6", + "7", + "8", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "k", + "r", + "s", + "t", + "v", + "x", + "y", +] +IMG_SIZE = (22, 50) + + +def normalize_color(im, from_color, to_color, threshold): + im = im.copy() + w, h = im.size + for i in range(w): + for j in range(h): + p = im.getpixel((i, j)) + if not isinstance(p, tuple): + p = (p,) + diff = [ + abs(x - from_color[k]) + for k, x in enumerate(p) + if from_color[k] is not None + ] + if all(map(lambda x: x < threshold, diff)): + im.putpixel((i, j), to_color) + return im + + +def non_white(p_list): + diff = [abs(x - BACKGROUND[i]) for p in p_list for i, x in enumerate(p)] + return any(map(lambda x: x > 0, diff)) + + +def all_white(p_list): + diff = [abs(x - BACKGROUND[i]) for p in p_list for i, x in enumerate(p)] + return all([x == 0 for x in diff]) + + +def check_image(im, width_range, check_func=non_white): + w, h = im.size + for i in width_range: + if check_func((im.getpixel((i, j))) for j in range(h)): + return i + + +def find_start_end(im): + w, h = im.size + start = check_image(im, range(w)) + end = check_image(im, range(w - 1, -1, -1)) + return start, end + + +def crop_start_end(im): + start, end = find_start_end(im) + box = (start, 0, end, im.size[1]) + return im.crop(box) + + +def get_empty_spaces(im): + w, h = im.size + x = check_image(im, range(0, w), check_func=non_white) + empty_spots = [] + last_spot = None + while True: + empty = check_image(im, range(x, w), check_func=all_white) + if empty is None: + break + if empty >= w - 1: + break + if last_spot is None: + empty_spots.append(empty) + else: + if abs(empty - last_spot) > 1: + empty_spots.append(last_spot) + empty_spots.append(empty) + last_spot = empty + x = empty + 1 + empty_spots.append(last_spot) + return [ + (empty_spots[i], empty_spots[i + 1]) for i in range(0, len(empty_spots) - 1, 2) + ] + + +def crop_by_splits(image, splits): + w, h = image.size + x = 0 + for a, b in splits: + yield image.crop((x, 0, a, h)) + x = b + + +class LetterSplitter: + def __init__(self, image, letter_count=6): + self.image = image + self.w, self.h = image.size + self.letter_count = letter_count + self.current_letter = 0 + self.x = 0 + self.recalc() + + def recalc(self): + remaining = self.w - self.x + self.ideal_width = remaining / (self.letter_count - self.current_letter) + self.threshold = self.ideal_width / 4 + self.ideal_x = self.x + self.ideal_width + + def make_letter(self, end_x, new_x=None): + part = self.image.crop((self.x, 0, end_x, self.h)) + self.current_letter += 1 + if new_x is None: + self.x = end_x + 1 + else: + self.x = new_x + 1 + self.recalc() + return part + + def get_images(self): + empty_spaces = get_empty_spaces(self.image) + for a, b in empty_spaces: + if self.current_letter == self.letter_count: + break + if abs(self.ideal_x - a) < self.threshold: + # split ideal + yield self.make_letter(a, b) + continue + elif self.ideal_x > a: + # split too early, let's wait for next + continue + yield from self.advance(a) + yield from self.advance(self.w) + + def advance(self, until): + while ( + self.ideal_x < until - self.threshold + and self.current_letter < self.letter_count + ): + yield self.make_letter(self.ideal_x) + + +def alt_split_letters(image): + splitter = LetterSplitter(image) + yield from splitter.get_images() + + +def split_letters(image, letter_count=5): + w, h = image.size + part_width = w / letter_count + parts = [] + for i in range(letter_count): + yield image.crop((i * part_width, 0, i * part_width + part_width, h)) + + +def normalize_crop(im): + im = normalize_color(im, NOISE_BACKGROUND, BACKGROUND, THRESHOLD) + im = normalize_color(im, NOISE, BACKGROUND, THRESHOLD) + im = normalize_color(im, TEXT_NOISE, TEXT, THRESHOLD) + im = crop_start_end(im) + return im + + +def get_split_letters_from_image(im): + yield from split_letters(normalize_crop(im)) + + +def resize_images(images): + for img in images: + gray = img.convert("L") + bw = gray.point(lambda x: 0 if x < 128 else 255, "1") + yield bw.resize(IMG_SIZE) + + +def letters_from_image(image): + yield from resize_images(get_split_letters_from_image(image)) + + +def read_solution_images(filename): + with open(filename) as f: + count = 0 + for line in f: + solution, image_data = line.split("|") + _, image_data = image_data.split(",") + im = Image.open(io.BytesIO(base64.b64decode(image_data))) + yield solution, im + + +def generate_images(filename): + for solution, image in read_solution_images(filename): + letter_images = letters_from_image(image) + yield from zip(solution, letter_images) + + +def get_letter_onehot(letter): + index_offset = CLASSES.index(letter) + num_classes = len(CLASSES) + labels_one_hot = np.zeros(num_classes) + labels_one_hot[index_offset] = 1 + return labels_one_hot + + +def convert_captchas(filename): + images = [] + letters = [] + for letter, im in generate_images(filename): + image = img_to_array(im, data_format="channels_last") + images.append(image) + letters.append(get_letter_onehot(letter)) + images = np.array(images, dtype="float32") + labels = np.array(letters) + perm = np.arange(len(images)) + np.random.shuffle(perm) + images = images[perm] + labels = labels[perm] + return images, labels + + +def extract_data(filename, recreate=False): + images_path = os.path.abspath("data/images.npy") + if not os.path.exists(images_path) or recreate: + images, labels = convert_captchas(filename) + np.save(images_path, images) + labels_path = os.path.abspath("data/labels.npy") + np.save(labels_path, labels) + + +def make_model(): + nb_classes = len(CLASSES) + nb_filters = 32 + # # size of pooling area for max pooling + pool_size = (2, 2) + # # convolution kernel size + kernel_size = (4, 10) + input_shape = (IMG_SIZE[1], IMG_SIZE[0], 1) + + model = Sequential() + + # model.add(Conv2D(nb_filters, (kernel_size[0], kernel_size[1]), + # padding='valid', + # input_shape=input_shape)) + # model.add(BatchNormalization(axis=-1)) + # model.add(Activation('relu')) + # model.add(Conv2D(nb_filters, (kernel_size[0], kernel_size[1]))) + # model.add(BatchNormalization(axis=-1)) + # model.add(Activation('relu')) + # model.add(MaxPooling2D(pool_size=pool_size)) + # model.add(Dropout(0.25)) + + model.add(Conv2D(32, (3, 3), input_shape=input_shape)) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(Conv2D(32, (3, 3))) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(MaxPooling2D(pool_size=(2, 2))) + + model.add(Conv2D(64, (3, 3))) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(Conv2D(64, (3, 3))) + model.add(BatchNormalization(axis=-1)) + model.add(Activation("relu")) + model.add(MaxPooling2D(pool_size=(2, 2))) + + model.add(Flatten()) + + model.add(Dense(512)) + model.add(BatchNormalization()) + model.add(Activation("relu")) + model.add(Dropout(0.5)) + model.add(Dense(nb_classes)) + model.add(Activation("softmax")) + + # model.compile(loss='categorical_crossentropy', + # optimizer='adadelta', + # metrics=['accuracy']) + model.compile( + loss="categorical_crossentropy", optimizer=Adam(), metrics=["accuracy"] + ) + + return model + + +class CaptchaSolver: + def __init__(self, model=None, model_path=None): + if model is None: + self.model = make_model() + self.model.load_weights(model_path) + else: + self.model = model + + def predict_from_bytes(self, content): + return self.predict(Image.open(io.BytesIO(content))) + + def predict(self, image_data): + letters = np.array( + [ + img_to_array(im, data_format="channels_last") + for im in letters_from_image(image_data) + ] + ) + + # predicted = self.model.predict_classes(letters) + predicted = np.argmax(self.model.predict(letters), axis=-1) + return "".join(CLASSES[i] for i in predicted) + + +def run_on_url(cs, url="https://www.sian.it/pubbAimu/Captcha.jpg"): + import requests + + response = requests.get(url) + img = Image.open(io.BytesIO(response.content)) + img.save("captcha.jpg") + return cs.predict(img) + + +def create_app(): + app = Flask(__name__) + cs = CaptchaSolver(model_path="./agea_11.h5") + + @app.route("/predict", methods=["POST"]) + def predict(): + if "file" not in request.files: + return jsonify({"error": "No file part"}), 400 + file = request.files["file"] + if file.filename == "": + return jsonify({"error": "No selected file"}), 400 + try: + img_bytes = file.read() + result = cs.predict_from_bytes(img_bytes) + print(result) + return jsonify({"result": result}) + except Exception as e: + print('lol') + return jsonify({"error": str(e)}), 500 + + return app + +if __name__ == "__main__": + app = create_app() + app.run(host="0.0.0.0", port=5001) diff --git a/special-scrapers/it_captcha/mise.toml b/special-scrapers/it_captcha/mise.toml new file mode 100644 index 0000000..e01d6ae --- /dev/null +++ b/special-scrapers/it_captcha/mise.toml @@ -0,0 +1,2 @@ +[tools] +python = "3.9" diff --git a/special-scrapers/it_captcha/poetry.lock b/special-scrapers/it_captcha/poetry.lock new file mode 100644 index 0000000..b900de9 --- /dev/null +++ b/special-scrapers/it_captcha/poetry.lock @@ -0,0 +1,1301 @@ +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.2.2" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +optional = false +python-versions = ">=3.8" +files = [ + {file = "absl_py-2.2.2-py3-none-any.whl", hash = "sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092"}, + {file = "absl_py-2.2.2.tar.gz", hash = "sha256:bf25b2c2eed013ca456918c453d687eab4e8309fba81ee2f4c1a6aa2494175eb"}, +] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + +[[package]] +name = "blinker" +version = "1.9.0" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.9" +files = [ + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, +] + +[[package]] +name = "certifi" +version = "2025.4.26" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, + {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +] + +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "flask" +version = "3.1.1" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.9" +files = [ + {file = "flask-3.1.1-py3-none-any.whl", hash = "sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c"}, + {file = "flask-3.1.1.tar.gz", hash = "sha256:284c7b8f2f58cb737f0cf1c30fd7eaf0ccfcde196099d24ecede3fc2005aa59e"}, +] + +[package.dependencies] +blinker = ">=1.9.0" +click = ">=8.1.3" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.2.0" +jinja2 = ">=3.1.2" +markupsafe = ">=2.1.1" +werkzeug = ">=3.1.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flatbuffers" +version = "25.2.10" +description = "The FlatBuffers serialization format for Python" +optional = false +python-versions = "*" +files = [ + {file = "flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051"}, + {file = "flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e"}, +] + +[[package]] +name = "gast" +version = "0.6.0" +description = "Python AST that abstracts the underlying Python version" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "gast-0.6.0-py3-none-any.whl", hash = "sha256:52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54"}, + {file = "gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb"}, +] + +[[package]] +name = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +optional = false +python-versions = "*" +files = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "grpcio" +version = "1.71.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.9" +files = [ + {file = "grpcio-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:c200cb6f2393468142eb50ab19613229dcc7829b5ccee8b658a36005f6669fdd"}, + {file = "grpcio-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b2266862c5ad664a380fbbcdbdb8289d71464c42a8c29053820ee78ba0119e5d"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0ab8b2864396663a5b0b0d6d79495657ae85fa37dcb6498a2669d067c65c11ea"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c30f393f9d5ff00a71bb56de4aa75b8fe91b161aeb61d39528db6b768d7eac69"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f250ff44843d9a0615e350c77f890082102a0318d66a99540f54769c8766ab73"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6d8de076528f7c43a2f576bc311799f89d795aa6c9b637377cc2b1616473804"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b91879d6da1605811ebc60d21ab6a7e4bae6c35f6b63a061d61eb818c8168f6"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f71574afdf944e6652203cd1badcda195b2a27d9c83e6d88dc1ce3cfb73b31a5"}, + {file = "grpcio-1.71.0-cp310-cp310-win32.whl", hash = "sha256:8997d6785e93308f277884ee6899ba63baafa0dfb4729748200fcc537858a509"}, + {file = "grpcio-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d6ac9481d9d0d129224f6d5934d5832c4b1cddb96b59e7eba8416868909786a"}, + {file = "grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef"}, + {file = "grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3"}, + {file = "grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444"}, + {file = "grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b"}, + {file = "grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537"}, + {file = "grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79"}, + {file = "grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a"}, + {file = "grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8"}, + {file = "grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379"}, + {file = "grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637"}, + {file = "grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb"}, + {file = "grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366"}, + {file = "grpcio-1.71.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c6a0a28450c16809f94e0b5bfe52cabff63e7e4b97b44123ebf77f448534d07d"}, + {file = "grpcio-1.71.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:a371e6b6a5379d3692cc4ea1cb92754d2a47bdddeee755d3203d1f84ae08e03e"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:39983a9245d37394fd59de71e88c4b295eb510a3555e0a847d9965088cdbd033"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9182e0063112e55e74ee7584769ec5a0b4f18252c35787f48738627e23a62b97"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693bc706c031aeb848849b9d1c6b63ae6bcc64057984bb91a542332b75aa4c3d"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:20e8f653abd5ec606be69540f57289274c9ca503ed38388481e98fa396ed0b41"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8700a2a57771cc43ea295296330daaddc0d93c088f0a35cc969292b6db959bf3"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d35a95f05a8a2cbe8e02be137740138b3b2ea5f80bd004444e4f9a1ffc511e32"}, + {file = "grpcio-1.71.0-cp39-cp39-win32.whl", hash = "sha256:f9c30c464cb2ddfbc2ddf9400287701270fdc0f14be5f08a1e3939f1e749b455"}, + {file = "grpcio-1.71.0-cp39-cp39-win_amd64.whl", hash = "sha256:63e41b91032f298b3e973b3fa4093cbbc620c875e2da7b93e249d4728b54559a"}, + {file = "grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.71.0)"] + +[[package]] +name = "h5py" +version = "3.13.0" +description = "Read and write HDF5 files from Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "h5py-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5540daee2b236d9569c950b417f13fd112d51d78b4c43012de05774908dff3f5"}, + {file = "h5py-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10894c55d46df502d82a7a4ed38f9c3fdbcb93efb42e25d275193e093071fade"}, + {file = "h5py-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb267ce4b83f9c42560e9ff4d30f60f7ae492eacf9c7ede849edf8c1b860e16b"}, + {file = "h5py-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2cf6a231a07c14acd504a945a6e9ec115e0007f675bde5e0de30a4dc8d86a31"}, + {file = "h5py-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:851ae3a8563d87a5a0dc49c2e2529c75b8842582ccaefbf84297d2cfceeacd61"}, + {file = "h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8"}, + {file = "h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868"}, + {file = "h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4"}, + {file = "h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a"}, + {file = "h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508"}, + {file = "h5py-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:477c58307b6b9a2509c59c57811afb9f598aedede24a67da808262dfa0ee37b4"}, + {file = "h5py-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57c4c74f627c616f02b7aec608a8c706fe08cb5b0ba7c08555a4eb1dde20805a"}, + {file = "h5py-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:357e6dc20b101a805ccfd0024731fbaf6e8718c18c09baf3b5e4e9d198d13fca"}, + {file = "h5py-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6f13f9b5ce549448c01e4dfe08ea8d1772e6078799af2c1c8d09e941230a90d"}, + {file = "h5py-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:21daf38171753899b5905f3d82c99b0b1ec2cbbe282a037cad431feb620e62ec"}, + {file = "h5py-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e520ec76de00943dd017c8ea3f354fa1d2f542eac994811943a8faedf2a7d5cb"}, + {file = "h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e79d8368cd9295045956bfb436656bea3f915beaa11d342e9f79f129f5178763"}, + {file = "h5py-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dd172d862e850823c4af02dc4ddbc308f042b85472ffdaca67f1598dff4a57"}, + {file = "h5py-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be949b46b7388074c5acae017fbbe3e5ba303fd9daaa52157fdfef30bbdacadd"}, + {file = "h5py-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:4f97ecde7ac6513b21cd95efdfc38dc6d19f96f6ca6f2a30550e94e551458e0a"}, + {file = "h5py-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82690e89c72b85addf4fc4d5058fb1e387b6c14eb063b0b879bf3f42c3b93c35"}, + {file = "h5py-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d571644958c5e19a61c793d8d23cd02479572da828e333498c9acc463f4a3997"}, + {file = "h5py-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560e71220dc92dfa254b10a4dcb12d56b574d2d87e095db20466b32a93fec3f9"}, + {file = "h5py-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c10f061764d8dce0a9592ce08bfd5f243a00703325c388f1086037e5d619c5f1"}, + {file = "h5py-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c82ece71ed1c2b807b6628e3933bc6eae57ea21dac207dca3470e3ceaaf437c"}, + {file = "h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3"}, +] + +[package.dependencies] +numpy = ">=1.19.3" + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.8" +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keras" +version = "3.9.2" +description = "Multi-backend Keras" +optional = false +python-versions = ">=3.9" +files = [ + {file = "keras-3.9.2-py3-none-any.whl", hash = "sha256:404427856c2dc30e38c9fa6fa6a13ffb1844a8c35af312ca32a8e7dea9840f1e"}, + {file = "keras-3.9.2.tar.gz", hash = "sha256:322aab6418ee3de1e2bd0871b60a07f0e444e744a7e8cba79af8b42408879ecf"}, +] + +[package.dependencies] +absl-py = "*" +h5py = "*" +ml-dtypes = "*" +namex = "*" +numpy = "*" +optree = "*" +packaging = "*" +rich = "*" + +[[package]] +name = "libclang" +version = "18.1.1" +description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." +optional = false +python-versions = "*" +files = [ + {file = "libclang-18.1.1-1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5"}, + {file = "libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592"}, + {file = "libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe"}, + {file = "libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f"}, + {file = "libclang-18.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb"}, + {file = "libclang-18.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8"}, + {file = "libclang-18.1.1.tar.gz", hash = "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250"}, +] + +[[package]] +name = "markdown" +version = "3.8" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.9" +files = [ + {file = "markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc"}, + {file = "markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.1" +description = "" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ml_dtypes-0.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd73f51957949069573ff783563486339a9285d72e2f36c18e0c1aa9ca7eb190"}, + {file = "ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:810512e2eccdfc3b41eefa3a27402371a3411453a1efc7e9c000318196140fed"}, + {file = "ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141b2ea2f20bb10802ddca55d91fe21231ef49715cfc971998e8f2a9838f3dbe"}, + {file = "ml_dtypes-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:26ebcc69d7b779c8f129393e99732961b5cc33fcff84090451f448c89b0e01b4"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:023ce2f502efd4d6c1e0472cc58ce3640d051d40e71e27386bed33901e201327"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7000b6e4d8ef07542c05044ec5d8bbae1df083b3f56822c3da63993a113e716f"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c09526488c3a9e8b7a23a388d4974b670a9a3dd40c5c8a61db5593ce9b725bab"}, + {file = "ml_dtypes-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:15ad0f3b0323ce96c24637a88a6f44f6713c64032f27277b069f285c3cf66478"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f462f5eca22fb66d7ff9c4744a3db4463af06c49816c4b6ac89b16bfcdc592e"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f76232163b5b9c34291b54621ee60417601e2e4802a188a0ea7157cd9b323f4"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4953c5eb9c25a56d11a913c2011d7e580a435ef5145f804d98efa14477d390"}, + {file = "ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:12651420130ee7cc13059fc56dac6ad300c3af3848b802d475148c9defd27c23"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9945669d3dadf8acb40ec2e57d38c985d8c285ea73af57fc5b09872c516106d"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf9975bda82a99dc935f2ae4c83846d86df8fd6ba179614acac8e686910851da"}, + {file = "ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1"}, + {file = "ml_dtypes-0.5.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:05f23447a1c20ddf4dc7c2c661aa9ed93fcb2658f1017c204d1e758714dc28a8"}, + {file = "ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b7fbe5571fdf28fd3aaab3ef4aafc847de9ebf263be959958c1ca58ec8eadf5"}, + {file = "ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d13755f8e8445b3870114e5b6240facaa7cb0c3361e54beba3e07fa912a6e12b"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b8a9d46b4df5ae2135a8e8e72b465448ebbc1559997f4f9304a9ecc3413efb5b"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb2009ac98da274e893e03162f6269398b2b00d947e7057ee2469a921d58135"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aefedc579ece2f8fb38f876aa7698204ee4c372d0e54f1c1ffa8ca580b54cc60"}, + {file = "ml_dtypes-0.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:8f2c028954f16ede77902b223a8da2d9cbb3892375b85809a5c3cfb1587960c4"}, + {file = "ml_dtypes-0.5.1.tar.gz", hash = "sha256:ac5b58559bb84a95848ed6984eb8013249f90b6bab62aa5acbad876e256002c9"}, +] + +[package.dependencies] +numpy = ">=1.21" + +[package.extras] +dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] + +[[package]] +name = "namex" +version = "0.0.9" +description = "A simple utility to separate the implementation of your Python package and its public API surface." +optional = false +python-versions = "*" +files = [ + {file = "namex-0.0.9-py3-none-any.whl", hash = "sha256:7bd4e4a2cc3876592111609fdf4cbe6ff19883adbe6b3b40d842fd340f77025e"}, + {file = "namex-0.0.9.tar.gz", hash = "sha256:8adfea9da5cea5be8f4e632349b4669e30172c7859e1fd97459fdf3b17469253"}, +] + +[[package]] +name = "numpy" +version = "2.0.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +] + +[[package]] +name = "opt-einsum" +version = "3.4.0" +description = "Path optimization of einsum functions." +optional = false +python-versions = ">=3.8" +files = [ + {file = "opt_einsum-3.4.0-py3-none-any.whl", hash = "sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd"}, + {file = "opt_einsum-3.4.0.tar.gz", hash = "sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac"}, +] + +[[package]] +name = "optree" +version = "0.15.0" +description = "Optimized PyTree Utilities." +optional = false +python-versions = ">=3.8" +files = [ + {file = "optree-0.15.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e73e390520a545ebcaa0b77fd77943a85d1952df658268129e6c523d4d38972"}, + {file = "optree-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c45593a818c67b72fd0beaeaa6410fa3c5debd39af500127fa367f8ee1f4bd8e"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e440de109529ce919d0a0a4fa234d3b949da6f99630c9406c9f21160800831"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7614ad2f7bde7b905c897011be573d89a9cb5cf851784ee8efb0020d8e067b27"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:655ab99f9f9570fbb124f81fdf7e480250b59b1f1d9bd07df04c8751eecc1450"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e63b965b62f461513983095750fd1331cad5674153bf3811bd7e2748044df4cd"}, + {file = "optree-0.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e515b011d965bd3f7aeb021bb523265cb49fde47be0033ba5601e386fff90a"}, + {file = "optree-0.15.0-cp310-cp310-win32.whl", hash = "sha256:27031f507828c18606047e695129e9ec9678cd4321f57856da59c7fcc8f8666c"}, + {file = "optree-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0392bebcd24fc70ca9a397c1eb2373727fa775e1007f27f3983c50f16a98e45"}, + {file = "optree-0.15.0-cp310-cp310-win_arm64.whl", hash = "sha256:c3122f73eca03e38712ceee16a6acf75d5244ba8b8d1adf5cd6613d1a60a6c26"}, + {file = "optree-0.15.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c15d98e6f587badb9df67d67fa914fcfa0b63db2db270951915c563816c29f3d"}, + {file = "optree-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8d58949ef132beb3a025ace512a71a0fcf92e0e5ef350f289f33a782ae6cb85"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f71d4759de0c4abc132dab69d1aa6ea4561ba748efabeee7b25db57c08652b79"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ba65d4c48d76bd5caac7f0b1b8db55223c1c3707d26f6d1d2ff18baf6f81850"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad3878acdb082701e5f77a153cd86af8819659bfa7e27debd0dc1a52f16c365"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6676b8c3f4cd4c8d8d052b66767a9e4cf852627bf256da6e49d2c38a95f07712"}, + {file = "optree-0.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f185b0d21bc4dda1f4fd03f5ba9e2bc9d28ca14bce3ce3d36b5817140a345e"}, + {file = "optree-0.15.0-cp311-cp311-win32.whl", hash = "sha256:927b579a76c13b9328580c09dd4a9947646531f0a371a170a785002c50dedb94"}, + {file = "optree-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:d6525d6a550a1030957e5205e57a415d608a9f7561154e0fb29670e967424578"}, + {file = "optree-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:081e8bed7583b625819659d68288365bd4348b3c4281935a6ecfa53c93619b13"}, + {file = "optree-0.15.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ba2eee9de9d57e145b4c1a71749f7f8b8fe1c645abbb306d4a26cfa45a9cdbb5"}, + {file = "optree-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4aad5023686cd7caad68d70ad3706b82cfe9ae8ff9a13c08c1edef2a9b4c9d72"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9810e84466025da55ce19ac6b2b79a5cb2c0c1349d318a17504f6e44528221f8"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20b07d8a097b810d68b0ee35f287c1f0b7c9844133ada613a92cc10bade9cdbe"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0304ec416258edebe2cd2a1ef71770e43405d5e7366ecbc134c520b4ab44d155"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:759a72e6dcca3e7239d202a253e1e8e44e8df5033a5e178df585778ac85ddd13"}, + {file = "optree-0.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a0dc75c594c884d0ca502b8d169cec538e19a70883d2e5f5b9b08fce740958"}, + {file = "optree-0.15.0-cp312-cp312-win32.whl", hash = "sha256:7e10e5c2a8110f5f4fbc999ff8580d1db3a915f851f63f602fff3bbd250ffa20"}, + {file = "optree-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:def5b08f219c31edd029b47624e689ffa07747b0694222156f28a28d341d29ac"}, + {file = "optree-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:8ec6d3040b1cbfe3f0bc045a3302ee9f9e329c2cd96e928360d22e1cfd9d973a"}, + {file = "optree-0.15.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4ab606720ae319cb43da47c71d7d5fa7cfbb6a02e6da4857331e6f93800c970e"}, + {file = "optree-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9cfc5771115f85b0bfa8f72cce1599186fd6a0ea71c8154d8b2751d9170be428"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f958a20a311854aaab8bdd0f124aab5b9848f07976b54da3e95526a491aa860"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47ce7e9d81eaed5a05004df1fa279d2608e063dd5eb236e9c95803b4fa0a286c"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6d6ab3717d48e0e747d9e348e23be1fa0f8a812f73632face6303c438d259ba"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c7d101a15be39a9c7c4afae9f0bb85f682eb7d719117e2f9e5fb39c9f6f2c92"}, + {file = "optree-0.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aae337ab30b45a096eb5b4ffc3ad8909731617543a7eb288e0b297b9d10a241f"}, + {file = "optree-0.15.0-cp313-cp313-win32.whl", hash = "sha256:eb9c51d728485f5908111191b5403a3f9bc310d121a981f29fad45750b9ff89c"}, + {file = "optree-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:7f00e6f011f021ae470efe070ec4d2339fb1a8cd0dcdd16fe3dab782a47aba45"}, + {file = "optree-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:17990fbc7f4c461de7ae546fc5661f6a248c3dcee966c89c2e2e5ad7f6228bae"}, + {file = "optree-0.15.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b31c88af70e3f5c14ff2aacd38c4076e6cde98f75169fe0bb59543f01bfb9719"}, + {file = "optree-0.15.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bc440f81f738d9c822030c3b4f53b6dec9ceb52410f02fd06b9338dc25a8447f"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ffc2dd8c754e95495163dde55b38dc37e6712b6a3bc7f2190b0547a2c403bb"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fa9fb0197cd7b5f2b1fa7e05d30946b3b79bcfc3608fe54dbfc67969895cac9"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6828639b01ba1177c04875dd9529d938d7b28122c97e7ae14ec41c68ec22826c"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93c74eed0f52818c30212dba4867f5672e498567bad49dcdffbe8db6703a0d65"}, + {file = "optree-0.15.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12188f6832c29dac37385a2f42fce961e303349909cff6d40e21cb27a8d09023"}, + {file = "optree-0.15.0-cp313-cp313t-win32.whl", hash = "sha256:d7b8ce7d13580985922dcfbda515da3f004cd7cb1b03320b96ea32d8cfd76392"}, + {file = "optree-0.15.0-cp313-cp313t-win_amd64.whl", hash = "sha256:daccdb583abaab14346f0af316ee570152a5c058e7b9fb09d8f8171fe751f2b3"}, + {file = "optree-0.15.0-cp313-cp313t-win_arm64.whl", hash = "sha256:e0162a36a6cedb0829efe980d0b370d4e5970fdb28a6609daa2c906d547add5f"}, + {file = "optree-0.15.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a99941604a5a958b4e1cbd0caa8b2339aa716babde0189a92843b39d2a77e48"}, + {file = "optree-0.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8678ac0cdf752d6194f75637f3cd19af9071bc00967b05f00aff48727d373aab"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce2a8d57b8fe0179f967494a7d19cff18f8cc0f2e9aff0ed2cb5e5605475a19a"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1feca7404e69a0860940c9cf6a4e3af23457613c4c2338991dc9355dfbbc1ab"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d13c5d7d9af345bc96f441bfb313e4286f4495a20d29ad6499a8923c581c593e"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5614aebb65a18db496bbdf8b6ce4873779be5352cc91c7e2372984eaf1d4cce4"}, + {file = "optree-0.15.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def382dbd35ab715008c8604d64c67baf0d97a5f7389a56b5148bbfc9bb006a7"}, + {file = "optree-0.15.0-cp38-cp38-win32.whl", hash = "sha256:e7e0fb32ea05beec7d46a79e4c03701f060a2cfbd5ffa89abaf7b7d17e2d28aa"}, + {file = "optree-0.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:ae66e98634f0c843c5c6b4f27508200971c1a66b726db29c30aba368cf23de5f"}, + {file = "optree-0.15.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f9ea3208a14d1677c8966ea1eabe5b8f148424a8c3214ed4d4769beecd48a8a"}, + {file = "optree-0.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ebd608b02cb207e4851983b78f57e800c542758f131abe3b23cd4a5f0153676c"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09d11111194a6211e9d806828d29d932ad5f998ea156c76ad0e4d5da39654541"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44cb5d1e5317dbb3044ad4b76af2d4f5e51de73d6ff6e858077d8af00756fe16"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1493f3e97f921b8742368406d3de390f051a7c405959e2088d72b4a4ff3f5394"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fef87f006da3c4dfc914f6c0f863c7f4712e958f56c991c320b06026e9ccfd87"}, + {file = "optree-0.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad409276099b89fb5077b0b9311c9e8500086888eba9c77546353c18d520bfe5"}, + {file = "optree-0.15.0-cp39-cp39-win32.whl", hash = "sha256:a6103a3d33cc300ea567f373680e29a29ae854e8775bf87231aae12664b4732e"}, + {file = "optree-0.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:a68a813a2141493566178ae87e1906856f1549e2c3e439ff76801f8fb05bd3a7"}, + {file = "optree-0.15.0-cp39-cp39-win_arm64.whl", hash = "sha256:59d8d252cb83465ecac2f7ff457489606a56316fe8b8f7635770ee8e27b6a3b8"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b30673fe30d4d77eef18534420491c27837f0b55dfe18107cfd9eca39a62de3b"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0f378d08b8a09f7e495c49cd94141c1acebc2aa7d567d7dd2cb44a707f29268"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90dae741d683cbc47cba16a1b4af3c0d5d8c1042efb7c4aec7664a4f3f07eca2"}, + {file = "optree-0.15.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cf790dd21dcaa0857888c03233276f5513821abfe605964e825837a30a24f0d7"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:21afadec56475f2a13670b8ecf7b767af4feb3ba5bd3a246cbbd8c1822e2a664"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a39bccc63223e040f36eb8b413fa1f94a190289eb82e7b384ed32d95d1ffd67"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06aed485ab9c94f5b45a18f956bcb89bf6bad29632421da69da268cb49adb37b"}, + {file = "optree-0.15.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:07e9d75867ca39cce98375249b83a2033b0313cbfa32cbd06f93f7bc15104afc"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3d237605b277d5600748c8a6f83f65e00c294b000ac8772f473fa41eb587ca15"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c82f0e88f43b5ec57b8e225175003dc6624dfa400fb56c18c0e4b4667bef805"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2245f9a9fd5c7f042f07a476695fd4f6074f85036b5ff3d004f4da121220bf56"}, + {file = "optree-0.15.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:29e1fa90153908d968a2fcebf62bbbc0b434b5a75463a202c33ba3e13dc170ea"}, + {file = "optree-0.15.0.tar.gz", hash = "sha256:d00a45e3b192093ef2cd32bf0d541ecbfc93c1bd73a5f3fe36293499f28a50cf"}, +] + +[package.dependencies] +typing-extensions = ">=4.5.0" + +[package.extras] +benchmark = ["dm-tree (>=0.1,<0.2.0a0)", "jax[cpu] (>=0.4.6,<0.5.0a0)", "pandas", "tabulate", "termcolor", "torch (>=2.0,<2.6.0a0)", "torchvision"] +docs = ["docutils", "jax[cpu]", "numpy", "sphinx", "sphinx-autoapi", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-rtd-theme", "sphinxcontrib-bibtex", "torch"] +jax = ["jax"] +lint = ["cpplint", "doc8", "mypy", "pre-commit", "pyenchant", "pylint[spelling]", "ruff", "xdoctest"] +numpy = ["numpy"] +test = ["covdefaults", "pytest", "pytest-cov", "pytest-xdist"] +torch = ["torch"] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pillow" +version = "11.2.1" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047"}, + {file = "pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c"}, + {file = "pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d"}, + {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97"}, + {file = "pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579"}, + {file = "pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d"}, + {file = "pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad"}, + {file = "pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2"}, + {file = "pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70"}, + {file = "pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600"}, + {file = "pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788"}, + {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e"}, + {file = "pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e"}, + {file = "pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6"}, + {file = "pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193"}, + {file = "pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7"}, + {file = "pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f"}, + {file = "pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d"}, + {file = "pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4"}, + {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443"}, + {file = "pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c"}, + {file = "pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3"}, + {file = "pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941"}, + {file = "pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb"}, + {file = "pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28"}, + {file = "pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f"}, + {file = "pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155"}, + {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14"}, + {file = "pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b"}, + {file = "pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2"}, + {file = "pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691"}, + {file = "pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c"}, + {file = "pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22"}, + {file = "pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406"}, + {file = "pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91"}, + {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751"}, + {file = "pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9"}, + {file = "pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd"}, + {file = "pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e"}, + {file = "pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681"}, + {file = "pillow-11.2.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:7491cf8a79b8eb867d419648fff2f83cb0b3891c8b36da92cc7f1931d46108c8"}, + {file = "pillow-11.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b02d8f9cb83c52578a0b4beadba92e37d83a4ef11570a8688bbf43f4ca50909"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014ca0050c85003620526b0ac1ac53f56fc93af128f7546623cc8e31875ab928"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3692b68c87096ac6308296d96354eddd25f98740c9d2ab54e1549d6c8aea9d79"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f781dcb0bc9929adc77bad571b8621ecb1e4cdef86e940fe2e5b5ee24fd33b35"}, + {file = "pillow-11.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2b490402c96f907a166615e9a5afacf2519e28295f157ec3a2bb9bd57de638cb"}, + {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dd6b20b93b3ccc9c1b597999209e4bc5cf2853f9ee66e3fc9a400a78733ffc9a"}, + {file = "pillow-11.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4b835d89c08a6c2ee7781b8dd0a30209a8012b5f09c0a665b65b0eb3560b6f36"}, + {file = "pillow-11.2.1-cp39-cp39-win32.whl", hash = "sha256:b10428b3416d4f9c61f94b494681280be7686bda15898a3a9e08eb66a6d92d67"}, + {file = "pillow-11.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:6ebce70c3f486acf7591a3d73431fa504a4e18a9b97ff27f5f47b7368e4b9dd1"}, + {file = "pillow-11.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:c27476257b2fdcd7872d54cfd119b3a9ce4610fb85c8e32b70b42e3680a29a1e"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193"}, + {file = "pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f"}, + {file = "pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044"}, + {file = "pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "protobuf" +version = "5.29.4" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, + {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, + {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, + {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, + {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, + {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, + {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, + {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, + {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, +] + +[[package]] +name = "pygments" +version = "2.19.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "14.0.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, + {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "setuptools" +version = "80.7.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "setuptools-80.7.1-py3-none-any.whl", hash = "sha256:ca5cc1069b85dc23070a6628e6bcecb3292acac802399c7f8edc0100619f9009"}, + {file = "setuptools-80.7.1.tar.gz", hash = "sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "tensorboard" +version = "2.19.0" +description = "TensorBoard lets you watch Tensors Flow" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorboard-2.19.0-py3-none-any.whl", hash = "sha256:5e71b98663a641a7ce8a6e70b0be8e1a4c0c45d48760b076383ac4755c35b9a0"}, +] + +[package.dependencies] +absl-py = ">=0.4" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +packaging = "*" +protobuf = ">=3.19.6,<4.24.0 || >4.24.0" +setuptools = ">=41.0.0" +six = ">1.9" +tensorboard-data-server = ">=0.7.0,<0.8.0" +werkzeug = ">=1.0.1" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.2" +description = "Fast data loading for TensorBoard" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, +] + +[[package]] +name = "tensorflow" +version = "2.19.0" +description = "TensorFlow is an open source machine learning framework for everyone." +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorflow-2.19.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c95604f25c3032e9591c7e01e457fdd442dde48e9cc1ce951078973ab1b4ca34"}, + {file = "tensorflow-2.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b39293cae3aeee534dc4746dc6097b48c281e5e8b9a423efbd14d4495968e5c"}, + {file = "tensorflow-2.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83e2d6c748105488205d30e43093f28fc90e8da0176db9ddee12e2784cf435e8"}, + {file = "tensorflow-2.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3f47452246bd08902f0c865d3839fa715f1738d801d256934b943aa21c5a1d2"}, + {file = "tensorflow-2.19.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:68d462278ad88c193c16d7b905864ff0117d61dc20deded9264d1999d513c115"}, + {file = "tensorflow-2.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92d3ff958ac0ee0eb343f10d4055b3a2815635cb3ee0836f9b1d735c76ee098"}, + {file = "tensorflow-2.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390747786ac979809fa1cfcf6916220ef0bfed6b9e1b8c643b6b09184a868fe4"}, + {file = "tensorflow-2.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:ade03804d81e696f8b9045bbe2dd5d0146e36c63d85bf2eae8225ffa74a03713"}, + {file = "tensorflow-2.19.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:821916beebd541c95b451dd911af442e11a7cb3aabde9084cab2be5c4d8b2bae"}, + {file = "tensorflow-2.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f4bfbd33ee23408b98c67e63654f4697845f005555dcc6b790ecfaeabd1308"}, + {file = "tensorflow-2.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e28b26594cd793e7f52471b8f2d98aafc6d232868a366462d238f7967935a6f6"}, + {file = "tensorflow-2.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:5eae58946f5a22f4d5656a95e54c5d7aae5a5483c388922a207667d8858c37b9"}, + {file = "tensorflow-2.19.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ad15dbf488e287127a18e2274c64a201ea50ee32444a84657ead72d10438cb09"}, + {file = "tensorflow-2.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb87fb2052b819adffb749b7e9426bd109c8cf98751e684de73567424ab2a88"}, + {file = "tensorflow-2.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849f72820e2bb1bfd4f6446d09db4635896f2ceaa35212a98a1238c9439f6f93"}, + {file = "tensorflow-2.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:88c594d98bbe6d81d069f418ae823b03f7273c8b612d7073a09373483f212d9a"}, +] + +[package.dependencies] +absl-py = ">=1.0.0" +astunparse = ">=1.6.0" +flatbuffers = ">=24.3.25" +gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" +google-pasta = ">=0.1.1" +grpcio = ">=1.24.3,<2.0" +h5py = ">=3.11.0" +keras = ">=3.5.0" +libclang = ">=13.0.0" +ml-dtypes = ">=0.5.1,<1.0.0" +numpy = ">=1.26.0,<2.2.0" +opt-einsum = ">=2.3.2" +packaging = "*" +protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" +requests = ">=2.21.0,<3" +setuptools = "*" +six = ">=1.12.0" +tensorboard = ">=2.19.0,<2.20.0" +tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "python_version < \"3.12\""} +termcolor = ">=1.1.0" +typing-extensions = ">=3.6.6" +wrapt = ">=1.11.0" + +[package.extras] +and-cuda = ["nvidia-cublas-cu12 (==12.5.3.2)", "nvidia-cuda-cupti-cu12 (==12.5.82)", "nvidia-cuda-nvcc-cu12 (==12.5.82)", "nvidia-cuda-nvrtc-cu12 (==12.5.82)", "nvidia-cuda-runtime-cu12 (==12.5.82)", "nvidia-cudnn-cu12 (==9.3.0.75)", "nvidia-cufft-cu12 (==11.2.3.61)", "nvidia-curand-cu12 (==10.3.6.82)", "nvidia-cusolver-cu12 (==11.6.3.83)", "nvidia-cusparse-cu12 (==12.5.1.3)", "nvidia-nccl-cu12 (==2.23.4)", "nvidia-nvjitlink-cu12 (==12.5.82)"] + +[[package]] +name = "tensorflow-io-gcs-filesystem" +version = "0.37.1" +description = "TensorFlow IO" +optional = false +python-versions = "<3.13,>=3.7" +files = [ + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:249c12b830165841411ba71e08215d0e94277a49c551e6dd5d72aab54fe5491b"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:257aab23470a0796978efc9c2bcf8b0bc80f22e6298612a4c0a50d3f4e88060c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8febbfcc67c61e542a5ac1a98c7c20a91a5e1afc2e14b1ef0cb7c28bc3b6aa70"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9679b36e3a80921876f31685ab6f7270f3411a4cc51bc2847e80d0e4b5291e27"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:32c50ab4e29a23c1f91cd0f9ab8c381a0ab10f45ef5c5252e94965916041737c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b02f9c5f94fd62773954a04f69b68c4d576d076fd0db4ca25d5479f0fbfcdbad"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e1f2796b57e799a8ca1b75bf47c2aaa437c968408cc1a402a9862929e104cda"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7c8ee5fe2fd8cb6392669ef16e71841133041fee8a330eff519ad9b36e4556"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:ffebb6666a7bfc28005f4fbbb111a455b5e7d6cd3b12752b7050863ecb27d5cc"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fe8dcc6d222258a080ac3dfcaaaa347325ce36a7a046277f6b3e19abc1efb3c5"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbb33f1745f218464a59cecd9a18e32ca927b0f4d77abd8f8671b645cc1a182f"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:286389a203a5aee1a4fa2e53718c661091aa5fea797ff4fa6715ab8436b02e6c"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ee5da49019670ed364f3e5fb86b46420841a6c3cb52a300553c63841671b3e6d"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8943036bbf84e7a2be3705cb56f9c9df7c48c9e614bb941f0936c58e3ca89d6f"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:426de1173cb81fbd62becec2012fc00322a295326d90eb6c737fab636f182aed"}, + {file = "tensorflow_io_gcs_filesystem-0.37.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df00891669390078a003cedbdd3b8e645c718b111917535fa1d7725e95cdb95"}, +] + +[package.extras] +tensorflow = ["tensorflow (>=2.16.0,<2.17.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.16.0,<2.17.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.16.0,<2.17.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.16.0,<2.17.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.16.0,<2.17.0)"] + +[[package]] +name = "termcolor" +version = "3.1.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.9" +files = [ + {file = "termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa"}, + {file = "termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, +] + +[[package]] +name = "urllib3" +version = "2.4.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +files = [ + {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, + {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "werkzeug" +version = "3.1.3" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.9" +files = [ + {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"}, + {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.45.1" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"}, + {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + +[[package]] +name = "zipp" +version = "3.21.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + +[metadata] +lock-version = "2.0" +python-versions = "~3.9" +content-hash = "1ec7758d309be1e7aa5d54a67dca427b9feda672b63c626bc83481aafcbacbb6" diff --git a/special-scrapers/it_captcha/pyproject.toml b/special-scrapers/it_captcha/pyproject.toml new file mode 100644 index 0000000..653431a --- /dev/null +++ b/special-scrapers/it_captcha/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +authors = ["Johannes Filter "] +description = "" +name = "it-captcha" +readme = "README.md" +version = "0.1.0" + +[tool.poetry.dependencies] +python = "~3.9" +keras = "3.9.2" +tensorflow = "2.19.0" +pillow = "11.2.1" +flask = "^3.1.1" + +[build-system] +build-backend = "poetry.core.masonry.api" +requires = ["poetry-core"] diff --git a/special-scrapers/nl.js b/special-scrapers/nl.js new file mode 100644 index 0000000..4419673 --- /dev/null +++ b/special-scrapers/nl.js @@ -0,0 +1,181 @@ +const playwright = require("playwright"); +const fs = require("fs"); +const { default: PQueue } = require("p-queue"); + +const scrapeTable = async (page, code) => { + const table = await page.locator("table"); + const tableHtml = await table.innerHTML(); + if (tableHtml.length > 1) { + // check if pagination is present + const pagination = await page + .locator( + "div.ui-paginator.ui-paginator-bottom.ui-widget-header.ui-corner-bottom" + ) + .isVisible(); + let pageNumber = 0; + if (pagination) { + pageNumber = await page + .locator( + "div.ui-paginator.ui-paginator-bottom.ui-widget-header.ui-corner-bottom a.ui-state-active" + ) + .innerText(); + } + // write the tableHtml to a file + fs.writeFileSync(`data/nl/${code}-${pageNumber}.html`, tableHtml); + console.log(`Page ${code} ${pageNumber} saved to file.`); + return pageNumber; + } + throw new Error("Table is empty"); +}; + +// generate strings from 01 to 99 +const generateAllCodes = () => { + const codes = []; + for (let i = 10; i <= 99; i++) { + const code = i.toString().padStart(2, "0"); + codes.push(code); + } + return codes; +}; + +const oneRun = async (browser, code) => { + try { + console.log(`Starting run for code ${code}`); + if (fs.existsSync(`data/nl/${code}.txt`)) { + console.log(`Code ${code} already exists, skipping.`); + return; + } + + const context = await browser.newContext({ ignoreHTTPSErrors: true }); // Bypass SSL errors + const page = await context.newPage(); + + await page.goto("https://mijn.rvo.nl/europese-subsidies-2022"); + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(1000); + + await page.waitForSelector( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:subsidie_label" + ); + await page + .locator( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:subsidie_label" + ) + .click(); + await page.waitForTimeout(1000); + // await page.waitForSelector("text=Gemeenschappelijk Landbouw Beleid", { + // timeout: 10000, + // }); + + // await page.locator("text=Gemeenschappelijk Landbouw Beleid¿").click(); + await page + .locator( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:subsidie_1" + ) + .click(); + await page.waitForTimeout(2000); + + await page.waitForSelector( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:postcode" + ); + + // input the code + await page + .locator( + "#_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:postcode" + ) + .fill(code); + + await page.waitForTimeout(5000); + await page.locator('span.ui-button-text:text("Zoek")').click(); + + await page.waitForLoadState("networkidle"); + await page.waitForTimeout(5000); + + if ( + await page + .locator( + "text=Er zijn geen resultaten gevonden die voldoen aan uw zoekcriteria." + ) + .isVisible() + ) { + console.log(`No results found for code ${code}`); + await page.close(); + return; + } + + const choice = await page.locator( + 'div.ui-paginator-top select[title="Rijen per Pagina"]' + ); + if (await choice.isVisible()) { + await choice.selectOption("100"); + } + + await page.waitForTimeout(1000); + + let prevPageNumber = -1; + while (true) { + while (true) { + const pageNumber = await scrapeTable(page, code); + if (pageNumber !== prevPageNumber) { + prevPageNumber = pageNumber; + break; + } + console.log("Page number is the same, retrying..."); + await page.waitForTimeout(2000); + } + + if (prevPageNumber == 0) { + console.log("No more pages to scrape, exiting loop."); + break; + } + + // 101-126 van 126 resultaten, just an example! + const resultText = await page + .locator( + "div.ui-paginator.ui-paginator-bottom.ui-widget-header.ui-corner-bottom span.ui-paginator-current" + ) + .innerText(); + + const resultNumber = parseInt(resultText.split("van")[0].split("-")[1]); + // check if the result is the final one + if (resultText.includes(" " + resultNumber + " ")) { + console.log("Last page reached, exiting loop."); + break; + } + + await page + .locator( + '[id="_EuSubsidies_WAR_EuSubsidiesportlet_\\:subsidiesForm\\:glbTable_paginator_bottom"] span.ui-icon-seek-next' + ) + .click(); + await page.waitForLoadState("networkidle"); + + await page.waitForTimeout(1000); + } + // create a file with the code + fs.writeFileSync(`data/nl/${code}.txt`, code); + console.log(`Finished ${code}.`); + await page.close(); + } catch (error) { + console.error(`Error in code ${code}:`, error); + } +}; + +(async () => { + const launchOptions = { + headless: false, + }; + + const browser = await playwright.chromium.launch(launchOptions); + + const queue = new PQueue({ concurrency: 10 }); + const allCodes = generateAllCodes(); + + const allPromises = allCodes.map((code) => { + return queue.add(() => oneRun(browser, code)); + }); + await Promise.all(allPromises); + console.log("All pages scraped."); + + await browser.close(); +})(); diff --git a/special-scrapers/package-lock.json b/special-scrapers/package-lock.json new file mode 100644 index 0000000..b58e9a1 --- /dev/null +++ b/special-scrapers/package-lock.json @@ -0,0 +1,1375 @@ +{ + "name": "special-scrapers", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "special-scrapers", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "csv-parser": "^3.2.0", + "form-data": "^4.0.2", + "jimp": "^1.6.0", + "node-fetch": "^3.3.2", + "p-queue": "^6.6.2" + }, + "devDependencies": { + "@playwright/test": "^1.52.0", + "@types/node": "^22.15.17" + } + }, + "node_modules/@jimp/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-1.6.0.tgz", + "integrity": "sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w==", + "license": "MIT", + "dependencies": { + "@jimp/file-ops": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "await-to-js": "^3.0.0", + "exif-parser": "^0.1.12", + "file-type": "^16.0.0", + "mime": "3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/diff": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/diff/-/diff-1.6.0.tgz", + "integrity": "sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw==", + "license": "MIT", + "dependencies": { + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "pixelmatch": "^5.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/file-ops": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/file-ops/-/file-ops-1.6.0.tgz", + "integrity": "sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-bmp": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-bmp/-/js-bmp-1.6.0.tgz", + "integrity": "sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "bmp-ts": "^1.0.9" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-gif": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-gif/-/js-gif-1.6.0.tgz", + "integrity": "sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "gifwrap": "^0.10.1", + "omggif": "^1.0.10" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-jpeg": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-jpeg/-/js-jpeg-1.6.0.tgz", + "integrity": "sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "jpeg-js": "^0.4.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-png": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-png/-/js-png-1.6.0.tgz", + "integrity": "sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "pngjs": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/js-tiff": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/js-tiff/-/js-tiff-1.6.0.tgz", + "integrity": "sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "utif2": "^4.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-1.6.0.tgz", + "integrity": "sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-1.6.0.tgz", + "integrity": "sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/utils": "1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-1.6.0.tgz", + "integrity": "sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-1.6.0.tgz", + "integrity": "sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "tinycolor2": "^1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-1.6.0.tgz", + "integrity": "sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-blit": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-1.6.0.tgz", + "integrity": "sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-crop": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-1.6.0.tgz", + "integrity": "sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-1.6.0.tgz", + "integrity": "sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-1.6.0.tgz", + "integrity": "sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-1.6.0.tgz", + "integrity": "sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-1.6.0.tgz", + "integrity": "sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-hash": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-hash/-/plugin-hash-1.6.0.tgz", + "integrity": "sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/js-bmp": "1.6.0", + "@jimp/js-jpeg": "1.6.0", + "@jimp/js-png": "1.6.0", + "@jimp/js-tiff": "1.6.0", + "@jimp/plugin-color": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "any-base": "^1.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-1.6.0.tgz", + "integrity": "sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-1.6.0.tgz", + "integrity": "sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/js-jpeg": "1.6.0", + "@jimp/js-png": "1.6.0", + "@jimp/plugin-blit": "1.6.0", + "@jimp/types": "1.6.0", + "parse-bmfont-ascii": "^1.0.6", + "parse-bmfont-binary": "^1.0.6", + "parse-bmfont-xml": "^1.1.6", + "simple-xml-to-json": "^1.2.2", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-quantize": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-quantize/-/plugin-quantize-1.6.0.tgz", + "integrity": "sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-1.6.0.tgz", + "integrity": "sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/types": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-1.6.0.tgz", + "integrity": "sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-crop": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-1.6.0.tgz", + "integrity": "sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/plugin-color": "1.6.0", + "@jimp/plugin-hash": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0", + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/types": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-1.6.0.tgz", + "integrity": "sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg==", + "license": "MIT", + "dependencies": { + "zod": "^3.23.8" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jimp/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA==", + "license": "MIT", + "dependencies": { + "@jimp/types": "1.6.0", + "tinycolor2": "^1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/test": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/await-to-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-3.0.0.tgz", + "integrity": "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bmp-ts": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bmp-ts/-/bmp-ts-1.0.9.tgz", + "integrity": "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw==", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csv-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.0.tgz", + "integrity": "sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==", + "license": "MIT", + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gifwrap": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", + "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", + "license": "MIT", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "license": "MIT", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", + "license": "MIT" + }, + "node_modules/jimp": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-1.6.0.tgz", + "integrity": "sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==", + "license": "MIT", + "dependencies": { + "@jimp/core": "1.6.0", + "@jimp/diff": "1.6.0", + "@jimp/js-bmp": "1.6.0", + "@jimp/js-gif": "1.6.0", + "@jimp/js-jpeg": "1.6.0", + "@jimp/js-png": "1.6.0", + "@jimp/js-tiff": "1.6.0", + "@jimp/plugin-blit": "1.6.0", + "@jimp/plugin-blur": "1.6.0", + "@jimp/plugin-circle": "1.6.0", + "@jimp/plugin-color": "1.6.0", + "@jimp/plugin-contain": "1.6.0", + "@jimp/plugin-cover": "1.6.0", + "@jimp/plugin-crop": "1.6.0", + "@jimp/plugin-displace": "1.6.0", + "@jimp/plugin-dither": "1.6.0", + "@jimp/plugin-fisheye": "1.6.0", + "@jimp/plugin-flip": "1.6.0", + "@jimp/plugin-hash": "1.6.0", + "@jimp/plugin-mask": "1.6.0", + "@jimp/plugin-print": "1.6.0", + "@jimp/plugin-quantize": "1.6.0", + "@jimp/plugin-resize": "1.6.0", + "@jimp/plugin-rotate": "1.6.0", + "@jimp/plugin-threshold": "1.6.0", + "@jimp/types": "1.6.0", + "@jimp/utils": "1.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "license": "MIT" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==", + "license": "MIT" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz", + "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==", + "license": "MIT", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.5.0" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pixelmatch": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", + "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "license": "ISC", + "dependencies": { + "pngjs": "^6.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "license": "MIT", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/playwright": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.52.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz", + "integrity": "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^4.7.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/simple-xml-to-json": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/simple-xml-to-json/-/simple-xml-to-json-1.2.3.tgz", + "integrity": "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA==", + "license": "MIT", + "engines": { + "node": ">=20.12.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/utif2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz", + "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==", + "license": "MIT", + "dependencies": { + "pako": "^1.0.11" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==", + "license": "MIT" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/special-scrapers/package.json b/special-scrapers/package.json new file mode 100644 index 0000000..064fdbe --- /dev/null +++ b/special-scrapers/package.json @@ -0,0 +1,20 @@ +{ + "name": "special-scrapers", + "version": "1.0.0", + "main": "index.js", + "scripts": {}, + "author": "", + "license": "ISC", + "description": "", + "devDependencies": { + "@playwright/test": "^1.52.0", + "@types/node": "^22.15.17" + }, + "dependencies": { + "csv-parser": "^3.2.0", + "form-data": "^4.0.2", + "jimp": "^1.6.0", + "node-fetch": "^3.3.2", + "p-queue": "^6.6.2" + } +} diff --git a/special-scrapers/playwright.config.ts b/special-scrapers/playwright.config.ts new file mode 100644 index 0000000..a05d8b5 --- /dev/null +++ b/special-scrapers/playwright.config.ts @@ -0,0 +1,79 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/special-scrapers/runprog.sh b/special-scrapers/runprog.sh new file mode 100755 index 0000000..c59abfd --- /dev/null +++ b/special-scrapers/runprog.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Script to start a Node.js program and restart it every hour, +# with a forced exit ("exit harder") if the process does not terminate gracefully. + +NODE_PROGRAM="it.js" +RESTART_INTERVAL=3600 # seconds (1 hour) +GRACE_PERIOD=10 # seconds to wait for a graceful shutdown + +while true; do + echo "Starting $NODE_PROGRAM at $(date)" + /Users/user/.local/share/mise/installs/node/20.18.1/bin/node "$NODE_PROGRAM" & + NODE_PID=$! + + SECONDS=0 + while kill -0 $NODE_PID 2>/dev/null; do + if [ $SECONDS -ge $RESTART_INTERVAL ]; then + echo "Restart interval reached. Sending SIGTERM to $NODE_PROGRAM (PID: $NODE_PID)" + kill $NODE_PID + WAITED=0 + # Wait for GRACE_PERIOD seconds for the process to exit gracefully + while kill -0 $NODE_PID 2>/dev/null && [ $WAITED -lt $GRACE_PERIOD ]; do + sleep 1 + WAITED=$((WAITED+1)) + done + # If still running, force kill + if kill -0 $NODE_PID 2>/dev/null; then + echo "Process did not exit after $GRACE_PERIOD seconds. Sending SIGKILL to $NODE_PID" + kill -9 $NODE_PID + fi + wait $NODE_PID 2>/dev/null + break + fi + sleep 5 + done + + echo "$NODE_PROGRAM stopped at $(date). Restarting..." +done diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/download.py b/utils/download.py new file mode 100644 index 0000000..ddb6f07 --- /dev/null +++ b/utils/download.py @@ -0,0 +1,50 @@ +""" +Download a file from a URL and extract it to a folder. +""" + +import os +import pathlib +import shutil + +import requests +from tqdm import tqdm + +CHUNK_SIZE = 1024 * 8 +TIMEOUT = 10 + + +def download_file(url, folder): + """ + Download a file from a URL and extract it to a folder. + """ + print(f"Downloading from {url}") + pathlib.Path(folder).mkdir(parents=True, exist_ok=True) + local_filename = url.split("/")[-1] + fn = os.path.join(folder, local_filename) + extract_folder = os.path.join(folder, "extracted") + + try: + if not os.path.exists(fn): + with requests.get(url, stream=True, timeout=TIMEOUT) as r: + r.raise_for_status() + total_len = r.headers.get("content-length", None) + total = int(total_len) / CHUNK_SIZE if total_len is not None else None + + with open(fn, "wb") as f: + for chunk in tqdm( + r.iter_content(chunk_size=CHUNK_SIZE), + total=total, + unit="KB", + desc=local_filename, + unit_scale=True, + ): + # If you have chunk encoded response uncomment if + # and set chunk_size parameter to None. + # if chunk: + f.write(chunk) + shutil.unpack_archive(fn, extract_folder) + except Exception as e: + shutil.rmtree(folder) + raise e + print(f"Successfully downloaded to {folder}") + return local_filename