├── src ├── util │ ├── __init__.py │ ├── text_handling.py │ └── semantha_model_handling.py ├── pages_views │ ├── __init__.py │ ├── abstract_pages.py │ ├── rag.py │ ├── howto.py │ ├── sidebar.py │ ├── document_collection.py │ └── compare.py ├── images │ ├── favicon.png │ ├── how_to_v3.gif │ └── Semantha-positiv-RGB.png ├── __init__.py ├── snowpark_connection.py ├── main.py ├── semantha.py └── state.py ├── .gitignore ├── poetry.toml ├── data └── single │ └── Hooray_IT_ESG_Report_2021.pdf ├── .streamlit └── config.toml ├── README.md ├── pyproject.toml ├── LICENSE └── poetry.lock /src/util/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pages_views/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .streamlit/secrets.toml 3 | __pycache__/ 4 | -------------------------------------------------------------------------------- /poetry.toml: -------------------------------------------------------------------------------- 1 | [virtualenvs] 2 | create = true 3 | in-project = true -------------------------------------------------------------------------------- /src/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/semantha/kate1/HEAD/src/images/favicon.png -------------------------------------------------------------------------------- /src/images/how_to_v3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/semantha/kate1/HEAD/src/images/how_to_v3.gif -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- 1 | from src import state 2 | from src import semantha 3 | from src import pages_views 4 | -------------------------------------------------------------------------------- /src/images/Semantha-positiv-RGB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/semantha/kate1/HEAD/src/images/Semantha-positiv-RGB.png -------------------------------------------------------------------------------- /data/single/Hooray_IT_ESG_Report_2021.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/semantha/kate1/HEAD/data/single/Hooray_IT_ESG_Report_2021.pdf -------------------------------------------------------------------------------- /.streamlit/config.toml: -------------------------------------------------------------------------------- 1 | [browser] 2 | gatherUsageStats=false 3 | [theme] 4 | base='light' 5 | primaryColor="#4c00a5" 6 | font="sans serif" -------------------------------------------------------------------------------- /src/util/text_handling.py: -------------------------------------------------------------------------------- 1 | def short_text(text: str, threshold: int = 10) -> str: 2 | if len(text) > threshold: 3 | return text[:threshold] + "..." 4 | else: 5 | return text 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # K-A-T-E One 2 | 3 | This is the accompanying code repository to the Streamlit blog post detailing thingsTHINKING's solution K-A-T-E One, powered by semantha. 4 | 5 | Read the blog post and play with K-A-T-E -- we'll add links here once the post and the application have been published. 6 | Until then, enjoy your family time: 30 years from now, your kids are the only ones who will remember you working all day every day. 7 | 8 | Still feeling compelled to learn more? 9 | Then visit our homepage [semantha.de](https://semantha.de/esg) and learn more about the wonderful world of unstructured data (and ESG). 10 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "semantha-match-visualizer" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Sebastian Weigelt "] 6 | maintainers = ["semantha support "] 7 | readme = "README.md" 8 | homepage = "https://semantha.de" 9 | license = "Apache-2.0" 10 | packages = [{include = "src"}] 11 | 12 | 13 | [tool.poetry.dependencies] 14 | python = ">=3.8,<3.9.0" 15 | streamlit = "1.23.1" 16 | hydralit_components = "1.0.10" 17 | semantha-sdk = "5.4.1" 18 | plotly = "5.15.0" 19 | snowflake-connector-python="3.0.4" 20 | snowflake-snowpark-python="1.5.0" 21 | pyarrow="10.0.1" 22 | 23 | 24 | [build-system] 25 | requires = ["poetry-core"] 26 | build-backend = "poetry.core.masonry.api" 27 | 28 | -------------------------------------------------------------------------------- /src/util/semantha_model_handling.py: -------------------------------------------------------------------------------- 1 | from typing import Tuple, List 2 | 3 | from semantha_sdk.model.document import Document 4 | from semantha_sdk.model.paragraph import Paragraph 5 | from semantha_sdk.model.reference import Reference 6 | 7 | 8 | def get_paragraph_matches_of_doc(doc: Document) -> List[Tuple[Paragraph, List[Reference]]]: 9 | __match_list = [] 10 | for page in doc.pages: 11 | if page.contents is not None: 12 | for content in page.contents: 13 | if content.paragraphs is not None: 14 | for p in content.paragraphs: 15 | if p.references is not None and len(p.references) > 0: 16 | __match_list.append((p, p.references)) 17 | 18 | return __match_list 19 | -------------------------------------------------------------------------------- /src/snowpark_connection.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from snowflake.snowpark import FileOperation 3 | 4 | 5 | class SnowparkConnector: 6 | 7 | def __init__(self, **kwargs): 8 | self.__stage = kwargs.pop("stage") 9 | self.__connection = st.experimental_connection('snowpark', **kwargs) 10 | 11 | def get_document(self, doc_name: str): 12 | with self.__connection.safe_session() as session: 13 | down_file = FileOperation(session).get_stream(stage_location=f'@{self.__stage}/' + doc_name) 14 | return down_file 15 | 16 | def get_list_of_file_names(self, limit: int = 20): 17 | res = self.__connection.query(f'SELECT relative_path FROM directory(@{self.__stage});', ttl=0) 18 | return res['RELATIVE_PATH'].values.tolist()[:limit] 19 | -------------------------------------------------------------------------------- /src/pages_views/abstract_pages.py: -------------------------------------------------------------------------------- 1 | import os 2 | from abc import ABC, abstractmethod 3 | from typing import Tuple 4 | 5 | import streamlit as st 6 | from PIL import Image 7 | from semantha_sdk.model.document import Document 8 | from semantha_sdk.model.paragraph import Paragraph 9 | from semantha_sdk.model.reference import Reference 10 | 11 | 12 | class AbstractPage(ABC): 13 | 14 | @abstractmethod 15 | def display_page(self): 16 | pass 17 | 18 | @abstractmethod 19 | def _display_content(self): 20 | pass 21 | 22 | 23 | class AbstractContentPage(AbstractPage, ABC): 24 | 25 | _content_placeholder: st.container 26 | 27 | def display_page(self): 28 | self.__display_logo() 29 | self._content_placeholder.empty() 30 | with self._content_placeholder.container(): 31 | self._display_content() 32 | 33 | @staticmethod 34 | def __display_logo(): 35 | _, _, _, text, logo = st.columns(5) 36 | with text: 37 | st.markdown("

brought to you by

", unsafe_allow_html=True) 38 | 39 | with logo: 40 | image = Image.open(os.path.join(os.path.dirname(__file__), "..", "images", "Semantha-positiv-RGB.png")) 41 | st.image(image, width=250) 42 | 43 | st.write( 44 | """ 49 | """, 50 | unsafe_allow_html=True 51 | ) 52 | 53 | 54 | class AbstractViewPage(AbstractContentPage, ABC): 55 | 56 | @abstractmethod 57 | def _display_single_match(self, doc: Document): 58 | pass 59 | 60 | @abstractmethod 61 | def _display_multi_matches(self, docs: list): 62 | pass 63 | 64 | 65 | class AbstractSidebar(AbstractPage, ABC): 66 | 67 | def __init__(self): 68 | self._content_placeholder = st.empty() 69 | 70 | def display_page(self): 71 | self._content_placeholder.empty() 72 | with self._content_placeholder.container(): 73 | with st.sidebar: 74 | st.header("⚙️ Settings") 75 | self._display_content() 76 | -------------------------------------------------------------------------------- /src/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import hydralit_components as hc 4 | import streamlit as st 5 | 6 | import state 7 | from pages_views.compare import ComparePage 8 | from pages_views.document_collection import DocumentCollection 9 | from pages_views.howto import HowToPage 10 | from pages_views.rag import RetrievalAugmentedGeneration 11 | from pages_views.sidebar import CompareSidebarWithSnowflakeSettings, HowToSidebar, CompareSidebarWithTagFilter 12 | 13 | st.set_page_config( 14 | page_title="K-A-T-E One", 15 | page_icon=os.path.join(os.path.dirname(__file__), "images", "favicon.png"), 16 | layout="wide", 17 | initial_sidebar_state="collapsed" 18 | ) 19 | 20 | st.markdown("

K-A-T-E One

", unsafe_allow_html=True) 21 | st.markdown("

Knowledge, Access, and Technology for ESG

", unsafe_allow_html=True) 22 | 23 | menu_data = [ 24 | {'id': 1, 'label': "How To", 'key': "md_how_to", 'icon': "fa fa-home"}, 25 | {'id': 2, 'label': "Individual Document", 'key': "md_run_analysis"}, 26 | {'id': 3, 'label': "Document Collection", 'key': "md_document_collection"}, 27 | {'id': 4, 'label': "Semantic Q&A", 'key': "md_rag"} 28 | ] 29 | 30 | state.set_page_id(int(hc.nav_bar( 31 | menu_definition=menu_data, 32 | hide_streamlit_markers=False, 33 | sticky_nav=True, 34 | sticky_mode='pinned', 35 | override_theme={'menu_background': '#4c00a5'} 36 | ))) 37 | 38 | 39 | __howto_page = HowToPage(state.get_page_id()) 40 | __howto_sidebar = HowToSidebar() 41 | __compare_page = ComparePage(state.get_page_id()) 42 | __compare_sidebar = CompareSidebarWithSnowflakeSettings() 43 | __compare_sidebar_with_filter = CompareSidebarWithTagFilter() 44 | __document_collection = DocumentCollection(state.get_page_id()) 45 | __rag_page = RetrievalAugmentedGeneration(state.get_page_id()) 46 | 47 | if state.get_page_id() == 1: 48 | __howto_page.display_page() 49 | if state.get_page_id() == 2: 50 | __compare_page.display_page() 51 | __compare_sidebar_with_filter.display_page() 52 | if state.get_page_id() == 3: 53 | __compare_sidebar.display_page() 54 | __document_collection.display_page() 55 | if state.get_page_id() == 4: 56 | __rag_page.display_page() 57 | -------------------------------------------------------------------------------- /src/pages_views/rag.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | 3 | import pandas as pd 4 | import streamlit as st 5 | from semantha_sdk.model.answer import AnswerReference 6 | 7 | import state 8 | from pages_views.abstract_pages import AbstractContentPage 9 | 10 | 11 | class RetrievalAugmentedGeneration(AbstractContentPage): 12 | __stop_tokens = ["References:", "Reference:", "Referenzen:", "Referenz:"] 13 | 14 | def __init__(self, page_id: int): 15 | super().__init__() 16 | if page_id == 4: 17 | self._content_placeholder = st.container() 18 | else: 19 | self._content_placeholder = st.empty() 20 | 21 | def _display_content(self): 22 | st.write("Enter your question about ESG and ESG regulations.") 23 | st.markdown("__A few example questions that can be used for testing:__\n" 24 | "* What do we have to be careful of concerning personal data?\n" 25 | "* How should ESG solutions adapt to changing demands of stakeholders and regulators?") 26 | __dummy = "" 27 | __question = st.text_input( 28 | key="rag_question", 29 | label="Search", 30 | value="", 31 | placeholder="Enter your question here...", 32 | label_visibility="collapsed" 33 | ).strip() 34 | _, __but_col, _ = st.columns([2, 1, 2]) 35 | __search_button = __but_col.button(disabled=False, label="Search") 36 | if __search_button or (__dummy != __question): 37 | if __question == "": 38 | st.error("Please enter a question!") 39 | else: 40 | __dummy = __question 41 | with st.spinner("Generating an answer to your question..."): 42 | __answer = state.get_semantha().generate_retrieval_augmented_answer(__question) 43 | self.__display_answer_text(__answer.answer) 44 | self.__display_references(__answer.references) 45 | 46 | def __display_answer_text(self, answer: str): 47 | with st.expander("Answer", expanded=True): 48 | for swt in self.__stop_tokens: 49 | answer = answer.split(swt, 1)[0] 50 | st.markdown(answer) 51 | 52 | def __display_references(self, references: List[AnswerReference]): 53 | ref_df = pd.DataFrame.from_records( 54 | [ 55 | [ 56 | r.name, 57 | state.get_semantha().get_tags_of_library_document(r.id)[ 58 | 0] if state.get_semantha().get_tags_of_library_document(r.id) is not None else "", 59 | r.content 60 | ] 61 | for r in references 62 | ], 63 | columns=[ 64 | "Name", 65 | "Topic", 66 | "Content" 67 | ] 68 | ) 69 | ref_df.index = ref_df.index + 1 70 | with st.expander("References", expanded=True): 71 | st.dataframe(ref_df, use_container_width=True) 72 | -------------------------------------------------------------------------------- /src/semantha.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from io import IOBase 3 | from typing import List 4 | 5 | import semantha_sdk 6 | import streamlit as st 7 | from semantha_sdk.model.document_class import DocumentClass 8 | from semantha_sdk.model.document_information import DocumentInformation 9 | 10 | 11 | class SemanthaConnector: 12 | 13 | __STOP_TOKENS = ["References:", "Reference:"] 14 | 15 | def __init__(self, server, key, domain): 16 | logging.info("Authenticating semantha ...") 17 | self.__sdk = semantha_sdk.login( 18 | server_url=server, key=key 19 | ) 20 | self.__domain = domain 21 | logging.info("... successful!") 22 | 23 | def compare_to_library(self, in_file: IOBase, threshold: float): 24 | return self.__sdk.domains(domainname=self.__domain).references.post( 25 | file=in_file, 26 | similaritythreshold=threshold, 27 | maxreferences=1 28 | ) 29 | 30 | @st.cache_data(show_spinner=False) 31 | def get_text_of_library_paragraph(_self, doc_id: str, par_id: str) -> str: 32 | return _self.__sdk.domains(domainname=_self.__domain)\ 33 | .referencedocuments(documentid=doc_id).paragraphs(id=par_id).get().text 34 | 35 | @st.cache_data(show_spinner=False) 36 | def get_tags_of_library_document(_self, doc_id: str) -> List[str]: 37 | __tags = _self.__sdk.domains(domainname=_self.__domain).referencedocuments(documentid=doc_id).get().tags 38 | __derived_tags = _self.__sdk.domains(domainname=_self.__domain)\ 39 | .referencedocuments(documentid=doc_id).get().derived_tags 40 | return __tags + __derived_tags 41 | 42 | @st.cache_data(show_spinner=False) 43 | def get_library_tags(_self) -> List[str]: 44 | return _self.__sdk.domains(domainname=_self.__domain).tags.get() 45 | 46 | @st.cache_data(show_spinner=False) 47 | def get_library_entries_for_tag(_self, tag) -> List[DocumentInformation]: 48 | return _self.__sdk.domains(domainname=_self.__domain).referencedocuments.get( 49 | tags=tag, fields="id,name,contentpreview" 50 | ).data 51 | 52 | @st.cache_data(show_spinner=False) 53 | def get_category_of_document(_self, doc_id: str) -> DocumentClass: 54 | return _self.__sdk.domains(domainname=_self.__domain).referencedocuments(documentid=doc_id).get().document_class 55 | 56 | @st.cache_data(show_spinner=False) 57 | def get_category_by_id(_self, category_id: str) -> DocumentClass: 58 | return _self.__sdk.domains(domainname=_self.__domain).documentclasses(id=category_id).get() 59 | 60 | @st.cache_data(show_spinner=False) 61 | def generate_retrieval_augmented_answer(_self, question: str): 62 | return _self.__sdk.domains(domainname=_self.__domain).answers.post( 63 | question=question, 64 | maxreferences=5, 65 | similaritythreshold=0.4 66 | ) 67 | 68 | @st.cache_data(show_spinner=False) 69 | def summarize(_self, sources: List[str], topic: str) -> str: 70 | __sources_with_refs = [f"[{i + 1}] {s}" for i, s in enumerate(sources)] 71 | resp = _self.__sdk.domains(domainname=_self.__domain).summarizations.post( 72 | topic=topic, 73 | texts=__sources_with_refs 74 | ) 75 | for token in _self.__STOP_TOKENS: 76 | resp = resp.split(token, maxsplit=1)[0] 77 | return resp.strip() 78 | -------------------------------------------------------------------------------- /src/pages_views/howto.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import streamlit as st 4 | 5 | from pages_views.abstract_pages import AbstractContentPage 6 | 7 | 8 | class HowToPage(AbstractContentPage): 9 | def __init__(self, page_id: int): 10 | super().__init__() 11 | if page_id == 1: 12 | self._content_placeholder = st.container() 13 | else: 14 | self._content_placeholder = st.empty() 15 | 16 | def _display_content(self): 17 | st.write("In general, K-A-T-E One can be used in conjunction with Snowflake to help users view, search for, and list data in real time. This can be particularly useful for businesses that need to quickly access and analyze large amounts of unstructured data in order to make informed decisions. With K-A-T-E One, users can easily locate and extract the data they need from Snowflake, saving them time and improving their overall efficiency.") 18 | 19 | st.header("How to use K-A-T-E One") 20 | st.write('K-A-T-E One is an artificial intelligence service for document analysis. This service is specifically designed to help individuals and organizations conduct an in-depth analysis of their documents.') 21 | st.write('One of the key features of K-A-T-E One is its ability to analyze documents related to Environmental, Social, and Governance (ESG) issues. This is done using a library of guidelines and regulations to ensure that analyzed documents are thoroughly examined according to relevant standards. With K-A-T-E One, users can gain valuable insights into their ESG-related documents, which can inform decision-making and help organizations stay in compliance with regulations.') 22 | 23 | st.subheader("Individual Document") 24 | st.write('To start an analysis using K-A-T-E One, you can upload your own document and click the "Analyze" button. Alternatively, you can use the provided sample document by just clicking the "Analyze" button.') 25 | st.write('You can adjust the strictness of the comparison, which determines how closely content should be interpreted, in the left sidebar. You may need to expand the sidebar by clicking the arrow.') 26 | st.write('Once the analysis is initiated, K-A-T-E One processes the document and generates results in just a few seconds. The result dashboard shows the analysis results in the form of bar charts, along with corresponding labels for each page.') 27 | st.write('The text-to-text matches indicate the degree of similarity between the document and the library of guidelines and regulations. This feature enables you to quickly identify potential inconsistencies or discrepancies that may require further attention.') 28 | st.write('In addition, there is an interactive sunburst chart available. You can use it to see a more dynamic visual representation of the data.') 29 | st.write('In the sidebar on the left, you can also apply filters to customize and refine the displayed results to suit your specific needs.') 30 | 31 | st.subheader("Document Collection") 32 | st.write('This showcase contains a collection of sample documents sourced from various locations in Snowflake. The objective is to examine the collected policies based on the library containing ESG guidelines and regulations.') 33 | st.write('To start the analysis of the Document Collection, click the "Analyze Document Collection" button.') 34 | st.write('You can adjust the strictness of the comparison, which determines how closely content should be interpreted, in the left sidebar. You may need to expand the sidebar by clicking the arrow.') 35 | st.write('For each of the documents in the collection, the covered ESG topics are highlighted') 36 | st.write('You can select a topic to obtain a summary of the corresponding findings.') 37 | st.write('Furthermore, a detailed view of the analyzed document, as described in "Individual Document" above, can also be displayed.') 38 | st.write('This showcase aims to provide a comprehensive overview of ESG policies and their compliance status in the presented sample documents.') 39 | 40 | with st.expander(label="How To Video", expanded=False): 41 | st.image(os.path.join(os.path.dirname(__file__), "..", "images", "how_to_v3.gif"), output_format="GIF", use_column_width=True) 42 | -------------------------------------------------------------------------------- /src/state.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | import streamlit as st 4 | from semantha_sdk.model.document import Document 5 | 6 | from semantha import SemanthaConnector 7 | from snowpark_connection import SnowparkConnector 8 | 9 | CONST_HIGH_SIM = 0.95 10 | CONST_MID_SIM = 0.80 11 | CONST_HIGH_SIM_COLOR = "#95C23D" 12 | CONST_MID_SIM_COLOR = "#FDD835" 13 | CONST_LOW_SIM_COLOR = "#CCCCCC" 14 | NO_TAG = "(no tag)" 15 | 16 | __semantha = None 17 | __snowpark = None 18 | 19 | 20 | def __init_page_id(): 21 | if "__page_id" not in st.session_state: 22 | logging.info("No state for 'page_id' found, initializing with '1'.") 23 | st.session_state.__page_id = 1 24 | 25 | 26 | def __init_documents_with_references(): 27 | # -> list[str] 28 | if "__documents_with_references" not in st.session_state: 29 | logging.info("No state for 'documents_with_references' found, initializing with empty list.") 30 | st.session_state.__documents_with_references = [] 31 | 32 | 33 | def __init_similarity_threshold(): 34 | if "__similarity_threshold" not in st.session_state: 35 | logging.info("No state for 'similarity_threshold' found, initializing with '0.0'.") 36 | st.session_state.__similarity_threshold = 0.0 37 | 38 | 39 | def __init_selected_tags_compare_view(): 40 | if "__selected_tags_compare_view" not in st.session_state: 41 | logging.info("No state for 'selected_tags_compare_view' found, initializing with empty list.") 42 | st.session_state.__selected_tags_compare_view = [] 43 | 44 | 45 | def __init_docs_with_refs_with_tags(): 46 | if "__docs_with_refs_with_tags" not in st.session_state: 47 | logging.info("No state for '__docs_with_refs_with_tags' found, initializing with empty dict.") 48 | st.session_state.__docs_with_refs_with_tags = {} 49 | 50 | 51 | def __init_single_document_with_references(): 52 | if "__single_document_with_references" not in st.session_state: 53 | logging.info("No state for '__single_document_with_references' found, initializing with empty tuple.") 54 | st.session_state.__single_document_with_references = (None, None) 55 | 56 | 57 | def __init_default_sf_credentials_enabled(): 58 | if "__default_sf_credentials_enabled" not in st.session_state: 59 | logging.info("No state for '__default_sf_credentials_enabled' found, initializing with True.") 60 | st.session_state.__default_sf_credentials_enabled = True 61 | 62 | 63 | def __init_snowflake_cred_dict(): 64 | if "__snowflake_cred_dict" not in st.session_state: 65 | logging.info("No state for '__snowflake_cred_dict' found, initializing dict with None values.") 66 | st.session_state.__snowflake_cred_dict = { 67 | 'account': None, 68 | 'user': None, 69 | 'password': None, 70 | 'role': None, 71 | 'warehouse': None, 72 | 'database': None, 73 | 'schema': None, 74 | 'stage': None 75 | } 76 | 77 | 78 | def __init_tag_for_summarization(): 79 | if "__tag_for_summarization" not in st.session_state: 80 | logging.info("No state for '__tag_for_summarization' found, initializing with 'None'.") 81 | st.session_state.__tag_for_summarization = None 82 | 83 | 84 | @st.cache_resource(show_spinner=False) 85 | def get_semantha() -> SemanthaConnector: 86 | global __semantha 87 | if __semantha is None: 88 | logging.warning("SemanthaConnector is None, recreating...") 89 | semantha = st.secrets.semantha 90 | __semantha = SemanthaConnector(semantha.server_url, semantha.api_key, 91 | semantha.domain) 92 | return __semantha 93 | 94 | 95 | @st.cache_resource(show_spinner=False) 96 | def get_snowpark() -> SnowparkConnector: 97 | global __snowpark 98 | if __snowpark is None: 99 | logging.warning("SnowparkConnector is None, recreating...") 100 | __snowpark = SnowparkConnector(**get_snowflake_cred_dict()) 101 | return __snowpark 102 | 103 | 104 | def set_page_id(page_id: int): 105 | __init_page_id() 106 | st.session_state.__page_id = int(page_id) 107 | 108 | 109 | def get_page_id(): 110 | __init_page_id() 111 | return st.session_state.__page_id 112 | 113 | 114 | def set_similarity_threshold(threshold: float): 115 | __init_similarity_threshold() 116 | st.session_state.__similarity_threshold = threshold 117 | 118 | 119 | def get_similarity_threshold(): 120 | __init_similarity_threshold() 121 | return st.session_state.__similarity_threshold 122 | 123 | 124 | def add_document_with_references(doc: Document): 125 | __init_documents_with_references() 126 | st.session_state.__documents_with_references.append(doc) 127 | 128 | 129 | def get_documents_with_references(): 130 | __init_documents_with_references() 131 | return st.session_state.__documents_with_references 132 | 133 | 134 | def reset_documents_with_references(): 135 | __init_documents_with_references() 136 | st.session_state.__documents_with_references = [] 137 | 138 | 139 | def set_selected_tags_compare_view(tags): 140 | __init_selected_tags_compare_view() 141 | st.session_state.__selected_tags_compare_view = tags 142 | 143 | 144 | def get_selected_tags_compare_view(): 145 | __init_selected_tags_compare_view() 146 | return st.session_state.__selected_tags_compare_view 147 | 148 | 149 | def set_docs_with_refs_with_tags(doc_dict: dict): 150 | __init_docs_with_refs_with_tags() 151 | st.session_state.__docs_with_refs_with_tags = doc_dict 152 | 153 | 154 | def get_docs_with_refs_with_tags(): 155 | __init_docs_with_refs_with_tags() 156 | return st.session_state.__docs_with_refs_with_tags 157 | 158 | 159 | def reset_docs_with_refs_with_tags(): 160 | __init_docs_with_refs_with_tags() 161 | st.session_state.__docs_with_refs_with_tags = {} 162 | 163 | 164 | def set_single_document_with_references(doc_name: str, document): 165 | __init_single_document_with_references() 166 | st.session_state.__single_document_with_references = (doc_name, document) 167 | 168 | 169 | def get_single_document_with_references(): 170 | __init_single_document_with_references() 171 | return st.session_state.__single_document_with_references 172 | 173 | 174 | def reset_single_document_with_references(): 175 | __init_single_document_with_references() 176 | st.session_state.__single_document_with_references = (None, None) 177 | 178 | 179 | def get_snowflake_cred_dict(): 180 | __init_snowflake_cred_dict() 181 | return st.session_state.__snowflake_cred_dict 182 | 183 | 184 | def set_snowflake_cred_dict(snowflake_credentials_as_dict): 185 | __init_snowflake_cred_dict() 186 | st.session_state.__snowflake_cred_dict = snowflake_credentials_as_dict 187 | 188 | 189 | def get_default_sf_credentials_enabled(): 190 | __init_default_sf_credentials_enabled() 191 | return st.session_state.__default_sf_credentials_enabled 192 | 193 | 194 | def set_default_sf_credentials_enabled(enabled: bool): 195 | __init_default_sf_credentials_enabled() 196 | st.session_state.__default_sf_credentials_enabled = enabled 197 | 198 | 199 | def get_tag_for_summarization(): 200 | __init_tag_for_summarization() 201 | return st.session_state.__tag_for_summarization 202 | 203 | 204 | def set_tag_for_summarization(tag: str): 205 | __init_tag_for_summarization() 206 | st.session_state.__tag_for_summarization = tag 207 | -------------------------------------------------------------------------------- /src/pages_views/sidebar.py: -------------------------------------------------------------------------------- 1 | from typing import List 2 | 3 | import streamlit as st 4 | 5 | import state 6 | from pages_views.abstract_pages import AbstractSidebar 7 | 8 | 9 | class CompareSidebar(AbstractSidebar): 10 | __THRESHOLD_RELAXED = 0.65 11 | __THRESHOLD_MEDIUM = 0.7 12 | __THRESHOLD_STRICT = 0.75 13 | __THRESHOLD_RELAXED_NAME = 'Relaxed' 14 | __THRESHOLD_MEDIUM_NAME = 'Medium' 15 | __THRESHOLD_STRICT_NAME = 'Strict' 16 | 17 | def __init__(self): 18 | super().__init__() 19 | 20 | def _display_content(self): 21 | with st.expander("Comparison settings", True): 22 | __threshold_level = st.radio( 23 | 'Select strictness of comparison', 24 | [ 25 | self.__THRESHOLD_STRICT_NAME, 26 | self.__THRESHOLD_MEDIUM_NAME, 27 | self.__THRESHOLD_RELAXED_NAME 28 | ], 29 | key="compare_sidebar_radio", 30 | index=1 31 | ) 32 | if __threshold_level == self.__THRESHOLD_RELAXED_NAME: 33 | state.set_similarity_threshold(self.__THRESHOLD_RELAXED) 34 | if __threshold_level == self.__THRESHOLD_MEDIUM_NAME: 35 | state.set_similarity_threshold(self.__THRESHOLD_MEDIUM) 36 | if __threshold_level == self.__THRESHOLD_STRICT_NAME: 37 | state.set_similarity_threshold(self.__THRESHOLD_STRICT) 38 | 39 | self._display_extras() 40 | 41 | def _display_extras(self): 42 | pass 43 | 44 | 45 | class CompareSidebarWithTagFilter(CompareSidebar): 46 | def __init__(self): 47 | super().__init__() 48 | self.__options = _prepare_lib_tags_as_filter_options() 49 | self.__default = state.get_selected_tags_compare_view() 50 | 51 | def _display_extras(self): 52 | if state.get_single_document_with_references()[1] is not None: 53 | with st.expander("Filter settings", True): 54 | __selected = st.multiselect(label="Select topics to include in visualizations", 55 | default=self.__default, 56 | options=self.__options, 57 | key="dashboard_sidebar_multiselect") 58 | __update_button = st.button("Update visualizations") 59 | if __update_button: 60 | state.set_selected_tags_compare_view(__selected) 61 | 62 | 63 | class CompareSidebarWithSnowflakeSettings(CompareSidebar): 64 | 65 | def _display_extras(self): 66 | with st.expander("Streamlit settings", True): 67 | st.subheader("Please enter your Snowflake account information below.") 68 | with st.form("snowflake_settings"): 69 | sf_dict = state.get_snowflake_cred_dict() 70 | default_settings_enabled = state.get_default_sf_credentials_enabled() 71 | if sf_dict["account"] is None or default_settings_enabled: 72 | sf_account = st.text_input(key="sf_account", label='Account:') 73 | else: 74 | sf_account = st.text_input(value=sf_dict["account"], key="sf_account", label='Account:') 75 | if sf_dict["user"] is None or default_settings_enabled: 76 | sf_user = st.text_input(key="sf_user", label="User:") 77 | else: 78 | sf_user = st.text_input(value=sf_dict["user"], key="sf_user", label="User:") 79 | if sf_dict["password"] is None or default_settings_enabled: 80 | sf_password = st.text_input(key="sf_password", label="Password:", type="password") 81 | else: 82 | sf_password = st.text_input(value=sf_dict["password"], key="sf_password", label="Password:") 83 | if sf_dict["role"] is None or default_settings_enabled: 84 | sf_role = st.text_input(key="sf_role", label="Role:") 85 | else: 86 | sf_role = st.text_input(value=sf_dict["role"], key="sf_role", label="Role:") 87 | if sf_dict["warehouse"] is None or default_settings_enabled: 88 | sf_warehouse = st.text_input(key="sf_warehouse", label="Warehouse:") 89 | else: 90 | sf_warehouse = st.text_input(value=sf_dict["warehouse"], key="sf_warehouse", label="Warehouse:") 91 | if sf_dict["database"] is None or default_settings_enabled: 92 | sf_database = st.text_input(key="sf_database", label="Database:") 93 | else: 94 | sf_database = st.text_input(value=sf_dict["database"], key="sf_database", label="Database:") 95 | if sf_dict["schema"] is None or default_settings_enabled: 96 | sf_schema = st.text_input(key="sf_schema", label="Schema:") 97 | else: 98 | sf_schema = st.text_input(value=sf_dict["schema"], key="sf_schema", label="Schema:") 99 | if sf_dict["stage"] is None or default_settings_enabled: 100 | sf_stage = st.text_input(key="sf_stage", label="Stage:") 101 | else: 102 | sf_stage = st.text_input(value=sf_dict["stage"], key="sf_stage", label="Stage:") 103 | 104 | submit_button = st.form_submit_button(label='Submit') 105 | 106 | if submit_button: 107 | __snow_creds = { 108 | 'account': sf_account.strip(), 109 | 'user': sf_user.strip(), 110 | 'password': sf_password.strip(), 111 | 'role': sf_role.strip(), 112 | 'warehouse': sf_warehouse.strip(), 113 | 'database': sf_database.strip(), 114 | 'schema': sf_schema.strip(), 115 | 'stage': sf_stage.strip() 116 | } 117 | for v in __snow_creds.values(): 118 | if v: 119 | state.set_default_sf_credentials_enabled(False) 120 | break 121 | state.set_snowflake_cred_dict(__snow_creds) 122 | state.set_default_sf_credentials_enabled(False) 123 | __use_default_sf_account = st.checkbox("Use default Snowflake account (internal use only)") 124 | if __use_default_sf_account: 125 | with st.form("semantha_sf_pw"): 126 | sf_pw = st.text_input(key="semantha_sf_pw", label="Password:", type="password") 127 | pw_submit_button = st.form_submit_button(label='Submit') 128 | if pw_submit_button: 129 | if sf_pw == st.secrets.semantha.snowflake_password: 130 | state.set_snowflake_cred_dict(st.secrets.snowflake.to_dict()) 131 | state.set_default_sf_credentials_enabled(True) 132 | st.success("Successfully loaded default Snowflake account information.") 133 | else: 134 | st.error("Invalid password.") 135 | 136 | 137 | class HowToSidebar(AbstractSidebar): 138 | 139 | def _display_content(self): 140 | st.write("_The sidebar can be used to adjust settings ..._") 141 | 142 | 143 | def _prepare_lib_tags_as_filter_options() -> List[str]: 144 | __options = state.get_semantha().get_library_tags() 145 | if __options is None: 146 | __options = [] 147 | __options.append(state.NO_TAG) 148 | return __options 149 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2023 thingsThinking 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/pages_views/document_collection.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import logging 3 | 4 | import numpy as np 5 | import pandas as pd 6 | import streamlit as st 7 | 8 | import state 9 | from pages_views.abstract_pages import AbstractContentPage 10 | from util.semantha_model_handling import get_paragraph_matches_of_doc 11 | from util.text_handling import short_text 12 | 13 | 14 | class DocumentCollection(AbstractContentPage): 15 | 16 | def __init__(self, page_id: int): 17 | super().__init__() 18 | if page_id == 3: 19 | self._content_placeholder = st.container() 20 | else: 21 | self._content_placeholder = st.empty() 22 | self.__tags = state.get_semantha().get_library_tags() 23 | 24 | def _display_content(self, max_fetch: int = 100, max_files: int = 20): 25 | sf_settings = state.get_snowflake_cred_dict() 26 | for v in sf_settings.values(): 27 | if not v: 28 | st.error("At least one field of the streamlit account information is empty. " 29 | "Please fill in all account information before you proceed.") 30 | return 31 | # limit fetching of list of documents from snowflake to the first 100 documents 32 | __file_list = state.get_snowpark().get_list_of_file_names(max_fetch) 33 | if __file_list is not None: 34 | __files_to_display = [] 35 | for f in __file_list: 36 | doc = FileDocument(f) 37 | # limit downloading of documents from snowflake to the first 20 documents 38 | if len(__files_to_display) == max_files: 39 | break 40 | if doc.is_analyzable(): 41 | __files_to_display.append(doc) 42 | else: 43 | logging.debug(f"Found non analyzable file '{doc.path}'") 44 | self._display_files(__files_to_display) 45 | self.__display_analysis_overview() 46 | __tag_for_summarization = state.get_tag_for_summarization() 47 | if __tag_for_summarization is not None: 48 | self.__display_summarization(__tag_for_summarization) 49 | self.__display_analysis_result() 50 | 51 | def _display_files(self, documents): 52 | __selected_file = None 53 | for d in documents: 54 | if d.is_viewable(): 55 | __selected_file = d 56 | break 57 | with st.expander(label="Document Collection", expanded=True): 58 | st.write("Below you can find your documents from your Snowflake data collection. " 59 | "A document preview can be activated by clicking on the arrow icon on the left side. " 60 | "Please note that only the first 20 documents are displayed in this demo.") 61 | __list_col, __pv_col = st.columns(2) 62 | __doc_container = __list_col.container() 63 | for i, doc in enumerate(documents): 64 | __but_col, __doc_col = __doc_container.columns([0.8, 10]) 65 | __curr_file_name = doc.get_name() 66 | with __doc_col.container(): 67 | st.info(__curr_file_name) 68 | __viewable = doc.is_viewable() 69 | __view_button = __but_col.button('↗️', disabled=not __viewable, key=f'open_doc_{i}', 70 | help="Switch file preview") 71 | if __view_button: 72 | __selected_file = doc 73 | with __pv_col.container(): 74 | self.__display_pdf(__selected_file) 75 | _, _, __bc, _, _ = st.columns(5) 76 | __analyze_button = __bc.button('Analyze Document Collection', disabled=False, key='analyze_button') 77 | if __analyze_button: 78 | self.__analyze_doc_collection(documents) 79 | 80 | def __display_analysis_overview(self): 81 | __docs_with_refs_with_tags = state.get_docs_with_refs_with_tags() 82 | if len(__docs_with_refs_with_tags) > 0: 83 | __matched_tags = self.__determine_all_matched_tag(__docs_with_refs_with_tags) 84 | with st.expander(label="Document Collection Overview", expanded=True): 85 | __doc_col, __tag_col = st.columns([1, 2]) 86 | with __doc_col.container(): 87 | st.write("lorem ipsum") 88 | __matched_tags__list = [key for key in __matched_tags] 89 | if len(__matched_tags__list) > 0: 90 | __number_items_per_row = 6 91 | __chars_per_line = 30 92 | __tag_list = sorted(__matched_tags__list) 93 | __rows = int(np.ceil(len(self.__tags) / __number_items_per_row)) 94 | with __tag_col.container(): 95 | for k in range(__rows): 96 | __bu_cols = st.columns([1] * __number_items_per_row) 97 | for j in range(__number_items_per_row): 98 | if k * __number_items_per_row + j < len(self.__tags): 99 | __tag = self.__tags[k * __number_items_per_row + j] 100 | if __tag in __tag_list: 101 | __b = __bu_cols[j].button( 102 | short_text(__tag, __chars_per_line), 103 | key=f"overview_{__tag}", 104 | help=f"Create summary for topic '{__tag}'", 105 | ) 106 | else: 107 | __b = __bu_cols[j].button( 108 | short_text(__tag, __chars_per_line), 109 | key=f"overview_{__tag}", 110 | disabled=True, 111 | ) 112 | 113 | def __display_analysis_result(self): 114 | if len(state.get_docs_with_refs_with_tags()) > 0: 115 | __selected_tag = None 116 | __selected_doc = None 117 | with st.expander(label="Analysis Result", expanded=True): 118 | for i, (name, refs) in enumerate( 119 | state.get_docs_with_refs_with_tags().items() 120 | ): 121 | if i > 0: 122 | st.divider() 123 | __tag_list = [] 124 | for r in refs: 125 | for v in r.values(): 126 | __tag = v["tag"] 127 | if __tag not in __tag_list: 128 | __tag_list.append(__tag) 129 | __doc_col, __tag_col = st.columns([1, 2]) 130 | with __doc_col.container(): 131 | __analyze_button_col, __doc_name_col = st.columns([0.2, 2]) 132 | with __doc_name_col.container(): 133 | st.info(name) 134 | __single_doc_analysis_button = __analyze_button_col.button( 135 | "📑", 136 | key=f'sdab_{name}', 137 | disabled=len(__tag_list) == 0, 138 | help="Use this for manual analysis. __Hint__: You have to select the the tab 'Individual Document' afterwards." 139 | ) 140 | if __single_doc_analysis_button: 141 | __selected_doc = name 142 | __doc = None 143 | for d in state.get_documents_with_references(): 144 | if d.name == name: 145 | __doc = d 146 | if __doc is not None: 147 | state.set_single_document_with_references(name, __doc) 148 | if len(__tag_list) > 0: 149 | __number_items_per_row = 6 150 | __chars_per_line = 30 151 | __tag_list = sorted(__tag_list) 152 | __rows = int(np.ceil(len(self.__tags) / __number_items_per_row)) 153 | with __tag_col.container(): 154 | for k in range(__rows): 155 | __bu_cols = st.columns([1] * __number_items_per_row) 156 | for j in range(__number_items_per_row): 157 | if k * __number_items_per_row + j < len(self.__tags): 158 | __tag = self.__tags[k * __number_items_per_row + j] 159 | if __tag in __tag_list: 160 | __b = __bu_cols[j].button( 161 | short_text(__tag, __chars_per_line), 162 | key=f"{name}_{__tag}", 163 | help=f"Create summary for topic '{__tag}'", 164 | ) 165 | else: 166 | __b = __bu_cols[j].button( 167 | short_text(__tag, __chars_per_line), 168 | key=f"{name}_{__tag}", 169 | disabled=True, 170 | ) 171 | if __b: 172 | __selected_tag = __tag 173 | state.set_tag_for_summarization(__selected_tag) 174 | 175 | @st.cache_data(show_spinner=False) 176 | def __determine_all_matched_tag(_self, docs_with_refs_with_tags): 177 | matched_tags = {} 178 | for _, refs in docs_with_refs_with_tags.items(): 179 | for r in refs: 180 | for v in r.values(): 181 | __tag = v["tag"] 182 | if __tag in matched_tags: 183 | matched_tags[__tag] += 1 184 | else: 185 | matched_tags[__tag] = 1 186 | return matched_tags 187 | 188 | def __analyze_doc_collection(self, documents): 189 | state.reset_documents_with_references() 190 | state.reset_docs_with_refs_with_tags() 191 | progress_text = "Comparing document collection with references. This will take some time!" 192 | my_bar = st.progress(0.0, text=progress_text) 193 | increment = 1 / len(documents) 194 | for i, doc in enumerate(documents): 195 | __curr_file_name = doc.get_name() 196 | my_bar.progress((i + 1) * increment, text=f"{progress_text} Processing file '{__curr_file_name}'") 197 | state.add_document_with_references(state.get_semantha().compare_to_library(in_file=doc.as_stream(), 198 | threshold=state.get_similarity_threshold())) 199 | with st.spinner("Analyzing topics."): 200 | __docs_with_tags = {} 201 | for doc in state.get_documents_with_references(): 202 | __matches = get_paragraph_matches_of_doc(doc) 203 | __matches_with_tags = [] 204 | for m in __matches: 205 | __matches_with_tags.append({ 206 | m[0].id: { 207 | 'ref': m[1][0], 208 | 'tag': state.get_semantha().get_tags_of_library_document(m[1][0].document_id)[0] 209 | } 210 | }) 211 | __docs_with_tags[doc.name] = __matches_with_tags 212 | state.set_docs_with_refs_with_tags(__docs_with_tags) 213 | st.success("Analysis of document collection is done. Results are shown below.") 214 | 215 | def __display_summarization(self, tag): 216 | __seen_par_ids = [] 217 | with st.expander(label=f"Summarization for Topic '{tag}'", expanded=True): 218 | with st.spinner("Generating the summary..."): 219 | __sources = [] 220 | __docs_with_refs = state.get_documents_with_references() 221 | __docs_with_refs_with_tags = state.get_docs_with_refs_with_tags() 222 | __relevant_sections = [] 223 | for doc_name, refs in state.get_docs_with_refs_with_tags().items(): 224 | for r in refs: 225 | for ref_id, v in r.items(): 226 | if v["tag"] == tag: 227 | for input_doc in __docs_with_refs: 228 | if input_doc.name == doc_name: 229 | __visited_paragraphs = [] 230 | __delayed_break = False 231 | for page in input_doc.pages: 232 | if page.contents is not None: 233 | for content in page.contents: 234 | if content.paragraphs is not None: 235 | for p in content.paragraphs: 236 | __visited_paragraphs.append(p) 237 | if __delayed_break: 238 | break 239 | if p.id == ref_id: 240 | __delayed_break = True 241 | if __delayed_break: 242 | break 243 | if __delayed_break: 244 | break 245 | __relevant_sections.append( 246 | ("\n".join(p.text for p in __visited_paragraphs[-3:]), doc_name)) 247 | __sources = [p for p, _ in __relevant_sections] 248 | __summarization = state.get_semantha().summarize(__sources, tag) 249 | if __summarization is not None: 250 | st.write(__summarization) 251 | __df = pd.DataFrame.from_records([[p, doc] for p, doc in __relevant_sections], columns=["Reference", "Document"]) 252 | __df.index = np.arange(1, len(__df) + 1) 253 | st.dataframe(__df, use_container_width=True) 254 | else: 255 | st.error("Unfortunately no summary could be generate for the given documents!") 256 | 257 | @staticmethod 258 | def __display_pdf(document): 259 | if document is None: 260 | st.error("None of the provided documents can be displayed. Currently, only PDF document display is supported.") 261 | pdf_display = F'
' 262 | st.markdown(pdf_display, unsafe_allow_html=True) 263 | 264 | 265 | class FileDocument: 266 | def __init__(self, path: str): 267 | self.path = path 268 | 269 | def get_name(self): 270 | return self.path.split("/")[-1] 271 | 272 | def is_viewable(self): 273 | return self.path.endswith(".pdf") 274 | 275 | def is_analyzable(self): 276 | return self.path.endswith(".pdf") or self.path.endswith(".txt") or self.path.endswith(".docx") 277 | 278 | def as_base64(self): 279 | with self.as_stream() as f: 280 | return base64.b64encode(f.read()).decode('utf-8') 281 | 282 | def as_stream(self): 283 | return state.get_snowpark().get_document(self.path) 284 | -------------------------------------------------------------------------------- /src/pages_views/compare.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | 4 | import altair 5 | import pandas as pd 6 | import plotly.express as px 7 | import streamlit as st 8 | from semantha_sdk.model.document import Document 9 | from semantha_sdk.model.document_class import DocumentClass 10 | 11 | import state 12 | from pages_views.abstract_pages import AbstractContentPage 13 | from util.semantha_model_handling import get_paragraph_matches_of_doc 14 | from util.text_handling import short_text 15 | 16 | 17 | class ComparePage(AbstractContentPage): 18 | __MATCH_COLUMN_DEF = [5.9, 1.1, 5.9] 19 | __LIB_MATCH_COLUMN_DEF = [1.0, 0.2, 5.0] 20 | __EXAMPLE_FILE = "Hooray_IT_ESG_Report_2021.pdf" 21 | 22 | def __init__(self, page_id: int): 23 | super().__init__() 24 | if page_id == 2: 25 | self._content_placeholder = st.container() 26 | else: 27 | self._content_placeholder = st.empty() 28 | self.__upload_disabled = True 29 | 30 | def _display_content(self): 31 | st.write(f"By default, a sample sustainability report is used for the comparison ({self.__EXAMPLE_FILE}). " 32 | "If you want to use your own document, please upload it below.") 33 | 34 | __selected_file_name = self.__EXAMPLE_FILE 35 | 36 | with st.expander(label="Upload your own document or directly click 'Analyze' to use the provided sample document.", expanded=False): 37 | __cmp_input_up = st.file_uploader("upload", key='cmp_input_up', label_visibility="collapsed") 38 | if __cmp_input_up is not None: 39 | __selected_file_name = __cmp_input_up.name 40 | 41 | __file_select, __col2, _ = st.columns([2, 1, 2]) 42 | __comp_button = __col2.button('Analyze', disabled=False, key='cmp_docs') 43 | 44 | if __comp_button: 45 | with st.spinner("Comparing document to references..."): 46 | logging.info("Comparing document to references...") 47 | if __cmp_input_up is None: 48 | logging.info(f"No document uploaded. Using example document: '{self.__EXAMPLE_FILE}'") 49 | __cmp_input_up = self.__open_example_file(self.__EXAMPLE_FILE) 50 | else: 51 | logging.info(f"Document uploaded. Using uploaded document: '{__cmp_input_up.name}'") 52 | state.set_single_document_with_references( 53 | __selected_file_name, 54 | state.get_semantha().compare_to_library( 55 | in_file=__cmp_input_up, 56 | threshold=state.get_similarity_threshold() 57 | ) 58 | ) 59 | st.success( 60 | f"Done! The analysis results are shown below..." 61 | ) 62 | logging.info("... done (comparing document to references)") 63 | with __file_select.container(): 64 | st.info(f"Selected File: __{__selected_file_name}__") 65 | __doc_tuple = state.get_single_document_with_references() 66 | __doc = __doc_tuple[1] 67 | if __doc is not None: 68 | st.divider() 69 | st.subheader(f"Results for file '{__doc_tuple[0]}'") 70 | __selected_tags = state.get_selected_tags_compare_view() 71 | self.__display_overall_stats(__doc) 72 | self.__display_matches_per_tags_per_page(__doc, __selected_tags) 73 | self.__display_library_matches_per_tag(__doc) 74 | self.__display_sunburst_chart(__doc, __selected_tags) 75 | self.__display_matches(__doc, __selected_tags, __doc.id) 76 | 77 | def __display_overall_stats(self, doc): 78 | __paragraph_matches = get_paragraph_matches_of_doc(doc) 79 | 80 | with st.expander(label="Statistics", expanded=True): 81 | st.subheader(f"Total Matches: {len(__paragraph_matches)}") 82 | 83 | def __display_matches_per_tags_per_page(self, doc, __selected_tags): 84 | with st.expander(label="Visualization of Matches by Topics per Page", expanded=True): 85 | st.subheader(f"Matches by Topics per Page") 86 | chart_data = self.__calculate_matches_per_page(doc, __selected_tags, doc.id) 87 | if len(chart_data) == 0: 88 | st.error("Nothing to display. Please adjust the filter(s) or start a new analysis.") 89 | else: 90 | chart = altair.Chart(chart_data).mark_bar().encode( 91 | x=altair.X('Page', axis=altair.Axis(labelAngle=0), sort=None), 92 | y=altair.Y('sum(References)', title='Number of Matches'), 93 | color='Topic', 94 | tooltip='Topic' 95 | ) 96 | st.altair_chart(chart, use_container_width=True) 97 | 98 | @st.cache_data(show_spinner="Fetching matches ...") 99 | def __display_matches(_self, _doc, selected_tags, doc_id): 100 | 101 | logging.info(f"Fetching matches for document {doc_id} with selected tags: {selected_tags}") 102 | with st.expander(label="Text-to-Text Matches", expanded=True): 103 | st.subheader('Matching Sections') 104 | __matches = get_paragraph_matches_of_doc(_doc) 105 | if len(__matches) == 0: 106 | st.error(f"Found no matches for selected topics: {selected_tags}") 107 | for idx, match in enumerate(__matches): 108 | ref_0 = match[1][0] 109 | ref_0_tags = state.get_semantha().get_tags_of_library_document(ref_0.document_id) 110 | if ref_0_tags is None: 111 | ref_0_tags = [] 112 | if len(ref_0_tags) == 0: 113 | ref_0_tags.append(state.NO_TAG) 114 | hit = False 115 | if len(selected_tags) == 0: 116 | hit = True 117 | else: 118 | for ref_0_tag in ref_0_tags: 119 | if ref_0_tag in selected_tags: 120 | hit = True 121 | continue 122 | if hit: 123 | with st.container(): 124 | st.caption(f"_Match {idx + 1}: {', '.join(ref_0_tags)}_") 125 | col_input_text, col_sim_text, col_reference_text = st.columns(_self.__MATCH_COLUMN_DEF) 126 | if ref_0.similarity > state.CONST_HIGH_SIM: 127 | color = state.CONST_HIGH_SIM_COLOR 128 | elif ref_0.similarity > state.CONST_MID_SIM: 129 | color = state.CONST_MID_SIM_COLOR 130 | else: 131 | color = state.CONST_LOW_SIM_COLOR 132 | text_ref_0 = state.get_semantha().get_text_of_library_paragraph(ref_0.document_id, 133 | ref_0.paragraph_id) 134 | col_input_text.markdown(f'

{match[0].text}

', 135 | unsafe_allow_html=True) 136 | col_sim_text.markdown( 137 | f'

⇄ | {(ref_0.similarity * 100):2.2f} %

', 138 | unsafe_allow_html=True) 139 | col_reference_text.markdown(f'

{text_ref_0}

', 140 | unsafe_allow_html=True) 141 | st.divider() 142 | 143 | def __display_sunburst_chart(self, doc, __selected_tags): 144 | __paragraph_matches = get_paragraph_matches_of_doc(doc) 145 | with st.expander(label="Visualization of Matches per Topic", expanded=True): 146 | st.subheader(f"Distribution of Matches per Topic") 147 | __labels, __parents = self.__retrieve_categories_for_sunburst_chart(__selected_tags, __paragraph_matches, doc.id) 148 | data = dict( 149 | character=[short_text(label) for label in __labels], 150 | parent=[short_text(parent) for parent in __parents], 151 | hover=__labels 152 | ) 153 | fig = px.sunburst(data, names='character', parents='parent', hover_name='hover', hover_data={"character": False, "parent": False, "hover": False}, height=1200, width=8000) 154 | st.plotly_chart(fig, use_container_width=True) 155 | 156 | def __display_library_matches_per_tag(self, doc): 157 | __available_tags = state.get_semantha().get_library_tags() 158 | __tag_match_dict = self.__retrieve_library_matches_per_tag(__available_tags, doc, doc.id) 159 | __selected_tag = __available_tags[0] 160 | with st.expander(label="Library Matches per Topic", expanded=True): 161 | col_h1, _, col_h2 = st.columns(self.__LIB_MATCH_COLUMN_DEF) 162 | col_tags, _, col_matches = st.columns(self.__LIB_MATCH_COLUMN_DEF) 163 | with col_h1.container(): 164 | st.subheader("Available Topics") 165 | with col_tags.container(): 166 | for __tag in __available_tags: 167 | col_marker, col_button = st.columns([1, 15]) 168 | if len(__tag_match_dict[__tag]["matched"]) > 0: 169 | col_marker.markdown('✔') 170 | else: 171 | col_marker.markdown('✖️') 172 | __tag_button = col_button.button(__tag, disabled=False, key=f'tag_button_{__tag}', use_container_width=True) 173 | if __tag_button: 174 | __selected_tag = __tag 175 | with col_h2.container(): 176 | st.subheader(f"For topic '{__selected_tag}' matches were found for the following library items") 177 | with col_matches.container(): 178 | __matched = __tag_match_dict[__selected_tag]["matched"] 179 | __not_matched = __tag_match_dict[__selected_tag]["not_matched"] 180 | for m in __matched: 181 | st.success(f"__{m.name.strip()}__: '{m.content_preview}'") 182 | st.subheader(f"For topic '{__selected_tag}' _no_ matches were found for the following library items") 183 | for nm in __not_matched: 184 | st.error(f"__{nm.name.strip()}__: '{nm.content_preview}'") 185 | 186 | @st.cache_data(show_spinner="Retrieving library matches per topic...") 187 | def __retrieve_library_matches_per_tag(_self, tags, _doc, doc_id): 188 | logging.info(f"Retrieving library matches per tag for tags {tags} and document with id {doc_id}") 189 | result_dict = {} 190 | for t in tags: 191 | __matched = [] 192 | __not_matched = [] 193 | __doc_ids_of_paragraph_matches = [i.document_id for x in get_paragraph_matches_of_doc(_doc) for i in x[1]] 194 | __lib_entries_for_tag = state.get_semantha().get_library_entries_for_tag(t) 195 | for entry in __lib_entries_for_tag: 196 | if entry.id in __doc_ids_of_paragraph_matches: 197 | __matched.append(entry) 198 | else: 199 | __not_matched.append(entry) 200 | result_dict[t] = { 201 | "matched": __matched, 202 | "not_matched": __not_matched 203 | } 204 | return result_dict 205 | 206 | @staticmethod 207 | def __open_example_file(file_name: str): 208 | return open(os.path.join(os.path.dirname(__file__), "..", "..", "data", "single", file_name), "rb") 209 | 210 | @st.cache_data(show_spinner="Fetching matches per page...") 211 | def __calculate_matches_per_page(_self, _doc: Document, selected_tags, doc_id): 212 | 213 | logging.info(f"Fetching matches for document {doc_id} with selected tags: {selected_tags}") 214 | 215 | __matches_dict = {} 216 | __ref_tag_cache = {} 217 | for idx, p in enumerate(_doc.pages): 218 | if str(idx) not in __matches_dict: 219 | __matches_dict[str(idx)] = {} 220 | if p.contents is not None: 221 | for c in p.contents: 222 | if c.paragraphs is not None: 223 | for par in c.paragraphs: 224 | if par.references is not None: 225 | for ref in par.references: 226 | if ref.document_id in __ref_tag_cache: 227 | tags = __ref_tag_cache[ref.document_id] 228 | else: 229 | tags = state.get_semantha().get_tags_of_library_document(ref.document_id) 230 | __ref_tag_cache[ref.document_id] = tags 231 | if len(tags) == 0: 232 | if state.NO_TAG in __matches_dict[str(idx)]: 233 | __matches_dict[str(idx)][state.NO_TAG] += 1 234 | else: 235 | __matches_dict[str(idx)][state.NO_TAG] = 1 236 | for tag in tags: 237 | if tag in __matches_dict[str(idx)]: 238 | __matches_dict[str(idx)][tag] += 1 239 | else: 240 | __matches_dict[str(idx)][tag] = 1 241 | __matches_rec = [] 242 | for page, tags in __matches_dict.items(): 243 | for tag, count in tags.items(): 244 | if tag in selected_tags or len(selected_tags) == 0: 245 | __matches_rec.append([str(int(page) + 1), tag, int(count)]) 246 | __match_df = pd.DataFrame.from_records( 247 | __matches_rec, 248 | columns=["Page", "Topic", "References"] 249 | ) 250 | return __match_df 251 | 252 | @st.cache_data(show_spinner="Fetching topics for sunburst chart...") 253 | def __retrieve_categories_for_sunburst_chart(_self, selected_tags, __paragraph_matches, doc_id): 254 | logging.info(f"Fetching categories for sunburst chart for document {doc_id}") 255 | __characters = [] 256 | __parents = [] 257 | 258 | for idx, m in enumerate(__paragraph_matches): 259 | __ref_0 = m[1][0] 260 | __matches_tags = state.get_semantha().get_tags_of_library_document(__ref_0.document_id) 261 | for t in __matches_tags: 262 | if t in selected_tags or len(selected_tags) == 0: 263 | __category = state.get_semantha().get_category_of_document(__ref_0.document_id) 264 | if __category is None: 265 | if "uncategorized" not in __characters: 266 | __characters.append("uncategorized") 267 | __parents.append("") 268 | __parents.append("uncategorized") 269 | else: 270 | _self.__add_category(__category, __characters, __parents) 271 | __parents.append(__category.name) 272 | __characters.append(f"Match {idx + 1}: {short_text(m[0].text, 100)}") 273 | continue 274 | return __characters, __parents 275 | 276 | def __add_category(self, category: DocumentClass, characters, parents): 277 | __category = state.get_semantha().get_category_by_id(category.id) 278 | __c_name = __category.name 279 | if __category.parent_id is None: 280 | if __c_name not in characters: 281 | characters.append(__c_name) 282 | parents.append("") 283 | return 284 | else: 285 | self.__add_category(state.get_semantha().get_category_by_id(__category.parent_id), characters, parents) 286 | if __c_name not in characters: 287 | characters.append(__c_name) 288 | parents.append(state.get_semantha().get_category_by_id(__category.parent_id).name) 289 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "altair" 5 | version = "5.0.1" 6 | description = "Vega-Altair: A declarative statistical visualization library for Python." 7 | optional = false 8 | python-versions = ">=3.7" 9 | files = [ 10 | {file = "altair-5.0.1-py3-none-any.whl", hash = "sha256:9f3552ed5497d4dfc14cf48a76141d8c29ee56eae2873481b4b28134268c9bbe"}, 11 | {file = "altair-5.0.1.tar.gz", hash = "sha256:087d7033cb2d6c228493a053e12613058a5d47faf6a36aea3ff60305fd8b4cb0"}, 12 | ] 13 | 14 | [package.dependencies] 15 | jinja2 = "*" 16 | jsonschema = ">=3.0" 17 | numpy = "*" 18 | pandas = ">=0.18" 19 | toolz = "*" 20 | typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} 21 | 22 | [package.extras] 23 | dev = ["black (<24)", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff", "types-jsonschema", "types-setuptools", "vega-datasets", "vl-convert-python"] 24 | doc = ["docutils", "geopandas", "jinja2", "myst-parser", "numpydoc", "pillow", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] 25 | 26 | [[package]] 27 | name = "asn1crypto" 28 | version = "1.5.1" 29 | description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" 30 | optional = false 31 | python-versions = "*" 32 | files = [ 33 | {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, 34 | {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, 35 | ] 36 | 37 | [[package]] 38 | name = "attrs" 39 | version = "23.1.0" 40 | description = "Classes Without Boilerplate" 41 | optional = false 42 | python-versions = ">=3.7" 43 | files = [ 44 | {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, 45 | {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, 46 | ] 47 | 48 | [package.extras] 49 | cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] 50 | dev = ["attrs[docs,tests]", "pre-commit"] 51 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] 52 | tests = ["attrs[tests-no-zope]", "zope-interface"] 53 | tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] 54 | 55 | [[package]] 56 | name = "backports-zoneinfo" 57 | version = "0.2.1" 58 | description = "Backport of the standard library zoneinfo module" 59 | optional = false 60 | python-versions = ">=3.6" 61 | files = [ 62 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"}, 63 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"}, 64 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"}, 65 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"}, 66 | {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"}, 67 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"}, 68 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"}, 69 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"}, 70 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"}, 71 | {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"}, 72 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"}, 73 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"}, 74 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"}, 75 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"}, 76 | {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"}, 77 | {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"}, 78 | ] 79 | 80 | [package.extras] 81 | tzdata = ["tzdata"] 82 | 83 | [[package]] 84 | name = "beautifulsoup4" 85 | version = "4.12.2" 86 | description = "Screen-scraping library" 87 | optional = false 88 | python-versions = ">=3.6.0" 89 | files = [ 90 | {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, 91 | {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, 92 | ] 93 | 94 | [package.dependencies] 95 | soupsieve = ">1.2" 96 | 97 | [package.extras] 98 | html5lib = ["html5lib"] 99 | lxml = ["lxml"] 100 | 101 | [[package]] 102 | name = "blinker" 103 | version = "1.6.2" 104 | description = "Fast, simple object-to-object and broadcast signaling" 105 | optional = false 106 | python-versions = ">=3.7" 107 | files = [ 108 | {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, 109 | {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, 110 | ] 111 | 112 | [[package]] 113 | name = "bs4" 114 | version = "0.0.1" 115 | description = "Dummy package for Beautiful Soup" 116 | optional = false 117 | python-versions = "*" 118 | files = [ 119 | {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, 120 | ] 121 | 122 | [package.dependencies] 123 | beautifulsoup4 = "*" 124 | 125 | [[package]] 126 | name = "cachetools" 127 | version = "5.3.1" 128 | description = "Extensible memoizing collections and decorators" 129 | optional = false 130 | python-versions = ">=3.7" 131 | files = [ 132 | {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, 133 | {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, 134 | ] 135 | 136 | [[package]] 137 | name = "certifi" 138 | version = "2023.5.7" 139 | description = "Python package for providing Mozilla's CA Bundle." 140 | optional = false 141 | python-versions = ">=3.6" 142 | files = [ 143 | {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, 144 | {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, 145 | ] 146 | 147 | [[package]] 148 | name = "cffi" 149 | version = "1.15.1" 150 | description = "Foreign Function Interface for Python calling C code." 151 | optional = false 152 | python-versions = "*" 153 | files = [ 154 | {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, 155 | {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, 156 | {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, 157 | {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, 158 | {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, 159 | {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, 160 | {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, 161 | {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, 162 | {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, 163 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, 164 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, 165 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, 166 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, 167 | {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, 168 | {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, 169 | {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, 170 | {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, 171 | {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, 172 | {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, 173 | {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, 174 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, 175 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, 176 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, 177 | {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, 178 | {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, 179 | {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, 180 | {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, 181 | {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, 182 | {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, 183 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, 184 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, 185 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, 186 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, 187 | {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, 188 | {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, 189 | {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, 190 | {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, 191 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, 192 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, 193 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, 194 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, 195 | {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, 196 | {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, 197 | {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, 198 | {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, 199 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, 200 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, 201 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, 202 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, 203 | {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, 204 | {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, 205 | {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, 206 | {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, 207 | {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, 208 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, 209 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, 210 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, 211 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, 212 | {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, 213 | {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, 214 | {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, 215 | {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, 216 | {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, 217 | {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, 218 | ] 219 | 220 | [package.dependencies] 221 | pycparser = "*" 222 | 223 | [[package]] 224 | name = "charset-normalizer" 225 | version = "3.1.0" 226 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 227 | optional = false 228 | python-versions = ">=3.7.0" 229 | files = [ 230 | {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, 231 | {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, 232 | {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, 233 | {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, 234 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, 235 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, 236 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, 237 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, 238 | {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, 239 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, 240 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, 241 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, 242 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, 243 | {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, 244 | {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, 245 | {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, 246 | {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, 247 | {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, 248 | {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, 249 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, 250 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, 251 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, 252 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, 253 | {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, 254 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, 255 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, 256 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, 257 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, 258 | {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, 259 | {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, 260 | {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, 261 | {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, 262 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, 263 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, 264 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, 265 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, 266 | {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, 267 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, 268 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, 269 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, 270 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, 271 | {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, 272 | {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, 273 | {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, 274 | {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, 275 | {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, 276 | {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, 277 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, 278 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, 279 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, 280 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, 281 | {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, 282 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, 283 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, 284 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, 285 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, 286 | {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, 287 | {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, 288 | {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, 289 | {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, 290 | {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, 291 | {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, 292 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, 293 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, 294 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, 295 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, 296 | {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, 297 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, 298 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, 299 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, 300 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, 301 | {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, 302 | {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, 303 | {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, 304 | {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, 305 | ] 306 | 307 | [[package]] 308 | name = "click" 309 | version = "8.1.3" 310 | description = "Composable command line interface toolkit" 311 | optional = false 312 | python-versions = ">=3.7" 313 | files = [ 314 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 315 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 316 | ] 317 | 318 | [package.dependencies] 319 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 320 | 321 | [[package]] 322 | name = "cloudpickle" 323 | version = "2.0.0" 324 | description = "Extended pickling support for Python objects" 325 | optional = false 326 | python-versions = ">=3.6" 327 | files = [ 328 | {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"}, 329 | {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"}, 330 | ] 331 | 332 | [[package]] 333 | name = "colorama" 334 | version = "0.4.6" 335 | description = "Cross-platform colored terminal text." 336 | optional = false 337 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 338 | files = [ 339 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 340 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 341 | ] 342 | 343 | [[package]] 344 | name = "cryptography" 345 | version = "40.0.2" 346 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 347 | optional = false 348 | python-versions = ">=3.6" 349 | files = [ 350 | {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, 351 | {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, 352 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, 353 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, 354 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, 355 | {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, 356 | {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, 357 | {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, 358 | {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, 359 | {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, 360 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, 361 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, 362 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, 363 | {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, 364 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, 365 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, 366 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, 367 | {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, 368 | {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, 369 | ] 370 | 371 | [package.dependencies] 372 | cffi = ">=1.12" 373 | 374 | [package.extras] 375 | docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] 376 | docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] 377 | pep8test = ["black", "check-manifest", "mypy", "ruff"] 378 | sdist = ["setuptools-rust (>=0.11.4)"] 379 | ssh = ["bcrypt (>=3.1.5)"] 380 | test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] 381 | test-randomorder = ["pytest-randomly"] 382 | tox = ["tox"] 383 | 384 | [[package]] 385 | name = "decorator" 386 | version = "5.1.1" 387 | description = "Decorators for Humans" 388 | optional = false 389 | python-versions = ">=3.5" 390 | files = [ 391 | {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, 392 | {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, 393 | ] 394 | 395 | [[package]] 396 | name = "filelock" 397 | version = "3.12.2" 398 | description = "A platform independent file lock." 399 | optional = false 400 | python-versions = ">=3.7" 401 | files = [ 402 | {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, 403 | {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, 404 | ] 405 | 406 | [package.extras] 407 | docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] 408 | testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] 409 | 410 | [[package]] 411 | name = "gitdb" 412 | version = "4.0.10" 413 | description = "Git Object Database" 414 | optional = false 415 | python-versions = ">=3.7" 416 | files = [ 417 | {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, 418 | {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, 419 | ] 420 | 421 | [package.dependencies] 422 | smmap = ">=3.0.1,<6" 423 | 424 | [[package]] 425 | name = "gitpython" 426 | version = "3.1.31" 427 | description = "GitPython is a Python library used to interact with Git repositories" 428 | optional = false 429 | python-versions = ">=3.7" 430 | files = [ 431 | {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, 432 | {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, 433 | ] 434 | 435 | [package.dependencies] 436 | gitdb = ">=4.0.1,<5" 437 | 438 | [[package]] 439 | name = "hydralit-components" 440 | version = "1.0.10" 441 | description = "Components to use with or without the Hydralit package." 442 | optional = false 443 | python-versions = ">=3.6" 444 | files = [ 445 | {file = "hydralit_components-1.0.10.tar.gz", hash = "sha256:aeae8c9531451a5b93df9f4df208b4cb159b1a0ccf523f2a45d633e64b700496"}, 446 | ] 447 | 448 | [package.dependencies] 449 | bs4 = "*" 450 | lxml = "*" 451 | streamlit = ">=1.7" 452 | 453 | [[package]] 454 | name = "idna" 455 | version = "3.4" 456 | description = "Internationalized Domain Names in Applications (IDNA)" 457 | optional = false 458 | python-versions = ">=3.5" 459 | files = [ 460 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 461 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 462 | ] 463 | 464 | [[package]] 465 | name = "importlib-metadata" 466 | version = "6.6.0" 467 | description = "Read metadata from Python packages" 468 | optional = false 469 | python-versions = ">=3.7" 470 | files = [ 471 | {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, 472 | {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, 473 | ] 474 | 475 | [package.dependencies] 476 | zipp = ">=0.5" 477 | 478 | [package.extras] 479 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 480 | perf = ["ipython"] 481 | testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] 482 | 483 | [[package]] 484 | name = "importlib-resources" 485 | version = "5.12.0" 486 | description = "Read resources from Python packages" 487 | optional = false 488 | python-versions = ">=3.7" 489 | files = [ 490 | {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, 491 | {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, 492 | ] 493 | 494 | [package.dependencies] 495 | zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} 496 | 497 | [package.extras] 498 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 499 | testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 500 | 501 | [[package]] 502 | name = "jinja2" 503 | version = "3.1.2" 504 | description = "A very fast and expressive template engine." 505 | optional = false 506 | python-versions = ">=3.7" 507 | files = [ 508 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 509 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 510 | ] 511 | 512 | [package.dependencies] 513 | MarkupSafe = ">=2.0" 514 | 515 | [package.extras] 516 | i18n = ["Babel (>=2.7)"] 517 | 518 | [[package]] 519 | name = "jsonschema" 520 | version = "4.17.3" 521 | description = "An implementation of JSON Schema validation for Python" 522 | optional = false 523 | python-versions = ">=3.7" 524 | files = [ 525 | {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, 526 | {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, 527 | ] 528 | 529 | [package.dependencies] 530 | attrs = ">=17.4.0" 531 | importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} 532 | pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} 533 | pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" 534 | 535 | [package.extras] 536 | format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] 537 | format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] 538 | 539 | [[package]] 540 | name = "lxml" 541 | version = "4.9.2" 542 | description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." 543 | optional = false 544 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" 545 | files = [ 546 | {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, 547 | {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, 548 | {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, 549 | {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, 550 | {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, 551 | {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, 552 | {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, 553 | {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, 554 | {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, 555 | {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, 556 | {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, 557 | {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, 558 | {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, 559 | {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, 560 | {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, 561 | {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, 562 | {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, 563 | {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, 564 | {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, 565 | {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, 566 | {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, 567 | {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, 568 | {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, 569 | {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, 570 | {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, 571 | {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, 572 | {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, 573 | {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, 574 | {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, 575 | {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, 576 | {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, 577 | {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, 578 | {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, 579 | {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, 580 | {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, 581 | {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, 582 | {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, 583 | {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, 584 | {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, 585 | {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, 586 | {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, 587 | {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, 588 | {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, 589 | {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, 590 | {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, 591 | {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, 592 | {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, 593 | {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, 594 | {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, 595 | {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, 596 | {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, 597 | {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, 598 | {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, 599 | {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, 600 | {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, 601 | {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, 602 | {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, 603 | {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, 604 | {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, 605 | {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, 606 | {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, 607 | {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, 608 | {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, 609 | {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, 610 | {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, 611 | {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, 612 | {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, 613 | {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, 614 | {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, 615 | {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, 616 | {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, 617 | {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, 618 | {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, 619 | {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, 620 | {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, 621 | {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, 622 | {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, 623 | ] 624 | 625 | [package.extras] 626 | cssselect = ["cssselect (>=0.7)"] 627 | html5 = ["html5lib"] 628 | htmlsoup = ["BeautifulSoup4"] 629 | source = ["Cython (>=0.29.7)"] 630 | 631 | [[package]] 632 | name = "markdown-it-py" 633 | version = "3.0.0" 634 | description = "Python port of markdown-it. Markdown parsing, done right!" 635 | optional = false 636 | python-versions = ">=3.8" 637 | files = [ 638 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 639 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 640 | ] 641 | 642 | [package.dependencies] 643 | mdurl = ">=0.1,<1.0" 644 | 645 | [package.extras] 646 | benchmarking = ["psutil", "pytest", "pytest-benchmark"] 647 | code-style = ["pre-commit (>=3.0,<4.0)"] 648 | 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)"] 649 | linkify = ["linkify-it-py (>=1,<3)"] 650 | plugins = ["mdit-py-plugins"] 651 | profiling = ["gprof2dot"] 652 | rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] 653 | testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] 654 | 655 | [[package]] 656 | name = "markupsafe" 657 | version = "2.1.3" 658 | description = "Safely add untrusted strings to HTML/XML markup." 659 | optional = false 660 | python-versions = ">=3.7" 661 | files = [ 662 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, 663 | {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, 664 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, 665 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, 666 | {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, 667 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, 668 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, 669 | {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, 670 | {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, 671 | {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, 672 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, 673 | {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, 674 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, 675 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, 676 | {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, 677 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, 678 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, 679 | {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, 680 | {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, 681 | {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, 682 | {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, 683 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, 684 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, 685 | {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, 686 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, 687 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, 688 | {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, 689 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, 690 | {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, 691 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, 692 | {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, 693 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, 694 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, 695 | {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, 696 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, 697 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, 698 | {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, 699 | {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, 700 | {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, 701 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, 702 | {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, 703 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, 704 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, 705 | {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, 706 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, 707 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, 708 | {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, 709 | {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, 710 | {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, 711 | {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, 712 | ] 713 | 714 | [[package]] 715 | name = "marshmallow" 716 | version = "3.19.0" 717 | description = "A lightweight library for converting complex datatypes to and from native Python datatypes." 718 | optional = false 719 | python-versions = ">=3.7" 720 | files = [ 721 | {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, 722 | {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, 723 | ] 724 | 725 | [package.dependencies] 726 | packaging = ">=17.0" 727 | 728 | [package.extras] 729 | dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] 730 | docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] 731 | lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] 732 | tests = ["pytest", "pytz", "simplejson"] 733 | 734 | [[package]] 735 | name = "marshmallow-dataclass" 736 | version = "8.5.14" 737 | description = "Python library to convert dataclasses into marshmallow schemas." 738 | optional = false 739 | python-versions = ">=3.6" 740 | files = [ 741 | {file = "marshmallow_dataclass-8.5.14-py3-none-any.whl", hash = "sha256:73859c8963774b5aad6b23ff3dd8456c8463e7c96bf5076051e1656fd4e101d0"}, 742 | {file = "marshmallow_dataclass-8.5.14.tar.gz", hash = "sha256:233c414dd24a6d512bcdb6fb840076bf7a29b7daaaea40634f155a5933377d2e"}, 743 | ] 744 | 745 | [package.dependencies] 746 | marshmallow = ">=3.13.0,<4.0" 747 | typing-extensions = {version = ">=4.2.0", markers = "python_version < \"3.11\" and python_version >= \"3.7\""} 748 | typing-inspect = ">=0.8.0,<1.0" 749 | 750 | [package.extras] 751 | dev = ["marshmallow (>=3.18.0,<4.0)", "marshmallow-enum", "pre-commit (>=2.17,<3.0)", "pytest (>=5.4)", "pytest-mypy-plugins (>=1.2.0)", "sphinx", "typeguard (>=2.4.1,<4.0.0)"] 752 | docs = ["sphinx"] 753 | enum = ["marshmallow (>=3.18.0,<4.0)", "marshmallow-enum"] 754 | lint = ["pre-commit (>=2.17,<3.0)"] 755 | tests = ["pytest (>=5.4)", "pytest-mypy-plugins (>=1.2.0)"] 756 | union = ["typeguard (>=2.4.1,<4.0.0)"] 757 | 758 | [[package]] 759 | name = "mdurl" 760 | version = "0.1.2" 761 | description = "Markdown URL utilities" 762 | optional = false 763 | python-versions = ">=3.7" 764 | files = [ 765 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 766 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 767 | ] 768 | 769 | [[package]] 770 | name = "mypy-extensions" 771 | version = "1.0.0" 772 | description = "Type system extensions for programs checked with the mypy type checker." 773 | optional = false 774 | python-versions = ">=3.5" 775 | files = [ 776 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 777 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 778 | ] 779 | 780 | [[package]] 781 | name = "numpy" 782 | version = "1.24.3" 783 | description = "Fundamental package for array computing in Python" 784 | optional = false 785 | python-versions = ">=3.8" 786 | files = [ 787 | {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, 788 | {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, 789 | {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, 790 | {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, 791 | {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, 792 | {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, 793 | {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, 794 | {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, 795 | {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, 796 | {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, 797 | {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, 798 | {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, 799 | {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, 800 | {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, 801 | {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, 802 | {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, 803 | {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, 804 | {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, 805 | {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, 806 | {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, 807 | {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, 808 | {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, 809 | {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, 810 | {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, 811 | {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, 812 | {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, 813 | {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, 814 | {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, 815 | ] 816 | 817 | [[package]] 818 | name = "oscrypto" 819 | version = "1.3.0" 820 | description = "TLS (SSL) sockets, key generation, encryption, decryption, signing, verification and KDFs using the OS crypto libraries. Does not require a compiler, and relies on the OS for patching. Works on Windows, OS X and Linux/BSD." 821 | optional = false 822 | python-versions = "*" 823 | files = [ 824 | {file = "oscrypto-1.3.0-py2.py3-none-any.whl", hash = "sha256:2b2f1d2d42ec152ca90ccb5682f3e051fb55986e1b170ebde472b133713e7085"}, 825 | {file = "oscrypto-1.3.0.tar.gz", hash = "sha256:6f5fef59cb5b3708321db7cca56aed8ad7e662853351e7991fcf60ec606d47a4"}, 826 | ] 827 | 828 | [package.dependencies] 829 | asn1crypto = ">=1.5.1" 830 | 831 | [[package]] 832 | name = "packaging" 833 | version = "23.1" 834 | description = "Core utilities for Python packages" 835 | optional = false 836 | python-versions = ">=3.7" 837 | files = [ 838 | {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, 839 | {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, 840 | ] 841 | 842 | [[package]] 843 | name = "pandas" 844 | version = "2.0.2" 845 | description = "Powerful data structures for data analysis, time series, and statistics" 846 | optional = false 847 | python-versions = ">=3.8" 848 | files = [ 849 | {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, 850 | {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, 851 | {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, 852 | {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, 853 | {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, 854 | {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, 855 | {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, 856 | {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, 857 | {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, 858 | {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, 859 | {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, 860 | {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, 861 | {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, 862 | {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, 863 | {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, 864 | {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, 865 | {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, 866 | {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, 867 | {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, 868 | {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, 869 | {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, 870 | {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, 871 | {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, 872 | {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, 873 | {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, 874 | ] 875 | 876 | [package.dependencies] 877 | numpy = {version = ">=1.20.3", markers = "python_version < \"3.10\""} 878 | python-dateutil = ">=2.8.2" 879 | pytz = ">=2020.1" 880 | tzdata = ">=2022.1" 881 | 882 | [package.extras] 883 | all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] 884 | aws = ["s3fs (>=2021.08.0)"] 885 | clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] 886 | compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] 887 | computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] 888 | excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] 889 | feather = ["pyarrow (>=7.0.0)"] 890 | fss = ["fsspec (>=2021.07.0)"] 891 | gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] 892 | hdf5 = ["tables (>=3.6.1)"] 893 | html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] 894 | mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] 895 | output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] 896 | parquet = ["pyarrow (>=7.0.0)"] 897 | performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] 898 | plot = ["matplotlib (>=3.6.1)"] 899 | postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] 900 | spss = ["pyreadstat (>=1.1.2)"] 901 | sql-other = ["SQLAlchemy (>=1.4.16)"] 902 | test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] 903 | xml = ["lxml (>=4.6.3)"] 904 | 905 | [[package]] 906 | name = "pillow" 907 | version = "9.5.0" 908 | description = "Python Imaging Library (Fork)" 909 | optional = false 910 | python-versions = ">=3.7" 911 | files = [ 912 | {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, 913 | {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, 914 | {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, 915 | {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, 916 | {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, 917 | {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, 918 | {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, 919 | {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, 920 | {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, 921 | {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, 922 | {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, 923 | {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, 924 | {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, 925 | {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, 926 | {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, 927 | {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, 928 | {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, 929 | {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, 930 | {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, 931 | {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, 932 | {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, 933 | {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, 934 | {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, 935 | {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, 936 | {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, 937 | {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, 938 | {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, 939 | {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, 940 | {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, 941 | {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, 942 | {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, 943 | {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, 944 | {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, 945 | {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, 946 | {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, 947 | {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, 948 | {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, 949 | {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, 950 | {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, 951 | {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, 952 | {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, 953 | {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, 954 | {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, 955 | {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, 956 | {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, 957 | {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, 958 | {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, 959 | {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, 960 | {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, 961 | {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, 962 | {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, 963 | {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, 964 | {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, 965 | {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, 966 | {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, 967 | {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, 968 | {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, 969 | {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, 970 | {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, 971 | {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, 972 | {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, 973 | {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, 974 | {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, 975 | {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, 976 | {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, 977 | {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, 978 | ] 979 | 980 | [package.extras] 981 | docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] 982 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 983 | 984 | [[package]] 985 | name = "pkgutil-resolve-name" 986 | version = "1.3.10" 987 | description = "Resolve a name to an object." 988 | optional = false 989 | python-versions = ">=3.6" 990 | files = [ 991 | {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, 992 | {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, 993 | ] 994 | 995 | [[package]] 996 | name = "plotly" 997 | version = "5.15.0" 998 | description = "An open-source, interactive data visualization library for Python" 999 | optional = false 1000 | python-versions = ">=3.6" 1001 | files = [ 1002 | {file = "plotly-5.15.0-py2.py3-none-any.whl", hash = "sha256:3508876bbd6aefb8a692c21a7128ca87ce42498dd041efa5c933ee44b55aab24"}, 1003 | {file = "plotly-5.15.0.tar.gz", hash = "sha256:822eabe53997d5ebf23c77e1d1fcbf3bb6aa745eb05d532afd4b6f9a2e2ab02f"}, 1004 | ] 1005 | 1006 | [package.dependencies] 1007 | packaging = "*" 1008 | tenacity = ">=6.2.0" 1009 | 1010 | [[package]] 1011 | name = "protobuf" 1012 | version = "4.23.3" 1013 | description = "" 1014 | optional = false 1015 | python-versions = ">=3.7" 1016 | files = [ 1017 | {file = "protobuf-4.23.3-cp310-abi3-win32.whl", hash = "sha256:514b6bbd54a41ca50c86dd5ad6488afe9505901b3557c5e0f7823a0cf67106fb"}, 1018 | {file = "protobuf-4.23.3-cp310-abi3-win_amd64.whl", hash = "sha256:cc14358a8742c4e06b1bfe4be1afbdf5c9f6bd094dff3e14edb78a1513893ff5"}, 1019 | {file = "protobuf-4.23.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2991f5e7690dab569f8f81702e6700e7364cc3b5e572725098215d3da5ccc6ac"}, 1020 | {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:08fe19d267608d438aa37019236db02b306e33f6b9902c3163838b8e75970223"}, 1021 | {file = "protobuf-4.23.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3b01a5274ac920feb75d0b372d901524f7e3ad39c63b1a2d55043f3887afe0c1"}, 1022 | {file = "protobuf-4.23.3-cp37-cp37m-win32.whl", hash = "sha256:aca6e86a08c5c5962f55eac9b5bd6fce6ed98645d77e8bfc2b952ecd4a8e4f6a"}, 1023 | {file = "protobuf-4.23.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0149053336a466e3e0b040e54d0b615fc71de86da66791c592cc3c8d18150bf8"}, 1024 | {file = "protobuf-4.23.3-cp38-cp38-win32.whl", hash = "sha256:84ea0bd90c2fdd70ddd9f3d3fc0197cc24ecec1345856c2b5ba70e4d99815359"}, 1025 | {file = "protobuf-4.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:3bcbeb2bf4bb61fe960dd6e005801a23a43578200ea8ceb726d1f6bd0e562ba1"}, 1026 | {file = "protobuf-4.23.3-cp39-cp39-win32.whl", hash = "sha256:5cb9e41188737f321f4fce9a4337bf40a5414b8d03227e1d9fbc59bc3a216e35"}, 1027 | {file = "protobuf-4.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:29660574cd769f2324a57fb78127cda59327eb6664381ecfe1c69731b83e8288"}, 1028 | {file = "protobuf-4.23.3-py3-none-any.whl", hash = "sha256:447b9786ac8e50ae72cae7a2eec5c5df6a9dbf9aa6f908f1b8bda6032644ea62"}, 1029 | {file = "protobuf-4.23.3.tar.gz", hash = "sha256:7a92beb30600332a52cdadbedb40d33fd7c8a0d7f549c440347bc606fb3fe34b"}, 1030 | ] 1031 | 1032 | [[package]] 1033 | name = "pyarrow" 1034 | version = "10.0.1" 1035 | description = "Python library for Apache Arrow" 1036 | optional = false 1037 | python-versions = ">=3.7" 1038 | files = [ 1039 | {file = "pyarrow-10.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:e00174764a8b4e9d8d5909b6d19ee0c217a6cf0232c5682e31fdfbd5a9f0ae52"}, 1040 | {file = "pyarrow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f7a7dbe2f7f65ac1d0bd3163f756deb478a9e9afc2269557ed75b1b25ab3610"}, 1041 | {file = "pyarrow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb627673cb98708ef00864e2e243f51ba7b4c1b9f07a1d821f98043eccd3f585"}, 1042 | {file = "pyarrow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba71e6fc348c92477586424566110d332f60d9a35cb85278f42e3473bc1373da"}, 1043 | {file = "pyarrow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4ede715c004b6fc535de63ef79fa29740b4080639a5ff1ea9ca84e9282f349"}, 1044 | {file = "pyarrow-10.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:e3fe5049d2e9ca661d8e43fab6ad5a4c571af12d20a57dffc392a014caebef65"}, 1045 | {file = "pyarrow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:254017ca43c45c5098b7f2a00e995e1f8346b0fb0be225f042838323bb55283c"}, 1046 | {file = "pyarrow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70acca1ece4322705652f48db65145b5028f2c01c7e426c5d16a30ba5d739c24"}, 1047 | {file = "pyarrow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb57334f2c57979a49b7be2792c31c23430ca02d24becd0b511cbe7b6b08649"}, 1048 | {file = "pyarrow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1765a18205eb1e02ccdedb66049b0ec148c2a0cb52ed1fb3aac322dfc086a6ee"}, 1049 | {file = "pyarrow-10.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:61f4c37d82fe00d855d0ab522c685262bdeafd3fbcb5fe596fe15025fbc7341b"}, 1050 | {file = "pyarrow-10.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e141a65705ac98fa52a9113fe574fdaf87fe0316cde2dffe6b94841d3c61544c"}, 1051 | {file = "pyarrow-10.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf26f809926a9d74e02d76593026f0aaeac48a65b64f1bb17eed9964bfe7ae1a"}, 1052 | {file = "pyarrow-10.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:443eb9409b0cf78df10ced326490e1a300205a458fbeb0767b6b31ab3ebae6b2"}, 1053 | {file = "pyarrow-10.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f2d00aa481becf57098e85d99e34a25dba5a9ade2f44eb0b7d80c80f2984fc03"}, 1054 | {file = "pyarrow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b1fc226d28c7783b52a84d03a66573d5a22e63f8a24b841d5fc68caeed6784d4"}, 1055 | {file = "pyarrow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa59933b20183c1c13efc34bd91efc6b2997377c4c6ad9272da92d224e3beb1"}, 1056 | {file = "pyarrow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:668e00e3b19f183394388a687d29c443eb000fb3fe25599c9b4762a0afd37775"}, 1057 | {file = "pyarrow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1bc6e4d5d6f69e0861d5d7f6cf4d061cf1069cb9d490040129877acf16d4c2a"}, 1058 | {file = "pyarrow-10.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:42ba7c5347ce665338f2bc64685d74855900200dac81a972d49fe127e8132f75"}, 1059 | {file = "pyarrow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b069602eb1fc09f1adec0a7bdd7897f4d25575611dfa43543c8b8a75d99d6874"}, 1060 | {file = "pyarrow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94fb4a0c12a2ac1ed8e7e2aa52aade833772cf2d3de9dde685401b22cec30002"}, 1061 | {file = "pyarrow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db0c5986bf0808927f49640582d2032a07aa49828f14e51f362075f03747d198"}, 1062 | {file = "pyarrow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0ec7587d759153f452d5263dbc8b1af318c4609b607be2bd5127dcda6708cdb1"}, 1063 | {file = "pyarrow-10.0.1.tar.gz", hash = "sha256:1a14f57a5f472ce8234f2964cd5184cccaa8df7e04568c64edc33b23eb285dd5"}, 1064 | ] 1065 | 1066 | [package.dependencies] 1067 | numpy = ">=1.16.6" 1068 | 1069 | [[package]] 1070 | name = "pycparser" 1071 | version = "2.21" 1072 | description = "C parser in Python" 1073 | optional = false 1074 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1075 | files = [ 1076 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, 1077 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "pycryptodomex" 1082 | version = "3.18.0" 1083 | description = "Cryptographic library for Python" 1084 | optional = false 1085 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 1086 | files = [ 1087 | {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, 1088 | {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, 1089 | {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, 1090 | {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, 1091 | {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, 1092 | {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, 1093 | {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, 1094 | {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, 1095 | {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, 1096 | {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, 1097 | {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, 1098 | {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, 1099 | {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, 1100 | {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, 1101 | {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, 1102 | {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, 1103 | {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, 1104 | {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, 1105 | {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, 1106 | {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, 1107 | {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, 1108 | {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, 1109 | {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, 1110 | {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, 1111 | {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, 1112 | {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, 1113 | {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, 1114 | {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, 1115 | {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, 1116 | {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, 1117 | {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, 1118 | {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "pydeck" 1123 | version = "0.8.0" 1124 | description = "Widget for deck.gl maps" 1125 | optional = false 1126 | python-versions = ">=3.7" 1127 | files = [ 1128 | {file = "pydeck-0.8.0-py2.py3-none-any.whl", hash = "sha256:a8fa7757c6f24bba033af39db3147cb020eef44012ba7e60d954de187f9ed4d5"}, 1129 | {file = "pydeck-0.8.0.tar.gz", hash = "sha256:07edde833f7cfcef6749124351195aa7dcd24663d4909fd7898dbd0b6fbc01ec"}, 1130 | ] 1131 | 1132 | [package.dependencies] 1133 | jinja2 = ">=2.10.1" 1134 | numpy = ">=1.16.4" 1135 | 1136 | [package.extras] 1137 | carto = ["pydeck-carto"] 1138 | jupyter = ["ipykernel (>=5.1.2)", "ipython (>=5.8.0)", "ipywidgets (>=7,<8)", "traitlets (>=4.3.2)"] 1139 | 1140 | [[package]] 1141 | name = "pygments" 1142 | version = "2.15.1" 1143 | description = "Pygments is a syntax highlighting package written in Python." 1144 | optional = false 1145 | python-versions = ">=3.7" 1146 | files = [ 1147 | {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, 1148 | {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, 1149 | ] 1150 | 1151 | [package.extras] 1152 | plugins = ["importlib-metadata"] 1153 | 1154 | [[package]] 1155 | name = "pyhumps" 1156 | version = "3.8.0" 1157 | description = "🐫 Convert strings (and dictionary keys) between snake case, camel case and pascal case in Python. Inspired by Humps for Node" 1158 | optional = false 1159 | python-versions = "*" 1160 | files = [ 1161 | {file = "pyhumps-3.8.0-py3-none-any.whl", hash = "sha256:060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6"}, 1162 | {file = "pyhumps-3.8.0.tar.gz", hash = "sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3"}, 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "pyjwt" 1167 | version = "2.7.0" 1168 | description = "JSON Web Token implementation in Python" 1169 | optional = false 1170 | python-versions = ">=3.7" 1171 | files = [ 1172 | {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, 1173 | {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, 1174 | ] 1175 | 1176 | [package.extras] 1177 | crypto = ["cryptography (>=3.4.0)"] 1178 | dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] 1179 | docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] 1180 | tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] 1181 | 1182 | [[package]] 1183 | name = "pympler" 1184 | version = "1.0.1" 1185 | description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." 1186 | optional = false 1187 | python-versions = ">=3.6" 1188 | files = [ 1189 | {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, 1190 | {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "pyopenssl" 1195 | version = "23.2.0" 1196 | description = "Python wrapper module around the OpenSSL library" 1197 | optional = false 1198 | python-versions = ">=3.6" 1199 | files = [ 1200 | {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, 1201 | {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, 1202 | ] 1203 | 1204 | [package.dependencies] 1205 | cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" 1206 | 1207 | [package.extras] 1208 | docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] 1209 | test = ["flaky", "pretend", "pytest (>=3.0.1)"] 1210 | 1211 | [[package]] 1212 | name = "pyrsistent" 1213 | version = "0.19.3" 1214 | description = "Persistent/Functional/Immutable data structures" 1215 | optional = false 1216 | python-versions = ">=3.7" 1217 | files = [ 1218 | {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, 1219 | {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, 1220 | {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, 1221 | {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, 1222 | {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, 1223 | {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, 1224 | {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, 1225 | {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, 1226 | {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, 1227 | {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, 1228 | {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, 1229 | {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, 1230 | {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, 1231 | {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, 1232 | {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, 1233 | {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, 1234 | {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, 1235 | {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, 1236 | {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, 1237 | {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, 1238 | {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, 1239 | {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, 1240 | {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, 1241 | {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, 1242 | {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, 1243 | {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, 1244 | {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "python-dateutil" 1249 | version = "2.8.2" 1250 | description = "Extensions to the standard Python datetime module" 1251 | optional = false 1252 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 1253 | files = [ 1254 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 1255 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 1256 | ] 1257 | 1258 | [package.dependencies] 1259 | six = ">=1.5" 1260 | 1261 | [[package]] 1262 | name = "pytz" 1263 | version = "2023.3" 1264 | description = "World timezone definitions, modern and historical" 1265 | optional = false 1266 | python-versions = "*" 1267 | files = [ 1268 | {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, 1269 | {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "pytz-deprecation-shim" 1274 | version = "0.1.0.post0" 1275 | description = "Shims to make deprecation of pytz easier" 1276 | optional = false 1277 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" 1278 | files = [ 1279 | {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, 1280 | {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, 1281 | ] 1282 | 1283 | [package.dependencies] 1284 | "backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} 1285 | tzdata = {version = "*", markers = "python_version >= \"3.6\""} 1286 | 1287 | [[package]] 1288 | name = "requests" 1289 | version = "2.31.0" 1290 | description = "Python HTTP for Humans." 1291 | optional = false 1292 | python-versions = ">=3.7" 1293 | files = [ 1294 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, 1295 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, 1296 | ] 1297 | 1298 | [package.dependencies] 1299 | certifi = ">=2017.4.17" 1300 | charset-normalizer = ">=2,<4" 1301 | idna = ">=2.5,<4" 1302 | urllib3 = ">=1.21.1,<3" 1303 | 1304 | [package.extras] 1305 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1306 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1307 | 1308 | [[package]] 1309 | name = "rich" 1310 | version = "13.4.2" 1311 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 1312 | optional = false 1313 | python-versions = ">=3.7.0" 1314 | files = [ 1315 | {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, 1316 | {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, 1317 | ] 1318 | 1319 | [package.dependencies] 1320 | markdown-it-py = ">=2.2.0" 1321 | pygments = ">=2.13.0,<3.0.0" 1322 | typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} 1323 | 1324 | [package.extras] 1325 | jupyter = ["ipywidgets (>=7.5.1,<9)"] 1326 | 1327 | [[package]] 1328 | name = "semantha-sdk" 1329 | version = "5.4.1" 1330 | description = "This is a python client sdk for accessing semantha (the semantic platform)" 1331 | optional = false 1332 | python-versions = ">=3.8,<4.0" 1333 | files = [ 1334 | {file = "semantha_sdk-5.4.1-py3-none-any.whl", hash = "sha256:84e5c226467fa3afd14fd59a87f012cf0dc196d6bdd36f0733d41bdfabd436d5"}, 1335 | {file = "semantha_sdk-5.4.1.tar.gz", hash = "sha256:23c466afd36211af4d9939dbc72362c457c195970568970a6510d0af3095c0f3"}, 1336 | ] 1337 | 1338 | [package.dependencies] 1339 | marshmallow = "3.19.0" 1340 | marshmallow-dataclass = "8.5.14" 1341 | pyhumps = "3.8.0" 1342 | requests = "2.31.0" 1343 | 1344 | [[package]] 1345 | name = "setuptools" 1346 | version = "67.8.0" 1347 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 1348 | optional = false 1349 | python-versions = ">=3.7" 1350 | files = [ 1351 | {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, 1352 | {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, 1353 | ] 1354 | 1355 | [package.extras] 1356 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] 1357 | testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] 1358 | testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] 1359 | 1360 | [[package]] 1361 | name = "six" 1362 | version = "1.16.0" 1363 | description = "Python 2 and 3 compatibility utilities" 1364 | optional = false 1365 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1366 | files = [ 1367 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1368 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1369 | ] 1370 | 1371 | [[package]] 1372 | name = "smmap" 1373 | version = "5.0.0" 1374 | description = "A pure Python implementation of a sliding window memory map manager" 1375 | optional = false 1376 | python-versions = ">=3.6" 1377 | files = [ 1378 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, 1379 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, 1380 | ] 1381 | 1382 | [[package]] 1383 | name = "snowflake-connector-python" 1384 | version = "3.0.4" 1385 | description = "Snowflake Connector for Python" 1386 | optional = false 1387 | python-versions = ">=3.7" 1388 | files = [ 1389 | {file = "snowflake-connector-python-3.0.4.tar.gz", hash = "sha256:f0253a58909dcf57bcde4ce1ef613fe346fc18bc01ba20101d1499ac22f6d9b2"}, 1390 | {file = "snowflake_connector_python-3.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75810c8964ff34e3fdced982c9bdf4b73335436585bcb538672f660ea14e74bd"}, 1391 | {file = "snowflake_connector_python-3.0.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:dfdad463fe68c3372d9a80018452360d11dba455865613fd94850195fdd9c989"}, 1392 | {file = "snowflake_connector_python-3.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:099dca938a52419be3ce4d332f7af2587f1316b2a63b109b2e1e18aac00e9ba9"}, 1393 | {file = "snowflake_connector_python-3.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f2f28702f59d04bd28eb27a0a87b5270b263f152ffa046b6ff058c09c0a945"}, 1394 | {file = "snowflake_connector_python-3.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:48c3a1026ab83ab6205716fb9ecdf707534deb28b7891ea0708e57f8fef8472b"}, 1395 | {file = "snowflake_connector_python-3.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c71f2db386de6cba165aa2b758aeae691f2319a9a280a1cd89937d87db89bf86"}, 1396 | {file = "snowflake_connector_python-3.0.4-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:91e75ff12d47a0ec0015aec7c14f7d8bb2b0100a287c412ade11a78c5a1037b1"}, 1397 | {file = "snowflake_connector_python-3.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcab2f51a143f9ea808dfeaa5bd72fc37149546f93bffa198132c333c4da8f00"}, 1398 | {file = "snowflake_connector_python-3.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34646dde0ce84d03632734597577a4bf1aec5d6dee7edefb7aa71d6d6236a332"}, 1399 | {file = "snowflake_connector_python-3.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:c61602bd9447988d24f95eafd0fc1d5af498e17e8669e81eef1b8699c1530120"}, 1400 | {file = "snowflake_connector_python-3.0.4-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:834227edb0608d7544404fa35d857983a1ab373d0781a229c3572de6227cf5d5"}, 1401 | {file = "snowflake_connector_python-3.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08b2041c6e33379cb4ec482b4e6ba3106580abc5c89f8647b6c99c203fb910ac"}, 1402 | {file = "snowflake_connector_python-3.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b1c89cb4b6d04bcd2e7a378cae6ab9915bdd8bb0ef6dc4f27533b70c3eb3cb"}, 1403 | {file = "snowflake_connector_python-3.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d994540b8eb68c25bea917ab6a933dd775939b4a4beec34b0b942400f959cd7a"}, 1404 | {file = "snowflake_connector_python-3.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bb7b10842053b8f478baadbb7ea7160dc10c7f7085d69cb7a6e240afe231b078"}, 1405 | {file = "snowflake_connector_python-3.0.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:61b6e04853029302d90d6ad3d3c189d1ed22f202c34e60fb3d33fb8957fb3661"}, 1406 | {file = "snowflake_connector_python-3.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebaabef48dfe84fe4a705d42fd29c464c6d71ab1fc2b5606409672586ce6697f"}, 1407 | {file = "snowflake_connector_python-3.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4514bd5ff67099af29b23a6c0a2c3e3634a023f4bba4324fd2a9763a61c448d"}, 1408 | {file = "snowflake_connector_python-3.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:106efd608c243daac8f75067c716805aa5cc902d39538918edaf5661b622b4a1"}, 1409 | {file = "snowflake_connector_python-3.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:acb0c2b825d6489feadd189bb16ad416da6df9bc39e5786a910e00cc19c3955a"}, 1410 | {file = "snowflake_connector_python-3.0.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b68ce7fd755a43149caafe3f5738628606ee03557d3030881c9a5f08d1754c0f"}, 1411 | {file = "snowflake_connector_python-3.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f7c79c0a3fb2c3490f46f23ac4ae1915c2a47e26c4b2df8b5d4116877c4c61"}, 1412 | {file = "snowflake_connector_python-3.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17692755b8e79b1ad489b7e5966bb819c530c2239cb309c0b6c728fa135937f8"}, 1413 | {file = "snowflake_connector_python-3.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:3af27737afdfc795b19066b6365e315fab314936b2ea71b486e8fd476834c249"}, 1414 | ] 1415 | 1416 | [package.dependencies] 1417 | asn1crypto = ">0.24.0,<2.0.0" 1418 | certifi = ">=2017.4.17" 1419 | cffi = ">=1.9,<2.0.0" 1420 | charset-normalizer = ">=2,<4" 1421 | cryptography = ">=3.1.0,<41.0.0" 1422 | filelock = ">=3.5,<4" 1423 | idna = ">=2.5,<4" 1424 | oscrypto = "<2.0.0" 1425 | packaging = "*" 1426 | pycryptodomex = ">=3.2,<3.5.0 || >3.5.0,<4.0.0" 1427 | pyjwt = "<3.0.0" 1428 | pyOpenSSL = ">=16.2.0,<24.0.0" 1429 | pytz = "*" 1430 | requests = "<3.0.0" 1431 | sortedcontainers = ">=2.4.0" 1432 | typing-extensions = ">=4.3,<5" 1433 | urllib3 = ">=1.21.1,<1.27" 1434 | 1435 | [package.extras] 1436 | development = ["Cython", "coverage", "more-itertools", "numpy (<1.25.0)", "pendulum (!=2.1.1)", "pexpect", "pytest (<7.4.0)", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist", "pytzdata"] 1437 | pandas = ["pandas (>=1.0.0,<2.1.0)", "pyarrow (>=10.0.1,<10.1.0)"] 1438 | secure-local-storage = ["keyring (!=16.1.0,<24.0.0)"] 1439 | 1440 | [[package]] 1441 | name = "snowflake-snowpark-python" 1442 | version = "1.5.0" 1443 | description = "Snowflake Snowpark for Python" 1444 | optional = false 1445 | python-versions = ">=3.8, <3.10" 1446 | files = [ 1447 | {file = "snowflake-snowpark-python-1.5.0.tar.gz", hash = "sha256:ab04ea3c738143efc3f5f26249a53027c4377058b0019ceb10291439321b16ce"}, 1448 | {file = "snowflake_snowpark_python-1.5.0-py3-none-any.whl", hash = "sha256:c4b20366c001b70704f4168677e43dfef13588da667e1a1121c7f46fdb18c9a6"}, 1449 | ] 1450 | 1451 | [package.dependencies] 1452 | cloudpickle = ">=1.6.0,<=2.0.0" 1453 | setuptools = ">=40.6.0" 1454 | snowflake-connector-python = ">=2.7.12,<4.0.0" 1455 | typing-extensions = ">=4.1.0,<5.0.0" 1456 | wheel = "*" 1457 | 1458 | [package.extras] 1459 | development = ["cachetools", "coverage", "pytest", "pytest-cov", "sphinx (==5.0.2)"] 1460 | pandas = ["snowflake-connector-python[pandas] (>=2.7.12,<4.0.0)"] 1461 | secure-local-storage = ["snowflake-connector-python[secure-local-storage] (>=2.7.12,<4.0.0)"] 1462 | 1463 | [[package]] 1464 | name = "sortedcontainers" 1465 | version = "2.4.0" 1466 | description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" 1467 | optional = false 1468 | python-versions = "*" 1469 | files = [ 1470 | {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, 1471 | {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "soupsieve" 1476 | version = "2.4.1" 1477 | description = "A modern CSS selector implementation for Beautiful Soup." 1478 | optional = false 1479 | python-versions = ">=3.7" 1480 | files = [ 1481 | {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, 1482 | {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "streamlit" 1487 | version = "1.23.1" 1488 | description = "A faster way to build and share data apps" 1489 | optional = false 1490 | python-versions = ">=3.7, !=3.9.7" 1491 | files = [ 1492 | {file = "streamlit-1.23.1-py2.py3-none-any.whl", hash = "sha256:02cd55a95acd20d73ff03866956ba6e98d71041ee4728dbfef05cf17069d1bb9"}, 1493 | {file = "streamlit-1.23.1.tar.gz", hash = "sha256:af95a78f9d291f12f779cf66a2bdadfafd8a46fe4fcc6ed281492640ed37bf1e"}, 1494 | ] 1495 | 1496 | [package.dependencies] 1497 | altair = ">=4.0,<6" 1498 | blinker = ">=1.0.0,<2" 1499 | cachetools = ">=4.0,<6" 1500 | click = ">=7.0,<9" 1501 | gitpython = ">=3,<3.1.19 || >3.1.19,<4" 1502 | importlib-metadata = ">=1.4,<7" 1503 | numpy = ">=1,<2" 1504 | packaging = ">=14.1,<24" 1505 | pandas = ">=0.25,<3" 1506 | pillow = ">=6.2.0,<10" 1507 | protobuf = ">=3.20,<5" 1508 | pyarrow = ">=4.0" 1509 | pydeck = ">=0.1.dev5,<1" 1510 | pympler = ">=0.9,<2" 1511 | python-dateutil = ">=2,<3" 1512 | requests = ">=2.4,<3" 1513 | rich = ">=10.11.0,<14" 1514 | tenacity = ">=8.0.0,<9" 1515 | toml = "<2" 1516 | tornado = ">=6.0.3,<7" 1517 | typing-extensions = ">=4.0.1,<5" 1518 | tzlocal = ">=1.1,<5" 1519 | validators = ">=0.2,<1" 1520 | watchdog = {version = "*", markers = "platform_system != \"Darwin\""} 1521 | 1522 | [package.extras] 1523 | snowflake = ["snowflake-snowpark-python"] 1524 | 1525 | [[package]] 1526 | name = "tenacity" 1527 | version = "8.2.2" 1528 | description = "Retry code until it succeeds" 1529 | optional = false 1530 | python-versions = ">=3.6" 1531 | files = [ 1532 | {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, 1533 | {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, 1534 | ] 1535 | 1536 | [package.extras] 1537 | doc = ["reno", "sphinx", "tornado (>=4.5)"] 1538 | 1539 | [[package]] 1540 | name = "toml" 1541 | version = "0.10.2" 1542 | description = "Python Library for Tom's Obvious, Minimal Language" 1543 | optional = false 1544 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 1545 | files = [ 1546 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1547 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "toolz" 1552 | version = "0.12.0" 1553 | description = "List processing tools and functional utilities" 1554 | optional = false 1555 | python-versions = ">=3.5" 1556 | files = [ 1557 | {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, 1558 | {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, 1559 | ] 1560 | 1561 | [[package]] 1562 | name = "tornado" 1563 | version = "6.3.2" 1564 | description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." 1565 | optional = false 1566 | python-versions = ">= 3.8" 1567 | files = [ 1568 | {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, 1569 | {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, 1570 | {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, 1571 | {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, 1572 | {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, 1573 | {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, 1574 | {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, 1575 | {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, 1576 | {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, 1577 | {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, 1578 | {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "typing-extensions" 1583 | version = "4.6.3" 1584 | description = "Backported and Experimental Type Hints for Python 3.7+" 1585 | optional = false 1586 | python-versions = ">=3.7" 1587 | files = [ 1588 | {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, 1589 | {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, 1590 | ] 1591 | 1592 | [[package]] 1593 | name = "typing-inspect" 1594 | version = "0.9.0" 1595 | description = "Runtime inspection utilities for typing module." 1596 | optional = false 1597 | python-versions = "*" 1598 | files = [ 1599 | {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, 1600 | {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, 1601 | ] 1602 | 1603 | [package.dependencies] 1604 | mypy-extensions = ">=0.3.0" 1605 | typing-extensions = ">=3.7.4" 1606 | 1607 | [[package]] 1608 | name = "tzdata" 1609 | version = "2023.3" 1610 | description = "Provider of IANA time zone data" 1611 | optional = false 1612 | python-versions = ">=2" 1613 | files = [ 1614 | {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, 1615 | {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "tzlocal" 1620 | version = "4.3" 1621 | description = "tzinfo object for the local timezone" 1622 | optional = false 1623 | python-versions = ">=3.7" 1624 | files = [ 1625 | {file = "tzlocal-4.3-py3-none-any.whl", hash = "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2"}, 1626 | {file = "tzlocal-4.3.tar.gz", hash = "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355"}, 1627 | ] 1628 | 1629 | [package.dependencies] 1630 | "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} 1631 | pytz-deprecation-shim = "*" 1632 | tzdata = {version = "*", markers = "platform_system == \"Windows\""} 1633 | 1634 | [package.extras] 1635 | devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] 1636 | 1637 | [[package]] 1638 | name = "urllib3" 1639 | version = "1.26.16" 1640 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1641 | optional = false 1642 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 1643 | files = [ 1644 | {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, 1645 | {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, 1646 | ] 1647 | 1648 | [package.extras] 1649 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] 1650 | secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] 1651 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1652 | 1653 | [[package]] 1654 | name = "validators" 1655 | version = "0.20.0" 1656 | description = "Python Data Validation for Humans™." 1657 | optional = false 1658 | python-versions = ">=3.4" 1659 | files = [ 1660 | {file = "validators-0.20.0.tar.gz", hash = "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a"}, 1661 | ] 1662 | 1663 | [package.dependencies] 1664 | decorator = ">=3.4.0" 1665 | 1666 | [package.extras] 1667 | test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] 1668 | 1669 | [[package]] 1670 | name = "watchdog" 1671 | version = "3.0.0" 1672 | description = "Filesystem events monitoring" 1673 | optional = false 1674 | python-versions = ">=3.7" 1675 | files = [ 1676 | {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, 1677 | {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, 1678 | {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, 1679 | {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, 1680 | {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, 1681 | {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, 1682 | {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, 1683 | {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, 1684 | {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, 1685 | {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, 1686 | {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, 1687 | {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, 1688 | {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, 1689 | {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, 1690 | {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, 1691 | {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, 1692 | {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, 1693 | {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, 1694 | {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, 1695 | {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, 1696 | {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, 1697 | {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, 1698 | {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, 1699 | {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, 1700 | {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, 1701 | {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, 1702 | {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, 1703 | ] 1704 | 1705 | [package.extras] 1706 | watchmedo = ["PyYAML (>=3.10)"] 1707 | 1708 | [[package]] 1709 | name = "wheel" 1710 | version = "0.40.0" 1711 | description = "A built-package format for Python" 1712 | optional = false 1713 | python-versions = ">=3.7" 1714 | files = [ 1715 | {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, 1716 | {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, 1717 | ] 1718 | 1719 | [package.extras] 1720 | test = ["pytest (>=6.0.0)"] 1721 | 1722 | [[package]] 1723 | name = "zipp" 1724 | version = "3.15.0" 1725 | description = "Backport of pathlib-compatible object wrapper for zip files" 1726 | optional = false 1727 | python-versions = ">=3.7" 1728 | files = [ 1729 | {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, 1730 | {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, 1731 | ] 1732 | 1733 | [package.extras] 1734 | docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] 1735 | testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] 1736 | 1737 | [metadata] 1738 | lock-version = "2.0" 1739 | python-versions = ">=3.8,<3.9.0" 1740 | content-hash = "b03e8c5ef9f740bd2762eb66a549a7eb2fa311ee1a227dba04b2f48b79a2b903" 1741 | --------------------------------------------------------------------------------